Subversion Repositories DashDisplay

Rev

Rev 5 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "stm32f1xx_hal.h"
  2.  
  3. #include "switches.h"
  4.  
  5.  
  6. typedef enum {
  7.         PH_00 = 0, PH_10 = 2, PH_11 = 3, PH_01 = 1,
  8. } eGreyCode;
  9.  
  10. typedef struct {
  11. GPIO_TypeDef * GPIO;
  12. uint16_t Pin;
  13. } sGPIOPin;
  14.  
  15. volatile int dial_pos[MAX_DIALS];
  16. volatile int dial_last[MAX_DIALS]; // previous debounced switch position
  17.  
  18. volatile int push_pos[MAX_PUSHBUTTONS];
  19.  
  20. volatile static int sw_newstate[MAX_SWITCHES]; //< debounced switch state
  21. volatile static int sw_count[MAX_SWITCHES]; //< debounce counter
  22.  
  23. static const sGPIOPin sw_arr[MAX_SWITCHES] =
  24.         { { SW1_I_GPIO_Port, SW1_I_Pin }, // these two pins used to encode SW1 phase
  25.                         { SW1_Q_GPIO_Port, SW1_Q_Pin }, // "                             SW1 phase
  26.                         { SW2_I_GPIO_Port, SW2_I_Pin }, // these two pins used to encode SW2 phase
  27.                         { SW2_Q_GPIO_Port, SW2_Q_Pin }, // "                             SW2 phase
  28.                         { SW1_PUSH_GPIO_Port, SW1_PUSH_Pin }, // two debounced switches
  29. { SW2_PUSH_GPIO_Port, SW2_PUSH_Pin }, };
  30.  
  31. // call this to setup switch states
  32. void InitSwitches(void) {
  33. int i;
  34.  
  35. for (i = 0; i < MAX_SWITCHES; i++) {
  36.         sw_newstate[i] = 0;
  37.         sw_count[i] = 0;
  38. }
  39.  
  40. // reset the dial positions
  41. dial_pos[0] = 0;
  42. dial_pos[1] = 1;
  43. }
  44.  
  45. // this gray encodes the dial .
  46. void EncodeDial(int i) {
  47. if (i < MAX_DIALS && i >= 0) {
  48.         int sw_index = i << 1;
  49.         // dial 0 uses switches 0 and 1
  50.         // dial 1 uses switches 2 and 3
  51.         int current = sw_newstate[sw_index] | (sw_newstate[sw_index + 1] << 1);
  52.         switch (dial_last[i]) {
  53.         case PH_00:
  54.                 if (current == PH_10)
  55.                         dial_pos[i]++;
  56.                 if (current == PH_01)
  57.                         dial_pos[i]--;
  58.                 break;
  59.         case PH_10:
  60.                 if (current == PH_11)
  61.                         dial_pos[i]++;
  62.                 if (current == PH_00)
  63.                         dial_pos[i]--;
  64.                 break;
  65.         case PH_11:
  66.                 if (current == PH_01)
  67.                         dial_pos[i]++;
  68.                 if (current == PH_10)
  69.                         dial_pos[i]--;
  70.                 break;
  71.         case PH_01:
  72.                 if (current == PH_00)
  73.                         dial_pos[i]++;
  74.                 if (current == PH_11)
  75.                         dial_pos[i]--;
  76.                 break;
  77.         default:
  78.                 break;
  79.         }
  80.         dial_last[i] = current;
  81. }
  82.  
  83. }
  84.  
  85. // this is the interrupt handler , dealling with the switches
  86. void HandleSwitches(void)
  87. {
  88.  
  89.   int i;
  90.  
  91.   for (i = 0; i < MAX_SWITCHES; i++)
  92.   {
  93.  
  94.     int sw = HAL_GPIO_ReadPin(sw_arr[i].GPIO, sw_arr[i].Pin) == GPIO_PIN_RESET;
  95.  
  96.     // bouncing, reset counter
  97.     if (sw != sw_newstate[i])
  98.     {
  99.           sw_count[i] = 0;
  100.     }
  101.     else
  102.     {
  103.         // count up to debounce time
  104.           if (sw_count[i] < DEBOUNCE_TIME)
  105.           {
  106.                 sw_count[i]++;
  107.  
  108.                 if (sw_count[i] == DEBOUNCE_TIME)
  109.                 {
  110.                         sw_newstate[i] = sw;
  111.                 }
  112.          }
  113.     }
  114.   }
  115. // we now have debounced switch states in sw_newstate . So we can go ahead and feed some of the
  116.  
  117.   EncodeDial(0);
  118.   EncodeDial(1);
  119.  
  120. }
  121.  
  122. void zero_dial(int dial) {
  123.   if(dial>=0 && dial < MAX_DIALS)
  124.         dial_pos[dial]= 0;
  125. }
  126.  
  127.