#include <Wire.h>
#include <Adafruit_Si4713.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GFX.h>
#include <EEPROM.h>
//Adafruit_SSD1306 display(128, 64, &Wire,1);

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
//#define OLED_RESET   -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3d ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, SEEK_SET);

#define RESETPIN 12
#define stereo_RDSoff 3
#define stereo 7
#define mono 0

//void update( int idx, uint8_t val )  { EERef( idx ).update( val ); }
const int up= 2;  // the number of the pushbutton pin
const int set=3;
const int dow=4;  // the number of the pushbutton pin
const int KEYPin =5;
const int ledPin =11;
uint16_t  frec;
uint16_t  Audio;
int  po,fset=0;
char ind=17;
char cl=219;
int  mod;
//Adafruit_Si4713 radio = Adafruit_Si4713(RESETPIN);


void Oled() {
  display.clearDisplay();
  display.setTextSize(2);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(10,0);             // Start at top-left corner
  display.println(F("RDS FM TX"));

 // display.setTextColor(SSD1306_BLACK, SSD1306_WHITE); // Draw 'inverse' text
 // display.println(3.141592);

  display.setTextSize(1);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10,16);   
  display.print(F("FREC: ")); display.print(frec/100); display.print(F("."));display.print(frec%100);

  display.setTextSize(2);             // Draw 2X-scale text
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(10,35);   
  display.print(F("MODO: "));

  if(mod==4){
    display.setTextSize(2);             // Draw 2X-scale text
    display.setTextColor(SSD1306_WHITE,BLACK);
    display.setCursor(50,35);   
    display.print(F("MONO  ")); 
  }
  else{
    display.setTextSize(2);             // Draw 2X-scale text
    display.setTextColor(SSD1306_WHITE,BLACK);
    display.setCursor(50,35);   
    display.print(F("STEREO"));  
  }       
  display.display();
  delay(200);
}

void MODO(int h){
//  radio.setProperty(SI4713_PROP_TX_COMPONENT_ENABLE,h);
}

void Audio_DV(uint16_t h){
 // radio.setProperty(SI4713_PROP_TX_AUDIO_DEVIATION,h);  
}

 
void setup() {

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

  // Clear the buffer
  display.clearDisplay();

  // Draw a single pixel in white
  display.drawPixel(10, 10, SSD1306_WHITE);


//EEPROM.put(60,10070);// int16 
//EEPROM.write(0, 23);//int

//frec = EEPROM.read(0);//int
//EEPROM.get(60,frec);//int16

 
  pinMode(up,INPUT_PULLUP);
  pinMode(set,INPUT_PULLUP);
  pinMode(dow,INPUT_PULLUP);  
  pinMode(ledPin, OUTPUT);
  pinMode(KEYPin, OUTPUT);  
  EEPROM.get( 80,frec);
  mod=EEPROM.read(0);       
  display.clearDisplay();

  display.setTextSize(2);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(48,0);             // Start at top-left corner
  display.println(F("RFW"));   
  display.setTextSize(1);             // Normal 1:1 pixel scale
  display.setTextColor(SSD1306_WHITE);        // Draw white text
  display.setCursor(26,20);             // Start at top-left corner
  display.println(F("TRANSMISORES")); 
  display.display(); 
  delay(3000); 

  if (frec>10800){
  frec=10670; 
  Audio=6550;
  po=115; 
  mod=4;    //  mod=7; --> ST  mod=4; --> MONO
  }
  
  Oled();
 /* radio.reset();
  delay(100);  
  radio.begin();
  delay(500);

  radio.setTXpower(100);  // dBuV, 88-115 max
  radio.tuneFM(frec); // 100.7 mhz    
  radio.setRDSstation("JM RADIO");
  radio.setRDSbuffer( "Que Buena Radio!");
  digitalWrite(KEYPin,LOW); 
*/
// stereo_RDSoff 
// stereo 
// mono
  MODO(mod); 
 // Audio_DV(Audio); 
}

void loop(){
 if (digitalRead(set)==LOW){
    fset=2;
    delay(30); 
    fmsetup();           
  }    
}

void fmsetup(){ 
  while(fset==2) {            
    display.setTextSize(1);             // Draw 2X-scale text
    display.setTextColor(SSD1306_WHITE); 
    display.setCursor(95,16);             // Start at top-left corner
    display.print(ind);
    display.display();       
       
    if (digitalRead(up)==LOW){
      frec=frec+10;
     // radio.tuneFM(frec); // 100.7 mhz 
      Oled();               
    } 
  
    if (digitalRead(dow)==LOW){
      frec=frec-10;
      //radio.tuneFM(frec); // 100.7 mhz 
      Oled();         
     }     
    if (digitalRead(set)==LOW){     
      EEPROM.put(80,frec);   
      delay(300);
      display.setTextSize(1);             // Draw 2X-scale text
      display.setTextColor(SSD1306_WHITE,BLACK); 
      display.setCursor(95,16);             // Start at top-left corner
      display.print(F("Ok"));
      display.display(); 
      fset=4;                        
     }       
  while(fset==4){
    display.setTextSize(1);             // Draw 2X-scale text
    display.setTextColor(SSD1306_WHITE); 
    display.setCursor(95,25);             // Start at top-left corner
    display.print(ind);
    display.display(); 
    
    if (digitalRead(up)==LOW){
      mod=7;
      MODO(mod);
      Oled();               
    } 
  
    if (digitalRead(dow)==LOW){
      mod=4;
      MODO(mod);
      Oled();         
     } 
    
    if (digitalRead(set)==LOW){     
      EEPROM.write(0,mod);  
      display.clearDisplay();
      Oled();    
      fset=6;                      
     }              
  } 
  while(fset==6){
      if (digitalRead(set)==LOW){
        delay(300);
        fset=2;               
      }              
    }        
  }
}