From 307e27de60c0f68b0b2145908679df8a5a1ba0e2 Mon Sep 17 00:00:00 2001 From: UA1ZBE Date: Wed, 22 Jul 2026 09:20:13 +0300 Subject: [PATCH] Add 5s deferred response for commands --- src/main.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index cd7d191..0d4bd5d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -96,6 +96,24 @@ public: return 0; } + char pending_response[256]; + unsigned long pending_at = 0; + bool pending = false; + + void flush_response() { + if (pending && millis() >= pending_at) { + send_text(pending_response); + pending = false; + } + } + + void defer_response(const char* text) { + strncpy(pending_response, text, sizeof(pending_response) - 1); + pending_response[sizeof(pending_response) - 1] = 0; + pending_at = millis() + 5000; + pending = true; + } + void send_text(const char* text) { if (!channel_ready) return; uint32_t ts = rtc_clock.getCurrentTime(); @@ -130,31 +148,31 @@ public: while (*cmd == ' ') cmd++; if (strcmp(cmd, "help") == 0) { - send_text("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,status,ver,scan,security_conf"); + defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,status,ver,scan,security_conf"); } else if (strcmp(cmd, "ohrana on") == 0) { - g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); send_text("ohrana on ok"); + g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok"); } else if (strcmp(cmd, "ohrana off") == 0) { - g_armed = false; digitalWrite(PIN_RELAY_1, HIGH); saveSecurityConfig(); send_text("ohrana off ok"); + g_armed = false; digitalWrite(PIN_RELAY_1, HIGH); saveSecurityConfig(); defer_response("ohrana off ok"); } else if (strcmp(cmd, "relay1 on") == 0) { - digitalWrite(PIN_RELAY_1, LOW); send_text("relay1 on ok"); + digitalWrite(PIN_RELAY_1, LOW); defer_response("relay1 on ok"); } else if (strcmp(cmd, "relay1 off") == 0) { - digitalWrite(PIN_RELAY_1, HIGH); send_text("relay1 off ok"); + digitalWrite(PIN_RELAY_1, HIGH); defer_response("relay1 off ok"); } else if (strcmp(cmd, "relay2 on") == 0) { - g_relay2_state = true; digitalWrite(PIN_RELAY_2, LOW); send_text("relay2 on ok"); + g_relay2_state = true; digitalWrite(PIN_RELAY_2, LOW); defer_response("relay2 on ok"); } else if (strcmp(cmd, "relay2 off") == 0) { - g_relay2_state = false; digitalWrite(PIN_RELAY_2, HIGH); send_text("relay2 off ok"); + g_relay2_state = false; digitalWrite(PIN_RELAY_2, HIGH); defer_response("relay2 off ok"); } else if (strcmp(cmd, "status") == 0) { char r[128]; char tb[16]; float t = g_last_temperature; if (t == -127.0f) strcpy(tb, "N/A"); else snprintf(tb, sizeof(tb), "%+.1fC", t); snprintf(r, sizeof(r), "status:%s temp:%s hall:%s motion:%s", g_armed ? "armed" : "off", tb, g_hall_alert ? "trig" : "ok", g_motion_alert ? "trig" : "ok"); - send_text(r); + defer_response(r); } else if (strcmp(cmd, "ver") == 0) { - char r[64]; snprintf(r, sizeof(r), "build:%s %s", __DATE__, __TIME__); send_text(r); + char r[64]; snprintf(r, sizeof(r), "build:%s %s", __DATE__, __TIME__); defer_response(r); } else if (strcmp(cmd, "scan") == 0) { float sum = 0; for (int j = 0; j < 20; j++) { sum += radio_driver.getCurrentRSSI(); delay(50); } - char r[32]; snprintf(r, sizeof(r), "noise:%.0fdBm", sum / 20); send_text(r); + char r[32]; snprintf(r, sizeof(r), "noise:%.0fdBm", sum / 20); defer_response(r); } else if (strncmp(cmd, "security_conf", 13) == 0) { const char* nc = cmd + 13; while (*nc == ' ') nc++; if (strlen(nc) > 0 && strlen(nc) < 32) { @@ -163,8 +181,8 @@ public: memset(mesh_channel.secret, 0, 32); memcpy(mesh_channel.secret, key, 16); mesh::Utils::sha256(mesh_channel.hash, sizeof(mesh_channel.hash), mesh_channel.secret, 16); - char r[64]; snprintf(r, sizeof(r), "channel:%s", nc); send_text(r); - } else send_text("bad name"); + char r[64]; snprintf(r, sizeof(r), "channel:%s", nc); defer_response(r); + } else defer_response("bad name"); } } }; @@ -221,6 +239,7 @@ void setup() { void loop() { NRF_WDT->RR[0] = WDT_RR_RR_Reload; the_mesh.loop(); + the_mesh.flush_response(); rtc_clock.tick(); if (!g_startup_msg_sent && millis() - g_boot_time >= 10000) {