#include <EnvironmentCalculations.h>
#include <BME280I2C.h>
#include <Wire.h>

int pushButton = 4;

float startPressure = 0;
float startTemp = 0;
float startAltitude = 0;
float maxAltitude = 0;

byte ones = 0, tens = 0, hundreds = 0, thousands = 0;

BME280I2C::Settings settings(
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::OSR_X1,
   BME280::Mode_Forced,
   BME280::StandbyTime_125ms,
   BME280::Filter_16,
   BME280::SpiEnable_False,
   BME280I2C::I2CAddr_0x76
);

BME280I2C bme(settings);

void setup()
{
  bool init = false;
  pinMode(pushButton, INPUT);
  digitalWrite(pushButton, HIGH); 

  Wire.begin();

  while(!bme.begin())
  {
    delay(1000);
  }

  switch(bme.chipModel())
  {
     case BME280::ChipModel_BME280:
       init = true;
       break;
     case BME280::ChipModel_BMP280:
       init = true;
       break;
     default:
     init = false;
      break;
  }

  // nie udalo sie zainicjowac czujnika
  if (init == false) {

    while(1) {

      digitalWrite(LED_BUILTIN, HIGH);   
      delay(1000);                       
      digitalWrite(LED_BUILTIN, LOW);    
      delay(1000); 
    
    }
    
  }

   float temp(NAN), hum(NAN), pres(NAN);
   int i = 0;
   
   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_hPa);

  for (i = 0;i < 10;i++) {
    bme.read(pres, temp, hum, tempUnit, presUnit);
  }

  // srednia z 10 pomiarow
  for (i = 0;i < 10;i++) {
    bme.read(pres, temp, hum, tempUnit, presUnit);
    startPressure = (((i * startPressure) + pres)/(i + 1));
    startTemp = (((i * temp) + temp)/(i + 1));
  }
  
  EnvironmentCalculations::AltitudeUnit envAltUnit  =  EnvironmentCalculations::AltitudeUnit_Meters;
  EnvironmentCalculations::TempUnit     envTempUnit =  EnvironmentCalculations::TempUnit_Celsius;

  float startAltitude = EnvironmentCalculations::Altitude(startPressure, envAltUnit, startPressure, startTemp, envTempUnit);
   

}

void loop()
{

  int buttonState = digitalRead(pushButton);
  if (buttonState == 0) {
    for (int ile = 0;ile < 2;ile++) {
      blinkResult(maxAltitude);
    }
  }
  else {    
    printBME280Data(&Serial);
    digitalWrite(LED_BUILTIN, HIGH);   
    delay(10);                       
    digitalWrite(LED_BUILTIN, LOW);
    delay(90);                   
  }
  
}


void printBME280Data
(
   Stream* client
)
{
   float temp(NAN), hum(NAN), pres(NAN);

   BME280::TempUnit tempUnit(BME280::TempUnit_Celsius);
   BME280::PresUnit presUnit(BME280::PresUnit_hPa);

   bme.read(pres, temp, hum, tempUnit, presUnit);

   EnvironmentCalculations::AltitudeUnit envAltUnit  =  EnvironmentCalculations::AltitudeUnit_Meters;
   EnvironmentCalculations::TempUnit     envTempUnit =  EnvironmentCalculations::TempUnit_Celsius;

   float altitude = EnvironmentCalculations::Altitude(pres, envAltUnit, startPressure, startTemp, envTempUnit);

  if (altitude > maxAltitude) {
    maxAltitude = altitude;
  }

}


void blinkResult(float result) {


  digitalWrite(LED_BUILTIN, HIGH);   
  delay(2000);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(2000);                       


  int input_number = (int)result;

  thousands = int(input_number/1000);

  hundreds = int(input_number/100);
  hundreds = hundreds-(int(hundreds/10)*10);

  tens = int(input_number/10);
  tens = tens-(int(tens/10)*10);

  ones = input_number-(int(input_number/10)*10);


  for (int i = 0;i<=ones;i++) {

    digitalWrite(LED_BUILTIN, HIGH);   
    delay(500);                       
    digitalWrite(LED_BUILTIN, LOW);    
    delay(500);   

  }
  
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1500); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(2000); 

  for (int i = 0;i<=tens;i++) {

    digitalWrite(LED_BUILTIN, HIGH);   
    delay(500);                       
    digitalWrite(LED_BUILTIN, LOW);    
    delay(500);   
  }
  
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1500); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(2000); 

  for (int i = 0;i<=hundreds;i++) {

    digitalWrite(LED_BUILTIN, HIGH);   
    delay(500);                       
    digitalWrite(LED_BUILTIN, LOW);    
    delay(500);   

  }
  
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1500); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(2000); 



  for (int i = 0;i<=thousands;i++) {

    digitalWrite(LED_BUILTIN, HIGH);   
    delay(500);                       
    digitalWrite(LED_BUILTIN, LOW);    
    delay(500);   

  }
  
  digitalWrite(LED_BUILTIN, LOW);    
  delay(1500); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(200); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(200); 
  digitalWrite(LED_BUILTIN, HIGH);   
  delay(100);                       
  digitalWrite(LED_BUILTIN, LOW);    
  delay(200); 

}
