Add time s command to set RTC date/time
This commit is contained in:
27
src/main.cpp
27
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_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);
|
||||||
|
|||||||
Reference in New Issue
Block a user