1
0
mirror of https://github.com/s00500/ESPUI.git synced 2024-11-24 17:30:55 +00:00

Moved management of the control list to control manager

This commit is contained in:
Martin 2024-07-18 11:53:57 -04:00
parent 89d592911e
commit 5c4a202808
2 changed files with 118 additions and 245 deletions

View File

@ -16,6 +16,7 @@
#if ESP8266
#include <umm_malloc/umm_heap_select.h>
#endif
#include "ESPUIcontrolMgr.h"
static String heapInfo(const __FlashStringHelper* mode)
{
@ -429,7 +430,7 @@ void ESPUIClass::onWsEvent(
AsyncWebSocket* server, AsyncWebSocketClient* client, AwsEventType type, void* arg, uint8_t* data, size_t len)
{
// Serial.println(String("ESPUIClass::OnWsEvent: type: ") + String(type));
RemoveToBeDeletedControls();
ESPUIcontrolMgr.RemoveToBeDeletedControls();
if (WS_EVT_DISCONNECT == type)
{
@ -470,247 +471,129 @@ void ESPUIClass::onWsEvent(
return;
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label)
Control::ControlId_t ESPUIClass::addControl(Control::Type type, const char* label)
{
return addControl(type, label, String(""));
return addControl(type, label, emptyString);
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value)
Control::ControlId_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value)
{
return addControl(type, label, value, Control::Color::Turquoise);
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value, Control::Color color)
Control::ControlId_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value, Control::Color color)
{
return addControl(type, label, value, color, Control::noParent);
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl)
Control::ControlId_t ESPUIClass::addControl(Control::Type type,
const char* label, const String& value, Control::Color color, Control::ControlId_t parentControlId)
{
return addControl(type, label, value, color, parentControl, new Control(type, label, nullptr, value, color, true, parentControl));
return addControl(type, label, value, color, parentControlId, (std::function<void(Control*, int)>)nullptr);
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value, Control::Color color,
uint16_t parentControl, std::function<void(Control*, int)> callback)
Control::ControlId_t ESPUIClass::addControl(Control::Type type,
const char* label, const String& value, Control::Color color,
Control::ControlId_t parentControlId, std::function<void(Control*, int)> callback)
{
uint16_t id = addControl(type, label, value, color, parentControl);
// set the original style callback
getControl(id)->callback = callback;
Control::ControlId_t id = ESPUIcontrolMgr.addControl(type, label, value, color, parentControlId, true, callback);
NotifyClients(ClientUpdateType_t::RebuildNeeded);
return id;
}
uint16_t ESPUIClass::addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl, Control* control)
bool ESPUIClass::removeControl(Control::ControlId_t id, bool force_rebuild_ui)
{
#ifdef ESP32
xSemaphoreTake(ControlsSemaphore, portMAX_DELAY);
#endif // def ESP32
if (controls == nullptr)
bool Response = ESPUIcontrolMgr.removeControl(id);
if (force_rebuild_ui)
{
controls = control;
ESPUI.jsonReload();
}
else
{
Control* iterator = controls;
while (iterator->next != nullptr)
{
iterator = iterator->next;
}
iterator->next = control;
ESPUI.NotifyClients(ClientUpdateType_t::RebuildNeeded);
}
controlCount++;
#ifdef ESP32
xSemaphoreGive(ControlsSemaphore);
#endif // def ESP32
NotifyClients(ClientUpdateType_t::RebuildNeeded);
return control->id;
}
bool ESPUIClass::removeControl(uint16_t id, bool force_rebuild_ui)
{
bool Response = false;
Control* control = getControl(id);
if (control)
{
Response = true;
control->DeleteControl();
controlCount--;
if (force_rebuild_ui)
{
jsonReload();
}
else
{
NotifyClients(ClientUpdateType_t::RebuildNeeded);
}
}
#ifdef DEBUG_ESPUI
else
{
// Serial.println(String("Could not Remove Control ") + String(id));
}
#endif // def DEBUG_ESPUI
return Response;
}
} // removeControl
void ESPUIClass::RemoveToBeDeletedControls()
{
#ifdef ESP32
xSemaphoreTake(ControlsSemaphore, portMAX_DELAY);
#endif // def ESP32
Control* PreviousControl = nullptr;
Control* CurrentControl = controls;
while (nullptr != CurrentControl)
{
Control* NextControl = CurrentControl->next;
if (CurrentControl->ToBeDeleted())
{
if (CurrentControl == controls)
{
// this is the root control
controls = NextControl;
}
else
{
PreviousControl->next = NextControl;
}
delete CurrentControl;
CurrentControl = NextControl;
}
else
{
PreviousControl = CurrentControl;
CurrentControl = NextControl;
}
}
#ifdef ESP32
xSemaphoreGive(ControlsSemaphore);
#endif // def ESP32
}
uint16_t ESPUIClass::label(const char* label, Control::Color color, const String& value)
Control::ControlId_t ESPUIClass::label(const char* label, Control::Color color, const String& value)
{
return addControl(Control::Type::Label, label, value, color);
}
uint16_t ESPUIClass::graph(const char* label, Control::Color color)
Control::ControlId_t ESPUIClass::graph(const char* label, Control::Color color)
{
return addControl(Control::Type::Graph, label, "", color);
}
uint16_t ESPUIClass::slider(
Control::ControlId_t ESPUIClass::slider(
const char* label, std::function<void(Control*, int)> callback, Control::Color color, int value, int min, int max)
{
uint16_t sliderId
Control::ControlId_t sliderId
= addControl(Control::Type::Slider, label, String(value), color, Control::noParent, callback);
addControl(Control::Type::Min, label, String(min), Control::Color::None, sliderId);
addControl(Control::Type::Max, label, String(max), Control::Color::None, sliderId);
return sliderId;
}
uint16_t ESPUIClass::button(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value)
Control::ControlId_t ESPUIClass::button(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value)
{
return addControl(Control::Type::Button, label, value, color, Control::noParent, callback);
}
uint16_t ESPUIClass::switcher(const char* label, std::function<void(Control*, int)> callback, Control::Color color, bool startState)
Control::ControlId_t ESPUIClass::switcher(const char* label, std::function<void(Control*, int)> callback, Control::Color color, bool startState)
{
return addControl(Control::Type::Switcher, label, startState ? "1" : "0", color, Control::noParent, callback);
}
uint16_t ESPUIClass::pad(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
Control::ControlId_t ESPUIClass::pad(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
{
return addControl(Control::Type::Pad, label, "", color, Control::noParent, callback);
}
uint16_t ESPUIClass::padWithCenter(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
Control::ControlId_t ESPUIClass::padWithCenter(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
{
return addControl(Control::Type::PadWithCenter, label, "", color, Control::noParent, callback);
}
uint16_t ESPUIClass::number(
Control::ControlId_t ESPUIClass::number(
const char* label, std::function<void(Control*, int)> callback, Control::Color color, int number, int min, int max)
{
uint16_t numberId = addControl(Control::Type::Number, label, String(number), color, Control::noParent, callback);
Control::ControlId_t numberId = addControl(Control::Type::Number, label, String(number), color, Control::noParent, callback);
addControl(Control::Type::Min, label, String(min), Control::Color::None, numberId);
addControl(Control::Type::Max, label, String(max), Control::Color::None, numberId);
return numberId;
}
uint16_t ESPUIClass::gauge(const char* label, Control::Color color, int number, int min, int max)
Control::ControlId_t ESPUIClass::gauge(const char* label, Control::Color color, int number, int min, int max)
{
uint16_t numberId = addControl(Control::Type::Gauge, label, String(number), color, Control::noParent);
Control::ControlId_t numberId = addControl(Control::Type::Gauge, label, String(number), color, Control::noParent);
addControl(Control::Type::Min, label, String(min), Control::Color::None, numberId);
addControl(Control::Type::Max, label, String(max), Control::Color::None, numberId);
return numberId;
}
uint16_t ESPUIClass::separator(const char* label)
Control::ControlId_t ESPUIClass::separator(const char* label)
{
return addControl(Control::Type::Separator, label, "", Control::Color::Alizarin, Control::noParent, nullptr);
}
uint16_t ESPUIClass::fileDisplay(const char* label, Control::Color color, String filename)
Control::ControlId_t ESPUIClass::fileDisplay(const char* label, Control::Color color, String filename)
{
return addControl(Control::Type::FileDisplay, label, filename, color, Control::noParent);
}
uint16_t ESPUIClass::accelerometer(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
Control::ControlId_t ESPUIClass::accelerometer(const char* label, std::function<void(Control*, int)> callback, Control::Color color)
{
return addControl(Control::Type::Accel, label, "", color, Control::noParent, callback);
}
uint16_t ESPUIClass::text(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value)
Control::ControlId_t ESPUIClass::text(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value)
{
return addControl(Control::Type::Text, label, value, color, Control::noParent, callback);
}
Control* ESPUIClass::getControl(uint16_t id)
{
#ifdef ESP32
xSemaphoreTake(ControlsSemaphore, portMAX_DELAY);
Control* Response = getControlNoLock(id);
xSemaphoreGive(ControlsSemaphore);
return Response;
#else
return getControlNoLock(id);
#endif // !def ESP32
}
// WARNING: Anytime you walk the chain of controllers, the protection semaphore
// MUST be locked. This function assumes that the semaphore is locked
// at the time it is called. Make sure YOU locked it :)
Control* ESPUIClass::getControlNoLock(uint16_t id)
{
Control* Response = nullptr;
Control* control = controls;
while (nullptr != control)
{
if (control->id == id)
{
if (!control->ToBeDeleted())
{
Response = control;
}
break;
}
control = control->next;
}
return Response;
}
Control* ESPUIClass::getControl(Control::ControlId_t id) {return ESPUIcontrolMgr.getControl(id);}
Control* ESPUIClass::getControlNoLock(Control::ControlId_t id) {return ESPUIcontrolMgr.getControlNoLock(id);}
void ESPUIClass::updateControl(Control* control, int)
{
@ -733,7 +616,7 @@ uint32_t ESPUIClass::GetNextControlChangeId()
return ++ControlChangeID;
}
void ESPUIClass::setPanelStyle(uint16_t id, const String& style, int clientId)
void ESPUIClass::setPanelStyle(Control::ControlId_t id, const String& style, int clientId)
{
Control* control = getControl(id);
if (control)
@ -743,7 +626,7 @@ void ESPUIClass::setPanelStyle(uint16_t id, const String& style, int clientId)
}
}
void ESPUIClass::setElementStyle(uint16_t id, const String& style, int clientId)
void ESPUIClass::setElementStyle(Control::ControlId_t id, const String& style, int clientId)
{
Control* control = getControl(id);
if (control)
@ -753,7 +636,7 @@ void ESPUIClass::setElementStyle(uint16_t id, const String& style, int clientId)
}
}
void ESPUIClass::setInputType(uint16_t id, const String& type, int clientId)
void ESPUIClass::setInputType(Control::ControlId_t id, const String& type, int clientId)
{
Control* control = getControl(id);
if (control)
@ -763,7 +646,7 @@ void ESPUIClass::setInputType(uint16_t id, const String& type, int clientId)
}
}
void ESPUIClass::setPanelWide(uint16_t id, bool wide)
void ESPUIClass::setPanelWide(Control::ControlId_t id, bool wide)
{
Control* control = getControl(id);
if (control)
@ -772,7 +655,7 @@ void ESPUIClass::setPanelWide(uint16_t id, bool wide)
}
}
void ESPUIClass::setEnabled(uint16_t id, bool enabled, int clientId)
void ESPUIClass::setEnabled(Control::ControlId_t id, bool enabled, int clientId)
{
Control* control = getControl(id);
if (control)
@ -783,7 +666,7 @@ void ESPUIClass::setEnabled(uint16_t id, bool enabled, int clientId)
}
}
void ESPUIClass::setVertical(uint16_t id, bool vert)
void ESPUIClass::setVertical(Control::ControlId_t id, bool vert)
{
Control* control = getControl(id);
if (control)
@ -792,7 +675,7 @@ void ESPUIClass::setVertical(uint16_t id, bool vert)
}
}
void ESPUIClass::updateControl(uint16_t id, int clientId)
void ESPUIClass::updateControl(Control::ControlId_t id, int clientId)
{
Control* control = getControl(id);
@ -821,7 +704,7 @@ void ESPUIClass::updateControlValue(Control* control, const String& value, int c
updateControl(control, clientId);
}
void ESPUIClass::updateControlValue(uint16_t id, const String& value, int clientId)
void ESPUIClass::updateControlValue(Control::ControlId_t id, const String& value, int clientId)
{
Control* control = getControl(id);
@ -839,7 +722,7 @@ void ESPUIClass::updateControlValue(uint16_t id, const String& value, int client
updateControlValue(control, value, clientId);
}
void ESPUIClass::updateControlLabel(uint16_t id, const char* value, int clientId)
void ESPUIClass::updateControlLabel(Control::ControlId_t id, const char* value, int clientId)
{
updateControlLabel(getControl(id), value, clientId);
}
@ -860,7 +743,7 @@ void ESPUIClass::updateControlLabel(Control* control, const char* value, int cli
updateControl(control, clientId);
}
void ESPUIClass::updateVisibility(uint16_t id, bool visibility, int clientId)
void ESPUIClass::updateVisibility(Control::ControlId_t id, bool visibility, int clientId)
{
Control* control = getControl(id);
if (control)
@ -870,57 +753,57 @@ void ESPUIClass::updateVisibility(uint16_t id, bool visibility, int clientId)
}
}
void ESPUIClass::print(uint16_t id, const String& value)
void ESPUIClass::print(Control::ControlId_t id, const String& value)
{
updateControlValue(id, value);
}
void ESPUIClass::updateLabel(uint16_t id, const String& value)
void ESPUIClass::updateLabel(Control::ControlId_t id, const String& value)
{
updateControlValue(id, value);
}
void ESPUIClass::updateButton(uint16_t id, const String& value)
void ESPUIClass::updateButton(Control::ControlId_t id, const String& value)
{
updateControlValue(id, value);
}
void ESPUIClass::updateSlider(uint16_t id, int nValue, int clientId)
void ESPUIClass::updateSlider(Control::ControlId_t id, int nValue, int clientId)
{
updateControlValue(id, String(nValue), clientId);
}
void ESPUIClass::updateSwitcher(uint16_t id, bool nValue, int clientId)
void ESPUIClass::updateSwitcher(Control::ControlId_t id, bool nValue, int clientId)
{
updateControlValue(id, String(nValue ? "1" : "0"), clientId);
}
void ESPUIClass::updateNumber(uint16_t id, int number, int clientId)
void ESPUIClass::updateNumber(Control::ControlId_t id, int number, int clientId)
{
updateControlValue(id, String(number), clientId);
}
void ESPUIClass::updateText(uint16_t id, const String& text, int clientId)
void ESPUIClass::updateText(Control::ControlId_t id, const String& text, int clientId)
{
updateControlValue(id, text, clientId);
}
void ESPUIClass::updateSelect(uint16_t id, const String& text, int clientId)
void ESPUIClass::updateSelect(Control::ControlId_t id, const String& text, int clientId)
{
updateControlValue(id, text, clientId);
}
void ESPUIClass::updateGauge(uint16_t id, int number, int clientId)
void ESPUIClass::updateGauge(Control::ControlId_t id, int number, int clientId)
{
updateControlValue(id, String(number), clientId);
}
void ESPUIClass::updateTime(uint16_t id, int clientId)
void ESPUIClass::updateTime(Control::ControlId_t id, int clientId)
{
updateControl(id, clientId);
}
void ESPUIClass::clearGraph(uint16_t id, int clientId)
void ESPUIClass::clearGraph(Control::ControlId_t id, int clientId)
{
do // once
{
@ -935,14 +818,14 @@ void ESPUIClass::clearGraph(uint16_t id, int clientId)
root[F("type")] = (int)Control::Type::Graph + Control::Type::UpdateOffset;
root[F("value")] = 0;
root[F("id")] = control->id;
root[F("id")] = control->GetId();
SendJsonDocToWebSocket(document, clientId);
} while (false);
}
void ESPUIClass::addGraphPoint(uint16_t id, int nValue, int clientId)
void ESPUIClass::addGraphPoint(Control::ControlId_t id, int nValue, int clientId)
{
do // once
{
@ -957,7 +840,7 @@ void ESPUIClass::addGraphPoint(uint16_t id, int nValue, int clientId)
root[F("type")] = (int)Control::Type::GraphPoint;
root[F("value")] = nValue;
root[F("id")] = control->id;
root[F("id")] = control->GetId();
SendJsonDocToWebSocket(document, clientId);

View File

@ -49,6 +49,8 @@
#endif
#include <ESPUIcontrolMgr.h>
#define FILE_WRITING "w"
// Message Types (and control types)
@ -102,10 +104,6 @@ class ESPUIClass
public:
ESPUIClass()
{
#ifdef ESP32
ControlsSemaphore = xSemaphoreCreateMutex();
xSemaphoreGive(ControlsSemaphore);
#endif // def ESP32
}
unsigned int jsonUpdateDocumentSize = 2000;
#ifdef ESP8266
@ -132,117 +130,116 @@ public:
void list(); // Lists LITTLEFS directory
void writeFile(const char* path, const char* data);
uint16_t addControl(Control::Type type, const char* label);
uint16_t addControl(Control::Type type, const char* label, const String& value);
uint16_t addControl(Control::Type type, const char* label, const String& value, Control::Color color);
uint16_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl);
uint16_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl, std::function<void(Control*, int)> callback);
Control::ControlId_t addControl(Control::Type type, const char* label);
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value);
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value, Control::Color color);
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, Control::ControlId_t parentControlId);
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, Control::ControlId_t parentControlId, std::function<void(Control*, int)> callback);
bool removeControl(uint16_t id, bool force_rebuild_ui = false);
bool removeControl(Control::ControlId_t id, bool force_rebuild_ui = false);
// create Elements
// Create Event Button
uint16_t button(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value = "");
uint16_t switcher(const char* label, std::function<void(Control*, int)> callback, Control::Color color, bool startState = false); // Create Toggle Button
uint16_t pad(const char* label, std::function<void(Control*, int)> callback, Control::Color color); // Create Pad Control
uint16_t padWithCenter(const char* label, std::function<void(Control*, int)> callback, Control::Color color); // Create Pad Control with Centerbutton
uint16_t slider(const char* label, std::function<void(Control*, int)> callback, Control::Color color, int value, int min = 0, int max = 100); // Create Slider Control
uint16_t number(const char* label, std::function<void(Control*, int)> callback, Control::Color color, int value, int min = 0, int max = 100); // Create a Number Input Control
uint16_t text(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value = ""); // Create a Text Input Control
Control::ControlId_t button(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value = "");
Control::ControlId_t switcher(const char* label, std::function<void(Control*, int)> callback, Control::Color color, bool startState = false); // Create Toggle Button
Control::ControlId_t pad(const char* label, std::function<void(Control*, int)> callback, Control::Color color); // Create Pad Control
Control::ControlId_t padWithCenter(const char* label, std::function<void(Control*, int)> callback, Control::Color color); // Create Pad Control with Centerbutton
Control::ControlId_t slider(const char* label, std::function<void(Control*, int)> callback, Control::Color color, int value, int min = 0, int max = 100); // Create Slider Control
Control::ControlId_t number(const char* label, std::function<void(Control*, int)> callback, Control::Color color, int value, int min = 0, int max = 100); // Create a Number Input Control
Control::ControlId_t text(const char* label, std::function<void(Control*, int)> callback, Control::Color color, const String& value = ""); // Create a Text Input Control
// Output only
uint16_t label(const char* label, Control::Color color,
Control::ControlId_t label(const char* label, Control::Color color,
const String& value = ""); // Create Label
uint16_t graph(const char* label, Control::Color color); // Create Graph display
uint16_t gauge(const char* label, Control::Color color, int value, int min = 0,
Control::ControlId_t graph(const char* label, Control::Color color); // Create Graph display
Control::ControlId_t gauge(const char* label, Control::Color color, int value, int min = 0,
int max = 100); // Create Gauge display
uint16_t separator(const char* label); //Create separator
uint16_t fileDisplay(const char* label, Control::Color color, String filename);
Control::ControlId_t separator(const char* label); //Create separator
Control::ControlId_t fileDisplay(const char* label, Control::Color color, String filename);
// Input only
uint16_t accelerometer(const char* label, std::function<void(Control*, int)> callback, Control::Color color);
Control::ControlId_t accelerometer(const char* label, std::function<void(Control*, int)> callback, Control::Color color);
// Update Elements
Control* getControl(uint16_t id);
Control* getControlNoLock(uint16_t id);
Control* getControl(Control::ControlId_t id);
Control* getControlNoLock(Control::ControlId_t id);
// Update Elements
void updateControlValue(uint16_t id, const String& value, int clientId = -1);
void updateControlValue(Control::ControlId_t id, const String& value, int clientId = -1);
void updateControlValue(Control* control, const String& value, int clientId = -1);
void updateControlLabel(uint16_t control, const char * value, int clientId = -1);
void updateControlLabel(Control::ControlId_t control, const char * value, int clientId = -1);
void updateControlLabel(Control* control, const char * value, int clientId = -1);
void updateControl(uint16_t id, int clientId = -1);
void updateControl(Control::ControlId_t id, int clientId = -1);
void updateControl(Control* control, int clientId = -1);
void print(uint16_t id, const String& value);
void updateLabel(uint16_t id, const String& value);
void updateButton(uint16_t id, const String& value);
void updateSwitcher(uint16_t id, bool nValue, int clientId = -1);
void updateSlider(uint16_t id, int nValue, int clientId = -1);
void updateNumber(uint16_t id, int nValue, int clientId = -1);
void updateText(uint16_t id, const String& nValue, int clientId = -1);
void updateSelect(uint16_t id, const String& nValue, int clientId = -1);
void updateGauge(uint16_t id, int number, int clientId);
void updateTime(uint16_t id, int clientId = -1);
void print(Control::ControlId_t id, const String& value);
void updateLabel(Control::ControlId_t id, const String& value);
void updateButton(Control::ControlId_t id, const String& value);
void updateSwitcher(Control::ControlId_t id, bool nValue, int clientId = -1);
void updateSlider(Control::ControlId_t id, int nValue, int clientId = -1);
void updateNumber(Control::ControlId_t id, int nValue, int clientId = -1);
void updateText(Control::ControlId_t id, const String& nValue, int clientId = -1);
void updateSelect(Control::ControlId_t id, const String& nValue, int clientId = -1);
void updateGauge(Control::ControlId_t id, int number, int clientId);
void updateTime(Control::ControlId_t id, int clientId = -1);
void clearGraph(uint16_t id, int clientId = -1);
void addGraphPoint(uint16_t id, int nValue, int clientId = -1);
void clearGraph(Control::ControlId_t id, int clientId = -1);
void addGraphPoint(Control::ControlId_t id, int nValue, int clientId = -1);
void setPanelStyle(uint16_t id, const String& style, int clientId = -1);
void setElementStyle(uint16_t id, const String& style, int clientId = -1);
void setInputType(uint16_t id, const String& type, int clientId = -1);
void setPanelStyle(Control::ControlId_t id, const String& style, int clientId = -1);
void setElementStyle(Control::ControlId_t id, const String& style, int clientId = -1);
void setInputType(Control::ControlId_t id, const String& type, int clientId = -1);
void setPanelWide(uint16_t id, bool wide);
void setVertical(uint16_t id, bool vert = true);
void setEnabled(uint16_t id, bool enabled = true, int clientId = -1);
void setPanelWide(Control::ControlId_t id, bool wide);
void setVertical(Control::ControlId_t id, bool vert = true);
void setEnabled(Control::ControlId_t id, bool enabled = true, int clientId = -1);
void updateVisibility(uint16_t id, bool visibility, int clientId = -1);
void updateVisibility(Control::ControlId_t id, bool visibility, int clientId = -1);
// Variables
const char* ui_title = "ESPUI"; // Store UI Title and Header Name
Control* controls = nullptr;
void jsonReload();
void jsonDom(uint16_t startidx, AsyncWebSocketClient* client = nullptr, bool Updating = false);
Verbosity verbosity = Verbosity::Quiet;
uint32_t GetNextControlChangeId();
// emulate former extended callback API by using an intermediate lambda (no deprecation)
uint16_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl, std::function<void(Control*, int, void*)> callback, void* userData)
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, Control::ControlId_t parentControl, std::function<void(Control*, int, void*)> callback, void* userData)
{
return addControl(type, label, value, color, parentControl, [callback, userData](Control* sender, int type){ callback(sender, type, userData); });
}
uint16_t button(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, const String& value, void* userData)
Control::ControlId_t button(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, const String& value, void* userData)
{
return button(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color, value);
}
uint16_t switcher(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, bool startState, void* userData)
Control::ControlId_t switcher(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, bool startState, void* userData)
{
return switcher(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color, startState);
}
uint16_t pad(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
Control::ControlId_t pad(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
{
return pad(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color);
}
uint16_t padWithCenter(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
Control::ControlId_t padWithCenter(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
{
return padWithCenter(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color);
}
uint16_t slider(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, int value, int min, int max, void* userData)
Control::ControlId_t slider(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, int value, int min, int max, void* userData)
{
return slider(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color, value, min, max);
}
uint16_t number(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, int value, int min, int max, void* userData)
Control::ControlId_t number(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, int value, int min, int max, void* userData)
{
return number(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color, value, min, max);
}
uint16_t text(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, const String& value, void* userData)
Control::ControlId_t text(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, const String& value, void* userData)
{
return text(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); } , color, value);
}
uint16_t accelerometer(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
Control::ControlId_t accelerometer(const char* label, std::function<void(Control*, int, void*)> callback, Control::Color color, void* userData)
{
return accelerometer(label, [callback, userData](Control* sender, int type){ callback(sender, type, userData); }, color);
}
@ -264,21 +261,14 @@ protected:
friend class ESPUIclient;
friend class ESPUIcontrol;
#ifdef ESP32
SemaphoreHandle_t ControlsSemaphore = NULL;
#endif // def ESP32
void RemoveToBeDeletedControls();
AsyncWebServer* server;
AsyncWebSocket* ws;
const char* basicAuthUsername = nullptr;
const char* basicAuthPassword = nullptr;
bool basicAuth = true;
uint16_t controlCount = 0;
uint16_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, uint16_t parentControl, Control* control);
Control::ControlId_t addControl(Control::Type type, const char* label, const String& value, Control::Color color, Control::ControlId_t parentControl, Control* control);
#define ClientUpdateType_t ESPUIclient::ClientUpdateType_t
void NotifyClients(ClientUpdateType_t newState);