#define SER Serial2

#define N_BTN 6
int BTN_CURR[N_BTN] = {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH};
int BTN_PREV[N_BTN] = {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH};
const int BTNS[N_BTN] = {7,6,5,16,22,23}; // button pin numbers

int mode = 0;

void btn_flip(bool dir, int idx){
  Serial.print("(btn ");
  Serial.print(idx);
  Serial.print(" state ");
  Serial.print(dir);
  Serial.println(")");

  if (idx == 5){
    if (dir){
      mode = !mode;
      Serial.print("(cmode ");
      Serial.print(mode);
      Serial.println(")");
      digitalWrite(3,LOW);
    }else{
      digitalWrite(3,HIGH);
    }
    
  }else{
    if (dir){
      int cmd = mode*5+idx;
      Serial.print("(cmd ");
      Serial.print(cmd);
      Serial.println(")");
      
      SER.print(cmd);
      digitalWrite(3,LOW);
    }else{
      digitalWrite(3,HIGH);
    }
  }
}

void btn_update(){
  for (int i = 0; i < N_BTN; i++){
    BTN_CURR[i] = digitalRead(BTNS[i]);
    if (BTN_CURR[i] == LOW && BTN_PREV[i] == HIGH){
      btn_flip(true,i);
      delay(200);
    }
    if (BTN_CURR[i] == HIGH && BTN_PREV[i] == LOW){
      btn_flip(false,i);
      delay(200);
    }
    BTN_PREV[i] = BTN_CURR[i];
  }
}



void setup() {
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);

  digitalWrite(2,HIGH);
  
  for (int i = 0; i < N_BTN; i++) pinMode(BTNS[i], INPUT);
  Serial.begin(9600);

  SER.begin(9600);

  
  digitalWrite(3,HIGH);
  Serial.println("setup.");
}

char buff[256] = {0};
int n_buff = 0;

void loop() {
  btn_update();
  while (Serial.available() > 0){
    char b = Serial.read();
    char bb[2] = {0};
    bb[0] = b;
    SER.print(bb);
    Serial.print(bb);
  }
  while (SER.available() > 0) {
    char b = SER.read();
    if (b == '\n'){
      if (buff[0] == '$'){
        if (buff[1] == 'G'){
          if (buff[2] == 'g'){
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
            delay(300);
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
            delay(300);
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
          }else{
            digitalWrite(2,HIGH);
          }
        }else if (buff[1] == 'g'){
          if (buff[2] == 'G'){
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
            delay(300);
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
            delay(300);
            digitalWrite(2,HIGH);
            delay(300);
            digitalWrite(2,LOW);
            delay(300);
            digitalWrite(2,HIGH);
          }else{
            digitalWrite(2,LOW);
          }
        }
      }
      
      buff[n_buff] = 0;
      Serial.println(buff);
      n_buff = 0;
    }else{
      buff[n_buff++] = b;
    }
  }
}
