From eb0a370cda2e2762d98d83a6a8d14592b5fac991 Mon Sep 17 00:00:00 2001 From: Th3maz1ng Date: Sun, 1 May 2022 16:25:56 +0200 Subject: [PATCH] Reworked how the time is tracked by the system in general. The external RTC is now only used to set the internal time once. This also allows cleaner File System time handling since we don't need to define a custom callback anymore --- src/app/RtcManager.cpp | 34 +++++++++++++++++----------------- src/app/RtcManager.h | 6 ++---- src/app/SAB.cpp | 34 ++++++++-------------------------- src/app/SAB.h | 6 ++---- src/app/tasks.cpp | 6 ++++-- 5 files changed, 33 insertions(+), 53 deletions(-) diff --git a/src/app/RtcManager.cpp b/src/app/RtcManager.cpp index 35c7ad5..bc023bc 100644 --- a/src/app/RtcManager.cpp +++ b/src/app/RtcManager.cpp @@ -1,37 +1,37 @@ #include "RtcManager.h" -RtcManager::RtcManager(RTC_DS3231 &rtc) : _rtcRef(rtc) +RtcManager::RtcManager() { } DateTime RtcManager::getDateTime() const { - return _rtcRef.now(); + return DateTime(time(nullptr)); } void RtcManager::setDate(const DateTime dateTime) { - DateTime timePart = _rtcRef.now(); - _rtcRef.adjust(DateTime(dateTime.year(), dateTime.month(), dateTime.day(), timePart.hour(), timePart.minute(), timePart.second())); + DateTime timePart = getDateTime(); + DateTime toSet(dateTime.year(), dateTime.month(), dateTime.day(), timePart.hour(), timePart.minute(), timePart.second()); + + timeval tv = {.tv_sec = toSet.unixtime(), .tv_usec = 0}; + + settimeofday(&tv, nullptr); } void RtcManager::setTime(const DateTime dateTime) { - DateTime datePart = _rtcRef.now(); - _rtcRef.adjust(DateTime(datePart.year(), datePart.month(), datePart.day(), dateTime.hour(), dateTime.minute(), dateTime.second())); + DateTime datePart = getDateTime(); + DateTime toSet(datePart.year(), datePart.month(), datePart.day(), dateTime.hour(), dateTime.minute(), dateTime.second()); + + timeval tv = {.tv_sec = toSet.unixtime(), .tv_usec = 0}; + + settimeofday(&tv, nullptr); } void RtcManager::setDateTime(const DateTime dateTime) { - _rtcRef.adjust(dateTime); -} - -boolean RtcManager::hasLostPower() const -{ - return _rtcRef.lostPower(); -} - -float RtcManager::getTemperature() const -{ - return _rtcRef.getTemperature(); + timeval tv = {.tv_sec = dateTime.unixtime(), .tv_usec = 0}; + + settimeofday(&tv, nullptr); } diff --git a/src/app/RtcManager.h b/src/app/RtcManager.h index 8fded85..3f21859 100644 --- a/src/app/RtcManager.h +++ b/src/app/RtcManager.h @@ -1,5 +1,6 @@ #ifndef RTCMANAGER_H #define RTCMANAGER_H +#include #include class RtcManager @@ -10,12 +11,9 @@ class RtcManager void setDate(const DateTime dateTime); void setTime(const DateTime dateTime); void setDateTime(const DateTime dateTime); - boolean hasLostPower() const; - float getTemperature() const; protected: - RtcManager(RTC_DS3231 &rtc); + RtcManager(); private: - RTC_DS3231 &_rtcRef; }; #endif //RTCMANAGER_H diff --git a/src/app/SAB.cpp b/src/app/SAB.cpp index f74b3ad..982c124 100644 --- a/src/app/SAB.cpp +++ b/src/app/SAB.cpp @@ -1,15 +1,8 @@ #include "SAB.h" -//Initializing the static pointer to the RtcManager -//Ugly, but I don't know how to do it an other way -//This static member is used to declare the callback necessary to set the file system's time -RtcManager *SAB::_rtcManagerP = NULL; - SAB::SAB() : _sdCardManager(_boardConfig.getSPI_SDCard_cs(), _boardConfig.getSPISpeed()), _display(_boardConfig.getScreenWidth(),_boardConfig.getScreenHeight(), &Wire), _screenManager(_display, &_sdCardManager), -_rtc(), -_rtcManager(_rtc), _connectivityManager(_sdCardManager), _webServer(80, &_sdCardManager, 10), _ftpServer(21, &_sdCardManager, "ESP8266", "12345678", 10), @@ -25,8 +18,6 @@ SAB::SAB(const BoardConfig boardConfig, const unsigned int webServerPort, const _sdCardManager(_boardConfig.getSPI_SDCard_cs(), _boardConfig.getSPISpeed()), _display(_boardConfig.getScreenWidth(), _boardConfig.getScreenHeight(), &Wire), _screenManager(_display, &_sdCardManager), -_rtc(), -_rtcManager(_rtc), _connectivityManager(_sdCardManager), _webServer(webServerPort, &_sdCardManager, 10), _ftpServer(ftpServerPort, &_sdCardManager, "ESP8266", "12345678", 10), @@ -51,7 +42,7 @@ void SAB::initCommonConfig() if(!_rtc.begin()) _error |= RTC_BEGIN_ERR; else { - SAB::_rtcManagerP = &_rtcManager; + _rtcManager.setDateTime(_rtc.now()); } if(!_display.begin(SSD1306_SWITCHCAPVCC, _boardConfig.getI2C_screenAddress())){ _error |= DISP_BEGIN_ERR;} if(!_sdCardManager.mountSD()) @@ -61,16 +52,10 @@ void SAB::initCommonConfig() _boardConfig.getSPISpeed(), _boardConfig.getSPI_SDCard_cs()); } - else - { - _sdCardManager.setTimeCallback(&(SAB::myTimeCallback)); - } _screenManager.init(); if(!_connectivityManager.connect()){ _error |= CONNECT_ERR;} if(!_pcf.begin()){_error |= IO_INIT_ERR;} - _powerUpTime = _rtcManager.getDateTime(); - //We set the different servers : _webServer.setWWWDir(WWW_DIR); _ftpServer.setFTPDir(FTP_DIR); @@ -84,14 +69,6 @@ void SAB::initGPIO() { } -time_t SAB::myTimeCallback() -{ - if(SAB::_rtcManagerP != NULL) - return SAB::_rtcManagerP->getDateTime().unixtime(); - else - return 0; -} - ScreenManager& SAB::getScreenManager() { return _screenManager; @@ -102,6 +79,11 @@ RtcManager& SAB::getRtcManager() return _rtcManager; } +RTC_DS3231& SAB::getRTC_DS3231() +{ + return _rtc; +} + SDCardManager& SAB::getSdCardManager() { return _sdCardManager; @@ -137,9 +119,9 @@ PowerManager& SAB::getPowerManager() return _powerManager; } -TimeSpan SAB::getUpTime() +TimeSpan SAB::getUpTime() const { - return _rtcManager.getDateTime() - _powerUpTime; + return TimeSpan(millis() / 1000); } BoardConfig SAB::getBoardConfig() const diff --git a/src/app/SAB.h b/src/app/SAB.h index 68b28d8..76c1395 100644 --- a/src/app/SAB.h +++ b/src/app/SAB.h @@ -30,6 +30,7 @@ class SAB ScreenManager& getScreenManager(); RtcManager& getRtcManager(); + RTC_DS3231& getRTC_DS3231(); SDCardManager& getSdCardManager(); ConnectivityManager& getConnectivityManager(); //WEBServerManager& getWebServerManager(); @@ -38,7 +39,7 @@ class SAB IOManager& getIoManager(); TaskSchedulerManager& getTaskSchedulerManager(); PowerManager& getPowerManager(); - TimeSpan getUpTime(); + TimeSpan getUpTime() const; BoardConfig getBoardConfig() const; void run(); @@ -46,7 +47,6 @@ class SAB uint8_t getError() const; private: void initGPIO(); - static time_t myTimeCallback(); void initCommonConfig(); const BoardConfig _boardConfig; @@ -55,7 +55,6 @@ class SAB ScreenManager _screenManager; RTC_DS3231 _rtc; RtcManager _rtcManager; - static RtcManager *_rtcManagerP; ConnectivityManager _connectivityManager; //WEBServerManager _webServerManager; WEBServer _webServer; @@ -65,7 +64,6 @@ class SAB IOManager _ioManager; TaskSchedulerManager _taskSchedulerManager; PowerManager _powerManager; - DateTime _powerUpTime; uint8_t _error = NO_ERROR; }; diff --git a/src/app/tasks.cpp b/src/app/tasks.cpp index 458eef1..290494c 100644 --- a/src/app/tasks.cpp +++ b/src/app/tasks.cpp @@ -17,8 +17,10 @@ boolean task_sys_info(void *pData) uint8_t HEAPfrag; ESP.getHeapStats(&freeRAM, &biggestContigMemBlock, &HEAPfrag); - Serial.printf_P(PSTR("BATT SENSING...\nRunning since : %d s\nSystem error : %u\nStation IP : %s, %d dBm\nAP IP : %s\nWEB Server clients : %u\nMemory info:\n\tFree RAM : %u\n\tHeap frag : %u\n\tMax block %u\n"), - millis()/1000, + TimeSpan ts(p->sab->getUpTime()); + + Serial.printf_P(PSTR("BATT SENSING...\nUp Time : %d d %d h %d m %d s\nSystem error : %u\nStation IP : %s, %d dBm\nAP IP : %s\nWEB Server clients : %u\nMemory info:\n\tFree RAM : %u\n\tHeap frag : %u\n\tMax block %u\n"), + ts.days(), ts.hours(), ts.minutes(), ts.seconds(), p->sab->getError(), p->sab->getConnectivityManager().localIP().toString().c_str(), p->sab->getConnectivityManager().RSSI(),