#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <U8g2_for_Adafruit_GFX.h>
#include <Fonts/TomThumb.h>
#include <Fonts/FreeSansBold9pt7b.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET     4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
U8G2_FOR_ADAFRUIT_GFX u8g2_for_adafruit_gfx;

void setup() {
  // Set software serial baud to 115200;
  Serial.begin(115200);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  
  u8g2_for_adafruit_gfx.begin(display);

  updateDisplay();
  
}

void updateDisplay() {

  display.clearDisplay();
  display.setTextColor(WHITE);
  u8g2_for_adafruit_gfx.setForegroundColor(WHITE);

  u8g2_for_adafruit_gfx.setFont(u8g2_font_tom_thumb_4x6_tf);
  u8g2_for_adafruit_gfx.setCursor(4,6);
  u8g2_for_adafruit_gfx.print(F("Inneklima"));
  display.setFont(&FreeSansBold9pt7b);
  display.setCursor(7,22);
  display.print("22.4");
  display.drawCircle(display.getCursorX()+4,display.getCursorY()-5, 1, WHITE);
  u8g2_for_adafruit_gfx.setCursor(display.getCursorX()+7,display.getCursorY()+1);
  u8g2_for_adafruit_gfx.setFont(u8g2_font_nokiafc22_tf);
  u8g2_for_adafruit_gfx.print(F("C"));

  //x,y,value,max,average,measure,unit
  drawBar(4,34,1001,1000,475,"CO2","ppm");
  delay(10);
  drawBar(4,47,15,20,8,"CO","ppm");
  delay(10);
  drawBar(4,60,0.2,0.5,0.3,"NO2","ppm");
  delay(10);
  drawBar(67,8,23.2,100,34.6,"LF","%");
  delay(10);
  drawBar(67,21,251,500,242,"VOC","ppm");
  delay(10);
  drawBar(67,34,11,10,2.7,"PM2.5","µg/m3");
  delay(10);
  drawBar(67,47,6.2,20,8.1,"PM10","µg/m3");
  delay(10);
  drawBar(67,60,323,500,323,"Alk","ppm");
   
  display.display();

}

void drawBar(int x, int y, float value, float max, float average, char* measure, char* unit) {
  const int length = 57;
  float scale = 0;
  float avrScale = (average/max)*(length-2); 
  u8g2_for_adafruit_gfx.setFont(u8g2_font_tom_thumb_4x6_tf);
  u8g2_for_adafruit_gfx.setCursor(x,y-2);
  u8g2_for_adafruit_gfx.print(measure);
  u8g2_for_adafruit_gfx.setCursor(u8g2_for_adafruit_gfx.getCursorX()-1,u8g2_for_adafruit_gfx.getCursorY());
  u8g2_for_adafruit_gfx.print(F(":"));
  if (value > max) {
    scale = length-2;
    u8g2_for_adafruit_gfx.setCursor(x+23,y-2);
    u8g2_for_adafruit_gfx.print(F(">"));
    u8g2_for_adafruit_gfx.setCursor(x+27,y-2);
    if (value < 1 && value > 0) {
      u8g2_for_adafruit_gfx.print(max,1);
    } else {
      u8g2_for_adafruit_gfx.print(max,0);
    }
    u8g2_for_adafruit_gfx.setCursor(u8g2_for_adafruit_gfx.getCursorX()+2,u8g2_for_adafruit_gfx.getCursorY());
    u8g2_for_adafruit_gfx.print(unit);
    u8g2_for_adafruit_gfx.setCursor(x-4,y-2);
    u8g2_for_adafruit_gfx.print(F("!"));
  } else {
    scale = (value/max)*(length-2);
    u8g2_for_adafruit_gfx.setCursor(x+27,y-2);
    if (value < 1 && value > 0) {
      u8g2_for_adafruit_gfx.print(value,1);
    } else {
      u8g2_for_adafruit_gfx.print(value,0);
    }
    u8g2_for_adafruit_gfx.setCursor(u8g2_for_adafruit_gfx.getCursorX()+2,u8g2_for_adafruit_gfx.getCursorY());
    u8g2_for_adafruit_gfx.print(unit);
  }
  display.fillRect(x, y, length, 3, WHITE);
  display.fillRect(x+1, y+1, scale, 1, BLACK);
  display.drawLine(x+avrScale, y, x+avrScale, y+2, BLACK);

}

void loop() {

  //if (updateLevel == 0) {
  //  printWaitingDots(94,38);
  //}

}