EmbAJAX
Simplistic framework for creating and handling displays and controls on a web page served by an embeddable device (Arduino or other microcontroller with Arduino support).
EmbAJAX.h
1 
21 #ifndef EMBAJAX_H
22 #define EMBAJAX_H
23 
24 #include <Arduino.h>
25 
26 #define ARDUJAX_MAX_ID_LEN 16
27 
28 // Set to a value above 0 for diagnostics on Serial and browser console
29 //#define EMBAJAX_DEBUG 3
30 
31 #include "macro_definitions.h"
32 
34 class EmbAJAXElement;
35 class EmbAJAXContainerBase;
36 class EmbAJAXPageBase;
37 
42 class EmbAJAXBase {
43 public:
44  virtual void print() const = 0;
47  static void setDriver(EmbAJAXOutputDriverBase *driver) {
48  _driver = driver;
49  }
57  virtual bool sendUpdates(uint16_t since, bool first) {
58  return false;
59  }
63  return 0;
64  }
67  void setVisible(bool visible) {
68  setBasicProperty(Visibility, visible);
69  }
72  void setEnabled(bool enabled) {
73  setBasicProperty(Enabledness, enabled);
74  }
75  enum Property {
76  Visibility=0,
77  Enabledness=1,
78  Value=2,
79  FirstElementSpecificProperty=3,
80  HTMLAllowed=7
81  };
84  virtual EmbAJAXElement* findChild(const char*id) const {
85  return 0;
86  }
87 protected:
88 template<size_t NUM> friend class EmbAJAXContainer;
89  virtual void setBasicProperty(uint8_t num, bool status) {};
90 
91  static EmbAJAXOutputDriverBase *_driver;
92  static char itoa_buf[8];
93  constexpr static const char null_string[1] = "";
94 
96  void printChildren(EmbAJAXBase** children, size_t num) const;
98  bool sendUpdates(EmbAJAXBase** children, size_t num, uint16_t since, bool first);
100  EmbAJAXElement* findChild(EmbAJAXBase** children, size_t num, const char*id) const;
102  void printPage(EmbAJAXBase** children, size_t num, const char* _title, const char* _header, uint16_t _min_interval) const;
104  void handleRequest(EmbAJAXBase** children, size_t num, void (*change_callback)());
105 };
106 
118 public:
120  _revision = 1;
121  next_revision = _revision;
122  }
123 
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;
131  virtual void installPage(EmbAJAXPageBase *page, const char *path, void (*change_callback)()=0) = 0;
133  virtual void loopHook() = 0;
134 
135  uint16_t revision() const {
136  return _revision;
137  }
138  uint16_t setChanged() {
139  next_revision = _revision+1;
140  return (next_revision);
141  }
142  void nextRevision() {
143  _revision = next_revision;
144  }
146  enum QuoteMode {
149  HTMLQuoted
150  };
160  void printFiltered(const char* value, QuoteMode quoted, bool HTMLescaped) {
161  _printFiltered(value, quoted, HTMLescaped);
162  commitBuffer();
163  }
165  inline void printJSQuoted (const char* value) { printFiltered (value, JSQuoted, false); }
167  inline void printHTMLQuoted (const char* value) { printFiltered (value, HTMLQuoted, false); }
175  void printAttribute(const char* name, const char* value);
183  void printAttribute(const char* name, const int32_t value);
190  void _printContentF(const char* fmt, ...);
225 private:
226  void _printFiltered(const char* value, QuoteMode quoted, bool HTMLescaped);
227  void _printContent(const char* content);
228  void _printChar(const char content);
229  void commitBuffer();
230  const int _bufsize = 64;
231  char _buf[64];
232  int _bufpos = 0;
233  uint16_t _revision;
234  uint16_t next_revision;
235 };
236 
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);
244 
249 class EmbAJAXStatic : public EmbAJAXBase {
250 public:
252  EmbAJAXStatic(const char* content) {
253  _content = content;
254  }
255  void print() const override {
256  _driver->printContent(_content);
257  }
258 protected:
259  const char* _content;
260 };
261 
270 public:
275  EmbAJAXConnectionIndicator(const char* content_ok = default_ok, const char* content_fail = default_fail) {
276  _content_ok = content_ok;
277  _content_fail = content_fail;
278  }
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>"};
282 private:
283  const char* _content_ok;
284  const char* _content_fail;
285 };
286 
297 class EmbAJAXElement : public EmbAJAXBase {
298 public:
300  EmbAJAXElement(const char* id);
301 
302  const char* id() const {
303  return _id;
304  }
305  bool sendUpdates(uint16_t since, bool first) override;
306 
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");
313  return 0;
314  }
315 
318  virtual bool valueNeedsEscaping(uint8_t which = EmbAJAXBase::Value) const {
319  return false;
320  }
321 
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");
328  return 0;
329  }
330 
333  virtual void updateFromDriverArg(const char* argname) {
334  return;
335  }
336 
337  EmbAJAXElement *toElement() override final {
338  return this;
339  }
340 protected:
341  void setBasicProperty(uint8_t num, bool status) override;
342  bool basicProperty(uint8_t num) const {
343  return (_flags & (1 << num));
344  }
345  byte _flags;
346 template<size_t NUM> friend class EmbAJAXPage;
347 friend class EmbAJAXBase;
348  const char* _id;
349  void setChanged();
350  bool changed(uint16_t since);
352  void printTextInput(size_t size, const char* value) const;
353 private:
354  uint16_t revision;
355 };
356 
359 public:
360  EmbAJAXMutableSpan(const char* id) : EmbAJAXElement(id) {
361  _value = 0;
362  }
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;
374  void setValue(const char* value, bool allowHTML = false);
375  bool valueNeedsEscaping(uint8_t which=EmbAJAXBase::Value) const override;
376 private:
377  const char* _value;
378 };
379 
387 template<size_t SIZE> class EmbAJAXTextInput : public EmbAJAXElement {
388 public:
389  EmbAJAXTextInput(const char* id) : EmbAJAXElement(id) {
390  _value[0] = '\0';
391  }
392  void print() const override {
393  EmbAJAXElement::printTextInput(SIZE, _value);
394  }
395  const char* value(uint8_t which = EmbAJAXBase::Value) const override {
396  if (which == EmbAJAXBase::Value) return _value;
397  return EmbAJAXElement::value(which);
398  }
399  const char* valueProperty(uint8_t which = EmbAJAXBase::Value) const override {
400  if (which == EmbAJAXBase::Value) return "value";
401  return EmbAJAXElement::valueProperty(which);
402  }
405  void setValue(const char* value) {
406  strncpy(_value, value, SIZE);
407  setChanged();
408  }
409  void updateFromDriverArg(const char* argname) override {
410  _driver->getArg(argname, _value, SIZE);
411  }
412 protected:
413  char _value[SIZE];
414 };
415 
418 public:
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 {
425  return _value;
426  }
427  void updateFromDriverArg(const char* argname) override;
428 private:
429  int16_t _min, _max, _value;
430 };
431 
434 public:
439  EmbAJAXColorPicker(const char* id, uint8_t r, uint8_t g, uint8_t b);
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);
444  uint8_t red() const;
445  uint8_t green() const;
446  uint8_t blue() const;
447  void updateFromDriverArg(const char* argname) override;
448 private:
449  uint8_t _r, _g, _b;
450 };
451 
456 public:
459  EmbAJAXPushButton(const char* id, const char* label, void (*callback)(EmbAJAXPushButton*));
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;
472  bool valueNeedsEscaping(uint8_t which=EmbAJAXBase::Value) const override;
473  void updateFromDriverArg(const char* argname) override;
474 protected:
475  void (*_callback)(EmbAJAXPushButton*);
476  const char* _label;
477 };
478 
488 public:
494  EmbAJAXMomentaryButton(const char* id, const char* label, uint16_t timeout=600, void (*callback)(EmbAJAXPushButton*)=0);
495  void print() const override;
496  enum Status {
497  Pressed,
498  MaybePressed,
499  Released
500  };
501  Status status() const;
502  void updateFromDriverArg(const char* argname) override;
503 private:
504  uint32_t latest_ping;
505  uint16_t _timeout;
506 };
507 
509 
515 public:
516  EmbAJAXCheckButton(const char* id, const char* label, bool checked=false);
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 {
522  return _checked;
523  }
524  void updateFromDriverArg(const char* argname) override;
525 private:
526  bool _checked;
527  const char* _label;
528 template<size_t NUM> friend class EmbAJAXRadioGroup;
530  EmbAJAXRadioGroupBase* radiogroup;
531 };
532 
535 protected:
537 friend class EmbAJAXCheckButton;
538  virtual void selectButton(EmbAJAXCheckButton* which) = 0;
539  const char* _name;
540 };
541 
543 template<size_t NUM> class EmbAJAXContainer : public EmbAJAXBase {
544 public:
545  EmbAJAXContainer(EmbAJAXBase *children[NUM]) : EmbAJAXBase() {
546  _children = children;
547  }
548  void print() const override {
549  EmbAJAXBase::printChildren(_children, NUM);
550  }
551  bool sendUpdates(uint16_t since, bool first) override {
552  return EmbAJAXBase::sendUpdates(_children, NUM, since, first);
553  }
555  EmbAJAXElement* findChild(const char*id) const override final {
556  return EmbAJAXBase::findChild(_children, NUM, id);
557  }
558 protected:
559  void setBasicProperty(uint8_t num, bool status) override {
560  for (int i = 0; i < NUM; ++i) {
561  _children[i]->setBasicProperty(num, status);
562  }
563  }
564 template<size_t> friend class EmbAJAXHideableContainer;
565  EmbAJAXContainer() {};
566  EmbAJAXBase** _children;
567 };
568 
582 template<size_t NUM> class EmbAJAXHideableContainer : public EmbAJAXElement {
583 public:
584  EmbAJAXHideableContainer(const char* id, EmbAJAXBase *children[NUM]) : EmbAJAXElement(id) {
585  _childlist = EmbAJAXContainer<NUM>(children);
586  }
587  void print() const override {
588  _driver->printFormatted("<div id=", HTML_QUOTED_STRING(_id), ">");
589  _childlist.print();
590  _driver->printContent("</div>");
591  }
592  EmbAJAXElement* findChild(const char* id) const override {
593  return _childlist.findChild(id);
594  }
595  bool sendUpdates(uint16_t since, bool first) override {
596  bool sent = EmbAJAXElement::sendUpdates(since, first);
597  bool sent2 = _childlist.sendUpdates(since, first && !sent);
598  return sent || sent2;
599  }
600 protected:
601  void setBasicProperty(uint8_t num, bool status) override {
602  EmbAJAXElement::setBasicProperty(num, status);
603  _childlist.setBasicProperty(num, status);
604  }
605  EmbAJAXContainer<NUM> _childlist;
606 };
607 
613 template<size_t NUM> class EmbAJAXRadioGroup : public EmbAJAXContainer<NUM>, public EmbAJAXRadioGroupBase {
614 public:
620  EmbAJAXRadioGroup(const char* id_base, const char* options[NUM], uint8_t selected_option = 0) : EmbAJAXContainer<NUM>(), EmbAJAXRadioGroupBase() {
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);
625  buttons[i] = EmbAJAXCheckButton(childid, options[i], i == selected_option);
626  buttons[i].radiogroup = this;
627  buttonpointers[i] = &buttons[i];
628  }
629  _current_option = selected_option;
630  EmbAJAXContainer<NUM>::_children = buttonpointers; // Hm, why do I need to specify EmbAJAXContainer<NUM>::, explicitly?
631  _name = id_base;
632  }
634  void selectOption(uint8_t num) {
635  for (uint8_t i = 0; i < NUM; ++i) {
636  buttons[i].setChecked(i == num);
637  }
638  _current_option = num; // NOTE: might be outside of range, but that's ok, signifies "none selected"
639  }
641  uint8_t selectedOption() const {
642  return _current_option;
643  }
646  EmbAJAXBase* button(uint8_t num) {
647  if (num < NUM) return (&buttons[num]);
648  return 0;
649  }
650 private:
651  EmbAJAXCheckButton buttons[NUM];
652  EmbAJAXBase* buttonpointers[NUM];
653  char childids[NUM][ARDUJAX_MAX_ID_LEN];
654  int8_t _current_option;
655  void selectButton(EmbAJAXCheckButton* which) override {
656  _current_option = -1;
657  for (uint8_t i = 0; i < NUM; ++i) {
658  if (which == buttonpointers[i]) {
659  _current_option = i;
660  } else {
661  buttons[i].setChecked(false);
662  }
663  }
664  }
665 };
666 
669 public:
671  void selectOption(uint8_t num);
673  uint8_t selectedOption() const;
674  const char* value(uint8_t which = EmbAJAXBase::Value) const override;
675  const char* valueProperty(uint8_t which = EmbAJAXBase::Value) const override;
676  void updateFromDriverArg(const char* argname) override;
677 protected:
678  EmbAJAXOptionSelectBase(const char*id, uint8_t current_option) : EmbAJAXElement(id) {
679  _current_option = current_option;
680  };
681  void print(const char* const* _labels, uint8_t NUM) const;
682  uint8_t _current_option;
683 };
684 
689 template<size_t NUM> class EmbAJAXOptionSelect : public EmbAJAXOptionSelectBase {
690 public:
695  EmbAJAXOptionSelect(const char* id, const char* labels[NUM], uint8_t selected_option = 0) : EmbAJAXOptionSelectBase(id, selected_option) {
696  for (uint8_t i = 0; i < NUM; ++i) {
697  _labels[i] = labels[i];
698  }
699  }
700  void print() const override {
701  EmbAJAXOptionSelectBase::print(_labels, NUM);
702  }
703 private:
704  const char* _labels[NUM];
705 };
706 
711 public:
712  virtual void handleRequest(void (*change_callback)()=0) = 0;
713  virtual void printPage() = 0;
714 };
715 
722 template<size_t NUM> class EmbAJAXPage : public EmbAJAXContainer<NUM>, public EmbAJAXPageBase {
723 public:
729  EmbAJAXPage(EmbAJAXBase* children[NUM], const char* title, const char* header_add = 0, uint16_t min_interval=100) : EmbAJAXContainer<NUM>(children),
730  _title(title ? title : EmbAJAXBase::null_string), _header_add(header_add ? header_add : EmbAJAXBase::null_string), _min_interval(min_interval) {}
732  void printPage() override {
733  print();
734  }
737  void print() const override {
738  EmbAJAXBase::printPage(EmbAJAXContainer<NUM>::_children, NUM, _title, _header_add, _min_interval);
739  }
748  void handleRequest(void (*change_callback)()=0) override {
749  _latest_ping = millis();
751  }
755  bool hasActiveClient(uint64_t latency_ms=5000) const {
756  return(_latest_ping && (_latest_ping + latency_ms > millis()));
757  }
758 protected:
759  const char* _title;
760  const char* _header_add;
761  uint16_t _min_interval;
762  uint64_t _latest_ping = 0;
763 };
764 
765 // If the user has not #includ'ed a specific output driver implementation, make a good guess, here
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"
773 #else
774 #include <WebServer.h>
775 #define EmbAJAXOutputDriverWebServerClass WebServer
776 #include <WiFi.h>
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.
780 #endif
781 #endif
782 
783 #endif
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 checkable (option) button.
Definition: EmbAJAX.h:514
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:441
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:446
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:453
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
A momentary "press-and-hold" button.
Definition: EmbAJAX.h:487
EmbAJAXMomentaryButton(const char *id, const char *label, uint16_t timeout=600, void(*callback)(EmbAJAXPushButton *)=0)
Definition: EmbAJAX.cpp:387
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:409
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
A push-button.
Definition: EmbAJAX.h:455
void setText(const char *label, bool allowHTML=false)
Definition: EmbAJAX.cpp:360
void updateFromDriverArg(const char *argname) override
Definition: EmbAJAX.cpp:381
const char * valueProperty(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:376
const char * value(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:366
bool valueNeedsEscaping(uint8_t which=EmbAJAXBase::Value) const override
Definition: EmbAJAX.cpp:371
EmbAJAXPushButton(const char *id, const char *label, void(*callback)(EmbAJAXPushButton *))
Definition: EmbAJAX.cpp:347
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