//#include <VarSpeedServo.h>

//#include <VarSpeedServo.h>

//#include <Servo.h>





//VarSpeedServo needle;
//int needle_pos;

#include <limits.h>

#define MO1 14  
#define MO2 15
#define MO4 16
#define MO8 17

#define MT1 24
#define MT2 21
#define MT4 20

#define HO1 4
#define HO2 5
#define HO4 6
#define HO8 7

#define HT1 2
#define HT2 3

#define HrsSet 8
#define MinSet 9
#define SecSet 10

#define Sqw 18


void setup() {
  pinMode(Sqw, INPUT);
  pinMode(MO1, OUTPUT);
  pinMode(MO2, OUTPUT);
  pinMode(MO4, OUTPUT);
  pinMode(MO8, OUTPUT);
  pinMode(MT1, OUTPUT);
  pinMode(MT2, OUTPUT);
  pinMode(MT4, OUTPUT);
  pinMode(HO1, OUTPUT);
  pinMode(HO2, OUTPUT);
  pinMode(HO4, OUTPUT);
  pinMode(HO8, OUTPUT);
  pinMode(HT1, OUTPUT);
  pinMode(HT2, OUTPUT);
  pinMode(HrsSet, INPUT_PULLUP);
  pinMode(MinSet, INPUT_PULLUP);
  pinMode(SecSet, INPUT_PULLUP);

//  needle.attach(23);

}

void loop() {
  static int timeInMinutes = 0;  // Starts at 12:00 (12*60 = 720 minutes)
  static int timeSeconds = 0;
  static int lastFlash = 0;
  static int squareWaveLastState = 0;
  static int hours = 1;
//  int hourOnes = 0;
//  int hoursTens = 0;
//  int hoursOnes = 0;

  static unsigned long lastMinutePress = 0;
  static unsigned long lastHourPress = 0;


  // divide 2Hz square wave by 2
  int sqwRead = digitalRead(Sqw);
  if (sqwRead && !squareWaveLastState) {
    ++lastFlash;
    if (lastFlash >= 2) {
      ++timeSeconds;
      lastFlash = 0;
    }
  }
  squareWaveLastState = sqwRead;

  // Time setting code
  int minRead = digitalRead(MinSet);
  if (minRead == LOW && millis() - lastMinutePress > 200) {
    lastMinutePress = millis();
    ++timeInMinutes;
//    if (timeInMinutes % 60 == 0) {
//      timeInMinutes -= 60;
//    }
  }

  int hourRead = digitalRead(HrsSet);
  if (hourRead == LOW && millis() - lastHourPress > 200) {
    lastHourPress = millis();
    ++hours;
  }

  int secondRead = digitalRead(SecSet);
  if (secondRead == LOW) {
    timeSeconds = 0;
  }

  // Rectify time state
  if (timeSeconds >= 60) {
    timeSeconds = 0;
    ++timeInMinutes;
  }

 if (timeInMinutes >= 60){
    ++hours;
    timeInMinutes = 0;
  }
  if (hours >= 13) {
    hours = 1;
  }

//  if (hours == 0){
//    hours = 1;
//    }
//  while (timeInMinutes >= kMinutesInDay) {
//    timeInMinutes -= kMinutesInDay;
//  }



  // Convert time to 12-hour format
//hours = (timeInMinutes / 60);  // Ensure hours wrap at 12



  // Light up binary representation of time
  int minutesOfHour = timeInMinutes % 60;
  int minuteOnes = minutesOfHour % 10;
  digitalWrite(MO1, minuteOnes & 1);
  digitalWrite(MO2, minuteOnes & 2);
  digitalWrite(MO4, minuteOnes & 4);
  digitalWrite(MO8, minuteOnes & 8);

  int minuteTens = minutesOfHour / 10;
  digitalWrite(MT1, minuteTens & 1);
  digitalWrite(MT2, minuteTens & 2);
  digitalWrite(MT4, minuteTens & 4);

 int  hoursOfDay = hours % 12;
if (hoursOfDay == 0) {
  hoursOfDay = 12; // Correct for 12-hour clock display
}
 int  hoursOnes = hoursOfDay % 10;
  digitalWrite(HO1, hoursOnes & 1);
  digitalWrite(HO2, hoursOnes & 2);
  digitalWrite(HO4, hoursOnes & 4);
  digitalWrite(HO8, hoursOnes & 8);

 int  hoursTens = hours / 10;
  digitalWrite(HT1, hoursTens & 1);
  digitalWrite(HT2, hoursTens & 2);
 // needle_pos = map(timeSeconds, 0, 60, 10, 150);

 // needle.write(needle_pos, 30); // range is 10-150
}
