#include <SoftwareSerial.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EncButton.h>
#include <SoftwareSerial.h>
#include "pad_class.h"
#include "button_class.h"
#include "log_class.h"
#define VERSION " QDrum v1.21"
#define DEFAULT_ANIMATION_N 1
#define DEFAULT_PAD_SENS 50 // чувствительность барабана
#define PAD_SENS_INCREMENT 1
#define DEFAULT_CENTER_NOTE 60
#define DEFAULT_BANK_NUMBER 0
#define DELTA_OCTAVE 12
#define DELAY_SET_CONFIG 500
#define PADS_COUNT 8
//Pins set
#define ENC_1_SW 17
#define ENC_1_DT 18
#define ENC_1_CLK 19
#define ENC_2_SW A6
#define ENC_2_DT A5
#define ENC_2_CLK A4
#define ENC_TYPE 1
#define PIN_BUTTON_UP A9
#define PIN_BUTTON_DOWN 16
#define BUTTONS_COUNT 2
#define PIN_PAD_1 A0
#define PIN_PAD_2 A1
#define PIN_PAD_3 A2
#define PIN_PAD_4 A3
#define PIN_PAD_5 A12
#define PIN_PAD_6 A13
#define PIN_PAD_7 A14
#define PIN_PAD_8 A15
#define PIN_PAD_9 A10
#define PIN_PAD_10 A11
#define PIN_LED_1 4
#define PIN_LED_1_TX 3
#define PIN_LED_1_RX 2
#define PIN_LED_2 7
#define PIN_LED_2_TX 6
#define PIN_LED_2_RX 5
#define PIN_LED_3 10
#define PIN_LED_3_TX 9
#define PIN_LED_3_RX 8
#define PIN_LED_4 13
#define PIN_LED_4_TX 12
#define PIN_LED_4_RX 11
#define PIN_LED_5 41
#define PIN_LED_5_TX 43
#define PIN_LED_5_RX 45
#define PIN_LED_6 35
#define PIN_LED_6_TX 37
#define PIN_LED_6_RX 39
#define PIN_LED_7 34
#define PIN_LED_7_TX 32
#define PIN_LED_7_RX 33
#define PIN_LED_8 40
#define PIN_LED_8_TX 38
#define PIN_LED_8_RX 36
#define PIN_LED_9 46
#define PIN_LED_9_TX 44
#define PIN_LED_9_RX 42
#define PIN_LED_10 52
#define PIN_LED_10_TX 50
#define PIN_LED_10_RX 48
char loading[4] = {'/', '-', 92, '|'};
int pinSet[][4] = {
{PIN_PAD_1, PIN_LED_1, PIN_LED_1_TX, PIN_LED_1_RX},
{PIN_PAD_2, PIN_LED_2, PIN_LED_2_TX, PIN_LED_2_RX},
{PIN_PAD_3, PIN_LED_3, PIN_LED_3_TX, PIN_LED_3_RX},
{PIN_PAD_4, PIN_LED_4, PIN_LED_4_TX, PIN_LED_4_RX},
{PIN_PAD_5, PIN_LED_5, PIN_LED_5_TX, PIN_LED_5_RX},
{PIN_PAD_6, PIN_LED_6, PIN_LED_6_TX, PIN_LED_6_RX},
{PIN_PAD_7, PIN_LED_7, PIN_LED_7_TX, PIN_LED_7_RX},
{PIN_PAD_8, PIN_LED_8, PIN_LED_8_TX, PIN_LED_8_RX},
{PIN_PAD_9, PIN_LED_9, PIN_LED_9_TX, PIN_LED_9_RX},
{PIN_PAD_10, PIN_LED_10, PIN_LED_10_TX, PIN_LED_10_RX}
};
struct ScreenConfig {
uint8_t typeAnimation;
};
uint8_t typeOfAnimation = DEFAULT_ANIMATION_N;
uint8_t firstNoteBank = DEFAULT_CENTER_NOTE;
int8_t numberBank = DEFAULT_BANK_NUMBER;
int16_t trashHold = DEFAULT_PAD_SENS;
bool isButtonPressed = false;
String tempString;
Pad pads[PADS_COUNT];
ButtonBank buttons[BUTTONS_COUNT];
LiquidCrystal_I2C lcd(0x27, 16, 4);
EncButton enc1(ENC_1_DT, ENC_1_CLK, ENC_1_SW);
EncButton enc2(ENC_2_DT, ENC_2_CLK, ENC_2_SW);
Log log();
void setup()
{
Serial.begin(9600);
// LCD initialisation
lcd.init();
lcd.backlight();
lcd.clear();
lcdPrint(VERSION, 0);
lcdPrint("Anim:", 1);
lcdPrintParametr(String(typeOfAnimation), 1);
lcdPrint("Sens:", 2);
lcdPrintParametr(String(trashHold), 2);
lcdPrint("Bank:", 3);
lcdPrintParametr(String(numberBank), 3);
//Buttons initialisation
buttons[0] = ButtonBank(PIN_BUTTON_UP);
buttons[1] = ButtonBank(PIN_BUTTON_DOWN);
//Pads initialisation
for (uint8_t i=0; i<PADS_COUNT; i++)
{
pads[i] = Pad(i+1, pinSet[i][0], pinSet[i][1], DEFAULT_PAD_SENS, firstNoteBank);
}
}
void loop()
{
enc1.tick();
enc2.tick();
if(enc1.turn())
{
int8_t increment = PAD_SENS_INCREMENT * enc1.dir();
if(increment < 0)
{
if(trashHold > abs(increment))
{
trashHold += increment;
}
}
else
{
trashHold += increment;
}
lcdPrintParametr(String(trashHold) + " ?", 2);
}
if (enc1.hasClicks()) {
for (uint8_t i=0; i<PADS_COUNT; i++)
{
pads[i].trashHold = trashHold;
}
lcdPrintParametr(String(trashHold), 2);
}
if(enc2.turn())
{
int8_t increment = 1 * enc2.dir();
if(increment < 0)
{
if(typeOfAnimation > abs(increment))
typeOfAnimation += increment;
}
else
{
typeOfAnimation += increment;
}
lcdPrintParametr(String(typeOfAnimation) + " ?", 1);
}
if (enc2.hasClicks()) {
uint8_t j = 0;
for (uint8_t i=0; i<PADS_COUNT; i++)
{
lcdPrintParametr(String(typeOfAnimation) + " " + String(loading[j]), 1);
j++;
if(j>3)
j = 0;
ScreenConfig screenConfig;
screenConfig.typeAnimation = typeOfAnimation;
SoftwareSerial screenSerial(pinSet[i][3], pinSet[i][2]); // RX, TX
screenSerial.begin(9600);
screenSerial.write((byte*)&screenConfig, sizeof(screenConfig));
delay(DELAY_SET_CONFIG);
screenSerial.end();
}
lcdPrintParametr(String(typeOfAnimation), 1);
}
for (uint8_t i=0; i<PADS_COUNT; i++)
{
pads[i].listenPad();
}
for (uint8_t i=0; i<BUTTONS_COUNT; i++)
{
if(buttons[i].listenButton())
{
bool isHaveChanges = false;
if(i == 0)
{
if(numberBank < 5)
{
numberBank++;
isHaveChanges = true;
}
}
else
{
if(numberBank > -5)
{
numberBank--;
isHaveChanges = true;
}
}
if(isHaveChanges)
{
lcdPrintParametr(String(numberBank), 3);
for (uint8_t i=0; i<PADS_COUNT; i++)
{
pads[i].updateBankNotes(numberBank);
}
}
}
}
}