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"
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);
}

View File

@ -1,5 +1,6 @@
#ifndef RTCMANAGER_H
#define RTCMANAGER_H
#include <sys/time.h>
#include <RTClib.h>
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

View File

@ -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

View File

@ -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<WEBClient> _webServer;
@ -65,7 +64,6 @@ class SAB
IOManager _ioManager;
TaskSchedulerManager _taskSchedulerManager;
PowerManager _powerManager;
DateTime _powerUpTime;
uint8_t _error = NO_ERROR;
};

View File

@ -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(),