//Arduino Uno with SSD1306 OLED display for SU-1 SMSL DAC 
// 3 Inputs select from source "USB / OPT / COAX " 
// This code adapt to suit with Wokki simulator and component
// Added frequency counter for DAC bit rate (AK9433 Chip)
// Code design for active low from SMSL DAC output,no need pull-up
// resistor

#include "SPI.h"
#include "Wire.h"
#include "Adafruit_GFX.h"
#include "Adafruit_SSD1306.h"
#include "FreeSansBold9pt7b.h"
#include "FreqCount.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     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES     10 // Number of snowflakes in the animation example

#define LOGO_HEIGHT   16
#define LOGO_WIDTH    16

  int SW_IN1 = 8; 
  int SW_IN2 = 9;
  int SW_IN3 = 10;
  int SW_input1;
  int SW_input2;
  int SW_input3;

  unsigned long f;
  float f0;
  int x,n=3,r;
  //String f_unit =" kHZ";
  int f_unit =1; // ( 1 = kHZ, 2 = MHZ)
  String f_unit_s = "kHZ";
  int f_out = 44;

void setup() {
  Serial.begin(115200);
  pinMode(7,INPUT);
  FreqCount.begin(1000);

  pinMode(SW_IN1, INPUT_PULLUP);
  pinMode(SW_IN2, INPUT_PULLUP);
  pinMode(SW_IN3, INPUT_PULLUP);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { 
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  // Show initial display buffer contents on the screen --
  // the library initializes this with an Adafruit splash screen.
  display.display();
  delay(500); 
  // Clear the buffer
  display.clearDisplay();
  Draw_text_SU1_DAC();
  delay (4000); // Pause for 4 seconds
}

void loop() {
SW_input1 = digitalRead(SW_IN1);
SW_input2 = digitalRead(SW_IN2);
SW_input3 = digitalRead(SW_IN3);
Serial.print("Sw input1 status");Serial.println(SW_input1);
Serial.print("Sw_input2 status");Serial.println(SW_input2);
Serial.print("Sw_input3 status");Serial.println(SW_input3);

//Fdisplay(f_out,f_unit);

if (SW_input1 == 0 && SW_input2 == 1 && SW_input3 == 1) {
Draw_text_USB(f_out,f_unit);    // Draw USB text
delay (500);
}
if (SW_input1 == 1 && SW_input2 == 0 && SW_input3 == 1) {
Draw_text_OPT(f_out,f_unit);    // Draw OPT text
delay (500);
}
if (SW_input1 == 1 && SW_input2 == 1 && SW_input3 == 0) {
Draw_text_COAX(f_out,f_unit);    // Draw COAX text
delay (500);
} 
}

void Draw_text_SU1_DAC(){
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.setCursor(3, 3);
  display.println(F(" SU1-DAC "));
  display.println(F("         "));
  display.println(F("   SMSL  "));
  display.display();      // Show initial text
  delay(500);
}

void Draw_text_USB(int &f_outj,int &f_unitj) {
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.setCursor(16, 32);
  display.setFont(&FreeSansBold9pt7b);
  display.println(F(" USB "));
  //display.println(F("         "));
  if (f_unitj == 1){
    f_unit_s = "kHZ";
    }
  if (f_unitj == 2) {
    f_unit_s = "MHZ";
    }
//  display.setTextSize(2); // Draw 2X-scale text
//  display.print("Samp ");display.print(f_outj);display.println(f_unit_s);//println(f_unitj);
  display.display();      // Show initial text
  delay(500);
}
void Draw_text_OPT(int &f_outk,int &f_unitk){
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.setCursor(16, 32);
  display.setFont(&FreeSansBold9pt7b);
  display.println(F(" OPT "));
  //display.println(F("         "));
  if (f_unitk == 1){
    f_unit_s = "kHZ";
    }
  if (f_unitk == 2) {
    f_unit_s = "MHZ";
    }
//  display.print("Samp ");display.print(f_outk);display.println(f_unit_s);
  display.display();      // Show initial text
  delay(500);
}

void Draw_text_COAX(int &f_outl,int &f_unitl) {
  display.clearDisplay();
  display.setTextSize(2); // Draw 2X-scale text
  display.setTextColor(WHITE);
  display.setCursor(6, 32);
  display.setFont(&FreeSansBold9pt7b);
  display.println(F(" COAX "));
 // display.println(F("         "));
  if (f_unitl == 1){
    f_unit_s = "kHZ";
    }
  if (f_unitl == 2) {
    f_unit_s = "MHZ";
    }
 // display.print("Samp ");display.print(f_outl);display.println(f_unit_s);
  display.display();      // Show initial text
  delay(500);
}