/*
  El arduino se conecta a varios rotary_encoders
  En el movimiento de cualquier de ellos o push de sus botones
  se notifica por Serial
*/

#define TOTAL_ENCODERS_ROTARIES 8
#define LAST_ENCODER_ROTARY_IN_ARRAY (TOTAL_ENCODERS_ROTARIES-1)

typedef struct encoder_rotary_struct
{
  int pinLeft;
  int pinRight;
  int pinSw;
  int state;
  int lastState;
  int counter;
};


encoder_rotary_struct encoder_rotary[LAST_ENCODER_ROTARY_IN_ARRAY] = {
  {51, 49, 47, 0, 0, 0},  // ENCODER ROTARY 1
  {45, 43, 41, 0, 0, 0},  // ENCODER ROTARY 2
  {39, 37, 35, 0, 0, 0},  // ENCODER ROTARY 3
  {32, 30, 28, 0, 0, 0},  // ENCODER ROTARY 4
  {22, 24, 26, 0, 0, 0},  // ENCODER ROTARY 5
  {27, 25, 23, 0, 0, 0},  // ENCODER ROTARY 6
  {33, 31, 29, 0, 0, 0},  // ENCODER ROTARY 7
};


 void setup() 
 { 
  for (int i = 0; i < LAST_ENCODER_ROTARY_IN_ARRAY; i++)
  {
    pinMode(encoder_rotary[i].pinLeft, INPUT_PULLUP);
    pinMode(encoder_rotary[i].pinRight, INPUT_PULLUP);
    pinMode(encoder_rotary[i].pinSw, INPUT_PULLUP);
    encoder_rotary[i].lastState = digitalRead(encoder_rotary[i].pinLeft);   
  }
  Serial.begin (115200);
 } 

 void loop()
 {
  for (int i = 0; i < LAST_ENCODER_ROTARY_IN_ARRAY; i++)
  {
    if (!digitalRead(encoder_rotary[i].pinSw))
    {
      Serial.print(millis()); Serial.print(" ");
      Serial.print("Push Rotary #");
      Serial.println(i+1);
      Serial.println();
    }
    encoder_rotary[i].state = digitalRead(encoder_rotary[i].pinLeft);
    if (encoder_rotary[i].state != encoder_rotary[i].lastState)
    {
      if (digitalRead(encoder_rotary[i].pinRight) != encoder_rotary[i].state) 
      { 
        encoder_rotary[i].counter++;
      }
      else 
      {
        encoder_rotary[i].counter--;
      }
      Serial.print(millis()); Serial.print(" ");
      Serial.print("Change Rotary #");
      Serial.print(i+1);
      Serial.print(" (");
      Serial.print("pinLeft="); Serial.print(encoder_rotary[i].pinLeft);
      Serial.print("pinRight="); Serial.print(encoder_rotary[i].pinRight);
      Serial.print("pinSwitch="); Serial.print(encoder_rotary[i].pinSw);
      Serial.print("). ");
      Serial.print(" counter=");
      Serial.println(encoder_rotary[i].counter);
      Serial.println();
      encoder_rotary[i].lastState = encoder_rotary[i].state;
    }
  }
 }