#include "Params.h"
#include "Chart.h"
#include "BarChart.h"

void setup() {
  oled.init();
  Wire.setClock(800000L);
  oled.clear();
  ChartInit();
  BarChartInit();
}

uint8_t _oldVal = 0;
#if UPDATE_INTERVAL >= 0
unsigned long previousMillis = 0;
#endif

/*
 Корректировка значения
 Здесь можно перевести входные данные в Децибелы (линейная регрессия)
 Пример как вычисляют параметры линейной регрессии можно найти тут
  => https://microkontroller.ru/arduino-projects/izmerenie-urovnya-zvuka-shuma-v-deczibelah-s-pomoshhyu-arduino-i-mikrofona
*/
inline uint16_t correctVal(uint16_t val){
  return val;
}

void loop() {
#if UPDATE_INTERVAL >= 0
  unsigned long currentMillis = millis();
  if(currentMillis - previousMillis > UPDATE_INTERVAL) {
    previousMillis = currentMillis;
#endif
    uint16_t val = correctVal(analogRead(PIN_MICROPHONE));
    ChartUpdate(val);
    BarChartUpdate(val);
    if(val != _oldVal){
      oled.setCursorXY(CORRECT_POS_X(TEXT_POS_X), CORRECT_POS_Y(TEXT_POS_Y));
      char buffer[5];
      snprintf(buffer,sizeof(buffer), "%04d", val);
      oled.print(buffer);
      oled.update(OLED_RECT_PARAMS(
        CORRECT_POS_X(0),
        CORRECT_POS_Y(0),
        CORRECT_POS_X(TEXT_POS_X + 32),
        CORRECT_POS_Y(TEXT_POS_Y + 8)
      ));
      _oldVal = val;
    }
#if UPDATE_INTERVAL >= 0
  }
#endif
}