#include <TM1637Display.h> // 4-Dig LED Disp
#include <Wire.h>
#include "RTClib.h"

#define BUZZER 7
#define BUTTON 8
#define FOURDIG_LED_CLK 2
#define FOURDIG_LED_DAT 3

RTC_DS1307 rtc;
TM1637Display led4d(FOURDIG_LED_CLK, FOURDIG_LED_DAT);

int last = 0;
bool isLedPower = true;
uint8_t dataLed[] = { 0,0,0,0 };

void beep1() {
  digitalWrite(BUZZER, HIGH);
  delayMicroseconds(1);
  digitalWrite(BUZZER, LOW);
}

void beep2() {
  digitalWrite(BUZZER, HIGH);
  delay(10);
  digitalWrite(BUZZER, LOW);
}

void beep3() {
  for (int i = 0; i < 3; i++) {
    digitalWrite(BUZZER, HIGH);
    delay(3);
    digitalWrite(BUZZER, LOW);
    delay(80);
  }
}

void beep4(int kai) {
  for (int i = 0; i < kai; i++) {
    digitalWrite(BUZZER, HIGH);
    delay(10);
    digitalWrite(BUZZER, LOW);
    delay(200);
  }
}

void setup() {
#ifdef AVR
  Wire.begin();
#else
  Wire1.begin(); // Shield I2C pins connect to alt I2C bus on Arduino Due
#endif
  rtc.begin();

  pinMode(BUTTON, INPUT);
  pinMode(BUZZER, OUTPUT);

  led4d.setBrightness(0x0a);
  beep3();
}

void loop() {
  if (! rtc.isrunning()) {
    led4d.showNumberDec(8888, false, 4, 0);
    beep2();
    delay(1000);
    return;
  }

  DateTime now = rtc.now();

  if (digitalRead(BUTTON)) {
    beep2();
    if (isLedPower) {
      for(int i=0; i<4; i++)
        dataLed[i] = 0;
      led4d.setSegments(dataLed);
      isLedPower = false;
    } else {
      isLedPower = true;
    }
    delay(500);
  }

  int nhour = now.hour();
  int nmin = now.minute();
  int counter = nhour * 100 + nmin;
  int nsec = now.second();
  if (last != nsec) {
    if(nsec == 0) {
      if(nmin == 0) {
        int kai = nhour % 6;
        if(kai == 0)
          kai = 6;
        beep4(kai);
      }
    }
    last = nsec;
    beep1();   
    if (isLedPower) {
      int num = counter;
      dataLed[3] = led4d.encodeDigit(num % 10);
      if (num > 10)
        dataLed[2] = led4d.encodeDigit((num / 10) % 10);
      if (num > 100)
        dataLed[1] = led4d.encodeDigit((num / 100) % 10);
      if (num > 1000)
        dataLed[0] = led4d.encodeDigit((num / 1000) % 10);
      else
        dataLed[0] = led4d.encodeDigit(0);
      if ((nsec % 2) == 0)
        dataLed[1] ^= 0b10000000;   
      led4d.setSegments(dataLed);
    }
  }
  delay(50);
}