From 97bb522189f217f95c5a911141f8990a8cc0dfd0 Mon Sep 17 00:00:00 2001 From: BlackMark Date: Sat, 16 May 2020 19:20:32 +0200 Subject: [PATCH] Remove old rtc lib and systime --- ds3231/ds3231 | 2 +- ds3231/ds3231.cppproj | 12 --- ds3231/main.cpp | 223 +++++++++--------------------------------- ds3231/systime.cpp | 106 -------------------- ds3231/systime.h | 28 ------ 5 files changed, 49 insertions(+), 322 deletions(-) delete mode 100644 ds3231/systime.cpp delete mode 100644 ds3231/systime.h 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