#include <Bounce.h>
#include <cfg.h>
cfg cfg;
const int ShiftPWM_latchPin = 8;
#define SHIFTPWM_NOSPI
const int ShiftPWM_dataPin = 11;
const int ShiftPWM_clockPin = 13;
const bool ShiftPWM_invertOutputs = false;
const bool ShiftPWM_balanceLoad = true;
#include <ShiftPWM.h>
#include <btnTrackSelect.h>
btnTrackSelect btnTrackSelect[16];
Bounce btnShift = Bounce(cfg.btnShiftPin, 10); // 10 ms debounce
// ################## SETUP
void setup() {
// 4051 - CTRL
pinMode(cfg.muxPin1, OUTPUT);
pinMode(cfg.muxPin2, OUTPUT);
pinMode(cfg.muxPin3, OUTPUT);
// 4051 - INPUT PINS
pinMode(cfg.btnTrackSelectPin, INPUT);
pinMode(cfg.faderTrackVolumePin, INPUT);
// SHIFT
pinMode(cfg.btnShiftPin, INPUT_PULLUP);
Serial.begin(9600);
while ( !Serial && (millis()<4000) ) {
Serial.println("LOADING SERIAL PORT ...");
}
Serial1.begin(9600);
while ( !Serial1 && (millis()<4000) ) {
Serial1.println("LOADING Serial1 PORT ...");
}
Serial.println("SERIAL PORT INITIALIZED");
Serial.println("Serial1 PORT INITIALIZED");
// LIGHT
ShiftPWM.SetAmountOfRegisters(3);
ShiftPWM.SetPinGrouping(8);
ShiftPWM.Start(cfg.pwmFrequency,cfg.maxBrightness);
ShiftPWM.SetAll(0);
}
// ################## MAIN LOOP
void loop() {
if(cfg.modus != cfg.modusNext) {
Serial.println("MODUS CHANGED: "); Serial.print(cfg.modus);
Serial1.write("aaa");
cfg.modus = cfg.modusNext;
}
if (cfg.modus == "EDIT") {
readMenuEncoders();
}
for (int i = 0; i <= 7; i++) {
// count through MUX
cfg.MuxBit1 = bitRead(i,0);
cfg.MuxBit2 = bitRead(i,1);
cfg.MuxBit3 = bitRead(i,2);
digitalWrite(cfg.muxPin1, cfg.MuxBit1);
digitalWrite(cfg.muxPin2, cfg.MuxBit2);
digitalWrite(cfg.muxPin3, cfg.MuxBit3);
pollShift();
pollMuxDigital(i, "btnTrackSelect", cfg.btnTrackSelectPin);
}
}
/*
* Polls Shift-Button and sets Status-Var
*/
void pollShift() {
if (btnShift.update()) {
if (btnShift.fallingEdge()) {
cfg.shiftStatus = false;
} else {
cfg.shiftStatus = true;
}
}
}
/*
* Polls 4051 with digital Input-Sources
*/
void pollMuxDigital(int i, String element, int digitalPin) {
btnTrackSelect[i].btnStatus = digitalRead(digitalPin);
if(btnTrackSelect[i].btnStatus == HIGH && btnTrackSelect[i].btnStatusOld != btnTrackSelect[i].btnStatus) {
if(btnTrackSelect[i]._state == 0) {
Serial.print(i); Serial.print(" - PRESSED .. "); Serial.println();
if(cfg.shiftStatus == true) {
// EDIT
edit(i, element);
btnTrackSelect[i].setBtnState(2);
} else {
// SEND MIDI
btnTrackSelect[i].setBtnState(1);
}
} else if(btnTrackSelect[i]._state == 1) {
Serial.print(i); Serial.print(" - PRESSED AGAIN.. "); Serial.println();
if(cfg.shiftStatus == true) {
// EDIT
edit(i, element);
btnTrackSelect[i].setBtnState(2);
} else {
// SEND MIDI
btnTrackSelect[i].setBtnState(0);
}
} else if(btnTrackSelect[i]._state == 2) {
if(cfg.shiftStatus == true) {
Serial.print(i); Serial.print(" - RESET EDIT.. "); Serial.println();
// EDIT
edit(i, element);
btnTrackSelect[i].setBtnState(2);
} else {
Serial.print("reset "); Serial.print(cfg.editCtrlNr); Serial.print(" to "); Serial.print(btnTrackSelect[cfg.editCtrlNr]._state_prev); Serial.println();
btnTrackSelect[cfg.editCtrlNr].setBtnState(0);
cfg.editCtrl = "";
cfg.editCtrlNr = 0;
cfg.modusNext = "";
// SEND MIDI
btnTrackSelect[i].setBtnState(0);
}
}
Serial.print("#SET COLOR# ");
Serial.print((i+1)); Serial.println();
Serial.print(btnTrackSelect[i]._rgb[0]); Serial.println();
Serial.print(btnTrackSelect[i]._rgb[1]); Serial.println();
Serial.print(btnTrackSelect[i]._rgb[2]);Serial.println();
Serial.println();
ShiftPWM.SetRGB(i,btnTrackSelect[i]._rgb[0],btnTrackSelect[i]._rgb[1],btnTrackSelect[i]._rgb[2]);
}
btnTrackSelect[i].btnStatusOld = btnTrackSelect[i].btnStatus;
if(btnTrackSelect[i].btnStatusOld == HIGH && btnTrackSelect[i].btnStatus == LOW) {
Serial.print(i);
Serial.print(" - UN - statusOld : "); Serial.print(btnTrackSelect[i].btnStatusOld);
Serial.println();
}
}
/*
* Enters Edit-Menu
*/
void edit(int zaehler, String element) {
Serial.print("EDIT - "); Serial.print(element); Serial.print(" "); Serial.print(zaehler); Serial.println();
cfg.editCtrl = element;
cfg.editCtrlNr = zaehler;
if(element == "btnTrackSelect") {
cfg.encoder1_oldPosition = btnTrackSelect[zaehler].ctrlChannel;
cfg.encoder1_valRange[0] = btnTrackSelect[zaehler].ctrlChannel_valRange[0];
cfg.encoder1_valRange[1] = btnTrackSelect[zaehler].ctrlChannel_valRange[1];
/*
cfg.encoder2_oldPosition = btnTrackSelect[zaehler].ctrlType;
cfg.encoder2_valRange[0] = btnTrackSelect[zaehler].ctrlType_valRange[0];
cfg.encoder2_valRange[1] = btnTrackSelect[zaehler].ctrlType_valRange[1];
cfg.encoder3_oldPosition = btnTrackSelect[zaehler].ctrlNote;
cfg.encoder3_valRange[0] = btnTrackSelect[zaehler].ctrlNote_valRange[0];
cfg.encoder3_valRange[1] = btnTrackSelect[zaehler].ctrlNote_valRange[1];
*/
encoder1.write(0);
//encoder2.write(0);
// encoder3.write(0);
Serial.print("CHANNEL:"); Serial.print(btnTrackSelect[zaehler].ctrlChannel);
Serial.print(", - TYPE: "); Serial.print(btnTrackSelect[zaehler].ctrlType_values[btnTrackSelect[zaehler].ctrlType]);
Serial.print(", - NOTE/CC: "); Serial.print(btnTrackSelect[zaehler].ctrlNote_values[btnTrackSelect[zaehler].ctrlNote]);
Serial.println();
cfg.modusNext = "EDIT";
}
}