From 35634441c7407823a628dc2b915201b63ab551eb Mon Sep 17 00:00:00 2001 From: James Wood Date: Tue, 2 Nov 2021 20:37:06 +1100 Subject: [PATCH] BRRRRRT --- platformio.ini | 1 + src/main.cpp | 201 ++++++++++++++++++++++++++++++++----------------- 2 files changed, 132 insertions(+), 70 deletions(-) diff --git a/platformio.ini b/platformio.ini index 539124f..4452f24 100755 --- a/platformio.ini +++ b/platformio.ini @@ -15,6 +15,7 @@ framework = arduino lib_deps = mheironimus/Joystick @ ^2.0.7 paulstoffregen/Encoder @ ^1.4.1 + thomasfredericks/Bounce2 @ ^2.56 ; nicohood/HID-Project @ ^2.6.1 monitor_speed = 115200 ; monitor_port = /dev/tty.usbmodemHIDPE1 diff --git a/src/main.cpp b/src/main.cpp index 27cc22c..02d3e82 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,94 +1,155 @@ #include #include #include +#include #define MAXLAG 5 -#define NUMBEROFENCODERS 5 -#define NUMBEROFBUTTONS 6 -#define BUTTONPRESSTIME 50 -#define BUTTONRELEASETIME 25 +#define ENCODERS 5 +#define SWITCHES 20 +#define KNOBPOSITIONS 5 +#define BUTTONS 12 +#define BOUNCEINTERVAL 25 +#define PRESSDURATION 50 +#define RELEASEDURATION 25 +#define SWITCHBUTTONS 2 * SWITCHES +#define ENCODERBUTTONS 2 * ENCODERS +//button order: buttons, switches, encoders +#define SWITCHVBUTTONOFFSET BUTTONS +#define ENCODERVBUTTONOFFSET BUTTONS + SWITCHBUTTONS -const int dataPins[]={28,31,33,35,37}; -const int clockPins[]={29,30,32,34,36}; -const int encButtonPins[]={38,40,42,44,46}; -const int buttonPins[]={2,3,4,5,6,7}; +const int encoderPins[][2] = {{28,29},{30,31},{33,32},{35,34},{37,36}}; //data, clock +const int buttonPins[] = {2,3,4,5,6,7,8,38,40,42,44,46}; +const int switchPins[] = {1,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27}; +const int analogSwitchPin = A0; -Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, - JOYSTICK_TYPE_GAMEPAD, (NUMBEROFENCODERS * 3) + NUMBEROFBUTTONS, 0, - false, false, false, false, false, false, - false, false, false, false, false); +const long speedLimit = 10; +const long holdTime = 100; + +Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_GAMEPAD, BUTTONS + SWITCHBUTTONS + ENCODERBUTTONS, 1, false, false, false, false, false, false, false, false, false, false, false); +Bounce * switches = new Bounce[SWITCHES]; enum buttonStates {ready, requested, active, hold}; -buttonStates encButtonState[NUMBEROFENCODERS * 3]; -unsigned long encButtonActiveTime[NUMBEROFENCODERS * 3]; -long reportedPosition[NUMBEROFENCODERS]; -// struct RGB { -// byte r; -// byte g; -// byte b; -// }; +struct vbuttonStatus { + buttonStates state = ready; + unsigned long activeTime = 0; +}; -// RGB variable = { 255 , 0 , 0 }; +struct encoderStatus : vbuttonStatus { + long position = 0; + long reportedPosition = 0; +}; -Encoder myEnc[NUMBEROFENCODERS] = { - Encoder(clockPins[0], dataPins[0]), - Encoder(clockPins[1], dataPins[1]), - Encoder(clockPins[2], dataPins[2]), - Encoder(clockPins[3], dataPins[3]), - Encoder(clockPins[4], dataPins[4]) +encoderStatus encoderState[ENCODERS]; +vbuttonStatus switchButtonState[SWITCHBUTTONS]; +vbuttonStatus encoderButtonState[SWITCHBUTTONS]; + +Encoder encoder[ENCODERS] = { + Encoder(encoderPins[0][1], encoderPins[0][0]), + Encoder(encoderPins[1][1], encoderPins[1][0]), + Encoder(encoderPins[2][1], encoderPins[2][0]), + Encoder(encoderPins[3][1], encoderPins[3][0]), + Encoder(encoderPins[4][1], encoderPins[4][0]) }; void setup() { - for(int i = 0; i -1) knobPosition = knobPosition * 90; + Joystick.setHatSwitch(0, knobPosition); +}; -void releaseEncButton(int buttonNumber){ - encButtonState[buttonNumber] = hold; - encButtonActiveTime[buttonNumber] = millis(); - Joystick.releaseButton(buttonNumber); -} - -void checkRotary(uint8_t encoderNumber){ - uint8_t dnBtn = (encoderNumber * 3) + 1; - uint8_t upBtn = dnBtn + 1; - long encoderPosition = myEnc[encoderNumber].read() / 4; - if((encButtonState[upBtn] == ready) && (encoderPosition > reportedPosition[encoderNumber])) { - encButtonState[upBtn] = requested; - encoderPosition - reportedPosition[encoderNumber] > MAXLAG ? reportedPosition[encoderNumber] = encoderPosition - MAXLAG : reportedPosition[encoderNumber]++; +void readSwitch(int switchNumber){ + switches[switchNumber].update(); + if (switches[switchNumber].rose()) { + vbuttonState[switchNumber].state = requested; // start clock for hold + } else if (switches[switchNumber].fell()){ + vbuttonState[switchNumber + SWITCHES].state = requested; + } } - if((encButtonState[dnBtn] == ready) && (reportedPosition[encoderNumber] > encoderPosition)) { - encButtonState[dnBtn] = requested; - reportedPosition[encoderNumber] - encoderPosition > MAXLAG ? reportedPosition[encoderNumber] = encoderPosition + MAXLAG : reportedPosition[encoderNumber]--; + uint32_t buttonStateNow = 0; + for (int i=0; i < BUTTONS * 2; i++) { // if button was activated within holdtime, set it as 1 + if (millis() - pressedTime[i] < holdTime) bitWrite(buttonStateNow, i, 1); } -} +}; -void performPresses(int buttonNumber){ - if(encButtonState[buttonNumber] == requested) pushEncButton(buttonNumber); - if((encButtonState[buttonNumber] == active) && (millis() - encButtonActiveTime[buttonNumber] > BUTTONPRESSTIME)) releaseEncButton(buttonNumber); - if((encButtonState[buttonNumber] == hold) && (millis() - encButtonActiveTime[buttonNumber] > BUTTONRELEASETIME)) encButtonState[buttonNumber] = ready; -} +void updateSwitch(int switchNumber){ + const uint8_t downButton = switchNumber + SWITCHVBUTTONOFFSET; + const uint8_t upButton = downButton + 1; +}; + +void updateEncoder(int encoderNumber){ + const uint8_t downButton = encoderNumber + ENCODERVBUTTONOFFSET; + const uint8_t upButton = downButton + 1; + if((vbuttonState[upButton].state == ready) && (encoderState[encoderNumber].position > encoderState[encoderNumber].reportedPosition)) { + vbuttonState[upButton].state = requested; + if (encoderState[encoderNumber].position - encoderState[encoderNumber].reportedPosition > MAXLAG){ + encoderState[encoderNumber].reportedPosition = encoderState[encoderNumber].position - MAXLAG; + } else { + encoderState[encoderNumber].reportedPosition++; + } + } + if((vbuttonState[downButton].state == ready) && (encoderState[encoderNumber].reportedPosition > encoderState[encoderNumber].position)) { + vbuttonState[downButton].state = requested; + if (encoderState[encoderNumber].reportedPosition - encoderState[encoderNumber].position > MAXLAG){ + encoderState[encoderNumber].reportedPosition = encoderState[encoderNumber].position + MAXLAG + } else { + encoderState[encoderNumber].reportedPosition--; + } + } +}; +}; + +void performPresses(int vButtonNumber){ + if(vbuttonState[vButtonNumber].state == requested) pushVButton(vButtonNumber); + if((vbuttonState[vButtonNumber].state == active) && (millis() - vbuttonState[vButtonNumber].activeTime > PRESSDURATION)) releaseVButton(vButtonNumber); + if((vbuttonState[vButtonNumber].state == hold) && (millis() - vbuttonState[vButtonNumber].activeTime > RELEASEDURATION)) vbuttonState[vButtonNumber].state = ready; +}; + +void pushVButton(int vButtonNumber){ + vbuttonState[vButtonNumber].pressTime = millis(); + vbuttonState[vButtonNumber].releaseTime = millis() + PRESSDURATION; + vbuttonState[vButtonNumber].nextAvailablePress = millis() + PRESSDURATION + RELEASEDURATION; + vbuttonState[vButtonNumber].state = active; + Joystick.pressButton(vButtonNumber); +}; + +void releaseVButton(int vButtonNumber){ + vbuttonState[vButtonNumber].state = hold; + vbuttonState[vButtonNumber].activeTime = millis(); + Joystick.releaseButton(vButtonNumber); +}; void loop() { - for(int buttonNumber = 0; buttonNumber