#include "include.h"
#include <DallasTemperature.h>
#include <OneWire.h>

/*===============================================================================================================================================================================================================================================================*/
/*======= VARIÁVEIS AUXILIARES =======*/

#define SSR 2 // RELÉ DE ESTADO SÓLIDO
#define MTR 3 // MOTOR COOLER

// DS18B20
#define DS 4
OneWire bus(DS);
DallasTemperature sensor(&bus);
uint8_t adress[8];
float tmp;

// BOTÕES
BUTTONS buttons;
int pins_buttons[3] = {5,6,7};

// LEDS
LED_RGB rgb;
int pins_leds[3] = {8,9,10};

CONTROL control; // função PID

/*===============================================================================================================================================================================================================================================================*/
/*======= VARIÁVEIS =======*/

float hs, HS;
int modo[2] = {0,0}, sp = 10, mv = 0;
bool ajst;
long count[5] = {505,505,505,455,505};

/*===============================================================================================================================================================================================================================================================*/
/*======= SETUP =======*/

void setup() {
  Serial.begin(9600);
  
  for (int i = 0; i < 3; i++) {
    buttons.pinout(pins_buttons[i],i); // BOTÕES
    rgb.pinout(pins_leds[i],i); // LEDS
  }

// DS18B20
  bus.search(adress);
  sensor.begin();
  sensor.setResolution(adress, 10);
  sensor.requestTemperatures();
  tmp = sensor.getTempC(adress);

  pinMode(SSR, OUTPUT);
  pinMode(MTR, OUTPUT);
  digitalWrite(MTR, 60);
}

/*===============================================================================================================================================================================================================================================================*/
/*======= LEITURAS =======*/

void loop () {

// DS18B20
  sensor.requestTemperatures();
  if (tmp != sensor.getTempC(adress)) {
    tmp = sensor.getTempC(adress);
    if (modo[0] == 2) {
      control.read(tmp);
    }
  }

// BOTÕES
  for (int i = 0; i < 3; i++) {
    buttons.read(i,(i == 1) ? false : true);

    if (buttons.state[i]) {
      if (i == 1) {
      // PROCESSAMENTO DA NAVEGAÇÃO
        if ((modo[0] == 2 && buttons.time[i] >= 1000) || (ajst && buttons.time[i] >= 1000)) {
          ajst = !ajst;
        } else {
          modo[ajst] = (modo[ajst] + 1) % 3;
        }

      // CONTAGEM
      } else {
        if (ajst) {
          count[modo[1]] += buttons.state[0] - buttons.state[2]; 
        } else {
          count[constrain((4 - modo[0]), 3, 4)] += buttons.state[0] - buttons.state[2];
        }
      }
      buttons.state[i] = 0;
    }
  }

/*===============================================================================================================================================================================================================================================================*/
/*======= DEFININDO SET POINT =======*/

  if (sp != constrain((count[3] % 91) + 10, 10, 100)) {
    sp = constrain((count[3] % 91) + 10, 10, 100);
      Serial.println(sp);
    if (modo[0] == 1) {
      hs = float(sp) - 0.5;
      HS = float(sp) + 0.5;
    } else if (modo[0] == 2) {
      control.setpoint = sp;
    }
  } 
  
  switch(modo[0]){

/*===============================================================================================================================================================================================================================================================*/
/*======= MODO MANUAL =======*/

    case 0:
  // VARIÁVEL MANIPULADA
    rgb.setRed();
    if (mv != count[4] % 101) {
      mv = count[4] % 101;
    }
    digitalWrite(SSR,pwm(500,map(mv,0,100,0,30)));
    display(tmp,mv);
    break;

/*===============================================================================================================================================================================================================================================================*/
/*======= MODO ON/OF =======*/

  // VARIÁVEL MANIPULADA
    case 1:
    rgb.setGreen();
    if (tmp < hs) {
      mv = 100;
      digitalWrite(SSR,HIGH);
    } else if (tmp > HS) {
      mv = 0;
      digitalWrite(SSR,LOW);
    }
    display(tmp,mv,sp,hs,HS);
    break;

    case 2:

/*===============================================================================================================================================================================================================================================================*/
/*======= MODO AJUSTE DE GANHOS =======*/
    if (ajst) {
      if (control.k[modo[1]] * 10 != float(count[modo[1]] % 101)){
        digitalWrite(SSR,LOW);
        control.setK(modo[1],count[modo[1]] % 101);
      }
      rgb.allBlinkExcept(modo[1]);

/*===============================================================================================================================================================================================================================================================*/
/*======= MODO PID =======*/

    } else {
      rgb.setBlue();
      control.pid();
      digitalWrite(SSR,pwm(500,map(constrain(control.signal,0,100),0,100,0,30)));
    }
    display(tmp,control.signal,sp,control.k[0],control.k[1],control.k[2]);
    break;
    default:
    break;
  }
    
}