diff --git a/CHANGELOG.md b/CHANGELOG.md
index d245af292..0ca625dce 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file.
- Command ``SspmScan`` to rescan Sonoff SPM modbus
- Support for MQ analog sensor for air quality by Francesco Adriani (#14581)
- Command ``SetOption134 1`` to disable PWM auto-phasing for lights by default (new behavior) (#14590)
+- Increase PWM channels to 16 (Esp32 only)
### Changed
- BME68x-Sensor-API library from v3.5.9 to v4.4.7
diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index 65b38dae9..4593a859c 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -1,6 +1,5 @@
# I2C devices
-
-Tasmota supports several I2C devices but to use them they mostly need to be enabled at compile time to solve possible address conflicts.
+Tasmota supports several I2C devices. To use them I2C and the device need to be enabled at compile time. I2C and some devices are supported also in the official releases. Devices can be de/-actived on runtime to solve possible address conflicts. (e.g. address 0x27 is used by multiple devices)
Using command ``I2cDriver`` individual drivers can be enabled or disabled at runtime allowing duplicate I2C addresses at compile time. Use the Index from the table below to control I2C drivers like ``I2cDriver10 0`` for disabling BMP support.
@@ -41,7 +40,7 @@ Index | Define | Driver | Device | Address(es) | Description
19 | USE_SI1145 | xsns_24 | SI1147 | 0x60 | Ultra violet index and light sensor
20 | USE_LM75AD | xsns_26 | LM75AD | 0x48 - 0x4F | Temperature sensor
21 | USE_APDS9960 | xsns_27 | APDS9960 | 0x39 | Proximity ambient light RGB and gesture sensor
- 22 | USE_MCP230xx | xsns_29 | MCP23008 | 0x20 - 0x26 | 16-bit I/O expander
+ 22 | USE_MCP230xx | xsns_29 | MCP23008 | 0x20 - 0x26 | 8-bit I/O expander
22 | USE_MCP230xx | xsns_29 | MCP23017 | 0x20 - 0x26 | 16-bit I/O expander
23 | USE_MPR121 | xsns_30 | MPR121 | 0x5A - 0x5D | Proximity capacitive touch sensor
24 | USE_CCS811 | xsns_31 | CCS811 | 0x5A | Gas (TVOC) and air quality sensor
diff --git a/boards/esp32s3.json b/boards/esp32s3.json
new file mode 100644
index 000000000..fe2f14706
--- /dev/null
+++ b/boards/esp32s3.json
@@ -0,0 +1,35 @@
+{
+ "build": {
+ "arduino":{
+ "ldscript": "esp32s3_out.ld"
+ },
+ "core": "esp32",
+ "extra_flags": "-DBOARD_HAS_PSRAM -DESP32_4M -DESP32S3",
+ "f_cpu": "240000000L",
+ "f_flash": "80000000L",
+ "flash_mode": "dout",
+ "mcu": "esp32s3",
+ "variant": "esp32s3",
+ "partitions": "esp32_partition_app1856k_spiffs320k.csv"
+ },
+ "connectivity": [
+ "wifi"
+ ],
+ "debug": {
+ "openocd_target": "esp32s3.cfg"
+ },
+ "frameworks": [
+ "espidf",
+ "arduino"
+ ],
+ "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 1856k Code/OTA, 320k FS",
+ "upload": {
+ "flash_size": "4MB",
+ "maximum_ram_size": 327680,
+ "maximum_size": 4194304,
+ "require_upload_port": true,
+ "speed": 460800
+ },
+ "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/",
+ "vendor": "Espressif"
+}
diff --git a/include/esp32x_fixes.h b/include/esp32x_fixes.h
index 047a343c8..62a9c2824 100644
--- a/include/esp32x_fixes.h
+++ b/include/esp32x_fixes.h
@@ -52,6 +52,13 @@
#define HSPI_HOST SPI3_HOST
#define VSPI_HOST SPI3_HOST
+#elif CONFIG_IDF_TARGET_ESP32S3
+// SPI_HOST (SPI1_HOST) is not supported by the SPI Master and SPI Slave driver on ESP32-S2 and later
+#define SPI_HOST SPI1_HOST
+#define FSPI_HOST SPI2_HOST
+#define HSPI_HOST SPI3_HOST
+#define VSPI_HOST SPI3_HOST
+
#elif CONFIG_IDF_TARGET_ESP32C3
#define SPI_HOST SPI1_HOST
#define HSPI_HOST SPI2_HOST
diff --git a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp
index 7347fa74f..b51339b32 100644
--- a/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp
+++ b/lib/lib_display/Arduino_ST7789-gemu-1.0/Arduino_ST7789.cpp
@@ -18,6 +18,7 @@ const uint16_t ST7789_colors[]={ST7789_BLACK,ST7789_WHITE,ST7789_RED,ST7789_GREE
ST7789_LIGHTGREY,ST7789_DARKGREY,ST7789_ORANGE,ST7789_GREENYELLOW,ST7789_PINK};
#ifdef ESP32
+#include "esp8266toEsp32.h"
#define ST7789_DIMMER
#endif
@@ -258,11 +259,9 @@ void Arduino_ST7789::commonInit(const uint8_t *cmdList) {
}
if (_bp>=0) {
-#define ESP32_PWM_CHANNEL 1
+// #define ESP32_PWM_CHANNEL 1
#ifdef ST7789_DIMMER
- ledcSetup(ESP32_PWM_CHANNEL,4000,8);
- ledcAttachPin(_bp,ESP32_PWM_CHANNEL);
- ledcWrite(ESP32_PWM_CHANNEL,128);
+ analogWrite(_bp, 128);
#else
pinMode(_bp, OUTPUT);
#endif
@@ -575,7 +574,8 @@ void Arduino_ST7789::DisplayOnff(int8_t on) {
writecommand(ST7789_DISPON); //Display on
if (_bp>=0) {
#ifdef ST7789_DIMMER
- ledcWrite(ESP32_PWM_CHANNEL,dimmer);
+ analogWrite(_bp, dimmer);
+ // ledcWrite(ESP32_PWM_CHANNEL,dimmer);
#else
digitalWrite(_bp,HIGH);
#endif
@@ -584,7 +584,8 @@ void Arduino_ST7789::DisplayOnff(int8_t on) {
writecommand(ST7789_DISPOFF);
if (_bp>=0) {
#ifdef ST7789_DIMMER
- ledcWrite(ESP32_PWM_CHANNEL,0);
+ analogWrite(_bp, 0);
+ // ledcWrite(ESP32_PWM_CHANNEL,0);
#else
digitalWrite(_bp,LOW);
#endif
@@ -598,7 +599,8 @@ void Arduino_ST7789::dim(uint8_t dim) {
if (dimmer>15) dimmer=15;
dimmer=((float)dimmer/15.0)*255.0;
#ifdef ESP32
- ledcWrite(ESP32_PWM_CHANNEL,dimmer);
+ analogWrite(_bp, dimmer);
+ // ledcWrite(ESP32_PWM_CHANNEL,dimmer);
#endif
}
diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
index e09ab71a8..d71a77368 100644
--- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.cpp
@@ -59,10 +59,10 @@ uint16_t Renderer::GetColorFromIndex(uint8_t index) {
void Renderer::dim(uint8_t contrast) {
uint8_t contrast8 = ((uint32_t)contrast * 255) / 15;
- dim8(contrast8, contrast8);
+ dim10(contrast8, contrast8 * 4);
}
-void Renderer::dim8(uint8_t contrast, uint8_t contrast_gamma) {
+void Renderer::dim10(uint8_t contrast, uint16_t contrast_gamma) {
}
diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
index 3e3304fbb..925b0ad7d 100644
--- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
+++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h
@@ -72,7 +72,7 @@ public:
virtual void Begin(int16_t p1,int16_t p2,int16_t p3);
virtual void Updateframe();
virtual void dim(uint8_t contrast); // input has range 0..15
- virtual void dim8(uint8_t contrast, uint8_t contrast_gamma); // input has range 0..255, second arg has gamma correction for PWM
+ virtual void dim10(uint8_t contrast, uint16_t contrast_gamma); // input has range 0..255, second arg has gamma correction for PWM with 10 bits resolution
virtual void pushColors(uint16_t *data, uint16_t len, boolean first);
virtual void setAddrWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1);
virtual void invertDisplay(boolean i);
diff --git a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp
index 4459eb957..2da8d4091 100644
--- a/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp
+++ b/lib/lib_display/ILI9341-gemu-1.0/ILI9341_2.cpp
@@ -53,6 +53,7 @@
// ESP32 uses 2. SPI BUS, ESP8266 uses software spi
#ifdef ESP32
+#include "esp8266toEsp32.h"
#undef ILI9341_2_DIMMER
#define ILI9341_2_DIMMER
#undef ESP32_PWM_CHANNEL
@@ -248,9 +249,7 @@ void ILI9341_2::init(uint16_t width, uint16_t height) {
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
- ledcSetup(ESP32_PWM_CHANNEL, 4000, 8);
- ledcAttachPin(_bp, ESP32_PWM_CHANNEL);
- ledcWrite(ESP32_PWM_CHANNEL, 128);
+ analogWrite(_bp, 511);
#else
pinMode(_bp, OUTPUT);
#endif
@@ -544,7 +543,8 @@ void ILI9341_2::DisplayOnff(int8_t on) {
SPI_END_TRANSACTION();
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
- ledcWrite(ESP32_PWM_CHANNEL, dimmer);
+ analogWrite(_bp, dimmer * 4);
+ // ledcWrite(ESP32_PWM_CHANNEL, dimmer);
#else
digitalWrite(_bp, HIGH);
#endif
@@ -557,7 +557,8 @@ void ILI9341_2::DisplayOnff(int8_t on) {
SPI_END_TRANSACTION();
if (_bp >= 0) {
#ifdef ILI9341_2_DIMMER
- ledcWrite(ESP32_PWM_CHANNEL, 0);
+ analogWrite(_bp, 0);
+ // ledcWrite(ESP32_PWM_CHANNEL, 0);
#else
digitalWrite(_bp, LOW);
#endif
@@ -604,7 +605,8 @@ void ILI9341_2::dim(uint8_t dim) {
dimmer=((float)dimmer/15.0)*255.0;
#ifdef ESP32
if (_bp>=0) {
- ledcWrite(ESP32_PWM_CHANNEL,dimmer);
+ analogWrite(_bp, dimmer * 4);
+ // ledcWrite(ESP32_PWM_CHANNEL,dimmer);
} else {
if (_hwspi>=2) {
//ili9342_dimm(dim);
diff --git a/lib/lib_display/UDisplay/uDisplay.cpp b/lib/lib_display/UDisplay/uDisplay.cpp
index f6ac1a20b..4581cee9c 100755
--- a/lib/lib_display/UDisplay/uDisplay.cpp
+++ b/lib/lib_display/UDisplay/uDisplay.cpp
@@ -20,6 +20,10 @@
#include
#include "uDisplay.h"
+#ifdef ESP32
+#include "esp8266toEsp32.h"
+#endif
+
// #define UDSP_DEBUG
const uint16_t udisp_colors[]={UDISP_BLACK,UDISP_WHITE,UDISP_RED,UDISP_GREEN,UDISP_BLUE,UDISP_CYAN,UDISP_MAGENTA,\
@@ -428,9 +432,7 @@ Renderer *uDisplay::Init(void) {
if (bpanel >= 0) {
#ifdef ESP32
- ledcSetup(ESP32_PWM_CHANNEL, 977, 8); // use 10 bits resolution like in Light
- ledcAttachPin(bpanel, ESP32_PWM_CHANNEL);
- ledcWrite(ESP32_PWM_CHANNEL, 8); // 38/255 correspond roughly to 50% visual brighness (with Gamma)
+ analogWrite(bpanel, 32);
#else
pinMode(bpanel, OUTPUT);
digitalWrite(bpanel, HIGH);
@@ -1353,7 +1355,8 @@ void uDisplay::DisplayOnff(int8_t on) {
if (dsp_on != 0xff) spi_command_one(dsp_on);
if (bpanel >= 0) {
#ifdef ESP32
- ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
+ analogWrite(bpanel, dimmer10_gamma);
+ // ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
#else
digitalWrite(bpanel, HIGH);
#endif
@@ -1363,7 +1366,8 @@ void uDisplay::DisplayOnff(int8_t on) {
if (dsp_off != 0xff) spi_command_one(dsp_off);
if (bpanel >= 0) {
#ifdef ESP32
- ledcWrite(ESP32_PWM_CHANNEL, 0);
+ analogWrite(bpanel, 0);
+ // ledcWrite(ESP32_PWM_CHANNEL, 0);
#else
digitalWrite(bpanel, LOW);
#endif
@@ -1402,16 +1406,17 @@ void udisp_dimm(uint8_t dim);
// }
// dim is 0..255
-void uDisplay::dim8(uint8_t dim, uint8_t dim_gamma) { // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller
+void uDisplay::dim10(uint8_t dim, uint16_t dim_gamma) { // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller
dimmer8 = dim;
- dimmer8_gamma = dim_gamma;
+ dimmer10_gamma = dim_gamma;
if (ep_mode) {
return;
}
#ifdef ESP32 // TODO should we also add a ESP8266 version for bpanel?
if (bpanel >= 0) { // is the BaclPanel GPIO configured
- ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
+ analogWrite(bpanel, dimmer10_gamma);
+ // ledcWrite(ESP32_PWM_CHANNEL, dimmer8_gamma);
} else if (dim_cbp) {
dim_cbp(dim);
}
diff --git a/lib/lib_display/UDisplay/uDisplay.h b/lib/lib_display/UDisplay/uDisplay.h
index 3dbc5aed7..b5eae65c5 100755
--- a/lib/lib_display/UDisplay/uDisplay.h
+++ b/lib/lib_display/UDisplay/uDisplay.h
@@ -74,9 +74,6 @@ enum uColorType { uCOLOR_BW, uCOLOR_COLOR };
#define SPI_DC_LOW if (spi_dc >= 0) GPIO_CLR_SLOW(spi_dc);
#define SPI_DC_HIGH if (spi_dc >= 0) GPIO_SET_SLOW(spi_dc);
-
-#define ESP32_PWM_CHANNEL 1
-
#define LUTMAXSIZE 64
class uDisplay : public Renderer {
@@ -93,7 +90,7 @@ class uDisplay : public Renderer {
uint16_t bgcol(void);
int8_t color_type(void);
// void dim(uint8_t dim); // original version with 4 bits resolution 0..15
- virtual void dim8(uint8_t dim, uint8_t dim_gamma); // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller
+ virtual void dim10(uint8_t dim, uint16_t dim_gamma); // dimmer with 8 bits resolution, 0..255. Gamma correction must be done by caller with 10 bits resolution
uint16_t GetColorFromIndex(uint8_t index);
void setRotation(uint8_t m);
void fillScreen(uint16_t color);
@@ -186,7 +183,7 @@ class uDisplay : public Renderer {
int8_t bpanel; // backbanel GPIO, -1 if none
int8_t spi_miso;
uint8_t dimmer8; // 8 bits resolution, 0..255
- uint8_t dimmer8_gamma; // 8 bits resolution, 0..255, gamma corrected
+ uint16_t dimmer10_gamma; // 10 bits resolution, 0..1023, gamma corrected
SPIClass *uspi;
uint8_t sspi;
SPISettings spiSettings;
diff --git a/lib/lib_div/OpenTherm-0.9.0/tasmota_lib_changes.md b/lib/lib_div/OpenTherm-0.9.0/tasmota_lib_changes.md
new file mode 100644
index 000000000..148754d22
--- /dev/null
+++ b/lib/lib_div/OpenTherm-0.9.0/tasmota_lib_changes.md
@@ -0,0 +1,29 @@
+Attention when updating library. Changes in lib needed!!
+All OpenTherm constants shall be prepended with `OPTH_` to avoid conflicts with other libs.
+
+See commit https://github.com/arendst/Tasmota/commit/960291729ccc7cb4da50108e5299d44a79cb06de
+
+As of OpenTherm-0.9.0, hte list is:
+ OPTH_NONE
+ OPTH_SUCCESS
+ OPTH_INVALID
+ OPTH_TIMEOUT
+ OPTH_READ_DATA
+ OPTH_READ
+ OPTH_WRITE_DATA
+ OPTH_WRITE
+ OPTH_INVALID_DATA
+ OPTH_RESERVED
+ OPTH_READ_ACK
+ OPTH_WRITE_ACK
+ OPTH_DATA_INVALID
+ OPTH_UNKNOWN_DATA_ID
+ OPTH_NOT_INITIALIZED
+ OPTH_READY
+ OPTH_DELAY
+ OPTH_REQUEST_SENDING
+ OPTH_RESPONSE_WAITING
+ OPTH_RESPONSE_START_BIT
+ OPTH_RESPONSE_RECEIVING
+ OPTH_RESPONSE_READY
+ OPTH_RESPONSE_INVALID
diff --git a/lib/lib_div/lib_mail/src/wcs/esp8266/ESP_Mail_WCS.cpp b/lib/lib_div/lib_mail/src/wcs/esp8266/ESP_Mail_WCS.cpp
index f24adaef3..d419a9249 100755
--- a/lib/lib_div/lib_mail/src/wcs/esp8266/ESP_Mail_WCS.cpp
+++ b/lib/lib_div/lib_mail/src/wcs/esp8266/ESP_Mail_WCS.cpp
@@ -50,7 +50,9 @@ extern "C"
#include
#include
#include
-#include
+#ifdef ESP8266
+ #include
+#endif
#include
#if !CORE_MOCK
diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
index d714c4bd0..4028c4c5e 100755
--- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
+++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
@@ -43,8 +43,8 @@
#include "lwip/netif.h"
#ifdef ESP8266
#include
+ #include "c_types.h"
#endif
-#include "c_types.h"
#include
#undef DEBUG_TLS
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/c_types.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/c_types.h
deleted file mode 100644
index 22f551391..000000000
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/c_types.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#pragma once
-/**/
-#include
-#ifndef ICACHE_FLASH_ATTR
-#define ICACHE_FLASH_ATTR
-#endif
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/eboot_command.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/eboot_command.h
deleted file mode 100644
index 992d014ea..000000000
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/eboot_command.h
+++ /dev/null
@@ -1,3 +0,0 @@
-//
-// Compat with ESP32
-//
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp
index fbead560a..372d03a7a 100644
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp
+++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp
@@ -13,58 +13,66 @@
along with this program. If not, see .
*/
-//
+
+#ifdef ESP32
+
#include "Arduino.h"
-//#include "lwip/apps/sntp.h"
-#include
-
-// See libraries\ESP32\examples\ResetReason.ino
-#if ESP_IDF_VERSION_MAJOR > 3 // IDF 4+
- #if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4
- #include "esp32/rom/rtc.h"
- #elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2
- #include "esp32s2/rom/rtc.h"
- #elif CONFIG_IDF_TARGET_ESP32C3 // ESP32-C3
- #include "esp32c3/rom/rtc.h"
- #else
- #error Target CONFIG_IDF_TARGET is not supported
- #endif
-#else // ESP32 Before IDF 4.0
- #include "rom/rtc.h"
-#endif
-
-#include
#include "esp8266toEsp32.h"
+#include "driver/ledc.h"
+
+// Tasmota Logging
+extern void AddLog(uint32_t loglevel, PGM_P formatP, ...);
+enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG_MORE};
// ESP Stuff
+// replicated from `tasmota.h`
+#if defined(CONFIG_IDF_TARGET_ESP32)
+ const uint8_t MAX_PWMS = 16; // ESP32: 16 ledc PWM channels in total - TODO for now
+#elif defined(CONFIG_IDF_TARGET_ESP32S2)
+ const uint8_t MAX_PWMS = 8; // ESP32S2: 8 ledc PWM channels in total
+#elif defined(CONFIG_IDF_TARGET_ESP32S3)
+ const uint8_t MAX_PWMS = 8; // ESP32S2: 8 ledc PWM channels in total
+#elif defined(CONFIG_IDF_TARGET_ESP32C3)
+ const uint8_t MAX_PWMS = 6; // ESP32C3: 6 ledc PWM channels in total
+#else
+ const uint8_t MAX_PWMS = 5; // Unknown - revert to 5 PWM max
+#endif
+
+// channel mapping
+static uint8_t pwm_channel[MAX_PWMS];
+static uint32_t pwm_frequency = 977; // Default 977Hz
+static uint8_t pwm_bit_num = 10; // Default 1023
+static bool pwm_impl_inited = false; // trigger initialization
+
/*********************************************************************************************\
* ESP32 analogWrite emulation support
\*********************************************************************************************/
-#if CONFIG_IDF_TARGET_ESP32C3
- uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99 };
- uint32_t _pwm_frequency = 977; // Default 977Hz
- uint8_t _pwm_bit_num = 10; // Default 1023
-#else // other ESP32
- uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99, 99, 99 };
- uint32_t _pwm_frequency = 977; // Default 977Hz
- uint8_t _pwm_bit_num = 10; // Default 1023
-#endif // CONFIG_IDF_TARGET_ESP32C3 vs ESP32
+void _analogInit(void) {
+ if (pwm_impl_inited) return;
+ // set all channels to unaffected (255)
+ for (uint32_t i = 0; i < MAX_PWMS; i++) {
+ pwm_channel[i] = 255;
+ }
+ pwm_impl_inited = true;
+}
-uint32_t _analog_pin2chan(uint32_t pin) {
- for (uint32_t channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) {
- if ((_pwm_channel[channel] < 99) && (_pwm_channel[channel] == pin)) {
+int32_t _analog_pin2chan(uint32_t pin) { // returns -1 if uallocated
+ _analogInit(); // make sure the mapping array is initialized
+ for (uint32_t channel = 0; channel < MAX_PWMS; channel++) {
+ if ((pwm_channel[channel] < 255) && (pwm_channel[channel] == pin)) {
return channel;
}
}
- return 0;
+ return -1;
}
void _analogWriteFreqRange(void) {
- for (uint32_t channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) {
- if (_pwm_channel[channel] < 99) {
- ledcSetup(channel + PWM_CHANNEL_OFFSET, _pwm_frequency, _pwm_bit_num);
+ _analogInit(); // make sure the mapping array is initialized
+ for (uint32_t channel = 0; channel < MAX_PWMS; channel++) {
+ if (pwm_channel[channel] < 255) {
+ ledcSetup(channel, pwm_frequency, pwm_bit_num);
}
}
}
@@ -80,50 +88,43 @@ uint32_t _analogGetResolution(uint32_t x) {
}
void analogWriteRange(uint32_t range) {
- _pwm_bit_num = _analogGetResolution(range);
+ pwm_bit_num = _analogGetResolution(range);
_analogWriteFreqRange();
}
void analogWriteFreq(uint32_t freq) {
- _pwm_frequency = freq;
+ pwm_frequency = freq;
_analogWriteFreqRange();
}
-bool analogAttach(uint32_t pin) {
+int32_t analogAttach(uint32_t pin) { // returns ledc channel used, or -1 if failed
+ _analogInit(); // make sure the mapping array is initialized
// Find if pin is already attached
- uint32_t channel;
- for (channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) {
- if (_pwm_channel[channel] == pin) {
- // Already attached
- // Serial.printf("PWM: Already attached pin %d to channel %d\n", pin, channel);
- return true;
- }
- }
+ int32_t channel = _analog_pin2chan(pin);
+ if (channel >= 0) { return channel; }
// Find an empty channel
- for (channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) {
- if (99 == _pwm_channel[channel]) {
- _pwm_channel[channel] = pin;
- ledcAttachPin(pin, channel + PWM_CHANNEL_OFFSET);
- ledcSetup(channel + PWM_CHANNEL_OFFSET, _pwm_frequency, _pwm_bit_num);
+ for (channel = 0; channel < MAX_PWMS; channel++) {
+ if (255 == pwm_channel[channel]) {
+ pwm_channel[channel] = pin;
+ ledcAttachPin(pin, channel);
+ ledcSetup(channel, pwm_frequency, pwm_bit_num);
// Serial.printf("PWM: New attach pin %d to channel %d\n", pin, channel);
- return true;
+ return channel;
}
}
// No more channels available
- return false;
+ AddLog(LOG_LEVEL_INFO, "PWM: no more PWM (ledc) channel for GPIO %i", pin);
+ return -1;
}
// void analogWrite(uint8_t pin, int val);
-extern "C" void __wrap__Z11analogWritehi(uint8_t pin, int val)
-{
- uint32_t channel = _analog_pin2chan(pin);
- if ( val >> (_pwm_bit_num-1) ) ++val;
- ledcWrite(channel + PWM_CHANNEL_OFFSET, val);
- // Serial.printf("write %d - %d\n",channel,val);
+extern "C" void __wrap__Z11analogWritehi(uint8_t pin, int val) {
+ analogWritePhase(pin, val, 0); // if unspecified, use phase = 0
}
+
/*
- The primary goal of this library is to add phase control to PWM ledc
+ The primary goal of this function is to add phase control to PWM ledc
functions.
Phase control allows to stress less the power supply of LED lights.
@@ -142,35 +143,28 @@ extern "C" void __wrap__Z11analogWritehi(uint8_t pin, int val)
implementation changes.
*/
-#include "driver/ledc.h"
-
-#ifdef SOC_LEDC_SUPPORT_HS_MODE
-#define LEDC_CHANNELS (SOC_LEDC_CHANNEL_NUM<<1)
-#else
-#define LEDC_CHANNELS (SOC_LEDC_CHANNEL_NUM)
-#endif
-
// exported from Arduno Core
-extern uint8_t channels_resolution[LEDC_CHANNELS];
+extern uint8_t channels_resolution[MAX_PWMS];
void analogWritePhase(uint8_t pin, uint32_t duty, uint32_t phase)
{
- uint32_t chan = _analog_pin2chan(pin) + PWM_CHANNEL_OFFSET;
- if (duty >> (_pwm_bit_num-1) ) ++duty;
-
- if(chan >= LEDC_CHANNELS){
- return;
+ int32_t chan = _analog_pin2chan(pin);
+ if (chan < 0) { // not yet allocated, try to allocate
+ chan = analogAttach(pin);
+ if (chan < 0) { return; } // failed
}
+
+ if (duty >> (pwm_bit_num-1) ) ++duty; // input is 0..1023 but PWM takes 0..1024 - so we skip at mid-range. It creates a small non-linearity
+ if (phase >> (pwm_bit_num-1) ) ++phase;
+
uint8_t group=(chan/8), channel=(chan%8);
//Fixing if all bits in resolution is set = LEDC FULL ON
uint32_t max_duty = (1 << channels_resolution[chan]) - 1;
- phase = phase % max_duty;
-
- if(duty == max_duty){ // no sure whether this is needed anymore TODO
- duty = max_duty + 1;
- }
+ phase = phase & max_duty;
ledc_set_duty_with_hpoint((ledc_mode_t)group, (ledc_channel_t)channel, duty, phase);
ledc_update_duty((ledc_mode_t)group, (ledc_channel_t)channel);
}
+
+#endif // ESP32
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
index adda5f2eb..b32e16bcf 100644
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
+++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h
@@ -13,39 +13,21 @@
along with this program. If not, see .
*/
-#pragma once
+#ifndef __ESP8266TOESP32_H__
+#define __ESP8266TOESP32_H__
+
#ifdef ESP32
-// my debug Stuff
-#define Serial_Debug1(p) Serial.printf p
-#define Serial_DebugX(p)
//
// basics
//
-// dummy defines
-//#define SPIFFS_END (SPI_FLASH_SEC_SIZE * 200)
-//#define SETTINGS_LOCATION SPIFFS_END
-
#include
-#if CONFIG_IDF_TARGET_ESP32C3
- #define PWM_SUPPORTED_CHANNELS 6
- #define PWM_CHANNEL_OFFSET 1 // Webcam uses channel 0, so we offset standard PWM
-#else // other ESP32
- #define PWM_SUPPORTED_CHANNELS 8
- #define PWM_CHANNEL_OFFSET 2 // Webcam uses channel 0, so we offset standard PWM
-#endif // CONFIG_IDF_TARGET_ESP32C3 vs ESP32
-extern uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS];
-extern uint32_t _pwm_frequency;
-extern uint8_t _pwm_bit_num;
-
-void _analogWriteFreqRange(void);
// input range is in full range, ledc needs bits
-uint32_t _analogGetResolution(uint32_t x);
void analogWriteRange(uint32_t range);
void analogWriteFreq(uint32_t freq);
-bool analogAttach(uint32_t pin);
+int32_t analogAttach(uint32_t pin); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated
void analogWrite(uint8_t pin, int val);
// Extended version that also allows to change phase
@@ -56,8 +38,6 @@ extern void analogWritePhase(uint8_t pin, uint32_t duty, uint32_t phase = 0);
#define INPUT_PULLDOWN_16 INPUT_PULLUP
-typedef double real64_t;
-
//
// Time and Timer
//
@@ -71,7 +51,6 @@ typedef double real64_t;
// Serial minimal type to hold the config
typedef int SerConfu8;
typedef int SerialConfig;
-//#define analogWrite(a, b)
//
// UDP
@@ -79,9 +58,6 @@ typedef int SerialConfig;
//#define PortUdp_writestr(log_data) PortUdp.write((const uint8_t *)(log_data), strlen(log_data))
#define PortUdp_write(log_data, n) PortUdp.write((const uint8_t *)(log_data), n)
-//
-#define wifi_forceSleepBegin()
-
#undef LWIP_IPV6
#define REASON_DEFAULT_RST 0 // "Power on" normal startup by power on
@@ -106,4 +82,5 @@ typedef int SerialConfig;
#define STATION_IF 0
-#endif
+#endif // ESP32
+#endif // __ESP8266TOESP32_H__
diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/osapi.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/osapi.h
deleted file mode 100644
index 947de57cc..000000000
--- a/lib/libesp32/ESP32-to-ESP8266-compat/src/osapi.h
+++ /dev/null
@@ -1,8 +0,0 @@
-#pragma once
-/**/
-#include
-/*
-#ifndef ICACHE_FLASH_ATTR
-#define ICACHE_FLASH_ATTR
-#endif
-*/
diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c
index 989cad873..71b2a4875 100644
--- a/lib/libesp32/berry/default/be_modtab.c
+++ b/lib/libesp32/berry/default/be_modtab.c
@@ -41,6 +41,7 @@ be_extern_native_module(webserver);
be_extern_native_module(flash);
be_extern_native_module(path);
be_extern_native_module(unishox);
+be_extern_native_module(uuid);
be_extern_native_module(animate);
#ifdef USE_LVGL
be_extern_native_module(lv);
@@ -118,6 +119,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = {
&be_native_module(light),
#endif
+ &be_native_module(uuid),
#ifdef USE_UNISHOX_COMPRESSION
&be_native_module(unishox),
#endif // USE_UNISHOX_COMPRESSION
diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h
index 6bedac03a..4406e5ef7 100644
--- a/lib/libesp32/berry/generate/be_const_strtab.h
+++ b/lib/libesp32/berry/generate/be_const_strtab.h
@@ -41,12 +41,15 @@ extern const bcstring be_const_str_EVENT_DELETE;
extern const bcstring be_const_str_EVENT_DRAW_MAIN;
extern const bcstring be_const_str_EVENT_DRAW_PART_BEGIN;
extern const bcstring be_const_str_EVENT_DRAW_PART_END;
+extern const bcstring be_const_str_EXTERNAL_I2S;
extern const bcstring be_const_str_False;
extern const bcstring be_const_str_GET;
extern const bcstring be_const_str_HTTP_GET;
extern const bcstring be_const_str_HTTP_POST;
extern const bcstring be_const_str_I2C_Driver;
extern const bcstring be_const_str_I2C_X3A;
+extern const bcstring be_const_str_INTERNAL_DAC;
+extern const bcstring be_const_str_INTERNAL_PDM;
extern const bcstring be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback;
extern const bcstring be_const_str_LVG_X3A_X20object_X3A;
extern const bcstring be_const_str_Leds;
@@ -108,6 +111,7 @@ extern const bcstring be_const_str__X23init_X2Ebat;
extern const bcstring be_const_str__X23preinit_X2Ebe;
extern const bcstring be_const_str__X2502d_X25s_X2502d;
extern const bcstring be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d;
+extern const bcstring be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x;
extern const bcstring be_const_str__X25s_X2Eautoconf;
extern const bcstring be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B;
extern const bcstring be_const_str__X26lt_X3BNone_X26gt_X3B;
@@ -149,7 +153,7 @@ extern const bcstring be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26l
extern const bcstring be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E;
extern const bcstring be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E;
extern const bcstring be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E;
-extern const bcstring be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E_X26_X23129668_X3B_X20Auto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E;
+extern const bcstring be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E;
extern const bcstring be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20;
extern const bcstring be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20;
extern const bcstring be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E;
@@ -333,6 +337,7 @@ extern const bcstring be_const_str_detect;
extern const bcstring be_const_str_detected_X20on_X20bus;
extern const bcstring be_const_str_digital_read;
extern const bcstring be_const_str_digital_write;
+extern const bcstring be_const_str_dimmer;
extern const bcstring be_const_str_dirty;
extern const bcstring be_const_str_display;
extern const bcstring be_const_str_display_X2Eini;
@@ -652,6 +657,7 @@ extern const bcstring be_const_str_set_channels;
extern const bcstring be_const_str_set_chg_current;
extern const bcstring be_const_str_set_dc_voltage;
extern const bcstring be_const_str_set_dcdc_enable;
+extern const bcstring be_const_str_set_exten;
extern const bcstring be_const_str_set_first_time;
extern const bcstring be_const_str_set_gain;
extern const bcstring be_const_str_set_height;
@@ -740,6 +746,7 @@ extern const bcstring be_const_str_unknown_X20instruction;
extern const bcstring be_const_str_update;
extern const bcstring be_const_str_upper;
extern const bcstring be_const_str_url_encode;
+extern const bcstring be_const_str_uuid4;
extern const bcstring be_const_str_v;
extern const bcstring be_const_str_value;
extern const bcstring be_const_str_value_error;
diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h
index a67a809c1..1f0996847 100644
--- a/lib/libesp32/berry/generate/be_const_strtab_def.h
+++ b/lib/libesp32/berry/generate/be_const_strtab_def.h
@@ -1,723 +1,729 @@
-be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_display_X2Eini);
-be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E);
-be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_widget_ctor_impl);
-be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str__X23autoexec_X2Ebe);
-be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_elements_X20must_X20be_X20a_X20lv_point);
-be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_line_dsc);
-be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_pixels_buffer);
-be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_list_handlers);
-be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_get_current_module_name);
-be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_MD5);
-be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str__ptr);
-be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_push_path);
-be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_bus);
-be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_delay);
-be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_json);
-be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_AudioGeneratorMP3);
-be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__dirty);
-be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_a);
-be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27);
-be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_f);
-be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_dirty);
-be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_content_flush);
-be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_get_bat_voltage);
-be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20);
-be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range);
-be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_super);
-be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_SERIAL_6O2);
-be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_SERIAL_8E1);
-be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, NULL);
-be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_update);
-be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_attrdump);
-be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E);
-be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_set_style_pad_right);
-be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_SERIAL_8E2);
-be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_elif);
-be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_STATE_DEFAULT);
-be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_AudioFileSourceFS);
-be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_base_class);
-be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "
", 3546571739u, 0, 11, &be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20);
-be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "", 1863865923u, 0, 16, &be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s);
-be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_pc_rel);
-be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E);
-be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_as);
-be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "", 2052843416u, 0, 25, &be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem);
+be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "", 2058443583u, 0, 110, &be_const_str_SERIAL_6N1);
+be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "