//https://www.youtube.com/watch?v=DJYH2Y4-n_c
/*
    Unlike pinMode(INPUT), there is no pull-down resistor necessary. An internal
  20K-ohm resistor is pulled to 5V. This configuration causes the input to
  read HIGH when the switch is open, and LOW when it is closed.*/
#include <Keyboard.h> //necessário com versão 1.8.0 do ardiono IDE

//const String NOME_DISPOSITIVO = "#00160218,Arduino1,FichaTripla";
const float         _MARGEM_CONTROLOS = 0; // Margem mínima necessária para o valor ser considerado maior/menor que 0
                                                           
//swtch interrompe ligação do bt 5 ao grownd
int analogicoH1 = A0;
int analogicoV1 = A1;
int analogicoH2 = A2;
int analogicoV2 = A3;
int digitalA1 = 2;
int digitalB1 = 3;
int digitalA2 = 4;
int digitalB2 = 5;
int valAnalogicoH1, valAnalogicoV1;
int valAnalogicoH2, valAnalogicoV2;
int valDigitalA1, valDigitalB1;
int valDigitalA2, valDigitalB2;
bool  mac = true;
int valor;
String valorRecebido;

void setup() {
  Keyboard.begin();
  Serial.begin(9600);
  pinMode(digitalA1, INPUT_PULLUP);
  pinMode(digitalA2, INPUT_PULLUP);
  pinMode(digitalB1, INPUT_PULLUP);
  pinMode(digitalB2, INPUT_PULLUP);
}

void loop()  {
  if (Serial.available() > 0) {
      valorRecebido = Serial.readString();
      if (valorRecebido == "w") mac = false;
      Serial.flush();
      delay(20);
  }

  valAnalogicoH1 = analogRead(analogicoH1);
  valAnalogicoH2 = analogRead(analogicoH2);
  valAnalogicoV1 = analogRead(analogicoV1);
  valAnalogicoV2 = analogRead(analogicoV2);
  
  valDigitalA1 = digitalRead(digitalA1);
  valDigitalA2 = digitalRead(digitalA2);
  valDigitalB1 = digitalRead(digitalB1);
  valDigitalB2 = digitalRead(digitalB2);
  
  if (!mac) {
    // ANALÓGICOS
    Serial.print("A_" + (String)valAnalogicoH1 + "_" + (String)valAnalogicoH2 + "_" + (String)valAnalogicoV1 + "_" + (String)valAnalogicoV2);
    // 255-865 // 155-575 // Invertido 130-575 //Invertido 295-885
    Serial.flush();
    delay(1000);
  
    // DIGITAIS
  
    Serial.print("digitalA1_" + (String)valDigitalA1);
    Serial.flush();
    delay(20);
  
    Serial.print("digitalB1_" + (String)valDigitalB1);
    Serial.flush();
    delay(20);
  
    Serial.print("digitalA2_" + (String)valDigitalA2);
    Serial.flush();
    delay(20);
  
    Serial.print("digitalB2_" + (String)valDigitalB2);
    Serial.flush();
    delay(20);
  } else {
 /*
      Serial.print("A_" + (String)valAnalogicoH1 + "_" + (String)valAnalogicoH2 + "_" + (String)valAnalogicoV1 + "_" + (String)valAnalogicoV2);
    // 255-865 // 155-575 // Invertido 130-575 //Invertido 295-885
    Serial.flush();
    delay(3000);*/
    valor = Mapear(valAnalogicoH1, 260, 860, -1, 1);//comando cinza
    PremirEixo(valor, 'd', 'a');
    //valor = Mapear(valAnalogicoH2, 160, 555, -1, 1);//comando vermelho
    valor = Mapear(valAnalogicoH2, 200, 500, -1, 1);
    PremirEixo(valor, '\346', '\344');
   // valor = -Mapear(valAnalogicoV1, 295, 870, -1, 1);
    valor = -Mapear(valAnalogicoV1, 350, 850, -1, 1);//comando cinza
    PremirEixo(valor, 'w', 's');
    //  valor = -Mapear(valAnalogicoV2, 150, 550, -1, 1);
    valor = -Mapear(valAnalogicoV2, 200, 500, -1, 1);//comando vermelho
    PremirEixo(valor, '\350', '\342');
    
    if (valDigitalA1 == LOW) {
      Keyboard.write('f');
      delay(200);
    } else if (valDigitalA2 == LOW) {
      Keyboard.write('m');
      delay(200);
    } else if (valDigitalB1 == LOW || valDigitalB2 == LOW) {
      Keyboard.write('p');
      delay(200);
    }
  }
}

void PremirEixo(float valor, char c, char c2) {
    if (valor > _MARGEM_CONTROLOS) {
      Keyboard.press(c);
      delay(100);
      Keyboard.releaseAll();
      delay(20);
    } else if (valor < -_MARGEM_CONTROLOS) {
      Keyboard.press(c2);
      delay(100);
      Keyboard.releaseAll();
      delay(20);
    }
}

float Mapear(int valor, float limMin1, float limMax1, float limMin2, float limMax2) {
    return (valor - limMin1) / (limMax1 - limMin1) * (limMax2 - limMin2) + limMin2;
}
