// OLED Model railway Station Platform Display - 
// 6 different messages can be shown, based on 6 inputs
// OLED SSD1306 - RTC DS1307 - I2C connections: SDA or A4, SCL or A5

#define MSG1_PIN 2
#define MSG2_PIN 3
#define MSG3_PIN 4
#define MSG4_PIN 5
#define MSG5_PIN 6
#define MSG6_PIN 7
#define TMIN     5 // departure time of next train, minimum of random time
#define TMAX    13 // departure time of next train, maximum of random time

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

// setup the OLED display]
Adafruit_SSD1306 oled(4);
byte bg = BLACK, fg = WHITE; // background- and foreground colors
byte hour, minute, second; 
byte msgnr, msgnr_old, msgflag, msghour, msgminute;
float angle;

// Define the RTC
RTC_DS1307 RTC;

void calc_msg_time() {
  msgminute = msgminute + random(TMIN, TMAX);
  if (msgminute > 59) {
    msghour = (msghour + 1) % 24;
    msgminute = msgminute - 60;
  }
}

void print_msg_time() {
  oled.setTextColor(fg);
  oled.setTextSize(1);
  oled.setCursor(40,2);
  if(msghour < 10) oled.print(" ");
  oled.print(msghour);
  oled.print(":");
  if(msgminute < 10) oled.print("0");
  oled.print(msgminute);
}

void setup() {
  pinMode(MSG1_PIN, INPUT_PULLUP);
  pinMode(MSG2_PIN, INPUT_PULLUP);
  pinMode(MSG3_PIN, INPUT_PULLUP);
  pinMode(MSG4_PIN, INPUT_PULLUP);
  pinMode(MSG5_PIN, INPUT_PULLUP);
  pinMode(MSG6_PIN, INPUT_PULLUP);
  randomSeed(analogRead(A0));
  Serial.begin(9600); // IS THIS NEEDED ????
  Wire.begin();
  RTC.begin();
  oled.begin(SSD1306_SWITCHCAPVCC, 0x3C); // initialize with the I2C addr 0x3C

// To set the clock, uncomment one of the RTC.adjust() lines
//  RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // set to PC time
//  RTC.adjust(DateTime(2019,8,22,13,42,0)); // yyyy, mm, dd, hh, mm, ss
}

void loop() {
// RTC
  DateTime now = RTC.now();
  hour   = now.hour();
  minute = now.minute();
  second = now.second();

// clear oled  
  oled.clearDisplay();
  oled.fillRect(0,0,127,31,bg);

// clock ticks
  for(int z=0; z < 360;z= z + 30){
    angle = (float)z / 57.3;
    int x2=(16+(sin(angle)*15));
    int y2=(15-(cos(angle)*15));
    int x3=(16+(sin(angle)*(12)));
    int y3=(15-(cos(angle)*(12)));
    oled.drawLine(x2,y2,x3,y3,fg);
  }

// clock second
  angle=((float)second * 6 / 57.3); // degrees to radians  
  int x3=(16+(sin(angle)*(14)));
  int y3=(15-(cos(angle)*(14)));
  oled.drawLine(16,15,x3,y3,fg);

// clock minute
  angle=((float)minute * 6 / 57.3); // degrees to radians  
  x3=(16+(sin(angle)*(12)));
  y3=(15-(cos(angle)*(12)));
  oled.drawLine(16,15,x3,y3,fg);

// clock hour
  angle=((float)hour * 30 + (float)minute / 2) / 57.3; //degrees to radians  
  x3=(16+(sin(angle)*(10)));
  y3=(15-(cos(angle)*(10)));
  oled.drawLine(16,15,x3,y3,fg);

// time and messages
  if(!digitalRead(MSG1_PIN)) msgnr = 1;
  if(!digitalRead(MSG2_PIN)) msgnr = 2;
  if(!digitalRead(MSG3_PIN)) msgnr = 3;
  if(!digitalRead(MSG4_PIN)) msgnr = 4;
  if(!digitalRead(MSG5_PIN)) msgnr = 5;
  if(!digitalRead(MSG6_PIN)) msgnr = 6;

  if(msgnr != msgnr_old) {
    calc_msg_time();
    msgnr_old = msgnr;
  }
  print_msg_time();

  switch (msgnr) {
    case 1:
      oled.setCursor(72,2);  oled.print("Intercity");    // max 10 characters
      oled.setCursor(40,12); oled.print("Eindhoven");    // max 14 characters
      oled.setCursor(40,22); oled.print("via strijp-s"); // max 14 characters
    break;

    case 2:
      oled.setCursor(72,2);  oled.print("Sprinter");
      oled.setCursor(40,12); oled.print("sHertogenbosch");
      oled.setCursor(40,22); oled.print("via Boxtel");
    break;

    case 3:
      oled.setCursor(72,2);  oled.print("Pendel");
      oled.setCursor(40,12); oled.print("Maliebaan");
      oled.setCursor(40,22); oled.print("via Eindhoven");
    break;

      case 4:
      oled.setCursor(72,2);  oled.print("Intercity");
      oled.setCursor(40,12); oled.print("Venlo");    
      oled.setCursor(40,22); oled.print("via Deurne");
    break;

    case 5:
      oled.setCursor(72,2);  oled.print("Intercity");
      oled.setCursor(40,12); oled.print("Maastricht");
      oled.setCursor(40,22); oled.print("via Sittard");
    break;

    case 6:
      oled.setCursor(72,2);  oled.print("Intercity");
      oled.setCursor(40,12); oled.print("Heerlen");  
      oled.setCursor(40,22); oled.print("via Weert");
    break;
  }
// refresh screen
  oled.display();
}