#include <SPI.h>
#include <Wire.h>
#include <WiFiUdp.h>
#include <ESP8266WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.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);

// prototypes
boolean connectWifi();

// Network creds
char ssid[] = "xxxxxxxxxx";       // your network SSID (name)
char password[] = "xxxxxxxxxx";  // your network key

// UDP setup
WiFiUDP udp_srv;
unsigned int udp_port = 1337;
char packetBuff[256];

void setup()
{
  Serial.begin(115200);

  // Set WiFi to station mode and disconnect from an AP if it was Previously
  // connected
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);

  // Attempt to connect to Wifi network:
  Serial.print("Connecting WiFi: ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  IPAddress ip = WiFi.localIP();
  Serial.println(ip);

  Serial.println("");
  Serial.println("Starting UDP server");
  udp_srv.begin(udp_port);

  Serial.println("");
  Serial.println("Display HW Init"); 
  
  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
  display.setRotation(2);
  display.clearDisplay();
  
  Serial.println("Startup complete");
  
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(40, 20);
  display.println("READY");

  display.setCursor(30, 40);
  display.setTextSize(1);
  display.println(ip);
  display.display();  
}

void loop()
{

  // Get new packet
  int packetSize = udp_srv.parsePacket();

  // Handle packet
  if (packetSize)
  {
    Serial.printf("Received %d bytes from %s, port %d\n", packetSize, udp_srv.remoteIP().toString().c_str(), udp_srv.remotePort());
    int len = udp_srv.read(packetBuff, 255);
    if (len > 0)
    {
      packetBuff[len] = '\0';
    }
    
    Serial.printf("Got UDP packet: %s\n", packetBuff);

    if (strcmp(packetBuff, "REBOOT") == 0)
      ESP.restart();    
    
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(15, 0);
    display.println("COVID-19");

    display.setCursor(35, 20);
    display.println("Cases");  
  
    display.setCursor(10, 40);
    display.setTextSize(3);
    display.println(packetBuff);

    display.display();
  }  
}
