178 lines
3.5 KiB
C++
178 lines
3.5 KiB
C++
/*
|
|
* Copyright (c) by BlackMark 2017
|
|
* Date 17/12/2017
|
|
* Version 1.2
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <time.h>
|
|
#include <avr/interrupt.h>
|
|
|
|
#include "usart/usart.h"
|
|
#include "clock.h"
|
|
#include "bootloader.h"
|
|
#include "systime.h"
|
|
|
|
void setup()
|
|
{
|
|
USART0 &cSerial = USART0::inst();
|
|
|
|
if( SysTime::init() )
|
|
{
|
|
cSerial << "DS3231 detected!" << "\r\n";
|
|
}
|
|
else
|
|
{
|
|
cSerial << "ERROR - No RTC detected!" << "\r\n";
|
|
}
|
|
}
|
|
|
|
void setTime()
|
|
{
|
|
USART0 &cSerial = USART0::inst();
|
|
|
|
tm sTime;
|
|
|
|
constexpr auto BUFFER_SIZE = 32;
|
|
char szBuffer[BUFFER_SIZE];
|
|
|
|
cSerial << "Set time:" << "\r\n" << "Year: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_year = atoi( szBuffer ) - 1900;
|
|
|
|
cSerial << "Set time:" << "\r\n" << "Month: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_mon = atoi( szBuffer ) - 1;
|
|
|
|
cSerial << "Set time:" << "\r\n" << "Day: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_mday = atoi( szBuffer );
|
|
|
|
cSerial << "Set time:" << "\r\n" << "Hour: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_hour = atoi( szBuffer );
|
|
|
|
cSerial << "Minute: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_min = atoi( szBuffer );
|
|
|
|
cSerial << "Second: ";
|
|
cSerial.receiveLine( szBuffer, BUFFER_SIZE, "\r" );
|
|
cSerial << szBuffer << "\r\n";
|
|
sTime.tm_sec = atoi( szBuffer );
|
|
|
|
mktime( &sTime );
|
|
|
|
SysTime::setTime( sTime );
|
|
}
|
|
|
|
void setAlarm()
|
|
{
|
|
USART0 &cSerial = USART0::inst();
|
|
|
|
rtc_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()
|
|
{
|
|
uint8_t ui8MCUSR = handleReset();
|
|
|
|
if( ui8MCUSR & ( 1 << WDRF ) )
|
|
{
|
|
callBootloader();
|
|
}
|
|
|
|
USART0 &cSerial = USART0::inst();
|
|
|
|
cSerial.init( 9600 );
|
|
sei();
|
|
|
|
setup();
|
|
|
|
constexpr auto BUFFER_SIZE = 32;
|
|
char szBuffer[BUFFER_SIZE];
|
|
|
|
while( true )
|
|
{
|
|
if( !SysTime::checkSync() )
|
|
{
|
|
SysTime::syncSysTime();
|
|
|
|
time_t timeNow = time( nullptr );
|
|
tm *psLocalTime = localtime( &timeNow );
|
|
|
|
strftime( szBuffer, BUFFER_SIZE, "%F %T %z", psLocalTime );
|
|
|
|
cSerial << "Time: " << szBuffer << "\r\n";
|
|
|
|
if( rtc_check_alarm() )
|
|
{
|
|
cSerial << "ALARM!" << "\r\n";
|
|
}
|
|
}
|
|
|
|
uint8_t ui8Cmd;
|
|
|
|
if( cSerial.receiveByte( ui8Cmd ) )
|
|
{
|
|
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' )
|
|
{
|
|
uint8_t ui8Hour;
|
|
uint8_t ui8Minute;
|
|
uint8_t ui8Second;
|
|
|
|
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( ui8Cmd );
|
|
cSerial << "'" << "\r\n";
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
} |