#include <Time.h>
#include <TimeAlarms.h>

//Serial data parsing RTC Function
#define TIME_MSG_LEN  11   
#define TIME_HEADER  'T'   
//===========end============
//Serial data parsing for ALARM
#define PJG_DATA 25
#define INT_SLAVE 'I'
//===========end============

//==Serial Variable for ROOM 1==
byte hourStart1 = 0;
byte minuteStart1 = 0;
byte hourStop1 = 0;
byte minuteStop1 = 0;
byte hourInterval1 = 0;
byte minuteInterval1 = 0;
//==Serial Variable for ROOM 2==
byte hourStart2 = 0;
byte minuteStart2 = 0;
byte hourStop2 = 0;
byte minuteStop2 = 0;
byte hourInterval2 = 0;
byte minuteInterval2 = 0;
//===========end===========

//==================ALARM ID==================
AlarmID_t alarmStart1, alarmStop1, alarmTimer1; //ID for interval Slave 1
AlarmID_t alarmStart2, alarmStop2, alarmTimer2; //ID for interval Slave 2
//====================end=====================

void setup()
{
  Serial.begin(9600);
//  setSyncProvider(RTC.get);   // the function to get the time from the RTC
//  setSyncInterval(600);
  setTime(8,29,40,1,1,10); // set time to 8:29:40am Jan 1 2010 
  if(timeStatus()!= timeSet) 
    Serial.println("Time isn't synced! ");
  else
    Serial.println(" time is synced!  ");
  delay(1000);
    //ROOM 1
  alarmStart1 = Alarm.alarmRepeat(20, 27, 00, Start1); //==start alarm mode interval slave 1
  alarmStop1   = Alarm.alarmRepeat(20, 29, 30, Stop1); //==stop alarm mode interval slave 1
  alarmTimer1 =  Alarm.timerRepeat( 1 * SECS_PER_MIN, doRing1 );
  Alarm.disable(alarmTimer1);
  //ROOM 2
  alarmStart2 = Alarm.alarmRepeat(20, 28, 10, Start2); //==start alarm mode interval slave 2
  alarmStop2   = Alarm.alarmRepeat(20, 30, 30, Stop2); //==stop alarm mode interval slave 2
  alarmTimer2 =  Alarm.timerRepeat( 2 * SECS_PER_MIN, doRing2 );
  Alarm.disable(alarmTimer2);
}

void  loop(){
  if(Serial.available())
  {
    char header = Serial.read();
    if (header == TIME_HEADER)
   {
   showAlarmTime(alarmStart1);
   showAlarmTime(alarmStop1);
   showAlarmTime(alarmTimer1);
   showAlarmTime(alarmStart2);
   showAlarmTime(alarmStop2);
   showAlarmTime(alarmTimer2);;//processSyncMessage();
   }
    else if (header == INT_SLAVE) 
      getNewAlarmTimesl();
  }
  time_t t = now();
  digitalClockDisplay(t);
  Alarm.delay(1000); // wait one second between clock display
}

void digitalClockDisplay(time_t t)
{
  // digital clock display of the time
  Serial.print(hour(t));
  printDigits(minute(t));
  printDigits(second(t));
  Serial.println();
}

void printDigits(int digits)
{
  Serial.print(":");
  if(digits < 10)
    Serial.print('0');
  Serial.print(digits);
}

//========================reading UNIX TIME==========================//
void processSyncMessage()
{
  time_t pctime = 0;
  while (Serial.available() > TIME_MSG_LEN);
  for(int i=0; i < TIME_MSG_LEN -1; i++)
  {   
    char c = Serial.read();
    if( c >= '0' && c <= '9'){   
      pctime = (10 * pctime) + (c - '0') ;  
    }
  }
  time_t t = pctime;
//  RTC.set(t);
  setTime(t);
}

