diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index f6351450a..2f3081d31 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -7,7 +7,7 @@
- [ ] Only relevant files were touched
- [ ] Only one feature/fix was added per PR and the code change compiles without warnings
- [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9
- - [ ] The code change is tested and works with Tasmota core ESP32 V.1.0.7.5
+ - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.1
- [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla).
_NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4a85f404d..cd72e5052 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,21 +3,31 @@ All notable changes to this project will be documented in this file.
## [Unreleased] - Development
+## [10.0.0.2]
+### Added
+- Support for HDC2010 temperature/humidity sensor by Luc Boudreau (#13633)
+
+### Changed
+- ESP32 core library from v1.0.7.5 to v2.0.1
+
## [10.0.0.1]
### Added
- Berry add module ``python_compat`` to be closer to Python syntax (#13428)
- 1 second heartbeat GPIO
+- Command ``TcpConfig`` for TCPBridge protocol configuration (#13565)
### Changed
- File editor no-wrap (#13427)
- ESP32 core library from v1.0.7.4 to v1.0.7.5
-- ESP32C3 core library from v2.0.0-post to v2.0.1-rc1
+- ESP32-C3 core library from v2.0.0-post to v2.0.1-rc1
### Fixed
- Initial reset RTC memory based variables like EnergyToday and EnergyTotal
- ESP32 Telegram compile error (#13435)
- SML compile error (#13441)
- GUI checkbox MQTT TLS not saved regression from v9.2.0.3 (#13442)
+- Discovery of shutters (#13572)
+- ESP32-C3 OneWire as used by DS18x20 (#13583)
## [Released]
diff --git a/I2CDEVICES.md b/I2CDEVICES.md
index 07094954b..65b38dae9 100644
--- a/I2CDEVICES.md
+++ b/I2CDEVICES.md
@@ -97,3 +97,4 @@ Index | Define | Driver | Device | Address(es) | Description
61 | USE_T67XX | xsns_89 | T67XX | 0x15 | CO2 sensor
62 | USE_SCD40 | xsns_92 | SCD40 | 0x62 | CO2 sensor Sensirion SCD40/SCD41
63 | USE_HM330X | xsns_93 | HM330X | 0x40 | Particule sensor
+ 64 | USE_HDC2010 | xsns_94 | HDC2010 | 0x40 | Temperature and Humidity sensor
diff --git a/RELEASENOTES.md b/RELEASENOTES.md
index 4c85900cd..af4c13ba3 100644
--- a/RELEASENOTES.md
+++ b/RELEASENOTES.md
@@ -100,20 +100,25 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo
[Complete list](BUILDS.md) of available feature and sensors.
-## Changelog v10.0.0.1
+## Changelog v10.0.0.2
### Added
- 1 second heartbeat GPIO
- ESP32 Berry add module ``python_compat`` to be closer to Python syntax [#13428](https://github.com/arendst/Tasmota/issues/13428)
+- Command ``TcpConfig`` for TCPBridge protocol configuration [#13565](https://github.com/arendst/Tasmota/issues/13565)
+- Support for HDC2010 temperature/humidity sensor by Luc Boudreau [#13633](https://github.com/arendst/Tasmota/issues/13633)
### Breaking Changed
### Changed
- File editor no-wrap [#13427](https://github.com/arendst/Tasmota/issues/13427)
-- ESP32 core library from v1.0.7.4 to v1.0.7.5
-- ESP32C3 core library from v2.0.0-post to v2.0.1-rc1
+- ESP32 core library from v1.0.7.4 to v2.0.1
+- ESP32-C3 core library from v2.0.0-post to v2.0.1-rc1
### Fixed
- Initial reset RTC memory based variables like EnergyToday and EnergyTotal
- ESP32 Telegram compile error [#13435](https://github.com/arendst/Tasmota/issues/13435)
- SML compile error [#13441](https://github.com/arendst/Tasmota/issues/13441)
- GUI checkbox MQTT TLS not saved regression from v9.2.0.3 [#13442](https://github.com/arendst/Tasmota/issues/13442)
+- Discovery of shutters [#13572](https://github.com/arendst/Tasmota/issues/13572)
+- ESP32-C3 OneWire as used by DS18x20 [#13583](https://github.com/arendst/Tasmota/issues/13583)
+
diff --git a/lib/default/TasmotaLList/library.json b/lib/default/TasmotaLList/library.json
new file mode 100644
index 000000000..d49f03f71
--- /dev/null
+++ b/lib/default/TasmotaLList/library.json
@@ -0,0 +1,14 @@
+{
+ "name": "TasmotaLList",
+ "version": "1.0",
+ "description": "Simple yet powerful linked-list",
+ "license": "MIT",
+ "homepage": "https://github.com/arendst/Tasmota",
+ "frameworks": "*",
+ "platforms": "*",
+ "authors":
+ {
+ "name": "Stephan Hadinger",
+ "maintainer": true
+ }
+ }
diff --git a/tasmota/support_light_list.ino b/lib/default/TasmotaLList/src/LList.h
similarity index 97%
rename from tasmota/support_light_list.ino
rename to lib/default/TasmotaLList/src/LList.h
index eaaea1322..82653448b 100644
--- a/tasmota/support_light_list.ino
+++ b/lib/default/TasmotaLList/src/LList.h
@@ -1,5 +1,5 @@
/*
- support_light_list.ino - Lightweight Linked List for simple objects - optimized for low code size and low memory
+ LList.h - Lightweight Linked List for simple objects - optimized for low code size and low memory
Copyright (C) 2021 Theo Arends and Stephan Hadinger
@@ -17,6 +17,11 @@
along with this program. If not, see .
*/
+#ifndef __LLIST__
+#define __LLIST__
+
+#include
+
/*********************************************************************************************\
*
* private class for Linked List element
@@ -206,3 +211,5 @@ T & LList::addToLast(LList_elt * elt) {
elt->_next = nullptr;
return elt->_val;
}
+
+#endif // __LLIST__
\ No newline at end of file
diff --git a/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/OneWire.h b/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/OneWire.h
index 9290221cd..eb20f2b20 100644
--- a/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/OneWire.h
+++ b/lib/lib_basic/OneWire-Stickbreaker-20190506-1.1/OneWire.h
@@ -197,6 +197,9 @@ void directWriteHigh(IO_REG_TYPE pin)
static inline __attribute__((always_inline))
void directModeInput(IO_REG_TYPE pin)
{
+#if CONFIG_IDF_TARGET_ESP32C3
+ GPIO.enable_w1tc.val = ((uint32_t)1 << (pin));
+#else
if ( digitalPinIsValid(pin) )
{
#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4
@@ -208,9 +211,6 @@ void directModeInput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown);
}
#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later
-#if CONFIG_IDF_TARGET_ESP32C3
- // Esp32c3 has no full RTC IO subsystem, so GPIO is 100% "independent" of RTC
-#else // plain ESP32
uint32_t rtc_reg(rtc_io_desc[pin].reg);
if ( rtc_reg ) // RTC pins PULL settings
@@ -219,16 +219,11 @@ void directModeInput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin].pullup | rtc_io_desc[pin].pulldown);
}
#endif
-#endif
-#if CONFIG_IDF_TARGET_ESP32C3
- GPIO.enable_w1tc.val = ((uint32_t)1 << (pin - 32));
-#else // plain ESP32
if ( pin < 32 )
GPIO.enable_w1tc = ((uint32_t)1 << pin);
else
GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32));
-#endif
uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers?
pinFunction |= FUN_IE; // input enable but required for output as well?
@@ -238,11 +233,15 @@ void directModeInput(IO_REG_TYPE pin)
GPIO.pin[pin].val = 0;
}
+#endif
}
static inline __attribute__((always_inline))
void directModeOutput(IO_REG_TYPE pin)
{
+#if CONFIG_IDF_TARGET_ESP32C3
+ GPIO.enable_w1ts.val = ((uint32_t)1 << (pin));
+#else
if ( digitalPinIsValid(pin) && pin <= 33 ) // pins above 33 can be only inputs
{
#if ESP_IDF_VERSION_MAJOR < 4 // IDF 3.x ESP32/PICO-D4
@@ -254,9 +253,6 @@ void directModeOutput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].pullup | rtc_gpio_desc[pin].pulldown);
}
#elif ESP_IDF_VERSION_MAJOR > 3 // ESP32-S2 needs IDF 4.2 or later
-#if CONFIG_IDF_TARGET_ESP32C3
- // Esp32c3 has no full RTC IO subsystem, so GPIO is 100% "independent" of RTC
-#else // plain ESP32
uint32_t rtc_reg(rtc_io_desc[pin].reg);
if ( rtc_reg ) // RTC pins PULL settings
@@ -265,16 +261,11 @@ void directModeOutput(IO_REG_TYPE pin)
ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[pin].pullup | rtc_io_desc[pin].pulldown);
}
#endif
-#endif
-#if CONFIG_IDF_TARGET_ESP32C3
- GPIO.enable_w1ts.val = ((uint32_t)1 << (pin - 32));
-#else // plain ESP32
if ( pin < 32 )
GPIO.enable_w1ts = ((uint32_t)1 << pin);
else // already validated to pins <= 33
GPIO.enable1_w1ts.val = ((uint32_t)1 << (pin - 32));
-#endif
uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers?
pinFunction |= FUN_IE; // input enable but required for output as well?
@@ -284,6 +275,7 @@ void directModeOutput(IO_REG_TYPE pin)
GPIO.pin[pin].val = 0;
}
+#endif
}
#define DIRECT_READ(base, pin) directRead(pin)
diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
index ff87d3112..6f66915f3 100755
--- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
+++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.cpp
@@ -204,6 +204,8 @@ void WiFiClientSecure_light::_clear() {
_ta_P = nullptr;
_ta_size = 0;
_max_thunkstack_use = 0;
+ _alpn_names = nullptr;
+ _alpn_num = 0;
}
// Constructor
@@ -949,8 +951,6 @@ extern "C" {
// we support only P256 EC curve for AWS IoT, no EC curve for Letsencrypt unless forced
br_ssl_engine_set_ec(&cc->eng, &br_ec_p256_m15); // TODO
#endif
- static const char * alpn_mqtt = "mqtt";
- br_ssl_engine_set_protocol_names(&cc->eng, &alpn_mqtt, 1);
}
}
@@ -983,6 +983,9 @@ bool WiFiClientSecure_light::_connectSSL(const char* hostName) {
_eng = &_sc->eng; // Allocation/deallocation taken care of by the _sc shared_ptr
br_ssl_client_base_init(_sc.get());
+ if (_alpn_names && _alpn_num > 0) {
+ br_ssl_engine_set_protocol_names(_eng, _alpn_names, _alpn_num);
+ }
// ============================================================
// Allocatte and initialize Decoder Context
diff --git a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h
index d0ff43407..3736749ab 100755
--- a/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h
+++ b/lib/lib_ssl/tls_mini/src/WiFiClientSecureLightBearSSL.h
@@ -93,6 +93,12 @@ class WiFiClientSecure_light : public WiFiClient {
void setTrustAnchor(const br_x509_trust_anchor *ta, size_t ta_size);
+ void setALPN(const char **names, size_t num) {
+ // set ALPN extensions, used mostly by AWS IoT on port 443. Need to be static pointers
+ _alpn_names = names;
+ _alpn_num = num;
+ }
+
// Sets the requested buffer size for transmit and receive
void setBufferSizes(int recv, int xmit);
@@ -165,6 +171,10 @@ class WiFiClientSecure_light : public WiFiClient {
// record the maximum use of ThunkStack for monitoring
size_t _max_thunkstack_use;
+ // ALPN
+ const char ** _alpn_names;
+ size_t _alpn_num;
+
};
#define ERR_OOM -1000
@@ -237,6 +247,44 @@ class WiFiClientSecure_light : public WiFiClient {
// #define BR_ERR_X509_WEAK_PUBLIC_KEY 60
// #define BR_ERR_X509_NOT_TRUSTED 62
+// Alert types for TLSContentType.ALERT messages
+// See RFC 8466, section B.2
+
+// CLOSE_NOTIFY = 0
+// UNEXPECTED_MESSAGE = 10
+// BAD_RECORD_MAC = 20
+// DECRYPTION_FAILED = 21
+// RECORD_OVERFLOW = 22
+// DECOMPRESSION_FAILURE = 30
+// HANDSHAKE_FAILURE = 40
+// NO_CERTIFICATE = 41
+// BAD_CERTIFICATE = 42
+// UNSUPPORTED_CERTIFICATE = 43
+// CERTIFICATE_REVOKED = 44
+// CERTIFICATE_EXPIRED = 45
+// CERTIFICATE_UNKNOWN = 46
+// ILLEGAL_PARAMETER = 47
+// UNKNOWN_CA = 48
+// ACCESS_DENIED = 49
+// DECODE_ERROR = 50
+// DECRYPT_ERROR = 51
+// EXPORT_RESTRICTION = 60
+// PROTOCOL_VERSION = 70
+// INSUFFICIENT_SECURITY = 71
+// INTERNAL_ERROR = 80
+// INAPPROPRIATE_FALLBACK = 86
+// USER_CANCELED = 90
+// NO_RENEGOTIATION = 100
+// MISSING_EXTENSION = 109
+// UNSUPPORTED_EXTENSION = 110
+// CERTIFICATE_UNOBTAINABLE = 111
+// UNRECOGNIZED_NAME = 112
+// BAD_CERTIFICATE_STATUS_RESPONSE = 113
+// BAD_CERTIFICATE_HASH_VALUE = 114
+// UNKNOWN_PSK_IDENTITY = 115
+// CERTIFICATE_REQUIRED = 116
+// NO_APPLICATION_PROTOCOL = 120
+
};
#endif // USE_TLS
diff --git a/lib/libesp32/Berry/default/be_driverlib.c b/lib/libesp32/Berry/default/be_driverlib.c
index dbef17a94..13f1d211e 100644
--- a/lib/libesp32/Berry/default/be_driverlib.c
+++ b/lib/libesp32/Berry/default/be_driverlib.c
@@ -20,8 +20,8 @@ be_local_closure(init, /* name */
NULL, /* no sub protos */
0, /* has constants */
NULL, /* no const */
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 1]) { /* code */
0x80000000, // 0000 RET 0
})
@@ -47,7 +47,7 @@ be_local_closure(get_tasmota, /* name */
/* K0 */ be_nested_string("tasmota", 424643812, 7),
}),
(be_nested_const_str("get_tasmota", 334356779, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 2]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x80040200, // 0001 RET 1 R1
@@ -83,7 +83,7 @@ be_local_closure(add_cmd, /* name */
0, /* has constants */
NULL, /* no const */
(be_nested_const_str("", 607256038, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 8]) { /* code */
0x68100000, // 0000 GETUPV R4 U0
0x68140001, // 0001 GETUPV R5 U1
@@ -102,7 +102,7 @@ be_local_closure(add_cmd, /* name */
/* K1 */ be_nested_string("add_cmd", -933336417, 7),
}),
(be_nested_const_str("add_cmd", -933336417, 7)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0xB80E0000, // 0000 GETNGBL R3 K0
0x8C0C0701, // 0001 GETMET R3 R3 K1
diff --git a/lib/libesp32/Berry/default/be_energylib.c b/lib/libesp32/Berry/default/be_energylib.c
index a6fb58898..e115a8507 100644
--- a/lib/libesp32/Berry/default/be_energylib.c
+++ b/lib/libesp32/Berry/default/be_energylib.c
@@ -53,8 +53,8 @@ be_local_closure(init, /* name */
/* K2 */ be_nested_string("energy_struct", 1655792843, 13),
/* K3 */ be_nested_string("_ptr", 306235816, 4),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0xA4060000, // 0000 IMPORT R1 K0
0xB80A0400, // 0001 GETNGBL R2 K2
@@ -86,7 +86,7 @@ be_local_closure(read, /* name */
/* K1 */ be_nested_string("tomap", 612167626, 5),
}),
(be_nested_const_str("", 1160973142, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 4]) { /* code */
0xB8020000, // 0000 GETNGBL R0 K0
0x8C000101, // 0001 GETMET R0 R0 K1
@@ -114,7 +114,7 @@ be_local_closure(member, /* name */
/* K0 */ be_nested_string("_energy", 535372070, 7),
}),
(be_nested_const_str("member", 719708611, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 3]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x88040200, // 0001 GETMBR R1 R1 R0
@@ -142,7 +142,7 @@ be_local_closure(setmember, /* name */
/* K0 */ be_nested_string("_energy", 535372070, 7),
}),
(be_nested_const_str("setmember", 1432909441, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 3]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x90080001, // 0001 SETMBR R2 R0 R1
diff --git a/lib/libesp32/Berry/default/be_gpio_lib.c b/lib/libesp32/Berry/default/be_gpio_lib.c
index 650360101..3f0b2b3ed 100644
--- a/lib/libesp32/Berry/default/be_gpio_lib.c
+++ b/lib/libesp32/Berry/default/be_gpio_lib.c
@@ -9,6 +9,7 @@
// Tasmota specific
+extern int gp_member(bvm *vm);
extern int gp_pin_mode(bvm *vm);
extern int gp_digital_write(bvm *vm);
extern int gp_digital_read(bvm *vm);
@@ -19,275 +20,7 @@ extern int gp_pin(bvm *vm);
/* @const_object_info_begin
module gpio (scope: global) {
- LOW, int(0)
- HIGH, int(1)
-
- INPUT, int(1)
- OUTPUT, int(2)
- PULLUP, int(4)
- INPUT_PULLUP, int(5)
- PULLDOWN, int(8)
- INPUT_PULLDOWN, int(9)
- OPEN_DRAIN, int(16)
- OUTPUT_OPEN_DRAIN, int(18)
- DAC, int(-1)
-
- RISING, int(1)
- FALLING, int(2)
- CHANGE, int(4)
-
- NONE, int(0)
- KEY1, int(1)
- KEY1_NP, int(2)
- KEY1_INV, int(3)
- KEY1_INV_NP, int(4)
- SWT1, int(5)
- SWT1_NP, int(6)
- REL1, int(7)
- REL1_INV, int(8)
- LED1, int(9)
- LED1_INV, int(10)
- CNTR1, int(11)
- CNTR1_NP, int(12)
- PWM1, int(13)
- PWM1_INV, int(14)
- BUZZER, int(15)
- BUZZER_INV, int(16)
- LEDLNK, int(17)
- LEDLNK_INV, int(18)
- I2C_SCL, int(19)
- I2C_SDA, int(20)
- SPI_MISO, int(21)
- SPI_MOSI, int(22)
- SPI_CLK, int(23)
- SPI_CS, int(24)
- SPI_DC, int(25)
- SSPI_MISO, int(26)
- SSPI_MOSI, int(27)
- SSPI_SCLK, int(28)
- SSPI_CS, int(29)
- SSPI_DC, int(30)
- BACKLIGHT, int(31)
- OLED_RESET, int(32)
- IRSEND, int(33)
- IRRECV, int(34)
- RFSEND, int(35)
- RFRECV, int(36)
- DHT11, int(37)
- DHT22, int(38)
- SI7021, int(39)
- DHT11_OUT, int(40)
- DSB, int(41)
- DSB_OUT, int(42)
- WS2812, int(43)
- MHZ_TXD, int(44)
- MHZ_RXD, int(45)
- PZEM0XX_TX, int(46)
- PZEM004_RX, int(47)
- PZEM016_RX, int(48)
- PZEM017_RX, int(49)
- SAIR_TX, int(50)
- SAIR_RX, int(51)
- PMS5003_TX, int(52)
- PMS5003_RX, int(53)
- SDS0X1_TX, int(54)
- SDS0X1_RX, int(55)
- SBR_TX, int(56)
- SBR_RX, int(57)
- SR04_TRIG, int(58)
- SR04_ECHO, int(59)
- SDM120_TX, int(60)
- SDM120_RX, int(61)
- SDM630_TX, int(62)
- SDM630_RX, int(63)
- TM1638CLK, int(64)
- TM1638DIO, int(65)
- TM1638STB, int(66)
- MP3_DFR562, int(67)
- HX711_SCK, int(68)
- HX711_DAT, int(69)
- TX2X_TXD_BLACK, int(70)
- TUYA_TX, int(71)
- TUYA_RX, int(72)
- MGC3130_XFER, int(73)
- MGC3130_RESET, int(74)
- RF_SENSOR, int(75)
- AZ_TXD, int(76)
- AZ_RXD, int(77)
- MAX31855CS, int(78)
- MAX31855CLK, int(79)
- MAX31855DO, int(80)
- NRG_SEL, int(81)
- NRG_SEL_INV, int(82)
- NRG_CF1, int(83)
- HLW_CF, int(84)
- HJL_CF, int(85)
- MCP39F5_TX, int(86)
- MCP39F5_RX, int(87)
- MCP39F5_RST, int(88)
- PN532_TXD, int(89)
- PN532_RXD, int(90)
- SM16716_CLK, int(91)
- SM16716_DAT, int(92)
- SM16716_SEL, int(93)
- DI, int(94)
- DCKI, int(95)
- CSE7766_TX, int(96)
- CSE7766_RX, int(97)
- ARIRFRCV, int(98)
- ARIRFSEL, int(99)
- TXD, int(100)
- RXD, int(101)
- ROT1A, int(102)
- ROT1B, int(103)
- ADC_JOY, int(104)
- SSPI_MAX31865_CS1, int(105)
- HRE_CLOCK, int(106)
- HRE_DATA, int(107)
- ADE7953_IRQ, int(108)
- SOLAXX1_TX, int(109)
- SOLAXX1_RX, int(110)
- ZIGBEE_TX, int(111)
- ZIGBEE_RX, int(112)
- RDM6300_RX, int(113)
- IBEACON_TX, int(114)
- IBEACON_RX, int(115)
- A4988_DIR, int(116)
- A4988_STP, int(117)
- A4988_ENA, int(118)
- A4988_MS1, int(119)
- OUTPUT_HI, int(120)
- OUTPUT_LO, int(121)
- DDS2382_TX, int(122)
- DDS2382_RX, int(123)
- DDSU666_TX, int(124)
- DDSU666_RX, int(125)
- SM2135_CLK, int(126)
- SM2135_DAT, int(127)
- DEEPSLEEP, int(128)
- EXS_ENABLE, int(129)
- TASMOTACLIENT_TXD, int(130)
- TASMOTACLIENT_RXD, int(131)
- TASMOTACLIENT_RST, int(132)
- TASMOTACLIENT_RST_INV, int(133)
- HPMA_RX, int(134)
- HPMA_TX, int(135)
- GPS_RX, int(136)
- GPS_TX, int(137)
- HM10_RX, int(138)
- HM10_TX, int(139)
- LE01MR_RX, int(140)
- LE01MR_TX, int(141)
- CC1101_GDO0, int(142)
- CC1101_GDO2, int(143)
- HRXL_RX, int(144)
- ELECTRIQ_MOODL_TX, int(145)
- AS3935, int(146)
- ADC_INPUT, int(147)
- ADC_TEMP, int(148)
- ADC_LIGHT, int(149)
- ADC_BUTTON, int(150)
- ADC_BUTTON_INV, int(151)
- ADC_RANGE, int(152)
- ADC_CT_POWER, int(153)
- WEBCAM_PWDN, int(154)
- WEBCAM_RESET, int(155)
- WEBCAM_XCLK, int(156)
- WEBCAM_SIOD, int(157)
- WEBCAM_SIOC, int(158)
- WEBCAM_DATA, int(159)
- WEBCAM_VSYNC, int(160)
- WEBCAM_HREF, int(161)
- WEBCAM_PCLK, int(162)
- WEBCAM_PSCLK, int(163)
- WEBCAM_HSD, int(164)
- WEBCAM_PSRCS, int(165)
- BOILER_OT_RX, int(166)
- BOILER_OT_TX, int(167)
- WINDMETER_SPEED, int(168)
- KEY1_TC, int(169)
- BL0940_RX, int(170)
- TCP_TX, int(171)
- TCP_RX, int(172)
- ETH_PHY_POWER, int(173)
- ETH_PHY_MDC, int(174)
- ETH_PHY_MDIO, int(175)
- TELEINFO_RX, int(176)
- TELEINFO_ENABLE, int(177)
- LMT01, int(178)
- IEM3000_TX, int(179)
- IEM3000_RX, int(180)
- ZIGBEE_RST, int(181)
- DYP_RX, int(182)
- MIEL_HVAC_TX, int(183)
- MIEL_HVAC_RX, int(184)
- WE517_TX, int(185)
- WE517_RX, int(186)
- AS608_TX, int(187)
- AS608_RX, int(188)
- SHELLY_DIMMER_BOOT0, int(189)
- SHELLY_DIMMER_RST_INV, int(190)
- RC522_RST, int(191)
- P9813_CLK, int(192)
- P9813_DAT, int(193)
- OPTION_A, int(194)
- FTC532, int(195)
- RC522_CS, int(196)
- NRF24_CS, int(197)
- NRF24_DC, int(198)
- ILI9341_CS, int(199)
- ILI9341_DC, int(200)
- ILI9488_CS, int(201)
- EPAPER29_CS, int(202)
- EPAPER42_CS, int(203)
- SSD1351_CS, int(204)
- RA8876_CS, int(205)
- ST7789_CS, int(206)
- ST7789_DC, int(207)
- SSD1331_CS, int(208)
- SSD1331_DC, int(209)
- SDCARD_CS, int(210)
- ROT1A_NP, int(211)
- ROT1B_NP, int(212)
- ADC_PH, int(213)
- BS814_CLK, int(214)
- BS814_DAT, int(215)
- WIEGAND_D0, int(216)
- WIEGAND_D1, int(217)
- NEOPOOL_TX, int(218)
- NEOPOOL_RX, int(219)
- SDM72_TX, int(220)
- SDM72_RX, int(221)
- TM1637CLK, int(222)
- TM1637DIO, int(223)
- PROJECTOR_CTRL_TX, int(224)
- PROJECTOR_CTRL_RX, int(225)
- SSD1351_DC, int(226)
- XPT2046_CS, int(227)
- CSE7761_TX, int(228)
- CSE7761_RX, int(229)
- VL53L0X_XSHUT1, int(230)
- MAX7219CLK, int(231)
- MAX7219DIN, int(232)
- MAX7219CS, int(233)
- TFMINIPLUS_TX, int(234)
- TFMINIPLUS_RX, int(235)
- ZEROCROSS, int(236)
- HALLEFFECT, int(237)
- EPD_DATA, int(238)
- INPUT, int(239)
- KEY1_PD, int(240)
- KEY1_INV_PD, int(241)
- SWT1_PD, int(242)
- I2S_OUT_DATA, int(243)
- I2S_OUT_CLK, int(244)
- I2S_OUT_SLCT, int(245)
- I2S_IN_DATA, int(246)
- I2S_IN_CLK, int(247)
- I2S_IN_SLCT, int(248)
- INTERRUPT, int(249)
-
- SENSOR_END, int(250)
+ member, func(gp_member)
pin_mode, func(gp_pin_mode)
digital_write, func(gp_digital_write)
diff --git a/lib/libesp32/Berry/default/be_i2c_axp192_lib.c b/lib/libesp32/Berry/default/be_i2c_axp192_lib.c
index 5eba55476..7449780d6 100644
--- a/lib/libesp32/Berry/default/be_i2c_axp192_lib.c
+++ b/lib/libesp32/Berry/default/be_i2c_axp192_lib.c
@@ -21,7 +21,7 @@ be_local_closure(get_warning_level, /* name */
/* K1 */ be_const_int(1),
}),
(be_nested_const_str("get_warning_level", 1737834441, 17)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E0046, // 0001 LDINT R3 71
@@ -52,7 +52,7 @@ be_local_closure(get_vbus_current, /* name */
/* K1 */ be_const_real_hex(0x3EC00000),
}),
(be_nested_const_str("get_vbus_current", 1205347942, 16)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E005B, // 0001 LDINT R3 92
@@ -83,7 +83,7 @@ be_local_closure(set_chg_current, /* name */
/* K1 */ be_nested_string("read8", -1492179129, 5),
}),
(be_nested_const_str("set_chg_current", 336304386, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[12]) { /* code */
0x8C080100, // 0000 GETMET R2 R0 K0
0x54120032, // 0001 LDINT R4 51
@@ -121,7 +121,7 @@ be_local_closure(get_bat_current, /* name */
/* K1 */ be_const_real_hex(0x3F000000),
}),
(be_nested_const_str("get_bat_current", 1912106073, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 9]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E0079, // 0001 LDINT R3 122
@@ -156,7 +156,7 @@ be_local_closure(get_bat_power, /* name */
/* K1 */ be_const_real_hex(0x3A102DE1),
}),
(be_nested_const_str("get_bat_power", -1227592443, 13)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E006F, // 0001 LDINT R3 112
@@ -186,7 +186,7 @@ be_local_closure(json_append, /* name */
/* K0 */ be_nested_string("wire", -212213352, 4),
}),
(be_nested_const_str("json_append", -1292948012, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x74060001, // 0001 JMPT R1 #0004
@@ -217,7 +217,7 @@ be_local_closure(get_vbus_voltage, /* name */
/* K1 */ be_const_real_hex(0x3ADED28A),
}),
(be_nested_const_str("get_vbus_voltage", -1896756895, 16)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E0059, // 0001 LDINT R3 90
@@ -249,7 +249,7 @@ be_local_closure(get_temp, /* name */
/* K2 */ be_const_real_hex(0x4310B333),
}),
(be_nested_const_str("get_temp", -924047810, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E005D, // 0001 LDINT R3 94
@@ -283,7 +283,7 @@ be_local_closure(battery_present, /* name */
/* K3 */ be_const_int(1),
}),
(be_nested_const_str("battery_present", -706570238, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[15]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x8C040301, // 0001 GETMET R1 R1 K1
@@ -324,7 +324,7 @@ be_local_closure(get_aps_voltage, /* name */
/* K1 */ be_const_real_hex(0x3AB78035),
}),
(be_nested_const_str("get_aps_voltage", -2001930861, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E007D, // 0001 LDINT R3 126
@@ -358,7 +358,7 @@ be_local_closure(set_dcdc_enable, /* name */
/* K4 */ be_const_int(3),
}),
(be_nested_const_str("set_dcdc_enable", 1594690786, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[22]) { /* code */
0x1C0C0300, // 0000 EQ R3 R1 K0
0x780E0004, // 0001 JMPF R3 #0007
@@ -408,7 +408,7 @@ be_local_closure(set_ldo_voltage, /* name */
/* K3 */ be_const_int(3),
}),
(be_nested_const_str("set_ldo_voltage", -204466136, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[39]) { /* code */
0x540E0CE3, // 0000 LDINT R3 3300
0x240C0403, // 0001 GT R3 R2 R3
@@ -473,8 +473,8 @@ be_local_closure(init, /* name */
/* K1 */ be_nested_string("init", 380752755, 4),
/* K2 */ be_nested_string("AXP192", 757230128, 6),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 9]) { /* code */
0x60040003, // 0000 GETGBL R1 G3
0x5C080000, // 0001 MOVE R2 R0
@@ -509,7 +509,7 @@ be_local_closure(get_bat_voltage, /* name */
/* K1 */ be_const_real_hex(0x3A902DE0),
}),
(be_nested_const_str("get_bat_voltage", 706676538, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E0077, // 0001 LDINT R3 120
@@ -541,7 +541,7 @@ be_local_closure(set_ldo_enable, /* name */
/* K2 */ be_const_int(3),
}),
(be_nested_const_str("set_ldo_enable", -1378465255, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[15]) { /* code */
0x1C0C0300, // 0000 EQ R3 R1 K0
0x780E0004, // 0001 JMPF R3 #0007
@@ -586,7 +586,7 @@ be_local_closure(set_dc_voltage, /* name */
/* K5 */ be_nested_string("read8", -1492179129, 5),
}),
(be_nested_const_str("set_dc_voltage", -2112985360, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[48]) { /* code */
0x140C0300, // 0000 LT R3 R1 K0
0x740E0001, // 0001 JMPT R3 #0004
@@ -662,7 +662,7 @@ be_local_closure(write_gpio, /* name */
/* K3 */ be_const_int(3),
}),
(be_nested_const_str("write_gpio", -2027026962, 10)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[21]) { /* code */
0x280C0300, // 0000 GE R3 R1 K0
0x780E0007, // 0001 JMPF R3 #000A
@@ -721,7 +721,7 @@ be_local_closure(web_sensor, /* name */
/* K13 */ be_nested_string("web_send_decimal", 1407210204, 16),
}),
(be_nested_const_str("web_sensor", -1394870324, 10)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[26]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x74060001, // 0001 JMPT R1 #0004
@@ -773,7 +773,7 @@ be_local_closure(get_bat_charge_current, /* name */
/* K1 */ be_const_real_hex(0x3F000000),
}),
(be_nested_const_str("get_bat_charge_current", 1385293050, 22)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x540E0079, // 0001 LDINT R3 122
@@ -806,7 +806,7 @@ be_local_closure(get_battery_chargin_status, /* name */
/* K3 */ be_const_int(1),
}),
(be_nested_const_str("get_battery_chargin_status", -2061725725, 26)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x8C040301, // 0001 GETMET R1 R1 K1
@@ -842,7 +842,7 @@ be_local_closure(get_input_power_status, /* name */
/* K4 */ be_const_int(1),
}),
(be_nested_const_str("get_input_power_status", -192138119, 22)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x8C040301, // 0001 GETMET R1 R1 K1
diff --git a/lib/libesp32/Berry/default/be_i2c_driverlib.c b/lib/libesp32/Berry/default/be_i2c_driverlib.c
index 2ac5627d9..f1cedfe8b 100644
--- a/lib/libesp32/Berry/default/be_i2c_driverlib.c
+++ b/lib/libesp32/Berry/default/be_i2c_driverlib.c
@@ -34,7 +34,7 @@ be_local_closure(read32, /* name */
/* K6 */ be_const_int(3),
}),
(be_nested_const_str("read32", 1741276240, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[20]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -82,7 +82,7 @@ be_local_closure(write8, /* name */
/* K3 */ be_const_int(1),
}),
(be_nested_const_str("write8", -1160975764, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 8]) { /* code */
0x880C0100, // 0000 GETMBR R3 R0 K0
0x8C0C0701, // 0001 GETMET R3 R3 K1
@@ -120,7 +120,7 @@ be_local_closure(read12, /* name */
/* K5 */ be_const_int(1),
}),
(be_nested_const_str("read12", -3890326, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[12]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -160,7 +160,7 @@ be_local_closure(write_bit, /* name */
/* K3 */ be_nested_string("read8", -1492179129, 5),
}),
(be_nested_const_str("write_bit", -1633976860, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[26]) { /* code */
0x14100500, // 0000 LT R4 R2 K0
0x74120002, // 0001 JMPT R4 #0005
@@ -217,7 +217,7 @@ be_local_closure(read24, /* name */
/* K6 */ be_const_int(2),
}),
(be_nested_const_str("read24", 1808533811, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[16]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -261,7 +261,7 @@ be_local_closure(read8, /* name */
/* K3 */ be_const_int(1),
}),
(be_nested_const_str("read8", -1492179129, 5)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -301,8 +301,8 @@ be_local_closure(init, /* name */
/* K8 */ be_nested_string("detected on bus", 1432002650, 15),
/* K9 */ be_nested_string("bus", 1607822841, 3),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[44]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0
0x7C100200, // 0001 CALL R4 1
@@ -376,7 +376,7 @@ be_local_closure(read13, /* name */
/* K5 */ be_const_int(1),
}),
(be_nested_const_str("read13", 12887293, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[12]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
diff --git a/lib/libesp32/Berry/default/be_lvgl_clock_icon_lib.c b/lib/libesp32/Berry/default/be_lvgl_clock_icon_lib.c
index 484b79ee2..4cef73ac9 100644
--- a/lib/libesp32/Berry/default/be_lvgl_clock_icon_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_clock_icon_lib.c
@@ -33,7 +33,7 @@ be_local_closure(set_time, /* name */
/* K9 */ be_nested_string("set_text", 1849641155, 8),
}),
(be_nested_const_str("set_time", 900236405, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[27]) { /* code */
0xA4120000, // 0000 IMPORT R4 K0
0x88140101, // 0001 GETMBR R5 R0 K1
@@ -93,7 +93,7 @@ be_local_closure(every_second, /* name */
/* K8 */ be_nested_string("sec", -1155074638, 3),
}),
(be_nested_const_str("every_second", 2075451465, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[17]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x8C040301, // 0001 GETMET R1 R1 K1
@@ -155,8 +155,8 @@ be_local_closure(init, /* name */
/* K20 */ be_nested_string("tasmota", 424643812, 7),
/* K21 */ be_nested_string("add_driver", 1654458371, 10),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[82]) { /* code */
0x60080003, // 0000 GETGBL R2 G3
0x5C0C0000, // 0001 MOVE R3 R0
@@ -265,7 +265,7 @@ be_local_closure(del, /* name */
/* K2 */ be_nested_string("remove_driver", 1030243768, 13),
}),
(be_nested_const_str("del", -816214454, 3)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[10]) { /* code */
0x60040003, // 0000 GETGBL R1 G3
0x5C080000, // 0001 MOVE R2 R0
diff --git a/lib/libesp32/Berry/default/be_lvgl_glob_lib.c b/lib/libesp32/Berry/default/be_lvgl_glob_lib.c
index e60d7606f..31619f1c4 100644
--- a/lib/libesp32/Berry/default/be_lvgl_glob_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_glob_lib.c
@@ -25,7 +25,7 @@ be_local_closure(get_object_from_ptr, /* name */
/* K1 */ be_nested_string("find", -1108310694, 4),
}),
(be_nested_const_str("get_object_from_ptr", -1949948095, 19)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[10]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
@@ -68,7 +68,7 @@ be_local_closure(widget_event_impl, /* name */
/* K8 */ be_nested_string("widget_event", 1951408186, 12),
}),
(be_nested_const_str("widget_event_impl", -2116536735, 17)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[30]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0xB8120200, // 0001 GETNGBL R4 K1
@@ -129,7 +129,7 @@ be_local_closure(lvgl_event_dispatch, /* name */
/* K6 */ be_nested_string("get_object_from_ptr", -1949948095, 19),
}),
(be_nested_const_str("lvgl_event_dispatch", 2104396622, 19)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[20]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0xB80E0200, // 0001 GETNGBL R3 K1
@@ -180,7 +180,7 @@ be_local_closure(widget_dtor_impl, /* name */
/* K6 */ be_nested_string("widget_destructor", -87578951, 17),
}),
(be_nested_const_str("widget_dtor_impl", 520430610, 16)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[22]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0xB8120200, // 0001 GETNGBL R4 K1
@@ -228,7 +228,7 @@ be_local_closure(register_obj, /* name */
/* K1 */ be_nested_string("_p", 1594591802, 2),
}),
(be_nested_const_str("register_obj", -312352526, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[13]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
@@ -276,7 +276,7 @@ be_local_closure(gen_cb, /* name */
/* K0 */ be_nested_string("lvgl_event_dispatch", 2104396622, 19),
}),
(be_nested_const_str("", 607256038, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x68040000, // 0000 GETUPV R1 U0
0x8C040300, // 0001 GETMET R1 R1 K0
@@ -298,7 +298,7 @@ be_local_closure(gen_cb, /* name */
/* K7 */ be_nested_string("cb_do_nothing", 1488730702, 13),
}),
(be_nested_const_str("gen_cb", -1049739745, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[41]) { /* code */
0x1C140300, // 0000 EQ R5 R1 K0
0x78160018, // 0001 JMPF R5 #001B
@@ -366,7 +366,7 @@ be_local_closure(deregister_obj, /* name */
/* K2 */ be_nested_string("cb_event_closure", -466699971, 16),
}),
(be_nested_const_str("deregister_obj", -385000303, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[17]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
@@ -418,7 +418,7 @@ be_local_closure(widget_cb, /* name */
/* K0 */ be_nested_string("widget_ctor_impl", 194252479, 16),
}),
(be_nested_const_str("", 607256038, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x68080000, // 0000 GETUPV R2 U0
0x8C080500, // 0001 GETMET R2 R2 K0
@@ -443,7 +443,7 @@ be_local_closure(widget_cb, /* name */
/* K0 */ be_nested_string("widget_dtor_impl", 520430610, 16),
}),
(be_nested_const_str("", 607256038, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x68080000, // 0000 GETUPV R2 U0
0x8C080500, // 0001 GETMET R2 R2 K0
@@ -468,7 +468,7 @@ be_local_closure(widget_cb, /* name */
/* K0 */ be_nested_string("widget_event_impl", -2116536735, 17),
}),
(be_nested_const_str("", 607256038, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x68080000, // 0000 GETUPV R2 U0
0x8C080500, // 0001 GETMET R2 R2 K0
@@ -498,7 +498,7 @@ be_local_closure(widget_cb, /* name */
/* K14 */ be_nested_string("event_cb", -1166269279, 8),
}),
(be_nested_const_str("widget_cb", -1531384241, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[56]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x4C080000, // 0001 LDNIL R2
@@ -579,7 +579,7 @@ be_local_closure(_anonymous_, /* name */
/* K0 */ be_nested_string("LVG: call to unsupported callback", 504176819, 33),
}),
(be_nested_const_str("_anonymous_", 1957281476, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 4]) { /* code */
0x60000001, // 0000 GETGBL R0 G1
0x58040000, // 0001 LDCONST R1 K0
@@ -634,7 +634,7 @@ be_local_closure(create_custom_widget, /* name */
/* K26 */ be_nested_string("class_init_obj", 178410604, 14),
}),
(be_nested_const_str("create_custom_widget", 1140594778, 20)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[86]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0x6010000F, // 0001 GETGBL R4 G15
@@ -753,7 +753,7 @@ be_local_closure(widget_ctor_impl, /* name */
/* K8 */ be_nested_string("widget_constructor", -1751181362, 18),
}),
(be_nested_const_str("widget_ctor_impl", 194252479, 16)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[29]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0xB8120200, // 0001 GETNGBL R4 K1
diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_arcs_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_arcs_lib.c
index 496ef4aa1..f3452ba57 100644
--- a/lib/libesp32/Berry/default/be_lvgl_signal_arcs_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_signal_arcs_lib.c
@@ -26,7 +26,7 @@ be_local_closure(set_percentage, /* name */
/* K2 */ be_nested_string("invalidate", -1645232368, 10),
}),
(be_nested_const_str("set_percentage", -1342944572, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[18]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x540E0018, // 0001 LDINT R3 25
@@ -77,8 +77,8 @@ be_local_closure(init, /* name */
/* K8 */ be_nested_string("line_dsc", -200476318, 8),
/* K9 */ be_nested_string("draw_line_dsc", -74291093, 13),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[24]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -135,7 +135,7 @@ be_local_closure(widget_event, /* name */
/* K0 */ be_const_int(1),
}),
(be_nested_const_str("atleast1", 1956331672, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x28040100, // 0000 GE R1 R0 K0
0x78060001, // 0001 JMPF R1 #0004
@@ -185,7 +185,7 @@ be_local_closure(widget_event, /* name */
/* K34 */ be_const_int(0),
}),
(be_nested_const_str("widget_event", 1951408186, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[182]) { /* code */
0xB80E0000, // 0000 GETNGBL R3 K0
0x8C0C0701, // 0001 GETMET R3 R3 K1
@@ -392,7 +392,7 @@ be_local_closure(get_percentage, /* name */
/* K0 */ be_nested_string("percentage", -1756136011, 10),
}),
(be_nested_const_str("get_percentage", -1414483304, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 2]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x80040200, // 0001 RET 1 R1
diff --git a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c
index 0022034ab..161afc65d 100644
--- a/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_signal_bars_lib.c
@@ -26,7 +26,7 @@ be_local_closure(set_percentage, /* name */
/* K2 */ be_nested_string("invalidate", -1645232368, 10),
}),
(be_nested_const_str("set_percentage", -1342944572, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[18]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x540E0013, // 0001 LDINT R3 20
@@ -77,8 +77,8 @@ be_local_closure(init, /* name */
/* K8 */ be_nested_string("line_dsc", -200476318, 8),
/* K9 */ be_nested_string("draw_line_dsc", -74291093, 13),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[24]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -135,7 +135,7 @@ be_local_closure(widget_event, /* name */
/* K0 */ be_const_int(1),
}),
(be_nested_const_str("atleast1", 1956331672, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x28040100, // 0000 GE R1 R0 K0
0x78060001, // 0001 JMPF R1 #0004
@@ -187,7 +187,7 @@ be_local_closure(widget_event, /* name */
/* K36 */ be_nested_string("EVENT_DRAW_PART_END", -993342004, 19),
}),
(be_nested_const_str("widget_event", 1951408186, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[138]) { /* code */
0xB80E0000, // 0000 GETNGBL R3 K0
0x8C0C0701, // 0001 GETMET R3 R3 K1
@@ -350,7 +350,7 @@ be_local_closure(get_percentage, /* name */
/* K0 */ be_nested_string("percentage", -1756136011, 10),
}),
(be_nested_const_str("get_percentage", -1414483304, 14)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 2]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x80040200, // 0001 RET 1 R1
diff --git a/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_icon_lib.c b/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_icon_lib.c
index 93e83c7ba..9a2c742ff 100644
--- a/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_icon_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_icon_lib.c
@@ -40,8 +40,8 @@ be_local_closure(init, /* name */
/* K16 */ be_nested_string("set_style_pad_right", -980898242, 19),
/* K17 */ be_const_int(1),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[67]) { /* code */
0x60080003, // 0000 GETGBL R2 G3
0x5C0C0000, // 0001 MOVE R3 R0
diff --git a/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_lib.c b/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_lib.c
index 91c207196..59132af9e 100644
--- a/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_wifi_arcs_lib.c
@@ -30,7 +30,7 @@ be_local_closure(every_second, /* name */
/* K6 */ be_const_int(0),
}),
(be_nested_const_str("every_second", 2075451465, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[23]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x8C040301, // 0001 GETMET R1 R1 K1
@@ -81,8 +81,8 @@ be_local_closure(init, /* name */
/* K3 */ be_nested_string("set_percentage", -1342944572, 14),
/* K4 */ be_const_int(0),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[14]) { /* code */
0x60080003, // 0000 GETGBL R2 G3
0x5C0C0000, // 0001 MOVE R3 R0
@@ -123,7 +123,7 @@ be_local_closure(del, /* name */
/* K2 */ be_nested_string("remove_driver", 1030243768, 13),
}),
(be_nested_const_str("del", -816214454, 3)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[10]) { /* code */
0x60040003, // 0000 GETGBL R1 G3
0x5C080000, // 0001 MOVE R2 R0
diff --git a/lib/libesp32/Berry/default/be_lvgl_wifi_bars_icon_lib.c b/lib/libesp32/Berry/default/be_lvgl_wifi_bars_icon_lib.c
index 8912af6a6..9adcdeba5 100644
--- a/lib/libesp32/Berry/default/be_lvgl_wifi_bars_icon_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_wifi_bars_icon_lib.c
@@ -39,8 +39,8 @@ be_local_closure(init, /* name */
/* K15 */ be_nested_string("set_style_pad_right", -980898242, 19),
/* K16 */ be_const_int(1),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[64]) { /* code */
0x60080003, // 0000 GETGBL R2 G3
0x5C0C0000, // 0001 MOVE R3 R0
diff --git a/lib/libesp32/Berry/default/be_lvgl_wifi_bars_lib.c b/lib/libesp32/Berry/default/be_lvgl_wifi_bars_lib.c
index 15abf0a57..9bbb51bf0 100644
--- a/lib/libesp32/Berry/default/be_lvgl_wifi_bars_lib.c
+++ b/lib/libesp32/Berry/default/be_lvgl_wifi_bars_lib.c
@@ -30,7 +30,7 @@ be_local_closure(every_second, /* name */
/* K6 */ be_const_int(0),
}),
(be_nested_const_str("every_second", 2075451465, 12)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[23]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x8C040301, // 0001 GETMET R1 R1 K1
@@ -81,8 +81,8 @@ be_local_closure(init, /* name */
/* K3 */ be_nested_string("set_percentage", -1342944572, 14),
/* K4 */ be_const_int(0),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[14]) { /* code */
0x60080003, // 0000 GETGBL R2 G3
0x5C0C0000, // 0001 MOVE R3 R0
@@ -123,7 +123,7 @@ be_local_closure(del, /* name */
/* K2 */ be_nested_string("remove_driver", 1030243768, 13),
}),
(be_nested_const_str("del", -816214454, 3)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[10]) { /* code */
0x60040003, // 0000 GETGBL R1 G3
0x5C080000, // 0001 MOVE R2 R0
diff --git a/lib/libesp32/Berry/default/be_path_tasmota_lib.c b/lib/libesp32/Berry/default/be_path_tasmota_lib.c
index c4208203f..81711a053 100644
--- a/lib/libesp32/Berry/default/be_path_tasmota_lib.c
+++ b/lib/libesp32/Berry/default/be_path_tasmota_lib.c
@@ -18,13 +18,17 @@
#include "be_sys.h"
#include
+extern int m_path_listdir(bvm *vm);
+
static int m_path_exists(bvm *vm)
{
const char *path = NULL;
if (be_top(vm) >= 1 && be_isstring(vm, 1)) {
path = be_tostring(vm, 1);
+ be_pushbool(vm, be_isexist(path));
+ } else {
+ be_pushbool(vm, bfalse);
}
- be_pushbool(vm, be_isexist(path));
be_return(vm);
}
extern time_t be_last_modified(void *hfile);
@@ -43,10 +47,24 @@ static int m_path_last_modified(bvm *vm)
be_return_nil(vm);
}
+static int m_path_remove(bvm *vm)
+{
+ const char *path = NULL;
+ if (be_top(vm) >= 1 && be_isstring(vm, 1)) {
+ path = be_tostring(vm, 1);
+ be_pushbool(vm, be_unlink(path));
+ } else {
+ be_pushbool(vm, bfalse);
+ }
+ be_return(vm);
+}
+
/* @const_object_info_begin
module path (scope: global, file: tasmota_path) {
exists, func(m_path_exists)
last_modified, func(m_path_last_modified)
+ listdir, func(m_path_listdir)
+ remove, func(m_path_remove)
}
@const_object_info_end */
#include "../generate/be_fixed_tasmota_path.h"
diff --git a/lib/libesp32/Berry/default/be_persist_lib.c b/lib/libesp32/Berry/default/be_persist_lib.c
index 3c4c17f28..e0a92dcd9 100644
--- a/lib/libesp32/Berry/default/be_persist_lib.c
+++ b/lib/libesp32/Berry/default/be_persist_lib.c
@@ -8,61 +8,74 @@
#include "be_constobj.h"
/********************************************************************
-** Solidified function: save
+** Solidified function: json_fdump_map
********************************************************************/
-be_local_closure(save, /* name */
+be_local_closure(json_fdump_map, /* name */
be_nested_proto(
- 8, /* nstack */
- 1, /* argc */
+ 13, /* nstack */
+ 3, /* argc */
0, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
- ( &(const bvalue[ 8]) { /* constants */
+ ( &(const bvalue[10]) { /* constants */
/* K0 */ be_nested_string("json", 916562499, 4),
- /* K1 */ be_nested_string("_filename", 1430813195, 9),
- /* K2 */ be_nested_string("w", -234078410, 1),
- /* K3 */ be_nested_string("write", -1104765092, 5),
+ /* K1 */ be_nested_string("write", -1104765092, 5),
+ /* K2 */ be_nested_string("{", -32746982, 1),
+ /* K3 */ be_nested_string("keys", -112588595, 4),
/* K4 */ be_nested_string("dump", -631966073, 4),
- /* K5 */ be_nested_string("_p", 1594591802, 2),
- /* K6 */ be_nested_string("close", 667630371, 5),
- /* K7 */ be_nested_string("_dirty", 283846766, 6),
+ /* K5 */ be_nested_string(":", 1057798253, 1),
+ /* K6 */ be_nested_string("json_fdump_any", -946337911, 14),
+ /* K7 */ be_nested_string(",", 688690635, 1),
+ /* K8 */ be_nested_string("stop_iteration", -121173395, 14),
+ /* K9 */ be_nested_string("}", -133412696, 1),
}),
- (be_nested_const_str("save", -855671224, 4)),
- (be_nested_const_str("input", -103256197, 5)),
- ( &(const binstruction[30]) { /* code */
- 0xA4060000, // 0000 IMPORT R1 K0
- 0x4C080000, // 0001 LDNIL R2
- 0xA802000D, // 0002 EXBLK 0 #0011
- 0x600C0011, // 0003 GETGBL R3 G17
- 0x88100101, // 0004 GETMBR R4 R0 K1
- 0x58140002, // 0005 LDCONST R5 K2
- 0x7C0C0400, // 0006 CALL R3 2
- 0x5C080600, // 0007 MOVE R2 R3
- 0x8C0C0503, // 0008 GETMET R3 R2 K3
- 0x8C140304, // 0009 GETMET R5 R1 K4
- 0x881C0105, // 000A GETMBR R7 R0 K5
- 0x7C140400, // 000B CALL R5 2
- 0x7C0C0400, // 000C CALL R3 2
- 0x8C0C0506, // 000D GETMET R3 R2 K6
- 0x7C0C0200, // 000E CALL R3 1
- 0xA8040001, // 000F EXBLK 1 1
- 0x70020009, // 0010 JMP #001B
- 0xAC0C0002, // 0011 CATCH R3 0 2
- 0x70020006, // 0012 JMP #001A
- 0x4C140000, // 0013 LDNIL R5
- 0x20140405, // 0014 NE R5 R2 R5
- 0x78160001, // 0015 JMPF R5 #0018
- 0x8C140506, // 0016 GETMET R5 R2 K6
- 0x7C140200, // 0017 CALL R5 1
- 0xB0040604, // 0018 RAISE 1 R3 R4
- 0x70020000, // 0019 JMP #001B
- 0xB0080000, // 001A RAISE 2 R0 R0
- 0x500C0000, // 001B LDBOOL R3 0 0
- 0x90020E03, // 001C SETMBR R0 K7 R3
- 0x80000000, // 001D RET 0
+ (be_nested_const_str("json_fdump_map", -203012643, 14)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[41]) { /* code */
+ 0xA40E0000, // 0000 IMPORT R3 K0
+ 0x8C100301, // 0001 GETMET R4 R1 K1
+ 0x58180002, // 0002 LDCONST R6 K2
+ 0x7C100400, // 0003 CALL R4 2
+ 0x4C100000, // 0004 LDNIL R4
+ 0x60140010, // 0005 GETGBL R5 G16
+ 0x8C180503, // 0006 GETMET R6 R2 K3
+ 0x7C180200, // 0007 CALL R6 1
+ 0x7C140200, // 0008 CALL R5 1
+ 0xA8020017, // 0009 EXBLK 0 #0022
+ 0x5C180A00, // 000A MOVE R6 R5
+ 0x7C180000, // 000B CALL R6 0
+ 0x4C1C0000, // 000C LDNIL R7
+ 0x201C0807, // 000D NE R7 R4 R7
+ 0x781E0002, // 000E JMPF R7 #0012
+ 0x8C1C0301, // 000F GETMET R7 R1 K1
+ 0x5C240800, // 0010 MOVE R9 R4
+ 0x7C1C0400, // 0011 CALL R7 2
+ 0x8C1C0301, // 0012 GETMET R7 R1 K1
+ 0x8C240704, // 0013 GETMET R9 R3 K4
+ 0x602C0008, // 0014 GETGBL R11 G8
+ 0x5C300C00, // 0015 MOVE R12 R6
+ 0x7C2C0200, // 0016 CALL R11 1
+ 0x7C240400, // 0017 CALL R9 2
+ 0x7C1C0400, // 0018 CALL R7 2
+ 0x8C1C0301, // 0019 GETMET R7 R1 K1
+ 0x58240005, // 001A LDCONST R9 K5
+ 0x7C1C0400, // 001B CALL R7 2
+ 0x8C1C0106, // 001C GETMET R7 R0 K6
+ 0x5C240200, // 001D MOVE R9 R1
+ 0x94280406, // 001E GETIDX R10 R2 R6
+ 0x7C1C0600, // 001F CALL R7 3
+ 0x58100007, // 0020 LDCONST R4 K7
+ 0x7001FFE7, // 0021 JMP #000A
+ 0x58140008, // 0022 LDCONST R5 K8
+ 0xAC140200, // 0023 CATCH R5 1 0
+ 0xB0080000, // 0024 RAISE 2 R0 R0
+ 0x8C140301, // 0025 GETMET R5 R1 K1
+ 0x581C0009, // 0026 LDCONST R7 K9
+ 0x7C140400, // 0027 CALL R5 2
+ 0x80000000, // 0028 RET 0
})
)
);
@@ -87,7 +100,7 @@ be_local_closure(setmember, /* name */
/* K1 */ be_nested_string("_dirty", 283846766, 6),
}),
(be_nested_const_str("setmember", 1432909441, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x880C0100, // 0000 GETMBR R3 R0 K0
0x980C0202, // 0001 SETIDX R3 R1 R2
@@ -100,158 +113,6 @@ be_local_closure(setmember, /* name */
/*******************************************************************/
-/********************************************************************
-** Solidified function: init
-********************************************************************/
-be_local_closure(init, /* name */
- be_nested_proto(
- 6, /* nstack */
- 2, /* argc */
- 0, /* varg */
- 0, /* has upvals */
- NULL, /* no upvals */
- 0, /* has sup protos */
- NULL, /* no sub protos */
- 1, /* has constants */
- ( &(const bvalue[ 6]) { /* constants */
- /* K0 */ be_nested_string("_filename", 1430813195, 9),
- /* K1 */ be_nested_string("_persist.json", 2008425138, 13),
- /* K2 */ be_nested_string("_p", 1594591802, 2),
- /* K3 */ be_nested_string("copy", -446502332, 4),
- /* K4 */ be_nested_string("load", -435725847, 4),
- /* K5 */ be_nested_string("_dirty", 283846766, 6),
- }),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
- ( &(const binstruction[20]) { /* code */
- 0x90020101, // 0000 SETMBR R0 K0 K1
- 0x6008000F, // 0001 GETGBL R2 G15
- 0x5C0C0200, // 0002 MOVE R3 R1
- 0x60100013, // 0003 GETGBL R4 G19
- 0x7C080400, // 0004 CALL R2 2
- 0x780A0003, // 0005 JMPF R2 #000A
- 0x8C080303, // 0006 GETMET R2 R1 K3
- 0x7C080200, // 0007 CALL R2 1
- 0x90020402, // 0008 SETMBR R0 K2 R2
- 0x70020002, // 0009 JMP #000D
- 0x60080013, // 000A GETGBL R2 G19
- 0x7C080000, // 000B CALL R2 0
- 0x90020402, // 000C SETMBR R0 K2 R2
- 0x8C080104, // 000D GETMET R2 R0 K4
- 0x88100102, // 000E GETMBR R4 R0 K2
- 0x88140100, // 000F GETMBR R5 R0 K0
- 0x7C080600, // 0010 CALL R2 3
- 0x50080000, // 0011 LDBOOL R2 0 0
- 0x90020A02, // 0012 SETMBR R0 K5 R2
- 0x80000000, // 0013 RET 0
- })
- )
-);
-/*******************************************************************/
-
-
-/********************************************************************
-** Solidified function: load
-********************************************************************/
-be_local_closure(load, /* name */
- be_nested_proto(
- 9, /* nstack */
- 1, /* argc */
- 0, /* varg */
- 0, /* has upvals */
- NULL, /* no upvals */
- 0, /* has sup protos */
- NULL, /* no sub protos */
- 1, /* has constants */
- ( &(const bvalue[10]) { /* constants */
- /* K0 */ be_nested_string("json", 916562499, 4),
- /* K1 */ be_nested_string("path", -2071507658, 4),
- /* K2 */ be_nested_string("exists", 1002329533, 6),
- /* K3 */ be_nested_string("_filename", 1430813195, 9),
- /* K4 */ be_nested_string("r", -150190315, 1),
- /* K5 */ be_nested_string("load", -435725847, 4),
- /* K6 */ be_nested_string("read", -824204347, 4),
- /* K7 */ be_nested_string("close", 667630371, 5),
- /* K8 */ be_nested_string("_p", 1594591802, 2),
- /* K9 */ be_nested_string("_dirty", 283846766, 6),
- }),
- (be_nested_const_str("load", -435725847, 4)),
- (be_nested_const_str("input", -103256197, 5)),
- ( &(const binstruction[37]) { /* code */
- 0xA4060000, // 0000 IMPORT R1 K0
- 0xA40A0200, // 0001 IMPORT R2 K1
- 0x4C0C0000, // 0002 LDNIL R3
- 0x4C100000, // 0003 LDNIL R4
- 0x8C140502, // 0004 GETMET R5 R2 K2
- 0x881C0103, // 0005 GETMBR R7 R0 K3
- 0x7C140400, // 0006 CALL R5 2
- 0x7816001B, // 0007 JMPF R5 #0024
- 0xA802000D, // 0008 EXBLK 0 #0017
- 0x60140011, // 0009 GETGBL R5 G17
- 0x88180103, // 000A GETMBR R6 R0 K3
- 0x581C0004, // 000B LDCONST R7 K4
- 0x7C140400, // 000C CALL R5 2
- 0x5C0C0A00, // 000D MOVE R3 R5
- 0x8C140305, // 000E GETMET R5 R1 K5
- 0x8C1C0706, // 000F GETMET R7 R3 K6
- 0x7C1C0200, // 0010 CALL R7 1
- 0x7C140400, // 0011 CALL R5 2
- 0x5C100A00, // 0012 MOVE R4 R5
- 0x8C140707, // 0013 GETMET R5 R3 K7
- 0x7C140200, // 0014 CALL R5 1
- 0xA8040001, // 0015 EXBLK 1 1
- 0x70020009, // 0016 JMP #0021
- 0xAC140002, // 0017 CATCH R5 0 2
- 0x70020006, // 0018 JMP #0020
- 0x4C1C0000, // 0019 LDNIL R7
- 0x201C0607, // 001A NE R7 R3 R7
- 0x781E0001, // 001B JMPF R7 #001E
- 0x8C1C0707, // 001C GETMET R7 R3 K7
- 0x7C1C0200, // 001D CALL R7 1
- 0xB0040A06, // 001E RAISE 1 R5 R6
- 0x70020000, // 001F JMP #0021
- 0xB0080000, // 0020 RAISE 2 R0 R0
- 0x90021004, // 0021 SETMBR R0 K8 R4
- 0x50140000, // 0022 LDBOOL R5 0 0
- 0x90021205, // 0023 SETMBR R0 K9 R5
- 0x80000000, // 0024 RET 0
- })
- )
-);
-/*******************************************************************/
-
-
-/********************************************************************
-** Solidified function: has
-********************************************************************/
-be_local_closure(has, /* name */
- be_nested_proto(
- 5, /* nstack */
- 2, /* argc */
- 0, /* varg */
- 0, /* has upvals */
- NULL, /* no upvals */
- 0, /* has sup protos */
- NULL, /* no sub protos */
- 1, /* has constants */
- ( &(const bvalue[ 2]) { /* constants */
- /* K0 */ be_nested_string("_p", 1594591802, 2),
- /* K1 */ be_nested_string("has", -306245661, 3),
- }),
- (be_nested_const_str("has", -306245661, 3)),
- (be_nested_const_str("input", -103256197, 5)),
- ( &(const binstruction[ 5]) { /* code */
- 0x88080100, // 0000 GETMBR R2 R0 K0
- 0x8C080501, // 0001 GETMET R2 R2 K1
- 0x5C100200, // 0002 MOVE R4 R1
- 0x7C080400, // 0003 CALL R2 2
- 0x80040400, // 0004 RET 1 R2
- })
- )
-);
-/*******************************************************************/
-
-
/********************************************************************
** Solidified function: zero
********************************************************************/
@@ -270,7 +131,7 @@ be_local_closure(zero, /* name */
/* K1 */ be_nested_string("_dirty", 283846766, 6),
}),
(be_nested_const_str("zero", -1955600541, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x60040013, // 0000 GETGBL R1 G19
0x7C040000, // 0001 CALL R1 0
@@ -302,7 +163,7 @@ be_local_closure(member, /* name */
/* K1 */ be_nested_string("find", -1108310694, 4),
}),
(be_nested_const_str("member", 719708611, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -315,6 +176,48 @@ be_local_closure(member, /* name */
/*******************************************************************/
+/********************************************************************
+** Solidified function: json_fdump
+********************************************************************/
+be_local_closure(json_fdump, /* name */
+ be_nested_proto(
+ 7, /* nstack */
+ 2, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 5]) { /* constants */
+ /* K0 */ be_nested_string("json", 916562499, 4),
+ /* K1 */ be_nested_string("_p", 1594591802, 2),
+ /* K2 */ be_nested_string("json_fdump_map", -203012643, 14),
+ /* K3 */ be_nested_string("internal_error", -1775809127, 14),
+ /* K4 */ be_nested_string("persist._p is not a map", 1176528732, 23),
+ }),
+ (be_nested_const_str("json_fdump", 1694216580, 10)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[13]) { /* code */
+ 0xA40A0000, // 0000 IMPORT R2 K0
+ 0x600C000F, // 0001 GETGBL R3 G15
+ 0x88100101, // 0002 GETMBR R4 R0 K1
+ 0x60140013, // 0003 GETGBL R5 G19
+ 0x7C0C0400, // 0004 CALL R3 2
+ 0x780E0004, // 0005 JMPF R3 #000B
+ 0x8C0C0102, // 0006 GETMET R3 R0 K2
+ 0x5C140200, // 0007 MOVE R5 R1
+ 0x88180101, // 0008 GETMBR R6 R0 K1
+ 0x7C0C0600, // 0009 CALL R3 3
+ 0x70020000, // 000A JMP #000C
+ 0xB0060704, // 000B RAISE 1 K3 K4
+ 0x80000000, // 000C RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
/********************************************************************
** Solidified function: remove
********************************************************************/
@@ -334,7 +237,7 @@ be_local_closure(remove, /* name */
/* K2 */ be_nested_string("_dirty", 283846766, 6),
}),
(be_nested_const_str("remove", -611183107, 6)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x8C080501, // 0001 GETMET R2 R2 K1
@@ -349,6 +252,211 @@ be_local_closure(remove, /* name */
/*******************************************************************/
+/********************************************************************
+** Solidified function: json_fdump_any
+********************************************************************/
+be_local_closure(json_fdump_any, /* name */
+ be_nested_proto(
+ 9, /* nstack */
+ 3, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 5]) { /* constants */
+ /* K0 */ be_nested_string("json", 916562499, 4),
+ /* K1 */ be_nested_string("json_fdump_map", -203012643, 14),
+ /* K2 */ be_nested_string("json_fdump_list", -391087443, 15),
+ /* K3 */ be_nested_string("write", -1104765092, 5),
+ /* K4 */ be_nested_string("dump", -631966073, 4),
+ }),
+ (be_nested_const_str("json_fdump_any", -946337911, 14)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[27]) { /* code */
+ 0xA40E0000, // 0000 IMPORT R3 K0
+ 0x6010000F, // 0001 GETGBL R4 G15
+ 0x5C140400, // 0002 MOVE R5 R2
+ 0x60180013, // 0003 GETGBL R6 G19
+ 0x7C100400, // 0004 CALL R4 2
+ 0x78120004, // 0005 JMPF R4 #000B
+ 0x8C100101, // 0006 GETMET R4 R0 K1
+ 0x5C180200, // 0007 MOVE R6 R1
+ 0x5C1C0400, // 0008 MOVE R7 R2
+ 0x7C100600, // 0009 CALL R4 3
+ 0x7002000E, // 000A JMP #001A
+ 0x6010000F, // 000B GETGBL R4 G15
+ 0x5C140400, // 000C MOVE R5 R2
+ 0x60180012, // 000D GETGBL R6 G18
+ 0x7C100400, // 000E CALL R4 2
+ 0x78120004, // 000F JMPF R4 #0015
+ 0x8C100102, // 0010 GETMET R4 R0 K2
+ 0x5C180200, // 0011 MOVE R6 R1
+ 0x5C1C0400, // 0012 MOVE R7 R2
+ 0x7C100600, // 0013 CALL R4 3
+ 0x70020004, // 0014 JMP #001A
+ 0x8C100303, // 0015 GETMET R4 R1 K3
+ 0x8C180704, // 0016 GETMET R6 R3 K4
+ 0x5C200400, // 0017 MOVE R8 R2
+ 0x7C180400, // 0018 CALL R6 2
+ 0x7C100400, // 0019 CALL R4 2
+ 0x80000000, // 001A RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
+/********************************************************************
+** Solidified function: save
+********************************************************************/
+be_local_closure(save, /* name */
+ be_nested_proto(
+ 7, /* nstack */
+ 1, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 7]) { /* constants */
+ /* K0 */ be_nested_string("_filename", 1430813195, 9),
+ /* K1 */ be_nested_string("w", -234078410, 1),
+ /* K2 */ be_nested_string("json_fdump", 1694216580, 10),
+ /* K3 */ be_nested_string("close", 667630371, 5),
+ /* K4 */ be_nested_string("write", -1104765092, 5),
+ /* K5 */ be_nested_string("{}", 1415952421, 2),
+ /* K6 */ be_nested_string("_dirty", 283846766, 6),
+ }),
+ (be_nested_const_str("save", -855671224, 4)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[37]) { /* code */
+ 0x4C040000, // 0000 LDNIL R1
+ 0xA802000B, // 0001 EXBLK 0 #000E
+ 0x60080011, // 0002 GETGBL R2 G17
+ 0x880C0100, // 0003 GETMBR R3 R0 K0
+ 0x58100001, // 0004 LDCONST R4 K1
+ 0x7C080400, // 0005 CALL R2 2
+ 0x5C040400, // 0006 MOVE R1 R2
+ 0x8C080102, // 0007 GETMET R2 R0 K2
+ 0x5C100200, // 0008 MOVE R4 R1
+ 0x7C080400, // 0009 CALL R2 2
+ 0x8C080303, // 000A GETMET R2 R1 K3
+ 0x7C080200, // 000B CALL R2 1
+ 0xA8040001, // 000C EXBLK 1 1
+ 0x70020013, // 000D JMP #0022
+ 0xAC080002, // 000E CATCH R2 0 2
+ 0x70020010, // 000F JMP #0021
+ 0x4C100000, // 0010 LDNIL R4
+ 0x20100204, // 0011 NE R4 R1 R4
+ 0x78120001, // 0012 JMPF R4 #0015
+ 0x8C100303, // 0013 GETMET R4 R1 K3
+ 0x7C100200, // 0014 CALL R4 1
+ 0x60100011, // 0015 GETGBL R4 G17
+ 0x88140100, // 0016 GETMBR R5 R0 K0
+ 0x58180001, // 0017 LDCONST R6 K1
+ 0x7C100400, // 0018 CALL R4 2
+ 0x5C040800, // 0019 MOVE R1 R4
+ 0x8C100304, // 001A GETMET R4 R1 K4
+ 0x58180005, // 001B LDCONST R6 K5
+ 0x7C100400, // 001C CALL R4 2
+ 0x8C100303, // 001D GETMET R4 R1 K3
+ 0x7C100200, // 001E CALL R4 1
+ 0xB0040403, // 001F RAISE 1 R2 R3
+ 0x70020000, // 0020 JMP #0022
+ 0xB0080000, // 0021 RAISE 2 R0 R0
+ 0x50080000, // 0022 LDBOOL R2 0 0
+ 0x90020C02, // 0023 SETMBR R0 K6 R2
+ 0x80000000, // 0024 RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
+/********************************************************************
+** Solidified function: load
+********************************************************************/
+be_local_closure(load, /* name */
+ be_nested_proto(
+ 9, /* nstack */
+ 1, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[11]) { /* constants */
+ /* K0 */ be_nested_string("json", 916562499, 4),
+ /* K1 */ be_nested_string("path", -2071507658, 4),
+ /* K2 */ be_nested_string("exists", 1002329533, 6),
+ /* K3 */ be_nested_string("_filename", 1430813195, 9),
+ /* K4 */ be_nested_string("r", -150190315, 1),
+ /* K5 */ be_nested_string("load", -435725847, 4),
+ /* K6 */ be_nested_string("read", -824204347, 4),
+ /* K7 */ be_nested_string("close", 667630371, 5),
+ /* K8 */ be_nested_string("_p", 1594591802, 2),
+ /* K9 */ be_nested_string("BRY: failed to load _persist.json", -1303053851, 33),
+ /* K10 */ be_nested_string("_dirty", 283846766, 6),
+ }),
+ (be_nested_const_str("load", -435725847, 4)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[46]) { /* code */
+ 0xA4060000, // 0000 IMPORT R1 K0
+ 0xA40A0200, // 0001 IMPORT R2 K1
+ 0x4C0C0000, // 0002 LDNIL R3
+ 0x4C100000, // 0003 LDNIL R4
+ 0x8C140502, // 0004 GETMET R5 R2 K2
+ 0x881C0103, // 0005 GETMBR R7 R0 K3
+ 0x7C140400, // 0006 CALL R5 2
+ 0x78160024, // 0007 JMPF R5 #002D
+ 0xA802000D, // 0008 EXBLK 0 #0017
+ 0x60140011, // 0009 GETGBL R5 G17
+ 0x88180103, // 000A GETMBR R6 R0 K3
+ 0x581C0004, // 000B LDCONST R7 K4
+ 0x7C140400, // 000C CALL R5 2
+ 0x5C0C0A00, // 000D MOVE R3 R5
+ 0x8C140305, // 000E GETMET R5 R1 K5
+ 0x8C1C0706, // 000F GETMET R7 R3 K6
+ 0x7C1C0200, // 0010 CALL R7 1
+ 0x7C140400, // 0011 CALL R5 2
+ 0x5C100A00, // 0012 MOVE R4 R5
+ 0x8C140707, // 0013 GETMET R5 R3 K7
+ 0x7C140200, // 0014 CALL R5 1
+ 0xA8040001, // 0015 EXBLK 1 1
+ 0x70020009, // 0016 JMP #0021
+ 0xAC140002, // 0017 CATCH R5 0 2
+ 0x70020006, // 0018 JMP #0020
+ 0x4C1C0000, // 0019 LDNIL R7
+ 0x201C0607, // 001A NE R7 R3 R7
+ 0x781E0001, // 001B JMPF R7 #001E
+ 0x8C1C0707, // 001C GETMET R7 R3 K7
+ 0x7C1C0200, // 001D CALL R7 1
+ 0xB0040A06, // 001E RAISE 1 R5 R6
+ 0x70020000, // 001F JMP #0021
+ 0xB0080000, // 0020 RAISE 2 R0 R0
+ 0x6014000F, // 0021 GETGBL R5 G15
+ 0x5C180800, // 0022 MOVE R6 R4
+ 0x601C0013, // 0023 GETGBL R7 G19
+ 0x7C140400, // 0024 CALL R5 2
+ 0x78160001, // 0025 JMPF R5 #0028
+ 0x90021004, // 0026 SETMBR R0 K8 R4
+ 0x70020002, // 0027 JMP #002B
+ 0x60140001, // 0028 GETGBL R5 G1
+ 0x58180009, // 0029 LDCONST R6 K9
+ 0x7C140200, // 002A CALL R5 1
+ 0x50140000, // 002B LDBOOL R5 0 0
+ 0x90021405, // 002C SETMBR R0 K10 R5
+ 0x80000000, // 002D RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
/********************************************************************
** Solidified function: find
********************************************************************/
@@ -367,7 +475,7 @@ be_local_closure(find, /* name */
/* K1 */ be_nested_string("find", -1108310694, 4),
}),
(be_nested_const_str("find", -1108310694, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0x880C0100, // 0000 GETMBR R3 R0 K0
0x8C0C0701, // 0001 GETMET R3 R3 K1
@@ -381,26 +489,168 @@ be_local_closure(find, /* name */
/*******************************************************************/
+/********************************************************************
+** Solidified function: init
+********************************************************************/
+be_local_closure(init, /* name */
+ be_nested_proto(
+ 6, /* nstack */
+ 2, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 6]) { /* constants */
+ /* K0 */ be_nested_string("_filename", 1430813195, 9),
+ /* K1 */ be_nested_string("_persist.json", 2008425138, 13),
+ /* K2 */ be_nested_string("_p", 1594591802, 2),
+ /* K3 */ be_nested_string("copy", -446502332, 4),
+ /* K4 */ be_nested_string("load", -435725847, 4),
+ /* K5 */ be_nested_string("_dirty", 283846766, 6),
+ }),
+ (be_nested_const_str("init", 380752755, 4)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[20]) { /* code */
+ 0x90020101, // 0000 SETMBR R0 K0 K1
+ 0x6008000F, // 0001 GETGBL R2 G15
+ 0x5C0C0200, // 0002 MOVE R3 R1
+ 0x60100013, // 0003 GETGBL R4 G19
+ 0x7C080400, // 0004 CALL R2 2
+ 0x780A0003, // 0005 JMPF R2 #000A
+ 0x8C080303, // 0006 GETMET R2 R1 K3
+ 0x7C080200, // 0007 CALL R2 1
+ 0x90020402, // 0008 SETMBR R0 K2 R2
+ 0x70020002, // 0009 JMP #000D
+ 0x60080013, // 000A GETGBL R2 G19
+ 0x7C080000, // 000B CALL R2 0
+ 0x90020402, // 000C SETMBR R0 K2 R2
+ 0x8C080104, // 000D GETMET R2 R0 K4
+ 0x88100102, // 000E GETMBR R4 R0 K2
+ 0x88140100, // 000F GETMBR R5 R0 K0
+ 0x7C080600, // 0010 CALL R2 3
+ 0x50080000, // 0011 LDBOOL R2 0 0
+ 0x90020A02, // 0012 SETMBR R0 K5 R2
+ 0x80000000, // 0013 RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
+/********************************************************************
+** Solidified function: json_fdump_list
+********************************************************************/
+be_local_closure(json_fdump_list, /* name */
+ be_nested_proto(
+ 9, /* nstack */
+ 3, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 8]) { /* constants */
+ /* K0 */ be_nested_string("json", 916562499, 4),
+ /* K1 */ be_nested_string("write", -1104765092, 5),
+ /* K2 */ be_nested_string("[", -569630790, 1),
+ /* K3 */ be_const_int(0),
+ /* K4 */ be_nested_string(",", 688690635, 1),
+ /* K5 */ be_nested_string("json_fdump_any", -946337911, 14),
+ /* K6 */ be_const_int(1),
+ /* K7 */ be_nested_string("]", -670296504, 1),
+ }),
+ (be_nested_const_str("json_fdump_list", -391087443, 15)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[25]) { /* code */
+ 0xA40E0000, // 0000 IMPORT R3 K0
+ 0x8C100301, // 0001 GETMET R4 R1 K1
+ 0x58180002, // 0002 LDCONST R6 K2
+ 0x7C100400, // 0003 CALL R4 2
+ 0x58100003, // 0004 LDCONST R4 K3
+ 0x6014000C, // 0005 GETGBL R5 G12
+ 0x5C180400, // 0006 MOVE R6 R2
+ 0x7C140200, // 0007 CALL R5 1
+ 0x14140805, // 0008 LT R5 R4 R5
+ 0x7816000A, // 0009 JMPF R5 #0015
+ 0x24140903, // 000A GT R5 R4 K3
+ 0x78160002, // 000B JMPF R5 #000F
+ 0x8C140301, // 000C GETMET R5 R1 K1
+ 0x581C0004, // 000D LDCONST R7 K4
+ 0x7C140400, // 000E CALL R5 2
+ 0x8C140105, // 000F GETMET R5 R0 K5
+ 0x5C1C0200, // 0010 MOVE R7 R1
+ 0x94200404, // 0011 GETIDX R8 R2 R4
+ 0x7C140600, // 0012 CALL R5 3
+ 0x00100906, // 0013 ADD R4 R4 K6
+ 0x7001FFEF, // 0014 JMP #0005
+ 0x8C140301, // 0015 GETMET R5 R1 K1
+ 0x581C0007, // 0016 LDCONST R7 K7
+ 0x7C140400, // 0017 CALL R5 2
+ 0x80000000, // 0018 RET 0
+ })
+ )
+);
+/*******************************************************************/
+
+
+/********************************************************************
+** Solidified function: has
+********************************************************************/
+be_local_closure(has, /* name */
+ be_nested_proto(
+ 5, /* nstack */
+ 2, /* argc */
+ 0, /* varg */
+ 0, /* has upvals */
+ NULL, /* no upvals */
+ 0, /* has sup protos */
+ NULL, /* no sub protos */
+ 1, /* has constants */
+ ( &(const bvalue[ 2]) { /* constants */
+ /* K0 */ be_nested_string("_p", 1594591802, 2),
+ /* K1 */ be_nested_string("has", -306245661, 3),
+ }),
+ (be_nested_const_str("has", -306245661, 3)),
+ ((bstring*) &be_const_str_input),
+ ( &(const binstruction[ 5]) { /* code */
+ 0x88080100, // 0000 GETMBR R2 R0 K0
+ 0x8C080501, // 0001 GETMET R2 R2 K1
+ 0x5C100200, // 0002 MOVE R4 R1
+ 0x7C080400, // 0003 CALL R2 2
+ 0x80040400, // 0004 RET 1 R2
+ })
+ )
+);
+/*******************************************************************/
+
+
/********************************************************************
** Solidified class: Persist
********************************************************************/
be_local_class(Persist,
3,
NULL,
- be_nested_map(12,
+ be_nested_map(16,
( (struct bmapnode*) &(const bmapnode[]) {
+ { be_nested_key("json_fdump_map", -203012643, 14, 5), be_const_closure(json_fdump_map_closure) },
+ { be_nested_key("setmember", 1432909441, 9, -1), be_const_closure(setmember_closure) },
+ { be_nested_key("zero", -1955600541, 4, 15), be_const_closure(zero_closure) },
+ { be_nested_key("member", 719708611, 6, 12), be_const_closure(member_closure) },
+ { be_nested_key("json_fdump", 1694216580, 10, -1), be_const_closure(json_fdump_closure) },
+ { be_nested_key("remove", -611183107, 6, -1), be_const_closure(remove_closure) },
+ { be_nested_key("json_fdump_any", -946337911, 14, -1), be_const_closure(json_fdump_any_closure) },
+ { be_nested_key("_p", 1594591802, 2, -1), be_const_var(1) },
{ be_nested_key("save", -855671224, 4, -1), be_const_closure(save_closure) },
- { be_nested_key("setmember", 1432909441, 9, 4), be_const_closure(setmember_closure) },
- { be_nested_key("_p", 1594591802, 2, 5), be_const_var(1) },
- { be_nested_key("init", 380752755, 4, -1), be_const_closure(init_closure) },
- { be_nested_key("load", -435725847, 4, -1), be_const_closure(load_closure) },
+ { be_nested_key("load", -435725847, 4, 6), be_const_closure(load_closure) },
+ { be_nested_key("find", -1108310694, 4, 7), be_const_closure(find_closure) },
+ { be_nested_key("_filename", 1430813195, 9, -1), be_const_var(0) },
+ { be_nested_key("init", 380752755, 4, 2), be_const_closure(init_closure) },
+ { be_nested_key("json_fdump_list", -391087443, 15, 0), be_const_closure(json_fdump_list_closure) },
{ be_nested_key("_dirty", 283846766, 6, -1), be_const_var(2) },
{ be_nested_key("has", -306245661, 3, -1), be_const_closure(has_closure) },
- { be_nested_key("zero", -1955600541, 4, 8), be_const_closure(zero_closure) },
- { be_nested_key("member", 719708611, 6, 6), be_const_closure(member_closure) },
- { be_nested_key("remove", -611183107, 6, -1), be_const_closure(remove_closure) },
- { be_nested_key("find", -1108310694, 4, -1), be_const_closure(find_closure) },
- { be_nested_key("_filename", 1430813195, 9, -1), be_const_var(0) },
})),
(be_nested_const_str("Persist", 1456346147, 7))
);
@@ -422,7 +672,7 @@ be_local_closure(_anonymous_, /* name */
/* K0 */ be_const_class(be_class_Persist),
}),
(be_nested_const_str("_anonymous_", 1957281476, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 5]) { /* code */
0x58040000, // 0000 LDCONST R1 K0
0xB4000000, // 0001 CLASS K0
@@ -434,9 +684,16 @@ be_local_closure(_anonymous_, /* name */
);
/*******************************************************************/
-/* @const_object_info_begin
-module persist (scope: global) {
- init, closure(_anonymous__closure)
-}
-@const_object_info_end */
-#include "../generate/be_fixed_persist.h"
+
+/********************************************************************
+** Solidified module: persist
+********************************************************************/
+be_local_module(persist,
+ "persist",
+ be_nested_map(1,
+ ( (struct bmapnode*) &(const bmapnode[]) {
+ { be_nested_key("init", 380752755, 4, -1), be_const_closure(_anonymous__closure) },
+ }))
+);
+BE_EXPORT_VARIABLE be_define_const_native_module(persist);
+/********************************************************************/
diff --git a/lib/libesp32/Berry/default/be_port.cpp b/lib/libesp32/Berry/default/be_port.cpp
index 88815a000..1870d3ae3 100644
--- a/lib/libesp32/Berry/default/be_port.cpp
+++ b/lib/libesp32/Berry/default/be_port.cpp
@@ -18,7 +18,9 @@
// Local pointer for file managment
#ifdef USE_UFILESYS
#include
+ #include "ZipReadFS.h"
extern FS *ufsp;
+ FS zip_ufsp(ZipReadFSImplPtr(new ZipReadFSImpl(&ufsp)));
#endif // USE_UFILESYS
/* this file contains configuration for the file system. */
@@ -95,10 +97,42 @@ BERRY_API void be_writebuffer(const char *buffer, size_t length)
// be_fwrite(stdout, buffer, length);
}
+
+extern "C" {
+ int m_path_listdir(bvm *vm)
+ {
+ if (be_top(vm) >= 1 && be_isstring(vm, 1)) {
+ const char *path = be_tostring(vm, 1);
+ be_newobject(vm, "list");
+
+ File dir = ufsp->open(path, "r");
+ if (dir) {
+ dir.rewindDirectory();
+ while (1) {
+ File entry = dir.openNextFile();
+ if (!entry) {
+ break;
+ }
+ const char * fn = entry.name();
+ if (strcmp(fn, ".") && strcmp(fn, "..")) {
+ be_pushstring(vm, fn);
+ be_data_push(vm, -2);
+ be_pop(vm, 1);
+ }
+
+ }
+ }
+ be_pop(vm, 1);
+ be_return(vm);
+
+ }
+ be_return_nil(vm);
+ }
+}
+
BERRY_API char* be_readstring(char *buffer, size_t size)
{
- return 0;
- // return be_fgets(stdin, buffer, (int)size);
+ return be_fgets(stdin, buffer, (int)size);
}
/* use the standard library implementation file API. */
@@ -106,7 +140,7 @@ BERRY_API char* be_readstring(char *buffer, size_t size)
void* be_fopen(const char *filename, const char *modes)
{
#ifdef USE_UFILESYS
- if (ufsp != nullptr && filename != nullptr && modes != nullptr) {
+ if (filename != nullptr && modes != nullptr) {
char fname2[strlen(filename) + 2];
if (filename[0] == '/') {
strcpy(fname2, filename); // copy unchanged
@@ -115,7 +149,7 @@ void* be_fopen(const char *filename, const char *modes)
strcpy(fname2 + 1, filename); // prepend with '/'
}
// Serial.printf("be_fopen filename=%s, modes=%s\n", filename, modes);
- File f = ufsp->open(fname2, modes); // returns an object, not a pointer
+ File f = zip_ufsp.open(fname2, modes); // returns an object, not a pointer
if (f) {
File * f_ptr = new File(f); // copy to dynamic object
*f_ptr = f; // TODO is this necessary?
@@ -127,11 +161,24 @@ void* be_fopen(const char *filename, const char *modes)
// return fopen(filename, modes);
}
+// Tasmota specific, get the underlying Arduino File
+File * be_get_arduino_file(void *hfile)
+{
+#ifdef USE_UFILESYS
+ if (hfile != nullptr) {
+ File * f_ptr = (File*) hfile;
+ return f_ptr;
+ }
+#endif // USE_UFILESYS
+ return nullptr;
+ // return fopen(filename, modes);
+}
+
int be_fclose(void *hfile)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fclose\n");
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
f_ptr->close();
delete f_ptr;
@@ -146,7 +193,7 @@ size_t be_fwrite(void *hfile, const void *buffer, size_t length)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fwrite %d\n", length);
- if (ufsp != nullptr && hfile != nullptr && buffer != nullptr) {
+ if (hfile != nullptr && buffer != nullptr) {
File * f_ptr = (File*) hfile;
return f_ptr->write((const uint8_t*) buffer, length);
}
@@ -159,7 +206,7 @@ size_t be_fread(void *hfile, void *buffer, size_t length)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fread %d\n", length);
- if (ufsp != nullptr && hfile != nullptr && buffer != nullptr) {
+ if (hfile != nullptr && buffer != nullptr) {
File * f_ptr = (File*) hfile;
int32_t ret = f_ptr->read((uint8_t*) buffer, length);
if (ret >= 0) {
@@ -175,13 +222,19 @@ size_t be_fread(void *hfile, void *buffer, size_t length)
char* be_fgets(void *hfile, void *buffer, int size)
{
#ifdef USE_UFILESYS
- // Serial.printf("be_fgets %d\n", size);
+ if (size <= 2) { return nullptr; } // can't work if size is 2 or less
+ // Serial.printf("be_fgets size=%d hfile=%p buf=%p\n", size, hfile, buffer);
uint8_t * buf = (uint8_t*) buffer;
- if (ufsp != nullptr && hfile != nullptr && buffer != nullptr && size > 0) {
+ if (hfile != nullptr && buffer != nullptr && size > 0) {
File * f_ptr = (File*) hfile;
- int ret = f_ptr->readBytesUntil('\n', buf, size - 1);
+ int ret = f_ptr->readBytesUntil('\n', buf, size - 2);
+ // Serial.printf("be_fgets ret=%d\n", ret);
if (ret >= 0) {
buf[ret] = 0; // add string terminator
+ if (ret > 0 && ret < size - 2) {
+ buf[ret] = '\n';
+ buf[ret+1] = 0;
+ }
return (char*) buffer;
}
}
@@ -194,7 +247,7 @@ int be_fseek(void *hfile, long offset)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fseek %d\n", offset);
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
if (f_ptr->seek(offset)) {
return 0; // success
@@ -209,7 +262,7 @@ long int be_ftell(void *hfile)
{
#ifdef USE_UFILESYS
// Serial.printf("be_ftell\n");
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
return f_ptr->position();
}
@@ -222,7 +275,7 @@ long int be_fflush(void *hfile)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fflush\n");
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
f_ptr->flush();
}
@@ -235,7 +288,7 @@ size_t be_fsize(void *hfile)
{
#ifdef USE_UFILESYS
// Serial.printf("be_fsize\n");
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
return f_ptr->size();
}
@@ -251,7 +304,7 @@ size_t be_fsize(void *hfile)
extern "C" time_t be_last_modified(void *hfile)
{
#ifdef USE_UFILESYS
- if (ufsp != nullptr && hfile != nullptr) {
+ if (hfile != nullptr) {
File * f_ptr = (File*) hfile;
return f_ptr->getLastWrite();
}
@@ -262,16 +315,29 @@ extern "C" time_t be_last_modified(void *hfile)
int be_isexist(const char *filename)
{
#ifdef USE_UFILESYS
- if (ufsp != nullptr) {
- char fname2[strlen(filename) + 2];
- if (filename[0] == '/') {
- strcpy(fname2, filename); // copy unchanged
- } else {
- fname2[0] = '/';
- strcpy(fname2 + 1, filename); // prepend with '/'
- }
- return ufsp->exists(fname2);
+ char fname2[strlen(filename) + 2];
+ if (filename[0] == '/') {
+ strcpy(fname2, filename); // copy unchanged
+ } else {
+ fname2[0] = '/';
+ strcpy(fname2 + 1, filename); // prepend with '/'
}
+ return zip_ufsp.exists(fname2);
+#endif // USE_UFILESYS
+ return 0;
+}
+
+int be_unlink(const char *filename)
+{
+#ifdef USE_UFILESYS
+ char fname2[strlen(filename) + 2];
+ if (filename[0] == '/') {
+ strcpy(fname2, filename); // copy unchanged
+ } else {
+ fname2[0] = '/';
+ strcpy(fname2 + 1, filename); // prepend with '/'
+ }
+ return zip_ufsp.remove(fname2);
#endif // USE_UFILESYS
return 0;
}
diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c
index bcc8dd9a5..dd5c986d8 100644
--- a/lib/libesp32/Berry/default/be_tasmotalib.c
+++ b/lib/libesp32/Berry/default/be_tasmotalib.c
@@ -12,6 +12,7 @@ extern struct dummy_struct be_tasmota_global_struct;
extern struct dummy_struct be_tasmota_settings_struct;
extern int l_getFreeHeap(bvm *vm);
+extern int l_arch(bvm *vm);
extern int l_publish(bvm *vm);
extern int l_publish_result(bvm *vm);
extern int l_cmd(bvm *vm);
@@ -68,8 +69,8 @@ be_local_closure(kv_init, /* name */
/* K0 */ be_nested_string("k", -301188886, 1),
/* K1 */ be_nested_string("v", -217300791, 1),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 3]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x90020202, // 0001 SETMBR R0 K1 R2
@@ -112,7 +113,7 @@ be_local_closure(kv, /* name */
/* K0 */ be_const_class(be_class_KV),
}),
(be_nested_const_str("kv", 1497177492, 2)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x580C0000, // 0000 LDCONST R3 K0
0xB4000000, // 0001 CLASS K0
@@ -153,7 +154,7 @@ be_local_closure(init, /* name */
/* K9 */ be_nested_string("toptr", -915119842, 5),
/* K10 */ be_nested_string("_settings_def", -519406989, 13),
}),
- (be_nested_const_str("init", 380752755, 4)),
+ ((bstring*) &be_const_str_init),
(be_nested_const_str("tasmota.be", 1128870755, 10)),
( &(const binstruction[23]) { /* code */
0xB8060200, // 0000 GETNGBL R1 K1
@@ -202,7 +203,7 @@ be_local_closure(add_driver, /* name */
/* K1 */ be_nested_string("push", -2022703139, 4),
}),
(be_nested_const_str("add_driver", 1654458371, 10)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[12]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x780A0004, // 0001 JMPF R2 #0007
@@ -245,7 +246,7 @@ be_local_closure(gen_cb, /* name */
/* K6 */ be_nested_string("No callback available", 633786138, 21),
}),
(be_nested_const_str("gen_cb", -1049739745, 6)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[34]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
@@ -306,7 +307,7 @@ be_local_closure(set_light, /* name */
/* K2 */ be_nested_string("set", -970520829, 3),
}),
(be_nested_const_str("set_light", -1118891144, 9)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[18]) { /* code */
0x600C0001, // 0000 GETGBL R3 G1
0x58100000, // 0001 LDCONST R4 K0
@@ -353,7 +354,7 @@ be_local_closure(remove_rule, /* name */
/* K4 */ be_const_int(1),
}),
(be_nested_const_str("remove_rule", -838755968, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[21]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x780A0011, // 0001 JMPF R2 #0014
@@ -402,7 +403,7 @@ be_local_closure(add_cmd, /* name */
/* K3 */ be_nested_string("the second argument is not a function", -340392827, 37),
}),
(be_nested_const_str("add_cmd", -933336417, 7)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[15]) { /* code */
0x880C0100, // 0000 GETMBR R3 R0 K0
0x740E0002, // 0001 JMPT R3 #0005
@@ -446,7 +447,7 @@ be_local_closure(wire_scan, /* name */
/* K4 */ be_nested_string("wire2", -1065468258, 5),
}),
(be_nested_const_str("wire_scan", -1623691416, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[33]) { /* code */
0x4C0C0000, // 0000 LDNIL R3
0x200C0403, // 0001 NE R3 R2 R3
@@ -508,7 +509,7 @@ be_local_closure(find_key_i, /* name */
/* K4 */ be_nested_string("stop_iteration", -121173395, 14),
}),
(be_nested_const_str("find_key_i", 850136726, 10)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[30]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0x8C100701, // 0001 GETMET R4 R3 K1
@@ -564,7 +565,7 @@ be_local_closure(chars_in_string, /* name */
/* K1 */ be_const_int(1),
}),
(be_nested_const_str("chars_in_string", -1146182164, 15)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[31]) { /* code */
0x780E0001, // 0000 JMPF R3 #0003
0x50100200, // 0001 LDBOOL R4 1 0
@@ -623,7 +624,7 @@ be_local_closure(set_timer, /* name */
/* K3 */ be_nested_string("millis", 1214679063, 6),
}),
(be_nested_const_str("set_timer", 2135414533, 9)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[16]) { /* code */
0x88100100, // 0000 GETMBR R4 R0 K0
0x74120002, // 0001 JMPT R4 #0005
@@ -669,7 +670,7 @@ be_local_closure(add_rule, /* name */
/* K5 */ be_nested_string("the second argument is not a function", -340392827, 37),
}),
(be_nested_const_str("add_rule", 596540743, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[20]) { /* code */
0x880C0100, // 0000 GETMBR R3 R0 K0
0x740E0002, // 0001 JMPT R3 #0005
@@ -721,7 +722,7 @@ be_local_closure(run_deferred, /* name */
/* K7 */ be_const_int(1),
}),
(be_nested_const_str("run_deferred", 371594696, 12)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[27]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x78060017, // 0001 JMPF R1 #001A
@@ -822,7 +823,7 @@ be_local_closure(time_str, /* name */
/* K9 */ be_nested_string("sec", -1155074638, 3),
}),
(be_nested_const_str("time_str", -1681139684, 8)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[14]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x8C0C0101, // 0001 GETMET R3 R0 K1
@@ -878,7 +879,7 @@ be_local_closure(load, /* name */
/* K17 */ be_nested_string("BRY: could not save compiled file %s (%s)", 736659787, 41),
}),
(be_nested_const_str("load", -435725847, 4)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[87]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0xA40E0200, // 0001 IMPORT R3 K1
@@ -995,7 +996,7 @@ be_local_closure(find_op, /* name */
/* K5 */ be_const_int(1),
}),
(be_nested_const_str("find_op", -528253920, 7)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[42]) { /* code */
0xA40A0000, // 0000 IMPORT R2 K0
0x580C0001, // 0001 LDCONST R3 K1
@@ -1068,7 +1069,7 @@ be_local_closure(remove_timer, /* name */
/* K6 */ be_const_int(1),
}),
(be_nested_const_str("remove_timer", -153495081, 12)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[23]) { /* code */
0xB80A0000, // 0000 GETNGBL R2 K0
0x88080501, // 0001 GETMBR R2 R2 K1
@@ -1118,7 +1119,7 @@ be_local_closure(get_light, /* name */
/* K2 */ be_nested_string("get", 1410115415, 3),
}),
(be_nested_const_str("get_light", 381930476, 9)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[16]) { /* code */
0x60080001, // 0000 GETGBL R2 G1
0x580C0000, // 0001 LDCONST R3 K0
@@ -1170,7 +1171,7 @@ be_local_closure(exec_rules, /* name */
/* K11 */ be_const_int(1),
}),
(be_nested_const_str("exec_rules", 1445221092, 10)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[48]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x740A0003, // 0001 JMPT R2 #0006
@@ -1254,7 +1255,7 @@ be_local_closure(exec_tele, /* name */
/* K11 */ be_const_int(1),
}),
(be_nested_const_str("exec_tele", 1020751601, 9)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[41]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x780A0024, // 0001 JMPF R2 #0027
@@ -1322,7 +1323,7 @@ be_local_closure(remove_driver, /* name */
/* K2 */ be_nested_string("pop", 1362321360, 3),
}),
(be_nested_const_str("remove_driver", 1030243768, 13)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[14]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x780A000A, // 0001 JMPF R2 #000D
@@ -1376,7 +1377,7 @@ be_local_closure(try_rule, /* name */
/* K15 */ be_nested_string("<=", -1795743310, 2),
}),
(be_nested_const_str("try_rule", 1986449405, 8)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[141]) { /* code */
0xA4120000, // 0000 IMPORT R4 K0
0x8C140101, // 0001 GETMET R5 R0 K1
@@ -1544,7 +1545,7 @@ be_local_closure(cb_dispatch, /* name */
/* K2 */ be_nested_string("find", -1108310694, 4),
}),
(be_nested_const_str("cb_dispatch", 1741510499, 11)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[20]) { /* code */
0x88180100, // 0000 GETMBR R6 R0 K0
0x4C1C0000, // 0001 LDNIL R7
@@ -1591,7 +1592,7 @@ be_local_closure(gc, /* name */
/* K2 */ be_nested_string("allocated", 429986098, 9),
}),
(be_nested_const_str("gc", 1042313471, 2)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 6]) { /* code */
0xA4060000, // 0000 IMPORT R1 K0
0x8C080301, // 0001 GETMET R2 R1 K1
@@ -1761,7 +1762,7 @@ be_local_closure(remove_cmd, /* name */
/* K1 */ be_nested_string("remove", -611183107, 6),
}),
(be_nested_const_str("remove_cmd", -462651594, 10)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 7]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x780A0003, // 0001 JMPF R2 #0006
@@ -1797,7 +1798,7 @@ be_local_closure(exec_cmd, /* name */
/* K4 */ be_nested_string("resolvecmnd", 993361485, 11),
}),
(be_nested_const_str("exec_cmd", 493567399, 8)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[27]) { /* code */
0x88100100, // 0000 GETMBR R4 R0 K0
0x78120016, // 0001 JMPF R4 #0019
@@ -1865,6 +1866,7 @@ class be_class_tasmota (scope: global, name: Tasmota) {
kv, closure(kv_closure)
get_free_heap, func(l_getFreeHeap)
+ arch, func(l_arch)
publish, func(l_publish)
publish_result, func(l_publish_result)
_cmd, func(l_cmd)
diff --git a/lib/libesp32/Berry/default/be_timer_class.c b/lib/libesp32/Berry/default/be_timer_class.c
index e6c495851..2646fd6b2 100644
--- a/lib/libesp32/Berry/default/be_timer_class.c
+++ b/lib/libesp32/Berry/default/be_timer_class.c
@@ -27,7 +27,7 @@ be_local_closure(tostring, /* name */
/* K5 */ be_nested_string("id", 926444256, 2),
}),
(be_nested_const_str("tostring", -1995258651, 8)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[19]) { /* code */
0xA4060000, // 0000 IMPORT R1 K0
0x8C080301, // 0001 GETMET R2 R1 K1
@@ -72,8 +72,8 @@ be_local_closure(init, /* name */
/* K1 */ be_nested_string("f", -485742695, 1),
/* K2 */ be_nested_string("id", 926444256, 2),
}),
- (be_nested_const_str("init", 380752755, 4)),
- (be_nested_const_str("Tasmota.be", 825809411, 10)),
+ ((bstring*) &be_const_str_init),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[ 4]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x90020202, // 0001 SETMBR R0 K1 R2
diff --git a/lib/libesp32/Berry/default/be_webclient_lib.c b/lib/libesp32/Berry/default/be_webclient_lib.c
index bc24705d6..0e4b66e90 100644
--- a/lib/libesp32/Berry/default/be_webclient_lib.c
+++ b/lib/libesp32/Berry/default/be_webclient_lib.c
@@ -21,6 +21,7 @@ extern int wc_addheader(bvm *vm);
extern int wc_GET(bvm *vm);
extern int wc_POST(bvm *vm);
extern int wc_getstring(bvm *vm);
+extern int wc_writefile(bvm *vm);
extern int wc_getsize(bvm *vm);
#include "../generate/be_fixed_be_class_webclient.h"
@@ -48,6 +49,7 @@ class be_class_webclient (scope: global, name: webclient) {
GET, func(wc_GET)
POST, func(wc_POST)
get_string, func(wc_getstring)
+ write_file, func(wc_writefile)
get_size, func(wc_getsize)
}
@const_object_info_end */
diff --git a/lib/libesp32/Berry/default/be_wirelib.c b/lib/libesp32/Berry/default/be_wirelib.c
index 089ed5cf5..63c4da93a 100644
--- a/lib/libesp32/Berry/default/be_wirelib.c
+++ b/lib/libesp32/Berry/default/be_wirelib.c
@@ -44,7 +44,7 @@ be_local_closure(write_bytes, /* name */
/* K2 */ be_nested_string("_end_transmission", -1057486896, 17),
}),
(be_nested_const_str("write_bytes", 1227543792, 11)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[12]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0
0x5C180200, // 0001 MOVE R6 R1
@@ -86,7 +86,7 @@ be_local_closure(read_bytes, /* name */
/* K5 */ be_nested_string("_read", 346717030, 5),
}),
(be_nested_const_str("read_bytes", -718234123, 10)),
- (be_nested_const_str("input", -103256197, 5)),
+ ((bstring*) &be_const_str_input),
( &(const binstruction[24]) { /* code */
0x8C100100, // 0000 GETMET R4 R0 K0
0x5C180200, // 0001 MOVE R6 R1
diff --git a/lib/libesp32/Berry/default/embedded/persist.be b/lib/libesp32/Berry/default/embedded/persist.be
index c69ac726d..e0bb8025f 100644
--- a/lib/libesp32/Berry/default/embedded/persist.be
+++ b/lib/libesp32/Berry/default/embedded/persist.be
@@ -75,7 +75,11 @@ persist_module.init = def (m)
if f != nil f.close() end
raise e, m
end
- self._p = val
+ if isinstance(val, map)
+ self._p = val # sucess
+ else
+ print("BRY: failed to load _persist.json")
+ end
self._dirty = false
end
@@ -83,22 +87,72 @@ persist_module.init = def (m)
end
def save()
- import json
-
var f # file object
try
f = open(self._filename, "w")
- f.write(json.dump(self._p))
+ self.json_fdump(f)
f.close()
except .. as e, m
if f != nil f.close() end
+ f = open(self._filename, "w")
+ f.write('{}') # fallback write empty map
+ f.close()
raise e, m
end
self._dirty = false
# print("Saving")
end
+
+ def json_fdump_any(f, v)
+ import json
+ if isinstance(v, map)
+ self.json_fdump_map(f, v)
+ elif isinstance(v, list)v
+ self.json_fdump_list(f, v)
+ else
+ f.write(json.dump(v))
+ end
+ end
+
+ def json_fdump_map(f, v)
+ import json
+ f.write('{')
+ var sep = nil
+ for k:v.keys()
+ if sep != nil f.write(sep) end
+
+ f.write(json.dump(str(k)))
+ f.write(':')
+ self.json_fdump_any(f, v[k])
+
+ sep = ","
+ end
+ f.write('}')
+ end
+
+ def json_fdump_list(f, v)
+ import json
+ f.write('[')
+ var i = 0
+ while i < size(v)
+ if i > 0 f.write(',') end
+ self.json_fdump_any(f, v[i])
+ i += 1
+ end
+ f.write(']')
+ end
+
+ def json_fdump(f)
+ import json
+ if isinstance(self._p, map)
+ self.json_fdump_map(f, self._p)
+ else
+ raise "internal_error", "persist._p is not a map"
+ end
+ end
end
+
return Persist() # return an instance of this class
end
diff --git a/lib/libesp32/Berry/default/gpio.txt b/lib/libesp32/Berry/default/gpio.txt
deleted file mode 100644
index ccece9c15..000000000
--- a/lib/libesp32/Berry/default/gpio.txt
+++ /dev/null
@@ -1,239 +0,0 @@
-GPIO_NONE 0
-GPIO_KEY1 1
-GPIO_KEY1_NP 2
-GPIO_KEY1_INV 3
-GPIO_KEY1_INV_NP 4
-GPIO_SWT1 5
-GPIO_SWT1_NP 6
-GPIO_REL1 7
-GPIO_REL1_INV 8
-GPIO_LED1 9
-GPIO_LED1_INV 10
-GPIO_CNTR1 11
-GPIO_CNTR1_NP 12
-GPIO_PWM1 13
-GPIO_PWM1_INV 14
-GPIO_BUZZER 15
-GPIO_BUZZER_INV 16
-GPIO_LEDLNK 17
-GPIO_LEDLNK_INV 18
-GPIO_I2C_SCL 19
-GPIO_I2C_SDA 20
-GPIO_SPI_MISO 21
-GPIO_SPI_MOSI 22
-GPIO_SPI_CLK 23
-GPIO_SPI_CS 24
-GPIO_SPI_DC 25
-GPIO_SSPI_MISO 26
-GPIO_SSPI_MOSI 27
-GPIO_SSPI_SCLK 28
-GPIO_SSPI_CS 29
-GPIO_SSPI_DC 30
-GPIO_BACKLIGHT 31
-GPIO_OLED_RESET 32
-GPIO_IRSEND 33
-GPIO_IRRECV 34
-GPIO_RFSEND 35
-GPIO_RFRECV 36
-GPIO_DHT11 37
-GPIO_DHT22 38
-GPIO_SI7021 39
-GPIO_DHT11_OUT 40
-GPIO_DSB 41
-GPIO_DSB_OUT 42
-GPIO_WS2812 43
-GPIO_MHZ_TXD 44
-GPIO_MHZ_RXD 45
-GPIO_PZEM0XX_TX 46
-GPIO_PZEM004_RX 47
-GPIO_PZEM016_RX 48
-GPIO_PZEM017_RX 49
-GPIO_SAIR_TX 50
-GPIO_SAIR_RX 51
-GPIO_PMS5003_TX 52
-GPIO_PMS5003_RX 53
-GPIO_SDS0X1_TX 54
-GPIO_SDS0X1_RX 55
-GPIO_SBR_TX 56
-GPIO_SBR_RX 57
-GPIO_SR04_TRIG 58
-GPIO_SR04_ECHO 59
-GPIO_SDM120_TX 60
-GPIO_SDM120_RX 61
-GPIO_SDM630_TX 62
-GPIO_SDM630_RX 63
-GPIO_TM1638CLK 64
-GPIO_TM1638DIO 65
-GPIO_TM1638STB 66
-GPIO_MP3_DFR562 67
-GPIO_HX711_SCK 68
-GPIO_HX711_DAT 69
-GPIO_TX2X_TXD_BLACK 70
-GPIO_TUYA_TX 71
-GPIO_TUYA_RX 72
-GPIO_MGC3130_XFER 73
-GPIO_MGC3130_RESET 74
-GPIO_RF_SENSOR 75
-GPIO_AZ_TXD 76
-GPIO_AZ_RXD 77
-GPIO_MAX31855CS 78
-GPIO_MAX31855CLK 79
-GPIO_MAX31855DO 80
-GPIO_NRG_SEL 81
-GPIO_NRG_SEL_INV 82
-GPIO_NRG_CF1 83
-GPIO_HLW_CF 84
-GPIO_HJL_CF 85
-GPIO_MCP39F5_TX 86
-GPIO_MCP39F5_RX 87
-GPIO_MCP39F5_RST 88
-GPIO_PN532_TXD 89
-GPIO_PN532_RXD 90
-GPIO_SM16716_CLK 91
-GPIO_SM16716_DAT 92
-GPIO_SM16716_SEL 93
-GPIO_DI 94
-GPIO_DCKI 95
-GPIO_CSE7766_TX 96
-GPIO_CSE7766_RX 97
-GPIO_ARIRFRCV 98
-GPIO_ARIRFSEL 99
-GPIO_TXD 100
-GPIO_RXD 101
-GPIO_ROT1A 102
-GPIO_ROT1B 103
-GPIO_ADC_JOY 104
-GPIO_SSPI_MAX31865_CS1 105
-GPIO_HRE_CLOCK 106
-GPIO_HRE_DATA 107
-GPIO_ADE7953_IRQ 108
-GPIO_SOLAXX1_TX 109
-GPIO_SOLAXX1_RX 110
-GPIO_ZIGBEE_TX 111
-GPIO_ZIGBEE_RX 112
-GPIO_RDM6300_RX 113
-GPIO_IBEACON_TX 114
-GPIO_IBEACON_RX 115
-GPIO_A4988_DIR 116
-GPIO_A4988_STP 117
-GPIO_A4988_ENA 118
-GPIO_A4988_MS1 119
-GPIO_OUTPUT_HI 120
-GPIO_OUTPUT_LO 121
-GPIO_DDS2382_TX 122
-GPIO_DDS2382_RX 123
-GPIO_DDSU666_TX 124
-GPIO_DDSU666_RX 125
-GPIO_SM2135_CLK 126
-GPIO_SM2135_DAT 127
-GPIO_DEEPSLEEP 128
-GPIO_EXS_ENABLE 129
-GPIO_TASMOTACLIENT_TXD 130
-GPIO_TASMOTACLIENT_RXD 131
-GPIO_TASMOTACLIENT_RST 132
-GPIO_TASMOTACLIENT_RST_INV 133
-GPIO_HPMA_RX 134
-GPIO_HPMA_TX 135
-GPIO_GPS_RX 136
-GPIO_GPS_TX 137
-GPIO_HM10_RX 138
-GPIO_HM10_TX 139
-GPIO_LE01MR_RX 140
-GPIO_LE01MR_TX 141
-GPIO_CC1101_GDO0 142
-GPIO_CC1101_GDO2 143
-GPIO_HRXL_RX 144
-GPIO_ELECTRIQ_MOODL_TX 145
-GPIO_AS3935 146
-GPIO_ADC_INPUT 147
-GPIO_ADC_TEMP 148
-GPIO_ADC_LIGHT 149
-GPIO_ADC_BUTTON 150
-GPIO_ADC_BUTTON_INV 151
-GPIO_ADC_RANGE 152
-GPIO_ADC_CT_POWER 153
-GPIO_WEBCAM_PWDN 154
-GPIO_WEBCAM_RESET 155
-GPIO_WEBCAM_XCLK 156
-GPIO_WEBCAM_SIOD 157
-GPIO_WEBCAM_SIOC 158
-GPIO_WEBCAM_DATA 159
-GPIO_WEBCAM_VSYNC 160
-GPIO_WEBCAM_HREF 161
-GPIO_WEBCAM_PCLK 162
-GPIO_WEBCAM_PSCLK 163
-GPIO_WEBCAM_HSD 164
-GPIO_WEBCAM_PSRCS 165
-GPIO_BOILER_OT_RX 166
-GPIO_BOILER_OT_TX 167
-GPIO_WINDMETER_SPEED 168
-GPIO_KEY1_TC 169
-GPIO_BL0940_RX 170
-GPIO_TCP_TX 171
-GPIO_TCP_RX 172
-GPIO_ETH_PHY_POWER 173
-GPIO_ETH_PHY_MDC 174
-GPIO_ETH_PHY_MDIO 175
-GPIO_TELEINFO_RX 176
-GPIO_TELEINFO_ENABLE 177
-GPIO_LMT01 178
-GPIO_IEM3000_TX 179
-GPIO_IEM3000_RX 180
-GPIO_ZIGBEE_RST 181
-GPIO_DYP_RX 182
-GPIO_MIEL_HVAC_TX 183
-GPIO_MIEL_HVAC_RX 184
-GPIO_WE517_TX 185
-GPIO_WE517_RX 186
-GPIO_AS608_TX 187
-GPIO_AS608_RX 188
-GPIO_SHELLY_DIMMER_BOOT0 189
-GPIO_SHELLY_DIMMER_RST_INV 190
-GPIO_RC522_RST 191
-GPIO_P9813_CLK 192
-GPIO_P9813_DAT 193
-GPIO_OPTION_A 194
-GPIO_FTC532 195
-GPIO_RC522_CS 196
-GPIO_NRF24_CS 197
-GPIO_NRF24_DC 198
-GPIO_ILI9341_CS 199
-GPIO_ILI9341_DC 200
-GPIO_ILI9488_CS 201
-GPIO_EPAPER29_CS 202
-GPIO_EPAPER42_CS 203
-GPIO_SSD1351_CS 204
-GPIO_RA8876_CS 205
-GPIO_ST7789_CS 206
-GPIO_ST7789_DC 207
-GPIO_SSD1331_CS 208
-GPIO_SSD1331_DC 209
-GPIO_SDCARD_CS 210
-GPIO_ROT1A_NP 211
-GPIO_ROT1B_NP 212
-GPIO_ADC_PH 213
-GPIO_BS814_CLK 214
-GPIO_BS814_DAT 215
-GPIO_WIEGAND_D0 216
-GPIO_WIEGAND_D1 217
-GPIO_NEOPOOL_TX 218
-GPIO_NEOPOOL_RX 219
-GPIO_SDM72_TX 220
-GPIO_SDM72_RX 221
-GPIO_TM1637CLK 222
-GPIO_TM1637DIO 223
-GPIO_PROJECTOR_CTRL_TX 224
-GPIO_PROJECTOR_CTRL_RX 225
-GPIO_SSD1351_DC 226
-GPIO_XPT2046_CS 227
-GPIO_CSE7761_TX 228
-GPIO_CSE7761_RX 229
-GPIO_VL53L0X_XSHUT1 230
-GPIO_MAX7219CLK 231
-GPIO_MAX7219DIN 232
-GPIO_MAX7219CS 233
-GPIO_TFMINIPLUS_TX 234
-GPIO_TFMINIPLUS_RX 235
-GPIO_ZEROCROSS 236
-GPIO_HALLEFFECT 237
-GPIO_SENSOR_END 238
\ No newline at end of file
diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h
index 519c2b601..aaf1a94a3 100644
--- a/lib/libesp32/Berry/generate/be_const_strtab.h
+++ b/lib/libesp32/Berry/generate/be_const_strtab.h
@@ -1,604 +1,343 @@
-extern const bcstring be_const_str_memory;
-extern const bcstring be_const_str_resp_cmnd;
-extern const bcstring be_const_str_LE01MR_TX;
-extern const bcstring be_const_str_RA8876_CS;
-extern const bcstring be_const_str_HX711_DAT;
-extern const bcstring be_const_str_OUTPUT_HI;
-extern const bcstring be_const_str_FALLING;
-extern const bcstring be_const_str_content_send;
-extern const bcstring be_const_str_while;
-extern const bcstring be_const_str_AudioFileSourceFS;
-extern const bcstring be_const_str_clear;
-extern const bcstring be_const_str_pin;
-extern const bcstring be_const_str_response_append;
-extern const bcstring be_const_str_write_bit;
-extern const bcstring be_const_str_try;
-extern const bcstring be_const_str_get_free_heap;
-extern const bcstring be_const_str_pow;
-extern const bcstring be_const_str_set_light;
-extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN;
-extern const bcstring be_const_str_ILI9488_CS;
-extern const bcstring be_const_str_WIEGAND_D1;
-extern const bcstring be_const_str__available;
-extern const bcstring be_const_str__settings_def;
-extern const bcstring be_const_str_find_key_i;
-extern const bcstring be_const_str_event;
-extern const bcstring be_const_str_SERIAL_6O1;
-extern const bcstring be_const_str_ST7789_DC;
-extern const bcstring be_const_str_WE517_TX;
-extern const bcstring be_const_str_byte;
-extern const bcstring be_const_str_set_useragent;
-extern const bcstring be_const_str_SERIAL_7E2;
-extern const bcstring be_const_str_TASMOTACLIENT_TXD;
-extern const bcstring be_const_str_WEBCAM_PCLK;
-extern const bcstring be_const_str_toptr;
-extern const bcstring be_const_str_Tasmota;
-extern const bcstring be_const_str__def;
-extern const bcstring be_const_str_KEY1_INV_NP;
-extern const bcstring be_const_str_dump;
-extern const bcstring be_const_str_MAX31855DO;
-extern const bcstring be_const_str_ZIGBEE_RX;
-extern const bcstring be_const_str_opt_call;
-extern const bcstring be_const_str_HPMA_RX;
-extern const bcstring be_const_str_I2S_IN_DATA;
-extern const bcstring be_const_str_AudioOutputI2S;
-extern const bcstring be_const_str_WEBCAM_SIOC;
-extern const bcstring be_const_str_bytes;
-extern const bcstring be_const_str_getbits;
-extern const bcstring be_const_str_setrange;
-extern const bcstring be_const_str_RC522_CS;
-extern const bcstring be_const_str_WIEGAND_D0;
-extern const bcstring be_const_str_char;
-extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV;
-extern const bcstring be_const_str_available;
-extern const bcstring be_const_str_FTC532;
-extern const bcstring be_const_str_MCP39F5_RST;
-extern const bcstring be_const_str_MP3_DFR562;
-extern const bcstring be_const_str_cmd;
-extern const bcstring be_const_str_ST7789_CS;
-extern const bcstring be_const_str_load;
-extern const bcstring be_const_str_ADC_INPUT;
-extern const bcstring be_const_str_Wire;
-extern const bcstring be_const_str_floor;
-extern const bcstring be_const_str_MAX7219CLK;
-extern const bcstring be_const_str_ZIGBEE_RST;
-extern const bcstring be_const_str__cmd;
-extern const bcstring be_const_str_tolower;
-extern const bcstring be_const_str_webclient;
-extern const bcstring be_const_str_true;
-extern const bcstring be_const_str_SDCARD_CS;
-extern const bcstring be_const_str_ADC_CT_POWER;
-extern const bcstring be_const_str_BL0940_RX;
-extern const bcstring be_const_str_OPEN_DRAIN;
-extern const bcstring be_const_str_dot_len;
-extern const bcstring be_const_str_dot_size;
-extern const bcstring be_const_str_return;
-extern const bcstring be_const_str_SERIAL_7O1;
-extern const bcstring be_const_str_module;
-extern const bcstring be_const_str_shared_key;
-extern const bcstring be_const_str_DCKI;
-extern const bcstring be_const_str_add_cmd;
-extern const bcstring be_const_str_iter;
-extern const bcstring be_const_str_read32;
-extern const bcstring be_const_str_PN532_RXD;
-extern const bcstring be_const_str_SM2135_DAT;
-extern const bcstring be_const_str_var;
-extern const bcstring be_const_str_WINDMETER_SPEED;
-extern const bcstring be_const_str_raise;
-extern const bcstring be_const_str_CSE7761_RX;
-extern const bcstring be_const_str_SAIR_RX;
-extern const bcstring be_const_str_cb_dispatch;
-extern const bcstring be_const_str_MIEL_HVAC_RX;
-extern const bcstring be_const_str_count;
-extern const bcstring be_const_str_REL1;
-extern const bcstring be_const_str_SWT1;
-extern const bcstring be_const_str_WS2812;
-extern const bcstring be_const_str_rand;
-extern const bcstring be_const_str_break;
-extern const bcstring be_const_str_MAX7219CS;
-extern const bcstring be_const_str_tag;
-extern const bcstring be_const_str_write;
-extern const bcstring be_const_str_WEBCAM_HSD;
-extern const bcstring be_const_str_compile;
-extern const bcstring be_const_str_type;
-extern const bcstring be_const_str_TASMOTACLIENT_RST_INV;
-extern const bcstring be_const_str_contains;
-extern const bcstring be_const_str_rad;
-extern const bcstring be_const_str_HALLEFFECT;
-extern const bcstring be_const_str_PZEM017_RX;
-extern const bcstring be_const_str_SSD1331_DC;
-extern const bcstring be_const_str_PULLDOWN;
-extern const bcstring be_const_str_get_power;
-extern const bcstring be_const_str_isnan;
-extern const bcstring be_const_str_add_rule;
-extern const bcstring be_const_str_finish;
-extern const bcstring be_const_str_NRF24_DC;
-extern const bcstring be_const_str_SERIAL_7O2;
-extern const bcstring be_const_str_remove;
-extern const bcstring be_const_str_ADC_JOY;
-extern const bcstring be_const_str_SERIAL_6O2;
-extern const bcstring be_const_str_WEBCAM_XCLK;
-extern const bcstring be_const_str__end_transmission;
-extern const bcstring be_const_str_has;
-extern const bcstring be_const_str_wire_scan;
-extern const bcstring be_const_str_MHZ_TXD;
-extern const bcstring be_const_str_SERIAL_7E1;
-extern const bcstring be_const_str_range;
-extern const bcstring be_const_str_time_reached;
-extern const bcstring be_const_str_KEY1_PD;
-extern const bcstring be_const_str_MAX31855CS;
-extern const bcstring be_const_str_SSPI_CS;
-extern const bcstring be_const_str_content_flush;
-extern const bcstring be_const_str_PROJECTOR_CTRL_RX;
-extern const bcstring be_const_str__settings_ptr;
-extern const bcstring be_const_str_ILI9341_CS;
-extern const bcstring be_const_str_WE517_RX;
-extern const bcstring be_const_str_setitem;
-extern const bcstring be_const_str_DDSU666_TX;
-extern const bcstring be_const_str_TUYA_RX;
-extern const bcstring be_const_str_scan;
-extern const bcstring be_const_str_;
-extern const bcstring be_const_str__request_from;
-extern const bcstring be_const_str_find_op;
-extern const bcstring be_const_str_has_arg;
-extern const bcstring be_const_str_dot_w;
-extern const bcstring be_const_str_PMS5003_TX;
-extern const bcstring be_const_str_read13;
-extern const bcstring be_const_str_EC_C25519;
-extern const bcstring be_const_str_SBR_RX;
-extern const bcstring be_const_str_ZEROCROSS;
-extern const bcstring be_const_str_calldepth;
-extern const bcstring be_const_str_codedump;
-extern const bcstring be_const_str_gc;
-extern const bcstring be_const_str_SERIAL_6N2;
-extern const bcstring be_const_str_reset;
-extern const bcstring be_const_str_deinit;
-extern const bcstring be_const_str_ARIRFSEL;
-extern const bcstring be_const_str_IEM3000_RX;
-extern const bcstring be_const_str_tob64;
-extern const bcstring be_const_str_PZEM016_RX;
-extern const bcstring be_const_str_SERIAL_8E1;
-extern const bcstring be_const_str_fromb64;
-extern const bcstring be_const_str_members;
-extern const bcstring be_const_str_reduce;
-extern const bcstring be_const_str_wifi;
-extern const bcstring be_const_str_KEY1_NP;
-extern const bcstring be_const_str_content_send_style;
-extern const bcstring be_const_str_GET;
-extern const bcstring be_const_str_GPS_RX;
-extern const bcstring be_const_str_dac_voltage;
-extern const bcstring be_const_str_sinh;
-extern const bcstring be_const_str_else;
-extern const bcstring be_const_str_set_timer;
-extern const bcstring be_const_str_update;
-extern const bcstring be_const_str_HRE_DATA;
-extern const bcstring be_const_str_I2C_Driver;
-extern const bcstring be_const_str_RDM6300_RX;
-extern const bcstring be_const_str_MCP39F5_TX;
-extern const bcstring be_const_str_enabled;
-extern const bcstring be_const_str_lower;
-extern const bcstring be_const_str_remove_timer;
-extern const bcstring be_const_str_wire;
-extern const bcstring be_const_str_digital_read;
-extern const bcstring be_const_str_get_switch;
-extern const bcstring be_const_str_SDM120_RX;
-extern const bcstring be_const_str_acos;
-extern const bcstring be_const_str_read_bytes;
-extern const bcstring be_const_str_BACKLIGHT;
-extern const bcstring be_const_str_KEY1_INV_PD;
-extern const bcstring be_const_str_NRG_SEL_INV;
-extern const bcstring be_const_str_on;
-extern const bcstring be_const_str_BS814_DAT;
-extern const bcstring be_const_str_CC1101_GDO0;
-extern const bcstring be_const_str_HRE_CLOCK;
-extern const bcstring be_const_str_delay;
-extern const bcstring be_const_str_log;
-extern const bcstring be_const_str_ROT1A;
-extern const bcstring be_const_str_XPT2046_CS;
-extern const bcstring be_const_str_exp;
-extern const bcstring be_const_str_SERIAL_5O2;
-extern const bcstring be_const_str__write;
-extern const bcstring be_const_str_add;
-extern const bcstring be_const_str_imax;
-extern const bcstring be_const_str_DDS2382_RX;
-extern const bcstring be_const_str_ADC_BUTTON;
-extern const bcstring be_const_str_NRG_SEL;
-extern const bcstring be_const_str_SENSOR_END;
-extern const bcstring be_const_str_set_timeouts;
-extern const bcstring be_const_str_SDS0X1_TX;
-extern const bcstring be_const_str_SOLAXX1_RX;
-extern const bcstring be_const_str_WEBCAM_SIOD;
-extern const bcstring be_const_str___upper__;
-extern const bcstring be_const_str_BOILER_OT_TX;
-extern const bcstring be_const_str__global_def;
-extern const bcstring be_const_str_ADE7953_IRQ;
-extern const bcstring be_const_str_if;
-extern const bcstring be_const_str_static;
-extern const bcstring be_const_str_WEBCAM_RESET;
-extern const bcstring be_const_str_publish;
-extern const bcstring be_const_str_RC522_RST;
-extern const bcstring be_const_str_pin_used;
-extern const bcstring be_const_str_MGC3130_XFER;
-extern const bcstring be_const_str_SM16716_SEL;
-extern const bcstring be_const_str_TELEINFO_RX;
-extern const bcstring be_const_str_asin;
-extern const bcstring be_const_str_get_option;
-extern const bcstring be_const_str_resolvecmnd;
-extern const bcstring be_const_str_write8;
-extern const bcstring be_const_str_CSE7766_TX;
-extern const bcstring be_const_str_GPS_TX;
-extern const bcstring be_const_str_search;
-extern const bcstring be_const_str_TFMINIPLUS_RX;
-extern const bcstring be_const_str_PROJECTOR_CTRL_TX;
-extern const bcstring be_const_str_collect;
-extern const bcstring be_const_str_NONE;
-extern const bcstring be_const_str_WEBCAM_PSRCS;
-extern const bcstring be_const_str_attrdump;
-extern const bcstring be_const_str_continue;
-extern const bcstring be_const_str_ADC_PH;
-extern const bcstring be_const_str_RISING;
-extern const bcstring be_const_str_SERIAL_6N1;
-extern const bcstring be_const_str_arg_size;
-extern const bcstring be_const_str_cos;
-extern const bcstring be_const_str_loop;
-extern const bcstring be_const_str_exists;
-extern const bcstring be_const_str_SPI_CS;
-extern const bcstring be_const_str_srand;
-extern const bcstring be_const_str_SERIAL_8E2;
-extern const bcstring be_const_str_A4988_STP;
-extern const bcstring be_const_str_CC1101_GDO2;
-extern const bcstring be_const_str_LE01MR_RX;
-extern const bcstring be_const_str_keys;
-extern const bcstring be_const_str_BUZZER_INV;
-extern const bcstring be_const_str_bus;
-extern const bcstring be_const_str_SM2135_CLK;
-extern const bcstring be_const_str_sqrt;
-extern const bcstring be_const_str_DHT11_OUT;
-extern const bcstring be_const_str_DSB_OUT;
-extern const bcstring be_const_str_INPUT_PULLUP;
-extern const bcstring be_const_str_MHZ_RXD;
-extern const bcstring be_const_str_SDM630_RX;
-extern const bcstring be_const_str_skip;
-extern const bcstring be_const_str_ctypes_bytes_dyn;
-extern const bcstring be_const_str_AudioGenerator;
-extern const bcstring be_const_str_NEOPOOL_TX;
-extern const bcstring be_const_str_IBEACON_RX;
-extern const bcstring be_const_str_RFRECV;
-extern const bcstring be_const_str_setmember;
-extern const bcstring be_const_str_NRG_CF1;
-extern const bcstring be_const_str_pin_mode;
-extern const bcstring be_const_str_list;
-extern const bcstring be_const_str_get;
-extern const bcstring be_const_str_LEDLNK_INV;
-extern const bcstring be_const_str_close;
-extern const bcstring be_const_str_read;
-extern const bcstring be_const_str_ROT1B;
-extern const bcstring be_const_str_SDM120_TX;
-extern const bcstring be_const_str_false;
-extern const bcstring be_const_str_PMS5003_RX;
-extern const bcstring be_const_str_SERIAL_5O1;
-extern const bcstring be_const_str_WEBCAM_HREF;
-extern const bcstring be_const_str__read;
-extern const bcstring be_const_str_allocated;
-extern const bcstring be_const_str_read8;
-extern const bcstring be_const_str_LEDLNK;
-extern const bcstring be_const_str_exec_tele;
-extern const bcstring be_const_str_SDM72_TX;
-extern const bcstring be_const_str_chars_in_string;
-extern const bcstring be_const_str_ZIGBEE_TX;
-extern const bcstring be_const_str_member;
-extern const bcstring be_const_str_settings;
-extern const bcstring be_const_str_time_dump;
-extern const bcstring be_const_str_time_str;
-extern const bcstring be_const_str_CSE7761_TX;
-extern const bcstring be_const_str___iterator__;
-extern const bcstring be_const_str_concat;
-extern const bcstring be_const_str_split;
-extern const bcstring be_const_str_upper;
-extern const bcstring be_const_str_TCP_TX;
-extern const bcstring be_const_str__buffer;
-extern const bcstring be_const_str_addr;
-extern const bcstring be_const_str_detect;
-extern const bcstring be_const_str_TM1638CLK;
-extern const bcstring be_const_str_import;
-extern const bcstring be_const_str_DSB;
-extern const bcstring be_const_str_DYP_RX;
-extern const bcstring be_const_str_SSPI_SCLK;
-extern const bcstring be_const_str_atan;
-extern const bcstring be_const_str_input;
-extern const bcstring be_const_str_EPAPER29_CS;
-extern const bcstring be_const_str_HX711_SCK;
-extern const bcstring be_const_str_nan;
-extern const bcstring be_const_str_opt_connect;
-extern const bcstring be_const_str_exec_rules;
-extern const bcstring be_const_str_tan;
-extern const bcstring be_const_str_copy;
-extern const bcstring be_const_str_P9813_DAT;
-extern const bcstring be_const_str_cmd_res;
-extern const bcstring be_const_str_AudioGeneratorWAV;
-extern const bcstring be_const_str_content_button;
-extern const bcstring be_const_str_name;
-extern const bcstring be_const_str_SM16716_CLK;
-extern const bcstring be_const_str_ADC_TEMP;
-extern const bcstring be_const_str_AS3935;
-extern const bcstring be_const_str_BS814_CLK;
-extern const bcstring be_const_str_TXD;
-extern const bcstring be_const_str_TX2X_TXD_BLACK;
-extern const bcstring be_const_str_MIEL_HVAC_TX;
-extern const bcstring be_const_str_TASMOTACLIENT_RST;
-extern const bcstring be_const_str_I2C_SDA;
-extern const bcstring be_const_str_SM16716_DAT;
-extern const bcstring be_const_str_get_string;
-extern const bcstring be_const_str_elif;
-extern const bcstring be_const_str_KEY1_INV;
-extern const bcstring be_const_str_write_bytes;
-extern const bcstring be_const_str_HJL_CF;
-extern const bcstring be_const_str_SSD1331_CS;
-extern const bcstring be_const_str_MAX31855CLK;
-extern const bcstring be_const_str_DHT11;
-extern const bcstring be_const_str_HM10_TX;
-extern const bcstring be_const_str_global;
-extern const bcstring be_const_str_hex;
-extern const bcstring be_const_str_yield;
-extern const bcstring be_const_str_url_encode;
-extern const bcstring be_const_str_OUTPUT_LO;
-extern const bcstring be_const_str_erase;
-extern const bcstring be_const_str_setbits;
-extern const bcstring be_const_str_EPAPER42_CS;
-extern const bcstring be_const_str_NEOPOOL_RX;
-extern const bcstring be_const_str_i2c_enabled;
-extern const bcstring be_const_str_SSPI_DC;
-extern const bcstring be_const_str_isinstance;
-extern const bcstring be_const_str_end;
-extern const bcstring be_const_str_INTERRUPT;
-extern const bcstring be_const_str___lower__;
-extern const bcstring be_const_str_insert;
-extern const bcstring be_const_str_TELEINFO_ENABLE;
-extern const bcstring be_const_str_MCP39F5_RX;
extern const bcstring be_const_str_SERIAL_5N1;
-extern const bcstring be_const_str_TASMOTACLIENT_RXD;
-extern const bcstring be_const_str_remove_driver;
-extern const bcstring be_const_str_HRXL_RX;
-extern const bcstring be_const_str_AZ_TXD;
-extern const bcstring be_const_str_asstring;
-extern const bcstring be_const_str_BUZZER;
-extern const bcstring be_const_str_WEBCAM_VSYNC;
-extern const bcstring be_const_str_DDSU666_RX;
-extern const bcstring be_const_str_TUYA_TX;
-extern const bcstring be_const_str_AS608_TX;
-extern const bcstring be_const_str_SERIAL_5E1;
-extern const bcstring be_const_str_SSD1351_DC;
-extern const bcstring be_const_str_HLW_CF;
-extern const bcstring be_const_str_REL1_INV;
-extern const bcstring be_const_str_RXD;
-extern const bcstring be_const_str_SERIAL_6E2;
-extern const bcstring be_const_str_ctypes_bytes;
-extern const bcstring be_const_str_try_rule;
-extern const bcstring be_const_str_PN532_TXD;
-extern const bcstring be_const_str_PWM1;
-extern const bcstring be_const_str_TM1637DIO;
-extern const bcstring be_const_str_eth;
-extern const bcstring be_const_str_ADC_BUTTON_INV;
-extern const bcstring be_const_str_arg;
-extern const bcstring be_const_str_rtc;
-extern const bcstring be_const_str_TCP_RX;
-extern const bcstring be_const_str_ceil;
-extern const bcstring be_const_str_isrunning;
-extern const bcstring be_const_str_def;
-extern const bcstring be_const_str_ETH_PHY_MDIO;
-extern const bcstring be_const_str_fromptr;
-extern const bcstring be_const_str_DHT22;
-extern const bcstring be_const_str_IRSEND;
-extern const bcstring be_const_str_VL53L0X_XSHUT1;
-extern const bcstring be_const_str_depower;
-extern const bcstring be_const_str_SERIAL_5E2;
-extern const bcstring be_const_str_WEBCAM_PWDN;
-extern const bcstring be_const_str_LMT01;
-extern const bcstring be_const_str_ROT1A_NP;
-extern const bcstring be_const_str_SERIAL_6E1;
-extern const bcstring be_const_str_SPI_CLK;
-extern const bcstring be_const_str_SSD1351_CS;
-extern const bcstring be_const_str_set;
-extern const bcstring be_const_str_MGC3130_RESET;
-extern const bcstring be_const_str_ETH_PHY_MDC;
-extern const bcstring be_const_str_HIGH;
-extern const bcstring be_const_str__drivers;
-extern const bcstring be_const_str_AudioOutput;
-extern const bcstring be_const_str_reverse_gamma10;
-extern const bcstring be_const_str_reverse;
-extern const bcstring be_const_str_EPD_DATA;
-extern const bcstring be_const_str_SAIR_TX;
-extern const bcstring be_const_str_deg;
-extern const bcstring be_const_str_INPUT_PULLDOWN;
-extern const bcstring be_const_str_state;
-extern const bcstring be_const_str_strftime;
-extern const bcstring be_const_str_opt_neq;
-extern const bcstring be_const_str_CNTR1_NP;
-extern const bcstring be_const_str__timers;
-extern const bcstring be_const_str_classname;
-extern const bcstring be_const_str_DEEPSLEEP;
-extern const bcstring be_const_str_pop;
-extern const bcstring be_const_str_seti;
-extern const bcstring be_const_str_AudioGeneratorMP3;
-extern const bcstring be_const_str_NRF24_CS;
-extern const bcstring be_const_str_last_modified;
-extern const bcstring be_const_str_DAC;
-extern const bcstring be_const_str_MD5;
-extern const bcstring be_const_str_begin;
-extern const bcstring be_const_str_gen_cb;
-extern const bcstring be_const_str_init;
-extern const bcstring be_const_str_ADC_LIGHT;
-extern const bcstring be_const_str_HM10_RX;
-extern const bcstring be_const_str_SOLAXX1_TX;
-extern const bcstring be_const_str_SSPI_MOSI;
-extern const bcstring be_const_str_run_deferred;
-extern const bcstring be_const_str_BOILER_OT_RX;
-extern const bcstring be_const_str_SR04_TRIG;
-extern const bcstring be_const_str_TM1637CLK;
-extern const bcstring be_const_str_map;
-extern const bcstring be_const_str_opt_add;
-extern const bcstring be_const_str_CNTR1;
-extern const bcstring be_const_str_SERIAL_5N2;
-extern const bcstring be_const_str_arg_name;
-extern const bcstring be_const_str_check_privileged_access;
-extern const bcstring be_const_str_as;
-extern const bcstring be_const_str_PWM1_INV;
-extern const bcstring be_const_str_classof;
-extern const bcstring be_const_str_WEBCAM_DATA;
-extern const bcstring be_const_str_content_stop;
-extern const bcstring be_const_str_str;
-extern const bcstring be_const_str_resp_cmnd_failed;
-extern const bcstring be_const_str_for;
-extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0;
-extern const bcstring be_const_str__ptr;
-extern const bcstring be_const_str_resp_cmnd_error;
-extern const bcstring be_const_str_OneWire;
-extern const bcstring be_const_str_HPMA_TX;
-extern const bcstring be_const_str_P9813_CLK;
-extern const bcstring be_const_str_open;
-extern const bcstring be_const_str_remove_cmd;
-extern const bcstring be_const_str_target_search;
-extern const bcstring be_const_str_SERIAL_7N2;
-extern const bcstring be_const_str_stop;
-extern const bcstring be_const_str_redirect;
-extern const bcstring be_const_str_resp_cmnd_done;
-extern const bcstring be_const_str_nil;
-extern const bcstring be_const_str_AudioFileSource;
-extern const bcstring be_const_str_toupper;
-extern const bcstring be_const_str_dot_p2;
-extern const bcstring be_const_str_DDS2382_TX;
-extern const bcstring be_const_str_AS608_RX;
-extern const bcstring be_const_str_cosh;
-extern const bcstring be_const_str_wire1;
-extern const bcstring be_const_str_OPTION_A;
-extern const bcstring be_const_str_SDM630_TX;
-extern const bcstring be_const_str_set_auth;
-extern const bcstring be_const_str_ADC_RANGE;
-extern const bcstring be_const_str_SDS0X1_RX;
-extern const bcstring be_const_str_ILI9341_DC;
-extern const bcstring be_const_str_RF_SENSOR;
-extern const bcstring be_const_str_SWT1_PD;
-extern const bcstring be_const_str_A4988_MS1;
-extern const bcstring be_const_str_DI;
-extern const bcstring be_const_str_CHANGE;
-extern const bcstring be_const_str_I2S_OUT_DATA;
-extern const bcstring be_const_str_AZ_RXD;
-extern const bcstring be_const_str_except;
-extern const bcstring be_const_str_SERIAL_7N1;
-extern const bcstring be_const_str_tomap;
-extern const bcstring be_const_str_digital_write;
-extern const bcstring be_const_str_public_key;
-extern const bcstring be_const_str_read24;
-extern const bcstring be_const_str_atan2;
-extern const bcstring be_const_str_publish_result;
-extern const bcstring be_const_str_A4988_DIR;
-extern const bcstring be_const_str_POST;
-extern const bcstring be_const_str_SI7021;
-extern const bcstring be_const_str_TFMINIPLUS_TX;
-extern const bcstring be_const_str_real;
-extern const bcstring be_const_str_select;
-extern const bcstring be_const_str_traceback;
-extern const bcstring be_const_str_gamma10;
-extern const bcstring be_const_str_int;
-extern const bcstring be_const_str_dot_p1;
-extern const bcstring be_const_str_SWT1_NP;
-extern const bcstring be_const_str_kv;
-extern const bcstring be_const_str_sin;
-extern const bcstring be_const_str_super;
-extern const bcstring be_const_str_wire2;
-extern const bcstring be_const_str_SBR_TX;
-extern const bcstring be_const_str_SDM72_RX;
-extern const bcstring be_const_str__ccmd;
-extern const bcstring be_const_str_encrypt;
-extern const bcstring be_const_str_number;
-extern const bcstring be_const_str_save;
-extern const bcstring be_const_str_tanh;
-extern const bcstring be_const_str_A4988_ENA;
-extern const bcstring be_const_str_add_header;
-extern const bcstring be_const_str_item;
-extern const bcstring be_const_str_tostring;
-extern const bcstring be_const_str_IEM3000_TX;
-extern const bcstring be_const_str_gamma8;
-extern const bcstring be_const_str_millis;
-extern const bcstring be_const_str_resp_cmnd_str;
-extern const bcstring be_const_str_top;
-extern const bcstring be_const_str_counters;
-extern const bcstring be_const_str_get_light;
-extern const bcstring be_const_str_I2S_IN_SLCT;
-extern const bcstring be_const_str_remove_rule;
-extern const bcstring be_const_str_imin;
-extern const bcstring be_const_str_issubclass;
-extern const bcstring be_const_str_set_power;
-extern const bcstring be_const_str__rules;
-extern const bcstring be_const_str_web_send;
-extern const bcstring be_const_str_OUTPUT;
-extern const bcstring be_const_str_TM1638STB;
-extern const bcstring be_const_str_content_start;
-extern const bcstring be_const_str_EXS_ENABLE;
-extern const bcstring be_const_str_geti;
-extern const bcstring be_const_str_log10;
-extern const bcstring be_const_str_RFSEND;
-extern const bcstring be_const_str_WEBCAM_PSCLK;
-extern const bcstring be_const_str_CSE7766_RX;
-extern const bcstring be_const_str_SERIAL_8O2;
-extern const bcstring be_const_str_format;
-extern const bcstring be_const_str_push;
-extern const bcstring be_const_str_IBEACON_TX;
-extern const bcstring be_const_str_SERIAL_8N1;
-extern const bcstring be_const_str_web_send_decimal;
-extern const bcstring be_const_str_ARIRFRCV;
-extern const bcstring be_const_str_IRRECV;
-extern const bcstring be_const_str_ROT1B_NP;
extern const bcstring be_const_str__global_addr;
-extern const bcstring be_const_str_exec_cmd;
-extern const bcstring be_const_str_opt_eq;
-extern const bcstring be_const_str_PZEM0XX_TX;
-extern const bcstring be_const_str_abs;
-extern const bcstring be_const_str_resize;
-extern const bcstring be_const_str_fromstring;
-extern const bcstring be_const_str_get_size;
-extern const bcstring be_const_str_pi;
-extern const bcstring be_const_str_MAX7219DIN;
-extern const bcstring be_const_str_TM1638DIO;
-extern const bcstring be_const_str_I2C_SCL;
-extern const bcstring be_const_str_OLED_RESET;
-extern const bcstring be_const_str_PZEM004_RX;
-extern const bcstring be_const_str_SR04_ECHO;
-extern const bcstring be_const_str_LED1_INV;
-extern const bcstring be_const_str_I2S_IN_CLK;
-extern const bcstring be_const_str_SSPI_MISO;
-extern const bcstring be_const_str_PULLUP;
-extern const bcstring be_const_str_SERIAL_8O1;
-extern const bcstring be_const_str_call;
-extern const bcstring be_const_str_INPUT;
-extern const bcstring be_const_str_SERIAL_8N2;
-extern const bcstring be_const_str_SPI_DC;
-extern const bcstring be_const_str_SSPI_MAX31865_CS1;
-extern const bcstring be_const_str_ETH_PHY_POWER;
-extern const bcstring be_const_str_SPI_MISO;
-extern const bcstring be_const_str_KEY1;
-extern const bcstring be_const_str_add_driver;
-extern const bcstring be_const_str_do;
-extern const bcstring be_const_str_LOW;
+extern const bcstring be_const_str_setmember;
+extern const bcstring be_const_str_OneWire;
extern const bcstring be_const_str__get_cb;
-extern const bcstring be_const_str_assert;
-extern const bcstring be_const_str_class;
-extern const bcstring be_const_str_LED1;
-extern const bcstring be_const_str_scale_uint;
+extern const bcstring be_const_str_classof;
+extern const bcstring be_const_str_SERIAL_8O2;
+extern const bcstring be_const_str___upper__;
+extern const bcstring be_const_str_gamma10;
+extern const bcstring be_const_str_copy;
+extern const bcstring be_const_str_tostring;
+extern const bcstring be_const_str_dot_p1;
+extern const bcstring be_const_str_item;
+extern const bcstring be_const_str_read8;
+extern const bcstring be_const_str_setbits;
+extern const bcstring be_const_str_upper;
+extern const bcstring be_const_str_rad;
+extern const bcstring be_const_str_web_send;
+extern const bcstring be_const_str_load;
+extern const bcstring be_const_str_opt_add;
+extern const bcstring be_const_str_hex;
extern const bcstring be_const_str_read12;
-extern const bcstring be_const_str_size;
-extern const bcstring be_const_str_find;
-extern const bcstring be_const_str__begin_transmission;
-extern const bcstring be_const_str_decrypt;
-extern const bcstring be_const_str_KEY1_TC;
-extern const bcstring be_const_str__cb;
-extern const bcstring be_const_str_serial;
+extern const bcstring be_const_str_end;
+extern const bcstring be_const_str_chars_in_string;
+extern const bcstring be_const_str_write8;
+extern const bcstring be_const_str_def;
+extern const bcstring be_const_str_select;
+extern const bcstring be_const_str_type;
+extern const bcstring be_const_str_global;
+extern const bcstring be_const_str_yield;
+extern const bcstring be_const_str_opt_eq;
+extern const bcstring be_const_str_SERIAL_8E1;
+extern const bcstring be_const_str_rtc;
+extern const bcstring be_const_str_else;
+extern const bcstring be_const_str_get_power;
+extern const bcstring be_const_str_addr;
+extern const bcstring be_const_str_allocated;
+extern const bcstring be_const_str_finish;
extern const bcstring be_const_str_dot_p;
-extern const bcstring be_const_str_I2S_OUT_SLCT;
-extern const bcstring be_const_str_flush;
+extern const bcstring be_const_str_getbits;
+extern const bcstring be_const_str_tag;
+extern const bcstring be_const_str_add;
+extern const bcstring be_const_str_pin;
+extern const bcstring be_const_str_set_timeouts;
+extern const bcstring be_const_str_import;
+extern const bcstring be_const_str_SERIAL_6N1;
+extern const bcstring be_const_str_SERIAL_8O1;
+extern const bcstring be_const_str__settings_ptr;
+extern const bcstring be_const_str_remove_cmd;
+extern const bcstring be_const_str___iterator__;
+extern const bcstring be_const_str_atan2;
+extern const bcstring be_const_str_ctypes_bytes;
+extern const bcstring be_const_str_millis;
+extern const bcstring be_const_str_available;
+extern const bcstring be_const_str_delay;
+extern const bcstring be_const_str_imin;
+extern const bcstring be_const_str_shared_key;
+extern const bcstring be_const_str_wire;
+extern const bcstring be_const_str__drivers;
+extern const bcstring be_const_str_last_modified;
+extern const bcstring be_const_str_serial;
+extern const bcstring be_const_str_opt_call;
+extern const bcstring be_const_str_webclient;
+extern const bcstring be_const_str_SERIAL_6E2;
+extern const bcstring be_const_str_ctypes_bytes_dyn;
+extern const bcstring be_const_str_time_dump;
+extern const bcstring be_const_str_static;
+extern const bcstring be_const_str_classname;
+extern const bcstring be_const_str_isrunning;
+extern const bcstring be_const_str_top;
+extern const bcstring be_const_str_remove;
+extern const bcstring be_const_str_begin;
+extern const bcstring be_const_str_content_stop;
+extern const bcstring be_const_str_deg;
+extern const bcstring be_const_str_gc;
+extern const bcstring be_const_str_gen_cb;
+extern const bcstring be_const_str_reset;
+extern const bcstring be_const_str_clear;
+extern const bcstring be_const_str_skip;
+extern const bcstring be_const_str_SERIAL_5E1;
+extern const bcstring be_const_str_has;
+extern const bcstring be_const_str_raise;
+extern const bcstring be_const_str_setitem;
+extern const bcstring be_const_str_write_bit;
+extern const bcstring be_const_str_stop;
extern const bcstring be_const_str_AES_GCM;
-extern const bcstring be_const_str_ELECTRIQ_MOODL_TX;
-extern const bcstring be_const_str_SPI_MOSI;
+extern const bcstring be_const_str_exec_cmd;
+extern const bcstring be_const_str_iter;
+extern const bcstring be_const_str_ceil;
+extern const bcstring be_const_str_exp;
+extern const bcstring be_const_str_tob64;
+extern const bcstring be_const_str_wire_scan;
+extern const bcstring be_const_str_call;
+extern const bcstring be_const_str_cmd_res;
+extern const bcstring be_const_str_opt_connect;
+extern const bcstring be_const_str_resolvecmnd;
+extern const bcstring be_const_str_SERIAL_6E1;
+extern const bcstring be_const_str_try;
+extern const bcstring be_const_str__cb;
+extern const bcstring be_const_str_AudioOutput;
+extern const bcstring be_const_str_check_privileged_access;
+extern const bcstring be_const_str_SERIAL_6O2;
+extern const bcstring be_const_str_content_send;
+extern const bcstring be_const_str_tolower;
+extern const bcstring be_const_str_detect;
+extern const bcstring be_const_str_imax;
+extern const bcstring be_const_str_set_auth;
+extern const bcstring be_const_str_depower;
+extern const bcstring be_const_str_read24;
+extern const bcstring be_const_str_add_header;
+extern const bcstring be_const_str_kv;
+extern const bcstring be_const_str_pin_used;
+extern const bcstring be_const_str_publish_result;
+extern const bcstring be_const_str_do;
+extern const bcstring be_const_str_pow;
+extern const bcstring be_const_str_read_bytes;
+extern const bcstring be_const_str_SERIAL_5E2;
+extern const bcstring be_const_str_scale_uint;
+extern const bcstring be_const_str_get;
+extern const bcstring be_const_str_remove_timer;
+extern const bcstring be_const_str_dot_len;
+extern const bcstring be_const_str_Wire;
+extern const bcstring be_const_str__begin_transmission;
+extern const bcstring be_const_str_toupper;
+extern const bcstring be_const_str_SERIAL_5N2;
+extern const bcstring be_const_str_arg_size;
+extern const bcstring be_const_str_AudioFileSource;
+extern const bcstring be_const_str_I2C_Driver;
+extern const bcstring be_const_str_decrypt;
+extern const bcstring be_const_str_digital_write;
+extern const bcstring be_const_str_input;
+extern const bcstring be_const_str_char;
+extern const bcstring be_const_str_floor;
+extern const bcstring be_const_str_real;
+extern const bcstring be_const_str_AudioGenerator;
+extern const bcstring be_const_str__cmd;
+extern const bcstring be_const_str_enabled;
+extern const bcstring be_const_str_int;
+extern const bcstring be_const_str_byte;
+extern const bcstring be_const_str_resp_cmnd_error;
+extern const bcstring be_const_str_dot_size;
+extern const bcstring be_const_str_list;
extern const bcstring be_const_str_reset_search;
+extern const bcstring be_const_str_SERIAL_7N2;
+extern const bcstring be_const_str_set;
+extern const bcstring be_const_str_elif;
+extern const bcstring be_const_str_Tasmota;
+extern const bcstring be_const_str_get_switch;
+extern const bcstring be_const_str_read;
+extern const bcstring be_const_str___lower__;
+extern const bcstring be_const_str__read;
+extern const bcstring be_const_str_asin;
+extern const bcstring be_const_str_POST;
+extern const bcstring be_const_str_arg;
+extern const bcstring be_const_str_reduce;
+extern const bcstring be_const_str_deinit;
+extern const bcstring be_const_str_save;
+extern const bcstring be_const_str_SERIAL_8E2;
+extern const bcstring be_const_str_get_size;
+extern const bcstring be_const_str_search;
+extern const bcstring be_const_str_srand;
+extern const bcstring be_const_str_isnan;
+extern const bcstring be_const_str_arg_name;
+extern const bcstring be_const_str_content_flush;
+extern const bcstring be_const_str_get_light;
+extern const bcstring be_const_str_sqrt;
+extern const bcstring be_const_str__end_transmission;
+extern const bcstring be_const_str_listdir;
+extern const bcstring be_const_str_log10;
+extern const bcstring be_const_str_pop;
+extern const bcstring be_const_str_read32;
+extern const bcstring be_const_str_for;
+extern const bcstring be_const_str_exec_tele;
+extern const bcstring be_const_str_log;
+extern const bcstring be_const_str_map;
+extern const bcstring be_const_str_redirect;
+extern const bcstring be_const_str_format;
+extern const bcstring be_const_str_pi;
+extern const bcstring be_const_str_range;
+extern const bcstring be_const_str_SERIAL_7E2;
+extern const bcstring be_const_str_count;
+extern const bcstring be_const_str_update;
+extern const bcstring be_const_str_SERIAL_7N1;
+extern const bcstring be_const_str_find_key_i;
+extern const bcstring be_const_str_content_button;
+extern const bcstring be_const_str_AudioGeneratorMP3;
+extern const bcstring be_const_str_AudioGeneratorWAV;
+extern const bcstring be_const_str__buffer;
+extern const bcstring be_const_str_remove_driver;
+extern const bcstring be_const_str_false;
+extern const bcstring be_const_str_fromptr;
+extern const bcstring be_const_str_geti;
+extern const bcstring be_const_str_lower;
+extern const bcstring be_const_str_nan;
+extern const bcstring be_const_str_assert;
+extern const bcstring be_const_str_time_str;
+extern const bcstring be_const_str_exists;
+extern const bcstring be_const_str_read13;
+extern const bcstring be_const_str_set_power;
+extern const bcstring be_const_str_seti;
+extern const bcstring be_const_str_toptr;
+extern const bcstring be_const_str_acos;
+extern const bcstring be_const_str_find_op;
+extern const bcstring be_const_str_isinstance;
+extern const bcstring be_const_str_cb_dispatch;
+extern const bcstring be_const_str_SERIAL_5O2;
+extern const bcstring be_const_str_bytes;
+extern const bcstring be_const_str_public_key;
+extern const bcstring be_const_str_continue;
+extern const bcstring be_const_str_;
+extern const bcstring be_const_str__available;
+extern const bcstring be_const_str__def;
+extern const bcstring be_const_str_i2c_enabled;
+extern const bcstring be_const_str_reverse;
+extern const bcstring be_const_str_true;
+extern const bcstring be_const_str_dac_voltage;
+extern const bcstring be_const_str_name;
+extern const bcstring be_const_str_reverse_gamma10;
+extern const bcstring be_const_str_add_rule;
+extern const bcstring be_const_str_dump;
+extern const bcstring be_const_str_AudioOutputI2S;
+extern const bcstring be_const_str_attrdump;
+extern const bcstring be_const_str_fromstring;
+extern const bcstring be_const_str_publish;
+extern const bcstring be_const_str_wifi;
+extern const bcstring be_const_str__write;
+extern const bcstring be_const_str_resp_cmnd;
+extern const bcstring be_const_str_tomap;
+extern const bcstring be_const_str_content_start;
+extern const bcstring be_const_str_traceback;
+extern const bcstring be_const_str_as;
+extern const bcstring be_const_str_memory;
+extern const bcstring be_const_str_pin_mode;
+extern const bcstring be_const_str_EC_C25519;
+extern const bcstring be_const_str_str;
+extern const bcstring be_const_str_tanh;
+extern const bcstring be_const_str_write_bytes;
+extern const bcstring be_const_str_except;
+extern const bcstring be_const_str_get_option;
+extern const bcstring be_const_str_dot_w;
+extern const bcstring be_const_str_SERIAL_7O1;
+extern const bcstring be_const_str_SERIAL_8N1;
+extern const bcstring be_const_str_init;
+extern const bcstring be_const_str__timers;
+extern const bcstring be_const_str_super;
+extern const bcstring be_const_str_GET;
+extern const bcstring be_const_str_fromb64;
+extern const bcstring be_const_str_break;
+extern const bcstring be_const_str__global_def;
+extern const bcstring be_const_str_bus;
+extern const bcstring be_const_str_find;
+extern const bcstring be_const_str_resp_cmnd_failed;
+extern const bcstring be_const_str_SERIAL_6N2;
+extern const bcstring be_const_str__request_from;
+extern const bcstring be_const_str_cos;
+extern const bcstring be_const_str_cosh;
+extern const bcstring be_const_str_set_useragent;
+extern const bcstring be_const_str_size;
+extern const bcstring be_const_str_web_send_decimal;
+extern const bcstring be_const_str_write;
+extern const bcstring be_const_str_module;
+extern const bcstring be_const_str_try_rule;
+extern const bcstring be_const_str_var;
+extern const bcstring be_const_str_content_send_style;
+extern const bcstring be_const_str_sinh;
+extern const bcstring be_const_str_return;
+extern const bcstring be_const_str_asstring;
+extern const bcstring be_const_str_digital_read;
+extern const bcstring be_const_str_has_arg;
+extern const bcstring be_const_str_number;
+extern const bcstring be_const_str_remove_rule;
+extern const bcstring be_const_str_get_string;
+extern const bcstring be_const_str_resize;
+extern const bcstring be_const_str_encrypt;
+extern const bcstring be_const_str_opt_neq;
+extern const bcstring be_const_str_add_driver;
+extern const bcstring be_const_str_close;
+extern const bcstring be_const_str_member;
+extern const bcstring be_const_str_response_append;
+extern const bcstring be_const_str_split;
+extern const bcstring be_const_str_strftime;
+extern const bcstring be_const_str_exec_rules;
+extern const bcstring be_const_str_AudioFileSourceFS;
+extern const bcstring be_const_str__ccmd;
+extern const bcstring be_const_str_set_timer;
+extern const bcstring be_const_str_time_reached;
+extern const bcstring be_const_str_SERIAL_7O2;
+extern const bcstring be_const_str_SERIAL_8N2;
+extern const bcstring be_const_str_if;
+extern const bcstring be_const_str__ptr;
+extern const bcstring be_const_str_insert;
extern const bcstring be_const_str_print;
-extern const bcstring be_const_str_I2S_OUT_CLK;
+extern const bcstring be_const_str_run_deferred;
+extern const bcstring be_const_str_scan;
+extern const bcstring be_const_str_settings;
+extern const bcstring be_const_str_arch;
+extern const bcstring be_const_str_open;
+extern const bcstring be_const_str_cmd;
+extern const bcstring be_const_str_loop;
+extern const bcstring be_const_str_wire1;
+extern const bcstring be_const_str_nil;
+extern const bcstring be_const_str_SERIAL_7E1;
+extern const bcstring be_const_str_keys;
+extern const bcstring be_const_str_sin;
+extern const bcstring be_const_str_calldepth;
+extern const bcstring be_const_str_while;
+extern const bcstring be_const_str_counters;
+extern const bcstring be_const_str_members;
+extern const bcstring be_const_str_on;
+extern const bcstring be_const_str__rules;
+extern const bcstring be_const_str_collect;
+extern const bcstring be_const_str_url_encode;
+extern const bcstring be_const_str_codedump;
+extern const bcstring be_const_str_dot_p2;
+extern const bcstring be_const_str_MD5;
+extern const bcstring be_const_str__settings_def;
+extern const bcstring be_const_str_erase;
+extern const bcstring be_const_str_gamma8;
+extern const bcstring be_const_str_rand;
+extern const bcstring be_const_str_resp_cmnd_str;
+extern const bcstring be_const_str_state;
+extern const bcstring be_const_str_SERIAL_6O1;
+extern const bcstring be_const_str_contains;
+extern const bcstring be_const_str_set_light;
+extern const bcstring be_const_str_setrange;
+extern const bcstring be_const_str_tan;
+extern const bcstring be_const_str_target_search;
+extern const bcstring be_const_str_abs;
+extern const bcstring be_const_str_resp_cmnd_done;
+extern const bcstring be_const_str_eth;
+extern const bcstring be_const_str_SERIAL_5O1;
+extern const bcstring be_const_str_concat;
+extern const bcstring be_const_str_flush;
+extern const bcstring be_const_str_get_free_heap;
+extern const bcstring be_const_str_push;
+extern const bcstring be_const_str_compile;
+extern const bcstring be_const_str_wire2;
+extern const bcstring be_const_str_add_cmd;
+extern const bcstring be_const_str_atan;
+extern const bcstring be_const_str_event;
+extern const bcstring be_const_str_issubclass;
+extern const bcstring be_const_str_write_file;
+extern const bcstring be_const_str_class;
diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h
index 2587194d0..792cbd7f6 100644
--- a/lib/libesp32/Berry/generate/be_const_strtab_def.h
+++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h
@@ -1,904 +1,512 @@
-be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_resp_cmnd);
-be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL);
-be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL);
-be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, NULL);
-be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_OUTPUT_HI);
-be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, NULL);
-be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, NULL);
-be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_while);
-be_define_const_str(while, "while", 231090382u, 53, 5, NULL);
-be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_clear);
-be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL);
-be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_response_append);
-be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_write_bit);
-be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL);
-be_define_const_str(try, "try", 2887626766u, 68, 3, NULL);
-be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_pow);
-be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_set_light);
-be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL);
-be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, NULL);
-be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_WIEGAND_D1);
-be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str__available);
-be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str__settings_def);
-be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, NULL);
-be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL);
-be_define_const_str(event, "event", 4264611999u, 0, 5, NULL);
-be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_ST7789_DC);
-be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_WE517_TX);
-be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_byte);
-be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_set_useragent);
-be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, NULL);
-be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_TASMOTACLIENT_TXD);
-be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL);
-be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_toptr);
-be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL);
-be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str__def);
-be_define_const_str(_def, "_def", 1985022181u, 0, 4, NULL);
-be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_dump);
-be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL);
-be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, NULL);
-be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL);
-be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_HPMA_RX);
-be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, NULL);
-be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, NULL);
-be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_WEBCAM_SIOC);
-be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_bytes);
-be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL);
-be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_setrange);
-be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL);
-be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_WIEGAND_D0);
-be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_char);
-be_define_const_str(char, "char", 2823553821u, 0, 4, NULL);
-be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, NULL);
-be_define_const_str(available, "available", 1727918744u, 0, 9, NULL);
-be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_MCP39F5_RST);
-be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_MP3_DFR562);
-be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_cmd);
-be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL);
-be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_load);
-be_define_const_str(load, "load", 3859241449u, 0, 4, NULL);
-be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, &be_const_str_Wire);
-be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, NULL);
-be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL);
-be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_ZIGBEE_RST);
-be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, NULL);
-be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_tolower);
-be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, &be_const_str_webclient);
-be_define_const_str(webclient, "webclient", 4076389146u, 0, 9, &be_const_str_true);
-be_define_const_str(true, "true", 1303515621u, 61, 4, NULL);
-be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL);
-be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, NULL);
-be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_OPEN_DRAIN);
-be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL);
-be_define_const_str(dot_len, ".len", 850842136u, 0, 4, &be_const_str_dot_size);
-be_define_const_str(dot_size, ".size", 1965188224u, 0, 5, NULL);
-be_define_const_str(return, "return", 2246981567u, 60, 6, NULL);
-be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_module);
-be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_shared_key);
-be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, NULL);
-be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, &be_const_str_add_cmd);
-be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_iter);
-be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_read32);
-be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL);
-be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_SM2135_DAT);
-be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_var);
-be_define_const_str(var, "var", 2317739966u, 64, 3, NULL);
-be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_raise);
-be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL);
-be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_SAIR_RX);
-be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, NULL);
-be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL);
-be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_count);
-be_define_const_str(count, "count", 967958004u, 0, 5, NULL);
-be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_SWT1);
-be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_WS2812);
-be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_rand);
-be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_break);
-be_define_const_str(break, "break", 3378807160u, 58, 5, NULL);
-be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_tag);
-be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_write);
-be_define_const_str(write, "write", 3190202204u, 0, 5, NULL);
-be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_compile);
-be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_type);
-be_define_const_str(type, "type", 1361572173u, 0, 4, NULL);
-be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_contains);
-be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_rad);
-be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL);
-be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_PZEM017_RX);
-be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_SSD1331_DC);
-be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, NULL);
-be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_get_power);
-be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_isnan);
-be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, NULL);
-be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_finish);
-be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL);
-be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_SERIAL_7O2);
-be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, NULL);
-be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL);
-be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_SERIAL_6O2);
-be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, &be_const_str_WEBCAM_XCLK);
-be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str__end_transmission);
-be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_has);
-be_define_const_str(has, "has", 3988721635u, 0, 3, &be_const_str_wire_scan);
-be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL);
-be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_SERIAL_7E1);
-be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_range);
-be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_time_reached);
-be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL);
-be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_MAX31855CS);
-be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_SSPI_CS);
-be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_content_flush);
-be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL);
-be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str__settings_ptr);
-be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, NULL);
-be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_WE517_RX);
-be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_setitem);
-be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL);
-be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_TUYA_RX);
-be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_scan);
-be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL);
-be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__request_from);
-be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_find_op);
-be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_has_arg);
-be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, NULL);
-be_define_const_str(dot_w, ".w", 1255414514u, 0, 2, NULL);
-be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, NULL);
-be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL);
-be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_SBR_RX);
-be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_ZEROCROSS);
-be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_calldepth);
-be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_codedump);
-be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_gc);
-be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL);
-be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_reset);
-be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL);
-be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL);
-be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_IEM3000_RX);
-be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_tob64);
-be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL);
-be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SERIAL_8E1);
-be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_fromb64);
-be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_members);
-be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_reduce);
-be_define_const_str(reduce, "reduce", 2002030311u, 0, 6, &be_const_str_wifi);
-be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL);
-be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_content_send_style);
-be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL);
-be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_GPS_RX);
-be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, NULL);
-be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, NULL);
-be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL);
-be_define_const_str(else, "else", 3183434736u, 52, 4, NULL);
-be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_update);
-be_define_const_str(update, "update", 672109684u, 0, 6, NULL);
-be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_I2C_Driver);
-be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_RDM6300_RX);
-be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, NULL);
-be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_enabled);
-be_define_const_str(enabled, "enabled", 49525662u, 0, 7, NULL);
-be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_remove_timer);
-be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, &be_const_str_wire);
-be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL);
-be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_get_switch);
-be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, NULL);
-be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_acos);
-be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_read_bytes);
-be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL);
-be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_KEY1_INV_PD);
-be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, NULL);
-be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_on);
-be_define_const_str(on, "on", 1630810064u, 0, 2, NULL);
-be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_CC1101_GDO0);
-be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_HRE_CLOCK);
-be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_delay);
-be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_log);
-be_define_const_str(log, "log", 1062293841u, 0, 3, NULL);
-be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, NULL);
-be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_exp);
-be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL);
-be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str__write);
-be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_add);
-be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_imax);
-be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL);
-be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, NULL);
-be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_NRG_SEL);
-be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SENSOR_END);
-be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_set_timeouts);
-be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, NULL);
-be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_SOLAXX1_RX);
-be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_WEBCAM_SIOD);
-be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str___upper__);
-be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL);
-be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str__global_def);
-be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, NULL);
-be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_if);
-be_define_const_str(if, "if", 959999494u, 50, 2, &be_const_str_static);
-be_define_const_str(static, "static", 3532702267u, 71, 6, NULL);
-be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_publish);
-be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL);
-be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_pin_used);
-be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL);
-be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_SM16716_SEL);
-be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, NULL);
-be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_asin);
-be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_get_option);
-be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_resolvecmnd);
-be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, &be_const_str_write8);
-be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL);
-be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_GPS_TX);
-be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_search);
-be_define_const_str(search, "search", 2150836393u, 0, 6, NULL);
-be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL);
-be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_collect);
-be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL);
-be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, NULL);
-be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_attrdump);
-be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_continue);
-be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL);
-be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_RISING);
-be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, NULL);
-be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_arg_size);
-be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_cos);
-be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_loop);
-be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL);
-be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL);
-be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_srand);
-be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL);
-be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, NULL);
-be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_CC1101_GDO2);
-be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_LE01MR_RX);
-be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, NULL);
-be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL);
-be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_bus);
-be_define_const_str(bus, "bus", 1607822841u, 0, 3, NULL);
-be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_sqrt);
-be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL);
-be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_DSB_OUT);
-be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_INPUT_PULLUP);
-be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_MHZ_RXD);
-be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_SDM630_RX);
-be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_skip);
-be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL);
-be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, NULL);
-be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_NEOPOOL_TX);
-be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, NULL);
-be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_RFRECV);
-be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_setmember);
+be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, NULL);
+be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_setmember);
be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL);
-be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str_pin_mode);
-be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL);
-be_define_const_str(list, "list", 217798785u, 0, 4, NULL);
-be_define_const_str(get, "get", 1410115415u, 0, 3, NULL);
-be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_close);
-be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_read);
-be_define_const_str(read, "read", 3470762949u, 0, 4, NULL);
-be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_SDM120_TX);
-be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL);
-be_define_const_str(false, "false", 184981848u, 62, 5, NULL);
-be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_SERIAL_5O1);
-be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_WEBCAM_HREF);
-be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str__read);
-be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_allocated);
-be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_read8);
-be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL);
-be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_exec_tele);
-be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, NULL);
-be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str_chars_in_string);
-be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL);
-be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_member);
-be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_settings);
-be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL);
-be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_time_str);
-be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL);
-be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str___iterator__);
-be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_concat);
-be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_split);
-be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_upper);
-be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL);
-be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL);
-be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_addr);
-be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_detect);
-be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL);
-be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_import);
-be_define_const_str(import, "import", 288002260u, 66, 6, NULL);
-be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_DYP_RX);
-be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_SSPI_SCLK);
-be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, NULL);
-be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_input);
-be_define_const_str(input, "input", 4191711099u, 0, 5, NULL);
-be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_HX711_SCK);
-be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_nan);
-be_define_const_str(nan, "nan", 797905850u, 0, 3, NULL);
-be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_exec_rules);
-be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL);
-be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL);
-be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL);
-be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, NULL);
-be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL);
-be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_content_button);
-be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_name);
-be_define_const_str(name, "name", 2369371622u, 0, 4, NULL);
-be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, NULL);
-be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_AS3935);
-be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_BS814_CLK);
-be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_TXD);
-be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL);
-be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL);
-be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_TASMOTACLIENT_RST);
-be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, NULL);
-be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, NULL);
-be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_get_string);
-be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_elif);
-be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL);
-be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_write_bytes);
-be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL);
-be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_SSD1331_CS);
-be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, NULL);
-be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, NULL);
-be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_HM10_TX);
-be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_global);
-be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_hex);
-be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_yield);
-be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL);
-be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL);
-be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_erase);
-be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_setbits);
-be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL);
-be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, &be_const_str_NEOPOOL_RX);
-be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_i2c_enabled);
-be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL);
-be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_isinstance);
-be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_end);
-be_define_const_str(end, "end", 1787721130u, 56, 3, NULL);
-be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str___lower__);
-be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_insert);
-be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL);
-be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, NULL);
-be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_SERIAL_5N1);
-be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_TASMOTACLIENT_RXD);
-be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_remove_driver);
-be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, NULL);
-be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, NULL);
-be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_asstring);
-be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, NULL);
-be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_WEBCAM_VSYNC);
-be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, NULL);
-be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_TUYA_TX);
-be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, NULL);
-be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_SERIAL_5E1);
-be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_SSD1351_DC);
-be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, NULL);
-be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_REL1_INV);
-be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_RXD);
-be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SERIAL_6E2);
-be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_ctypes_bytes);
-be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_try_rule);
-be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL);
-be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, NULL);
-be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_TM1637DIO);
-be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_eth);
-be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL);
-be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, NULL);
-be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL);
-be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL);
-be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_ceil);
-be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_isrunning);
-be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL);
-be_define_const_str(def, "def", 3310976652u, 55, 3, NULL);
-be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_fromptr);
-be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, NULL);
-be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_IRSEND);
-be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_VL53L0X_XSHUT1);
-be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_depower);
-be_define_const_str(depower, "depower", 3563819571u, 0, 7, NULL);
-be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_WEBCAM_PWDN);
-be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, NULL);
-be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_ROT1A_NP);
-be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_SERIAL_6E1);
-be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_SPI_CLK);
-be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, &be_const_str_SSD1351_CS);
-be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_set);
-be_define_const_str(set, "set", 3324446467u, 0, 3, NULL);
-be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, NULL);
-be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_HIGH);
-be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str__drivers);
-be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL);
-be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, NULL);
-be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL);
-be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL);
-be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_SAIR_TX);
-be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_deg);
-be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL);
-be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_state);
-be_define_const_str(state, "state", 2016490230u, 0, 5, &be_const_str_strftime);
-be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL);
-be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_CNTR1_NP);
-be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str__timers);
-be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_classname);
-be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL);
-be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, NULL);
-be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_seti);
-be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL);
-be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_NRF24_CS);
-be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, NULL);
-be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, NULL);
-be_define_const_str(DAC, "DAC", 788912847u, 0, 3, &be_const_str_MD5);
-be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_begin);
-be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_gen_cb);
-be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_init);
-be_define_const_str(init, "init", 380752755u, 0, 4, NULL);
-be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_HM10_RX);
-be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, NULL);
-be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_SSPI_MOSI);
-be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_run_deferred);
-be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL);
-be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_SR04_TRIG);
-be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_TM1637CLK);
-be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_map);
-be_define_const_str(map, "map", 3751997361u, 0, 3, NULL);
-be_define_const_str(opt_add, "+", 772578730u, 0, 1, NULL);
-be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, NULL);
-be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_arg_name);
-be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_check_privileged_access);
-be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_as);
-be_define_const_str(as, "as", 1579491469u, 67, 2, NULL);
-be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_classof);
+be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, &be_const_str__get_cb);
+be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_classof);
be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL);
-be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_content_stop);
-be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_str);
-be_define_const_str(str, "str", 3259748752u, 0, 3, NULL);
-be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_for);
-be_define_const_str(for, "for", 2901640080u, 54, 3, NULL);
-be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str__ptr);
-be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_resp_cmnd_error);
-be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL);
-be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, NULL);
-be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_P9813_CLK);
-be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_open);
-be_define_const_str(open, "open", 3546203337u, 0, 4, NULL);
-be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_target_search);
-be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL);
-be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str_stop);
-be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL);
-be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_resp_cmnd_done);
-be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_nil);
-be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL);
-be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, NULL);
-be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL);
-be_define_const_str(dot_p2, ".p2", 232398067u, 0, 3, &be_const_str_DDS2382_TX);
-be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, NULL);
-be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_cosh);
-be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_wire1);
-be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL);
-be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SDM630_TX);
-be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_set_auth);
-be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, NULL);
-be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_SDS0X1_RX);
-be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, NULL);
-be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_RF_SENSOR);
-be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, NULL);
-be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, NULL);
-be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_DI);
-be_define_const_str(DI, "DI", 1070498734u, 0, 2, NULL);
-be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_I2S_OUT_DATA);
-be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, NULL);
-be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_except);
-be_define_const_str(except, "except", 950914032u, 69, 6, NULL);
-be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_tomap);
-be_define_const_str(tomap, "tomap", 612167626u, 0, 5, NULL);
-be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_public_key);
-be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_read24);
-be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL);
-be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_publish_result);
-be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL);
-be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_POST);
-be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_SI7021);
-be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_TFMINIPLUS_TX);
-be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_real);
-be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_select);
-be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_traceback);
-be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL);
-be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_int);
-be_define_const_str(int, "int", 2515107422u, 0, 3, NULL);
-be_define_const_str(dot_p1, ".p1", 249175686u, 0, 3, &be_const_str_SWT1_NP);
-be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_kv);
-be_define_const_str(kv, "kv", 1497177492u, 0, 2, NULL);
-be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_super);
-be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_wire2);
-be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL);
-be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, NULL);
-be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str__ccmd);
-be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_encrypt);
-be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_number);
-be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_save);
-be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_tanh);
-be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL);
-be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_add_header);
-be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_item);
-be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_tostring);
+be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str___upper__);
+be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_gamma10);
+be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL);
+be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL);
be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL);
-be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, NULL);
-be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_millis);
-be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_resp_cmnd_str);
-be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL);
-be_define_const_str(top, "top", 2802900028u, 0, 3, NULL);
-be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_get_light);
-be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL);
-be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, NULL);
-be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL);
-be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_issubclass);
-be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_set_power);
-be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL);
-be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_web_send);
+be_define_const_str(dot_p1, ".p1", 249175686u, 0, 3, &be_const_str_item);
+be_define_const_str(item, "item", 2671260646u, 0, 4, NULL);
+be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_setbits);
+be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_upper);
+be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL);
+be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_web_send);
be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL);
-be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_TM1638STB);
-be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, &be_const_str_content_start);
-be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL);
-be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_geti);
-be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_log10);
-be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL);
-be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_WEBCAM_PSCLK);
-be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, NULL);
-be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_SERIAL_8O2);
-be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_format);
-be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_push);
-be_define_const_str(push, "push", 2272264157u, 0, 4, NULL);
-be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_SERIAL_8N1);
-be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_web_send_decimal);
-be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL);
-be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_IRRECV);
-be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_ROT1B_NP);
-be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str__global_addr);
-be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_exec_cmd);
-be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL);
-be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_PZEM0XX_TX);
-be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, NULL);
-be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_resize);
-be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL);
-be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_get_size);
-be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_pi);
-be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL);
-be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_TM1638DIO);
-be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, NULL);
-be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_OLED_RESET);
-be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_PZEM004_RX);
-be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_SR04_ECHO);
-be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, NULL);
-be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, NULL);
-be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_SSPI_MISO);
-be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, NULL);
-be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_SERIAL_8O1);
-be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_call);
-be_define_const_str(call, "call", 3018949801u, 0, 4, NULL);
-be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_SERIAL_8N2);
-be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_SPI_DC);
-be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_SSPI_MAX31865_CS1);
-be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, NULL);
-be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_SPI_MISO);
-be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, NULL);
-be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, NULL);
-be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_do);
-be_define_const_str(do, "do", 1646057492u, 65, 2, NULL);
-be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str__get_cb);
-be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_assert);
-be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_class);
-be_define_const_str(class, "class", 2872970239u, 57, 5, NULL);
-be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_scale_uint);
-be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL);
-be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_size);
-be_define_const_str(size, "size", 597743964u, 0, 4, NULL);
-be_define_const_str(find, "find", 3186656602u, 0, 4, NULL);
-be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_decrypt);
-be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, NULL);
-be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str__cb);
-be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, &be_const_str_serial);
+be_define_const_str(load, "load", 3859241449u, 0, 4, NULL);
+be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_hex);
+be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_read12);
+be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_end);
+be_define_const_str(end, "end", 1787721130u, 56, 3, NULL);
+be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_write8);
+be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_def);
+be_define_const_str(def, "def", 3310976652u, 55, 3, NULL);
+be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_type);
+be_define_const_str(type, "type", 1361572173u, 0, 4, NULL);
+be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_yield);
+be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL);
+be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, NULL);
+be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_rtc);
+be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_else);
+be_define_const_str(else, "else", 3183434736u, 52, 4, NULL);
+be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL);
+be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_allocated);
+be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_finish);
+be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL);
+be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_getbits);
+be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_tag);
+be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL);
+be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_pin);
+be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_set_timeouts);
+be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, &be_const_str_import);
+be_define_const_str(import, "import", 288002260u, 66, 6, NULL);
+be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, NULL);
+be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str__settings_ptr);
+be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_remove_cmd);
+be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL);
+be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_atan2);
+be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_ctypes_bytes);
+be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_millis);
+be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL);
+be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_delay);
+be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_imin);
+be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_shared_key);
+be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str_wire);
+be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL);
+be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_last_modified);
+be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_serial);
be_define_const_str(serial, "serial", 3687697785u, 0, 6, NULL);
-be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_I2S_OUT_SLCT);
-be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_flush);
-be_define_const_str(flush, "flush", 3002334877u, 0, 5, NULL);
-be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, &be_const_str_ELECTRIQ_MOODL_TX);
-be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, &be_const_str_SPI_MOSI);
-be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_reset_search);
+be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_webclient);
+be_define_const_str(webclient, "webclient", 4076389146u, 0, 9, NULL);
+be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_ctypes_bytes_dyn);
+be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, &be_const_str_time_dump);
+be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, &be_const_str_static);
+be_define_const_str(static, "static", 3532702267u, 71, 6, NULL);
+be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_isrunning);
+be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_top);
+be_define_const_str(top, "top", 2802900028u, 0, 3, NULL);
+be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL);
+be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL);
+be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_deg);
+be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_gc);
+be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_gen_cb);
+be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, NULL);
+be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL);
+be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_skip);
+be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL);
+be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_has);
+be_define_const_str(has, "has", 3988721635u, 0, 3, &be_const_str_raise);
+be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL);
+be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_write_bit);
+be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL);
+be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL);
+be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, NULL);
+be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_iter);
+be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL);
+be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_exp);
+be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_tob64);
+be_define_const_str(tob64, "tob64", 373777640u, 0, 5, &be_const_str_wire_scan);
+be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL);
+be_define_const_str(call, "call", 3018949801u, 0, 4, NULL);
+be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL);
+be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_resolvecmnd);
+be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL);
+be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_try);
+be_define_const_str(try, "try", 2887626766u, 68, 3, NULL);
+be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL);
+be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_check_privileged_access);
+be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, NULL);
+be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, &be_const_str_content_send);
+be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_tolower);
+be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL);
+be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_imax);
+be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_set_auth);
+be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, NULL);
+be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_read24);
+be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL);
+be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_kv);
+be_define_const_str(kv, "kv", 1497177492u, 0, 2, &be_const_str_pin_used);
+be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_publish_result);
+be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_do);
+be_define_const_str(do, "do", 1646057492u, 65, 2, NULL);
+be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_read_bytes);
+be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL);
+be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_scale_uint);
+be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL);
+be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_remove_timer);
+be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL);
+be_define_const_str(dot_len, ".len", 850842136u, 0, 4, &be_const_str_Wire);
+be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str__begin_transmission);
+be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_toupper);
+be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL);
+be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_arg_size);
+be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL);
+be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_I2C_Driver);
+be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_decrypt);
+be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, NULL);
+be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_input);
+be_define_const_str(input, "input", 4191711099u, 0, 5, NULL);
+be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_floor);
+be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_real);
+be_define_const_str(real, "real", 3604983901u, 0, 4, NULL);
+be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str__cmd);
+be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_enabled);
+be_define_const_str(enabled, "enabled", 49525662u, 0, 7, &be_const_str_int);
+be_define_const_str(int, "int", 2515107422u, 0, 3, NULL);
+be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_resp_cmnd_error);
+be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL);
+be_define_const_str(dot_size, ".size", 1965188224u, 0, 5, NULL);
+be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_reset_search);
be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, NULL);
-be_define_const_str(print, "print", 372738696u, 0, 5, NULL);
-be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, NULL);
+be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str_set);
+be_define_const_str(set, "set", 3324446467u, 0, 3, &be_const_str_elif);
+be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL);
+be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_get_switch);
+be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, NULL);
+be_define_const_str(read, "read", 3470762949u, 0, 4, NULL);
+be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str__read);
+be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_asin);
+be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL);
+be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_arg);
+be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_reduce);
+be_define_const_str(reduce, "reduce", 2002030311u, 0, 6, NULL);
+be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_save);
+be_define_const_str(save, "save", 3439296072u, 0, 4, NULL);
+be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, &be_const_str_get_size);
+be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_search);
+be_define_const_str(search, "search", 2150836393u, 0, 6, &be_const_str_srand);
+be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL);
+be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, NULL);
+be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_content_flush);
+be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, NULL);
+be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL);
+be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL);
+be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_listdir);
+be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_log10);
+be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_pop);
+be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_read32);
+be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_for);
+be_define_const_str(for, "for", 2901640080u, 54, 3, NULL);
+be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, &be_const_str_log);
+be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_map);
+be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_redirect);
+be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL);
+be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pi);
+be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_range);
+be_define_const_str(range, "range", 4208725202u, 0, 5, NULL);
+be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_count);
+be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_update);
+be_define_const_str(update, "update", 672109684u, 0, 6, NULL);
+be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_find_key_i);
+be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL);
+be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL);
+be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_AudioGeneratorWAV);
+be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str__buffer);
+be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_remove_driver);
+be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, &be_const_str_false);
+be_define_const_str(false, "false", 184981848u, 62, 5, NULL);
+be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, NULL);
+be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_lower);
+be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_nan);
+be_define_const_str(nan, "nan", 797905850u, 0, 3, NULL);
+be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL);
+be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL);
+be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_read13);
+be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_set_power);
+be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL);
+be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_toptr);
+be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL);
+be_define_const_str(acos, "acos", 1006755615u, 0, 4, NULL);
+be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL);
+be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL);
+be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL);
+be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_bytes);
+be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_public_key);
+be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_continue);
+be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL);
+be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__available);
+be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str__def);
+be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_i2c_enabled);
+be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_reverse);
+be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_true);
+be_define_const_str(true, "true", 1303515621u, 61, 4, NULL);
+be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_name);
+be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_reverse_gamma10);
+be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL);
+be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_dump);
+be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL);
+be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_attrdump);
+be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_fromstring);
+be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_publish);
+be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_wifi);
+be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL);
+be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL);
+be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_tomap);
+be_define_const_str(tomap, "tomap", 612167626u, 0, 5, NULL);
+be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_traceback);
+be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_as);
+be_define_const_str(as, "as", 1579491469u, 67, 2, NULL);
+be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_pin_mode);
+be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL);
+be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, NULL);
+be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_tanh);
+be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_write_bytes);
+be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, &be_const_str_except);
+be_define_const_str(except, "except", 950914032u, 69, 6, NULL);
+be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL);
+be_define_const_str(dot_w, ".w", 1255414514u, 0, 2, NULL);
+be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_SERIAL_8N1);
+be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_init);
+be_define_const_str(init, "init", 380752755u, 0, 4, NULL);
+be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_super);
+be_define_const_str(super, "super", 4152230356u, 0, 5, NULL);
+be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_fromb64);
+be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, NULL);
+be_define_const_str(break, "break", 3378807160u, 58, 5, NULL);
+be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_bus);
+be_define_const_str(bus, "bus", 1607822841u, 0, 3, NULL);
+be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_resp_cmnd_failed);
+be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL);
+be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str__request_from);
+be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_cos);
+be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_cosh);
+be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_set_useragent);
+be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, &be_const_str_size);
+be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_web_send_decimal);
+be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, &be_const_str_write);
+be_define_const_str(write, "write", 3190202204u, 0, 5, NULL);
+be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_try_rule);
+be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL);
+be_define_const_str(var, "var", 2317739966u, 64, 3, NULL);
+be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_sinh);
+be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_return);
+be_define_const_str(return, "return", 2246981567u, 60, 6, NULL);
+be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_digital_read);
+be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_has_arg);
+be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_number);
+be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_remove_rule);
+be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL);
+be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_resize);
+be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL);
+be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, NULL);
+be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_add_driver);
+be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_close);
+be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_member);
+be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_response_append);
+be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_split);
+be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_strftime);
+be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL);
+be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL);
+be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str__ccmd);
+be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_set_timer);
+be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_time_reached);
+be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL);
+be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str_SERIAL_8N2);
+be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_if);
+be_define_const_str(if, "if", 959999494u, 50, 2, NULL);
+be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_insert);
+be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_print);
+be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_run_deferred);
+be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_scan);
+be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_settings);
+be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL);
+be_define_const_str(arch, "arch", 2952804297u, 0, 4, &be_const_str_open);
+be_define_const_str(open, "open", 3546203337u, 0, 4, NULL);
+be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_loop);
+be_define_const_str(loop, "loop", 3723446379u, 0, 4, &be_const_str_wire1);
+be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL);
+be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL);
+be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_keys);
+be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_sin);
+be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL);
+be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_while);
+be_define_const_str(while, "while", 231090382u, 53, 5, NULL);
+be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_members);
+be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_on);
+be_define_const_str(on, "on", 1630810064u, 0, 2, NULL);
+be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_collect);
+be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_url_encode);
+be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL);
+be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL);
+be_define_const_str(dot_p2, ".p2", 232398067u, 0, 3, &be_const_str_MD5);
+be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str__settings_def);
+be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, NULL);
+be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL);
+be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_rand);
+be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_resp_cmnd_str);
+be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_state);
+be_define_const_str(state, "state", 2016490230u, 0, 5, NULL);
+be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_contains);
+be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_set_light);
+be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_setrange);
+be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, &be_const_str_tan);
+be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL);
+be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL);
+be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_resp_cmnd_done);
+be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL);
+be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL);
+be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_concat);
+be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_flush);
+be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_get_free_heap);
+be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_push);
+be_define_const_str(push, "push", 2272264157u, 0, 4, NULL);
+be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_wire2);
+be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL);
+be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_atan);
+be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_event);
+be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_issubclass);
+be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_write_file);
+be_define_const_str(write_file, "write_file", 3177658879u, 0, 10, &be_const_str_class);
+be_define_const_str(class, "class", 2872970239u, 57, 5, NULL);
static const bstring* const m_string_table[] = {
- (const bstring *)&be_const_str_memory,
- (const bstring *)&be_const_str_LE01MR_TX,
- (const bstring *)&be_const_str_RA8876_CS,
- (const bstring *)&be_const_str_HX711_DAT,
- (const bstring *)&be_const_str_FALLING,
- NULL,
- NULL,
- (const bstring *)&be_const_str_content_send,
- (const bstring *)&be_const_str_AudioFileSourceFS,
- (const bstring *)&be_const_str_pin,
- (const bstring *)&be_const_str_try,
- (const bstring *)&be_const_str_get_free_heap,
- (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN,
- (const bstring *)&be_const_str_ILI9488_CS,
- (const bstring *)&be_const_str_find_key_i,
- (const bstring *)&be_const_str_event,
- (const bstring *)&be_const_str_SERIAL_6O1,
- (const bstring *)&be_const_str_SERIAL_7E2,
- (const bstring *)&be_const_str_WEBCAM_PCLK,
- (const bstring *)&be_const_str_Tasmota,
- (const bstring *)&be_const_str_KEY1_INV_NP,
- (const bstring *)&be_const_str_MAX31855DO,
- (const bstring *)&be_const_str_ZIGBEE_RX,
- (const bstring *)&be_const_str_opt_call,
- (const bstring *)&be_const_str_I2S_IN_DATA,
- (const bstring *)&be_const_str_AudioOutputI2S,
- (const bstring *)&be_const_str_getbits,
- (const bstring *)&be_const_str_RC522_CS,
- (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV,
- (const bstring *)&be_const_str_available,
- (const bstring *)&be_const_str_FTC532,
- (const bstring *)&be_const_str_ST7789_CS,
- (const bstring *)&be_const_str_ADC_INPUT,
- (const bstring *)&be_const_str_floor,
- NULL,
- (const bstring *)&be_const_str_MAX7219CLK,
- (const bstring *)&be_const_str__cmd,
- (const bstring *)&be_const_str_SDCARD_CS,
- (const bstring *)&be_const_str_ADC_CT_POWER,
- (const bstring *)&be_const_str_BL0940_RX,
- (const bstring *)&be_const_str_dot_len,
- (const bstring *)&be_const_str_return,
- (const bstring *)&be_const_str_SERIAL_7O1,
- (const bstring *)&be_const_str_DCKI,
- (const bstring *)&be_const_str_PN532_RXD,
- (const bstring *)&be_const_str_WINDMETER_SPEED,
- (const bstring *)&be_const_str_CSE7761_RX,
- (const bstring *)&be_const_str_cb_dispatch,
- (const bstring *)&be_const_str_MIEL_HVAC_RX,
- (const bstring *)&be_const_str_REL1,
- (const bstring *)&be_const_str_MAX7219CS,
- (const bstring *)&be_const_str_WEBCAM_HSD,
- (const bstring *)&be_const_str_TASMOTACLIENT_RST_INV,
- (const bstring *)&be_const_str_HALLEFFECT,
- (const bstring *)&be_const_str_PULLDOWN,
- (const bstring *)&be_const_str_add_rule,
- (const bstring *)&be_const_str_NRF24_DC,
- (const bstring *)&be_const_str_remove,
- (const bstring *)&be_const_str_ADC_JOY,
- (const bstring *)&be_const_str_MHZ_TXD,
- (const bstring *)&be_const_str_KEY1_PD,
- (const bstring *)&be_const_str_PROJECTOR_CTRL_RX,
- (const bstring *)&be_const_str_ILI9341_CS,
- (const bstring *)&be_const_str_DDSU666_TX,
- (const bstring *)&be_const_str_,
- (const bstring *)&be_const_str_dot_w,
- (const bstring *)&be_const_str_PMS5003_TX,
- (const bstring *)&be_const_str_read13,
- (const bstring *)&be_const_str_EC_C25519,
- (const bstring *)&be_const_str_SERIAL_6N2,
- (const bstring *)&be_const_str_deinit,
- (const bstring *)&be_const_str_ARIRFSEL,
- (const bstring *)&be_const_str_PZEM016_RX,
- (const bstring *)&be_const_str_KEY1_NP,
- (const bstring *)&be_const_str_GET,
- (const bstring *)&be_const_str_dac_voltage,
- NULL,
- (const bstring *)&be_const_str_sinh,
- (const bstring *)&be_const_str_else,
- (const bstring *)&be_const_str_set_timer,
- (const bstring *)&be_const_str_HRE_DATA,
- (const bstring *)&be_const_str_MCP39F5_TX,
- (const bstring *)&be_const_str_lower,
- (const bstring *)&be_const_str_digital_read,
- (const bstring *)&be_const_str_SDM120_RX,
- (const bstring *)&be_const_str_BACKLIGHT,
- (const bstring *)&be_const_str_NRG_SEL_INV,
- (const bstring *)&be_const_str_BS814_DAT,
- (const bstring *)&be_const_str_ROT1A,
- (const bstring *)&be_const_str_XPT2046_CS,
- NULL,
- (const bstring *)&be_const_str_SERIAL_5O2,
- (const bstring *)&be_const_str_DDS2382_RX,
- NULL,
- (const bstring *)&be_const_str_ADC_BUTTON,
- (const bstring *)&be_const_str_SDS0X1_TX,
- (const bstring *)&be_const_str_BOILER_OT_TX,
- (const bstring *)&be_const_str_ADE7953_IRQ,
- (const bstring *)&be_const_str_WEBCAM_RESET,
- (const bstring *)&be_const_str_RC522_RST,
- (const bstring *)&be_const_str_MGC3130_XFER,
- NULL,
- (const bstring *)&be_const_str_TELEINFO_RX,
- (const bstring *)&be_const_str_CSE7766_TX,
- (const bstring *)&be_const_str_TFMINIPLUS_RX,
- (const bstring *)&be_const_str_PROJECTOR_CTRL_TX,
- (const bstring *)&be_const_str_NONE,
- (const bstring *)&be_const_str_WEBCAM_PSRCS,
- (const bstring *)&be_const_str_ADC_PH,
- NULL,
- NULL,
- (const bstring *)&be_const_str_SERIAL_6N1,
- (const bstring *)&be_const_str_exists,
- (const bstring *)&be_const_str_SPI_CS,
- (const bstring *)&be_const_str_SERIAL_8E2,
- (const bstring *)&be_const_str_A4988_STP,
- (const bstring *)&be_const_str_keys,
- (const bstring *)&be_const_str_BUZZER_INV,
- NULL,
- (const bstring *)&be_const_str_SM2135_CLK,
- (const bstring *)&be_const_str_DHT11_OUT,
- NULL,
- (const bstring *)&be_const_str_ctypes_bytes_dyn,
- (const bstring *)&be_const_str_AudioGenerator,
- (const bstring *)&be_const_str_IBEACON_RX,
- (const bstring *)&be_const_str_NRG_CF1,
- (const bstring *)&be_const_str_list,
- NULL,
- (const bstring *)&be_const_str_get,
- (const bstring *)&be_const_str_LEDLNK_INV,
- (const bstring *)&be_const_str_ROT1B,
- NULL,
- (const bstring *)&be_const_str_false,
- (const bstring *)&be_const_str_PMS5003_RX,
- (const bstring *)&be_const_str_LEDLNK,
- (const bstring *)&be_const_str_SDM72_TX,
- (const bstring *)&be_const_str_ZIGBEE_TX,
- (const bstring *)&be_const_str_time_dump,
- (const bstring *)&be_const_str_CSE7761_TX,
- (const bstring *)&be_const_str_TCP_TX,
- (const bstring *)&be_const_str__buffer,
- NULL,
- (const bstring *)&be_const_str_TM1638CLK,
- (const bstring *)&be_const_str_DSB,
- (const bstring *)&be_const_str_atan,
- NULL,
- (const bstring *)&be_const_str_EPAPER29_CS,
- (const bstring *)&be_const_str_opt_connect,
- (const bstring *)&be_const_str_tan,
+ (const bstring *)&be_const_str_SERIAL_5N1,
+ (const bstring *)&be_const_str__global_addr,
+ (const bstring *)&be_const_str_OneWire,
+ (const bstring *)&be_const_str_SERIAL_8O2,
(const bstring *)&be_const_str_copy,
- (const bstring *)&be_const_str_P9813_DAT,
- (const bstring *)&be_const_str_cmd_res,
- (const bstring *)&be_const_str_AudioGeneratorWAV,
- (const bstring *)&be_const_str_SM16716_CLK,
- (const bstring *)&be_const_str_ADC_TEMP,
- (const bstring *)&be_const_str_TX2X_TXD_BLACK,
- (const bstring *)&be_const_str_MIEL_HVAC_TX,
- (const bstring *)&be_const_str_I2C_SDA,
- (const bstring *)&be_const_str_SM16716_DAT,
- (const bstring *)&be_const_str_KEY1_INV,
- NULL,
- NULL,
- (const bstring *)&be_const_str_HJL_CF,
- (const bstring *)&be_const_str_MAX31855CLK,
- (const bstring *)&be_const_str_DHT11,
- (const bstring *)&be_const_str_url_encode,
- (const bstring *)&be_const_str_OUTPUT_LO,
- (const bstring *)&be_const_str_EPAPER42_CS,
- NULL,
- (const bstring *)&be_const_str_SSPI_DC,
- (const bstring *)&be_const_str_INTERRUPT,
- (const bstring *)&be_const_str_TELEINFO_ENABLE,
- (const bstring *)&be_const_str_MCP39F5_RX,
- (const bstring *)&be_const_str_HRXL_RX,
- (const bstring *)&be_const_str_AZ_TXD,
- (const bstring *)&be_const_str_BUZZER,
- NULL,
- (const bstring *)&be_const_str_DDSU666_RX,
- (const bstring *)&be_const_str_AS608_TX,
- (const bstring *)&be_const_str_HLW_CF,
- (const bstring *)&be_const_str_PN532_TXD,
- (const bstring *)&be_const_str_PWM1,
- (const bstring *)&be_const_str_ADC_BUTTON_INV,
- (const bstring *)&be_const_str_arg,
- (const bstring *)&be_const_str_rtc,
- (const bstring *)&be_const_str_TCP_RX,
- (const bstring *)&be_const_str_def,
- NULL,
- (const bstring *)&be_const_str_ETH_PHY_MDIO,
- (const bstring *)&be_const_str_DHT22,
- NULL,
- NULL,
- (const bstring *)&be_const_str_SERIAL_5E2,
- (const bstring *)&be_const_str_LMT01,
- (const bstring *)&be_const_str_MGC3130_RESET,
- NULL,
- (const bstring *)&be_const_str_ETH_PHY_MDC,
- (const bstring *)&be_const_str_AudioOutput,
- (const bstring *)&be_const_str_reverse_gamma10,
- (const bstring *)&be_const_str_reverse,
- (const bstring *)&be_const_str_EPD_DATA,
- (const bstring *)&be_const_str_INPUT_PULLDOWN,
- (const bstring *)&be_const_str_opt_neq,
- (const bstring *)&be_const_str_DEEPSLEEP,
- (const bstring *)&be_const_str_pop,
- (const bstring *)&be_const_str_AudioGeneratorMP3,
- (const bstring *)&be_const_str_last_modified,
- (const bstring *)&be_const_str_DAC,
- (const bstring *)&be_const_str_ADC_LIGHT,
- (const bstring *)&be_const_str_SOLAXX1_TX,
- (const bstring *)&be_const_str_BOILER_OT_RX,
+ (const bstring *)&be_const_str_tostring,
+ (const bstring *)&be_const_str_dot_p1,
+ (const bstring *)&be_const_str_read8,
+ (const bstring *)&be_const_str_rad,
+ (const bstring *)&be_const_str_load,
(const bstring *)&be_const_str_opt_add,
NULL,
- (const bstring *)&be_const_str_CNTR1,
- (const bstring *)&be_const_str_SERIAL_5N2,
- NULL,
- (const bstring *)&be_const_str_PWM1_INV,
- (const bstring *)&be_const_str_WEBCAM_DATA,
- NULL,
- (const bstring *)&be_const_str_resp_cmnd_failed,
- (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0,
- (const bstring *)&be_const_str_OneWire,
- (const bstring *)&be_const_str_HPMA_TX,
- (const bstring *)&be_const_str_remove_cmd,
- (const bstring *)&be_const_str_SERIAL_7N2,
- (const bstring *)&be_const_str_redirect,
- (const bstring *)&be_const_str_AudioFileSource,
- NULL,
- (const bstring *)&be_const_str_toupper,
- (const bstring *)&be_const_str_dot_p2,
- (const bstring *)&be_const_str_AS608_RX,
- (const bstring *)&be_const_str_OPTION_A,
- (const bstring *)&be_const_str_ADC_RANGE,
- (const bstring *)&be_const_str_ILI9341_DC,
- (const bstring *)&be_const_str_SWT1_PD,
- (const bstring *)&be_const_str_A4988_MS1,
- (const bstring *)&be_const_str_CHANGE,
- (const bstring *)&be_const_str_AZ_RXD,
- (const bstring *)&be_const_str_SERIAL_7N1,
- (const bstring *)&be_const_str_digital_write,
- (const bstring *)&be_const_str_atan2,
- (const bstring *)&be_const_str_A4988_DIR,
- (const bstring *)&be_const_str_gamma10,
- (const bstring *)&be_const_str_dot_p1,
- (const bstring *)&be_const_str_sin,
- (const bstring *)&be_const_str_SBR_TX,
- (const bstring *)&be_const_str_SDM72_RX,
- (const bstring *)&be_const_str_A4988_ENA,
- (const bstring *)&be_const_str_IEM3000_TX,
- (const bstring *)&be_const_str_gamma8,
- (const bstring *)&be_const_str_top,
- (const bstring *)&be_const_str_counters,
- NULL,
- (const bstring *)&be_const_str_I2S_IN_SLCT,
- (const bstring *)&be_const_str_remove_rule,
- (const bstring *)&be_const_str_imin,
- (const bstring *)&be_const_str__rules,
- (const bstring *)&be_const_str_OUTPUT,
- (const bstring *)&be_const_str_EXS_ENABLE,
- (const bstring *)&be_const_str_RFSEND,
- (const bstring *)&be_const_str_CSE7766_RX,
- (const bstring *)&be_const_str_IBEACON_TX,
- (const bstring *)&be_const_str_ARIRFRCV,
+ (const bstring *)&be_const_str_chars_in_string,
+ (const bstring *)&be_const_str_select,
+ (const bstring *)&be_const_str_global,
(const bstring *)&be_const_str_opt_eq,
+ (const bstring *)&be_const_str_SERIAL_8E1,
+ (const bstring *)&be_const_str_get_power,
+ (const bstring *)&be_const_str_addr,
+ (const bstring *)&be_const_str_dot_p,
+ (const bstring *)&be_const_str_add,
+ (const bstring *)&be_const_str_SERIAL_6N1,
+ (const bstring *)&be_const_str_SERIAL_8O1,
+ (const bstring *)&be_const_str___iterator__,
+ (const bstring *)&be_const_str_available,
+ (const bstring *)&be_const_str__drivers,
+ (const bstring *)&be_const_str_opt_call,
+ (const bstring *)&be_const_str_SERIAL_6E2,
+ (const bstring *)&be_const_str_classname,
+ (const bstring *)&be_const_str_remove,
+ (const bstring *)&be_const_str_begin,
+ (const bstring *)&be_const_str_content_stop,
+ (const bstring *)&be_const_str_reset,
+ NULL,
+ (const bstring *)&be_const_str_clear,
+ (const bstring *)&be_const_str_SERIAL_5E1,
+ (const bstring *)&be_const_str_setitem,
+ (const bstring *)&be_const_str_stop,
+ (const bstring *)&be_const_str_AES_GCM,
+ (const bstring *)&be_const_str_exec_cmd,
+ (const bstring *)&be_const_str_ceil,
+ (const bstring *)&be_const_str_call,
+ (const bstring *)&be_const_str_cmd_res,
+ NULL,
+ NULL,
+ (const bstring *)&be_const_str_opt_connect,
+ (const bstring *)&be_const_str_SERIAL_6E1,
+ (const bstring *)&be_const_str__cb,
+ (const bstring *)&be_const_str_AudioOutput,
+ (const bstring *)&be_const_str_SERIAL_6O2,
+ (const bstring *)&be_const_str_detect,
+ (const bstring *)&be_const_str_depower,
+ (const bstring *)&be_const_str_add_header,
+ (const bstring *)&be_const_str_pow,
+ (const bstring *)&be_const_str_SERIAL_5E2,
+ (const bstring *)&be_const_str_get,
+ (const bstring *)&be_const_str_dot_len,
+ (const bstring *)&be_const_str_SERIAL_5N2,
+ (const bstring *)&be_const_str_AudioFileSource,
+ (const bstring *)&be_const_str_digital_write,
+ NULL,
+ (const bstring *)&be_const_str_char,
+ (const bstring *)&be_const_str_AudioGenerator,
+ (const bstring *)&be_const_str_byte,
+ (const bstring *)&be_const_str_dot_size,
+ (const bstring *)&be_const_str_list,
+ NULL,
+ (const bstring *)&be_const_str_SERIAL_7N2,
+ (const bstring *)&be_const_str_Tasmota,
+ (const bstring *)&be_const_str_read,
+ (const bstring *)&be_const_str___lower__,
+ (const bstring *)&be_const_str_POST,
+ (const bstring *)&be_const_str_deinit,
+ (const bstring *)&be_const_str_SERIAL_8E2,
+ (const bstring *)&be_const_str_isnan,
+ (const bstring *)&be_const_str_arg_name,
+ (const bstring *)&be_const_str_get_light,
+ NULL,
+ NULL,
+ (const bstring *)&be_const_str_sqrt,
+ (const bstring *)&be_const_str__end_transmission,
+ (const bstring *)&be_const_str_exec_tele,
+ (const bstring *)&be_const_str_format,
+ NULL,
+ (const bstring *)&be_const_str_SERIAL_7E2,
+ NULL,
+ (const bstring *)&be_const_str_SERIAL_7N1,
+ (const bstring *)&be_const_str_content_button,
+ (const bstring *)&be_const_str_AudioGeneratorMP3,
+ (const bstring *)&be_const_str_fromptr,
+ (const bstring *)&be_const_str_geti,
+ (const bstring *)&be_const_str_assert,
+ (const bstring *)&be_const_str_time_str,
+ (const bstring *)&be_const_str_exists,
+ (const bstring *)&be_const_str_seti,
+ (const bstring *)&be_const_str_acos,
+ (const bstring *)&be_const_str_find_op,
+ NULL,
+ (const bstring *)&be_const_str_isinstance,
+ (const bstring *)&be_const_str_cb_dispatch,
+ (const bstring *)&be_const_str_SERIAL_5O2,
+ (const bstring *)&be_const_str_,
+ (const bstring *)&be_const_str_dac_voltage,
+ (const bstring *)&be_const_str_add_rule,
+ (const bstring *)&be_const_str_AudioOutputI2S,
+ (const bstring *)&be_const_str__write,
+ (const bstring *)&be_const_str_resp_cmnd,
+ NULL,
+ NULL,
+ (const bstring *)&be_const_str_content_start,
+ (const bstring *)&be_const_str_memory,
+ (const bstring *)&be_const_str_EC_C25519,
+ (const bstring *)&be_const_str_str,
+ (const bstring *)&be_const_str_get_option,
+ (const bstring *)&be_const_str_dot_w,
+ (const bstring *)&be_const_str_SERIAL_7O1,
+ (const bstring *)&be_const_str__timers,
+ NULL,
+ NULL,
+ (const bstring *)&be_const_str_GET,
+ (const bstring *)&be_const_str_break,
+ (const bstring *)&be_const_str__global_def,
+ (const bstring *)&be_const_str_find,
+ NULL,
+ (const bstring *)&be_const_str_SERIAL_6N2,
+ (const bstring *)&be_const_str_module,
+ (const bstring *)&be_const_str_var,
+ (const bstring *)&be_const_str_content_send_style,
+ (const bstring *)&be_const_str_asstring,
+ (const bstring *)&be_const_str_get_string,
+ (const bstring *)&be_const_str_encrypt,
+ (const bstring *)&be_const_str_opt_neq,
+ (const bstring *)&be_const_str_exec_rules,
+ (const bstring *)&be_const_str_AudioFileSourceFS,
+ (const bstring *)&be_const_str_SERIAL_7O2,
+ NULL,
+ (const bstring *)&be_const_str__ptr,
+ (const bstring *)&be_const_str_arch,
+ NULL,
+ (const bstring *)&be_const_str_cmd,
+ (const bstring *)&be_const_str_nil,
+ (const bstring *)&be_const_str_SERIAL_7E1,
+ (const bstring *)&be_const_str_calldepth,
+ NULL,
+ (const bstring *)&be_const_str_counters,
+ (const bstring *)&be_const_str__rules,
+ (const bstring *)&be_const_str_codedump,
+ (const bstring *)&be_const_str_dot_p2,
+ NULL,
+ (const bstring *)&be_const_str_erase,
+ (const bstring *)&be_const_str_gamma8,
+ NULL,
+ (const bstring *)&be_const_str_SERIAL_6O1,
+ (const bstring *)&be_const_str_target_search,
NULL,
(const bstring *)&be_const_str_abs,
- (const bstring *)&be_const_str_fromstring,
- (const bstring *)&be_const_str_MAX7219DIN,
- NULL,
- (const bstring *)&be_const_str_I2C_SCL,
- NULL,
- (const bstring *)&be_const_str_LED1_INV,
- (const bstring *)&be_const_str_I2S_IN_CLK,
- NULL,
- (const bstring *)&be_const_str_PULLUP,
- (const bstring *)&be_const_str_INPUT,
- (const bstring *)&be_const_str_ETH_PHY_POWER,
- (const bstring *)&be_const_str_KEY1,
- (const bstring *)&be_const_str_add_driver,
- NULL,
- (const bstring *)&be_const_str_LOW,
- (const bstring *)&be_const_str_LED1,
- (const bstring *)&be_const_str_read12,
- (const bstring *)&be_const_str_find,
- (const bstring *)&be_const_str__begin_transmission,
- (const bstring *)&be_const_str_KEY1_TC,
- (const bstring *)&be_const_str_dot_p,
- (const bstring *)&be_const_str_AES_GCM,
- (const bstring *)&be_const_str_print,
- NULL,
- (const bstring *)&be_const_str_I2S_OUT_CLK
+ (const bstring *)&be_const_str_eth,
+ (const bstring *)&be_const_str_SERIAL_5O1,
+ (const bstring *)&be_const_str_compile,
+ (const bstring *)&be_const_str_add_cmd
};
static const struct bconststrtab m_const_string_table = {
- .size = 291,
- .count = 582,
+ .size = 160,
+ .count = 321,
.table = m_string_table
};
diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h
index a9f54b4b4..34b9c0a05 100644
--- a/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h
+++ b/lib/libesp32/Berry/generate/be_fixed_be_class_tasmota.h
@@ -1,85 +1,86 @@
#include "be_constobj.h"
static be_define_const_map_slots(be_class_tasmota_map) {
- { be_const_key(set_light, -1), be_const_closure(set_light_closure) },
- { be_const_key(gc, -1), be_const_closure(gc_closure) },
- { be_const_key(remove_cmd, -1), be_const_closure(remove_cmd_closure) },
- { be_const_key(set_timer, 42), be_const_closure(set_timer_closure) },
- { be_const_key(_settings_ptr, -1), be_const_comptr(&Settings) },
- { be_const_key(set_power, -1), be_const_func(l_setpower) },
- { be_const_key(remove_driver, -1), be_const_closure(remove_driver_closure) },
- { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) },
- { be_const_key(find_op, 58), be_const_closure(find_op_closure) },
- { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) },
- { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) },
- { be_const_key(_cb, 3), be_const_var(0) },
- { be_const_key(web_send, -1), be_const_func(l_webSend) },
- { be_const_key(log, 1), be_const_func(l_logInfo) },
- { be_const_key(get_switch, 50), be_const_func(l_getswitch) },
- { be_const_key(_ccmd, 19), be_const_var(1) },
- { be_const_key(eth, -1), be_const_func(l_eth) },
- { be_const_key(_settings_def, -1), be_const_comptr(&be_tasmota_settings_struct) },
- { be_const_key(init, 39), be_const_closure(init_closure) },
- { be_const_key(strftime, -1), be_const_func(l_strftime) },
- { be_const_key(kv, -1), be_const_closure(kv_closure) },
{ be_const_key(resp_cmnd_done, -1), be_const_func(l_respCmndDone) },
- { be_const_key(cmd_res, 67), be_const_var(2) },
- { be_const_key(wire1, 43), be_const_var(3) },
- { be_const_key(get_light, -1), be_const_closure(get_light_closure) },
- { be_const_key(resp_cmnd_error, 62), be_const_func(l_respCmndError) },
- { be_const_key(publish_result, 9), be_const_func(l_publish_result) },
- { be_const_key(gen_cb, -1), be_const_closure(gen_cb_closure) },
- { be_const_key(yield, -1), be_const_func(l_yield) },
- { be_const_key(add_rule, -1), be_const_closure(add_rule_closure) },
- { be_const_key(settings, -1), be_const_var(4) },
- { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) },
- { be_const_key(resp_cmnd, 31), be_const_func(l_respCmnd) },
- { be_const_key(exec_tele, 68), be_const_closure(exec_tele_closure) },
- { be_const_key(exec_rules, 51), be_const_closure(exec_rules_closure) },
- { be_const_key(load, -1), be_const_closure(load_closure) },
- { be_const_key(remove_rule, 22), be_const_closure(remove_rule_closure) },
- { be_const_key(_rules, 18), be_const_var(5) },
- { be_const_key(publish, -1), be_const_func(l_publish) },
- { be_const_key(get_option, 15), be_const_func(l_getoption) },
- { be_const_key(global, -1), be_const_var(6) },
- { be_const_key(add_driver, 33), be_const_closure(add_driver_closure) },
- { be_const_key(cmd, -1), be_const_closure(cmd_closure) },
+ { be_const_key(settings, 70), be_const_var(0) },
+ { be_const_key(set_light, -1), be_const_closure(set_light_closure) },
+ { be_const_key(gc, 35), be_const_closure(gc_closure) },
{ be_const_key(add_cmd, -1), be_const_closure(add_cmd_closure) },
- { be_const_key(run_deferred, -1), be_const_closure(run_deferred_closure) },
- { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) },
- { be_const_key(wifi, -1), be_const_func(l_wifi) },
- { be_const_key(time_dump, -1), be_const_func(l_time_dump) },
- { be_const_key(rtc, 24), be_const_func(l_rtc) },
- { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) },
- { be_const_key(_get_cb, -1), be_const_func(l_get_cb) },
- { be_const_key(resp_cmnd_failed, 72), be_const_func(l_respCmndFailed) },
- { be_const_key(wire_scan, -1), be_const_closure(wire_scan_closure) },
- { be_const_key(exec_cmd, -1), be_const_closure(exec_cmd_closure) },
- { be_const_key(_cmd, 46), be_const_func(l_cmd) },
- { be_const_key(remove_timer, -1), be_const_closure(remove_timer_closure) },
- { be_const_key(time_str, 34), be_const_closure(time_str_closure) },
- { be_const_key(response_append, -1), be_const_func(l_respAppend) },
- { be_const_key(web_send_decimal, 60), be_const_func(l_webSendDecimal) },
- { be_const_key(_drivers, 71), be_const_var(7) },
+ { be_const_key(try_rule, -1), be_const_closure(try_rule_closure) },
+ { be_const_key(publish, 20), be_const_func(l_publish) },
+ { be_const_key(_settings_ptr, 28), be_const_comptr(&Settings) },
+ { be_const_key(exec_tele, 36), be_const_closure(exec_tele_closure) },
{ be_const_key(delay, -1), be_const_func(l_delay) },
+ { be_const_key(_drivers, -1), be_const_var(1) },
+ { be_const_key(find_key_i, -1), be_const_closure(find_key_i_closure) },
+ { be_const_key(resp_cmnd_failed, -1), be_const_func(l_respCmndFailed) },
+ { be_const_key(wire2, 64), be_const_var(2) },
+ { be_const_key(gen_cb, 56), be_const_closure(gen_cb_closure) },
+ { be_const_key(resp_cmnd_str, -1), be_const_func(l_respCmndStr) },
+ { be_const_key(_timers, 25), be_const_var(3) },
+ { be_const_key(kv, -1), be_const_closure(kv_closure) },
+ { be_const_key(set_power, -1), be_const_func(l_setpower) },
+ { be_const_key(cmd, 38), be_const_closure(cmd_closure) },
+ { be_const_key(global, -1), be_const_var(4) },
+ { be_const_key(response_append, -1), be_const_func(l_respAppend) },
+ { be_const_key(_get_cb, -1), be_const_func(l_get_cb) },
{ be_const_key(time_reached, -1), be_const_func(l_timereached) },
+ { be_const_key(wifi, 19), be_const_func(l_wifi) },
+ { be_const_key(rtc, -1), be_const_func(l_rtc) },
+ { be_const_key(i2c_enabled, 8), be_const_func(l_i2cenabled) },
+ { be_const_key(publish_result, 34), be_const_func(l_publish_result) },
+ { be_const_key(_settings_def, -1), be_const_comptr(&be_tasmota_settings_struct) },
+ { be_const_key(yield, 6), be_const_func(l_yield) },
+ { be_const_key(init, -1), be_const_closure(init_closure) },
+ { be_const_key(eth, -1), be_const_func(l_eth) },
+ { be_const_key(get_free_heap, -1), be_const_func(l_getFreeHeap) },
+ { be_const_key(get_option, -1), be_const_func(l_getoption) },
+ { be_const_key(get_power, -1), be_const_func(l_getpower) },
+ { be_const_key(run_deferred, -1), be_const_closure(run_deferred_closure) },
+ { be_const_key(get_light, 11), be_const_closure(get_light_closure) },
+ { be_const_key(cmd_res, -1), be_const_var(5) },
+ { be_const_key(event, -1), be_const_closure(event_closure) },
+ { be_const_key(load, -1), be_const_closure(load_closure) },
+ { be_const_key(remove_timer, -1), be_const_closure(remove_timer_closure) },
+ { be_const_key(wire_scan, -1), be_const_closure(wire_scan_closure) },
+ { be_const_key(_cb, 50), be_const_var(6) },
+ { be_const_key(remove_driver, 67), be_const_closure(remove_driver_closure) },
+ { be_const_key(wire1, 61), be_const_var(7) },
+ { be_const_key(memory, -1), be_const_func(l_memory) },
+ { be_const_key(_global_addr, -1), be_const_comptr(&TasmotaGlobal) },
+ { be_const_key(time_dump, -1), be_const_func(l_time_dump) },
+ { be_const_key(_ccmd, -1), be_const_var(8) },
+ { be_const_key(exec_cmd, 39), be_const_closure(exec_cmd_closure) },
+ { be_const_key(exec_rules, 68), be_const_closure(exec_rules_closure) },
+ { be_const_key(resp_cmnd, 14), be_const_func(l_respCmnd) },
+ { be_const_key(remove_cmd, -1), be_const_closure(remove_cmd_closure) },
+ { be_const_key(remove_rule, 69), be_const_closure(remove_rule_closure) },
+ { be_const_key(web_send_decimal, -1), be_const_func(l_webSendDecimal) },
+ { be_const_key(_rules, 41), be_const_var(9) },
+ { be_const_key(strftime, 59), be_const_func(l_strftime) },
+ { be_const_key(chars_in_string, -1), be_const_closure(chars_in_string_closure) },
+ { be_const_key(set_timer, -1), be_const_closure(set_timer_closure) },
{ be_const_key(_global_def, -1), be_const_comptr(&be_tasmota_global_struct) },
{ be_const_key(resolvecmnd, -1), be_const_func(l_resolveCmnd) },
- { be_const_key(_timers, -1), be_const_var(8) },
- { be_const_key(event, 7), be_const_closure(event_closure) },
- { be_const_key(wire2, -1), be_const_var(9) },
{ be_const_key(scale_uint, -1), be_const_func(l_scaleuint) },
- { be_const_key(get_power, 73), be_const_func(l_getpower) },
- { be_const_key(millis, -1), be_const_func(l_millis) },
- { be_const_key(save, 44), be_const_func(l_save) },
- { be_const_key(_global_addr, -1), be_const_comptr(&TasmotaGlobal) },
- { be_const_key(memory, -1), be_const_func(l_memory) },
- { be_const_key(i2c_enabled, -1), be_const_func(l_i2cenabled) },
+ { be_const_key(time_str, -1), be_const_closure(time_str_closure) },
+ { be_const_key(millis, 48), be_const_func(l_millis) },
+ { be_const_key(resp_cmnd_error, -1), be_const_func(l_respCmndError) },
+ { be_const_key(arch, -1), be_const_func(l_arch) },
+ { be_const_key(log, -1), be_const_func(l_logInfo) },
+ { be_const_key(add_rule, -1), be_const_closure(add_rule_closure) },
+ { be_const_key(_cmd, 17), be_const_func(l_cmd) },
+ { be_const_key(get_switch, -1), be_const_func(l_getswitch) },
+ { be_const_key(find_op, -1), be_const_closure(find_op_closure) },
+ { be_const_key(add_driver, 3), be_const_closure(add_driver_closure) },
+ { be_const_key(save, 65), be_const_func(l_save) },
+ { be_const_key(web_send, -1), be_const_func(l_webSend) },
+ { be_const_key(cb_dispatch, -1), be_const_closure(cb_dispatch_closure) },
};
static be_define_const_map(
be_class_tasmota_map,
- 74
+ 75
);
BE_EXPORT_VARIABLE be_define_const_class(
diff --git a/lib/libesp32/Berry/generate/be_fixed_be_class_webclient.h b/lib/libesp32/Berry/generate/be_fixed_be_class_webclient.h
index 6a7044c15..15eaa21d7 100644
--- a/lib/libesp32/Berry/generate/be_fixed_be_class_webclient.h
+++ b/lib/libesp32/Berry/generate/be_fixed_be_class_webclient.h
@@ -1,26 +1,27 @@
#include "be_constobj.h"
static be_define_const_map_slots(be_class_webclient_map) {
- { be_const_key(url_encode, 3), be_const_func(wc_urlencode) },
- { be_const_key(POST, -1), be_const_func(wc_POST) },
- { be_const_key(dot_p, -1), be_const_var(0) },
- { be_const_key(begin, 5), be_const_func(wc_begin) },
- { be_const_key(set_useragent, 2), be_const_func(wc_set_useragent) },
- { be_const_key(set_auth, 12), be_const_func(wc_set_auth) },
{ be_const_key(close, -1), be_const_func(wc_close) },
- { be_const_key(add_header, 9), be_const_func(wc_addheader) },
- { be_const_key(get_size, -1), be_const_func(wc_getsize) },
+ { be_const_key(get_string, 5), be_const_func(wc_getstring) },
+ { be_const_key(dot_w, 11), be_const_var(0) },
+ { be_const_key(dot_p, 13), be_const_var(1) },
+ { be_const_key(add_header, 10), be_const_func(wc_addheader) },
+ { be_const_key(url_encode, -1), be_const_func(wc_urlencode) },
+ { be_const_key(POST, -1), be_const_func(wc_POST) },
+ { be_const_key(GET, 6), be_const_func(wc_GET) },
{ be_const_key(deinit, -1), be_const_func(wc_deinit) },
+ { be_const_key(get_size, -1), be_const_func(wc_getsize) },
{ be_const_key(set_timeouts, -1), be_const_func(wc_set_timeouts) },
- { be_const_key(GET, 13), be_const_func(wc_GET) },
- { be_const_key(init, -1), be_const_func(wc_init) },
- { be_const_key(dot_w, -1), be_const_var(1) },
- { be_const_key(get_string, 11), be_const_func(wc_getstring) },
+ { be_const_key(set_auth, -1), be_const_func(wc_set_auth) },
+ { be_const_key(set_useragent, -1), be_const_func(wc_set_useragent) },
+ { be_const_key(init, 0), be_const_func(wc_init) },
+ { be_const_key(begin, -1), be_const_func(wc_begin) },
+ { be_const_key(write_file, -1), be_const_func(wc_writefile) },
};
static be_define_const_map(
be_class_webclient_map,
- 15
+ 16
);
BE_EXPORT_VARIABLE be_define_const_class(
diff --git a/lib/libesp32/Berry/generate/be_fixed_gpio.h b/lib/libesp32/Berry/generate/be_fixed_gpio.h
index 091842bca..d87b01643 100644
--- a/lib/libesp32/Berry/generate/be_fixed_gpio.h
+++ b/lib/libesp32/Berry/generate/be_fixed_gpio.h
@@ -1,281 +1,18 @@
#include "be_constobj.h"
static be_define_const_map_slots(m_libgpio_map) {
- { be_const_key(SENSOR_END, 167), be_const_int(250) },
- { be_const_key(DHT11_OUT, -1), be_const_int(40) },
- { be_const_key(HM10_TX, 199), be_const_int(139) },
- { be_const_key(DHT22, 6), be_const_int(38) },
- { be_const_key(ARIRFRCV, 226), be_const_int(98) },
- { be_const_key(WEBCAM_HREF, 183), be_const_int(161) },
- { be_const_key(SM16716_CLK, 168), be_const_int(91) },
- { be_const_key(ZIGBEE_RST, 264), be_const_int(181) },
- { be_const_key(KEY1_INV_NP, 223), be_const_int(4) },
- { be_const_key(KEY1_TC, 81), be_const_int(169) },
- { be_const_key(PROJECTOR_CTRL_RX, -1), be_const_int(225) },
- { be_const_key(TFMINIPLUS_RX, -1), be_const_int(235) },
- { be_const_key(SSD1331_CS, -1), be_const_int(208) },
- { be_const_key(MP3_DFR562, 162), be_const_int(67) },
- { be_const_key(WEBCAM_VSYNC, 140), be_const_int(160) },
- { be_const_key(CNTR1, 246), be_const_int(11) },
- { be_const_key(ROT1B_NP, -1), be_const_int(212) },
- { be_const_key(ELECTRIQ_MOODL_TX, -1), be_const_int(145) },
- { be_const_key(TASMOTACLIENT_RXD, -1), be_const_int(131) },
- { be_const_key(NONE, -1), be_const_int(0) },
- { be_const_key(RF_SENSOR, -1), be_const_int(75) },
- { be_const_key(MAX31855CS, -1), be_const_int(78) },
- { be_const_key(SPI_MOSI, 233), be_const_int(22) },
- { be_const_key(I2S_OUT_DATA, -1), be_const_int(243) },
- { be_const_key(HPMA_TX, 108), be_const_int(135) },
- { be_const_key(TASMOTACLIENT_RST_INV, 156), be_const_int(133) },
- { be_const_key(IEM3000_RX, -1), be_const_int(180) },
- { be_const_key(BS814_DAT, 196), be_const_int(215) },
- { be_const_key(OUTPUT_LO, -1), be_const_int(121) },
- { be_const_key(SSD1351_CS, 236), be_const_int(204) },
- { be_const_key(TM1637DIO, -1), be_const_int(223) },
- { be_const_key(INTERRUPT, 240), be_const_int(249) },
- { be_const_key(PN532_RXD, 195), be_const_int(90) },
- { be_const_key(SM2135_CLK, -1), be_const_int(126) },
- { be_const_key(DI, -1), be_const_int(94) },
- { be_const_key(TM1638CLK, 87), be_const_int(64) },
- { be_const_key(DSB_OUT, 65), be_const_int(42) },
- { be_const_key(I2S_OUT_SLCT, -1), be_const_int(245) },
- { be_const_key(RDM6300_RX, -1), be_const_int(113) },
- { be_const_key(TUYA_RX, 59), be_const_int(72) },
- { be_const_key(WIEGAND_D1, -1), be_const_int(217) },
- { be_const_key(EPAPER42_CS, 133), be_const_int(203) },
- { be_const_key(INPUT_PULLDOWN, -1), be_const_int(9) },
- { be_const_key(A4988_DIR, 75), be_const_int(116) },
- { be_const_key(NEOPOOL_RX, -1), be_const_int(219) },
- { be_const_key(PZEM016_RX, 36), be_const_int(48) },
- { be_const_key(digital_write, 225), be_const_func(gp_digital_write) },
- { be_const_key(NRG_CF1, -1), be_const_int(83) },
- { be_const_key(FTC532, -1), be_const_int(195) },
- { be_const_key(DDS2382_TX, -1), be_const_int(122) },
- { be_const_key(WEBCAM_RESET, 230), be_const_int(155) },
- { be_const_key(TELEINFO_ENABLE, 42), be_const_int(177) },
- { be_const_key(IRRECV, 89), be_const_int(34) },
- { be_const_key(SDM120_RX, 148), be_const_int(61) },
- { be_const_key(PMS5003_TX, -1), be_const_int(52) },
- { be_const_key(CC1101_GDO2, -1), be_const_int(143) },
- { be_const_key(HPMA_RX, 238), be_const_int(134) },
- { be_const_key(MAX7219CS, -1), be_const_int(233) },
- { be_const_key(CSE7766_RX, 46), be_const_int(97) },
- { be_const_key(RISING, 103), be_const_int(1) },
- { be_const_key(SPI_MISO, -1), be_const_int(21) },
- { be_const_key(RFRECV, -1), be_const_int(36) },
- { be_const_key(SHELLY_DIMMER_RST_INV, 228), be_const_int(190) },
- { be_const_key(TASMOTACLIENT_RST, -1), be_const_int(132) },
- { be_const_key(PULLDOWN, 189), be_const_int(8) },
- { be_const_key(SSPI_CS, -1), be_const_int(29) },
- { be_const_key(TUYA_TX, -1), be_const_int(71) },
- { be_const_key(LED1_INV, 0), be_const_int(10) },
- { be_const_key(digital_read, -1), be_const_func(gp_digital_read) },
- { be_const_key(CSE7766_TX, 215), be_const_int(96) },
- { be_const_key(DCKI, -1), be_const_int(95) },
- { be_const_key(ILI9341_CS, -1), be_const_int(199) },
- { be_const_key(pin_used, -1), be_const_func(gp_pin_used) },
- { be_const_key(ADC_RANGE, 237), be_const_int(152) },
- { be_const_key(PZEM0XX_TX, 31), be_const_int(46) },
- { be_const_key(ROT1A_NP, -1), be_const_int(211) },
- { be_const_key(ROT1A, 202), be_const_int(102) },
- { be_const_key(HALLEFFECT, -1), be_const_int(237) },
- { be_const_key(OPEN_DRAIN, -1), be_const_int(16) },
- { be_const_key(TM1638DIO, 220), be_const_int(65) },
- { be_const_key(IEM3000_TX, -1), be_const_int(179) },
- { be_const_key(MAX7219DIN, 118), be_const_int(232) },
- { be_const_key(A4988_ENA, -1), be_const_int(118) },
- { be_const_key(MHZ_TXD, 23), be_const_int(44) },
- { be_const_key(WEBCAM_PWDN, -1), be_const_int(154) },
- { be_const_key(SDS0X1_RX, -1), be_const_int(55) },
- { be_const_key(SPI_CS, -1), be_const_int(24) },
- { be_const_key(BS814_CLK, -1), be_const_int(214) },
- { be_const_key(CSE7761_RX, -1), be_const_int(229) },
- { be_const_key(ADC_JOY, -1), be_const_int(104) },
- { be_const_key(OPTION_A, 171), be_const_int(194) },
- { be_const_key(RFSEND, -1), be_const_int(35) },
- { be_const_key(HRE_DATA, 135), be_const_int(107) },
- { be_const_key(BOILER_OT_TX, 221), be_const_int(167) },
- { be_const_key(ETH_PHY_MDC, 30), be_const_int(174) },
- { be_const_key(LED1, 11), be_const_int(9) },
- { be_const_key(DDSU666_RX, 64), be_const_int(125) },
- { be_const_key(MAX31855CLK, -1), be_const_int(79) },
- { be_const_key(RA8876_CS, -1), be_const_int(205) },
- { be_const_key(AZ_TXD, -1), be_const_int(76) },
- { be_const_key(SBR_TX, -1), be_const_int(56) },
- { be_const_key(REL1_INV, 212), be_const_int(8) },
- { be_const_key(CC1101_GDO0, -1), be_const_int(142) },
- { be_const_key(AZ_RXD, 149), be_const_int(77) },
- { be_const_key(EPAPER29_CS, 229), be_const_int(202) },
- { be_const_key(P9813_DAT, 177), be_const_int(193) },
- { be_const_key(PWM1, -1), be_const_int(13) },
- { be_const_key(INPUT, -1), be_const_int(239) },
- { be_const_key(PN532_TXD, -1), be_const_int(89) },
- { be_const_key(I2S_IN_DATA, -1), be_const_int(246) },
- { be_const_key(SOLAXX1_TX, -1), be_const_int(109) },
- { be_const_key(LEDLNK_INV, 208), be_const_int(18) },
- { be_const_key(ADC_LIGHT, -1), be_const_int(149) },
- { be_const_key(SDS0X1_TX, 92), be_const_int(54) },
- { be_const_key(ADC_PH, 1), be_const_int(213) },
- { be_const_key(WEBCAM_XCLK, 267), be_const_int(156) },
- { be_const_key(ADC_BUTTON_INV, -1), be_const_int(151) },
- { be_const_key(IBEACON_TX, 13), be_const_int(114) },
- { be_const_key(SWT1_NP, -1), be_const_int(6) },
- { be_const_key(SDCARD_CS, 62), be_const_int(210) },
- { be_const_key(KEY1_PD, -1), be_const_int(240) },
- { be_const_key(BUZZER, 69), be_const_int(15) },
- { be_const_key(SM2135_DAT, -1), be_const_int(127) },
- { be_const_key(CNTR1_NP, -1), be_const_int(12) },
- { be_const_key(NRF24_CS, 49), be_const_int(197) },
- { be_const_key(DYP_RX, -1), be_const_int(182) },
- { be_const_key(IRSEND, -1), be_const_int(33) },
- { be_const_key(WEBCAM_SIOC, 258), be_const_int(158) },
- { be_const_key(MAX7219CLK, 56), be_const_int(231) },
- { be_const_key(WIEGAND_D0, 165), be_const_int(216) },
- { be_const_key(ZIGBEE_RX, -1), be_const_int(112) },
- { be_const_key(CHANGE, 33), be_const_int(4) },
- { be_const_key(AS608_RX, -1), be_const_int(188) },
- { be_const_key(TCP_RX, -1), be_const_int(172) },
- { be_const_key(PZEM017_RX, -1), be_const_int(49) },
- { be_const_key(NRF24_DC, -1), be_const_int(198) },
- { be_const_key(BACKLIGHT, 35), be_const_int(31) },
- { be_const_key(SSPI_MOSI, -1), be_const_int(27) },
- { be_const_key(MAX31855DO, -1), be_const_int(80) },
- { be_const_key(LE01MR_RX, -1), be_const_int(140) },
- { be_const_key(I2S_IN_SLCT, -1), be_const_int(248) },
- { be_const_key(ETH_PHY_POWER, -1), be_const_int(173) },
- { be_const_key(ADE7953_IRQ, 29), be_const_int(108) },
- { be_const_key(SSPI_MISO, -1), be_const_int(26) },
- { be_const_key(WINDMETER_SPEED, 79), be_const_int(168) },
- { be_const_key(IBEACON_RX, -1), be_const_int(115) },
- { be_const_key(TX2X_TXD_BLACK, 8), be_const_int(70) },
- { be_const_key(TM1637CLK, 102), be_const_int(222) },
- { be_const_key(KEY1_INV, -1), be_const_int(3) },
- { be_const_key(BOILER_OT_RX, -1), be_const_int(166) },
- { be_const_key(DDSU666_TX, -1), be_const_int(124) },
- { be_const_key(WEBCAM_DATA, -1), be_const_int(159) },
- { be_const_key(DDS2382_RX, -1), be_const_int(123) },
- { be_const_key(EXS_ENABLE, 53), be_const_int(129) },
- { be_const_key(AS608_TX, -1), be_const_int(187) },
- { be_const_key(OLED_RESET, 100), be_const_int(32) },
- { be_const_key(AS3935, -1), be_const_int(146) },
- { be_const_key(LMT01, -1), be_const_int(178) },
- { be_const_key(ADC_INPUT, -1), be_const_int(147) },
- { be_const_key(SDM72_TX, 235), be_const_int(220) },
- { be_const_key(ADC_TEMP, -1), be_const_int(148) },
- { be_const_key(LEDLNK, 7), be_const_int(17) },
- { be_const_key(DAC, -1), be_const_int(-1) },
- { be_const_key(SAIR_RX, -1), be_const_int(51) },
- { be_const_key(SOLAXX1_RX, -1), be_const_int(110) },
- { be_const_key(WEBCAM_PCLK, -1), be_const_int(162) },
- { be_const_key(KEY1_NP, 14), be_const_int(2) },
- { be_const_key(TFMINIPLUS_TX, -1), be_const_int(234) },
- { be_const_key(SR04_TRIG, -1), be_const_int(58) },
- { be_const_key(A4988_STP, 182), be_const_int(117) },
- { be_const_key(TASMOTACLIENT_TXD, -1), be_const_int(130) },
- { be_const_key(HX711_DAT, 207), be_const_int(69) },
- { be_const_key(HM10_RX, -1), be_const_int(138) },
- { be_const_key(ARIRFSEL, 249), be_const_int(99) },
- { be_const_key(MIEL_HVAC_TX, 141), be_const_int(183) },
- { be_const_key(NRG_SEL, -1), be_const_int(81) },
- { be_const_key(DEEPSLEEP, 132), be_const_int(128) },
- { be_const_key(CSE7761_TX, -1), be_const_int(228) },
- { be_const_key(WS2812, 18), be_const_int(43) },
- { be_const_key(WE517_RX, 188), be_const_int(186) },
- { be_const_key(PROJECTOR_CTRL_TX, -1), be_const_int(224) },
- { be_const_key(SI7021, 242), be_const_int(39) },
- { be_const_key(SM16716_SEL, -1), be_const_int(93) },
- { be_const_key(KEY1_INV_PD, -1), be_const_int(241) },
- { be_const_key(SPI_CLK, -1), be_const_int(23) },
- { be_const_key(ZEROCROSS, -1), be_const_int(236) },
- { be_const_key(OUTPUT_OPEN_DRAIN, -1), be_const_int(18) },
- { be_const_key(REL1, -1), be_const_int(7) },
- { be_const_key(NRG_SEL_INV, -1), be_const_int(82) },
- { be_const_key(RC522_CS, -1), be_const_int(196) },
- { be_const_key(ADC_BUTTON, -1), be_const_int(150) },
- { be_const_key(SAIR_TX, -1), be_const_int(50) },
- { be_const_key(OUTPUT_HI, 105), be_const_int(120) },
- { be_const_key(LE01MR_TX, -1), be_const_int(141) },
- { be_const_key(ILI9341_DC, 22), be_const_int(200) },
- { be_const_key(SR04_ECHO, 263), be_const_int(59) },
- { be_const_key(HJL_CF, 241), be_const_int(85) },
- { be_const_key(I2S_OUT_CLK, -1), be_const_int(244) },
- { be_const_key(MIEL_HVAC_RX, 12), be_const_int(184) },
- { be_const_key(GPS_RX, 247), be_const_int(136) },
- { be_const_key(pin_mode, -1), be_const_func(gp_pin_mode) },
- { be_const_key(P9813_CLK, -1), be_const_int(192) },
- { be_const_key(ZIGBEE_TX, 262), be_const_int(111) },
- { be_const_key(dac_voltage, -1), be_const_func(gp_dac_voltage) },
- { be_const_key(INPUT_PULLUP, -1), be_const_int(5) },
- { be_const_key(SDM120_TX, -1), be_const_int(60) },
- { be_const_key(HRXL_RX, -1), be_const_int(144) },
{ be_const_key(pin, -1), be_const_func(gp_pin) },
- { be_const_key(HRE_CLOCK, -1), be_const_int(106) },
- { be_const_key(DHT11, -1), be_const_int(37) },
- { be_const_key(PWM1_INV, 109), be_const_int(14) },
- { be_const_key(A4988_MS1, 94), be_const_int(119) },
- { be_const_key(SBR_RX, -1), be_const_int(57) },
- { be_const_key(SWT1_PD, -1), be_const_int(242) },
- { be_const_key(FALLING, 5), be_const_int(2) },
- { be_const_key(PULLUP, -1), be_const_int(4) },
- { be_const_key(TELEINFO_RX, -1), be_const_int(176) },
- { be_const_key(MCP39F5_RX, -1), be_const_int(87) },
- { be_const_key(ETH_PHY_MDIO, -1), be_const_int(175) },
- { be_const_key(BL0940_RX, -1), be_const_int(170) },
- { be_const_key(NEOPOOL_TX, 248), be_const_int(218) },
- { be_const_key(VL53L0X_XSHUT1, -1), be_const_int(230) },
- { be_const_key(MCP39F5_RST, 203), be_const_int(88) },
- { be_const_key(HLW_CF, 231), be_const_int(84) },
- { be_const_key(WEBCAM_PSRCS, -1), be_const_int(165) },
- { be_const_key(SSD1331_DC, -1), be_const_int(209) },
- { be_const_key(ST7789_CS, -1), be_const_int(206) },
- { be_const_key(SDM72_RX, 66), be_const_int(221) },
- { be_const_key(SSD1351_DC, -1), be_const_int(226) },
- { be_const_key(SSPI_SCLK, -1), be_const_int(28) },
- { be_const_key(I2S_IN_CLK, -1), be_const_int(247) },
- { be_const_key(SM16716_DAT, -1), be_const_int(92) },
- { be_const_key(I2C_SDA, -1), be_const_int(20) },
- { be_const_key(PZEM004_RX, -1), be_const_int(47) },
- { be_const_key(TCP_TX, -1), be_const_int(171) },
- { be_const_key(SDM630_RX, -1), be_const_int(63) },
- { be_const_key(SWT1, -1), be_const_int(5) },
- { be_const_key(ROT1B, -1), be_const_int(103) },
- { be_const_key(I2C_SCL, -1), be_const_int(19) },
- { be_const_key(RXD, -1), be_const_int(101) },
- { be_const_key(DSB, 261), be_const_int(41) },
- { be_const_key(MCP39F5_TX, 252), be_const_int(86) },
- { be_const_key(HIGH, 266), be_const_int(1) },
- { be_const_key(RC522_RST, -1), be_const_int(191) },
- { be_const_key(SSPI_DC, -1), be_const_int(30) },
- { be_const_key(LOW, -1), be_const_int(0) },
- { be_const_key(BUZZER_INV, -1), be_const_int(16) },
- { be_const_key(XPT2046_CS, -1), be_const_int(227) },
- { be_const_key(WEBCAM_HSD, -1), be_const_int(164) },
- { be_const_key(TM1638STB, -1), be_const_int(66) },
- { be_const_key(PMS5003_RX, -1), be_const_int(53) },
- { be_const_key(SPI_DC, -1), be_const_int(25) },
- { be_const_key(MHZ_RXD, -1), be_const_int(45) },
- { be_const_key(ILI9488_CS, 119), be_const_int(201) },
- { be_const_key(HX711_SCK, 57), be_const_int(68) },
- { be_const_key(SDM630_TX, 227), be_const_int(62) },
- { be_const_key(SHELLY_DIMMER_BOOT0, -1), be_const_int(189) },
- { be_const_key(EPD_DATA, -1), be_const_int(238) },
- { be_const_key(WE517_TX, -1), be_const_int(185) },
- { be_const_key(TXD, 234), be_const_int(100) },
- { be_const_key(OUTPUT, -1), be_const_int(2) },
- { be_const_key(SSPI_MAX31865_CS1, -1), be_const_int(105) },
- { be_const_key(WEBCAM_PSCLK, -1), be_const_int(163) },
- { be_const_key(WEBCAM_SIOD, -1), be_const_int(157) },
- { be_const_key(MGC3130_RESET, -1), be_const_int(74) },
- { be_const_key(KEY1, -1), be_const_int(1) },
- { be_const_key(MGC3130_XFER, -1), be_const_int(73) },
- { be_const_key(ST7789_DC, 245), be_const_int(207) },
- { be_const_key(GPS_TX, 123), be_const_int(137) },
- { be_const_key(ADC_CT_POWER, 58), be_const_int(153) },
+ { be_const_key(member, -1), be_const_func(gp_member) },
+ { be_const_key(digital_write, -1), be_const_func(gp_digital_write) },
+ { be_const_key(pin_mode, 1), be_const_func(gp_pin_mode) },
+ { be_const_key(pin_used, -1), be_const_func(gp_pin_used) },
+ { be_const_key(dac_voltage, -1), be_const_func(gp_dac_voltage) },
+ { be_const_key(digital_read, 3), be_const_func(gp_digital_read) },
};
static be_define_const_map(
m_libgpio_map,
- 270
+ 7
);
static be_define_const_module(
diff --git a/lib/libesp32/Berry/generate/be_fixed_persist.h b/lib/libesp32/Berry/generate/be_fixed_persist.h
deleted file mode 100644
index 4cea6af1d..000000000
--- a/lib/libesp32/Berry/generate/be_fixed_persist.h
+++ /dev/null
@@ -1,17 +0,0 @@
-#include "be_constobj.h"
-
-static be_define_const_map_slots(m_libpersist_map) {
- { be_const_key(init, -1), be_const_closure(_anonymous__closure) },
-};
-
-static be_define_const_map(
- m_libpersist_map,
- 1
-);
-
-static be_define_const_module(
- m_libpersist,
- "persist"
-);
-
-BE_EXPORT_VARIABLE be_define_const_native_module(persist);
diff --git a/lib/libesp32/Berry/generate/be_fixed_tasmota_path.h b/lib/libesp32/Berry/generate/be_fixed_tasmota_path.h
index 4689021c4..90ae43054 100644
--- a/lib/libesp32/Berry/generate/be_fixed_tasmota_path.h
+++ b/lib/libesp32/Berry/generate/be_fixed_tasmota_path.h
@@ -1,13 +1,15 @@
#include "be_constobj.h"
static be_define_const_map_slots(m_libpath_map) {
- { be_const_key(exists, -1), be_const_func(m_path_exists) },
- { be_const_key(last_modified, 0), be_const_func(m_path_last_modified) },
+ { be_const_key(listdir, -1), be_const_func(m_path_listdir) },
+ { be_const_key(last_modified, 2), be_const_func(m_path_last_modified) },
+ { be_const_key(exists, 3), be_const_func(m_path_exists) },
+ { be_const_key(remove, -1), be_const_func(m_path_remove) },
};
static be_define_const_map(
m_libpath_map,
- 2
+ 4
);
static be_define_const_module(
diff --git a/lib/libesp32/Berry/src/be_class.c b/lib/libesp32/Berry/src/be_class.c
index a6b94a1cf..c8c826371 100644
--- a/lib/libesp32/Berry/src/be_class.c
+++ b/lib/libesp32/Berry/src/be_class.c
@@ -217,18 +217,18 @@ static binstance* newobject(bvm *vm, bclass *c)
/* Instanciate new instance from stack with argc parameters */
/* Pushes the constructor on the stack to be executed if a construtor is found */
/* Returns true if a constructor is found */
-bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc, int mode)
+bbool be_class_newobj(bvm *vm, bclass *c, int32_t pos, int argc, int mode)
{
bvalue init;
- size_t pos = reg - vm->reg;
binstance *obj = newobject(vm, c); /* create empty object hierarchy from class hierarchy */
- reg = vm->reg + pos - mode; /* the stack may have changed, mode=1 when class is instanciated from module #104 */
- var_setinstance(reg, obj);
- var_setinstance(reg + mode, obj); /* copy to reg and reg+1 if mode==1 */
+ // reg = vm->reg + pos - mode; /* the stack may have changed, mode=1 when class is instanciated from module #104 */
+ var_setinstance(vm->reg + pos, obj);
+ var_setinstance(vm->reg + pos - mode, obj); /* copy to reg and reg+1 if mode==1 */
/* find constructor */
obj = instance_member(vm, obj, str_literal(vm, "init"), &init);
if (obj && var_type(&init) != MT_VARIABLE) {
/* copy argv */
+ bvalue * reg;
for (reg = vm->reg + pos + 1; argc > 0; --argc) {
reg[argc] = reg[argc - 2];
}
diff --git a/lib/libesp32/Berry/src/be_class.h b/lib/libesp32/Berry/src/be_class.h
index 6a114f53b..8bc0a6af7 100644
--- a/lib/libesp32/Berry/src/be_class.h
+++ b/lib/libesp32/Berry/src/be_class.h
@@ -58,7 +58,7 @@ void be_prim_method_bind(bvm *vm, bclass *c, bstring *name, bntvfunc f);
void be_closure_method_bind(bvm *vm, bclass *c, bstring *name, bclosure *cl);
int be_class_closure_count(bclass *c);
void be_class_upvalue_init(bvm *vm, bclass *c);
-bbool be_class_newobj(bvm *vm, bclass *c, bvalue *argv, int argc, int mode);
+bbool be_class_newobj(bvm *vm, bclass *c, int32_t pos, int argc, int mode);
int be_instance_member_simple(bvm *vm, binstance *obj, bstring *name, bvalue *dst);
int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst);
int be_class_member(bvm *vm, bclass *obj, bstring *name, bvalue *dst);
diff --git a/lib/libesp32/Berry/src/be_solidifylib.c b/lib/libesp32/Berry/src/be_solidifylib.c
index 7ed14c601..d72e3aff5 100644
--- a/lib/libesp32/Berry/src/be_solidifylib.c
+++ b/lib/libesp32/Berry/src/be_solidifylib.c
@@ -243,7 +243,9 @@ static void m_solidify_proto(bvm *vm, bproto *pr, const char * func_name, int bu
}
logfmt("%*s(be_nested_const_str(\"%s\", %i, %i)),\n", indent, "", str(pr->name), be_strhash(pr->name), str_len(pr->name));
- logfmt("%*s(be_nested_const_str(\"%s\", %i, %i)),\n", indent, "", func_source, be_strhash(pr->source), str_len(pr->source));
+ // logfmt("%*s(be_nested_const_str(\"%s\", %i, %i)),\n", indent, "", func_source, be_strhash(pr->source), str_len(pr->source));
+ // hard-code source as "input" for solidified
+ logfmt("%*s((bstring*) &be_const_str_input),\n", indent, "");
logfmt("%*s( &(const binstruction[%2d]) { /* code */\n", indent, "", pr->codesize);
for (int pc = 0; pc < pr->codesize; pc++) {
@@ -388,7 +390,7 @@ static void m_solidify_module(bvm *vm, bmodule *ml, int builtins)
logfmt(" NULL,\n");
}
logfmt(");\n");
- logfmt("BE_EXPORT_VARIABLE be_define_const_native_module(%s, NULL);\n", module_name);
+ logfmt("BE_EXPORT_VARIABLE be_define_const_native_module(%s);\n", module_name);
logfmt("/********************************************************************/\n");
}
diff --git a/lib/libesp32/Berry/src/be_vm.c b/lib/libesp32/Berry/src/be_vm.c
index 83d1d5cfb..ac2ede585 100644
--- a/lib/libesp32/Berry/src/be_vm.c
+++ b/lib/libesp32/Berry/src/be_vm.c
@@ -142,7 +142,7 @@
_vm->cf->status = PRIM_FUNC; \
}
-static void prep_closure(bvm *vm, bvalue *reg, int argc, int mode);
+static void prep_closure(bvm *vm, int32_t pos, int argc, int mode);
static void attribute_error(bvm *vm, const char *t, bvalue *b, bvalue *c)
{
@@ -1062,10 +1062,11 @@ newframe: /* a new call frame */
++var, --argc, mode = 1;
goto recall;
case BE_CLASS:
- if (be_class_newobj(vm, var_toobj(var), var, ++argc, mode)) { /* instanciate object and find constructor */
+ if (be_class_newobj(vm, var_toobj(var), var - reg, ++argc, mode)) { /* instanciate object and find constructor */
reg = vm->reg + mode; /* constructor found */
mode = 0;
var = RA() + 1; /* to next register */
+ reg = vm->reg;
goto recall; /* call constructor */
}
break;
@@ -1101,7 +1102,7 @@ newframe: /* a new call frame */
// *(reg + proto->argc - 1) = *(vm->top-2); /* change the vararg argument to now contain the list instance */
// vm->top = top_save; /* restore top of stack pointer */
// }
- prep_closure(vm, var, argc, mode);
+ prep_closure(vm, var - reg, argc, mode);
reg = vm->reg; /* `reg` has changed, now new base register */
goto newframe; /* continue execution of the closure */
}
@@ -1163,14 +1164,13 @@ newframe: /* a new call frame */
}
}
-static void prep_closure(bvm *vm, bvalue *reg, int argc, int mode)
+static void prep_closure(bvm *vm, int32_t pos, int argc, int mode)
{
bvalue *v, *end;
- bproto *proto = var2cl(reg)->proto;
- push_closure(vm, reg, proto->nstack, mode);
- v = vm->reg + argc;
+ bproto *proto = var2cl(vm->reg + pos)->proto;
+ push_closure(vm, vm->reg + pos, proto->nstack, mode);
end = vm->reg + proto->argc;
- for (; v <= end; ++v) {
+ for (v = vm->reg + argc; v <= end; ++v) {
var_setnil(v);
}
if (proto->varg) { /* there are vararg at the last argument, build the list */
@@ -1189,7 +1189,7 @@ static void prep_closure(bvm *vm, bvalue *reg, int argc, int mode)
}
}
-static void do_closure(bvm *vm, bvalue *reg, int argc)
+static void do_closure(bvm *vm, int32_t pos, int argc)
{
// bvalue *v, *end;
// bproto *proto = var2cl(reg)->proto;
@@ -1199,31 +1199,31 @@ static void do_closure(bvm *vm, bvalue *reg, int argc)
// for (; v <= end; ++v) {
// var_setnil(v);
// }
- prep_closure(vm, reg, argc, 0);
+ prep_closure(vm, pos, argc, 0);
vm_exec(vm);
}
-static void do_ntvclos(bvm *vm, bvalue *reg, int argc)
+static void do_ntvclos(bvm *vm, int32_t pos, int argc)
{
- bntvclos *f = var_toobj(reg);
- push_native(vm, reg, argc, 0);
+ bntvclos *f = var_toobj(vm->reg + pos);
+ push_native(vm, vm->reg + pos, argc, 0);
f->f(vm); /* call C primitive function */
ret_native(vm);
}
-static void do_ntvfunc(bvm *vm, bvalue *reg, int argc)
+static void do_ntvfunc(bvm *vm, int32_t pos, int argc)
{
- bntvfunc f = var_tontvfunc(reg);
- push_native(vm, reg, argc, 0);
+ bntvfunc f = var_tontvfunc(vm->reg + pos);
+ push_native(vm, vm->reg + pos, argc, 0);
f(vm); /* call C primitive function */
ret_native(vm);
}
-static void do_class(bvm *vm, bvalue *reg, int argc)
+static void do_class(bvm *vm, int32_t pos, int argc)
{
- if (be_class_newobj(vm, var_toobj(reg), reg, ++argc, 0)) {
+ if (be_class_newobj(vm, var_toobj(vm->reg + pos), pos, ++argc, 0)) {
be_incrtop(vm);
- be_dofunc(vm, reg + 1, argc);
+ be_dofunc(vm, vm->reg + pos + 1, argc);
be_stackpop(vm, 1);
}
}
@@ -1232,11 +1232,12 @@ void be_dofunc(bvm *vm, bvalue *v, int argc)
{
be_assert(vm->reg <= v && v < vm->stacktop);
be_assert(vm->stack <= vm->reg && vm->reg < vm->stacktop);
+ int32_t pos = v - vm->reg;
switch (var_type(v)) {
- case BE_CLASS: do_class(vm, v, argc); break;
- case BE_CLOSURE: do_closure(vm, v, argc); break;
- case BE_NTVCLOS: do_ntvclos(vm, v, argc); break;
- case BE_NTVFUNC: do_ntvfunc(vm, v, argc); break;
+ case BE_CLASS: do_class(vm, pos, argc); break;
+ case BE_CLOSURE: do_closure(vm, pos, argc); break;
+ case BE_NTVCLOS: do_ntvclos(vm, pos, argc); break;
+ case BE_NTVFUNC: do_ntvfunc(vm, pos, argc); break;
default: call_error(vm, v);
}
}
diff --git a/lib/libesp32/Zip-readonly-FS/library.json b/lib/libesp32/Zip-readonly-FS/library.json
new file mode 100644
index 000000000..a8c83f81b
--- /dev/null
+++ b/lib/libesp32/Zip-readonly-FS/library.json
@@ -0,0 +1,14 @@
+{
+ "name": "Zip-readonly-FS",
+ "version": "1.0",
+ "description": "Simple filesystem to open an uncompressed ZIP file and read-only",
+ "license": "MIT",
+ "homepage": "https://github.com/arendst/Tasmota",
+ "frameworks": "*",
+ "platforms": "*",
+ "authors":
+ {
+ "name": "Stephan Hadinger",
+ "maintainer": true
+ }
+ }
diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp
new file mode 100644
index 000000000..a7282c128
--- /dev/null
+++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp
@@ -0,0 +1,463 @@
+/*
+ ZipReadFS.cpp - FS overlay to read uncompressed ZIP files
+
+ Copyright (C) 2021 Stephan Hadinger
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef ESP32
+
+#include "ZipReadFS.h"
+
+extern FS *zip_ufsp;
+
+#define USE_TASMOTA_LOG
+
+#ifdef USE_TASMOTA_LOG
+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};
+#endif
+
+/********************************************************************
+** Convert DOS time to time_t
+** from: https://opensource.apple.com/source/gcc3/gcc3-1161/fastjar/dostime.c
+********************************************************************/
+time_t dos2unixtime(uint32_t dostime)
+ /* Return the Unix time_t value (GMT/UTC time) for the DOS format (local)
+ * time dostime, where dostime is a four byte value (date in most
+ * significant word, time in least significant word), see dostime()
+ * function.
+ */
+{
+ struct tm *t; /* argument for mktime() */
+ time_t clock = time(NULL);
+
+ t = localtime(&clock);
+ t->tm_isdst = -1; /* let mktime() determine if DST is in effect */
+ /* Convert DOS time to UNIX time_t format */
+ t->tm_sec = (((int)dostime) << 1) & 0x3e;
+ t->tm_min = (((int)dostime) >> 5) & 0x3f;
+ t->tm_hour = (((int)dostime) >> 11) & 0x1f;
+ t->tm_mday = (int)(dostime >> 16) & 0x1f;
+ t->tm_mon = ((int)(dostime >> 21) & 0x0f) - 1;
+ t->tm_year = ((int)(dostime >> 25) & 0x7f) + 80;
+
+ return mktime(t);
+}
+
+/********************************************************************
+** Zip file parser
+**
+********************************************************************/
+template class LList;
+
+struct ZipHeader {
+ uint16_t padding; // need to offset by 16 bites so that 32 bits below are aligned to 4 bytes boundaries
+ uint16_t signature1;
+ uint16_t signature2;
+ uint16_t version;
+ uint16_t gen_purpose_flags;
+ uint16_t compression;
+ uint16_t last_mod_time;
+ uint16_t last_mod_date;
+ uint32_t crc32;
+ uint32_t size_compressed;
+ uint32_t size_uncompressed;
+ uint16_t filename_size;
+ uint16_t extra_field_size;
+};
+
+class ZipEntry {
+public:
+ ZipEntry() :
+ file_name(), file_start(0), file_len(0), last_mod(0)
+ {};
+ // ZipEntry(const char * fname, uint32_t start, uint32_t len) :
+ // file_name(fname), file_start(start), file_len(len)
+ // {};
+
+ String file_name; // name of the file as used by Berry, with all directories removed
+ uint32_t file_start; // offset in bytes where this file starts in the archive
+ uint32_t file_len; // length in bytes of the file
+ time_t last_mod;
+};
+
+class ZipArchive {
+public:
+ ZipArchive(File * _f) :
+ f(_f), entries()
+ {};
+ ~ZipArchive(void) {
+ f->close(); // TODO
+ }
+
+ bool parse(void);
+
+ File * f;
+ LList entries;
+};
+
+class ZipEntryFileImpl : public FileImpl {
+public:
+ ZipEntryFileImpl(File * f) : zip(f) { }
+
+protected:
+ ZipArchive zip;
+};
+
+/********************************************************************
+** Neutral file overlay
+**
+********************************************************************/
+
+class ZipReadFileImpl;
+typedef std::shared_ptr ZipReadFileImplPtr;
+
+class ZipReadFileImpl : public FileImpl {
+public:
+ ZipReadFileImpl(File f) { _f = f; }
+ virtual ~ZipReadFileImpl() {}
+ size_t write(const uint8_t *buf, size_t size) {
+ return _f.write(buf, size);
+ }
+ size_t read(uint8_t* buf, size_t size) {
+ return _f.read(buf, size);
+ }
+ void flush() {
+ _f.flush();
+ }
+ bool seek(uint32_t pos, SeekMode mode) {
+ return _f.seek(pos, mode);
+ }
+ size_t position() const {
+ return _f.position();
+ }
+ size_t size() const {
+ return _f.size();
+ }
+ void close() {
+ _f.close();
+ }
+ time_t getLastWrite() {
+ return _f.getLastWrite();
+ }
+ const char* path() const {
+ return _f.path();
+ }
+ const char* name() const {
+ return _f.name();
+ }
+ boolean isDirectory(void) {
+ return _f.isDirectory();
+ }
+ FileImplPtr openNextFile(const char* mode) {
+ return nullptr; // TODO
+ }
+ void rewindDirectory(void) {
+ return _f.rewindDirectory();
+ }
+ operator bool() {
+ return (bool) _f;
+ }
+
+protected:
+ File _f;
+};
+
+/********************************************************************
+** Subfile implementation
+**
+** Takes a `File` object of the ZIP archive
+** First byte in archive and len
+********************************************************************/
+
+class ZipItemImpl;
+typedef std::shared_ptr ZipItemImplPtr;
+
+class ZipItemImpl : public FileImpl {
+public:
+
+ ZipItemImpl(File f, uint32_t first_byte, uint32_t len, time_t last_mod) {
+ _f = f;
+ _first_byte = first_byte;
+ _len = len;
+ _seek = 0;
+ _last_mod = last_mod;
+ }
+
+ virtual ~ZipItemImpl() {}
+
+ size_t write(const uint8_t *buf, size_t size) {
+ return 0; // not accepted
+ }
+
+ size_t read(uint8_t* buf, size_t size) {
+ // AddLog(LOG_LEVEL_DEBUG, "ZIP: read bytes=%i seek=%i len=%i", size, _seek, _len);
+ if (_seek < _len) {
+ if (size + _seek > _len) {
+ size = _len - _seek; // always > 0 because of guarding test
+ }
+ bool bret = _f.seek(_first_byte + _seek, SeekSet);
+ // AddLog(LOG_LEVEL_DEBUG, "ZIP: seek_ret ret=%i zip_seek=%i", bret, _first_byte + _seek);
+ if (bret) {
+ size_t ret = _f.read(buf, size);
+ // AddLog(LOG_LEVEL_DEBUG, "ZIP: read done ret=%i zip_seek=%i", ret, size);
+ _seek += ret;
+ if (_seek > _len) { _seek = _len; }
+ return ret;
+ }
+ }
+ return 0; // abort
+ }
+
+ void flush() {
+ // do nothing
+ }
+
+ bool seek(uint32_t pos, SeekMode mode) {
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: seek pos=%i mode=%i", pos, mode);
+ if (SeekSet == mode) {
+ if (pos <= _len) {
+ _seek = pos;
+ return true;
+ }
+ } else if (SeekCur == mode) {
+ if (_seek + pos <= _len) {
+ _seek += pos;
+ return true;
+ }
+ } else if (SeekEnd == mode) {
+ _seek = _len;
+ return true;
+ }
+ return false;
+ }
+
+ size_t position() const {
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: position return=%i", _seek);
+ return _seek;
+ }
+
+ size_t size() const {
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: size return=%i", _len);
+ return _len;
+ }
+
+ void close() {
+ // do nothing
+ }
+ time_t getLastWrite() {
+ return _last_mod;
+ }
+
+ const char* path() const {
+ return _f.path(); // TODO
+ }
+
+ const char* name() const {
+ return _f.name(); // TODO
+ }
+
+ boolean isDirectory(void) {
+ return false; // no directory allowed
+ }
+
+ FileImplPtr openNextFile(const char* mode) {
+ return nullptr; // TODO
+ }
+
+ void rewindDirectory(void) {
+ // ignore
+ }
+
+ operator bool() {
+ return true;
+ }
+
+protected:
+ File _f;
+ uint32_t _first_byte;
+ uint32_t _len;
+ uint32_t _seek;
+ time_t _last_mod;
+};
+
+/********************************************************************
+** Zip file parser
+** Implementation
+********************************************************************/
+
+// parse the Zip archive to extract all entries
+// returns true if ok
+bool ZipArchive::parse(void) {
+ ZipHeader header;
+ f->seek(0); // start of file
+ int32_t offset = 0;
+ const size_t zip_header_size = sizeof(header) - sizeof(header.padding);
+
+ while (1) {
+ f->seek(offset);
+ int32_t bytes_read = f->read(sizeof(header.padding) + (uint8_t*) &header, zip_header_size);
+ if (bytes_read != zip_header_size) {
+ break;
+ }
+ // AddLog(LOG_LEVEL_DEBUG, "ZIG: header version=%i flags=%p compress=%i mod_time=%i mod_date=%i size=%i-%i fnamesize=%i",
+ // header.version, header.gen_purpose_flags, header.compression, header.last_mod_time, header.last_mod_date,
+ // header.size_compressed, header.size_uncompressed, header.filename_size);
+ // Check signature
+ if (header.signature1 != 0x4B50) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: invalid zip signature");
+ return false;
+ }
+ if (header.signature2 != 0x0403) {
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: end of file section");
+ break;
+ }
+ // Check no extra field
+ if (header.gen_purpose_flags != 0x0000) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: invalid general purpose flags 0x%04X", header.gen_purpose_flags);
+ return false;
+ }
+ // Check no compression
+ if (header.compression != 0x0000) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: compressed files unsupported 0x%04X", header.compression);
+ return false;
+ }
+ // Check size is the same for compressed and uncompressed
+ if (header.size_compressed != header.size_uncompressed) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: compressed size differs from uncompressed %i - %i", header.size_compressed, header.size_uncompressed);
+ return false;
+ }
+ // Check file name size
+ if (header.filename_size > 64) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: entry filename size too long %i", header.filename_size);
+ return false;
+ }
+
+ // read full filename
+ char fname[header.filename_size + 1];
+ if (f->read((uint8_t*) &fname[0], header.filename_size) != header.filename_size) {
+ return false;
+ }
+ fname[header.filename_size] = 0; // add NULL termination
+
+ // Remove any directory names, and keep only what's after the last `/``
+ char * fname_suffix;
+ char * saveptr;
+ fname_suffix = strtok_r(&fname[0], "#", &saveptr);
+ char * res = fname_suffix;
+ while (res) {
+ res = strtok_r(nullptr, "#", &saveptr);
+ if (res) { fname_suffix = res; }
+ }
+ offset += zip_header_size + header.filename_size + header.extra_field_size;
+
+ ZipEntry & entry = entries.addToLast();
+ entry.file_name = fname_suffix;
+ entry.file_start = offset;
+ entry.file_len = header.size_uncompressed;
+ entry.last_mod = dos2unixtime((header.last_mod_date << 16) | header.last_mod_time);
+ offset += header.size_uncompressed;
+
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: found file '%s' (%i bytes - offset %i) - next entry %i", &fname[0], header.size_uncompressed, entry.file_start, offset);
+ }
+
+ return true;
+}
+
+
+/********************************************************************
+** Encapsulation of FS and File to piggyback on Arduino
+**
+********************************************************************/
+
+FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool create) {
+ if (*_fs == nullptr) { return nullptr; }
+
+ if (strchr(path, '#')) {
+ // we don't support any other mode than "r" and no-create
+ if (strcmp(mode, "r") != 0 || create) {
+ AddLog(LOG_LEVEL_INFO, "ZIP: writing to zip is not supported");
+ return ZipReadFileImplPtr(); // return an error
+ }
+ // treat as a ZIP archive
+ char sub_path[strlen(path)+1];
+ strcpy(sub_path, path);
+
+ // extract the suffix
+ char *tok;
+ char *prefix = strtok_r(sub_path, "#", &tok);
+ char *suffix = strtok_r(NULL, "", &tok);
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: prefix=%s suffix=%s", prefix, suffix);
+ // parse ZIP archive
+ File zipfile = (*_fs)->open(prefix, "r", false);
+ if ((bool)zipfile) {
+ // we could read the file
+ ZipArchive zip_archive = ZipArchive(&zipfile);
+ zip_archive.parse();
+
+ for (auto & entry : zip_archive.entries) {
+ if (entry.file_name.equals(suffix)) {
+ // found
+ AddLog(LOG_LEVEL_DEBUG, "ZIP: file '%s' in archive (start=%i - len=%i - last_mod=%i)", suffix, entry.file_start, entry.file_len, entry.last_mod);
+ return ZipItemImplPtr(new ZipItemImpl((*_fs)->open(prefix, "r", false), entry.file_start, entry.file_len, entry.last_mod));
+ }
+ }
+ return ZipReadFileImplPtr(); // return an error
+ } else {
+ AddLog(LOG_LEVEL_INFO, "ZIP: could not open '%s'", prefix);
+ return ZipReadFileImplPtr(); // return an error
+ }
+ } else {
+ // simple file, do nothing
+ return ZipReadFileImplPtr(new ZipReadFileImpl((*_fs)->open(path, mode, create)));
+ }
+}
+
+bool ZipReadFSImpl::exists(const char* path) {
+ if (*_fs == nullptr) { return false; }
+
+ if (strchr(path, '#')) {
+ // treat as a ZIP archive
+ char sub_path[strlen(path)+1];
+ strcpy(sub_path, path);
+
+ // extract the suffix
+ char *tok;
+ char *prefix = strtok_r(sub_path, "#", &tok);
+ char *suffix = strtok_r(NULL, "", &tok);
+ // parse ZIP archive
+ File zipfile = (*_fs)->open(prefix, "r", false);
+ if ((bool)zipfile) {
+ // we could read the file
+ ZipArchive zip_archive = ZipArchive(&zipfile);
+ zip_archive.parse();
+
+ for (auto & entry : zip_archive.entries) {
+ if (entry.file_name.equals(suffix)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ } else {
+ // simple file, do nothing
+ return (*_fs)->exists(path);
+ }
+}
+
+ZipReadFSImpl::~ZipReadFSImpl() {};
+
+#endif // ESP32
\ No newline at end of file
diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h
new file mode 100644
index 000000000..ff0e2f997
--- /dev/null
+++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h
@@ -0,0 +1,67 @@
+
+#ifndef __ZIP_READ_FS__
+#define __ZIP_READ_FS__
+
+#include
+
+#ifdef ESP32
+
+#include
+#include
+#include
+
+class ZipReadFSImpl;
+typedef std::shared_ptr ZipReadFSImplPtr;
+
+
+class ZipReadFSImpl : public FSImpl {
+public:
+
+ ZipReadFSImpl(FS **fs) : _fs(fs) {};
+ virtual ~ZipReadFSImpl();
+
+ FileImplPtr open(const char* path, const char* mode, const bool create);
+
+ bool exists(const char* path);
+
+ bool rename(const char* pathFrom, const char* pathTo) {
+ if (*_fs) {
+ return (*_fs)->rename(pathFrom, pathTo);
+ } else {
+ return false;
+ }
+ }
+ bool remove(const char* path) {
+ if (*_fs) {
+ return (*_fs)->remove(path);
+ } else {
+ return false;
+ }
+ }
+ bool mkdir(const char *path) {
+ if (*_fs) {
+ return (*_fs)->mkdir(path);
+ } else {
+ return false;
+ }
+ }
+ bool rmdir(const char *path) {
+ if (*_fs) {
+ return (*_fs)->rmdir(path);
+ } else {
+ return false;
+ }
+ }
+ void mountpoint(const char *) {
+ };
+ const char * mountpoint() {
+ return nullptr;
+ }
+
+private:
+ FS **_fs;
+};
+
+#endif // ESP32
+
+#endif // __ZIP_READ_FS__
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/esp_mfi_debug.h b/lib/libesp32_div/ESP32-HomeKit/src/esp_mfi_debug.h
index 4c0ae62ee..282276e9d 100644
--- a/lib/libesp32_div/ESP32-HomeKit/src/esp_mfi_debug.h
+++ b/lib/libesp32_div/ESP32-HomeKit/src/esp_mfi_debug.h
@@ -35,12 +35,12 @@ extern "C"{
#define ESP_MFI_DEBUG_FL "\n"
#define CONFIG_ESP_MFI_DEBUG_ENABLE
#ifdef CONFIG_ESP_MFI_DEBUG_ENABLE
-#define ESP_MFI_DEBUG_ENABLE
+// #define ESP_MFI_DEBUG_ENABLE
#endif /* CONFIG_ESP_MFI_DEBUG_ENABLE */
#define CONFIG_ESP_MFI_ASSERT
#ifdef CONFIG_ESP_MFI_ASSERT
-#define ESP_MFI_ASSERT_ENABLE
+// #define ESP_MFI_ASSERT_ENABLE
#endif /* CONFIG_ESP_MFI_ASSERT */
#define CONFIG_MFI_DEBUG_LEVEL_INIT 0
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.h b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.h
index 5ead8cc6f..b6d6f1c1f 100644
--- a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.h
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.h
@@ -13,68 +13,8 @@
// limitations under the License.
#pragma once
-#include_next "mbedtls/bignum.h"
-#include "sdkconfig.h"
-
-/**
- * This is a wrapper for the main mbedtls/bignum.h. This wrapper
- * provides a few additional ESP32-only functions.
- *
- * This is because we don't set MBEDTLS_BIGNUM_ALT in the same way we
- * do for AES, SHA, etc. Because we still use most of the bignum.h
- * implementation and just replace a few hardware accelerated
- * functions (see MBEDTLS_MPI_EXP_MOD_ALT & MBEDTLS_MPI_MUL_MPI_ALT in
- * esp_config.h).
- *
- * @note Unlike the other hardware accelerator support functions in esp32/hwcrypto, there is no
- * generic "hwcrypto/bignum.h" header for using these functions without mbedTLS. The reason for this
- * is that all of the function implementations depend strongly upon the mbedTLS MPI implementation.
- */
-
-/**
- * @brief Lock access to RSA Accelerator (MPI/bignum operations)
- *
- * RSA Accelerator hardware unit can only be used by one
- * consumer at a time.
- *
- * @note This function is non-recursive (do not call it twice from the
- * same task.)
- *
- * @note You do not need to call this if you are using the mbedTLS bignum.h
- * API or esp_mpi_xxx functions. This function is only needed if you
- * want to call ROM RSA functions or access the registers directly.
- *
- */
-void esp_mpi_acquire_hardware(void);
-
-/**
- * @brief Unlock access to RSA Accelerator (MPI/bignum operations)
- *
- * Has to be called once for each call to esp_mpi_acquire_hardware().
- *
- * @note You do not need to call this if you are using the mbedTLS bignum.h
- * API or esp_mpi_xxx functions. This function is only needed if you
- * want to call ROM RSA functions or access the registers directly.
- */
-void esp_mpi_release_hardware(void);
-
-//#if CONFIG_MBEDTLS_HARDWARE_MPI
-
-/* @brief MPI modular mupltiplication function
- *
- * Calculates Z = (X * Y) mod M using MPI hardware acceleration.
- *
- * This is not part of the standard mbedTLS bignum API.
- *
- * @note All of X, Y & Z should be less than 4096 bit long or an error is returned.
- *
- * @param Z Result bignum, should be pre-initialised with mbedtls_mpi_init().
- * @param X First multiplication argument.
- * @param Y Second multiplication argument.
- * @param M Modulus value for result.
- *
- * @return 0 on success, mbedTLS MPI error codes on failure.
- */
-int esp_mpi_mul_mpi_mod(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M);
-
-//#endif // CONFIG_MBEDTLS_HARDWARE_MPI
+#if CONFIG_IDF_TARGET_ESP32
+#include "bignum_ESP32.h"
+#elif CONFIG_IDF_TARGET_ESP32C3
+#include "bignum_ESP32_C3.h"
+#endif
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.c b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.c
similarity index 98%
rename from lib/libesp32_div/ESP32-HomeKit/src/port/bignum.c
rename to lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.c
index 5fab344e5..1a63ffe7f 100644
--- a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum.c
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.c
@@ -21,6 +21,7 @@
*
*/
+#if CONFIG_IDF_TARGET_ESP32
#if __has_include("esp_idf_version.h")
#include "esp_idf_version.h"
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0)
@@ -35,6 +36,9 @@
#include "bignum_impl.h"
#include
#include
+#if CONFIG_IDF_TARGET_ESP32C3
+#include "esp32c3/dport_access.h"
+#endif
static _lock_t mpi_lock;
@@ -284,3 +288,4 @@ void esp_mpi_mult_mpi_failover_mod_mult_hw_op(const mbedtls_mpi *X, const mbedtl
start_op(RSA_MULT_START_REG);
}
+#endif //CONFIG_IDF_TARGET_ESP32
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.h b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.h
new file mode 100644
index 000000000..90c3325b5
--- /dev/null
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32.h
@@ -0,0 +1,82 @@
+// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#if CONFIG_IDF_TARGET_ESP32
+#pragma once
+
+#include_next "mbedtls/bignum.h"
+#include "sdkconfig.h"
+
+/**
+ * This is a wrapper for the main mbedtls/bignum.h. This wrapper
+ * provides a few additional ESP32-only functions.
+ *
+ * This is because we don't set MBEDTLS_BIGNUM_ALT in the same way we
+ * do for AES, SHA, etc. Because we still use most of the bignum.h
+ * implementation and just replace a few hardware accelerated
+ * functions (see MBEDTLS_MPI_EXP_MOD_ALT & MBEDTLS_MPI_MUL_MPI_ALT in
+ * esp_config.h).
+ *
+ * @note Unlike the other hardware accelerator support functions in esp32/hwcrypto, there is no
+ * generic "hwcrypto/bignum.h" header for using these functions without mbedTLS. The reason for this
+ * is that all of the function implementations depend strongly upon the mbedTLS MPI implementation.
+ */
+
+/**
+ * @brief Lock access to RSA Accelerator (MPI/bignum operations)
+ *
+ * RSA Accelerator hardware unit can only be used by one
+ * consumer at a time.
+ *
+ * @note This function is non-recursive (do not call it twice from the
+ * same task.)
+ *
+ * @note You do not need to call this if you are using the mbedTLS bignum.h
+ * API or esp_mpi_xxx functions. This function is only needed if you
+ * want to call ROM RSA functions or access the registers directly.
+ *
+ */
+void esp_mpi_acquire_hardware(void);
+
+/**
+ * @brief Unlock access to RSA Accelerator (MPI/bignum operations)
+ *
+ * Has to be called once for each call to esp_mpi_acquire_hardware().
+ *
+ * @note You do not need to call this if you are using the mbedTLS bignum.h
+ * API or esp_mpi_xxx functions. This function is only needed if you
+ * want to call ROM RSA functions or access the registers directly.
+ */
+void esp_mpi_release_hardware(void);
+
+//#if CONFIG_MBEDTLS_HARDWARE_MPI
+
+/* @brief MPI modular mupltiplication function
+ *
+ * Calculates Z = (X * Y) mod M using MPI hardware acceleration.
+ *
+ * This is not part of the standard mbedTLS bignum API.
+ *
+ * @note All of X, Y & Z should be less than 4096 bit long or an error is returned.
+ *
+ * @param Z Result bignum, should be pre-initialised with mbedtls_mpi_init().
+ * @param X First multiplication argument.
+ * @param Y Second multiplication argument.
+ * @param M Modulus value for result.
+ *
+ * @return 0 on success, mbedTLS MPI error codes on failure.
+ */
+int esp_mpi_mul_mpi_mod(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M);
+
+//#endif // CONFIG_MBEDTLS_HARDWARE_MPI
+#endif CONFIG_IDF_TARGET_ESP32
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.c b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.c
new file mode 100644
index 000000000..a96d514b9
--- /dev/null
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.c
@@ -0,0 +1,108 @@
+/**
+ * \brief Multi-precision integer library, ESP-IDF hardware accelerated parts
+ *
+ * based on mbedTLS implementation
+ *
+ * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
+ * Additions Copyright (C) 2016-2020, Espressif Systems (Shanghai) PTE Ltd
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#if CONFIG_IDF_TARGET_ESP32C3
+#if __has_include("esp_idf_version.h")
+#include "esp_idf_version.h"
+#endif
+
+#include
+#include "soc/hwcrypto_periph.h"
+#include "driver/periph_ctrl.h"
+#include "mbedtls/bignum.h"
+#include "bignum_impl.h"
+#include "soc/system_reg.h"
+#include "soc/periph_defs.h"
+#include "esp_crypto_lock.h"
+
+/* Copy mbedTLS MPI bignum 'mpi' to hardware memory block at 'mem_base'.
+
+ If hw_words is higher than the number of words in the bignum then
+ these additional words will be zeroed in the memory buffer.
+
+*/
+static inline void mpi_to_mem_block(uint32_t mem_base, const mbedtls_mpi *mpi, size_t num_words)
+{
+ uint32_t *pbase = (uint32_t *)mem_base;
+ uint32_t copy_words = MIN(num_words, mpi->n);
+
+ /* Copy MPI data to memory block registers */
+ for (int i = 0; i < copy_words; i++) {
+ pbase[i] = mpi->p[i];
+ }
+
+ /* Zero any remaining memory block data */
+ for (int i = copy_words; i < num_words; i++) {
+ pbase[i] = 0;
+ }
+}
+
+/* Read mbedTLS MPI bignum back from hardware memory block.
+
+ Reads num_words words from block.
+
+ Bignum 'x' should already be grown to at least num_words by caller (can be done while
+ calculation is in progress, to save some cycles)
+*/
+static inline void mem_block_to_mpi(mbedtls_mpi *x, uint32_t mem_base, int num_words)
+{
+
+ /* Copy data from memory block registers */
+ const size_t REG_WIDTH = sizeof(uint32_t);
+ for (size_t i = 0; i < num_words; i++) {
+ x->p[i] = REG_READ(mem_base + (i * REG_WIDTH));
+ }
+ /* Zero any remaining limbs in the bignum, if the buffer is bigger
+ than num_words */
+ for (size_t i = num_words; i < x->n; i++) {
+ x->p[i] = 0;
+ }
+
+}
+
+/* Begin an RSA operation. op_reg specifies which 'START' register
+ to write to.
+*/
+static inline void start_op(uint32_t op_reg)
+{
+ /* Clear interrupt status */
+ REG_WRITE(RSA_CLEAR_INTERRUPT_REG, 1);
+
+ /* Note: above REG_WRITE includes a memw, so we know any writes
+ to the memory blocks are also complete. */
+
+ REG_WRITE(op_reg, 1);
+}
+
+/* Wait for an RSA operation to complete.
+*/
+static inline void wait_op_complete(void)
+{
+ while (REG_READ(RSA_QUERY_INTERRUPT_REG) != 1)
+ { }
+
+ /* clear the interrupt */
+ REG_WRITE(RSA_CLEAR_INTERRUPT_REG, 1);
+}
+
+#endif //CONFIG_IDF_TARGET_ESP32C3
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.h b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.h
new file mode 100644
index 000000000..333615c3f
--- /dev/null
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_ESP32_C3.h
@@ -0,0 +1,87 @@
+// Copyright 2015-2020 Espressif Systems (Shanghai) PTE LTD
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#if CONFIG_IDF_TARGET_ESP32C3
+#pragma once
+
+#include_next "mbedtls/bignum.h"
+#include "sdkconfig.h"
+
+/**
+ * This is a wrapper for the main mbedtls/bignum.h. This wrapper
+ * provides a few additional ESP32-only functions.
+ *
+ * This is because we don't set MBEDTLS_BIGNUM_ALT in the same way we
+ * do for AES, SHA, etc. Because we still use most of the bignum.h
+ * implementation and just replace a few hardware accelerated
+ * functions (see MBEDTLS_MPI_EXP_MOD_ALT & MBEDTLS_MPI_MUL_MPI_ALT in
+ * esp_config.h).
+ *
+ * @note Unlike the other hardware accelerator support functions in esp32/hwcrypto, there is no
+ * generic "hwcrypto/bignum.h" header for using these functions without mbedTLS. The reason for this
+ * is that all of the function implementations depend strongly upon the mbedTLS MPI implementation.
+ */
+
+/**
+ * @brief Lock access to RSA Accelerator (MPI/bignum operations)
+ *
+ * RSA Accelerator hardware unit can only be used by one
+ * consumer at a time.
+ *
+ * @note This function is non-recursive (do not call it twice from the
+ * same task.)
+ *
+ * @note You do not need to call this if you are using the mbedTLS bignum.h
+ * API or esp_mpi_xxx functions. This function is only needed if you
+ * want to call ROM RSA functions or access the registers directly.
+ *
+ */
+void esp_mpi_acquire_hardware(void);
+
+/**
+ * @brief Unlock access to RSA Accelerator (MPI/bignum operations)
+ *
+ * Has to be called once for each call to esp_mpi_acquire_hardware().
+ *
+ * @note You do not need to call this if you are using the mbedTLS bignum.h
+ * API or esp_mpi_xxx functions. This function is only needed if you
+ * want to call ROM RSA functions or access the registers directly.
+ */
+void esp_mpi_release_hardware(void);
+
+//#if CONFIG_MBEDTLS_HARDWARE_MPI
+
+/* @brief MPI modular mupltiplication function
+ *
+ * Calculates Z = (X * Y) mod M using MPI hardware acceleration.
+ *
+ * This is not part of the standard mbedTLS bignum API.
+ *
+ * @note All of X, Y & Z should be less than 4096 bit long or an error is returned.
+ *
+ * @param Z Result bignum, should be pre-initialised with mbedtls_mpi_init().
+ * @param X First multiplication argument.
+ * @param Y Second multiplication argument.
+ * @param M Modulus value for result.
+ *
+ * @return 0 on success, mbedTLS MPI error codes on failure.
+ */
+int esp_mpi_mul_mpi_mod(mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M);
+
+void esp_mpi_mul_mpi_mod_hw_op(const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M, const mbedtls_mpi *Rinv, mbedtls_mpi_uint Mprime, size_t num_words);
+static inline void mpi_to_mem_block(uint32_t mem_base, const mbedtls_mpi *mpi, size_t num_words);
+void esp_mpi_mul_mpi_hw_op(const mbedtls_mpi *X, const mbedtls_mpi *Y, size_t num_words);
+
+
+//#endif // CONFIG_MBEDTLS_HARDWARE_MPI
+#endif //CONFIG_IDF_TARGET_ESP32C3
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_impl.h b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_impl.h
index 0c70fa339..20943499b 100644
--- a/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_impl.h
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/bignum_impl.h
@@ -10,7 +10,7 @@
exponentiation instead.
*/
-#define CONFIG_IDF_TARGET_ESP32 1
+// #define CONFIG_IDF_TARGET_ESP32 1
#if CONFIG_IDF_TARGET_ESP32
#define ESP_MPI_USE_MONT_EXP
@@ -19,7 +19,7 @@
//#define MBEDTLS_MPI_MUL_MPI_ALT
#endif
-
+#if CONFIG_IDF_TARGET_ESP32
int esp_mpi_exp_mod( mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M, mbedtls_mpi *_Rinv );
/**
@@ -86,7 +86,11 @@ int esp_mont_hw_op(mbedtls_mpi* Z, const mbedtls_mpi* X, const mbedtls_mpi* Y, c
*
*/
void esp_mpi_exp_mpi_mod_hw_op(const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M, const mbedtls_mpi *Rinv, mbedtls_mpi_uint Mprime, size_t hw_words);
-
+#endif //CONFIG_IDF_TARGET_ESP32
#endif //ESP_MPI_USE_MONT_EXP
+#if CONFIG_IDF_TARGET_ESP32C3
+void esp_mpi_exp_mpi_mod_hw_op(const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M, const mbedtls_mpi *Rinv, mbedtls_mpi_uint Mprime, size_t num_words);
+#endif //CONFIG_IDF_TARGET_ESP32C3
+
#endif
diff --git a/lib/libesp32_div/ESP32-HomeKit/src/port/esp_bignum.c b/lib/libesp32_div/ESP32-HomeKit/src/port/esp_bignum.c
index 44e0a798c..8d6936e60 100644
--- a/lib/libesp32_div/ESP32-HomeKit/src/port/esp_bignum.c
+++ b/lib/libesp32_div/ESP32-HomeKit/src/port/esp_bignum.c
@@ -79,7 +79,7 @@ static inline size_t bits_to_words(size_t bits)
/* Return the number of words actually used to represent an mpi
number.
*/
-#if defined(MBEDTLS_MPI_EXP_MOD_ALT)
+#if defined(MBEDTLS_MPI_EXP_MOD_ALT) || defined(CONFIG_IDF_TARGET_ESP32C3)
static size_t mpi_words(const mbedtls_mpi *mpi)
{
for (size_t i = mpi->n; i > 0; i--) {
@@ -369,6 +369,87 @@ cleanup:
#endif /* MBEDTLS_MPI_EXP_MOD_ALT */
+#if CONFIG_IDF_TARGET_ESP32C3
+int esp_mpi_exp_mod( mbedtls_mpi *Z, const mbedtls_mpi *X, const mbedtls_mpi *Y, const mbedtls_mpi *M, mbedtls_mpi *_Rinv )
+{
+ int ret = 0;
+ size_t x_words = mpi_words(X);
+ size_t y_words = mpi_words(Y);
+ size_t m_words = mpi_words(M);
+
+
+ /* "all numbers must be the same length", so choose longest number
+ as cardinal length of operation...
+ */
+ size_t num_words = esp_mpi_hardware_words(MAX(m_words, MAX(x_words, y_words)));
+
+ mbedtls_mpi Rinv_new; /* used if _Rinv == NULL */
+ mbedtls_mpi *Rinv; /* points to _Rinv (if not NULL) othwerwise &RR_new */
+ mbedtls_mpi_uint Mprime;
+
+ if (mbedtls_mpi_cmp_int(M, 0) <= 0 || (M->p[0] & 1) == 0) {
+ return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
+ }
+
+ if (mbedtls_mpi_cmp_int(Y, 0) < 0) {
+ return MBEDTLS_ERR_MPI_BAD_INPUT_DATA;
+ }
+
+ if (mbedtls_mpi_cmp_int(Y, 0) == 0) {
+ return mbedtls_mpi_lset(Z, 1);
+ }
+
+ if (num_words * 32 > SOC_RSA_MAX_BIT_LEN) {
+ return MBEDTLS_ERR_MPI_NOT_ACCEPTABLE;
+ }
+
+ /* Determine RR pointer, either _RR for cached value
+ or local RR_new */
+ if (_Rinv == NULL) {
+ mbedtls_mpi_init(&Rinv_new);
+ Rinv = &Rinv_new;
+ } else {
+ Rinv = _Rinv;
+ }
+ if (Rinv->p == NULL) {
+ MBEDTLS_MPI_CHK(calculate_rinv(Rinv, M, num_words));
+ }
+
+ Mprime = modular_inverse(M);
+
+ // Montgomery exponentiation: Z = X ^ Y mod M (HAC 14.94)
+#ifdef ESP_MPI_USE_MONT_EXP
+ ret = mpi_montgomery_exp_calc(Z, X, Y, M, Rinv, num_words, Mprime) ;
+ MBEDTLS_MPI_CHK(ret);
+#else
+ esp_mpi_enable_hardware_hw_op();
+
+ esp_mpi_exp_mpi_mod_hw_op(X, Y, M, Rinv, Mprime, num_words);
+ ret = mbedtls_mpi_grow(Z, m_words);
+ if (ret != 0) {
+ esp_mpi_disable_hardware_hw_op();
+ goto cleanup;
+ }
+ esp_mpi_read_result_hw_op(Z, m_words);
+ esp_mpi_disable_hardware_hw_op();
+#endif
+
+ // Compensate for negative X
+ if (X->s == -1 && (Y->p[0] & 1) != 0) {
+ Z->s = -1;
+ MBEDTLS_MPI_CHK(mbedtls_mpi_add_mpi(Z, M, Z));
+ } else {
+ Z->s = 1;
+ }
+
+cleanup:
+ if (_Rinv == NULL) {
+ mbedtls_mpi_free(&Rinv_new);
+ }
+ return ret;
+}
+#endif //CONFIG_IDF_TARGET_ESP32C3
+
#if defined(MBEDTLS_MPI_MUL_MPI_ALT) /* MBEDTLS_MPI_MUL_MPI_ALT */
diff --git a/lib/libesp32_epdiy/.gitignore b/lib/libesp32_eink/epdiy/.gitignore
similarity index 100%
rename from lib/libesp32_epdiy/.gitignore
rename to lib/libesp32_eink/epdiy/.gitignore
diff --git a/lib/libesp32_epdiy/.gitmodules b/lib/libesp32_eink/epdiy/.gitmodules
similarity index 100%
rename from lib/libesp32_epdiy/.gitmodules
rename to lib/libesp32_eink/epdiy/.gitmodules
diff --git a/lib/libesp32_epdiy/.readthedocs.yml b/lib/libesp32_eink/epdiy/.readthedocs.yml
similarity index 100%
rename from lib/libesp32_epdiy/.readthedocs.yml
rename to lib/libesp32_eink/epdiy/.readthedocs.yml
diff --git a/lib/libesp32_epdiy/Makefile b/lib/libesp32_eink/epdiy/Makefile
similarity index 100%
rename from lib/libesp32_epdiy/Makefile
rename to lib/libesp32_eink/epdiy/Makefile
diff --git a/lib/libesp32_epdiy/README.md b/lib/libesp32_eink/epdiy/README.md
similarity index 100%
rename from lib/libesp32_epdiy/README.md
rename to lib/libesp32_eink/epdiy/README.md
diff --git a/lib/libesp32_epdiy/boards.local.txt b/lib/libesp32_eink/epdiy/boards.local.txt
similarity index 100%
rename from lib/libesp32_epdiy/boards.local.txt
rename to lib/libesp32_eink/epdiy/boards.local.txt
diff --git a/lib/libesp32_epdiy/library.properties b/lib/libesp32_eink/epdiy/library.properties
similarity index 100%
rename from lib/libesp32_epdiy/library.properties
rename to lib/libesp32_eink/epdiy/library.properties
diff --git a/lib/libesp32_epdiy/scripts/LICENSE b/lib/libesp32_eink/epdiy/scripts/LICENSE
similarity index 100%
rename from lib/libesp32_epdiy/scripts/LICENSE
rename to lib/libesp32_eink/epdiy/scripts/LICENSE
diff --git a/lib/libesp32_epdiy/scripts/epdiy_waveform_gen.py b/lib/libesp32_eink/epdiy/scripts/epdiy_waveform_gen.py
similarity index 100%
rename from lib/libesp32_epdiy/scripts/epdiy_waveform_gen.py
rename to lib/libesp32_eink/epdiy/scripts/epdiy_waveform_gen.py
diff --git a/lib/libesp32_epdiy/scripts/fontconvert.py b/lib/libesp32_eink/epdiy/scripts/fontconvert.py
similarity index 100%
rename from lib/libesp32_epdiy/scripts/fontconvert.py
rename to lib/libesp32_eink/epdiy/scripts/fontconvert.py
diff --git a/lib/libesp32_epdiy/scripts/imgconvert.py b/lib/libesp32_eink/epdiy/scripts/imgconvert.py
similarity index 100%
rename from lib/libesp32_epdiy/scripts/imgconvert.py
rename to lib/libesp32_eink/epdiy/scripts/imgconvert.py
diff --git a/lib/libesp32_epdiy/scripts/modenames.py b/lib/libesp32_eink/epdiy/scripts/modenames.py
similarity index 100%
rename from lib/libesp32_epdiy/scripts/modenames.py
rename to lib/libesp32_eink/epdiy/scripts/modenames.py
diff --git a/lib/libesp32_epdiy/scripts/waveform_hdrgen.py b/lib/libesp32_eink/epdiy/scripts/waveform_hdrgen.py
similarity index 100%
rename from lib/libesp32_epdiy/scripts/waveform_hdrgen.py
rename to lib/libesp32_eink/epdiy/scripts/waveform_hdrgen.py
diff --git a/lib/libesp32_epdiy/src/epd4in7.cpp b/lib/libesp32_eink/epdiy/src/epd4in7.cpp
similarity index 100%
rename from lib/libesp32_epdiy/src/epd4in7.cpp
rename to lib/libesp32_eink/epdiy/src/epd4in7.cpp
diff --git a/lib/libesp32_epdiy/src/epd4in7.h b/lib/libesp32_eink/epdiy/src/epd4in7.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd4in7.h
rename to lib/libesp32_eink/epdiy/src/epd4in7.h
diff --git a/lib/libesp32_epdiy/src/epd_driver.h b/lib/libesp32_eink/epdiy/src/epd_driver.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver.h
rename to lib/libesp32_eink/epdiy/src/epd_driver.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/CMakeLists.txt b/lib/libesp32_eink/epdiy/src/epd_driver/CMakeLists.txt
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/CMakeLists.txt
rename to lib/libesp32_eink/epdiy/src/epd_driver/CMakeLists.txt
diff --git a/lib/libesp32_epdiy/src/epd_driver/Kconfig b/lib/libesp32_eink/epdiy/src/epd_driver/Kconfig
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/Kconfig
rename to lib/libesp32_eink/epdiy/src/epd_driver/Kconfig
diff --git a/lib/libesp32_epdiy/src/epd_driver/LICENSE b/lib/libesp32_eink/epdiy/src/epd_driver/LICENSE
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/LICENSE
rename to lib/libesp32_eink/epdiy/src/epd_driver/LICENSE
diff --git a/lib/libesp32_epdiy/src/epd_driver/Makefile b/lib/libesp32_eink/epdiy/src/epd_driver/Makefile
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/Makefile
rename to lib/libesp32_eink/epdiy/src/epd_driver/Makefile
diff --git a/lib/libesp32_epdiy/src/epd_driver/builtin_waveforms.c b/lib/libesp32_eink/epdiy/src/epd_driver/builtin_waveforms.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/builtin_waveforms.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/builtin_waveforms.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/config_reg_v2.h b/lib/libesp32_eink/epdiy/src/epd_driver/config_reg_v2.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/config_reg_v2.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/config_reg_v2.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/config_reg_v4.h b/lib/libesp32_eink/epdiy/src/epd_driver/config_reg_v4.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/config_reg_v4.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/config_reg_v4.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/display_ops.c b/lib/libesp32_eink/epdiy/src/epd_driver/display_ops.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/display_ops.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/display_ops.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/display_ops.h b/lib/libesp32_eink/epdiy/src/epd_driver/display_ops.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/display_ops.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/display_ops.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/epd_driver.c b/lib/libesp32_eink/epdiy/src/epd_driver/epd_driver.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/epd_driver.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/epd_driver.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/epd_temperature.c b/lib/libesp32_eink/epdiy/src/epd_driver/epd_temperature.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/epd_temperature.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/epd_temperature.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/epd_temperature.h b/lib/libesp32_eink/epdiy/src/epd_driver/epd_temperature.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/epd_temperature.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/epd_temperature.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/font.c b/lib/libesp32_eink/epdiy/src/epd_driver/font.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/font.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/font.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/hacks.cmake b/lib/libesp32_eink/epdiy/src/epd_driver/hacks.cmake
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/hacks.cmake
rename to lib/libesp32_eink/epdiy/src/epd_driver/hacks.cmake
diff --git a/lib/libesp32_epdiy/src/epd_driver/highlevel.c b/lib/libesp32_eink/epdiy/src/epd_driver/highlevel.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/highlevel.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/highlevel.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/i2s_data_bus.c b/lib/libesp32_eink/epdiy/src/epd_driver/i2s_data_bus.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/i2s_data_bus.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/i2s_data_bus.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/i2s_data_bus.h b/lib/libesp32_eink/epdiy/src/epd_driver/i2s_data_bus.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/i2s_data_bus.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/i2s_data_bus.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/include/epd_driver.h b/lib/libesp32_eink/epdiy/src/epd_driver/include/epd_driver.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/include/epd_driver.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/include/epd_driver.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/include/epd_highlevel.h b/lib/libesp32_eink/epdiy/src/epd_driver/include/epd_highlevel.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/include/epd_highlevel.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/include/epd_highlevel.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/include/epd_internals.h b/lib/libesp32_eink/epdiy/src/epd_driver/include/epd_internals.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/include/epd_internals.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/include/epd_internals.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/lut.c b/lib/libesp32_eink/epdiy/src/epd_driver/lut.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/lut.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/lut.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/lut.h b/lib/libesp32_eink/epdiy/src/epd_driver/lut.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/lut.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/lut.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/render.c b/lib/libesp32_eink/epdiy/src/epd_driver/render.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/render.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/render.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/rmt_pulse.c b/lib/libesp32_eink/epdiy/src/epd_driver/rmt_pulse.c
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/rmt_pulse.c
rename to lib/libesp32_eink/epdiy/src/epd_driver/rmt_pulse.c
diff --git a/lib/libesp32_epdiy/src/epd_driver/rmt_pulse.h b/lib/libesp32_eink/epdiy/src/epd_driver/rmt_pulse.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/rmt_pulse.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/rmt_pulse.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/ED047TC2.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/ED047TC2.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/ED047TC2.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/ED047TC2.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED047TC1.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED047TC1.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED047TC1.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED047TC1.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060SC4.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060SC4.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060SC4.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060SC4.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060SCT.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060SCT.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060SCT.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060SCT.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060XC3.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060XC3.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED060XC3.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED060XC3.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED097OC4.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED097OC4.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED097OC4.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED097OC4.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED097TC2.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED097TC2.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED097TC2.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED097TC2.h
diff --git a/lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED133UT2.h b/lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED133UT2.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_driver/waveforms/epdiy_ED133UT2.h
rename to lib/libesp32_eink/epdiy/src/epd_driver/waveforms/epdiy_ED133UT2.h
diff --git a/lib/libesp32_epdiy/src/epd_highlevel.h b/lib/libesp32_eink/epdiy/src/epd_highlevel.h
similarity index 100%
rename from lib/libesp32_epdiy/src/epd_highlevel.h
rename to lib/libesp32_eink/epdiy/src/epd_highlevel.h
diff --git a/pio-tools/add_c_flags.py b/pio-tools/add_c_flags.py
new file mode 100644
index 000000000..c93059b36
--- /dev/null
+++ b/pio-tools/add_c_flags.py
@@ -0,0 +1,4 @@
+Import("env")
+
+# General options that are passed to the C compiler (C only; not C++).
+env.Append(CFLAGS=["-Wno-discarded-qualifiers"])
diff --git a/platformio.ini b/platformio.ini
index fdb0e328a..660bf4d96 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -64,6 +64,7 @@ lib_extra_dirs =
[scripts_defaults]
extra_scripts = pio-tools/strip-floats.py
+ pio-tools/add_c_flags.py
pio-tools/name-firmware.py
pio-tools/gzip-firmware.py
pio-tools/override_copy.py
diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini
index 3ce7709fe..5d3175b06 100644
--- a/platformio_override_sample.ini
+++ b/platformio_override_sample.ini
@@ -89,9 +89,9 @@ lib_extra_dirs = ${library.lib_extra_dirs}
[env:tasmota32_base]
-; *** Uncomment next lines ";" to enable Beta Tasmota Arduino version ESP32 IDF4.4
+; *** Uncomment next lines ";" to enable development Tasmota Arduino version ESP32
;platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master
-;platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.1rc1/framework-arduinoespressif32-release_IDF4.4.tar.gz
+;platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.1/framework-arduinoespressif32-release_IDF4.4.tar.gz
; platformio/tool-esptoolpy @ https://github.com/tasmota/esptool/releases/download/v3.2/esptool-v3.2.zip
; platformio/tool-mklittlefs @ ~1.203.200522
build_unflags = ${esp32_defaults.build_unflags}
@@ -134,7 +134,7 @@ lib_extra_dirs = ${library.lib_extra_dirs}
; *** uncomment the following line if you use Bluetooth or Apple Homekit in a Tasmota32 build. Reduces compile time
; lib/libesp32_div
; *** uncomment the following line if you use Epaper driver epidy in your Tasmota32 build. Reduces compile time
-; lib/libesp32_epdiy
+; lib/libesp32_eink
[library]
diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini
index 64e78a073..e89969b3f 100644
--- a/platformio_tasmota32.ini
+++ b/platformio_tasmota32.ini
@@ -2,9 +2,15 @@
[esp32_defaults]
build_unflags = ${esp_defaults.build_unflags}
+ -Wswitch-unreachable
+ -Wstringop-overflow
+ -Wincompatible-pointer-types
+ -Wnonnull-compare
-fexceptions
-Wpointer-arith
build_flags = ${esp_defaults.build_flags}
+ -Wno-switch-unreachable
+ -Wno-stringop-overflow
-fno-exceptions
-DBUFFER_LENGTH=128
-DHTTP_UPLOAD_BUFLEN=2048
@@ -26,9 +32,8 @@ build_flags = ${esp_defaults.build_flags}
-Wl,--wrap=panicHandler -Wl,--wrap=xt_unhandled_exception
[core32]
-platform = espressif32 @ 3.3.1
-platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.5/tasmota-arduinoespressif32-release_v3.3.5.tar.gz
- platformio/toolchain-xtensa32 @ ~2.50200.0
+platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master
+platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.1/framework-arduinoespressif32-release_IDF4.4.tar.gz
platformio/tool-esptoolpy @ https://github.com/tasmota/esptool/releases/download/v3.2/esptool-v3.2.zip
platformio/tool-mklittlefs @ ~1.203.200522
build_unflags = ${esp32_defaults.build_unflags}
@@ -36,9 +41,8 @@ build_flags = ${esp32_defaults.build_flags}
[core32solo1]
-platform = espressif32 @ 3.3.1
-platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/1.0.7.5/tasmota-arduinoespressif32-solo1-release_v3.3.5.tar.gz
- platformio/toolchain-xtensa32 @ ~2.50200.0
+platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master
+platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.1/framework-arduinoespressif32-solo1-release_IDF4.4.tar.gz
platformio/tool-esptoolpy @ https://github.com/tasmota/esptool/releases/download/v3.2/esptool-v3.2.zip
platformio/tool-mklittlefs @ ~1.203.200522
build_unflags = ${esp32_defaults.build_unflags}
diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini
index 85ed09e49..ea5114455 100644
--- a/platformio_tasmota_cenv_sample.ini
+++ b/platformio_tasmota_cenv_sample.ini
@@ -1,25 +1,14 @@
-; *** Tasmota32 development core version ESP32 IDF4.4
-[env:tasmota32-dev]
-extends = env:tasmota32idf4
-platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/511/framework-arduinoespressif32-release_v4.4-432c3c78c.tar.gz
- platformio/tool-esptoolpy @ https://github.com/tasmota/esptool/releases/download/v3.2/esptool-v3.2.zip
- platformio/tool-mklittlefs @ ~1.203.200522
-build_flags = ${env:tasmota32idf4.build_flags}
- -D FIRMWARE_TASMOTA32
-
;*** Beta Tasmota version for ESP32-S2
-;*** Example how to override the standard core with [tasmota32-dev] core
[env:tasmota32s2]
-extends = env:tasmota32-dev
-platform_packages = ${env:tasmota32-dev.platform_packages}
+extends = env:tasmota32_base
board = esp32s2
-build_flags = ${env:tasmota32idf4.build_flags}
-lib_extra_dirs = lib/libesp32
- lib/libesp32_lvgl
- lib/lib_basic
- lib/lib_i2c
- lib/lib_ssl
- lib/lib_display
+build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASMOTA32
+lib_ignore =
+ ESP8266Audio
+ ESP8266SAM
+ TTGO TWatch Library
+ NimBLE-Arduino
+ epdiy
[env:tasmota-rangeextender]
build_flags = ${env.build_flags}
@@ -29,8 +18,8 @@ build_flags = ${env.build_flags}
-D USE_WIFI_RANGE_EXTENDER_NAPT
[env:tasmota32-rangeextender]
-extends = env:tasmota32idf4
-build_flags = ${env:tasmota32idf4.build_flags}
+extends = env:tasmota32_base
+build_flags = ${env:tasmota32_base.build_flags}
-D FIRMWARE_TASMOTA32
-D USE_WIFI_RANGE_EXTENDER
-D USE_WIFI_RANGE_EXTENDER_NAPT
diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini
index ab7351d3f..b41146635 100644
--- a/platformio_tasmota_env32.ini
+++ b/platformio_tasmota_env32.ini
@@ -17,7 +17,7 @@ lib_extra_dirs = ${common.lib_extra_dirs}
lib/libesp32
lib/libesp32_lvgl
lib/libesp32_div
- lib/libesp32_epdiy
+ lib/libesp32_eink
lib_ignore =
ESP RainMaker
WiFiProv
@@ -33,20 +33,6 @@ lib_ignore =
; Disable next if you want to use ArduinoOTA in Tasmota32 (default disabled)
ArduinoOTA
-[env:tasmota32idf4]
-extends = env:tasmota32_base
-platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-master
-platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.1rc1/framework-arduinoespressif32-release_IDF4.4.tar.gz
- platformio/tool-esptoolpy @ https://github.com/tasmota/esptool/releases/download/v3.2/esptool-v3.2.zip
- platformio/tool-mklittlefs @ ~1.203.200522
-build_unflags = ${env:tasmota32_base.build_unflags}
- -Wswitch-unreachable
- -Wstringop-overflow
- -Wincompatible-pointer-types
-build_flags = ${env:tasmota32_base.build_flags}
- -Wno-switch-unreachable
- -Wno-stringop-overflow
-
[env:tasmota32]
extends = env:tasmota32_base
build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32
@@ -106,29 +92,17 @@ build_flags = ${env:tasmota32_base.build_flags} -DUSE_IR_REMOTE_FULL
lib_extra_dirs = lib/libesp32, lib/lib_basic
[env:tasmota32c3]
-extends = env:tasmota32idf4
+extends = env:tasmota32_base
board = esp32c3
-platform = ${env:tasmota32idf4.platform}
-platform_packages = ${env:tasmota32idf4.platform_packages}
-build_unflags = ${env:tasmota32idf4.build_unflags}
+build_unflags = ${env:tasmota32_base.build_unflags}
-mtarget-align
- -DNDEBUG
-build_flags = ${env:tasmota32idf4.build_flags}
-; *** Comment next two lines to disable BLE
-; -DUSE_BLE_ESP32
-; -DUSE_MI_ESP32
- ;-DESP32_STAGE=true
-lib_extra_dirs = lib/libesp32
- lib/libesp32_div
- lib/libesp32_lvgl
- lib/lib_basic
- lib/lib_i2c
- lib/lib_ssl
- lib/lib_display
+build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32
lib_ignore =
+ ESP8266Audio
+ ESP8266SAM
TTGO TWatch Library
- ESP32-HomeKit
Micro-RTSP
+ epdiy
[env:tasmota32-AF]
extends = env:tasmota32_base
diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h
new file mode 100644
index 000000000..73f37825e
--- /dev/null
+++ b/tasmota/berry/include/be_gpio_defines.h
@@ -0,0 +1,284 @@
+/********************************************************************
+ * Generated code, don't edit
+ *******************************************************************/
+
+const be_constint_t lv_gpio_constants[] = {
+
+ { "A4988_DIR", (int32_t) GPIO_A4988_DIR },
+ { "A4988_ENA", (int32_t) GPIO_A4988_ENA },
+ { "A4988_MS1", (int32_t) GPIO_A4988_MS1 },
+ { "A4988_STP", (int32_t) GPIO_A4988_STP },
+ { "ADC_BUTTON", (int32_t) GPIO_ADC_BUTTON },
+ { "ADC_BUTTON_INV", (int32_t) GPIO_ADC_BUTTON_INV },
+ { "ADC_CT_POWER", (int32_t) GPIO_ADC_CT_POWER },
+ { "ADC_INPUT", (int32_t) GPIO_ADC_INPUT },
+ { "ADC_JOY", (int32_t) GPIO_ADC_JOY },
+ { "ADC_LIGHT", (int32_t) GPIO_ADC_LIGHT },
+ { "ADC_PH", (int32_t) GPIO_ADC_PH },
+ { "ADC_RANGE", (int32_t) GPIO_ADC_RANGE },
+ { "ADC_TEMP", (int32_t) GPIO_ADC_TEMP },
+ { "ADE7953_IRQ", (int32_t) GPIO_ADE7953_IRQ },
+ { "ARIRFRCV", (int32_t) GPIO_ARIRFRCV },
+ { "ARIRFSEL", (int32_t) GPIO_ARIRFSEL },
+ { "AS3935", (int32_t) GPIO_AS3935 },
+ { "AS608_RX", (int32_t) GPIO_AS608_RX },
+ { "AS608_TX", (int32_t) GPIO_AS608_TX },
+ { "AZ_RXD", (int32_t) GPIO_AZ_RXD },
+ { "AZ_TXD", (int32_t) GPIO_AZ_TXD },
+ { "BACKLIGHT", (int32_t) GPIO_BACKLIGHT },
+ { "BL0939_RX", (int32_t) GPIO_BL0939_RX },
+ { "BL0940_RX", (int32_t) GPIO_BL0940_RX },
+ { "BL0942_RX", (int32_t) GPIO_BL0942_RX },
+ { "BOILER_OT_RX", (int32_t) GPIO_BOILER_OT_RX },
+ { "BOILER_OT_TX", (int32_t) GPIO_BOILER_OT_TX },
+ { "BS814_CLK", (int32_t) GPIO_BS814_CLK },
+ { "BS814_DAT", (int32_t) GPIO_BS814_DAT },
+ { "BUZZER", (int32_t) GPIO_BUZZER },
+ { "BUZZER_INV", (int32_t) GPIO_BUZZER_INV },
+ { "CC1101_GDO0", (int32_t) GPIO_CC1101_GDO0 },
+ { "CC1101_GDO2", (int32_t) GPIO_CC1101_GDO2 },
+ { "CHANGE", CHANGE },
+ { "CNTR1", (int32_t) GPIO_CNTR1 },
+ { "CNTR1_NP", (int32_t) GPIO_CNTR1_NP },
+ { "CSE7761_RX", (int32_t) GPIO_CSE7761_RX },
+ { "CSE7761_TX", (int32_t) GPIO_CSE7761_TX },
+ { "CSE7766_RX", (int32_t) GPIO_CSE7766_RX },
+ { "CSE7766_TX", (int32_t) GPIO_CSE7766_TX },
+ { "DAC", (int32_t) -1 },
+ { "DCKI", (int32_t) GPIO_DCKI },
+ { "DDS2382_RX", (int32_t) GPIO_DDS2382_RX },
+ { "DDS2382_TX", (int32_t) GPIO_DDS2382_TX },
+ { "DDSU666_RX", (int32_t) GPIO_DDSU666_RX },
+ { "DDSU666_TX", (int32_t) GPIO_DDSU666_TX },
+ { "DEEPSLEEP", (int32_t) GPIO_DEEPSLEEP },
+ { "DHT11", (int32_t) GPIO_DHT11 },
+ { "DHT11_OUT", (int32_t) GPIO_DHT11_OUT },
+ { "DHT22", (int32_t) GPIO_DHT22 },
+ { "DI", (int32_t) GPIO_DI },
+ { "DSB", (int32_t) GPIO_DSB },
+ { "DSB_OUT", (int32_t) GPIO_DSB_OUT },
+ { "DYP_RX", (int32_t) GPIO_DYP_RX },
+ { "ELECTRIQ_MOODL_TX", (int32_t) GPIO_ELECTRIQ_MOODL_TX },
+ { "EPAPER29_CS", (int32_t) GPIO_EPAPER29_CS },
+ { "EPAPER42_CS", (int32_t) GPIO_EPAPER42_CS },
+ { "EPD_DATA", (int32_t) GPIO_EPD_DATA },
+ { "ETH_PHY_MDC", (int32_t) GPIO_ETH_PHY_MDC },
+ { "ETH_PHY_MDIO", (int32_t) GPIO_ETH_PHY_MDIO },
+ { "ETH_PHY_POWER", (int32_t) GPIO_ETH_PHY_POWER },
+ { "EXS_ENABLE", (int32_t) GPIO_EXS_ENABLE },
+ { "FALLING", FALLING },
+ { "FTC532", (int32_t) GPIO_FTC532 },
+ { "GPS_RX", (int32_t) GPIO_GPS_RX },
+ { "GPS_TX", (int32_t) GPIO_GPS_TX },
+ { "HALLEFFECT", (int32_t) GPIO_HALLEFFECT },
+ { "HEARTBEAT", (int32_t) GPIO_HEARTBEAT },
+ { "HEARTBEAT_INV", (int32_t) GPIO_HEARTBEAT_INV },
+ { "HIGH", HIGH },
+ { "HJL_CF", (int32_t) GPIO_HJL_CF },
+ { "HLW_CF", (int32_t) GPIO_HLW_CF },
+ { "HM10_RX", (int32_t) GPIO_HM10_RX },
+ { "HM10_TX", (int32_t) GPIO_HM10_TX },
+ { "HM330X_SET", (int32_t) GPIO_HM330X_SET },
+ { "HPMA_RX", (int32_t) GPIO_HPMA_RX },
+ { "HPMA_TX", (int32_t) GPIO_HPMA_TX },
+ { "HRE_CLOCK", (int32_t) GPIO_HRE_CLOCK },
+ { "HRE_DATA", (int32_t) GPIO_HRE_DATA },
+ { "HRG15_TX", (int32_t) GPIO_HRG15_TX },
+ { "HRXL_RX", (int32_t) GPIO_HRXL_RX },
+ { "HX711_DAT", (int32_t) GPIO_HX711_DAT },
+ { "HX711_SCK", (int32_t) GPIO_HX711_SCK },
+ { "I2C_SCL", (int32_t) GPIO_I2C_SCL },
+ { "I2C_SDA", (int32_t) GPIO_I2C_SDA },
+ { "I2S_IN_CLK", (int32_t) GPIO_I2S_IN_CLK },
+ { "I2S_IN_DATA", (int32_t) GPIO_I2S_IN_DATA },
+ { "I2S_IN_SLCT", (int32_t) GPIO_I2S_IN_SLCT },
+ { "I2S_OUT_CLK", (int32_t) GPIO_I2S_OUT_CLK },
+ { "I2S_OUT_DATA", (int32_t) GPIO_I2S_OUT_DATA },
+ { "I2S_OUT_SLCT", (int32_t) GPIO_I2S_OUT_SLCT },
+ { "IBEACON_RX", (int32_t) GPIO_IBEACON_RX },
+ { "IBEACON_TX", (int32_t) GPIO_IBEACON_TX },
+ { "IEM3000_RX", (int32_t) GPIO_IEM3000_RX },
+ { "IEM3000_TX", (int32_t) GPIO_IEM3000_TX },
+ { "ILI9341_CS", (int32_t) GPIO_ILI9341_CS },
+ { "ILI9341_DC", (int32_t) GPIO_ILI9341_DC },
+ { "ILI9488_CS", (int32_t) GPIO_ILI9488_CS },
+ { "INPUT", (int32_t) GPIO_INPUT },
+ { "INPUT_PULLDOWN", INPUT_PULLDOWN },
+ { "INPUT_PULLUP", INPUT_PULLUP },
+ { "INTERRUPT", (int32_t) GPIO_INTERRUPT },
+ { "IRRECV", (int32_t) GPIO_IRRECV },
+ { "IRSEND", (int32_t) GPIO_IRSEND },
+ { "KEY1", (int32_t) GPIO_KEY1 },
+ { "KEY1_INV", (int32_t) GPIO_KEY1_INV },
+ { "KEY1_INV_NP", (int32_t) GPIO_KEY1_INV_NP },
+ { "KEY1_INV_PD", (int32_t) GPIO_KEY1_INV_PD },
+ { "KEY1_NP", (int32_t) GPIO_KEY1_NP },
+ { "KEY1_PD", (int32_t) GPIO_KEY1_PD },
+ { "KEY1_TC", (int32_t) GPIO_KEY1_TC },
+ { "LE01MR_RX", (int32_t) GPIO_LE01MR_RX },
+ { "LE01MR_TX", (int32_t) GPIO_LE01MR_TX },
+ { "LED1", (int32_t) GPIO_LED1 },
+ { "LED1_INV", (int32_t) GPIO_LED1_INV },
+ { "LEDLNK", (int32_t) GPIO_LEDLNK },
+ { "LEDLNK_INV", (int32_t) GPIO_LEDLNK_INV },
+ { "LMT01", (int32_t) GPIO_LMT01 },
+ { "LOW", LOW },
+ { "MAX31855CLK", (int32_t) GPIO_MAX31855CLK },
+ { "MAX31855CS", (int32_t) GPIO_MAX31855CS },
+ { "MAX31855DO", (int32_t) GPIO_MAX31855DO },
+ { "MAX7219CLK", (int32_t) GPIO_MAX7219CLK },
+ { "MAX7219CS", (int32_t) GPIO_MAX7219CS },
+ { "MAX7219DIN", (int32_t) GPIO_MAX7219DIN },
+ { "MCP2515_CS", (int32_t) GPIO_MCP2515_CS },
+ { "MCP39F5_RST", (int32_t) GPIO_MCP39F5_RST },
+ { "MCP39F5_RX", (int32_t) GPIO_MCP39F5_RX },
+ { "MCP39F5_TX", (int32_t) GPIO_MCP39F5_TX },
+ { "MGC3130_RESET", (int32_t) GPIO_MGC3130_RESET },
+ { "MGC3130_XFER", (int32_t) GPIO_MGC3130_XFER },
+ { "MHZ_RXD", (int32_t) GPIO_MHZ_RXD },
+ { "MHZ_TXD", (int32_t) GPIO_MHZ_TXD },
+ { "MIEL_HVAC_RX", (int32_t) GPIO_MIEL_HVAC_RX },
+ { "MIEL_HVAC_TX", (int32_t) GPIO_MIEL_HVAC_TX },
+ { "MP3_DFR562", (int32_t) GPIO_MP3_DFR562 },
+ { "NEOPOOL_RX", (int32_t) GPIO_NEOPOOL_RX },
+ { "NEOPOOL_TX", (int32_t) GPIO_NEOPOOL_TX },
+ { "NONE", (int32_t) GPIO_NONE },
+ { "NRF24_CS", (int32_t) GPIO_NRF24_CS },
+ { "NRF24_DC", (int32_t) GPIO_NRF24_DC },
+ { "NRG_CF1", (int32_t) GPIO_NRG_CF1 },
+ { "NRG_SEL", (int32_t) GPIO_NRG_SEL },
+ { "NRG_SEL_INV", (int32_t) GPIO_NRG_SEL_INV },
+ { "OLED_RESET", (int32_t) GPIO_OLED_RESET },
+ { "OPEN_DRAIN", OPEN_DRAIN },
+ { "OPTION_A", (int32_t) GPIO_OPTION_A },
+ { "OUTPUT", OUTPUT },
+ { "OUTPUT_HI", (int32_t) GPIO_OUTPUT_HI },
+ { "OUTPUT_LO", (int32_t) GPIO_OUTPUT_LO },
+ { "OUTPUT_OPEN_DRAIN", OUTPUT_OPEN_DRAIN },
+ { "P9813_CLK", (int32_t) GPIO_P9813_CLK },
+ { "P9813_DAT", (int32_t) GPIO_P9813_DAT },
+ { "PMS5003_RX", (int32_t) GPIO_PMS5003_RX },
+ { "PMS5003_TX", (int32_t) GPIO_PMS5003_TX },
+ { "PN532_RXD", (int32_t) GPIO_PN532_RXD },
+ { "PN532_TXD", (int32_t) GPIO_PN532_TXD },
+ { "PROJECTOR_CTRL_RX", (int32_t) GPIO_PROJECTOR_CTRL_RX },
+ { "PROJECTOR_CTRL_TX", (int32_t) GPIO_PROJECTOR_CTRL_TX },
+ { "PULLDOWN", PULLDOWN },
+ { "PULLUP", PULLUP },
+ { "PWM1", (int32_t) GPIO_PWM1 },
+ { "PWM1_INV", (int32_t) GPIO_PWM1_INV },
+ { "PZEM004_RX", (int32_t) GPIO_PZEM004_RX },
+ { "PZEM016_RX", (int32_t) GPIO_PZEM016_RX },
+ { "PZEM017_RX", (int32_t) GPIO_PZEM017_RX },
+ { "PZEM0XX_TX", (int32_t) GPIO_PZEM0XX_TX },
+ { "RA8876_CS", (int32_t) GPIO_RA8876_CS },
+ { "RC522_CS", (int32_t) GPIO_RC522_CS },
+ { "RC522_RST", (int32_t) GPIO_RC522_RST },
+ { "RDM6300_RX", (int32_t) GPIO_RDM6300_RX },
+ { "REL1", (int32_t) GPIO_REL1 },
+ { "REL1_INV", (int32_t) GPIO_REL1_INV },
+ { "RFRECV", (int32_t) GPIO_RFRECV },
+ { "RFSEND", (int32_t) GPIO_RFSEND },
+ { "RF_SENSOR", (int32_t) GPIO_RF_SENSOR },
+ { "RISING", RISING },
+ { "ROT1A", (int32_t) GPIO_ROT1A },
+ { "ROT1A_NP", (int32_t) GPIO_ROT1A_NP },
+ { "ROT1B", (int32_t) GPIO_ROT1B },
+ { "ROT1B_NP", (int32_t) GPIO_ROT1B_NP },
+ { "RXD", (int32_t) GPIO_RXD },
+ { "SAIR_RX", (int32_t) GPIO_SAIR_RX },
+ { "SAIR_TX", (int32_t) GPIO_SAIR_TX },
+ { "SBR_RX", (int32_t) GPIO_SBR_RX },
+ { "SBR_TX", (int32_t) GPIO_SBR_TX },
+ { "SDCARD_CS", (int32_t) GPIO_SDCARD_CS },
+ { "SDM120_RX", (int32_t) GPIO_SDM120_RX },
+ { "SDM120_TX", (int32_t) GPIO_SDM120_TX },
+ { "SDM630_RX", (int32_t) GPIO_SDM630_RX },
+ { "SDM630_TX", (int32_t) GPIO_SDM630_TX },
+ { "SDM72_RX", (int32_t) GPIO_SDM72_RX },
+ { "SDM72_TX", (int32_t) GPIO_SDM72_TX },
+ { "SDS0X1_RX", (int32_t) GPIO_SDS0X1_RX },
+ { "SDS0X1_TX", (int32_t) GPIO_SDS0X1_TX },
+ { "SENSOR_END", (int32_t) GPIO_SENSOR_END },
+ { "SHELLY_DIMMER_BOOT0", (int32_t) GPIO_SHELLY_DIMMER_BOOT0 },
+ { "SHELLY_DIMMER_RST_INV", (int32_t) GPIO_SHELLY_DIMMER_RST_INV },
+ { "SI7021", (int32_t) GPIO_SI7021 },
+ { "SM16716_CLK", (int32_t) GPIO_SM16716_CLK },
+ { "SM16716_DAT", (int32_t) GPIO_SM16716_DAT },
+ { "SM16716_SEL", (int32_t) GPIO_SM16716_SEL },
+ { "SM2135_CLK", (int32_t) GPIO_SM2135_CLK },
+ { "SM2135_DAT", (int32_t) GPIO_SM2135_DAT },
+ { "SOLAXX1_RX", (int32_t) GPIO_SOLAXX1_RX },
+ { "SOLAXX1_TX", (int32_t) GPIO_SOLAXX1_TX },
+ { "SPI_CLK", (int32_t) GPIO_SPI_CLK },
+ { "SPI_CS", (int32_t) GPIO_SPI_CS },
+ { "SPI_DC", (int32_t) GPIO_SPI_DC },
+ { "SPI_MISO", (int32_t) GPIO_SPI_MISO },
+ { "SPI_MOSI", (int32_t) GPIO_SPI_MOSI },
+ { "SR04_ECHO", (int32_t) GPIO_SR04_ECHO },
+ { "SR04_TRIG", (int32_t) GPIO_SR04_TRIG },
+ { "SSD1331_CS", (int32_t) GPIO_SSD1331_CS },
+ { "SSD1331_DC", (int32_t) GPIO_SSD1331_DC },
+ { "SSD1351_CS", (int32_t) GPIO_SSD1351_CS },
+ { "SSD1351_DC", (int32_t) GPIO_SSD1351_DC },
+ { "SSPI_CS", (int32_t) GPIO_SSPI_CS },
+ { "SSPI_DC", (int32_t) GPIO_SSPI_DC },
+ { "SSPI_MAX31865_CS1", (int32_t) GPIO_SSPI_MAX31865_CS1 },
+ { "SSPI_MISO", (int32_t) GPIO_SSPI_MISO },
+ { "SSPI_MOSI", (int32_t) GPIO_SSPI_MOSI },
+ { "SSPI_SCLK", (int32_t) GPIO_SSPI_SCLK },
+ { "ST7789_CS", (int32_t) GPIO_ST7789_CS },
+ { "ST7789_DC", (int32_t) GPIO_ST7789_DC },
+ { "SWT1", (int32_t) GPIO_SWT1 },
+ { "SWT1_NP", (int32_t) GPIO_SWT1_NP },
+ { "SWT1_PD", (int32_t) GPIO_SWT1_PD },
+ { "TASMOTACLIENT_RST", (int32_t) GPIO_TASMOTACLIENT_RST },
+ { "TASMOTACLIENT_RST_INV", (int32_t) GPIO_TASMOTACLIENT_RST_INV },
+ { "TASMOTACLIENT_RXD", (int32_t) GPIO_TASMOTACLIENT_RXD },
+ { "TASMOTACLIENT_TXD", (int32_t) GPIO_TASMOTACLIENT_TXD },
+ { "TCP_RX", (int32_t) GPIO_TCP_RX },
+ { "TCP_TX", (int32_t) GPIO_TCP_TX },
+ { "TELEINFO_ENABLE", (int32_t) GPIO_TELEINFO_ENABLE },
+ { "TELEINFO_RX", (int32_t) GPIO_TELEINFO_RX },
+ { "TFMINIPLUS_RX", (int32_t) GPIO_TFMINIPLUS_RX },
+ { "TFMINIPLUS_TX", (int32_t) GPIO_TFMINIPLUS_TX },
+ { "TM1637CLK", (int32_t) GPIO_TM1637CLK },
+ { "TM1637DIO", (int32_t) GPIO_TM1637DIO },
+ { "TM1638CLK", (int32_t) GPIO_TM1638CLK },
+ { "TM1638DIO", (int32_t) GPIO_TM1638DIO },
+ { "TM1638STB", (int32_t) GPIO_TM1638STB },
+ { "TUYA_RX", (int32_t) GPIO_TUYA_RX },
+ { "TUYA_TX", (int32_t) GPIO_TUYA_TX },
+ { "TX2X_TXD_BLACK", (int32_t) GPIO_TX2X_TXD_BLACK },
+ { "TXD", (int32_t) GPIO_TXD },
+ { "VINDRIKTNING_RX", (int32_t) GPIO_VINDRIKTNING_RX },
+ { "VL53L0X_XSHUT1", (int32_t) GPIO_VL53L0X_XSHUT1 },
+ { "WE517_RX", (int32_t) GPIO_WE517_RX },
+ { "WE517_TX", (int32_t) GPIO_WE517_TX },
+ { "WEBCAM_DATA", (int32_t) GPIO_WEBCAM_DATA },
+ { "WEBCAM_HREF", (int32_t) GPIO_WEBCAM_HREF },
+ { "WEBCAM_HSD", (int32_t) GPIO_WEBCAM_HSD },
+ { "WEBCAM_PCLK", (int32_t) GPIO_WEBCAM_PCLK },
+ { "WEBCAM_PSCLK", (int32_t) GPIO_WEBCAM_PSCLK },
+ { "WEBCAM_PSRCS", (int32_t) GPIO_WEBCAM_PSRCS },
+ { "WEBCAM_PWDN", (int32_t) GPIO_WEBCAM_PWDN },
+ { "WEBCAM_RESET", (int32_t) GPIO_WEBCAM_RESET },
+ { "WEBCAM_SIOC", (int32_t) GPIO_WEBCAM_SIOC },
+ { "WEBCAM_SIOD", (int32_t) GPIO_WEBCAM_SIOD },
+ { "WEBCAM_VSYNC", (int32_t) GPIO_WEBCAM_VSYNC },
+ { "WEBCAM_XCLK", (int32_t) GPIO_WEBCAM_XCLK },
+ { "WIEGAND_D0", (int32_t) GPIO_WIEGAND_D0 },
+ { "WIEGAND_D1", (int32_t) GPIO_WIEGAND_D1 },
+ { "WINDMETER_SPEED", (int32_t) GPIO_WINDMETER_SPEED },
+ { "WS2812", (int32_t) GPIO_WS2812 },
+ { "XPT2046_CS", (int32_t) GPIO_XPT2046_CS },
+ { "ZEROCROSS", (int32_t) GPIO_ZEROCROSS },
+ { "ZIGBEE_RST", (int32_t) GPIO_ZIGBEE_RST },
+ { "ZIGBEE_RX", (int32_t) GPIO_ZIGBEE_RX },
+ { "ZIGBEE_TX", (int32_t) GPIO_ZIGBEE_TX },
+
+};
+
+const size_t lv_gpio_constants_size = sizeof(lv_gpio_constants)/sizeof(lv_gpio_constants[0]);
+
+/********************************************************************/
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index 9c8aed881..c08703e0f 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -692,6 +692,8 @@
#define D_CMND_SHUTTER_INVERTWEBBUTTONS "InvertWebButtons"
#define D_CMND_SHUTTER_PWMRANGE "PWMRange"
#define D_CMND_SHUTTER_UNITTEST "UnitTest"
+#define D_CMND_SHUTTER_TILTCONFIG "TiltConfig"
+#define D_CMND_SHUTTER_SETTILT "Tilt"
// Commands xdrv_32_hotplug.ino
#define D_CMND_HOTPLUG "HotPlug"
diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h
index c861049b5..6f708f58b 100644
--- a/tasmota/my_user_config.h
+++ b/tasmota/my_user_config.h
@@ -658,6 +658,7 @@
// #define USE_AM2320 // [I2cDriver60] Enable AM2320 temperature and humidity Sensor (I2C address 0x5C) (+1k code)
// #define USE_T67XX // [I2cDriver61] Enable Telaire T67XX CO2 sensor (I2C address 0x15) (+1k3 code)
// #define USE_HM330X // [I2cDriver63] Enable support for SeedStudio Grove Particule sensor (I2C address 0x40) (+1k5 code)
+// #define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code)
// #define HM330X_DEFAULT_ADDRESS 0x40 // Option: change default I2C address for HM330X used in SeedSTudio Particucle Sensor
// #define HM330X_WARMUP_DELAY 30 // Option: change warmup delay during which data are not read from sensor after a power up
// #define HM330X_HIDE_OUT_OF_DATE false // Option: change to true to hide data from web GUI and SENSOR while sensor is asleep
@@ -853,8 +854,8 @@
#define IR_RCV_WHILE_SENDING 0 // Turns on receiver while sending messages, i.e. receive your own. This is unreliable and can cause IR timing issues
// -- Zigbee interface ----------------------------
-//#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP (+49k code, +3k mem)
- #define USE_ZIGBEE_ZNP // Enable ZNP protocol, needed for CC2530 based devices
+//#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530/CC2652 flashed with ZNP or EFR32 flashed with EZSP (+49k code, +3k mem)
+ #define USE_ZIGBEE_ZNP // Enable ZNP protocol, needed for CC2530/CC2652 based devices
// #define USE_ZIGBEE_EZSP // Enable EZSP protocol, needed for EFR32 EmberZNet based devices, like Sonoff Zigbee bridge
// Note: USE_ZIGBEE_ZNP and USE_ZIGBEE_EZSP are mutually incompatible, you must select exactly one
// #define USE_ZIGBEE_EEPROM // Use the EEPROM from the Sonoff ZBBridge to save Zigbee configuration and data
diff --git a/tasmota/settings.h b/tasmota/settings.h
index d16568768..de77a0390 100644
--- a/tasmota/settings.h
+++ b/tasmota/settings.h
@@ -591,7 +591,9 @@ typedef struct {
uint16_t influxdb_port; // 4CE
power_t interlock[MAX_INTERLOCKS_SET]; // 4D0 MAX_INTERLOCKS = MAX_RELAYS / 2
- uint8_t free_508[36]; // 508
+ int8_t shutter_tilt_config[5][MAX_SHUTTERS]; //508
+ int8_t shutter_tilt_pos[MAX_SHUTTERS]; //51C
+ uint8_t free_520[12]; // 520
uint16_t mqtt_keepalive; // 52C
uint16_t mqtt_socket_timeout; // 52E
@@ -761,6 +763,8 @@ typedef struct {
uint32_t cfg_crc32; // FFC
} TSettings;
+static_assert(sizeof(TSettings) == 4096, "TSettings Size is not correct");
+
typedef struct {
uint16_t valid; // 280 (RTC memory offset 100 - sizeof(RTCRBT))
uint8_t fast_reboot_count; // 282
diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino
index 87db014c0..93abe9daa 100644
--- a/tasmota/support_esp.ino
+++ b/tasmota/support_esp.ino
@@ -103,6 +103,19 @@ String GetDeviceHardware(void) {
#ifdef ESP32
+// ESP32_ARCH contains the name of the architecture (used by autoconf)
+#if CONFIG_IDF_TARGET_ESP32
+ #define ESP32_ARCH "esp32"
+#elif CONFIG_IDF_TARGET_ESP32S2
+ #define ESP32_ARCH "esp32s2"
+#elif CONFIG_IDF_TARGET_ESP32S3
+ #define ESP32_ARCH "esp32s3"
+#elif CONFIG_IDF_TARGET_ESP32C3
+ #define ESP32_ARCH "esp32c3"
+#else
+ #define ESP32_ARCH ""
+#endif
+
// Handle 20k of NVM
#include
diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino
index 6a2d73b37..6ed9eff6f 100644
--- a/tasmota/support_features.ino
+++ b/tasmota/support_features.ino
@@ -772,10 +772,12 @@ void ResponseAppendFeatures(void)
feature8 |= 0x00004000; // xsns_92_scd40.ino
#endif
#if defined(USE_I2C) && defined(USE_HM330X)
- feature8 |= 0x00008000;
+ feature8 |= 0x00008000; // xsns_93_hm330x.ino
#endif
-// feature8 |= 0x00010000;
+#if defined(USE_I2C) && defined(USE_HDC2010)
+ feature8 |= 0x00010000; // xsns_94_hdc2010.ino
+#endif
// feature8 |= 0x00020000;
// feature8 |= 0x00040000;
// feature8 |= 0x00080000;
diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino
index 97fba4b6c..10bbcc495 100644
--- a/tasmota/support_tasmota.ino
+++ b/tasmota/support_tasmota.ino
@@ -565,7 +565,7 @@ bool SendKey(uint32_t key, uint32_t device, uint32_t state)
result = XdrvRulesProcess(0);
}
#ifdef USE_PWM_DIMMER
- if (PWM_DIMMER != TasmotaGlobal.module_type || !result) {
+ if (PWM_DIMMER != TasmotaGlobal.module_type || (!result && !Settings->flag3.mqtt_buttons)) {
#endif // USE_PWM_DIMMER
int32_t payload_save = XdrvMailbox.payload;
XdrvMailbox.payload = device_save << 24 | key << 16 | state << 8 | device;
diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino
index 231eb03f0..f4008b93d 100644
--- a/tasmota/tasmota.ino
+++ b/tasmota/tasmota.ino
@@ -38,6 +38,7 @@
#include // Webserver, Updater
#include
#include
+#include
#include
#include
#ifdef USE_ARDUINO_OTA
diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h
index 59810fccd..f2fe27392 100644
--- a/tasmota/tasmota_configurations.h
+++ b/tasmota/tasmota_configurations.h
@@ -148,6 +148,7 @@
//#define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2k5 code)
//#define USE_AM2320 // [I2cDriver60] Enable AM2320 temperature and humidity Sensor (I2C address 0x5C) (+1k code)
//#define USE_T67XX // [I2cDriver61] Enable Telaire T67XX CO2 sensor (I2C address 0x15) (+1k3 code)
+//#define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code)
//#define USE_SPI // Hardware SPI using GPIO12(MISO), GPIO13(MOSI) and GPIO14(CLK) in addition to two user selectable GPIOs(CS and DC)
//#define USE_RC522 // Add support for MFRC522 13.56Mhz Rfid reader (+6k code)
diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h
index f131a366f..5c33aeeaf 100644
--- a/tasmota/tasmota_version.h
+++ b/tasmota/tasmota_version.h
@@ -20,6 +20,6 @@
#ifndef _TASMOTA_VERSION_H_
#define _TASMOTA_VERSION_H_
-const uint32_t VERSION = 0x0A000001;
+const uint32_t VERSION = 0x0A000002;
#endif // _TASMOTA_VERSION_H_
diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino
index 181917fa1..f5302330f 100644
--- a/tasmota/xdrv_02_9_mqtt.ino
+++ b/tasmota/xdrv_02_9_mqtt.ino
@@ -216,6 +216,12 @@ void MqttInit(void) {
tlsClient = new BearSSL::WiFiClientSecure_light(1024,1024);
#endif
+#ifdef USE_MQTT_AWS_IOT_LIGHT
+ if (443 == Settings->mqtt_port) {
+ static const char * alpn_mqtt = "mqtt"; // needs to be static
+ tlsClient->setALPN(&alpn_mqtt, 1); // need to set alpn to 'mqtt' for AWS IoT
+ }
+#endif
#ifdef USE_MQTT_AWS_IOT
loadTlsDir(); // load key and certificate data from Flash
if ((nullptr != AWS_IoT_Private_Key) && (nullptr != AWS_IoT_Client_Certificate)) {
diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino
index cde3d2e35..1a71d5adb 100644
--- a/tasmota/xdrv_03_energy.ino
+++ b/tasmota/xdrv_03_energy.ino
@@ -600,7 +600,7 @@ void ResponseCmndEnergyTotalYesterdayToday(void) {
Energy.total[i] = (float)(RtcSettings.energy_kWhtotal_ph[i] + Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]) / 100000;
}
- Response_P(PSTR("{\"%s\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s}"),
+ Response_P(PSTR("{\"%s\":{\"" D_JSON_TOTAL "\":%s,\"" D_JSON_YESTERDAY "\":%s,\"" D_JSON_TODAY "\":%s}}"),
XdrvMailbox.command,
EnergyFormat(value_chr, Energy.total, Settings->flag2.energy_resolution, true),
EnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution, true),
diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino
index 16ab3db18..c1dd8a64b 100644
--- a/tasmota/xdrv_10_rules.ino
+++ b/tasmota/xdrv_10_rules.ino
@@ -1941,6 +1941,7 @@ void ExecuteCommandBlock(const char * commands, int len)
//Going to insert the command into backlog
String sCurrentCommand = oneCommand;
sCurrentCommand.trim();
+/*
if (sCurrentCommand.length() > 0
&& backlog.size() < MAX_BACKLOG && !TasmotaGlobal.backlog_mutex)
{
@@ -1950,6 +1951,12 @@ void ExecuteCommandBlock(const char * commands, int len)
TasmotaGlobal.backlog_mutex = false;
insertPosition++;
}
+*/
+ if ((sCurrentCommand.length() > 0) && (backlog.size() < MAX_BACKLOG)) {
+ //Insert into backlog
+ backlog.add(insertPosition, sCurrentCommand);
+ insertPosition++;
+ }
}
return;
}
diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino
index e57981677..efb7a253d 100644
--- a/tasmota/xdrv_12_home_assistant.ino
+++ b/tasmota/xdrv_12_home_assistant.ino
@@ -128,6 +128,24 @@ const char HASS_DISCOVER_SHUTTER_POS[] PROGMEM =
"\"pos_open\":100,"
"\"set_pos_t\":\"%s%d\""; // cmnd/%topic%/ShutterPosition1
+const char HASS_DISCOVER_SHUTTER_TILT[] PROGMEM =
+ ",\"tilt_cmd_t\":\"%s%d\"," // cmnd/%topic%/ShutterTilt1
+ "\"tilt_opnd_val\":%d,"
+ "\"tilt_clsd_val\":%d";
+
+/*
+"tilt_clsd_val": "tilt_closed_value",
+"tilt_cmd_t": "tilt_command_topic",
+"tilt_cmd_tpl": "tilt_command_template",
+"tilt_inv_stat": "tilt_invert_state",
+"tilt_max": "tilt_max",
+"tilt_min": "tilt_min",
+"tilt_opnd_val": "tilt_opened_value",
+"tilt_opt": "tilt_optimistic",
+"tilt_status_t": "tilt_status_topic",
+"tilt_status_tpl": "tilt_status_template",
+*/
+
const char HASS_DISCOVER_SENSOR_HASS_STATUS[] PROGMEM =
",\"json_attr_t\":\"%s\","
"\"unit_of_meas\":\"%%\","
@@ -1020,7 +1038,10 @@ void HAssAnnounceShutters(void)
GetTopic_P(stemp1, STAT, TasmotaGlobal.mqtt_topic, PSTR("SHUTTER"));
GetTopic_P(stemp2, CMND, TasmotaGlobal.mqtt_topic, PSTR("ShutterPosition"));
TryResponseAppend_P(HASS_DISCOVER_SHUTTER_POS, stemp1, i + 1, stemp2, i + 1);
-
+
+ GetTopic_P(stemp1, CMND, TasmotaGlobal.mqtt_topic, PSTR("ShutterTilt"));
+ TryResponseAppend_P(HASS_DISCOVER_SHUTTER_TILT, stemp1, i + 1, Settings->shutter_tilt_config[3][i], Settings->shutter_tilt_config[4][i]);
+
TryResponseAppend_P(HASS_DISCOVER_DEVICE_INFO_SHORT, unique_id, ESP_getChipId());
TryResponseAppend_P(PSTR("}"));
} else {
diff --git a/tasmota/xdrv_23_zigbee_2_devices.ino b/tasmota/xdrv_23_zigbee_2_devices.ino
index e349691c7..23004f9db 100644
--- a/tasmota/xdrv_23_zigbee_2_devices.ino
+++ b/tasmota/xdrv_23_zigbee_2_devices.ino
@@ -95,6 +95,8 @@ protected:
uint8_t _reserved; // power state if the type supports it
};
+Z_Data z_data_unk; // dummy object to mark that data is unknown
+
Z_Data_Type Z_Data::CharToDataType(char c) {
if (c) {
if (c == '_') {
@@ -676,7 +678,7 @@ const M & Z_Data_Set::find(uint8_t ep) const {
// Output: if reference is null, instantiate object and add it at the end of the list
template
M & Z_Data_Set::addIfNull(M & cur, uint8_t ep) {
- if (nullptr == &cur) {
+ if (&z_data_unk == &cur) {
LList_elt * elt = new LList_elt();
elt->val()._endpoint = ep;
this->addToLast((LList_elt*)elt);
@@ -697,7 +699,7 @@ const Z_Data & Z_Data_Set::find(Z_Data_Type type, uint8_t ep) const {
}
}
}
- return *(Z_Data*)nullptr;
+ return z_data_unk; // mark as unknown
}
/*********************************************************************************************\
diff --git a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino
index 3f4f324df..543916efa 100644
--- a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino
+++ b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino
@@ -796,7 +796,7 @@ String Z_Devices::dumpCoordinator(void) const {
String Z_Devices::dumpDevice(uint32_t dump_mode, const Z_Device & device) const {
JsonGeneratorArray json_arr;
- if (&device == nullptr) {
+ if (&device == &device_unk) {
if (dump_mode < 2) {
// dump light mode for all devices
for (const auto & device2 : _devices) {
diff --git a/tasmota/xdrv_23_zigbee_3_hue.ino b/tasmota/xdrv_23_zigbee_3_hue.ino
index a90966ab9..01b7a5fda 100644
--- a/tasmota/xdrv_23_zigbee_3_hue.ino
+++ b/tasmota/xdrv_23_zigbee_3_hue.ino
@@ -152,21 +152,22 @@ void ZigbeeHueGroups(String * lights) {
}
void ZigbeeSendHue(uint16_t shortaddr, uint16_t cluster, uint8_t cmd, const SBuffer & s) {
- ZCLMessage zcl(&s ? s.len() : 0);
+ ZCLMessage zcl(s.len());
zcl.shortaddr = shortaddr;
zcl.cluster = cluster;
zcl.cmd = cmd;
zcl.clusterSpecific = true;
zcl.needResponse = true;
zcl.direct = false; // discover route
- if (&s) { zcl.buf.replace(s); }
+ zcl.buf.replace(s);
zigbeeZCLSendCmd(zcl);
}
// Send commands
// Power On/Off
void ZigbeeHuePower(uint16_t shortaddr, bool power) {
- ZigbeeSendHue(shortaddr, 0x0006, power ? 1 : 0, *(SBuffer*)nullptr);
+ SBuffer s(0);
+ ZigbeeSendHue(shortaddr, 0x0006, power ? 1 : 0, s);
zigbee_devices.getShortAddr(shortaddr).setPower(power, 0);
}
diff --git a/tasmota/xdrv_23_zigbee_9_serial.ino b/tasmota/xdrv_23_zigbee_9_serial.ino
index 649f377a4..3eaea4048 100644
--- a/tasmota/xdrv_23_zigbee_9_serial.ino
+++ b/tasmota/xdrv_23_zigbee_9_serial.ino
@@ -281,7 +281,6 @@ void ZigbeeInputLoop(void) {
// Initialize internal structures
void ZigbeeInitSerial(void)
{
-// AddLog(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem1 = %d"), ESP_getFreeHeap());
zigbee.active = false;
if (PinUsed(GPIO_ZIGBEE_RX) && PinUsed(GPIO_ZIGBEE_TX)) {
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "GPIOs Rx:%d Tx:%d"), Pin(GPIO_ZIGBEE_RX), Pin(GPIO_ZIGBEE_TX));
@@ -293,9 +292,7 @@ void ZigbeeInitSerial(void)
uint32_t aligned_buffer = ((uint32_t)TasmotaGlobal.serial_in_buffer + 3) & ~3;
zigbee_buffer = new PreAllocatedSBuffer(sizeof(TasmotaGlobal.serial_in_buffer) - 3, (char*) aligned_buffer);
} else {
-// AddLog(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem2 = %d"), ESP_getFreeHeap());
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
-// AddLog(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem3 = %d"), ESP_getFreeHeap());
}
if (PinUsed(GPIO_ZIGBEE_RST)) {
@@ -312,7 +309,6 @@ void ZigbeeInitSerial(void)
zigbee.state_machine = true; // start the state machine
ZigbeeSerial->flush();
}
-// AddLog(LOG_LEVEL_INFO, PSTR("ZigbeeInit Mem9 = %d"), ESP_getFreeHeap());
}
#ifdef USE_ZIGBEE_ZNP
diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino
index bb241d5e4..5f2e412a4 100644
--- a/tasmota/xdrv_23_zigbee_A_impl.ino
+++ b/tasmota/xdrv_23_zigbee_A_impl.ino
@@ -68,10 +68,6 @@ void (* const ZigbeeCommand[])(void) PROGMEM = {
// Initialize internal structures
void ZigbeeInit(void)
{
-// #pragma GCC diagnostic push
-// #pragma GCC diagnostic ignored "-Winvalid-offsetof"
-// Serial.printf(">>> offset %d %d %d\n", Z_offset(Z_Data_Light, dimmer), Z_offset(Z_Data_Light, x), Z_offset(Z_Data_Thermo, temperature));
-// #pragma GCC diagnostic pop
// Check if settings in Flash are set
if (PinUsed(GPIO_ZIGBEE_RX) && PinUsed(GPIO_ZIGBEE_TX)) {
if (0 == Settings->zb_channel) {
@@ -108,11 +104,13 @@ void ZigbeeInit(void)
#ifdef USE_ZIGBEE_EZSP
// Check the I2C EEprom
- Wire.beginTransmission(USE_ZIGBEE_ZBBRIDGE_EEPROM);
- uint8_t error = Wire.endTransmission();
- if (0 == error) {
- AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS " 0x%02X"), USE_ZIGBEE_ZBBRIDGE_EEPROM);
- zigbee.eeprom_present = true;
+ if (TasmotaGlobal.i2c_enabled) {
+ Wire.beginTransmission(USE_ZIGBEE_ZBBRIDGE_EEPROM);
+ uint8_t error = Wire.endTransmission();
+ if (0 == error) {
+ AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE D_ZIGBEE_EEPROM_FOUND_AT_ADDRESS " 0x%02X"), USE_ZIGBEE_ZBBRIDGE_EEPROM);
+ zigbee.eeprom_present = true;
+ }
}
#endif
}
@@ -1222,7 +1220,7 @@ void CmndZbOccupancy(void) {
zigbee_devices.dirty();
} else {
const Z_Data_PIR & pir_found = (const Z_Data_PIR&) device.data.find(Z_Data_Type::Z_PIR);
- if (&pir_found != nullptr) {
+ if (&pir_found != &z_data_unk) {
occupancy_time = pir_found.getTimeoutSeconds();
}
}
@@ -1547,7 +1545,7 @@ void CmndZbStatus(void) {
dump = zigbee_devices.dumpDevice(XdrvMailbox.index, device);
} else {
if (XdrvMailbox.index >= 2) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; }
- dump = zigbee_devices.dumpDevice(XdrvMailbox.index, *(Z_Device*)nullptr);
+ dump = zigbee_devices.dumpDevice(XdrvMailbox.index, device_unk);
}
}
@@ -1992,7 +1990,7 @@ void ZigbeeShow(bool json)
// Sensors
const Z_Data_Thermo & thermo = device.data.find();
- if (&thermo != nullptr) {
+ if (&thermo != &z_data_unk) {
bool validTemp = thermo.validTemperature();
bool validTempTarget = thermo.validTempTarget();
bool validThSetpoint = thermo.validThSetpoint();
@@ -2027,12 +2025,12 @@ void ZigbeeShow(bool json)
// Light, switches and plugs
const Z_Data_OnOff & onoff = device.data.find();
- bool onoff_display = (&onoff != nullptr) ? onoff.validPower() : false;
+ bool onoff_display = (&onoff != &z_data_unk) ? onoff.validPower() : false;
const Z_Data_Light & light = device.data.find();
- bool light_display = (&light != nullptr) ? light.validDimmer() : false;
+ bool light_display = (&light != &z_data_unk) ? light.validDimmer() : false;
const Z_Data_Plug & plug = device.data.find();
- bool plug_voltage = (&plug != nullptr) ? plug.validMainsVoltage() : false;
- bool plug_power = (&plug != nullptr) ? plug.validMainsPower() : false;
+ bool plug_voltage = (&plug != &z_data_unk) ? plug.validMainsVoltage() : false;
+ bool plug_power = (&plug != &z_data_unk) ? plug.validMainsPower() : false;
if (onoff_display || light_display || plug_voltage || plug_power) {
int8_t channels = device.getLightChannels();
if (channels < 0) { channels = 5; } // if number of channel is unknown, display all known attributes
@@ -2040,7 +2038,7 @@ void ZigbeeShow(bool json)
if (onoff_display) {
WSContentSend_P(PSTR(" %s"), onoff.getPower() ? PSTR(D_ON) : PSTR(D_OFF));
}
- if (&light != nullptr) {
+ if (&light != &z_data_unk) {
if (light.validDimmer() && (channels >= 1)) {
WSContentSend_P(PSTR(" 🔅 %d%%"), changeUIntScale(light.getDimmer(),0,254,0,100));
}
@@ -2108,7 +2106,7 @@ void ZigbeeShowMap(void) {
if (zigbee.init_phase) {
WSContentSend_P(PSTR(D_ZIGBEE_NOT_STARTED));
} else if (zigbee.mapping_in_progress) {
- int32_t mapping_remaining = 1 + (zigbee.mapping_end_time - millis()) / 1000;
+ int32_t mapping_remaining = 1 + ((int32_t) zigbee.mapping_end_time - millis()) / 1000;
if (mapping_remaining < 0) { mapping_remaining = 0; }
WSContentSend_P(PSTR(D_ZIGBEE_MAPPING_IN_PROGRESS_SEC), mapping_remaining);
WSContentSend_P(msg[ZB_WEB_AUTO_REFRESH]);
diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino
index 9e57438a8..0e1e1e23a 100644
--- a/tasmota/xdrv_27_shutter.ino
+++ b/tasmota/xdrv_27_shutter.ino
@@ -59,7 +59,7 @@ const char kShutterCommands[] PROGMEM = D_PRFX_SHUTTER "|"
D_CMND_SHUTTER_SETHALFWAY "|" D_CMND_SHUTTER_SETCLOSE "|" D_CMND_SHUTTER_SETOPEN "|" D_CMND_SHUTTER_INVERT "|" D_CMND_SHUTTER_CLIBRATION "|"
D_CMND_SHUTTER_MOTORDELAY "|" D_CMND_SHUTTER_FREQUENCY "|" D_CMND_SHUTTER_BUTTON "|" D_CMND_SHUTTER_LOCK "|" D_CMND_SHUTTER_ENABLEENDSTOPTIME "|" D_CMND_SHUTTER_INVERTWEBBUTTONS "|"
D_CMND_SHUTTER_STOPOPEN "|" D_CMND_SHUTTER_STOPCLOSE "|" D_CMND_SHUTTER_STOPTOGGLE "|" D_CMND_SHUTTER_STOPTOGGLEDIR "|" D_CMND_SHUTTER_STOPPOSITION "|" D_CMND_SHUTTER_INCDEC "|"
- D_CMND_SHUTTER_UNITTEST "|";
+ D_CMND_SHUTTER_UNITTEST "|" D_CMND_SHUTTER_TILTCONFIG "|" D_CMND_SHUTTER_SETTILT "|";
void (* const ShutterCommand[])(void) PROGMEM = {
&CmndShutterOpen, &CmndShutterClose, &CmndShutterToggle, &CmndShutterToggleDir, &CmndShutterStop, &CmndShutterPosition,
@@ -67,9 +67,9 @@ void (* const ShutterCommand[])(void) PROGMEM = {
&CmndShutterSetHalfway, &CmndShutterSetClose, &CmndShutterSetOpen, &CmndShutterInvert, &CmndShutterCalibration , &CmndShutterMotorDelay,
&CmndShutterFrequency, &CmndShutterButton, &CmndShutterLock, &CmndShutterEnableEndStopTime, &CmndShutterInvertWebButtons,
&CmndShutterStopOpen, &CmndShutterStopClose, &CmndShutterStopToggle, &CmndShutterStopToggleDir, &CmndShutterStopPosition, &CmndShutterIncDec,
- &CmndShutterUnitTest};
+ &CmndShutterUnitTest,&CmndShutterTiltConfig,&CmndShutterSetTilt};
- const char JSON_SHUTTER_POS[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Position\":%d,\"Direction\":%d,\"Target\":%d}";
+ const char JSON_SHUTTER_POS[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Position\":%d,\"Direction\":%d,\"Target\":%d,\"Tilt\":%d}";
const char JSON_SHUTTER_BUTTON[] PROGMEM = "\"" D_PRFX_SHUTTER "%d\":{\"Button%d\":%d}";
#include
@@ -93,6 +93,12 @@ struct SHUTTER {
uint16_t pwm_value; // dutyload of PWM 0..1023 on ESP8266
uint16_t close_velocity_max; // maximum of PWM change during closeing. Defines velocity on opening. Steppers and Servos only
int32_t accelerator; // speed of ramp-up, ramp down of shutters with velocity control. Steppers and Servos only
+ int8_t tilt_config[5]; // tilt_min, tilt_max, duration, tilt_closed_value, tilt_opened_value
+ int8_t tilt_real_pos; // -90 to 90
+ int16_t tilt_target_pos;
+ int16_t tilt_start_pos;
+ uint8_t tilt_velocity; // degree rotation per step 0.05sec
+ uint16_t venetian_delay = 0; // Delay in steps before venetian shutter start physical moving. Based on tilt position
} Shutter[MAX_SHUTTERS];
struct SHUTTERGLOBAL {
@@ -103,6 +109,7 @@ struct SHUTTERGLOBAL {
uint8_t skip_relay_change; // avoid overrun at endstops
uint8_t start_reported = 0; // indicates of the shutter start was reported through MQTT JSON
uint16_t open_velocity_max = 1000; // maximum of PWM change during opening. Defines velocity on opening. Steppers and Servos only
+ uint16_t venetian_delay = 0;
} ShutterGlobal;
#define SHT_DIV_ROUND(__A, __B) (((__A) + (__B)/2) / (__B))
@@ -111,8 +118,9 @@ void ShutterLogPos(uint32_t i)
{
char stemp2[10];
dtostrfd((float)Shutter[i].time / STEPS_PER_SECOND, 2, stemp2);
- AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d"),
- i+1, Shutter[i].real_position, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction, Shutter[i].motordelay, stemp2, Shutter[i].pwm_velocity, Shutter[i].pwm_value);
+ AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Real %d, Start %d, Stop %d, Dir %d, Delay %d, Rtc %s [s], Freq %d, PWM %d, Tilt %d"),
+ i+1, Shutter[i].real_position, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction, Shutter[i].motordelay, stemp2,
+ Shutter[i].pwm_velocity, Shutter[i].pwm_value,Shutter[i].tilt_real_pos);
}
void ExecuteCommandPowerShutter(uint32_t device, uint32_t state, uint32_t source)
@@ -312,6 +320,14 @@ void ShutterInit(void)
Shutter[i].motordelay = Settings->shutter_motordelay[i];
Shutter[i].lastdirection = (50 < Settings->shutter_position[i]) ? 1 : -1;
+ // Venetian Blind
+ for (uint8_t k=0; k<5; k++) {
+ Shutter[i].tilt_config[k] = Settings->shutter_tilt_config[k][i];
+ }
+ Shutter[i].tilt_real_pos = Settings->shutter_tilt_pos[i];
+ Shutter[i].tilt_velocity = Shutter[i].tilt_config[2] > 0 ? (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])/Shutter[i].tilt_config[2] : 1;
+
+
switch (ShutterGlobal.position_mode) {
case SHT_PWM_VALUE:
ShutterGlobal.open_velocity_max = RESOLUTION;
@@ -323,9 +339,9 @@ void ShutterInit(void)
Shutter[i].close_velocity_max = ShutterGlobal.open_velocity_max*Shutter[i].open_time / Shutter[i].close_time;
//AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d Openvel %d, Closevel: %d"),i, ShutterGlobal.open_velocity_max, Shutter[i].close_velocity_max);
- AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Init. Pos %d, Inverted %d, Locked %d, End stop time enabled %d, webButtons inverted %d"),
+ AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr%d Init. Pos %d, Inverted %d, Locked %d, End stop time enabled %d, webButtons inverted %d, delay: %d"),
i+1, Shutter[i].real_position,
- (Settings->shutter_options[i]&1) ? 1 : 0, (Settings->shutter_options[i]&2) ? 1 : 0, (Settings->shutter_options[i]&4) ? 1 : 0, (Settings->shutter_options[i]&8) ? 1 : 0);
+ (Settings->shutter_options[i]&1) ? 1 : 0, (Settings->shutter_options[i]&2) ? 1 : 0, (Settings->shutter_options[i]&4) ? 1 : 0, (Settings->shutter_options[i]&8) ? 1 : 0), Shutter[i].motordelay;
} else {
// terminate loop at first INVALID Shutter[i].
@@ -355,7 +371,7 @@ void ShutterReportPosition(bool always, uint32_t index)
}
if (i && index == MAX_SHUTTERS) { ResponseAppend_P(PSTR(",")); }
uint32_t target = ShutterRealToPercentPosition(Shutter[i].target_position, i);
- ResponseAppend_P(JSON_SHUTTER_POS, i+1, (Settings->shutter_options[i] & 1) ? 100-position : position, Shutter[i].direction,(Settings->shutter_options[i] & 1) ? 100-target : target );
+ ResponseAppend_P(JSON_SHUTTER_POS, i+1, (Settings->shutter_options[i] & 1) ? 100-position : position, Shutter[i].direction,(Settings->shutter_options[i] & 1) ? 100-target : target, Shutter[i].tilt_real_pos );
}
ResponseJsonEnd();
if (always || (TasmotaGlobal.rules_flag.shutter_moving)) {
@@ -431,11 +447,12 @@ void ShutterDecellerateForStop(uint8_t i)
//prepare for stop PWM
Shutter[i].accelerator = 0;
Shutter[i].pwm_velocity = 0;
+ //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain %d count %d -> target %d, dir %d"), missing_steps, RtcSettings.pulse_counter[i], (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND, Shutter[i].direction);
while (RtcSettings.pulse_counter[i] < (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND && missing_steps > 0) {
}
analogWrite(Pin(GPIO_PWM1, i), 0); // removed with 8.3 because of reset caused by watchog
Shutter[i].real_position = ShutterCalculatePosition(i);
- AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d"), missing_steps);
+ //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Remain steps %d"), missing_steps);
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Real %d, Pulsecount %d, tobe %d, Start %d"), Shutter[i].real_position,RtcSettings.pulse_counter[i], (uint32_t)(Shutter[i].target_position-Shutter[i].start_position)*Shutter[i].direction*ShutterGlobal.open_velocity_max/RESOLUTION/STEPS_PER_SECOND, Shutter[i].start_position);
}
Shutter[i].direction = 0;
@@ -501,11 +518,13 @@ void ShutterUpdatePosition(void)
XdrvRulesProcess(0);
ShutterGlobal.start_reported = 1;
}
- AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d, cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, nStop %d, Trgt %d, mVelo %d, Dir %d"),
- Shutter[i].time, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,
- next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction);
+ AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Time %d, cStop %d, cVelo %d, mVelo %d, aVelo %d, mRun %d, aPos %d, aPos2 %d, nStop %d, Trgt %d, mVelo %d, Dir %d, Tilt %d"),
+ Shutter[i].time, current_stop_way, current_pwm_velocity, velocity_max, Shutter[i].accelerator, min_runtime_ms, current_real_position,Shutter[i].real_position,
+ next_possible_stop_position, Shutter[i].target_position, velocity_change_per_step_max, Shutter[i].direction,Shutter[i].tilt_real_pos);
- if ( Shutter[i].real_position * Shutter[i].direction >= Shutter[i].target_position * Shutter[i].direction || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].accelerator= Shutter[i].target_position * Shutter[i].direction &&
+ Shutter[i].tilt_real_pos * Shutter[i].direction * Shutter[i].tilt_config[2] >= Shutter[i].tilt_target_pos * Shutter[i].direction * Shutter[i].tilt_config[2])
+ || (ShutterGlobal.position_mode == SHT_COUNTER && Shutter[i].accelerator <0 && Shutter[i].pwm_velocity+Shutter[i].acceleratorshutter_position[i] = ShutterRealToPercentPosition(Shutter[i].real_position, i);
Shutter[i].start_position = Shutter[i].real_position;
+ // manage venetian blinds
+ Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 0 ? Shutter[i].tilt_config[0] : Shutter[i].tilt_target_pos;
+ Shutter[i].tilt_target_pos = Settings->shutter_position[i] == 100 ? Shutter[i].tilt_config[1] : Shutter[i].tilt_target_pos;
+ if (abs(Shutter[i].tilt_real_pos - Shutter[i].tilt_target_pos) > 10) {
+ AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Tilt does not match akt %d, target %d"),Shutter[i].tilt_real_pos,Shutter[i].tilt_target_pos);
+ XdrvMailbox.payload = -99;
+ XdrvMailbox.index = i+1;
+ CmndShutterPosition();
+ return;
+ }
ShutterLogPos(i);
// sending MQTT result to broker
@@ -555,8 +584,8 @@ void ShutterAllowPreStartProcedure(uint8_t i)
void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
{
//AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: dir %d, delta1 %d, delta2 %d, grant %d"),direction, (Shutter[i].open_max - Shutter[i].real_position) / Shutter[i].close_velocity, Shutter[i].real_position / Shutter[i].close_velocity, 2+Shutter[i].motordelay);
- if ( ( (1 == direction) && ((Shutter[i].open_max - Shutter[i].real_position) / 100 <= 2) )
- || ( (-1 == direction) && (Shutter[i].real_position / Shutter[i].close_velocity <= 2)) ) {
+ if ( ( ( (1 == direction) && ((Shutter[i].open_max - Shutter[i].real_position) / 100 <= 2))
+ || ( (-1 == direction) && (Shutter[i].real_position / Shutter[i].close_velocity <= 2)) ) && abs(Shutter[i].tilt_real_pos-Shutter[i].tilt_target_pos)/Shutter[i].tilt_velocity <= 2) {
ShutterGlobal.skip_relay_change = 1;
} else {
Shutter[i].pwm_velocity = 0;
@@ -579,7 +608,14 @@ void ShutterStartInit(uint32_t i, int32_t direction, int32_t target_pos)
ShutterGlobal.skip_relay_change = 0;
TasmotaGlobal.rules_flag.shutter_moved = 0;
ShutterGlobal.start_reported = 0;
- //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: real %d, start %d, counter %d,freq_max %d, dir %d, freq %d"),Shutter[i].real_position, Shutter[i].start_position ,RtcSettings.pulse_counter[i],ShutterGlobal.open_velocity_max , Shutter[i].direction ,ShutterGlobal.open_velocity_max );
+ Shutter[i].tilt_real_pos = tmax(tmin(Shutter[i].tilt_real_pos,Shutter[i].tilt_config[1]),Shutter[i].tilt_config[0]);
+ Shutter[i].tilt_start_pos = Shutter[i].tilt_real_pos;
+ if (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0] != 0) {
+ Shutter[i].venetian_delay = (Shutter[i].direction > 0 ? Shutter[i].tilt_config[1]-Shutter[i].tilt_real_pos : Shutter[i].tilt_real_pos-Shutter[i].tilt_config[0]) * Shutter[i].tilt_config[2] / (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]);
+ //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: real %d, start %d, counter %d,freq_max %d, dir %d, freq %d"),Shutter[i].real_position, Shutter[i].start_position ,RtcSettings.pulse_counter[i],ShutterGlobal.open_velocity_max , Shutter[i].direction ,ShutterGlobal.open_velocity_max );
+ //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: %d VenetianDelay: %d, Pos: %d, Dir: %d, Delta: %d, Durat: %d, Start: %d, Target: %d"),
+ //i, Shutter[i].venetian_delay, Shutter[i].tilt_real_pos,Shutter[i].direction,(Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0]), Shutter[i].tilt_config[2],Shutter[i].tilt_start_pos,Shutter[i].tilt_target_pos);
+ }
}
//AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Start shtr%d from %d to %d in direction %d"), i, Shutter[i].start_position, Shutter[i].target_position, Shutter[i].direction);
}
@@ -595,7 +631,10 @@ int32_t ShutterCalculatePosition(uint32_t i)
case SHT_TIME:
case SHT_TIME_UP_DOWN:
case SHT_TIME_GARAGE:
- return Shutter[i].start_position + ( (Shutter[i].time - Shutter[i].motordelay) * (Shutter[i].direction > 0 ? RESOLUTION : -Shutter[i].close_velocity));
+ if (Shutter[i].time <= Shutter[i].venetian_delay && Shutter[i].tilt_config[2] > 0) {
+ Shutter[i].tilt_real_pos = (Shutter[i].tilt_start_pos + ((Shutter[i].direction * (int16_t)Shutter[i].time * (Shutter[i].tilt_config[1]-Shutter[i].tilt_config[0])) / Shutter[i].tilt_config[2]));
+ }
+ return Shutter[i].start_position + ( (Shutter[i].time - tmin(Shutter[i].venetian_delay+Shutter[i].motordelay, Shutter[i].time)) * (Shutter[i].direction > 0 ? RESOLUTION : -Shutter[i].close_velocity));
break;
case SHT_PWM_TIME:
break;
@@ -1075,14 +1114,19 @@ void CmndShutterPosition(void)
Shutter[index].target_position = ShutterPercentToRealPosition(target_pos_percent, index);
//Shutter[i].accelerator[index] = ShutterGlobal.open_velocity_max / ((Shutter[i].motordelay[index] > 0) ? Shutter[i].motordelay[index] : 1);
//Shutter[i].target_position[index] = XdrvMailbox.payload < 5 ? Settings->shuttercoeff[2][index] * XdrvMailbox.payload : Settings->shuttercoeff[1][index] * XdrvMailbox.payload + Settings->shuttercoeff[0,index];
- AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: lastsource %d:, real %d, target %d, payload %d"), TasmotaGlobal.last_source, Shutter[index].real_position ,Shutter[index].target_position,target_pos_percent);
+ AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: lastsource %d:, real %d, target %d, tiltreal: %d, tilttarget: %d, payload %d"), TasmotaGlobal.last_source, Shutter[index].real_position ,Shutter[index].target_position,Shutter[index].tilt_real_pos, Shutter[index].tilt_target_pos,target_pos_percent);
}
- if ( (target_pos_percent >= 0) && (target_pos_percent <= 100) && abs(Shutter[index].target_position - Shutter[index].real_position ) / Shutter[index].close_velocity > 2) {
+ if ( (target_pos_percent >= 0) && (target_pos_percent <= 100) &&
+ (abs(Shutter[index].target_position - Shutter[index].real_position ) / Shutter[index].close_velocity > 2 ||
+ abs(Shutter[index].tilt_target_pos - Shutter[index].tilt_real_pos ) / Shutter[index].tilt_velocity > 2) ) {
if (Settings->shutter_options[index] & 4) {
if (0 == target_pos_percent) Shutter[index].target_position -= 1 * RESOLUTION * STEPS_PER_SECOND;
if (100 == target_pos_percent) Shutter[index].target_position += 1 * RESOLUTION * STEPS_PER_SECOND;
}
int8_t new_shutterdirection = Shutter[index].real_position < Shutter[index].target_position ? 1 : -1;
+ if (Shutter[index].real_position == Shutter[index].target_position) {
+ new_shutterdirection = Shutter[index].tilt_real_pos < Shutter[index].tilt_target_pos ? 1 : -1;
+ }
if (Shutter[index].direction == -new_shutterdirection) {
ShutterPowerOff(index);
}
@@ -1187,6 +1231,7 @@ void CmndShutterMotorDelay(void)
if (XdrvMailbox.data_len > 0) {
Settings->shutter_motordelay[XdrvMailbox.index -1] = (uint8_t)(STEPS_PER_SECOND * CharToFloat(XdrvMailbox.data));
ShutterInit();
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("SHT: Shtr Init1. realdelay %d"),Shutter[XdrvMailbox.index -1].motordelay);
}
char time_chr[10];
dtostrfd((float)(Shutter[XdrvMailbox.index -1].motordelay) / STEPS_PER_SECOND, 2, time_chr);
@@ -1371,6 +1416,29 @@ void CmndShutterSetHalfway(void)
}
}
+void CmndShutterSetTilt(void)
+{
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) {
+ if (XdrvMailbox.payload != -99 && XdrvMailbox.payload >= Shutter[XdrvMailbox.index -1].tilt_config[0] && XdrvMailbox.payload <= Shutter[XdrvMailbox.index -1].tilt_config[1] ) {
+ Shutter[XdrvMailbox.index -1].tilt_target_pos = XdrvMailbox.payload;
+ XdrvMailbox.payload = -99;
+ }
+ if ((XdrvMailbox.data_len > 1) && (XdrvMailbox.payload <= 0)) {
+ if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_OPEN) ) {
+ Shutter[XdrvMailbox.index -1].tilt_target_pos = Shutter[XdrvMailbox.index -1].tilt_config[3]; // open position
+ XdrvMailbox.payload = -99;
+ }
+ if (!strcasecmp(XdrvMailbox.data,D_CMND_SHUTTER_CLOSE) ) {
+ Shutter[XdrvMailbox.index -1].tilt_target_pos = Shutter[XdrvMailbox.index -1].tilt_config[4]; // close position
+ XdrvMailbox.payload = -99;
+ }
+ }
+ }
+ XdrvMailbox.data[0] = '\0';
+ ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos);
+ CmndShutterPosition();
+}
+
void CmndShutterFrequency(void)
{
if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 20000)) {
@@ -1387,6 +1455,7 @@ void CmndShutterSetClose(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) {
Shutter[XdrvMailbox.index -1].real_position = 0;
+ Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[0];
ShutterStartInit(XdrvMailbox.index -1, 0, 0);
Settings->shutter_position[XdrvMailbox.index -1] = 0;
ResponseCmndIdxChar(D_CONFIGURATION_RESET);
@@ -1397,6 +1466,7 @@ void CmndShutterSetOpen(void)
{
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) {
Shutter[XdrvMailbox.index -1].real_position = Shutter[XdrvMailbox.index -1].open_max;
+ Shutter[XdrvMailbox.index -1].tilt_real_pos = Shutter[XdrvMailbox.index -1].tilt_config[1];
ShutterStartInit(XdrvMailbox.index -1, 0, Shutter[XdrvMailbox.index -1].open_max);
Settings->shutter_position[XdrvMailbox.index -1] = 100;
ResponseCmndIdxChar(D_CONFIGURATION_RESET);
@@ -1494,6 +1564,28 @@ void CmndShutterInvertWebButtons(void) {
ShutterOptionsSetHelper(8);
}
+void CmndShutterTiltConfig(void) {
+ if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) {
+ if (XdrvMailbox.data_len > 0) {
+ uint8_t i = 0;
+ char *str_ptr;
+ char data_copy[strlen(XdrvMailbox.data) +1];
+ strncpy(data_copy, XdrvMailbox.data, sizeof(data_copy)); // Duplicate data as strtok_r will modify it.
+ // Loop through the data string, splitting on ' ' seperators.
+ for (char *str = strtok_r(data_copy, " ", &str_ptr); str && i < 6; str = strtok_r(nullptr, " ", &str_ptr), i++) {
+ Shutter[XdrvMailbox.index -1].tilt_config[i] = Settings->shutter_tilt_config[i][XdrvMailbox.index -1] = atoi(str);
+ }
+ ShutterInit();
+ ResponseCmndIdxChar(XdrvMailbox.data);
+ } else {
+ char setting_chr[30] = "0";
+ snprintf_P(setting_chr, sizeof(setting_chr), PSTR("SHT:%d %d %d %d %d %d"), XdrvMailbox.index -1,Shutter[XdrvMailbox.index -1].tilt_config[0], Shutter[XdrvMailbox.index -1].tilt_config[1],Shutter[XdrvMailbox.index -1].tilt_config[2],Shutter[XdrvMailbox.index -1].tilt_config[3],Shutter[XdrvMailbox.index -1].tilt_config[4]);
+ ResponseCmndIdxChar(setting_chr);
+ }
+ AddLog(LOG_LEVEL_INFO, PSTR("SHT: TiltConfig %d, min: %d, max %d, runtime %d, close_pos: %d, open_pos: %d"), XdrvMailbox.index ,Shutter[XdrvMailbox.index -1].tilt_config[0], Shutter[XdrvMailbox.index -1].tilt_config[1],Shutter[XdrvMailbox.index -1].tilt_config[2],Shutter[XdrvMailbox.index -1].tilt_config[3],Shutter[XdrvMailbox.index -1].tilt_config[4]);
+ }
+}
+
/*********************************************************************************************\
* Interface
\*********************************************************************************************/
@@ -1524,7 +1616,7 @@ bool Xdrv27(uint8_t function)
uint8_t target = (Settings->shutter_options[i] & 1) ? 100 - ShutterRealToPercentPosition(Shutter[i].target_position, i) : ShutterRealToPercentPosition(Shutter[i].target_position, i);
ResponseAppend_P(",");
- ResponseAppend_P(JSON_SHUTTER_POS, i+1, position, Shutter[i].direction,target);
+ ResponseAppend_P(JSON_SHUTTER_POS, i+1, position, Shutter[i].direction,target, Shutter[i].tilt_real_pos);
#ifdef USE_DOMOTICZ
if ((0 == TasmotaGlobal.tele_period) && (0 == i)) {
DomoticzSensor(DZ_SHUTTER, position);
diff --git a/tasmota/xdrv_35_pwm_dimmer.ino b/tasmota/xdrv_35_pwm_dimmer.ino
index 261caa0c7..4b5101818 100644
--- a/tasmota/xdrv_35_pwm_dimmer.ino
+++ b/tasmota/xdrv_35_pwm_dimmer.ino
@@ -758,7 +758,7 @@ bool Xdrv35(uint8_t function)
case FUNC_BUTTON_PRESSED:
// If the button is pressed or was just released, ...
- if (!XdrvMailbox.payload || button_pressed[XdrvMailbox.index]) {
+ if (!Settings->flag3.mqtt_buttons && (!XdrvMailbox.payload || button_pressed[XdrvMailbox.index])) {
uint32_t button_index = XdrvMailbox.index;
uint32_t now = millis();
diff --git a/tasmota/xdrv_39_thermostat.ino b/tasmota/xdrv_39_thermostat.ino
index e1a3f21ca..a11db79b8 100644
--- a/tasmota/xdrv_39_thermostat.ino
+++ b/tasmota/xdrv_39_thermostat.ino
@@ -778,7 +778,7 @@ void ThermostatCalculatePI(uint8_t ctr_output)
// Minimum action limiter
// If result is less than the minimum action time, adjust to minimum value
- if ((Thermostat[ctr_output].time_total_pi <= abs(((uint32_t)Thermostat[ctr_output].time_min_action * 60)))
+ if ((Thermostat[ctr_output].time_total_pi <= abs(((int32_t)Thermostat[ctr_output].time_min_action * 60)))
&& (Thermostat[ctr_output].time_total_pi != 0)) {
Thermostat[ctr_output].time_total_pi = ((int32_t)Thermostat[ctr_output].time_min_action * 60);
}
diff --git a/tasmota/xdrv_52_2_berry_native.ino b/tasmota/xdrv_52_2_berry_native.ino
index 906db8a9d..e8acc8039 100644
--- a/tasmota/xdrv_52_2_berry_native.ino
+++ b/tasmota/xdrv_52_2_berry_native.ino
@@ -494,6 +494,49 @@ int32_t be_convert_single_elt(bvm *vm, int32_t idx, const char * arg_type = null
return ret;
}
+extern "C" {
+
+ /*********************************************************************************************\
+ * Generalized virtual members for modules
+ *
+ * Takes a pointer to be_constint_t array and size
+ * Returns true if a match was found. In such case the result is on Berry stack
+ *
+ * Encoding depend on prefix (which is skipped when matching names):
+ * 1. `COLOR_WHITE` int value
+ * 3. `$SYMBOL_OK"` string pointer
+ * 4. `&seg7_font` comptr
+ \*********************************************************************************************/
+ bool be_module_member(bvm *vm, const be_constint_t * definitions, size_t def_len);
+ bool be_module_member(bvm *vm, const be_constint_t * definitions, size_t def_len) {
+ int32_t argc = be_top(vm); // Get the number of arguments
+ if (argc == 1 && be_isstring(vm, 1)) {
+ const char * needle = be_tostring(vm, 1);
+ int32_t idx;
+
+ idx = bin_search(needle, &definitions[0].name, sizeof(definitions[0]), def_len);
+ if (idx >= 0) {
+ // we did have a match
+ const char * key = definitions[idx].name;
+ switch (key[0]) {
+ // switch depending on the first char of the key, indicating the type
+ case '$': // string
+ be_pushstring(vm, (const char*) definitions[idx].value);
+ break;
+ case '&': // native function
+ be_pushntvfunction(vm, (bntvfunc) definitions[idx].value);
+ break;
+ default: // int
+ be_pushint(vm, definitions[idx].value);
+ break;
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+}
+
/*********************************************************************************************\
* Manage timeout for Berry code
*
diff --git a/tasmota/xdrv_52_3_berry_gpio.ino b/tasmota/xdrv_52_3_berry_gpio.ino
index 9672724dc..f694b6444 100644
--- a/tasmota/xdrv_52_3_berry_gpio.ino
+++ b/tasmota/xdrv_52_3_berry_gpio.ino
@@ -34,6 +34,18 @@
\*********************************************************************************************/
extern "C" {
+ #include "berry/include/be_gpio_defines.h"
+
+ // virtual member
+ int gp_member(bvm *vm);
+ int gp_member(bvm *vm) {
+ if (be_module_member(vm, lv_gpio_constants, lv_gpio_constants_size)) {
+ be_return(vm);
+ } else {
+ be_return_nil(vm);
+ }
+ }
+
int gp_pin_mode(bvm *vm);
int gp_pin_mode(bvm *vm) {
int32_t argc = be_top(vm); // Get the number of arguments
@@ -161,7 +173,12 @@ extern "C" {
if (argc == 2 && be_isint(vm, 2)) {
index = be_toint(vm, 2);
}
- bool ret = PinUsed(pin, index);
+ bool ret;
+ if (pin == GPIO_OPTION_A) {
+ ret = bitRead(TasmotaGlobal.gpio_optiona.data, index);
+ } else {
+ ret = PinUsed(pin, index);
+ }
be_pushbool(vm, ret);
be_return(vm);
}
diff --git a/tasmota/xdrv_52_3_berry_lvgl.ino b/tasmota/xdrv_52_3_berry_lvgl.ino
index 1a0629c9d..af435851b 100644
--- a/tasmota/xdrv_52_3_berry_lvgl.ino
+++ b/tasmota/xdrv_52_3_berry_lvgl.ino
@@ -726,30 +726,16 @@ extern "C" {
int lv0_member(bvm *vm);
int lv0_member(bvm *vm) {
+ // first try the standard way
+ if (be_module_member(vm, lv0_constants, lv0_constants_size)) {
+ be_return(vm);
+ }
+ // try alternative members
int32_t argc = be_top(vm); // Get the number of arguments
if (argc == 1 && be_isstring(vm, 1)) {
const char * needle = be_tostring(vm, 1);
int32_t idx;
- idx = bin_search(needle, &lv0_constants[0].name, sizeof(lv0_constants[0]), lv0_constants_size);
- if (idx >= 0) {
- // we did have a match
- const char * key = lv0_constants[idx].name;
- switch (key[0]) {
- // switch depending on the first char of the key, indicating the type
- case '$': // string
- be_pushstring(vm, (const char*) lv0_constants[idx].value);
- break;
- case '&': // native function
- be_pushntvfunction(vm, (bntvfunc) lv0_constants[idx].value);
- break;
- default: // int
- be_pushint(vm, lv0_constants[idx].value);
- break;
- }
- be_return(vm);
- }
-
// search for a class with this name
char cl_prefixed[32];
snprintf(cl_prefixed, sizeof(cl_prefixed), "lv_%s", needle); // we try both actual name and prefixed with `lv_` so both `lv.obj` and `lv.lv_obj` work
diff --git a/tasmota/xdrv_52_3_berry_tasmota.ino b/tasmota/xdrv_52_3_berry_tasmota.ino
index f98a5820a..573298789 100644
--- a/tasmota/xdrv_52_3_berry_tasmota.ino
+++ b/tasmota/xdrv_52_3_berry_tasmota.ino
@@ -519,6 +519,14 @@ extern "C" {
be_return(vm);
}
+ // Berry: `arvh() -> string`
+ // ESP object
+ int32_t l_arch(bvm *vm);
+ int32_t l_arch(bvm *vm) {
+ be_pushstring(vm, ESP32_ARCH);
+ be_return(vm);
+ }
+
// Berry: `save(file:string, f:closure) -> bool`
int32_t l_save(struct bvm *vm);
int32_t l_save(struct bvm *vm) {
diff --git a/tasmota/xdrv_52_3_berry_webclient.ino b/tasmota/xdrv_52_3_berry_webclient.ino
index e95dcf9d9..b7b56a39e 100644
--- a/tasmota/xdrv_52_3_berry_webclient.ino
+++ b/tasmota/xdrv_52_3_berry_webclient.ino
@@ -24,6 +24,10 @@
#include
#include "HttpClientLight.h"
+#include "be_sys.h"
+
+// Tasmota extension
+extern File * be_get_arduino_file(void *hfile);
String wc_UrlEncode(const String& text) {
const char hex[] = "0123456789ABCDEF";
@@ -298,6 +302,26 @@ extern "C" {
be_return(vm); /* return code */
}
+ int32_t wc_writefile(struct bvm *vm);
+ int32_t wc_writefile(struct bvm *vm) {
+ int32_t argc = be_top(vm);
+ if (argc >= 2 && be_isstring(vm, 2)) {
+ HTTPClientLight * cl = wc_getclient(vm);
+ const char * fname = be_tostring(vm, 2);
+
+ void * f = be_fopen(fname, "w");
+ int ret = -1;
+ if (f) {
+ File * fptr = be_get_arduino_file(f);
+ ret = cl->writeToStream(fptr);
+ }
+ be_fclose(f);
+ be_pushint(vm, ret);
+ be_return(vm); /* return code */
+ }
+ be_raise(vm, kTypeError, nullptr);
+ }
+
int32_t wc_getsize(struct bvm *vm);
int32_t wc_getsize(struct bvm *vm) {
HTTPClientLight * cl = wc_getclient(vm);
diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino
index e8577b7aa..61879a761 100644
--- a/tasmota/xdrv_52_9_berry.ino
+++ b/tasmota/xdrv_52_9_berry.ino
@@ -24,6 +24,7 @@
#include
#include "be_vm.h"
+#include "ZipReadFS.h"
extern "C" {
extern void be_load_custom_libs(bvm *vm);
diff --git a/tasmota/xdrv_84_esp32_core2.ino b/tasmota/xdrv_84_esp32_core2.ino
index b88814219..b2cfe5720 100644
--- a/tasmota/xdrv_84_esp32_core2.ino
+++ b/tasmota/xdrv_84_esp32_core2.ino
@@ -265,7 +265,7 @@ void Core2EverySecond(void) {
if (core2_globs.ready) {
Core2GetADC();
- if (Rtc.utc_time > START_VALID_TIME && core2_globs.tset==false && abs(Rtc.utc_time - Core2GetUtc()) > 3) {
+ if (Rtc.utc_time > START_VALID_TIME && core2_globs.tset==false && abs((int32_t)Rtc.utc_time - (int32_t)Core2GetUtc()) > 3) {
Core2SetUtc(Rtc.utc_time);
AddLog(LOG_LEVEL_INFO, PSTR("CR2: Write Time TO BM8563 from NTP (" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"),
GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_DST).c_str(), GetDateAndTime(DT_STD).c_str());
diff --git a/tasmota/xsns_21_sgp30.ino b/tasmota/xsns_21_sgp30.ino
index ff5445455..e012813cb 100644
--- a/tasmota/xsns_21_sgp30.ino
+++ b/tasmota/xsns_21_sgp30.ino
@@ -114,14 +114,14 @@ void Sgp30Show(bool json)
{
if (sgp30_ready) {
char abs_hum[33];
-
- if (TasmotaGlobal.global_update && (TasmotaGlobal.humidity > 0) && !isnan(TasmotaGlobal.temperature_celsius)) {
+ bool ahum_available = TasmotaGlobal.global_update && (TasmotaGlobal.humidity > 0) && !isnan(TasmotaGlobal.temperature_celsius);
+ if (ahum_available) {
// has humidity + temperature
dtostrfd(sgp30_abshum,4,abs_hum);
}
if (json) {
ResponseAppend_P(PSTR(",\"SGP30\":{\"" D_JSON_ECO2 "\":%d,\"" D_JSON_TVOC "\":%d"), sgp.eCO2, sgp.TVOC);
- if (TasmotaGlobal.global_update && TasmotaGlobal.humidity>0 && !isnan(TasmotaGlobal.temperature_celsius)) {
+ if (ahum_available) {
ResponseAppend_P(PSTR(",\"" D_JSON_AHUM "\":%s"),abs_hum);
}
ResponseJsonEnd();
@@ -131,7 +131,7 @@ void Sgp30Show(bool json)
#ifdef USE_WEBSERVER
} else {
WSContentSend_PD(HTTP_SNS_SGP30, sgp.eCO2, sgp.TVOC);
- if (TasmotaGlobal.global_update) {
+ if (ahum_available) {
WSContentSend_PD(HTTP_SNS_AHUM, abs_hum);
}
#endif
diff --git a/tasmota/xsns_87_mcp2515.ino b/tasmota/xsns_87_mcp2515.ino
index 801a18c67..3aad58d09 100644
--- a/tasmota/xsns_87_mcp2515.ino
+++ b/tasmota/xsns_87_mcp2515.ino
@@ -75,7 +75,7 @@
#define BMS_CHARGE_VOLT_MAX 0x8
#define BMS_CHARGE_VOLT_MIN 0x10
#define BMS_CHARGE_AMP_MAX 0x20
- #define BMS_CHARGE_AMP_MIN 0x40
+ #define BMS_DISCHARGE_AMP_MAX 0x40
#define BMS_VOLT 0x80
#define BMS_AMP 0x100
#define BMS_TEMP 0x200
@@ -166,7 +166,7 @@ void MCP2515_Read() {
bms.maxChargeCurrent = (canFrame.data[3] << 8) | canFrame.data[2];
bms.maxDischargeCurrent = (canFrame.data[5] << 8) | canFrame.data[4];
bms.dischargeVolt = (canFrame.data[7] << 8) | canFrame.data[6];
- bms.setFields |= BMS_CHARGE_VOLT_MAX | BMS_CHARGE_VOLT_MIN | BMS_CHARGE_AMP_MAX | BMS_CHARGE_AMP_MIN;
+ bms.setFields |= BMS_CHARGE_VOLT_MAX | BMS_CHARGE_VOLT_MIN | BMS_CHARGE_AMP_MAX | BMS_DISCHARGE_AMP_MAX;
} else {
MCP2515_FrameSizeError(canFrame.can_dlc, canFrame.can_id);
}
@@ -323,6 +323,23 @@ void MCP2515_Show(bool Json) {
ResponseAppend_P(PSTR("%s\"BattTemp\":%d.%d"), jsonFirstField ? PSTR("") : PSTR(","), bms.battTemp / 10, bms.battTemp % 10);
jsonFirstField = false;
}
+ if (bms.setFields & BMS_CHARGE_VOLT_MAX) {
+ ResponseAppend_P(PSTR("%s\"MaxVoltage\":%d.%d"), jsonFirstField ? PSTR("") : PSTR(","), bms.chargeVoltLimit / 10, bms.chargeVoltLimit % 10);
+ jsonFirstField = false;
+ }
+ if (bms.setFields & BMS_CHARGE_VOLT_MIN) {
+ ResponseAppend_P(PSTR("%s\"MinVoltage\":%d.%d"), jsonFirstField ? PSTR("") : PSTR(","), bms.dischargeVolt / 10, bms.dischargeVolt % 10);
+ jsonFirstField = false;
+ }
+ if (bms.setFields & BMS_CHARGE_AMP_MAX) {
+ ResponseAppend_P(PSTR("%s\"MaxChargeAmp\":%d.%d"), jsonFirstField ? PSTR("") : PSTR(","), bms.maxChargeCurrent / 10, bms.maxChargeCurrent % 10);
+ jsonFirstField = false;
+ }
+ if (bms.setFields & BMS_DISCHARGE_AMP_MAX) {
+ ResponseAppend_P(PSTR("%s\"MaxDischargeAmp\":%d.%d"), jsonFirstField ? PSTR("") : PSTR(","), bms.maxDischargeCurrent / 10, bms.maxDischargeCurrent % 10);
+ jsonFirstField = false;
+ }
+
ResponseAppend_P(PSTR("}"));
}
} else {
@@ -333,8 +350,6 @@ void MCP2515_Show(bool Json) {
} else {
#ifdef MCP2515_BMS_CLIENT
if (bms.setFields & BMS_MANUFACTURER) {
- char ampStr[6];
- dtostrf((float(bms.battAmp) / 10), 5, 1, ampStr);
if (bms.setFields & BMS_SOC) {
WSContentSend_PD(HTTP_SNS_SOC, bms.manuf, bms.stateOfCharge);
}
@@ -345,11 +360,34 @@ void MCP2515_Show(bool Json) {
WSContentSend_Voltage(bms.manuf, (float(bms.battVoltage) / 100));
}
if (bms.setFields & BMS_AMP) {
+ char ampStr[6];
+ dtostrf((float(bms.battAmp) / 10), 5, 1, ampStr);
WSContentSend_PD(PSTR("{s}%s " D_CURRENT "{m}%s " D_UNIT_AMPERE "{e}"), bms.manuf, ampStr);
}
if (bms.setFields & BMS_TEMP) {
WSContentSend_Temp(bms.manuf, ConvertTemp(float(bms.battTemp) / 10));
}
+ if (bms.setFields & BMS_CHARGE_VOLT_MAX) {
+ char voltStr[6];
+ dtostrf((float(bms.chargeVoltLimit) / 10), 5, 1, voltStr);
+ WSContentSend_PD(PSTR("{s}%s Max Voltage{m}%s " D_UNIT_AMPERE "{e}"), bms.manuf, voltStr);
+ }
+ if (bms.setFields & BMS_CHARGE_VOLT_MIN) {
+ char voltStr[6];
+ dtostrf((float(bms.dischargeVolt) / 10), 5, 1, voltStr);
+ WSContentSend_PD(PSTR("{s}%s Min Voltage{m}%s " D_UNIT_AMPERE "{e}"), bms.manuf, voltStr);
+ }
+ if (bms.setFields & BMS_CHARGE_AMP_MAX) {
+ char ampStr[6];
+ dtostrf((float(bms.maxChargeCurrent) / 10), 5, 1, ampStr);
+ WSContentSend_PD(PSTR("{s}%s Max Charge Current{m}%s " D_UNIT_AMPERE "{e}"), bms.manuf, ampStr);
+ }
+ if (bms.setFields & BMS_DISCHARGE_AMP_MAX) {
+ char ampStr[6];
+ dtostrf((float(bms.maxDischargeCurrent) / 10), 5, 1, ampStr);
+ WSContentSend_PD(PSTR("{s}%s Max Discharge Current{m}%s " D_UNIT_AMPERE "{e}"), bms.manuf, ampStr);
+ }
+
} else {
WSContentSend_PD(PSTR("{s}MCP2515 {m} Waiting for data{e}"));
}
diff --git a/tasmota/xsns_94_hdc2010.ino b/tasmota/xsns_94_hdc2010.ino
new file mode 100755
index 000000000..edacc2adf
--- /dev/null
+++ b/tasmota/xsns_94_hdc2010.ino
@@ -0,0 +1,215 @@
+/*
+ xsns_94_hdc2010.ino - Texas Instruments HDC1080 temperature and humidity sensor support for Tasmota
+
+ Copyright (C) 2021 Luc Boudreau
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#ifdef USE_I2C
+#ifdef USE_HDC2010
+
+/*********************************************************************************************\
+ * HDC2010 - Temperature and Humidity sensor
+ *
+ * Source: Luc Boudreau
+ * Other sources: Luis Teixeira from the HDC1080 code (GPL3+)
+ * sSense arduino library (Public Domain)
+ *
+ * I2C Address: 0x40
+\*********************************************************************************************/
+
+#define XSNS_94 94
+#define XI2C_64 64 // See I2CDEVICES.md
+
+#define HDC2010_ADDR 0x40
+
+// Registers:
+
+#define HDC2010_REG_TEMP_LSB 0x00 // Temperature register LSB
+#define HDC2010_REG_TEMP_MSB 0x01 // Temperature register MSB
+#define HDC2010_REG_RH_LSB 0x02 // Humidity register LSB
+#define HDC2010_REG_RH_MSB 0x03 // Humidity register MSB
+#define HDC2010_REG_INTR_DRDY 0x04 // Interrupt / Data Ready register
+#define HDC2010_REG_CONFIG 0x0F // Configuration register
+#define HDC2010_REG_RESET 0x0E // Reset register
+#define HDC2010_REG_MAN_LSB 0xFC // Manufacturer LSB
+#define HDC2010_REG_MAN_MSB 0xFD // Manufacturer MSB
+#define HDC2010_REG_DEV_LSB 0xFE // Device ID LSB
+#define HDC2010_REG_DEV_MSB 0xFF // Device ID MSB
+
+// Note: These are bit flipped. Actual IDs need to shift byte 0 and 1
+#define HDC2010_MAN_ID 0x4954 // Manufacturer ID (Texas Instruments)
+#define HDC2010_DEV_ID 0xD007 // Device ID (valid for the HDC2010)
+
+#define HDC2010_CONV_TIME 50
+
+struct HDC2010 {
+ const char* hdc_type_name = "HDC2010";
+ uint16_t hdc_manufacturer_id = 0;
+ uint16_t hdc_device_id = 0;
+ float hdc_temperature = 0.0;
+ float hdc_humidity = 0.0;
+ uint8_t hdc_valid = 0;
+} HDC2010;
+
+/**
+ * Reads the device ID register.
+ */
+uint16_t Hdc2010ReadDeviceId(void) {
+ return I2cRead16(HDC2010_ADDR, HDC2010_REG_DEV_LSB);
+}
+
+/**
+ * Reads the manufacturer ID register.
+ */
+uint16_t Hdc2010ReadManufacturerId(void) {
+ return I2cRead16(HDC2010_ADDR, HDC2010_REG_MAN_LSB);
+}
+
+/**
+ * The various initialization steps for this sensor.
+ */
+void Hdc2010Init(void) {
+ Hdc2010Reset();
+ Hdc2010SetMeasurementConfig();
+ HDC2010.hdc_valid = 1;
+}
+
+/**
+ * Performs a temp and humidity read
+ */
+void Hdc2010Read(void) {
+ uint8_t byte[2];
+ uint16_t temp;
+ uint16_t humidity;
+ byte[0] = I2cRead8(HDC2010_ADDR, HDC2010_REG_TEMP_LSB);
+ byte[1] = I2cRead8(HDC2010_ADDR, HDC2010_REG_TEMP_MSB);
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: temperature raw data: 0x%02x 0x%02x"), byte[0], byte[1]);
+ temp = (unsigned int)(byte[1]) << 8 | (unsigned int) byte[0];
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: temperature shifted data: %d"), temp);
+ HDC2010.hdc_temperature = (float)(temp) * 165 / 65536 - 40;
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: temperature : %f"), hdc_temperature);
+
+ byte[0] = I2cRead8(HDC2010_ADDR, HDC2010_REG_RH_LSB);
+ byte[1] = I2cRead8(HDC2010_ADDR, HDC2010_REG_RH_MSB);
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: humidity raw data: 0x%02x 0x%02x"), byte[0], byte[1]);
+ humidity = (unsigned int)byte[1] << 8 | byte[0];
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: humidity shifted data: %d"), humidity);
+ HDC2010.hdc_humidity = (float)(humidity)/( 65536 )* 100;
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: humidity : %f"), hdc_humidity);
+}
+
+/**
+ * Performs a reset of the sensor (slow oper)
+ */
+void Hdc2010Reset(void) {
+ uint8_t current = I2cRead8(HDC2010_ADDR, HDC2010_REG_RESET);
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcReset: current reset registry value = %d"), current);
+ current |= 0x80;
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcReset: new reset registry value = %d"), current);
+ I2cWrite8(HDC2010_ADDR, HDC2010_REG_RESET, current);
+ delay(HDC2010_CONV_TIME);
+}
+
+/**
+ * Detects the sensor
+ */
+bool Hdc2010Detect(void) {
+ if (!I2cSetDevice(HDC2010_ADDR)) { return false; }
+
+ HDC2010.hdc_manufacturer_id = Hdc2010ReadManufacturerId();
+ HDC2010.hdc_device_id = Hdc2010ReadDeviceId();
+
+ AddLog(LOG_LEVEL_DEBUG, PSTR("HdcDetect: detected device with manufacturerId = 0x%04X and deviceId = 0x%04X"), HDC2010.hdc_manufacturer_id, HDC2010.hdc_device_id);
+
+ if (HDC2010.hdc_device_id == HDC2010_DEV_ID && HDC2010.hdc_manufacturer_id == HDC2010_MAN_ID) {
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcDetect: adding device HDC2010"));
+ Hdc2010Init();
+ I2cSetActiveFound(HDC2010_ADDR, HDC2010.hdc_type_name);
+ return true;
+ }
+ return false;
+}
+
+/**
+ * Shows the sensor in the ui
+ */
+void Hdc2010Show(bool json) {
+ if (HDC2010.hdc_valid) {
+ TempHumDewShow(json, (0 == TasmotaGlobal.tele_period), HDC2010.hdc_type_name, HDC2010.hdc_temperature, HDC2010.hdc_humidity);
+ }
+}
+
+/**
+ * Configures measurement settings
+ */
+void Hdc2010SetMeasurementConfig() {
+ uint8_t resetContents = I2cRead8(HDC2010_ADDR, HDC2010_REG_RESET);
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcSetMeasureRate: current reset registry value = %d"), resetContents);
+ // Measure twice per second
+ resetContents |= 0x60;
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcSetMeasureRate: new reset registry value = %d"), resetContents);
+ I2cWrite8(HDC2010_ADDR, HDC2010_REG_RESET, resetContents);
+
+ uint8_t configContents = I2cRead8(HDC2010_ADDR, HDC2010_REG_CONFIG);
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcSetMeasureRate: current config registry value = %d"), configContents);
+ // Measure both temp and humidity
+ configContents |= 0x01;
+ //AddLog(LOG_LEVEL_DEBUG, PSTR("HdcSetMeasureRate: new config registry value = %d"), configContents);
+ I2cWrite8(HDC2010_ADDR, HDC2010_REG_CONFIG, configContents);
+}
+
+/*********************************************************************************************\
+ * Interface
+\*********************************************************************************************/
+
+bool Xsns94(uint8_t function)
+{
+ if (!I2cEnabled(XI2C_64)) {
+ return false;
+ }
+
+ bool result = false;
+
+ if (FUNC_INIT == function) {
+ result = Hdc2010Detect();
+ }
+ else if (HDC2010.hdc_device_id) {
+ switch (function) {
+ case FUNC_EVERY_SECOND:
+ if (HDC2010.hdc_valid) {
+ Hdc2010Read();
+ result = true;
+ }
+ break;
+ case FUNC_JSON_APPEND:
+ if (HDC2010.hdc_valid) {
+ Hdc2010Show(1);
+ }
+ break;
+#ifdef USE_WEBSERVER
+ case FUNC_WEB_SENSOR:
+ Hdc2010Show(0);
+ result = true;
+ break;
+#endif // USE_WEBSERVER
+ }
+ }
+ return result;
+}
+
+#endif // USE_HDC2010
+#endif // USE_I2C
+
diff --git a/tools/decode-status.py b/tools/decode-status.py
index 0fef90db9..f6d8a9b36 100755
--- a/tools/decode-status.py
+++ b/tools/decode-status.py
@@ -259,7 +259,7 @@ a_features = [[
"USE_BM8563","USE_ENERGY_DUMMY","USE_AM2320","USE_T67XX",
"USE_MCP2515","USE_TASMESH","USE_WIFI_RANGE_EXTENDER","USE_INFLUXDB",
"USE_HRG15","USE_VINDRIKTNING","USE_SCD40","USE_HM330X",
- "","","","",
+ "USE_HDC2010","","","",
"","","","",
"","","","",
"","","",""
@@ -290,7 +290,7 @@ else:
obj = json.load(fp)
def StartDecode():
- print ("\n*** decode-status.py v20211008 by Theo Arends and Jacek Ziolkowski ***")
+ print ("\n*** decode-status.py v20211111 by Theo Arends and Jacek Ziolkowski ***")
# print("Decoding\n{}".format(obj))
diff --git a/tools/lv_gpio/gpio_convert.py b/tools/lv_gpio/gpio_convert.py
new file mode 100644
index 000000000..dfa3d78f0
--- /dev/null
+++ b/tools/lv_gpio/gpio_convert.py
@@ -0,0 +1,101 @@
+import re
+import sys
+
+lv_module_file = "lv_gpio_enum.h"
+
+out_prefix = "../../tasmota/berry/include/"
+
+be_gpio_defines = "be_gpio_defines.h"
+
+lv_module = []
+
+def try_int(s):
+ try:
+ v = int(s)
+ return v
+ except ValueError:
+ return None
+
+# parse module file containing numerical constants
+with open(lv_module_file) as f:
+ for l_raw in f:
+ l_raw = l_raw.strip(" \t\n\r") # remove leading or trailing spaces
+ if l_raw.startswith("//"):
+ lv_module.append( [ None, l_raw ] ) # if key in None then add comment line
+ l_raw = re.sub('//.*$', '', l_raw) # remove trailing comments
+ l_raw = re.sub('\s+', '', l_raw) # remove all spaces
+ l_raw = re.sub(',.*$', '', l_raw) # remove comma and anything after it
+ if (len(l_raw) == 0): continue
+
+ k_v = l_raw.split("=")
+ if len(k_v) > 2:
+ print(f"Error: cannot match {l_raw}")
+ continue
+ # extract the key name
+ k = k_v[0]
+ if k.startswith("_"):
+ continue # skip any label starting with '_'
+ k = re.sub('^LV_', '', k) # remove remove any LV_ prefix
+ v = None
+ if len(k_v) == 2: # value is included
+ v = k_v[1]
+ if k is None or v is None: continue # we skip if key is void or value is void
+
+ if not k.isidentifier():
+ print(f"Error: {k} is not an identifier")
+ continue
+
+ lv_module.append( [k, v] ) # keep as string or None
+
+
+
+
+sys.stdout = open(out_prefix + be_gpio_defines, 'w')
+print("/********************************************************************")
+print(" * Generated code, don't edit")
+print(" *******************************************************************/")
+
+print("""
+const be_constint_t lv_gpio_constants[] = {
+""")
+
+lv_module2 = {}
+for k_v in lv_module:
+ (k,v) = k_v
+ if k is not None:
+ lv_module2[k] = v
+
+# print the enums, symbols and functions
+# Ex: { "ALIGN_BOTTOM_LEFT", LV_ALIGN_BOTTOM_LEFT },
+#
+# Encoding:
+# 1. `COLOR_WHITE=0xFFFFFF` enum with explicit value
+# 2. `LV_EVENT_ALL` enum with implicit value with same name resolved by C compiler
+# 3. `$SYMBOL_OK="\xef\x80\x8c"` if starts with `$` then it's a string
+# 4. `&seg7_font=lv0_load_seg7_font` if starts with `&` then it's a native function
+#
+# We need to sort ignoring the first char if it's not a letter
+for k in sorted(lv_module2):
+ v = lv_module2[k]
+ # check the type of the value
+ # if first char is '"' then it's a string and prefix with '$'
+ # if first char is '&' then it's a function and prefix with '&'
+ # if no value, then it's an enum, prefix with `LV_`
+ # otherwise it's an int, leave if unchanged
+ if v is not None:
+ v_prefix = ""
+ if v[0] == '"': v_prefix = "$"
+ if v[0] == '&': v_prefix = "&"
+ print(f" {{ \"{v_prefix}{k}\", (int32_t) {v} }},")
+ else:
+ print(f" {{ \"{k}\", {k} }},")
+
+print("""
+};
+
+const size_t lv_gpio_constants_size = sizeof(lv_gpio_constants)/sizeof(lv_gpio_constants[0]);
+""")
+
+print("/********************************************************************/")
+sys.stdout.close()
+
diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h
new file mode 100644
index 000000000..74f6c64f3
--- /dev/null
+++ b/tools/lv_gpio/lv_gpio_enum.h
@@ -0,0 +1,281 @@
+// Enum values for GPIOs
+
+LOW
+HIGH
+
+INPUT
+OUTPUT
+PULLUP
+INPUT_PULLUP
+PULLDOWN
+INPUT_PULLDOWN
+OPEN_DRAIN
+OUTPUT_OPEN_DRAIN
+DAC = -1 // special case
+
+RISING
+FALLING
+CHANGE
+
+NONE = GPIO_NONE
+KEY1 = GPIO_KEY1
+KEY1_NP = GPIO_KEY1_NP
+KEY1_INV = GPIO_KEY1_INV
+KEY1_INV_NP = GPIO_KEY1_INV_NP
+SWT1 = GPIO_SWT1
+SWT1_NP = GPIO_SWT1_NP
+REL1 = GPIO_REL1
+REL1_INV = GPIO_REL1_INV
+LED1 = GPIO_LED1
+LED1_INV = GPIO_LED1_INV
+CNTR1 = GPIO_CNTR1
+CNTR1_NP = GPIO_CNTR1_NP
+PWM1 = GPIO_PWM1
+PWM1_INV = GPIO_PWM1_INV
+BUZZER = GPIO_BUZZER
+BUZZER_INV = GPIO_BUZZER_INV
+LEDLNK = GPIO_LEDLNK
+LEDLNK_INV = GPIO_LEDLNK_INV
+I2C_SCL = GPIO_I2C_SCL
+I2C_SDA = GPIO_I2C_SDA
+SPI_MISO = GPIO_SPI_MISO
+SPI_MOSI = GPIO_SPI_MOSI
+SPI_CLK = GPIO_SPI_CLK
+SPI_CS = GPIO_SPI_CS
+SPI_DC = GPIO_SPI_DC
+SSPI_MISO = GPIO_SSPI_MISO
+SSPI_MOSI = GPIO_SSPI_MOSI
+SSPI_SCLK = GPIO_SSPI_SCLK
+SSPI_CS = GPIO_SSPI_CS
+SSPI_DC = GPIO_SSPI_DC
+BACKLIGHT = GPIO_BACKLIGHT
+OLED_RESET = GPIO_OLED_RESET
+IRSEND = GPIO_IRSEND
+IRRECV = GPIO_IRRECV
+RFSEND = GPIO_RFSEND
+RFRECV = GPIO_RFRECV
+DHT11 = GPIO_DHT11
+DHT22 = GPIO_DHT22
+SI7021 = GPIO_SI7021
+DHT11_OUT = GPIO_DHT11_OUT
+DSB = GPIO_DSB
+DSB_OUT = GPIO_DSB_OUT
+WS2812 = GPIO_WS2812
+MHZ_TXD = GPIO_MHZ_TXD
+MHZ_RXD = GPIO_MHZ_RXD
+PZEM0XX_TX = GPIO_PZEM0XX_TX
+PZEM004_RX = GPIO_PZEM004_RX
+PZEM016_RX = GPIO_PZEM016_RX
+PZEM017_RX = GPIO_PZEM017_RX
+SAIR_TX = GPIO_SAIR_TX
+SAIR_RX = GPIO_SAIR_RX
+PMS5003_TX = GPIO_PMS5003_TX
+PMS5003_RX = GPIO_PMS5003_RX
+SDS0X1_TX = GPIO_SDS0X1_TX
+SDS0X1_RX = GPIO_SDS0X1_RX
+SBR_TX = GPIO_SBR_TX
+SBR_RX = GPIO_SBR_RX
+SR04_TRIG = GPIO_SR04_TRIG
+SR04_ECHO = GPIO_SR04_ECHO
+SDM120_TX = GPIO_SDM120_TX
+SDM120_RX = GPIO_SDM120_RX
+SDM630_TX = GPIO_SDM630_TX
+SDM630_RX = GPIO_SDM630_RX
+TM1638CLK = GPIO_TM1638CLK
+TM1638DIO = GPIO_TM1638DIO
+TM1638STB = GPIO_TM1638STB
+MP3_DFR562 = GPIO_MP3_DFR562
+HX711_SCK = GPIO_HX711_SCK
+HX711_DAT = GPIO_HX711_DAT
+TX2X_TXD_BLACK = GPIO_TX2X_TXD_BLACK
+TUYA_TX = GPIO_TUYA_TX
+TUYA_RX = GPIO_TUYA_RX
+MGC3130_XFER = GPIO_MGC3130_XFER
+MGC3130_RESET = GPIO_MGC3130_RESET
+RF_SENSOR = GPIO_RF_SENSOR
+AZ_TXD = GPIO_AZ_TXD
+AZ_RXD = GPIO_AZ_RXD
+MAX31855CS = GPIO_MAX31855CS
+MAX31855CLK = GPIO_MAX31855CLK
+MAX31855DO = GPIO_MAX31855DO
+NRG_SEL = GPIO_NRG_SEL
+NRG_SEL_INV = GPIO_NRG_SEL_INV
+NRG_CF1 = GPIO_NRG_CF1
+HLW_CF = GPIO_HLW_CF
+HJL_CF = GPIO_HJL_CF
+MCP39F5_TX = GPIO_MCP39F5_TX
+MCP39F5_RX = GPIO_MCP39F5_RX
+MCP39F5_RST = GPIO_MCP39F5_RST
+PN532_TXD = GPIO_PN532_TXD
+PN532_RXD = GPIO_PN532_RXD
+SM16716_CLK = GPIO_SM16716_CLK
+SM16716_DAT = GPIO_SM16716_DAT
+SM16716_SEL = GPIO_SM16716_SEL
+DI = GPIO_DI
+DCKI = GPIO_DCKI
+CSE7766_TX = GPIO_CSE7766_TX
+CSE7766_RX = GPIO_CSE7766_RX
+ARIRFRCV = GPIO_ARIRFRCV
+ARIRFSEL = GPIO_ARIRFSEL
+TXD = GPIO_TXD
+RXD = GPIO_RXD
+ROT1A = GPIO_ROT1A
+ROT1B = GPIO_ROT1B
+ADC_JOY = GPIO_ADC_JOY
+SSPI_MAX31865_CS1 = GPIO_SSPI_MAX31865_CS1
+HRE_CLOCK = GPIO_HRE_CLOCK
+HRE_DATA = GPIO_HRE_DATA
+ADE7953_IRQ = GPIO_ADE7953_IRQ
+SOLAXX1_TX = GPIO_SOLAXX1_TX
+SOLAXX1_RX = GPIO_SOLAXX1_RX
+ZIGBEE_TX = GPIO_ZIGBEE_TX
+ZIGBEE_RX = GPIO_ZIGBEE_RX
+RDM6300_RX = GPIO_RDM6300_RX
+IBEACON_TX = GPIO_IBEACON_TX
+IBEACON_RX = GPIO_IBEACON_RX
+A4988_DIR = GPIO_A4988_DIR
+A4988_STP = GPIO_A4988_STP
+A4988_ENA = GPIO_A4988_ENA
+A4988_MS1 = GPIO_A4988_MS1
+OUTPUT_HI = GPIO_OUTPUT_HI
+OUTPUT_LO = GPIO_OUTPUT_LO
+DDS2382_TX = GPIO_DDS2382_TX
+DDS2382_RX = GPIO_DDS2382_RX
+DDSU666_TX = GPIO_DDSU666_TX
+DDSU666_RX = GPIO_DDSU666_RX
+SM2135_CLK = GPIO_SM2135_CLK
+SM2135_DAT = GPIO_SM2135_DAT
+DEEPSLEEP = GPIO_DEEPSLEEP
+EXS_ENABLE = GPIO_EXS_ENABLE
+TASMOTACLIENT_TXD = GPIO_TASMOTACLIENT_TXD
+TASMOTACLIENT_RXD = GPIO_TASMOTACLIENT_RXD
+TASMOTACLIENT_RST = GPIO_TASMOTACLIENT_RST
+TASMOTACLIENT_RST_INV = GPIO_TASMOTACLIENT_RST_INV
+HPMA_RX = GPIO_HPMA_RX
+HPMA_TX = GPIO_HPMA_TX
+GPS_RX = GPIO_GPS_RX
+GPS_TX = GPIO_GPS_TX
+HM10_RX = GPIO_HM10_RX
+HM10_TX = GPIO_HM10_TX
+LE01MR_RX = GPIO_LE01MR_RX
+LE01MR_TX = GPIO_LE01MR_TX
+CC1101_GDO0 = GPIO_CC1101_GDO0
+CC1101_GDO2 = GPIO_CC1101_GDO2
+HRXL_RX = GPIO_HRXL_RX
+ELECTRIQ_MOODL_TX = GPIO_ELECTRIQ_MOODL_TX
+AS3935 = GPIO_AS3935
+ADC_INPUT = GPIO_ADC_INPUT
+ADC_TEMP = GPIO_ADC_TEMP
+ADC_LIGHT = GPIO_ADC_LIGHT
+ADC_BUTTON = GPIO_ADC_BUTTON
+ADC_BUTTON_INV = GPIO_ADC_BUTTON_INV
+ADC_RANGE = GPIO_ADC_RANGE
+ADC_CT_POWER = GPIO_ADC_CT_POWER
+WEBCAM_PWDN = GPIO_WEBCAM_PWDN
+WEBCAM_RESET = GPIO_WEBCAM_RESET
+WEBCAM_XCLK = GPIO_WEBCAM_XCLK
+WEBCAM_SIOD = GPIO_WEBCAM_SIOD
+WEBCAM_SIOC = GPIO_WEBCAM_SIOC
+WEBCAM_DATA = GPIO_WEBCAM_DATA
+WEBCAM_VSYNC = GPIO_WEBCAM_VSYNC
+WEBCAM_HREF = GPIO_WEBCAM_HREF
+WEBCAM_PCLK = GPIO_WEBCAM_PCLK
+WEBCAM_PSCLK = GPIO_WEBCAM_PSCLK
+WEBCAM_HSD = GPIO_WEBCAM_HSD
+WEBCAM_PSRCS = GPIO_WEBCAM_PSRCS
+BOILER_OT_RX = GPIO_BOILER_OT_RX
+BOILER_OT_TX = GPIO_BOILER_OT_TX
+WINDMETER_SPEED = GPIO_WINDMETER_SPEED
+KEY1_TC = GPIO_KEY1_TC
+BL0940_RX = GPIO_BL0940_RX
+TCP_TX = GPIO_TCP_TX
+TCP_RX = GPIO_TCP_RX
+ETH_PHY_POWER = GPIO_ETH_PHY_POWER
+ETH_PHY_MDC = GPIO_ETH_PHY_MDC
+ETH_PHY_MDIO = GPIO_ETH_PHY_MDIO
+TELEINFO_RX = GPIO_TELEINFO_RX
+TELEINFO_ENABLE = GPIO_TELEINFO_ENABLE
+LMT01 = GPIO_LMT01
+IEM3000_TX = GPIO_IEM3000_TX
+IEM3000_RX = GPIO_IEM3000_RX
+ZIGBEE_RST = GPIO_ZIGBEE_RST
+DYP_RX = GPIO_DYP_RX
+MIEL_HVAC_TX = GPIO_MIEL_HVAC_TX
+MIEL_HVAC_RX = GPIO_MIEL_HVAC_RX
+WE517_TX = GPIO_WE517_TX
+WE517_RX = GPIO_WE517_RX
+AS608_TX = GPIO_AS608_TX
+AS608_RX = GPIO_AS608_RX
+SHELLY_DIMMER_BOOT0 = GPIO_SHELLY_DIMMER_BOOT0
+SHELLY_DIMMER_RST_INV = GPIO_SHELLY_DIMMER_RST_INV
+RC522_RST = GPIO_RC522_RST
+P9813_CLK = GPIO_P9813_CLK
+P9813_DAT = GPIO_P9813_DAT
+OPTION_A = GPIO_OPTION_A
+FTC532 = GPIO_FTC532
+RC522_CS = GPIO_RC522_CS
+NRF24_CS = GPIO_NRF24_CS
+NRF24_DC = GPIO_NRF24_DC
+ILI9341_CS = GPIO_ILI9341_CS
+ILI9341_DC = GPIO_ILI9341_DC
+ILI9488_CS = GPIO_ILI9488_CS
+EPAPER29_CS = GPIO_EPAPER29_CS
+EPAPER42_CS = GPIO_EPAPER42_CS
+SSD1351_CS = GPIO_SSD1351_CS
+RA8876_CS = GPIO_RA8876_CS
+ST7789_CS = GPIO_ST7789_CS
+ST7789_DC = GPIO_ST7789_DC
+SSD1331_CS = GPIO_SSD1331_CS
+SSD1331_DC = GPIO_SSD1331_DC
+SDCARD_CS = GPIO_SDCARD_CS
+ROT1A_NP = GPIO_ROT1A_NP
+ROT1B_NP = GPIO_ROT1B_NP
+ADC_PH = GPIO_ADC_PH
+BS814_CLK = GPIO_BS814_CLK
+BS814_DAT = GPIO_BS814_DAT
+WIEGAND_D0 = GPIO_WIEGAND_D0
+WIEGAND_D1 = GPIO_WIEGAND_D1
+NEOPOOL_TX = GPIO_NEOPOOL_TX
+NEOPOOL_RX = GPIO_NEOPOOL_RX
+SDM72_TX = GPIO_SDM72_TX
+SDM72_RX = GPIO_SDM72_RX
+TM1637CLK = GPIO_TM1637CLK
+TM1637DIO = GPIO_TM1637DIO
+PROJECTOR_CTRL_TX = GPIO_PROJECTOR_CTRL_TX
+PROJECTOR_CTRL_RX = GPIO_PROJECTOR_CTRL_RX
+SSD1351_DC = GPIO_SSD1351_DC
+XPT2046_CS = GPIO_XPT2046_CS
+CSE7761_TX = GPIO_CSE7761_TX
+CSE7761_RX = GPIO_CSE7761_RX
+VL53L0X_XSHUT1 = GPIO_VL53L0X_XSHUT1
+MAX7219CLK = GPIO_MAX7219CLK
+MAX7219DIN = GPIO_MAX7219DIN
+MAX7219CS = GPIO_MAX7219CS
+TFMINIPLUS_TX = GPIO_TFMINIPLUS_TX
+TFMINIPLUS_RX = GPIO_TFMINIPLUS_RX
+ZEROCROSS = GPIO_ZEROCROSS
+HALLEFFECT = GPIO_HALLEFFECT
+EPD_DATA = GPIO_EPD_DATA
+INPUT = GPIO_INPUT
+KEY1_PD = GPIO_KEY1_PD
+KEY1_INV_PD = GPIO_KEY1_INV_PD
+SWT1_PD = GPIO_SWT1_PD
+I2S_OUT_DATA = GPIO_I2S_OUT_DATA
+I2S_OUT_CLK = GPIO_I2S_OUT_CLK
+I2S_OUT_SLCT = GPIO_I2S_OUT_SLCT
+I2S_IN_DATA = GPIO_I2S_IN_DATA
+I2S_IN_CLK = GPIO_I2S_IN_CLK
+I2S_IN_SLCT = GPIO_I2S_IN_SLCT
+INTERRUPT = GPIO_INTERRUPT
+
+MCP2515_CS = GPIO_MCP2515_CS
+
+HRG15_TX = GPIO_HRG15_TX, HRG15_RX = GPIO_HRG15_RX
+VINDRIKTNING_RX = GPIO_VINDRIKTNING_RX
+BL0939_RX = GPIO_BL0939_RX
+BL0942_RX = GPIO_BL0942_RX
+HM330X_SET = GPIO_HM330X_SET
+HEARTBEAT = GPIO_HEARTBEAT
+HEARTBEAT_INV = GPIO_HEARTBEAT_INV
+
+SENSOR_END = GPIO_SENSOR_END