Add time s command to set RTC date/time

This commit is contained in:
UA1ZBE
2026-07-22 11:02:49 +03:00
parent 166fffa2ce
commit 6e77419828

View File

@@ -46,6 +46,18 @@ static float g_last_temperature = -127.0f;
static unsigned long g_last_hall_alert = 0; static unsigned long g_last_hall_alert = 0;
static unsigned long g_last_motion_alert = 0; static unsigned long g_last_motion_alert = 0;
static const unsigned long ALERT_COOLDOWN_MS = 600000; 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 unsigned long g_boot_time = 0;
static bool g_startup_msg_sent = false; static bool g_startup_msg_sent = false;
static unsigned long g_auto_status_interval = 0; static unsigned long g_auto_status_interval = 0;
@@ -150,7 +162,7 @@ public:
while (*cmd == ' ') cmd++; while (*cmd == ' ') cmd++;
if (strcmp(cmd, "help") == 0) { 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) { } else if (strcmp(cmd, "ohrana on") == 0) {
g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok"); g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); defer_response("ohrana on ok");
} else if (strcmp(cmd, "ohrana off") == 0) { } else if (strcmp(cmd, "ohrana off") == 0) {
@@ -206,6 +218,19 @@ public:
defer_response(r); defer_response(r);
} else defer_response("kontrol 1-1440 or off"); } 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) { } else if (strcmp(cmd, "reboot") == 0) {
send_text("rebooting"); send_text("rebooting");
delay(100); delay(100);