//=========CHANGE ALARM data from SERIAL MESSAGE =========//
void setAlarm( int alarmNumber, int start, int stop, int interval)
{
  if(alarmNumber == 1)
  {    
     Alarm.write (alarmStart1, start);
     Alarm.write (alarmStop1, stop);
     Alarm.write (alarmTimer1, interval);    
   }
   else if(alarmNumber == 2)
  {    
     Alarm.write (alarmStart2, start);
     Alarm.write (alarmStop2, stop);
     Alarm.write (alarmTimer2, interval);    
   }
   
   Serial.print("Seting alarm ");
   Serial.println(alarmNumber);
   Serial.print("Start:  ");
   digitalClockDisplay(start);
   Serial.print("Stop:  ");
   digitalClockDisplay(stop);
   Serial.print("Interval :  ");
   digitalClockDisplay(interval);
}

void getNewAlarmTimesl() 
{  
  unsigned long startTime = millis();
  while(Serial.available() < 24)
  {
    if(millis() - startTime > 1000)
    {
       Serial.println("got header but timed out waiting for 24 bytes");
       return;
    }
  }    

   //===========for ROOM 1===========
   hourStart1 = getIntFromAscii(2);
   minuteStart1 = getIntFromAscii(2);
   hourStop1 = getIntFromAscii(2);
   minuteStop1 = getIntFromAscii(2);
   hourInterval1 = getIntFromAscii(2);
   minuteInterval1 = getIntFromAscii(2);
   
   //===========for ROOM 2===========
   hourStart2 = getIntFromAscii(2);
   minuteStart2 = getIntFromAscii(2);
   hourStop2 = getIntFromAscii(2);
   minuteStop2 = getIntFromAscii(2);
   hourInterval2 = getIntFromAscii(2);
   minuteInterval2 = getIntFromAscii(2);
   
   //================================================================room 1
   time_t newStart,newStop,newInterval;  

   newStart = AlarmHMS (hourStart1, minuteStart1, 0);
   newStop  = AlarmHMS (hourStop1, minuteStop1, 30);
   newInterval = AlarmHMS (hourInterval1, minuteInterval1, 0);
   setAlarm(1, newStart, newStop, newInterval);
   Serial.println (newStart);
   Serial.println (newStop);
   Serial.println (newInterval);
   //================================================================room 2
   
   newStart = AlarmHMS (hourStart2, minuteStart2, 0);
   newStop  = AlarmHMS (hourStop2, minuteStop2, 30);
   newInterval = AlarmHMS (hourInterval2, minuteInterval2, 0);
   setAlarm(2, newStart, newStop, newInterval);
   Serial.println (newStart);
   Serial.println (newStop);
   Serial.println (newInterval);
}

int getIntFromAscii(int nbrDigits)
{
  int val = 0;
  for(int i=0; i < nbrDigits; i++) {
    val = (val *10) + Serial.read()- '0';
  }
  return  val;
}

/*==================== ALARM ROOM 1, START and STOP =================*/
//==================================================================================
void Start1(){
  Alarm.enable(alarmTimer1);
  Serial.println("ROOM 1111111 START");
  delay(1000);
}
void Stop1(){
  Alarm.disable(alarmTimer1);
  Serial.println("ROOM 1111111 STOP");
  delay(1000);
}

void doRing1(){
  Serial.println("^^^^^^one^^^^^^");
  delay(1000);
}
/*==================== ALARM ROOM 2, START and STOP =================*/
//==================================================================================
void Start2(){
  Alarm.enable(alarmTimer2);
  Serial.println("ROOM 2222222 START");
  delay(1000);
}
void Stop2(){
  Alarm.disable(alarmTimer2);
  Serial.println("ROOM 2222222 STOP");
  delay(1000);
}

void doRing2(){
  Serial.print("2222~t w o~2222 ");
  delay(1000);
}

void showAlarmTime(AlarmID_t id)
{
  time_t alarmTime = Alarm.read(id);
  if(alarmTime!= 0)
  {
    if( alarmTime <= SECS_PER_DAY)  
       Serial.print(" repeat alarm with ID ");
    else  
        Serial.print(" once only alarm with ID  ");
    Serial.print(id, DEC);    
    Serial.print(" set for ");
    digitalClockDisplay(alarmTime);
  }  
}





void readAlarm(){

}
