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

This commit is contained in:
Th3maz1ng 2022-05-01 16:25:56 +02:00
parent 720f2e9579
commit eb0a370cda
5 changed files with 33 additions and 53 deletions

View File

@ -1,37 +1,37 @@
#include "RtcManager.h" #include "RtcManager.h"
RtcManager::RtcManager(RTC_DS3231 &rtc) : _rtcRef(rtc) RtcManager::RtcManager()
{ {
} }
DateTime RtcManager::getDateTime() const DateTime RtcManager::getDateTime() const
{ {
return _rtcRef.now(); return DateTime(time(nullptr));
} }
void RtcManager::setDate(const DateTime dateTime) void RtcManager::setDate(const DateTime dateTime)
{ {
DateTime timePart = _rtcRef.now(); DateTime timePart = getDateTime();
_rtcRef.adjust(DateTime(dateTime.year(), dateTime.month(), dateTime.day(), timePart.hour(), timePart.minute(), timePart.second())); 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) void RtcManager::setTime(const DateTime dateTime)
{ {
DateTime datePart = _rtcRef.now(); DateTime datePart = getDateTime();
_rtcRef.adjust(DateTime(datePart.year(), datePart.month(), datePart.day(), dateTime.hour(), dateTime.minute(), dateTime.second())); 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) void RtcManager::setDateTime(const DateTime dateTime)
{ {
_rtcRef.adjust(dateTime); timeval tv = {.tv_sec = dateTime.unixtime(), .tv_usec = 0};
}
settimeofday(&tv, nullptr);
boolean RtcManager::hasLostPower() const
{
return _rtcRef.lostPower();
}
float RtcManager::getTemperature() const
{
return _rtcRef.getTemperature();
} }

View File

@ -1,5 +1,6 @@
#ifndef RTCMANAGER_H #ifndef RTCMANAGER_H
#define RTCMANAGER_H #define RTCMANAGER_H
#include <sys/time.h>
#include <RTClib.h> #include <RTClib.h>
class RtcManager class RtcManager
@ -10,12 +11,9 @@ class RtcManager
void setDate(const DateTime dateTime); void setDate(const DateTime dateTime);
void setTime(const DateTime dateTime); void setTime(const DateTime dateTime);
void setDateTime(const DateTime dateTime); void setDateTime(const DateTime dateTime);
boolean hasLostPower() const;
float getTemperature() const;
protected: protected:
RtcManager(RTC_DS3231 &rtc); RtcManager();
private: private:
RTC_DS3231 &_rtcRef;
}; };
#endif //RTCMANAGER_H #endif //RTCMANAGER_H

View File

