BRRRRRT
This commit is contained in:
parent
72e4cf445b
commit
35634441c7
|
@ -15,6 +15,7 @@ framework = arduino
|
||||||
lib_deps =
|
lib_deps =
|
||||||
mheironimus/Joystick @ ^2.0.7
|
mheironimus/Joystick @ ^2.0.7
|
||||||
paulstoffregen/Encoder @ ^1.4.1
|
paulstoffregen/Encoder @ ^1.4.1
|
||||||
|
thomasfredericks/Bounce2 @ ^2.56
|
||||||
; nicohood/HID-Project @ ^2.6.1
|
; nicohood/HID-Project @ ^2.6.1
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
; monitor_port = /dev/tty.usbmodemHIDPE1
|
; monitor_port = /dev/tty.usbmodemHIDPE1
|
||||||
|
|
201
src/main.cpp
201
src/main.cpp
|
@ -1,94 +1,155 @@
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Encoder.h>
|
#include <Encoder.h>
|
||||||
#include <Joystick.h>
|
#include <Joystick.h>
|
||||||
|
#include <Bounce2.h>
|
||||||
|
|
||||||
#define MAXLAG 5
|
#define MAXLAG 5
|
||||||
#define NUMBEROFENCODERS 5
|
#define ENCODERS 5
|
||||||
#define NUMBEROFBUTTONS 6
|
#define SWITCHES 20
|
||||||
#define BUTTONPRESSTIME 50
|
#define KNOBPOSITIONS 5
|
||||||
#define BUTTONRELEASETIME 25
|
#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 encoderPins[][2] = {{28,29},{30,31},{33,32},{35,34},{37,36}}; //data, clock
|
||||||
const int clockPins[]={29,30,32,34,36};
|
const int buttonPins[] = {2,3,4,5,6,7,8,38,40,42,44,46};
|
||||||
const int encButtonPins[]={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 buttonPins[]={2,3,4,5,6,7};
|
const int analogSwitchPin = A0;
|
||||||
|
|
||||||
Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID,
|
const long speedLimit = 10;
|
||||||
JOYSTICK_TYPE_GAMEPAD, (NUMBEROFENCODERS * 3) + NUMBEROFBUTTONS, 0,
|
const long holdTime = 100;
|
||||||
false, false, false, false, false, false,
|
|
||||||
false, false, false, false, false);
|
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};
|
enum buttonStates {ready, requested, active, hold};
|
||||||
buttonStates encButtonState[NUMBEROFENCODERS * 3];
|
|
||||||
unsigned long encButtonActiveTime[NUMBEROFENCODERS * 3];
|
|
||||||
long reportedPosition[NUMBEROFENCODERS];
|
|
||||||
|
|
||||||
// struct RGB {
|
struct vbuttonStatus {
|
||||||
// byte r;
|
buttonStates state = ready;
|
||||||
// byte g;
|
unsigned long activeTime = 0;
|
||||||
// byte b;
|
};
|
||||||
// };
|
|
||||||
|
|
||||||
// RGB variable = { 255 , 0 , 0 };
|
struct encoderStatus : vbuttonStatus {
|
||||||
|
long position = 0;
|
||||||
|
long reportedPosition = 0;
|
||||||
|
};
|
||||||
|
|
||||||
Encoder myEnc[NUMBEROFENCODERS] = {
|
encoderStatus encoderState[ENCODERS];
|
||||||
Encoder(clockPins[0], dataPins[0]),
|
vbuttonStatus switchButtonState[SWITCHBUTTONS];
|
||||||
Encoder(clockPins[1], dataPins[1]),
|
vbuttonStatus encoderButtonState[SWITCHBUTTONS];
|
||||||
Encoder(clockPins[2], dataPins[2]),
|
|
||||||
Encoder(clockPins[3], dataPins[3]),
|
Encoder encoder[ENCODERS] = {
|
||||||
Encoder(clockPins[4], dataPins[4])
|
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() {
|
void setup() {
|
||||||
for(int i = 0; i<NUMBEROFENCODERS; i++) pinMode(encButtonPins[i], INPUT_PULLUP);
|
for(int i = 0; i<BUTTONS; i++) pinMode(buttonPins[i], INPUT_PULLUP);
|
||||||
for(int i = 0; i<NUMBEROFBUTTONS; i++) pinMode(buttonPins[i], INPUT_PULLUP);
|
for(int i = 0; i<SWITCHES; i++){
|
||||||
|
switches[i].attach( switchPins[i], INPUT_PULLUP );
|
||||||
|
switches[i].interval(BOUNCEINTERVAL);
|
||||||
|
}
|
||||||
|
pinMode(analogSwitchPin, INPUT);
|
||||||
Joystick.begin();
|
Joystick.begin();
|
||||||
}
|
};
|
||||||
|
|
||||||
void pushEncButton(int buttonNumber){
|
void updateKnob(){
|
||||||
encButtonActiveTime[buttonNumber] = millis();
|
int8_t knobPosition = analogRead(analogSwitchPin) / 205;
|
||||||
encButtonState[buttonNumber] = active;
|
knobPosition--;
|
||||||
Joystick.pressButton(buttonNumber);
|
if (knobPosition > -1) knobPosition = knobPosition * 90;
|
||||||
}
|
Joystick.setHatSwitch(0, knobPosition);
|
||||||
|
};
|
||||||
|
|
||||||
void releaseEncButton(int buttonNumber){
|
void readSwitch(int switchNumber){
|
||||||
encButtonState[buttonNumber] = hold;
|
switches[switchNumber].update();
|
||||||
encButtonActiveTime[buttonNumber] = millis();
|
if (switches[switchNumber].rose()) {
|
||||||
Joystick.releaseButton(buttonNumber);
|
vbuttonState[switchNumber].state = requested; // start clock for hold
|
||||||
}
|
} else if (switches[switchNumber].fell()){
|
||||||
|
vbuttonState[switchNumber + SWITCHES].state = requested;
|
||||||
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]++;
|
|
||||||
}
|
}
|
||||||
if((encButtonState[dnBtn] == ready) && (reportedPosition[encoderNumber] > encoderPosition)) {
|
uint32_t buttonStateNow = 0;
|
||||||
encButtonState[dnBtn] = requested;
|
for (int i=0; i < BUTTONS * 2; i++) { // if button was activated within holdtime, set it as 1
|
||||||
reportedPosition[encoderNumber] - encoderPosition > MAXLAG ? reportedPosition[encoderNumber] = encoderPosition + MAXLAG : reportedPosition[encoderNumber]--;
|
if (millis() - pressedTime[i] < holdTime) bitWrite(buttonStateNow, i, 1);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
void performPresses(int buttonNumber){
|
void updateSwitch(int switchNumber){
|
||||||
if(encButtonState[buttonNumber] == requested) pushEncButton(buttonNumber);
|
const uint8_t downButton = switchNumber + SWITCHVBUTTONOFFSET;
|
||||||
if((encButtonState[buttonNumber] == active) && (millis() - encButtonActiveTime[buttonNumber] > BUTTONPRESSTIME)) releaseEncButton(buttonNumber);
|
const uint8_t upButton = downButton + 1;
|
||||||
if((encButtonState[buttonNumber] == hold) && (millis() - encButtonActiveTime[buttonNumber] > BUTTONRELEASETIME)) encButtonState[buttonNumber] = ready;
|
};
|
||||||
}
|
|
||||||
|
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() {
|
void loop() {
|
||||||
for(int buttonNumber = 0; buttonNumber<NUMBEROFBUTTONS; buttonNumber++){
|
//button order: buttons, switches, encoders
|
||||||
uint8_t buttonOutputNumber = buttonNumber + (NUMBEROFENCODERS * 3);
|
static uint8_t switchNumber = 0;
|
||||||
digitalRead(buttonPins[buttonNumber]) ? Joystick.releaseButton(buttonOutputNumber) : Joystick.pressButton(buttonOutputNumber);
|
static uint8_t buttonNumber = 0;
|
||||||
}
|
static uint8_t encoderNumber = 0;
|
||||||
|
static uint8_t switchButtonNumber = 0;
|
||||||
|
static uint8_t encoderButtonNumber = 0;
|
||||||
|
updateKnob();
|
||||||
|
digitalRead(buttonPins[buttonNumber]) ? Joystick.releaseButton(buttonNumber) : Joystick.pressButton(buttonNumber);
|
||||||
|
|
||||||
for(int encoderNumber = 0; encoderNumber<NUMBEROFENCODERS; encoderNumber++){
|
readSwitch(switchNumber);
|
||||||
uint8_t encButtonOutputNumber = encoderNumber * 3;
|
updateSwitch(switchNumber);
|
||||||
digitalRead(encButtonPins[encoderNumber]) ? Joystick.releaseButton(encButtonOutputNumber) : Joystick.pressButton(encButtonOutputNumber);
|
|
||||||
checkRotary(encoderNumber);
|
encoderState[encoderNumber].position = encoder[encoderNumber].read() / 4;
|
||||||
performPresses((encoderNumber * 3) + 1);
|
updateEncoder(encoderNumber);
|
||||||
performPresses((encoderNumber * 3) + 2);
|
|
||||||
Joystick.sendState();
|
buttonNumber == BUTTONS-1 ? buttonNumber = 0 : buttonNumber++;
|
||||||
}
|
switchNumber == SWITCHES-1 ? switchNumber = 0 : switchNumber++;
|
||||||
}
|
encoderNumber == ENCODERS-1 ? encoderNumber = 0 : encoderNumber++;
|
||||||
|
switchButtonNumber == SWITCHBUTTONS-1 ? switchButtonNumber = 0 : switchButtonNumber++;
|
||||||
|
encoderButtonNumber == ENCODERBUTTONS-1 ? encoderButtonNumber = 0 : encoderButtonNumber++;
|
||||||
|
Joystick.sendState();
|
||||||
|
};
|
Loading…
Reference in New Issue