Jump to content

Rotary Encoder outputting wrong keys, help please


Shortyuk
 Share

Recommended Posts

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);
   };
 }
}

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

 Share

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...