26 #define ARDUJAX_MAX_ID_LEN 16
31 #include "macro_definitions.h"
35 class EmbAJAXContainerBase;
44 virtual void print()
const = 0;
68 setBasicProperty(Visibility, visible);
73 setBasicProperty(Enabledness, enabled);
79 FirstElementSpecificProperty=3,
89 virtual void setBasicProperty(uint8_t num,
bool status) {};
92 static char itoa_buf[8];
93 constexpr
static const char null_string[1] =
"";
102 void printPage(
EmbAJAXBase** children,
size_t num,
const char* _title,
const char* _header, uint16_t _min_interval)
const;
121 next_revision = _revision;
124 virtual void printHeader(
bool html) = 0;
125 virtual void printContent(
const char *content) = 0;
126 virtual const char* getArg(
const char* name,
char* buf,
int buflen) = 0;
135 uint16_t revision()
const {
138 uint16_t setChanged() {
139 next_revision = _revision+1;
140 return (next_revision);
142 void nextRevision() {
143 _revision = next_revision;
161 _printFiltered(value, quoted, HTMLescaped);
226 void _printFiltered(
const char* value,
QuoteMode quoted,
bool HTMLescaped);
227 void _printContent(
const char* content);
228 void _printChar(
const char content);
230 const int _bufsize = 64;
234 uint16_t next_revision;
241 #define MAKE_EmbAJAXPage(name, title, header_add, ...) \
242 EmbAJAXBase* name##_elements[] = {__VA_ARGS__}; \
243 EmbAJAXPage<sizeof(name##_elements)/sizeof(EmbAJAXBase*)> name(name##_elements, title, header_add);
255 void print()
const override {
256 _driver->printContent(_content);
259 const char* _content;
276 _content_ok = content_ok;
277 _content_fail = content_fail;
279 void print()
const override;
280 static constexpr
const char* default_ok = {
"<span style=\"background-color:green;\">OK</span>"};
281 static constexpr
const char* default_fail = {
"<span style=\"background-color:red;\">FAIL</span>"};
283 const char* _content_ok;
284 const char* _content_fail;
302 const char* id()
const {
305 bool sendUpdates(uint16_t since,
bool first)
override;
310 virtual const char*
value(uint8_t which = EmbAJAXBase::Value)
const {
311 if (which == EmbAJAXBase::Visibility)
return (basicProperty (EmbAJAXBase::Visibility) ?
"" :
"none");
312 if (which == EmbAJAXBase::Enabledness)
return (basicProperty (EmbAJAXBase::Enabledness) ?
"" :
"disabled");
325 virtual const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const {
326 if (which == EmbAJAXBase::Visibility)
return (
"style.display");
327 if (which == EmbAJAXBase::Enabledness)
return (
"disabled");
341 void setBasicProperty(uint8_t num,
bool status)
override;
342 bool basicProperty(uint8_t num)
const {
343 return (_flags & (1 << num));
350 bool changed(uint16_t since);
363 void print()
const override;
364 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
365 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
392 void print()
const override {
395 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override {
396 if (which == EmbAJAXBase::Value)
return _value;
399 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override {
400 if (which == EmbAJAXBase::Value)
return "value";
406 strncpy(_value,
value, SIZE);
410 _driver->getArg(argname, _value, SIZE);
419 EmbAJAXSlider(
const char*
id, int16_t min, int16_t max, int16_t initial);
420 void print()
const override;
421 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
422 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
423 void setValue(int16_t
value);
424 int16_t intValue()
const {
429 int16_t _min, _max, _value;
440 void print()
const override;
441 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
442 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
443 void setColor(uint8_t r, uint8_t g, uint8_t b);
445 uint8_t green()
const;
446 uint8_t blue()
const;
460 void print()
const override;
469 void setText(
const char* label,
bool allowHTML =
false);
470 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
471 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
495 void print()
const override;
501 Status status()
const;
504 uint32_t latest_ping;
517 void print()
const override;
518 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
519 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
520 void setChecked(
bool checked);
521 bool isChecked()
const {
546 _children = children;
548 void print()
const override {
559 void setBasicProperty(uint8_t num,
bool status)
override {
560 for (
int i = 0; i < NUM; ++i) {
561 _children[i]->setBasicProperty(num, status);
587 void print()
const override {
588 _driver->printFormatted(
"<div id=", HTML_QUOTED_STRING(_id),
">");
590 _driver->printContent(
"</div>");
593 return _childlist.findChild(
id);
597 bool sent2 = _childlist.sendUpdates(since, first && !sent);
598 return sent || sent2;
601 void setBasicProperty(uint8_t num,
bool status)
override {
602 EmbAJAXElement::setBasicProperty(num, status);
603 _childlist.setBasicProperty(num, status);
621 for (uint8_t i = 0; i < NUM; ++i) {
622 char* childid = childids[i];
623 strncpy(childid, id_base, ARDUJAX_MAX_ID_LEN-4);
624 itoa(i, &(childid[strlen(childid)]), 10);
626 buttons[i].radiogroup =
this;
627 buttonpointers[i] = &buttons[i];
629 _current_option = selected_option;
635 for (uint8_t i = 0; i < NUM; ++i) {
636 buttons[i].setChecked(i == num);
638 _current_option = num;
642 return _current_option;
647 if (num < NUM)
return (&buttons[num]);
653 char childids[NUM][ARDUJAX_MAX_ID_LEN];
654 int8_t _current_option;
656 _current_option = -1;
657 for (uint8_t i = 0; i < NUM; ++i) {
658 if (which == buttonpointers[i]) {
661 buttons[i].setChecked(
false);
674 const char*
value(uint8_t which = EmbAJAXBase::Value)
const override;
675 const char*
valueProperty(uint8_t which = EmbAJAXBase::Value)
const override;
679 _current_option = current_option;
681 void print(
const char*
const* _labels, uint8_t NUM)
const;
682 uint8_t _current_option;
696 for (uint8_t i = 0; i < NUM; ++i) {
697 _labels[i] = labels[i];
700 void print()
const override {
701 EmbAJAXOptionSelectBase::print(_labels, NUM);
704 const char* _labels[NUM];
712 virtual void handleRequest(
void (*change_callback)()=0) = 0;
713 virtual void printPage() = 0;
730 _title(title ? title :
EmbAJAXBase::null_string), _header_add(header_add ? header_add :
EmbAJAXBase::null_string), _min_interval(min_interval) {}
749 _latest_ping = millis();
756 return(_latest_ping && (_latest_ping + latency_ms > millis()));
760 const char* _header_add;
761 uint16_t _min_interval;
762 uint64_t _latest_ping = 0;
766 #if not defined (EMBAJAX_OUTUPUTDRIVER_IMPLEMENTATION)
767 #if defined (ESP8266)
768 #include "EmbAJAXOutputDriverESP8266.h"
769 #elif defined (ESP32)
770 #include "EmbAJAXOutputDriverESP32.h"
771 #elif defined (ARDUINO_ARCH_RP2040)
772 #include "EmbAJAXOutputDriverRP2040.h"
774 #include <WebServer.h>
775 #define EmbAJAXOutputDriverWebServerClass WebServer
777 #include "EmbAJAXOutputDriverGeneric.h"
778 #warning No output driver available for this hardware (yet). We try using the generic driver, but success is not guaranteed.
779 #warning In most cases, implementing a driver is as easy as picking the correct header file to include. Please consider submitting a patch.
Abstract base class for anything shown on an EmbAJAXPage.
Definition: EmbAJAX.h:42
virtual bool sendUpdates(uint16_t since, bool first)
Definition: EmbAJAX.h:57
void setEnabled(bool enabled)
Definition: EmbAJAX.h:72
static void setDriver(EmbAJAXOutputDriverBase *driver)
Definition: EmbAJAX.h:47
void printChildren(EmbAJAXBase **children, size_t num) const
Definition: EmbAJAX.cpp:181
void printPage(EmbAJAXBase **children, size_t num, const char *_title, const char *_header, uint16_t _min_interval) const
Definition: EmbAJAX.cpp:501
void handleRequest(EmbAJAXBase **children, size_t num, void(*change_callback)())
Definition: EmbAJAX.cpp:583
void setVisible(bool visible)
Definition: EmbAJAX.h:67
virtual EmbAJAXElement * toElement()
Definition: EmbAJAX.h:62
virtual EmbAJAXElement * findChild(const char *id) const
Definition: EmbAJAX.h:84
A color picker element (<input type="color">)
Definition: EmbAJAX.h:433
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:302
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:334
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:292
EmbAJAXColorPicker(const char *id, uint8_t r, uint8_t g, uint8_t b)
Definition: EmbAJAX.cpp:274
connection status indicator
Definition: EmbAJAX.h:269
EmbAJAXConnectionIndicator(const char *content_ok=default_ok, const char *content_fail=default_fail)
Definition: EmbAJAX.h:275
Base class for groups of objects.
Definition: EmbAJAX.h:543
EmbAJAXElement * findChild(const char *id) const override final
Definition: EmbAJAX.h:555
bool sendUpdates(uint16_t since, bool first) override
Definition: EmbAJAX.h:551
Abstract base class for modifiable elements.
Definition: EmbAJAX.h:297
virtual void updateFromDriverArg(const char *argname)
Definition: EmbAJAX.h:333
virtual bool valueNeedsEscaping(uint8_t which=EmbAJAXBase::Value) const
Definition: EmbAJAX.h:318
virtual const char * value(uint8_t which=EmbAJAXBase::Value) const
Definition: EmbAJAX.h:310
EmbAJAXElement * toElement() override final
Definition: EmbAJAX.h:337
void printTextInput(size_t size, const char *value) const
Definition: EmbAJAX.cpp:173
virtual const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const
Definition: EmbAJAX.h:325
EmbAJAXElement(const char *id)
Definition: EmbAJAX.cpp:129
bool sendUpdates(uint16_t since, bool first) override
Definition: EmbAJAX.cpp:135
A list of objects that can be hidden, completely.
Definition: EmbAJAX.h:582
EmbAJAXElement * findChild(const char *id) const override
Definition: EmbAJAX.h:592
bool sendUpdates(uint16_t since, bool first) override
Definition: EmbAJAX.h:595
An HTML span element with content that can be updated from the server (not the client)
Definition: EmbAJAX.h:358
bool valueNeedsEscaping(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:220
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:225
void setValue(const char *value, bool allowHTML=false)
Definition: EmbAJAX.cpp:230
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:215
Abstract base class for EmbAJAXOptionSelect.
Definition: EmbAJAX.h:668
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:495
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:490
uint8_t selectedOption() const
Definition: EmbAJAX.cpp:481
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:485
void selectOption(uint8_t num)
Definition: EmbAJAX.cpp:476
Drop-down list of selectable options.
Definition: EmbAJAX.h:689
EmbAJAXOptionSelect(const char *id, const char *labels[NUM], uint8_t selected_option=0)
Definition: EmbAJAX.h:695
Abstract base class for output drivers/server implementations.
Definition: EmbAJAX.h:117
virtual void loopHook()=0
void printAttribute(const char *name, const char *value)
Definition: EmbAJAX.cpp:106
virtual void installPage(EmbAJAXPageBase *page, const char *path, void(*change_callback)()=0)=0
void _printContentF(const char *fmt,...)
Definition: EmbAJAX.cpp:80
void printJSQuoted(const char *value)
Definition: EmbAJAX.h:165
QuoteMode
Definition: EmbAJAX.h:146
@ JSQuoted
Will be quoted suitable for JavaScript.
Definition: EmbAJAX.h:148
@ HTMLQuoted
Will be quoted suitable for HTML attributes.
Definition: EmbAJAX.h:149
@ NotQuoted
Will not be quoted.
Definition: EmbAJAX.h:147
void printFiltered(const char *value, QuoteMode quoted, bool HTMLescaped)
Definition: EmbAJAX.h:160
void printHTMLQuoted(const char *value)
Definition: EmbAJAX.h:167
Absrract internal helper class.
Definition: EmbAJAX.h:710
The main interface class.
Definition: EmbAJAX.h:722
void printPage() override
Definition: EmbAJAX.h:732
EmbAJAXPage(EmbAJAXBase *children[NUM], const char *title, const char *header_add=0, uint16_t min_interval=100)
Definition: EmbAJAX.h:729
void handleRequest(void(*change_callback)()=0) override
Definition: EmbAJAX.h:748
void print() const override
Definition: EmbAJAX.h:737
bool hasActiveClient(uint64_t latency_ms=5000) const
Definition: EmbAJAX.h:755
abstract base for EmbAJAXRadioGroup, needed for internal reasons.
Definition: EmbAJAX.h:534
A set of radio buttons (mutally exclusive buttons), e.g. for on/off, or low/mid/high,...
Definition: EmbAJAX.h:613
uint8_t selectedOption() const
Definition: EmbAJAX.h:641
EmbAJAXBase * button(uint8_t num)
Definition: EmbAJAX.h:646
EmbAJAXRadioGroup(const char *id_base, const char *options[NUM], uint8_t selected_option=0)
Definition: EmbAJAX.h:620
void selectOption(uint8_t num)
Definition: EmbAJAX.h:634
An HTML span element with content that can be updated from the server (not the client)
Definition: EmbAJAX.h:417
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:261
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:251
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:256
A static chunk of HTML.
Definition: EmbAJAX.h:249
EmbAJAXStatic(const char *content)
Definition: EmbAJAX.h:252
A text input field.
Definition: EmbAJAX.h:387
void setValue(const char *value)
Definition: EmbAJAX.h:405
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.h:409
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.h:399
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.h:395