// Gaggia shot timer 32line display

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Fonts/FreeSans9pt7b.h>
#include <Fonts/FreeSans12pt7b.h>
#include <Fonts/FreeSansBold12pt7b.h>
//#include <max6675.h>
#include <elapsedMillis.h>

const int baudrate = 9600;  //baud rate for serial monitor
const int sensorReadDelay = 250;  //sensor read delay in milliseconds

//max6675: CLK 6, CS 7, DO 8
//MAX6675 thermocouple(6,7,8);

// Gaggia switches
#define BTN_PRIME 9
#define BTN_BREW  10

// Pressure Transducer
//const int pressureInput = A0;   //analog input pin
//const int pressureZero = 102.4; //analog reading at 0psi
//const int pressureMax = 921.6;  //analog reading at 200psi 
//const int PTmaxPSI = 200;   
//float pressureValue = 0; //variable to store incoming PT value

elapsedMillis sinceBrewDone;
int faseTimeSoak;
int faseTimeRest;
int faseTimeBrew;

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// SDA 2, SCL 3
#define OLED_RESET 0  // GPIO0
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define SCREEN_ADDRESS 0x3C // 0x3C for 128x64 screen 1, 0x3D for 128x64 screen 2
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);


void setup()   {
  pinMode(BTN_PRIME,INPUT_PULLUP);  //Prime Switch
  pinMode(BTN_BREW,INPUT_PULLUP);   //Brew Switch
  
  display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);  // initialize with the I2C addr
  //display.display();

  display.clearDisplay();
  display.setFont(&FreeSansBold12pt7b);
  display.setTextColor(WHITE);
  display.setCursor(3,20);
  display.print("Good Day!");
  display.display();
  delay(1000);
  //display.clearDisplay();
  //display.display();
}

int sec1=0;
int min1=0;
unsigned long msec=0;
unsigned long mili=0;
int pres=0;
int fase=0;
int start=0;
unsigned long tim=0;


void loop(){
    Serial.begin(baudrate);
  
    display.clearDisplay();
    if(digitalRead(BTN_PRIME)==0){
      if(pres==0){
          if (fase==9){
            fase=0;
          }

          fase = 1;
          pres = 1;
      }
    }else{pres=0;}

    if(digitalRead(BTN_PRIME)==1){
      if(fase==1){
          fase = 2;
          pres = 1;
      }

      //if (fase==9){fase=0;}
    }

    if(digitalRead(BTN_BREW)==0){
      fase = 3;
      pres = 1;
    }

    if(digitalRead(BTN_BREW)==1){
      if(fase==3){
          fase = 9;
          pres = 1;
          sinceBrewDone = 0;
      }
    }


    if(fase==0){
      start=0;
      sec1=0;
      min1=0;
      tim=0;
      mili=0;
      msec=0;
      faseTimeSoak=0;
      faseTimeRest=0;
      faseTimeBrew=0;
      showSensorReadings();
    }

    if(fase==1){
      //display.clearDisplay();
      //display.setFont(&FreeSans9pt7b);
      display.setCursor(0,24);
      display.print("Pre-Infusion");
      show_elapsed_time();
      faseTimeSoak = get_fase_time();
    }

    if(fase==2){
      //display.setFont(&FreeSans9pt7b);
      display.setCursor(0,24);
      display.print("Resting");
      
      show_elapsed_time();
      faseTimeRest = get_fase_time();
      faseTimeRest = faseTimeRest - faseTimeSoak;
      //show_fase_time();
    }

    if(fase==3){
      //display.setFont(&FreeSans9pt7b);
      display.setCursor(0,24);
      display.print("Brewing");
      
      show_elapsed_time();
      faseTimeBrew = get_fase_time();
      faseTimeBrew = faseTimeBrew - faseTimeRest - faseTimeSoak;
      //show_fase_time();
    }      
      
    if(fase==9){
      //display.setFont(&FreeSans9pt7b);
      display.setCursor(0,0);
      if (sec1 < 20){
        display.print("gRiNd FiNeR!");
      }
      else {
        display.print("Enjoy your");
        display.setCursor(0,12);
        display.print("drink!");
      }
      
      //display.setFont(&FreeSansBold12pt7b);
      display.setCursor(80,0);
      display.print(sec1);
      display.print(".");
      display.print(mili);

      show_fase_time();

      start=0;

      if (sinceBrewDone > 10000){
        fase = 0;
      }
    }      

    display.display();  
  }


void showSensorReadings(){

    display.setFont(&FreeSans12pt7b);
    display.setCursor(0,16);
    //display.print(thermocouple.readCelsius(), 1);
    display.print(100);
    //display.setFont(&FreeSans12pt7b);
    
    display.setCursor(58,16);
    display.print("6");

    if (sec1<10){display.setCursor(104,16);} 
    else {display.setCursor(92,16);}
    display.print(sec1);

    display.setFont();
    display.setCursor(40,1);
    display.print("8");
    display.setCursor(74,1);
    display.print("5");
    display.setCursor(120,1);
    display.print(mili);

    if (start==0){
      display.setCursor(32,20);
      display.print((char)247);
      display.print("C");
    
      display.setCursor(60,20);
      display.print("bar");
    
      display.setCursor(94,20);
      display.print("secs");
    }

    delay(sensorReadDelay);
}

void show_elapsed_time(){
    if(start==0){
      start=1;
      tim=millis();  
    }
    
    msec=(millis()-tim); 
    sec1=msec/1000;
    mili=(msec%1000)/100;

    //display.setFont(&FreeSansBold12pt7b);
    //display.setCursor(50,40);
    //display.print(sec1);
    //display.print(".");
    //display.print(mili);
    showSensorReadings();
}

int get_fase_time(){
    unsigned long fase_tim=millis();  

    unsigned long fase_msec=(millis()-tim); 
    int fase_sec1=msec/1000;
    int fase_mili=(msec%1000)/100;

  return fase_msec/1000;
}

void show_fase_time(){
    //display.setFont(&FreeSans9pt7b);
    display.setCursor(0,24);
    if (faseTimeSoak > 0){
      display.print(faseTimeSoak);
      display.print(" + ");
    }  
    if (faseTimeRest > 0){
      display.print(faseTimeRest);
      display.print(" + ");
    }
    if (faseTimeSoak > 0 || faseTimeRest > 0){
      display.print(faseTimeBrew);
      display.print(" = ");
      display.print(faseTimeSoak + faseTimeRest + faseTimeBrew);
    }
}