Simplified, streamlined. Structs!!
This commit is contained in:
parent
2d83920631
commit
36381f628c
209
src/main.cpp
209
src/main.cpp
|
@ -4,143 +4,148 @@
|
||||||
#include <Bounce2.h>
|
#include <Bounce2.h>
|
||||||
|
|
||||||
#define MAXLAG 5
|
#define MAXLAG 5
|
||||||
#define ENCODERS 5
|
#define ENCS 5
|
||||||
#define SWITCHES 15 // max 16 (32 overall)
|
#define SWTS 15 // max 16 (32 overall)
|
||||||
#define KNOBPOSITIONS 5
|
#define KNBPOSS 5
|
||||||
#define BUTTONS 12
|
#define BUTS 12
|
||||||
#define PRESSDURATION 40
|
#define PRSDUR 40
|
||||||
#define RELEASEDURATION 20
|
#define RLSDUR 20
|
||||||
#define BOUNCEINTERVAL PRESSDURATION
|
#define BNCINT PRSDUR
|
||||||
#define SWITCHBUTTONS 2 * SWITCHES
|
#define SWTBUTS 2 * SWTS
|
||||||
#define ENCODERBUTTONS 2 * ENCODERS
|
#define ENCBUTS 2 * ENCS
|
||||||
|
|
||||||
const int encoderPins[ENCODERS][2] = {{28,29},{31,30},{33,32},{35,34},{37,36}}; //data, clock (swap #1 because it sucks)
|
const int encPins[ENCS][2]={{28,29},{31,30},{33,32},{35,34},{37,36}}; //data, clock (swap #1 because it sucks)
|
||||||
const int buttonPins[BUTTONS] = {2,3,4,5,6,7,8,38,40,42,44,46};
|
const int swtPins[SWTS] = {9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
|
||||||
const int switchPins[SWITCHES] = {9,10,11,12,13,14,15,16,17,18,19,20,21,22,23};
|
const int butPins[BUTS] = {2,3,4,5,6,7,8,38,40,42,44,46};
|
||||||
const int analogSwitchPin = A0;
|
const int knbPin = A0;
|
||||||
|
|
||||||
const long speedLimit = 10;
|
Joystick_ joyBut(0x03, JOYSTICK_TYPE_GAMEPAD, BUTS + KNBPOSS, 0, false, false, false, false, false, false, false, false, false, false, false);
|
||||||
const long holdTime = 100;
|
Joystick_ joySwt(0x04, JOYSTICK_TYPE_GAMEPAD, SWTBUTS, 0, false, false, false, false, false, false, false, false, false, false, false);
|
||||||
|
Joystick_ joyEnc(0x05, JOYSTICK_TYPE_GAMEPAD, ENCBUTS, 0, false, false, false, false, false, false, false, false, false, false, false);
|
||||||
|
|
||||||
Joystick_ JoystickButtons(0x03, JOYSTICK_TYPE_GAMEPAD, BUTTONS, 1, false, false, false, false, false, false, false, false, false, false, false);
|
Bounce * switches = new Bounce[SWTS];
|
||||||
Joystick_ JoystickSwitches(0x04, JOYSTICK_TYPE_GAMEPAD, SWITCHBUTTONS, 0, false, false, false, false, false, false, false, false, false, false, false);
|
|
||||||
Joystick_ JoystickEncoders(0x05, JOYSTICK_TYPE_GAMEPAD, ENCODERBUTTONS, 0, false, false, false, false, false, false, false, false, false, false, false);
|
|
||||||
|
|
||||||
Bounce * switches = new Bounce[SWITCHES];
|
|
||||||
|
|
||||||
struct vbuttonStatus {
|
struct vbuttonStatus {
|
||||||
unsigned long releaseTime = 0;
|
unsigned long relTime = 0;
|
||||||
unsigned long freeTime = 0;
|
unsigned long freeTime = 0;
|
||||||
|
void update(){
|
||||||
|
relTime = millis() + PRSDUR;
|
||||||
|
freeTime = relTime + RLSDUR;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
struct knobStatus : vbuttonStatus {
|
||||||
|
uint8_t selected = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct encoderStatus {
|
struct encoderStatus {
|
||||||
long position = 0;
|
long pos = 0;
|
||||||
long reportedPosition = 0;
|
long repPos = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
encoderStatus encoderState[ENCODERS];
|
encoderStatus encStat[ENCS];
|
||||||
vbuttonStatus switchButtonState[SWITCHBUTTONS];
|
vbuttonStatus swtButStat[SWTBUTS];
|
||||||
vbuttonStatus encoderButtonState[SWITCHBUTTONS];
|
vbuttonStatus encButStat[SWTBUTS];
|
||||||
|
knobStatus knbStat;
|
||||||
|
|
||||||
Encoder encoder[ENCODERS] = {
|
Encoder encoder[ENCS] = {
|
||||||
Encoder(encoderPins[0][1], encoderPins[0][0]),
|
Encoder(encPins[0][1], encPins[0][0]),
|
||||||
Encoder(encoderPins[1][1], encoderPins[1][0]),
|
Encoder(encPins[1][1], encPins[1][0]),
|
||||||
Encoder(encoderPins[2][1], encoderPins[2][0]),
|
Encoder(encPins[2][1], encPins[2][0]),
|
||||||
Encoder(encoderPins[3][1], encoderPins[3][0]),
|
Encoder(encPins[3][1], encPins[3][0]),
|
||||||
Encoder(encoderPins[4][1], encoderPins[4][0])
|
Encoder(encPins[4][1], encPins[4][0])
|
||||||
};
|
};
|
||||||
|
|
||||||
void setup() {
|
void setup() {
|
||||||
for(int i = 0; i<BUTTONS; i++) pinMode(buttonPins[i], INPUT_PULLUP);
|
for(int i = 0; i<BUTS; i++) pinMode(butPins[i], INPUT_PULLUP);
|
||||||
for(int i = 0; i<SWITCHES; i++){
|
for(int i = 0; i<SWTS; i++){
|
||||||
switches[i].attach( switchPins[i], INPUT_PULLUP );
|
switches[i].attach( swtPins[i], INPUT_PULLUP );
|
||||||
switches[i].interval(BOUNCEINTERVAL);
|
switches[i].interval(BNCINT);
|
||||||
};
|
};
|
||||||
pinMode(analogSwitchPin, INPUT);
|
pinMode(knbPin, INPUT);
|
||||||
JoystickButtons.begin();
|
joyBut.begin();
|
||||||
JoystickSwitches.begin();
|
joySwt.begin();
|
||||||
JoystickEncoders.begin();
|
joyEnc.begin();
|
||||||
};
|
};
|
||||||
|
|
||||||
void updateKnob(){
|
void doKnb(){
|
||||||
int8_t knobPosition = analogRead(analogSwitchPin) / 205;
|
const int8_t knbPos = analogRead(knbPin) / 205;
|
||||||
knobPosition--;
|
if ( knbPos != knbStat.selected ) {
|
||||||
if (knobPosition > -1) knobPosition = knobPosition * 90;
|
joyBut.releaseButton(knbStat.selected + BUTS);
|
||||||
JoystickButtons.setHatSwitch(0, knobPosition);
|
knbStat.update();
|
||||||
|
joyBut.pressButton(knbPos + BUTS);
|
||||||
|
knbStat.selected = knbPos;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void doSwitches(int switchNumber){
|
void doSwt(const int swtNum){
|
||||||
switches[switchNumber].update();
|
switches[swtNum].update();
|
||||||
if (switches[switchNumber].changed()){
|
if (switches[swtNum].changed()){
|
||||||
const uint8_t upButton = switchNumber;
|
const uint8_t upBut = swtNum * 2;
|
||||||
const uint8_t downButton = upButton + SWITCHES;
|
const uint8_t dnBut = upBut + 1;
|
||||||
if (switches[switchNumber].rose()) {
|
if (switches[swtNum].rose()) {
|
||||||
switchButtonState[upButton].releaseTime = millis() + PRESSDURATION;
|
swtButStat[upBut].update();
|
||||||
switchButtonState[downButton].releaseTime = millis();
|
joySwt.pressButton(upBut);
|
||||||
JoystickSwitches.pressButton(upButton);
|
|
||||||
} else {
|
} else {
|
||||||
switchButtonState[downButton].releaseTime = millis() + PRESSDURATION;
|
swtButStat[dnBut].update();
|
||||||
switchButtonState[upButton].releaseTime = millis();
|
joySwt.pressButton(dnBut);
|
||||||
JoystickSwitches.pressButton(downButton);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void interpretEncoder(int encoderNumber){
|
void doEnc(const int encNum){
|
||||||
const uint8_t downButton = encoderNumber * 2;
|
const uint8_t dnBut = encNum * 2;
|
||||||
const uint8_t upButton = downButton + 1;
|
const uint8_t upBut = dnBut + 1;
|
||||||
encoderState[encoderNumber].position = encoder[encoderNumber].read() / 4;
|
encStat[encNum].pos = encoder[encNum].read() / 4;
|
||||||
if (encoderState[encoderNumber].position != encoderState[encoderNumber].reportedPosition) {
|
if (encStat[encNum].pos != encStat[encNum].repPos) {
|
||||||
if (encoderState[encoderNumber].position > encoderState[encoderNumber].reportedPosition) {
|
if (encStat[encNum].pos > encStat[encNum].repPos) {
|
||||||
if (encoderButtonState[upButton].freeTime <= millis()) {
|
if (encButStat[upBut].freeTime <= millis()) {
|
||||||
encoderButtonState[upButton].releaseTime = millis() + PRESSDURATION;
|
encButStat[upBut].update();
|
||||||
encoderButtonState[upButton].freeTime = encoderButtonState[upButton].releaseTime + RELEASEDURATION;
|
joyEnc.pressButton(upBut);
|
||||||
encoderButtonState[downButton].releaseTime = millis();
|
encStat[encNum].repPos++;
|
||||||
encoderButtonState[downButton].freeTime = millis() + RELEASEDURATION;
|
|
||||||
JoystickEncoders.pressButton(upButton);
|
|
||||||
encoderState[encoderNumber].reportedPosition ++;
|
|
||||||
}
|
}
|
||||||
if (encoderState[encoderNumber].position - encoderState[encoderNumber].reportedPosition > MAXLAG) {
|
if (encStat[encNum].pos - encStat[encNum].repPos > MAXLAG) {
|
||||||
encoderState[encoderNumber].reportedPosition += MAXLAG;
|
encStat[encNum].repPos += MAXLAG;
|
||||||
}
|
}
|
||||||
} else if (encoderState[encoderNumber].position < encoderState[encoderNumber].reportedPosition) {
|
} else {
|
||||||
if (encoderButtonState[downButton].freeTime <= millis()) {
|
if (encButStat[dnBut].freeTime <= millis()) {
|
||||||
encoderButtonState[downButton].releaseTime = millis() + PRESSDURATION;
|
encButStat[dnBut].update();
|
||||||
encoderButtonState[downButton].freeTime = encoderButtonState[downButton].releaseTime + RELEASEDURATION;
|
joyEnc.pressButton(dnBut);
|
||||||
encoderButtonState[upButton].releaseTime = millis();
|
encStat[encNum].repPos--;
|
||||||
encoderButtonState[upButton].freeTime = millis() + RELEASEDURATION;
|
|
||||||
JoystickEncoders.pressButton(downButton);
|
|
||||||
encoderState[encoderNumber].reportedPosition --;
|
|
||||||
}
|
}
|
||||||
if (encoderState[encoderNumber].reportedPosition - encoderState[encoderNumber].position > MAXLAG) {
|
if (encStat[encNum].repPos - encStat[encNum].pos > MAXLAG) {
|
||||||
encoderState[encoderNumber].reportedPosition -= MAXLAG;
|
encStat[encNum].repPos -= MAXLAG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
void loop(){
|
void loop(){
|
||||||
//button order: buttons, switches, encoders
|
static uint8_t knbPos = 0;
|
||||||
static uint8_t switchNumber = 0;
|
static uint8_t swtNum = 0;
|
||||||
static uint8_t buttonNumber = 0;
|
static uint8_t butNum = 0;
|
||||||
static uint8_t encoderNumber = 0;
|
static uint8_t encNum = 0;
|
||||||
static uint8_t switchButtonNumber = 0;
|
static uint8_t swtButNum = 0;
|
||||||
static uint8_t encoderButtonNumber = 0;
|
static uint8_t encButNum = 0;
|
||||||
updateKnob();
|
|
||||||
digitalRead(buttonPins[buttonNumber]) ? JoystickButtons.releaseButton(buttonNumber) : JoystickButtons.pressButton(buttonNumber);
|
|
||||||
|
|
||||||
doSwitches(switchNumber);
|
if (knbStat.freeTime <= millis()) doKnb();
|
||||||
interpretEncoder(encoderNumber);
|
digitalRead(butPins[butNum]) ? joyBut.releaseButton(butNum) : joyBut.pressButton(butNum);
|
||||||
|
|
||||||
if (switchButtonState[switchButtonNumber].releaseTime <= millis()) JoystickSwitches.releaseButton(switchButtonNumber);
|
doSwt(swtNum);
|
||||||
if (encoderButtonState[encoderButtonNumber].releaseTime <= millis()) JoystickEncoders.releaseButton(encoderButtonNumber);
|
doEnc(encNum);
|
||||||
|
|
||||||
buttonNumber == BUTTONS-1 ? buttonNumber = 0 : buttonNumber++;
|
if (swtButStat[swtButNum].relTime <= millis()) joySwt.releaseButton(swtButNum);
|
||||||
switchNumber == SWITCHES-1 ? switchNumber = 0 : switchNumber++;
|
if (encButStat[encButNum].relTime <= millis()) joyEnc.releaseButton(encButNum);
|
||||||
encoderNumber == ENCODERS-1 ? encoderNumber = 0 : encoderNumber++;
|
if (knbStat.relTime <= millis()) joyBut.releaseButton(knbPos + BUTS);
|
||||||
switchButtonNumber == SWITCHBUTTONS-1 ? switchButtonNumber = 0 : switchButtonNumber++;
|
|
||||||
encoderButtonNumber == ENCODERBUTTONS-1 ? encoderButtonNumber = 0 : encoderButtonNumber++;
|
butNum == BUTS-1 ? butNum = 0 : butNum++;
|
||||||
JoystickButtons.sendState();
|
swtNum == SWTS-1 ? swtNum = 0 : swtNum++;
|
||||||
JoystickSwitches.sendState();
|
encNum == ENCS-1 ? encNum = 0 : encNum++;
|
||||||
JoystickEncoders.sendState();
|
knbPos == KNBPOSS-1 ? knbPos = 0 : knbPos++;
|
||||||
|
swtButNum == SWTBUTS-1 ? swtButNum = 0 : swtButNum++;
|
||||||
|
encButNum == ENCBUTS-1 ? encButNum = 0 : encButNum++;
|
||||||
|
|
||||||
|
joyBut.sendState();
|
||||||
|
joySwt.sendState();
|
||||||
|
joyEnc.sendState();
|
||||||
};
|
};
|
Loading…
Reference in New Issue