#include <LiquidCrystal_I2C.h>
#include <mechButton.h>
#include <calculator.h>


#define NUM_DIGITS  16


calculator  theCalc;

mechButton  btn0(2);
mechButton  btnPt(3);
mechButton  btnPi(4);
mechButton  btnAdd(5);

mechButton  btnSub(6);
mechButton  btnThree(7);
mechButton  btnTwo(8);
mechButton  btnOne(9);

mechButton  btnMult(10);
mechButton  btnSix(11);
mechButton  btnFive(12);
mechButton  btnFour(13);

mechButton  btnDiv(A0);
mechButton  btnNine(A1);
mechButton  btnEight(A2);
mechButton  btnSeven(A3);

mechButton  btnEnt(0);


LiquidCrystal_I2C lcd(0x27,NUM_DIGITS,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
int   fixVal;
char  temp[20];

void setup() {
  
  lcd.init();                      // initialize the lcd
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print(F("RPN Calc"));
  fixVal = 2;
}

void showNum(float inNum) {
   
  dtostrf(inNum,16,fixVal,temp);      // Make our float value into a string with "fixVal" decimal.
  lcd.setCursor(0,0);                 // Put the cursor at the top left.
  lcd.print(F("                "));   // Blank out tht line.
  lcd.setCursor(0,0);                 // Put the cursor back up there.
  lcd.print(temp);                    // Print out the formatted nunber string.
}


void clearBtn(mechButton* theBtn) {

  while (!theBtn->trueFalse()) {
    sleep(10);
  }
}


bool checkButtons(void) {

  if (!btn0.trueFalse()) {
    theCalc.buttonClick("0");
    clearBtn(&btn0);
    return true;
  }
  if (!btnPt.trueFalse()) {
    theCalc.buttonClick(".");
    clearBtn(&btnPt);
    return true;
  } 
  if (!btnPi.trueFalse()) {
    theCalc.buttonClick("PI");
    clearBtn(&btnPi);
    return true;
  } 
  if (!btnAdd.trueFalse()) {
    theCalc.buttonClick("+");
    clearBtn(&btnAdd);
    return true;
  } 

  if (!btnSub.trueFalse()) {
    theCalc.buttonClick("-");
    clearBtn(&btnSub);
    return true;
  } 
  if (!btnThree.trueFalse()) {
    theCalc.buttonClick("3");
    clearBtn(&btnThree);
    return true;
  } 
  if (!btnTwo.trueFalse()) {
    theCalc.buttonClick("2");
    clearBtn(&btnTwo);
    return true;
  } 
  if (!btnOne.trueFalse()) {
    theCalc.buttonClick("1");
    clearBtn(&btnOne);
    return true;
  } 

  if (!btnMult.trueFalse()) {
    theCalc.buttonClick("X");
    clearBtn(&btnMult);
    return true;
  }
  if (!btnSix.trueFalse()) {
    theCalc.buttonClick("6");
    clearBtn(&btnSix);
    return true;
  } 
  if (!btnFive.trueFalse()) {
    theCalc.buttonClick("5");
    clearBtn(&btnFive);
    return true;
  }
  if (!btnFour.trueFalse()) {
    theCalc.buttonClick("4");
    clearBtn(&btnFour);
    return true;
  }
  if (!btnDiv.trueFalse()) {
    theCalc.buttonClick("/");
    clearBtn(&btnDiv);
    return true;
  } 
  if (!btnNine.trueFalse()) {
    theCalc.buttonClick("9");
    clearBtn(&btnNine);
    return true;
  } 
  if (!btnEight.trueFalse()) {
    theCalc.buttonClick("8");
    clearBtn(&btnEight);
    return true;
  } 
  if (!btnSeven.trueFalse()) {
    theCalc.buttonClick("7");
    clearBtn(&btnSeven);
    return true;
  } 
  if (!btnEnt.trueFalse()) {
    theCalc.buttonClick("ENTER");
    clearBtn(&btnEnt);
    return true;
  }
 
  return false;
}


void loop() {
  
  idle();
  if (checkButtons()) {
    showNum(theCalc.getX());
  }
}
Type first value
RPN Calc.
Click ENTER
Second value
Click function.