mirror of
https://github.com/rstrouse/ESPSomfy-RTS.git
synced 2026-10-31 13:52:15 +01:00
fix: send socket events only from loop()
Every socket event is formatted into one static buffer by one shared formatter. setConnected() runs on the WiFi/Ethernet event task and sent memStatus, wifiStrength and ethernet, then ran sockEmit.loop(), while loop() could be building its own event. _safecat() checks the room and then writes at _len, so another task moving _len in between could write past the end of g_response. setConnected() now sends nothing. loop() broadcasts the status every STATUS_EMIT_MS (30 s): memStatus, then ethernet, or wifiStrength when it moved 3 dBm or changed channel. A client that connects still gets all of it at once from initClients(), so needsBroadcast and the 1.5 s tick go, and so does the 1.5 s memStatus for the config panel. SocketEmitter records loop()'s task in begin(). Off it, beginEmit() logs and hands out a formatter that writes nothing, and endEmit(), endEmitRoom() and loop() do nothing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
474c7c0f42
commit
25d548ef07
11 changed files with 153 additions and 117 deletions
|
|
@ -195,6 +195,39 @@ static void test_setBuffer_resets_length() {
|
|||
TEST_ASSERT_EQUAL_STRING("", storage);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
* discard
|
||||
********************************************************************/
|
||||
static void test_discard_writes_nothing() {
|
||||
// What a socket event built off loop() goes into. The buffer the formatter
|
||||
// had before must not see a byte of it.
|
||||
fmt.beginObject();
|
||||
fmt.addElem("kept", true);
|
||||
char before[STORAGE_SIZE];
|
||||
memcpy(before, storage, sizeof(before));
|
||||
fmt.discard();
|
||||
fmt.beginObject();
|
||||
fmt.addElem("ssid", "Home \"WiFi\"");
|
||||
fmt.addElem("strength", (int32_t)-70);
|
||||
fmt.beginArray("pulses");
|
||||
fmt.addElem((uint32_t)2416);
|
||||
fmt.endArray();
|
||||
fmt.addElem("big", (uint64_t)18446744073709551615ULL);
|
||||
fmt.endObject();
|
||||
TEST_ASSERT_EQUAL_MEMORY(before, storage, sizeof(before));
|
||||
TEST_ASSERT_EQUAL_UINT32(0, fmt.length());
|
||||
TEST_ASSERT_TRUE(fmt.overflowed());
|
||||
}
|
||||
static void test_setBuffer_after_discard_writes_again() {
|
||||
fmt.discard();
|
||||
fmt.addElem("dropped");
|
||||
useBuffer(BUFF_SIZE);
|
||||
fmt.beginObject();
|
||||
fmt.endObject();
|
||||
TEST_ASSERT_FALSE(fmt.overflowed());
|
||||
TEST_ASSERT_EQUAL_STRING("{}", storage);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
(void)argc;
|
||||
(void)argv;
|
||||
|
|
@ -216,5 +249,7 @@ int main(int argc, char **argv) {
|
|||
RUN_TEST(test_length_matches_what_was_written);
|
||||
RUN_TEST(test_refused_append_leaves_length_alone);
|
||||
RUN_TEST(test_setBuffer_resets_length);
|
||||
RUN_TEST(test_discard_writes_nothing);
|
||||
RUN_TEST(test_setBuffer_after_discard_writes_again);
|
||||
return UNITY_END();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue