Add 5s deferred response for commands
This commit is contained in:
43
src/main.cpp
43
src/main.cpp
@@ -96,6 +96,24 @@ public:
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char pending_response[256];
|
||||||
|
unsigned long pending_at = 0;
|
||||||
|
bool pending = false;
|
||||||
|
|
||||||
|
void flush_response() {
|
||||||
|
if (pending && millis() >= pending_at) {
|
||||||
|
send_text(pending_response);
|
||||||
|
pending = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void defer_response(const char* text) {
|
||||||
|
strncpy(pending_response, text, sizeof(pending_response) - 1);
|
||||||
|
pending_response[sizeof(pending_response) - 1] = 0;
|
||||||
|
pending_at = millis() + 5000;
|
||||||
|
pending = true;
|
||||||
|
}
|
||||||
|
|
||||||
void send_text(const char* text) {
|
void send_text(const char* text) {
|
||||||
if (!channel_ready) return;
|
if (!channel_ready) return;
|
||||||
uint32_t ts = rtc_clock.getCurrentTime();
|
uint32_t ts = rtc_clock.getCurrentTime();
|
||||||
@@ -130,31 +148,31 @@ public:
|
|||||||
while (*cmd == ' ') cmd++;
|
while (*cmd == ' ') cmd++;
|
||||||
|
|
||||||
if (strcmp(cmd, "help") == 0) {
|
if (strcmp(cmd, "help") == 0) {
|
||||||
send_text("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,status,ver,scan,security_conf");
|
defer_response("help:ohrana on,ohrana off,relay1 on,relay1 off,relay2 on,relay2 off,status,ver,scan,security_conf");
|
||||||
} else if (strcmp(cmd, "ohrana on") == 0) {
|
} else if (strcmp(cmd, "ohrana on") == 0) {
|
||||||
g_armed = true; digitalWrite(PIN_RELAY_1, LOW); saveSecurityConfig(); send_text("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) {
|
||||||
g_armed = false; digitalWrite(PIN_RELAY_1, HIGH); saveSecurityConfig(); send_text("ohrana off ok");
|
g_armed = false; digitalWrite(PIN_RELAY_1, HIGH); saveSecurityConfig(); defer_response("ohrana off ok");
|
||||||
} else if (strcmp(cmd, "relay1 on") == 0) {
|
} else if (strcmp(cmd, "relay1 on") == 0) {
|
||||||
digitalWrite(PIN_RELAY_1, LOW); send_text("relay1 on ok");
|
digitalWrite(PIN_RELAY_1, LOW); defer_response("relay1 on ok");
|
||||||
} else if (strcmp(cmd, "relay1 off") == 0) {
|
} else if (strcmp(cmd, "relay1 off") == 0) {
|
||||||
digitalWrite(PIN_RELAY_1, HIGH); send_text("relay1 off ok");
|
digitalWrite(PIN_RELAY_1, HIGH); defer_response("relay1 off ok");
|
||||||
} else if (strcmp(cmd, "relay2 on") == 0) {
|
} else if (strcmp(cmd, "relay2 on") == 0) {
|
||||||
g_relay2_state = true; digitalWrite(PIN_RELAY_2, LOW); send_text("relay2 on ok");
|
g_relay2_state = true; digitalWrite(PIN_RELAY_2, LOW); defer_response("relay2 on ok");
|
||||||
} else if (strcmp(cmd, "relay2 off") == 0) {
|
} else if (strcmp(cmd, "relay2 off") == 0) {
|
||||||
g_relay2_state = false; digitalWrite(PIN_RELAY_2, HIGH); send_text("relay2 off ok");
|
g_relay2_state = false; digitalWrite(PIN_RELAY_2, HIGH); defer_response("relay2 off ok");
|
||||||
} else if (strcmp(cmd, "status") == 0) {
|
} else if (strcmp(cmd, "status") == 0) {
|
||||||
char r[128]; char tb[16]; float t = g_last_temperature;
|
char r[128]; char tb[16]; float t = g_last_temperature;
|
||||||
if (t == -127.0f) strcpy(tb, "N/A"); else snprintf(tb, sizeof(tb), "%+.1fC", t);
|
if (t == -127.0f) strcpy(tb, "N/A"); else snprintf(tb, sizeof(tb), "%+.1fC", t);
|
||||||
snprintf(r, sizeof(r), "status:%s temp:%s hall:%s motion:%s",
|
snprintf(r, sizeof(r), "status:%s temp:%s hall:%s motion:%s",
|
||||||
g_armed ? "armed" : "off", tb, g_hall_alert ? "trig" : "ok", g_motion_alert ? "trig" : "ok");
|
g_armed ? "armed" : "off", tb, g_hall_alert ? "trig" : "ok", g_motion_alert ? "trig" : "ok");
|
||||||
send_text(r);
|
defer_response(r);
|
||||||
} else if (strcmp(cmd, "ver") == 0) {
|
} else if (strcmp(cmd, "ver") == 0) {
|
||||||
char r[64]; snprintf(r, sizeof(r), "build:%s %s", __DATE__, __TIME__); send_text(r);
|
char r[64]; snprintf(r, sizeof(r), "build:%s %s", __DATE__, __TIME__); defer_response(r);
|
||||||
} else if (strcmp(cmd, "scan") == 0) {
|
} else if (strcmp(cmd, "scan") == 0) {
|
||||||
float sum = 0;
|
float sum = 0;
|
||||||
for (int j = 0; j < 20; j++) { sum += radio_driver.getCurrentRSSI(); delay(50); }
|
for (int j = 0; j < 20; j++) { sum += radio_driver.getCurrentRSSI(); delay(50); }
|
||||||
char r[32]; snprintf(r, sizeof(r), "noise:%.0fdBm", sum / 20); send_text(r);
|
char r[32]; snprintf(r, sizeof(r), "noise:%.0fdBm", sum / 20); defer_response(r);
|
||||||
} else if (strncmp(cmd, "security_conf", 13) == 0) {
|
} else if (strncmp(cmd, "security_conf", 13) == 0) {
|
||||||
const char* nc = cmd + 13; while (*nc == ' ') nc++;
|
const char* nc = cmd + 13; while (*nc == ' ') nc++;
|
||||||
if (strlen(nc) > 0 && strlen(nc) < 32) {
|
if (strlen(nc) > 0 && strlen(nc) < 32) {
|
||||||
@@ -163,8 +181,8 @@ public:
|
|||||||
memset(mesh_channel.secret, 0, 32);
|
memset(mesh_channel.secret, 0, 32);
|
||||||
memcpy(mesh_channel.secret, key, 16);
|
memcpy(mesh_channel.secret, key, 16);
|
||||||
mesh::Utils::sha256(mesh_channel.hash, sizeof(mesh_channel.hash), mesh_channel.secret, 16);
|
mesh::Utils::sha256(mesh_channel.hash, sizeof(mesh_channel.hash), mesh_channel.secret, 16);
|
||||||
char r[64]; snprintf(r, sizeof(r), "channel:%s", nc); send_text(r);
|
char r[64]; snprintf(r, sizeof(r), "channel:%s", nc); defer_response(r);
|
||||||
} else send_text("bad name");
|
} else defer_response("bad name");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -221,6 +239,7 @@ void setup() {
|
|||||||
void loop() {
|
void loop() {
|
||||||
NRF_WDT->RR[0] = WDT_RR_RR_Reload;
|
NRF_WDT->RR[0] = WDT_RR_RR_Reload;
|
||||||
the_mesh.loop();
|
the_mesh.loop();
|
||||||
|
the_mesh.flush_response();
|
||||||
rtc_clock.tick();
|
rtc_clock.tick();
|
||||||
|
|
||||||
if (!g_startup_msg_sent && millis() - g_boot_time >= 10000) {
|
if (!g_startup_msg_sent && millis() - g_boot_time >= 10000) {
|
||||||
|
|||||||
Reference in New Issue
Block a user