mirror of
https://github.com/s00500/ESPUI.git
synced 2025-11-28 04:13:16 +00:00
Aligned with latest main branch
This commit is contained in:
@@ -2,6 +2,42 @@
|
||||
#include "ESPUIclient.h"
|
||||
#include "ESPUIcontrol.h"
|
||||
|
||||
// JSONSlave:
|
||||
// helper to process exact JSON serialization size
|
||||
// it takes ~2ms on esp8266 and avoid large String reallocation which is really worth the cost
|
||||
class JSONSlave: public Print
|
||||
{
|
||||
public:
|
||||
size_t write (uint8_t c) override { counter++; return 1; }
|
||||
size_t write (const uint8_t* buf, size_t count) override { counter += count; return count; }
|
||||
size_t get_counter () { return counter; }
|
||||
|
||||
static size_t serializedSize (JsonDocument& doc)
|
||||
{
|
||||
JSONSlave counter;
|
||||
serializeJson(doc, counter);
|
||||
return counter.get_counter();
|
||||
}
|
||||
|
||||
static size_t serialize (JsonDocument& doc, String& str)
|
||||
{
|
||||
size_t s = serializedSize(doc) + 10; // 10 is paranoid
|
||||
str.reserve(s);
|
||||
serializeJson(doc, str);
|
||||
return s;
|
||||
}
|
||||
|
||||
static String toString (JsonDocument& doc)
|
||||
{
|
||||
String str;
|
||||
serialize(doc, str);
|
||||
return str;
|
||||
}
|
||||
|
||||
protected:
|
||||
size_t counter = 0;
|
||||
};
|
||||
|
||||
ESPUIclient::ESPUIclient(AsyncWebSocketClient * _client):
|
||||
client(_client)
|
||||
{
|
||||
@@ -201,7 +237,7 @@ void ESPUIclient::onWsEvent(AwsEventType type, void* arg, uint8_t* data, size_t
|
||||
{
|
||||
if(!emptyString.equals(value))
|
||||
{
|
||||
Serial.println(String(F("ESPUIclient::OnWsEvent:WS_EVT_DATA:uifragmentok:ProcessAck:value: '")) + value + "'");
|
||||
// Serial.println(String(F("ESPUIclient::OnWsEvent:WS_EVT_DATA:uifragmentok:ProcessAck:value: '")) + value + "'");
|
||||
pCurrentFsmState->ProcessAck(uint16_t(-1), value);
|
||||
}
|
||||
else
|
||||
@@ -377,7 +413,7 @@ uint32_t ESPUIclient::prepareJSONChunk(uint16_t startindex,
|
||||
elementcount++;
|
||||
control->MarshalControl(item, InUpdateMode, DataOffset);
|
||||
|
||||
if (rootDoc.overflowed())
|
||||
if (rootDoc.overflowed() || (ESPUI.jsonChunkNumberMax > 0 && (elementcount % ESPUI.jsonChunkNumberMax) == 0))
|
||||
{
|
||||
// String("prepareJSONChunk: too much data in the message. Remove the last entry");
|
||||
if (1 == elementcount)
|
||||
@@ -393,6 +429,7 @@ uint32_t ESPUIclient::prepareJSONChunk(uint16_t startindex,
|
||||
{
|
||||
// Serial.println(String("prepareJSONChunk: Defering control: ") + String(control->id));
|
||||
// Serial.println(String("prepareJSONChunk: elementcount: ") + String(elementcount));
|
||||
|
||||
items.remove(elementcount);
|
||||
--elementcount;
|
||||
}
|
||||
@@ -478,9 +515,8 @@ bool ESPUIclient::SendControlsToClient(uint16_t startidx, ClientUpdateType_t Tra
|
||||
if (ESPUI.verbosity >= Verbosity::VerboseJSON)
|
||||
{
|
||||
Serial.println(F("ESPUIclient:SendControlsToClient: Sending elements --------->"));
|
||||
String json;
|
||||
serializeJson(document, json);
|
||||
Serial.println(json);
|
||||
serializeJson(document, Serial);
|
||||
Serial.println();
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -525,10 +561,7 @@ bool ESPUIclient::SendJsonDocToWebSocket(DynamicJsonDocument& document)
|
||||
break;
|
||||
}
|
||||
|
||||
String json;
|
||||
json.reserve(document.size() / 2);
|
||||
json.clear();
|
||||
serializeJson(document, json);
|
||||
String json = JSONSlave::toString(document);
|
||||
|
||||
#if defined(DEBUG_ESPUI)
|
||||
if (ESPUI.verbosity >= Verbosity::VerboseJSON)
|
||||
|
||||
Reference in New Issue
Block a user