diff --git a/src/ESPNetwork.cpp b/src/ESPNetwork.cpp index cefdc7b..60b3839 100644 --- a/src/ESPNetwork.cpp +++ b/src/ESPNetwork.cpp @@ -57,6 +57,7 @@ void ESPNetwork::end() { SSDP.end(); mqtt.end(); sockEmit.end(); + protoSocket.end(); delay(100); } bool ESPNetwork::setup() { diff --git a/src/SomfyJson.cpp b/src/SomfyJson.cpp index 881fd9a..a1d5f52 100644 --- a/src/SomfyJson.cpp +++ b/src/SomfyJson.cpp @@ -266,9 +266,11 @@ static void markEdited(const model_edit_t &edit, const edit_result_t &result) { void runModelEdit(model_edit_t *edit) { const edit_result_t result = applyModelEdit(*edit); if(!result.ok) ESP_LOGW(TAG, "Edit %u refused: %s", static_cast(edit->type), result.desc); - else markEdited(*edit, result); + // The reply first: the edit's events follow it (docs/PROTOCOL.md), so a + // client that waits for the reply doesn't read past them. if(edit->replyTo.client) protoSocket.replyEdit(edit->replyTo, edit->type, result); else emitRequestResult(edit->requestId, result); + if(result.ok) markEdited(*edit, result); cancelModelEdit(edit); } diff --git a/src/outputs/ProtoSocket.cpp b/src/outputs/ProtoSocket.cpp index 5c6afa8..34c68e0 100644 --- a/src/outputs/ProtoSocket.cpp +++ b/src/outputs/ProtoSocket.cpp @@ -415,6 +415,7 @@ void ProtoSocket::begin(AsyncWebServer &server) { ws.onEvent(ProtoSocket::wsEvent); server.addHandler(&ws); } +void ProtoSocket::end() { ws.closeAll(1001, "Restarting"); } bool ProtoSocket::hasClients() const { for(const proto_slot_t &s : slots) if(s.clientId.load()) return true; diff --git a/src/outputs/ProtoSocket.h b/src/outputs/ProtoSocket.h index ee3ca8b..b6b3c38 100644 --- a/src/outputs/ProtoSocket.h +++ b/src/outputs/ProtoSocket.h @@ -24,6 +24,9 @@ class ProtoSocket { void begin(AsyncWebServer &server); // Moves each client's sync on. loop() only. void loop(); + // Closes every client, before a reboot: a restart drops the connections + // without a word, so clients wouldn't know they had gone. + void end(); bool hasClients() const; // The reply to a command op once loop() has run its shade request. void replyRequest(const proto_reply_to_t &to, const shade_request_t &req, shade_request_result_t result);