From c754bfb7f830a78199aa97de813acb940bccbc1d Mon Sep 17 00:00:00 2001 From: UA1ZBE Date: Wed, 22 Jul 2026 11:12:54 +0300 Subject: [PATCH] Add time command (query), update docs --- INSTRUCTION.md | 1 + README.md | 1 + USER_MANUAL.md | 2 ++ src/main.cpp | 25 +++++++++++++++++++++++++ 4 files changed, 29 insertions(+) diff --git a/INSTRUCTION.md b/INSTRUCTION.md index 34143dc..78220b5 100644 --- a/INSTRUCTION.md +++ b/INSTRUCTION.md @@ -120,6 +120,7 @@ All commands are processed in `onGroupDataRecv()`: | `kontrol ` | auto-status every N min | `kontrol 60 min ok` | | `kontrol off` | disable auto-status | `kontrol off` | | `reboot` | reboot device | `rebooting` | +| `time` | show RTC date/time | `time:22.07.2026 11:00` | | `time s DD.MM.YYYY HH.MM` | set RTC date/time | `time set 22.07.2026 11.00` | ### Response Delay diff --git a/README.md b/README.md index a440ac0..0f8fbe3 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ LoRa mesh-устройство охраны на базе nRF52840 (ProMicro) и | `kontrol ` | Автоотправка статуса каждые N мин | | `kontrol off` | Отключить автоотправку | | `reboot` | Перезагрузить устройство | +| `time` | Показать дату/время | | `time s DD.MM.YYYY HH.MM` | Установить дату/время | | `help` | Список команд | diff --git a/USER_MANUAL.md b/USER_MANUAL.md index 396a8cf..48ed423 100644 --- a/USER_MANUAL.md +++ b/USER_MANUAL.md @@ -38,6 +38,7 @@ Security Node — LoRa mesh-устройство, которое следит з | `kontrol <мин>` | Автоотправка статуса каждые N мин | `kontrol 60 min ok` | | `kontrol off` | Отключить автоотправку статуса | `kontrol off` | | `reboot` | Перезагрузить устройство | `rebooting` | +| `time` | Показать дату и время | `time:22.07.2026 11:00` | | `time s DD.MM.YYYY HH.MM` | Установить дату и время | `time set 22.07.2026 11.00` | --- @@ -113,6 +114,7 @@ Security Node — LoRa mesh-устройство, которое следит з ## Синхронизация времени (`time`) +`time` — показать текущее время устройства. `time s 22.07.2026 11.00` — установить дату и время. Формат: `time s DD.MM.YYYY HH.MM` Время используется для отметок в сообщениях. После перезагрузки сбрасывается (если нет внешнего RTC). diff --git a/src/main.cpp b/src/main.cpp index 1e7e5a6..3fe7e09 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -220,6 +220,31 @@ public: } } else if (strncmp(cmd, "time", 4) == 0) { const char* rest = cmd + 4; while (*rest == ' ') rest++; + if (*rest == 0) { + uint32_t ts = rtc_clock.getCurrentTime(); + if (ts < 100000) { defer_response("time not set"); return; } + uint32_t days = ts / 86400; + int h = (ts % 86400) / 3600; + int mi = (ts % 3600) / 60; + int y = 1970; + while (true) { + int leap = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + if (days < (uint32_t)leap) break; + days -= leap; y++; + } + const uint8_t mdays[] = {31,28,31,30,31,30,31,31,30,31,30,31}; + int m; + for (m = 1; m <= 12; m++) { + int dim = mdays[m-1]; + if (m == 2 && ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0)) dim = 29; + if (days < (uint32_t)dim) break; + days -= dim; + } + char r[64]; + snprintf(r, sizeof(r), "time:%02d.%02d.%04d %02d:%02d", (int)(days + 1), m, y, h, mi); + defer_response(r); + return; + } if (strncmp(rest, "s ", 2) != 0) { defer_response("time s DD.MM.YYYY HH.MM"); return; } rest += 2; int d, m, y, h, mi;