diff --git a/include/WebApi.h b/include/WebApi.h index 39e7fd1..28ae7d3 100644 --- a/include/WebApi.h +++ b/include/WebApi.h @@ -38,10 +38,6 @@ public: static void writeConfig(JsonVariant& retMsg, const WebApiError code = WebApiError::GenericSuccess, const String& message = "Settings saved!"); private: - void loop(); - - Task _loopTask; - AsyncWebServer _server; WebApiConfigClass _webApiConfig; @@ -66,4 +62,4 @@ private: WebApiWsLiveClass _webApiWsLive; }; -extern WebApiClass WebApi; \ No newline at end of file +extern WebApiClass WebApi; diff --git a/include/WebApi_config.h b/include/WebApi_config.h index edc8b29..91243c1 100644 --- a/include/WebApi_config.h +++ b/include/WebApi_config.h @@ -2,11 +2,11 @@ #pragma once #include +#include class WebApiConfigClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onConfigGet(AsyncWebServerRequest* request); @@ -16,4 +16,4 @@ private: void onConfigUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_device.h b/include/WebApi_device.h index 9fca20f..f74315e 100644 --- a/include/WebApi_device.h +++ b/include/WebApi_device.h @@ -2,15 +2,15 @@ #pragma once #include +#include class WebApiDeviceClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onDeviceAdminGet(AsyncWebServerRequest* request); void onDeviceAdminPost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_devinfo.h b/include/WebApi_devinfo.h index 6e5602b..d1924ec 100644 --- a/include/WebApi_devinfo.h +++ b/include/WebApi_devinfo.h @@ -2,14 +2,14 @@ #pragma once #include +#include class WebApiDevInfoClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onDevInfoStatus(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_dtu.h b/include/WebApi_dtu.h index 98d2865..5514e75 100644 --- a/include/WebApi_dtu.h +++ b/include/WebApi_dtu.h @@ -2,16 +2,18 @@ #pragma once #include +#include class WebApiDtuClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onDtuAdminGet(AsyncWebServerRequest* request); void onDtuAdminPost(AsyncWebServerRequest* request); AsyncWebServer* _server; - bool _performReload = false; + + Task _applyDataTask; + void applyDataTaskCb(); }; diff --git a/include/WebApi_eventlog.h b/include/WebApi_eventlog.h index ccc1658..3cba7e5 100644 --- a/include/WebApi_eventlog.h +++ b/include/WebApi_eventlog.h @@ -2,14 +2,14 @@ #pragma once #include +#include class WebApiEventlogClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onEventlogStatus(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_firmware.h b/include/WebApi_firmware.h index 1b7e923..fd9a964 100644 --- a/include/WebApi_firmware.h +++ b/include/WebApi_firmware.h @@ -2,15 +2,15 @@ #pragma once #include +#include class WebApiFirmwareClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onFirmwareUpdateFinish(AsyncWebServerRequest* request); void onFirmwareUpdateUpload(AsyncWebServerRequest* request, String filename, size_t index, uint8_t* data, size_t len, bool final); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_gridprofile.h b/include/WebApi_gridprofile.h index 8781659..73c1565 100644 --- a/include/WebApi_gridprofile.h +++ b/include/WebApi_gridprofile.h @@ -2,15 +2,15 @@ #pragma once #include +#include class WebApiGridProfileClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onGridProfileStatus(AsyncWebServerRequest* request); void onGridProfileRawdata(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_inverter.h b/include/WebApi_inverter.h index a860515..b8f0542 100644 --- a/include/WebApi_inverter.h +++ b/include/WebApi_inverter.h @@ -2,11 +2,11 @@ #pragma once #include +#include class WebApiInverterClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onInverterList(AsyncWebServerRequest* request); @@ -16,4 +16,4 @@ private: void onInverterOrder(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_limit.h b/include/WebApi_limit.h index c2d1a7d..84d48d3 100644 --- a/include/WebApi_limit.h +++ b/include/WebApi_limit.h @@ -2,15 +2,15 @@ #pragma once #include +#include class WebApiLimitClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onLimitStatus(AsyncWebServerRequest* request); void onLimitPost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_maintenance.h b/include/WebApi_maintenance.h index db6dcf1..02dc470 100644 --- a/include/WebApi_maintenance.h +++ b/include/WebApi_maintenance.h @@ -2,14 +2,14 @@ #pragma once #include +#include class WebApiMaintenanceClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onRebootPost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_mqtt.h b/include/WebApi_mqtt.h index 00a2b0b..6ec971c 100644 --- a/include/WebApi_mqtt.h +++ b/include/WebApi_mqtt.h @@ -2,13 +2,13 @@ #pragma once #include +#include #define MQTT_JSON_DOC_SIZE 10240 class WebApiMqttClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onMqttStatus(AsyncWebServerRequest* request); @@ -17,4 +17,4 @@ private: String getTlsCertInfo(const char* cert); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_network.h b/include/WebApi_network.h index 47ef8d9..7587bbb 100644 --- a/include/WebApi_network.h +++ b/include/WebApi_network.h @@ -2,11 +2,11 @@ #pragma once #include +#include class WebApiNetworkClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onNetworkStatus(AsyncWebServerRequest* request); @@ -14,4 +14,4 @@ private: void onNetworkAdminPost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_ntp.h b/include/WebApi_ntp.h index 153aeee..75e02c5 100644 --- a/include/WebApi_ntp.h +++ b/include/WebApi_ntp.h @@ -2,11 +2,11 @@ #pragma once #include +#include class WebApiNtpClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onNtpStatus(AsyncWebServerRequest* request); @@ -16,4 +16,4 @@ private: void onNtpTimePost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_power.h b/include/WebApi_power.h index faed5c4..7d186eb 100644 --- a/include/WebApi_power.h +++ b/include/WebApi_power.h @@ -2,15 +2,15 @@ #pragma once #include +#include class WebApiPowerClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onPowerStatus(AsyncWebServerRequest* request); void onPowerPost(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_prometheus.h b/include/WebApi_prometheus.h index 9fbf6e2..08e2221 100644 --- a/include/WebApi_prometheus.h +++ b/include/WebApi_prometheus.h @@ -3,12 +3,12 @@ #include #include +#include #include class WebApiPrometheusClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onPrometheusMetricsGet(AsyncWebServerRequest* request); @@ -47,4 +47,4 @@ private: { FLD_EFF, MetricType_t::GAUGE }, { FLD_IRR, MetricType_t::GAUGE }, }; -}; \ No newline at end of file +}; diff --git a/include/WebApi_security.h b/include/WebApi_security.h index 66e9210..b5981e3 100644 --- a/include/WebApi_security.h +++ b/include/WebApi_security.h @@ -2,11 +2,11 @@ #pragma once #include +#include class WebApiSecurityClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onSecurityGet(AsyncWebServerRequest* request); @@ -15,4 +15,4 @@ private: void onAuthenticateGet(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_sysstatus.h b/include/WebApi_sysstatus.h index f63edd2..32bdc7e 100644 --- a/include/WebApi_sysstatus.h +++ b/include/WebApi_sysstatus.h @@ -2,14 +2,14 @@ #pragma once #include +#include class WebApiSysstatusClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void onSystemStatus(AsyncWebServerRequest* request); AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_webapp.h b/include/WebApi_webapp.h index da50d96..401408c 100644 --- a/include/WebApi_webapp.h +++ b/include/WebApi_webapp.h @@ -2,12 +2,12 @@ #pragma once #include +#include class WebApiWebappClass { public: - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: AsyncWebServer* _server; -}; \ No newline at end of file +}; diff --git a/include/WebApi_ws_console.h b/include/WebApi_ws_console.h index 4eea2c6..4289afd 100644 --- a/include/WebApi_ws_console.h +++ b/include/WebApi_ws_console.h @@ -1,17 +1,18 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -#pragma once - -#include - -class WebApiWsConsoleClass { -public: - WebApiWsConsoleClass(); - void init(AsyncWebServer& server); - void loop(); - -private: - AsyncWebServer* _server; - AsyncWebSocket _ws; - - uint32_t _lastWsCleanup = 0; -}; \ No newline at end of file +// SPDX-License-Identifier: GPL-2.0-or-later +#pragma once + +#include +#include + +class WebApiWsConsoleClass { +public: + WebApiWsConsoleClass(); + void init(AsyncWebServer& server, Scheduler& scheduler); + +private: + AsyncWebServer* _server; + AsyncWebSocket _ws; + + Task _wsCleanupTask; + void wsCleanupTaskCb(); +}; diff --git a/include/WebApi_ws_live.h b/include/WebApi_ws_live.h index 37c7fbd..68dfec4 100644 --- a/include/WebApi_ws_live.h +++ b/include/WebApi_ws_live.h @@ -4,12 +4,12 @@ #include #include #include +#include class WebApiWsLiveClass { public: WebApiWsLiveClass(); - void init(AsyncWebServer& server); - void loop(); + void init(AsyncWebServer& server, Scheduler& scheduler); private: void generateJsonResponse(JsonVariant& root); @@ -22,9 +22,13 @@ private: AsyncWebSocket _ws; uint32_t _lastWsPublish = 0; - uint32_t _lastInvUpdateCheck = 0; - uint32_t _lastWsCleanup = 0; uint32_t _newestInverterTimestamp = 0; std::mutex _mutex; -}; \ No newline at end of file + + Task _wsCleanupTask; + void wsCleanupTaskCb(); + + Task _sendDataTask; + void sendDataTaskCb(); +}; diff --git a/src/WebApi.cpp b/src/WebApi.cpp index b50d320..4080992 100644 --- a/src/WebApi.cpp +++ b/src/WebApi.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi.h" #include "Configuration.h" @@ -14,56 +14,28 @@ WebApiClass::WebApiClass() void WebApiClass::init(Scheduler& scheduler) { - _webApiConfig.init(_server); - _webApiDevice.init(_server); - _webApiDevInfo.init(_server); - _webApiDtu.init(_server); - _webApiEventlog.init(_server); - _webApiFirmware.init(_server); - _webApiGridprofile.init(_server); - _webApiInverter.init(_server); - _webApiLimit.init(_server); - _webApiMaintenance.init(_server); - _webApiMqtt.init(_server); - _webApiNetwork.init(_server); - _webApiNtp.init(_server); - _webApiPower.init(_server); - _webApiPrometheus.init(_server); - _webApiSecurity.init(_server); - _webApiSysstatus.init(_server); - _webApiWebapp.init(_server); - _webApiWsConsole.init(_server); - _webApiWsLive.init(_server); + _webApiConfig.init(_server, scheduler); + _webApiDevice.init(_server, scheduler); + _webApiDevInfo.init(_server, scheduler); + _webApiDtu.init(_server, scheduler); + _webApiEventlog.init(_server, scheduler); + _webApiFirmware.init(_server, scheduler); + _webApiGridprofile.init(_server, scheduler); + _webApiInverter.init(_server, scheduler); + _webApiLimit.init(_server, scheduler); + _webApiMaintenance.init(_server, scheduler); + _webApiMqtt.init(_server, scheduler); + _webApiNetwork.init(_server, scheduler); + _webApiNtp.init(_server, scheduler); + _webApiPower.init(_server, scheduler); + _webApiPrometheus.init(_server, scheduler); + _webApiSecurity.init(_server, scheduler); + _webApiSysstatus.init(_server, scheduler); + _webApiWebapp.init(_server, scheduler); + _webApiWsConsole.init(_server, scheduler); + _webApiWsLive.init(_server, scheduler); _server.begin(); - - scheduler.addTask(_loopTask); - _loopTask.setCallback(std::bind(&WebApiClass::loop, this)); - _loopTask.setIterations(TASK_FOREVER); - _loopTask.enable(); -} - -void WebApiClass::loop() -{ - _webApiConfig.loop(); - _webApiDevice.loop(); - _webApiDevInfo.loop(); - _webApiDtu.loop(); - _webApiEventlog.loop(); - _webApiFirmware.loop(); - _webApiGridprofile.loop(); - _webApiInverter.loop(); - _webApiLimit.loop(); - _webApiMaintenance.loop(); - _webApiMqtt.loop(); - _webApiNetwork.loop(); - _webApiNtp.loop(); - _webApiPower.loop(); - _webApiSecurity.loop(); - _webApiSysstatus.loop(); - _webApiWebapp.loop(); - _webApiWsConsole.loop(); - _webApiWsLive.loop(); } bool WebApiClass::checkCredentials(AsyncWebServerRequest* request) @@ -113,4 +85,4 @@ void WebApiClass::writeConfig(JsonVariant& retMsg, const WebApiError code, const } } -WebApiClass WebApi; \ No newline at end of file +WebApiClass WebApi; diff --git a/src/WebApi_config.cpp b/src/WebApi_config.cpp index 73df1e3..3372e4f 100644 --- a/src/WebApi_config.cpp +++ b/src/WebApi_config.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_config.h" #include "Configuration.h" @@ -10,7 +10,7 @@ #include #include -void WebApiConfigClass::init(AsyncWebServer& server) +void WebApiConfigClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; using std::placeholders::_2; @@ -29,10 +29,6 @@ void WebApiConfigClass::init(AsyncWebServer& server) std::bind(&WebApiConfigClass::onConfigUpload, this, _1, _2, _3, _4, _5, _6)); } -void WebApiConfigClass::loop() -{ -} - void WebApiConfigClass::onConfigGet(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -186,4 +182,4 @@ void WebApiConfigClass::onConfigUpload(AsyncWebServerRequest* request, String fi // close the file handle as the upload is now done request->_tempFile.close(); } -} \ No newline at end of file +} diff --git a/src/WebApi_device.cpp b/src/WebApi_device.cpp index ff934e8..5f43b37 100644 --- a/src/WebApi_device.cpp +++ b/src/WebApi_device.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_device.h" #include "Configuration.h" @@ -12,7 +12,7 @@ #include "helper.h" #include -void WebApiDeviceClass::init(AsyncWebServer& server) +void WebApiDeviceClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -22,10 +22,6 @@ void WebApiDeviceClass::init(AsyncWebServer& server) _server->on("/api/device/config", HTTP_POST, std::bind(&WebApiDeviceClass::onDeviceAdminPost, this, _1)); } -void WebApiDeviceClass::loop() -{ -} - void WebApiDeviceClass::onDeviceAdminGet(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { diff --git a/src/WebApi_devinfo.cpp b/src/WebApi_devinfo.cpp index 07ed081..a27cb31 100644 --- a/src/WebApi_devinfo.cpp +++ b/src/WebApi_devinfo.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_devinfo.h" #include "WebApi.h" @@ -8,7 +8,7 @@ #include #include -void WebApiDevInfoClass::init(AsyncWebServer& server) +void WebApiDevInfoClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -17,10 +17,6 @@ void WebApiDevInfoClass::init(AsyncWebServer& server) _server->on("/api/devinfo/status", HTTP_GET, std::bind(&WebApiDevInfoClass::onDevInfoStatus, this, _1)); } -void WebApiDevInfoClass::loop() -{ -} - void WebApiDevInfoClass::onDevInfoStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { diff --git a/src/WebApi_dtu.cpp b/src/WebApi_dtu.cpp index a9828a1..d2100ad 100644 --- a/src/WebApi_dtu.cpp +++ b/src/WebApi_dtu.cpp @@ -9,7 +9,7 @@ #include #include -void WebApiDtuClass::init(AsyncWebServer& server) +void WebApiDtuClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -17,22 +17,23 @@ void WebApiDtuClass::init(AsyncWebServer& server) _server->on("/api/dtu/config", HTTP_GET, std::bind(&WebApiDtuClass::onDtuAdminGet, this, _1)); _server->on("/api/dtu/config", HTTP_POST, std::bind(&WebApiDtuClass::onDtuAdminPost, this, _1)); + + scheduler.addTask(_applyDataTask); + _applyDataTask.setCallback(std::bind(&WebApiDtuClass::applyDataTaskCb, this)); + _applyDataTask.setIterations(TASK_ONCE); } -void WebApiDtuClass::loop() +void WebApiDtuClass::applyDataTaskCb() { - if (_performReload) { - // Execute stuff in main thread to avoid busy SPI bus - CONFIG_T& config = Configuration.get(); - Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel); - Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel); - Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial); - Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial); - Hoymiles.getRadioCmt()->setCountryMode(static_cast(config.Dtu.Cmt.CountryMode)); - Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency); - Hoymiles.setPollInterval(config.Dtu.PollInterval); - _performReload = false; - } + // Execute stuff in main thread to avoid busy SPI bus + CONFIG_T& config = Configuration.get(); + Hoymiles.getRadioNrf()->setPALevel((rf24_pa_dbm_e)config.Dtu.Nrf.PaLevel); + Hoymiles.getRadioCmt()->setPALevel(config.Dtu.Cmt.PaLevel); + Hoymiles.getRadioNrf()->setDtuSerial(config.Dtu.Serial); + Hoymiles.getRadioCmt()->setDtuSerial(config.Dtu.Serial); + Hoymiles.getRadioCmt()->setCountryMode(static_cast(config.Dtu.Cmt.CountryMode)); + Hoymiles.getRadioCmt()->setInverterTargetFrequency(config.Dtu.Cmt.Frequency); + Hoymiles.setPollInterval(config.Dtu.PollInterval); } void WebApiDtuClass::onDtuAdminGet(AsyncWebServerRequest* request) @@ -196,5 +197,5 @@ void WebApiDtuClass::onDtuAdminPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); - _performReload = true; + _applyDataTask.enable(); } diff --git a/src/WebApi_eventlog.cpp b/src/WebApi_eventlog.cpp index 0551978..a92e515 100644 --- a/src/WebApi_eventlog.cpp +++ b/src/WebApi_eventlog.cpp @@ -1,13 +1,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_eventlog.h" #include "WebApi.h" #include #include -void WebApiEventlogClass::init(AsyncWebServer& server) +void WebApiEventlogClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -16,10 +16,6 @@ void WebApiEventlogClass::init(AsyncWebServer& server) _server->on("/api/eventlog/status", HTTP_GET, std::bind(&WebApiEventlogClass::onEventlogStatus, this, _1)); } -void WebApiEventlogClass::loop() -{ -} - void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -70,4 +66,4 @@ void WebApiEventlogClass::onEventlogStatus(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_firmware.cpp b/src/WebApi_firmware.cpp index cbc4d77..617fca0 100644 --- a/src/WebApi_firmware.cpp +++ b/src/WebApi_firmware.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_firmware.h" #include "Configuration.h" @@ -10,7 +10,7 @@ #include "helper.h" #include -void WebApiFirmwareClass::init(AsyncWebServer& server) +void WebApiFirmwareClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; using std::placeholders::_2; @@ -26,10 +26,6 @@ void WebApiFirmwareClass::init(AsyncWebServer& server) std::bind(&WebApiFirmwareClass::onFirmwareUpdateUpload, this, _1, _2, _3, _4, _5, _6)); } -void WebApiFirmwareClass::loop() -{ -} - void WebApiFirmwareClass::onFirmwareUpdateFinish(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -83,4 +79,4 @@ void WebApiFirmwareClass::onFirmwareUpdateUpload(AsyncWebServerRequest* request, } else { return; } -} \ No newline at end of file +} diff --git a/src/WebApi_gridprofile.cpp b/src/WebApi_gridprofile.cpp index a5793e7..587f464 100644 --- a/src/WebApi_gridprofile.cpp +++ b/src/WebApi_gridprofile.cpp @@ -1,13 +1,13 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_gridprofile.h" #include "WebApi.h" #include #include -void WebApiGridProfileClass::init(AsyncWebServer& server) +void WebApiGridProfileClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -17,10 +17,6 @@ void WebApiGridProfileClass::init(AsyncWebServer& server) _server->on("/api/gridprofile/rawdata", HTTP_GET, std::bind(&WebApiGridProfileClass::onGridProfileRawdata, this, _1)); } -void WebApiGridProfileClass::loop() -{ -} - void WebApiGridProfileClass::onGridProfileStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -91,4 +87,4 @@ void WebApiGridProfileClass::onGridProfileRawdata(AsyncWebServerRequest* request response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_inverter.cpp b/src/WebApi_inverter.cpp index 7538b2c..f1bfc2a 100644 --- a/src/WebApi_inverter.cpp +++ b/src/WebApi_inverter.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_inverter.h" #include "Configuration.h" @@ -12,7 +12,7 @@ #include #include -void WebApiInverterClass::init(AsyncWebServer& server) +void WebApiInverterClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -25,10 +25,6 @@ void WebApiInverterClass::init(AsyncWebServer& server) _server->on("/api/inverter/order", HTTP_POST, std::bind(&WebApiInverterClass::onInverterOrder, this, _1)); } -void WebApiInverterClass::loop() -{ -} - void WebApiInverterClass::onInverterList(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -460,4 +456,4 @@ void WebApiInverterClass::onInverterOrder(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_limit.cpp b/src/WebApi_limit.cpp index 8bf0c94..be8e120 100644 --- a/src/WebApi_limit.cpp +++ b/src/WebApi_limit.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_limit.h" #include "WebApi.h" @@ -10,7 +10,7 @@ #include #include -void WebApiLimitClass::init(AsyncWebServer& server) +void WebApiLimitClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -20,10 +20,6 @@ void WebApiLimitClass::init(AsyncWebServer& server) _server->on("/api/limit/config", HTTP_POST, std::bind(&WebApiLimitClass::onLimitPost, this, _1)); } -void WebApiLimitClass::loop() -{ -} - void WebApiLimitClass::onLimitStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -156,4 +152,4 @@ void WebApiLimitClass::onLimitPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_maintenance.cpp b/src/WebApi_maintenance.cpp index 0c62394..922b0ba 100644 --- a/src/WebApi_maintenance.cpp +++ b/src/WebApi_maintenance.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_maintenance.h" @@ -9,7 +9,7 @@ #include "WebApi_errors.h" #include -void WebApiMaintenanceClass::init(AsyncWebServer& server) +void WebApiMaintenanceClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -18,10 +18,6 @@ void WebApiMaintenanceClass::init(AsyncWebServer& server) _server->on("/api/maintenance/reboot", HTTP_POST, std::bind(&WebApiMaintenanceClass::onRebootPost, this, _1)); } -void WebApiMaintenanceClass::loop() -{ -} - void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -84,4 +80,4 @@ void WebApiMaintenanceClass::onRebootPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); } -} \ No newline at end of file +} diff --git a/src/WebApi_mqtt.cpp b/src/WebApi_mqtt.cpp index 32c7568..2361c44 100644 --- a/src/WebApi_mqtt.cpp +++ b/src/WebApi_mqtt.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_mqtt.h" #include "Configuration.h" @@ -11,7 +11,7 @@ #include "helper.h" #include -void WebApiMqttClass::init(AsyncWebServer& server) +void WebApiMqttClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -22,10 +22,6 @@ void WebApiMqttClass::init(AsyncWebServer& server) _server->on("/api/mqtt/config", HTTP_POST, std::bind(&WebApiMqttClass::onMqttAdminPost, this, _1)); } -void WebApiMqttClass::loop() -{ -} - void WebApiMqttClass::onMqttStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { diff --git a/src/WebApi_network.cpp b/src/WebApi_network.cpp index b95beb3..ba99805 100644 --- a/src/WebApi_network.cpp +++ b/src/WebApi_network.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_network.h" #include "Configuration.h" @@ -10,7 +10,7 @@ #include "helper.h" #include -void WebApiNetworkClass::init(AsyncWebServer& server) +void WebApiNetworkClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -21,10 +21,6 @@ void WebApiNetworkClass::init(AsyncWebServer& server) _server->on("/api/network/config", HTTP_POST, std::bind(&WebApiNetworkClass::onNetworkAdminPost, this, _1)); } -void WebApiNetworkClass::loop() -{ -} - void WebApiNetworkClass::onNetworkStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -246,4 +242,4 @@ void WebApiNetworkClass::onNetworkAdminPost(AsyncWebServerRequest* request) NetworkSettings.enableAdminMode(); NetworkSettings.applyConfig(); -} \ No newline at end of file +} diff --git a/src/WebApi_ntp.cpp b/src/WebApi_ntp.cpp index 2eb4c08..e0bcd69 100644 --- a/src/WebApi_ntp.cpp +++ b/src/WebApi_ntp.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_ntp.h" #include "Configuration.h" @@ -11,7 +11,7 @@ #include "helper.h" #include -void WebApiNtpClass::init(AsyncWebServer& server) +void WebApiNtpClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -24,10 +24,6 @@ void WebApiNtpClass::init(AsyncWebServer& server) _server->on("/api/ntp/time", HTTP_POST, std::bind(&WebApiNtpClass::onNtpTimePost, this, _1)); } -void WebApiNtpClass::loop() -{ -} - void WebApiNtpClass::onNtpStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { diff --git a/src/WebApi_power.cpp b/src/WebApi_power.cpp index 697c1e8..54fc664 100644 --- a/src/WebApi_power.cpp +++ b/src/WebApi_power.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_power.h" #include "WebApi.h" @@ -8,7 +8,7 @@ #include #include -void WebApiPowerClass::init(AsyncWebServer& server) +void WebApiPowerClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -18,10 +18,6 @@ void WebApiPowerClass::init(AsyncWebServer& server) _server->on("/api/power/config", HTTP_POST, std::bind(&WebApiPowerClass::onPowerPost, this, _1)); } -void WebApiPowerClass::loop() -{ -} - void WebApiPowerClass::onPowerStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -132,4 +128,4 @@ void WebApiPowerClass::onPowerPost(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_prometheus.cpp b/src/WebApi_prometheus.cpp index 2cbc6f5..3204b62 100644 --- a/src/WebApi_prometheus.cpp +++ b/src/WebApi_prometheus.cpp @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_prometheus.h" #include "Configuration.h" @@ -10,7 +10,7 @@ #include "WebApi.h" #include -void WebApiPrometheusClass::init(AsyncWebServer& server) +void WebApiPrometheusClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -19,10 +19,6 @@ void WebApiPrometheusClass::init(AsyncWebServer& server) _server->on("/api/prometheus/metrics", HTTP_GET, std::bind(&WebApiPrometheusClass::onPrometheusMetricsGet, this, _1)); } -void WebApiPrometheusClass::loop() -{ -} - void WebApiPrometheusClass::onPrometheusMetricsGet(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { diff --git a/src/WebApi_security.cpp b/src/WebApi_security.cpp index 8e6815d..2051968 100644 --- a/src/WebApi_security.cpp +++ b/src/WebApi_security.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_security.h" #include "Configuration.h" @@ -9,7 +9,7 @@ #include "helper.h" #include -void WebApiSecurityClass::init(AsyncWebServer& server) +void WebApiSecurityClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -20,10 +20,6 @@ void WebApiSecurityClass::init(AsyncWebServer& server) _server->on("/api/security/authenticate", HTTP_GET, std::bind(&WebApiSecurityClass::onAuthenticateGet, this, _1)); } -void WebApiSecurityClass::loop() -{ -} - void WebApiSecurityClass::onSecurityGet(AsyncWebServerRequest* request) { if (!WebApi.checkCredentials(request)) { @@ -122,4 +118,4 @@ void WebApiSecurityClass::onAuthenticateGet(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_sysstatus.cpp b/src/WebApi_sysstatus.cpp index 0221551..896e5d6 100644 --- a/src/WebApi_sysstatus.cpp +++ b/src/WebApi_sysstatus.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_sysstatus.h" #include "Configuration.h" @@ -16,7 +16,7 @@ #define AUTO_GIT_HASH "" #endif -void WebApiSysstatusClass::init(AsyncWebServer& server) +void WebApiSysstatusClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; @@ -25,10 +25,6 @@ void WebApiSysstatusClass::init(AsyncWebServer& server) _server->on("/api/system/status", HTTP_GET, std::bind(&WebApiSysstatusClass::onSystemStatus, this, _1)); } -void WebApiSysstatusClass::loop() -{ -} - void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request) { if (!WebApi.checkCredentialsReadonly(request)) { @@ -82,4 +78,4 @@ void WebApiSysstatusClass::onSystemStatus(AsyncWebServerRequest* request) response->setLength(); request->send(response); -} \ No newline at end of file +} diff --git a/src/WebApi_webapp.cpp b/src/WebApi_webapp.cpp index ea185b2..9203505 100644 --- a/src/WebApi_webapp.cpp +++ b/src/WebApi_webapp.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_webapp.h" @@ -22,7 +22,7 @@ extern const uint8_t file_site_webmanifest_end[] asm("_binary_webapp_dist_site_w #define ETAG_HTTP_HEADER_VAL "\"" AUTO_GIT_HASH "\"" // ETag value must be between quotes #endif -void WebApiWebappClass::init(AsyncWebServer& server) +void WebApiWebappClass::init(AsyncWebServer& server, Scheduler& scheduler) { _server = &server; @@ -94,7 +94,3 @@ void WebApiWebappClass::init(AsyncWebServer& server) request->send(response); }); } - -void WebApiWebappClass::loop() -{ -} diff --git a/src/WebApi_ws_console.cpp b/src/WebApi_ws_console.cpp index 5415938..4a9d87e 100644 --- a/src/WebApi_ws_console.cpp +++ b/src/WebApi_ws_console.cpp @@ -1,37 +1,39 @@ -// SPDX-License-Identifier: GPL-2.0-or-later -/* - * Copyright (C) 2022-2023 Thomas Basler and others - */ -#include "WebApi_ws_console.h" -#include "Configuration.h" -#include "MessageOutput.h" -#include "WebApi.h" -#include "defaults.h" - -WebApiWsConsoleClass::WebApiWsConsoleClass() - : _ws("/console") -{ -} - -void WebApiWsConsoleClass::init(AsyncWebServer& server) -{ - _server = &server; - _server->addHandler(&_ws); - MessageOutput.register_ws_output(&_ws); -} - -void WebApiWsConsoleClass::loop() -{ - // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients - if (millis() - _lastWsCleanup > 1000) { - _ws.cleanupClients(); - - if (Configuration.get().Security.AllowReadonly) { - _ws.setAuthentication("", ""); - } else { - _ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password); - } - - _lastWsCleanup = millis(); - } -} \ No newline at end of file +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2022-2024 Thomas Basler and others + */ +#include "WebApi_ws_console.h" +#include "Configuration.h" +#include "MessageOutput.h" +#include "WebApi.h" +#include "defaults.h" + +WebApiWsConsoleClass::WebApiWsConsoleClass() + : _ws("/console") +{ +} + +void WebApiWsConsoleClass::init(AsyncWebServer& server, Scheduler& scheduler) +{ + _server = &server; + _server->addHandler(&_ws); + MessageOutput.register_ws_output(&_ws); + + scheduler.addTask(_wsCleanupTask); + _wsCleanupTask.setCallback(std::bind(&WebApiWsConsoleClass::wsCleanupTaskCb, this)); + _wsCleanupTask.setIterations(TASK_FOREVER); + _wsCleanupTask.setInterval(1 * TASK_SECOND); + _wsCleanupTask.enable(); +} + +void WebApiWsConsoleClass::wsCleanupTaskCb() +{ + // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients + _ws.cleanupClients(); + + if (Configuration.get().Security.AllowReadonly) { + _ws.setAuthentication("", ""); + } else { + _ws.setAuthentication(AUTH_USERNAME, Configuration.get().Security.Password); + } +} diff --git a/src/WebApi_ws_live.cpp b/src/WebApi_ws_live.cpp index a64db3a..708a9a6 100644 --- a/src/WebApi_ws_live.cpp +++ b/src/WebApi_ws_live.cpp @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-or-later /* - * Copyright (C) 2022-2023 Thomas Basler and others + * Copyright (C) 2022-2024 Thomas Basler and others */ #include "WebApi_ws_live.h" #include "Configuration.h" @@ -16,7 +16,7 @@ WebApiWsLiveClass::WebApiWsLiveClass() { } -void WebApiWsLiveClass::init(AsyncWebServer& server) +void WebApiWsLiveClass::init(AsyncWebServer& server, Scheduler& scheduler) { using std::placeholders::_1; using std::placeholders::_2; @@ -30,26 +30,33 @@ void WebApiWsLiveClass::init(AsyncWebServer& server) _server->addHandler(&_ws); _ws.onEvent(std::bind(&WebApiWsLiveClass::onWebsocketEvent, this, _1, _2, _3, _4, _5, _6)); + + scheduler.addTask(_wsCleanupTask); + _wsCleanupTask.setCallback(std::bind(&WebApiWsLiveClass::wsCleanupTaskCb, this)); + _wsCleanupTask.setIterations(TASK_FOREVER); + _wsCleanupTask.setInterval(1 * TASK_SECOND); + _wsCleanupTask.enable(); + + scheduler.addTask(_sendDataTask); + _sendDataTask.setCallback(std::bind(&WebApiWsLiveClass::sendDataTaskCb, this)); + _sendDataTask.setIterations(TASK_FOREVER); + _sendDataTask.setInterval(1 * TASK_SECOND); + _sendDataTask.enable(); } -void WebApiWsLiveClass::loop() +void WebApiWsLiveClass::wsCleanupTaskCb() { // see: https://github.com/me-no-dev/ESPAsyncWebServer#limiting-the-number-of-web-socket-clients - if (millis() - _lastWsCleanup > 1000) { - _ws.cleanupClients(); - _lastWsCleanup = millis(); - } + _ws.cleanupClients(); +} +void WebApiWsLiveClass::sendDataTaskCb() +{ // do nothing if no WS client is connected if (_ws.count() == 0) { return; } - if (millis() - _lastInvUpdateCheck < 1000) { - return; - } - _lastInvUpdateCheck = millis(); - uint32_t maxTimeStamp = 0; for (uint8_t i = 0; i < Hoymiles.getNumInverters(); i++) { auto inv = Hoymiles.getInverterByPos(i); @@ -236,4 +243,4 @@ void WebApiWsLiveClass::onLivedataStatus(AsyncWebServerRequest* request) MessageOutput.printf("Unknown exception in /api/livedata/status. Reason: \"%s\".\r\n", exc.what()); WebApi.sendTooManyRequests(request); } -} \ No newline at end of file +}