#include <Wire.h>
#include <hd44780.h> //  https://github.com/duinoWitchery/hd44780
#include <hd44780ioClass/hd44780_I2Cexp.h> // i2c expander i/o class header

#include <Toggle.h>   // https://github.com/Dlloydev/Toggle

// LES 2 BOUTONS
const byte brochePlus = 2;
const byte brocheMoins = 3;
Toggle boutonPlus, boutonMoins;

// LE LCD
hd44780_I2Cexp lcd;
const int nbCols = 16;
const int nbLignes = 2;

// LE COMPTEUR
long compteur = 0;
const char unite[] = " mg";
const byte longueurUnite = sizeof unite - 1;

void afficherCompteur() {
  static long compteurSurLCD = -100000;
  const int tailleChampCompteur = 6;
  char format[10]; // on fabrique dynamiquement le format de sprintf "%+ 6d", la notation * ne fonctionne pas sur UNO
  char buffer[nbCols + 1]; // +1 pour le caractère nul de fin de chaîne
  if (compteurSurLCD != compteur) {
    snprintf(format, sizeof format, "%%+ %dd", tailleChampCompteur+1); // on fabrique un format avec la bonne dimension
    snprintf(buffer, sizeof buffer, format, compteur);
    lcd.setCursor(nbCols - tailleChampCompteur - longueurUnite, 0); 
    lcd.print(buffer);
    compteurSurLCD = compteur;
  }
}

void setup() {
  Serial.begin(115200);
  boutonPlus.begin(brochePlus);
  boutonMoins.begin(brocheMoins);

  int result = lcd.begin(nbCols, nbLignes);
  if (result) {
    Serial.print("LCD initialization failed: ");
    Serial.println(result);
    hd44780::fatalError(result);
  }
  lcd.clear();
  lcd.print(F("Tare : "));
  afficherCompteur(); // va positionner le curseur juste après le nombre
  lcd.print(unite);
}

void loop() {
  boutonPlus.poll();
  if (boutonPlus.onPress()) {
    compteur++;
    afficherCompteur();
  }

  boutonMoins.poll();
  if (boutonMoins.onPress()) {
    compteur--;
    afficherCompteur();
  }
}