const byte NBCOLS = 16;
const byte NBROWS = 4;

const byte colPins[] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 2, 14, 15, 16, 17 };
const byte rowPins[] = { 18, 19, 20, 21 };

void actionTouche_1(int valeur)
{
  // instructions à exécuter si touche 1
  Serial.print("actionTouche n°");
  Serial.println(valeur);
  Serial.flush();
}

// void actionTouche_2()
// {
//   // instructions à exécuter si touche 2
//   actionnerBumper(4, 500);
//   tournerRoue(17);
// }

// void actionTouche_3()
// {
//   // instructions à exécuter si touche 3
//   faireUnTruc(parametreDuTruc);
//   faireUnAutreTruc();
// }

void (*actionTouche[])(int) = {
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1,
  actionTouche_1, actionTouche_1, actionTouche_1, actionTouche_1
};

void setup() {
  Serial.begin(115200); // <- 115200 est plus rapide que l'ancien 9600 mais il faut que ton moniteur série (dans Arduino IDE) soit aussi à 115200 !
  pinMode(LED_BUILTIN, OUTPUT);

  for (byte col = 0; col < NBCOLS; col++) {
    pinMode(colPins[col], INPUT_PULLUP);
    Serial.print(" PIN Return n°: ");
    Serial.print(colPins[col]);
    Serial.println(" initialisé HIGH");
  }

  for (byte row = 0; row < NBROWS; row++) {
    pinMode(rowPins[row], INPUT_PULLUP);
    Serial.print(" PIN Row n°: ");
    Serial.print(rowPins[row]);
    Serial.println(" initialisé HIGH");
  }

  Serial.println(" \t INIT OK");
}

void loop() {
  int touche = -1;
  byte colonne;
  byte rangee;

  digitalWrite(LED_BUILTIN, HIGH);
  uint32_t timer = micros();
  for (byte col = 0; col < NBCOLS; col++) {
    // Serial.print("col: " );
    // Serial.print(col);
    // Serial.print("\t");

    if (digitalRead(colPins[col]) == LOW) {
      touche = col;
      break;
    }
  }
  timer = micros() - timer;
  digitalWrite(LED_BUILTIN, LOW);
  Serial.print("Temps colonnes: ");
  Serial.println(timer);
  touche = 15;

  digitalWrite(LED_BUILTIN, HIGH);
  timer = micros();
  // Serial.println(); // afficher la suite sur une nouvelle ligne
  if (touche != -1) { // vérifier qu'une colonne est active
    colonne = touche;
    touche = -1;
    for (byte row = 0; row < NBROWS; row++) {
      // Serial.print("row: " );
      // Serial.print(row);
      // Serial.print("\t");

      if (digitalRead(rowPins[row]) == LOW) {
        touche = row;
        break;
      }
    }
  }
  timer = micros() - timer;
  digitalWrite(LED_BUILTIN, LOW);
  Serial.print("Temps lignes: ");
  Serial.println(timer);
  // touche = 2;  // <- Supprimer cette ligne hors du simulateur !!!!!

  // Serial.println(); // afficher la suite sur une nouvelle ligne
  // if (touche == -1) {
  //   Serial.println("Aucun switch détecté" );
  // }
  // else {
  //   rangee = touche;
  //   touche = colonne + rangee * 16 + 1;
  //   Serial.print("Switch " );
  //   Serial.print(touche);
  //   Serial.print(" colonne " );
  //   Serial.print(colonne + 1);
  //   Serial.print(" rangée " );
  //   Serial.print(rangee + 1);
  //   Serial.println(" fermé");

  //   actionTouche[colonne + rangee * 16](colonne + rangee * 16 + 1);
  // }


  // for (byte row = 0; row < NBROWS; row++) {
  //   for (byte col = 0; col < NBCOLS; col++) {
  //     Serial.print("col: " );
  //     Serial.print(col);
  //     Serial.print("\t");
  //     Serial.print("row: " );
  //     Serial.print(row);
  //     Serial.print("\t");
  //     // actionTouche[col * NBROWS + row](col + row * NBCOLS + 1);
  //     actionTouche[col + row * NBCOLS](col + row * NBCOLS + 1);
  //   }
  // }
}
ScopeBreakout