Add time command (query), update docs

This commit is contained in:
UA1ZBE
2026-07-22 11:12:54 +03:00
parent 99e684dd4f
commit c754bfb7f8
4 changed files with 29 additions and 0 deletions

View File

@@ -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

View File

@@ -35,6 +35,7 @@ LoRa mesh-устройство охраны на базе nRF52840 (ProMicro) и
| `kontrol <min>` | Автоотправка статуса каждые N мин |
| `kontrol off` | Отключить автоотправку |
| `reboot` | Перезагрузить устройство |
| `time` | Показать дату/время |
| `time s DD.MM.YYYY HH.MM` | Установить дату/время |
| `help` | Список команд |

View File

@@ -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).

View File

@@ -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;