#include "ESPUI.h" static uint16_t idCounter = 0; static const String ControlError = "*** ESPUI ERROR: Could not transfer control ***"; Control::Control(ControlType type, const char* label, std::function callback, const String& value, ControlColor color, bool visible, uint16_t parentControl) : type(type), label(label), callback(callback), value(value), color(color), visible(visible), wide(false), vertical(false), enabled(true), parentControl(parentControl), next(nullptr) { id = ++idCounter; ControlChangeID = 1; } Control::Control(const Control& Control) : type(Control.type), id(Control.id), label(Control.label), callback(Control.callback), value(Control.value), color(Control.color), visible(Control.visible), parentControl(Control.parentControl), next(Control.next), ControlChangeID(Control.ControlChangeID) { } void Control::SendCallback(int type) { if(callback) { callback(this, type); } } void Control::DeleteControl() { _ToBeDeleted = true; callback = nullptr; } void Control::MarshalControl(JsonObject & _item, bool refresh, uint32_t StartingOffset) { JsonObject & item = _item; uint32_t length = value.length(); uint32_t maxLength = uint32_t(double(ESPUI.jsonInitialDocumentSize) * 0.75); if((length > maxLength) || StartingOffset) { /* Serial.println(String("MarshalControl:Start Fragment Processing")); Serial.println(String("MarshalControl:id: ") + String(id)); Serial.println(String("MarshalControl:length: ") + String(length)); Serial.println(String("MarshalControl:StartingOffset: ") + String(StartingOffset)); Serial.println(String("MarshalControl:maxLength: ") + String(maxLength)); if(0 == StartingOffset) { Serial.println(String("MarshalControl: New control to fragement. ID: ") + String(id)); } else { Serial.println(String("MarshalControl: Next fragement. ID: ") + String(id)); } */ // indicate that no additional controls should be sent _item[F("type")] = uint32_t(ControlType::Fragment); _item[F("id")] = id; length = min((length - StartingOffset), maxLength); // Serial.println(String("MarshalControl:Final length: ") + String(length)); _item[F("offset")] = StartingOffset; _item[F("length")] = length; _item[F("total")] = value.length(); item = _item.createNestedObject(F("control")); } item[F("id")] = id; ControlType TempType = (ControlType::Password == type) ? ControlType::Text : type; if(refresh) { item[F("type")] = uint32_t(TempType) + uint32_t(ControlType::UpdateOffset); } else { item[F("type")] = uint32_t(TempType); } item[F("label")] = label; item[F ("value")] = (ControlType::Password == type) ? F ("--------") : value.substring(StartingOffset, length + StartingOffset); item[F("visible")] = visible; item[F("color")] = (int)color; item[F("enabled")] = enabled; if (!panelStyle.isEmpty()) {item[F("panelStyle")] = panelStyle;} if (!elementStyle.isEmpty()) {item[F("elementStyle")] = elementStyle;} if (!inputType.isEmpty()) {item[F("inputType")] = inputType;} if (wide == true) {item[F("wide")] = true;} if (vertical == true) {item[F("vertical")] = true;} if (parentControl != Control::noParent) { item[F("parentControl")] = String(parentControl); } // special case for selects: to preselect an option, you have to add // "selected" to