dashboard: queue relay commands outside touch callback
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
static const char *DASHBOARD_VERSION = "0.0.11-no-overlap-polling";
|
static const char *DASHBOARD_VERSION = "0.0.12-queued-relay-commands";
|
||||||
|
|
||||||
// Update these if your Cargo ESP AP credentials are different.
|
// Update these if your Cargo ESP AP credentials are different.
|
||||||
static const char *CARGO_WIFI_SSID = "OverlandController";
|
static const char *CARGO_WIFI_SSID = "OverlandController";
|
||||||
|
|||||||
@@ -33,6 +33,12 @@ static unsigned long last_metadata_poll_ms = 0;
|
|||||||
static bool api_request_in_progress = false;
|
static bool api_request_in_progress = false;
|
||||||
static bool fast_status_refresh_requested = false;
|
static bool fast_status_refresh_requested = false;
|
||||||
|
|
||||||
|
static bool relay_command_pending = false;
|
||||||
|
static String pending_relay_id;
|
||||||
|
static bool pending_relay_state = false;
|
||||||
|
static int pending_relay_index = -1;
|
||||||
|
static bool pending_relay_previous_state = false;
|
||||||
|
|
||||||
static String last_battery_text;
|
static String last_battery_text;
|
||||||
static String last_temps_text;
|
static String last_temps_text;
|
||||||
static String last_outputs_text;
|
static String last_outputs_text;
|
||||||
@@ -53,11 +59,18 @@ static void request_fast_status_refresh()
|
|||||||
|
|
||||||
static bool post_relay_state(const String &relay_id, bool state)
|
static bool post_relay_state(const String &relay_id, bool state)
|
||||||
{
|
{
|
||||||
|
if (api_request_in_progress) {
|
||||||
|
Serial.println("Relay command skipped: API request already in progress");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (WiFi.status() != WL_CONNECTED) {
|
if (WiFi.status() != WL_CONNECTED) {
|
||||||
Serial.println("Relay command skipped: WiFi not connected");
|
Serial.println("Relay command skipped: WiFi not connected");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
api_request_in_progress = true;
|
||||||
|
|
||||||
DynamicJsonDocument request(256);
|
DynamicJsonDocument request(256);
|
||||||
request["id"] = relay_id;
|
request["id"] = relay_id;
|
||||||
request["state"] = state;
|
request["state"] = state;
|
||||||
@@ -82,6 +95,7 @@ static bool post_relay_state(const String &relay_id, bool state)
|
|||||||
Serial.println(body);
|
Serial.println(body);
|
||||||
|
|
||||||
http.end();
|
http.end();
|
||||||
|
api_request_in_progress = false;
|
||||||
|
|
||||||
return code >= 200 && code < 300;
|
return code >= 200 && code < 300;
|
||||||
}
|
}
|
||||||
@@ -100,6 +114,12 @@ static void relay_button_event_cb(lv_event_t *event)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (relay_command_pending) {
|
||||||
|
set_label_text_if_changed(system_label, last_system_text, "Relay command already pending");
|
||||||
|
Serial.println("Relay tap ignored: command already pending");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String relay_id = relay_ids[index];
|
String relay_id = relay_ids[index];
|
||||||
bool previous_state = relay_states[index];
|
bool previous_state = relay_states[index];
|
||||||
bool next_state = !previous_state;
|
bool next_state = !previous_state;
|
||||||
@@ -108,29 +128,22 @@ static void relay_button_event_cb(lv_event_t *event)
|
|||||||
update_relay_buttons();
|
update_relay_buttons();
|
||||||
update_outputs_label_from_relays();
|
update_outputs_label_from_relays();
|
||||||
|
|
||||||
String pending_text = "Sending relay command...\n";
|
pending_relay_id = relay_id;
|
||||||
|
pending_relay_state = next_state;
|
||||||
|
pending_relay_index = index;
|
||||||
|
pending_relay_previous_state = previous_state;
|
||||||
|
relay_command_pending = true;
|
||||||
|
|
||||||
|
String pending_text = "Queued relay command\n";
|
||||||
pending_text += relay_id;
|
pending_text += relay_id;
|
||||||
pending_text += " -> ";
|
pending_text += " -> ";
|
||||||
pending_text += on_off(next_state);
|
pending_text += on_off(next_state);
|
||||||
set_label_text_if_changed(system_label, last_system_text, pending_text);
|
set_label_text_if_changed(system_label, last_system_text, pending_text);
|
||||||
|
|
||||||
bool ok = post_relay_state(relay_id, next_state);
|
Serial.print("Queued relay command: ");
|
||||||
|
Serial.print(relay_id);
|
||||||
if (ok) {
|
Serial.print(" -> ");
|
||||||
String optimistic_text = "Relay command sent\n";
|
Serial.println(on_off(next_state));
|
||||||
optimistic_text += relay_id;
|
|
||||||
optimistic_text += " -> ";
|
|
||||||
optimistic_text += on_off(next_state);
|
|
||||||
optimistic_text += "\nRefreshing status...";
|
|
||||||
set_label_text_if_changed(system_label, last_system_text, optimistic_text);
|
|
||||||
|
|
||||||
request_fast_status_refresh();
|
|
||||||
} else {
|
|
||||||
relay_states[index] = previous_state;
|
|
||||||
update_relay_buttons();
|
|
||||||
update_outputs_label_from_relays();
|
|
||||||
set_label_text_if_changed(system_label, last_system_text, "Relay command failed");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -417,6 +430,52 @@ static void touch_test_event_cb(lv_event_t *event)
|
|||||||
Serial.println(touch_count);
|
Serial.println(touch_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void process_pending_relay_command()
|
||||||
|
{
|
||||||
|
if (!relay_command_pending) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (api_request_in_progress) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String relay_id = pending_relay_id;
|
||||||
|
bool next_state = pending_relay_state;
|
||||||
|
int index = pending_relay_index;
|
||||||
|
bool previous_state = pending_relay_previous_state;
|
||||||
|
|
||||||
|
String sending_text = "Sending relay command\n";
|
||||||
|
sending_text += relay_id;
|
||||||
|
sending_text += " -> ";
|
||||||
|
sending_text += on_off(next_state);
|
||||||
|
set_label_text_if_changed(system_label, last_system_text, sending_text);
|
||||||
|
|
||||||
|
bool ok = post_relay_state(relay_id, next_state);
|
||||||
|
|
||||||
|
relay_command_pending = false;
|
||||||
|
pending_relay_id = "";
|
||||||
|
pending_relay_index = -1;
|
||||||
|
|
||||||
|
if (ok) {
|
||||||
|
String sent_text = "Relay command sent\n";
|
||||||
|
sent_text += relay_id;
|
||||||
|
sent_text += " -> ";
|
||||||
|
sent_text += on_off(next_state);
|
||||||
|
sent_text += "\nRefreshing status...";
|
||||||
|
set_label_text_if_changed(system_label, last_system_text, sent_text);
|
||||||
|
request_fast_status_refresh();
|
||||||
|
} else {
|
||||||
|
if (index >= 0 && index < relay_count) {
|
||||||
|
relay_states[index] = previous_state;
|
||||||
|
update_relay_buttons();
|
||||||
|
update_outputs_label_from_relays();
|
||||||
|
}
|
||||||
|
|
||||||
|
set_label_text_if_changed(system_label, last_system_text, "Relay command failed");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void connect_wifi_if_needed()
|
static void connect_wifi_if_needed()
|
||||||
{
|
{
|
||||||
if (WiFi.status() == WL_CONNECTED) {
|
if (WiFi.status() == WL_CONNECTED) {
|
||||||
@@ -743,6 +802,7 @@ void loop()
|
|||||||
{
|
{
|
||||||
connect_wifi_if_needed();
|
connect_wifi_if_needed();
|
||||||
update_wifi_label();
|
update_wifi_label();
|
||||||
|
process_pending_relay_command();
|
||||||
poll_status_api();
|
poll_status_api();
|
||||||
|
|
||||||
delay(500);
|
delay(500);
|
||||||
|
|||||||
Reference in New Issue
Block a user