Shortyuk Posted May 23, 2020 Posted May 23, 2020 Hi All I am having an issue with some code for a UFC panel I am putting together using an Arduino Leonardo. I am using it as a HID and also using some DCS-BIOS Functions. This problem however is not a DCS-BIOS Issue as it appears even when I take all DCS-BIOS code out of the sketch. In the code I have assigned pins to keys in this block. rotariesdef rotaries[NUMROTARIES] { {0,1,20,21,0}, {2,3,22,23,0}, {4,5,24,25,0}, {6,7,26,27,0}, {8,9,28,29,0}, }; e.g 0=Pin 0, 1 = Pin 1, 20 = key 20, 21 = key 21 However when rotate to pin 1 instead of key 21 being pressed key 22 is actually pressed. This is the same for all keys,the next following number is pressed? I am seeing this in the USB Joystick calibration tool and in DCS controls too. Anyone any ideas ? The Full code is below. #define DCSBIOS_DEFAULT_SERIAL #include <Keypad.h> #include <Joystick.h> #include "DcsBios.h" #define ENABLE_PULLUPS #define NUMROTARIES 5 #define NUMBUTTONS 19 #define NUMROWS 5 #define NUMCOLS 5 DcsBios::Switch2Pos ufcCom1Pull("UFC_COM1_PULL", 13); DcsBios::RotaryEncoder ufcCom1Sel("UFC_COM1_SEL", "DEC", "INC", 2, 1,1); DcsBios::RotaryEncoder ufcCom2Sel("UFC_COM2_SEL", "DEC", "INC", 8, 9,1); byte buttons[NUMROWS][NUMCOLS] = { {1,9,6,18}, {3,11,14,15}, {2,10,13,17,19}, {4,12,7,16}, {8,5}, }; struct rotariesdef { byte pin1; byte pin2; int ccwchar; int cwchar; volatile unsigned char state; }; rotariesdef rotaries[NUMROTARIES] { {0,1,20,21,0}, {2,3,22,23,0}, {4,5,24,25,0}, {6,7,26,27,0}, {8,9,28,29,0}, }; #define DIR_CCW 0x10 #define DIR_CW 0x20 #define R_START 0x0 #ifdef HALF_STEP #define R_CCW_BEGIN 0x1 #define R_CW_BEGIN 0x2 #define R_START_M 0x3 #define R_CW_BEGIN_M 0x4 #define R_CCW_BEGIN_M 0x5 const unsigned char ttable[6][4] = { // R_START (00) {R_START_M, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CCW_BEGIN {R_START_M | DIR_CCW, R_START, R_CCW_BEGIN, R_START}, // R_CW_BEGIN {R_START_M | DIR_CW, R_CW_BEGIN, R_START, R_START}, // R_START_M (11) {R_START_M, R_CCW_BEGIN_M, R_CW_BEGIN_M, R_START}, // R_CW_BEGIN_M {R_START_M, R_START_M, R_CW_BEGIN_M, R_START | DIR_CW}, // R_CCW_BEGIN_M {R_START_M, R_CCW_BEGIN_M, R_START_M, R_START | DIR_CCW}, }; #else #define R_CW_FINAL 0x1 #define R_CW_BEGIN 0x2 #define R_CW_NEXT 0x3 #define R_CCW_BEGIN 0x4 #define R_CCW_FINAL 0x5 #define R_CCW_NEXT 0x6 const unsigned char ttable[7][4] = { // R_START {R_START, R_CW_BEGIN, R_CCW_BEGIN, R_START}, // R_CW_FINAL {R_CW_NEXT, R_START, R_CW_FINAL, R_START | DIR_CW}, // R_CW_BEGIN {R_CW_NEXT, R_CW_BEGIN, R_START, R_START}, // R_CW_NEXT {R_CW_NEXT, R_CW_BEGIN, R_CW_FINAL, R_START}, // R_CCW_BEGIN {R_CCW_NEXT, R_START, R_CCW_BEGIN, R_START}, // R_CCW_FINAL {R_CCW_NEXT, R_CCW_FINAL, R_START, R_START | DIR_CCW}, // R_CCW_NEXT {R_CCW_NEXT, R_CCW_FINAL, R_CCW_BEGIN, R_START}, }; #endif byte rowPins[NUMROWS] = {10,11,12,13,A0}; byte colPins[NUMCOLS] = {A5,A4,A3,A2,A1}; Keypad buttbx = Keypad( makeKeymap(buttons), rowPins, colPins, NUMROWS, NUMCOLS); Joystick_ Joystick(JOYSTICK_DEFAULT_REPORT_ID, JOYSTICK_TYPE_JOYSTICK, 32, 0, false, false, false, false, false, false, false, false, false, false, false); void setup() { DcsBios::setup(); Joystick.begin(); rotary_init();} void loop() { DcsBios::loop(); CheckAllEncoders(); CheckAllButtons(); } void CheckAllButtons(void) { if (buttbx.getKeys()) { for (int i=0; i<LIST_MAX; i++) { if ( buttbx.key[i].stateChanged ) { switch (buttbx.key[i].kstate) { case PRESSED: case HOLD: Joystick.setButton(buttbx.key[i].kchar, 1); break; case RELEASED: case IDLE: Joystick.setButton(buttbx.key[i].kchar, 0); break; } } } } } void rotary_init() { for (int i=0;i<NUMROTARIES;i++) { pinMode(rotaries[i].pin1, INPUT); pinMode(rotaries[i].pin2, INPUT); #ifdef ENABLE_PULLUPS digitalWrite(rotaries[i].pin1, HIGH); digitalWrite(rotaries[i].pin2, HIGH); #endif } } unsigned char rotary_process(int _i) { unsigned char pinstate = (digitalRead(rotaries[_i].pin2) << 1) | digitalRead(rotaries[_i].pin1); rotaries[_i].state = ttable[rotaries[_i].state & 0xf][pinstate]; return (rotaries[_i].state & 0x30); } void CheckAllEncoders(void) { for (int i=0;i<NUMROTARIES;i++) { unsigned char result = rotary_process(i); if (result == DIR_CCW) { Joystick.setButton(rotaries[i].ccwchar, 1); delay(50); Joystick.setButton(rotaries[i].ccwchar, 0); }; if (result == DIR_CW) { Joystick.setButton(rotaries[i].cwchar, 1); delay(50); Joystick.setButton(rotaries[i].cwchar, 0); }; } }
No1sonuk Posted May 23, 2020 Posted May 23, 2020 If I read that right, you're using digital pins 0 and 1 for your panel. Those two are shared with the USB interface, so you can't use them for anything else while the USB or hardware serial port is in use.
Shortyuk Posted May 23, 2020 Author Posted May 23, 2020 If I read that right, you're using digital pins 0 and 1 for your panel. Those two are shared with the USB interface, so you can't use them for anything else while the USB or hardware serial port is in use. Great thanks for that. I will see if I can work around that limitation.
Recommended Posts