From ac45c17204af29c56805f35d6e889ac9e0ceb2e0 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 5 Oct 2025 15:34:30 +0200 Subject: [PATCH] merge Michael's changes --- src/core/shuntingYard.cpp | 22 ++++++++++--- src/web/WebSchedulerService.cpp | 58 ++++++++++++++++----------------- 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/src/core/shuntingYard.cpp b/src/core/shuntingYard.cpp index 529622bd8..4ee8c30bf 100644 --- a/src/core/shuntingYard.cpp +++ b/src/core/shuntingYard.cpp @@ -40,7 +40,12 @@ std::deque exprToTokens(const std::string & expr) { if (*p) { ++p; } - const auto s = std::string(b, p); + auto s = std::string(b, p); + auto n = s.find("\"\""); + while (n != std::string::npos) { + s.erase(n, 2); + n = s.find("\"\""); + } tokens.emplace_back(Token::Type::String, s, -3); if (*p == '\0') { --p; @@ -333,8 +338,8 @@ bool isnum(const std::string & s) { std::string commands(std::string & expr, bool quotes) { auto expr_new = emsesp::Helpers::toLower(expr); for (uint8_t device = 0; device < emsesp::EMSdevice::DeviceType::UNKNOWN; device++) { - const char * d = emsesp::EMSdevice::device_type_2_device_name(device); - auto f = expr_new.find(d); + std::string d = (std::string)emsesp::EMSdevice::device_type_2_device_name(device) + "/"; + auto f = expr_new.find(d); while (f != std::string::npos) { // entity names are alphanumeric or _ auto e = expr_new.find_first_not_of("/._abcdefghijklmnopqrstuvwxyz0123456789", f); @@ -375,6 +380,14 @@ std::string commands(std::string & expr, bool quotes) { f = expr_new.find(d, e); } } + if (quotes) { + // remove double quotes + auto f = expr.find("\"\""); + while (f != std::string::npos) { + expr.erase(f, 2); + f = expr.find("\"\""); + } + } return expr; } @@ -416,7 +429,7 @@ std::string to_hex(uint32_t i) { // RPN calculator std::string calculate(const std::string & expr) { std::string expr_new = expr; - commands(expr_new); + // commands(expr_new); const auto tokens = exprToTokens(expr_new); // for debugging only @@ -651,6 +664,7 @@ std::string calculate(const std::string & expr) { // check for multiple instances of ? : std::string compute(const std::string & expr) { std::string expr_new = expr; + commands(expr_new); // replace ems-esp commands with values // search json with url: auto f = expr_new.find_first_of('{'); diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index bf2d07d17..a1dc97cd5 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -353,6 +353,7 @@ bool WebSchedulerService::command(const char * name, const std::string & command std::string value = doc["value"] | data.c_str(); // extract value if its in the command, or take the data std::string method = doc["method"] | "GET"; // default GET + commands(value, false); // if there is data, force a POST int httpResult = 0; if (value.length() || method == "post") { // we have all lowercase @@ -546,40 +547,37 @@ void WebSchedulerService::scheduler_task(void * pvParameters) { // hard coded tests #if defined(EMSESP_TEST) void WebSchedulerService::load_test_data() { - static bool already_added = false; - if (!already_added) { - update([&](WebScheduler & webScheduler) { - // webScheduler.scheduleItems.clear(); - // test 1 - auto si = ScheduleItem(); - si.active = true; - si.flags = 1; - si.time = "12:00"; - si.cmd = "system/fetch"; - si.value = "10"; - si.name = "test_scheduler"; - si.elapsed_min = 0; - si.retry_cnt = 0xFF; // no startup retries + update([&](WebScheduler & webScheduler) { + webScheduler.scheduleItems.clear(); // delete all existing schedules - webScheduler.scheduleItems.push_back(si); + // test 1 + auto si = ScheduleItem(); + si.active = true; + si.flags = 1; + si.time = "12:00"; + si.cmd = "system/fetch"; + si.value = "10"; + si.name = "test_scheduler"; + si.elapsed_min = 0; + si.retry_cnt = 0xFF; // no startup retries - // test 2 - si = ScheduleItem(); - si.active = false; - si.flags = 1; - si.time = "13:00"; - si.cmd = "system/message"; - si.value = "20"; - si.name = ""; // to make sure its excluded from Dashboard - si.elapsed_min = 0; - si.retry_cnt = 0xFF; // no startup retries + webScheduler.scheduleItems.push_back(si); - webScheduler.scheduleItems.push_back(si); - already_added = true; + // test 2 + si = ScheduleItem(); + si.active = false; + si.flags = 1; + si.time = "13:00"; + si.cmd = "system/message"; + si.value = "20"; + si.name = ""; // to make sure its excluded from Dashboard + si.elapsed_min = 0; + si.retry_cnt = 0xFF; // no startup retries - return StateUpdateResult::CHANGED; // persist the changes - }); - } + webScheduler.scheduleItems.push_back(si); + + return StateUpdateResult::CHANGED; // persist the changes + }); } #endif