From 34cafe0d4d09a66a7ba72f83b6a4588985c98dbf Mon Sep 17 00:00:00 2001 From: proddy Date: Fri, 26 Jan 2024 23:01:44 +0100 Subject: [PATCH] minor refactor moving scheduler item list loading once --- src/web/WebSchedulerService.cpp | 50 ++++++++++++++++++++------------- src/web/WebSchedulerService.h | 2 +- 2 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index bd2b6cb9a..d45c31b07 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -17,6 +17,7 @@ */ #include "emsesp.h" +#include "WebSchedulerService.h" namespace emsesp { @@ -30,6 +31,13 @@ WebSchedulerService::WebSchedulerService(AsyncWebServer * server, FS * fs, Secur // load the settings when the service starts void WebSchedulerService::begin() { _fsPersistence.readFromFS(); + + // save a local pointer to the scheduler item list + EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { + // + scheduleItems_ = &webScheduler.scheduleItems; + }); + EMSESP::logger().info("Starting Scheduler service"); Mqtt::subscribe(EMSdevice::DeviceType::SCHEDULER, "scheduler/#", nullptr); // use empty function callback } @@ -92,7 +100,9 @@ StateUpdateResult WebScheduler::update(JsonObject root, WebScheduler & webSchedu } } } + EMSESP::webSchedulerService.publish(true); + return StateUpdateResult::CHANGED; } @@ -103,17 +113,19 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string return false; } - EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); - for (ScheduleItem & scheduleItem : *scheduleItems) { + for (ScheduleItem & scheduleItem : *scheduleItems_) { if (scheduleItem.name == name) { if (scheduleItem.active == v) { return true; } + scheduleItem.active = v; publish_single(name.c_str(), v); + if (EMSESP::mqtt_.get_publish_onchange(0)) { publish(); } + return true; } } @@ -122,25 +134,26 @@ bool WebSchedulerService::command_setvalue(const char * value, const std::string // process json output for info/commands and value_info bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { - EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); if (Helpers::toLower(cmd) == F_(commands)) { output[F_(info)] = Helpers::translated_word(FL_(info_cmd)); output[F_(commands)] = Helpers::translated_word(FL_(commands_cmd)); - for (const ScheduleItem & scheduleItem : *scheduleItems) { + + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (!scheduleItem.name.empty()) { output[scheduleItem.name] = "activate schedule"; } } + return true; } - if (scheduleItems->size() == 0) { + if (scheduleItems_->size() == 0) { return true; } if (strlen(cmd) == 0 || Helpers::toLower(cmd) == F_(values) || Helpers::toLower(cmd) == F_(info)) { // list all names - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (!scheduleItem.name.empty()) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { output[scheduleItem.name] = scheduleItem.active; @@ -152,6 +165,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { } } } + return (output.size() > 0); } @@ -166,7 +180,7 @@ bool WebSchedulerService::get_value_info(JsonObject output, const char * cmd) { attribute_s = breakp + 1; } - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (Helpers::toLower(scheduleItem.name) == Helpers::toLower(command_s)) { output["name"] = scheduleItem.name; output["type"] = "boolean"; @@ -227,20 +241,19 @@ void WebSchedulerService::publish(const bool force) { return; } - EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); - if (scheduleItems->size() == 0) { + if (scheduleItems_->size() == 0) { return; } if (Mqtt::publish_single() && force) { - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { publish_single(scheduleItem.name.c_str(), scheduleItem.active); } } JsonDocument doc; bool ha_created = ha_registered_; - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (!scheduleItem.name.empty() && !doc.containsKey(scheduleItem.name)) { if (EMSESP::system_.bool_format() == BOOL_FORMAT_TRUEFALSE) { doc[scheduleItem.name] = scheduleItem.active; @@ -303,16 +316,16 @@ void WebSchedulerService::publish(const bool force) { } bool WebSchedulerService::has_commands() { - EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); - if (scheduleItems->size() == 0) { + if (scheduleItems_->size() == 0) { return false; } - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (!scheduleItem.name.empty()) { return true; } } + return false; } @@ -364,14 +377,13 @@ void WebSchedulerService::loop() { static uint32_t last_uptime_min = 0; // get list of scheduler events and exit if it's empty - EMSESP::webSchedulerService.read([&](WebScheduler & webScheduler) { scheduleItems = &webScheduler.scheduleItems; }); - if (scheduleItems->size() == 0) { + if (scheduleItems_->size() == 0) { return; } // check startup commands if (last_tm_min == -1) { - for (ScheduleItem & scheduleItem : *scheduleItems) { + for (ScheduleItem & scheduleItem : *scheduleItems_) { if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0) { scheduleItem.retry_cnt = command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str()) ? 0xFF : 0; } @@ -382,7 +394,7 @@ void WebSchedulerService::loop() { // check timer every minute, sync to EMS-ESP clock uint32_t uptime_min = uuid::get_uptime_sec() / 60; if (last_uptime_min != uptime_min) { - for (ScheduleItem & scheduleItem : *scheduleItems) { + for (ScheduleItem & scheduleItem : *scheduleItems_) { // retry startup commands not yet executed if (scheduleItem.active && scheduleItem.flags == SCHEDULEFLAG_SCHEDULE_TIMER && scheduleItem.elapsed_min == 0 && scheduleItem.retry_cnt < MAX_STARTUP_RETRIES) { @@ -405,7 +417,7 @@ void WebSchedulerService::loop() { uint8_t real_dow = 1 << tm->tm_wday; // 1 is Sunday uint16_t real_min = tm->tm_hour * 60 + tm->tm_min; - for (const ScheduleItem & scheduleItem : *scheduleItems) { + for (const ScheduleItem & scheduleItem : *scheduleItems_) { if (scheduleItem.active && (real_dow & scheduleItem.flags) && real_min == scheduleItem.elapsed_min) { command(scheduleItem.cmd.c_str(), scheduleItem.value.c_str()); } diff --git a/src/web/WebSchedulerService.h b/src/web/WebSchedulerService.h index cb48c58b4..4b7e87897 100644 --- a/src/web/WebSchedulerService.h +++ b/src/web/WebSchedulerService.h @@ -75,7 +75,7 @@ class WebSchedulerService : public StatefulService { HttpEndpoint _httpEndpoint; FSPersistence _fsPersistence; - std::list * scheduleItems; // pointer to the list of schedule events + std::list * scheduleItems_; // pointer to the list of schedule events bool ha_registered_ = false; };