#include <DS3231M.h>  
#include "LowPower.h"

DS3231M_Class DS3231M; 

const int wake_up_pin = 2;

const int min_one = 6;
const int min_ten = 5;
const int hour_one = 4;
const int hour_ten = 3;

const int min_one_pos_one = 10;
const int min_one_pos_two = 9;
const int min_one_pos_four = 8;
const int min_one_pos_eight = 7;

const int min_ten_pos_one = 9;
const int min_ten_pos_two = 8;
const int min_ten_pos_four = 7;

const int hour_one_pos_one = 10;
const int hour_one_pos_two = 9;
const int hour_one_pos_four = 8;
const int hour_one_pos_eight = 7;

const int hour_ten_pos_one = 8;
const int hour_ten_pos_two = 7;

void wake_up()
{
   
}

void setup() {
  // put your setup code here, to run once:
  //DateTime(F(__DATE__), F(__TIME__))
  pinMode(min_one, OUTPUT);
  pinMode(min_ten, OUTPUT);
  pinMode(hour_one, OUTPUT);
  pinMode(hour_ten, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(wake_up_pin, INPUT_PULLUP); 
  
  Serial.begin(9600);
  while (!DS3231M.begin())  // Initialize RTC communications
  {
    Serial.println("Not found");
    delay(1000);
  }
  DS3231M.adjust(DateTime(2022, 12, 30, 12, 0, 0));  // Set to specific Date/Time  
}

int hour_o = 0;
int hour_t = 0;
int minute_o = 0;
int minute_t = 0;

void loop() {

  attachInterrupt(0, wake_up, LOW);
  LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);

  // execution will start from here after wake up
  // Disable external pin interrupt on wake up pin.
  detachInterrupt(0);   
  delay(200);
  DateTime       now = DS3231M.now(); 
  int hour = now.hour();
  int minute = now.minute();

  hour_o = hour%10;
  hour_t = hour/10;

  minute_o = minute%10;
  minute_t = minute/10;

  long startTime = millis();
  while((millis() - startTime)<10000){  
    min_one_display(minute_o);
    delay(5);
    min_ten_display(minute_t);
    delay(5);
    hour_one_display(hour_o);
    delay(5);
    hour_ten_display(hour_t);
    delay(5);
  }
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
}


void min_one_display(int min_one_value){
  digitalWrite(min_one, HIGH);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
  switch(min_one_value){
    case 0:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 1:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 2:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 3:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 4:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 5:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 6:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 7:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, LOW);
      digitalWrite(min_one_pos_four, LOW);
      digitalWrite(min_one_pos_eight, HIGH);
      break;

    case 8:
      digitalWrite(min_one_pos_one, HIGH);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, LOW);
      break;

    case 9:
      digitalWrite(min_one_pos_one, LOW);
      digitalWrite(min_one_pos_two, HIGH);
      digitalWrite(min_one_pos_four, HIGH);
      digitalWrite(min_one_pos_eight, LOW);
      break;
   }
}

void hour_one_display(int hour_one_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, HIGH);
  digitalWrite(hour_ten, LOW);
  switch(hour_one_value){
    case 0:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 1:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 2:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 3:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 4:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 5:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 6:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 7:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, LOW);
      digitalWrite(hour_one_pos_four, LOW);
      digitalWrite(hour_one_pos_eight, HIGH);
      break;

    case 8:
      digitalWrite(hour_one_pos_one, HIGH);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, LOW);
      break;

    case 9:
      digitalWrite(hour_one_pos_one, LOW);
      digitalWrite(hour_one_pos_two, HIGH);
      digitalWrite(hour_one_pos_four, HIGH);
      digitalWrite(hour_one_pos_eight, LOW);
      break;
   }
}

void min_ten_display(int min_ten_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, HIGH);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, LOW);
  switch(min_ten_value){
    case 0:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, HIGH);
      break;

    case 1:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, HIGH);
      break;

    case 2:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, LOW);
      digitalWrite(min_ten_pos_four, HIGH);
      break;

    case 3:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, LOW);
      digitalWrite(min_ten_pos_four, HIGH);
      break;

    case 4:
      digitalWrite(min_ten_pos_one, HIGH);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, LOW);
      break;

    case 5:
      digitalWrite(min_ten_pos_one, LOW);
      digitalWrite(min_ten_pos_two, HIGH);
      digitalWrite(min_ten_pos_four, LOW);
      break;

   }
}

void hour_ten_display(int hour_ten_value){
  digitalWrite(min_one, LOW);
  digitalWrite(min_ten, LOW);
  digitalWrite(hour_one, LOW);
  digitalWrite(hour_ten, HIGH);
  switch(hour_ten_value){
    case 0:
      digitalWrite(hour_ten_pos_one, HIGH);
      digitalWrite(hour_ten_pos_two, HIGH);
      break;

    case 1:
      digitalWrite(hour_ten_pos_one, LOW);
      digitalWrite(hour_ten_pos_two, HIGH);
      break;

    case 2:
      digitalWrite(hour_ten_pos_one, HIGH);
      digitalWrite(hour_ten_pos_two, LOW);
      break;

   }
}