@ -1,15 +1,8 @@
#include "SAB.h" #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()), SAB::SAB() : _sdCardManager(_boardConfig.getSPI_SDCard_cs(), _boardConfig.getSPISpeed()),
_display(_boardConfig.getScreenWidth(),_boardConfig.getScreenHeight(), &Wire), _display(_boardConfig.getScreenWidth(),_boardConfig.getScreenHeight(), &Wire),
_screenManager(_display, &_sdCardManager), _screenManager(_display, &_sdCardManager),
_rtc(),
_rtcManager(_rtc),
_connectivityManager(_sdCardManager), _connectivityManager(_sdCardManager),
_webServer(80, &_sdCardManager, 10), _webServer(80, &_sdCardManager, 10),
_ftpServer(21, &_sdCardManager, "ESP8266", "12345678", 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()), _sdCardManager(_boardConfig.getSPI_SDCard_cs(), _boardConfig.getSPISpeed()),
_display(_boardConfig.getScreenWidth(), _boardConfig.getScreenHeight(), &Wire), _display(_boardConfig.getScreenWidth(), _boardConfig.getScreenHeight(), &Wire),
_screenManager(_display, &_sdCardManager), _screenManager(_display, &_sdCardManager),
_rtc(),
_rtcManager(_rtc),
_connectivityManager(_sdCardManager), _connectivityManager(_sdCardManager),
_webServer(webServerPort, &_sdCardManager, 10), _webServer(webServerPort, &_sdCardManager, 10),
_ftpServer(ftpServerPort, &_sdCardManager, "ESP8266", "12345678", 10), _ftpServer(ftpServerPort, &_sdCardManager, "ESP8266", "12345678", 10),
@ -51,7 +42,7 @@ void SAB::initCommonConfig()
if(!_rtc.begin()) _error |= RTC_BEGIN_ERR; if(!_rtc.begin()) _error |= RTC_BEGIN_ERR;
else else
{ {
SAB::_rtcManagerP = &_rtcManager; _rtcManager.setDateTime(_rtc.now());
} }
if(!_display.begin(SSD1306_SWITCHCAPVCC, _boardConfig.getI2C_screenAddress())){ _error |= DISP_BEGIN_ERR;} if(!_display.begin(SSD1306_SWITCHCAPVCC, _boardConfig.getI2C_screenAddress())){ _error |= DISP_BEGIN_ERR;}
if(!_sdCardManager.mountSD()) if(!_sdCardManager.mountSD())
@ -61,16 +52,10 @@ void SAB::initCommonConfig()
_boardConfig.getSPISpeed(), _boardConfig.getSPISpeed(),
_boardConfig.getSPI_SDCard_cs()); _boardConfig.getSPI_SDCard_cs());
} }
else
{
_sdCardManager.setTimeCallback(&(SAB::myTimeCallback));
}
_screenManager.init(); _screenManager.init();
if(!_connectivityManager.connect()){ _error |= CONNECT_ERR;} if(!_connectivityManager.connect()){ _error |= CONNECT_ERR;}
if(!_pcf.begin()){_error |= IO_INIT_ERR;} if(!_pcf.begin()){_error |= IO_INIT_ERR;}
_powerUpTime = _rtcManager.getDateTime();
//We set the different servers : //We set the different servers :
_webServer.setWWWDir(WWW_DIR); _webServer.setWWWDir(WWW_DIR);
_ftpServer.setFTPDir(FTP_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() ScreenManager& SAB::getScreenManager()
{ {
return _screenManager; return _screenManager;
@ -102,6 +79,11 @@ RtcManager& SAB::getRtcManager()
return _rtcManager; return _rtcManager;
} }
RTC_DS3231& SAB::getRTC_DS3231()
{
return _rtc;
}
SDCardManager& SAB::getSdCardManager() SDCardManager& SAB::getSdCardManager()
{ {
return _sdCardManager; return _sdCardManager;
@ -137,9 +119,9 @@ PowerManager& SAB::getPowerManager()
return _powerManager; return _powerManager;
} }
TimeSpan SAB::getUpTime() TimeSpan SAB::getUpTime() const
{ {
return _rtcManager.getDateTime() - _powerUpTime; return TimeSpan(millis() / 1000);
} }
BoardConfig SAB::getBoardConfig() const BoardConfig SAB::getBoardConfig() const

View File

@ -30,6 +30,7 @@ class SAB
ScreenManager& getScreenManager(); ScreenManager& getScreenManager();
RtcManager& getRtcManager(); RtcManager& getRtcManager();
RTC_DS3231& getRTC_DS3231();
SDCardManager& getSdCardManager(); SDCardManager& getSdCardManager();
ConnectivityManager& getConnectivityManager(); ConnectivityManager& getConnectivityManager();
//WEBServerManager& getWebServerManager(); //WEBServerManager& getWebServerManager();
@ -38,7 +39,7 @@ class SAB
IOManager& getIoManager(); IOManager& getIoManager();
TaskSchedulerManager& getTaskSchedulerManager(); TaskSchedulerManager& getTaskSchedulerManager();
PowerManager& getPowerManager(); PowerManager& getPowerManager();
TimeSpan getUpTime(); TimeSpan getUpTime() const;
BoardConfig getBoardConfig() const; BoardConfig getBoardConfig() const;
void run(); void run();
@ -46,7 +47,6 @@ class SAB
uint8_t getError() const; uint8_t getError() const;
private: private:
void initGPIO(); void initGPIO();
static time_t myTimeCallback();
void initCommonConfig(); void initCommonConfig();
const BoardConfig _boardConfig; const BoardConfig _boardConfig;
@ -55,7 +55,6 @@ class SAB
ScreenManager _screenManager; ScreenManager _screenManager;
RTC_DS3231 _rtc; RTC_DS3231 _rtc;
RtcManager _rtcManager; RtcManager _rtcManager;
static RtcManager *_rtcManagerP;
ConnectivityManager _connectivityManager; ConnectivityManager _connectivityManager;
//WEBServerManager _webServerManager; //WEBServerManager _webServerManager;
WEBServer<WEBClient> _webServer; WEBServer<WEBClient> _webServer;
@ -65,7 +64,6 @@ class SAB
IOManager _ioManager; IOManager _ioManager;
TaskSchedulerManager _taskSchedulerManager; TaskSchedulerManager _taskSchedulerManager;
PowerManager _powerManager; PowerManager _powerManager;
DateTime _powerUpTime;
uint8_t _error = NO_ERROR; uint8_t _error = NO_ERROR;
}; };

View File

@ -17,8 +17,10 @@ boolean task_sys_info(void *pData)
uint8_t HEAPfrag; uint8_t HEAPfrag;
ESP.getHeapStats(&freeRAM, &biggestContigMemBlock, &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"), TimeSpan ts(p->sab->getUpTime());
millis()/1000,
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->getError(),
p->sab->getConnectivityManager().localIP().toString().c_str(), p->sab->getConnectivityManager().localIP().toString().c_str(),
p->sab->getConnectivityManager().RSSI(), p->sab->getConnectivityManager().RSSI(),