#include <Arduino.h>

#include <HardwareSerial.h>

#include <Wire.h>

HardwareSerial Co2Port(1); // use UART2

// co2 Grenzwerte
/* #define CO2_WARN_1 650
#define CO2_WARN_2 950
#define CO2_WARN_3 1250
#define CO2_WARN_4 1500
#define CO2_CRITICAL_PPM 1850 */
/* #define CO2_WARN_1 600
#define CO2_WARN_2 800
#define CO2_WARN_3 1000
#define CO2_WARN_4 1500
#define CO2_WARN_5 2000 */
#define CO2_WARN_1 800
#define CO2_WARN_2 1000
#define CO2_WARN_3 1400
#define CO2_WARN_4 1500
#define CO2_WARN_5 2000
#define CO2_CRITICAL_PPM 1850

//int CO2Wert = -99;
char antwort[100] = {0xFF};
int range =2000;
bool readCo2Flag = true;



char getCheckSum(char *packet)
  {
    char i, checksum;
    for (i = 1; i < 8; i++)
    {
      checksum += packet[i];
    }
    checksum = 0xFF - checksum;
    return checksum +1;
  }

int readCO2() {
  char cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};
  Co2Port.write(cmd,9);
  if(Co2Port.available()) {
    Co2Port.readBytes(antwort, 9);
  }
  #ifdef DebugCO2
  for (int a=0; a<9; a++){
    Serial.printf(" BufferRead [%d] = 0x%02X \n", a, antwort[a]);
  }
  Serial.println();
  #endif
  if (antwort[0] != 0xFF) return -1;
  if (antwort[1] != 0x86) return -2;
  int antwortHigh = (int) antwort[2]; // CO2 High Byte
  int antwortLow = (int) antwort[3];  // CO2 Low Byte
  int ppm = (256 * antwortHigh) + antwortLow;
  Co2Port.flush();
  return ppm; 
}

void calibrationCo2() {
  char cmd[9] = {0xFF, 0x01, 0x79, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00};
  cmd[8] = getCheckSum(cmd);
  Serial.printf("Checksumme = 0x%02X\n", cmd[8]);
  Co2Port.write(cmd,9);
  #ifdef DebugCO2
  for (int a=0; a<9; a++){
    Serial.printf(" BufferCalibration [%d] = 0x%02X \n", a, cmd[a]);
  }
  Serial.println();
  #endif
}

void setRange()
{
  char cmd[9] = {0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
  
  cmd[6] = range >> 8;
  cmd[7] = range & 0xFF;
  cmd[8] = getCheckSum(cmd);
  Serial.printf("Checksumme = 0x%02X\n", cmd[8]);
  Co2Port.write(cmd,9);
  #ifdef DebugCO2
  for (int a=0; a<9; a++){
    Serial.printf(" BufferRange [%d] = 0x%02X \n", a, cmd[a]);
  }
  Serial.println();
  #endif
}

void beginC02()
{
  Co2Port.begin(9600, SERIAL_8N1, 32, 33); 
  //readCo2Flag = false;
  delay(100);
  calibrationCo2();
  delay(100);
  /* setRange();
  delay(100); */
}