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"; } }