Add time command (query), update docs
This commit is contained in:
@@ -120,6 +120,7 @@ All commands are processed in `onGroupDataRecv()`:
|
||||
| `kontrol <min>` | 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
|
||||
|
||||
@@ -35,6 +35,7 @@ LoRa mesh-устройство охраны на базе nRF52840 (ProMicro) и
|
||||
| `kontrol <min>` | Автоотправка статуса каждые N мин |
|
||||
| `kontrol off` | Отключить автоотправку |
|
||||
| `reboot` | Перезагрузить устройство |
|
||||
| `time` | Показать дату/время |
|
||||
| `time s DD.MM.YYYY HH.MM` | Установить дату/время |
|
||||
| `help` | Список команд |
|
||||
|
||||
|
||||
@@ -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).
|
||||
|
||||
|
||||
25
src/main.cpp
25
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;
|
||||
|
||||
Reference in New Issue
Block a user