From b658ebac979583b29329cb3696c7cb095bb9571d Mon Sep 17 00:00:00 2001
From: BlackMark <me@blackmark.me>
Date: Thu, 27 Apr 2017 01:04:33 +0200
Subject: [PATCH] Implemented setting of alarm and time and printing alarm

---
 ds3231/main.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 75 insertions(+), 12 deletions(-)

diff --git a/ds3231/main.cpp b/ds3231/main.cpp
index c1fc644..207cf25 100644
--- a/ds3231/main.cpp
+++ b/ds3231/main.cpp
@@ -5,6 +5,8 @@
 */
 
 #include <stdio.h>
+#include <stdlib.h>
+#include <avr/interrupt.h>
 
 #include "usart/usart.h"
 #include "clock.h"
@@ -18,7 +20,6 @@ void setup()
 
 	twi_init_master();
 	rtc_init();
-	rtc_set_time_s( 12, 0, 50 );
 
 	if( rtc_is_ds3231() )
 	{
@@ -28,8 +29,60 @@ void setup()
 	{
 		cSerial << "ERROR - No RTC detected!" << "\r\n";
 	}
+}
 
-	rtc_set_alarm_s( 12, 1, 0 );
+void setTime()
+{
+	USART0 &cSerial = USART0::inst();
+
+	tm* tmTime = rtc_get_time();
+
+	constexpr auto BUFFER_SIZE = 32;
+	char szBuffer[BUFFER_SIZE];
+
+	cSerial << "Set time:" << "\r\n" << "Hour: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmTime->hour = atoi( szBuffer );
+
+	cSerial << "Minute: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmTime->min = atoi( szBuffer );
+
+	cSerial << "Second: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmTime->sec = atoi( szBuffer );
+
+	rtc_set_time( tmTime );
+}
+
+void setAlarm()
+{
+	USART0 &cSerial = USART0::inst();
+
+	tm* tmAlarm = rtc_get_alarm();
+
+	constexpr auto BUFFER_SIZE = 32;
+	char szBuffer[BUFFER_SIZE];
+
+	cSerial << "Set alarm:" << "\r\n" << "Hour: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmAlarm->hour = atoi( szBuffer );
+
+	cSerial << "Minute: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmAlarm->min = atoi( szBuffer );
+
+	cSerial << "Second: ";
+	cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
+	cSerial << szBuffer << "\r\n";
+	tmAlarm->sec = atoi( szBuffer );
+
+	rtc_set_alarm( tmAlarm );
 }
 
 int main()
@@ -51,18 +104,14 @@ int main()
 	uint8_t ui8Hour;
 	uint8_t ui8Minute;
 	uint8_t ui8Second;
-
-	rtc_get_alarm_s( &ui8Hour, &ui8Minute, &ui8Second );
-
+	
 	char szBuffer[32];
-	sprintf( szBuffer, "Alarm set to: %02d:%02d:%02d\r\n", ui8Hour, ui8Minute, ui8Second );
-	cSerial << szBuffer << "\r\n";
 
 	while( true )
 	{
 		tm* tmTime = rtc_get_time();
 
-		if( tmTime->sec != ui8Second )
+		if( tmTime->hour != ui8Hour || tmTime->min != ui8Minute || tmTime->sec != ui8Second )
 		{
 			ui8Hour = tmTime->hour;
 			ui8Minute = tmTime->min;
@@ -77,20 +126,34 @@ int main()
 			}
 		}
 
-		uint8_t ui8Bootloader;
+		uint8_t ui8Cmd;
 
-		if( cSerial.receiveByte( ui8Bootloader ) )
+		if( cSerial.receiveByte( ui8Cmd ) )
 		{
-			if( ui8Bootloader == 'b' )
+			if( ui8Cmd == 'b' )
 			{
 				cSerial << "Bootloader . . . " << "\r\n";
 				_delay_ms( 1000 );
 				reset();
 			}
+			else if( ui8Cmd == 's' )
+			{
+				setTime();
+			}
+			else if( ui8Cmd == 'a' )
+			{
+				setAlarm();
+			}
+			else if( ui8Cmd == 'p' )
+			{
+				rtc_get_alarm_s( &ui8Hour, &ui8Minute, &ui8Second );
+				sprintf( szBuffer, "Alarm set to: %02d:%02d:%02d", ui8Hour, ui8Minute, ui8Second );
+				cSerial << szBuffer << "\r\n";
+			}
 			else
 			{
 				cSerial << "Invalid char: '";
-				cSerial.transmitByte( ui8Bootloader );
+				cSerial.transmitByte( ui8Cmd );
 				cSerial << "'" << "\r\n";
 			}
 		}