Merge branch 'pr1408' into dev
This commit is contained in:
commit
97d481fa65
@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
|
#define INVERTER_UPDATE_SETTINGS_INTERVAL 60000l
|
||||||
|
|
||||||
class InverterSettingsClass {
|
class InverterSettingsClass {
|
||||||
public:
|
public:
|
||||||
void init();
|
void init();
|
||||||
|
|||||||
@ -1,10 +1,9 @@
|
|||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
#include <sunset.h>
|
#include <sunset.h>
|
||||||
|
|
||||||
#define SUNPOS_UPDATE_INTERVAL 60000l
|
|
||||||
|
|
||||||
class SunPositionClass {
|
class SunPositionClass {
|
||||||
public:
|
public:
|
||||||
SunPositionClass();
|
SunPositionClass();
|
||||||
@ -15,9 +14,12 @@ public:
|
|||||||
bool isSunsetAvailable();
|
bool isSunsetAvailable();
|
||||||
bool sunsetTime(struct tm* info);
|
bool sunsetTime(struct tm* info);
|
||||||
bool sunriseTime(struct tm* info);
|
bool sunriseTime(struct tm* info);
|
||||||
|
void setDoRecalc(bool doRecalc);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void updateSunData();
|
void updateSunData();
|
||||||
|
bool checkRecalcDayChanged();
|
||||||
|
bool getDoRecalc();
|
||||||
|
|
||||||
SunSet _sun;
|
SunSet _sun;
|
||||||
bool _isDayPeriod = true;
|
bool _isDayPeriod = true;
|
||||||
@ -25,8 +27,10 @@ private:
|
|||||||
uint32_t _sunriseMinutes = 0;
|
uint32_t _sunriseMinutes = 0;
|
||||||
uint32_t _sunsetMinutes = 0;
|
uint32_t _sunsetMinutes = 0;
|
||||||
|
|
||||||
uint32_t _lastUpdate = 0;
|
|
||||||
bool _isValidInfo = false;
|
bool _isValidInfo = false;
|
||||||
|
bool _doRecalc = true;
|
||||||
|
std::mutex _recalcLock;
|
||||||
|
uint32_t _lastSunPositionCalculatedYMD = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern SunPositionClass SunPosition;
|
extern SunPositionClass SunPosition;
|
||||||
@ -90,7 +90,7 @@ void InverterSettingsClass::init()
|
|||||||
|
|
||||||
void InverterSettingsClass::loop()
|
void InverterSettingsClass::loop()
|
||||||
{
|
{
|
||||||
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) {
|
if (millis() - _lastUpdate > INVERTER_UPDATE_SETTINGS_INTERVAL) {
|
||||||
const CONFIG_T& config = Configuration.get();
|
const CONFIG_T& config = Configuration.get();
|
||||||
|
|
||||||
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
for (uint8_t i = 0; i < INV_MAX_COUNT; i++) {
|
||||||
|
|||||||
@ -19,9 +19,8 @@ void SunPositionClass::init()
|
|||||||
|
|
||||||
void SunPositionClass::loop()
|
void SunPositionClass::loop()
|
||||||
{
|
{
|
||||||
if (millis() - _lastUpdate > SUNPOS_UPDATE_INTERVAL) {
|
if (getDoRecalc() || checkRecalcDayChanged()) {
|
||||||
updateSunData();
|
updateSunData();
|
||||||
_lastUpdate = millis();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,14 +34,50 @@ bool SunPositionClass::isSunsetAvailable()
|
|||||||
return _isSunsetAvailable;
|
return _isSunsetAvailable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SunPositionClass::setDoRecalc(bool doRecalc)
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(_recalcLock);
|
||||||
|
_doRecalc = doRecalc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SunPositionClass::getDoRecalc()
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(_recalcLock);
|
||||||
|
return _doRecalc;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SunPositionClass::checkRecalcDayChanged()
|
||||||
|
{
|
||||||
|
time_t now;
|
||||||
|
struct tm timeinfo;
|
||||||
|
|
||||||
|
time(&now);
|
||||||
|
localtime_r(&now, &timeinfo); // don't use getLocalTime() as there could be a delay of 10ms
|
||||||
|
|
||||||
|
uint32_t ymd;
|
||||||
|
ymd = (timeinfo.tm_year << 9) |
|
||||||
|
(timeinfo.tm_mon << 5) |
|
||||||
|
timeinfo.tm_mday;
|
||||||
|
|
||||||
|
if (_lastSunPositionCalculatedYMD != ymd) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void SunPositionClass::updateSunData()
|
void SunPositionClass::updateSunData()
|
||||||
{
|
{
|
||||||
CONFIG_T const& config = Configuration.get();
|
|
||||||
int offset = Utils::getTimezoneOffset() / 3600;
|
|
||||||
_sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset);
|
|
||||||
|
|
||||||
struct tm timeinfo;
|
struct tm timeinfo;
|
||||||
if (!getLocalTime(&timeinfo, 5)) {
|
bool gotLocalTime;
|
||||||
|
|
||||||
|
gotLocalTime = getLocalTime(&timeinfo, 5);
|
||||||
|
_lastSunPositionCalculatedYMD = (timeinfo.tm_year << 9) |
|
||||||
|
(timeinfo.tm_mon << 5) |
|
||||||
|
timeinfo.tm_mday;
|
||||||
|
setDoRecalc(false);
|
||||||
|
|
||||||
|
if (!gotLocalTime) {
|
||||||
_isDayPeriod = true;
|
_isDayPeriod = true;
|
||||||
_sunriseMinutes = 0;
|
_sunriseMinutes = 0;
|
||||||
_sunsetMinutes = 0;
|
_sunsetMinutes = 0;
|
||||||
@ -50,6 +85,10 @@ void SunPositionClass::updateSunData()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CONFIG_T const& config = Configuration.get();
|
||||||
|
int offset = Utils::getTimezoneOffset() / 3600;
|
||||||
|
|
||||||
|
_sun.setPosition(config.Ntp_Latitude, config.Ntp_Longitude, offset);
|
||||||
_sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday);
|
_sun.setCurrentDate(1900 + timeinfo.tm_year, timeinfo.tm_mon + 1, timeinfo.tm_mday);
|
||||||
|
|
||||||
double sunset_type;
|
double sunset_type;
|
||||||
|
|||||||
@ -190,6 +190,8 @@ void WebApiNtpClass::onNtpAdminPost(AsyncWebServerRequest* request)
|
|||||||
|
|
||||||
NtpSettings.setServer();
|
NtpSettings.setServer();
|
||||||
NtpSettings.setTimezone();
|
NtpSettings.setTimezone();
|
||||||
|
|
||||||
|
SunPosition.setDoRecalc(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebApiNtpClass::onNtpTimeGet(AsyncWebServerRequest* request)
|
void WebApiNtpClass::onNtpTimeGet(AsyncWebServerRequest* request)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user