diff --git a/ds3231/ds3231 b/ds3231/ds3231
index 1624991..a946746 160000
--- a/ds3231/ds3231
+++ b/ds3231/ds3231
@@ -1 +1 @@
-Subproject commit 16249914c2cc87d7802278d32f75ef3566b17d40
+Subproject commit a9467469600d68ce7e386b2ce0a85e2e4c50870a
diff --git a/ds3231/ds3231.cppproj b/ds3231/ds3231.cppproj
index 20f13b8..404c21f 100644
--- a/ds3231/ds3231.cppproj
+++ b/ds3231/ds3231.cppproj
@@ -227,12 +227,6 @@
compile
-
- compile
-
-
- compile
-
compile
@@ -248,12 +242,6 @@
compile
-
- compile
-
-
- compile
-
compile
diff --git a/ds3231/main.cpp b/ds3231/main.cpp
index 9f4e982..4c176b9 100644
--- a/ds3231/main.cpp
+++ b/ds3231/main.cpp
@@ -1,217 +1,90 @@
#include "clock.hpp"
-#include
-#include
-#include
-#include
-
-#include
-
#include "ds3231/ds3231.hpp"
#include "uart/uart.hpp"
-#include "systime.h"
-
using uart_t = uart::Uart0<>;
REGISTER_UART0_INT_VECTORS(uart_t);
-static inline bool receiveLine(char *szBuffer, size_t sizeBufferLength, const char *szLineTerminator = "\r\n")
+static inline bool isEuDst(const rtc::DateTime &dateTime)
{
- size_t sizeReceived = 0;
+ constexpr auto calcDstBegin = [](const auto &year) {
+ const auto beginDay = (31 - ((((5 * year) / 4) + 4) % 7));
+ return beginDay;
+ };
- while (sizeReceived < sizeBufferLength - 1) {
- uint8_t ui8ReceiveByte;
+ constexpr auto calcDstEnd = [](const auto &year) {
+ const auto endDay = (31 - ((((5 * year) / 4) + 1) % 7));
+ return endDay;
+ };
- while (!uart_t::rxByte(ui8ReceiveByte))
- ;
- szBuffer[sizeReceived++] = ui8ReceiveByte;
- szBuffer[sizeReceived] = '\0';
-
- if (strstr(szBuffer, szLineTerminator)) {
- szBuffer[sizeReceived - strlen(szLineTerminator)] = '\0';
+ if (dateTime.month > 10 || dateTime.month < 3)
+ return false;
+ else if (dateTime.month > 3 && dateTime.month < 10)
+ return true;
+ else if (dateTime.month == 3) {
+ if (dateTime.day > calcDstBegin(dateTime.year)) {
return true;
- }
+ } else if (dateTime.day == calcDstBegin(dateTime.year) && dateTime.hour >= 1)
+ return true;
+ return false;
}
-
+ // month == 10
+ if (dateTime.day < calcDstEnd(dateTime.year)) {
+ return true;
+ } else if (dateTime.day == calcDstEnd(dateTime.year) && dateTime.hour < 1)
+ return true;
return false;
}
-void setup()
+inline uart_t &operator<<(uart_t &serial, const rtc::DateTime &dateTime)
{
- uart_t cSerial;
-
- if (SysTime::init()) {
- cSerial << "DS3231 detected!"
- << "\r\n";
- } else {
- cSerial << "ERROR - No RTC detected!"
- << "\r\n";
- }
+ serial.txNumber(dateTime.year);
+ serial << '-';
+ serial.txNumber(dateTime.month);
+ serial << '-';
+ serial.txNumber(dateTime.day);
+ serial << ' ';
+ serial.txNumber(dateTime.hour);
+ serial << ':';
+ serial.txNumber(dateTime.minute);
+ serial << ':';
+ serial.txNumber(dateTime.second);
+ return serial;
}
-void setTime()
+static inline void printLocalTime(const rtc::DateTime &dateTime)
{
- uart_t cSerial;
+ const auto dst = isEuDst(dateTime);
- tm sTime = {};
-
- constexpr auto BUFFER_SIZE = 32;
- char szBuffer[BUFFER_SIZE];
-
- cSerial << "Set time:"
- << "\r\n"
- << "Year: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_year = atoi(szBuffer) - 1900;
-
- cSerial << "Set time:"
- << "\r\n"
- << "Month: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_mon = atoi(szBuffer) - 1;
-
- cSerial << "Set time:"
- << "\r\n"
- << "Day: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_mday = atoi(szBuffer);
-
- cSerial << "Set time:"
- << "\r\n"
- << "Hour: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_hour = atoi(szBuffer);
-
- cSerial << "Minute: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_min = atoi(szBuffer);
-
- cSerial << "Second: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- sTime.tm_sec = atoi(szBuffer);
-
- mktime(&sTime);
-
- SysTime::setTime(sTime);
-}
-
-void setAlarm()
-{
- uart_t cSerial;
-
- rtc_tm *tmAlarm = rtc_get_alarm();
-
- constexpr auto BUFFER_SIZE = 32;
- char szBuffer[BUFFER_SIZE];
-
- cSerial << "Set alarm:"
- << "\r\n"
- << "Hour: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- tmAlarm->hour = atoi(szBuffer);
-
- cSerial << "Minute: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- tmAlarm->min = atoi(szBuffer);
-
- cSerial << "Second: ";
- receiveLine(szBuffer, BUFFER_SIZE, "\r");
- cSerial << szBuffer << "\r\n";
- tmAlarm->sec = atoi(szBuffer);
-
- rtc_set_alarm(tmAlarm);
+ uart_t serial;
+ serial << dateTime << (dst ? F(" +2") : F(" +1")) << F("\r\n");
}
int main()
{
uart_t cSerial;
- rtc::DS3231>> ds3231;
- ds3231.init();
+ rtc::DS3231>, false> ds3231;
+ ds3231.init();
cSerial.init();
- sei();
rtc::DateTime date;
date.year = 2020;
- date.month = 5;
- date.day = 16;
- date.hour = 17;
- date.minute = 24;
- date.second = 10;
+ date.month = 01;
+ date.day = 01;
+ date.hour = 19;
+ date.minute = 18;
+ date.second = 50;
ds3231.setDateTime(date);
- setup();
-
while (true) {
const auto date = ds3231.getDateTime();
- cSerial.txNumber(date.year);
- cSerial << '-';
- cSerial.txNumber(date.month);
- cSerial << '-';
- cSerial.txNumber(date.day);
- cSerial << ' ';
- cSerial.txNumber(date.hour);
- cSerial << ':';
- cSerial.txNumber(date.minute);
- cSerial << ':';
- cSerial.txNumber(date.second);
- cSerial << F("\r\n");
+ printLocalTime(date);
_delay_ms(1000);
}
- 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.rxByte(ui8Cmd)) {
- 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.txByte(ui8Cmd);
- cSerial << "'"
- << "\r\n";
- }
- }
- }
-
return 0;
}
diff --git a/ds3231/systime.cpp b/ds3231/systime.cpp
deleted file mode 100644
index 4f79579..0000000
--- a/ds3231/systime.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#include "systime.h"
-
-//////////////////////////////////////////////////////////////////////////
-// DST magic by Edgar Bonet
-int SysTime::euDST( const time_t *pTime, int32_t *pZ )
-{
- static_cast( pZ );
-
- uint32_t t = *pTime;
-
- if( static_cast( t >> 24 ) >= 194 )
- t -= 3029443200U;
-
- t = ( t + 655513200 ) / 604800 * 28;
-
- if( static_cast( t % 1461 ) < 856 )
- return ONE_HOUR;
-
- return 0;
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool SysTime::init()
-{
- rtc_init();
-
- if( !rtc_is_ds3231() )
- return false;
-
- set_zone( 1 * ONE_HOUR );
- set_dst( euDST );
-
- syncSysTime();
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SysTime::syncSysTime()
-{
- tm sTime = getTime();
- set_system_time( mk_gmtime( &sTime ) );
-}
-
-//////////////////////////////////////////////////////////////////////////
-bool SysTime::checkSync()
-{
- time_t timeNow = time( nullptr );
- tm *ptmUTC = gmtime( &timeNow );
-
- rtc_tm *ptmRtcTime = rtc_get_time();
-
- if( ptmUTC->tm_sec != ptmRtcTime->sec || ptmUTC->tm_min != ptmRtcTime->min || ptmUTC->tm_hour != ptmRtcTime->hour )
- return false;
-
- if( ptmUTC->tm_mday != ptmRtcTime->mday || ( ptmUTC->tm_mon + 1 ) != ptmRtcTime->mon || ( ptmUTC->tm_year + 1900 ) != ptmRtcTime->year )
- return false;
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SysTime::tick()
-{
- system_tick();
-}
-
-//////////////////////////////////////////////////////////////////////////
-tm SysTime::getTime()
-{
- tm sTime;
- rtc_tm *ptmTime = rtc_get_time();
-
- sTime.tm_sec = ptmTime->sec;
- sTime.tm_min = ptmTime->min;
- sTime.tm_hour = ptmTime->hour;
- sTime.tm_mday = ptmTime->mday;
- sTime.tm_mon = ptmTime->mon - 1;
- sTime.tm_year = ptmTime->year - 1900;
- sTime.tm_isdst = 0;
-
- time_t timeUTC = mk_gmtime( &sTime );
- sTime = *( gmtime( &timeUTC ) );
-
- return sTime;
-}
-
-//////////////////////////////////////////////////////////////////////////
-void SysTime::setTime( const tm &sTime )
-{
- rtc_tm *pRtcTime = rtc_get_time();
-
- pRtcTime->sec = sTime.tm_sec;
- pRtcTime->min = sTime.tm_min;
- pRtcTime->hour = sTime.tm_hour;
- pRtcTime->mday = sTime.tm_mday;
- pRtcTime->mon = sTime.tm_mon + 1;
- pRtcTime->year = sTime.tm_year + 1900;
- pRtcTime->wday = sTime.tm_wday + 1;
- pRtcTime->am = ( sTime.tm_hour < 12 ) ? true : false;
- pRtcTime->twelveHour = ( sTime.tm_hour == 0 ) ? 12 : ( ( sTime.tm_hour > 12 ) ? ( sTime.tm_hour - 12 ) : sTime.tm_hour );
-
- rtc_set_time( pRtcTime );
-
- syncSysTime();
-}
diff --git a/ds3231/systime.h b/ds3231/systime.h
deleted file mode 100644
index d7c4d7a..0000000
--- a/ds3231/systime.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-* Copyright (c) by BlackMark 2017
-* Date 17/12/2016
-* Version 1.0
-*/
-
-#ifndef SYSTIME_H
-#define SYSTIME_H
-
-#include
-
-#include "ds3231/rtc.h"
-
-class SysTime
-{
-private:
- static int euDST( const time_t *pTime, int32_t *pZ );
-
-public:
- static bool init();
- static void syncSysTime();
- static bool checkSync();
- static void tick();
- static tm getTime();
- static void setTime( const tm &sTime );
-};
-
-#endif
\ No newline at end of file