From 6e77419828138bbe18971637297dbe4489e65e57 Mon Sep 17 00:00:00 2001 From: UA1ZBE Date: Wed, 22 Jul 2026 11:02:49 +0300 Subject: [PATCH] Add time s command to set RTC date/time --- src/main.cpp | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index 070e5ff..1e7e5a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -46,6 +46,18 @@ static float g_last_temperature = -127.0f; static unsigned long g_last_hall_alert = 0; static unsigned long g_last_motion_alert = 0; static const unsigned long ALERT_COOLDOWN_MS = 600000; +static uint32_t date_to_epoch(int y, int m, int d, int h, int mi) { + const uint8_t mdays[] = {31,28,31,30,31,30,31,31,30,31,30,31}; + uint32_t days = (y - 1970) * 365; + for (int i = 1970; i < y; i++) { + if ((i % 4 == 0 && i % 100 != 0) || i % 400 == 0) days++; + } + for (int i = 0; i < m - 1; i++) days += mdays[i]; + if (m > 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)) days++; + days += d - 1; + return days * 86400 + h * 3600 + mi * 60; +} + static unsigned long g_boot_time = 0; static bool g_startup_msg_sent = false; static unsigned long g_auto_status_interval = 0; @@ -150,7 +162,7 @@ public: while (*cmd == ' ') cmd++; if (strcmp(cmd, "help") == 0) { - defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,uptime,kontrol,reboot"); + defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,relay,status,ver,scan,uptime,kontrol,time,reboot"); } else if (strcmp(cmd, "ohrana on") == 0) { g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok"); } else if (strcmp(cmd, "ohrana off") == 0) { @@ -206,6 +218,19 @@ public: defer_response(r); } else defer_response("kontrol 1-1440 or off"); } + } else if (strncmp(cmd, "time", 4) == 0) { + const char* rest = cmd + 4; while (*rest == ' ') rest++; + if (strncmp(rest, "s ", 2) != 0) { defer_response("time s DD.MM.YYYY HH.MM"); return; } + rest += 2; + int d, m, y, h, mi; + if (sscanf(rest, "%d.%d.%d %d.%d", &d, &m, &y, &h, &mi) == 5) { + if (y < 2020 || y > 2099 || m < 1 || m > 12 || d < 1 || d > 31 || h > 23 || mi > 59) { + defer_response("bad date"); return; + } + rtc_clock.setCurrentTime(date_to_epoch(y, m, d, h, mi)); + char r[64]; snprintf(r, sizeof(r), "time set %02d.%02d.%04d %02d.%02d", d, m, y, h, mi); + defer_response(r); + } else defer_response("time s DD.MM.YYYY HH.MM"); } else if (strcmp(cmd, "reboot") == 0) { send_text("rebooting"); delay(100);