//===========================================================================================================
//---Bibliotecas

#include <LiquidCrystal_PCF8574.h>


//===========================================================================================================
//---Variáveis

long elapsedRSSI =  millis();
unsigned char buf[5] = {1, 1, 1, 250, 1};                             // Buffer
double f_new = 99.9;                                  // Frequencia inicial
boolean mute = false;                                 // MUTE flag
boolean mode;                                         // Modo
byte counter  = 0;                                    // Contagem do encoder
byte count;                                           // Contagem para Medidor de sinal
byte sm_buf;                                          // Buffer do Medidor de sinal
byte sm_p;                                            // Medidor de Sinal
byte stereo = 0;                                      // Auxiliar do estereo

// Arrays do simbolo para s-meter
byte graph [8][8] =
{
  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00},   // 1 linha
  {0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x00},   // 2 linhas
  {0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x00},   // 3 linhas
  {0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x00},   // 4 linhas
  {0x00, 0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00},   // 5 linhas
  {0x00, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00},   // 6 linhas
  {0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x00},   // 7 linhas
  {0x1F, 0x1F, 0x1B, 0x11, 0x1B, 0x1F, 0x1F, 0x00}    // Sinal +
};

//===========================================================================================================
//---Instancias

LiquidCrystal_PCF8574 lcd(0x27);                      // Nome e configurção para LCD (endereço)


//===========================================================================================================
//---Setup

void setup()
{
  //Inicia o LCD
  lcd.begin(16, 2);                                   // Define a quantidades de colunas e linhas
  lcd.setBacklight(1);                                // Liga a luz de fundo
  lcd.print("Radio...");                              // Escreve no LCD
  delay(1000);                                        // Aguarda 1 segundo
  lcd.clear();                                        // Limpa o LCD

  for (int k = 0; k < 8; k++)                         // Laço para criação do desenho sinal
    lcd.createChar(k, graph[k]);                      // Cria o desenho na memória
  lcd.clear();

  lcd.setCursor(0, 0);
  lcd.print("FM");
  lcd.setCursor(9, 0);
  lcd.print("MHz");

  showStatus();
  showFrequency();
}

//===========================================================================================================
//---Lupe Infinito

void loop()
{


}
//===========================================================================================================
// Função para exibição da frequencia

void showFrequency()
{
  String freqDisplay;                                 // Variável local para formatação

  freqDisplay = String(f_new, 1);                     // Formata e converte o valor em string (frequencia, quantidade de casas decimais)

  //informação de frequencia
  lcd.setCursor(3, 0);
  if (f_new < 100)                                    // Posicionamento do primeiro digito no LCD
  {
    lcd.print(" ");                                   // Apaga o valor na coluna 5
    lcd.setCursor(4, 0);
  }
  lcd.print(freqDisplay);                             // Escreve a frequencia
  tune_mode();
}

// Função para implementação da EEPROM
void tune_mode()
{
  if (mode)                                           // Verifica se modo está em Tune ou Preset
  {
    lcd.setCursor(0, 1);
    if (count < 10)
      lcd.print('0');
    lcd.print(count);                                 // Escreve o numero salvo da estação
    lcd.print(' ');
  }
  else
  {
    lcd.setCursor(0, 1);
    lcd.print("TU ");                                 // Escreve "TU" para modo tune
  }
}

// Função para exibição do status
void showStatus()
{
  // Seta o indicador STEREO/MONO
  lcd.setCursor(13, 0);
  if (!mute)                                          // Verifica se o mute está desligado
    if (buf[2] & 0x80 != stereo)                      // Verifica se o buffer é diferente de estereo
      lcd.print("[S]");                               // Escreve "S" se for estereo
    else
      lcd.print("[M]");                               // Escreve "M" se for mono
  else
    lcd.print("[-]");                                 // Escreve "-" se estiver em mute

  // Desenha a barra do indicardor de sinal
  lcd.setCursor(3, 1);
  sm_buf = (buf[3] >> 4);                             // Desloca o valor em 4
  sm_p = byte(0.6 * sm_buf);                          // Calcula o valor do sinal

  for (int j = 0; j < sm_p; j++)                      // Laço para posicionamento do cursor
  {
    lcd.setCursor(3 + j, 1);                          // Posiciona o cursor
    if (j < 6)
      lcd.write(byte(j));                             // Escreve o desenho da barra
    else if (j < 7)
      lcd.write(byte(6));
    else
      lcd.write(byte(7));
  }
  for (int j = sm_p; j < 10; j++)                     // Espaços brancos a direita
    lcd.print(' ');

  lcd.setCursor(13, 1);
  lcd.print('[');
  lcd.print(sm_p);                                    // Numero do imdicador de sinal
  lcd.print(']');
}
//===========================================================================================================