#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RotaryEncoder.h>

#define OLED_RESET 4

#define PIN_IN1 2
#define PIN_IN2 3

float freq = 101.5;
int vol = 10;
int rssi = 54;
char buffer[6];
char buffer2[6];
char buffer3[6];

Adafruit_SSD1306 oled(128, 64);
RotaryEncoder encoder(PIN_IN1, PIN_IN2, RotaryEncoder::LatchMode::TWO03);

void setup()
{
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  delay(200);
  oled.clearDisplay();
  updateLCD();
}

void loop()
{
  readEncoder();
}

void updateLCD()
{
  oled.setTextColor(SSD1306_WHITE, SSD1306_BLACK);

  if (freq > 100.0) {
    oled.setCursor(0, 10);
    oled.clearDisplay();
  }
  else {
    oled.setCursor(18, 10);
    oled.clearDisplay();
  }

  oled.drawRect(0, 1, 127, 2, SSD1306_WHITE);

  dtostrf(freq, 2, 1, buffer);
  oled.setTextSize(3);
  oled.print(buffer);

  oled.drawRect(0, 38, 127, 2, SSD1306_WHITE);

  oled.setCursor(97, 10);
  oled.setTextSize(2);
  oled.print("FM");

  oled.setCursor(92, 25);
  oled.setTextSize(1);
  oled.print("STEREO");

  sprintf(buffer2, "Level:%3d", rssi);
  oled.setCursor(4, 48);
  oled.print(buffer2);

  sprintf(buffer3, "Vol:%2d", vol);
  oled.setCursor(80, 48);

  oled.print(buffer3);
  oled.write(37);

  oled.fillRect(0, 45, 127, 14, SSD1306_INVERSE);

  oled.display();
}

void readEncoder() {

  static int pos = 0;
  encoder.tick();

  int newPos = encoder.getPosition();
  if (pos != newPos) {

    if (newPos > pos)
      freq = freq - 0.1;
    if (newPos < pos)
      freq = freq + 0.1;

    pos = newPos;

    if (freq > 108.0)freq = 108.0;
    if (freq < 87.0)freq = 87.0;

    updateLCD();
  }
}