From 60004266a21740140378cce7ea6229e6e9d5f291 Mon Sep 17 00:00:00 2001 From: aweatherguy Date: Sat, 9 Apr 2022 10:37:23 -0700 Subject: [PATCH 001/376] Update tasmota_ca.ino --- tasmota/tasmota_ca.ino | 84 ++++++++++++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/tasmota/tasmota_ca.ino b/tasmota/tasmota_ca.ino index ce78760b6..007685863 100644 --- a/tasmota/tasmota_ca.ino +++ b/tasmota/tasmota_ca.ino @@ -17,12 +17,30 @@ along with this program. If not, see . */ -// The below is currenlty not used, CA validation takes too much memory and compute time. -// Please use fingerprint validation instead -// However, the CA are available below for future use if it appears to be useful - +// +// Certificates are stored in flash (PROGMEM) to avoid consuming valuable RAM. +// +// To save space in flash, the Let's Encrypt and Amazon AWS certificates may be +// individually omitted if TLS is enabled, but the certificates are not used. +// This is typically the case when a locally generated root certificate is used +// for TLS authentication. +// +// To omit these certificates, define one or both of the +// OMIT_LETS_ENCRYPT_CERT and/or OMIT_AWS_CERT macros in user_config_override.h. +// +// To include a locally generated root certificate, define the +// INCLUDE_LOCAL_CERT macro in user_config_override.h. +// +// See the files tasmota/local_ca_data_sample.h and tasmota/local_ca_descriptor_sample.h +// in the Tasmota source for instructions for generating them from a local root +// certificate in .crt format. +// +// Note: Using full certificate verification increases the amount of time +// required to create a TLS connection, compared to fingerprint validation. +// #if defined(USE_TLS) +#if ! defined(OMIT_LETS_ENCRYPT_CERT) /*********************************************************************************************\ * LetsEncrypt R3 certificate, RSA 2048 bits SHA 256, valid until 20250915 * @@ -71,18 +89,10 @@ static const unsigned char LetsEncryptR3_RSA_E[] = { 0x01, 0x00, 0x01 }; -static const br_x509_trust_anchor PROGMEM LetsEncryptR3_TA = { - { (unsigned char *)LetsEncryptR3_DN, sizeof LetsEncryptR3_DN }, - BR_X509_TA_CA, - { - BR_KEYTYPE_RSA, - { .rsa = { - (unsigned char *)LetsEncryptR3_RSA_N, sizeof LetsEncryptR3_RSA_N, - (unsigned char *)LetsEncryptR3_RSA_E, sizeof LetsEncryptR3_RSA_E, - } } - } -}; +#endif + +#if ! defined(OMIT_AWS_CERT) /*********************************************************************************************\ * Amazon Root CA, RSA 2048 bits SHA 256, valid until 20380117 * @@ -132,20 +142,16 @@ static const unsigned char PROGMEM AmazonRootCA1_RSA_E[] = { 0x01, 0x00, 0x01 }; -const br_x509_trust_anchor PROGMEM AmazonRootCA1_TA = { - { (unsigned char *)AmazonRootCA1_DN, sizeof AmazonRootCA1_DN }, - BR_X509_TA_CA, - { - BR_KEYTYPE_RSA, - { .rsa = { - (unsigned char *)AmazonRootCA1_RSA_N, sizeof AmazonRootCA1_RSA_N, - (unsigned char *)AmazonRootCA1_RSA_E, sizeof AmazonRootCA1_RSA_E, - } } - } -}; +#endif -// cumulative CA +#if defined(INCLUDE_LOCAL_CERT) +#include +#endif +// +// ========== cumulative CA ================= +// const br_x509_trust_anchor PROGMEM Tasmota_TA[] = { +#if ! defined(OMIT_LETS_ENCRYPT_CERT) { { (unsigned char *)LetsEncryptR3_DN, sizeof LetsEncryptR3_DN }, BR_X509_TA_CA, @@ -157,7 +163,13 @@ const br_x509_trust_anchor PROGMEM Tasmota_TA[] = { } } } } - , + +#if ! defined(OMIT_AWS_CERT) || defined(INCLUDE_LOCAL_CERT) + , +#endif +#endif + +#if ! defined(OMIT_AWS_CERT) { { (unsigned char *)AmazonRootCA1_DN, sizeof AmazonRootCA1_DN }, BR_X509_TA_CA, @@ -169,11 +181,26 @@ const br_x509_trust_anchor PROGMEM Tasmota_TA[] = { } } } } + +#if defined(INCLUDE_LOCAL_CERT) + , +#endif +#endif + + +#if defined(INCLUDE_LOCAL_CERT) +#include +#endif + }; const size_t Tasmota_TA_size = nitems(Tasmota_TA); + +#if defined(USE_TELEGRAM) + // we add a separate CA for telegram + /*********************************************************************************************\ * GoDaddy Daddy Secure Certificate Authority - G2, RSA 2048 bits SHA 256, valid until 20220523 * @@ -231,5 +258,6 @@ const br_x509_trust_anchor GoDaddyCAG2_TA PROGMEM = { } } } }; +#endif #endif // defined(USE_TLS) From 08799e0760a38e07905a73f27675d1872b4e298f Mon Sep 17 00:00:00 2001 From: aweatherguy Date: Sat, 9 Apr 2022 10:40:09 -0700 Subject: [PATCH 002/376] New sample files for local root cert. --- tasmota/local_ca_data_sample.h | 51 ++++++++++++++++++++++++++++ tasmota/local_ca_descriptor_sample.h | 50 +++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100644 tasmota/local_ca_data_sample.h create mode 100644 tasmota/local_ca_descriptor_sample.h diff --git a/tasmota/local_ca_data_sample.h b/tasmota/local_ca_data_sample.h new file mode 100644 index 000000000..160e362ad --- /dev/null +++ b/tasmota/local_ca_data_sample.h @@ -0,0 +1,51 @@ +/* + local_ca_sample.h - sample file for embedding a local CA certificate + + Copyright (C) 2021 Theo Arends + + 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 . +*/ + +/* +To generate a version of this file containing data for your root certificate, +run the following command from a Linux or Cygwin bash shell, assuming that a +copy of brssl (or brssl.exe) is in the directory where the EasyRSA shell script +is located. + +./brssl ta pki/ca.crt | sed -e '/br_x509/,+999 d' >local_ca_data.h + +Then copy local_ca_data.h into the same directory as user_config_override. + +Add this line to user_config_override.h: + +#define INCLUDE_LOCAL_CERT + +Be sure to generate both files: local_ca_data.h, and local_ca_descriptor.h +*/ + +// +// this is what the result will look like, except there will be +// a lot of data bytes defined in the first three arrays +// +static const unsigned char PROGMEM TA0_DN[] = { + // variable number of bytes go here (typically 100-140 or so) for the DN +}; + +static const unsigned char PROGMEM TA0_RSA_N[] = { + // 256 bytes go here for the public key modulus +}; + +static const unsigned char PROGMEM TA0_RSA_E[] = { + // 3 bytes go here for the public key exponent +}; diff --git a/tasmota/local_ca_descriptor_sample.h b/tasmota/local_ca_descriptor_sample.h new file mode 100644 index 000000000..3d4481981 --- /dev/null +++ b/tasmota/local_ca_descriptor_sample.h @@ -0,0 +1,50 @@ +/* + local-ca-sample.h - sample file for embedding a local CA certificate + + Copyright (C) 2021 Theo Arends + + 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 . +*/ + +/* +To generate a version of this file containing data for your root certificate, +run the following command from a Linux or Cygwin bash shell, assuming that a +copy of brssl (or brssl.exe) is in the directory where the EasyRSA shell script +is located. + +./brssl ta pki/ca.crt | sed -e '1,/br_x509/ d' -e '/};/,+999 d' >local_ca_descriptor.h + +Then copy local_ca_descriptor.h into the same directory as user_config_override. + +Add this line to user_config_override.h: + +#define INCLUDE_LOCAL_CERT + +Be sure to generate both files: local_ca_data.h, and local_ca_descriptor.h +*/ + +// +// this is what the result will look like +// + { + { (unsigned char *)TA0_DN, sizeof TA0_DN }, + BR_X509_TA_CA, + { + BR_KEYTYPE_RSA, + { .rsa = { + (unsigned char *)TA0_RSA_N, sizeof TA0_RSA_N, + (unsigned char *)TA0_RSA_E, sizeof TA0_RSA_E, + } } + } + } From 18239d9ca3844cf63393842959fdc80b438b1be1 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 10 Apr 2022 22:28:22 +0200 Subject: [PATCH 003/376] Berry stack resize debug mode --- lib/libesp32/berry/default/berry_conf.h | 8 ++++++++ lib/libesp32/berry/src/be_exec.c | 16 +++++++++++++++- lib/libesp32/berry/src/be_vm.c | 9 +++++---- 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/lib/libesp32/berry/default/berry_conf.h b/lib/libesp32/berry/default/berry_conf.h index 43994b22d..84255936b 100644 --- a/lib/libesp32/berry/default/berry_conf.h +++ b/lib/libesp32/berry/default/berry_conf.h @@ -175,6 +175,14 @@ **/ #define BE_USE_DEBUG_GC 0 +/* Macro: BE_USE_DEBUG_STACK + * Enable Stack Resize debug mode. At each function call + * the stack is reallocated at a different memory location + * and the previous location is cleared with toxic data. + * Default: 0 + **/ +#define BE_USE_DEBUG_STACK 0 + /* Macro: BE_USE_MEM_ALIGNED * Some embedded processors have special memory areas * with read/write constraints of being aligned to 32 bits boundaries. diff --git a/lib/libesp32/berry/src/be_exec.c b/lib/libesp32/berry/src/be_exec.c index bdbeb0234..2278ab2fa 100644 --- a/lib/libesp32/berry/src/be_exec.c +++ b/lib/libesp32/berry/src/be_exec.c @@ -15,6 +15,7 @@ #include "be_bytecode.h" #include "be_decoder.h" #include +#include #if !BE_USE_SCRIPT_COMPILER && !BE_USE_BYTECODE_LOADER #error no compiler or bytecode loader enabled. @@ -337,9 +338,13 @@ void be_stackpush(bvm *vm) /* check that the stack is able to store `count` items, and increase stack if needed */ BERRY_API void be_stack_require(bvm *vm, int count) { +#if BE_USE_DEBUG_STACK == 0 if (vm->top + count >= vm->stacktop) { be_stack_expansion(vm, count); } +#else + be_stack_expansion(vm, vm->top - vm->stacktop + count); /* force exact resize each time */ +#endif } /* Scan the entire callstack and adjust all pointer by `offset` */ @@ -372,7 +377,16 @@ static void stack_resize(bvm *vm, size_t size) intptr_t offset; bvalue *old = vm->stack; /* save original pointer of stack before resize */ size_t os = (vm->stacktop - old) * sizeof(bvalue); /* size of current stack allocated in bytes */ +#if BE_USE_DEBUG_STACK == 0 vm->stack = be_realloc(vm, old, os, sizeof(bvalue) * size); /* reallocate with the new size */ +#else /* force a reallocation */ + size_t ns = sizeof(bvalue) * size; + vm->stack = be_malloc(vm, ns); + size_t transf = (os < ns) ? os : ns; /* min size */ + memmove(vm->stack, old, transf); /* copy to new location */ + memset(old, 0xFF, os); /* fill the structure with invalid pointers */ + be_free(vm, old, os); +#endif vm->stacktop = vm->stack + size; /* compute new stacktop */ offset = ptr_offset(vm->stack, old); /* compute the address difference between old and ne stack addresses */ /* update callframes */ @@ -386,7 +400,7 @@ static void stack_resize(bvm *vm, size_t size) /* Check if we are above the max allowed stack */ void be_stack_expansion(bvm *vm, int n) { - size_t size = vm->stacktop - vm->stack; + int size = vm->stacktop - vm->stack; /* with debug enabled, stack increase may be negative */ /* check new stack size */ if (size + n > BE_STACK_TOTAL_MAX) { /* ensure the stack is enough when generating error messages. */ diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index 1f6fe4586..c60d88c01 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -1207,11 +1207,12 @@ static void prep_closure(bvm *vm, int pos, int argc, int mode) for (v = vm->reg + argc; v <= end; ++v) { var_setnil(v); } + int v_offset = v - vm->stack; /* offset from stack base, stack may be reallocated */ if (proto->varg & BE_VA_VARARG) { /* there are vararg at the last argument, build the list */ /* code below uses mostly low-level calls for performance */ - be_stack_require(vm, argc + 2); /* make sure we don't overflow the stack */ - bvalue *top_save = vm->top; /* save original stack, we need fresh slots to create the 'list' instance */ - vm->top = v; /* move top of stack right after last argument */ + be_stack_require(vm, argc + 4); /* make sure we don't overflow the stack */ + int top_save_offset = vm->top - vm->stack; /* save original stack, we need fresh slots to create the 'list' instance */ + vm->top = vm->stack + v_offset; /* move top of stack right after last argument */ be_newobject(vm, "list"); /* this creates 2 objects on stack: list instance, BE_LIST object */ blist *list = var_toobj(vm->top-1); /* get low-level BE_LIST structure */ v = vm->reg + proto->argc - 1; /* last argument */ @@ -1219,7 +1220,7 @@ static void prep_closure(bvm *vm, int pos, int argc, int mode) be_list_push(vm, list, v); /* push all varargs into list */ } *(vm->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 */ + vm->top = vm->stack + top_save_offset; /* restore top of stack pointer */ } } From 7c56a0f15187e961aac04f2fbc93f394f787f156 Mon Sep 17 00:00:00 2001 From: hpagonis Date: Sun, 10 Apr 2022 22:33:47 +0000 Subject: [PATCH 004/376] Chage MAX7219 8 digit hard limit --- tasmota/xdsp_15_tm1637.ino | 45 ++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/tasmota/xdsp_15_tm1637.ino b/tasmota/xdsp_15_tm1637.ino index cfdaae3ae..5deecb4a3 100644 --- a/tasmota/xdsp_15_tm1637.ino +++ b/tasmota/xdsp_15_tm1637.ino @@ -225,7 +225,14 @@ void TM1637Init(void) else if (PinUsed(GPIO_MAX7219DIN) && PinUsed(GPIO_MAX7219CLK) && PinUsed(GPIO_MAX7219CS)) { TM1637Data.display_type = MAX7219; - Settings->display_width = 8; + if (Settings->display_width) + { + Settings->display_width = (Settings->display_width / 8) * 8; + } + else + { + Settings->display_width = 8; + } } else { @@ -254,8 +261,11 @@ void TM1637Init(void) else if (MAX7219 == TM1637Data.display_type) { strcpy_P(TM1637Data.model_name, PSTR("MAX7219")); - max7219display = new LedControl(Pin(GPIO_MAX7219DIN), Pin(GPIO_MAX7219CLK), Pin(GPIO_MAX7219CS), 1); - max7219display->shutdown(MAX7219_ADDR, false); + max7219display = new LedControl(Pin(GPIO_MAX7219DIN), Pin(GPIO_MAX7219CLK), Pin(GPIO_MAX7219CS), Settings->display_width / 8); + for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + { + max7219display->shutdown(MAX7219_ADDR + dev_addr, false); + } } TM1637ClearDisplay(); TM1637Dim(); @@ -266,15 +276,13 @@ void TM1637Init(void) // Function to display specified ascii char at specified position for MAX7219 void displayMAX7219ASCII(uint8_t pos, char c) { - pos = 7 - pos; - max7219display->setChar(MAX7219_ADDR, pos, c, false); + max7219display->setChar(MAX7219_ADDR + (pos / 8), 7 - (pos % 8), c, false); } // Function to display specified ascii char with dot at specified position for MAX7219 void displayMAX7219ASCIIwDot(uint8_t pos, char c) { - pos = 7 - pos; - max7219display->setChar(MAX7219_ADDR, pos, c, true); + max7219display->setChar(MAX7219_ADDR + (pos / 8), 7 - (pos % 8), c, true); } // Function to display raw segments at specified position for MAX7219 @@ -292,8 +300,7 @@ void displayMAX72197Seg(uint8_t pos, uint8_t seg) } seg = reverse_num; - pos = 7 - pos; - max7219display->setRow(MAX7219_ADDR, pos, seg); + max7219display->setRow(MAX7219_ADDR + (pos / 8), 7 - (pos % 8), seg); } // Function to fix order of hardware digits for different TM1637 variants @@ -379,7 +386,7 @@ bool CmndTM1637Number(bool clear) tm1638display->displayASCII(i, pad); else if (MAX7219 == TM1637Data.display_type) { - if (i > 7) + if (i > Settings->display_width - 1) break; displayMAX7219ASCII(i, pad); } @@ -400,7 +407,7 @@ bool CmndTM1637Number(bool clear) tm1638display->displayASCII(i, txt[j]); else if (MAX7219 == TM1637Data.display_type) { - if (i > 7) + if (i > Settings->display_width - 1) break; if (txt[j] == 0) break; @@ -505,7 +512,7 @@ bool CmndTM1637Float(bool clear) { for (uint32_t i = 0, j = 0; i < length; i++, j++) { - if ((j + position) > 7) + if ((j + position) > Settings->display_width - 1) break; if (txt[i] == 0) break; @@ -553,7 +560,10 @@ void TM1637ClearDisplay(void) } else if (MAX7219 == TM1637Data.display_type) { - max7219display->clearDisplay(MAX7219_ADDR); + for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + { + max7219display->clearDisplay(MAX7219_ADDR + dev_addr); + } } } @@ -821,7 +831,7 @@ bool CmndTM1637Raw(void) { for (uint32_t i = position; i < position + length; i++) { - if (i > 7) + if (i > Settings->display_width - 1) break; displayMAX72197Seg(i, DATA[i - position]); } @@ -921,7 +931,7 @@ bool CmndTM1637Text(bool clear) uint8_t rawBytes[1]; for (uint32_t j = 0; i < position + length; i++, j++) { - if (i > 7) + if (i > Settings->display_width - 1) break; if (sString[j] == 0) break; @@ -1102,7 +1112,10 @@ void TM1637Dim(void) } else if (MAX7219 == TM1637Data.display_type) { - max7219display->setIntensity(MAX7219_ADDR, brightness); // 0 - 7 + for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + { + max7219display->setIntensity(MAX7219_ADDR, brightness); // 0 - 7 + } } } From b79802d6f52ac8afab35eb3dcd509936164e2564 Mon Sep 17 00:00:00 2001 From: hpagonis Date: Mon, 11 Apr 2022 10:48:44 +0000 Subject: [PATCH 005/376] Fix missing type declaration of dev_addr variable --- tasmota/xdsp_15_tm1637.ino | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/xdsp_15_tm1637.ino b/tasmota/xdsp_15_tm1637.ino index 5deecb4a3..80b97b6bf 100644 --- a/tasmota/xdsp_15_tm1637.ino +++ b/tasmota/xdsp_15_tm1637.ino @@ -262,7 +262,7 @@ void TM1637Init(void) { strcpy_P(TM1637Data.model_name, PSTR("MAX7219")); max7219display = new LedControl(Pin(GPIO_MAX7219DIN), Pin(GPIO_MAX7219CLK), Pin(GPIO_MAX7219CS), Settings->display_width / 8); - for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + for (uint8_t dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) { max7219display->shutdown(MAX7219_ADDR + dev_addr, false); } @@ -560,7 +560,7 @@ void TM1637ClearDisplay(void) } else if (MAX7219 == TM1637Data.display_type) { - for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + for (uint8_t dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) { max7219display->clearDisplay(MAX7219_ADDR + dev_addr); } @@ -1112,7 +1112,7 @@ void TM1637Dim(void) } else if (MAX7219 == TM1637Data.display_type) { - for (dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) + for (uint8_t dev_addr = 0; dev_addr < Settings->display_width / 8; dev_addr++) { max7219display->setIntensity(MAX7219_ADDR, brightness); // 0 - 7 } From c7d76f24f7b5cb475615addb082f6e6c619dd89c Mon Sep 17 00:00:00 2001 From: hpagonis Date: Mon, 11 Apr 2022 12:30:35 +0000 Subject: [PATCH 006/376] Add missing #define condition for MAX7219 --- tasmota/xdsp_15_tm1637.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdsp_15_tm1637.ino b/tasmota/xdsp_15_tm1637.ino index 80b97b6bf..a7daf61bf 100644 --- a/tasmota/xdsp_15_tm1637.ino +++ b/tasmota/xdsp_15_tm1637.ino @@ -18,7 +18,7 @@ */ #ifdef USE_DISPLAY -#ifdef USE_DISPLAY_TM1637 +#if defined(USE_DISPLAY_TM1637) || defined(USE_DISPLAY_MAX7219) /*********************************************************************************************\ This driver enables the display of numbers (both integers and floats) and basic text on the inexpensive TM1637-, TM1638- and MAX7219-based seven-segment modules. From 94e2c2f9dae96b7eddb0cabc075043193ab31576 Mon Sep 17 00:00:00 2001 From: Stefan Tibus <38475243+stibus@users.noreply.github.com> Date: Wed, 13 Apr 2022 00:15:47 +0200 Subject: [PATCH 007/376] Fix early return in `startLowPowerPeriodicMeasurement` In method `FrogMoreScd40::startLowPowerPeriodicMeasurement` the `return` statement appeared before the update of the `DuringMeasurement` flag. Thus, the class would wrongly assume not be in measurement mode and a subsequent `stopPeriodicMeasurement` would fail. Moved the `return` statement to after setting the flag. --- lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp index ee7e3c232..5499311f3 100644 --- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp +++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp @@ -691,8 +691,8 @@ int FrogmoreScd40::startLowPowerPeriodicMeasurement(void) if (DuringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } - return (sendCommand(COMMAND_SCD40_START_LOW_POWER_PERIODIC_MEASUREMENT)); DuringMeasurement = 1; + return (sendCommand(COMMAND_SCD40_START_LOW_POWER_PERIODIC_MEASUREMENT)); } int FrogmoreScd40::getDataReadyStatus(bool *pIsAvailable) From 31bbea750246943709dcddf7665c88b0b19707d8 Mon Sep 17 00:00:00 2001 From: Stefan Tibus <38475243+stibus@users.noreply.github.com> Date: Wed, 13 Apr 2022 00:32:28 +0200 Subject: [PATCH 008/376] Remove declaration of unused `co2AvgExtra` --- lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h index 454c8ab5d..b03dcb9c1 100644 --- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h +++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h @@ -96,7 +96,6 @@ class FrogmoreScd40 uint8_t duringMeasurement; uint8_t i2cAddress; TwoWire *pWire; - uint16_t co2AvgExtra; uint16_t co2History[SCD40_MEDIAN_FILTER_SIZE]; uint16_t co2EAverage; int8_t co2NewDataLocation; // location to put new CO2 data for median filter From ac573f669e2238d2537f7377745a5b5dbafc9230 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 13 Apr 2022 09:16:55 +0200 Subject: [PATCH 009/376] Bump version 11.1.0.1 --- CHANGELOG.md | 29 ++++++++++++++++++-- README.md | 3 +- RELEASENOTES.md | 58 ++------------------------------------- tasmota/tasmota_version.h | 2 +- 4 files changed, 32 insertions(+), 60 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7dc3ddfa5..483e1eec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,22 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [11.0.0.7] +## [11.1.0.1] +### Added + +### Changed + +### Fixed + +### Removed + + +## [Released] + +## [11.1.0] 20220413 +- Release Ostara + +## [11.0.0.7] 20220413 ### Added - HX711 command ``Sensor34 10 0|1|`` to set HX711 fixed tare (0 = use auto tare, 1 = use calibrated tare, Any other value is user selected tare) - Command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align (#15342) @@ -109,8 +124,6 @@ All notable changes to this project will be documented in this file. - Orno WE517 power meter phase 2 current reactive (#14841) - Wiegand 34-bit rfid reading and presentation (#14834) -## [Released] - ## [11.0.0] 20220212 - Release Olivia @@ -850,6 +863,16 @@ All notable changes to this project will be documented in this file. - Compile error when ``#ifdef USE_IR_RECEIVE`` is disabled regression from 9.1.0.2 - Prometheus memory leak (#10221) +## [9.2.0] 20201221 +### Fixed Backported +- Shutter stop issue (#10170) +- Scripter script_sub_command (#10181) +- Scripter JSON variable above 32 chars (#10193) +- Shelly Dimmer power on state (#10154, #10182) +- Wemo emulation for single devices (#10165, #10194) +- ESP32 LoadStoreError when using ``#define USER_TEMPLATE`` (#9506) +- Compile error when ``#ifdef USE_IR_RECEIVE`` is disabled regression from 9.1.0.2 + ## [9.2.0] 20201216 - Release Julie diff --git a/README.md b/README.md index 06491ab28..aad266191 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ Firmware binaries can be downloaded from http://ota.tasmota.com/tasmota/release/ ## Development -[![Dev Version](https://img.shields.io/badge/development%20version-v11.0.x.x-blue.svg)](https://github.com/arendst/Tasmota) +[![Dev Version](https://img.shields.io/badge/development%20version-v11.1.x.x-blue.svg)](https://github.com/arendst/Tasmota) [![Download Dev](https://img.shields.io/badge/download-development-yellow.svg)](http://ota.tasmota.com/tasmota/) [![Tasmota CI](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml/badge.svg)](https://github.com/arendst/Tasmota/actions/workflows/build_all_the_things.yml) [![Build_development](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml/badge.svg)](https://github.com/arendst/Tasmota/actions/workflows/Tasmota_build_devel.yml) @@ -163,6 +163,7 @@ People helping to keep the show on the road: - Paul Diem for UDP Group communication support - Jörg Schüler-Maroldt for his initial ESP32 port - Javier Arigita for his thermostat driver +- Simon Hailes for ESP32 Bluetooth extensions - Many more providing Tips, Wips, Pocs, PRs and Donations ## License diff --git a/RELEASENOTES.md b/RELEASENOTES.md index dcb36e8d6..94dd26733 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -72,7 +72,7 @@ Latest released binaries can be downloaded from - http://ota.tasmota.com/tasmota/release Historical binaries can be downloaded from -- http://ota.tasmota.com/tasmota/release-11.0.0 +- http://ota.tasmota.com/tasmota/release-11.1.0 The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` @@ -94,7 +94,7 @@ Latest released binaries can be downloaded from - http://ota.tasmota.com/tasmota32/release Historical binaries can be downloaded from -- http://ota.tasmota.com/tasmota32/release-11.0.0 +- http://ota.tasmota.com/tasmota32/release-11.1.0 The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota32/release/tasmota32.bin`` @@ -104,65 +104,13 @@ 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 v11.0.0.7 +## Changelog v11.1.0.1 ### Added -- Command ``SetOption135 1`` to disable LVGL splash screen -- Command ``SetOption136 1`` to disable single sensor reports from Tuya devices while keeping teleperiod reports [#15216](https://github.com/arendst/Tasmota/issues/15216) -- Command ``SetOption137 1`` to avoid MQTT publish of defined Tuya CMDs if SO66 is active [#15267](https://github.com/arendst/Tasmota/issues/15267) -- Command ``SetOption138 1`` to switch GUI energy multi-column layout from left/center (0) to right (1) align [#15342](https://github.com/arendst/Tasmota/issues/15342) -- Command ``SspmMap 0`` to reset Sonoff SPM default mapping -- Command ``TcpConnect `` to add client connection mode [#14874](https://github.com/arendst/Tasmota/issues/14874) -- Command ``RfTimeout 100..60000`` to disable duplicate RfReceive. Default 1000 [#15061](https://github.com/arendst/Tasmota/issues/15061) -- Command ``IfxSensor 1`` to send non-teleperiod data to influxdb -- Commands ``Sensor12 D0 .. D5, S0 .. S5`` allowing differential or single-ended modes [#15001](https://github.com/arendst/Tasmota/issues/15001) -- Command ``Sensor34 10 0|1|`` to set HX711 fixed tare (0 = use auto tare, 1 = use calibrated tare, Any other value is user selected tare) -- Commands ``Sensor34 11 `` and ``Sensor34 12 `` to use HX711 absolute weight conversion [#15292](https://github.com/arendst/Tasmota/issues/15292) -- NeoPool commands ``NPpHMin``, ``NPpHMax``, ``NPpH``, ``NPRedox``, ``NPHydrolysis``, ``NPIonization``, ``NPChlorine`` and ``NPControl`` [#15015](https://github.com/arendst/Tasmota/issues/15015) -- NeoPool system voltages display -- TasmotaSerial implement ``end()`` -- Support for improv as used by esp-web-tools -- Support for up to four DS3502 digital potentiometers with command ``Wiper 0..127`` -- Support for ADE7880 3 phase energy monitor as used in Shelly 3EM [#13515](https://github.com/arendst/Tasmota/issues/13515) -- Support for PCF85363 RTC as used in Shelly 3EM [#13515](https://github.com/arendst/Tasmota/issues/13515) -- Full RTC chip integration and synchronisation when using UBX (=GPS), NTP or manual time -- NeoPool JSON modules, power module, cell info, chlorine, conductivity and ionization -- ESP32 Berry always enable rules -- ESP32 Berry bootloop protection -- ESP32 Support for OpenHASP v1.0 by Stephan Hadinger [#15307](https://github.com/arendst/Tasmota/issues/15307) -- ESP32 support for BLE Mi scale V1 [#13517](https://github.com/arendst/Tasmota/issues/13517) -- ESP32 integrate Homekit in Bluetooth binary [#14818](https://github.com/arendst/Tasmota/issues/14818) -- ESP32 Berry virtual Alexa hue device [#14833](https://github.com/arendst/Tasmota/issues/14833) -- ESP32 TasmotaSerial uart mapping to support multiple ``begin()`` and implement ``getUart()`` [#14981](https://github.com/arendst/Tasmota/issues/14981) ### Breaking Changed -- Remove support for Internet Explorer by allowing ECMAScript6 syntax using less JavaScript code bytes [#15280](https://github.com/arendst/Tasmota/issues/15280) ### Changed -- Adafruit BusIO library from v1.0.10 to v1.11.0 -- TasmotaSerial library from v3.4.0 to v3.5.0 [#14981](https://github.com/arendst/Tasmota/issues/14981) -- Sonoff SPM increase max number of relays supported to 32 (8 SPM-4Relay modules) -- Extent number of pulsetimers from 8 to 32 [#8266](https://github.com/arendst/Tasmota/issues/8266) -- Consolidate three RTC chip drivers (DS3231, BM8563, PCF85363) into one driver updating RTC as soon as possible after restart -- DS3231 I2C address define ``USE_RTC_ADDR`` into ``DS3231_ADDRESS`` -- Display of energy values in GUI use columns when define ``USE_ENERGY_COLUMN_GUI`` is enabled (default) -- ESP8266 Shrinked tasmota-minimal.bin by removing all commands except ``Upgrade``, ``Upload``, ``OtaUrl``, ``Seriallog``, ``Weblog`` and ``Restart`` -- ESP32 Arduino core from v2.0.2.2 to v2.0.3 -- ESP32 LVGL library from v8.1.0 to v8.2.0 -- ESP32 NimBLE library from v1.3.3 to v1.3.6 -- ESP32 update the internal Berry type system to sync with Skiars Berry repository. No expected impact on code, but .bec files need to be generated again [#14811](https://github.com/arendst/Tasmota/issues/14811) ### Fixed -- SSPM energy yesterday when zero -- NeoPool NPBit and NPRead/NPReadL output -- HX711 false readings by removing large deviations -- GPIO OptionE1 selection regression [#14821](https://github.com/arendst/Tasmota/issues/14821) -- BL0939, BL0940 and BL0942 energy monitoring buffer miscompares resulting in wrong daily energy values regression from v9.5.0.8 [#14829](https://github.com/arendst/Tasmota/issues/14829) -- Wiegand 34-bit rfid reading and presentation [#14834](https://github.com/arendst/Tasmota/issues/14834) -- Orno WE517 power meter phase 2 current reactive [#14841](https://github.com/arendst/Tasmota/issues/14841) -- TasMesh relaunch wifi on esp_now_init failure [#15334](https://github.com/arendst/Tasmota/issues/15334) -- ESP32 save settings after OTA upload regression from v10.0.0.3 -- ESP32 PowerOnState [#15084](https://github.com/arendst/Tasmota/issues/15084) ### Removed -- Command ``Sensor33`` and replaced by ``RtcNtpserver`` -- Command ``Sensor34 7`` as now active tare is persistent resulting in calculated current weight diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 43aa751a5..49d55ffbd 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 = 0x0B000007; // 11.0.0.7 +const uint32_t VERSION = 0x0B010001; // 11.1.0.1 #endif // _TASMOTA_VERSION_H_ From 5ef450861835cdc6d77ecce0fe7ea3e5d3745a82 Mon Sep 17 00:00:00 2001 From: Stefan Tibus <38475243+stibus@users.noreply.github.com> Date: Wed, 13 Apr 2022 10:29:00 +0200 Subject: [PATCH 010/376] Clean-up use of `duringMeasurement` flag - remove obsolete integer `duringMeasurement` - change boolean `DuringMeasurement` to lower case - replace integer assignments with boolean assignments --- lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp | 58 ++++++++++----------- lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h | 3 +- 2 files changed, 30 insertions(+), 31 deletions(-) diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp index 5499311f3..6b455bfc0 100644 --- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp +++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.cpp @@ -317,7 +317,7 @@ int FrogmoreScd40::readRegister(uint16_t registerAddress, uint16_t* pData) void FrogmoreScd40::begin(TwoWire *pWire, uint8_t i2cAddress) { - this->duringMeasurement = 0; + this->duringMeasurement = false; this->i2cAddress = i2cAddress; this->co2EAverage = 0; if (pWire == NULL) @@ -373,10 +373,10 @@ int FrogmoreScd40::startPeriodicMeasurement(void) snprintf_P(scd40log_data, sizeof(scd40log_data), "Start periodic measurement"); AddLog(LOG_LEVEL_DEBUG_MORE); #endif - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } - DuringMeasurement = 1; + duringMeasurement = true; return(sendCommand(COMMAND_SCD40_START_PERIODIC_MEASUREMENT)); } @@ -387,7 +387,7 @@ int FrogmoreScd40::readMeasurement( float *pHumidity ) { -// Should only be called in DuringMeasurement mode or +// Should only be called in duringMeasurement mode or // after calling measure_single_hot{,_rht_only} // but this is currently not verified bool isAvailable = false; @@ -522,16 +522,16 @@ int FrogmoreScd40::readMeasurement( int FrogmoreScd40::forceStopPeriodicMeasurement(void) { - DuringMeasurement = 0; + duringMeasurement = false; return (sendCommand(COMMAND_SCD40_STOP_PERIODIC_MEASUREMENT)); } int FrogmoreScd40::stopPeriodicMeasurement(void) { - if (!DuringMeasurement) { + if (!duringMeasurement) { return (ERROR_SCD40_NOT_IN_MEASUREMENT_MODE); } - DuringMeasurement = 0; + duringMeasurement = false; return (sendCommand(COMMAND_SCD40_STOP_PERIODIC_MEASUREMENT)); } @@ -541,7 +541,7 @@ int FrogmoreScd40::setTemperatureOffset(float offset_degC) // influences RH and T readings. Does not influence CO2 measurement. Default is 4 degrees Celcius. // to save setting to the EEPROM, call persistSetting() { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } if (offset_degC >= 0) @@ -557,7 +557,7 @@ int FrogmoreScd40::setTemperatureOffset(float offset_degC) int FrogmoreScd40::setTemperatureOffset(uint16_t offset_centiDegC) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t offset_xDegC = (uint16_t) (offset_centiDegC * 3.74491); @@ -566,7 +566,7 @@ int FrogmoreScd40::setTemperatureOffset(uint16_t offset_centiDegC) int FrogmoreScd40::getTemperatureOffset(float *pOffset_degC) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t value; @@ -581,7 +581,7 @@ int FrogmoreScd40::getTemperatureOffset(float *pOffset_degC) int FrogmoreScd40::getTemperatureOffset(uint16_t *pOffset_centiDegC) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t value; @@ -598,7 +598,7 @@ int FrogmoreScd40::setSensorAltitude(uint16_t height_meter) // Default is 0 meter above sea-level; // to save setting to the EEPROM, call persistSetting() { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommandArguments(COMMAND_SCD40_SET_SENSOR_ALTITUDE, height_meter)); @@ -606,7 +606,7 @@ int FrogmoreScd40::setSensorAltitude(uint16_t height_meter) int FrogmoreScd40::getSensorAltitude(uint16_t *pHeight_meter) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (readRegister(COMMAND_SCD40_GET_SENSOR_ALTITUDE, pHeight_meter)); @@ -615,7 +615,7 @@ int FrogmoreScd40::getSensorAltitude(uint16_t *pHeight_meter) int FrogmoreScd40::setAmbientPressure(uint16_t airPressure_mbar) // Overrides any pressure compensation based on a previously set sensor altitude { - // allowed DuringMeasurement + // allowed duringMeasurement return (sendCommandArguments(COMMAND_SCD40_SET_AMBIENT_PRESSURE, airPressure_mbar)); } @@ -627,7 +627,7 @@ int FrogmoreScd40::performForcedRecalibration(uint16_t co2_ppm) // issue stop_periodic_measurement, and then wait 500ms, before calling this function // it takes 400ms for this command to complete { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t FRC_result; @@ -642,7 +642,7 @@ int FrogmoreScd40::performForcedRecalibration(uint16_t co2_ppm) int FrogmoreScd40::setAutomaticSelfCalibrationDisabled(void) // to save setting to the EEPROM, call persistSetting() { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } bool isAuto = false; @@ -652,7 +652,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationDisabled(void) int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(void) // to save setting to the EEPROM, call persistSetting() { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } bool isAuto = true; @@ -662,7 +662,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(void) int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(bool isAuto) // to save setting to the EEPROM, call persistSetting() { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } bool value = !!isAuto; // using NOT operator twice makes sure value is 0 or 1 @@ -671,7 +671,7 @@ int FrogmoreScd40::setAutomaticSelfCalibrationEnabled(bool isAuto) int FrogmoreScd40::getAutomaticSelfCalibrationEnabled(uint16_t *pIsAuto) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t value = 0; @@ -688,16 +688,16 @@ int FrogmoreScd40::getAutomaticSelfCalibrationEnabled(uint16_t *pIsAuto) int FrogmoreScd40::startLowPowerPeriodicMeasurement(void) // Comment: unclear how to stop this operation mode? { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } - DuringMeasurement = 1; + duringMeasurement = true; return (sendCommand(COMMAND_SCD40_START_LOW_POWER_PERIODIC_MEASUREMENT)); } int FrogmoreScd40::getDataReadyStatus(bool *pIsAvailable) { - // allowed DuringMeasurement + // allowed duringMeasurement uint16_t isDataAvailable = false; int error = readRegister(COMMAND_SCD40_GET_DATA_READY_STATUS, &isDataAvailable); if (!error) @@ -715,7 +715,7 @@ int FrogmoreScd40::persistSettings(void) // EEPROM is guaranteed to endure at least 2000 write cycles before failure. // The field calibration history (FRC and ASC) is stored in a separate EEPROM. { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommand(COMMAND_SCD40_PERSIST_SETTINGS)); @@ -724,7 +724,7 @@ int FrogmoreScd40::persistSettings(void) int FrogmoreScd40::getSerialNumber(uint16_t *pSerialNumberArray) // Serialnr is 48 bits = 3 16-bit words { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } uint16_t value; @@ -734,7 +734,7 @@ int FrogmoreScd40::getSerialNumber(uint16_t *pSerialNumberArray) int FrogmoreScd40::performSelfTest(uint16_t *pMalfunction) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (readRegister(COMMAND_SCD40_PERFORM_SELF_TEST, pMalfunction)); @@ -744,7 +744,7 @@ int FrogmoreScd40::performFactoryReset(void) // resets all configuration settings in EEPROM and // erases FRC and ASC algorithm history { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommand(COMMAND_SCD40_PERFORM_FACTORY_RESET)); @@ -753,7 +753,7 @@ int FrogmoreScd40::performFactoryReset(void) int FrogmoreScd40::reinit(void) // reinitailizes sensor from EEPROM user settings { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommand(COMMAND_SCD40_REINIT)); @@ -764,7 +764,7 @@ int FrogmoreScd40::reinit(void) int FrogmoreScd40::measureSingleShot(void) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommand(COMMAND_SCD40_MEASURE_SINGLE_SHOT)); @@ -772,7 +772,7 @@ int FrogmoreScd40::measureSingleShot(void) int FrogmoreScd40::measureSingleShotRhtOnly(void) { - if (DuringMeasurement) { + if (duringMeasurement) { return (ERROR_SCD40_BUSY_MEASURING); } return (sendCommand(COMMAND_SCD40_MEASURE_SINGLE_SHOT_RHT_ONLY)); diff --git a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h index b03dcb9c1..e483ac346 100644 --- a/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h +++ b/lib/lib_i2c/FrogmoreScd40/FrogmoreScd40.h @@ -93,13 +93,12 @@ class FrogmoreScd40 int measureSingleShotRhtOnly(void); private: - uint8_t duringMeasurement; + bool duringMeasurement; uint8_t i2cAddress; TwoWire *pWire; uint16_t co2History[SCD40_MEDIAN_FILTER_SIZE]; uint16_t co2EAverage; int8_t co2NewDataLocation; // location to put new CO2 data for median filter - bool DuringMeasurement; uint8_t computeCRC8(uint8_t data[], uint8_t len); uint16_t medianfilter(uint16_t * p); From c0ab17f1f113319b64bc2ba91b269e564f901d79 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Wed, 13 Apr 2022 13:59:55 +0200 Subject: [PATCH 011/376] Update Italian language --- tasmota/language/it_IT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 309df4520..abbedca1f 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v11.0.0.7 - Last update 10.04.2022 + * Updated until v11.0.0.7 - Last update 13.04.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -1089,7 +1089,7 @@ #define D_NEOPOOL_RELAY_VALVE "Valvola" #define D_NEOPOOL_RELAY_AUX "Ausiliario" #define D_NEOPOOL_TIME "Orario" -#define D_NEOPOOL_FILT_MODE "Modalità di filtrazione" +#define D_NEOPOOL_FILT_MODE "Modo filtrazione" #define D_NEOPOOL_CELL_RUNTIME "Cella attiva" #define D_NEOPOOL_POLARIZATION "Polarizzazione" // Sensor status #define D_NEOPOOL_PR_OFF "PrOff" From 2c12266b1b6949c218aa7116c13a0924c1cfbd4b Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 13 Apr 2022 19:15:20 +0200 Subject: [PATCH 012/376] Prepare for Arduino PR #6569 --- lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp index da9b42645..ffe07dc73 100644 --- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp +++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp @@ -171,6 +171,9 @@ public: operator bool() { return (bool) _f; } + bool setBufferSize(size_t size) { + return true; + } protected: File _f; @@ -226,6 +229,10 @@ public: // do nothing } + bool setBufferSize(size_t size) { + return true; + } + bool seek(uint32_t pos, SeekMode mode) { // AddLog(LOG_LEVEL_DEBUG, "ZIP: seek pos=%i mode=%i", pos, mode); if (SeekSet == mode) { From 3f4f519e5c36baea7c70ba84fb0627f365987c7e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 14 Apr 2022 13:38:26 +0200 Subject: [PATCH 013/376] Fix Improv initial or erase device installation Fix Improv initial or erase device installation failing to provide Configure WiFi option --- CHANGELOG.md | 4 ++++ RELEASENOTES.md | 4 ++++ tasmota/xdrv_62_improv.ino | 3 ++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 483e1eec7..014b13aa3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,10 +5,14 @@ All notable changes to this project will be documented in this file. ## [11.1.0.1] ### Added +- Support for Sonoff MS01 soil moisture sensor (#15335) +- Support for daisy chaining MAX7219 displays (#15345) ### Changed ### Fixed +- SCD40 start low power command (#15361) +- Improv initial or erase device installation failing to provide Configure WiFi option ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 94dd26733..00240dc5d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -106,11 +106,15 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v11.1.0.1 ### Added +- Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) +- Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) ### Breaking Changed ### Changed ### Fixed +- SCD40 start low power command [#15361](https://github.com/arendst/Tasmota/issues/15361) +- Improv initial or erase device installation failing to provide Configure WiFi option ### Removed diff --git a/tasmota/xdrv_62_improv.ino b/tasmota/xdrv_62_improv.ino index cdb18a91a..1ae694d9d 100644 --- a/tasmota/xdrv_62_improv.ino +++ b/tasmota/xdrv_62_improv.ino @@ -325,7 +325,8 @@ void ImprovEverySecond(void) { } void ImprovInit(void) { - if (!RtcSettings.improv_state) { + if (!RtcSettings.improv_state || // After power on + !Settings->bootcount) { // After reset to defaults caused by GUI option ERASE RtcSettings.improv_state = IMPROV_STATE_AUTHORIZED; // Power on state (persistent during restarts) } Improv.wifi_timeout = IMPROV_WIFI_TIMEOUT; // Try to update state after restart From b980e93a8616cbff114a2c284eab124f97f605cc Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 14 Apr 2022 14:07:54 +0200 Subject: [PATCH 014/376] Fix IMPROV image name when Tasmota English --- tasmota/xdrv_62_improv.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_62_improv.ino b/tasmota/xdrv_62_improv.ino index 1ae694d9d..6dc0abb68 100644 --- a/tasmota/xdrv_62_improv.ino +++ b/tasmota/xdrv_62_improv.ino @@ -184,9 +184,10 @@ void ImprovReceived(void) { // Tasmota DE 11.0.0.7 ESP8266EX Wemos4 char image_name[33]; snprintf_P(image_name, sizeof(image_name), PSTR(D_HTML_LANGUAGE)); - UpperCase(image_name, image_name); - if (!strcmp_P(image_name, PSTR("EN"))) { // Non-english - snprintf_P(image_name, sizeof(image_name), PSTR(CODE_IMAGE_STR)); + UpperCase(image_name, image_name); // Language id + if (!strcmp_P(image_name, PSTR("EN")) && // English + strcasecmp_P("Tasmota", PSTR(CODE_IMAGE_STR))) { // Not Tasmota + snprintf_P(image_name, sizeof(image_name), PSTR(CODE_IMAGE_STR)); // English image name image_name[0] &= 0xDF; // Make first character uppercase } char data[200]; From 7c48ba0c73ff4b5fc47a790dd7190237bc08d1af Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 14 Apr 2022 23:19:05 +0200 Subject: [PATCH 015/376] LVGL and OpenHASP for M5Stick --- lib/lib_display/UDisplay/uDisplay.cpp | 2 +- .../berry_tasmota/src/be_lv_openhasp.c | 267 ++++++++++-------- .../openhasp_src/openhasp_core/openhasp.be | 8 +- 3 files changed, 154 insertions(+), 123 deletions(-) diff --git a/lib/lib_display/UDisplay/uDisplay.cpp b/lib/lib_display/UDisplay/uDisplay.cpp index 3b974eab9..a6b8d1e6f 100755 --- a/lib/lib_display/UDisplay/uDisplay.cpp +++ b/lib/lib_display/UDisplay/uDisplay.cpp @@ -1282,7 +1282,7 @@ void uDisplay::drawPixel(int16_t x, int16_t y, uint16_t color) { void uDisplay::setRotation(uint8_t rotation) { cur_rot = rotation; - if (interface != _UDSP_SPI) { + if (interface != _UDSP_SPI || bpp < 16) { Renderer::setRotation(cur_rot); return; } diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index 323f3439a..16083837f 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -2774,7 +2774,7 @@ be_local_closure(lvh_obj_set_adjustable, /* name */ ********************************************************************/ be_local_closure(lvh_obj_set_text_font, /* name */ be_nested_proto( - 11, /* nstack */ + 12, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2782,7 +2782,7 @@ be_local_closure(lvh_obj_set_text_font, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_literal("int"), /* K1 */ be_nested_str_literal("lv"), /* K2 */ be_nested_str_literal("font_embedded"), @@ -2790,17 +2790,20 @@ be_local_closure(lvh_obj_set_text_font, /* name */ /* K4 */ be_nested_str_literal("montserrat"), /* K5 */ be_nested_str_literal("string"), /* K6 */ be_nested_str_literal("split"), - /* K7 */ be_nested_str_literal("-"), - /* K8 */ be_const_int(2), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_literal("concat"), - /* K11 */ be_nested_str_literal("_lv_obj"), - /* K12 */ be_nested_str_literal("set_style_text_font"), - /* K13 */ be_nested_str_literal("HSP: Unsupported font:"), + /* K7 */ be_nested_str_literal(":"), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_literal("-"), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_literal("load_font"), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_literal("concat"), + /* K14 */ be_nested_str_literal("_lv_obj"), + /* K15 */ be_nested_str_literal("set_style_text_font"), + /* K16 */ be_nested_str_literal("HSP: Unsupported font:"), }), be_str_literal("set_text_font"), &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ + ( &(const binstruction[114]) { /* code */ 0x4C080000, // 0000 LDNIL R2 0x600C0004, // 0001 GETGBL R3 G4 0x5C100200, // 0002 MOVE R4 R1 @@ -2834,66 +2837,87 @@ be_local_closure(lvh_obj_set_text_font, /* name */ 0xB0080000, // 001E RAISE 2 R0 R0 0x70020000, // 001F JMP #0021 0xB0080000, // 0020 RAISE 2 R0 R0 - 0x7002002C, // 0021 JMP #004F + 0x70020041, // 0021 JMP #0064 0x600C0004, // 0022 GETGBL R3 G4 0x5C100200, // 0023 MOVE R4 R1 0x7C0C0200, // 0024 CALL R3 1 0x1C0C0705, // 0025 EQ R3 R3 K5 - 0x780E0027, // 0026 JMPF R3 #004F + 0x780E003C, // 0026 JMPF R3 #0064 0xA40E0A00, // 0027 IMPORT R3 K5 0x8C100706, // 0028 GETMET R4 R3 K6 0x5C180200, // 0029 MOVE R6 R1 0x581C0007, // 002A LDCONST R7 K7 - 0x7C100600, // 002B CALL R4 3 - 0x6014000C, // 002C GETGBL R5 G12 - 0x5C180800, // 002D MOVE R6 R4 - 0x7C140200, // 002E CALL R5 1 - 0x28140B08, // 002F GE R5 R5 K8 - 0x7816001D, // 0030 JMPF R5 #004F - 0x60140009, // 0031 GETGBL R5 G9 - 0x5419FFFE, // 0032 LDINT R6 -1 - 0x94180806, // 0033 GETIDX R6 R4 R6 - 0x7C140200, // 0034 CALL R5 1 - 0x5419FFFD, // 0035 LDINT R6 -2 - 0x401A1206, // 0036 CONNECT R6 K9 R6 - 0x94180806, // 0037 GETIDX R6 R4 R6 - 0x8C180D0A, // 0038 GETMET R6 R6 K10 - 0x58200007, // 0039 LDCONST R8 K7 - 0x7C180400, // 003A CALL R6 2 - 0x241C0B09, // 003B GT R7 R5 K9 - 0x781E0011, // 003C JMPF R7 #004F - 0x601C000C, // 003D GETGBL R7 G12 - 0x5C200C00, // 003E MOVE R8 R6 - 0x7C1C0200, // 003F CALL R7 1 - 0x241C0F09, // 0040 GT R7 R7 K9 - 0x781E000C, // 0041 JMPF R7 #004F - 0xA8020007, // 0042 EXBLK 0 #004B - 0xB81E0200, // 0043 GETNGBL R7 K1 - 0x8C1C0F02, // 0044 GETMET R7 R7 K2 - 0x5C240C00, // 0045 MOVE R9 R6 - 0x5C280A00, // 0046 MOVE R10 R5 - 0x7C1C0600, // 0047 CALL R7 3 - 0x5C080E00, // 0048 MOVE R2 R7 - 0xA8040001, // 0049 EXBLK 1 1 - 0x70020003, // 004A JMP #004F - 0xAC1C0000, // 004B CATCH R7 0 0 - 0x70020000, // 004C JMP #004E - 0x70020000, // 004D JMP #004F - 0xB0080000, // 004E RAISE 2 R0 R0 - 0x4C0C0000, // 004F LDNIL R3 - 0x200C0403, // 0050 NE R3 R2 R3 - 0x780E0005, // 0051 JMPF R3 #0058 - 0x880C010B, // 0052 GETMBR R3 R0 K11 - 0x8C0C070C, // 0053 GETMET R3 R3 K12 - 0x5C140400, // 0054 MOVE R5 R2 - 0x58180009, // 0055 LDCONST R6 K9 - 0x7C0C0600, // 0056 CALL R3 3 - 0x70020003, // 0057 JMP #005C - 0x600C0001, // 0058 GETGBL R3 G1 - 0x5810000D, // 0059 LDCONST R4 K13 - 0x5C140200, // 005A MOVE R5 R1 - 0x7C0C0400, // 005B CALL R3 2 - 0x80000000, // 005C RET 0 + 0x58200008, // 002B LDCONST R8 K8 + 0x7C100800, // 002C CALL R4 4 + 0x8C140706, // 002D GETMET R5 R3 K6 + 0x5C1C0200, // 002E MOVE R7 R1 + 0x58200009, // 002F LDCONST R8 K9 + 0x7C140600, // 0030 CALL R5 3 + 0x6018000C, // 0031 GETGBL R6 G12 + 0x5C1C0800, // 0032 MOVE R7 R4 + 0x7C180200, // 0033 CALL R6 1 + 0x24180D08, // 0034 GT R6 R6 K8 + 0x781A000A, // 0035 JMPF R6 #0041 + 0x6018000C, // 0036 GETGBL R6 G12 + 0x941C090A, // 0037 GETIDX R7 R4 K10 + 0x7C180200, // 0038 CALL R6 1 + 0x1C180D08, // 0039 EQ R6 R6 K8 + 0x781A0005, // 003A JMPF R6 #0041 + 0xB81A0200, // 003B GETNGBL R6 K1 + 0x8C180D0B, // 003C GETMET R6 R6 K11 + 0x5C200200, // 003D MOVE R8 R1 + 0x7C180400, // 003E CALL R6 2 + 0x5C080C00, // 003F MOVE R2 R6 + 0x70020022, // 0040 JMP #0064 + 0x6018000C, // 0041 GETGBL R6 G12 + 0x5C1C0A00, // 0042 MOVE R7 R5 + 0x7C180200, // 0043 CALL R6 1 + 0x28180D0C, // 0044 GE R6 R6 K12 + 0x781A001D, // 0045 JMPF R6 #0064 + 0x60180009, // 0046 GETGBL R6 G9 + 0x541DFFFE, // 0047 LDINT R7 -1 + 0x941C0A07, // 0048 GETIDX R7 R5 R7 + 0x7C180200, // 0049 CALL R6 1 + 0x541DFFFD, // 004A LDINT R7 -2 + 0x401E1407, // 004B CONNECT R7 K10 R7 + 0x941C0A07, // 004C GETIDX R7 R5 R7 + 0x8C1C0F0D, // 004D GETMET R7 R7 K13 + 0x58240009, // 004E LDCONST R9 K9 + 0x7C1C0400, // 004F CALL R7 2 + 0x24200D0A, // 0050 GT R8 R6 K10 + 0x78220011, // 0051 JMPF R8 #0064 + 0x6020000C, // 0052 GETGBL R8 G12 + 0x5C240E00, // 0053 MOVE R9 R7 + 0x7C200200, // 0054 CALL R8 1 + 0x2420110A, // 0055 GT R8 R8 K10 + 0x7822000C, // 0056 JMPF R8 #0064 + 0xA8020007, // 0057 EXBLK 0 #0060 + 0xB8220200, // 0058 GETNGBL R8 K1 + 0x8C201102, // 0059 GETMET R8 R8 K2 + 0x5C280E00, // 005A MOVE R10 R7 + 0x5C2C0C00, // 005B MOVE R11 R6 + 0x7C200600, // 005C CALL R8 3 + 0x5C081000, // 005D MOVE R2 R8 + 0xA8040001, // 005E EXBLK 1 1 + 0x70020003, // 005F JMP #0064 + 0xAC200000, // 0060 CATCH R8 0 0 + 0x70020000, // 0061 JMP #0063 + 0x70020000, // 0062 JMP #0064 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x4C0C0000, // 0064 LDNIL R3 + 0x200C0403, // 0065 NE R3 R2 R3 + 0x780E0005, // 0066 JMPF R3 #006D + 0x880C010E, // 0067 GETMBR R3 R0 K14 + 0x8C0C070F, // 0068 GETMET R3 R3 K15 + 0x5C140400, // 0069 MOVE R5 R2 + 0x5818000A, // 006A LDCONST R6 K10 + 0x7C0C0600, // 006B CALL R3 3 + 0x70020003, // 006C JMP #0071 + 0x600C0001, // 006D GETGBL R3 G1 + 0x58100010, // 006E LDCONST R4 K16 + 0x5C140200, // 006F MOVE R5 R1 + 0x7C0C0400, // 0070 CALL R3 2 + 0x80000000, // 0071 RET 0 }) ) ); @@ -3659,68 +3683,69 @@ be_local_class(lvh_obj, { be_const_key_literal("set_text_font", 23), be_const_closure(lvh_obj_set_text_font_closure) }, { be_const_key_literal("set_pad_left2", 47), be_const_closure(lvh_obj_set_pad_left2_closure) }, { be_const_key_literal("_attr_map", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(60, + be_const_map( * be_nested_map(61, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("action", 54), be_const_nil() }, - { be_const_key_literal("pad_bottom", -1), be_nested_str_literal("style_pad_bottom") }, - { be_const_key_literal("min", 21), be_const_nil() }, - { be_const_key_literal("pad_right2", 58), be_const_nil() }, - { be_const_key_literal("angle", 1), be_const_nil() }, - { be_const_key_literal("val", 23), be_nested_str_literal("value") }, - { be_const_key_literal("text_color", 32), be_const_nil() }, - { be_const_key_literal("hidden", -1), be_const_nil() }, - { be_const_key_literal("speed", -1), be_const_nil() }, - { be_const_key_literal("image_recolor", -1), be_nested_str_literal("style_img_recolor") }, - { be_const_key_literal("value_str", -1), be_const_nil() }, - { be_const_key_literal("line_color", 20), be_nested_str_literal("style_line_color") }, - { be_const_key_literal("line_width", -1), be_const_nil() }, - { be_const_key_literal("toggle", 7), be_const_nil() }, - { be_const_key_literal("pad_all", -1), be_nested_str_literal("style_pad_all") }, - { be_const_key_literal("x", -1), be_nested_str_literal("x") }, - { be_const_key_literal("pad_left2", 5), be_const_nil() }, - { be_const_key_literal("radius", 30), be_nested_str_literal("style_radius") }, - { be_const_key_literal("mode", 48), be_const_nil() }, - { be_const_key_literal("val_rule", 17), be_const_nil() }, - { be_const_key_literal("bg_grad_color", 45), be_nested_str_literal("style_bg_grad_color") }, - { be_const_key_literal("value_ofs_y", 51), be_const_nil() }, - { be_const_key_literal("end_angle", -1), be_nested_str_literal("bg_end_angle") }, - { be_const_key_literal("y", -1), be_nested_str_literal("y") }, - { be_const_key_literal("image_recolor_opa", -1), be_nested_str_literal("style_img_recolor_opa") }, - { be_const_key_literal("text_rule_format", -1), be_const_nil() }, - { be_const_key_literal("value_color", 39), be_const_nil() }, - { be_const_key_literal("asjustable", 0), be_const_nil() }, - { be_const_key_literal("pad_all2", -1), be_const_nil() }, - { be_const_key_literal("max", -1), be_const_nil() }, - { be_const_key_literal("bg_opa", 53), be_nested_str_literal("style_bg_opa") }, - { be_const_key_literal("h", -1), be_nested_str_literal("height") }, - { be_const_key_literal("pad_left", 57), be_nested_str_literal("style_pad_left") }, - { be_const_key_literal("type", -1), be_const_nil() }, + { be_const_key_literal("action", 57), be_const_nil() }, { be_const_key_literal("text", -1), be_const_nil() }, - { be_const_key_literal("rotation", 2), be_nested_str_literal("rotation") }, - { be_const_key_literal("value_ofs_x", -1), be_const_nil() }, - { be_const_key_literal("src", -1), be_nested_str_literal("src") }, - { be_const_key_literal("start_angle1", -1), be_nested_str_literal("start_angle") }, - { be_const_key_literal("w", 43), be_nested_str_literal("width") }, - { be_const_key_literal("pad_top2", -1), be_const_nil() }, - { be_const_key_literal("end_angle1", 9), be_nested_str_literal("end_angle") }, - { be_const_key_literal("enabled", -1), be_const_nil() }, - { be_const_key_literal("align", -1), be_const_nil() }, - { be_const_key_literal("border_width", -1), be_nested_str_literal("style_border_width") }, - { be_const_key_literal("start_angle", -1), be_nested_str_literal("bg_start_angle") }, - { be_const_key_literal("val_rule_formula", 52), be_const_nil() }, - { be_const_key_literal("click", -1), be_const_nil() }, - { be_const_key_literal("bg_color", -1), be_nested_str_literal("style_bg_color") }, - { be_const_key_literal("text_rule", -1), be_const_nil() }, - { be_const_key_literal("pad_top", -1), be_nested_str_literal("style_pad_top") }, - { be_const_key_literal("line_width1", -1), be_const_nil() }, - { be_const_key_literal("pad_bottom2", 55), be_const_nil() }, - { be_const_key_literal("radius2", -1), be_const_nil() }, - { be_const_key_literal("bg_grad_dir", -1), be_nested_str_literal("style_bg_grad_dir") }, - { be_const_key_literal("text_font", -1), be_const_nil() }, - { be_const_key_literal("text_rule_formula", -1), be_const_nil() }, - { be_const_key_literal("value_font", -1), be_const_nil() }, - { be_const_key_literal("border_side", -1), be_nested_str_literal("style_border_side") }, + { be_const_key_literal("text_color", -1), be_const_nil() }, + { be_const_key_literal("val", 42), be_nested_str_literal("value") }, { be_const_key_literal("pad_right", -1), be_nested_str_literal("style_pad_right") }, + { be_const_key_literal("pad_left", -1), be_nested_str_literal("style_pad_left") }, + { be_const_key_literal("enabled", -1), be_const_nil() }, + { be_const_key_literal("hidden", -1), be_const_nil() }, + { be_const_key_literal("toggle", 44), be_const_nil() }, + { be_const_key_literal("pad_bottom", -1), be_nested_str_literal("style_pad_bottom") }, + { be_const_key_literal("line_width1", -1), be_const_nil() }, + { be_const_key_literal("pad_left2", -1), be_const_nil() }, + { be_const_key_literal("rotation", 36), be_nested_str_literal("rotation") }, + { be_const_key_literal("bg_grad_color", -1), be_nested_str_literal("style_bg_grad_color") }, + { be_const_key_literal("x", 35), be_nested_str_literal("x") }, + { be_const_key_literal("border_side", -1), be_nested_str_literal("style_border_side") }, + { be_const_key_literal("border_width", -1), be_nested_str_literal("style_border_width") }, + { be_const_key_literal("h", 1), be_nested_str_literal("height") }, + { be_const_key_literal("type", 27), be_const_nil() }, + { be_const_key_literal("pad_all2", -1), be_const_nil() }, + { be_const_key_literal("text_rule_format", -1), be_const_nil() }, + { be_const_key_literal("image_recolor_opa", -1), be_nested_str_literal("style_img_recolor_opa") }, + { be_const_key_literal("border_color", -1), be_nested_str_literal("style_border_color") }, + { be_const_key_literal("src", -1), be_nested_str_literal("src") }, + { be_const_key_literal("val_rule_formula", -1), be_const_nil() }, + { be_const_key_literal("mode", -1), be_const_nil() }, + { be_const_key_literal("text_font", 19), be_const_nil() }, + { be_const_key_literal("y", -1), be_nested_str_literal("y") }, + { be_const_key_literal("align", -1), be_const_nil() }, + { be_const_key_literal("pad_bottom2", 41), be_const_nil() }, + { be_const_key_literal("pad_right2", 3), be_const_nil() }, + { be_const_key_literal("line_width", -1), be_const_nil() }, + { be_const_key_literal("bg_grad_dir", 10), be_nested_str_literal("style_bg_grad_dir") }, + { be_const_key_literal("text_rule", -1), be_const_nil() }, + { be_const_key_literal("text_rule_formula", 0), be_const_nil() }, + { be_const_key_literal("radius", -1), be_nested_str_literal("style_radius") }, + { be_const_key_literal("bg_opa", -1), be_nested_str_literal("style_bg_opa") }, + { be_const_key_literal("bg_color", -1), be_nested_str_literal("style_bg_color") }, + { be_const_key_literal("pad_all", -1), be_nested_str_literal("style_pad_all") }, + { be_const_key_literal("pad_top2", -1), be_const_nil() }, + { be_const_key_literal("pad_top", 7), be_nested_str_literal("style_pad_top") }, + { be_const_key_literal("click", 49), be_const_nil() }, + { be_const_key_literal("line_color", -1), be_nested_str_literal("style_line_color") }, + { be_const_key_literal("value_color", -1), be_const_nil() }, + { be_const_key_literal("start_angle", -1), be_nested_str_literal("bg_start_angle") }, + { be_const_key_literal("speed", -1), be_const_nil() }, + { be_const_key_literal("angle", -1), be_const_nil() }, + { be_const_key_literal("asjustable", 51), be_const_nil() }, + { be_const_key_literal("end_angle1", 46), be_nested_str_literal("end_angle") }, + { be_const_key_literal("min", -1), be_const_nil() }, + { be_const_key_literal("end_angle", 21), be_nested_str_literal("bg_end_angle") }, + { be_const_key_literal("start_angle1", -1), be_nested_str_literal("start_angle") }, + { be_const_key_literal("value_ofs_y", -1), be_const_nil() }, + { be_const_key_literal("image_recolor", -1), be_nested_str_literal("style_img_recolor") }, + { be_const_key_literal("value_str", 2), be_const_nil() }, + { be_const_key_literal("radius2", 59), be_const_nil() }, + { be_const_key_literal("value_ofs_x", -1), be_const_nil() }, + { be_const_key_literal("val_rule", -1), be_const_nil() }, + { be_const_key_literal("w", -1), be_nested_str_literal("width") }, + { be_const_key_literal("value_font", -1), be_const_nil() }, + { be_const_key_literal("max", 11), be_const_nil() }, })) ) } )) }, { be_const_key_literal("get_value_ofs_y", -1), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, { be_const_key_literal("_text_rule", -1), be_const_var(8) }, diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index 80efa8588..279e62044 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -77,6 +77,7 @@ class lvh_obj "radius": "style_radius", "border_side": "style_border_side", "border_width": "style_border_width", + "border_color": "style_border_color", "line_width": nil, # depends on class "line_width1": nil, # depends on class "action": nil, # store the action in self.action @@ -506,8 +507,13 @@ class lvh_obj end elif type(t) == 'string' import string + # look for 'A:name.font' style font file name + var drive_split = string.split(t, ':', 1) var fn_split = string.split(t, '-') - if size(fn_split) >= 2 # it does contain '-' + if size(drive_split) > 1 && size(drive_split[0]) == 1 + # font is from disk + font = lv.load_font(t) + elif size(fn_split) >= 2 # it does contain '-' var sz = int(fn_split[-1]) var name = fn_split[0..-2].concat('-') # rebuild the font name if sz > 0 && size(name) > 0 # looks good, let's have a try From 03748bd3c0fa612cca0c6efa98036907e42e20cf Mon Sep 17 00:00:00 2001 From: David Gwynne Date: Fri, 15 Apr 2022 14:51:30 +1000 Subject: [PATCH 016/376] extend dimmer stepping so the step size can be specified in the command. this allows things like "DIMMER +20" to increase the dimmer value by 20, and "DIMMER -40" to lower it by 40. 'DIMMER +' and 'DIMMER +' keep their current behaviour. this is useful if you're using something like a zigbee remote that generate a single message with how much of a step up or down to perform as part of the payload rather than multiple messages. --- tasmota/xdrv_04_light.ino | 49 ++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 6 deletions(-) diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 7c0b8344d..0ecdeffca 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -2902,6 +2902,44 @@ void LightDimmerOffset(uint32_t index, int32_t offset) { CmndDimmer(); } +static int DimmerStep(int dimmer) +{ + int step; + int plus = 1; + int payload; + + if (0 == XdrvMailbox.data_len) { + return -1; + } + + switch (XdrvMailbox.data[0]) { + case '-': + plus = 0; + case '+': + break; + default: + return -1; + } + + if (1 == XdrvMailbox.data_len) { + step = Settings->dimmer_step; + } else { + char *ep; + step = strtoul(XdrvMailbox.data + 1, &ep, 10); + if ('\0' != *ep || 1 > step) { + return -1; + } + } + + if (plus) { + payload = min(100, dimmer + step); + } else { + payload = max(1, dimmer - step); + } + + return payload; +} + void CmndDimmer(void) { // Dimmer - Show current Dimmer state @@ -2926,12 +2964,11 @@ void CmndDimmer(void) dimmer = light_state.getDimmer(XdrvMailbox.index); } // Handle +/-/!/ special commands - if (1 == XdrvMailbox.data_len) { - if ('+' == XdrvMailbox.data[0]) { - XdrvMailbox.payload = (dimmer > (100 - Settings->dimmer_step - 1)) ? 100 : dimmer + Settings->dimmer_step; - } else if ('-' == XdrvMailbox.data[0]) { - XdrvMailbox.payload = (dimmer < (Settings->dimmer_step + 1)) ? 1 : dimmer - Settings->dimmer_step; - } else if ('!' == XdrvMailbox.data[0] && Light.fade_running) { + int payload = DimmerStep(dimmer); + if (-1 != payload) { + XdrvMailbox.payload = payload; + } else if (1 == XdrvMailbox.data_len) { + if ('!' == XdrvMailbox.data[0] && Light.fade_running) { XdrvMailbox.payload = LightGetCurFadeBri(); } else if ('<' == XdrvMailbox.data[0] ) { XdrvMailbox.payload = 1; From d542da0780e35628ab0b4df811fe33a93e8c650a Mon Sep 17 00:00:00 2001 From: Bernhard Kirchen Date: Fri, 15 Apr 2022 18:54:53 +0200 Subject: [PATCH 017/376] do not prepend "backlog0" chain with "backlog" --- tasmota/xdrv_10_rules.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index 152824fd3..edb995930 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -772,6 +772,7 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved) // Use Backlog with event to prevent rule event loop exception unless IF is used which uses an implicit backlog if ((ucommand.indexOf(F("IF ")) == -1) && (ucommand.indexOf(F("EVENT ")) != -1) && + (ucommand.indexOf(F("BACKLOG0 ")) == -1) && (ucommand.indexOf(F("BACKLOG ")) == -1)) { commands = String(F("backlog ")) + commands; } From b422274e00fcbec6e4a923689a3e025c49e93961 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 16 Apr 2022 12:29:01 +0200 Subject: [PATCH 018/376] Berry support for SD card --- .../Zip-readonly-FS/src/ZipReadFS.cpp | 33 +++++++++++++---- lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h | 36 ++++++++----------- tasmota/xdrv_50_filesystem.ino | 4 +-- tasmota/xdrv_54_lvgl.ino | 3 +- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp index ffe07dc73..4cfc6dbd2 100644 --- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp +++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.cpp @@ -393,8 +393,26 @@ bool ZipArchive::parse(void) { ** ********************************************************************/ +/* get the FS corresponding to the prefix, typically /sd/ for sdcard */ +FS * ZipReadFSImpl::getFS(const char *path) const { + if (_fs == nullptr) { return nullptr; } + if (_alt_fs == nullptr || _alt_fs_prefix == nullptr) { return *_fs; } + + /* from now neither _fs not _alt_fs are null + /* if however they point to the same value, then we don't have an alternative FS */ + if (*_fs == *_alt_fs) { return *_fs; } + + /* check prefix */ + if (strncmp(_alt_fs_prefix, path, strlen(_alt_fs_prefix))) { + return *_alt_fs; + } else { + return *_fs; + } +} + FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool create) { - if (*_fs == nullptr) { return nullptr; } + FS * fs = getFS(path); + if (fs == nullptr) { return nullptr; } if (strchr(path, '#')) { // we don't support any other mode than "r" and no-create @@ -414,7 +432,7 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c if (*suffix == '/') { suffix++; } // AddLog(LOG_LEVEL_DEBUG, "ZIP: prefix=%s suffix=%s", prefix, suffix); // parse ZIP archive - File zipfile = (*_fs)->open(prefix, "r", false); + File zipfile = fs->open(prefix, "r", false); if ((bool)zipfile) { // we could read the file ZipArchive zip_archive = ZipArchive(&zipfile); @@ -424,7 +442,7 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c 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 ZipItemImplPtr(new ZipItemImpl(fs->open(prefix, "r", false), entry.file_start, entry.file_len, entry.last_mod)); } } return ZipReadFileImplPtr(); // return an error @@ -434,12 +452,13 @@ FileImplPtr ZipReadFSImpl::open(const char* path, const char* mode, const bool c } } else { // simple file, do nothing - return ZipReadFileImplPtr(new ZipReadFileImpl((*_fs)->open(path, mode, create))); + return ZipReadFileImplPtr(new ZipReadFileImpl(fs->open(path, mode, create))); } } bool ZipReadFSImpl::exists(const char* path) { - if (*_fs == nullptr) { return false; } + FS * fs = getFS(path); + if (fs == nullptr) { return false; } if (strchr(path, '#')) { // treat as a ZIP archive @@ -451,7 +470,7 @@ bool ZipReadFSImpl::exists(const char* path) { char *prefix = strtok_r(sub_path, "#", &tok); char *suffix = strtok_r(NULL, "", &tok); // parse ZIP archive - File zipfile = (*_fs)->open(prefix, "r", false); + File zipfile = fs->open(prefix, "r", false); if ((bool)zipfile) { // we could read the file ZipArchive zip_archive = ZipArchive(&zipfile); @@ -466,7 +485,7 @@ bool ZipReadFSImpl::exists(const char* path) { return false; } else { // simple file, do nothing - return (*_fs)->exists(path); + return fs->exists(path); } } diff --git a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h index ff0e2f997..7c41f7623 100644 --- a/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h +++ b/lib/libesp32/Zip-readonly-FS/src/ZipReadFS.h @@ -17,40 +17,32 @@ typedef std::shared_ptr ZipReadFSImplPtr; class ZipReadFSImpl : public FSImpl { public: - ZipReadFSImpl(FS **fs) : _fs(fs) {}; + ZipReadFSImpl(FS **fs) : _fs(fs), _alt_fs(nullptr), _alt_fs_prefix(nullptr) {}; + ZipReadFSImpl(FS **fs, const char *alt_fs_prefix, FS **alt_fs) : _fs(fs), _alt_fs(alt_fs), _alt_fs_prefix(alt_fs_prefix) {}; virtual ~ZipReadFSImpl(); + /* get the FS corresponding to the prefix, typically /sd/ for sdcard */ + FS * getFS(const char *path) const; + 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; - } + FS * fs = getFS(pathFrom); + return fs ? fs->rename(pathFrom, pathTo) : false; } bool remove(const char* path) { - if (*_fs) { - return (*_fs)->remove(path); - } else { - return false; - } + FS * fs = getFS(path); + return fs ? fs->remove(path) : false; } bool mkdir(const char *path) { - if (*_fs) { - return (*_fs)->mkdir(path); - } else { - return false; - } + FS * fs = getFS(path); + return fs ? fs->mkdir(path) : false; } bool rmdir(const char *path) { - if (*_fs) { - return (*_fs)->rmdir(path); - } else { - return false; - } + FS * fs = getFS(path); + return fs ? fs->rmdir(path) : false; } void mountpoint(const char *) { }; @@ -60,6 +52,8 @@ public: private: FS **_fs; + FS **_alt_fs; + const char *_alt_fs_prefix; }; #endif // ESP32 diff --git a/tasmota/xdrv_50_filesystem.ino b/tasmota/xdrv_50_filesystem.ino index 2000a88e2..4e8cfbf04 100644 --- a/tasmota/xdrv_50_filesystem.ino +++ b/tasmota/xdrv_50_filesystem.ino @@ -110,10 +110,10 @@ void UfsInitOnce(void) { #ifdef ESP32 // try lfs first ffsp = &LittleFS; - if (!LittleFS.begin(true)) { + if (!LittleFS.begin(true, "")) { // force empty mount point to make it the fallback FS // ffat is second ffsp = &FFat; - if (!FFat.begin(true)) { + if (!FFat.begin(true, "")) { ffsp = nullptr; return; } diff --git a/tasmota/xdrv_54_lvgl.ino b/tasmota/xdrv_54_lvgl.ino index 3d3159415..3c6ad507a 100644 --- a/tasmota/xdrv_54_lvgl.ino +++ b/tasmota/xdrv_54_lvgl.ino @@ -119,7 +119,8 @@ void lv_flush_callback(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *c #include #include "ZipReadFS.h" extern FS *ffsp; -FS lv_zip_ufsp(ZipReadFSImplPtr(new ZipReadFSImpl(&ffsp))); +extern FS *ufsp; +FS lv_zip_ufsp(ZipReadFSImplPtr(new ZipReadFSImpl(&ffsp, "/sd/", &ufsp))); extern "C" { From 7c417430c9b90bc628372c205dedba798216b5d1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 16 Apr 2022 16:07:42 +0200 Subject: [PATCH 019/376] Add energy export active to ADE7880 Add command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/i18n.h | 1 + tasmota/settings.h | 6 +++-- tasmota/settings.ino | 1 + tasmota/xdrv_03_energy.ino | 49 ++++++++++++++++++++++++++++++++++--- tasmota/xnrg_23_ade7880.ino | 1 + 7 files changed, 55 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 014b13aa3..a84be6f50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for Sonoff MS01 soil moisture sensor (#15335) - Support for daisy chaining MAX7219 displays (#15345) +- Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 00240dc5d..ee8b4152f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -106,6 +106,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v11.1.0.1 ### Added +- Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 47bcce2ae..c2f94c48a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -444,6 +444,7 @@ #define D_CMND_ENERGYTOTAL "EnergyTotal" #define D_CMND_ENERGYUSAGE "EnergyUsage" #define D_CMND_ENERGYEXPORT "EnergyExport" +#define D_CMND_ENERGYEXPORTACTIVE "EnergyExportActive" #define D_CMND_POWERSET "PowerSet" #define D_CMND_VOLTAGESET "VoltageSet" #define D_CMND_CURRENTSET "CurrentSet" diff --git a/tasmota/settings.h b/tasmota/settings.h index f53be14d6..e2b5be2ac 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -779,10 +779,11 @@ typedef struct { uint8_t tcp_config; // F5F uint8_t light_step_pixels; // F60 - uint8_t free_f61[39]; // F61 - Decrement if adding new Setting variables just above and below + uint8_t free_f61[27]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below + int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 uint32_t energy_kWhtotal; // F9C SBitfield1 sbflag1; // FA0 @@ -837,8 +838,9 @@ typedef struct { int32_t energy_kWhtoday_ph[3]; // 2D8 int32_t energy_kWhtotal_ph[3]; // 2E4 + int32_t energy_kWhexport_ph[3]; // 2F0 - // 2F0 - 2FF free locations + uint8_t free_2fc[4]; // 2FC } TRtcSettings; TRtcSettings RtcSettings; #ifdef ESP32 diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 1b4c2763c..2670bd63d 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -47,6 +47,7 @@ void RtcSettingsSave(void) { for (uint32_t i = 0; i < 3; i++) { RtcSettings.energy_kWhtoday_ph[i] = Settings->energy_kWhtoday_ph[i]; RtcSettings.energy_kWhtotal_ph[i] = Settings->energy_kWhtotal_ph[i]; + RtcSettings.energy_kWhexport_ph[i] = Settings->energy_kWhexport_ph[i]; } RtcSettings.energy_usage = Settings->energy_usage; for (uint32_t i = 0; i < MAX_COUNTERS; i++) { diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index ff665caf7..d66b76b93 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -56,7 +56,7 @@ const char kEnergyCommands[] PROGMEM = "|" // No prefix D_CMND_SAFEPOWER "|" D_CMND_SAFEPOWERHOLD "|" D_CMND_SAFEPOWERWINDOW "|" #endif // USE_ENERGY_POWER_LIMIT #endif // USE_ENERGY_MARGIN_DETECTION - D_CMND_ENERGYTODAY "|" D_CMND_ENERGYYESTERDAY "|" D_CMND_ENERGYTOTAL "|" D_CMND_ENERGYUSAGE "|" D_CMND_ENERGYEXPORT "|" D_CMND_TARIFF; + D_CMND_ENERGYTODAY "|" D_CMND_ENERGYYESTERDAY "|" D_CMND_ENERGYTOTAL "|" D_CMND_ENERGYEXPORTACTIVE "|" D_CMND_ENERGYUSAGE "|" D_CMND_ENERGYEXPORT "|" D_CMND_TARIFF; void (* const EnergyCommand[])(void) PROGMEM = { &CmndPowerCal, &CmndVoltageCal, &CmndCurrentCal, &CmndFrequencyCal, @@ -69,7 +69,7 @@ void (* const EnergyCommand[])(void) PROGMEM = { &CmndSafePower, &CmndSafePowerHold, &CmndSafePowerWindow, #endif // USE_ENERGY_POWER_LIMIT #endif // USE_ENERGY_MARGIN_DETECTION - &CmndEnergyToday, &CmndEnergyYesterday, &CmndEnergyTotal, &CmndEnergyUsage, &CmndEnergyExport, &CmndTariff}; + &CmndEnergyToday, &CmndEnergyYesterday, &CmndEnergyTotal, &CmndEnergyExportActive, &CmndEnergyUsage, &CmndEnergyExport, &CmndTariff}; struct ENERGY { float voltage[ENERGY_MAX_PHASES]; // 123.1 V @@ -105,6 +105,7 @@ struct ENERGY { bool voltage_available; // Enable if voltage is measured bool current_available; // Enable if current is measured + bool local_energy_active_export; // Enable if support for storing energy_active bool type_dc; bool power_on; @@ -243,6 +244,13 @@ void EnergyUpdateToday(void) { int32_t delta = Energy.kWhtoday_delta[i] / 1000; Energy.kWhtoday_delta[i] -= (delta * 1000); Energy.kWhtoday[i] += delta; + + if (delta < 0) { // Export energy + RtcSettings.energy_kWhexport_ph[i] += (delta *-1); + if (Energy.local_energy_active_export) { + Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 100000; + } + } } RtcSettings.energy_kWhtoday_ph[i] = Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]; @@ -338,6 +346,8 @@ void Energy200ms(void) RtcSettings.energy_kWhtotal_ph[i] += RtcSettings.energy_kWhtoday_ph[i]; Settings->energy_kWhtotal_ph[i] = RtcSettings.energy_kWhtotal_ph[i]; + Settings->energy_kWhexport_ph[i] = RtcSettings.energy_kWhexport_ph[i]; + Energy.period[i] -= RtcSettings.energy_kWhtoday_ph[i]; // this becomes a large unsigned, effectively a negative for EnergyShow calculation Energy.kWhtoday[i] = 0; Energy.kWhtoday_offset[i] = 0; @@ -369,6 +379,7 @@ void EnergySaveState(void) for (uint32_t i = 0; i < 3; i++) { Settings->energy_kWhtoday_ph[i] = RtcSettings.energy_kWhtoday_ph[i]; Settings->energy_kWhtotal_ph[i] = RtcSettings.energy_kWhtotal_ph[i]; + Settings->energy_kWhexport_ph[i] = RtcSettings.energy_kWhexport_ph[i]; } Settings->energy_usage = RtcSettings.energy_usage; @@ -629,13 +640,21 @@ void ResponseCmndEnergyTotalYesterdayToday(void) { for (uint32_t i = 0; i < Energy.phase_count; i++) { energy_yesterday_ph[i] = (float)Settings->energy_kWhyesterday_ph[i] / 100000; Energy.total[i] = (float)(RtcSettings.energy_kWhtotal_ph[i] + Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]) / 100000; + if (Energy.local_energy_active_export) { + Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[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), EnergyFormat(value2_chr, energy_yesterday_ph, Settings->flag2.energy_resolution), EnergyFormat(value3_chr, Energy.daily, Settings->flag2.energy_resolution)); + if (Energy.local_energy_active_export) { + ResponseAppend_P(PSTR(",\"" D_JSON_EXPORT_ACTIVE "\":%s"), + EnergyFormat(value_chr, Energy.export_active, Settings->flag2.energy_resolution)); + } + ResponseJsonEndEnd(); } void CmndEnergyTotal(void) { @@ -671,6 +690,7 @@ void CmndEnergyYesterday(void) { } ResponseCmndEnergyTotalYesterdayToday(); } + void CmndEnergyToday(void) { uint32_t values[2] = { 0 }; uint32_t params = ParseParameters(2, values); @@ -696,6 +716,26 @@ void CmndEnergyToday(void) { ResponseCmndEnergyTotalYesterdayToday(); } +void CmndEnergyExportActive(void) { + if (Energy.local_energy_active_export) { + // EnergyExportActive1 24 + // EnergyExportActive1 24,1650111291 + uint32_t values[2] = { 0 }; + uint32_t params = ParseParameters(2, values); + + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= Energy.phase_count) && (params > 0)) { + uint32_t phase = XdrvMailbox.index -1; + // Reset Energy Export Active + RtcSettings.energy_kWhexport_ph[phase] = values[0] * 100; + Settings->energy_kWhexport_ph[phase] = RtcSettings.energy_kWhexport_ph[phase]; + if (params > 1) { + Settings->energy_kWhtotal_time = values[1]; + } + } + ResponseCmndEnergyTotalYesterdayToday(); + } +} + void ResponseCmndEnergyUsageExport(void) { float usage1_kWhtotal = (float)Settings->energy_usage.usage1_kWhtotal / 100000; float usage2_kWhtotal = (float)Settings->energy_usage.usage2_kWhtotal / 100000; @@ -1032,6 +1072,9 @@ void EnergySnsInit(void) // Energy.kWhtoday_ph[i] = 0; // Energy.kWhtoday_delta[i] = 0; Energy.period[i] = Energy.kWhtoday_offset[i]; + if (Energy.local_energy_active_export) { + Energy.export_active[i] = 0; + } } EnergyUpdateToday(); ticker_energy.attach_ms(200, Energy200ms); diff --git a/tasmota/xnrg_23_ade7880.ino b/tasmota/xnrg_23_ade7880.ino index 9ff070c8c..2bdf9f486 100644 --- a/tasmota/xnrg_23_ade7880.ino +++ b/tasmota/xnrg_23_ade7880.ino @@ -635,6 +635,7 @@ void Ade7880DrvInit(void) { Energy.phase_count = 3; // Three phases // Settings->flag5.energy_phase = 1; // SetOption129 - (Energy) Show phase information // Energy.use_overtemp = true; // Use global temperature for overtemp detection + Energy.local_energy_active_export = true; TasmotaGlobal.energy_driver = XNRG_23; } } From f0a393908f7f018092b76d75e14b7a32115ffdbf Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 16 Apr 2022 17:07:00 +0200 Subject: [PATCH 020/376] implement mi32option6 2 --- tasmota/xsns_62_esp32_mi_ble.ino | 78 ++++++++++++++++++-------------- 1 file changed, 43 insertions(+), 35 deletions(-) diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/xsns_62_esp32_mi_ble.ino index bb659ca3d..9db9617e7 100644 --- a/tasmota/xsns_62_esp32_mi_ble.ino +++ b/tasmota/xsns_62_esp32_mi_ble.ino @@ -120,15 +120,18 @@ struct { } sensorreader; struct { - uint32_t allwaysAggregate:1; // always show all known values of one sensor in brdigemode - uint32_t noSummary:1; // no sensor values at TELE-period - uint32_t directBridgeMode:1; // send every received BLE-packet as a MQTT-message in real-time - uint32_t holdBackFirstAutodiscovery:1; // allows to trigger it later - uint32_t showRSSI:1; - uint32_t ignoreBogusBattery:1; - uint32_t minimalSummary:1; // DEPRECATED!! - uint32_t onlyAliased:1; // only include sensors that are aliased - uint32_t MQTTType:1; + uint32_t allwaysAggregate:1; // Mi32Option0: always show all known values of one sensor in bridge mode + uint32_t noSummary:1; // Mi32Option1: no sensor values at TELE-period + uint32_t directBridgeMode:1; // Mi32Option2: send every received BLE-packet as a MQTT-message in real-time + uint32_t holdBackFirstAutodiscovery:1; // + uint32_t showRSSI:1; // + uint32_t ignoreBogusBattery:1; // Mi32Option4: show BLE RSSI + uint32_t minimalSummary:1; // DEPRECATED!! + uint32_t onlyAliased:1; // Mi32Option5: only include sensors that are aliased + uint32_t MQTTType:2; // Mi32Option6: publish sensor on tasmota_ble with 1 topic per sensor + // Mi32Option6 0 : standard SENSOR message + // Mi32Option6 1 : tasmota_ble + per sensor topic (legacy syntax) + // MI32Option6 2 : same but add sensor name as key in JSON (same as standard SENSOR) } option; } MI32; @@ -1796,7 +1799,7 @@ void MI32ParseMiScalePacket(const uint8_t * _buf, uint32_t length, const uint8_t if (weight_removed) { MIBLEsensors[_slot].impedance = 0; - } + } } MIBLEsensors[_slot].shallSendMQTT = 1; @@ -2145,7 +2148,7 @@ void MI32EverySecond(bool restart){ MI32ShowSomeSensors(); } - if (MI32.option.MQTTType == 1 + if (MI32.option.MQTTType > 0 #ifdef USE_HOME_ASSISTANT || Settings->flag.hass_discovery @@ -2156,7 +2159,7 @@ void MI32EverySecond(bool restart){ MI32DiscoveryOneMISensor(); // show independent style sensor MQTT // note - if !MQTTType, then this is IN ADDITION to 'normal' - MI32ShowOneMISensor(); + MI32ShowOneMISensor(MI32.option.MQTTType < 2); } // read a battery if @@ -2383,52 +2386,52 @@ void CmndMi32Option(void){ if (strlen(XdrvMailbox.data)){ set = true; } - int onOff = atoi(XdrvMailbox.data); + int value = atoi(XdrvMailbox.data); switch(XdrvMailbox.index) { case 0: if (set){ - MI32.option.allwaysAggregate = onOff; + MI32.option.allwaysAggregate = value; } else { - onOff = MI32.option.allwaysAggregate; + value = MI32.option.allwaysAggregate; } break; case 1: if (set){ - MI32.option.noSummary = onOff; + MI32.option.noSummary = value; } else { - onOff = MI32.option.noSummary; + value = MI32.option.noSummary; } break; case 2: if (set){ - MI32.option.directBridgeMode = onOff; + MI32.option.directBridgeMode = value; } else { - onOff = MI32.option.directBridgeMode; + value = MI32.option.directBridgeMode; } break; case 4:{ if (set){ - MI32.option.ignoreBogusBattery = onOff; + MI32.option.ignoreBogusBattery = value; } else { - onOff = MI32.option.ignoreBogusBattery; + value = MI32.option.ignoreBogusBattery; } } break; case 5:{ if (set){ - MI32.option.onlyAliased = onOff; + MI32.option.onlyAliased = value; if (MI32.option.onlyAliased){ // discard all sensors for a restart MIBLEsensors.clear(); } } else { - onOff = MI32.option.onlyAliased; + value = MI32.option.onlyAliased; } } break; case 6:{ if (set){ - MI32.option.MQTTType = onOff; + MI32.option.MQTTType = value; } else { - onOff = MI32.option.MQTTType; + value = MI32.option.MQTTType; } } break; default:{ @@ -2436,7 +2439,7 @@ void CmndMi32Option(void){ return; } break; } - ResponseCmndIdxNumber(onOff); + ResponseCmndIdxNumber(value); return; } @@ -2884,8 +2887,8 @@ void MI32ShowSomeSensors(){ ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); } ResponseAppend_P(PSTR("}")); - MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); #ifdef USE_HOME_ASSISTANT if(hass_mode==2){ @@ -2900,7 +2903,7 @@ void MI32ShowSomeSensors(){ // starts a completely fresh MQTT message. // sends ONE sensor on a dedicated topic NOT related to this TAS // triggered by setting MI32.mqttCurrentSingleSlot = 0 -void MI32ShowOneMISensor(){ +void MI32ShowOneMISensor(bool hidename){ // don't detect half-added ones here int numsensors = MIBLEsensors.size(); if (MI32.mqttCurrentSingleSlot >= numsensors){ @@ -2913,11 +2916,11 @@ void MI32ShowOneMISensor(){ Settings->flag.hass_discovery || #endif //USE_HOME_ASSISTANT - MI32.option.MQTTType == 1 + MI32.option.MQTTType > 0 ){ ResponseTime_P(PSTR(",")); - MI32GetOneSensorJson(MI32.mqttCurrentSingleSlot, 1); + MI32GetOneSensorJson(MI32.mqttCurrentSingleSlot, hidename); mi_sensor_t *p; p = &MIBLEsensors[MI32.mqttCurrentSingleSlot]; @@ -2939,8 +2942,10 @@ void MI32ShowOneMISensor(){ char SensorTopic[TOPSZ]; GetTopic_P(SensorTopic, TELE, (char*)"tasmota_ble", id); + //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show one %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); MqttPublish(SensorTopic, Settings->flag.mqtt_sensor_retain); - //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); + if (MI32.option.MQTTType > 1) + XdrvRulesProcess(0); } MI32.mqttCurrentSingleSlot++; } @@ -3234,14 +3239,16 @@ void MI32ShowTriggeredSensors(){ int sensor = 0; int maxcnt = 4; + bool hidename = false; if( #ifdef USE_HOME_ASSISTANT Settings->flag.hass_discovery || #endif //USE_HOME_ASSISTANT - MI32.option.MQTTType == 1 + MI32.option.MQTTType > 0 ){ maxcnt = 1; + hidename = MI32.option.MQTTType < 2; } @@ -3257,7 +3264,7 @@ void MI32ShowTriggeredSensors(){ cnt++; ResponseAppend_P(PSTR(",")); // hide sensor name if HASS or option6 - MI32GetOneSensorJson(sensor, (maxcnt == 1)); + MI32GetOneSensorJson(sensor, hidename); int mlen = ResponseLength(); // if we ran out of room, leave here. @@ -3276,7 +3283,7 @@ void MI32ShowTriggeredSensors(){ Settings->flag.hass_discovery || #endif //USE_HOME_ASSISTANT - MI32.option.MQTTType == 1 + MI32.option.MQTTType > 0 ){ char SensorTopic[TOPSZ]; char idstr[32]; @@ -3290,10 +3297,11 @@ void MI32ShowTriggeredSensors(){ p->MAC[3], p->MAC[4], p->MAC[5]); } GetTopic_P(SensorTopic, TELE, (char*)"tasmota_ble", id); + //AddLog(LOG_LEVEL_DEBUG, PSTR("M32: triggered %d %s"), sensor, ResponseData()); MqttPublish(SensorTopic, Settings->flag.mqtt_sensor_retain); - AddLog(LOG_LEVEL_DEBUG, PSTR("M32: triggered %d %s"), sensor, ResponseData()); XdrvRulesProcess(0); } else { + //AddLog(LOG_LEVEL_DEBUG, PSTR("M32: triggered2 %d %s"), sensor, ResponseData()); MqttPublishPrefixTopicRulesProcess_P(STAT, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); } From db9b95bbe76b7810cd72022bf3c2f29279acf7e2 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 16 Apr 2022 17:13:26 +0200 Subject: [PATCH 021/376] refactor adding units to sensor message --- tasmota/support_tasmota.ino | 23 ++++++++++++++--------- tasmota/xsns_62_esp32_mi_ble.ino | 8 ++------ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 9af1b89f1..b0642a074 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -845,6 +845,19 @@ String GetSwitchText(uint32_t i) { return switch_text; } +void MqttAppendSensorUnits(void) +{ + if (ResponseContains_P(PSTR(D_JSON_PRESSURE))) { + ResponseAppend_P(PSTR(",\"" D_JSON_PRESSURE_UNIT "\":\"%s\""), PressureUnit().c_str()); + } + if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { + ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); + } + if (ResponseContains_P(PSTR(D_JSON_SPEED)) && Settings->flag2.speed_conversion) { + ResponseAppend_P(PSTR(",\"" D_JSON_SPEED_UNIT "\":\"%s\""), SpeedUnit().c_str()); + } +} + bool MqttShowSensor(bool call_show_sensor) { ResponseAppendTime(); @@ -893,15 +906,7 @@ bool MqttShowSensor(bool call_show_sensor) } bool json_data_available = (ResponseLength() - json_data_start); - if (ResponseContains_P(PSTR(D_JSON_PRESSURE))) { - ResponseAppend_P(PSTR(",\"" D_JSON_PRESSURE_UNIT "\":\"%s\""), PressureUnit().c_str()); - } - if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { - ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); - } - if (ResponseContains_P(PSTR(D_JSON_SPEED)) && Settings->flag2.speed_conversion) { - ResponseAppend_P(PSTR(",\"" D_JSON_SPEED_UNIT "\":\"%s\""), SpeedUnit().c_str()); - } + MqttAppendSensorUnits(); ResponseJsonEnd(); if (call_show_sensor && json_data_available) { XdrvCall(FUNC_SHOW_SENSOR); } diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/xsns_62_esp32_mi_ble.ino index 9db9617e7..478b07e8b 100644 --- a/tasmota/xsns_62_esp32_mi_ble.ino +++ b/tasmota/xsns_62_esp32_mi_ble.ino @@ -2883,9 +2883,7 @@ void MI32ShowSomeSensors(){ } cnt++; } - if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { - ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); - } + MqttAppendSensorUnits(); ResponseAppend_P(PSTR("}")); //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show some %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR), Settings->flag.mqtt_sensor_retain); @@ -3274,9 +3272,7 @@ void MI32ShowTriggeredSensors(){ } } if (cnt){ // if we got one, then publish - if (ResponseContains_P(PSTR(D_JSON_TEMPERATURE))) { - ResponseAppend_P(PSTR(",\"" D_JSON_TEMPERATURE_UNIT "\":\"%c\""), TempUnit()); - } + MqttAppendSensorUnits(); ResponseAppend_P(PSTR("}")); if( #ifdef USE_HOME_ASSISTANT From f85e0dd8059e8ea08a7efd7381d196859029ea8b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:19:04 +0200 Subject: [PATCH 022/376] Fix BL09xx negative power presentation Fix BL09xx negative power presentation (#15374) --- CHANGELOG.md | 1 + RELEASENOTES.md | 3 ++- tasmota/xnrg_14_bl09xx.ino | 16 ++++++++-------- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a84be6f50..2c824792b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. ### Fixed - SCD40 start low power command (#15361) - Improv initial or erase device installation failing to provide Configure WiFi option +- BL09xx negative power presentation (#15374) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index ee8b4152f..fd7854b34 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,7 +115,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Changed ### Fixed -- SCD40 start low power command [#15361](https://github.com/arendst/Tasmota/issues/15361) - Improv initial or erase device installation failing to provide Configure WiFi option +- SCD40 start low power command [#15361](https://github.com/arendst/Tasmota/issues/15361) +- BL09xx negative power presentation [#15374](https://github.com/arendst/Tasmota/issues/15374) ### Removed diff --git a/tasmota/xnrg_14_bl09xx.ino b/tasmota/xnrg_14_bl09xx.ino index 2a5f5e00a..64036191b 100644 --- a/tasmota/xnrg_14_bl09xx.ino +++ b/tasmota/xnrg_14_bl09xx.ino @@ -84,8 +84,8 @@ const uint8_t bl09xx_init[5][4] = { }; struct BL09XX { - int32_t voltage = 0; - int32_t current[2] = { 0, }; + uint32_t voltage = 0; + uint32_t current[2] = { 0, }; int32_t power[2] = { 0, }; float temperature; uint16_t tps1 = 0; @@ -128,13 +128,13 @@ bool Bl09XXDecode3940(void) { Bl09XX.voltage = Bl09XX.rx_buffer[12] << 16 | Bl09XX.rx_buffer[11] << 8 | Bl09XX.rx_buffer[10]; // V_RMS unsigned Bl09XX.current[0] = Bl09XX.rx_buffer[6] << 16 | Bl09XX.rx_buffer[5] << 8 | Bl09XX.rx_buffer[4]; // IA_RMS unsigned - int32_t tmp = Bl09XX.rx_buffer[18] << 24 | Bl09XX.rx_buffer[17] << 16 | Bl09XX.rx_buffer[16] << 8; // WATT_A signed - Bl09XX.power[0] = (tmp >> 8); // WATT_A unsigned + Bl09XX.power[0] = Bl09XX.rx_buffer[18] << 16 | Bl09XX.rx_buffer[17] << 8 | Bl09XX.rx_buffer[16]; // WATT_A signed + if (bitRead(Bl09XX.power[0], 23)) { Bl09XX.power[0] |= 0xFF000000; } // Extend sign bit if (Energy.phase_count > 1) { Bl09XX.current[1] = Bl09XX.rx_buffer[9] << 16 | Bl09XX.rx_buffer[8] << 8 | Bl09XX.rx_buffer[7]; // IB_RMS unsigned - tmp = Bl09XX.rx_buffer[21] << 24 | Bl09XX.rx_buffer[20] << 16 | Bl09XX.rx_buffer[19] << 8; // WATT_B signed - Bl09XX.power[1] = (tmp >> 8); // WATT_B unsigned + Bl09XX.power[1] = Bl09XX.rx_buffer[21] << 16 | Bl09XX.rx_buffer[20] << 8 | Bl09XX.rx_buffer[19]; // WATT_B signed + if (bitRead(Bl09XX.power[1], 23)) { Bl09XX.power[1] |= 0xFF000000; } // Extend sign bit } #ifdef DEBUG_BL09XX @@ -171,8 +171,8 @@ bool Bl09XXDecode42(void) { Bl09XX.voltage = Bl09XX.rx_buffer[6] << 16 | Bl09XX.rx_buffer[5] << 8 | Bl09XX.rx_buffer[4]; // V_RMS unsigned Bl09XX.current[0] = Bl09XX.rx_buffer[3] << 16 | Bl09XX.rx_buffer[2] << 8 | Bl09XX.rx_buffer[1]; // IA_RMS unsigned - int32_t tmp = Bl09XX.rx_buffer[12] << 24 | Bl09XX.rx_buffer[11] << 16 | Bl09XX.rx_buffer[10] << 8; // WATT_A signed - Bl09XX.power[0] = (tmp >> 8); // WATT_A unsigned + Bl09XX.power[0] = Bl09XX.rx_buffer[12] << 16 | Bl09XX.rx_buffer[11] << 8 | Bl09XX.rx_buffer[10]; // WATT_A signed + if (bitRead(Bl09XX.power[0], 23)) { Bl09XX.power[0] |= 0xFF000000; } // Extend sign bit #ifdef DEBUG_BL09XX AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: U %d, I %d, P %d"), From b0a26486c36a21d52df34ddc183497d467c49618 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 16 Apr 2022 17:43:10 +0200 Subject: [PATCH 023/376] Prep RTC chip memory use if present --- tasmota/my_user_config.h | 9 ++--- tasmota/tasmota_configurations.h | 8 +++-- tasmota/tasmota_configurations_ESP32.h | 18 ++++++---- tasmota/xdrv_56_rtc_chips.ino | 50 +++++++++++++++++++++++--- 4 files changed, 68 insertions(+), 17 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index ff9a11c26..f7c1d6368 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -613,8 +613,6 @@ // #define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) // #define USE_MPU6050 // [I2cDriver25] Enable MPU6050 sensor (I2C address 0x68 AD0 low or 0x69 AD0 high) (+3K3 of code and 188 Bytes of RAM) // #define USE_MPU6050_DMP // Enable in MPU6050 to use the DMP on the chip, should create better results (+8k6 of code) -// #define USE_DS3231 // [I2cDriver26] Enable DS3231 external RTC in case no Wi-Fi is avaliable. See docs in the source file (+1k2 code) -// #define DS3231_ADDRESS 0x68 // Default I2C address 0x68 // #define USE_MGC3130 // [I2cDriver27] Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem) // #define USE_MAX44009 // [I2cDriver28] Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code) // #define USE_SCD30 // [I2cDriver29] Enable Sensiron SCd30 CO2 sensor (I2C address 0x61) (+3k3 code) @@ -665,7 +663,6 @@ // #define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) // #define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) // #define USE_MPU_ACCEL // [I2cDriver58] Enable MPU6886/MPU9250 - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x68) (+2k code) -// #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_HM330X // [I2cDriver63] Enable support for SeedStudio Grove Particule sensor (I2C address 0x40) (+1k5 code) @@ -673,9 +670,13 @@ // #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 // #define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code) -// #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC (I2C address 0x51) (+0k7 code) // #define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) +// #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one +// #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) +// #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2.5k code) +// #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC - found Shelly 3EM (I2C address 0x51) (+0k7 code) + // #define USE_DISPLAY // Add I2C Display Support (+2k code) #define USE_DISPLAY_MODES1TO5 // Enable display mode 1 to 5 in addition to mode 0 #define USE_DISPLAY_LCD // [DisplayModel 1] [I2cDriver3] Enable Lcd display (I2C addresses 0x27 and 0x3F) (+6k code) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 7da082738..d97569395 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -103,7 +103,6 @@ #define USE_CCS811 // [I2cDriver24] Enable CCS811 sensor (I2C address 0x5A) (+2k2 code) //#define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) //#define USE_MPU6050 // [I2cDriver25] Enable MPU6050 sensor (I2C address 0x68 AD0 low or 0x69 AD0 high) (+3K3 of code and 188 Bytes of RAM) -//#define USE_DS3231 // [I2cDriver26] Enable DS3231 external RTC in case no Wifi is avaliable. See docs in the source file (+1k2 code) //#define USE_MGC3130 // [I2cDriver27] Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem) //#define USE_MAX44009 // [I2cDriver28] Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code) #define USE_SCD30 // [I2cDriver29] Enable Sensiron SCd30 CO2 sensor (I2C address 0x61) (+3k3 code) @@ -146,13 +145,16 @@ //#define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) //#define USE_MPU_ACCEL // [I2cDriver58] Enable MPU6886/MPU9250 - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x68) (+2k code) -//#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_PCF85363 // [I2cDriver66] Enable PCF85363 RTC (I2C address 0x51) (+0k7 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) +//#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one +// #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) +// #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2.5k code) +// #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC - found Shelly 3EM (I2C address 0x51) (+0k7 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_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index d0b8a0d3e..c6234dd8e 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -123,7 +123,8 @@ #define USE_XPT2046 #define USE_FT5206 #define USE_MPU_ACCEL -#define USE_BM8563 +#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one + #define USE_BM8563 #define USE_MLX90614 #define USE_UNIVERSAL_DISPLAY #define USE_DISPLAY_LVGL_ONLY @@ -197,7 +198,6 @@ //#define USE_CCS811 // [I2cDriver24] Enable CCS811 sensor (I2C address 0x5A) (+2k2 code) //#define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) //#define USE_MPU6050 // [I2cDriver25] Enable MPU6050 sensor (I2C address 0x68 AD0 low or 0x69 AD0 high) (+3K3 of code and 188 Bytes of RAM) -//#define USE_DS3231 // [I2cDriver26] Enable DS3231 external RTC in case no Wifi is avaliable. See docs in the source file (+1k2 code) //#define USE_MGC3130 // [I2cDriver27] Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem) //#define USE_MAX44009 // [I2cDriver28] Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code) //#define USE_SCD30 // [I2cDriver29] Enable Sensiron SCd30 CO2 sensor (I2C address 0x61) (+3k3 code) @@ -239,12 +239,15 @@ //#define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) //#define USE_MPU_ACCEL // [I2cDriver58] Enable MPU6886/MPU9250 - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x68) (+2k code) -//#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_PCF85363 // [I2cDriver66] Enable PCF85363 RTC (I2C address 0x51) (+0k7 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) +//#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one +// #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) +// #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2.5k code) +// #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC - found Shelly 3EM (I2C address 0x51) (+0k7 code) + //#define USE_MHZ19 // Add support for MH-Z19 CO2 sensor (+2k code) //#define USE_SENSEAIR // Add support for SenseAir K30, K70 and S8 CO2 sensor (+2k3 code) //#define USE_CM110x // Add support for CM110x CO2 sensors (+2k7 code) @@ -337,7 +340,6 @@ #define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) #define USE_MPU_ACCEL // [I2cDriver58] Enable MPU6886, MPU9250 6-axis MotionTracking sensor (I2C address 0x68) //#define USE_MPU6050 // [I2cDriver25] Enable MPU6050 sensor (I2C address 0x68 AD0 low or 0x69 AD0 high) (+3K3 of code and 188 Bytes of RAM) -//#define USE_DS3231 // [I2cDriver26] Enable DS3231 external RTC in case no Wifi is avaliable. See docs in the source file (+1k2 code) //#define USE_MGC3130 // [I2cDriver27] Enable MGC3130 Electric Field Effect Sensor (I2C address 0x42) (+2k7 code, 0k3 mem) //#define USE_MAX44009 // [I2cDriver28] Enable MAX44009 Ambient Light sensor (I2C addresses 0x4A and 0x4B) (+0k8 code) #define USE_SCD30 // [I2cDriver29] Enable Sensiron SCd30 CO2 sensor (I2C address 0x61) (+3k3 code) @@ -378,9 +380,13 @@ //#define USE_EZORGB // [I2cDriver55] Enable support for EZO's RGB sensor (+0k5 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_EZOPMP // [I2cDriver55] Enable support for EZO's PMP sensor (+0k3 code) - Shared EZO code required for any EZO device (+1k2 code) //#define USE_SEESAW_SOIL // [I2cDriver56] Enable Capacitice Soil Moisture & Temperature Sensor (I2C addresses 0x36 - 0x39) (+1k3 code) -//#define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC (I2C address 0x51) (+0k7 code) //#define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) +//#define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one +// #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) +// #define USE_BM8563 // [I2cDriver59] Enable BM8563 RTC - found in M5Stack - support both I2C buses on ESP32 (I2C address 0x51) (+2.5k code) +// #define USE_PCF85363 // [I2cDriver66] Enable PCF85363 RTC - found Shelly 3EM (I2C address 0x51) (+0k7 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/xdrv_56_rtc_chips.ino b/tasmota/xdrv_56_rtc_chips.ino index d4f54f6c2..ac3c31c2d 100644 --- a/tasmota/xdrv_56_rtc_chips.ino +++ b/tasmota/xdrv_56_rtc_chips.ino @@ -6,8 +6,6 @@ SPDX-License-Identifier: GPL-3.0-only */ -#define USE_RTC_CHIPS - #ifdef USE_I2C #ifdef USE_RTC_CHIPS /*********************************************************************************************\ @@ -23,7 +21,10 @@ struct { uint32_t (* ReadTime)(void); void (* SetTime)(uint32_t); + int32_t (* MemRead)(uint8_t *, uint32_t); + int32_t (* MemWrite)(uint8_t *, uint32_t); bool detected; + int8_t mem_size = -1; uint8_t address; uint8_t bus; char name[10]; @@ -38,9 +39,7 @@ struct { #define XI2C_26 26 // See I2CDEVICES.md -#ifndef DS3231_ADDRESS #define DS3231_ADDRESS 0x68 // DS3231 I2C Address -#endif // DS3231 Register Addresses #define DS3231_SECONDS 0x00 @@ -98,6 +97,9 @@ void DS3231SetTime(uint32_t epoch_time) { I2cWrite8(RtcChip.address, DS3231_STATUS, I2cRead8(RtcChip.address, DS3231_STATUS) & ~_BV(DS3231_OSF)); // Clear the Oscillator Stop Flag } +/*-------------------------------------------------------------------------------------------*\ + * Detection +\*-------------------------------------------------------------------------------------------*/ void DS3231Detected(void) { if (!RtcChip.detected && I2cEnabled(XI2C_26)) { RtcChip.address = DS3231_ADDRESS; @@ -107,6 +109,7 @@ void DS3231Detected(void) { strcpy_P(RtcChip.name, PSTR("DS3231")); RtcChip.ReadTime = &DS3231ReadTime; RtcChip.SetTime = &DS3231SetTime; + RtcChip.mem_size = -1; } } } @@ -164,6 +167,9 @@ void BM8563SetUtc(uint32_t epoch_time) { bm8563_driver.Rtc.SetDate(&RTCdate); } +/*-------------------------------------------------------------------------------------------*\ + * Detection +\*-------------------------------------------------------------------------------------------*/ void BM8563Detected(void) { if (!RtcChip.detected && I2cEnabled(XI2C_59)) { RtcChip.address = BM8563_ADRESS; @@ -182,6 +188,7 @@ void BM8563Detected(void) { strcpy_P(RtcChip.name, PSTR("BM8563")); RtcChip.ReadTime = &BM8563GetUtc; RtcChip.SetTime = &BM8563SetUtc; + RtcChip.mem_size = -1; } } } @@ -289,6 +296,20 @@ void Pcf85363Dump(void) { } */ +/*-------------------------------------------------------------------------------------------*\ + * Memory block functions +\*-------------------------------------------------------------------------------------------*/ +int32_t Pcf8563MemRead(uint8_t *buffer, uint32_t size) { + return I2cReadBuffer(RtcChip.address, 0x40, buffer, size); +} + +int32_t Pcf8563MemWrite(uint8_t *buffer, uint32_t size) { + return I2cWriteBuffer(RtcChip.address, 0x40, (uint8_t *)buffer, size); +} + +/*-------------------------------------------------------------------------------------------*\ + * Detection +\*-------------------------------------------------------------------------------------------*/ void Pcf85363Detected(void) { if (!RtcChip.detected && I2cEnabled(XI2C_66)) { RtcChip.address = PCF85363_ADDRESS; @@ -297,6 +318,9 @@ void Pcf85363Detected(void) { strcpy_P(RtcChip.name, PSTR("PCF85363")); RtcChip.ReadTime = &Pcf85363ReadTime; RtcChip.SetTime = &Pcf85363SetTime; + RtcChip.mem_size = 64; + RtcChip.MemRead = &Pcf8563MemRead; + RtcChip.MemWrite = &Pcf8563MemWrite; } } } @@ -341,6 +365,24 @@ void RtcChipTimeSynced(void) { } } +int32_t RtcChipMemSize(void) { + return RtcChip.mem_size; // Not supported or max size +} + +int32_t RtcChipMemRead(uint8_t *buffer, uint32_t size) { + if (size <= RtcChip.mem_size) { + return RtcChip.MemRead(buffer, size); + } + return -1; // Not supported or too large +} + +int32_t RtcChipMemWrite(uint8_t *buffer, uint32_t size) { + if (size <= RtcChip.mem_size) { + return RtcChip.MemWrite(buffer, size); + } + return -1; // Not supported or too large +} + /*********************************************************************************************\ * NTP server functions \*********************************************************************************************/ From f8254901d095ba40323744120a877fae90fb254a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 16 Apr 2022 18:20:10 +0200 Subject: [PATCH 024/376] Add delayed SetPowerOnState Add delayed SetPowerOnState to Sonoff SPM (#13447) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/xdrv_86_esp32_sonoff_spm.ino | 10 ++++++++++ 3 files changed, 12 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c824792b..f98b954bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Support for Sonoff MS01 soil moisture sensor (#15335) - Support for daisy chaining MAX7219 displays (#15345) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) +- Sonoff SPM delayed SetPowerOnState (#13447) ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index fd7854b34..a435c2722 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -109,6 +109,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) +- Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) ### Breaking Changed diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 623d671c0..c2dedfd41 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -251,6 +251,7 @@ typedef struct { uint32_t timeout; power_t old_power; + power_t power_on_state; uint16_t last_totals; uint16_t serial_in_byte_counter; uint16_t expected_bytes; @@ -1097,6 +1098,14 @@ void SSPMHandleReceivedData(void) { } else { AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Relay scan done")); +#ifndef SSPM_SIMULATE + if (Sspm->power_on_state) { + TasmotaGlobal.power = Sspm->power_on_state; + Sspm->power_on_state = 0; + SetPowerOnState(); + } +#endif + Sspm->mstate = SPM_SCAN_COMPLETE; } break; @@ -1704,6 +1713,7 @@ void SSPMInit(void) { Sspm->history_relay = 255; // Disable display energy history Sspm->log_relay = 255; // Disable display logging Sspm->old_power = TasmotaGlobal.power; + Sspm->power_on_state = TasmotaGlobal.power; Sspm->mstate = SPM_WAIT; // Start init sequence } From d4e28c3025b0a0f9fd154e6931fbd6c96be0dcc9 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 16 Apr 2022 19:43:08 +0200 Subject: [PATCH 025/376] add mi32topic + overridables --- tasmota/my_user_config.h | 1 + tasmota/settings.ino | 3 ++ tasmota/support_tasmota.ino | 2 +- tasmota/xsns_62_esp32_mi_ble.ino | 93 ++++++++++++++++++++++++++------ 4 files changed, 83 insertions(+), 16 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index f7c1d6368..a8ae39295 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1013,6 +1013,7 @@ //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) //#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) + //#define BLE_ESP32_ENABLE true // [SetOption115] Default value for SetOption115 //#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) //#define USE_IBEACON_ESP32 //#define USE_WEBCAM // Add support for webcam diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 2670bd63d..72527235d 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -1226,6 +1226,9 @@ void SettingsDefaultSet2(void) { flag5.shift595_invert_outputs |= SHIFT595_INVERT_OUTPUTS; Settings->shift595_device_count = SHIFT595_DEVICE_COUNT; flag5.tls_use_fingerprint |= MQTT_TLS_FINGERPRINT; + #ifdef BLE_ESP32_ENABLE + flag5.mi32_enable |= BLE_ESP32_ENABLE; + #endif Settings->flag = flag; Settings->flag2 = flag2; diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index b0642a074..a0295d501 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -88,7 +88,7 @@ String ResolveToken(const char* input) { return resolved; } -char* GetTopic_P(char *stopic, uint32_t prefix, char *topic, const char* subtopic) +char* GetTopic_P(char *stopic, uint32_t prefix, const char *topic, const char* subtopic) { /* prefix 0 = Cmnd prefix 1 = Stat diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/xsns_62_esp32_mi_ble.ino index 478b07e8b..0104dd58e 100644 --- a/tasmota/xsns_62_esp32_mi_ble.ino +++ b/tasmota/xsns_62_esp32_mi_ble.ino @@ -86,10 +86,50 @@ void MI32scanEndedCB(NimBLEScanResults results); void MI32notifyCB(NimBLERemoteCharacteristic* pRemoteCharacteristic, uint8_t* pData, size_t length, bool isNotify); +/////////////////////////////////////////////////////////// +// OVERRIDBLES +// Default values can be overrided in user_config_override.h + +#ifndef MI32_OPTION0_ALWAYS_AGGREGATE +#define MI32_OPTION0_ALWAYS_AGGREGATE true +#endif + +#ifndef MI32_OPTION1_NO_SUMMARY +#define MI32_OPTION1_NO_SUMMARY false +#endif + +#ifndef MI32_OPTION2_DIRECT_BRIDGED_MODE +#define MI32_OPTION2_DIRECT_BRIDGED_MODE false +#endif + +#ifndef MI32_OPTION4_IGNORE_BOGUS_BATTERY +#define MI32_OPTION4_IGNORE_BOGUS_BATTERY true +#endif + +#ifndef MI32_OPTION5_ONLY_ALIASED +#define MI32_OPTION5_ONLY_ALIASED false +#endif + +#ifndef MI32_OPTION6_MQTT_TYPE +#define MI32_OPTION6_MQTT_TYPE 0 +#endif + +#ifndef MI32_PAGE +#define MI32_PAGE 4 +#endif + +#ifndef MI32_BLE_TOPIC +#define MI32_BLE_TOPIC "tasmota_ble" +#endif + +/////////////////////////////////////////////////////////// + + struct { - uint16_t perPage = 4; + uint16_t perPage = MI32_PAGE; uint8_t mqttCurrentSlot = 0; uint8_t mqttCurrentSingleSlot = 0; + String bleTopic = MI32_BLE_TOPIC; uint32_t period; // set manually in addition to TELE-period, is set to TELE-period after start int secondsCounter = 0; // counts up in MI32EverySecond to period int secondsCounter2 = 0; // counts up in MI32EverySecond to period @@ -125,12 +165,12 @@ struct { uint32_t directBridgeMode:1; // Mi32Option2: send every received BLE-packet as a MQTT-message in real-time uint32_t holdBackFirstAutodiscovery:1; // uint32_t showRSSI:1; // - uint32_t ignoreBogusBattery:1; // Mi32Option4: show BLE RSSI + uint32_t ignoreBogusBattery:1; // Mi32Option4: uint32_t minimalSummary:1; // DEPRECATED!! uint32_t onlyAliased:1; // Mi32Option5: only include sensors that are aliased - uint32_t MQTTType:2; // Mi32Option6: publish sensor on tasmota_ble with 1 topic per sensor + uint32_t MQTTType:2; // Mi32Option6: publish sensor on MI32.bleTopic with 1 topic per sensor // Mi32Option6 0 : standard SENSOR message - // Mi32Option6 1 : tasmota_ble + per sensor topic (legacy syntax) + // Mi32Option6 1 : MI32.bleTopic + per sensor topic (legacy syntax) // MI32Option6 2 : same but add sensor name as key in JSON (same as standard SENSOR) } option; } MI32; @@ -402,14 +442,15 @@ const char kMI32_Commands[] PROGMEM = D_CMND_MI32 "|" "Key|" "Keys|" #endif // USE_MI_DECRYPTION - "Period|Time|Page|Battery|Unit|Block|Option"; + "Period|Time|Page|Battery|Unit|Block|Option|Topic"; void (*const MI32_Commands[])(void) PROGMEM = { #ifdef USE_MI_DECRYPTION &CmndMi32Key, &CmndMi32Keys, #endif // USE_MI_DECRYPTION - &CmndMi32Period, &CmndMi32Time, &CmndMi32Page, &CmndMi32Battery, &CmndMi32Unit, &CmndMi32Block, &CmndMi32Option }; + &CmndMi32Period, &CmndMi32Time, &CmndMi32Page, &CmndMi32Battery, &CmndMi32Unit, &CmndMi32Block, + &CmndMi32Option, &CmndMi32Topic }; #define MI_UNKOWN 1 @@ -1560,13 +1601,23 @@ void MI32Init(void) { MI32.mode.init = false; //test section for options - MI32.option.allwaysAggregate = 1; - MI32.option.noSummary = 0; - MI32.option.minimalSummary = 0; - MI32.option.directBridgeMode = 0; - MI32.option.showRSSI = 1; - MI32.option.ignoreBogusBattery = 1; // from advertisements + MI32.option.allwaysAggregate = MI32_OPTION0_ALWAYS_AGGREGATE; // Mi32Option0: always show all known values of one sensor in bridge mode + MI32.option.noSummary = MI32_OPTION1_NO_SUMMARY; // Mi32Option1: no sensor values at TELE-period + MI32.option.directBridgeMode = MI32_OPTION2_DIRECT_BRIDGED_MODE; // Mi32Option2: send every received BLE-packet as a MQTT-message in real-time MI32.option.holdBackFirstAutodiscovery = 1; + MI32.option.showRSSI = 1; + MI32.option.ignoreBogusBattery = MI32_OPTION4_IGNORE_BOGUS_BATTERY; // Mi32Option4: ignore battery from ads + MI32.option.minimalSummary = 0; + MI32.option.onlyAliased = MI32_OPTION5_ONLY_ALIASED; // Mi32Option5: only include sensors that are aliased + MI32.option.MQTTType = MI32_OPTION6_MQTT_TYPE; // Mi32Option6: publish sensor on MI32.bleTopic with 1 topic per sensor + +AddLog(0,PSTR("MI32Option0: %d"), MI32.option.allwaysAggregate); +AddLog(0,PSTR("MI32Option1: %d"), MI32.option.noSummary); +AddLog(0,PSTR("MI32Option2: %d"), MI32.option.directBridgeMode); +AddLog(0,PSTR("MI32Option4: %d"), MI32.option.ignoreBogusBattery); +AddLog(0,PSTR("MI32Option5: %d"), MI32.option.onlyAliased); +AddLog(0,PSTR("MI32Option6: %d"), MI32.option.MQTTType); + BLE_ESP32::registerForAdvertismentCallbacks((const char *)"MI32", MI32advertismentCallback); BLE_ESP32::registerForScanCallbacks((const char *)"MI32", MI32scanCompleteCallback); @@ -2443,6 +2494,18 @@ void CmndMi32Option(void){ return; } +void CmndMi32Topic(void) { + if (!XdrvMailbox.grpflg && (XdrvMailbox.data_len > 0)) { + MakeValidMqtt(0, XdrvMailbox.data); + if (SC_CLEAR == Shortcut()) + MI32.bleTopic = MI32_BLE_TOPIC; + else + MI32.bleTopic = XdrvMailbox.data; + } + ResponseCmndChar(MI32.bleTopic.c_str()); +} + + void MI32KeyListResp(){ Response_P(PSTR("{\"MIKeys\":{")); for (int i = 0; i < MIBLEbindKeys.size(); i++){ @@ -2938,7 +3001,7 @@ void MI32ShowOneMISensor(bool hidename){ p->MAC[3], p->MAC[4], p->MAC[5]); } char SensorTopic[TOPSZ]; - GetTopic_P(SensorTopic, TELE, (char*)"tasmota_ble", id); + GetTopic_P(SensorTopic, TELE, MI32.bleTopic.c_str(), id); //AddLog(LOG_LEVEL_DEBUG,PSTR("M32: %s: show one %d %s"),D_CMND_MI32, MI32.mqttCurrentSlot, ResponseData()); MqttPublish(SensorTopic, Settings->flag.mqtt_sensor_retain); @@ -3076,7 +3139,7 @@ void MI32DiscoveryOneMISensor(){ } char SensorTopic[TOPSZ]; - GetTopic_P(SensorTopic, TELE, (char*)"tasmota_ble", id); + GetTopic_P(SensorTopic, TELE, MI32.bleTopic.c_str(), id); //int i = p->nextDiscoveryData*3; for (int i = 0; i < datacount*3; i += 3){ @@ -3292,7 +3355,7 @@ void MI32ShowTriggeredSensors(){ kMI32DeviceType[p->type-1], p->MAC[3], p->MAC[4], p->MAC[5]); } - GetTopic_P(SensorTopic, TELE, (char*)"tasmota_ble", id); + GetTopic_P(SensorTopic, TELE, MI32.bleTopic.c_str(), id); //AddLog(LOG_LEVEL_DEBUG, PSTR("M32: triggered %d %s"), sensor, ResponseData()); MqttPublish(SensorTopic, Settings->flag.mqtt_sensor_retain); XdrvRulesProcess(0); From 8b312fae86cc3efc79129372df777e9083b64091 Mon Sep 17 00:00:00 2001 From: Barbudor Date: Sat, 16 Apr 2022 19:50:05 +0200 Subject: [PATCH 026/376] revert so115 to default off --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a8ae39295..3ba1e792f 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1013,7 +1013,7 @@ //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) //#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) - //#define BLE_ESP32_ENABLE true // [SetOption115] Default value for SetOption115 + //#define BLE_ESP32_ENABLE false // [SetOption115] Default value for SetOption115 //#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) //#define USE_IBEACON_ESP32 //#define USE_WEBCAM // Add support for webcam From 4c156f715e79cbb04d8afcfaf16910bf91ac89b6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 17 Apr 2022 11:02:38 +0200 Subject: [PATCH 027/376] Refactor Sonoff SPM power on state --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index c2dedfd41..152d35886 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -1802,6 +1802,13 @@ void SSPMEvery100ms(void) { break; case SPM_SCAN_COMPLETE: // Scan sequence finished +#ifndef SSPM_SIMULATE + if (Sspm->power_on_state) { + TasmotaGlobal.power = Sspm->power_on_state; + Sspm->power_on_state = 0; // Reset power on state solving re-scan + SetPowerOnState(); // Set power on state now that all relays have been detected + } +#endif TasmotaGlobal.discovery_counter = 1; // Force TasDiscovery() Sspm->allow_updates = 1; // Enable requests from 100mSec loop Sspm->get_energy_relay = 0; @@ -1875,14 +1882,18 @@ void SSPMEvery100ms(void) { bool SSPMSetDevicePower(void) { power_t new_power = XdrvMailbox.index; if (new_power != Sspm->old_power) { + uint32_t relay_count = 0; for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { uint32_t new_state = (new_power >> i) &1; if (new_state != ((Sspm->old_power >> i) &1)) { SSPMSendSetRelay(i, new_state); - Sspm->no_send_key = 10; // Disable buttons for 10 * 0.1 second + relay_count++; } } Sspm->old_power = new_power; + if (relay_count) { + Sspm->no_send_key = relay_count *10; // Disable button response for relay_count * 10 * 0.1 second + } } return true; } From a3389f74ebbc9e24084011dc87396fc152966f26 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 17 Apr 2022 11:08:19 +0200 Subject: [PATCH 028/376] Refactor Sonoff SPM power on state --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 9 --------- 1 file changed, 9 deletions(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 152d35886..8018c3452 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -1097,15 +1097,6 @@ void SSPMHandleReceivedData(void) { SSPMSendGetScheme(Sspm->module_selected); } else { AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Relay scan done")); - -#ifndef SSPM_SIMULATE - if (Sspm->power_on_state) { - TasmotaGlobal.power = Sspm->power_on_state; - Sspm->power_on_state = 0; - SetPowerOnState(); - } -#endif - Sspm->mstate = SPM_SCAN_COMPLETE; } break; From 80ab5c3060c3a067df06a84665b82f92431feb51 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 17 Apr 2022 22:47:26 +0200 Subject: [PATCH 029/376] LVGL fix conflict between SPI DMA and SD card --- .../Display_Renderer-gemu-1.0/src/renderer.h | 2 +- lib/lib_display/UDisplay/uDisplay.cpp | 30 +++++++------------ lib/lib_display/UDisplay/uDisplay.h | 2 +- 3 files changed, 13 insertions(+), 21 deletions(-) diff --git a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h index 925b0ad7d..74d812529 100644 --- a/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h +++ b/lib/lib_display/Display_Renderer-gemu-1.0/src/renderer.h @@ -34,7 +34,7 @@ typedef struct LVGL_PARAMS { struct { uint8_t use_dma : 1; uint8_t swap_color : 1; - uint8_t resvd_0 : 1; + uint8_t async_dma : 1; // force DMA completion before returning, avoid conflict with other devices on same bus. If set you should make sure the display is the only device on the bus uint8_t resvd_1 : 1; uint8_t resvd_2 : 1; uint8_t resvd_3 : 1; diff --git a/lib/lib_display/UDisplay/uDisplay.cpp b/lib/lib_display/UDisplay/uDisplay.cpp index a6b8d1e6f..71025069b 100755 --- a/lib/lib_display/UDisplay/uDisplay.cpp +++ b/lib/lib_display/UDisplay/uDisplay.cpp @@ -465,7 +465,7 @@ Renderer *uDisplay::Init(void) { uspi->begin(spi_clk, spi_miso, spi_mosi, -1); if (lvgl_param.use_dma) { spi_host = VSPI_HOST; - initDMA(spi_cs); + initDMA(lvgl_param.async_dma ? spi_cs : -1); // disable DMA CS if sync, we control it directly } } else if (spi_nr == 2) { @@ -473,7 +473,7 @@ Renderer *uDisplay::Init(void) { uspi->begin(spi_clk, spi_miso, spi_mosi, -1); if (lvgl_param.use_dma) { spi_host = HSPI_HOST; - initDMA(spi_cs); + initDMA(lvgl_param.async_dma ? spi_cs : -1); // disable DMA CS if sync, we control it directly } } else { pinMode(spi_clk, OUTPUT); @@ -1974,24 +1974,13 @@ void uDisplay::beginTransaction(SPISettings s) { #ifdef ESP32 if (lvgl_param.use_dma) { dmaWait(); - } else { - uspi->beginTransaction(s); } -#else - uspi->beginTransaction(s); #endif + uspi->beginTransaction(s); } void uDisplay::endTransaction(void) { -#ifdef ESP32 - if (lvgl_param.use_dma) { - dmaBusy(); - } else { - uspi->endTransaction(); - } -#else uspi->endTransaction(); -#endif } @@ -2002,7 +1991,7 @@ void uDisplay::endTransaction(void) { ** Function name: initDMA ** Description: Initialise the DMA engine - returns true if init OK ***************************************************************************************/ -bool uDisplay::initDMA(bool ctrl_cs) +bool uDisplay::initDMA(int32_t ctrl_cs) { if (DMA_Enabled) return false; @@ -2018,9 +2007,6 @@ bool uDisplay::initDMA(bool ctrl_cs) .intr_flags = 0 }; - int8_t pin = -1; - if (ctrl_cs) pin = spi_cs; - spi_device_interface_config_t devcfg = { .command_bits = 0, .address_bits = 0, @@ -2031,7 +2017,7 @@ bool uDisplay::initDMA(bool ctrl_cs) .cs_ena_posttrans = 0, .clock_speed_hz = spi_speed*1000000, .input_delay_ns = 0, - .spics_io_num = pin, + .spics_io_num = ctrl_cs, .flags = SPI_DEVICE_NO_DUMMY, //0, .queue_size = 1, .pre_cb = 0, //dc_callback, //Callback to handle D/C line @@ -2119,6 +2105,9 @@ void uDisplay::pushPixelsDMA(uint16_t* image, uint32_t len) { assert(ret == ESP_OK); spiBusyCheck++; + if (!lvgl_param.async_dma) { + dmaWait(); + } } /*************************************************************************************** @@ -2145,6 +2134,9 @@ void uDisplay::pushPixels3DMA(uint8_t* image, uint32_t len) { assert(ret == ESP_OK); spiBusyCheck++; + if (!lvgl_param.async_dma) { + dmaWait(); + } } diff --git a/lib/lib_display/UDisplay/uDisplay.h b/lib/lib_display/UDisplay/uDisplay.h index b5eae65c5..9a233fcff 100755 --- a/lib/lib_display/UDisplay/uDisplay.h +++ b/lib/lib_display/UDisplay/uDisplay.h @@ -233,7 +233,7 @@ class uDisplay : public Renderer { spi_device_handle_t dmaHAL; spi_host_device_t spi_host = VSPI_HOST; // spi_host_device_t spi_host = VSPI_HOST; - bool initDMA(bool ctrl_cs); + bool initDMA(int32_t ctrl_cs); void deInitDMA(void); bool dmaBusy(void); void dmaWait(void); From 0ffa1e2dbaa259ca760c3a994a21b89964294268 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 18 Apr 2022 08:59:21 +0200 Subject: [PATCH 030/376] Add SDCard options --- tasmota/my_user_config.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 3ba1e792f..7391a6db9 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -872,6 +872,10 @@ #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 #define IR_RCV_TOLERANCE 25 // Base tolerance percentage for matching incoming IR messages (default 25, max 100) +// -- SD Card support ----------------------------- +// #define USE_SDCARD // mount SD Card, requires configured SPI pins and setting of `SDCard CS` gpio + #define SDC_HIDE_INVISIBLES // hide hidden directories from the SD Card, which prevents crashes when dealing SD created on MacOS + // -- Zigbee interface ---------------------------- //#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 From dccb39c43a10743621298b48e9cef4ed589d020d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 19 Apr 2022 12:26:25 +0200 Subject: [PATCH 031/376] enable SD_MMC --- platformio_override_sample.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index bd1eac048..5e0877840 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -115,7 +115,6 @@ lib_ignore = WiFiProv USB SPIFFS - SD_MMC ESP32 Azure IoT Arduino ESP32 Async UDP ESP32 BLE Arduino From 526fecba386785e65fc40309eabc51896a573e9d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 19 Apr 2022 12:27:16 +0200 Subject: [PATCH 032/376] enable SD_MMC --- platformio_tasmota_env32.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 5efe66cea..7aa37c90c 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -24,7 +24,6 @@ lib_ignore = WiFiProv USB SPIFFS - SD_MMC ESP32 Azure IoT Arduino ESP32 Async UDP ESP32 BLE Arduino From 79b19ea62c5edb3f3f080c5224d1bcdb23fb8810 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:01:18 +0200 Subject: [PATCH 033/376] Prep inHg --- tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/fy_NL.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 3 ++- tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + 26 files changed, 27 insertions(+), 1 deletion(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 131766dc5..afa923e37 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 5db48b41a..f9b0510f8 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -872,6 +872,7 @@ #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "gal/min" #define D_UNIT_KILOGRAM "kg" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 1cc32d0de..d6206ada9 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -872,6 +872,7 @@ #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" #define D_UNIT_KILOGRAM "kg" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index cb86d734e..bfc3e881c 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index aa7bf0833..f4134304c 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index ac8f8cf76..73e6157df 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 6ed3ac42b..608830d3e 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 0a0441bec..3c1f9f777 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "gal/mn" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index ed4abb8d6..9b06fd901 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 173ed83d3..10843edb3 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index fbf54cdea..888b36a1b 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "növ." #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index abbedca1f..d4dba3ffe 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v11.0.0.7 - Last update 13.04.2022 + * Updated until v11.0.0.7 - Last update 19.04.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "o" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 9495e22dc..0eb35b087 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "시" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index bdc85bb8e..917421d50 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index b956b6d68..05f8c5b28 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "Godz" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index f2ddd1fc8..5f3e8480d 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "H" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 0829c29be..3e33bdcf5 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index c78ebfc71..1ad94086f 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 984186a1c..9e343f93d 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "Ч" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "км" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index da5bde22f..004ca8418 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -872,6 +872,7 @@ #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" #define D_UNIT_KILOGRAM "kg" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index bf2bf0822..c4b582b2a 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "Tim" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "ink" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 157b3b65f..da289d3a0 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index a46af7a69..9b1fe8c0b 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "г" #define D_UNIT_GALLONS "гал" #define D_UNIT_GALLONS_PER_MIN "гал/хв" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "інк" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 8320cb52c..d77894125 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "h" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index c5b52f69f..f6f07708c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "小时" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 5b0ff6e43..ec3008a5c 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -871,6 +871,7 @@ #define D_UNIT_HOUR "時" #define D_UNIT_GALLONS "gal" #define D_UNIT_GALLONS_PER_MIN "g/m" +#define D_UNIT_INCH_MERCURY "inHg" #define D_UNIT_INCREMENTS "inc" #define D_UNIT_KELVIN "K" #define D_UNIT_KILOMETER "km" From d71c1711f276d9ee0a2b088d76dce85640c91eb3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 Apr 2022 14:45:26 +0200 Subject: [PATCH 034/376] Add command ``SetOption139 0/1`` - Add command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) - Change double constants to float constants saving 200 bytes --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/settings.h | 2 +- tasmota/support.ino | 51 +++++++++++++++++++++--------------------- tools/decode-status.py | 6 +++-- 5 files changed, 33 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f98b954bb..983ab1d2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for daisy chaining MAX7219 displays (#15345) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) +- Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a435c2722..3bd937aae 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -106,6 +106,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v11.1.0.1 ### Added +- Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) diff --git a/tasmota/settings.h b/tasmota/settings.h index e2b5be2ac..f8b961527 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -168,7 +168,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t tuyasns_no_immediate : 1; // bit 22 (v11.0.0.4) - SetOption136 - (TuyaSNS) When ON disable publish single SNS value on Tuya Receive (keep Teleperiod) uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) - uint32_t spare25 : 1; // bit 25 + uint32_t mm_vs_inch : 1; // bit 25 (v11.1.0.1) - SetOption139 - (Pressure) Switch between mmHg (0) or inHg (1) when SO24 1 uint32_t spare26 : 1; // bit 26 uint32_t spare27 : 1; // bit 27 uint32_t spare28 : 1; // bit 28 diff --git a/tasmota/support.ino b/tasmota/support.ino index 2ee1a71b3..97a4f9221 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -735,9 +735,9 @@ float ConvertTempToFahrenheit(float c) { float result = c; if (!isnan(c) && Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit - result = c * 1.8 + 32; // Fahrenheit + result = c * 1.8f + 32; // Fahrenheit } - result = result + (0.1 * Settings->temp_comp); + result = result + (0.1f * Settings->temp_comp); return result; } @@ -745,9 +745,9 @@ float ConvertTempToCelsius(float c) { float result = c; if (!isnan(c) && !Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit - result = (c - 32) / 1.8; // Celsius + result = (c - 32) / 1.8f; // Celsius } - result = result + (0.1 * Settings->temp_comp); + result = result + (0.1f * Settings->temp_comp); return result; } @@ -762,65 +762,66 @@ float ConvertTemp(float c) { return ConvertTempToFahrenheit(c); } -char TempUnit(void) -{ +char TempUnit(void) { // SetOption8 - Switch between Celsius or Fahrenheit return (Settings->flag.temperature_conversion) ? D_UNIT_FAHRENHEIT[0] : D_UNIT_CELSIUS[0]; } -float ConvertHumidity(float h) -{ +float ConvertHumidity(float h) { float result = h; TasmotaGlobal.global_update = TasmotaGlobal.uptime; TasmotaGlobal.humidity = h; - result = result + (0.1 * Settings->hum_comp); + result = result + (0.1f * Settings->hum_comp); return result; } -float CalcTempHumToDew(float t, float h) -{ +float CalcTempHumToDew(float t, float h) { if (isnan(h) || isnan(t)) { return NAN; } if (Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit - t = (t - 32) / 1.8; // Celsius + t = (t - 32) / 1.8f; // Celsius } - float gamma = TaylorLog(h / 100) + 17.62 * t / (243.5 + t); - float result = (243.5 * gamma / (17.62 - gamma)); + float gamma = TaylorLog(h / 100) + 17.62f * t / (243.5f + t); + float result = (243.5f * gamma / (17.62f - gamma)); if (Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit - result = result * 1.8 + 32; // Fahrenheit + result = result * 1.8f + 32; // Fahrenheit } return result; } -float ConvertPressure(float p) -{ +float ConvertPressure(float p) { float result = p; TasmotaGlobal.global_update = TasmotaGlobal.uptime; TasmotaGlobal.pressure_hpa = p; - if (!isnan(p) && Settings->flag.pressure_conversion) { // SetOption24 - Switch between hPa or mmHg pressure unit - result = p * 0.75006375541921; // mmHg + if (!isnan(p) && Settings->flag.pressure_conversion) { // SetOption24 - Switch between hPa or mmHg pressure unit + if (Settings->flag5.mm_vs_inch) { // SetOption139 - Switch between mmHg or inHg pressure unit +// result = p * 0.02952998016471; // inHg + result = p * 0.0295299f; // inHg (double to float saves 16 bytes!) + } else { +// result = p * 0.75006375541921; // mmHg + result = p * 0.7500637f; // mmHg (double to float saves 16 bytes!) + } } return result; } -float ConvertPressureForSeaLevel(float pressure) -{ - if (pressure == 0.0f) +float ConvertPressureForSeaLevel(float pressure) { + if (pressure == 0.0f) { return pressure; - - return ConvertPressure((pressure / FastPrecisePow(1.0 - ((float)Settings->altitude / 44330.0f), 5.255f)) - 21.6f); + } + return ConvertPressure((pressure / FastPrecisePow(1.0f - ((float)Settings->altitude / 44330.0f), 5.255f)) - 21.6f); } String PressureUnit(void) { - return (Settings->flag.pressure_conversion) ? String(F(D_UNIT_MILLIMETER_MERCURY)) : String(F(D_UNIT_PRESSURE)); + return (Settings->flag.pressure_conversion) ? (Settings->flag5.mm_vs_inch) ? String(F(D_UNIT_INCH_MERCURY)) : String(F(D_UNIT_MILLIMETER_MERCURY)) : String(F(D_UNIT_PRESSURE)); } float ConvertSpeed(float s) diff --git a/tools/decode-status.py b/tools/decode-status.py index e079eb5d4..3227e8a39 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -192,7 +192,9 @@ a_setoption = [[ "(Display & LVGL) force disabling default splash screen", "(TuyaSNS) When ON disable publish single SNS value on Tuya Receive (keep Teleperiod)", "(Tuya) When Set, avoid the (mqtt-) publish of Tuya MCU Heartbeat response if SetOption66 is active", - "","","","", + "(GUI) Align (energy) table values left (0) or right (1)", + "(Pressure) Switch between mmHg (0) or inHg (1) when SO24 1", + "","", "","","","" ]] @@ -295,7 +297,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v11.0.0.5 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v11.1.0.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From b17d7bbdea08263910bfa940f16451e608525d7f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 19 Apr 2022 15:44:53 +0200 Subject: [PATCH 035/376] Save another 500 bytes by moving from double to float --- tasmota/support.ino | 20 +++++++++++--------- tasmota/support_command.ino | 4 ++-- tasmota/xdrv_03_energy.ino | 20 ++++++++++---------- tasmota/xnrg_03_pzem004t.ino | 6 +++--- tasmota/xnrg_05_pzem_ac.ino | 12 ++++++------ tasmota/xnrg_06_pzem_dc.ino | 8 ++++---- tasmota/xnrg_09_dds2382.ino | 12 ++++++------ tasmota/xsns_05_ds18x20.ino | 6 +++--- tasmota/xsns_05_esp32_ds18x20.ino | 6 +++--- tasmota/xsns_06_dht.ino | 12 ++++++------ tasmota/xsns_06_esp32_dht.ino | 4 ++-- tasmota/xsns_07_sht1x.ino | 14 +++++++------- tasmota/xsns_08_htu21.ino | 16 ++++++++-------- tasmota/xsns_09_bmp.ino | 18 +++++++++--------- tasmota/xsns_21_sgp30.ino | 8 ++++---- tasmota/xsns_26_lm75ad.ino | 2 +- tasmota/xsns_37_rfsensor.ino | 4 ++-- tasmota/xsns_39_max31855.ino | 6 +++--- tasmota/xsns_41_max44009.ino | 2 +- tasmota/xsns_42_scd30.ino | 4 ++-- tasmota/xsns_43_hre.ino | 2 +- tasmota/xsns_46_MLX90614.ino | 4 ++-- tasmota/xsns_55_hih_series.ino | 4 ++-- tasmota/xsns_59_ds1624.ino | 2 +- tasmota/xsns_65_hdc1080.ino | 14 +++++++------- tasmota/xsns_88_am2320.ino | 4 ++-- 26 files changed, 108 insertions(+), 106 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 97a4f9221..e124dd3cf 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -319,7 +319,7 @@ float CharToFloat(const char *str) strlcpy(strbuf, str, sizeof(strbuf)); char *pt = strbuf; - if (*pt == '\0') { return 0.0; } + if (*pt == '\0') { return 0.0f; } while ((*pt != '\0') && isspace(*pt)) { pt++; } // Trim leading spaces @@ -816,12 +816,15 @@ float ConvertPressureForSeaLevel(float pressure) { if (pressure == 0.0f) { return pressure; } - return ConvertPressure((pressure / FastPrecisePow(1.0f - ((float)Settings->altitude / 44330.0f), 5.255f)) - 21.6f); + return ConvertPressure((pressure / FastPrecisePowf(1.0f - ((float)Settings->altitude / 44330.0f), 5.255f)) - 21.6f); } -String PressureUnit(void) -{ - return (Settings->flag.pressure_conversion) ? (Settings->flag5.mm_vs_inch) ? String(F(D_UNIT_INCH_MERCURY)) : String(F(D_UNIT_MILLIMETER_MERCURY)) : String(F(D_UNIT_PRESSURE)); +const char kPressureUnit[] PROGMEM = D_UNIT_PRESSURE "|" D_UNIT_MILLIMETER_MERCURY "|" D_UNIT_INCH_MERCURY; + +String PressureUnit(void) { + uint32_t index = (Settings->flag.pressure_conversion) ? Settings->flag5.mm_vs_inch +1 : 0; + char text[8]; + return String(GetTextIndexed(text, sizeof(text), index, kPressureUnit)); } float ConvertSpeed(float s) @@ -830,10 +833,9 @@ float ConvertSpeed(float s) return s * kSpeedConversionFactor[Settings->flag2.speed_conversion]; } -String SpeedUnit(void) -{ - char speed[8]; - return String(GetTextIndexed(speed, sizeof(speed), Settings->flag2.speed_conversion, kSpeedUnit)); +String SpeedUnit(void) { + char text[8]; + return String(GetTextIndexed(text, sizeof(text), Settings->flag2.speed_conversion, kSpeedUnit)); } void ResetGlobalValues(void) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 3c72125c1..bba801784 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -798,7 +798,7 @@ void CmndGlobalTemp(void) if (XdrvMailbox.data_len > 0) { float temperature = CharToFloat(XdrvMailbox.data); if (!isnan(temperature) && Settings->flag.temperature_conversion) { // SetOption8 - Switch between Celsius or Fahrenheit - temperature = (temperature - 32) / 1.8; // Celsius + temperature = (temperature - 32) / 1.8f; // Celsius } if ((temperature >= -50.0f) && (temperature <= 100.0f)) { ConvertTemp(temperature); @@ -812,7 +812,7 @@ void CmndGlobalHum(void) { if (XdrvMailbox.data_len > 0) { float humidity = CharToFloat(XdrvMailbox.data); - if ((humidity >= 0.0) && (humidity <= 100.0)) { + if ((humidity >= 0.0f) && (humidity <= 100.0f)) { ConvertHumidity(humidity); TasmotaGlobal.global_update = 1; // Keep global values just entered valid } diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index d66b76b93..4ea476ea8 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -143,7 +143,7 @@ char* EnergyFormat(char* result, float* input, uint32_t resolution, uint32_t sin // single = 7 - single &0x03 = 3 - [xx,xx,xx] uint32_t index = (single > 3) ? single &0x03 : (0 == single) ? Energy.phase_count : 1; // 1,2,3 if (single > 2) { single = 0; } // 0,1,2 - float input_sum = 0.0; + float input_sum = 0.0f; if (single > 1) { if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information for (uint32_t i = 0; i < Energy.phase_count; i++) { @@ -167,7 +167,7 @@ char* WebEnergyFormat(char* result, float* input, uint32_t resolution, uint32_t // single = 0 - Energy.phase_count - xx / xx / xx or multi column // single = 1 - Energy.voltage_common or Energy.frequency_common - xx or single column using colspan (if needed) // single = 2 - Sum of Energy.phase_count if SO129 0 - xx or single column using colspan (if needed) or if SO129 1 - xx / xx / xx or multi column - float input_sum = 0.0; + float input_sum = 0.0f; if (single > 1) { // Sum and/or Single column if (!Settings->flag5.energy_phase) { // SetOption129 - (Energy) Show phase information for (uint32_t i = 0; i < Energy.phase_count; i++) { @@ -235,9 +235,9 @@ bool EnergyTariff1Active() // Off-Peak hours } void EnergyUpdateToday(void) { - Energy.total_sum = 0.0; - Energy.yesterday_sum = 0.0; - Energy.daily_sum = 0.0; + Energy.total_sum = 0.0f; + Energy.yesterday_sum = 0.0f; + Energy.daily_sum = 0.0f; for (uint32_t i = 0; i < Energy.phase_count; i++) { if (abs(Energy.kWhtoday_delta[i]) > 1000) { @@ -272,7 +272,7 @@ void EnergyUpdateToday(void) { // return_diff = (uint32_t)(Energy.export_active * 100000) - RtcSettings.energy_usage.last_return_kWhtotal; // RtcSettings.energy_usage.last_return_kWhtotal = (uint32_t)(Energy.export_active * 100000); - float export_active = 0.0; + float export_active = 0.0f; for (uint32_t i = 0; i < Energy.phase_count; i++) { if (!isnan(Energy.export_active[i])) { export_active += Energy.export_active[i]; @@ -305,7 +305,7 @@ void EnergyUpdateTotal(void) { Energy.kWhtoday[i] = (int32_t)((Energy.import_active[i] - Energy.start_energy[i]) * 100000); } - if ((Energy.total[i] < (Energy.import_active[i] - 0.01)) && // We subtract a little offset to avoid continuous updates + if ((Energy.total[i] < (Energy.import_active[i] - 0.01f)) && // We subtract a little offset to avoid continuous updates Settings->flag3.hardware_energy_total) { // SetOption72 - Enable hardware energy total counter as reference (#6561) RtcSettings.energy_kWhtotal_ph[i] = (int32_t)((Energy.import_active[i] * 100000) - Energy.kWhtoday_offset[i] - Energy.kWhtoday[i]); Settings->energy_kWhtotal_ph[i] = RtcSettings.energy_kWhtotal_ph[i]; @@ -1129,13 +1129,13 @@ void EnergyShow(bool json) { if (isnan(reactive_power[i])) { reactive_power[i] = 0; uint32_t difference = ((uint32_t)(apparent_power[i] * 100) - (uint32_t)(Energy.active_power[i] * 100)) / 10; - if ((Energy.current[i] > 0.005) && ((difference > 15) || (difference > (uint32_t)(apparent_power[i] * 100 / 1000)))) { + if ((Energy.current[i] > 0.005f) && ((difference > 15) || (difference > (uint32_t)(apparent_power[i] * 100 / 1000)))) { // calculating reactive power only if current is greater than 0.005A and // difference between active and apparent power is greater than 1.5W or 1% //reactive_power[i] = (float)(RoundSqrtInt((uint64_t)(apparent_power[i] * apparent_power[i] * 100) - (uint64_t)(Energy.active_power[i] * Energy.active_power[i] * 100))) / 10; float power_diff = apparent_power[i] * apparent_power[i] - Energy.active_power[i] * Energy.active_power[i]; if (power_diff < 10737418) // 2^30 / 100 (RoundSqrtInt is limited to 2^30-1) - reactive_power[i] = (float)(RoundSqrtInt((uint32_t)(power_diff * 100.0))) / 10.0; + reactive_power[i] = (float)(RoundSqrtInt((uint32_t)(power_diff * 100.0f))) / 10.0f; else reactive_power[i] = (float)(SqrtInt((uint32_t)(power_diff))); } @@ -1145,7 +1145,7 @@ void EnergyShow(bool json) { } } - float active_power_sum = 0.0; + float active_power_sum = 0.0f; float energy_yesterday_ph[Energy.phase_count]; for (uint32_t i = 0; i < Energy.phase_count; i++) { energy_yesterday_ph[i] = (float)Settings->energy_kWhyesterday_ph[i] / 100000; diff --git a/tasmota/xnrg_03_pzem004t.ino b/tasmota/xnrg_03_pzem004t.ino index 1d07b1626..a9df4cd0b 100644 --- a/tasmota/xnrg_03_pzem004t.ino +++ b/tasmota/xnrg_03_pzem004t.ino @@ -153,10 +153,10 @@ bool PzemRecieve(uint8_t resp, float *data) switch (resp) { case RESP_VOLTAGE: - *data = (float)(buffer[1] << 8) + buffer[2] + (buffer[3] / 10.0); // 65535.x V + *data = (float)(buffer[1] << 8) + buffer[2] + (buffer[3] / 10.0f); // 65535.x V break; case RESP_CURRENT: - *data = (float)(buffer[1] << 8) + buffer[2] + (buffer[3] / 100.0); // 65535.xx A + *data = (float)(buffer[1] << 8) + buffer[2] + (buffer[3] / 100.0f); // 65535.xx A break; case RESP_POWER: *data = (float)(buffer[1] << 8) + buffer[2]; // 65535 W @@ -192,7 +192,7 @@ void PzemEvery250ms(void) Energy.active_power[Pzem.phase] = value; break; case 4: // Total energy as 99999Wh - Energy.import_active[Pzem.phase] = value / 1000.0; // 99.999kWh + Energy.import_active[Pzem.phase] = value / 1000.0f; // 99.999kWh if (Pzem.phase == Energy.phase_count -1) { if (TasmotaGlobal.uptime > PZEM_STABILIZE) { EnergyUpdateTotal(); diff --git a/tasmota/xnrg_05_pzem_ac.ino b/tasmota/xnrg_05_pzem_ac.ino index 67ef47dee..21c50a4ff 100644 --- a/tasmota/xnrg_05_pzem_ac.ino +++ b/tasmota/xnrg_05_pzem_ac.ino @@ -72,12 +72,12 @@ void PzemAcEverySecond(void) // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 = Buffer index // 01 04 14 08 D1 00 6C 00 00 00 F4 00 00 00 26 00 00 01 F4 00 64 00 00 51 34 // Id Cc Sz Volt- Current---- Power------ Energy----- Frequ PFact Alarm Crc-- - Energy.voltage[PzemAc.phase] = (float)((buffer[3] << 8) + buffer[4]) / 10.0; // 6553.0 V - Energy.current[PzemAc.phase] = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0; // 4294967.000 A - Energy.active_power[PzemAc.phase] = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0; // 429496729.0 W - Energy.frequency[PzemAc.phase] = (float)((buffer[17] << 8) + buffer[18]) / 10.0; // 50.0 Hz - Energy.power_factor[PzemAc.phase] = (float)((buffer[19] << 8) + buffer[20]) / 100.0; // 1.00 - Energy.import_active[PzemAc.phase] = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]) / 1000.0; // 4294967.295 kWh + Energy.voltage[PzemAc.phase] = (float)((buffer[3] << 8) + buffer[4]) / 10.0f; // 6553.0 V + Energy.current[PzemAc.phase] = (float)((buffer[7] << 24) + (buffer[8] << 16) + (buffer[5] << 8) + buffer[6]) / 1000.0f; // 4294967.000 A + Energy.active_power[PzemAc.phase] = (float)((buffer[11] << 24) + (buffer[12] << 16) + (buffer[9] << 8) + buffer[10]) / 10.0f; // 429496729.0 W + Energy.frequency[PzemAc.phase] = (float)((buffer[17] << 8) + buffer[18]) / 10.0f; // 50.0 Hz + Energy.power_factor[PzemAc.phase] = (float)((buffer[19] << 8) + buffer[20]) / 100.0f; // 1.00 + Energy.import_active[PzemAc.phase] = (float)((buffer[15] << 24) + (buffer[16] << 16) + (buffer[13] << 8) + buffer[14]) / 1000.0f; // 4294967.295 kWh if (PzemAc.phase == Energy.phase_count -1) { if (TasmotaGlobal.uptime > PZEM_AC_STABILIZE) { EnergyUpdateTotal(); diff --git a/tasmota/xnrg_06_pzem_dc.ino b/tasmota/xnrg_06_pzem_dc.ino index 4e325594f..1c6841154 100644 --- a/tasmota/xnrg_06_pzem_dc.ino +++ b/tasmota/xnrg_06_pzem_dc.ino @@ -71,10 +71,10 @@ void PzemDcEverySecond(void) // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 = Buffer index // 01 04 10 05 40 00 0A 00 0D 00 00 00 02 00 00 00 00 00 00 D6 29 // Id Cc Sz Volt- Curre Power------ Energy----- HiAlm LoAlm Crc-- - Energy.voltage[PzemDc.channel] = (float)((buffer[3] << 8) + buffer[4]) / 100.0; // 655.00 V - Energy.current[PzemDc.channel] = (float)((buffer[5] << 8) + buffer[6]) / 100.0; // 655.00 A - Energy.active_power[PzemDc.channel] = (float)((buffer[9] << 24) + (buffer[10] << 16) + (buffer[7] << 8) + buffer[8]) / 10.0; // 429496729.0 W - Energy.import_active[PzemDc.channel] = (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]) / 1000.0; // 4294967.295 kWh + Energy.voltage[PzemDc.channel] = (float)((buffer[3] << 8) + buffer[4]) / 100.0f; // 655.00 V + Energy.current[PzemDc.channel] = (float)((buffer[5] << 8) + buffer[6]) / 100.0f; // 655.00 A + Energy.active_power[PzemDc.channel] = (float)((buffer[9] << 24) + (buffer[10] << 16) + (buffer[7] << 8) + buffer[8]) / 10.0f; // 429496729.0 W + Energy.import_active[PzemDc.channel] = (float)((buffer[13] << 24) + (buffer[14] << 16) + (buffer[11] << 8) + buffer[12]) / 1000.0f; // 4294967.295 kWh if (PzemDc.channel == Energy.phase_count -1) { if (TasmotaGlobal.uptime > PZEM_DC_STABILIZE) { EnergyUpdateTotal(); diff --git a/tasmota/xnrg_09_dds2382.ino b/tasmota/xnrg_09_dds2382.ino index d960183dd..885f966d6 100644 --- a/tasmota/xnrg_09_dds2382.ino +++ b/tasmota/xnrg_09_dds2382.ino @@ -64,18 +64,18 @@ void Dds2382EverySecond(void) // {"TotalStartTime":"2020-01-08T09:43:05","Total":0.060,"Yesterday":0.001,"Today":0.001,"ExportActive":12.670,"Period":0,"Power":1016,"ApparentPower":1020,"ReactivePower":112,"Factor":0.99,"Frequency":50,"Voltage":242,"Current":4.210}} // {"TotalStartTime":"2020-01-08T00:00:00","Total":0.061,"Yesterday":0.001,"Today":0.001,"ExportActive":12.670,"Period":0.020,"Power":1199.000,"ApparentPower":1204.231,"ReactivePower":108.000,"Factor":1.00,"Frequency":49.98,"Voltage":242.3,"Current":4.970}} - Energy.voltage[0] = (float)((buffer[27] << 8) + buffer[28]) / 10.0; - Energy.current[0] = (float)((buffer[29] << 8) + buffer[30]) / 100.0; + Energy.voltage[0] = (float)((buffer[27] << 8) + buffer[28]) / 10.0f; + Energy.current[0] = (float)((buffer[29] << 8) + buffer[30]) / 100.0f; Energy.active_power[0] = (float)((buffer[31] << 8) + buffer[32]); Energy.reactive_power[0] = (float)(int16_t)((buffer[33] << 8) + buffer[34]); - Energy.power_factor[0] = (float)((buffer[35] << 8) + buffer[36]) / 1000.0; // 1.00 - Energy.frequency[0] = (float)((buffer[37] << 8) + buffer[38]) / 100.0; // 50.0 Hz + Energy.power_factor[0] = (float)((buffer[35] << 8) + buffer[36]) / 1000.0f; // 1.00 + Energy.frequency[0] = (float)((buffer[37] << 8) + buffer[38]) / 100.0f; // 50.0 Hz uint8_t offset = 11; if (Settings->flag3.dds2382_model) { // SetOption71 - Select different Modbus registers for Active Energy (#6531) offset = 19; } - Energy.export_active[0] = (float)((buffer[offset] << 24) + (buffer[offset +1] << 16) + (buffer[offset +2] << 8) + buffer[offset +3]) / 100.0; // 429496.729 kW - Energy.import_active[0] = (float)((buffer[offset +4] << 24) + (buffer[offset +5] << 16) + (buffer[offset +6] << 8) + buffer[offset +7]) / 100.0; // 429496.729 kW + Energy.export_active[0] = (float)((buffer[offset] << 24) + (buffer[offset +1] << 16) + (buffer[offset +2] << 8) + buffer[offset +3]) / 100.0f; // 429496.729 kW + Energy.import_active[0] = (float)((buffer[offset +4] << 24) + (buffer[offset +5] << 16) + (buffer[offset +6] << 8) + buffer[offset +7]) / 100.0f; // 429496.729 kW EnergyUpdateTotal(); // 484.708 kWh } } // end data ready diff --git a/tasmota/xsns_05_ds18x20.ino b/tasmota/xsns_05_ds18x20.ino index 324411987..276a0d71a 100644 --- a/tasmota/xsns_05_ds18x20.ino +++ b/tasmota/xsns_05_ds18x20.ino @@ -370,7 +370,7 @@ bool Ds18x20Read(uint8_t sensor) { switch(ds18x20_sensor[index].address[0]) { case DS18S20_CHIPID: { int16_t tempS = (((data[1] << 8) | (data[0] & 0xFE)) << 3) | ((0x10 - data[6]) & 0x0F); - temperature = ConvertTemp(tempS * 0.0625 - 0.250); + temperature = ConvertTemp(tempS * 0.0625f - 0.250f); break; } case DS1822_CHIPID: @@ -394,12 +394,12 @@ bool Ds18x20Read(uint8_t sensor) { temp12 = (~temp12) +1; sign = -1; } - temperature = ConvertTemp(sign * temp12 * 0.0625); // Divide by 16 + temperature = ConvertTemp(sign * temp12 * 0.0625f); // Divide by 16 break; } case MAX31850_CHIPID: { int16_t temp14 = (data[1] << 8) + (data[0] & 0xFC); - temperature = ConvertTemp(temp14 * 0.0625); // Divide by 16 + temperature = ConvertTemp(temp14 * 0.0625f); // Divide by 16 break; } } diff --git a/tasmota/xsns_05_esp32_ds18x20.ino b/tasmota/xsns_05_esp32_ds18x20.ino index 796036610..c0157c20a 100644 --- a/tasmota/xsns_05_esp32_ds18x20.ino +++ b/tasmota/xsns_05_esp32_ds18x20.ino @@ -130,7 +130,7 @@ bool Ds18x20Read(uint8_t sensor, float &t) { switch(ds18x20_sensor[index].address[0]) { case DS18S20_CHIPID: { int16_t tempS = (((data[1] << 8) | (data[0] & 0xFE)) << 3) | ((0x10 - data[6]) & 0x0F); - t = ConvertTemp(tempS * 0.0625 - 0.250); + t = ConvertTemp(tempS * 0.0625f - 0.250f); ds18x20_sensor[index].valid = SENSOR_MAX_MISS; return true; } @@ -141,13 +141,13 @@ bool Ds18x20Read(uint8_t sensor, float &t) { temp12 = (~temp12) +1; sign = -1; } - t = ConvertTemp(sign * temp12 * 0.0625); // Divide by 16 + t = ConvertTemp(sign * temp12 * 0.0625f); // Divide by 16 ds18x20_sensor[index].valid = SENSOR_MAX_MISS; return true; } case MAX31850_CHIPID: { int16_t temp14 = (data[1] << 8) + (data[0] & 0xFC); - t = ConvertTemp(temp14 * 0.0625); // Divide by 16 + t = ConvertTemp(temp14 * 0.0625f); // Divide by 16 ds18x20_sensor[index].valid = SENSOR_MAX_MISS; return true; } diff --git a/tasmota/xsns_06_dht.ino b/tasmota/xsns_06_dht.ino index 7da466f53..1f750a6fa 100644 --- a/tasmota/xsns_06_dht.ino +++ b/tasmota/xsns_06_dht.ino @@ -158,7 +158,7 @@ bool DhtRead(uint32_t sensor) { break; case GPIO_DHT22: // DHT21, DHT22, AM2301, AM2302, AM2321 case GPIO_SI7021: { // iTead SI7021 - humidity = ((dht_data[0] << 8) | dht_data[1]) * 0.1; + humidity = ((dht_data[0] << 8) | dht_data[1]) * 0.1f; // DHT21/22 (Adafruit): int16_t temp16 = dht_data[2] << 8 | dht_data[3]; // case 1 : signed 16 bits if ((dht_data[2] & 0xF0) == 0x80) { // case 2 : negative when high nibble = 0x80 @@ -178,14 +178,14 @@ bool DhtRead(uint32_t sensor) { float x; if (voltage < 15037) { x = voltage - 15200; - humidity = - FastPrecisePowf(0.0024 * x, 3) - 0.0004 * x + 20.1; + humidity = - FastPrecisePowf(0.0024f * x, 3) - 0.0004f * x + 20.1f; } else if (voltage < 22300) { - humidity = - 0.00069 * voltage + 30.6; + humidity = - 0.00069f * voltage + 30.6f; } else { x = voltage - 22800; - humidity = - FastPrecisePowf(0.00046 * x, 3) - 0.0004 * x + 15; + humidity = - FastPrecisePowf(0.00046f * x, 3) - 0.0004f * x + 15; } temperature = 0; Dht[sensor].raw = voltage; @@ -197,8 +197,8 @@ bool DhtRead(uint32_t sensor) { return false; } - if (humidity > 100) { humidity = 100.0; } - if (humidity < 0) { humidity = 0.1; } + if (humidity > 100) { humidity = 100.0f; } + if (humidity < 0) { humidity = 0.1f; } Dht[sensor].h = ConvertHumidity(humidity); Dht[sensor].t = ConvertTemp(temperature); Dht[sensor].lastresult = 0; diff --git a/tasmota/xsns_06_esp32_dht.ino b/tasmota/xsns_06_esp32_dht.ino index e6c6308a7..3399bebc4 100644 --- a/tasmota/xsns_06_esp32_dht.ino +++ b/tasmota/xsns_06_esp32_dht.ino @@ -58,8 +58,8 @@ bool DhtRead(uint32_t sensor) { return false; } - if (humidity > 100) { humidity = 100.0; } - if (humidity < 0) { humidity = 0.1; } + if (humidity > 100) { humidity = 100.0f; } + if (humidity < 0) { humidity = 0.1f; } Dht[sensor].h = ConvertHumidity(humidity); Dht[sensor].t = ConvertTemp(temperature); Dht[sensor].lastresult = 0; diff --git a/tasmota/xsns_07_sht1x.ino b/tasmota/xsns_07_sht1x.ino index 5b5419648..fb1b80f4a 100644 --- a/tasmota/xsns_07_sht1x.ino +++ b/tasmota/xsns_07_sht1x.ino @@ -138,14 +138,14 @@ bool ShtRead(void) float humRaw = ShtReadData(); // Temperature conversion coefficients from SHT1X datasheet for version 4 - const float d1 = -39.7; // 3.5V - const float d2 = 0.01; // 14-bit + const float d1 = -39.7f; // 3.5V + const float d2 = 0.01f; // 14-bit sht_temperature = d1 + (tempRaw * d2); - const float c1 = -2.0468; - const float c2 = 0.0367; - const float c3 = -1.5955E-6; - const float t1 = 0.01; - const float t2 = 0.00008; + const float c1 = -2.0468f; + const float c2 = 0.0367f; + const float c3 = -1.5955E-6f; + const float t1 = 0.01f; + const float t2 = 0.00008f; float rhLinear = c1 + c2 * humRaw + c3 * humRaw * humRaw; sht_humidity = (sht_temperature - 25) * (t1 + t2 * humRaw) + rhLinear; sht_temperature = ConvertTemp(sht_temperature); diff --git a/tasmota/xsns_08_htu21.ino b/tasmota/xsns_08_htu21.ino index 83a3d335f..0b9c652ae 100644 --- a/tasmota/xsns_08_htu21.ino +++ b/tasmota/xsns_08_htu21.ino @@ -167,7 +167,7 @@ bool HtuRead(void) } if (HtuCheckCrc8(sensorval) != checksum) { return false; } // Checksum mismatch - Htu.temperature = ConvertTemp(0.002681 * (float)sensorval - 46.85); + Htu.temperature = ConvertTemp(0.002681f * (float)sensorval - 46.85f); Wire.beginTransmission(HTU21_ADDR); Wire.write(HTU21_READHUM); @@ -183,15 +183,15 @@ bool HtuRead(void) if (HtuCheckCrc8(sensorval) != checksum) { return false; } // Checksum mismatch sensorval ^= 0x02; // clear status bits - Htu.humidity = 0.001907 * (float)sensorval - 6; - if (Htu.humidity > 100) { Htu.humidity = 100.0; } - if (Htu.humidity < 0) { Htu.humidity = 0.01; } + Htu.humidity = 0.001907f * (float)sensorval - 6; + if (Htu.humidity > 100) { Htu.humidity = 100.0f; } + if (Htu.humidity < 0) { Htu.humidity = 0.01f; } - if ((0.00 == Htu.humidity) && (0.00 == Htu.temperature)) { - Htu.humidity = 0.0; + if ((0.00f == Htu.humidity) && (0.00f == Htu.temperature)) { + Htu.humidity = 0.0f; } - if ((Htu.temperature > 0.00) && (Htu.temperature < 80.00)) { - Htu.humidity = (-0.15) * (25 - Htu.temperature) + Htu.humidity; + if ((Htu.temperature > 0.00f) && (Htu.temperature < 80.00f)) { + Htu.humidity = (-0.15f) * (25 - Htu.temperature) + Htu.humidity; } Htu.humidity = ConvertHumidity(Htu.humidity); diff --git a/tasmota/xsns_09_bmp.ino b/tasmota/xsns_09_bmp.ino index 149c0ded2..6846af7ae 100644 --- a/tasmota/xsns_09_bmp.ino +++ b/tasmota/xsns_09_bmp.ino @@ -167,7 +167,7 @@ void Bmp180Read(uint8_t bmp_idx) int32_t xt1 = (ut - (int32_t)bmp180_cal_data[bmp_idx].cal_ac6) * ((int32_t)bmp180_cal_data[bmp_idx].cal_ac5) >> 15; int32_t xt2 = ((int32_t)bmp180_cal_data[bmp_idx].cal_mc << 11) / (xt1 + (int32_t)bmp180_cal_data[bmp_idx].cal_md); int32_t bmp180_b5 = xt1 + xt2; - bmp_sensors[bmp_idx].bmp_temperature = ((bmp180_b5 + 8) >> 4) / 10.0; + bmp_sensors[bmp_idx].bmp_temperature = ((bmp180_b5 + 8) >> 4) / 10.0f; I2cWrite8(bmp_sensors[bmp_idx].bmp_address, BMP180_REG_CONTROL, BMP180_PRESSURE3); // Highest resolution delay(2 + (4 << BMP180_OSS)); // 26ms conversion time at ultra high resolution @@ -197,7 +197,7 @@ void Bmp180Read(uint8_t bmp_idx) x1 = (x1 * 3038) >> 16; x2 = (-7357 * p) >> 16; p += ((x1 + x2 + (int32_t)3791) >> 4); - bmp_sensors[bmp_idx].bmp_pressure = (float)p / 100.0; // convert to mbar + bmp_sensors[bmp_idx].bmp_pressure = (float)p / 100.0f; // convert to mbar } /*********************************************************************************************\ @@ -307,7 +307,7 @@ void Bme280Read(uint8_t bmp_idx) ((int32_t)Bme280CalibrationData[bmp_idx].dig_T3)) >> 14; int32_t t_fine = vart1 + vart2; float T = (t_fine * 5 + 128) >> 8; - bmp_sensors[bmp_idx].bmp_temperature = T / 100.0; + bmp_sensors[bmp_idx].bmp_temperature = T / 100.0f; int32_t adc_P = I2cRead24(bmp_sensors[bmp_idx].bmp_address, BME280_REGISTER_PRESSUREDATA); adc_P >>= 4; @@ -326,7 +326,7 @@ void Bme280Read(uint8_t bmp_idx) var1 = (((int64_t)Bme280CalibrationData[bmp_idx].dig_P9) * (p >> 13) * (p >> 13)) >> 25; var2 = (((int64_t)Bme280CalibrationData[bmp_idx].dig_P8) * p) >> 19; p = ((p + var1 + var2) >> 8) + (((int64_t)Bme280CalibrationData[bmp_idx].dig_P7) << 4); - bmp_sensors[bmp_idx].bmp_pressure = (float)p / 25600.0; + bmp_sensors[bmp_idx].bmp_pressure = (float)p / 25600.0f; if (BMP280_CHIPID == bmp_sensors[bmp_idx].bmp_type) { return; } @@ -343,7 +343,7 @@ void Bme280Read(uint8_t bmp_idx) v_x1_u32r = (v_x1_u32r < 0) ? 0 : v_x1_u32r; v_x1_u32r = (v_x1_u32r > 419430400) ? 419430400 : v_x1_u32r; float h = (v_x1_u32r >> 12); - bmp_sensors[bmp_idx].bmp_humidity = h / 1024.0; + bmp_sensors[bmp_idx].bmp_humidity = h / 1024.0f; } #ifdef USE_BME68X @@ -444,16 +444,16 @@ void Bme680Read(uint8_t bmp_idx) if (rslt != BME68X_OK) { return; } #ifdef BME68X_DO_NOT_USE_FPU - bmp_sensors[bmp_idx].bmp_temperature = data.temperature / 100.0; // Temperature in degree celsius x100 - bmp_sensors[bmp_idx].bmp_humidity = data.humidity / 1000.0; // Humidity in % relative humidity x1000 + bmp_sensors[bmp_idx].bmp_temperature = data.temperature / 100.0f; // Temperature in degree celsius x100 + bmp_sensors[bmp_idx].bmp_humidity = data.humidity / 1000.0f; // Humidity in % relative humidity x1000 #else bmp_sensors[bmp_idx].bmp_temperature = data.temperature; // Temperature in degree celsius bmp_sensors[bmp_idx].bmp_humidity = data.humidity; // Humidity in % relative humidity #endif - bmp_sensors[bmp_idx].bmp_pressure = data.pressure / 100.0; // Pressure in Pascal (converted to hPa) + bmp_sensors[bmp_idx].bmp_pressure = data.pressure / 100.0f; // Pressure in Pascal (converted to hPa) // Avoid using measurements from an unstable heating setup if (data.status & BME68X_GASM_VALID_MSK) { - bmp_sensors[bmp_idx].bmp_gas_resistance = data.gas_resistance / 1000.0; // Gas resistance in Ohms (converted to kOhm) + bmp_sensors[bmp_idx].bmp_gas_resistance = data.gas_resistance / 1000.0f; // Gas resistance in Ohms (converted to kOhm) } else { bmp_sensors[bmp_idx].bmp_gas_resistance = 0; } diff --git a/tasmota/xsns_21_sgp30.ino b/tasmota/xsns_21_sgp30.ino index e012813cb..a2509da94 100644 --- a/tasmota/xsns_21_sgp30.ino +++ b/tasmota/xsns_21_sgp30.ino @@ -62,17 +62,17 @@ float sgp30_AbsoluteHumidity(float temperature, float humidity) { //Buck (1981) 6.1121 exp(17.502 x T)/(T + 240.97) //reference https://www.eas.ualberta.ca/jdwilson/EAS372_13/Vomel_CIRES_satvpformulae.html float temp = NAN; - const float mw = 18.01534; // molar mass of water g/mol - const float r = 8.31447215; // Universal gas constant J/mol/K + const float mw = 18.01534f; // molar mass of water g/mol + const float r = 8.31447215f; // Universal gas constant J/mol/K if (isnan(temperature) || isnan(humidity) ) { return NAN; } - temp = POW_FUNC(2.718281828, (17.67 * temperature) / (temperature + 243.5)); + temp = POW_FUNC(2.718281828f, (17.67f * temperature) / (temperature + 243.5f)); //return (6.112 * temp * humidity * 2.1674) / (273.15 + temperature); //simplified version - return (6.112 * temp * humidity * mw) / ((273.15 + temperature) * r); //long version + return (6.112f * temp * humidity * mw) / ((273.15f + temperature) * r); //long version } #define SAVE_PERIOD 30 diff --git a/tasmota/xsns_26_lm75ad.ino b/tasmota/xsns_26_lm75ad.ino index 9e038dd4a..03501b9a1 100644 --- a/tasmota/xsns_26_lm75ad.ino +++ b/tasmota/xsns_26_lm75ad.ino @@ -77,7 +77,7 @@ float LM75ADGetTemp(void) sign = -1; } t = t >> 5; // shift value into place (5 LSB not used) - return ConvertTemp(sign * t * 0.125); + return ConvertTemp(sign * t * 0.125f); } void LM75ADShow(bool json) diff --git a/tasmota/xsns_37_rfsensor.ino b/tasmota/xsns_37_rfsensor.ino index 2c4d7e7f6..25db41a0c 100644 --- a/tasmota/xsns_37_rfsensor.ino +++ b/tasmota/xsns_37_rfsensor.ino @@ -479,7 +479,7 @@ void RfSnsAnalyzeAlectov2() // rfsns_raw_signal->Number = RFSNS_DKW2012_PULSECOUNT; // DKW2012 // data[8] = 11; // WSW - factor = 1.22; // (1.08) + factor = 1.22f; // (1.08) // atime = rfsns_raw_signal->Time - rfsns_alecto_time; // if ((atime > 10000) && (atime < 60000)) factor = (float)60000 / atime; // rfsns_alecto_time = rfsns_raw_signal->Time; @@ -493,7 +493,7 @@ void RfSnsAnalyzeAlectov2() // check if rain unit has been reset! if (rain < rfsns_alecto_rain_base) { rfsns_alecto_rain_base = rain; } if (rfsns_alecto_rain_base > 0) { - rfsns_alecto_v2->rain += ((float)rain - rfsns_alecto_rain_base) * 0.30; + rfsns_alecto_v2->rain += ((float)rain - rfsns_alecto_rain_base) * 0.30f; } rfsns_alecto_rain_base = rain; rfsns_alecto_v2->wind = (float)data[4] * factor; diff --git a/tasmota/xsns_39_max31855.ino b/tasmota/xsns_39_max31855.ino index 0807b6b8b..1b7bca1b3 100644 --- a/tasmota/xsns_39_max31855.ino +++ b/tasmota/xsns_39_max31855.ino @@ -89,7 +89,7 @@ float MAX31855_GetProbeTemperature(int32_t RawData) { } else { RawData >>= 18; // Positiv value - Drop lower 18 bits } - float result = (RawData * 0.25); // MAX31855 LSB resolution is 0.25°C for probe temperature + float result = (RawData * 0.25f); // MAX31855 LSB resolution is 0.25°C for probe temperature return ConvertTemp(result); // Check if we have to convert to Fahrenheit } @@ -104,7 +104,7 @@ float MAX31855_GetReferenceTemperature(int32_t RawData) { } else { RawData = (RawData >> 4) & 0x00000FFF; // Positiv value - Drop lower 4 bits and mask out remaining bits (probe temp, error bit, etc.) } - float result = (RawData * 0.0625); // MAX31855 LSB resolution is 0.0625°C for reference temperature + float result = (RawData * 0.0625f); // MAX31855 LSB resolution is 0.0625°C for reference temperature return ConvertTemp(result); // Check if we have to convert to Fahrenheit } @@ -123,7 +123,7 @@ void MAX31855_GetResult(void) { MAX31855_Result.ErrorCode = 0; MAX31855_Result.ReferenceTemperature = NAN; - MAX31855_Result.ProbeTemperature = ConvertTemp(0.25 * temp); + MAX31855_Result.ProbeTemperature = ConvertTemp(0.25f * temp); } else { int32_t RawData = MAX31855_ShiftIn(32); uint8_t probeerror = RawData & 0x7; diff --git a/tasmota/xsns_41_max44009.ino b/tasmota/xsns_41_max44009.ino index 45cb91354..0b1a4fb5a 100644 --- a/tasmota/xsns_41_max44009.ino +++ b/tasmota/xsns_41_max44009.ino @@ -54,7 +54,7 @@ bool Max4409Read_lum(void) if (I2cValidRead16((uint16_t *)®data, max44009_address, REG_LUMINANCE)) { int exponent = (regdata[0] & 0xF0) >> 4; int mantissa = ((regdata[0] & 0x0F) << 4) | (regdata[1] & 0x0F); - max44009_illuminance = (float)(((0x00000001 << exponent) * (float)mantissa) * 0.045); + max44009_illuminance = (float)(((0x00000001 << exponent) * (float)mantissa) * 0.045f); max44009_valid = 1; return true; } else { diff --git a/tasmota/xsns_42_scd30.ino b/tasmota/xsns_42_scd30.ino index 062e1d841..dc7ec35a3 100644 --- a/tasmota/xsns_42_scd30.ino +++ b/tasmota/xsns_42_scd30.ino @@ -74,8 +74,8 @@ int scd30Co2Zero_count = 0; int i2cReset_count = 0; uint16_t scd30_CO2 = 0; uint16_t scd30_CO2EAvg = 0; -float scd30_Humid = 0.0; -float scd30_Temp = 0.0; +float scd30_Humid = 0.0f; +float scd30_Temp = 0.0f; void Scd30Detect(void) { diff --git a/tasmota/xsns_43_hre.ino b/tasmota/xsns_43_hre.ino index 98e52b0ab..6ceddf43c 100644 --- a/tasmota/xsns_43_hre.ino +++ b/tasmota/xsns_43_hre.ino @@ -195,7 +195,7 @@ void hreEvery50ms(void) if (parity_errors == 0) { float curr_usage; - curr_usage = 0.01 * atol(buff+24); // useage in gal + curr_usage = 0.01f * atol(buff+24); // useage in gal if (hre_usage_time) { double dt = 1.666e-2 * (curr_start - hre_usage_time); // dt in minutes diff --git a/tasmota/xsns_46_MLX90614.ino b/tasmota/xsns_46_MLX90614.ino index a3a95600e..5cb7f65cf 100644 --- a/tasmota/xsns_46_MLX90614.ino +++ b/tasmota/xsns_46_MLX90614.ino @@ -55,14 +55,14 @@ void MLX90614_Every_Second(void) if (mlx90614.value & 0x8000) { mlx90614.obj_temp = -999; } else { - mlx90614.obj_temp = ((float)mlx90614.value * 0.02) - 273.15; + mlx90614.obj_temp = ((float)mlx90614.value * 0.02f) - 273.15f; } //mlx90614.i2c_buf = I2cRead24(I2_ADR_IRT,MLX90614_TA); mlx90614.value = MLX90614_read16(I2_ADR_IRT, MLX90614_TA); if (mlx90614.value & 0x8000) { mlx90614.amb_temp = -999; } else { - mlx90614.amb_temp = ((float)mlx90614.value * 0.02) - 273.15; + mlx90614.amb_temp = ((float)mlx90614.value * 0.02f) - 273.15f; } } diff --git a/tasmota/xsns_55_hih_series.ino b/tasmota/xsns_55_hih_series.ino index b0c8765eb..4f6cc0648 100644 --- a/tasmota/xsns_55_hih_series.ino +++ b/tasmota/xsns_55_hih_series.ino @@ -61,10 +61,10 @@ bool Hih6Read(void) // uint8_t status = data[0] >> 6; // 0 = Valid data, 1 = Stale data, 2 = Command mode, 3 = Not used - Hih6.humidity = ConvertHumidity(((float)(((data[0] & 0x3F) << 8) | data[1]) * 100.0) / 16383.0); + Hih6.humidity = ConvertHumidity(((float)(((data[0] & 0x3F) << 8) | data[1]) * 100.0f) / 16383.0f); // Convert the data to 14-bits int temp = ((data[2] << 8) | (data[3] & 0xFC)) / 4; - Hih6.temperature = ConvertTemp(((float)temp / 16384.0) * 165.0 - 40.0); + Hih6.temperature = ConvertTemp(((float)temp / 16384.0f) * 165.0f - 40.0f); Hih6.valid = SENSOR_MAX_MISS; return true; diff --git a/tasmota/xsns_59_ds1624.ino b/tasmota/xsns_59_ds1624.ino index 1640cc801..6f62b8540 100644 --- a/tasmota/xsns_59_ds1624.ino +++ b/tasmota/xsns_59_ds1624.ino @@ -127,7 +127,7 @@ bool DS1624GetTemp(float *value, int idx) uint16_t t; if (!I2cValidRead16(&t, DS1624_Idx2Addr(idx), DS1624_TEMP_REGISTER)) { return false; } if (ds1624_sns[idx].type == DS1624_TYPE_DS1624) { - *value = ((float)(int8_t)(t>>8)) + ((t>>4)&0xf)*0.0625; + *value = ((float)(int8_t)(t>>8)) + ((t>>4)&0xf)*0.0625f; } else { //type == DS1624_TYPE_DS1621 // Datasheet for ds1621 is wrong for high resolution, real is: *value = ((float)(int8_t)(t>>8)); diff --git a/tasmota/xsns_65_hdc1080.ino b/tasmota/xsns_65_hdc1080.ino index 381f1a48a..96a7be484 100644 --- a/tasmota/xsns_65_hdc1080.ino +++ b/tasmota/xsns_65_hdc1080.ino @@ -61,16 +61,16 @@ // Constants: #define HDC1080_CONV_TIME 15 // Assume 6.50 + 6.35 ms + x of conversion delay for this device -#define HDC1080_TEMP_MULT 0.0025177 -#define HDC1080_RH_MULT 0.0015258 -#define HDC1080_TEMP_OFFSET 40.0 +#define HDC1080_TEMP_MULT 0.0025177f +#define HDC1080_RH_MULT 0.0015258f +#define HDC1080_TEMP_OFFSET 40.0f const char* hdc_type_name = "HDC1080"; uint16_t hdc_manufacturer_id = 0; uint16_t hdc_device_id = 0; -float hdc_temperature = 0.0; -float hdc_humidity = 0.0; +float hdc_temperature = 0.0f; +float hdc_humidity = 0.0f; uint8_t hdc_valid = 0; @@ -221,8 +221,8 @@ bool HdcRead(void) { hdc_humidity = HDC1080_RH_MULT * (float) (rh_data); - if (hdc_humidity > 100) { hdc_humidity = 100.0; } - if (hdc_humidity < 0) { hdc_humidity = 0.01; } + if (hdc_humidity > 100) { hdc_humidity = 100.0f; } + if (hdc_humidity < 0) { hdc_humidity = 0.01f; } hdc_humidity = ConvertHumidity(hdc_humidity); hdc_valid = SENSOR_MAX_MISS; diff --git a/tasmota/xsns_88_am2320.ino b/tasmota/xsns_88_am2320.ino index 2180d2c0d..cb177987b 100644 --- a/tasmota/xsns_88_am2320.ino +++ b/tasmota/xsns_88_am2320.ino @@ -106,12 +106,12 @@ bool Am2320Read(void) unsigned int receivedCrc = (buf[7] << 8) | buf[6]; // pack high and low byte together if (receivedCrc == crc16(buf, 6)) { // preamble + data int temperature = ((buf[4] & 0x7F) << 8) | buf[5]; - AM2320.t = temperature / 10.0; + AM2320.t = temperature / 10.0f; // check for negative temp reading AM2320.t = ((buf[4] & 0x80) >> 7) == 1 ? AM2320.t * (-1) : AM2320.t; int humidity = (buf[2] << 8) | buf[3]; - AM2320.h = humidity / 10.0; + AM2320.h = humidity / 10.0f; AM2320.valid = SENSOR_MAX_MISS; // reset error counter return true; From 9714e1c049e9135a082f1abbb9b94176442504ff Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 19 Apr 2022 17:26:57 +0200 Subject: [PATCH 036/376] Add wifi_no_sleep to user config --- tasmota/my_user_config.h | 1 + tasmota/settings.ino | 1 + 2 files changed, 2 insertions(+) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 7391a6db9..e55c5eda4 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -82,6 +82,7 @@ #define WIFI_ARP_INTERVAL 60 // [SetOption41] Send gratuitous ARP interval #define WIFI_SCAN_AT_RESTART false // [SetOption56] Scan Wi-Fi network at restart for configured AP's #define WIFI_SCAN_REGULARLY true // [SetOption57] Scan Wi-Fi network every 44 minutes for configured AP's +#define WIFI_NO_SLEEP false // [SetOption127] Sets Wifi in no-sleep mode which improves responsiveness on some routers // -- Syslog -------------------------------------- #define SYS_LOG_HOST "" // [LogHost] (Linux) syslog host diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 72527235d..54b68a35a 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -942,6 +942,7 @@ void SettingsDefaultSet2(void) { SettingsUpdateText(SET_RGX_PASSWORD, PSTR(WIFI_RGX_PASSWORD)); Settings->sbflag1.range_extender = WIFI_RGX_STATE; Settings->sbflag1.range_extender_napt = WIFI_RGX_NAPT; + flag5.wifi_no_sleep |= WIFI_NO_SLEEP; // Syslog SettingsUpdateText(SET_SYSLOG_HOST, PSTR(SYS_LOG_HOST)); From bf869d1027bf46ac925683d698537420fa941d3d Mon Sep 17 00:00:00 2001 From: barbudor Date: Tue, 19 Apr 2022 18:07:25 +0200 Subject: [PATCH 037/376] enable tas_disco when home_ass is disbaled --- tasmota/tasmota_configurations_ESP32.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index c6234dd8e..d6b8d9a4b 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -40,6 +40,7 @@ #undef USE_I2C #undef USE_HOME_ASSISTANT +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) #undef USE_COUNTER #undef USE_IR_REMOTE #undef USE_AC_ZERO_CROSS_DIMMER @@ -71,8 +72,8 @@ #define FALLBACK_MODULE WEMOS // [Module2] Select default module on fast reboot where USER_MODULE is user template #define USE_INFLUXDB // Enable influxdb support (+5k code) -#define USE_TASMOTA_DISCOVERY #undef USE_HOME_ASSISTANT +#define USE_TASMOTA_DISCOVERY #define USE_SDCARD @@ -108,6 +109,7 @@ #undef USE_DOMOTICZ #undef USE_HOME_ASSISTANT +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) #define USE_WEBCLIENT_HTTPS From 43c53838adb7f7444d14ce066188c61aeab04c62 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 19 Apr 2022 19:17:04 +0200 Subject: [PATCH 038/376] Add SDCard SDIO support --- tasmota/language/af_AF.h | 8 +++++- tasmota/language/bg_BG.h | 8 +++++- tasmota/language/cs_CZ.h | 8 +++++- tasmota/language/de_DE.h | 8 +++++- tasmota/language/el_GR.h | 8 +++++- tasmota/language/en_GB.h | 8 +++++- tasmota/language/es_ES.h | 8 +++++- tasmota/language/fr_FR.h | 8 +++++- tasmota/language/fy_NL.h | 8 +++++- tasmota/language/he_HE.h | 8 +++++- tasmota/language/hu_HU.h | 8 +++++- tasmota/language/it_IT.h | 8 +++++- tasmota/language/ko_KO.h | 8 +++++- tasmota/language/nl_NL.h | 8 +++++- tasmota/language/pl_PL.h | 8 +++++- tasmota/language/pt_BR.h | 8 +++++- tasmota/language/pt_PT.h | 8 +++++- tasmota/language/ro_RO.h | 8 +++++- tasmota/language/ru_RU.h | 8 +++++- tasmota/language/sk_SK.h | 8 +++++- tasmota/language/sv_SE.h | 8 +++++- tasmota/language/tr_TR.h | 8 +++++- tasmota/language/uk_UA.h | 8 +++++- tasmota/language/vi_VN.h | 8 +++++- tasmota/language/zh_CN.h | 8 +++++- tasmota/language/zh_TW.h | 8 +++++- tasmota/tasmota.ino | 1 + tasmota/tasmota_template.h | 18 ++++++++++++- tasmota/xdrv_50_filesystem.ino | 47 ++++++++++++++++++++++++---------- 29 files changed, 234 insertions(+), 40 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index afa923e37..6c7934f76 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f9b0510f8..1e6270266 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Подсветка" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Подсветка" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index d6206ada9..941dd24a2 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index bfc3e881c..9218e9537 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index f4134304c..67481f5a2 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 73e6157df..afa9b3a8f 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 608830d3e..b93135578 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 3c1f9f777..5638233b1 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "RétroÉcl" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "RétroÉcl" #define D_SENSOR_PMS5003_TX "PMS5003 TX" #define D_SENSOR_PMS5003_RX "PMS5003 RX" #define D_SENSOR_SDS0X1_RX "SDS0X1 RX" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 9b06fd901..fc97068d3 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 10843edb3..dc7be8aa0 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 888b36a1b..04b069358 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Háttérfény" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Háttérfény" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index d4dba3ffe..2178abc12 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI - MISO" #define D_SENSOR_SPI_MOSI "SPI - MOSI" #define D_SENSOR_SPI_CLK "SPI - CLK" -#define D_SENSOR_BACKLIGHT "Retroilluminazione" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Retroilluminazione" #define D_SENSOR_PMS5003_TX "PMS5003 - TX" #define D_SENSOR_PMS5003_RX "PMS5003 - RX" #define D_SENSOR_SDS0X1_RX "SDS0X1 - RX" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 0eb35b087..2716feea4 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 917421d50..a7a1e383a 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 05f8c5b28..6bec6b159 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Podświetlanie" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Podświetlanie" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 5f3e8480d..15b574f64 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Luz de fundo" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Luz de fundo" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 3e33bdcf5..b664cf3cf 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Luz fundo" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Luz fundo" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 1ad94086f..cb709f185 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 9e343f93d..e45388a22 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 004ca8418..d376dc26c 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index c4b582b2a..dbd138ff5 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index da289d3a0..bcb341725 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 9b1fe8c0b..b13930560 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "OLED Light" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "OLED Light" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index d77894125..0f4e5f563 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index f6f07708c..89ad958ca 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index ec3008a5c..767df5857 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -651,7 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI MISO" #define D_SENSOR_SPI_MOSI "SPI MOSI" #define D_SENSOR_SPI_CLK "SPI CLK" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_SDIO_CMD "SDIO CMD" +#define D_SENSOR_SDIO_CLK "SDIO CLK" +#define D_SENSOR_SDIO_D0 "SDIO D0" +#define D_SENSOR_SDIO_D1 "SDIO D1" +#define D_SENSOR_SDIO_D2 "SDIO D2" +#define D_SENSOR_SDIO_D3 "SDIO D3" +#define D_SENSOR_BACKLIGHT "Backlight" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index f9233885d..bad041105 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -75,6 +75,7 @@ #include #ifdef USE_SDCARD #include +#include #endif // USE_SDCARD #include "FFat.h" #include "FS.h" diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index dac7e3416..b576027b3 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -186,6 +186,7 @@ enum UserSelectablePins { GPIO_ADE7880_IRQ, // ADE7880 IRQ GPIO_RESET, // Generic reset GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface + GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -411,6 +412,12 @@ const char kSensorNames[] PROGMEM = D_SENSOR_ADE7880_IRQ "|" D_SENSOR_RESET "|" D_SENSOR_MS01 "|" + D_SENSOR_SDIO_CMD "|" + D_SENSOR_SDIO_CLK "|" + D_SENSOR_SDIO_D0 "|" + D_SENSOR_SDIO_D1 "|" + D_SENSOR_SDIO_D2 "|" + D_SENSOR_SDIO_D3 "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -516,13 +523,22 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_RC522_RST), // RC522 Rfid Reset #endif #ifdef USE_SDCARD - AGPIO(GPIO_SDCARD_CS), + AGPIO(GPIO_SDCARD_CS), // SDCard in SPI mode #endif // USE_SDCARD #ifdef USE_MCP2515 AGPIO(GPIO_MCP2515_CS), #endif // USE_MCP2515 #endif // USE_SPI +#if defined(USE_SDCARD) && defined(ESP32) + AGPIO(GPIO_SDIO_CMD), // SDCard in SDIO mode + AGPIO(GPIO_SDIO_CLK), + AGPIO(GPIO_SDIO_D0), + AGPIO(GPIO_SDIO_D1), // (opt) if in 4-bit mode, DAT1-3 are needed + AGPIO(GPIO_SDIO_D2), + AGPIO(GPIO_SDIO_D3), +#endif // USE_SDCARD + AGPIO(GPIO_SSPI_MISO), // Software SPI Master Input Client Output AGPIO(GPIO_SSPI_MOSI), // Software SPI Master Output Client Input AGPIO(GPIO_SSPI_SCLK), // Software SPI Serial Clock diff --git a/tasmota/xdrv_50_filesystem.ino b/tasmota/xdrv_50_filesystem.ino index 4e8cfbf04..3e5a86080 100644 --- a/tasmota/xdrv_50_filesystem.ino +++ b/tasmota/xdrv_50_filesystem.ino @@ -41,10 +41,6 @@ ufsfree free size in kB #define XDRV_50 50 -#ifndef SDCARD_CS_PIN -#define SDCARD_CS_PIN 4 -#endif - #define UFS_TNONE 0 #define UFS_TSDC 1 #define UFS_TFAT 2 @@ -141,17 +137,14 @@ void UfsInit(void) { #ifdef USE_SDCARD void UfsCheckSDCardInit(void) { - if (TasmotaGlobal.spi_enabled) { - int8_t cs = SDCARD_CS_PIN; - if (PinUsed(GPIO_SDCARD_CS)) { - cs = Pin(GPIO_SDCARD_CS); - } - + // Try SPI mode first + // SPI mode requires SDCARD_CS to be configured + if (TasmotaGlobal.spi_enabled && PinUsed(GPIO_SDCARD_CS)) { + int8_t cs = Pin(GPIO_SDCARD_CS); #ifdef EPS8266 SPI.begin(); #endif // EPS8266 - #ifdef ESP32 SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1); #endif // ESP32 @@ -160,10 +153,10 @@ void UfsCheckSDCardInit(void) { #ifdef ESP8266 ufsp = &SDFS; #endif // ESP8266 - #ifdef ESP32 ufsp = &SD; #endif // ESP32 + ufs_type = UFS_TSDC; dfsp = ufsp; if (ffsp) {ufs_dir = 1;} @@ -173,10 +166,38 @@ void UfsCheckSDCardInit(void) { AddLog(LOG_LEVEL_INFO, PSTR("UFS: SDCard mounted")); #endif // ESP8266 #ifdef ESP32 - AddLog(LOG_LEVEL_INFO, PSTR("UFS: SDCard mounted with %d kB free"), UfsInfo(1, 0)); + AddLog(LOG_LEVEL_INFO, PSTR("UFS: SDCard mounted (SPI mode) with %d kB free"), UfsInfo(1, 0)); #endif // ESP32 } } +#ifdef ESP32 + // check if SDIO is configured + else if (PinUsed(GPIO_SDIO_CLK) && PinUsed(GPIO_SDIO_CMD) && PinUsed(GPIO_SDIO_D0)) { + int32_t sdio_cmd = Pin(GPIO_SDIO_CMD); + int32_t sdio_clk = Pin(GPIO_SDIO_CLK); + int32_t sdio_d0 = Pin(GPIO_SDIO_D0); + int32_t sdio_d1 = Pin(GPIO_SDIO_D1); + int32_t sdio_d2 = Pin(GPIO_SDIO_D2); + int32_t sdio_d3 = Pin(GPIO_SDIO_D3); + bool bit_4_mode = (sdio_d1 >= 0) && (sdio_d2 >= 0) && (sdio_d3 >= 0); // enable 4-bit mode if possible + if (bit_4_mode) { + // AddLog(LOG_LEVEL_DEBUG, "UFS: trying SDIO 4-bit clk=%i cmd=%i d0=%i d1=%i d2=%i d3=%i", sdio_clk, sdio_cmd, sdio_d0, sdio_d1, sdio_d2, sdio_d3); + SD_MMC.setPins(sdio_clk, sdio_cmd, sdio_d0, sdio_d1, sdio_d2, sdio_d3); + } else { + // AddLog(LOG_LEVEL_DEBUG, "UFS: trying SDIO 1-bit clk=%i cmd=%i d0=%i", sdio_clk, sdio_cmd, sdio_d0); + SD_MMC.setPins(sdio_clk, sdio_cmd, sdio_d0); + } + if (SD_MMC.begin("/sd", !bit_4_mode /*mode 1 bit*/, false /*format_if_failed*/)) { // mount under "/sd" to be consistent with SD SPI + ufsp = &SD_MMC; + + ufs_type = UFS_TSDC; + dfsp = ufsp; + if (ffsp) {ufs_dir = 1;} + // make sd card the global filesystem + AddLog(LOG_LEVEL_INFO, PSTR("UFS: SDCard mounted (SDIO %i-bit) with %d kB free"), bit_4_mode ? 4 : 1, UfsInfo(1, 0)); + } + } +#endif } #endif // USE_SDCARD From 387cdd12d1fad5a3f97ce16514c457e1a300821d Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 19 Apr 2022 20:03:14 +0200 Subject: [PATCH 039/376] Fix compilation of SDMMC on ESP32C3 --- tasmota/xdrv_50_filesystem.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_50_filesystem.ino b/tasmota/xdrv_50_filesystem.ino index 3e5a86080..577c32064 100644 --- a/tasmota/xdrv_50_filesystem.ino +++ b/tasmota/xdrv_50_filesystem.ino @@ -170,7 +170,7 @@ void UfsCheckSDCardInit(void) { #endif // ESP32 } } -#ifdef ESP32 +#if defined(ESP32) && defined(SOC_SDMMC_HOST_SUPPORTED) // ESP32 and SDMMC supported (not Esp32C3) // check if SDIO is configured else if (PinUsed(GPIO_SDIO_CLK) && PinUsed(GPIO_SDIO_CMD) && PinUsed(GPIO_SDIO_D0)) { int32_t sdio_cmd = Pin(GPIO_SDIO_CMD); From 04a630b70bb59e0912c4c8b0f4cda01cb30132da Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 19 Apr 2022 20:47:16 +0200 Subject: [PATCH 040/376] remove duplicate define --- tasmota/tasmota_configurations_ESP32.h | 1 - 1 file changed, 1 deletion(-) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index d6b8d9a4b..59084cc52 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -33,7 +33,6 @@ #define CODE_IMAGE_STR "webcam" #define USE_WEBCAM -#define USE_TASMOTA_DISCOVERY #define ENABLE_RTSPSERVER #define USE_SPI #define USE_SDCARD From b74a38edbfab5ae8735bd89a0aaa1a7e8ba9256b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 20 Apr 2022 12:04:18 +0200 Subject: [PATCH 041/376] Fix initial export active result --- tasmota/xdrv_03_energy.ino | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_03_energy.ino b/tasmota/xdrv_03_energy.ino index 4ea476ea8..a9880ef6d 100644 --- a/tasmota/xdrv_03_energy.ino +++ b/tasmota/xdrv_03_energy.ino @@ -244,18 +244,17 @@ void EnergyUpdateToday(void) { int32_t delta = Energy.kWhtoday_delta[i] / 1000; Energy.kWhtoday_delta[i] -= (delta * 1000); Energy.kWhtoday[i] += delta; - if (delta < 0) { // Export energy RtcSettings.energy_kWhexport_ph[i] += (delta *-1); - if (Energy.local_energy_active_export) { - Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 100000; - } } } RtcSettings.energy_kWhtoday_ph[i] = Energy.kWhtoday_offset[i] + Energy.kWhtoday[i]; Energy.daily[i] = (float)(RtcSettings.energy_kWhtoday_ph[i]) / 100000; Energy.total[i] = (float)(RtcSettings.energy_kWhtotal_ph[i] + RtcSettings.energy_kWhtoday_ph[i]) / 100000; + if (Energy.local_energy_active_export) { + Energy.export_active[i] = (float)(RtcSettings.energy_kWhexport_ph[i]) / 100000; + } Energy.total_sum += Energy.total[i]; Energy.yesterday_sum += (float)Settings->energy_kWhyesterday_ph[i] / 100000; From bbac1eeb6756e44c0bf137197febd1174e332ccf Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Wed, 20 Apr 2022 14:29:08 +0200 Subject: [PATCH 042/376] Italian language update Please check and merge. Thanks. --- tasmota/language/it_IT.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 2178abc12..769f43241 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -651,13 +651,13 @@ #define D_SENSOR_SPI_MISO "SPI - MISO" #define D_SENSOR_SPI_MOSI "SPI - MOSI" #define D_SENSOR_SPI_CLK "SPI - CLK" -#define D_SENSOR_SDIO_CMD "SDIO CMD" -#define D_SENSOR_SDIO_CLK "SDIO CLK" -#define D_SENSOR_SDIO_D0 "SDIO D0" -#define D_SENSOR_SDIO_D1 "SDIO D1" -#define D_SENSOR_SDIO_D2 "SDIO D2" -#define D_SENSOR_SDIO_D3 "SDIO D3" -#define D_SENSOR_BACKLIGHT "Retroilluminazione" +#define D_SENSOR_SDIO_CMD "SDIO - CMD" +#define D_SENSOR_SDIO_CLK "SDIO - CLK" +#define D_SENSOR_SDIO_D0 "SDIO - D0" +#define D_SENSOR_SDIO_D1 "SDIO - D1" +#define D_SENSOR_SDIO_D2 "SDIO - D2" +#define D_SENSOR_SDIO_D3 "SDIO - D3" +#define D_SENSOR_BACKLIGHT "Retroilluminazione" #define D_SENSOR_PMS5003_TX "PMS5003 - TX" #define D_SENSOR_PMS5003_RX "PMS5003 - RX" #define D_SENSOR_SDS0X1_RX "SDS0X1 - RX" From 224ad9d4a18e25966cd8342fb4c8e6428d48fc65 Mon Sep 17 00:00:00 2001 From: Adrian Scillato Date: Wed, 20 Apr 2022 11:06:13 -0300 Subject: [PATCH 043/376] ZB: Add Logs for CIE registration and Zone Enroll --- tasmota/xdrv_23_zigbee_8_parsers.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index 0e1abe0a4..f728e1827 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -1412,6 +1412,7 @@ void Z_SendSingleAttributeRead(uint16_t shortaddr, uint16_t groupaddr, uint16_t // Write CIE address // void Z_WriteCIEAddress(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uint8_t endpoint, uint32_t value) { + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Sending CIE Address for Cluster %d in Endpoint %d of Device 0x%04X"), cluster, endpoint, shortaddr); ZCLMessage zcl(12); // message is 12 bytes zcl.shortaddr = shortaddr; zcl.cluster = 0x0500; @@ -1428,15 +1429,15 @@ void Z_WriteCIEAddress(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, // -// Write CIE address +// Send CIE Zone Enroll Response // void Z_SendCIEZoneEnrollResponse(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uint8_t endpoint, uint32_t value) { - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Sending Enroll Zone %d"), Z_B0(value)); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Sending Enroll Zone %d for Cluster %d in Endpoint %d of Device 0x%04X"), Z_B0(value), cluster, endpoint, shortaddr); ZCLMessage zcl(2); // message is 2 bytes zcl.shortaddr = shortaddr; zcl.cluster = 0x0500; zcl.endpoint = endpoint; - zcl.cmd = 0x00, // Zone Enroll Response + zcl.cmd = 0x00; // Zone Enroll Response zcl.clusterSpecific = true; zcl.needResponse = true; zcl.direct = false; // discover route From b2bdfa1257e1d25a9b4677ebb367539a17d35ef3 Mon Sep 17 00:00:00 2001 From: Adrian Scillato Date: Wed, 20 Apr 2022 11:16:22 -0300 Subject: [PATCH 044/376] ZB: Add commands CIE registration and Zone Enroll --- tasmota/xdrv_23_zigbee_A_impl.ino | 39 ++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 41ee70119..8abe92121 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -39,7 +39,7 @@ const char kZbCommands[] PROGMEM = D_PRFX_ZB "|" // prefix D_CMND_ZIGBEE_BIND "|" D_CMND_ZIGBEE_UNBIND "|" D_CMND_ZIGBEE_PING "|" D_CMND_ZIGBEE_MODELID "|" D_CMND_ZIGBEE_LIGHT "|" D_CMND_ZIGBEE_OCCUPANCY "|" D_CMND_ZIGBEE_RESTORE "|" D_CMND_ZIGBEE_BIND_STATE "|" D_CMND_ZIGBEE_MAP "|" D_CMND_ZIGBEE_LEAVE "|" - D_CMND_ZIGBEE_CONFIG "|" D_CMND_ZIGBEE_DATA "|" D_CMND_ZIGBEE_SCAN + D_CMND_ZIGBEE_CONFIG "|" D_CMND_ZIGBEE_DATA "|" D_CMND_ZIGBEE_SCAN "|" D_CMND_ZIGBEE_ENROLL "|" D_CMND_ZIGBEE_CIE ; SO_SYNONYMS(kZbSynonyms, @@ -61,6 +61,7 @@ void (* const ZigbeeCommand[])(void) PROGMEM = { &CmndZbLight, &CmndZbOccupancy, &CmndZbRestore, &CmndZbBindState, &CmndZbMap, &CmndZbLeave, &CmndZbConfig, &CmndZbData, &CmndZbScan, + &CmndZbenroll, &CmndZbcie, }; /********************************************************************************************/ @@ -1331,6 +1332,42 @@ void CmndZbScan(void) { ResponseCmndDone(); } +void CmndZbenroll(void) { + if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } + + if ((XdrvMailbox.data_len) && (ArgC() > 1)) { // Process parameter entry + char argument[XdrvMailbox.data_len]; + Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1)); + int enrollEndpoint = atoi(ArgV(argument, 2)); + + if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } + + Z_SendCIEZoneEnrollResponse(device.shortaddr, 0, 500, enrollEndpoint, 1); + + ResponseCmndDone(); + } else { + ResponseCmndError(); + } +} + +void CmndZbcie(void) { + if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } + + if ((XdrvMailbox.data_len) && (ArgC() > 1)) { // Process parameter entry + char argument[XdrvMailbox.data_len]; + Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1)); + int enrollEndpoint = atoi(ArgV(argument, 2)); + + if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } + + Z_WriteCIEAddress(device.shortaddr, 0, 500, enrollEndpoint, 0); + + ResponseCmndDone(); + } else { + ResponseCmndError(); + } +} + // Restore a device configuration previously exported via `ZbStatus2`` // Format: // Either the entire `ZbStatus3` export, or an array or just the device configuration. From ef485e295fe9eb3a5d1287eef0bae01728ef601b Mon Sep 17 00:00:00 2001 From: Adrian Scillato Date: Wed, 20 Apr 2022 11:19:03 -0300 Subject: [PATCH 045/376] ZB: Add new ZigBee commands --- tasmota/i18n.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index c2f94c48a..473bd8b4a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -659,6 +659,8 @@ #define D_CMND_ZIGBEE_DATA "Data" #define D_CMND_ZIGBEE_SCAN "Scan" #define D_JSON_ZIGBEE_SCAN "ZbScan" +#define D_CMND_ZIGBEE_CIE "CIE" +#define D_CMND_ZIGBEE_ENROLL "Enroll" // Commands xdrv_25_A4988_Stepper.ino #define D_CMND_MOTOR "MOTOR" From 11e860eb6f37a14caeca99b68f2153d375ca1d40 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <39969427+ascillato2@users.noreply.github.com> Date: Wed, 20 Apr 2022 12:40:07 -0300 Subject: [PATCH 046/376] Fix Backlog0 in rules --- tasmota/xdrv_10_rules.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index edb995930..c630676a1 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -772,8 +772,7 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved) // Use Backlog with event to prevent rule event loop exception unless IF is used which uses an implicit backlog if ((ucommand.indexOf(F("IF ")) == -1) && (ucommand.indexOf(F("EVENT ")) != -1) && - (ucommand.indexOf(F("BACKLOG0 ")) == -1) && - (ucommand.indexOf(F("BACKLOG ")) == -1)) { + (ucommand.indexOf(F("BACKLOG")) == -1)) { commands = String(F("backlog ")) + commands; } From 71010423eb8a9f5024d91032b8e8ddbd77ae7d5c Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 20 Apr 2022 22:57:07 +0200 Subject: [PATCH 047/376] Sync with latest Berry PRs --- lib/libesp32/berry/src/be_byteslib.c | 2 ++ lib/libesp32/berry/src/be_object.h | 1 - lib/libesp32/berry/src/be_var.c | 2 +- lib/libesp32/berry/src/be_vm.h | 1 + lib/libesp32/berry/tests/bytes.be | 41 ++++---------------------- lib/libesp32/berry/tests/class.be | 13 ++++++++ lib/libesp32/berry/tests/int.be | 8 +++++ lib/libesp32/berry/tests/introspect.be | 5 ++++ 8 files changed, 35 insertions(+), 38 deletions(-) create mode 100644 lib/libesp32/berry/tests/int.be diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index b9b4ad3b9..aab229839 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -1502,6 +1502,8 @@ void be_load_byteslib(bvm *vm) { "geti", m_geti }, { "set", m_set }, { "seti", m_set }, // setters for signed and unsigned are identical + { "getfloat", m_getfloat }, + { "setfloat", m_setfloat }, { "item", m_item }, { "setitem", m_setitem }, { "size", m_size }, diff --git a/lib/libesp32/berry/src/be_object.h b/lib/libesp32/berry/src/be_object.h index 67e79bcdf..56bf03a9b 100644 --- a/lib/libesp32/berry/src/be_object.h +++ b/lib/libesp32/berry/src/be_object.h @@ -44,7 +44,6 @@ /* values for bproto.varg */ #define BE_VA_VARARG (1 << 0) /* function has variable number of arguments */ #define BE_VA_METHOD (1 << 1) /* function is a method (this is only a hint) */ - #define array_count(a) (sizeof(a) / sizeof((a)[0])) #define bcommon_header \ diff --git a/lib/libesp32/berry/src/be_var.c b/lib/libesp32/berry/src/be_var.c index 59f50f28b..9960e7cc3 100644 --- a/lib/libesp32/berry/src/be_var.c +++ b/lib/libesp32/berry/src/be_var.c @@ -55,7 +55,7 @@ static int global_native_class_find(bvm *vm, bstring *name) /* class name matches */ int idx = be_global_new(vm, name); bvalue *v = be_global_var(vm, idx); - var_setclass(v, cl); + var_setclass(v, (void*) cl); return idx; } } diff --git a/lib/libesp32/berry/src/be_vm.h b/lib/libesp32/berry/src/be_vm.h index 97d5a04d1..a2427277a 100644 --- a/lib/libesp32/berry/src/be_vm.h +++ b/lib/libesp32/berry/src/be_vm.h @@ -84,6 +84,7 @@ struct bupval { } u; int refcnt; }; + struct bvm { bglobaldesc gbldesc; /* global description */ bvalue *stack; /* stack space */ diff --git a/lib/libesp32/berry/tests/bytes.be b/lib/libesp32/berry/tests/bytes.be index 9ca9bda13..c0cef873a 100644 --- a/lib/libesp32/berry/tests/bytes.be +++ b/lib/libesp32/berry/tests/bytes.be @@ -184,40 +184,9 @@ assert(b[-10..-5] == bytes("66778899AABB")) assert(b[5..-10] == bytes("5566")) assert(b[7..-12] == bytes()) -#- floats little endian -# +#- float -# b = bytes("00000000") -b.setfloat(0, 0) -assert(b == bytes("00000000")) -b.setfloat(0, 1) -assert(b == bytes("0000803F")) -b.setfloat(0, -1) -assert(b == bytes("000080BF")) -b.setfloat(0, 3.5) -assert(b == bytes("00006040")) -import math -b.setfloat(0, math.nan) -assert(b == bytes("0000C07F")) - -assert(bytes("00000000").getfloat(0) == 0) -assert(bytes("0000803F").getfloat(0) == 1) -assert(bytes("000080BF").getfloat(0) == -1) -assert(bytes("00006040").getfloat(0) == 3.5) - -#- floats big endian -# -b = bytes("00000000") -b.setfloat(0, 0, true) -assert(b == bytes("00000000")) -b.setfloat(0, 1, true) -assert(b == bytes("3F800000")) -b.setfloat(0, -1, true) -assert(b == bytes("BF800000")) -b.setfloat(0, 3.5, true) -assert(b == bytes("40600000")) -import math -b.setfloat(0, math.nan, true) -assert(b == bytes("7FC00000")) - -assert(bytes("00000000").getfloat(0, true) == 0) -assert(bytes("3F800000").getfloat(0, true) == 1) -assert(bytes("BF800000").getfloat(0, true) == -1) -assert(bytes("40600000").getfloat(0, true) == 3.5) +b.setfloat(0, 0.33) +assert(b == bytes('C3F5A83E')) +b = bytes("0000C03F") +assert(b.getfloat(0) == 1.5) diff --git a/lib/libesp32/berry/tests/class.be b/lib/libesp32/berry/tests/class.be index 8c194a175..e175fcdca 100644 --- a/lib/libesp32/berry/tests/class.be +++ b/lib/libesp32/berry/tests/class.be @@ -45,3 +45,16 @@ assert(c2.C1 == C) c3 = m.C2(m.C()) assert(type(c3.C1) == 'instance') assert(classname(c3.C1) == 'C') + +#- an instance member can be a class and called directly -# +class Test_class + var c + def init() + self.c = map + end +end +c4 = Test_class() +assert(type(c4.c) == 'class') +c5 = c4.c() +assert(type(c5) == 'instance') +assert(classname(c5) == 'map') \ No newline at end of file diff --git a/lib/libesp32/berry/tests/int.be b/lib/libesp32/berry/tests/int.be new file mode 100644 index 000000000..d5a7c79e9 --- /dev/null +++ b/lib/libesp32/berry/tests/int.be @@ -0,0 +1,8 @@ +#- toint() converts any instance to int -# +class Test_int + def toint() + return 42 + end +end +t=Test_int() +assert(int(t) == 42) diff --git a/lib/libesp32/berry/tests/introspect.be b/lib/libesp32/berry/tests/introspect.be index 91531f57a..cb4a612d8 100644 --- a/lib/libesp32/berry/tests/introspect.be +++ b/lib/libesp32/berry/tests/introspect.be @@ -26,3 +26,8 @@ assert(introspect.get(a, 'a') == nil) introspect.set(a, 'a', 3) assert(a.a == 3) + +#- load module dynamically -# +import introspect +m = introspect.module("math") # load module `math`, assign to `m` and don't create a global variable +assert(type(m.pi) == 'real') From 772e2bddae38a193c3e4561eda191a4eb4efb67a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 21 Apr 2022 16:54:30 +0200 Subject: [PATCH 048/376] Fix BL0942 negative power Fix BL0942 negative power (#15374) --- tasmota/xnrg_14_bl09xx.ino | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tasmota/xnrg_14_bl09xx.ino b/tasmota/xnrg_14_bl09xx.ino index 64036191b..f73a276b8 100644 --- a/tasmota/xnrg_14_bl09xx.ino +++ b/tasmota/xnrg_14_bl09xx.ino @@ -171,8 +171,12 @@ bool Bl09XXDecode42(void) { Bl09XX.voltage = Bl09XX.rx_buffer[6] << 16 | Bl09XX.rx_buffer[5] << 8 | Bl09XX.rx_buffer[4]; // V_RMS unsigned Bl09XX.current[0] = Bl09XX.rx_buffer[3] << 16 | Bl09XX.rx_buffer[2] << 8 | Bl09XX.rx_buffer[1]; // IA_RMS unsigned - Bl09XX.power[0] = Bl09XX.rx_buffer[12] << 16 | Bl09XX.rx_buffer[11] << 8 | Bl09XX.rx_buffer[10]; // WATT_A signed - if (bitRead(Bl09XX.power[0], 23)) { Bl09XX.power[0] |= 0xFF000000; } // Extend sign bit + +// Bl09XX.power[0] = Bl09XX.rx_buffer[12] << 16 | Bl09XX.rx_buffer[11] << 8 | Bl09XX.rx_buffer[10]; // WATT_A signed +// if (bitRead(Bl09XX.power[0], 23)) { Bl09XX.power[0] |= 0xFF000000; } // Extend sign bit + // Above reverted in favour of https://github.com/arendst/Tasmota/issues/15374#issuecomment-1105293179 + int32_t tmp = Bl09XX.rx_buffer[12] << 24 | Bl09XX.rx_buffer[11] << 16 | Bl09XX.rx_buffer[10] << 8; // WATT_A signed + Bl09XX.power[0] = abs(tmp >> 8); #ifdef DEBUG_BL09XX AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("BL9: U %d, I %d, P %d"), From c035f1980807e11fe9831a8ef86cc6f2ff846818 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 22 Apr 2022 13:59:06 +0200 Subject: [PATCH 049/376] Update platform-espressif32 framework --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index d8cbe887b..8c604f663 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -38,7 +38,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 235b880d595c5fcdf8c8c3cc20591b9f14d12eb6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 22 Apr 2022 17:52:53 +0200 Subject: [PATCH 050/376] Add logging when bad HTTP userid and/or password Add logging when bad HTTP userid and/or password (#15420) --- tasmota/xdrv_01_webserver.ino | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 444eaa43d..07443ee31 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2901,6 +2901,10 @@ void HandleHttpCommand(void) WSContentBegin(401, CT_APP_JSON); WSContentSend_P(PSTR("{\"" D_RSLT_WARNING "\":\"" D_NEED_USER_AND_PASSWORD "\"}")); WSContentEnd(); + + // https://github.com/arendst/Tasmota/discussions/15420 + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Bad userid and/or password")); + return; } } From 81a8ff273a1eba3b94b7951ddcbb91808c081984 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 22 Apr 2022 22:36:45 +0200 Subject: [PATCH 051/376] OpenHASP memory optimization --- .../berry_mapping/src/be_class_wrapper.c | 3 + .../berry_tasmota/src/be_lv_openhasp.c | 1367 +++++++++-------- .../generate/be_lv_c_mapping.h | 4 +- .../lv_binding_berry/tools/convert.py | 2 +- .../openhasp_src/openhasp_core/openhasp.be | 80 +- 5 files changed, 806 insertions(+), 650 deletions(-) diff --git a/lib/libesp32/berry_mapping/src/be_class_wrapper.c b/lib/libesp32/berry_mapping/src/be_class_wrapper.c index 0458b1c97..2591477ce 100644 --- a/lib/libesp32/berry_mapping/src/be_class_wrapper.c +++ b/lib/libesp32/berry_mapping/src/be_class_wrapper.c @@ -195,6 +195,9 @@ intptr_t be_convert_single_elt(bvm *vm, int idx, const char * arg_type, int *buf } else { be_raisef(vm, "type_error", "Can't find callback generator: 'cb.make_cb'"); } + } else if (be_iscomptr(vm, idx)) { + // if it's a pointer, just pass it without any change + return (int32_t) be_tocomptr(vm, idx);; } else { be_raise(vm, "type_error", "Closure expected for callback type"); } diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index 16083837f..bac85fe1d 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -2004,72 +2004,44 @@ be_local_closure(lvh_obj_check_label, /* name */ ********************************************************************/ be_local_closure(lvh_obj_register_event_cb, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("event_cb"), - }), - be_str_literal(""), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x68080000, // 0000 GETUPV R2 U0 - 0x8C080500, // 0001 GETMET R2 R2 K0 - 0x5C100000, // 0002 MOVE R4 R0 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C080600, // 0004 CALL R2 3 - 0x80040400, // 0005 RET 1 R2 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_literal("_event_map"), - /* K1 */ be_nested_str_literal("keys"), - /* K2 */ be_nested_str_literal("_lv_obj"), - /* K3 */ be_nested_str_literal("add_event_cb"), - /* K4 */ be_const_int(0), + /* K0 */ be_nested_str_literal("_page"), + /* K1 */ be_nested_str_literal("_oh"), + /* K2 */ be_nested_str_literal("_event_map"), + /* K3 */ be_nested_str_literal("keys"), + /* K4 */ be_nested_str_literal("register_event"), /* K5 */ be_nested_str_literal("stop_iteration"), }), be_str_literal("register_event_cb"), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x84040000, // 0000 CLOSURE R1 P0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x880C0100, // 0002 GETMBR R3 R0 K0 - 0x8C0C0701, // 0003 GETMET R3 R3 K1 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020008, // 0006 EXBLK 0 #0010 - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x88100102, // 0009 GETMBR R4 R0 K2 - 0x8C100903, // 000A GETMET R4 R4 K3 - 0x5C180200, // 000B MOVE R6 R1 + ( &(const binstruction[19]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x60080010, // 0002 GETGBL R2 G16 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x8C0C0703, // 0004 GETMET R3 R3 K3 + 0x7C0C0200, // 0005 CALL R3 1 + 0x7C080200, // 0006 CALL R2 1 + 0xA8020006, // 0007 EXBLK 0 #000F + 0x5C0C0400, // 0008 MOVE R3 R2 + 0x7C0C0000, // 0009 CALL R3 0 + 0x8C100304, // 000A GETMET R4 R1 K4 + 0x5C180000, // 000B MOVE R6 R0 0x5C1C0600, // 000C MOVE R7 R3 - 0x58200004, // 000D LDCONST R8 K4 - 0x7C100800, // 000E CALL R4 4 - 0x7001FFF6, // 000F JMP #0007 - 0x58080005, // 0010 LDCONST R2 K5 - 0xAC080200, // 0011 CATCH R2 1 0 - 0xB0080000, // 0012 RAISE 2 R0 R0 - 0xA0000000, // 0013 CLOSE R0 - 0x80000000, // 0014 RET 0 + 0x7C100600, // 000D CALL R4 3 + 0x7001FFF8, // 000E JMP #0008 + 0x58080005, // 000F LDCONST R2 K5 + 0xAC080200, // 0010 CATCH R2 1 0 + 0xB0080000, // 0011 RAISE 2 R0 R0 + 0x80000000, // 0012 RET 0 }) ) ); @@ -3326,8 +3298,8 @@ be_local_closure(lvh_obj_get_text_color, /* name */ ********************************************************************/ be_local_closure(lvh_obj_event_cb, /* name */ be_nested_proto( - 13, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -3339,9 +3311,9 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 3]) { /* upvals */ - be_local_const_upval(1, 3), + be_local_const_upval(1, 2), be_local_const_upval(1, 0), - be_local_const_upval(1, 4), + be_local_const_upval(1, 3), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -3366,7 +3338,7 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 7), + be_local_const_upval(1, 6), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -3408,43 +3380,43 @@ be_local_closure(lvh_obj_event_cb, /* name */ be_str_literal("event_cb"), &be_const_str_solidified, ( &(const binstruction[39]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x4C180000, // 0004 LDNIL R6 - 0x20140A06, // 0005 NE R5 R5 R6 - 0x78160008, // 0006 JMPF R5 #0010 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x88140B05, // 0008 GETMBR R5 R5 K5 - 0x1C140805, // 0009 EQ R5 R4 R5 - 0x78160004, // 000A JMPF R5 #0010 - 0xB8160C00, // 000B GETNGBL R5 K6 - 0x8C140B07, // 000C GETMET R5 R5 K7 - 0x581C0008, // 000D LDCONST R7 K8 - 0x84200000, // 000E CLOSURE R8 P0 - 0x7C140600, // 000F CALL R5 3 - 0x88140109, // 0010 GETMBR R5 R0 K9 - 0x8C140B0A, // 0011 GETMET R5 R5 K10 - 0x5C1C0800, // 0012 MOVE R7 R4 - 0x7C140400, // 0013 CALL R5 2 - 0x4C180000, // 0014 LDNIL R6 - 0x20180A06, // 0015 NE R6 R5 R6 - 0x781A000D, // 0016 JMPF R6 #0025 - 0xA41A1600, // 0017 IMPORT R6 K11 - 0x8C1C0D0C, // 0018 GETMET R7 R6 K12 - 0x5824000D, // 0019 LDCONST R9 K13 - 0x88280100, // 001A GETMBR R10 R0 K0 - 0x8828150E, // 001B GETMBR R10 R10 K14 - 0x882C010F, // 001C GETMBR R11 R0 K15 - 0x5C300A00, // 001D MOVE R12 R5 - 0x7C1C0A00, // 001E CALL R7 5 - 0xB8220C00, // 001F GETNGBL R8 K6 - 0x8C201107, // 0020 GETMET R8 R8 K7 - 0x58280008, // 0021 LDCONST R10 K8 - 0x842C0001, // 0022 CLOSURE R11 P1 - 0x7C200600, // 0023 CALL R8 3 - 0xA0180000, // 0024 CLOSE R6 + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x880C0302, // 0002 GETMBR R3 R1 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x4C140000, // 0004 LDNIL R5 + 0x20100805, // 0005 NE R4 R4 R5 + 0x78120008, // 0006 JMPF R4 #0010 + 0xB8120800, // 0007 GETNGBL R4 K4 + 0x88100905, // 0008 GETMBR R4 R4 K5 + 0x1C100604, // 0009 EQ R4 R3 R4 + 0x78120004, // 000A JMPF R4 #0010 + 0xB8120C00, // 000B GETNGBL R4 K6 + 0x8C100907, // 000C GETMET R4 R4 K7 + 0x58180008, // 000D LDCONST R6 K8 + 0x841C0000, // 000E CLOSURE R7 P0 + 0x7C100600, // 000F CALL R4 3 + 0x88100109, // 0010 GETMBR R4 R0 K9 + 0x8C10090A, // 0011 GETMET R4 R4 K10 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x4C140000, // 0014 LDNIL R5 + 0x20140805, // 0015 NE R5 R4 R5 + 0x7816000D, // 0016 JMPF R5 #0025 + 0xA4161600, // 0017 IMPORT R5 K11 + 0x8C180B0C, // 0018 GETMET R6 R5 K12 + 0x5820000D, // 0019 LDCONST R8 K13 + 0x88240100, // 001A GETMBR R9 R0 K0 + 0x8824130E, // 001B GETMBR R9 R9 K14 + 0x8828010F, // 001C GETMBR R10 R0 K15 + 0x5C2C0800, // 001D MOVE R11 R4 + 0x7C180A00, // 001E CALL R6 5 + 0xB81E0C00, // 001F GETNGBL R7 K6 + 0x8C1C0F07, // 0020 GETMET R7 R7 K7 + 0x58240008, // 0021 LDCONST R9 K8 + 0x84280001, // 0022 CLOSURE R10 P1 + 0x7C1C0600, // 0023 CALL R7 3 + 0xA0140000, // 0024 CLOSE R5 0xA0000000, // 0025 CLOSE R0 0x80000000, // 0026 RET 0 }) @@ -4692,198 +4664,6 @@ be_local_closure(openhasp__anonymous_, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_page_cur -********************************************************************/ -be_local_closure(OpenHASP_get_page_cur, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("lvh_pages"), - /* K1 */ be_nested_str_literal("lvh_page_cur_idx"), - }), - be_str_literal("get_page_cur"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x94040401, // 0002 GETIDX R1 R2 R1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(OpenHASP_start, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[33]) { /* constants */ - /* K0 */ be_nested_str_literal("path"), - /* K1 */ be_nested_str_literal("def_templ_name"), - /* K2 */ be_nested_str_literal("exists"), - /* K3 */ be_nested_str_literal("file '"), - /* K4 */ be_nested_str_literal("' not found"), - /* K5 */ be_nested_str_literal("io_erorr"), - /* K6 */ be_nested_str_literal("lv"), - /* K7 */ be_nested_str_literal("start"), - /* K8 */ be_nested_str_literal("dark"), - /* K9 */ be_nested_str_literal("hres"), - /* K10 */ be_nested_str_literal("get_hor_res"), - /* K11 */ be_nested_str_literal("vres"), - /* K12 */ be_nested_str_literal("get_ver_res"), - /* K13 */ be_nested_str_literal("scr"), - /* K14 */ be_nested_str_literal("scr_act"), - /* K15 */ be_nested_str_literal("r16"), - /* K16 */ be_nested_str_literal("font_embedded"), - /* K17 */ be_nested_str_literal("robotocondensed"), - /* K18 */ be_nested_str_literal("montserrat"), - /* K19 */ be_nested_str_literal("theme_openhasp_init"), - /* K20 */ be_const_int(0), - /* K21 */ be_nested_str_literal("color"), - /* K22 */ be_const_int(16711935), - /* K23 */ be_const_int(3158064), - /* K24 */ be_nested_str_literal("get_disp"), - /* K25 */ be_nested_str_literal("set_theme"), - /* K26 */ be_nested_str_literal("set_style_bg_color"), - /* K27 */ be_const_int(16777215), - /* K28 */ be_nested_str_literal("theme_apply"), - /* K29 */ be_nested_str_literal("layer_top"), - /* K30 */ be_nested_str_literal("set_style_bg_opa"), - /* K31 */ be_nested_str_literal("lvh_pages"), - /* K32 */ be_nested_str_literal("_load"), - }), - be_str_literal("start"), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C100404, // 0002 EQ R4 R2 R4 - 0x78120000, // 0003 JMPF R4 #0005 - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C100702, // 0005 GETMET R4 R3 K2 - 0x5C180400, // 0006 MOVE R6 R2 - 0x7C100400, // 0007 CALL R4 2 - 0x74120002, // 0008 JMPT R4 #000C - 0x00120602, // 0009 ADD R4 K3 R2 - 0x00100904, // 000A ADD R4 R4 K4 - 0xB0060A04, // 000B RAISE 1 K5 R4 - 0xB8120C00, // 000C GETNGBL R4 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0x7C100200, // 000E CALL R4 1 - 0x60100017, // 000F GETGBL R4 G23 - 0x5C140200, // 0010 MOVE R5 R1 - 0x7C100200, // 0011 CALL R4 1 - 0x90021004, // 0012 SETMBR R0 K8 R4 - 0xB8120C00, // 0013 GETNGBL R4 K6 - 0x8C10090A, // 0014 GETMET R4 R4 K10 - 0x7C100200, // 0015 CALL R4 1 - 0x90021204, // 0016 SETMBR R0 K9 R4 - 0xB8120C00, // 0017 GETNGBL R4 K6 - 0x8C10090C, // 0018 GETMET R4 R4 K12 - 0x7C100200, // 0019 CALL R4 1 - 0x90021604, // 001A SETMBR R0 K11 R4 - 0xB8120C00, // 001B GETNGBL R4 K6 - 0x8C10090E, // 001C GETMET R4 R4 K14 - 0x7C100200, // 001D CALL R4 1 - 0x90021A04, // 001E SETMBR R0 K13 R4 - 0xA8020007, // 001F EXBLK 0 #0028 - 0xB8120C00, // 0020 GETNGBL R4 K6 - 0x8C100910, // 0021 GETMET R4 R4 K16 - 0x58180011, // 0022 LDCONST R6 K17 - 0x541E000F, // 0023 LDINT R7 16 - 0x7C100600, // 0024 CALL R4 3 - 0x90021E04, // 0025 SETMBR R0 K15 R4 - 0xA8040001, // 0026 EXBLK 1 1 - 0x70020009, // 0027 JMP #0032 - 0xAC100000, // 0028 CATCH R4 0 0 - 0x70020006, // 0029 JMP #0031 - 0xB8120C00, // 002A GETNGBL R4 K6 - 0x8C100910, // 002B GETMET R4 R4 K16 - 0x58180012, // 002C LDCONST R6 K18 - 0x541E000D, // 002D LDINT R7 14 - 0x7C100600, // 002E CALL R4 3 - 0x90021E04, // 002F SETMBR R0 K15 R4 - 0x70020000, // 0030 JMP #0032 - 0xB0080000, // 0031 RAISE 2 R0 R0 - 0xB8120C00, // 0032 GETNGBL R4 K6 - 0x8C100913, // 0033 GETMET R4 R4 K19 - 0x58180014, // 0034 LDCONST R6 K20 - 0xB81E0C00, // 0035 GETNGBL R7 K6 - 0x8C1C0F15, // 0036 GETMET R7 R7 K21 - 0x58240016, // 0037 LDCONST R9 K22 - 0x7C1C0400, // 0038 CALL R7 2 - 0xB8220C00, // 0039 GETNGBL R8 K6 - 0x8C201115, // 003A GETMET R8 R8 K21 - 0x58280017, // 003B LDCONST R10 K23 - 0x7C200400, // 003C CALL R8 2 - 0x88240108, // 003D GETMBR R9 R0 K8 - 0x8828010F, // 003E GETMBR R10 R0 K15 - 0x7C100C00, // 003F CALL R4 6 - 0x8814010D, // 0040 GETMBR R5 R0 K13 - 0x8C140B18, // 0041 GETMET R5 R5 K24 - 0x7C140200, // 0042 CALL R5 1 - 0x8C140B19, // 0043 GETMET R5 R5 K25 - 0x5C1C0800, // 0044 MOVE R7 R4 - 0x7C140400, // 0045 CALL R5 2 - 0x8814010D, // 0046 GETMBR R5 R0 K13 - 0x8C140B1A, // 0047 GETMET R5 R5 K26 - 0x881C0108, // 0048 GETMBR R7 R0 K8 - 0x781E0004, // 0049 JMPF R7 #004F - 0xB81E0C00, // 004A GETNGBL R7 K6 - 0x8C1C0F15, // 004B GETMET R7 R7 K21 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C1C0400, // 004D CALL R7 2 - 0x70020003, // 004E JMP #0053 - 0xB81E0C00, // 004F GETNGBL R7 K6 - 0x8C1C0F15, // 0050 GETMET R7 R7 K21 - 0x5824001B, // 0051 LDCONST R9 K27 - 0x7C1C0400, // 0052 CALL R7 2 - 0x58200014, // 0053 LDCONST R8 K20 - 0x7C140600, // 0054 CALL R5 3 - 0xB8160C00, // 0055 GETNGBL R5 K6 - 0x8C140B1C, // 0056 GETMET R5 R5 K28 - 0xB81E0C00, // 0057 GETNGBL R7 K6 - 0x8C1C0F1D, // 0058 GETMET R7 R7 K29 - 0x7C1C0200, // 0059 CALL R7 1 - 0x7C140400, // 005A CALL R5 2 - 0xB8160C00, // 005B GETNGBL R5 K6 - 0x8C140B1D, // 005C GETMET R5 R5 K29 - 0x7C140200, // 005D CALL R5 1 - 0x8C140B1E, // 005E GETMET R5 R5 K30 - 0x581C0014, // 005F LDCONST R7 K20 - 0x58200014, // 0060 LDCONST R8 K20 - 0x7C140600, // 0061 CALL R5 3 - 0x60140013, // 0062 GETGBL R5 G19 - 0x7C140000, // 0063 CALL R5 0 - 0x90023E05, // 0064 SETMBR R0 K31 R5 - 0x8C140120, // 0065 GETMET R5 R0 K32 - 0x5C1C0400, // 0066 MOVE R7 R2 - 0x7C140400, // 0067 CALL R5 2 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: pages_list_sorted ********************************************************************/ @@ -4964,60 +4744,6 @@ be_local_closure(OpenHASP_pages_list_sorted, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse -********************************************************************/ -be_local_closure(OpenHASP_parse, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_literal("json"), - /* K1 */ be_nested_str_literal("load"), - /* K2 */ be_nested_str_literal("instance"), - /* K3 */ be_nested_str_literal("parse_page"), - /* K4 */ be_nested_str_literal("parse_obj"), - /* K5 */ be_nested_str_literal("lvh_pages"), - /* K6 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K7 */ be_nested_str_literal("value_error"), - /* K8 */ be_nested_str_literal("unable to parse JSON line"), - }), - be_str_literal("parse"), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x60100004, // 0004 GETGBL R4 G4 - 0x5C140600, // 0005 MOVE R5 R3 - 0x7C100200, // 0006 CALL R4 1 - 0x1C100902, // 0007 EQ R4 R4 K2 - 0x78120009, // 0008 JMPF R4 #0013 - 0x8C100103, // 0009 GETMET R4 R0 K3 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x8C100104, // 000C GETMET R4 R0 K4 - 0x5C180600, // 000D MOVE R6 R3 - 0x881C0106, // 000E GETMBR R7 R0 K6 - 0x88200105, // 000F GETMBR R8 R0 K5 - 0x941C1007, // 0010 GETIDX R7 R8 R7 - 0x7C100600, // 0011 CALL R4 3 - 0x70020000, // 0012 JMP #0014 - 0xB0060F08, // 0013 RAISE 1 K7 K8 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_obj ********************************************************************/ @@ -5263,33 +4989,130 @@ be_local_closure(OpenHASP_parse_obj, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: event_dispatch ********************************************************************/ -be_local_closure(OpenHASP_init, /* name */ +be_local_closure(OpenHASP_event_dispatch, /* name */ be_nested_proto( - 5, /* nstack */ - 1, /* argc */ + 9, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("re"), - /* K1 */ be_nested_str_literal("re_page_target"), - /* K2 */ be_nested_str_literal("compile"), - /* K3 */ be_nested_str_literal("p\\d+"), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_literal("introspect"), + /* K1 */ be_nested_str_literal("toptr"), + /* K2 */ be_nested_str_literal("event"), + /* K3 */ be_nested_str_literal("_change_buffer"), + /* K4 */ be_nested_str_literal("lv"), + /* K5 */ be_nested_str_literal("lv_event"), + /* K6 */ be_nested_str_literal("user_data"), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_literal("fromptr"), + /* K9 */ be_nested_str_literal("instance"), + /* K10 */ be_nested_str_literal("event_cb"), }), - be_str_literal("init"), + be_str_literal("event_dispatch"), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080302, // 0001 GETMET R2 R1 K2 - 0x58100003, // 0002 LDCONST R4 K3 - 0x7C080400, // 0003 CALL R2 2 - 0x90020202, // 0004 SETMBR R0 K1 R2 - 0x80000000, // 0005 RET 0 + ( &(const binstruction[35]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x78120004, // 0005 JMPF R4 #000B + 0x88100102, // 0006 GETMBR R4 R0 K2 + 0x8C100903, // 0007 GETMET R4 R4 K3 + 0x5C180600, // 0008 MOVE R6 R3 + 0x7C100400, // 0009 CALL R4 2 + 0x70020004, // 000A JMP #0010 + 0xB8120800, // 000B GETNGBL R4 K4 + 0x8C100905, // 000C GETMET R4 R4 K5 + 0x5C180600, // 000D MOVE R6 R3 + 0x7C100400, // 000E CALL R4 2 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x88100102, // 0010 GETMBR R4 R0 K2 + 0x88100906, // 0011 GETMBR R4 R4 K6 + 0x60140009, // 0012 GETGBL R5 G9 + 0x5C180800, // 0013 MOVE R6 R4 + 0x7C140200, // 0014 CALL R5 1 + 0x20140B07, // 0015 NE R5 R5 K7 + 0x7816000A, // 0016 JMPF R5 #0022 + 0x8C140508, // 0017 GETMET R5 R2 K8 + 0x5C1C0800, // 0018 MOVE R7 R4 + 0x7C140400, // 0019 CALL R5 2 + 0x60180004, // 001A GETGBL R6 G4 + 0x5C1C0A00, // 001B MOVE R7 R5 + 0x7C180200, // 001C CALL R6 1 + 0x1C180D09, // 001D EQ R6 R6 K9 + 0x781A0002, // 001E JMPF R6 #0022 + 0x8C180B0A, // 001F GETMET R6 R5 K10 + 0x88200102, // 0020 GETMBR R8 R0 K2 + 0x7C180400, // 0021 CALL R6 2 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_dir_to +********************************************************************/ +be_local_closure(OpenHASP_page_dir_to, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("pages_list_sorted"), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(1), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_literal("find"), + }), + be_str_literal("page_dir_to"), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0403, // 0004 EQ R3 R2 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80060200, // 0006 RET 1 K1 + 0x600C000C, // 0007 GETGBL R3 G12 + 0x5C100400, // 0008 MOVE R4 R2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x18100702, // 000A LE R4 R3 K2 + 0x78120000, // 000B JMPF R4 #000D + 0x80060200, // 000C RET 1 K1 + 0x1C100703, // 000D EQ R4 R3 K3 + 0x78120000, // 000E JMPF R4 #0010 + 0x80060400, // 000F RET 1 K2 + 0x8C100504, // 0010 GETMET R4 R2 K4 + 0x5C180200, // 0011 MOVE R6 R1 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x1C140805, // 0014 EQ R5 R4 R5 + 0x78160000, // 0015 JMPF R5 #0017 + 0x80060200, // 0016 RET 1 K1 + 0x00140702, // 0017 ADD R5 R3 K2 + 0x0C140B03, // 0018 DIV R5 R5 K3 + 0x18140805, // 0019 LE R5 R4 R5 + 0x78160001, // 001A JMPF R5 #001D + 0x80060400, // 001B RET 1 K2 + 0x70020001, // 001C JMP #001F + 0x5415FFFE, // 001D LDINT R5 -1 + 0x80040A00, // 001E RET 1 R5 + 0x80000000, // 001F RET 0 }) ) ); @@ -5343,6 +5166,294 @@ be_local_closure(OpenHASP_deinit, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: parse_page +********************************************************************/ +be_local_closure(OpenHASP_parse_page, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_literal("has"), + /* K1 */ be_nested_str_literal("page"), + /* K2 */ be_nested_str_literal("int"), + /* K3 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K4 */ be_nested_str_literal("lvh_pages"), + /* K5 */ be_nested_str_literal("contains"), + /* K6 */ be_nested_str_literal("lvh_page"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("id"), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_literal("get_page_cur"), + /* K11 */ be_nested_str_literal("prev"), + /* K12 */ be_nested_str_literal("next"), + /* K13 */ be_nested_str_literal("back"), + }), + be_str_literal("parse_page"), + &be_const_str_solidified, + ( &(const binstruction[54]) { /* code */ + 0x8C080300, // 0000 GETMET R2 R1 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x780A0030, // 0003 JMPF R2 #0035 + 0x60080004, // 0004 GETGBL R2 G4 + 0x940C0301, // 0005 GETIDX R3 R1 K1 + 0x7C080200, // 0006 CALL R2 1 + 0x1C080502, // 0007 EQ R2 R2 K2 + 0x780A002B, // 0008 JMPF R2 #0035 + 0x60080009, // 0009 GETGBL R2 G9 + 0x940C0301, // 000A GETIDX R3 R1 K1 + 0x7C080200, // 000B CALL R2 1 + 0x90020602, // 000C SETMBR R0 K3 R2 + 0x880C0104, // 000D GETMBR R3 R0 K4 + 0x8C0C0705, // 000E GETMET R3 R3 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x740E0006, // 0011 JMPT R3 #0019 + 0x880C0106, // 0012 GETMBR R3 R0 K6 + 0x88100104, // 0013 GETMBR R4 R0 K4 + 0x5C140600, // 0014 MOVE R5 R3 + 0x5C180400, // 0015 MOVE R6 R2 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x7C140400, // 0017 CALL R5 2 + 0x98100405, // 0018 SETIDX R4 R2 R5 + 0x8C0C0307, // 0019 GETMET R3 R1 K7 + 0x58140008, // 001A LDCONST R5 K8 + 0x7C0C0400, // 001B CALL R3 2 + 0x1C0C0709, // 001C EQ R3 R3 K9 + 0x780E0016, // 001D JMPF R3 #0035 + 0x8C0C010A, // 001E GETMET R3 R0 K10 + 0x7C0C0200, // 001F CALL R3 1 + 0x60100009, // 0020 GETGBL R4 G9 + 0x8C140307, // 0021 GETMET R5 R1 K7 + 0x581C000B, // 0022 LDCONST R7 K11 + 0x4C200000, // 0023 LDNIL R8 + 0x7C140600, // 0024 CALL R5 3 + 0x7C100200, // 0025 CALL R4 1 + 0x900E1604, // 0026 SETMBR R3 K11 R4 + 0x60100009, // 0027 GETGBL R4 G9 + 0x8C140307, // 0028 GETMET R5 R1 K7 + 0x581C000C, // 0029 LDCONST R7 K12 + 0x4C200000, // 002A LDNIL R8 + 0x7C140600, // 002B CALL R5 3 + 0x7C100200, // 002C CALL R4 1 + 0x900E1804, // 002D SETMBR R3 K12 R4 + 0x60100009, // 002E GETGBL R4 G9 + 0x8C140307, // 002F GETMET R5 R1 K7 + 0x581C000D, // 0030 LDCONST R7 K13 + 0x4C200000, // 0031 LDNIL R8 + 0x7C140600, // 0032 CALL R5 3 + 0x7C100200, // 0033 CALL R4 1 + 0x900E1A04, // 0034 SETMBR R3 K13 R4 + 0x80000000, // 0035 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_event +********************************************************************/ +be_local_closure(OpenHASP_register_event, /* name */ + be_nested_proto( + 13, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("event_dispatch"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68040000, // 0000 GETUPV R1 U0 + 0x8C040300, // 0001 GETMET R1 R1 K0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_literal("cb"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_nested_str_literal("event_cb"), + /* K3 */ be_nested_str_literal("gen_cb"), + /* K4 */ be_nested_str_literal("_lv_obj"), + /* K5 */ be_nested_str_literal("add_event_cb"), + /* K6 */ be_nested_str_literal("toptr"), + }), + be_str_literal("register_event"), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x4C180000, // 0003 LDNIL R6 + 0x1C140A06, // 0004 EQ R5 R5 R6 + 0x78160003, // 0005 JMPF R5 #000A + 0x8C140703, // 0006 GETMET R5 R3 K3 + 0x841C0000, // 0007 CLOSURE R7 P0 + 0x7C140400, // 0008 CALL R5 2 + 0x90020405, // 0009 SETMBR R0 K2 R5 + 0x88140304, // 000A GETMBR R5 R1 K4 + 0x8C180B05, // 000B GETMET R6 R5 K5 + 0x88200102, // 000C GETMBR R8 R0 K2 + 0x5C240400, // 000D MOVE R9 R2 + 0x8C280906, // 000E GETMET R10 R4 K6 + 0x5C300200, // 000F MOVE R12 R1 + 0x7C280400, // 0010 CALL R10 2 + 0x7C180800, // 0011 CALL R6 4 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort +********************************************************************/ +be_local_closure(OpenHASP_sort, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_int(1), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_literal("stop_iteration"), + }), + be_str_literal("sort"), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x04080500, // 0004 SUB R2 R2 K0 + 0x400A0002, // 0005 CONNECT R2 K0 R2 + 0x7C040200, // 0006 CALL R1 1 + 0xA8020010, // 0007 EXBLK 0 #0019 + 0x5C080200, // 0008 MOVE R2 R1 + 0x7C080000, // 0009 CALL R2 0 + 0x940C0002, // 000A GETIDX R3 R0 R2 + 0x5C100400, // 000B MOVE R4 R2 + 0x24140901, // 000C GT R5 R4 K1 + 0x78160008, // 000D JMPF R5 #0017 + 0x04140900, // 000E SUB R5 R4 K0 + 0x94140005, // 000F GETIDX R5 R0 R5 + 0x24140A03, // 0010 GT R5 R5 R3 + 0x78160004, // 0011 JMPF R5 #0017 + 0x04140900, // 0012 SUB R5 R4 K0 + 0x94140005, // 0013 GETIDX R5 R0 R5 + 0x98000805, // 0014 SETIDX R0 R4 R5 + 0x04100900, // 0015 SUB R4 R4 K0 + 0x7001FFF4, // 0016 JMP #000C + 0x98000803, // 0017 SETIDX R0 R4 R3 + 0x7001FFEE, // 0018 JMP #0008 + 0x58040002, // 0019 LDCONST R1 K2 + 0xAC040200, // 001A CATCH R1 1 0 + 0xB0080000, // 001B RAISE 2 R0 R0 + 0x80040000, // 001C RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_page_cur +********************************************************************/ +be_local_closure(OpenHASP_get_page_cur, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("lvh_pages"), + /* K1 */ be_nested_str_literal("lvh_page_cur_idx"), + }), + be_str_literal("get_page_cur"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x94040401, // 0002 GETIDX R1 R2 R1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(OpenHASP_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("re"), + /* K1 */ be_nested_str_literal("re_page_target"), + /* K2 */ be_nested_str_literal("compile"), + /* K3 */ be_nested_str_literal("p\\d+"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080302, // 0001 GETMET R2 R1 K2 + 0x58100003, // 0002 LDCONST R4 K3 + 0x7C080400, // 0003 CALL R2 2 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: do_action ********************************************************************/ @@ -5460,7 +5571,7 @@ be_local_closure(OpenHASP_do_action, /* name */ ********************************************************************/ be_local_closure(OpenHASP__load, /* name */ be_nested_proto( - 15, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5468,7 +5579,7 @@ be_local_closure(OpenHASP__load, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_literal("string"), /* K1 */ be_nested_str_literal("json"), /* K2 */ be_nested_str_literal("lvh_page_cur_idx"), @@ -5476,19 +5587,20 @@ be_local_closure(OpenHASP__load, /* name */ /* K4 */ be_nested_str_literal("lvh_page"), /* K5 */ be_nested_str_literal("lvh_pages"), /* K6 */ be_nested_str_literal("r"), - /* K7 */ be_nested_str_literal("split"), - /* K8 */ be_nested_str_literal("read"), - /* K9 */ be_nested_str_literal("\n"), - /* K10 */ be_nested_str_literal("close"), - /* K11 */ be_nested_str_literal("load"), - /* K12 */ be_nested_str_literal("instance"), - /* K13 */ be_nested_str_literal("parse_page"), - /* K14 */ be_nested_str_literal("parse_obj"), - /* K15 */ be_nested_str_literal("stop_iteration"), + /* K7 */ be_nested_str_literal("read"), + /* K8 */ be_nested_str_literal("close"), + /* K9 */ be_nested_str_literal("split"), + /* K10 */ be_nested_str_literal("\n"), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_literal("load"), + /* K13 */ be_nested_str_literal("instance"), + /* K14 */ be_nested_str_literal("parse_page"), + /* K15 */ be_nested_str_literal("parse_obj"), + /* K16 */ be_nested_str_literal("remove"), }), be_str_literal("_load"), &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ + ( &(const binstruction[54]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0xA40E0200, // 0001 IMPORT R3 K1 0x90020503, // 0002 SETMBR R0 K2 K3 @@ -5503,42 +5615,46 @@ be_local_closure(OpenHASP__load, /* name */ 0x5C180200, // 000B MOVE R6 R1 0x581C0006, // 000C LDCONST R7 K6 0x7C140400, // 000D CALL R5 2 - 0x8C180507, // 000E GETMET R6 R2 K7 - 0x8C200B08, // 000F GETMET R8 R5 K8 - 0x7C200200, // 0010 CALL R8 1 - 0x58240009, // 0011 LDCONST R9 K9 - 0x7C180600, // 0012 CALL R6 3 - 0x8C1C0B0A, // 0013 GETMET R7 R5 K10 - 0x7C1C0200, // 0014 CALL R7 1 - 0x601C0010, // 0015 GETGBL R7 G16 - 0x5C200C00, // 0016 MOVE R8 R6 - 0x7C1C0200, // 0017 CALL R7 1 - 0xA8020013, // 0018 EXBLK 0 #002D - 0x5C200E00, // 0019 MOVE R8 R7 - 0x7C200000, // 001A CALL R8 0 - 0x8C24070B, // 001B GETMET R9 R3 K11 - 0x5C2C1000, // 001C MOVE R11 R8 - 0x7C240400, // 001D CALL R9 2 - 0x60280004, // 001E GETGBL R10 G4 - 0x5C2C1200, // 001F MOVE R11 R9 - 0x7C280200, // 0020 CALL R10 1 - 0x1C28150C, // 0021 EQ R10 R10 K12 - 0x782A0008, // 0022 JMPF R10 #002C - 0x8C28010D, // 0023 GETMET R10 R0 K13 - 0x5C301200, // 0024 MOVE R12 R9 - 0x7C280400, // 0025 CALL R10 2 - 0x8C28010E, // 0026 GETMET R10 R0 K14 - 0x5C301200, // 0027 MOVE R12 R9 - 0x88340102, // 0028 GETMBR R13 R0 K2 - 0x88380105, // 0029 GETMBR R14 R0 K5 - 0x94341C0D, // 002A GETIDX R13 R14 R13 - 0x7C280600, // 002B CALL R10 3 - 0x7001FFEB, // 002C JMP #0019 - 0x581C000F, // 002D LDCONST R7 K15 - 0xAC1C0200, // 002E CATCH R7 1 0 - 0xB0080000, // 002F RAISE 2 R0 R0 - 0x90020503, // 0030 SETMBR R0 K2 K3 - 0x80000000, // 0031 RET 0 + 0x8C180B07, // 000E GETMET R6 R5 K7 + 0x7C180200, // 000F CALL R6 1 + 0x8C1C0B08, // 0010 GETMET R7 R5 K8 + 0x7C1C0200, // 0011 CALL R7 1 + 0x8C1C0509, // 0012 GETMET R7 R2 K9 + 0x5C240C00, // 0013 MOVE R9 R6 + 0x5828000A, // 0014 LDCONST R10 K10 + 0x7C1C0600, // 0015 CALL R7 3 + 0x4C140000, // 0016 LDNIL R5 + 0x4C180000, // 0017 LDNIL R6 + 0x6020000C, // 0018 GETGBL R8 G12 + 0x5C240E00, // 0019 MOVE R9 R7 + 0x7C200200, // 001A CALL R8 1 + 0x2420110B, // 001B GT R8 R8 K11 + 0x78220015, // 001C JMPF R8 #0033 + 0x8C20070C, // 001D GETMET R8 R3 K12 + 0x94280F0B, // 001E GETIDX R10 R7 K11 + 0x7C200400, // 001F CALL R8 2 + 0x60240004, // 0020 GETGBL R9 G4 + 0x5C281000, // 0021 MOVE R10 R8 + 0x7C240200, // 0022 CALL R9 1 + 0x1C24130D, // 0023 EQ R9 R9 K13 + 0x78260008, // 0024 JMPF R9 #002E + 0x8C24010E, // 0025 GETMET R9 R0 K14 + 0x5C2C1000, // 0026 MOVE R11 R8 + 0x7C240400, // 0027 CALL R9 2 + 0x8C24010F, // 0028 GETMET R9 R0 K15 + 0x5C2C1000, // 0029 MOVE R11 R8 + 0x88300102, // 002A GETMBR R12 R0 K2 + 0x88340105, // 002B GETMBR R13 R0 K5 + 0x94301A0C, // 002C GETIDX R12 R13 R12 + 0x7C240600, // 002D CALL R9 3 + 0x4C200000, // 002E LDNIL R8 + 0x8C240F10, // 002F GETMET R9 R7 K16 + 0x582C000B, // 0030 LDCONST R11 K11 + 0x7C240400, // 0031 CALL R9 2 + 0x7001FFE4, // 0032 JMP #0018 + 0x4C1C0000, // 0033 LDNIL R7 + 0x90020503, // 0034 SETMBR R0 K2 K3 + 0x80000000, // 0035 RET 0 }) ) ); @@ -5546,65 +5662,9 @@ be_local_closure(OpenHASP__load, /* name */ /******************************************************************** -** Solidified function: sort +** Solidified function: parse ********************************************************************/ -be_local_closure(OpenHASP_sort, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_int(1), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_literal("stop_iteration"), - }), - be_str_literal("sort"), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x04080500, // 0004 SUB R2 R2 K0 - 0x400A0002, // 0005 CONNECT R2 K0 R2 - 0x7C040200, // 0006 CALL R1 1 - 0xA8020010, // 0007 EXBLK 0 #0019 - 0x5C080200, // 0008 MOVE R2 R1 - 0x7C080000, // 0009 CALL R2 0 - 0x940C0002, // 000A GETIDX R3 R0 R2 - 0x5C100400, // 000B MOVE R4 R2 - 0x24140901, // 000C GT R5 R4 K1 - 0x78160008, // 000D JMPF R5 #0017 - 0x04140900, // 000E SUB R5 R4 K0 - 0x94140005, // 000F GETIDX R5 R0 R5 - 0x24140A03, // 0010 GT R5 R5 R3 - 0x78160004, // 0011 JMPF R5 #0017 - 0x04140900, // 0012 SUB R5 R4 K0 - 0x94140005, // 0013 GETIDX R5 R0 R5 - 0x98000805, // 0014 SETIDX R0 R4 R5 - 0x04100900, // 0015 SUB R4 R4 K0 - 0x7001FFF4, // 0016 JMP #000C - 0x98000803, // 0017 SETIDX R0 R4 R3 - 0x7001FFEE, // 0018 JMP #0008 - 0x58040002, // 0019 LDCONST R1 K2 - 0xAC040200, // 001A CATCH R1 1 0 - 0xB0080000, // 001B RAISE 2 R0 R0 - 0x80040000, // 001C RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_page -********************************************************************/ -be_local_closure(OpenHASP_parse_page, /* name */ +be_local_closure(OpenHASP_parse, /* name */ be_nested_proto( 9, /* nstack */ 2, /* argc */ @@ -5614,79 +5674,41 @@ be_local_closure(OpenHASP_parse_page, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_literal("has"), - /* K1 */ be_nested_str_literal("page"), - /* K2 */ be_nested_str_literal("int"), - /* K3 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K4 */ be_nested_str_literal("lvh_pages"), - /* K5 */ be_nested_str_literal("contains"), - /* K6 */ be_nested_str_literal("lvh_page"), - /* K7 */ be_nested_str_literal("find"), - /* K8 */ be_nested_str_literal("id"), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_literal("get_page_cur"), - /* K11 */ be_nested_str_literal("prev"), - /* K12 */ be_nested_str_literal("next"), - /* K13 */ be_nested_str_literal("back"), + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_literal("json"), + /* K1 */ be_nested_str_literal("load"), + /* K2 */ be_nested_str_literal("instance"), + /* K3 */ be_nested_str_literal("parse_page"), + /* K4 */ be_nested_str_literal("parse_obj"), + /* K5 */ be_nested_str_literal("lvh_pages"), + /* K6 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K7 */ be_nested_str_literal("value_error"), + /* K8 */ be_nested_str_literal("unable to parse JSON line"), }), - be_str_literal("parse_page"), + be_str_literal("parse"), &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0x8C080300, // 0000 GETMET R2 R1 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x7C080400, // 0002 CALL R2 2 - 0x780A0030, // 0003 JMPF R2 #0035 - 0x60080004, // 0004 GETGBL R2 G4 - 0x940C0301, // 0005 GETIDX R3 R1 K1 - 0x7C080200, // 0006 CALL R2 1 - 0x1C080502, // 0007 EQ R2 R2 K2 - 0x780A002B, // 0008 JMPF R2 #0035 - 0x60080009, // 0009 GETGBL R2 G9 - 0x940C0301, // 000A GETIDX R3 R1 K1 - 0x7C080200, // 000B CALL R2 1 - 0x90020602, // 000C SETMBR R0 K3 R2 - 0x880C0104, // 000D GETMBR R3 R0 K4 - 0x8C0C0705, // 000E GETMET R3 R3 K5 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x740E0006, // 0011 JMPT R3 #0019 - 0x880C0106, // 0012 GETMBR R3 R0 K6 - 0x88100104, // 0013 GETMBR R4 R0 K4 - 0x5C140600, // 0014 MOVE R5 R3 - 0x5C180400, // 0015 MOVE R6 R2 - 0x5C1C0000, // 0016 MOVE R7 R0 - 0x7C140400, // 0017 CALL R5 2 - 0x98100405, // 0018 SETIDX R4 R2 R5 - 0x8C0C0307, // 0019 GETMET R3 R1 K7 - 0x58140008, // 001A LDCONST R5 K8 - 0x7C0C0400, // 001B CALL R3 2 - 0x1C0C0709, // 001C EQ R3 R3 K9 - 0x780E0016, // 001D JMPF R3 #0035 - 0x8C0C010A, // 001E GETMET R3 R0 K10 - 0x7C0C0200, // 001F CALL R3 1 - 0x60100009, // 0020 GETGBL R4 G9 - 0x8C140307, // 0021 GETMET R5 R1 K7 - 0x581C000B, // 0022 LDCONST R7 K11 - 0x4C200000, // 0023 LDNIL R8 - 0x7C140600, // 0024 CALL R5 3 - 0x7C100200, // 0025 CALL R4 1 - 0x900E1604, // 0026 SETMBR R3 K11 R4 - 0x60100009, // 0027 GETGBL R4 G9 - 0x8C140307, // 0028 GETMET R5 R1 K7 - 0x581C000C, // 0029 LDCONST R7 K12 - 0x4C200000, // 002A LDNIL R8 - 0x7C140600, // 002B CALL R5 3 - 0x7C100200, // 002C CALL R4 1 - 0x900E1804, // 002D SETMBR R3 K12 R4 - 0x60100009, // 002E GETGBL R4 G9 - 0x8C140307, // 002F GETMET R5 R1 K7 - 0x581C000D, // 0030 LDCONST R7 K13 - 0x4C200000, // 0031 LDNIL R8 - 0x7C140600, // 0032 CALL R5 3 - 0x7C100200, // 0033 CALL R4 1 - 0x900E1A04, // 0034 SETMBR R3 K13 R4 - 0x80000000, // 0035 RET 0 + ( &(const binstruction[21]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x60100004, // 0004 GETGBL R4 G4 + 0x5C140600, // 0005 MOVE R5 R3 + 0x7C100200, // 0006 CALL R4 1 + 0x1C100902, // 0007 EQ R4 R4 K2 + 0x78120009, // 0008 JMPF R4 #0013 + 0x8C100103, // 0009 GETMET R4 R0 K3 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x8C100104, // 000C GETMET R4 R0 K4 + 0x5C180600, // 000D MOVE R6 R3 + 0x881C0106, // 000E GETMBR R7 R0 K6 + 0x88200105, // 000F GETMBR R8 R0 K5 + 0x941C1007, // 0010 GETIDX R7 R8 R7 + 0x7C100600, // 0011 CALL R4 3 + 0x70020000, // 0012 JMP #0014 + 0xB0060F08, // 0013 RAISE 1 K7 K8 + 0x80000000, // 0014 RET 0 }) ) ); @@ -5694,60 +5716,161 @@ be_local_closure(OpenHASP_parse_page, /* name */ /******************************************************************** -** Solidified function: page_dir_to +** Solidified function: start ********************************************************************/ -be_local_closure(OpenHASP_page_dir_to, /* name */ +be_local_closure(OpenHASP_start, /* name */ be_nested_proto( - 7, /* nstack */ - 2, /* argc */ + 11, /* nstack */ + 3, /* argc */ 2, /* 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_str_literal("pages_list_sorted"), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(1), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_literal("find"), + ( &(const bvalue[33]) { /* constants */ + /* K0 */ be_nested_str_literal("path"), + /* K1 */ be_nested_str_literal("def_templ_name"), + /* K2 */ be_nested_str_literal("exists"), + /* K3 */ be_nested_str_literal("file '"), + /* K4 */ be_nested_str_literal("' not found"), + /* K5 */ be_nested_str_literal("io_erorr"), + /* K6 */ be_nested_str_literal("lv"), + /* K7 */ be_nested_str_literal("start"), + /* K8 */ be_nested_str_literal("dark"), + /* K9 */ be_nested_str_literal("hres"), + /* K10 */ be_nested_str_literal("get_hor_res"), + /* K11 */ be_nested_str_literal("vres"), + /* K12 */ be_nested_str_literal("get_ver_res"), + /* K13 */ be_nested_str_literal("scr"), + /* K14 */ be_nested_str_literal("scr_act"), + /* K15 */ be_nested_str_literal("r16"), + /* K16 */ be_nested_str_literal("font_embedded"), + /* K17 */ be_nested_str_literal("robotocondensed"), + /* K18 */ be_nested_str_literal("montserrat"), + /* K19 */ be_nested_str_literal("theme_openhasp_init"), + /* K20 */ be_const_int(0), + /* K21 */ be_nested_str_literal("color"), + /* K22 */ be_const_int(16711935), + /* K23 */ be_const_int(3158064), + /* K24 */ be_nested_str_literal("get_disp"), + /* K25 */ be_nested_str_literal("set_theme"), + /* K26 */ be_nested_str_literal("set_style_bg_color"), + /* K27 */ be_const_int(16777215), + /* K28 */ be_nested_str_literal("theme_apply"), + /* K29 */ be_nested_str_literal("layer_top"), + /* K30 */ be_nested_str_literal("set_style_bg_opa"), + /* K31 */ be_nested_str_literal("lvh_pages"), + /* K32 */ be_nested_str_literal("_load"), }), - be_str_literal("page_dir_to"), + be_str_literal("start"), &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0403, // 0004 EQ R3 R2 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80060200, // 0006 RET 1 K1 - 0x600C000C, // 0007 GETGBL R3 G12 - 0x5C100400, // 0008 MOVE R4 R2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x18100702, // 000A LE R4 R3 K2 - 0x78120000, // 000B JMPF R4 #000D - 0x80060200, // 000C RET 1 K1 - 0x1C100703, // 000D EQ R4 R3 K3 - 0x78120000, // 000E JMPF R4 #0010 - 0x80060400, // 000F RET 1 K2 - 0x8C100504, // 0010 GETMET R4 R2 K4 - 0x5C180200, // 0011 MOVE R6 R1 - 0x7C100400, // 0012 CALL R4 2 - 0x4C140000, // 0013 LDNIL R5 - 0x1C140805, // 0014 EQ R5 R4 R5 - 0x78160000, // 0015 JMPF R5 #0017 - 0x80060200, // 0016 RET 1 K1 - 0x00140702, // 0017 ADD R5 R3 K2 - 0x0C140B03, // 0018 DIV R5 R5 K3 - 0x18140805, // 0019 LE R5 R4 R5 - 0x78160001, // 001A JMPF R5 #001D - 0x80060400, // 001B RET 1 K2 - 0x70020001, // 001C JMP #001F - 0x5415FFFE, // 001D LDINT R5 -1 - 0x80040A00, // 001E RET 1 R5 - 0x80000000, // 001F RET 0 + ( &(const binstruction[105]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C100404, // 0002 EQ R4 R2 R4 + 0x78120000, // 0003 JMPF R4 #0005 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C100702, // 0005 GETMET R4 R3 K2 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C100400, // 0007 CALL R4 2 + 0x74120002, // 0008 JMPT R4 #000C + 0x00120602, // 0009 ADD R4 K3 R2 + 0x00100904, // 000A ADD R4 R4 K4 + 0xB0060A04, // 000B RAISE 1 K5 R4 + 0xB8120C00, // 000C GETNGBL R4 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x7C100200, // 000E CALL R4 1 + 0x60100017, // 000F GETGBL R4 G23 + 0x5C140200, // 0010 MOVE R5 R1 + 0x7C100200, // 0011 CALL R4 1 + 0x90021004, // 0012 SETMBR R0 K8 R4 + 0xB8120C00, // 0013 GETNGBL R4 K6 + 0x8C10090A, // 0014 GETMET R4 R4 K10 + 0x7C100200, // 0015 CALL R4 1 + 0x90021204, // 0016 SETMBR R0 K9 R4 + 0xB8120C00, // 0017 GETNGBL R4 K6 + 0x8C10090C, // 0018 GETMET R4 R4 K12 + 0x7C100200, // 0019 CALL R4 1 + 0x90021604, // 001A SETMBR R0 K11 R4 + 0xB8120C00, // 001B GETNGBL R4 K6 + 0x8C10090E, // 001C GETMET R4 R4 K14 + 0x7C100200, // 001D CALL R4 1 + 0x90021A04, // 001E SETMBR R0 K13 R4 + 0xA8020007, // 001F EXBLK 0 #0028 + 0xB8120C00, // 0020 GETNGBL R4 K6 + 0x8C100910, // 0021 GETMET R4 R4 K16 + 0x58180011, // 0022 LDCONST R6 K17 + 0x541E000F, // 0023 LDINT R7 16 + 0x7C100600, // 0024 CALL R4 3 + 0x90021E04, // 0025 SETMBR R0 K15 R4 + 0xA8040001, // 0026 EXBLK 1 1 + 0x70020009, // 0027 JMP #0032 + 0xAC100000, // 0028 CATCH R4 0 0 + 0x70020006, // 0029 JMP #0031 + 0xB8120C00, // 002A GETNGBL R4 K6 + 0x8C100910, // 002B GETMET R4 R4 K16 + 0x58180012, // 002C LDCONST R6 K18 + 0x541E000D, // 002D LDINT R7 14 + 0x7C100600, // 002E CALL R4 3 + 0x90021E04, // 002F SETMBR R0 K15 R4 + 0x70020000, // 0030 JMP #0032 + 0xB0080000, // 0031 RAISE 2 R0 R0 + 0xB8120C00, // 0032 GETNGBL R4 K6 + 0x8C100913, // 0033 GETMET R4 R4 K19 + 0x58180014, // 0034 LDCONST R6 K20 + 0xB81E0C00, // 0035 GETNGBL R7 K6 + 0x8C1C0F15, // 0036 GETMET R7 R7 K21 + 0x58240016, // 0037 LDCONST R9 K22 + 0x7C1C0400, // 0038 CALL R7 2 + 0xB8220C00, // 0039 GETNGBL R8 K6 + 0x8C201115, // 003A GETMET R8 R8 K21 + 0x58280017, // 003B LDCONST R10 K23 + 0x7C200400, // 003C CALL R8 2 + 0x88240108, // 003D GETMBR R9 R0 K8 + 0x8828010F, // 003E GETMBR R10 R0 K15 + 0x7C100C00, // 003F CALL R4 6 + 0x8814010D, // 0040 GETMBR R5 R0 K13 + 0x8C140B18, // 0041 GETMET R5 R5 K24 + 0x7C140200, // 0042 CALL R5 1 + 0x8C140B19, // 0043 GETMET R5 R5 K25 + 0x5C1C0800, // 0044 MOVE R7 R4 + 0x7C140400, // 0045 CALL R5 2 + 0x8814010D, // 0046 GETMBR R5 R0 K13 + 0x8C140B1A, // 0047 GETMET R5 R5 K26 + 0x881C0108, // 0048 GETMBR R7 R0 K8 + 0x781E0004, // 0049 JMPF R7 #004F + 0xB81E0C00, // 004A GETNGBL R7 K6 + 0x8C1C0F15, // 004B GETMET R7 R7 K21 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C1C0400, // 004D CALL R7 2 + 0x70020003, // 004E JMP #0053 + 0xB81E0C00, // 004F GETNGBL R7 K6 + 0x8C1C0F15, // 0050 GETMET R7 R7 K21 + 0x5824001B, // 0051 LDCONST R9 K27 + 0x7C1C0400, // 0052 CALL R7 2 + 0x58200014, // 0053 LDCONST R8 K20 + 0x7C140600, // 0054 CALL R5 3 + 0xB8160C00, // 0055 GETNGBL R5 K6 + 0x8C140B1C, // 0056 GETMET R5 R5 K28 + 0xB81E0C00, // 0057 GETNGBL R7 K6 + 0x8C1C0F1D, // 0058 GETMET R7 R7 K29 + 0x7C1C0200, // 0059 CALL R7 1 + 0x7C140400, // 005A CALL R5 2 + 0xB8160C00, // 005B GETNGBL R5 K6 + 0x8C140B1D, // 005C GETMET R5 R5 K29 + 0x7C140200, // 005D CALL R5 1 + 0x8C140B1E, // 005E GETMET R5 R5 K30 + 0x581C0014, // 005F LDCONST R7 K20 + 0x58200014, // 0060 LDCONST R8 K20 + 0x7C140600, // 0061 CALL R5 3 + 0x60140013, // 0062 GETGBL R5 G19 + 0x7C140000, // 0063 CALL R5 0 + 0x90023E05, // 0064 SETMBR R0 K31 R5 + 0x8C140120, // 0065 GETMET R5 R0 K32 + 0x5C1C0400, // 0066 MOVE R7 R2 + 0x7C140400, // 0067 CALL R5 2 + 0x80000000, // 0068 RET 0 }) ) ); @@ -5758,48 +5881,52 @@ be_local_closure(OpenHASP_page_dir_to, /* name */ ** Solidified class: OpenHASP ********************************************************************/ be_local_class(OpenHASP, - 8, + 10, NULL, - be_nested_map(38, + be_nested_map(42, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("re_page_target", -1), be_const_var(7) }, - { be_const_key_literal("lvh_slider", -1), be_const_class(be_class_lvh_slider) }, - { be_const_key_literal("lvh_checkbox", -1), be_const_class(be_class_lvh_checkbox) }, - { be_const_key_literal("start", -1), be_const_closure(OpenHASP_start_closure) }, - { be_const_key_literal("pages_list_sorted", 8), be_const_closure(OpenHASP_pages_list_sorted_closure) }, - { be_const_key_literal("page_dir_to", -1), be_const_closure(OpenHASP_page_dir_to_closure) }, - { be_const_key_literal("lvh_scr", -1), be_const_class(be_class_lvh_scr) }, - { be_const_key_literal("lvh_btnmatrix", -1), be_const_class(be_class_lvh_btnmatrix) }, - { be_const_key_literal("parse_page", -1), be_const_closure(OpenHASP_parse_page_closure) }, - { be_const_key_literal("dark", 7), be_const_var(0) }, - { be_const_key_literal("parse", 17), be_const_closure(OpenHASP_parse_closure) }, - { be_const_key_literal("scr", -1), be_const_var(3) }, - { be_const_key_literal("parse_obj", -1), be_const_closure(OpenHASP_parse_obj_closure) }, - { be_const_key_literal("init", -1), be_const_closure(OpenHASP_init_closure) }, - { be_const_key_literal("lvh_img", 21), be_const_class(be_class_lvh_img) }, - { be_const_key_literal("hres", -1), be_const_var(1) }, - { be_const_key_literal("deinit", -1), be_const_closure(OpenHASP_deinit_closure) }, - { be_const_key_literal("lvh_pages", -1), be_const_var(5) }, - { be_const_key_literal("r16", 34), be_const_var(4) }, - { be_const_key_literal("lvh_dropdown", -1), be_const_class(be_class_lvh_dropdown) }, - { be_const_key_literal("get_page_cur", 35), be_const_closure(OpenHASP_get_page_cur_closure) }, - { be_const_key_literal("vres", 2), be_const_var(2) }, - { be_const_key_literal("sort", -1), be_const_static_closure(OpenHASP_sort_closure) }, - { be_const_key_literal("lvh_roller", -1), be_const_class(be_class_lvh_roller) }, - { be_const_key_literal("lvh_label", 18), be_const_class(be_class_lvh_label) }, - { be_const_key_literal("lvh_spinner", -1), be_const_class(be_class_lvh_spinner) }, - { be_const_key_literal("lvh_btn", 30), be_const_class(be_class_lvh_btn) }, - { be_const_key_literal("lvh_bar", -1), be_const_class(be_class_lvh_bar) }, - { be_const_key_literal("lvh_switch", 23), be_const_class(be_class_lvh_switch) }, - { be_const_key_literal("do_action", 22), be_const_closure(OpenHASP_do_action_closure) }, - { be_const_key_literal("_load", -1), be_const_closure(OpenHASP__load_closure) }, - { be_const_key_literal("lvh_obj", -1), be_const_class(be_class_lvh_obj) }, - { be_const_key_literal("lvh_textarea", -1), be_const_class(be_class_lvh_textarea) }, - { be_const_key_literal("lvh_page", 14), be_const_class(be_class_lvh_page) }, - { be_const_key_literal("lvh_page_cur_idx", -1), be_const_var(6) }, - { be_const_key_literal("lvh_line", -1), be_const_class(be_class_lvh_line) }, - { be_const_key_literal("lvh_arc", 5), be_const_class(be_class_lvh_arc) }, + { be_const_key_literal("pages_list_sorted", -1), be_const_closure(OpenHASP_pages_list_sorted_closure) }, { be_const_key_literal("def_templ_name", -1), be_nested_str_literal("pages.jsonl") }, + { be_const_key_literal("parse_obj", 16), be_const_closure(OpenHASP_parse_obj_closure) }, + { be_const_key_literal("lvh_slider", 37), be_const_class(be_class_lvh_slider) }, + { be_const_key_literal("event_dispatch", 25), be_const_closure(OpenHASP_event_dispatch_closure) }, + { be_const_key_literal("lvh_obj", 29), be_const_class(be_class_lvh_obj) }, + { be_const_key_literal("page_dir_to", -1), be_const_closure(OpenHASP_page_dir_to_closure) }, + { be_const_key_literal("vres", -1), be_const_var(2) }, + { be_const_key_literal("lvh_textarea", -1), be_const_class(be_class_lvh_textarea) }, + { be_const_key_literal("parse", -1), be_const_closure(OpenHASP_parse_closure) }, + { be_const_key_literal("lvh_switch", 8), be_const_class(be_class_lvh_switch) }, + { be_const_key_literal("dark", 13), be_const_var(0) }, + { be_const_key_literal("event", -1), be_const_var(8) }, + { be_const_key_literal("lvh_checkbox", -1), be_const_class(be_class_lvh_checkbox) }, + { be_const_key_literal("lvh_scr", -1), be_const_class(be_class_lvh_scr) }, + { be_const_key_literal("lvh_spinner", -1), be_const_class(be_class_lvh_spinner) }, + { be_const_key_literal("lvh_page_cur_idx", 24), be_const_var(6) }, + { be_const_key_literal("sort", -1), be_const_static_closure(OpenHASP_sort_closure) }, + { be_const_key_literal("r16", -1), be_const_var(4) }, + { be_const_key_literal("do_action", -1), be_const_closure(OpenHASP_do_action_closure) }, + { be_const_key_literal("parse_page", -1), be_const_closure(OpenHASP_parse_page_closure) }, + { be_const_key_literal("register_event", 17), be_const_closure(OpenHASP_register_event_closure) }, + { be_const_key_literal("lvh_dropdown", -1), be_const_class(be_class_lvh_dropdown) }, + { be_const_key_literal("init", -1), be_const_closure(OpenHASP_init_closure) }, + { be_const_key_literal("lvh_roller", 38), be_const_class(be_class_lvh_roller) }, + { be_const_key_literal("lvh_line", -1), be_const_class(be_class_lvh_line) }, + { be_const_key_literal("get_page_cur", -1), be_const_closure(OpenHASP_get_page_cur_closure) }, + { be_const_key_literal("lvh_page", 31), be_const_class(be_class_lvh_page) }, + { be_const_key_literal("lvh_arc", -1), be_const_class(be_class_lvh_arc) }, + { be_const_key_literal("scr", -1), be_const_var(3) }, + { be_const_key_literal("re_page_target", -1), be_const_var(7) }, + { be_const_key_literal("lvh_img", 22), be_const_class(be_class_lvh_img) }, + { be_const_key_literal("lvh_btn", -1), be_const_class(be_class_lvh_btn) }, + { be_const_key_literal("lvh_bar", 23), be_const_class(be_class_lvh_bar) }, + { be_const_key_literal("lvh_pages", -1), be_const_var(5) }, + { be_const_key_literal("lvh_btnmatrix", 19), be_const_class(be_class_lvh_btnmatrix) }, + { be_const_key_literal("_load", -1), be_const_closure(OpenHASP__load_closure) }, + { be_const_key_literal("hres", -1), be_const_var(1) }, + { be_const_key_literal("lvh_label", -1), be_const_class(be_class_lvh_label) }, + { be_const_key_literal("event_cb", 12), be_const_var(9) }, + { be_const_key_literal("deinit", 9), be_const_closure(OpenHASP_deinit_closure) }, + { be_const_key_literal("start", -1), be_const_closure(OpenHASP_start_closure) }, })), be_str_literal("OpenHASP") ); diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h index d968226ec..067690b9b 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h @@ -186,7 +186,7 @@ const be_ntv_func_def_t lv_disp_func[] = { /* `lv_obj` methods */ const be_ntv_func_def_t lv_obj_func[] = { - { "add_event_cb", { (const void*) &lv_obj_add_event_cb, "i", "(lv.lv_obj)^lv_event_cb^i." } }, + { "add_event_cb", { (const void*) &lv_obj_add_event_cb, "c", "(lv.lv_obj)^lv_event_cb^i." } }, { "add_flag", { (const void*) &lv_obj_add_flag, "", "(lv.lv_obj)i" } }, { "add_state", { (const void*) &lv_obj_add_state, "", "(lv.lv_obj)i" } }, { "add_style", { (const void*) &lv_obj_add_style, "", "(lv.lv_obj)(lv.lv_style)i" } }, @@ -387,7 +387,7 @@ const be_ntv_func_def_t lv_obj_func[] = { { "refresh_style", { (const void*) &lv_obj_refresh_style, "", "(lv.lv_obj)ii" } }, { "remove_event_cb", { (const void*) &lv_obj_remove_event_cb, "b", "(lv.lv_obj)." } }, { "remove_event_cb_with_user_data", { (const void*) &lv_obj_remove_event_cb_with_user_data, "b", "(lv.lv_obj).." } }, - { "remove_event_dsc", { (const void*) &lv_obj_remove_event_dsc, "b", "(lv.lv_obj)i" } }, + { "remove_event_dsc", { (const void*) &lv_obj_remove_event_dsc, "b", "(lv.lv_obj)c" } }, { "remove_local_style_prop", { (const void*) &lv_obj_remove_local_style_prop, "b", "(lv.lv_obj)ii" } }, { "remove_style", { (const void*) &lv_obj_remove_style, "", "(lv.lv_obj)(lv.lv_style)i" } }, { "remove_style_all", { (const void*) &lv_obj_remove_style_all, "", "(lv.lv_obj)" } }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py index 10d303e4e..2e33c9a83 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py @@ -110,7 +110,7 @@ return_types = { "lv_flex_flow_t": "i", "lv_grid_align_t": "i", - "_lv_event_dsc_t *": "i", + "_lv_event_dsc_t *": "c", # lv_anim "lv_anim_t *": "lv_anim", "lv_anim_enable_t": "i", diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index 279e62044..cb023fd89 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -287,20 +287,13 @@ class lvh_obj lv.EVENT_VALUE_CHANGED: "changed", } def register_event_cb() - # register callback for each event - var f = / obj, event -> self.event_cb(obj, event) + var oh = self._page._oh for ev:self._event_map.keys() - self._lv_obj.add_event_cb(f, ev, 0) + oh.register_event(self, ev) end - # # print("register_event_cb") - # var mask = lv.EVENT_PRESSED | lv.EVENT_CLICKED | lv.EVENT_PRESS_LOST | lv.EVENT_RELEASED | - # lv.EVENT_LONG_PRESSED | lv.EVENT_LONG_PRESSED_REPEAT | lv.EVENT_VALUE_CHANGED - # var target = self - # mask = lv.EVENT_CLICKED - # self._lv_obj.add_event_cb(/ obj, event -> target.event_cb(obj, event), mask, 0) end - def event_cb(obj, event) + def event_cb(event) # the callback avoids doing anything sophisticated in the cb # defer the actual action to the Tasmota event loop # print("-> CB fired","self",self,"obj",obj,"event",event.tomap(),"code",event.code) @@ -314,24 +307,11 @@ class lvh_obj var event_hasp = self._event_map.find(code) if event_hasp != nil import string - var val = string.format('{"hasp":{"p%ib%i":"%s"}}', self._page._page_id, self.id, event_hasp) - # var pxby = "p" + self._page._page_id + "b" + self.id - # var val = '{"hasp":{"p' + str(self._page._page_id) + 'b' + str(self.id) + - # '":"' + event_hasp + '"}}' - # var val = json.dump( {'hasp': {pxby: event_hasp}} ) + # print("val=",val) tasmota.set_timer(0, /-> tasmota.publish_rule(val)) end end - - # def action_cb(obj, event) - # # the callback avoids doing anything sophisticated in the cb - # # defer the actual action to the Tasmota event loop - # # print("-> CB fired","self",self,"obj",obj,"event",event.tomap(),"code",event.code) - # var oh = self._page._oh # openhasp global object - # var code = event.code # materialize to a local variable, otherwise the value can change (and don't capture event object) - # tasmota.set_timer(0, /-> oh.do_action(self, code)) - # end #==================================================================== # Mapping of synthetic attributes @@ -1108,6 +1088,9 @@ class OpenHASP var lvh_page_cur_idx # (int) current page index number # regex patterns var re_page_target # compiled regex for action `p` + # specific event_cb handling for less memory usage since we are registering a lot of callbacks + var event # try to keep the event object around and reuse it + var event_cb # the low-level callback for the closure to be registered # assign lvh_page to a static attribute static lvh_page = lvh_page @@ -1236,19 +1219,26 @@ class OpenHASP self.lvh_pages[1] = lvh_page_class(1, self) # always create page #1 var f = open(templ_name,"r") - var jsonl = string.split(f.read(), "\n") + var f_content = f.read() f.close() + + var jsonl = string.split(f_content, "\n") + f = nil # allow deallocation + f_content = nil # parse each line - for j:jsonl - var jline = json.load(j) + while size(jsonl) > 0 + var jline = json.load(jsonl[0]) if type(jline) == 'instance' self.parse_page(jline) # parse page first to create any page related objects, may change self.lvh_page_cur_idx # objects are created in the current page self.parse_obj(jline, self.lvh_pages[self.lvh_page_cur_idx]) # then parse object within this page end + jline = nil + jsonl.remove(0) end + jsonl = nil # make all of it freeable # current page is always 1 when we start self.lvh_page_cur_idx = 1 @@ -1404,6 +1394,42 @@ class OpenHASP end end + #==================================================================== + # Event CB handling + #==================================================================== + def register_event(lvh_obj, event_type) + import cb + import introspect + + # create the callback to the closure only once + if self.event_cb == nil + self.event_cb = cb.gen_cb(/ event_ptr_i -> self.event_dispatch(event_ptr_i)) + end + # register the C callback + var lv_obj = lvh_obj._lv_obj + # we pass the cb as a comptr so it's already a C pointer + lv_obj.add_event_cb(self.event_cb, event_type, introspect.toptr(lvh_obj)) + end + + def event_dispatch(event_ptr_i) + import introspect + var event_ptr = introspect.toptr(event_ptr_i) # convert to comptr, because it was a pointer in the first place + + if self.event self.event._change_buffer(event_ptr) + else self.event = lv.lv_event(event_ptr) + end + + var user_data = self.event.user_data # it is supposed to be a pointer to the object + if int(user_data) != 0 + var target_lvh_obj = introspect.fromptr(user_data) + if type(target_lvh_obj) == 'instance' + # print("CB Fired", self.event.code, target_lvh_obj) + target_lvh_obj.event_cb(self.event) + # print("CB Fired After") + end + end + end + #==================================================================== # Parse single object #==================================================================== From 75ee0f3c35cb12c742971bc7e5926f9a106b1ed0 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 23 Apr 2022 09:27:20 +0200 Subject: [PATCH 052/376] Update openhasp.tapp with latest version --- tasmota/berry/openhasp/openhasp.tapp | Bin 54238 -> 54986 bytes tasmota/berry/openhasp_src/openhasp.tapp | Bin 54238 -> 54986 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/openhasp/openhasp.tapp index c32d590b682a74771b8d475f251ecfe1d6f31645..f69011bf91fad46ec4f1a018fda787f42b8dfb0f 100644 GIT binary patch delta 2128 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 Date: Sat, 23 Apr 2022 09:28:16 +0200 Subject: [PATCH 053/376] AXP192 driver for M5Stack Tough --- .../berry/drivers/i2c_axp192_M5StackTough.be | 151 ++++++++++++++++++ 1 file changed, 151 insertions(+) create mode 100644 tasmota/berry/drivers/i2c_axp192_M5StackTough.be diff --git a/tasmota/berry/drivers/i2c_axp192_M5StackTough.be b/tasmota/berry/drivers/i2c_axp192_M5StackTough.be new file mode 100644 index 000000000..cace43a89 --- /dev/null +++ b/tasmota/berry/drivers/i2c_axp192_M5StackTough.be @@ -0,0 +1,151 @@ +#------------------------------------------------------------- + - Specialized driver for AXP192 of M5Stack Tough + -------------------------------------------------------------# +class AXP192_M5Stack_Tough : AXP192 + def init() + super(self).init() + + if self.wire + self.touch_reset(false) + + # Disable vbus hold limit + self.write8(0x30, self.read8(0x30) & 0x04 | 0x02) + + # AXP192 GPIO1:OD OUTPUT + self.write8(0x92, self.read8(0x92) & 0xF8) + + # AXP192 GPIO2:OD OUTPUT + self.write8(0x93, self.read8(0x93) & 0xF8) + + # AXP192 RTC CHG rtc battery charging enabled + self.write8(0x35, self.read8(0x35) & 0x1C | 0xA2) + + # esp32 power voltage was set to 3.35v + self.set_esp_voltage(3350) + + # lcd backlight voltage was set to 2.80v + self.set_lcd_voltage(2800) + + # lcd logic and sdcard voltage preset to 3.3v + self.set_ldo_voltage(2, 3300) + + # LCD backlight + self.set_ldo_voltage(3, 3000) + + # turn on logic and sdcard + self.set_ldo_enable(2, true) + + # turn on lcd backlight + self.set_ldo_enable(3, true) + + self.touch_reset(true) + + # set charging current to 100mA + self.set_chg_current(0) # 0 = 100mA + + # AXP192 GPIO4 - TBC what this does really? + self.write8(0x95, self.read8(0X95) & 0x72 | 0x84) + + # Button parameter setting + # Current: + # Boot time = 512ms + # Long key press time setting = 1s + # Automatic shutdown function setting when the key duration is longer than the shutdown duration = turn on + # PWROK signal delay after power on = 64ms + # Shutdown duration setting = 4s + self.write8(0x34, 0x4C) + + # parameter buttons + # Start time: 512ms + # Long press: 1s + # Set the automatic shutdown function when the key-press duration is longer than the shutdown duration: True + # PWROK signal delay after power on: 64ms + # Shutdown time setting: 4s + self.write8(0x36, 0x4C) + + # ADC all-on + # Bit 7: Battery voltage ADC enable + # Bit 6: Battery current ADC enable + # Bit 5: ACIN voltage ADC enable + # Bit 4: ACIN current ADC enable + # Bit 3: VBUS voltage ADC enable + # Bit 2: VBUS current ADC enable + # Bit 1: APS voltage ADC enable + # Bit 0: TS pin ADC function enable + self.write8(0x82, 0xFF) + + # Reset LCD Controller + self.set_lcd_reset(false) + tasmota.delay(100) # wait for 100ms + self.set_lcd_reset(true) + tasmota.delay(100) # wait for 100ms + + # Indicates whether the voltage of VBUS is higher than VHOLD when the external power supply VBUS is connected + if self.read8(0x00) & 0x08 + self.write_bit(0x30, 7, true) + # if v-bus can use, disable M-Bus 5V output to input + self.set_buf_power_mode(true) + else + self.set_buf_power_mode(false) + end + end + end + + # set ESP voltage on DCDC1 + def set_esp_voltage(voltage) + if voltage >= 3000 && voltage <= 3400 + self.set_dc_voltage(0, voltage) + end + end + + # set LCD backlight voltage on DCDC3 + def set_lcd_voltage(voltage) + if voltage < 2500 voltage = 2500 end + if voltage > 3300 voltage = 3300 end + self.set_dc_voltage(2, voltage) + end + + # LCD Controller Reset pin + def set_lcd_reset(state) + self.write_gpio(4, state) + end + + # Speaker enable + def set_speaker_enable(state) + self.write_gpio(2, state) + end + + # Bus Power Mode + def set_buf_power_mode(state) + if (state) + self.write8(0x12, self.read8(0x12) & 0xBF) # set EXTEN to disable 5v boost + self.write8(0x90, self.read8(0x90) & 0xF8 | 0x01) # set GPIO0 to float, using enternal pulldown resistor to enable supply from BUS_5VS + else + self.write8(0x91, self.read8(0x91) & 0x0F | 0xF0) + self.write8(0x90, self.read8(0x90) & 0xF8 | 0x02) # set GPIO0 to LDO OUTPUT , pullup N_VBUSEN to disable supply from BUS_5V + self.write8(0x12, self.read8(0x12) | 0x40) # set EXTEN to enable 5v boost + end + end + + # Dimmer in percentage + def set_displaydimmer(x) + var v = tasmota.scale_uint(x, 0, 100, 2500, 3300) + self.set_ldo_voltage(3, v) + end + + # respond to display events + def display(cmd, idx, payload, raw) + if cmd == "dim" || cmd == "power" + self.set_displaydimmer(idx) + end + end + + # Touch Panel reset pin + def touch_reset(state) + self.write_gpio(1, state) + end + +end + +axp = AXP192_M5Stack_Tough() +tasmota.add_driver(axp) From a2afeb5ba6414563939f23c1b8d635be0abccf08 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 23 Apr 2022 11:18:22 +0200 Subject: [PATCH 054/376] Add source when wring userid or password --- tasmota/xdrv_01_webserver.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 07443ee31..bb8d0dccb 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2903,6 +2903,7 @@ void HandleHttpCommand(void) WSContentEnd(); // https://github.com/arendst/Tasmota/discussions/15420 + ShowWebSource(SRC_WEBCOMMAND); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Bad userid and/or password")); return; From 19b010891deb10d2c7fc215f469e58f636e81b21 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 23 Apr 2022 11:47:55 +0200 Subject: [PATCH 055/376] USE_NETWORK_LIGHT_SCHEMES for ESP32x since it is often used with the C3. --- tasmota/my_user_config.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e55c5eda4..c934ffde7 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1015,6 +1015,8 @@ #define USE_ADC // Add support for ADC on GPIO32 to GPIO39 +#define USE_NETWORK_LIGHT_SCHEMES // Add support for light schemes via DDP (via UDP on port 4048) + //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) //#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) From d98425ad1a472c7615d90ba51e06f1cfe464d9d8 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 23 Apr 2022 12:21:05 +0200 Subject: [PATCH 056/376] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 983ab1d2f..d68131f4a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for Sonoff MS01 soil moisture sensor (#15335) - Support for daisy chaining MAX7219 displays (#15345) +- Support for light schemes via DDP as default for ESP32x (#16436) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) From c4f233984a996b6e79f6bac7a394d150baeeda7c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 23 Apr 2022 12:22:10 +0200 Subject: [PATCH 057/376] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d68131f4a..b4fafaadc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for Sonoff MS01 soil moisture sensor (#15335) - Support for daisy chaining MAX7219 displays (#15345) -- Support for light schemes via DDP as default for ESP32x (#16436) +- Support for light schemes via DDP as default for ESP32x (#15436) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) From 5d40295fa6eb4329a55b2286035d8b1728b49036 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 23 Apr 2022 17:59:37 +0200 Subject: [PATCH 058/376] Add ESP32 revision information --- tasmota/support_command.ino | 4 ++-- tasmota/support_esp.ino | 23 +++++++++++++++++++++++ tasmota/xdrv_01_webserver.ino | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index bba801784..52e4f58da 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -590,14 +590,14 @@ void CmndStatus(void) ",\"" D_JSON_BOOTVERSION "\":%d" #endif ",\"" D_JSON_COREVERSION "\":\"" ARDUINO_CORE_RELEASE "\",\"" D_JSON_SDKVERSION "\":\"%s\"," - "\"CpuFrequency\":%d,\"Hardware\":\"%s\"" + "\"CpuFrequency\":%d,\"Hardware\":\"%s%s\"" "%s}}"), TasmotaGlobal.version, TasmotaGlobal.image_name, GetBuildDateAndTime().c_str() #ifdef ESP8266 , ESP.getBootVersion() #endif , ESP.getSdkVersion(), - ESP.getCpuFreqMHz(), GetDeviceHardware().c_str(), + ESP.getCpuFreqMHz(), GetDeviceHardware().c_str(), GetDeviceHardwareRevision().c_str(), GetStatistics().c_str()); CmndStatusResponse(2); } diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index 9797d1859..f8d08d3be 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -95,6 +95,10 @@ String GetDeviceHardware(void) { return F("ESP8266EX"); } +String GetDeviceHardwareRevision(void) { + return ""; +} + #endif /*********************************************************************************************\ @@ -659,6 +663,7 @@ typedef struct { if (rev3) { return F("ESP32-PICO-V3"); } // Max 240MHz, Dual core, LGA 7*7, ESP32-PICO-V3-ZERO, ESP32-PICO-V3-ZERO-DevKit else { return F("ESP32-PICO-D4"); } // Max 240MHz, Dual core, LGA 7*7, 4MB embedded flash, ESP32-PICO-KIT case 6: return F("ESP32-PICO-V3-02"); // Max 240MHz, Dual core, LGA 7*7, 8MB embedded flash, 2MB embedded PSRAM, ESP32-PICO-MINI-02, ESP32-PICO-DevKitM-2 + case 7: return F("ESP32-D0WDR2-V3"); // Max 240MHz, Dual core, QFN 5*5, ESP32-WROOM-32E, ESP32_WROVER-E, ESP32-DevKitC? } #endif // CONFIG_IDF_TARGET_ESP32 return F("ESP32"); @@ -767,6 +772,24 @@ typedef struct { return F("ESP32"); } +String GetDeviceHardwareRevision(void) { +/* +// The structure represents information about the chip +typedef struct { + esp_chip_model_t model; //!< chip model, one of esp_chip_model_t + uint32_t features; //!< bit mask of CHIP_FEATURE_x feature flags + uint8_t cores; //!< number of CPU cores + uint8_t revision; //!< chip revision number +} esp_chip_info_t; +*/ + esp_chip_info_t chip_info; + esp_chip_info(&chip_info); + + char revision[12]; + snprintf_P(revision, sizeof(revision), PSTR(" (rev. %d)"), chip_info.revision); + return revision; +} + /* * ESP32 v1 and v2 needs some special patches to use PSRAM. * Standard Tasmota 32 do not include those patches. diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index bb8d0dccb..ae049761a 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2420,7 +2420,7 @@ void HandleInformation(void) #endif // USE_DISCOVERY WSContentSend_P(PSTR("}1}2 ")); // Empty line - WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardware().c_str()); + WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s%s)"), ESP_getChipId(), GetDeviceHardware().c_str(), GetDeviceHardwareRevision().c_str()); #ifdef ESP8266 WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP.getFlashChipId()); #endif From 88fe48c6eb9152cc2e2e8ab6d4aacf8d2c73978f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 23 Apr 2022 18:25:08 +0200 Subject: [PATCH 059/376] Shorten rev --- tasmota/support_esp.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index f8d08d3be..d83e851fe 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -786,7 +786,7 @@ typedef struct { esp_chip_info(&chip_info); char revision[12]; - snprintf_P(revision, sizeof(revision), PSTR(" (rev. %d)"), chip_info.revision); + snprintf_P(revision, sizeof(revision), PSTR(" rev.%d"), chip_info.revision); return revision; } From a6e0e96d3c1300cde04ac1bd378e86e7f7278fde Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 23 Apr 2022 18:55:03 +0200 Subject: [PATCH 060/376] LVGL improved qrcode intergation as actual class --- .../generate/be_lv_c_mapping.h | 16 +++++++++++++ .../generate/be_lvgl_module.c | 3 --- .../generate/be_lvgl_widgets_lib.c | 23 +++++++++++++++++++ .../lv_binding_berry/tools/convert.py | 5 +++- tasmota/my_user_config.h | 2 ++ 5 files changed, 45 insertions(+), 4 deletions(-) diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h index 067690b9b..3b18a9a2a 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h @@ -583,6 +583,14 @@ const be_ntv_func_def_t lv_indev_func[] = { { "wait_release", { (const void*) &lv_indev_wait_release, "", "(lv.lv_indev)" } }, }; +/* `lv_qrcode` methods */ +#ifdef BE_LV_WIDGET_QRCODE +const be_ntv_func_def_t lv_qrcode_func[] = { + { "delete", { (const void*) &lv_qrcode_delete, "", "(lv.lv_obj)" } }, + { "update", { (const void*) &lv_qrcode_update, "i", "(lv.lv_obj).i" } }, +}; +#endif // BE_LV_WIDGET_QRCODE + /* `lv_chart` methods */ #ifdef BE_LV_WIDGET_CHART const be_ntv_func_def_t lv_chart_func[] = { @@ -1030,6 +1038,7 @@ extern const bclass be_class_lv_line; extern const bclass be_class_lv_meter; extern const bclass be_class_lv_msgbox; extern const bclass be_class_lv_obj; +extern const bclass be_class_lv_qrcode; extern const bclass be_class_lv_roller; extern const bclass be_class_lv_slider; extern const bclass be_class_lv_spinbox; @@ -1099,6 +1108,9 @@ const be_ntv_class_def_t lv_classes[] = { { "lv_msgbox", &be_class_lv_msgbox, lv_msgbox_func, sizeof(lv_msgbox_func) / sizeof(lv_msgbox_func[0]) }, #endif // BE_LV_WIDGET_MSGBOX { "lv_obj", &be_class_lv_obj, lv_obj_func, sizeof(lv_obj_func) / sizeof(lv_obj_func[0]) }, +#ifdef BE_LV_WIDGET_QRCODE + { "lv_qrcode", &be_class_lv_qrcode, lv_qrcode_func, sizeof(lv_qrcode_func) / sizeof(lv_qrcode_func[0]) }, +#endif // BE_LV_WIDGET_QRCODE #ifdef BE_LV_WIDGET_ROLLER { "lv_roller", &be_class_lv_roller, lv_roller_func, sizeof(lv_roller_func) / sizeof(lv_roller_func[0]) }, #endif // BE_LV_WIDGET_ROLLER @@ -1140,6 +1152,10 @@ const size_t lv_classes_size = sizeof(lv_classes) / sizeof(lv_classes[0]); /* `lv_group` methods */ int be_ntv_lv_group_init(bvm *vm) { return be_call_c_func(vm, (void*) &lv_group_create, "+_p", ""); } /* `lv_indev` methods */ + /* `lv_qrcode` methods */ +#ifdef BE_LV_WIDGET_QRCODE + int be_ntv_lv_qrcode_init(bvm *vm) { return be_call_c_func(vm, (void*) &lv_qrcode_create, "+_p", "(lv.lv_obj)i(lv.lv_color)(lv.lv_color)"); } +#endif // BE_LV_WIDGET_QRCODE /* `lv_chart` methods */ #ifdef BE_LV_WIDGET_CHART int be_ntv_lv_chart_init(bvm *vm) { return be_call_c_func(vm, (void*) &lv_chart_create, "+_p", "(lv.lv_obj)"); } diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c index 29ef33819..14707d20b 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c @@ -141,9 +141,6 @@ const be_ntv_func_def_t lv_func[] = { { "palette_lighten", { (const void*) &lv_palette_lighten, "lv.lv_color", "ii" } }, { "palette_main", { (const void*) &lv_palette_main, "lv.lv_color", "i" } }, { "pct", { (const void*) &lv_pct, "i", "i" } }, - { "qrcode_create", { (const void*) &lv_qrcode_create, "lv.lv_obj", "(lv.lv_obj)i(lv.lv_color)(lv.lv_color)" } }, - { "qrcode_delete", { (const void*) &lv_qrcode_delete, "", "(lv.lv_obj)" } }, - { "qrcode_update", { (const void*) &lv_qrcode_update, "i", "(lv.lv_obj).i" } }, { "rand", { (const void*) &lv_rand, "i", "ii" } }, { "refr_now", { (const void*) &lv_refr_now, "", "(lv.lv_disp)" } }, { "refr_obj", { (const void*) &lv_refr_obj, "", "(lv.lv_draw_ctx)(lv.lv_obj)" } }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_widgets_lib.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_widgets_lib.c index 6629dcc78..f2811fe5c 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_widgets_lib.c +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_widgets_lib.c @@ -585,6 +585,11 @@ extern int lvbe_indev_get_vect(bvm *vm); extern int lvbe_indev_wait_release(bvm *vm); extern int lvbe_indev_search_obj(bvm *vm); +/* `lv_qrcode` external functions definitions */ +extern int lvbe_qrcode_create(bvm *vm); +extern int lvbe_qrcode_update(bvm *vm); +extern int lvbe_qrcode_delete(bvm *vm); + /* `lv_chart` external functions definitions */ extern int lvbe_chart_create(bvm *vm); extern int lvbe_chart_set_type(bvm *vm); @@ -948,6 +953,7 @@ extern int be_ntv_lv_disp_init(bvm *vm); extern int be_ntv_lv_obj_init(bvm *vm); extern int be_ntv_lv_group_init(bvm *vm); extern int be_ntv_lv_indev_init(bvm *vm); +extern int be_ntv_lv_qrcode_init(bvm *vm); extern int be_ntv_lv_chart_init(bvm *vm); extern int be_ntv_lv_colorwheel_init(bvm *vm); extern int be_ntv_lv_imgbtn_init(bvm *vm); @@ -996,6 +1002,7 @@ extern const bclass be_class_lv_line; extern const bclass be_class_lv_meter; extern const bclass be_class_lv_msgbox; extern const bclass be_class_lv_obj; +extern const bclass be_class_lv_qrcode; extern const bclass be_class_lv_roller; extern const bclass be_class_lv_slider; extern const bclass be_class_lv_spinbox; @@ -1193,6 +1200,22 @@ be_local_class(lv_img, ); /*******************************************************************/ +/******************************************************************** +** Solidified class: lv_qrcode +********************************************************************/ +extern const bclass be_class_lv_obj; +be_local_class(lv_qrcode, + 0, + &be_class_lv_obj, + be_nested_map(2, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key(_class, -1), be_const_comptr(&lv_qrcode_class) }, + { be_const_key(init, -1), be_const_func(be_ntv_lv_qrcode_init) }, + })), + (be_str_literal("lv_qrcode")) +); +/*******************************************************************/ + /******************************************************************** ** Solidified class: lv_chart ********************************************************************/ diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py index 2e33c9a83..bb36141e3 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py @@ -188,8 +188,11 @@ lv_widgets = ['arc', 'bar', 'btn', 'btnmatrix', 'canvas', 'checkbox', 'dropdown', 'img', 'label', 'line', 'roller', 'slider', 'switch', 'table', 'textarea' ] # extra widgets - lv_widgets = lv_widgets + [ 'chart', 'colorwheel', 'imgbtn', 'led', 'meter', 'msgbox', 'spinbox', 'spinner' ] + +# add qrcode +lv_widgets = lv_widgets + [ 'qrcode' ] + lv_prefix = ['obj', 'group', 'style', 'indev', 'disp', 'timer', 'anim'] + lv_widgets # define here widget inheritance because it's hard to deduce from source diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index c934ffde7..6a197c5d5 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1081,6 +1081,8 @@ #define BE_LV_WIDGET_SPINBOX #define BE_LV_WIDGET_SPINNER + #define BE_LV_WIDGET_QRCODE + #endif // ESP32 /*********************************************************************************************\ From 41414e63e4011bc44748f8fc5ba36193a6491192 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 23 Apr 2022 22:48:30 +0200 Subject: [PATCH 061/376] Fix rev.0 - do not show --- tasmota/support_esp.ino | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index d83e851fe..8c347b56f 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -773,20 +773,13 @@ typedef struct { } String GetDeviceHardwareRevision(void) { -/* -// The structure represents information about the chip -typedef struct { - esp_chip_model_t model; //!< chip model, one of esp_chip_model_t - uint32_t features; //!< bit mask of CHIP_FEATURE_x feature flags - uint8_t cores; //!< number of CPU cores - uint8_t revision; //!< chip revision number -} esp_chip_info_t; -*/ esp_chip_info_t chip_info; esp_chip_info(&chip_info); - char revision[12]; - snprintf_P(revision, sizeof(revision), PSTR(" rev.%d"), chip_info.revision); + char revision[10] = { 0 }; + if (chip_info.revision) { + snprintf_P(revision, sizeof(revision), PSTR(" rev.%d"), chip_info.revision); + } return revision; } From efb2423b8810c87ef4b55c7ed62074a688d60ac8 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 24 Apr 2022 10:18:40 +0200 Subject: [PATCH 062/376] OpenHASP support for qrcode --- .../berry_tasmota/src/be_lv_openhasp.c | 2142 ++++++++++------- .../openhasp_src/openhasp_core/openhasp.be | 45 +- 2 files changed, 1268 insertions(+), 919 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index bac85fe1d..ba32c3bcc 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -39,6 +39,7 @@ extern const bclass be_class_lv_table; extern const bclass be_class_lv_textarea; extern const bclass be_class_lv_theme; extern const bclass be_class_lv_timer; +extern const bclass be_class_lv_qrcode; /******************************************************************** @@ -3655,69 +3656,73 @@ be_local_class(lvh_obj, { be_const_key_literal("set_text_font", 23), be_const_closure(lvh_obj_set_text_font_closure) }, { be_const_key_literal("set_pad_left2", 47), be_const_closure(lvh_obj_set_pad_left2_closure) }, { be_const_key_literal("_attr_map", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(61, + be_const_map( * be_nested_map(65, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("action", 57), be_const_nil() }, - { be_const_key_literal("text", -1), be_const_nil() }, - { be_const_key_literal("text_color", -1), be_const_nil() }, - { be_const_key_literal("val", 42), be_nested_str_literal("value") }, - { be_const_key_literal("pad_right", -1), be_nested_str_literal("style_pad_right") }, - { be_const_key_literal("pad_left", -1), be_nested_str_literal("style_pad_left") }, - { be_const_key_literal("enabled", -1), be_const_nil() }, - { be_const_key_literal("hidden", -1), be_const_nil() }, - { be_const_key_literal("toggle", 44), be_const_nil() }, - { be_const_key_literal("pad_bottom", -1), be_nested_str_literal("style_pad_bottom") }, - { be_const_key_literal("line_width1", -1), be_const_nil() }, + { be_const_key_literal("x", -1), be_nested_str_literal("x") }, { be_const_key_literal("pad_left2", -1), be_const_nil() }, - { be_const_key_literal("rotation", 36), be_nested_str_literal("rotation") }, - { be_const_key_literal("bg_grad_color", -1), be_nested_str_literal("style_bg_grad_color") }, - { be_const_key_literal("x", 35), be_nested_str_literal("x") }, - { be_const_key_literal("border_side", -1), be_nested_str_literal("style_border_side") }, - { be_const_key_literal("border_width", -1), be_nested_str_literal("style_border_width") }, - { be_const_key_literal("h", 1), be_nested_str_literal("height") }, - { be_const_key_literal("type", 27), be_const_nil() }, - { be_const_key_literal("pad_all2", -1), be_const_nil() }, - { be_const_key_literal("text_rule_format", -1), be_const_nil() }, - { be_const_key_literal("image_recolor_opa", -1), be_nested_str_literal("style_img_recolor_opa") }, - { be_const_key_literal("border_color", -1), be_nested_str_literal("style_border_color") }, - { be_const_key_literal("src", -1), be_nested_str_literal("src") }, - { be_const_key_literal("val_rule_formula", -1), be_const_nil() }, - { be_const_key_literal("mode", -1), be_const_nil() }, - { be_const_key_literal("text_font", 19), be_const_nil() }, - { be_const_key_literal("y", -1), be_nested_str_literal("y") }, - { be_const_key_literal("align", -1), be_const_nil() }, - { be_const_key_literal("pad_bottom2", 41), be_const_nil() }, - { be_const_key_literal("pad_right2", 3), be_const_nil() }, - { be_const_key_literal("line_width", -1), be_const_nil() }, - { be_const_key_literal("bg_grad_dir", 10), be_nested_str_literal("style_bg_grad_dir") }, - { be_const_key_literal("text_rule", -1), be_const_nil() }, - { be_const_key_literal("text_rule_formula", 0), be_const_nil() }, + { be_const_key_literal("end_angle", -1), be_nested_str_literal("bg_end_angle") }, + { be_const_key_literal("rotation", -1), be_nested_str_literal("rotation") }, { be_const_key_literal("radius", -1), be_nested_str_literal("style_radius") }, - { be_const_key_literal("bg_opa", -1), be_nested_str_literal("style_bg_opa") }, - { be_const_key_literal("bg_color", -1), be_nested_str_literal("style_bg_color") }, - { be_const_key_literal("pad_all", -1), be_nested_str_literal("style_pad_all") }, - { be_const_key_literal("pad_top2", -1), be_const_nil() }, - { be_const_key_literal("pad_top", 7), be_nested_str_literal("style_pad_top") }, - { be_const_key_literal("click", 49), be_const_nil() }, - { be_const_key_literal("line_color", -1), be_nested_str_literal("style_line_color") }, - { be_const_key_literal("value_color", -1), be_const_nil() }, - { be_const_key_literal("start_angle", -1), be_nested_str_literal("bg_start_angle") }, - { be_const_key_literal("speed", -1), be_const_nil() }, - { be_const_key_literal("angle", -1), be_const_nil() }, - { be_const_key_literal("asjustable", 51), be_const_nil() }, - { be_const_key_literal("end_angle1", 46), be_nested_str_literal("end_angle") }, - { be_const_key_literal("min", -1), be_const_nil() }, - { be_const_key_literal("end_angle", 21), be_nested_str_literal("bg_end_angle") }, - { be_const_key_literal("start_angle1", -1), be_nested_str_literal("start_angle") }, { be_const_key_literal("value_ofs_y", -1), be_const_nil() }, - { be_const_key_literal("image_recolor", -1), be_nested_str_literal("style_img_recolor") }, - { be_const_key_literal("value_str", 2), be_const_nil() }, - { be_const_key_literal("radius2", 59), be_const_nil() }, + { be_const_key_literal("val", 38), be_nested_str_literal("value") }, + { be_const_key_literal("line_width", -1), be_const_nil() }, + { be_const_key_literal("speed", 57), be_const_nil() }, + { be_const_key_literal("radius2", -1), be_const_nil() }, + { be_const_key_literal("qr_text", -1), be_const_nil() }, + { be_const_key_literal("text_rule_formula", 42), be_const_nil() }, + { be_const_key_literal("bg_grad_dir", -1), be_nested_str_literal("style_bg_grad_dir") }, + { be_const_key_literal("mode", 59), be_const_nil() }, + { be_const_key_literal("bg_opa", -1), be_nested_str_literal("style_bg_opa") }, + { be_const_key_literal("text", -1), be_const_nil() }, + { be_const_key_literal("value_color", -1), be_const_nil() }, + { be_const_key_literal("enabled", 29), be_const_nil() }, + { be_const_key_literal("text_font", -1), be_const_nil() }, + { be_const_key_literal("text_rule_format", -1), be_const_nil() }, + { be_const_key_literal("value_str", 3), be_const_nil() }, + { be_const_key_literal("border_width", 62), be_nested_str_literal("style_border_width") }, + { be_const_key_literal("max", -1), be_const_nil() }, + { be_const_key_literal("angle", -1), be_const_nil() }, + { be_const_key_literal("text_rule", 21), be_const_nil() }, + { be_const_key_literal("min", 19), be_const_nil() }, + { be_const_key_literal("start_angle", 32), be_nested_str_literal("bg_start_angle") }, + { be_const_key_literal("qr_light_color", -1), be_const_nil() }, + { be_const_key_literal("border_side", -1), be_nested_str_literal("style_border_side") }, + { be_const_key_literal("src", -1), be_nested_str_literal("src") }, + { be_const_key_literal("w", 35), be_nested_str_literal("width") }, + { be_const_key_literal("value_font", 18), be_const_nil() }, + { be_const_key_literal("pad_bottom2", -1), be_const_nil() }, { be_const_key_literal("value_ofs_x", -1), be_const_nil() }, - { be_const_key_literal("val_rule", -1), be_const_nil() }, - { be_const_key_literal("w", -1), be_nested_str_literal("width") }, - { be_const_key_literal("value_font", -1), be_const_nil() }, - { be_const_key_literal("max", 11), be_const_nil() }, + { be_const_key_literal("pad_right", 23), be_nested_str_literal("style_pad_right") }, + { be_const_key_literal("pad_left", -1), be_nested_str_literal("style_pad_left") }, + { be_const_key_literal("h", -1), be_nested_str_literal("height") }, + { be_const_key_literal("line_color", 43), be_nested_str_literal("style_line_color") }, + { be_const_key_literal("image_recolor", -1), be_nested_str_literal("style_img_recolor") }, + { be_const_key_literal("qr_dark_color", 22), be_const_nil() }, + { be_const_key_literal("start_angle1", -1), be_nested_str_literal("start_angle") }, + { be_const_key_literal("align", 30), be_const_nil() }, + { be_const_key_literal("text_color", -1), be_const_nil() }, + { be_const_key_literal("y", -1), be_nested_str_literal("y") }, + { be_const_key_literal("val_rule", 15), be_const_nil() }, + { be_const_key_literal("qr_size", 49), be_const_nil() }, + { be_const_key_literal("bg_grad_color", -1), be_nested_str_literal("style_bg_grad_color") }, + { be_const_key_literal("asjustable", 54), be_const_nil() }, + { be_const_key_literal("hidden", 40), be_const_nil() }, + { be_const_key_literal("pad_top2", -1), be_const_nil() }, + { be_const_key_literal("pad_top", -1), be_nested_str_literal("style_pad_top") }, + { be_const_key_literal("end_angle1", 37), be_nested_str_literal("end_angle") }, + { be_const_key_literal("click", -1), be_const_nil() }, + { be_const_key_literal("pad_right2", -1), be_const_nil() }, + { be_const_key_literal("action", -1), be_const_nil() }, + { be_const_key_literal("image_recolor_opa", -1), be_nested_str_literal("style_img_recolor_opa") }, + { be_const_key_literal("border_color", 33), be_nested_str_literal("style_border_color") }, + { be_const_key_literal("toggle", -1), be_const_nil() }, + { be_const_key_literal("pad_all2", -1), be_const_nil() }, + { be_const_key_literal("type", -1), be_const_nil() }, + { be_const_key_literal("line_width1", -1), be_const_nil() }, + { be_const_key_literal("val_rule_formula", -1), be_const_nil() }, + { be_const_key_literal("pad_bottom", -1), be_nested_str_literal("style_pad_bottom") }, + { be_const_key_literal("bg_color", -1), be_nested_str_literal("style_bg_color") }, + { be_const_key_literal("pad_all", 55), be_nested_str_literal("style_pad_all") }, })) ) } )) }, { be_const_key_literal("get_value_ofs_y", -1), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, { be_const_key_literal("_text_rule", -1), be_const_var(8) }, @@ -4635,6 +4640,306 @@ void be_load_lvh_dropdown_class(bvm *vm) { be_pop(vm, 1); } +/******************************************************************** +** Solidified function: get_qr_size +********************************************************************/ +be_local_closure(lvh_qrcode_get_qr_size, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_qr_size"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_qr_size +********************************************************************/ +be_local_closure(lvh_qrcode_set_qr_size, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("set_qr_size"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_qr_light_color +********************************************************************/ +be_local_closure(lvh_qrcode_get_qr_light_color, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_qr_light_color"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_qr_dark_color +********************************************************************/ +be_local_closure(lvh_qrcode_get_qr_dark_color, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_qr_dark_color"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(lvh_qrcode_init, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_literal("_page"), + /* K1 */ be_nested_str_literal("find"), + /* K2 */ be_nested_str_literal("qr_size"), + /* K3 */ be_nested_str_literal("parse_color"), + /* K4 */ be_nested_str_literal("qr_dark_color"), + /* K5 */ be_nested_str_literal("#000000"), + /* K6 */ be_nested_str_literal("qr_light_color"), + /* K7 */ be_nested_str_literal("#FFFFFF"), + /* K8 */ be_nested_str_literal("_lv_obj"), + /* K9 */ be_nested_str_literal("lv"), + /* K10 */ be_nested_str_literal("qrcode"), + /* K11 */ be_nested_str_literal("post_init"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x90020002, // 0000 SETMBR R0 K0 R2 + 0x8C100701, // 0001 GETMET R4 R3 K1 + 0x58180002, // 0002 LDCONST R6 K2 + 0x541E0063, // 0003 LDINT R7 100 + 0x7C100600, // 0004 CALL R4 3 + 0x8C140103, // 0005 GETMET R5 R0 K3 + 0x8C1C0701, // 0006 GETMET R7 R3 K1 + 0x58240004, // 0007 LDCONST R9 K4 + 0x58280005, // 0008 LDCONST R10 K5 + 0x7C1C0600, // 0009 CALL R7 3 + 0x7C140400, // 000A CALL R5 2 + 0x8C180103, // 000B GETMET R6 R0 K3 + 0x8C200701, // 000C GETMET R8 R3 K1 + 0x58280006, // 000D LDCONST R10 K6 + 0x582C0007, // 000E LDCONST R11 K7 + 0x7C200600, // 000F CALL R8 3 + 0x7C180400, // 0010 CALL R6 2 + 0xB81E1200, // 0011 GETNGBL R7 K9 + 0x8C1C0F0A, // 0012 GETMET R7 R7 K10 + 0x5C240200, // 0013 MOVE R9 R1 + 0x5C280800, // 0014 MOVE R10 R4 + 0x5C2C0A00, // 0015 MOVE R11 R5 + 0x5C300C00, // 0016 MOVE R12 R6 + 0x7C1C0A00, // 0017 CALL R7 5 + 0x90021007, // 0018 SETMBR R0 K8 R7 + 0x8C1C010B, // 0019 GETMET R7 R0 K11 + 0x7C1C0200, // 001A CALL R7 1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_qr_light_color +********************************************************************/ +be_local_closure(lvh_qrcode_set_qr_light_color, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("set_qr_light_color"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_qr_text +********************************************************************/ +be_local_closure(lvh_qrcode_get_qr_text, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_qr_text"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_qr_dark_color +********************************************************************/ +be_local_closure(lvh_qrcode_set_qr_dark_color, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("set_qr_dark_color"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_qr_text +********************************************************************/ +be_local_closure(lvh_qrcode_set_qr_text, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("update"), + }), + be_str_literal("set_qr_text"), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C040400, // 0003 MOVE R1 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x8C080501, // 0005 GETMET R2 R2 K1 + 0x5C100200, // 0006 MOVE R4 R1 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x5C180200, // 0008 MOVE R6 R1 + 0x7C140200, // 0009 CALL R5 1 + 0x7C080600, // 000A CALL R2 3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: lvh_qrcode +********************************************************************/ +extern const bclass be_class_lvh_obj; +be_local_class(lvh_qrcode, + 0, + &be_class_lvh_obj, + be_nested_map(10, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_literal("set_qr_text", -1), be_const_closure(lvh_qrcode_set_qr_text_closure) }, + { be_const_key_literal("set_qr_size", -1), be_const_closure(lvh_qrcode_set_qr_size_closure) }, + { be_const_key_literal("get_qr_light_color", 6), be_const_closure(lvh_qrcode_get_qr_light_color_closure) }, + { be_const_key_literal("set_qr_dark_color", -1), be_const_closure(lvh_qrcode_set_qr_dark_color_closure) }, + { be_const_key_literal("get_qr_text", -1), be_const_closure(lvh_qrcode_get_qr_text_closure) }, + { be_const_key_literal("init", -1), be_const_closure(lvh_qrcode_init_closure) }, + { be_const_key_literal("set_qr_light_color", -1), be_const_closure(lvh_qrcode_set_qr_light_color_closure) }, + { be_const_key_literal("_lv_class", 4), be_const_class(be_class_lv_qrcode) }, + { be_const_key_literal("get_qr_dark_color", 3), be_const_closure(lvh_qrcode_get_qr_dark_color_closure) }, + { be_const_key_literal("get_qr_size", 0), be_const_closure(lvh_qrcode_get_qr_size_closure) }, + })), + be_str_literal("lvh_qrcode") +); +/*******************************************************************/ + +void be_load_lvh_qrcode_class(bvm *vm) { + be_pushntvclass(vm, &be_class_lvh_qrcode); + be_setglobal(vm, "lvh_qrcode"); + be_pop(vm, 1); +} + /******************************************************************** ** Solidified function: _anonymous_ ********************************************************************/ @@ -4664,6 +4969,118 @@ be_local_closure(openhasp__anonymous_, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: do_action +********************************************************************/ +be_local_closure(OpenHASP_do_action, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_literal("lv"), + /* K1 */ be_nested_str_literal("EVENT_CLICKED"), + /* K2 */ be_nested_str_literal("_action"), + /* K3 */ be_nested_str_literal("lvh_pages"), + /* K4 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K5 */ be_nested_str_literal("pages_list_sorted"), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str_literal("prev"), + /* K8 */ be_nested_str_literal("next"), + /* K9 */ be_nested_str_literal("back"), + /* K10 */ be_nested_str_literal("re_page_target"), + /* K11 */ be_nested_str_literal("match"), + /* K12 */ be_const_int(0), + /* K13 */ be_nested_str_literal("show"), + }), + be_str_literal("do_action"), + &be_const_str_solidified, + ( &(const binstruction[74]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x200C0403, // 0002 NE R3 R2 R3 + 0x780E0000, // 0003 JMPF R3 #0005 + 0x80000600, // 0004 RET 0 + 0x880C0302, // 0005 GETMBR R3 R1 K2 + 0x88100104, // 0006 GETMBR R4 R0 K4 + 0x88140103, // 0007 GETMBR R5 R0 K3 + 0x94100A04, // 0008 GETIDX R4 R5 R4 + 0x4C140000, // 0009 LDNIL R5 + 0x8C180105, // 000A GETMET R6 R0 K5 + 0x88200104, // 000B GETMBR R8 R0 K4 + 0x7C180400, // 000C CALL R6 2 + 0x601C000C, // 000D GETGBL R7 G12 + 0x5C200C00, // 000E MOVE R8 R6 + 0x7C1C0200, // 000F CALL R7 1 + 0x181C0F06, // 0010 LE R7 R7 K6 + 0x781E0000, // 0011 JMPF R7 #0013 + 0x80000E00, // 0012 RET 0 + 0x1C1C0707, // 0013 EQ R7 R3 K7 + 0x781E0009, // 0014 JMPF R7 #001F + 0x601C0009, // 0015 GETGBL R7 G9 + 0x88200907, // 0016 GETMBR R8 R4 K7 + 0x7C1C0200, // 0017 CALL R7 1 + 0x5C140E00, // 0018 MOVE R5 R7 + 0x4C1C0000, // 0019 LDNIL R7 + 0x1C1C0A07, // 001A EQ R7 R5 R7 + 0x781E0001, // 001B JMPF R7 #001E + 0x541DFFFE, // 001C LDINT R7 -1 + 0x94140C07, // 001D GETIDX R5 R6 R7 + 0x70020020, // 001E JMP #0040 + 0x1C1C0708, // 001F EQ R7 R3 K8 + 0x781E0008, // 0020 JMPF R7 #002A + 0x601C0009, // 0021 GETGBL R7 G9 + 0x88200908, // 0022 GETMBR R8 R4 K8 + 0x7C1C0200, // 0023 CALL R7 1 + 0x5C140E00, // 0024 MOVE R5 R7 + 0x4C1C0000, // 0025 LDNIL R7 + 0x1C1C0A07, // 0026 EQ R7 R5 R7 + 0x781E0000, // 0027 JMPF R7 #0029 + 0x94140D06, // 0028 GETIDX R5 R6 K6 + 0x70020015, // 0029 JMP #0040 + 0x1C1C0709, // 002A EQ R7 R3 K9 + 0x781E0008, // 002B JMPF R7 #0035 + 0x601C0009, // 002C GETGBL R7 G9 + 0x88200909, // 002D GETMBR R8 R4 K9 + 0x7C1C0200, // 002E CALL R7 1 + 0x5C140E00, // 002F MOVE R5 R7 + 0x4C1C0000, // 0030 LDNIL R7 + 0x1C1C0A07, // 0031 EQ R7 R5 R7 + 0x781E0000, // 0032 JMPF R7 #0034 + 0x58140006, // 0033 LDCONST R5 K6 + 0x7002000A, // 0034 JMP #0040 + 0x881C010A, // 0035 GETMBR R7 R0 K10 + 0x8C1C0F0B, // 0036 GETMET R7 R7 K11 + 0x5C240600, // 0037 MOVE R9 R3 + 0x7C1C0400, // 0038 CALL R7 2 + 0x781E0005, // 0039 JMPF R7 #0040 + 0x601C0009, // 003A GETGBL R7 G9 + 0x5421FFFE, // 003B LDINT R8 -1 + 0x40220C08, // 003C CONNECT R8 K6 R8 + 0x94200608, // 003D GETIDX R8 R3 R8 + 0x7C1C0200, // 003E CALL R7 1 + 0x5C140E00, // 003F MOVE R5 R7 + 0x4C1C0000, // 0040 LDNIL R7 + 0x201C0A07, // 0041 NE R7 R5 R7 + 0x781E0005, // 0042 JMPF R7 #0049 + 0x241C0B0C, // 0043 GT R7 R5 K12 + 0x781E0003, // 0044 JMPF R7 #0049 + 0x881C0103, // 0045 GETMBR R7 R0 K3 + 0x941C0E05, // 0046 GETIDX R7 R7 R5 + 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 + 0x7C1C0200, // 0048 CALL R7 1 + 0x80000000, // 0049 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: pages_list_sorted ********************************************************************/ @@ -4744,6 +5161,713 @@ be_local_closure(OpenHASP_pages_list_sorted, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_page_cur +********************************************************************/ +be_local_closure(OpenHASP_get_page_cur, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("lvh_pages"), + /* K1 */ be_nested_str_literal("lvh_page_cur_idx"), + }), + be_str_literal("get_page_cur"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x94040401, // 0002 GETIDX R1 R2 R1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(OpenHASP_start, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[33]) { /* constants */ + /* K0 */ be_nested_str_literal("path"), + /* K1 */ be_nested_str_literal("def_templ_name"), + /* K2 */ be_nested_str_literal("exists"), + /* K3 */ be_nested_str_literal("file '"), + /* K4 */ be_nested_str_literal("' not found"), + /* K5 */ be_nested_str_literal("io_erorr"), + /* K6 */ be_nested_str_literal("lv"), + /* K7 */ be_nested_str_literal("start"), + /* K8 */ be_nested_str_literal("dark"), + /* K9 */ be_nested_str_literal("hres"), + /* K10 */ be_nested_str_literal("get_hor_res"), + /* K11 */ be_nested_str_literal("vres"), + /* K12 */ be_nested_str_literal("get_ver_res"), + /* K13 */ be_nested_str_literal("scr"), + /* K14 */ be_nested_str_literal("scr_act"), + /* K15 */ be_nested_str_literal("r16"), + /* K16 */ be_nested_str_literal("font_embedded"), + /* K17 */ be_nested_str_literal("robotocondensed"), + /* K18 */ be_nested_str_literal("montserrat"), + /* K19 */ be_nested_str_literal("theme_openhasp_init"), + /* K20 */ be_const_int(0), + /* K21 */ be_nested_str_literal("color"), + /* K22 */ be_const_int(16711935), + /* K23 */ be_const_int(3158064), + /* K24 */ be_nested_str_literal("get_disp"), + /* K25 */ be_nested_str_literal("set_theme"), + /* K26 */ be_nested_str_literal("set_style_bg_color"), + /* K27 */ be_const_int(16777215), + /* K28 */ be_nested_str_literal("theme_apply"), + /* K29 */ be_nested_str_literal("layer_top"), + /* K30 */ be_nested_str_literal("set_style_bg_opa"), + /* K31 */ be_nested_str_literal("lvh_pages"), + /* K32 */ be_nested_str_literal("_load"), + }), + be_str_literal("start"), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C100404, // 0002 EQ R4 R2 R4 + 0x78120000, // 0003 JMPF R4 #0005 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C100702, // 0005 GETMET R4 R3 K2 + 0x5C180400, // 0006 MOVE R6 R2 + 0x7C100400, // 0007 CALL R4 2 + 0x74120002, // 0008 JMPT R4 #000C + 0x00120602, // 0009 ADD R4 K3 R2 + 0x00100904, // 000A ADD R4 R4 K4 + 0xB0060A04, // 000B RAISE 1 K5 R4 + 0xB8120C00, // 000C GETNGBL R4 K6 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x7C100200, // 000E CALL R4 1 + 0x60100017, // 000F GETGBL R4 G23 + 0x5C140200, // 0010 MOVE R5 R1 + 0x7C100200, // 0011 CALL R4 1 + 0x90021004, // 0012 SETMBR R0 K8 R4 + 0xB8120C00, // 0013 GETNGBL R4 K6 + 0x8C10090A, // 0014 GETMET R4 R4 K10 + 0x7C100200, // 0015 CALL R4 1 + 0x90021204, // 0016 SETMBR R0 K9 R4 + 0xB8120C00, // 0017 GETNGBL R4 K6 + 0x8C10090C, // 0018 GETMET R4 R4 K12 + 0x7C100200, // 0019 CALL R4 1 + 0x90021604, // 001A SETMBR R0 K11 R4 + 0xB8120C00, // 001B GETNGBL R4 K6 + 0x8C10090E, // 001C GETMET R4 R4 K14 + 0x7C100200, // 001D CALL R4 1 + 0x90021A04, // 001E SETMBR R0 K13 R4 + 0xA8020007, // 001F EXBLK 0 #0028 + 0xB8120C00, // 0020 GETNGBL R4 K6 + 0x8C100910, // 0021 GETMET R4 R4 K16 + 0x58180011, // 0022 LDCONST R6 K17 + 0x541E000F, // 0023 LDINT R7 16 + 0x7C100600, // 0024 CALL R4 3 + 0x90021E04, // 0025 SETMBR R0 K15 R4 + 0xA8040001, // 0026 EXBLK 1 1 + 0x70020009, // 0027 JMP #0032 + 0xAC100000, // 0028 CATCH R4 0 0 + 0x70020006, // 0029 JMP #0031 + 0xB8120C00, // 002A GETNGBL R4 K6 + 0x8C100910, // 002B GETMET R4 R4 K16 + 0x58180012, // 002C LDCONST R6 K18 + 0x541E000D, // 002D LDINT R7 14 + 0x7C100600, // 002E CALL R4 3 + 0x90021E04, // 002F SETMBR R0 K15 R4 + 0x70020000, // 0030 JMP #0032 + 0xB0080000, // 0031 RAISE 2 R0 R0 + 0xB8120C00, // 0032 GETNGBL R4 K6 + 0x8C100913, // 0033 GETMET R4 R4 K19 + 0x58180014, // 0034 LDCONST R6 K20 + 0xB81E0C00, // 0035 GETNGBL R7 K6 + 0x8C1C0F15, // 0036 GETMET R7 R7 K21 + 0x58240016, // 0037 LDCONST R9 K22 + 0x7C1C0400, // 0038 CALL R7 2 + 0xB8220C00, // 0039 GETNGBL R8 K6 + 0x8C201115, // 003A GETMET R8 R8 K21 + 0x58280017, // 003B LDCONST R10 K23 + 0x7C200400, // 003C CALL R8 2 + 0x88240108, // 003D GETMBR R9 R0 K8 + 0x8828010F, // 003E GETMBR R10 R0 K15 + 0x7C100C00, // 003F CALL R4 6 + 0x8814010D, // 0040 GETMBR R5 R0 K13 + 0x8C140B18, // 0041 GETMET R5 R5 K24 + 0x7C140200, // 0042 CALL R5 1 + 0x8C140B19, // 0043 GETMET R5 R5 K25 + 0x5C1C0800, // 0044 MOVE R7 R4 + 0x7C140400, // 0045 CALL R5 2 + 0x8814010D, // 0046 GETMBR R5 R0 K13 + 0x8C140B1A, // 0047 GETMET R5 R5 K26 + 0x881C0108, // 0048 GETMBR R7 R0 K8 + 0x781E0004, // 0049 JMPF R7 #004F + 0xB81E0C00, // 004A GETNGBL R7 K6 + 0x8C1C0F15, // 004B GETMET R7 R7 K21 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C1C0400, // 004D CALL R7 2 + 0x70020003, // 004E JMP #0053 + 0xB81E0C00, // 004F GETNGBL R7 K6 + 0x8C1C0F15, // 0050 GETMET R7 R7 K21 + 0x5824001B, // 0051 LDCONST R9 K27 + 0x7C1C0400, // 0052 CALL R7 2 + 0x58200014, // 0053 LDCONST R8 K20 + 0x7C140600, // 0054 CALL R5 3 + 0xB8160C00, // 0055 GETNGBL R5 K6 + 0x8C140B1C, // 0056 GETMET R5 R5 K28 + 0xB81E0C00, // 0057 GETNGBL R7 K6 + 0x8C1C0F1D, // 0058 GETMET R7 R7 K29 + 0x7C1C0200, // 0059 CALL R7 1 + 0x7C140400, // 005A CALL R5 2 + 0xB8160C00, // 005B GETNGBL R5 K6 + 0x8C140B1D, // 005C GETMET R5 R5 K29 + 0x7C140200, // 005D CALL R5 1 + 0x8C140B1E, // 005E GETMET R5 R5 K30 + 0x581C0014, // 005F LDCONST R7 K20 + 0x58200014, // 0060 LDCONST R8 K20 + 0x7C140600, // 0061 CALL R5 3 + 0x60140013, // 0062 GETGBL R5 G19 + 0x7C140000, // 0063 CALL R5 0 + 0x90023E05, // 0064 SETMBR R0 K31 R5 + 0x8C140120, // 0065 GETMET R5 R0 K32 + 0x5C1C0400, // 0066 MOVE R7 R2 + 0x7C140400, // 0067 CALL R5 2 + 0x80000000, // 0068 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(OpenHASP_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("re"), + /* K1 */ be_nested_str_literal("re_page_target"), + /* K2 */ be_nested_str_literal("compile"), + /* K3 */ be_nested_str_literal("p\\d+"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080302, // 0001 GETMET R2 R1 K2 + 0x58100003, // 0002 LDCONST R4 K3 + 0x7C080400, // 0003 CALL R2 2 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_event +********************************************************************/ +be_local_closure(OpenHASP_register_event, /* name */ + be_nested_proto( + 13, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("event_dispatch"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68040000, // 0000 GETUPV R1 U0 + 0x8C040300, // 0001 GETMET R1 R1 K0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_literal("cb"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_nested_str_literal("event_cb"), + /* K3 */ be_nested_str_literal("gen_cb"), + /* K4 */ be_nested_str_literal("_lv_obj"), + /* K5 */ be_nested_str_literal("add_event_cb"), + /* K6 */ be_nested_str_literal("toptr"), + }), + be_str_literal("register_event"), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x4C180000, // 0003 LDNIL R6 + 0x1C140A06, // 0004 EQ R5 R5 R6 + 0x78160003, // 0005 JMPF R5 #000A + 0x8C140703, // 0006 GETMET R5 R3 K3 + 0x841C0000, // 0007 CLOSURE R7 P0 + 0x7C140400, // 0008 CALL R5 2 + 0x90020405, // 0009 SETMBR R0 K2 R5 + 0x88140304, // 000A GETMBR R5 R1 K4 + 0x8C180B05, // 000B GETMET R6 R5 K5 + 0x88200102, // 000C GETMBR R8 R0 K2 + 0x5C240400, // 000D MOVE R9 R2 + 0x8C280906, // 000E GETMET R10 R4 K6 + 0x5C300200, // 000F MOVE R12 R1 + 0x7C280400, // 0010 CALL R10 2 + 0x7C180800, // 0011 CALL R6 4 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_page +********************************************************************/ +be_local_closure(OpenHASP_parse_page, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_literal("has"), + /* K1 */ be_nested_str_literal("page"), + /* K2 */ be_nested_str_literal("int"), + /* K3 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K4 */ be_nested_str_literal("lvh_pages"), + /* K5 */ be_nested_str_literal("contains"), + /* K6 */ be_nested_str_literal("lvh_page"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("id"), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_literal("get_page_cur"), + /* K11 */ be_nested_str_literal("prev"), + /* K12 */ be_nested_str_literal("next"), + /* K13 */ be_nested_str_literal("back"), + }), + be_str_literal("parse_page"), + &be_const_str_solidified, + ( &(const binstruction[54]) { /* code */ + 0x8C080300, // 0000 GETMET R2 R1 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x780A0030, // 0003 JMPF R2 #0035 + 0x60080004, // 0004 GETGBL R2 G4 + 0x940C0301, // 0005 GETIDX R3 R1 K1 + 0x7C080200, // 0006 CALL R2 1 + 0x1C080502, // 0007 EQ R2 R2 K2 + 0x780A002B, // 0008 JMPF R2 #0035 + 0x60080009, // 0009 GETGBL R2 G9 + 0x940C0301, // 000A GETIDX R3 R1 K1 + 0x7C080200, // 000B CALL R2 1 + 0x90020602, // 000C SETMBR R0 K3 R2 + 0x880C0104, // 000D GETMBR R3 R0 K4 + 0x8C0C0705, // 000E GETMET R3 R3 K5 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x740E0006, // 0011 JMPT R3 #0019 + 0x880C0106, // 0012 GETMBR R3 R0 K6 + 0x88100104, // 0013 GETMBR R4 R0 K4 + 0x5C140600, // 0014 MOVE R5 R3 + 0x5C180400, // 0015 MOVE R6 R2 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x7C140400, // 0017 CALL R5 2 + 0x98100405, // 0018 SETIDX R4 R2 R5 + 0x8C0C0307, // 0019 GETMET R3 R1 K7 + 0x58140008, // 001A LDCONST R5 K8 + 0x7C0C0400, // 001B CALL R3 2 + 0x1C0C0709, // 001C EQ R3 R3 K9 + 0x780E0016, // 001D JMPF R3 #0035 + 0x8C0C010A, // 001E GETMET R3 R0 K10 + 0x7C0C0200, // 001F CALL R3 1 + 0x60100009, // 0020 GETGBL R4 G9 + 0x8C140307, // 0021 GETMET R5 R1 K7 + 0x581C000B, // 0022 LDCONST R7 K11 + 0x4C200000, // 0023 LDNIL R8 + 0x7C140600, // 0024 CALL R5 3 + 0x7C100200, // 0025 CALL R4 1 + 0x900E1604, // 0026 SETMBR R3 K11 R4 + 0x60100009, // 0027 GETGBL R4 G9 + 0x8C140307, // 0028 GETMET R5 R1 K7 + 0x581C000C, // 0029 LDCONST R7 K12 + 0x4C200000, // 002A LDNIL R8 + 0x7C140600, // 002B CALL R5 3 + 0x7C100200, // 002C CALL R4 1 + 0x900E1804, // 002D SETMBR R3 K12 R4 + 0x60100009, // 002E GETGBL R4 G9 + 0x8C140307, // 002F GETMET R5 R1 K7 + 0x581C000D, // 0030 LDCONST R7 K13 + 0x4C200000, // 0031 LDNIL R8 + 0x7C140600, // 0032 CALL R5 3 + 0x7C100200, // 0033 CALL R4 1 + 0x900E1A04, // 0034 SETMBR R3 K13 R4 + 0x80000000, // 0035 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: deinit +********************************************************************/ +be_local_closure(OpenHASP_deinit, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_val_rule"), + /* K1 */ be_nested_str_literal("tasmota"), + /* K2 */ be_nested_str_literal("remove_rule"), + /* K3 */ be_nested_str_literal("_text_rule"), + }), + be_str_literal("deinit"), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060004, // 0003 JMPF R1 #0009 + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0x5C100000, // 0007 MOVE R4 R0 + 0x7C040600, // 0008 CALL R1 3 + 0x88040103, // 0009 GETMBR R1 R0 K3 + 0x4C080000, // 000A LDNIL R2 + 0x20040202, // 000B NE R1 R1 R2 + 0x78060004, // 000C JMPF R1 #0012 + 0xB8060200, // 000D GETNGBL R1 K1 + 0x8C040302, // 000E GETMET R1 R1 K2 + 0x880C0103, // 000F GETMBR R3 R0 K3 + 0x5C100000, // 0010 MOVE R4 R0 + 0x7C040600, // 0011 CALL R1 3 + 0x80000000, // 0012 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: page_dir_to +********************************************************************/ +be_local_closure(OpenHASP_page_dir_to, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("pages_list_sorted"), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(1), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_literal("find"), + }), + be_str_literal("page_dir_to"), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x58100001, // 0001 LDCONST R4 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0403, // 0004 EQ R3 R2 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80060200, // 0006 RET 1 K1 + 0x600C000C, // 0007 GETGBL R3 G12 + 0x5C100400, // 0008 MOVE R4 R2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x18100702, // 000A LE R4 R3 K2 + 0x78120000, // 000B JMPF R4 #000D + 0x80060200, // 000C RET 1 K1 + 0x1C100703, // 000D EQ R4 R3 K3 + 0x78120000, // 000E JMPF R4 #0010 + 0x80060400, // 000F RET 1 K2 + 0x8C100504, // 0010 GETMET R4 R2 K4 + 0x5C180200, // 0011 MOVE R6 R1 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x1C140805, // 0014 EQ R5 R4 R5 + 0x78160000, // 0015 JMPF R5 #0017 + 0x80060200, // 0016 RET 1 K1 + 0x00140702, // 0017 ADD R5 R3 K2 + 0x0C140B03, // 0018 DIV R5 R5 K3 + 0x18140805, // 0019 LE R5 R4 R5 + 0x78160001, // 001A JMPF R5 #001D + 0x80060400, // 001B RET 1 K2 + 0x70020001, // 001C JMP #001F + 0x5415FFFE, // 001D LDINT R5 -1 + 0x80040A00, // 001E RET 1 R5 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _load +********************************************************************/ +be_local_closure(OpenHASP__load, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_literal("string"), + /* K1 */ be_nested_str_literal("json"), + /* K2 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_literal("lvh_page"), + /* K5 */ be_nested_str_literal("lvh_pages"), + /* K6 */ be_nested_str_literal("r"), + /* K7 */ be_nested_str_literal("read"), + /* K8 */ be_nested_str_literal("close"), + /* K9 */ be_nested_str_literal("split"), + /* K10 */ be_nested_str_literal("\n"), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_literal("load"), + /* K13 */ be_nested_str_literal("instance"), + /* K14 */ be_nested_str_literal("parse_page"), + /* K15 */ be_nested_str_literal("parse_obj"), + /* K16 */ be_nested_str_literal("remove"), + }), + be_str_literal("_load"), + &be_const_str_solidified, + ( &(const binstruction[54]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x90020503, // 0002 SETMBR R0 K2 K3 + 0x88100104, // 0003 GETMBR R4 R0 K4 + 0x88140105, // 0004 GETMBR R5 R0 K5 + 0x5C180800, // 0005 MOVE R6 R4 + 0x581C0003, // 0006 LDCONST R7 K3 + 0x5C200000, // 0007 MOVE R8 R0 + 0x7C180400, // 0008 CALL R6 2 + 0x98160606, // 0009 SETIDX R5 K3 R6 + 0x60140011, // 000A GETGBL R5 G17 + 0x5C180200, // 000B MOVE R6 R1 + 0x581C0006, // 000C LDCONST R7 K6 + 0x7C140400, // 000D CALL R5 2 + 0x8C180B07, // 000E GETMET R6 R5 K7 + 0x7C180200, // 000F CALL R6 1 + 0x8C1C0B08, // 0010 GETMET R7 R5 K8 + 0x7C1C0200, // 0011 CALL R7 1 + 0x8C1C0509, // 0012 GETMET R7 R2 K9 + 0x5C240C00, // 0013 MOVE R9 R6 + 0x5828000A, // 0014 LDCONST R10 K10 + 0x7C1C0600, // 0015 CALL R7 3 + 0x4C140000, // 0016 LDNIL R5 + 0x4C180000, // 0017 LDNIL R6 + 0x6020000C, // 0018 GETGBL R8 G12 + 0x5C240E00, // 0019 MOVE R9 R7 + 0x7C200200, // 001A CALL R8 1 + 0x2420110B, // 001B GT R8 R8 K11 + 0x78220015, // 001C JMPF R8 #0033 + 0x8C20070C, // 001D GETMET R8 R3 K12 + 0x94280F0B, // 001E GETIDX R10 R7 K11 + 0x7C200400, // 001F CALL R8 2 + 0x60240004, // 0020 GETGBL R9 G4 + 0x5C281000, // 0021 MOVE R10 R8 + 0x7C240200, // 0022 CALL R9 1 + 0x1C24130D, // 0023 EQ R9 R9 K13 + 0x78260008, // 0024 JMPF R9 #002E + 0x8C24010E, // 0025 GETMET R9 R0 K14 + 0x5C2C1000, // 0026 MOVE R11 R8 + 0x7C240400, // 0027 CALL R9 2 + 0x8C24010F, // 0028 GETMET R9 R0 K15 + 0x5C2C1000, // 0029 MOVE R11 R8 + 0x88300102, // 002A GETMBR R12 R0 K2 + 0x88340105, // 002B GETMBR R13 R0 K5 + 0x94301A0C, // 002C GETIDX R12 R13 R12 + 0x7C240600, // 002D CALL R9 3 + 0x4C200000, // 002E LDNIL R8 + 0x8C240F10, // 002F GETMET R9 R7 K16 + 0x582C000B, // 0030 LDCONST R11 K11 + 0x7C240400, // 0031 CALL R9 2 + 0x7001FFE4, // 0032 JMP #0018 + 0x4C1C0000, // 0033 LDNIL R7 + 0x90020503, // 0034 SETMBR R0 K2 K3 + 0x80000000, // 0035 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse +********************************************************************/ +be_local_closure(OpenHASP_parse, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_literal("json"), + /* K1 */ be_nested_str_literal("load"), + /* K2 */ be_nested_str_literal("instance"), + /* K3 */ be_nested_str_literal("parse_page"), + /* K4 */ be_nested_str_literal("parse_obj"), + /* K5 */ be_nested_str_literal("lvh_pages"), + /* K6 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K7 */ be_nested_str_literal("value_error"), + /* K8 */ be_nested_str_literal("unable to parse JSON line"), + }), + be_str_literal("parse"), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x60100004, // 0004 GETGBL R4 G4 + 0x5C140600, // 0005 MOVE R5 R3 + 0x7C100200, // 0006 CALL R4 1 + 0x1C100902, // 0007 EQ R4 R4 K2 + 0x78120009, // 0008 JMPF R4 #0013 + 0x8C100103, // 0009 GETMET R4 R0 K3 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x8C100104, // 000C GETMET R4 R0 K4 + 0x5C180600, // 000D MOVE R6 R3 + 0x881C0106, // 000E GETMBR R7 R0 K6 + 0x88200105, // 000F GETMBR R8 R0 K5 + 0x941C1007, // 0010 GETIDX R7 R8 R7 + 0x7C100600, // 0011 CALL R4 3 + 0x70020000, // 0012 JMP #0014 + 0xB0060F08, // 0013 RAISE 1 K7 K8 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort +********************************************************************/ +be_local_closure(OpenHASP_sort, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_int(1), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_literal("stop_iteration"), + }), + be_str_literal("sort"), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x04080500, // 0004 SUB R2 R2 K0 + 0x400A0002, // 0005 CONNECT R2 K0 R2 + 0x7C040200, // 0006 CALL R1 1 + 0xA8020010, // 0007 EXBLK 0 #0019 + 0x5C080200, // 0008 MOVE R2 R1 + 0x7C080000, // 0009 CALL R2 0 + 0x940C0002, // 000A GETIDX R3 R0 R2 + 0x5C100400, // 000B MOVE R4 R2 + 0x24140901, // 000C GT R5 R4 K1 + 0x78160008, // 000D JMPF R5 #0017 + 0x04140900, // 000E SUB R5 R4 K0 + 0x94140005, // 000F GETIDX R5 R0 R5 + 0x24140A03, // 0010 GT R5 R5 R3 + 0x78160004, // 0011 JMPF R5 #0017 + 0x04140900, // 0012 SUB R5 R4 K0 + 0x94140005, // 0013 GETIDX R5 R0 R5 + 0x98000805, // 0014 SETIDX R0 R4 R5 + 0x04100900, // 0015 SUB R4 R4 K0 + 0x7001FFF4, // 0016 JMP #000C + 0x98000803, // 0017 SETIDX R0 R4 R3 + 0x7001FFEE, // 0018 JMP #0008 + 0x58040002, // 0019 LDCONST R1 K2 + 0xAC040200, // 001A CATCH R1 1 0 + 0xB0080000, // 001B RAISE 2 R0 R0 + 0x80040000, // 001C RET 1 R0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse_obj ********************************************************************/ @@ -5058,875 +6182,57 @@ be_local_closure(OpenHASP_event_dispatch, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: page_dir_to -********************************************************************/ -be_local_closure(OpenHASP_page_dir_to, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("pages_list_sorted"), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(1), - /* K3 */ be_const_int(2), - /* K4 */ be_nested_str_literal("find"), - }), - be_str_literal("page_dir_to"), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0403, // 0004 EQ R3 R2 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80060200, // 0006 RET 1 K1 - 0x600C000C, // 0007 GETGBL R3 G12 - 0x5C100400, // 0008 MOVE R4 R2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x18100702, // 000A LE R4 R3 K2 - 0x78120000, // 000B JMPF R4 #000D - 0x80060200, // 000C RET 1 K1 - 0x1C100703, // 000D EQ R4 R3 K3 - 0x78120000, // 000E JMPF R4 #0010 - 0x80060400, // 000F RET 1 K2 - 0x8C100504, // 0010 GETMET R4 R2 K4 - 0x5C180200, // 0011 MOVE R6 R1 - 0x7C100400, // 0012 CALL R4 2 - 0x4C140000, // 0013 LDNIL R5 - 0x1C140805, // 0014 EQ R5 R4 R5 - 0x78160000, // 0015 JMPF R5 #0017 - 0x80060200, // 0016 RET 1 K1 - 0x00140702, // 0017 ADD R5 R3 K2 - 0x0C140B03, // 0018 DIV R5 R5 K3 - 0x18140805, // 0019 LE R5 R4 R5 - 0x78160001, // 001A JMPF R5 #001D - 0x80060400, // 001B RET 1 K2 - 0x70020001, // 001C JMP #001F - 0x5415FFFE, // 001D LDINT R5 -1 - 0x80040A00, // 001E RET 1 R5 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: deinit -********************************************************************/ -be_local_closure(OpenHASP_deinit, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_val_rule"), - /* K1 */ be_nested_str_literal("tasmota"), - /* K2 */ be_nested_str_literal("remove_rule"), - /* K3 */ be_nested_str_literal("_text_rule"), - }), - be_str_literal("deinit"), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060004, // 0003 JMPF R1 #0009 - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0x5C100000, // 0007 MOVE R4 R0 - 0x7C040600, // 0008 CALL R1 3 - 0x88040103, // 0009 GETMBR R1 R0 K3 - 0x4C080000, // 000A LDNIL R2 - 0x20040202, // 000B NE R1 R1 R2 - 0x78060004, // 000C JMPF R1 #0012 - 0xB8060200, // 000D GETNGBL R1 K1 - 0x8C040302, // 000E GETMET R1 R1 K2 - 0x880C0103, // 000F GETMBR R3 R0 K3 - 0x5C100000, // 0010 MOVE R4 R0 - 0x7C040600, // 0011 CALL R1 3 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_page -********************************************************************/ -be_local_closure(OpenHASP_parse_page, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_literal("has"), - /* K1 */ be_nested_str_literal("page"), - /* K2 */ be_nested_str_literal("int"), - /* K3 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K4 */ be_nested_str_literal("lvh_pages"), - /* K5 */ be_nested_str_literal("contains"), - /* K6 */ be_nested_str_literal("lvh_page"), - /* K7 */ be_nested_str_literal("find"), - /* K8 */ be_nested_str_literal("id"), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_literal("get_page_cur"), - /* K11 */ be_nested_str_literal("prev"), - /* K12 */ be_nested_str_literal("next"), - /* K13 */ be_nested_str_literal("back"), - }), - be_str_literal("parse_page"), - &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0x8C080300, // 0000 GETMET R2 R1 K0 - 0x58100001, // 0001 LDCONST R4 K1 - 0x7C080400, // 0002 CALL R2 2 - 0x780A0030, // 0003 JMPF R2 #0035 - 0x60080004, // 0004 GETGBL R2 G4 - 0x940C0301, // 0005 GETIDX R3 R1 K1 - 0x7C080200, // 0006 CALL R2 1 - 0x1C080502, // 0007 EQ R2 R2 K2 - 0x780A002B, // 0008 JMPF R2 #0035 - 0x60080009, // 0009 GETGBL R2 G9 - 0x940C0301, // 000A GETIDX R3 R1 K1 - 0x7C080200, // 000B CALL R2 1 - 0x90020602, // 000C SETMBR R0 K3 R2 - 0x880C0104, // 000D GETMBR R3 R0 K4 - 0x8C0C0705, // 000E GETMET R3 R3 K5 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x740E0006, // 0011 JMPT R3 #0019 - 0x880C0106, // 0012 GETMBR R3 R0 K6 - 0x88100104, // 0013 GETMBR R4 R0 K4 - 0x5C140600, // 0014 MOVE R5 R3 - 0x5C180400, // 0015 MOVE R6 R2 - 0x5C1C0000, // 0016 MOVE R7 R0 - 0x7C140400, // 0017 CALL R5 2 - 0x98100405, // 0018 SETIDX R4 R2 R5 - 0x8C0C0307, // 0019 GETMET R3 R1 K7 - 0x58140008, // 001A LDCONST R5 K8 - 0x7C0C0400, // 001B CALL R3 2 - 0x1C0C0709, // 001C EQ R3 R3 K9 - 0x780E0016, // 001D JMPF R3 #0035 - 0x8C0C010A, // 001E GETMET R3 R0 K10 - 0x7C0C0200, // 001F CALL R3 1 - 0x60100009, // 0020 GETGBL R4 G9 - 0x8C140307, // 0021 GETMET R5 R1 K7 - 0x581C000B, // 0022 LDCONST R7 K11 - 0x4C200000, // 0023 LDNIL R8 - 0x7C140600, // 0024 CALL R5 3 - 0x7C100200, // 0025 CALL R4 1 - 0x900E1604, // 0026 SETMBR R3 K11 R4 - 0x60100009, // 0027 GETGBL R4 G9 - 0x8C140307, // 0028 GETMET R5 R1 K7 - 0x581C000C, // 0029 LDCONST R7 K12 - 0x4C200000, // 002A LDNIL R8 - 0x7C140600, // 002B CALL R5 3 - 0x7C100200, // 002C CALL R4 1 - 0x900E1804, // 002D SETMBR R3 K12 R4 - 0x60100009, // 002E GETGBL R4 G9 - 0x8C140307, // 002F GETMET R5 R1 K7 - 0x581C000D, // 0030 LDCONST R7 K13 - 0x4C200000, // 0031 LDNIL R8 - 0x7C140600, // 0032 CALL R5 3 - 0x7C100200, // 0033 CALL R4 1 - 0x900E1A04, // 0034 SETMBR R3 K13 R4 - 0x80000000, // 0035 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_event -********************************************************************/ -be_local_closure(OpenHASP_register_event, /* name */ - be_nested_proto( - 13, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("event_dispatch"), - }), - be_str_literal(""), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68040000, // 0000 GETUPV R1 U0 - 0x8C040300, // 0001 GETMET R1 R1 K0 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_literal("cb"), - /* K1 */ be_nested_str_literal("introspect"), - /* K2 */ be_nested_str_literal("event_cb"), - /* K3 */ be_nested_str_literal("gen_cb"), - /* K4 */ be_nested_str_literal("_lv_obj"), - /* K5 */ be_nested_str_literal("add_event_cb"), - /* K6 */ be_nested_str_literal("toptr"), - }), - be_str_literal("register_event"), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x4C180000, // 0003 LDNIL R6 - 0x1C140A06, // 0004 EQ R5 R5 R6 - 0x78160003, // 0005 JMPF R5 #000A - 0x8C140703, // 0006 GETMET R5 R3 K3 - 0x841C0000, // 0007 CLOSURE R7 P0 - 0x7C140400, // 0008 CALL R5 2 - 0x90020405, // 0009 SETMBR R0 K2 R5 - 0x88140304, // 000A GETMBR R5 R1 K4 - 0x8C180B05, // 000B GETMET R6 R5 K5 - 0x88200102, // 000C GETMBR R8 R0 K2 - 0x5C240400, // 000D MOVE R9 R2 - 0x8C280906, // 000E GETMET R10 R4 K6 - 0x5C300200, // 000F MOVE R12 R1 - 0x7C280400, // 0010 CALL R10 2 - 0x7C180800, // 0011 CALL R6 4 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: sort -********************************************************************/ -be_local_closure(OpenHASP_sort, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_int(1), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_literal("stop_iteration"), - }), - be_str_literal("sort"), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C080200, // 0003 CALL R2 1 - 0x04080500, // 0004 SUB R2 R2 K0 - 0x400A0002, // 0005 CONNECT R2 K0 R2 - 0x7C040200, // 0006 CALL R1 1 - 0xA8020010, // 0007 EXBLK 0 #0019 - 0x5C080200, // 0008 MOVE R2 R1 - 0x7C080000, // 0009 CALL R2 0 - 0x940C0002, // 000A GETIDX R3 R0 R2 - 0x5C100400, // 000B MOVE R4 R2 - 0x24140901, // 000C GT R5 R4 K1 - 0x78160008, // 000D JMPF R5 #0017 - 0x04140900, // 000E SUB R5 R4 K0 - 0x94140005, // 000F GETIDX R5 R0 R5 - 0x24140A03, // 0010 GT R5 R5 R3 - 0x78160004, // 0011 JMPF R5 #0017 - 0x04140900, // 0012 SUB R5 R4 K0 - 0x94140005, // 0013 GETIDX R5 R0 R5 - 0x98000805, // 0014 SETIDX R0 R4 R5 - 0x04100900, // 0015 SUB R4 R4 K0 - 0x7001FFF4, // 0016 JMP #000C - 0x98000803, // 0017 SETIDX R0 R4 R3 - 0x7001FFEE, // 0018 JMP #0008 - 0x58040002, // 0019 LDCONST R1 K2 - 0xAC040200, // 001A CATCH R1 1 0 - 0xB0080000, // 001B RAISE 2 R0 R0 - 0x80040000, // 001C RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_page_cur -********************************************************************/ -be_local_closure(OpenHASP_get_page_cur, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("lvh_pages"), - /* K1 */ be_nested_str_literal("lvh_page_cur_idx"), - }), - be_str_literal("get_page_cur"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x94040401, // 0002 GETIDX R1 R2 R1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(OpenHASP_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("re"), - /* K1 */ be_nested_str_literal("re_page_target"), - /* K2 */ be_nested_str_literal("compile"), - /* K3 */ be_nested_str_literal("p\\d+"), - }), - be_str_literal("init"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080302, // 0001 GETMET R2 R1 K2 - 0x58100003, // 0002 LDCONST R4 K3 - 0x7C080400, // 0003 CALL R2 2 - 0x90020202, // 0004 SETMBR R0 K1 R2 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: do_action -********************************************************************/ -be_local_closure(OpenHASP_do_action, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ - /* K0 */ be_nested_str_literal("lv"), - /* K1 */ be_nested_str_literal("EVENT_CLICKED"), - /* K2 */ be_nested_str_literal("_action"), - /* K3 */ be_nested_str_literal("lvh_pages"), - /* K4 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K5 */ be_nested_str_literal("pages_list_sorted"), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_literal("prev"), - /* K8 */ be_nested_str_literal("next"), - /* K9 */ be_nested_str_literal("back"), - /* K10 */ be_nested_str_literal("re_page_target"), - /* K11 */ be_nested_str_literal("match"), - /* K12 */ be_const_int(0), - /* K13 */ be_nested_str_literal("show"), - }), - be_str_literal("do_action"), - &be_const_str_solidified, - ( &(const binstruction[74]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x200C0403, // 0002 NE R3 R2 R3 - 0x780E0000, // 0003 JMPF R3 #0005 - 0x80000600, // 0004 RET 0 - 0x880C0302, // 0005 GETMBR R3 R1 K2 - 0x88100104, // 0006 GETMBR R4 R0 K4 - 0x88140103, // 0007 GETMBR R5 R0 K3 - 0x94100A04, // 0008 GETIDX R4 R5 R4 - 0x4C140000, // 0009 LDNIL R5 - 0x8C180105, // 000A GETMET R6 R0 K5 - 0x88200104, // 000B GETMBR R8 R0 K4 - 0x7C180400, // 000C CALL R6 2 - 0x601C000C, // 000D GETGBL R7 G12 - 0x5C200C00, // 000E MOVE R8 R6 - 0x7C1C0200, // 000F CALL R7 1 - 0x181C0F06, // 0010 LE R7 R7 K6 - 0x781E0000, // 0011 JMPF R7 #0013 - 0x80000E00, // 0012 RET 0 - 0x1C1C0707, // 0013 EQ R7 R3 K7 - 0x781E0009, // 0014 JMPF R7 #001F - 0x601C0009, // 0015 GETGBL R7 G9 - 0x88200907, // 0016 GETMBR R8 R4 K7 - 0x7C1C0200, // 0017 CALL R7 1 - 0x5C140E00, // 0018 MOVE R5 R7 - 0x4C1C0000, // 0019 LDNIL R7 - 0x1C1C0A07, // 001A EQ R7 R5 R7 - 0x781E0001, // 001B JMPF R7 #001E - 0x541DFFFE, // 001C LDINT R7 -1 - 0x94140C07, // 001D GETIDX R5 R6 R7 - 0x70020020, // 001E JMP #0040 - 0x1C1C0708, // 001F EQ R7 R3 K8 - 0x781E0008, // 0020 JMPF R7 #002A - 0x601C0009, // 0021 GETGBL R7 G9 - 0x88200908, // 0022 GETMBR R8 R4 K8 - 0x7C1C0200, // 0023 CALL R7 1 - 0x5C140E00, // 0024 MOVE R5 R7 - 0x4C1C0000, // 0025 LDNIL R7 - 0x1C1C0A07, // 0026 EQ R7 R5 R7 - 0x781E0000, // 0027 JMPF R7 #0029 - 0x94140D06, // 0028 GETIDX R5 R6 K6 - 0x70020015, // 0029 JMP #0040 - 0x1C1C0709, // 002A EQ R7 R3 K9 - 0x781E0008, // 002B JMPF R7 #0035 - 0x601C0009, // 002C GETGBL R7 G9 - 0x88200909, // 002D GETMBR R8 R4 K9 - 0x7C1C0200, // 002E CALL R7 1 - 0x5C140E00, // 002F MOVE R5 R7 - 0x4C1C0000, // 0030 LDNIL R7 - 0x1C1C0A07, // 0031 EQ R7 R5 R7 - 0x781E0000, // 0032 JMPF R7 #0034 - 0x58140006, // 0033 LDCONST R5 K6 - 0x7002000A, // 0034 JMP #0040 - 0x881C010A, // 0035 GETMBR R7 R0 K10 - 0x8C1C0F0B, // 0036 GETMET R7 R7 K11 - 0x5C240600, // 0037 MOVE R9 R3 - 0x7C1C0400, // 0038 CALL R7 2 - 0x781E0005, // 0039 JMPF R7 #0040 - 0x601C0009, // 003A GETGBL R7 G9 - 0x5421FFFE, // 003B LDINT R8 -1 - 0x40220C08, // 003C CONNECT R8 K6 R8 - 0x94200608, // 003D GETIDX R8 R3 R8 - 0x7C1C0200, // 003E CALL R7 1 - 0x5C140E00, // 003F MOVE R5 R7 - 0x4C1C0000, // 0040 LDNIL R7 - 0x201C0A07, // 0041 NE R7 R5 R7 - 0x781E0005, // 0042 JMPF R7 #0049 - 0x241C0B0C, // 0043 GT R7 R5 K12 - 0x781E0003, // 0044 JMPF R7 #0049 - 0x881C0103, // 0045 GETMBR R7 R0 K3 - 0x941C0E05, // 0046 GETIDX R7 R7 R5 - 0x8C1C0F0D, // 0047 GETMET R7 R7 K13 - 0x7C1C0200, // 0048 CALL R7 1 - 0x80000000, // 0049 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _load -********************************************************************/ -be_local_closure(OpenHASP__load, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_literal("string"), - /* K1 */ be_nested_str_literal("json"), - /* K2 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_literal("lvh_page"), - /* K5 */ be_nested_str_literal("lvh_pages"), - /* K6 */ be_nested_str_literal("r"), - /* K7 */ be_nested_str_literal("read"), - /* K8 */ be_nested_str_literal("close"), - /* K9 */ be_nested_str_literal("split"), - /* K10 */ be_nested_str_literal("\n"), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_literal("load"), - /* K13 */ be_nested_str_literal("instance"), - /* K14 */ be_nested_str_literal("parse_page"), - /* K15 */ be_nested_str_literal("parse_obj"), - /* K16 */ be_nested_str_literal("remove"), - }), - be_str_literal("_load"), - &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x90020503, // 0002 SETMBR R0 K2 K3 - 0x88100104, // 0003 GETMBR R4 R0 K4 - 0x88140105, // 0004 GETMBR R5 R0 K5 - 0x5C180800, // 0005 MOVE R6 R4 - 0x581C0003, // 0006 LDCONST R7 K3 - 0x5C200000, // 0007 MOVE R8 R0 - 0x7C180400, // 0008 CALL R6 2 - 0x98160606, // 0009 SETIDX R5 K3 R6 - 0x60140011, // 000A GETGBL R5 G17 - 0x5C180200, // 000B MOVE R6 R1 - 0x581C0006, // 000C LDCONST R7 K6 - 0x7C140400, // 000D CALL R5 2 - 0x8C180B07, // 000E GETMET R6 R5 K7 - 0x7C180200, // 000F CALL R6 1 - 0x8C1C0B08, // 0010 GETMET R7 R5 K8 - 0x7C1C0200, // 0011 CALL R7 1 - 0x8C1C0509, // 0012 GETMET R7 R2 K9 - 0x5C240C00, // 0013 MOVE R9 R6 - 0x5828000A, // 0014 LDCONST R10 K10 - 0x7C1C0600, // 0015 CALL R7 3 - 0x4C140000, // 0016 LDNIL R5 - 0x4C180000, // 0017 LDNIL R6 - 0x6020000C, // 0018 GETGBL R8 G12 - 0x5C240E00, // 0019 MOVE R9 R7 - 0x7C200200, // 001A CALL R8 1 - 0x2420110B, // 001B GT R8 R8 K11 - 0x78220015, // 001C JMPF R8 #0033 - 0x8C20070C, // 001D GETMET R8 R3 K12 - 0x94280F0B, // 001E GETIDX R10 R7 K11 - 0x7C200400, // 001F CALL R8 2 - 0x60240004, // 0020 GETGBL R9 G4 - 0x5C281000, // 0021 MOVE R10 R8 - 0x7C240200, // 0022 CALL R9 1 - 0x1C24130D, // 0023 EQ R9 R9 K13 - 0x78260008, // 0024 JMPF R9 #002E - 0x8C24010E, // 0025 GETMET R9 R0 K14 - 0x5C2C1000, // 0026 MOVE R11 R8 - 0x7C240400, // 0027 CALL R9 2 - 0x8C24010F, // 0028 GETMET R9 R0 K15 - 0x5C2C1000, // 0029 MOVE R11 R8 - 0x88300102, // 002A GETMBR R12 R0 K2 - 0x88340105, // 002B GETMBR R13 R0 K5 - 0x94301A0C, // 002C GETIDX R12 R13 R12 - 0x7C240600, // 002D CALL R9 3 - 0x4C200000, // 002E LDNIL R8 - 0x8C240F10, // 002F GETMET R9 R7 K16 - 0x582C000B, // 0030 LDCONST R11 K11 - 0x7C240400, // 0031 CALL R9 2 - 0x7001FFE4, // 0032 JMP #0018 - 0x4C1C0000, // 0033 LDNIL R7 - 0x90020503, // 0034 SETMBR R0 K2 K3 - 0x80000000, // 0035 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse -********************************************************************/ -be_local_closure(OpenHASP_parse, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_literal("json"), - /* K1 */ be_nested_str_literal("load"), - /* K2 */ be_nested_str_literal("instance"), - /* K3 */ be_nested_str_literal("parse_page"), - /* K4 */ be_nested_str_literal("parse_obj"), - /* K5 */ be_nested_str_literal("lvh_pages"), - /* K6 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K7 */ be_nested_str_literal("value_error"), - /* K8 */ be_nested_str_literal("unable to parse JSON line"), - }), - be_str_literal("parse"), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x60100004, // 0004 GETGBL R4 G4 - 0x5C140600, // 0005 MOVE R5 R3 - 0x7C100200, // 0006 CALL R4 1 - 0x1C100902, // 0007 EQ R4 R4 K2 - 0x78120009, // 0008 JMPF R4 #0013 - 0x8C100103, // 0009 GETMET R4 R0 K3 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x8C100104, // 000C GETMET R4 R0 K4 - 0x5C180600, // 000D MOVE R6 R3 - 0x881C0106, // 000E GETMBR R7 R0 K6 - 0x88200105, // 000F GETMBR R8 R0 K5 - 0x941C1007, // 0010 GETIDX R7 R8 R7 - 0x7C100600, // 0011 CALL R4 3 - 0x70020000, // 0012 JMP #0014 - 0xB0060F08, // 0013 RAISE 1 K7 K8 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(OpenHASP_start, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[33]) { /* constants */ - /* K0 */ be_nested_str_literal("path"), - /* K1 */ be_nested_str_literal("def_templ_name"), - /* K2 */ be_nested_str_literal("exists"), - /* K3 */ be_nested_str_literal("file '"), - /* K4 */ be_nested_str_literal("' not found"), - /* K5 */ be_nested_str_literal("io_erorr"), - /* K6 */ be_nested_str_literal("lv"), - /* K7 */ be_nested_str_literal("start"), - /* K8 */ be_nested_str_literal("dark"), - /* K9 */ be_nested_str_literal("hres"), - /* K10 */ be_nested_str_literal("get_hor_res"), - /* K11 */ be_nested_str_literal("vres"), - /* K12 */ be_nested_str_literal("get_ver_res"), - /* K13 */ be_nested_str_literal("scr"), - /* K14 */ be_nested_str_literal("scr_act"), - /* K15 */ be_nested_str_literal("r16"), - /* K16 */ be_nested_str_literal("font_embedded"), - /* K17 */ be_nested_str_literal("robotocondensed"), - /* K18 */ be_nested_str_literal("montserrat"), - /* K19 */ be_nested_str_literal("theme_openhasp_init"), - /* K20 */ be_const_int(0), - /* K21 */ be_nested_str_literal("color"), - /* K22 */ be_const_int(16711935), - /* K23 */ be_const_int(3158064), - /* K24 */ be_nested_str_literal("get_disp"), - /* K25 */ be_nested_str_literal("set_theme"), - /* K26 */ be_nested_str_literal("set_style_bg_color"), - /* K27 */ be_const_int(16777215), - /* K28 */ be_nested_str_literal("theme_apply"), - /* K29 */ be_nested_str_literal("layer_top"), - /* K30 */ be_nested_str_literal("set_style_bg_opa"), - /* K31 */ be_nested_str_literal("lvh_pages"), - /* K32 */ be_nested_str_literal("_load"), - }), - be_str_literal("start"), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C100404, // 0002 EQ R4 R2 R4 - 0x78120000, // 0003 JMPF R4 #0005 - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C100702, // 0005 GETMET R4 R3 K2 - 0x5C180400, // 0006 MOVE R6 R2 - 0x7C100400, // 0007 CALL R4 2 - 0x74120002, // 0008 JMPT R4 #000C - 0x00120602, // 0009 ADD R4 K3 R2 - 0x00100904, // 000A ADD R4 R4 K4 - 0xB0060A04, // 000B RAISE 1 K5 R4 - 0xB8120C00, // 000C GETNGBL R4 K6 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0x7C100200, // 000E CALL R4 1 - 0x60100017, // 000F GETGBL R4 G23 - 0x5C140200, // 0010 MOVE R5 R1 - 0x7C100200, // 0011 CALL R4 1 - 0x90021004, // 0012 SETMBR R0 K8 R4 - 0xB8120C00, // 0013 GETNGBL R4 K6 - 0x8C10090A, // 0014 GETMET R4 R4 K10 - 0x7C100200, // 0015 CALL R4 1 - 0x90021204, // 0016 SETMBR R0 K9 R4 - 0xB8120C00, // 0017 GETNGBL R4 K6 - 0x8C10090C, // 0018 GETMET R4 R4 K12 - 0x7C100200, // 0019 CALL R4 1 - 0x90021604, // 001A SETMBR R0 K11 R4 - 0xB8120C00, // 001B GETNGBL R4 K6 - 0x8C10090E, // 001C GETMET R4 R4 K14 - 0x7C100200, // 001D CALL R4 1 - 0x90021A04, // 001E SETMBR R0 K13 R4 - 0xA8020007, // 001F EXBLK 0 #0028 - 0xB8120C00, // 0020 GETNGBL R4 K6 - 0x8C100910, // 0021 GETMET R4 R4 K16 - 0x58180011, // 0022 LDCONST R6 K17 - 0x541E000F, // 0023 LDINT R7 16 - 0x7C100600, // 0024 CALL R4 3 - 0x90021E04, // 0025 SETMBR R0 K15 R4 - 0xA8040001, // 0026 EXBLK 1 1 - 0x70020009, // 0027 JMP #0032 - 0xAC100000, // 0028 CATCH R4 0 0 - 0x70020006, // 0029 JMP #0031 - 0xB8120C00, // 002A GETNGBL R4 K6 - 0x8C100910, // 002B GETMET R4 R4 K16 - 0x58180012, // 002C LDCONST R6 K18 - 0x541E000D, // 002D LDINT R7 14 - 0x7C100600, // 002E CALL R4 3 - 0x90021E04, // 002F SETMBR R0 K15 R4 - 0x70020000, // 0030 JMP #0032 - 0xB0080000, // 0031 RAISE 2 R0 R0 - 0xB8120C00, // 0032 GETNGBL R4 K6 - 0x8C100913, // 0033 GETMET R4 R4 K19 - 0x58180014, // 0034 LDCONST R6 K20 - 0xB81E0C00, // 0035 GETNGBL R7 K6 - 0x8C1C0F15, // 0036 GETMET R7 R7 K21 - 0x58240016, // 0037 LDCONST R9 K22 - 0x7C1C0400, // 0038 CALL R7 2 - 0xB8220C00, // 0039 GETNGBL R8 K6 - 0x8C201115, // 003A GETMET R8 R8 K21 - 0x58280017, // 003B LDCONST R10 K23 - 0x7C200400, // 003C CALL R8 2 - 0x88240108, // 003D GETMBR R9 R0 K8 - 0x8828010F, // 003E GETMBR R10 R0 K15 - 0x7C100C00, // 003F CALL R4 6 - 0x8814010D, // 0040 GETMBR R5 R0 K13 - 0x8C140B18, // 0041 GETMET R5 R5 K24 - 0x7C140200, // 0042 CALL R5 1 - 0x8C140B19, // 0043 GETMET R5 R5 K25 - 0x5C1C0800, // 0044 MOVE R7 R4 - 0x7C140400, // 0045 CALL R5 2 - 0x8814010D, // 0046 GETMBR R5 R0 K13 - 0x8C140B1A, // 0047 GETMET R5 R5 K26 - 0x881C0108, // 0048 GETMBR R7 R0 K8 - 0x781E0004, // 0049 JMPF R7 #004F - 0xB81E0C00, // 004A GETNGBL R7 K6 - 0x8C1C0F15, // 004B GETMET R7 R7 K21 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C1C0400, // 004D CALL R7 2 - 0x70020003, // 004E JMP #0053 - 0xB81E0C00, // 004F GETNGBL R7 K6 - 0x8C1C0F15, // 0050 GETMET R7 R7 K21 - 0x5824001B, // 0051 LDCONST R9 K27 - 0x7C1C0400, // 0052 CALL R7 2 - 0x58200014, // 0053 LDCONST R8 K20 - 0x7C140600, // 0054 CALL R5 3 - 0xB8160C00, // 0055 GETNGBL R5 K6 - 0x8C140B1C, // 0056 GETMET R5 R5 K28 - 0xB81E0C00, // 0057 GETNGBL R7 K6 - 0x8C1C0F1D, // 0058 GETMET R7 R7 K29 - 0x7C1C0200, // 0059 CALL R7 1 - 0x7C140400, // 005A CALL R5 2 - 0xB8160C00, // 005B GETNGBL R5 K6 - 0x8C140B1D, // 005C GETMET R5 R5 K29 - 0x7C140200, // 005D CALL R5 1 - 0x8C140B1E, // 005E GETMET R5 R5 K30 - 0x581C0014, // 005F LDCONST R7 K20 - 0x58200014, // 0060 LDCONST R8 K20 - 0x7C140600, // 0061 CALL R5 3 - 0x60140013, // 0062 GETGBL R5 G19 - 0x7C140000, // 0063 CALL R5 0 - 0x90023E05, // 0064 SETMBR R0 K31 R5 - 0x8C140120, // 0065 GETMET R5 R0 K32 - 0x5C1C0400, // 0066 MOVE R7 R2 - 0x7C140400, // 0067 CALL R5 2 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: OpenHASP ********************************************************************/ be_local_class(OpenHASP, 10, NULL, - be_nested_map(42, + be_nested_map(43, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("pages_list_sorted", -1), be_const_closure(OpenHASP_pages_list_sorted_closure) }, - { be_const_key_literal("def_templ_name", -1), be_nested_str_literal("pages.jsonl") }, - { be_const_key_literal("parse_obj", 16), be_const_closure(OpenHASP_parse_obj_closure) }, - { be_const_key_literal("lvh_slider", 37), be_const_class(be_class_lvh_slider) }, - { be_const_key_literal("event_dispatch", 25), be_const_closure(OpenHASP_event_dispatch_closure) }, - { be_const_key_literal("lvh_obj", 29), be_const_class(be_class_lvh_obj) }, - { be_const_key_literal("page_dir_to", -1), be_const_closure(OpenHASP_page_dir_to_closure) }, - { be_const_key_literal("vres", -1), be_const_var(2) }, - { be_const_key_literal("lvh_textarea", -1), be_const_class(be_class_lvh_textarea) }, - { be_const_key_literal("parse", -1), be_const_closure(OpenHASP_parse_closure) }, - { be_const_key_literal("lvh_switch", 8), be_const_class(be_class_lvh_switch) }, - { be_const_key_literal("dark", 13), be_const_var(0) }, - { be_const_key_literal("event", -1), be_const_var(8) }, - { be_const_key_literal("lvh_checkbox", -1), be_const_class(be_class_lvh_checkbox) }, - { be_const_key_literal("lvh_scr", -1), be_const_class(be_class_lvh_scr) }, - { be_const_key_literal("lvh_spinner", -1), be_const_class(be_class_lvh_spinner) }, - { be_const_key_literal("lvh_page_cur_idx", 24), be_const_var(6) }, - { be_const_key_literal("sort", -1), be_const_static_closure(OpenHASP_sort_closure) }, - { be_const_key_literal("r16", -1), be_const_var(4) }, - { be_const_key_literal("do_action", -1), be_const_closure(OpenHASP_do_action_closure) }, - { be_const_key_literal("parse_page", -1), be_const_closure(OpenHASP_parse_page_closure) }, - { be_const_key_literal("register_event", 17), be_const_closure(OpenHASP_register_event_closure) }, - { be_const_key_literal("lvh_dropdown", -1), be_const_class(be_class_lvh_dropdown) }, - { be_const_key_literal("init", -1), be_const_closure(OpenHASP_init_closure) }, - { be_const_key_literal("lvh_roller", 38), be_const_class(be_class_lvh_roller) }, - { be_const_key_literal("lvh_line", -1), be_const_class(be_class_lvh_line) }, - { be_const_key_literal("get_page_cur", -1), be_const_closure(OpenHASP_get_page_cur_closure) }, - { be_const_key_literal("lvh_page", 31), be_const_class(be_class_lvh_page) }, - { be_const_key_literal("lvh_arc", -1), be_const_class(be_class_lvh_arc) }, + { be_const_key_literal("lvh_textarea", 41), be_const_class(be_class_lvh_textarea) }, { be_const_key_literal("scr", -1), be_const_var(3) }, - { be_const_key_literal("re_page_target", -1), be_const_var(7) }, - { be_const_key_literal("lvh_img", 22), be_const_class(be_class_lvh_img) }, - { be_const_key_literal("lvh_btn", -1), be_const_class(be_class_lvh_btn) }, - { be_const_key_literal("lvh_bar", 23), be_const_class(be_class_lvh_bar) }, - { be_const_key_literal("lvh_pages", -1), be_const_var(5) }, - { be_const_key_literal("lvh_btnmatrix", 19), be_const_class(be_class_lvh_btnmatrix) }, - { be_const_key_literal("_load", -1), be_const_closure(OpenHASP__load_closure) }, - { be_const_key_literal("hres", -1), be_const_var(1) }, - { be_const_key_literal("lvh_label", -1), be_const_class(be_class_lvh_label) }, - { be_const_key_literal("event_cb", 12), be_const_var(9) }, - { be_const_key_literal("deinit", 9), be_const_closure(OpenHASP_deinit_closure) }, + { be_const_key_literal("event_dispatch", 16), be_const_closure(OpenHASP_event_dispatch_closure) }, + { be_const_key_literal("lvh_bar", -1), be_const_class(be_class_lvh_bar) }, + { be_const_key_literal("lvh_img", -1), be_const_class(be_class_lvh_img) }, + { be_const_key_literal("event", -1), be_const_var(8) }, + { be_const_key_literal("do_action", 33), be_const_closure(OpenHASP_do_action_closure) }, + { be_const_key_literal("pages_list_sorted", -1), be_const_closure(OpenHASP_pages_list_sorted_closure) }, + { be_const_key_literal("lvh_btnmatrix", 42), be_const_class(be_class_lvh_btnmatrix) }, { be_const_key_literal("start", -1), be_const_closure(OpenHASP_start_closure) }, + { be_const_key_literal("init", 5), be_const_closure(OpenHASP_init_closure) }, + { be_const_key_literal("lvh_scr", -1), be_const_class(be_class_lvh_scr) }, + { be_const_key_literal("parse_page", -1), be_const_closure(OpenHASP_parse_page_closure) }, + { be_const_key_literal("register_event", 24), be_const_closure(OpenHASP_register_event_closure) }, + { be_const_key_literal("lvh_roller", 34), be_const_class(be_class_lvh_roller) }, + { be_const_key_literal("lvh_page", 11), be_const_class(be_class_lvh_page) }, + { be_const_key_literal("lvh_page_cur_idx", -1), be_const_var(6) }, + { be_const_key_literal("lvh_arc", 12), be_const_class(be_class_lvh_arc) }, + { be_const_key_literal("hres", 38), be_const_var(1) }, + { be_const_key_literal("dark", -1), be_const_var(0) }, + { be_const_key_literal("lvh_label", 37), be_const_class(be_class_lvh_label) }, + { be_const_key_literal("deinit", 14), be_const_closure(OpenHASP_deinit_closure) }, + { be_const_key_literal("page_dir_to", -1), be_const_closure(OpenHASP_page_dir_to_closure) }, + { be_const_key_literal("parse_obj", -1), be_const_closure(OpenHASP_parse_obj_closure) }, + { be_const_key_literal("lvh_spinner", -1), be_const_class(be_class_lvh_spinner) }, + { be_const_key_literal("_load", -1), be_const_closure(OpenHASP__load_closure) }, + { be_const_key_literal("lvh_qrcode", -1), be_const_class(be_class_lvh_qrcode) }, + { be_const_key_literal("parse", -1), be_const_closure(OpenHASP_parse_closure) }, + { be_const_key_literal("lvh_pages", 2), be_const_var(5) }, + { be_const_key_literal("lvh_line", -1), be_const_class(be_class_lvh_line) }, + { be_const_key_literal("lvh_switch", -1), be_const_class(be_class_lvh_switch) }, + { be_const_key_literal("re_page_target", -1), be_const_var(7) }, + { be_const_key_literal("r16", -1), be_const_var(4) }, + { be_const_key_literal("def_templ_name", -1), be_nested_str_literal("pages.jsonl") }, + { be_const_key_literal("lvh_obj", 19), be_const_class(be_class_lvh_obj) }, + { be_const_key_literal("sort", 23), be_const_static_closure(OpenHASP_sort_closure) }, + { be_const_key_literal("lvh_dropdown", -1), be_const_class(be_class_lvh_dropdown) }, + { be_const_key_literal("lvh_checkbox", -1), be_const_class(be_class_lvh_checkbox) }, + { be_const_key_literal("lvh_slider", -1), be_const_class(be_class_lvh_slider) }, + { be_const_key_literal("vres", -1), be_const_var(2) }, + { be_const_key_literal("lvh_btn", -1), be_const_class(be_class_lvh_btn) }, + { be_const_key_literal("event_cb", -1), be_const_var(9) }, + { be_const_key_literal("get_page_cur", -1), be_const_closure(OpenHASP_get_page_cur_closure) }, })), be_str_literal("OpenHASP") ); diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index cb023fd89..adb259092 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -17,7 +17,8 @@ var classes = [ "page", "obj", "scr", "btn", "switch", "checkbox", "label", "spinner", "line", "img", "roller", "btnmatrix", - "bar", "slider", "arc", "textarea", "dropdown" + "bar", "slider", "arc", "textarea", "dropdown", + "qrcode" ] for c:classes solidify.dump(openhasp.OpenHASP.("lvh_"+c), true) @@ -132,6 +133,11 @@ class lvh_obj "text_rule": nil, "text_rule_formula": nil, "text_rule_format": nil, + # qrcode + "qr_size": nil, + "qr_dark_color": nil, + "qr_light_color": nil, + "qr_text": nil, } #==================================================================== @@ -308,6 +314,7 @@ class lvh_obj if event_hasp != nil import string + var val = string.format('{"hasp":{"p%ib%i":"%s"}}', self._page._page_id, self.id, event_hasp) # print("val=",val) tasmota.set_timer(0, /-> tasmota.publish_rule(val)) end @@ -925,6 +932,41 @@ class lvh_spinner : lvh_arc def get_speed() end end +#==================================================================== +# qrcode +#==================================================================== +class lvh_qrcode : lvh_obj + static _lv_class = lv.qrcode + + # init + # - create the LVGL encapsulated object + # arg1: parent object + # arg2: json line object + def init(parent, page, jline) + self._page = page + + var size = jline.find("qr_size", 100) + var dark_col = self.parse_color(jline.find("qr_dark_color", "#000000")) + var light_col = self.parse_color(jline.find("qr_light_color", "#FFFFFF")) + + self._lv_obj = lv.qrcode(parent, size, dark_col, light_col) + self.post_init() + end + + # ignore attributes, spinner can't be changed once created + def set_qr_size(t) end + def get_qr_size() end + def set_qr_dark_color(t) end + def get_qr_dark_color() end + def set_qr_light_color(t) end + def get_qr_light_color() end + def set_qr_text(t) + t = str(t) + self._lv_obj.update(t, size(t)) + end + def get_qr_text() end +end + ################################################################################# # # All other subclasses than just map the LVGL object @@ -1118,6 +1160,7 @@ class OpenHASP # static lvh_linemeter = lvh_linemeter # static lvh_gauge = lvh_gauge static lvh_textarea = lvh_textarea # additional? + static lvh_qrcode = lvh_qrcode static def_templ_name = "pages.jsonl" # default template name From ffaa9efbde9f62763edd537b373394fdfd128b0f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 24 Apr 2022 11:24:01 +0200 Subject: [PATCH 063/376] Refactor ESP32 revision --- tasmota/support_command.ino | 4 ++-- tasmota/support_esp.ino | 14 +++++++++++--- tasmota/xdrv_01_webserver.ino | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 52e4f58da..7a568e4a2 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -590,14 +590,14 @@ void CmndStatus(void) ",\"" D_JSON_BOOTVERSION "\":%d" #endif ",\"" D_JSON_COREVERSION "\":\"" ARDUINO_CORE_RELEASE "\",\"" D_JSON_SDKVERSION "\":\"%s\"," - "\"CpuFrequency\":%d,\"Hardware\":\"%s%s\"" + "\"CpuFrequency\":%d,\"Hardware\":\"%s\"" "%s}}"), TasmotaGlobal.version, TasmotaGlobal.image_name, GetBuildDateAndTime().c_str() #ifdef ESP8266 , ESP.getBootVersion() #endif , ESP.getSdkVersion(), - ESP.getCpuFreqMHz(), GetDeviceHardware().c_str(), GetDeviceHardwareRevision().c_str(), + ESP.getCpuFreqMHz(), GetDeviceHardwareRevision().c_str(), GetStatistics().c_str()); CmndStatusResponse(2); } diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index 8c347b56f..b671be30e 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -96,7 +96,8 @@ String GetDeviceHardware(void) { } String GetDeviceHardwareRevision(void) { - return ""; + // No known revisions for ESP8266/85 + return GetDeviceHardware(); } #endif @@ -773,14 +774,21 @@ typedef struct { } String GetDeviceHardwareRevision(void) { + // ESP32-S2 + // ESP32-D0WDQ6 rev.1 + // ESP32-C3 rev.2 + // ESP32-C3 rev.3 + String result = GetDeviceHardware(); // ESP32-C3 + esp_chip_info_t chip_info; esp_chip_info(&chip_info); - char revision[10] = { 0 }; if (chip_info.revision) { snprintf_P(revision, sizeof(revision), PSTR(" rev.%d"), chip_info.revision); } - return revision; + result += revision; // ESP32-C3 rev.3 + + return result; } /* diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index ae049761a..a977b5479 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2420,7 +2420,7 @@ void HandleInformation(void) #endif // USE_DISCOVERY WSContentSend_P(PSTR("}1}2 ")); // Empty line - WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s%s)"), ESP_getChipId(), GetDeviceHardware().c_str(), GetDeviceHardwareRevision().c_str()); + WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str()); #ifdef ESP8266 WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP.getFlashChipId()); #endif From c6120614d40a61fc9458a52b0608628145a98212 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:04:46 +0200 Subject: [PATCH 064/376] fix compile error with latest Arduino32 core needs proper fix from upstream library --- lib/lib_audio/ESP8266Audio/src/spiram-fast.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/lib_audio/ESP8266Audio/src/spiram-fast.h b/lib/lib_audio/ESP8266Audio/src/spiram-fast.h index ce568873e..afaae75a8 100644 --- a/lib/lib_audio/ESP8266Audio/src/spiram-fast.h +++ b/lib/lib_audio/ESP8266Audio/src/spiram-fast.h @@ -27,6 +27,10 @@ #include +#ifndef SPECIAL +#define SPECIAL 0xF0 +#endif + #ifndef ESP32 class ESP8266SPIRAM { @@ -364,4 +368,4 @@ class ESP8266SPIRAM { #endif // ESP32 -#endif \ No newline at end of file +#endif From 621cb9545d82cb3317cf44d9afde9e4aaa341532 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 24 Apr 2022 16:22:31 +0200 Subject: [PATCH 065/376] Update devel Tasmota framework to latest build based on IDF 4.4.1 and Arduino master .git from 24.04.2022 --- platformio_override_sample.ini | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 5e0877840..35e0708e4 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -11,6 +11,8 @@ [platformio] ; For best Gitpod performance remove the ";" in the next line. Needed Platformio files are cached and installed at first run ;core_dir = .platformio +; For unrelated compile errors with Windows it can help to shorten Platformio project path +;workspace_dir = c:\.pio ; *** Build/upload environment default_envs = @@ -88,8 +90,8 @@ lib_extra_dirs = ${library.lib_extra_dirs} [env:tasmota32_base] ; *** Uncomment next lines ";" to enable development Tasmota Arduino version ESP32 -;platform = https://github.com/Jason2866/platform-espressif32.git#IDF44/ESP32-S3 -;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/687/framework-arduinoespressif32-v4.4_dev-4ff9ceb19a.tar.gz +;platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip +;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/822/framework-arduinoespressif32-v4.4_work-c4b83228a5.tar.gz build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 91b58679f3503605e5f093defd105d7005a75d90 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 24 Apr 2022 16:41:23 +0200 Subject: [PATCH 066/376] OpenHASP add page events --- .../berry_tasmota/src/be_lv_openhasp.c | 205 +++++++++++++++--- .../openhasp_src/openhasp_core/openhasp.be | 23 +- 2 files changed, 197 insertions(+), 31 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index ba32c3bcc..f925d6325 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -211,15 +211,66 @@ be_local_closure(lvh_page_get_scr, /* name */ ********************************************************************/ be_local_closure(lvh_page_show, /* name */ be_nested_proto( - 11, /* nstack */ + 14, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 4), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_literal("tasmota"), + /* K1 */ be_nested_str_literal("publish_rule"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0xB8020000, // 0000 GETNGBL R0 K0 + 0x8C000101, // 0001 GETMET R0 R0 K1 + 0x68080000, // 0002 GETUPV R2 U0 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 5), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_literal("tasmota"), + /* K1 */ be_nested_str_literal("publish_rule"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0xB8020000, // 0000 GETNGBL R0 K0 + 0x8C000101, // 0001 GETMET R0 R0 K1 + 0x68080000, // 0002 GETUPV R2 U0 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_scr"), /* K1 */ be_nested_str_literal("_p"), /* K2 */ be_nested_str_literal("lv"), @@ -227,17 +278,23 @@ be_local_closure(lvh_page_show, /* name */ /* K4 */ be_nested_str_literal("_oh"), /* K5 */ be_nested_str_literal("page_dir_to"), /* K6 */ be_nested_str_literal("id"), - /* K7 */ be_nested_str_literal("lvh_page_cur_idx"), - /* K8 */ be_nested_str_literal("_page_id"), - /* K9 */ be_nested_str_literal("show_anim"), - /* K10 */ be_nested_str_literal("find"), - /* K11 */ be_nested_str_literal("SCR_LOAD_ANIM_NONE"), - /* K12 */ be_nested_str_literal("scr_load_anim"), + /* K7 */ be_nested_str_literal("string"), + /* K8 */ be_nested_str_literal("format"), + /* K9 */ be_nested_str_literal("{\"hasp\":{\"p%i\":\"out\"}}"), + /* K10 */ be_nested_str_literal("lvh_page_cur_idx"), + /* K11 */ be_nested_str_literal("tasmota"), + /* K12 */ be_nested_str_literal("set_timer"), /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_literal("{\"hasp\":{\"p%i\":\"in\"}}"), + /* K15 */ be_nested_str_literal("_page_id"), + /* K16 */ be_nested_str_literal("show_anim"), + /* K17 */ be_nested_str_literal("find"), + /* K18 */ be_nested_str_literal("SCR_LOAD_ANIM_NONE"), + /* K19 */ be_nested_str_literal("scr_load_anim"), }), be_str_literal("show"), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ + ( &(const binstruction[67]) { /* code */ 0x880C0100, // 0000 GETMBR R3 R0 K0 0x4C100000, // 0001 LDNIL R4 0x1C0C0604, // 0002 EQ R3 R3 R4 @@ -266,24 +323,45 @@ be_local_closure(lvh_page_show, /* name */ 0x7C140200, // 0019 CALL R5 1 0x7C0C0400, // 001A CALL R3 2 0x5C040600, // 001B MOVE R1 R3 - 0x880C0104, // 001C GETMBR R3 R0 K4 - 0x88100108, // 001D GETMBR R4 R0 K8 - 0x900E0E04, // 001E SETMBR R3 K7 R4 - 0x880C0109, // 001F GETMBR R3 R0 K9 - 0x8C0C070A, // 0020 GETMET R3 R3 K10 - 0x5C140200, // 0021 MOVE R5 R1 - 0xB81A0400, // 0022 GETNGBL R6 K2 - 0x88180D0B, // 0023 GETMBR R6 R6 K11 - 0x7C0C0600, // 0024 CALL R3 3 - 0xB8120400, // 0025 GETNGBL R4 K2 - 0x8C10090C, // 0026 GETMET R4 R4 K12 - 0x88180100, // 0027 GETMBR R6 R0 K0 - 0x5C1C0600, // 0028 MOVE R7 R3 - 0x5C200400, // 0029 MOVE R8 R2 - 0x5824000D, // 002A LDCONST R9 K13 - 0x50280000, // 002B LDBOOL R10 0 0 - 0x7C100C00, // 002C CALL R4 6 - 0x80000000, // 002D RET 0 + 0xA40E0E00, // 001C IMPORT R3 K7 + 0x8C100708, // 001D GETMET R4 R3 K8 + 0x58180009, // 001E LDCONST R6 K9 + 0x881C0104, // 001F GETMBR R7 R0 K4 + 0x881C0F0A, // 0020 GETMBR R7 R7 K10 + 0x7C100600, // 0021 CALL R4 3 + 0xB8161600, // 0022 GETNGBL R5 K11 + 0x8C140B0C, // 0023 GETMET R5 R5 K12 + 0x581C000D, // 0024 LDCONST R7 K13 + 0x84200000, // 0025 CLOSURE R8 P0 + 0x7C140600, // 0026 CALL R5 3 + 0x8C140708, // 0027 GETMET R5 R3 K8 + 0x581C000E, // 0028 LDCONST R7 K14 + 0x8820010F, // 0029 GETMBR R8 R0 K15 + 0x7C140600, // 002A CALL R5 3 + 0xB81A1600, // 002B GETNGBL R6 K11 + 0x8C180D0C, // 002C GETMET R6 R6 K12 + 0x5820000D, // 002D LDCONST R8 K13 + 0x84240001, // 002E CLOSURE R9 P1 + 0x7C180600, // 002F CALL R6 3 + 0x88180104, // 0030 GETMBR R6 R0 K4 + 0x881C010F, // 0031 GETMBR R7 R0 K15 + 0x901A1407, // 0032 SETMBR R6 K10 R7 + 0x88180110, // 0033 GETMBR R6 R0 K16 + 0x8C180D11, // 0034 GETMET R6 R6 K17 + 0x5C200200, // 0035 MOVE R8 R1 + 0xB8260400, // 0036 GETNGBL R9 K2 + 0x88241312, // 0037 GETMBR R9 R9 K18 + 0x7C180600, // 0038 CALL R6 3 + 0xB81E0400, // 0039 GETNGBL R7 K2 + 0x8C1C0F13, // 003A GETMET R7 R7 K19 + 0x88240100, // 003B GETMBR R9 R0 K0 + 0x5C280C00, // 003C MOVE R10 R6 + 0x5C2C0400, // 003D MOVE R11 R2 + 0x5830000D, // 003E LDCONST R12 K13 + 0x50340000, // 003F LDBOOL R13 0 0 + 0x7C1C0C00, // 0040 CALL R7 6 + 0xA0000000, // 0041 CLOSE R0 + 0x80000000, // 0042 RET 0 }) ) ); @@ -4097,6 +4175,71 @@ void be_load_lvh_line_class(bvm *vm) { be_pop(vm, 1); } +/******************************************************************** +** Solidified function: set_angle +********************************************************************/ +be_local_closure(lvh_img_set_angle, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_angle"), + }), + be_str_literal("set_angle"), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x60080009, // 0000 GETGBL R2 G9 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x5C040400, // 0003 MOVE R1 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x8C080501, // 0005 GETMET R2 R2 K1 + 0x5C100200, // 0006 MOVE R4 R1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_angle +********************************************************************/ +be_local_closure(lvh_img_get_angle, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_angle"), + }), + be_str_literal("get_angle"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: lvh_img ********************************************************************/ @@ -4104,8 +4247,10 @@ extern const bclass be_class_lvh_obj; be_local_class(lvh_img, 0, &be_class_lvh_obj, - be_nested_map(1, + be_nested_map(3, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_literal("set_angle", -1), be_const_closure(lvh_img_set_angle_closure) }, + { be_const_key_literal("get_angle", 2), be_const_closure(lvh_img_get_angle_closure) }, { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_img) }, })), be_str_literal("lvh_img") diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index adb259092..39fecb9c5 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -932,6 +932,21 @@ class lvh_spinner : lvh_arc def get_speed() end end +#==================================================================== +# img +#==================================================================== +class lvh_img : lvh_obj + static _lv_class = lv.img + + def set_angle(v) + v = int(v) + self._lv_obj.set_angle(v) + end + def get_angle() + return self._lv_obj.get_angle() + end +end + #==================================================================== # qrcode #==================================================================== @@ -978,7 +993,6 @@ class lvh_btn : lvh_obj static _lv_class = lv.btn end class lvh_btnmatrix : lvh_obj static _lv_class = lv.btnmatrix end class lvh_checkbox : lvh_obj static _lv_class = lv.checkbox end class lvh_dropdown : lvh_obj static _lv_class = lv.dropdown end -class lvh_img : lvh_obj static _lv_class = lv.img end class lvh_line : lvh_obj static _lv_class = lv.line end class lvh_roller : lvh_obj static _lv_class = lv.roller end class lvh_slider : lvh_obj static _lv_class = lv.slider end @@ -1104,6 +1118,13 @@ class lvh_page anim = self._oh.page_dir_to(self.id()) end + # send page events + import string + var event_str_in = string.format('{"hasp":{"p%i":"out"}}', self._oh.lvh_page_cur_idx) + tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_in)) + var event_str_out = string.format('{"hasp":{"p%i":"in"}}', self._page_id) + tasmota.set_timer(0, /-> tasmota.publish_rule(event_str_out)) + # change current page self._oh.lvh_page_cur_idx = self._page_id From 522bccb3e22bce30b76226282c06478daa230ae2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 24 Apr 2022 17:36:10 +0200 Subject: [PATCH 067/376] Initial support for USB serial Initial support for USB serial when define ARDUINO_USB_CDC_ON_BOOT=1 --- lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp | 4 ++++ tasmota/support.ino | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp index 278acaabd..99dc6caeb 100644 --- a/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp +++ b/lib/default/TasmotaSerial-3.5.0/src/TasmotaSerial.cpp @@ -153,6 +153,9 @@ bool TasmotaSerial::begin(uint32_t speed, uint32_t config) { #ifdef ESP32 if (TSerial == nullptr) { // Allow for dynamic change in baudrate or config if (freeUart()) { // We prefer UART1 and UART2 and keep UART0 for debugging +#ifdef ARDUINO_USB_CDC_ON_BOOT + TSerial = new HardwareSerial(m_uart); +#else if (0 == m_uart) { Serial.flush(); Serial.end(); @@ -161,6 +164,7 @@ bool TasmotaSerial::begin(uint32_t speed, uint32_t config) { } else { TSerial = new HardwareSerial(m_uart); } +#endif // ARDUINO_USB_CDC_ON_BOOT if (serial_buffer_size > 256) { // RX Buffer can't be resized when Serial is already running (HardwareSerial.cpp) TSerial->setRxBufferSize(serial_buffer_size); } diff --git a/tasmota/support.ino b/tasmota/support.ino index e124dd3cf..75f461fe5 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1901,7 +1901,11 @@ void SetSerialBegin(void) { delay(10); // Allow time to cleanup queues - if not used hangs ESP32 Serial.end(); delay(10); // Allow time to cleanup queues - if not used hangs ESP32 +#ifdef ARDUINO_USB_CDC_ON_BOOT + Serial.begin(TasmotaGlobal.baudrate); +#else Serial.begin(TasmotaGlobal.baudrate, ConvertSerialConfig(Settings->serial_config)); +#endif // ARDUINO_USB_CDC_ON_BOOT #endif // ESP32 } From 5e7bdbf5865919264cb4091f998454d47efe13fb Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 24 Apr 2022 18:46:01 +0200 Subject: [PATCH 068/376] OpenHASP full demo --- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 0 -> 187609 bytes .../openhasp_src/openhasp_demo/autoexec.be | 56 ++++++++++ .../openhasp_demo/lv_tasmota_info.be | 70 ++++++++++++ .../openhasp_demo/lv_tasmota_log.be | 101 ++++++++++++++++++ .../openhasp_demo/lv_wifi_graph.be | 77 +++++++++++++ .../openhasp_demo/noun_Fan_35097_140.png | Bin 0 -> 6645 bytes .../openhasp_src/openhasp_demo/pages.jsonl | 52 +++++++++ .../openhasp_demo/watch_ren_back_240.png | Bin 0 -> 96985 bytes .../openhasp_demo/watch_ren_hour_240.png | Bin 0 -> 3120 bytes .../openhasp_demo/watch_ren_min_240.png | Bin 0 -> 5466 bytes .../openhasp_demo/watch_ren_sec_240.png | Bin 0 -> 4176 bytes 11 files changed, 356 insertions(+) create mode 100644 tasmota/berry/openhasp_src/openhasp_demo.tapp create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/autoexec.be create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/noun_Fan_35097_140.png create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/watch_ren_back_240.png create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/watch_ren_hour_240.png create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/watch_ren_min_240.png create mode 100644 tasmota/berry/openhasp_src/openhasp_demo/watch_ren_sec_240.png diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp new file mode 100644 index 0000000000000000000000000000000000000000..ab08c9e18b19b0d7605c8241e0c27d86587a33c2 GIT binary patch literal 187609 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 E09RfF9smFU literal 0 HcmV?d00001 diff --git a/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be b/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be new file mode 100644 index 000000000..90fc68d50 --- /dev/null +++ b/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be @@ -0,0 +1,56 @@ +# OpenHASP demo +# rm openhasp_demo.tapp ; zip -j -0 openhasp_demo.tapp openhasp_demo/* openhasp_core/openhasp.be + +if !tasmota.memory().contains("psram") + print("HSP: Error: OpenHASP demo requires PSRAM") + return +end + +import lv_tasmota_log +import lv_tasmota_info +import lv_wifi_graph + +import openhasp +openhasp.start(false, "openhasp_demo.tapp#pages.jsonl") + +var prev_day = -1 +def set_watch() + import global + var now = tasmota.rtc() + var time_raw = now['local'] + var time = tasmota.time_dump(time_raw) + # set second + global.p5b13.angle = 60 * time['sec'] + # set minutes + global.p5b12.angle = 60 * time['min'] + # set hours + global.p5b11.angle = 300 * (time['hour'] % 12) + time['min'] * 5 + # set day + if time['day'] != prev_day + global.p5b15.text = str(time['day']) + prev_day = time['day'] + end +end + +def run_watch() + set_watch() + tasmota.set_timer(100, run_watch) +end +run_watch() + +def p5_in() + global.p0b101.bg_opa = 0 + global.p0b102.bg_opa = 0 + global.p0b103.bg_opa = 0 + global.p0b11.bg_opa = 0 +end + +def p5_out() + global.p0b101.bg_opa = 255 + global.p0b102.bg_opa = 255 + global.p0b103.bg_opa = 255 + global.p0b11.bg_opa = 255 +end + +tasmota.add_rule("hasp#p5==in", p5_in) +tasmota.add_rule("hasp#p5==out", p5_out) diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be b/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be new file mode 100644 index 000000000..a8fcc2621 --- /dev/null +++ b/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be @@ -0,0 +1,70 @@ +# lv_tasmota_info class + +class lv_tasmota_info : lv.label + var msg + var delay + + def init(parent) + super(self).init(parent) + self.set_width(parent.get_width()) + self.set_pos(0, 0) + + self.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_bg_opa(100, lv.PART_MAIN | lv.STATE_DEFAULT) + self.move_background() + self.set_style_border_opa(255, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_radius(0, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_pad_all(2, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_color(lv.color(0x0099EE), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_width(1, lv.PART_MAIN | lv.STATE_DEFAULT) + + self.set_style_text_color(lv.color(0xFFFFFF), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_long_mode(lv.LABEL_LONG_CLIP) + var lg_font = lv.font_montserrat(14) + self.set_style_text_font(lg_font, lv.PART_MAIN | lv.STATE_DEFAULT) + + self.msg = "IP: - \nFree: - kB" + self.set_text(self.msg) + self.delay = 1 + + self.add_event_cb(/->self.before_del(), lv.EVENT_DELETE, 0) # register `before_del` to be called when object is deleted + tasmota.add_driver(self) + end + + def update() + var wifi_ip = "IP: " + tasmota.wifi().find('ip', '') + " " + tasmota.eth().find('ip', '') + var tas_mem = tasmota.memory() + var mem_msg = "Free: " + str(tas_mem['heap_free']) + " kB" + if tas_mem.contains('psram_free') + mem_msg += " PSRam: " + str(tas_mem['psram_free']) + " kB" + end + var msg = wifi_ip + "\n" + mem_msg + + if msg != self.msg + self.msg = msg + self.set_text(self.msg) + end + end + + def every_second() + self.delay -= 1 + if self.delay == 0 + self.update() + self.delay = 1 + end + end + + def before_del() + tasmota.remove_driver(self) + end +end + +return lv_tasmota_info + +#- +import lv_tasmota_info +var info = lv_tasmota_info(scr) +info.set_pos(0, stat_line.get_height()) +info.set_size(hres - 80, 30) +tasmota.add_driver(info) +-# \ No newline at end of file diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be b/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be new file mode 100644 index 000000000..8db31f48b --- /dev/null +++ b/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be @@ -0,0 +1,101 @@ +# lv_tasmota_log class + +class lv_tasmota_log : lv.obj + var label # contains the sub lv_label object + var lines + var line_len + var log_reader + var log_level + + def init(parent) + super(self).init(parent) + self.set_width(parent.get_width()) + self.set_pos(0, 0) + + self.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_bg_opa(255, lv.PART_MAIN | lv.STATE_DEFAULT) + self.move_background() + self.set_style_border_opa(255, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_radius(0, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_pad_all(2, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_color(lv.color(0x0099EE), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_width(1, lv.PART_MAIN | lv.STATE_DEFAULT) + self.refr_size() + self.refr_pos() + + self.label = lv.label(self) + + self.label.set_style_text_color(lv.color(0x00FF00), lv.PART_MAIN | lv.STATE_DEFAULT) + self.label.set_long_mode(lv.LABEL_LONG_CLIP) + self.label.set_text("") # bug, still displays "Text" + + self.label.set_width(self.get_width() - 12) + self.label.set_height(self.get_height() - 6) + + self.add_event_cb( / -> self._size_changed(), lv.EVENT_SIZE_CHANGED, 0) + self.add_event_cb( / -> self._size_changed(), lv.EVENT_STYLE_CHANGED, 0) + self.add_event_cb( / -> tasmota.remove_driver(self), lv.EVENT_DELETE, 0) + + self.lines = [] + self.line_len = 0 + self.log_reader = tasmota_log_reader() + self.log_level = 2 + self._size_changed() + + tasmota.add_driver(self) + end + + def set_lines_count(line_len) + if line_len > self.line_len # increase lines + for i: self.line_len .. line_len-1 + self.lines.insert(0, "") + end + elif line_len < self.line_len # decrease lines + for i: line_len .. self.line_len-1 + self.lines.remove(0) + end + end + self.line_len = line_len + end + + def _size_changed(obj, evt) + # print(">>> lv.EVENT_SIZE_CHANGED") + var pad_hor = self.get_style_pad_left(lv.PART_MAIN | lv.STATE_DEFAULT) + + self.get_style_pad_right(lv.PART_MAIN | lv.STATE_DEFAULT) + + self.get_style_border_width(lv.PART_MAIN | lv.STATE_DEFAULT) * 2 + + 3 + var pad_ver = self.get_style_pad_top(lv.PART_MAIN | lv.STATE_DEFAULT) + + self.get_style_pad_bottom(lv.PART_MAIN | lv.STATE_DEFAULT) + + self.get_style_border_width(lv.PART_MAIN | lv.STATE_DEFAULT) * 2 + + 3 + var w = self.get_width() - pad_hor - 2 + var h = self.get_height() - pad_ver + self.label.set_size(w, h) + # print("w",w,"h",h,"pad_hor",pad_hor,"pad_ver",pad_ver) + + # compute how many lines should be displayed + var h_font = lv.font_get_line_height(self.label.get_style_text_font(0)) # current font's height + var lines_count = ((h * 2 / h_font) + 1 ) / 2 + # print("h_font",h_font,"h",h,"lines_count",lines_count) + self.set_lines_count(lines_count) + end + + def every_second() + var dirty = false + for n:0..20 + var line = self.log_reader.get_log(self.log_level) + if line == nil break end # no more logs + self.lines.remove(0) # remove first line + self.lines.push(line) + dirty = true + end + if dirty self.update() end + end + + def update() + var msg = self.lines.concat("\n") + self.label.set_text(msg) + end +end + +return lv_tasmota_log diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be b/tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be new file mode 100644 index 000000000..bb03ec6c7 --- /dev/null +++ b/tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be @@ -0,0 +1,77 @@ +# lv_wifi_graph class + +class lv_wifi_graph : lv.chart + var ws_h + var ws_w + var ser1 + var wsl + var delay + + def init(parent) + super(self).init(parent) + + self.set_style_bg_color(lv.color(0x000000), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_bg_opa(100, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_color(lv.color(0x0099EE), lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_border_width(1, lv.PART_MAIN | lv.STATE_DEFAULT) + #self.set_style_border_opa(200, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_radius(0, lv.PART_MAIN | lv.STATE_DEFAULT) + self.set_style_pad_all(2, lv.PART_MAIN | lv.STATE_DEFAULT) + + self.set_range(lv.CHART_AXIS_PRIMARY_Y, 0, 100) + self.set_div_line_count(0,0) # no lines + self.set_type(lv.CHART_TYPE_LINE) + + self.set_style_size(0, lv.PART_INDICATOR) # don't show dots + self.set_style_line_rounded(true, lv.PART_ITEMS) + self.set_style_line_width(2, lv.PART_ITEMS) # don't show dots + self.set_update_mode(lv.CHART_UPDATE_MODE_SHIFT) + + self.set_point_count(40) + + self.ser1 = self.add_series(lv.color(0xEE4444), lv.CHART_AXIS_PRIMARY_Y) + + self.wsl = lv.label(self) + self.wsl.set_style_text_color(lv.color(0xFFFFFF), lv.PART_MAIN | lv.STATE_DEFAULT) + self.wsl.set_text("wifi") + self.wsl.set_style_text_font(lv.font_montserrat(10), lv.PART_MAIN | lv.STATE_DEFAULT) + self.wsl.set_align(lv.ALIGN_BOTTOM_MID) + + self.delay = 1 + + self.add_event_cb(/->self.before_del(), lv.EVENT_DELETE, 0) # register `before_del` to be called when object is deleted + tasmota.add_driver(self) + end + + def add_wifi_point() + var wifi = tasmota.wifi() + var quality = wifi.find("quality") + if quality != nil + self.set_next_value(self.ser1, quality) + end + end + + def every_second() + self.delay -= 1 + if self.delay == 0 + self.add_wifi_point() + self.delay = 2 + end + end + + def before_del() + tasmota.remove_driver(self) + end +end + +return lv_wifi_graph + +#- +import lv_wifi_graph +ws_h = 40 +ws_w = 80 +ws = lv_wifi_graph(scr) +ws.set_size(ws_w,ws_h) +ws.set_pos(hres-ws_w, stat_line.get_height()) +tasmota.add_driver(ws) +-# diff --git a/tasmota/berry/openhasp_src/openhasp_demo/noun_Fan_35097_140.png b/tasmota/berry/openhasp_src/openhasp_demo/noun_Fan_35097_140.png new file mode 100644 index 0000000000000000000000000000000000000000..15c35f0236c8d9bb8d70ca555c71c0ae6402f39e GIT binary patch literal 6645 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 literal 0 HcmV?d00001 diff --git a/tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl b/tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl new file mode 100644 index 000000000..12cd03736 --- /dev/null +++ b/tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl @@ -0,0 +1,52 @@ +{"page":0,"comment":"---------- Upper stat line ----------"} +{"id":0,"text_color":"#FFFFFF"} +{"id":11,"obj":"label","x":0,"y":0,"w":320,"pad_right":90,"h":22,"bg_color":"#D00000","bg_opa":255,"radius":0,"border_side":0,"text":"Tasmota","text_font":"montserrat-20"} + +{"id":15,"obj":"lv_wifi_arcs","x":291,"y":0,"w":29,"h":22,"radius":0,"border_side":0,"bg_color":"#000000","line_color":"#FFFFFF"} +{"id":16,"obj":"lv_clock","x":232,"y":3,"w":55,"h":16,"radius":0,"border_side":0} + +{"comment":"---------- Bottom buttons - prev/home/next ----------"} +{"id":101,"obj":"btn","x":20,"y":210,"w":80,"h":25,"action":"prev","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF053","text_font":"montserrat-20"} +{"id":102,"obj":"btn","x":120,"y":210,"w":80,"h":25,"action":"back","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF015","text_font":"montserrat-20"} +{"id":103,"obj":"btn","x":220,"y":210,"w":80,"h":25,"action":"next","bg_color":"#1fa3ec","radius":10,"border_side":1,"text":"\uF054","text_font":"montserrat-20"} + +{"page":2,"comment":"---------- Page 2 ----------"} +{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"} + +{"comment":"---------- Wifi status ----------"} +{"id":20,"obj":"lv_wifi_graph","x":257,"y":25,"w":60,"h":40,"radius":0} +{"id":21,"obj":"lv_tasmota_info","x":3,"y":25,"w":251,"h":40,"radius":0} +{"id":22,"obj":"lv_tasmota_log","x":3,"y":68,"w":314,"h":90,"radius":0,"text_font":12} + +{"page":1,"comment":"---------- Page 1 ----------"} +{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"} + +{"id":2,"obj":"arc","x":20,"y":65,"w":80,"h":100,"border_side":0,"type":0,"rotation":0,"start_angle":180,"end_angle":0,"start_angle1":180,"value_font":12,"value_ofs_x":0,"value_ofs_y":-14,"bg_opa":0,"text":"--.-°C","min":200,"max":800,"val":0,"val_rule":"ESP32#Temperature","val_rule_formula":"val * 10","text_rule":"ESP32#Temperature","text_rule_format":"%2.1f °C"} + +{"id":5,"obj":"label","x":2,"y":35,"w":120,"text":"Temperature","align":1} + +{"id":10,"obj":"label","x":172,"y":35,"w":140,"text":"MPU","align":0} +{"id":11,"obj":"label","x":172,"y":55,"w":140,"text":"x=","align":0,"text_rule":"MPU9250#AX","text_rule_format":"x=%6.3f","text_rule_formula":"val / 1000"} +{"id":12,"obj":"label","x":172,"y":75,"w":140,"text":"y=","align":0,"text_rule":"MPU9250#AY","text_rule_format":"y=%6.3f","text_rule_formula":"val / 1000"} +{"id":13,"obj":"label","x":172,"y":95,"w":140,"text":"z=","align":0,"text_rule":"MPU9250#AZ","text_rule_format":"z=%6.3f","text_rule_formula":"val / 1000"} + +{"page":3,"comment":"---------- Page 3 - qrcode ----------"} +{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"} +{"id":1,"obj":"qrcode","qr_text":"https://github.com/arendst/Tasmota","x":85,"y":40,"qr_size":150} + +{"page":4,"comment":"---------- Page 4 - fan animation ----------"} +{"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"} +{"id":11,"obj":"img","src":"A:/openhasp_demo.tapp#noun_Fan_35097_140.png","auto_size":1,"w":140,"h":140,"x":50,"y":50,"image_recolor":"#0080FF","image_recolor_opa":150} +{"id":12,"obj":"spinner","parentid":11,"x":7,"y":6,"w":126,"h":126,"bg_opa":0,"border_width":0,"line_width":7,"line_width1":7,"type":2,"angle":120,"speed":1000,"value_str":3,"value_font":24} + +{"page":5,"comment":"---------- Page 5 - fancy watch ----------"} +{"id":0,"bg_color":"#000000","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#000000"} + +{"id":10,"obj":"img","src":"A:/openhasp_demo.tapp#watch_ren_back_240.png","x":40,"y":0,"w":240,"h":240} +{"id":11,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_hour_240.png","auto_size":1,"x":110,"y":45} +{"id":12,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_min_240.png","auto_size":1} +{"id":13,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_sec_240.png","auto_size":1,"x":110,"y":10} +{"id":15,"obj":"label","parentid":10,"x":184,"y":112,"w":18,"h":16,"text":"","align":1,"text_font":"montserrat-14"} + + +{"comment":"--- Trigger sensors every 2 seconds ---","berry_run":"tasmota.add_cron('*/2 * * * * *', def () tasmota.publish_rule(tasmota.read_sensors()) end, 'oh_every_5_s')"} diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_back_240.png b/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_back_240.png new file mode 100644 index 0000000000000000000000000000000000000000..167ad89e70e805baa3f65f7571f9936d5b90abc4 GIT binary patch literal 96985 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 SoMS)j0l?JA!mwK3Ird-Kh+8lK literal 0 HcmV?d00001 diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_min_240.png b/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_min_240.png new file mode 100644 index 0000000000000000000000000000000000000000..e2e47ab154382913981f20ff00d54735ef20bcd7 GIT binary patch literal 5466 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 literal 0 HcmV?d00001 From efb2cd3348e955e6af5471aa4be9dda6046de649 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 24 Apr 2022 23:07:22 +0200 Subject: [PATCH 069/376] openhasp as default in lvgl env. --- tasmota/tasmota_configurations_ESP32.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index 59084cc52..c79d7f287 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -99,7 +99,7 @@ #ifdef FIRMWARE_LVGL #undef CODE_IMAGE_STR -#define CODE_IMAGE_STR "lvgl" +#define CODE_IMAGE_STR "lvgl-openhasp" #undef MODULE #define MODULE WEMOS // [Module] Select default module from tasmota_template.h @@ -115,6 +115,7 @@ #define USE_I2S #define USE_SPI #define USE_LVGL +#define USE_LVGL_OPENHASP #define USE_LVGL_FREETYPE #undef SET_ESP32_STACK_SIZE #define SET_ESP32_STACK_SIZE (24 * 1024) From 773c7290f4c10dfb8145935cca59d115900ad90a Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 25 Apr 2022 08:43:58 +0200 Subject: [PATCH 070/376] Rename 3 buttons driver --- .../lv_3_touch_buttons.be => drivers/lv_touch_3_buttons.be} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename tasmota/berry/{lvgl_examples/lv_3_touch_buttons.be => drivers/lv_touch_3_buttons.be} (99%) diff --git a/tasmota/berry/lvgl_examples/lv_3_touch_buttons.be b/tasmota/berry/drivers/lv_touch_3_buttons.be similarity index 99% rename from tasmota/berry/lvgl_examples/lv_3_touch_buttons.be rename to tasmota/berry/drivers/lv_touch_3_buttons.be index 354c17313..f2adf5cdc 100644 --- a/tasmota/berry/lvgl_examples/lv_3_touch_buttons.be +++ b/tasmota/berry/drivers/lv_touch_3_buttons.be @@ -83,4 +83,4 @@ return lv_touch_3_buttons #- lv_btn3 = lv_touch_3_buttons(gpio.pin(gpio.INPUT, 0), gpio.pin(gpio.INPUT, 1), gpio.pin(gpio.INPUT, 2), lv_touch_3_buttons.ACTIVE_LOW) tasmota.add_driver(lv_btn3) --# \ No newline at end of file +-# From d30faab8b28902070ae7076a3d8d43cc353188bc Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 25 Apr 2022 12:03:18 +0200 Subject: [PATCH 071/376] Fix openhasp demo --- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 187609 -> 187645 bytes .../openhasp_src/openhasp_demo/autoexec.be | 2 ++ 2 files changed, 2 insertions(+) diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp index ab08c9e18b19b0d7605c8241e0c27d86587a33c2..4c2ecdb495af9a4d93ffb6091d4c73f9e0952e36 100644 GIT binary patch delta 742 zcmcb)ll$*ZZqop7W)?065YSJU8REfxZMqCA0|N+iGsrL`mX_qFR-`8DC8dUja56Ag z6{aOs7p84AJM)7Tvv>=5!GgTfYH&d-=}r!?;4x(#nBes2Q;f=+WmMisf@Qev6u~k; z3pN|uofKdJ+88p)UmGl#6O#s3zWwhtMlYu3`GMQ#2Qs!*fYnUbJjDo61$5VTprKwo z5b>4Q7`0F=1L+PFg-8ayL6=+UegF|q%hKJN~bDVyp|CSYg)0Q-veEdT%j delta 767 zcmeynll$gQZsP!NW)?065U`p$BZOJt%+4Py3=AO5%^<^&SXz>wT9KNpmy{YB!pXpV zp*A(?;&iLOjItX8HZV^XVyOgTiOE}8wlRCo>z$m(s=*$`8=llul{$GJuk7Yste4rr z5)*jUVG^77@fPrc1r4Ru;DT||ogB>NoiirCQr2PLn30JWB$?a0 zXH3?&Q)KVUNlgOc&Ea+@1z5VHUItB8@z-X*D)J)XJXC#irT_Lyf5r<{EWJSK>At5J zwb^e%B-p5)45g}k4h9Ag7C(yJ-C>erdi-blp*u{bY>YRVfUyApqooMQ diff --git a/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be b/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be index 90fc68d50..0d3a90376 100644 --- a/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be +++ b/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be @@ -39,6 +39,7 @@ end run_watch() def p5_in() + import global global.p0b101.bg_opa = 0 global.p0b102.bg_opa = 0 global.p0b103.bg_opa = 0 @@ -46,6 +47,7 @@ def p5_in() end def p5_out() + import global global.p0b101.bg_opa = 255 global.p0b102.bg_opa = 255 global.p0b103.bg_opa = 255 From 2add4d4712901b65b012ff29c12489da9384db7d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 25 Apr 2022 12:03:53 +0200 Subject: [PATCH 072/376] Workaround HWCDC exception --- tasmota/support.ino | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 75f461fe5..c89c6f237 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1898,14 +1898,17 @@ void SetSerialBegin(void) { SetSerialSwap(); #endif // ESP8266 #ifdef ESP32 +#ifdef ARDUINO_USB_CDC_ON_BOOT +// Serial.end(); +// Serial.begin(); + // Above sequence ends in "Exception":5,"Reason":"Load access fault" + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_SERIAL "HWCDC supports 115200 bit/s only")); +#else delay(10); // Allow time to cleanup queues - if not used hangs ESP32 Serial.end(); delay(10); // Allow time to cleanup queues - if not used hangs ESP32 -#ifdef ARDUINO_USB_CDC_ON_BOOT - Serial.begin(TasmotaGlobal.baudrate); -#else Serial.begin(TasmotaGlobal.baudrate, ConvertSerialConfig(Settings->serial_config)); -#endif // ARDUINO_USB_CDC_ON_BOOT +#endif // Not ARDUINO_USB_CDC_ON_BOOT #endif // ESP32 } From b45fd4f541b91ab48130448a61472ac50efc85d2 Mon Sep 17 00:00:00 2001 From: blakadder Date: Mon, 25 Apr 2022 14:54:45 +0200 Subject: [PATCH 073/376] Update partition.be fix typo --- tasmota/berry/modules/partition.be | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/berry/modules/partition.be b/tasmota/berry/modules/partition.be index b1990ea86..d81a9950d 100644 --- a/tasmota/berry/modules/partition.be +++ b/tasmota/berry/modules/partition.be @@ -532,8 +532,8 @@ class Partition_manager_UI webserver.content_send(string.format("

Used: %i KB

", used / 1024)) webserver.content_send(string.format("

Free: %i KB

", (slot.size - used) / 1024)) else - webserver.content_send("

Used: unknwon

") - webserver.content_send("

Free: unknwon

") + webserver.content_send("

Used: unknown

") + webserver.content_send("

Free: unknown

") end if !active && used > 0 webserver.content_send("

Date: Mon, 25 Apr 2022 19:24:55 +0200 Subject: [PATCH 074/376] OpenHASP fix touch event --- .../berry_tasmota/src/be_lv_openhasp.c | 111 +++++++++--------- tasmota/berry/openhasp_src/openhasp.tapp | Bin 54986 -> 56999 bytes .../openhasp_src/openhasp_core/openhasp.be | 13 +- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 187645 -> 187805 bytes 4 files changed, 66 insertions(+), 58 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index f925d6325..5ead9fc0c 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -1968,7 +1968,7 @@ be_local_closure(lvh_obj_get_obj, /* name */ ********************************************************************/ be_local_closure(lvh_obj_get_action, /* name */ be_nested_proto( - 2, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1976,14 +1976,19 @@ be_local_closure(lvh_obj_get_action, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ + ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_literal("_action"), + /* K1 */ be_nested_str_literal(""), }), be_str_literal("get_action"), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ + ( &(const binstruction[ 6]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + 0x78060001, // 0001 JMPF R1 #0004 + 0x5C080200, // 0002 MOVE R2 R1 + 0x70020000, // 0003 JMP #0005 + 0x58080001, // 0004 LDCONST R2 K1 + 0x80040400, // 0005 RET 1 R2 }) ) ); @@ -3438,66 +3443,66 @@ be_local_closure(lvh_obj_event_cb, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_literal("_page"), /* K1 */ be_nested_str_literal("_oh"), /* K2 */ be_nested_str_literal("code"), /* K3 */ be_nested_str_literal("action"), - /* K4 */ be_nested_str_literal("lv"), - /* K5 */ be_nested_str_literal("EVENT_CLICKED"), - /* K6 */ be_nested_str_literal("tasmota"), - /* K7 */ be_nested_str_literal("set_timer"), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_literal("_event_map"), - /* K10 */ be_nested_str_literal("find"), - /* K11 */ be_nested_str_literal("string"), - /* K12 */ be_nested_str_literal("format"), - /* K13 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":\"%s\"}}"), - /* K14 */ be_nested_str_literal("_page_id"), - /* K15 */ be_nested_str_literal("id"), + /* K4 */ be_nested_str_literal(""), + /* K5 */ be_nested_str_literal("lv"), + /* K6 */ be_nested_str_literal("EVENT_CLICKED"), + /* K7 */ be_nested_str_literal("tasmota"), + /* K8 */ be_nested_str_literal("set_timer"), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_literal("_event_map"), + /* K11 */ be_nested_str_literal("find"), + /* K12 */ be_nested_str_literal("string"), + /* K13 */ be_nested_str_literal("format"), + /* K14 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":\"%s\"}}"), + /* K15 */ be_nested_str_literal("_page_id"), + /* K16 */ be_nested_str_literal("id"), }), be_str_literal("event_cb"), &be_const_str_solidified, - ( &(const binstruction[39]) { /* code */ + ( &(const binstruction[38]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x88080501, // 0001 GETMBR R2 R2 K1 0x880C0302, // 0002 GETMBR R3 R1 K2 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x4C140000, // 0004 LDNIL R5 - 0x20100805, // 0005 NE R4 R4 R5 - 0x78120008, // 0006 JMPF R4 #0010 - 0xB8120800, // 0007 GETNGBL R4 K4 - 0x88100905, // 0008 GETMBR R4 R4 K5 - 0x1C100604, // 0009 EQ R4 R3 R4 - 0x78120004, // 000A JMPF R4 #0010 - 0xB8120C00, // 000B GETNGBL R4 K6 - 0x8C100907, // 000C GETMET R4 R4 K7 - 0x58180008, // 000D LDCONST R6 K8 - 0x841C0000, // 000E CLOSURE R7 P0 - 0x7C100600, // 000F CALL R4 3 - 0x88100109, // 0010 GETMBR R4 R0 K9 - 0x8C10090A, // 0011 GETMET R4 R4 K10 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C100400, // 0013 CALL R4 2 - 0x4C140000, // 0014 LDNIL R5 - 0x20140805, // 0015 NE R5 R4 R5 - 0x7816000D, // 0016 JMPF R5 #0025 - 0xA4161600, // 0017 IMPORT R5 K11 - 0x8C180B0C, // 0018 GETMET R6 R5 K12 - 0x5820000D, // 0019 LDCONST R8 K13 - 0x88240100, // 001A GETMBR R9 R0 K0 - 0x8824130E, // 001B GETMBR R9 R9 K14 - 0x8828010F, // 001C GETMBR R10 R0 K15 - 0x5C2C0800, // 001D MOVE R11 R4 - 0x7C180A00, // 001E CALL R6 5 - 0xB81E0C00, // 001F GETNGBL R7 K6 - 0x8C1C0F07, // 0020 GETMET R7 R7 K7 - 0x58240008, // 0021 LDCONST R9 K8 - 0x84280001, // 0022 CLOSURE R10 P1 - 0x7C1C0600, // 0023 CALL R7 3 - 0xA0140000, // 0024 CLOSE R5 - 0xA0000000, // 0025 CLOSE R0 - 0x80000000, // 0026 RET 0 + 0x20100904, // 0004 NE R4 R4 K4 + 0x78120008, // 0005 JMPF R4 #000F + 0xB8120A00, // 0006 GETNGBL R4 K5 + 0x88100906, // 0007 GETMBR R4 R4 K6 + 0x1C100604, // 0008 EQ R4 R3 R4 + 0x78120004, // 0009 JMPF R4 #000F + 0xB8120E00, // 000A GETNGBL R4 K7 + 0x8C100908, // 000B GETMET R4 R4 K8 + 0x58180009, // 000C LDCONST R6 K9 + 0x841C0000, // 000D CLOSURE R7 P0 + 0x7C100600, // 000E CALL R4 3 + 0x8810010A, // 000F GETMBR R4 R0 K10 + 0x8C10090B, // 0010 GETMET R4 R4 K11 + 0x5C180600, // 0011 MOVE R6 R3 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x20140805, // 0014 NE R5 R4 R5 + 0x7816000D, // 0015 JMPF R5 #0024 + 0xA4161800, // 0016 IMPORT R5 K12 + 0x8C180B0D, // 0017 GETMET R6 R5 K13 + 0x5820000E, // 0018 LDCONST R8 K14 + 0x88240100, // 0019 GETMBR R9 R0 K0 + 0x8824130F, // 001A GETMBR R9 R9 K15 + 0x88280110, // 001B GETMBR R10 R0 K16 + 0x5C2C0800, // 001C MOVE R11 R4 + 0x7C180A00, // 001D CALL R6 5 + 0xB81E0E00, // 001E GETNGBL R7 K7 + 0x8C1C0F08, // 001F GETMET R7 R7 K8 + 0x58240009, // 0020 LDCONST R9 K9 + 0x84280001, // 0021 CLOSURE R10 P1 + 0x7C1C0600, // 0022 CALL R7 3 + 0xA0140000, // 0023 CLOSE R5 + 0xA0000000, // 0024 CLOSE R0 + 0x80000000, // 0025 RET 0 }) ) ); diff --git a/tasmota/berry/openhasp_src/openhasp.tapp b/tasmota/berry/openhasp_src/openhasp.tapp index f69011bf91fad46ec4f1a018fda787f42b8dfb0f..45ad7cd331c16c6e695dbeb9842957cb1085a2b6 100644 GIT binary patch delta 1418 zcma)6O-K|`9N&-BTFJgq!==}3i?g)57#)fgQHVq+3d|)4WSrf3yE``fW}10BYMXd0 zx@5ddT{;EQK{1BR4w9!1b?M}(h^}42u65}D=0iub=)vy%zdzpp_kZsf;|pu?<^Jf| zr3X*P1}^u%nE4cm@LzkRC!!me)MU%ZmvC|HKqS7pS}DC*t*}b;V=R$+T z6!@J9g{EMn)lym&3PRcvW@me|eu;)$#d(SUORC}vIe~3VsKlK!&O+|S6?U~TvQMp7 z6YTW)VfNNYuxj%l``PGDb0M^-;0lDKl1!=^7VV7NwG9=igo-vBGCO-hDohmLr|S8z z^$W>%p9cR7Lq@U9pIMNy)#KS_BNdRzsb_OuCb$7UQ%E?esRZXMDp5p0fj8+aI@j0d z*94Zqq=QKrvT0#&zTz(Tz!X4{MMA32Jwj$X*4!32{v+C!tsidKJv^M-g$EnWmh{pj zMAPiN*Rlu&!aQI;&|-G0{49catsXMj;55GIw=2>N+Iho)A}r_A0y%Gxy&UOE`?P-z zdsy<~+44yD99V`L5%(~Kt)Nha+Z5&ZLd}2;_n2=OicGQScLpZh<&VzC) z*W8KmaIDbqx5eP@_4(KJgB&Uer|`EflVFKll4m)xBOC_>d$@MeaUT8J4^M@>?JZ;!iSeFF}Wl&KW}oOe#qu_4GmW2yv&@< z8+F+kH_PbzcyFFvpUcFYnVUX&ZG$G5mTwf_%+d5oc(ea>0nW`03uI&`&)*w0`On@Y nP9>e3vW)orq^!-k`|iv0p}KE!)IAlDb0#<5Q(zOi#sCBWe+Eme diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index 39fecb9c5..04b8011c1 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -3,6 +3,8 @@ # use `import openhasp` and set the JSONL definitions in `pages.jsonl` # # As an optimization `0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#` is replaced with `0` +# +# rm openhasp.tapp; zip -j -0 openhasp.tapp openhasp_core/* ################################################################################# # How to solidify (needs an ESP32 with PSRAM) #- @@ -268,7 +270,8 @@ class lvh_obj # self._lv_obj.add_event_cb(/ obj, event -> self.action_cb(obj, event), lv.EVENT_CLICKED, 0) end def get_action() - return self._action + var action = self._action + return action ? action : "" # cannot be `nil` as it would mean no member end #==================================================================== @@ -305,7 +308,7 @@ class lvh_obj # print("-> CB fired","self",self,"obj",obj,"event",event.tomap(),"code",event.code) var oh = self._page._oh # openhasp global object var code = event.code # materialize to a local variable, otherwise the value can change (and don't capture event object) - if self.action != nil && code == lv.EVENT_CLICKED + if self.action != "" && code == lv.EVENT_CLICKED # if clicked and action is declared, do the page change event tasmota.set_timer(0, /-> oh.do_action(self, code)) end @@ -1397,11 +1400,11 @@ class OpenHASP # Arg2: LVGL event fired # Returns: nil #==================================================================== - def do_action(lvh_obj, event_code) + def do_action(lvh_object, event_code) if event_code != lv.EVENT_CLICKED return end - var action = lvh_obj._action + var action = lvh_object._action var cur_page = self.lvh_pages[self.lvh_page_cur_idx] - # print("do_action","lvh_obj",lvh_obj,"action",action,"cur_page",cur_page,self.lvh_page_cur_idx) + # print("do_action","lvh_object",lvh_object,"action",action,"cur_page",cur_page,self.lvh_page_cur_idx) # action can be `prev`, `next`, `back`, or `p` like `p1` var to_page = nil diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp index 4c2ecdb495af9a4d93ffb6091d4c73f9e0952e36..b8ca5eb753fd62545b71f812cb6159499e2eb046 100644 GIT binary patch delta 370 zcmeynlY8!NZtehYW)?065Lh~qTbVtqC@m?xC~dmUUqzEm0>uSBS z@(u$-<(=vBe;LKtckD<@+PMR)?t%@MvO-a=LViJNUPfYZfnG^sL4mbGRc3*LZkB?s z0jdO?7oVJ8l&Y^aoiUp!czf(WMi$kqvcw{V#N?99{5%C)h2qqlG`)BTmrDT%ic(8T zi}GL!>|qQm1tlerw1Toia$;Uyeu+X-szO3uW=?`aVzEMIi9&gPX-T z05sE(Dph17@1Y4dn{+-VUJHtF3HT#o9>{? z6tX>5g-L^zIWIG3d%Gsn>;CDbJDH-UU)sr(#Hpl{Q=igyc+^%+uNroBS@_@TcD$GF3r Date: Mon, 25 Apr 2022 20:59:23 +0200 Subject: [PATCH 075/376] Prep failsafe update --- .gitignore | 6 +--- boards/esp32_4M_2APP.json | 46 ++++++++++++++++++++++++ esp32_partition_app2880k_spiffs320k.csv | 6 ++++ safemode.bin/tasmota32-minicustom.bin | Bin 0 -> 738016 bytes 4 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 boards/esp32_4M_2APP.json create mode 100644 esp32_partition_app2880k_spiffs320k.csv create mode 100644 safemode.bin/tasmota32-minicustom.bin diff --git a/.gitignore b/.gitignore index 2dbf50516..1dd51a787 100644 --- a/.gitignore +++ b/.gitignore @@ -19,14 +19,10 @@ data unpacked_fs tasmota/user_config_override.h build -build_output +build_output/* firmware.map firmware.asm tasmota/tasmota.ino.cpp -tasmota*.bin -tasmota*.bin.gz -tasmota*.map -tasmota*.map.gz platformio_override.ini platformio_tasmota_cenv.ini diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json new file mode 100644 index 000000000..e9dc5635c --- /dev/null +++ b/boards/esp32_4M_2APP.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M", + "f_cpu": "80000000L", + "f_flash": "40000000L", + "flash_mode": "dout", + "mcu": "esp32", + "variant": "esp32", + "partitions": "esp32_partition_app2880k_spiffs320k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_target": "esp32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x2E0000", + "tasmota32-minicustom.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://en.wikipedia.org/wiki/ESP32", + "vendor": "Espressif" + } diff --git a/esp32_partition_app2880k_spiffs320k.csv b/esp32_partition_app2880k_spiffs320k.csv new file mode 100644 index 000000000..511ce01a1 --- /dev/null +++ b/esp32_partition_app2880k_spiffs320k.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +app0, app, ota_0, 0x10000, 0x2D0000, +factory, app, factory, 0x2E0000,0xD0000, +spiffs, data, spiffs, 0x3B0000,0x50000, diff --git a/safemode.bin/tasmota32-minicustom.bin b/safemode.bin/tasmota32-minicustom.bin new file mode 100644 index 0000000000000000000000000000000000000000..e614201ffef9b04b3fd556c4ecb0bc7bbe67f524 GIT binary patch literal 738016 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 z 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

RSjE~EVzmgbdDUDN>dUnV}nnQg3 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", 3546571739u, 0, 11, &be_const_str_json_fdump_any); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_loop); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_import); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_chars_in_string); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_content_send_style); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_def); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "Choose a device configuration:
", 1336654704u, 0, 49, NULL); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_SERIAL_5O2); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_None); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_tob64); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_c); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_CFG_X3A_X20loaded_X20_X20); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_arch); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_before_del); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_json); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_check_not_method); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_set_pwm); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_SERIAL_6O1); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__persist_X2Ejson); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_eth); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_members); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_connect); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_SERIAL_7E2); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str__available); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_del); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_autorun); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_event_send); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_AudioFileSourceFS); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, NULL); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_classof); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_json); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_animate); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_check_not_method); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_set_pwm); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_SERIAL_6O1); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__persist_X2Ejson); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_eth); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_members); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_connect); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_SERIAL_7E2); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str__available); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_del); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_autorun); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_event_send); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_AudioFileSourceFS); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, NULL); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_classof); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_json); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_animate); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, NULL); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_SERIAL_5E2); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_json_fdump_list); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_save_before_restart); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_input); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_fast_loop); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_adv_watch); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_SERIAL_5O2); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_codedump); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_point); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_nvskeys); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_None); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_type_error); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_continue); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_get_power); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_CFG_X3A_X20loaded_X20_X20); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_clock); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, NULL); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_SERIAL_5E2); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_json_fdump_list); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_save_before_restart); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_input); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_fast_loop); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_adv_watch); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_SERIAL_5O2); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_codedump); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_point); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_nvskeys); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_None); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_type_error); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_continue); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_get_power); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_CFG_X3A_X20loaded_X20_X20); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_clock); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_MI32); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_power_off); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_AudioFileSource); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_PART_MAIN); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_def); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_set_style_border_width); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_Trigger); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_SERIAL_8E2); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_phy); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_min); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_AudioGeneratorMP3); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str__buffer); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_data); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_efuse_em); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_subscribe); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_consume_silence); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_enabled); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_discover); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", ota_num)) - webserver.content_send("

") - else - # put a fake disabled button - webserver.content_send("

") - if used >= 0 - webserver.content_send("") + if maxota > 0 + if !active && used > 0 + webserver.content_send("

") + webserver.content_send("") + webserver.content_send(string.format("", ota_num)) + webserver.content_send("

") else - webserver.content_send("") + # put a fake disabled button + webserver.content_send("

") + if used >= 0 + webserver.content_send("") + else + webserver.content_send("") + end + webserver.content_send("

") end - webserver.content_send("

") end webserver.content_send("

") @@ -239,7 +241,7 @@ class Partition_manager_UI var ota_num = slot.is_ota() if ota_num != nil # we have an OTA partition - self.page_show_partition(slot, ota_num == p.otadata.active_otadata, ota_num) + self.page_show_partition(slot, ota_num == p.otadata.active_otadata, ota_num, p.otadata.maxota) elif slot.is_spiffs() var flash_size = tasmota.memory()['flash'] * 1024 var used_size = (slot.start + slot.size) @@ -308,9 +310,11 @@ class Partition_manager_UI self.page_show_partitions(p) webserver.content_send("

") - webserver.content_send("
 Re-partition

") - self.page_show_repartition_asym(p) - webserver.content_send("

") + if p.otadata.maxota > 0 + webserver.content_send("
 Re-partition

") + self.page_show_repartition_asym(p) + webserver.content_send("

") + end webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# webserver.content_stop() #- end of web page -# From 66aa714524fa5ca429715db3f200a28657c56699 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 30 Apr 2022 18:50:05 +0200 Subject: [PATCH 117/376] Berry partition manager display factory partition --- lib/libesp32/berry/generate/be_const_strtab.h | 3 +- .../berry/generate/be_const_strtab_def.h | 2498 +++++++++-------- .../src/be_partition_core_module.c | 643 +++-- .../src/embedded/partition_core.be | 9 +- tasmota/berry/modules/partition.be | 4 +- 5 files changed, 1604 insertions(+), 1553 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 825b5b69c..17cd8fb50 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -586,6 +586,7 @@ extern const bcstring be_const_str_invalidate_spiffs; extern const bcstring be_const_str_io_error; extern const bcstring be_const_str_ip; extern const bcstring be_const_str_is_dirty; +extern const bcstring be_const_str_is_factory; extern const bcstring be_const_str_is_first_time; extern const bcstring be_const_str_is_ota; extern const bcstring be_const_str_is_running; @@ -913,7 +914,7 @@ extern const bcstring be_const_str_subscribe; extern const bcstring be_const_str_subtype; extern const bcstring be_const_str_success; extern const bcstring be_const_str_super; -extern const bcstring be_const_str_switch_safeboot; +extern const bcstring be_const_str_switch_factory; extern const bcstring be_const_str_sys; extern const bcstring be_const_str_tag; extern const bcstring be_const_str_tan; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 52248982d..91762c866 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,961 +1,962 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__request_from); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_get_temp); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_ALIGN_LEFT_MID); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str__read); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_cos); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_exp); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, NULL); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_SERIAL_7E1); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_wifi_arcs); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_BLE); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_event_cb); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_Wire); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str__splash); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_set_width); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_gen_cb); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str__X2Fstate_X2F); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_check_not_method); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_list); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_offset); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str__X2D_X2D_X3A_X2D_X2D); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_url_encode); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str__X2E_X2E); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_ALIGN_BOTTOM_MID); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_solidified); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_clear_first_time); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, NULL); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, NULL); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_get_battery_chargin_status); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_lv_); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_load); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_internal_error); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str__); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, NULL); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_adv_watch); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_editable); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_get_log); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_get_bat_power); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_add_rule); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_fast_loop_enabled); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_flush); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_get_current_module_name); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_EVENT_DELETE); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_Partition); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, NULL); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str__subscribe); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_font_embedded); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_MI32); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_power_off); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_AudioFileSource); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_PART_MAIN); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_def); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_set_style_border_width); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_Trigger); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_SERIAL_8E2); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_phy); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_min); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_AudioGeneratorMP3); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str__buffer); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_data); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_efuse_em); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_subscribe); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_consume_silence); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_enabled); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_discover); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_get_bat_power); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_as); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_SERIAL_7N1); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_SERIAL_8E2); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_Leds); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str__X3C); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_json); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_attrdump); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_EVENT_DELETE); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_screenshot); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_get_style_pad_right); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_content_start); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_consume_silence); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_cb_obj); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_atleast1); +be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_add_header); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_maxota); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str__X2A); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_crc32); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_None); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_SERIAL_7O2); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_adv_cb); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_RGBW); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_decrypt); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str__X2F_X2Eautoconf); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_bri); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_CFG_X3A_X20loaded_X20_X20); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_set_style_img_recolor); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_groups); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_set_align); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str__X3A); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_available); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_AA50); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_base_class); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_add_anim); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_SERIAL_5N2); +be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27); +be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E); +be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_BLE); +be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); +be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_clock_icon); +be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_refr_size); +be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str__settings_ptr); +be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_allocated); +be_define_const_str(00, "00", 569209421u, 0, 2, NULL); +be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_set_y); +be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_serial); +be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson); +be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_response_append); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_setrange); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_register_button_encoder); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_remove); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_nvs); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_reverse); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_eth); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_lv_point_arr); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_CFG_X3A_X20running_X20); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_COLOR_BLACK); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__rmt); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_frombytes); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_call); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_to_gamma); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__def); be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "
" + "
" + "" + "" + "" + ""; + const char HTTP_FORM_CMND[] PROGMEM = "


" "
" @@ -844,7 +856,11 @@ void WSContentSendStyle_P(const char* formatP, ...) { WSContentSend_P(HTTP_SCRIPT_COUNTER); } } +#ifdef ESP32 + WSContentSend_P(HTTP_HEAD_LAST_SCRIPT32); +#else WSContentSend_P(HTTP_HEAD_LAST_SCRIPT); +#endif WSContentSend_P(HTTP_HEAD_STYLE1, WebColor(COL_FORM), WebColor(COL_INPUT), WebColor(COL_INPUT_TEXT), WebColor(COL_INPUT), WebColor(COL_INPUT_TEXT), WebColor(COL_CONSOLE), WebColor(COL_CONSOLE_TEXT), WebColor(COL_BACKGROUND)); @@ -2286,7 +2302,15 @@ void HandleRestoreConfiguration(void) WSContentStart_P(PSTR(D_RESTORE_CONFIGURATION)); WSContentSendStyle(); WSContentSend_P(HTTP_FORM_RST); +#ifdef ESP32 + if (EspSingleOtaPartition() && !EspRunningFactoryPartition()) { + WSContentSend_P(HTTP_FORM_RST_UPG_FCT, PSTR(D_RESTORE)); + } else { + WSContentSend_P(HTTP_FORM_RST_UPG, PSTR(D_RESTORE)); + } +#else WSContentSend_P(HTTP_FORM_RST_UPG, PSTR(D_RESTORE)); +#endif if (WifiIsInManagerMode()) { WSContentSpaceButton(BUTTON_MAIN); } else { @@ -2511,7 +2535,15 @@ void HandleUpgradeFirmware(void) { WSContentStart_P(PSTR(D_FIRMWARE_UPGRADE)); WSContentSendStyle(); WSContentSend_P(HTTP_FORM_UPG, SettingsText(SET_OTAURL)); +#ifdef ESP32 + if (EspSingleOtaPartition() && !EspRunningFactoryPartition()) { + WSContentSend_P(HTTP_FORM_RST_UPG_FCT, PSTR(D_UPGRADE)); + } else { + WSContentSend_P(HTTP_FORM_RST_UPG, PSTR(D_UPGRADE)); + } +#else WSContentSend_P(HTTP_FORM_RST_UPG, PSTR(D_UPGRADE)); +#endif WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); @@ -2955,8 +2987,9 @@ void HandleSwitchFactory(void) Webserver->send(302, "text/plain", ""); } } + Web.upload_file_type = UPL_TASMOTA; } -#endif +#endif // ESP32 /*-------------------------------------------------------------------------------------------*/ From a4c71c16523837e82ea8bfafab6926ae1020804a Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 2 May 2022 21:25:35 +0200 Subject: [PATCH 129/376] Filter based on first byte of file --- .../html_compressed/HTTP_HEAD_LAST_SCRIPT32.h | 34 ++++++++++++------- .../HTTP_HEAD_LAST_SCRIPT32.h | 23 +++++++++++-- tasmota/xdrv_01_webserver.ino | 8 ++--- 3 files changed, 45 insertions(+), 20 deletions(-) diff --git a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h index 15d227b30..fcf228aad 100644 --- a/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h +++ b/tasmota/html_compressed/HTTP_HEAD_LAST_SCRIPT32.h @@ -2,7 +2,7 @@ // compressed by tools/unishox/compress-html-uncompressed.py ///////////////////////////////////////////////////////////////////// -const size_t HTTP_HEAD_LAST_SCRIPT32_SIZE = 771; +const size_t HTTP_HEAD_LAST_SCRIPT32_SIZE = 989; const char HTTP_HEAD_LAST_SCRIPT32_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\x46\xB1\x0E\xE9\xDE\x3D\xA6\x77\xF5\x47\xC3\x8C\xEA\x2D\x3E" "\x09\x81\x8B\x1A\xFA\x8E\x86\xA1\x6F\xE6\x45\xE6\x13\x0E\xB3\xE5\x61\x04\x77\x4F" "\xBD\xE1\x82\xE8\xEA\x1C\x2E\xAB\x38\xEA\xA6\x6C\xAB\xFB\xB3\xAB\xCC\x26\x1D\x1F" @@ -16,17 +16,25 @@ const char HTTP_HEAD_LAST_SCRIPT32_COMPRESSED[] PROGMEM = "\x30\x2F\x83\xAD\xCE\ "\x9C\xCF\xB0\x43\xD7\x47\xC2\x3B\xA6\xB1\x0E\xF1\xE0\x11\x76\x41\x67\x76\x8E\xF1" "\xED\x63\x8E\xE9\xF6\x60\xE5\x9F\x67\x78\x81\x2B\x21\x04\x2C\x5D\x8E\x3B\xA7\xD9" "\x83\x94\x40\x9B\x68\x10\x73\xD3\xC5\x1D\x0C\x67\xC6\x9D\x3C\x2C\x70\xDD\xA3\xBA" - "\x77\x8F\x2A\x01\x8B\xC2\x09\x80\xE8\xEE\xD0\x20\xF0\x84\x6C\x3E\x73\x1F\x44\x6C" - "\x21\xA4\x11\x0A\xAA\x18\x5F\x66\xA1\x6F\xD4\x77\x4E\xF1\xE0\xD8\x74\xC1\x8F\x8E" - "\xE9\xF6\x43\xC4\xCA\x8F\xB3\xA8\xFB\x3B\x05\x9C\xC3\xB4\x42\xCE\x61\xF0\x8C\x07" - "\x47\xEA\xC6\x69\xF0\xFB\x3A\xAB\xE2\xD9\xDE\x3C\x1B\x0E\x99\xDF\x76\x21\x97\xAA" - "\xE9\x86\x2A\x2B\xF8\x79\x9F\x0E\xE9\xDE\x3E\x1F\x87\xB7\x4C\x1D\xD3\x61\xD3\xEE" - "\xC4\x32\x2F\x55\xD3\x3E\x1F\x0E\x61\xFA\x3F\x44\x6C\x3A\x7A\xAE\x85\xF8\xF8\x7C" - "\x39\x4D\x90\x20\xEB\x3E\x3E\x1B\x0E\x9F\x7E\x19\x9D\xE6\x54\xCD\x94\x78\xD3\x07" - "\x77\xC7\xC3\xE1\xF6\x62\xC2\xF3\x3E\xCE\xF7\x9D\x15\x68\xD7\x82\xE8\xEE\x9D\xD3" - "\xBC\x7C\x3F\x0F\x68\x20\xF0\x26\x78\x3D\xC7\x51\xCE\x6D\x9D\xE2\x04\x3C\x26\xBE" - "\x2D\x9F\x67\x7B\xC2\xCE\xED\x1D\xE3\xC1\xEE\x61\x79\xA0\x59\xD6\x8E\x33\xBC\x7B" - "\x48\x15\x33\x53\x94\xDB\x3B\xC7\x83\xDC\x78\x3D\xC7\x82\x36\x1D\x3C\xF8\x43\xBA" - "\x77\x8F\x1F\x74\x2F\xFC\x8C\x58\x5E\x67\x83\xDC\x7A\x1D\x9E\x0F\xFA\x32\x8F\xC3"; + "\x77\x8F\x2A\x01\x8B\xC2\x08\xB1\x81\x1D\xDA\x04\x1E\x10\xBC\x11\xF0\x10\x70\x43" + "\xDE\x3E\xC5\x9C\xA3\xEC\xF7\xCE\x84\x63\x42\x7E\x3D\xE3\x8C\xF7\xCE\x85\xE0\xB4" + "\x36\x77\x4E\x33\xAA\x1D\xE3\xC1\x19\xDF\xD7\xC4\x3E\x73\x1F\x44\x63\x42\x65\xF7" + "\x62\x3F\x9D\xD3\xBC\x78\xF8\x87\x4C\xE0\xB2\xC4\x3E\x1D\xD3\xBC\x7C\x3F\x0F\x69" + "\x9D\xFD\x0E\x1C\x7C\xE6\x3E\x88\x5E\xF5\x1C\xF9\x15\xFF\xF6\x64\x77\x7E\x21\xD3" + "\xEF\xC2\xC2\xA3\xBC\x78\xD3\x07\x74\x70\xE0\x42\xE2\x14\xF8\x7C\x39\x0F\xD1\xFA" + "\x21\xC3\x8F\x78\xE3\x3D\xF3\xE1\xF1\x91\xB0\x99\xC4\x77\x8F\x69\x18\x0E\x8E\xED" + "\x1D\xE3\xC1\xEE\x61\x79\x9E\xD0\x4C\xE0\x60\xF0\x7B\x8F\x1F\x10\xE9\xF7\x62\x15" + "\xF8\xAF\xFF\xB3\x22\x1C\x2C\xC1\x87\xF3\xBB\xE0\x8E\xF1\xE3\xEE\x85\xFF\x91\x8B" + "\x0B\xCC\xF0\x7B\x81\x17\x8A\x2A\x01\x41\xCB\x8F\x69\x9D\xFD\x1B\x0F\x9C\xC7\xD1" + "\x1B\x08\x69\x04\x42\xAA\x86\x17\xD9\xA8\x5B\xF5\x1D\xD3\xBC\x78\x36\x1D\x30\x63" + "\xE3\xBA\x7D\x90\xF1\x32\xA3\xEC\xEA\x3E\xCE\xC1\x67\x30\xED\x10\xB3\x98\x7C\x23" + "\x01\xD1\xFA\xB1\x9A\x7C\x3E\xCE\xAA\xF8\xB6\x77\x8F\x06\xC3\xA6\x77\xDD\x88\x65" + "\xEA\xBA\x61\x8A\xBE\x1E\x60\x83\xC2\x76\x98\x3B\xA6\xC3\xA7\xDD\x88\x64\x5E\xAB" + "\xA6\x7C\x3E\x1C\xC3\xF4\x7E\x88\xD8\x74\xF5\x5D\x0B\xF1\xF0\xF8\x72\x9B\x20\x42" + "\xE3\x2A\x01\xF8\x6C\x3A\x7D\xF8\x66\x77\x99\x53\x36\x51\xE3\x4C\x1D\xDF\x1F\x0F" + "\x87\xD9\x8B\x0B\xCC\xFB\x3B\xDE\x74\x55\xA3\x5E\x0B\xA3\xBA\x77\x4E\xF1\xF0\xFC" + "\x04\x4E\x19\x4E\xA3\x9C\xDB\x3B\xC4\x08\x78\x4D\x7C\x5B\x3E\xCE\xF7\x85\x82\x27" + "\x10\x08\x16\x75\xA3\x8C\xEF\x1E\xD2\x05\x4C\xD4\xE5\x36\xC8\x10\x78\xB0\x36\x1D" + "\x3C\xF8\x43\xBA\x77\x8F\x07\xB8\xF4\x3B\x3C\x1F\xF4\x65\x1F\x86"; #define HTTP_HEAD_LAST_SCRIPT32 Decompress(HTTP_HEAD_LAST_SCRIPT32_COMPRESSED,HTTP_HEAD_LAST_SCRIPT32_SIZE).c_str() \ No newline at end of file diff --git a/tasmota/html_uncompressed/HTTP_HEAD_LAST_SCRIPT32.h b/tasmota/html_uncompressed/HTTP_HEAD_LAST_SCRIPT32.h index 1b651cc52..3b8a1ebff 100644 --- a/tasmota/html_uncompressed/HTTP_HEAD_LAST_SCRIPT32.h +++ b/tasmota/html_uncompressed/HTTP_HEAD_LAST_SCRIPT32.h @@ -25,9 +25,27 @@ const char HTTP_HEAD_LAST_SCRIPT32[] PROGMEM = "eb('f2').style.display='block';" "t.form.submit();" "}" + "function upl(t){" // check file's first byte to decide next step + "var sl=t.form['u2'].files[0].slice(0,1);" // load only first byte of file + // "console.log(sl);" + // "console.log(sl.length);" + "var rd=new FileReader();" + "rd.onload=()=>{" + // "console.log(\"rd.onload\");" + "var bb=new Uint8Array(rd.result);" + // "console.log(bb[0]);" + // "console.log(bb.length);" + "if(bb.length==1&&bb[0]==0xE9){" + "fct(t);" // upload via factory + "}else{" + "t.form.submit();" // normal upload + "};" + "};" + "rd.readAsArrayBuffer(sl);" + "return false;" + "};" + "function fct(t){" - // "console.log('running fct');" - // "console.log(t);" "var x=new XMLHttpRequest();" "x.open('GET','/u4?u4=fct&api=',true);" "x.onreadystatechange=()=>{" @@ -43,6 +61,5 @@ const char HTTP_HEAD_LAST_SCRIPT32[] PROGMEM = "};" "x.send();" // "console.log('after send');" - "return false;" "}" ""; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 3b129e3c6..683dc0b00 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -354,17 +354,17 @@ const char HTTP_FORM_RST_UPG[] PROGMEM = "
" "" "" - ""; + ""; // upload via factory partition const char HTTP_FORM_RST_UPG_FCT[] PROGMEM = "
" "

" - "
" + "
" "" "" - "" - ""; + "" + ""; const char HTTP_FORM_CMND[] PROGMEM = "


" From f789225e024f8b0d27634c76caa797700f725808 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 2 May 2022 23:24:52 +0200 Subject: [PATCH 130/376] Safemode refactor * Safemode refactor * Looks nicer * rm littlefs upload * Delete littlefs.bin * Create placeholder * Delete tasmota32-minicustom.bin * Delete tasmota32c3-minicustom.bin * rm littlefs * rename to *-safemode.bin --- boards/esp32_4M_2APP.json | 4 --- boards/esp32c3_2APP.json | 4 --- esp32_partition_app2880k_spiffs320k.csv | 2 +- pio-tools/copy_safemode.py | 20 ------------ pio-tools/post_esp32.py | 41 +++++++++++++++++++++++- platformio_tasmota32.ini | 1 - safemode/littlefs.bin | Bin 327680 -> 0 bytes safemode/placeholder | 1 + safemode/tasmota32-minicustom.bin | Bin 738016 -> 0 bytes safemode/tasmota32c3-minicustom.bin | Bin 698176 -> 0 bytes 10 files changed, 42 insertions(+), 31 deletions(-) delete mode 100644 pio-tools/copy_safemode.py delete mode 100644 safemode/littlefs.bin create mode 100644 safemode/placeholder delete mode 100644 safemode/tasmota32-minicustom.bin delete mode 100644 safemode/tasmota32c3-minicustom.bin diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json index e2117ef59..e92826140 100644 --- a/boards/esp32_4M_2APP.json +++ b/boards/esp32_4M_2APP.json @@ -32,10 +32,6 @@ [ "0x10000", "variants/tasmota/tasmota32-minicustom.bin" - ], - [ - "0x3B0000", - "variants/tasmota/littlefs.bin" ] ] }, diff --git a/boards/esp32c3_2APP.json b/boards/esp32c3_2APP.json index a523062e6..cc40ed091 100644 --- a/boards/esp32c3_2APP.json +++ b/boards/esp32c3_2APP.json @@ -29,10 +29,6 @@ [ "0x10000", "variants/tasmota/tasmota32c3-minicustom.bin" - ], - [ - "0x3B0000", - "variants/tasmota/littlefs.bin" ] ] }, diff --git a/esp32_partition_app2880k_spiffs320k.csv b/esp32_partition_app2880k_spiffs320k.csv index 1e319a6b9..ee2ce899c 100644 --- a/esp32_partition_app2880k_spiffs320k.csv +++ b/esp32_partition_app2880k_spiffs320k.csv @@ -1,6 +1,6 @@ # Name, Type, SubType, Offset, Size, Flags nvs, data, nvs, 0x9000, 0x5000, otadata, data, ota, 0xe000, 0x2000, -factory, app, factory, 0x10000,0xD0000, +factory, app, factory, 0x10000, 0xD0000, app0, app, ota_0, 0xE0000, 0x2D0000, spiffs, data, spiffs, 0x3B0000,0x50000, diff --git a/pio-tools/copy_safemode.py b/pio-tools/copy_safemode.py deleted file mode 100644 index ea676af9f..000000000 --- a/pio-tools/copy_safemode.py +++ /dev/null @@ -1,20 +0,0 @@ -import os -import shutil -from os.path import join -from SCons.Script import DefaultEnvironment - -env = DefaultEnvironment() -platform = env.PioPlatform() - -FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") - -safemode_dir = join(env["PROJECT_DIR"], "safemode") -variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") - -if env["PIOPLATFORM"] == "espressif32": - if os.path.exists(safemode_dir): -# print("safemode.bin dir exists") - if os.path.exists(variants_dir): -# print("variants/tasmota exists") - shutil.rmtree(variants_dir) - shutil.copytree(safemode_dir, variants_dir) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 055582d33..76a83d1df 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -18,21 +18,47 @@ Import("env") +env = DefaultEnvironment() platform = env.PioPlatform() +from genericpath import exists +import os import sys from os.path import join import csv +import requests +import shutil sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) import esptool +FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") +safemode_dir = join(env["PROJECT_DIR"], "safemode") +variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") + + +def esp32_fetch_safemode_bin(chip): + safemode_fw_url = "https://github.com/Jason2866/Tasmota-specials/raw/firmware/firmware/tasmota32/other/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_name = safemode_dir + "/tasmota" + chip[3:] + "-safemode.bin" + if(exists(safemode_fw_name)): + print("Safemode binary already downloaded.") + return safemode_fw_name + print("Will download safemode binary from URL:") + print(safemode_fw_url) + response = requests.get(safemode_fw_url) + open(safemode_fw_name, "wb").write(response.content) + print("Safemode binary written to safemode dir.") + return safemode_fw_name + + def esp32_create_combined_bin(source, target, env): #print("Generating combined binary for serial flashing") # The offset from begin of the file where the app0 partition starts # This is defined in the partition .csv file - app_offset = 0x10000 # default value + factory_offset = -1 # error code value + app_offset = 0x10000 # default value for "old" scheme + spiffs_offset = -1 # error code value with open(env.BoardConfig().get("build.partitions")) as csv_file: print("Read partitions from ",env.BoardConfig().get("build.partitions")) csv_reader = csv.reader(csv_file, delimiter=',') @@ -46,12 +72,17 @@ def esp32_create_combined_bin(source, target, env): line_count += 1 if(row[0] == 'app0'): app_offset = int(row[3],base=16) + elif(row[0] == 'factory'): + factory_offset = int(row[3],base=16) + elif(row[0] == 'spiffs'): + spiffs_offset = int(row[3],base=16) # print("Got app_offset from .csv:", row[3]) new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") + esp32_fetch_safemode_bin(chip) flash_size = env.BoardConfig().get("upload.flash_size") cmd = [ "--chip", @@ -69,6 +100,14 @@ def esp32_create_combined_bin(source, target, env): print(f" - {sect_adr} | {sect_file}") cmd += [sect_adr, sect_file] + if os.path.exists(safemode_dir): + #print("safemode.bin dir exists") + if os.path.exists(variants_dir): + #print("variants/tasmota exists") + shutil.rmtree(variants_dir) + shutil.copytree(safemode_dir, variants_dir) + + # "main" firmware to app0 - mandatory print(f" - {hex(app_offset)} | {firmware_name}") cmd += [hex(app_offset), firmware_name] diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 38f17ebd3..8c604f663 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -34,7 +34,6 @@ build_flags = ${esp_defaults.build_flags} -Wl,--wrap=panicHandler -Wl,--wrap=xt_unhandled_exception -Wl,--wrap=_Z11analogWritehi ; `analogWrite(unsigned char, int)` use the Tasmota version of analogWrite for deeper integration and phase control extra_scripts = pre:pio-tools/add_c_flags.py - pre:pio-tools/copy_safemode.py post:pio-tools/post_esp32.py ${esp_defaults.extra_scripts} diff --git a/safemode/littlefs.bin b/safemode/littlefs.bin deleted file mode 100644 index 796a293083214dffd26dd931fe4d5a2ce63b82d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 327680 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 z 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

VnPUTnHPaXiwc+mUY5{hX$ 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%0DPiOHd1)DUOhn+xFLYNl%d`eepSD1H2d$ zAovvPJ1AjK!oizYP_>0&)a{b}@24))d~+6KM#!CqiR^^7kLuoH>!!N%0;I+XglmOb z8v?YkJ?GDI^|a|3)wJOJ+2?Ac`XI`2@Mr9XFbu3uoZ~1vzu_yQmI;e9NSC2cQ{Q$6 z4UB6fh%D@Z0mo$`I*Gh9m7U=6Vsre}o_UuTuh@@?J@aGa+4o{d>_kwjbO8(R1Cza< zfDD$+l57XFjN{|e&-2}hCb8=XvOo(yq5W_z8~m| zV~A%3-Nq08<2^QjlV8=lp5z{)EP}BiTo0lC4rv_il)K(~I+xhrprBej;tQnV0gMw? z6Tw4+1Nk%bt{e=#Wg75faO`R1M=9FLcQG;;gN6tY(w8n&k%qfX+(O%S?>`V5dxXH)DbRgVWogpTR$IQ6cd=o3G9`nKX$g@X_Zz6 z0sB9}4vZpMTow`>6CTT>bsARbR4w5q8&9E@a5aeYFL zUu=J`lKNf8V_7V}aXT*KRw1G&AkEs71FVN)7h&!K9Yoy@&DnMExdZ2|jyvZ$U6QK- zt#O%K%?*T{OC}l9fAU0l_Uyk4bb%T-1(^{jIS_SGk`d$2iV%J8TCY7ke)aHCkHCQb>+ z*Qt1;#=R+po!lfggkgUl$0D6NvRMDH=CQLT+M7s7As|^c=3F@5EGD#Zg4vNB5fjz> zFI=_!A%Qys3Xy+J!?w3=_5iv6<4HSnASvr14oVO)TWP!C6{+qT*LBYBE%(@0*JWs* z9MEXb4i}3uHR`kRH~qN-@aIM{f!8v`C@bGB$E)7Pmt*m6Z8DkP2*VwiyFszJ_KJJccRGuKR^>rk&(S zgMhwnq6|`$Vw-Dlf^y8_^9Bk{GQr?ssz9vv=L~4>pZQ%QXPqMxSOOmKRnaH?_zhu> zw$c!i>7rpD9*PKY&kdO9-0@)OwgicZR$Wj)t4;zT9li%OunOdIaSv@Z1 zwS8r4-9a*Dd}Y1iQJU*IP&NLNJ+-_hsPbU>?k(+=Q_Iyrg9Rq?K9f06a93BC*|!ZcM2&tz-_q>T4XPN zFQ9Me6ZTKeGY)bzbLQN}J#TU=qz*)|D+jBzgwAOD;STQ8OLl^h0R_=P`3+ecgFVXs z{T+Z~{7u+ONGq>Qb9&k!v549rywjj|{N)vlxz3TiUst8iQzsv1Xk(tnyfAF(mePd; zmB(NF&2t%s$JL-C?nYbA;?7bCI_V{ZixFN!_y)oOgnvQEBm5kpe1G=iHxY&+{1IUc z!hVE_2yY>L2;n`1k0QK}Fc;wvu_bTjqu+H=OX+C;XH)W z1KE#T5QZTvK==T{g$R=nK7;UKgwG<(LiilQ9E5*FI2+-g5EdXTLO=e5a53JOAS^^k z=*2FcO`ueIoFh=M07slj_4VChl(|L`*n88@7@=Lb9ge<xy+=1rg+Q^`zn9-4VP{cZjR&BXW6ZM5O9e6x7wu+{kUyk%{k zX73ruf6;aQ%&5Upn!oU=PcZA4*m@VA9Ck$zRk5ArElLyU^-TN?cwTH%&J1H7Zx){= z8x@!ts)hG+qeYr>9@0Ah&5Tcm4EPQDB3=Jq!*;t*@s^ZngUTDq^mY8~c;*FWN~5U$ z6*#db*-!A6g+?KA4WAl z`9ajjJYT;QQOTrLwoiG>cTz?-yeUGRR-RdoIyWKmkAXz@dWg#QToGf}8`HjkX^m`_l#X}CX!(Vuh@shPp|c@HA?JYsV& z3+Ryc5N|p6F!LZ{4H)N(qnYc7d^8Yg`zPk-At7>VAo3SPW&|RAZM-Eb^~!sWL8ayo zJYXOsF1UUo;;sqZIe_s`Ap@mJ=b5LN__$bPoe;?C{|N2X36ZIMoG`IupzC$R-T9EW zY)KLZIY}7gxGBiX4tHlCZ#kYQL}~(&WMbooXW)I_au43VmD%MV7Bp=W#P;O<{z5t zLztQCuz2rT{NvQJ`fmd@`|6QDRDdY|5P_(;U(h&x{pCQk|L@2@ig^GlBmN7gqE5%1kvL7R)@DW3?bGmbo%{rds{!QhpE$ql*nhVptiaET z-(&c_@UDQbsS8)9mf{>;0_7YaNq>xF=t4`S$5>vd_2g@Y3Z!$)o-0z#zBg!DHl_K2 zS3l%|_$^K8jt1_qs@q|jFHUFBx}zPqNOmV^em+ewT8TbkIu>)M{I`UQM{9bJQ1jzy z)6wB1Gdf@f=>xTwl^`wdxiTe5ZYBq>YBiGvqfk;!`)L!c`8rUjF>&T_S_y>zJ2e!1 zGr)*=YD+zM_1YH$XMIOhSev-vsH2PEWEn@P8x-~Rc{-wdKxb9kQhlf zuR&7PTq&yCPMX*?(uXJeqQbh4HW*3Uz5?T~U#ccIyLuWV@ZM(LUwlXN?Ws!Kv5B~2 zbZ-;yxu-7t2L8|jEwbGqx&ndwI+?>eV%!OQKZzZ?PZO@g8L?Y&A9gpP5d{BQJJ~S| z3*@gjd9+(`YYO`|OUMx>K`z#V%b*D2vQ-mK!<&mcD5|ofxQB-F@XrD2?It ztU%_)BboDtn{k{CqyNv``2yJ{g5ttxJJ(K>=yaKw=} zNS`NEXUK?r=4yRHD&Pb2Ohito_}g1K!kz$xmUA9;W2gG_^t=Bz~8O=vjT2NF+{yRT4|l*lIB8C*?=-wY#ZJ3929M=qGOiP35 zt~|F+ye~O%cBb1TnSIS|lBUA@s*JchkTYl9CIxZE8bpc=s?8WK7Jb!RJLM!yUA^KK zC?AveYqUqiSY3{nPGJRL(At!7P1yYG9o5?R`CP1I3gl$6l(2$)hr~PepCUC@B-t|^ zr%yQ*ZpGjBL4$LF+w`~pSNlID@zGCoFJ&^_1%iGHfui`EI_!`4z!PgH>ⅈ|NWGA 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 {H$x`i1>4C|xc9;gM>?Mem8sjiOc_#NG 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 A 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 U+*5G%bg94b#o*4KXK(fY353MkEdT%j literal 0 HcmV?d00001 From 54fc04409ad6914b9db9010dc5fb9f45922f80f6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 26 Apr 2022 16:41:35 +0200 Subject: [PATCH 076/376] safemode refactor --- boards/esp32_4M_2APP.json | 2 +- pio-tools/copy_safemode.py | 22 ++++++++++++++++++ platformio_tasmota32.ini | 1 + .../tasmota32-minicustom.bin | Bin 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 pio-tools/copy_safemode.py rename {safemode.bin => safemode}/tasmota32-minicustom.bin (100%) diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json index e9dc5635c..e95eb07fd 100644 --- a/boards/esp32_4M_2APP.json +++ b/boards/esp32_4M_2APP.json @@ -31,7 +31,7 @@ "flash_extra_images": [ [ "0x2E0000", - "tasmota32-minicustom.bin" + "variants/tasmota/tasmota32-minicustom.bin" ] ] }, diff --git a/pio-tools/copy_safemode.py b/pio-tools/copy_safemode.py new file mode 100644 index 000000000..1818eb028 --- /dev/null +++ b/pio-tools/copy_safemode.py @@ -0,0 +1,22 @@ +import os +import shutil +from os.path import join +from SCons.Script import DefaultEnvironment + +env = DefaultEnvironment() +platform = env.PioPlatform() + +FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") + +safemode_dir = join(env["PROJECT_DIR"], "safemode") +variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") + +if env["PIOPLATFORM"] == "espressif32": + if os.path.exists(safemode_dir): +# print("safemode.bin dir exists") + if os.path.exists(variants_dir): + print("") # dummy print +# print("variants/tasmota exists") +# os.remove(variants_dir) # todo PermissionError: [Errno 1] Operation not permitted: + else: + shutil.copytree(safemode_dir, variants_dir) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 8c604f663..38f17ebd3 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -34,6 +34,7 @@ build_flags = ${esp_defaults.build_flags} -Wl,--wrap=panicHandler -Wl,--wrap=xt_unhandled_exception -Wl,--wrap=_Z11analogWritehi ; `analogWrite(unsigned char, int)` use the Tasmota version of analogWrite for deeper integration and phase control extra_scripts = pre:pio-tools/add_c_flags.py + pre:pio-tools/copy_safemode.py post:pio-tools/post_esp32.py ${esp_defaults.extra_scripts} diff --git a/safemode.bin/tasmota32-minicustom.bin b/safemode/tasmota32-minicustom.bin similarity index 100% rename from safemode.bin/tasmota32-minicustom.bin rename to safemode/tasmota32-minicustom.bin From 2b835b1bc9acdf820b24141207e6373b8dd7a42c Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:18:14 +0200 Subject: [PATCH 077/376] adds option for flashing of extra *.bin files --- platformio_override_sample.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 35e0708e4..629f03e67 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -91,7 +91,7 @@ lib_extra_dirs = ${library.lib_extra_dirs} [env:tasmota32_base] ; *** Uncomment next lines ";" to enable development Tasmota Arduino version ESP32 ;platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip -;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/822/framework-arduinoespressif32-v4.4_work-c4b83228a5.tar.gz +;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/825/framework-arduinoespressif32-v4.4_work-c4b83228a5.tar.gz build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 570492c1fe2329a190898a3c67cb8f4f96852310 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 26 Apr 2022 17:19:16 +0200 Subject: [PATCH 078/376] 2880k for firmware --- boards/esp32_4M_2APP.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json index e95eb07fd..34e8248e6 100644 --- a/boards/esp32_4M_2APP.json +++ b/boards/esp32_4M_2APP.json @@ -25,7 +25,7 @@ "arduino", "espidf" ], - "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS", "upload": { "arduino": { "flash_extra_images": [ From dfa104383ed8ba6aa748f95b4f9c5b08f2063248 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 26 Apr 2022 18:07:37 +0200 Subject: [PATCH 079/376] use always actual safemode bins --- pio-tools/copy_safemode.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pio-tools/copy_safemode.py b/pio-tools/copy_safemode.py index 1818eb028..ea676af9f 100644 --- a/pio-tools/copy_safemode.py +++ b/pio-tools/copy_safemode.py @@ -15,8 +15,6 @@ if env["PIOPLATFORM"] == "espressif32": if os.path.exists(safemode_dir): # print("safemode.bin dir exists") if os.path.exists(variants_dir): - print("") # dummy print # print("variants/tasmota exists") -# os.remove(variants_dir) # todo PermissionError: [Errno 1] Operation not permitted: - else: - shutil.copytree(safemode_dir, variants_dir) + shutil.rmtree(variants_dir) + shutil.copytree(safemode_dir, variants_dir) From be180c2da557c537cf5aeb995f510d1fdb66c754 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 26 Apr 2022 19:43:58 +0200 Subject: [PATCH 080/376] Berry simplify drivers --- ...5StackCore2.be => AXP192_M5Stack_Core2.be} | 5 +- ...5StackTough.be => AXP192_M5Stack_Tough.be} | 5 +- ..._axp192_M5StickC.be => AXP192_M5StickC.be} | 5 +- ...20V3.be => AXP202_LilyGo_TWatch_2020V3.be} | 5 +- tasmota/berry/drivers/CHSC6540.be | 78 +++++++++++++++++++ .../drivers/{mpu_accel.be => MPU6886_9250.be} | 7 +- tasmota/berry/drivers/Shift595.be | 2 +- tasmota/berry/drivers/lv_touch_3_buttons.be | 9 ++- 8 files changed, 103 insertions(+), 13 deletions(-) rename tasmota/berry/drivers/{i2c_axp192_M5StackCore2.be => AXP192_M5Stack_Core2.be} (98%) rename tasmota/berry/drivers/{i2c_axp192_M5StackTough.be => AXP192_M5Stack_Tough.be} (98%) rename tasmota/berry/drivers/{i2c_axp192_M5StickC.be => AXP192_M5StickC.be} (98%) rename tasmota/berry/drivers/{i2c_axp202_LilyGO_TWatch_2020V3.be => AXP202_LilyGo_TWatch_2020V3.be} (96%) create mode 100644 tasmota/berry/drivers/CHSC6540.be rename tasmota/berry/drivers/{mpu_accel.be => MPU6886_9250.be} (98%) diff --git a/tasmota/berry/drivers/i2c_axp192_M5StackCore2.be b/tasmota/berry/drivers/AXP192_M5Stack_Core2.be similarity index 98% rename from tasmota/berry/drivers/i2c_axp192_M5StackCore2.be rename to tasmota/berry/drivers/AXP192_M5Stack_Core2.be index 212fc8e32..309006987 100644 --- a/tasmota/berry/drivers/i2c_axp192_M5StackCore2.be +++ b/tasmota/berry/drivers/AXP192_M5Stack_Core2.be @@ -73,6 +73,8 @@ class AXP192_M5Stack_Core2 : AXP192 # bus power mode_output self.set_buf_power_mode(false) + + tasmota.add_driver(self) end end @@ -132,5 +134,4 @@ class AXP192_M5Stack_Core2 : AXP192 end -axp = AXP192_M5Stack_Core2() -tasmota.add_driver(axp) +return AXP192_M5Stack_Core2() diff --git a/tasmota/berry/drivers/i2c_axp192_M5StackTough.be b/tasmota/berry/drivers/AXP192_M5Stack_Tough.be similarity index 98% rename from tasmota/berry/drivers/i2c_axp192_M5StackTough.be rename to tasmota/berry/drivers/AXP192_M5Stack_Tough.be index cace43a89..5444b9eda 100644 --- a/tasmota/berry/drivers/i2c_axp192_M5StackTough.be +++ b/tasmota/berry/drivers/AXP192_M5Stack_Tough.be @@ -88,6 +88,8 @@ class AXP192_M5Stack_Tough : AXP192 else self.set_buf_power_mode(false) end + + tasmota.add_driver(self) end end @@ -147,5 +149,4 @@ class AXP192_M5Stack_Tough : AXP192 end -axp = AXP192_M5Stack_Tough() -tasmota.add_driver(axp) +return AXP192_M5Stack_Tough() diff --git a/tasmota/berry/drivers/i2c_axp192_M5StickC.be b/tasmota/berry/drivers/AXP192_M5StickC.be similarity index 98% rename from tasmota/berry/drivers/i2c_axp192_M5StickC.be rename to tasmota/berry/drivers/AXP192_M5StickC.be index 1d243feb6..f5c2856df 100644 --- a/tasmota/berry/drivers/i2c_axp192_M5StickC.be +++ b/tasmota/berry/drivers/AXP192_M5StickC.be @@ -67,6 +67,8 @@ class AXP192_M5StickC : AXP192 # Bit 1: APS voltage ADC enable # Bit 0: TS pin ADC function enable self.write8(0x82, 0xFF) + + tasmota.add_driver(self) end end @@ -103,5 +105,4 @@ class AXP192_M5StickC : AXP192 end end -axp = AXP192_M5StickC() -tasmota.add_driver(axp) +return AXP192_M5StickC() diff --git a/tasmota/berry/drivers/i2c_axp202_LilyGO_TWatch_2020V3.be b/tasmota/berry/drivers/AXP202_LilyGo_TWatch_2020V3.be similarity index 96% rename from tasmota/berry/drivers/i2c_axp202_LilyGO_TWatch_2020V3.be rename to tasmota/berry/drivers/AXP202_LilyGo_TWatch_2020V3.be index 63fecc51e..2d853f428 100644 --- a/tasmota/berry/drivers/i2c_axp202_LilyGO_TWatch_2020V3.be +++ b/tasmota/berry/drivers/AXP202_LilyGo_TWatch_2020V3.be @@ -40,6 +40,8 @@ class AXP202_LilyGo_TWatch_2020V3 : AXP202 # // No use # power->setPowerOutPut(AXP202_LDO3, false); self.set_ldo_enable(3, false) + + tasmota.add_driver(self) end end @@ -66,5 +68,4 @@ class AXP202_LilyGo_TWatch_2020V3 : AXP202 end end -axp202 = AXP202_LilyGo_TWatch_2020V3() -tasmota.add_driver(axp202) +return AXP202_LilyGo_TWatch_2020V3() diff --git a/tasmota/berry/drivers/CHSC6540.be b/tasmota/berry/drivers/CHSC6540.be new file mode 100644 index 000000000..7fd1cf785 --- /dev/null +++ b/tasmota/berry/drivers/CHSC6540.be @@ -0,0 +1,78 @@ +#- + - I2C driver for the Touch Screen driver CHSC6540 of the M5Stack Tough + - + - This is based on + - https://github.com/m5stack/M5Tough/blob/master/src/M5Touch.cpp + - https://github.com/m5stack/M5Tough/blob/master/src/M5Touch.h + -# + + class CHSC6540 : I2C_Driver + var tp_int # gpio used as INT - going low when the screen is touched + # prevous values + var touched, x, y # previous values (bool, int, int) to be repeated when not touched + + def init() + # set current values + self.x = 0 + self.y = 0 + self.touched = false + + self.tp_int = gpio.pin(gpio.INTERRUPT, 0) + super(self).init("CHSC6540", 0x2E) + + tasmota.add_driver(self) + # check that display is present + import introspect + if !introspect.module("display") + tasmota.log("I2C: can't start CHSC6540 without display enabled", 3) + self.wire = nil + end + + if self.tp_int < 0 + tasmota.log("I2C: can't start CHSC6540 without INTERRUPT-1 gpio configured", 3) + self.wire = nil + else + gpio.pin_mode(self.tp_int, gpio.INPUT_PULLUP) + end + + # all good, configure device + if self.wire + self.write8(0x5A, 0x5A) # INT mode change + + tasmota.add_driver(self) + end + end + + # is the screen pressed - i.e. TP_INT is low + def is_pressed() + if self.wire == nil return end + return gpio.digital_read(self.tp_int) == 0 + end + + def every_50ms() + if self.wire == nil return end + + self.touched = self.is_pressed() + # tasmota.log("DEBUG> int="+str(self.tp_int)+" touched="+str(self.touched), 2) + if self.touched + import string + var raw_read = self.wire.read_bytes(self.addr, 0x02, 11) # read a series of 11 bytes at from register 0x02 + var pts = raw_read[0] + if pts <= 0 || pts > 2 return end # wrong + # supports multi-touch + #var p0f = (raw_read[4] & 0x10) != 0 # unused for now + self.x = raw_read.get(1,-2) & 0x0FFF + self.y = raw_read.get(3,-2) & 0x0FFF + # tasmota.log(string.format("I2C: screen pressed x=%i y=%i", self.x, self.y), 2) + # var p1x = raw_read.get(7,2) & 0x0FFF + # var p1y = raw_read.get(9,2) & 0x0FFF + end + + # return values + import display + display.touch_update(self.touched ? 1 : 0, self.x, self.y, 0) + end + +end + +return CHSC6540() diff --git a/tasmota/berry/drivers/mpu_accel.be b/tasmota/berry/drivers/MPU6886_9250.be similarity index 98% rename from tasmota/berry/drivers/mpu_accel.be rename to tasmota/berry/drivers/MPU6886_9250.be index 7c2c1353a..9e5cb400c 100644 --- a/tasmota/berry/drivers/mpu_accel.be +++ b/tasmota/berry/drivers/MPU6886_9250.be @@ -5,7 +5,7 @@ - Alternative to xsns_85_mpu6886.ino -# -class MPU6886 : I2C_Driver +class MPU6886_9250 : I2C_Driver var device var gres, ares var accel, gyro @@ -49,6 +49,8 @@ class MPU6886 : I2C_Driver self.gres = 2000.0/32768.0 self.ares = 8.0/32678.0 + + tasmota.add_driver(self) end end @@ -133,5 +135,4 @@ class MPU6886 : I2C_Driver end -mpu_accel = MPU6886() -tasmota.add_driver(mpu_accel) +return MPU6886_9250() diff --git a/tasmota/berry/drivers/Shift595.be b/tasmota/berry/drivers/Shift595.be index 3e22f9b33..55082165d 100644 --- a/tasmota/berry/drivers/Shift595.be +++ b/tasmota/berry/drivers/Shift595.be @@ -77,4 +77,4 @@ class Shift595 end -return Shift595 # allow using 'import' instead of 'load()' +return Shift595() # allow using 'import' instead of 'load()' diff --git a/tasmota/berry/drivers/lv_touch_3_buttons.be b/tasmota/berry/drivers/lv_touch_3_buttons.be index f2adf5cdc..c33ed0aff 100644 --- a/tasmota/berry/drivers/lv_touch_3_buttons.be +++ b/tasmota/berry/drivers/lv_touch_3_buttons.be @@ -24,6 +24,10 @@ class lv_touch_3_buttons # Pre-condition: # LVGL must be already started def init(btn1, btn2, btn3, active_low) + import global + if !global.contains("lv") return end # abort if LVGL is not there + lv.start() # make sure LVGL is started, or things can go really wrong + # set current values self.x = 0 self.y = 0 @@ -44,6 +48,9 @@ class lv_touch_3_buttons var vres = lv.get_ver_res() # should be 240 self.x_coords = [ hres / 6, hres / 2, hres * 5 / 6] self.y_coords = [ vres - 10, vres - 10, vres - 10] + + # add self to drivers + tasmota.add_driver(self) end # scan every 50ms @@ -78,7 +85,7 @@ class lv_touch_3_buttons end end -return lv_touch_3_buttons +return lv_touch_3_buttons(gpio.pin(gpio.INPUT, 0), gpio.pin(gpio.INPUT, 1), gpio.pin(gpio.INPUT, 2), true) #- lv_btn3 = lv_touch_3_buttons(gpio.pin(gpio.INPUT, 0), gpio.pin(gpio.INPUT, 1), gpio.pin(gpio.INPUT, 2), lv_touch_3_buttons.ACTIVE_LOW) From 55d66c96d363994c2e310a1e5d7dc7cb499114ac Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 26 Apr 2022 22:28:41 +0200 Subject: [PATCH 081/376] Berry fix assertion violation when loading bytecode --- lib/libesp32/berry/src/be_bytecode.c | 6 +++--- lib/libesp32/berry/src/be_var.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/libesp32/berry/src/be_bytecode.c b/lib/libesp32/berry/src/be_bytecode.c index 90ff79c6f..8cea36022 100644 --- a/lib/libesp32/berry/src/be_bytecode.c +++ b/lib/libesp32/berry/src/be_bytecode.c @@ -492,7 +492,7 @@ static void load_constant(bvm *vm, void *fp, bproto *proto, int version) } } -static void load_proto_table(bvm *vm, void *fp, bproto *proto, int version) +static void load_proto_table(bvm *vm, void *fp, bproto *proto, int info, int version) { int size = (int)load_long(fp); /* proto count */ if (size) { @@ -501,7 +501,7 @@ static void load_proto_table(bvm *vm, void *fp, bproto *proto, int version) proto->ptab = p; proto->nproto = size; while (size--) { - load_proto(vm, fp, p++, -1, version); + load_proto(vm, fp, p++, info, version); } } } @@ -538,7 +538,7 @@ static bbool load_proto(bvm *vm, void *fp, bproto **proto, int info, int version } load_bytecode(vm, fp, *proto, info); load_constant(vm, fp, *proto, version); - load_proto_table(vm, fp, *proto, version); + load_proto_table(vm, fp, *proto, info, version); load_upvals(vm, fp, *proto); return btrue; } diff --git a/lib/libesp32/berry/src/be_var.c b/lib/libesp32/berry/src/be_var.c index 9960e7cc3..1a8e5b18c 100644 --- a/lib/libesp32/berry/src/be_var.c +++ b/lib/libesp32/berry/src/be_var.c @@ -12,6 +12,7 @@ #include "be_map.h" #include "be_gc.h" #include "be_class.h" +#include #define global(vm) ((vm)->gbldesc.global) #define builtin(vm) ((vm)->gbldesc.builtin) From 8547cdaa0de17a2d774d2a6fb8a6af0624db2b9f Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 26 Apr 2022 23:01:10 +0200 Subject: [PATCH 082/376] Berry fix pointer warning --- lib/libesp32/berry/src/be_bytecode.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/libesp32/berry/src/be_bytecode.c b/lib/libesp32/berry/src/be_bytecode.c index 8cea36022..14599441d 100644 --- a/lib/libesp32/berry/src/be_bytecode.c +++ b/lib/libesp32/berry/src/be_bytecode.c @@ -214,8 +214,10 @@ static void save_proto_table(bvm *vm, void *fp, bproto *proto) { bproto **p = proto->ptab, **end; save_long(fp, proto->nproto); /* proto count */ - for (end = p + proto->nproto; p < end; ++p) { - save_proto(vm, fp, *p); + if (p) { + for (end = p + proto->nproto; p < end; ++p) { + save_proto(vm, fp, *p); + } } } @@ -223,9 +225,11 @@ static void save_upvals(void *fp, bproto *proto) { bupvaldesc *uv = proto->upvals, *end; save_byte(fp, proto->nupvals); /* upvals count */ - for (end = uv + proto->nupvals; uv < end; ++uv) { - save_byte(fp, uv->instack); - save_byte(fp, uv->idx); + if (uv) { + for (end = uv + proto->nupvals; uv < end; ++uv) { + save_byte(fp, uv->instack); + save_byte(fp, uv->idx); + } } } From c8e6e451046b70f40fbf310dd8f97ff403789348 Mon Sep 17 00:00:00 2001 From: Philipp Richter Date: Wed, 27 Apr 2022 00:25:26 +0200 Subject: [PATCH 083/376] Support all features of OV2640 Webcam * AWB, AEC, AGC, Gamma Correct, Lens Correct * WPC, BPX, DCW, Colorbar * Support Bonus Features: Streamspeed, Nightmode * Command to Set Defaults * Command to Show Stats * Display FPS in Webgui --- tasmota/settings.h | 44 ++- tasmota/xdrv_81_esp32_webcam.ino | 471 +++++++++++++++++++++++++++++-- 2 files changed, 485 insertions(+), 30 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index f8b961527..539fc4a08 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -309,21 +309,21 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t mirror : 1; uint32_t flip : 1; uint32_t rtsp : 1; - uint32_t spare4 : 1; - uint32_t spare5 : 1; - uint32_t spare6 : 1; - uint32_t spare7 : 1; - uint32_t spare8 : 1; - uint32_t spare9 : 1; - uint32_t spare10 : 1; - uint32_t spare11 : 1; - uint32_t spare12 : 1; - uint32_t spare13 : 1; - uint32_t spare14 : 1; + uint32_t awb : 1; + uint32_t awb_gain : 1; + uint32_t aec : 1; + uint32_t aec2 : 1; + uint32_t agc : 1; + uint32_t raw_gma : 1; + uint32_t lenc : 1; + uint32_t colorbar : 1; + uint32_t wpc : 1; + uint32_t dcw : 1; + uint32_t bpc : 1; uint32_t spare15 : 1; uint32_t spare16 : 1; - uint32_t spare17 : 1; - uint32_t spare18 : 1; + uint32_t streamspeed : 1; + uint32_t nightmode : 1; uint32_t contrast : 3; uint32_t brightness : 3; uint32_t saturation : 3; @@ -331,6 +331,22 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu }; } WebCamCfg; +typedef union { + uint32_t data; + struct { + uint32_t wb_mode : 3; + uint32_t ae_level : 3; + uint32_t aec_value : 11; + uint32_t gainceiling : 3; + uint32_t agc_gain: 5; + uint32_t special_effect : 3; + uint32_t spare28 : 1; + uint32_t spare29 : 1; + uint32_t spare30 : 1; + uint32_t upgraded : 1; + }; +} WebCamCfg2; + typedef union { uint16_t data; struct { @@ -572,7 +588,7 @@ typedef struct { uint8_t eth_type; // 446 uint8_t eth_clk_mode; // 447 - uint8_t free_esp32_448[4]; // 448 + WebCamCfg2 webcam_config2; // 448 #ifdef CONFIG_IDF_TARGET_ESP32S2 uint8_t free_esp32s2_456[2]; // 456 - fix 32-bit offset for WebCamCfg #endif diff --git a/tasmota/xdrv_81_esp32_webcam.ino b/tasmota/xdrv_81_esp32_webcam.ino index d16ff04e0..30d125e35 100644 --- a/tasmota/xdrv_81_esp32_webcam.ino +++ b/tasmota/xdrv_81_esp32_webcam.ino @@ -163,6 +163,15 @@ struct { #endif // ENABLE_RTSPSERVER } Wc; +struct { + uint32_t camcnt = 0; + uint32_t camfps = 0; + uint32_t camfail = 0; + uint32_t jpegfail = 0; + uint32_t clientfail = 0; + char name[7] = "Webcam"; +} WcStats; + /*********************************************************************************************/ void WcInterrupt(uint32_t state) { @@ -198,6 +207,116 @@ bool WcPinUsed(void) { return pin_used; } +void WcStreamSpeed(int32_t value) { + sensor_t *wc_s = esp_camera_sensor_get(); + if (!wc_s) { return; } + + if (value) { + // CLKRC: Set Clock Divider to fullspeed + wc_s->set_reg(wc_s, 0x111, 0x3f, 0x00); + } else { + // CLKRC: Set Clock Divider to 2 + wc_s->set_reg(wc_s, 0x111, 0x3f, 0x02); + } + + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Streamspeed: %d"), value); +} + +void WcNightMode(int32_t value) { + sensor_t *wc_s = esp_camera_sensor_get(); + if (!wc_s) { return; } + + if (value) { + wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg + wc_s->set_reg(wc_s, 0x103, 0xff, 0xcf); // COM1: Allow 7 dummy frames + } else { + wc_s->set_reg(wc_s, 0x103, 0xff, 0x0a); // COM1: Reset dummy frames + wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg + wc_s->set_reg(wc_s, 0x10f, 0xff, 0x4b); // Reserved Reg + vTaskDelay(1000 / portTICK_PERIOD_MS); + wc_s->set_reg(wc_s, 0x10f, 0xff, 0x43); // Reserved Reg + } + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Nightmode: %d"), value); +} + +void WcApplySettings() { + sensor_t * wc_s = esp_camera_sensor_get(); + if (!wc_s) { return; } + + wc_s->set_vflip(wc_s, Settings->webcam_config.flip); + wc_s->set_hmirror(wc_s, Settings->webcam_config.mirror); + + wc_s->set_brightness(wc_s, Settings->webcam_config.brightness - 2); + wc_s->set_saturation(wc_s, Settings->webcam_config.saturation - 2); + wc_s->set_contrast(wc_s, Settings->webcam_config.contrast - 2); + + wc_s->set_special_effect(wc_s, Settings->webcam_config2.special_effect); + + wc_s->set_whitebal(wc_s, Settings->webcam_config.awb); + wc_s->set_wb_mode(wc_s, Settings->webcam_config2.wb_mode); + wc_s->set_awb_gain(wc_s, Settings->webcam_config.awb_gain); + + wc_s->set_exposure_ctrl(wc_s, Settings->webcam_config.aec); + wc_s->set_aec_value(wc_s, Settings->webcam_config2.aec_value - 2); + wc_s->set_ae_level(wc_s, Settings->webcam_config2.ae_level); + wc_s->set_aec2(wc_s, Settings->webcam_config.aec2); + + wc_s->set_gain_ctrl(wc_s, Settings->webcam_config.agc); + wc_s->set_agc_gain(wc_s, Settings->webcam_config2.agc_gain); + wc_s->set_gainceiling(wc_s, (gainceiling_t)Settings->webcam_config2.gainceiling); + + wc_s->set_raw_gma(wc_s, Settings->webcam_config.raw_gma); + wc_s->set_lenc(wc_s, Settings->webcam_config.lenc); + wc_s->set_wpc(wc_s, Settings->webcam_config.wpc); + wc_s->set_dcw(wc_s, Settings->webcam_config.dcw); + wc_s->set_bpc(wc_s, Settings->webcam_config.bpc); + + WcStreamSpeed(Settings->webcam_config.streamspeed); + WcNightMode(Settings->webcam_config.nightmode); + + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Settings updated")); +} + +void WcSetDefaults(uint32_t upgrade) { + if (!upgrade) { + Settings->webcam_config.flip = 0; + Settings->webcam_config.mirror = 0; + + Settings->webcam_config.saturation = 2; // = 0 + Settings->webcam_config.brightness = 2; // = 0 + Settings->webcam_config.contrast = 2; // = 0 + } + + Settings->webcam_config2.special_effect = 0; + Settings->webcam_config.colorbar = 0; + + Settings->webcam_config.awb = 1; // white balance + Settings->webcam_config2.wb_mode = 0; // white balance mode + Settings->webcam_config.awb_gain = 1; // white blance gain + + Settings->webcam_config.aec = 1; + Settings->webcam_config.aec2 = 1; + Settings->webcam_config2.ae_level = 2; // = 0 + Settings->webcam_config2.aec_value = 204; + + Settings->webcam_config.agc = 1; + Settings->webcam_config2.agc_gain = 5; + Settings->webcam_config2.gainceiling = 0; + + Settings->webcam_config.raw_gma = 1; + Settings->webcam_config.lenc = 1; // lens correction + Settings->webcam_config.wpc = 1; // white pixel correct + Settings->webcam_config.dcw = 1; // downsize en + Settings->webcam_config.bpc = 0; // black pixel correct? + + Settings->webcam_config.streamspeed = 1; + Settings->webcam_config.nightmode = 0; + + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Defaults set")); + + if (Wc.up) { WcApplySettings(); } +} + uint32_t WcSetup(int32_t fsiz) { if (fsiz >= FRAMESIZE_FHD) { fsiz = FRAMESIZE_FHD - 1; } @@ -308,13 +427,6 @@ uint32_t WcSetup(int32_t fsiz) { // AddLog(LOG_LEVEL_INFO, PSTR("CAM: heap check 2: %d"),ESP_getFreeHeap()); sensor_t * wc_s = esp_camera_sensor_get(); - - wc_s->set_vflip(wc_s, Settings->webcam_config.flip); - wc_s->set_hmirror(wc_s, Settings->webcam_config.mirror); - wc_s->set_brightness(wc_s, Settings->webcam_config.brightness -2); // up the brightness just a bit - wc_s->set_saturation(wc_s, Settings->webcam_config.saturation -2); // lower the saturation - wc_s->set_contrast(wc_s, Settings->webcam_config.contrast -2); // keep contrast - // drop down frame size for higher initial frame rate wc_s->set_framesize(wc_s, (framesize_t)fsiz); @@ -327,6 +439,8 @@ uint32_t WcSetup(int32_t fsiz) { Wc.height = wc_fb->height; esp_camera_fb_return(wc_fb); + WcApplySettings(); + #ifdef USE_FACE_DETECT fd_init(); #endif @@ -375,6 +489,77 @@ int32_t WcSetOptions(uint32_t sel, int32_t value) { if (value >= -4) { s->set_saturation(s,value); } res = s->status.saturation; break; + case 7: + if (value >= 0) { s->set_whitebal(s, value); } + res = s->status.awb; + break; + case 8: + if (value >= 0) { s->set_wb_mode(s, value); } + res = s->status.wb_mode; + break; + case 9: + if (value >= 0) { s->set_awb_gain(s, value); } + res = s->status.awb_gain; + break; + case 10: + if (value >= 0) { s->set_exposure_ctrl(s, value); } + res = s->status.aec; + break; + case 11: + if (value >= 0) { s->set_aec_value(s, value); } + res = s->status.aec_value; + break; + case 12: + if (value >= 0) { s->set_ae_level(s, value); } + res = s->status.ae_level; + break; + case 13: + if (value >= 0) { s->set_aec2(s, value); } + res = s->status.aec2; + break; + case 14: + if (value >= 0) { s->set_gain_ctrl(s, value); } + res = s->status.agc; + break; + case 15: + if (value >= 0) { s->set_agc_gain(s, value); } + res = s->status.agc_gain; + break; + case 16: + if (value >= 0) { s->set_gainceiling(s, (gainceiling_t)value); } + res = s->status.gainceiling; + break; + case 17: + if (value >= 0) { s->set_raw_gma(s, value); } + res = s->status.raw_gma; + break; + case 18: + if (value >= 0) { s->set_lenc(s, value); } + res = s->status.lenc; + break; + case 19: + if (value >= 0) { s->set_wpc(s, value); } + res = s->status.wpc; + break; + case 20: + if (value >= 0) { s->set_dcw(s, value); } + res = s->status.dcw; + break; + case 21: + // blackpixelcontrol + if (value >= 0) { s->set_bpc(s, value); } + res = s->status.bpc; + break; + case 22: + if (value >= 0) { s->set_colorbar(s, value); } + res = s->status.colorbar; + break; + case 23: + if (value >= 0) { WcStreamSpeed(value); } + break; + case 24: + if (value >= 0) { WcNightMode(value); } + break; } return res; @@ -786,6 +971,7 @@ void HandleWebcamMjpegTask(void) { if (!Wc.client.connected()) { AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Client fail")); Wc.stream_active = 0; + WcStats.clientfail++; } if (1 == Wc.stream_active) { Wc.client.flush(); @@ -801,7 +987,9 @@ void HandleWebcamMjpegTask(void) { if (!wc_fb) { AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Frame fail")); Wc.stream_active = 0; + WcStats.camfail++; } + WcStats.camcnt++; } if (2 == Wc.stream_active) { if (wc_fb->format != PIXFORMAT_JPEG) { @@ -810,6 +998,7 @@ void HandleWebcamMjpegTask(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: JPEG compression failed")); _jpg_buf_len = wc_fb->len; _jpg_buf = wc_fb->buf; + WcStats.jpegfail++; } } else { _jpg_buf_len = wc_fb->len; @@ -973,11 +1162,14 @@ void WcInit(void) { if (!Settings->webcam_config.data) { Settings->webcam_config.stream = 1; Settings->webcam_config.resolution = FRAMESIZE_QVGA; - Settings->webcam_config.flip = 0; - Settings->webcam_config.mirror = 0; - Settings->webcam_config.saturation = 0; // -2 - Settings->webcam_config.brightness = 3; // 1 - Settings->webcam_config.contrast = 2; // 0 + WcSetDefaults(0); + } + // previous webcam driver had only a small subset of possible config vars + // in this case we have to only set the new variables to default values + if(!Settings->webcam_config2.upgraded) { + AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Upgrade settings")); + WcSetDefaults(1); + Settings->webcam_config2.upgraded = 1; } } @@ -993,12 +1185,49 @@ void WcInit(void) { #define D_CMND_WC_SATURATION "Saturation" #define D_CMND_WC_BRIGHTNESS "Brightness" #define D_CMND_WC_CONTRAST "Contrast" +#define D_CMND_WC_SPECIALEFFECT "SpecialEffect" + +#define D_CMND_WC_AWB "AWB" +#define D_CMND_WC_WB_MODE "WBMode" +#define D_CMND_WC_AWB_GAIN "AWBGain" + +#define D_CMND_WC_AEC "AEC" +#define D_CMND_WC_AEC_VALUE "AECValue" +#define D_CMND_WC_AE_LEVEL "AELevel" +#define D_CMND_WC_AEC2 "AECDSP" + +#define D_CMND_WC_AGC "AGC" +#define D_CMND_WC_AGC_GAIN "AGCGain" +#define D_CMND_WC_GAINCEILING "GainCeiling" + +#define D_CMND_WC_RAW_GMA "GammaCorrect" +#define D_CMND_WC_LENC "LensCorrect" + +#define D_CMND_WC_WPC "WPC" +#define D_CMND_WC_DCW "DCW" +#define D_CMND_WC_BPC "BPC" + +#define D_CMND_WC_COLORBAR "Colorbar" + +#define D_CMND_WC_STREAMSPEED "StreamSpeed" +#define D_CMND_WC_NIGHTMODE "Nightmode" + +#define D_CMND_WC_SETDEFAULTS "SetDefaults" +#define D_CMND_WC_APPLYSETTINGS "ApplySettings" +#define D_CMND_WC_STATS "Stats" + #define D_CMND_WC_INIT "Init" #define D_CMND_RTSP "Rtsp" const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix "|" D_CMND_WC_STREAM "|" D_CMND_WC_RESOLUTION "|" D_CMND_WC_MIRROR "|" D_CMND_WC_FLIP "|" - D_CMND_WC_SATURATION "|" D_CMND_WC_BRIGHTNESS "|" D_CMND_WC_CONTRAST "|" D_CMND_WC_INIT + D_CMND_WC_SATURATION "|" D_CMND_WC_BRIGHTNESS "|" D_CMND_WC_CONTRAST "|" D_CMND_WC_SPECIALEFFECT "|" + D_CMND_WC_AWB "|" D_CMND_WC_WB_MODE "|" D_CMND_WC_AWB_GAIN "|" D_CMND_WC_AEC "|" + D_CMND_WC_AEC_VALUE "|" D_CMND_WC_AE_LEVEL "|" D_CMND_WC_AEC2 "|" D_CMND_WC_AGC "|" + D_CMND_WC_AGC_GAIN "|" D_CMND_WC_GAINCEILING "|" D_CMND_WC_RAW_GMA "|" D_CMND_WC_LENC "|" + D_CMND_WC_WPC "|" D_CMND_WC_DCW "|" D_CMND_WC_BPC "|" D_CMND_WC_COLORBAR "|" + D_CMND_WC_STREAMSPEED "|" D_CMND_WC_NIGHTMODE "|" + D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_APPLYSETTINGS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT #ifdef ENABLE_RTSPSERVER "|" D_CMND_RTSP #endif // ENABLE_RTSPSERVER @@ -1006,7 +1235,12 @@ const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix void (* const WCCommand[])(void) PROGMEM = { &CmndWebcam, &CmndWebcamStream, &CmndWebcamResolution, &CmndWebcamMirror, &CmndWebcamFlip, - &CmndWebcamSaturation, &CmndWebcamBrightness, &CmndWebcamContrast, &CmndWebcamInit + &CmndWebcamSaturation, &CmndWebcamBrightness, &CmndWebcamContrast, &CmndWebcamSpecialEffect, + &CmndWebcamAWB, &CmndWebcamWBMode, &CmndWebcamAWBGain, &CmndWebcamAEC, &CmndWebcamAECValue, + &CmndWebcamAELevel, &CmndWebcamAEC2, &CmndWebcamAGC, &CmndWebcamAGCGain, &CmndWebcamGainCeiling, + &CmndWebcamGammaCorrect, &CmndWebcamLensCorrect, &CmndWebcamWPC, &CmndWebcamDCW, &CmndWebcamBPC, + &CmndWebcamColorbar, &CmndWebcamStreamspeed, &CmndWebcamNightmode, + &CmndWebcamSetDefaults, &CmndWebcamApplySettings, &CmndWebcamStats, &CmndWebcamInit #ifdef ENABLE_RTSPSERVER , &CmndWebRtsp #endif // ENABLE_RTSPSERVER @@ -1015,14 +1249,26 @@ void (* const WCCommand[])(void) PROGMEM = { void CmndWebcam(void) { Response_P(PSTR("{\"" D_PRFX_WEBCAM "\":{\"" D_CMND_WC_STREAM "\":%d,\"" D_CMND_WC_RESOLUTION "\":%d,\"" D_CMND_WC_MIRROR "\":%d,\"" D_CMND_WC_FLIP "\":%d,\"" - D_CMND_WC_SATURATION "\":%d,\"" D_CMND_WC_BRIGHTNESS "\":%d,\"" D_CMND_WC_CONTRAST "\":%d" + D_CMND_WC_SATURATION "\":%d,\"" D_CMND_WC_BRIGHTNESS "\":%d,\"" D_CMND_WC_CONTRAST "\":%d,\"" + D_CMND_WC_SPECIALEFFECT "\":%d,\"" D_CMND_WC_AWB "\":%d,\"" D_CMND_WC_WB_MODE "\":%d,\"" + D_CMND_WC_AWB_GAIN "\":%d,\"" D_CMND_WC_AEC "\":%d,\"" D_CMND_WC_AEC_VALUE "\":%d,\"" + D_CMND_WC_AE_LEVEL "\":%d,\"" D_CMND_WC_AEC2 "\":%d,\"" D_CMND_WC_AGC "\":%d,\"" + D_CMND_WC_AGC_GAIN "\":%d,\"" D_CMND_WC_GAINCEILING "\":%d,\"" D_CMND_WC_RAW_GMA "\":%d,\"" + D_CMND_WC_LENC "\":%d,\"" D_CMND_WC_WPC "\":%d,\"" D_CMND_WC_DCW "\":%d,\"" D_CMND_WC_BPC "\":%d,\"" + D_CMND_WC_COLORBAR "\":%d,\"" D_CMND_WC_STREAMSPEED "\":%d,\"" D_CMND_WC_NIGHTMODE "\":%d" #ifdef ENABLE_RTSPSERVER ",\"" D_CMND_RTSP "\":%d" #endif // ENABLE_RTSPSERVER "}}"), Settings->webcam_config.stream, Settings->webcam_config.resolution, Settings->webcam_config.mirror, Settings->webcam_config.flip, - Settings->webcam_config.saturation -2, Settings->webcam_config.brightness -2, Settings->webcam_config.contrast -2 + Settings->webcam_config.saturation -2, Settings->webcam_config.brightness -2, Settings->webcam_config.contrast -2, + Settings->webcam_config2.special_effect, Settings->webcam_config.awb, Settings->webcam_config2.wb_mode, + Settings->webcam_config.awb_gain, Settings->webcam_config.aec, Settings->webcam_config2.aec_value, + Settings->webcam_config2.ae_level -2, Settings->webcam_config.aec2, Settings->webcam_config.agc, + Settings->webcam_config2.agc_gain, Settings->webcam_config2.gainceiling, Settings->webcam_config.raw_gma, + Settings->webcam_config.lenc, Settings->webcam_config.wpc, Settings->webcam_config.dcw, Settings->webcam_config.bpc, + Settings->webcam_config.colorbar, Settings->webcam_config.streamspeed, Settings->webcam_config.nightmode #ifdef ENABLE_RTSPSERVER , Settings->webcam_config.rtsp #endif // ENABLE_RTSPSERVER @@ -1085,11 +1331,186 @@ void CmndWebcamContrast(void) { ResponseCmndNumber(Settings->webcam_config.contrast -2); } +void CmndWebcamSpecialEffect(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 6)) { + Settings->webcam_config2.special_effect = XdrvMailbox.payload; + WcSetOptions(1, Settings->webcam_config2.special_effect); + } + ResponseCmndNumber(Settings->webcam_config2.special_effect); +} + +void CmndWebcamAWB(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.awb = XdrvMailbox.payload; + WcSetOptions(7, Settings->webcam_config.awb); + } + ResponseCmndStateText(Settings->webcam_config.awb); +} + +void CmndWebcamWBMode(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 4)) { + Settings->webcam_config2.wb_mode = XdrvMailbox.payload; + WcSetOptions(8, Settings->webcam_config2.wb_mode); + } + ResponseCmndNumber(Settings->webcam_config2.wb_mode); +} + +void CmndWebcamAWBGain(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.awb_gain = XdrvMailbox.payload; + WcSetOptions(9, Settings->webcam_config.awb_gain); + } + ResponseCmndStateText(Settings->webcam_config.awb_gain); +} + +void CmndWebcamAEC(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.aec = XdrvMailbox.payload; + WcSetOptions(10, Settings->webcam_config.aec); + } + ResponseCmndStateText(Settings->webcam_config.aec); +} + +void CmndWebcamAECValue(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1200)) { + Settings->webcam_config2.aec_value = XdrvMailbox.payload; + WcSetOptions(11, Settings->webcam_config2.aec_value); + } + ResponseCmndNumber(Settings->webcam_config2.aec_value); +} + +void CmndWebcamAELevel(void) { + if ((XdrvMailbox.payload >= -2) && (XdrvMailbox.payload <= 2)) { + Settings->webcam_config2.ae_level = XdrvMailbox.payload + 2; + WcSetOptions(12, Settings->webcam_config2.ae_level - 2); + } + ResponseCmndNumber(Settings->webcam_config2.ae_level - 2); +} + +void CmndWebcamAEC2(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.aec2 = XdrvMailbox.payload; + WcSetOptions(13, Settings->webcam_config.aec2); + } + ResponseCmndStateText(Settings->webcam_config.aec2); +} + +void CmndWebcamAGC(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.agc = XdrvMailbox.payload; + WcSetOptions(14, Settings->webcam_config.agc); + } + ResponseCmndStateText(Settings->webcam_config.agc); +} + +void CmndWebcamAGCGain(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 30)) { + Settings->webcam_config2.agc_gain = XdrvMailbox.payload; + WcSetOptions(15, Settings->webcam_config2.agc_gain); + } + ResponseCmndNumber(Settings->webcam_config2.agc_gain); +} + +void CmndWebcamGainCeiling(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 6)) { + Settings->webcam_config2.gainceiling = XdrvMailbox.payload; + WcSetOptions(16, Settings->webcam_config2.gainceiling); + } + ResponseCmndNumber(Settings->webcam_config2.gainceiling); +} + +void CmndWebcamGammaCorrect(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.raw_gma = XdrvMailbox.payload; + WcSetOptions(17, Settings->webcam_config.raw_gma); + } + ResponseCmndStateText(Settings->webcam_config.raw_gma); +} + +void CmndWebcamLensCorrect(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.lenc = XdrvMailbox.payload; + WcSetOptions(18, Settings->webcam_config.lenc); + } + ResponseCmndStateText(Settings->webcam_config.lenc); +} + +void CmndWebcamWPC(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.wpc = XdrvMailbox.payload; + WcSetOptions(19, Settings->webcam_config.wpc); + } + ResponseCmndStateText(Settings->webcam_config.wpc); +} + +void CmndWebcamDCW(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.dcw = XdrvMailbox.payload; + WcSetOptions(20, Settings->webcam_config.dcw); + } + ResponseCmndStateText(Settings->webcam_config.dcw); +} + +void CmndWebcamBPC(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.bpc = XdrvMailbox.payload; + WcSetOptions(21, Settings->webcam_config.bpc); + } + ResponseCmndStateText(Settings->webcam_config.bpc); +} + +void CmndWebcamColorbar(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.colorbar = XdrvMailbox.payload; + WcSetOptions(22, Settings->webcam_config.colorbar); + } + ResponseCmndStateText(Settings->webcam_config.colorbar); +} + +void CmndWebcamStreamspeed(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.streamspeed = XdrvMailbox.payload; + WcSetOptions(23, Settings->webcam_config.streamspeed); + } + ResponseCmndStateText(Settings->webcam_config.streamspeed); +} + +void CmndWebcamNightmode(void) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + Settings->webcam_config.nightmode = XdrvMailbox.payload; + WcSetOptions(24, Settings->webcam_config.nightmode); + } + ResponseCmndStateText(Settings->webcam_config.nightmode); +} + void CmndWebcamInit(void) { WcInterruptControl(); ResponseCmndDone(); } +void CmndWebcamSetDefaults(void) { + WcSetDefaults(0); + ResponseCmndDone(); +} + +void CmndWebcamApplySettings(void) { + WcApplySettings(); + ResponseCmndDone(); +} + +#define D_WEBCAM_STATS_FPS "FPS" +#define D_WEBCAM_STATS_CAMFAIL "CamFail" +#define D_WEBCAM_STATS_JPEGFAIL "JpegFail" +#define D_WEBCAM_STATS_CLIENTFAIL "ClientFail" + +void CmndWebcamStats(void) { + Response_P(PSTR("{\"" D_PRFX_WEBCAM D_CMND_WC_STATS "\":{\"" D_WEBCAM_STATS_FPS "\":%d,\"" + D_WEBCAM_STATS_CAMFAIL "\":%d,\"" D_WEBCAM_STATS_JPEGFAIL "\":%d,\"" D_WEBCAM_STATS_CLIENTFAIL "\":%d" + "}}"), + WcStats.camfps, WcStats.camfail, WcStats.jpegfail, WcStats.clientfail + ); +} + #ifdef ENABLE_RTSPSERVER void CmndWebRtsp(void) { if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { @@ -1100,6 +1521,19 @@ void CmndWebRtsp(void) { } #endif // ENABLE_RTSPSERVER +void WcUpdateStats(void) { + WcStats.camfps = WcStats.camcnt; + WcStats.camcnt = 0; +} + +#define D_UNIT_FPS "FPS" +const char HTTP_WEBCAM_FPS[] PROGMEM = "{s}%s Frames per Second {m}%d " D_UNIT_FPS "{e}"; + +void WcStatsShow(void) { +#ifdef USE_WEBSERVER + WSContentSend_PD(HTTP_WEBCAM_FPS, WcStats.name, WcStats.camfps); +#endif // USE_WEBSERVER +} /*********************************************************************************************\ * Interface @@ -1118,6 +1552,11 @@ bool Xdrv81(uint8_t function) { case FUNC_WEB_ADD_MAIN_BUTTON: WcShowStream(); break; + case FUNC_EVERY_SECOND: + WcUpdateStats(); + case FUNC_WEB_SENSOR: + WcStatsShow(); + break; case FUNC_COMMAND: result = DecodeCommand(kWCCommands, WCCommand); break; From 002bc266eb8c61455424cd8d5f5e93679837264d Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 27 Apr 2022 09:40:56 +0200 Subject: [PATCH 084/376] Berry improve logging when using `load()` --- lib/libesp32/berry/generate/be_const_strtab.h | 2 +- .../berry/generate/be_const_strtab_def.h | 6 +-- .../berry_tasmota/src/be_tasmota_lib.c | 37 ++++++++++--------- .../berry_tasmota/src/embedded/Tasmota.be | 4 +- 4 files changed, 25 insertions(+), 24 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 26d4948b0..d4c016e07 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -21,7 +21,7 @@ extern const bcstring be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20fun extern const bcstring be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29; extern const bcstring be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27; extern const bcstring be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29; -extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X29; +extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29; extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson; extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29; extern const bcstring be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index d2c51ccaf..23aceb41b 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -95,7 +95,7 @@ be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: ar be_define_const_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, "BRY: bytecode has wrong version '%s' (%i)", 2140321415u, 0, 41, &be_const_str_clock); be_define_const_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, "BRY: corrupt bytecode '%s'", 4009923544u, 0, 26, &be_const_str_codedump); be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, &be_const_str_clock_icon); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load '%s' (%s)", 54995609u, 0, 29, &be_const_str__rules); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, "BRY: failed to load '%s' (%s - %s)", 1047433014u, 0, 34, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str__global_def); be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_connection_error); be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, &be_const_str_gpio); @@ -1109,8 +1109,8 @@ static const bstring* const m_string_table[] = { (const bstring *)&be_const_str_coord_arr, (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, (const bstring *)&be_const_str_line_dsc, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X29, - (const bstring *)&be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus, + (const bstring *)&be_const_str__rules, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, (const bstring *)&be_const_str__X3A, NULL, (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c index 0e496d7f4..cec5ddd5d 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c @@ -1365,7 +1365,7 @@ be_local_closure(Tasmota_load, /* name */ }) ), be_nested_proto( - 9, /* nstack */ + 11, /* nstack */ 1, /* argc */ 0, /* varg */ 0, /* has upvals */ @@ -1377,11 +1377,11 @@ be_local_closure(Tasmota_load, /* name */ /* K0 */ be_nested_str(file), /* K1 */ be_nested_str(string), /* K2 */ be_nested_str(format), - /* K3 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X29), + /* K3 */ be_nested_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29), }), &be_const_str_try_compile, &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ + ( &(const binstruction[24]) { /* code */ 0xA8020007, // 0000 EXBLK 0 #0009 0x6004000D, // 0001 GETGBL R1 G13 0x5C080000, // 0002 MOVE R2 R0 @@ -1390,21 +1390,22 @@ be_local_closure(Tasmota_load, /* name */ 0xA8040001, // 0005 EXBLK 1 1 0x80040200, // 0006 RET 1 R1 0xA8040001, // 0007 EXBLK 1 1 - 0x7002000B, // 0008 JMP #0015 - 0xAC040001, // 0009 CATCH R1 0 1 - 0x70020008, // 000A JMP #0014 - 0xA40A0200, // 000B IMPORT R2 K1 - 0x600C0001, // 000C GETGBL R3 G1 - 0x8C100502, // 000D GETMET R4 R2 K2 - 0x58180003, // 000E LDCONST R6 K3 - 0x5C1C0000, // 000F MOVE R7 R0 - 0x5C200200, // 0010 MOVE R8 R1 - 0x7C100800, // 0011 CALL R4 4 - 0x7C0C0200, // 0012 CALL R3 1 - 0x70020000, // 0013 JMP #0015 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x4C040000, // 0015 LDNIL R1 - 0x80040200, // 0016 RET 1 R1 + 0x7002000C, // 0008 JMP #0016 + 0xAC040002, // 0009 CATCH R1 0 2 + 0x70020009, // 000A JMP #0015 + 0xA40E0200, // 000B IMPORT R3 K1 + 0x60100001, // 000C GETGBL R4 G1 + 0x8C140702, // 000D GETMET R5 R3 K2 + 0x581C0003, // 000E LDCONST R7 K3 + 0x5C200000, // 000F MOVE R8 R0 + 0x5C240200, // 0010 MOVE R9 R1 + 0x5C280400, // 0011 MOVE R10 R2 + 0x7C140A00, // 0012 CALL R5 5 + 0x7C100200, // 0013 CALL R4 1 + 0x70020000, // 0014 JMP #0016 + 0xB0080000, // 0015 RAISE 2 R0 R0 + 0x4C040000, // 0016 LDNIL R1 + 0x80040200, // 0017 RET 1 R1 }) ), be_nested_proto( diff --git a/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be b/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be index 60fc6a77f..52e6a1e47 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be +++ b/lib/libesp32/berry_tasmota/src/embedded/Tasmota.be @@ -464,9 +464,9 @@ class Tasmota try var compiled = compile(f_name, 'file') return compiled - except .. as e + except .. as e, m import string - print(string.format('BRY: failed to load \'%s\' (%s)',f_name,e)) + print(string.format('BRY: failed to load \'%s\' (%s - %s)',f_name,e,m)) end return nil end From d7d71cd9c858a8cd521f47b03c4027d86b9f2b63 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Fri, 22 Apr 2022 08:40:29 +0200 Subject: [PATCH 085/376] Add flowmeter (YF-DN50 and similary) --- CHANGELOG.md | 1 + tasmota/berry/include/be_gpio_defines.h | 1 + tasmota/i18n.h | 1 + tasmota/language/af_AF.h | 9 +- tasmota/language/bg_BG.h | 9 +- tasmota/language/cs_CZ.h | 9 +- tasmota/language/de_DE.h | 9 +- tasmota/language/el_GR.h | 9 +- tasmota/language/en_GB.h | 7 + tasmota/language/es_ES.h | 9 +- tasmota/language/fr_FR.h | 9 +- tasmota/language/fy_NL.h | 9 +- tasmota/language/he_HE.h | 9 +- tasmota/language/hu_HU.h | 6 + tasmota/language/it_IT.h | 6 + tasmota/language/ko_KO.h | 9 +- tasmota/language/nl_NL.h | 9 +- tasmota/language/pl_PL.h | 9 +- tasmota/language/pt_BR.h | 9 +- tasmota/language/pt_PT.h | 9 +- tasmota/language/ro_RO.h | 9 +- tasmota/language/ru_RU.h | 9 +- tasmota/language/sk_SK.h | 9 +- tasmota/language/sv_SE.h | 9 +- tasmota/language/tr_TR.h | 9 +- tasmota/language/uk_UA.h | 9 +- tasmota/language/vi_VN.h | 9 +- tasmota/language/zh_CN.h | 9 +- tasmota/language/zh_TW.h | 9 +- tasmota/settings.h | 6 +- tasmota/tasmota_template.h | 8 + tasmota/xsns_96_flowmeter.ino | 257 ++++++++++++++++++++++++ tools/lv_gpio/lv_gpio_enum.h | 2 + 33 files changed, 476 insertions(+), 26 deletions(-) create mode 100644 tasmota/xsns_96_flowmeter.ino diff --git a/CHANGELOG.md b/CHANGELOG.md index b4fafaadc..a74756c3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) +- Support for flow meter ### Changed diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h index ec2271073..b6431945f 100644 --- a/tasmota/berry/include/be_gpio_defines.h +++ b/tasmota/berry/include/be_gpio_defines.h @@ -73,6 +73,7 @@ const be_const_member_t lv_gpio_constants[] = { { "ETH_PHY_POWER", (int32_t) GPIO_ETH_PHY_POWER }, { "EXS_ENABLE", (int32_t) GPIO_EXS_ENABLE }, { "FALLING", FALLING }, + { "FLOWMETER_SIGNAL", (int32_t) GPIO_FLOWMETER_IN }, { "FTC532", (int32_t) GPIO_FTC532 }, { "GPS_RX", (int32_t) GPIO_GPS_RX }, { "GPS_TX", (int32_t) GPIO_GPS_TX }, diff --git a/tasmota/i18n.h b/tasmota/i18n.h index 473bd8b4a..a36001ac9 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -225,6 +225,7 @@ #define D_JSON_RESETTABLE_TOTAL_ACTIVE "ResetTotalActive" #define D_JSON_SIGNALSTRENGTH "SignalStrength" #define D_JSON_CHIPTEMPERATURE "ChipTemperature" +#define D_JSON_FLOW_UNIT "FLowUnit" #define D_RSLT_ENERGY "ENERGY" #define D_RSLT_HASS_STATE "HASS_STATE" diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 6c7934f76..32b04c81c 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 1e6270266..f36280949 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 941dd24a2..32bcea496 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 9218e9537..c82ea0864 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Neue Adresse" #define D_OUT_OF_RANGE "Außerhalb Bereich" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 67481f5a2..2115df377 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index afa9b3a8f..991b51d60 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index b93135578..e6a61f1af 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Cambiando dirección a" #define D_OUT_OF_RANGE "Fuera de Rango" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 5638233b1..56781aaf5 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Positionner l'adresse à" #define D_OUT_OF_RANGE "Hors limites" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index fc97068d3..a758a583e 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index dc7be8aa0..043401686 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 04b069358..0eb7d874d 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -913,6 +913,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1056,10 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 769f43241..7e7ab8830 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -913,6 +913,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Imposta indirizzo a" #define D_OUT_OF_RANGE "Fuori intervallo" @@ -1054,6 +1056,10 @@ #define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Errore" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 2716feea4..de24ea75e 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index a7a1e383a..d7db56006 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Nieuw adres" #define D_OUT_OF_RANGE "Buiten beriek" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 6bec6b159..9c6532741 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Ustawiam adres na" #define D_OUT_OF_RANGE "Poza zakresem" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 15b574f64..ba1b8d5d4 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "W/h" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index b664cf3cf..1ac353e61 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Mudança de endereço para" #define D_OUT_OF_RANGE "Fora de Alcance" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index cb709f185..bc28c0959 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index e45388a22..713dca26f 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "А" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "Вт" #define D_UNIT_WATTHOUR "ВтЧ" #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index d376dc26c..17bc2c417 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index dbd138ff5..28d584288 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index bcb341725..e05adff5b 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index b13930560..8022a2302 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "А" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "Вт" #define D_UNIT_WATTHOUR "Вт/г" #define D_UNIT_WATT_METER_QUADRAT "Вт/м²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 0f4e5f563..f04d1196e 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index 89ad958ca..d209c207c 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "A" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "W" #define D_UNIT_WATTHOUR "Wh" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 767df5857..3cf448b2e 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -865,7 +865,8 @@ #define D_GPIO_SHIFT595_OE "74x595 OE" #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" -#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWMETER "Flowmeter" // Units #define D_UNIT_AMPERE "安培" @@ -913,6 +914,8 @@ #define D_UNIT_WATT "瓦特" #define D_UNIT_WATTHOUR "瓦小時" #define D_UNIT_WATT_METER_QUADRAT "W/m²" +#define D_UNIT_LITER_PER_MINUTE "l/min" +#define D_UNIT_CUBICMETER_PER_HOUR "m³/h" #define D_NEW_ADDRESS "Setting address to" #define D_OUT_OF_RANGE "Out of Range" @@ -1054,6 +1057,10 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error +// xsns_96_flowmeter.ino +#define D_FLOWMETER_NAME "Flowmeter" +#define D_FLOWMETER_RATE "Rate" + // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names #define D_NEOPOOL_MACH_HIDROLIFE "Hidrolife" diff --git a/tasmota/settings.h b/tasmota/settings.h index f8b961527..264b50494 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -351,7 +351,7 @@ typedef union { uint8_t data; struct { uint8_t spare0 : 1; - uint8_t spare1 : 1; + uint8_t flowmeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) uint8_t bh1750_2_resolution : 2; uint8_t bh1750_1_resolution : 2; // Sensor10 1,2,3 uint8_t hx711_json_weight_change : 1; // Sensor34 8,x - Enable JSON message on weight change @@ -779,10 +779,10 @@ typedef struct { uint8_t tcp_config; // F5F uint8_t light_step_pixels; // F60 - uint8_t free_f61[27]; // F61 - Decrement if adding new Setting variables just above and below + uint8_t free_f61[23]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below - + uint16_t flowmeter_calibration[2]; // F78 int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 uint32_t energy_kWhtotal; // F9C diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index b576027b3..0a8f428dc 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -187,6 +187,7 @@ enum UserSelectablePins { GPIO_RESET, // Generic reset GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes + GPIO_FLOWMETER_IN, // Flow Meter Pin GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -418,12 +419,14 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDIO_D1 "|" D_SENSOR_SDIO_D2 "|" D_SENSOR_SDIO_D3 "|" + D_SENSOR_FLOWMETER "|" ; const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; #define MAX_MAX31865S 6 +#define MAX_FLOWMETER 2 #define MAX_A4988_MSS 3 #define MAX_WEBCAM_DATA 8 #define MAX_WEBCAM_HSD 3 @@ -973,6 +976,11 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_CM11_TXD), // CM110x Serial interface AGPIO(GPIO_CM11_RXD), // CM110x Serial interface #endif + +#if defined(USE_FLOWMETER) + AGPIO(GPIO_FLOWMETER_IN) + MAX_FLOWMETER, // Flow meter Pin +#endif + /*-------------------------------------------------------------------------------------------*\ * ESP32 specifics \*-------------------------------------------------------------------------------------------*/ diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino new file mode 100644 index 000000000..80478e125 --- /dev/null +++ b/tasmota/xsns_96_flowmeter.ino @@ -0,0 +1,257 @@ +/* + xsns_96_flowmeter.ino - flowmeter support for Tasmota + Up to two flowmeter YF-DN50 and similary supported + (f = 1 Hz up to 5 kHz) + + Copyright (C) 2022 Norbert Richter + + 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_FLOWMETER + +#define XSNS_96 96 + +#define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples +#define FLOWMETER_MIN_FREQ 1 // Hz + +// The Arduino standard GPIO routines are not enough, +// must use some from the Espressif SDK as well +extern "C" { +#include "gpio.h" +} + + +#ifdef USE_WEBSERVER +const char HTTP_SNS_FLOWMETER[] PROGMEM = + "{s}" D_FLOWMETER_NAME "-%d " D_FLOWMETER_RATE "{m}%*_f %s{e}" + ; +#endif // USE_WEBSERVER + + +int32_t flowmeter_period[MAX_FLOWMETER] = {0}; +float flowmeter_period_avg[MAX_FLOWMETER] = {0}; +uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; +volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; + +bool flowmeter_valuesread = false; + + +void IRAM_ATTR FlowMeterIR(uint16_t irq) +{ + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); + uint32_t time = micros(); + uint32_t i = irq; + if (irq < MAX_FLOWMETER) { + if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = time - flowmeter_last_irq[i]; + } else { + flowmeter_period[i] = 0; + } + flowmeter_valuesread = true; + flowmeter_last_irq[i] = time; + } +} +// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: +void IRAM_ATTR FlowMeter1IR(void) +{ + FlowMeterIR(0); +} +void IRAM_ATTR FlowMeter2IR(void) +{ + FlowMeterIR(1); +} + +void FlowMeterRead(void) +{ + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + if ((micros() - flowmeter_last_irq[i]) >= (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = 0; + flowmeter_period_avg[i] = 0; + } + + // exponentially weighted average + if (flowmeter_count[i] <= FLOWMETER_WEIGHT_AVG_SAMPLE) { + flowmeter_count[i]++; + } + flowmeter_period_avg[i] -= flowmeter_period_avg[i] / flowmeter_count[i]; + flowmeter_period_avg[i] += float(flowmeter_period[i]) / flowmeter_count[i]; + } +} + +void FlowMeterInit(void) +{ + void (* irq_service[MAX_FLOWMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + + flowmeter_valuesread = false; + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + pinMode(Pin(GPIO_FLOWMETER_IN, i), INPUT); + attachInterrupt(Pin(GPIO_FLOWMETER_IN, i), irq_service[i], RISING); + } +} + +void FlowMeterShow(bool json) +{ + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + float flowmeter_period_float = 0; + float flowmeter_rate_float = 0; + float flowmeter_period_avg_float = 0; + float flowmeter_rate_avg_float = 0; + float flowmeter_factor = 1.0; + float flowmeter_unit_factor = Settings->SensorBits1.flowmeter_unit ? 500 : 8333;; + + if (Settings->flowmeter_calibration[i]) { + flowmeter_factor = (float)Settings->flowmeter_calibration[i] / 1000; + } + + if (flowmeter_period[i]) { + flowmeter_period_float = (float)flowmeter_period[i] / 1000; + flowmeter_period_avg_float = flowmeter_period_avg[i] / 1000; + + flowmeter_rate_float = flowmeter_unit_factor / (float)flowmeter_period[i] * (flowmeter_factor * 1000); + flowmeter_rate_avg_float = flowmeter_unit_factor / flowmeter_period_avg[i] * (flowmeter_factor * 1000); + } + + if (PinUsed(GPIO_FLOWMETER_IN, i)) { + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_PERIOD "\":%*_f,\"" D_JSON_FLOWRATE "\":%*_f}"), + i+1, + Settings->flag2.frequency_resolution, &flowmeter_period_float, + Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float + ); +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_FLOWMETER, + i+1, + Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float, + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); +#endif // USE_WEBSERVER + } + } + if (json) { + ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); + } + } +} + + + +/*********************************************************************************************\ + * Supported commands for Sensor96: + * + * Sensor96 - Show current settings + * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' + * Sensor96 2 - Set sensor 2 factor (x 1000) + * Sensor96 9 0|1 - Show flow value in l/min (0) or m³/h (1) + * + * Flowmeter calibration: + * - get the current displayed flow rate (D) + * - get the current (c) + * - measure the real flow rate (M) + * - new = M / (c * D) + * + * Example: + * - displayed flow rate = 254.39 l/min (D) + * - current = 1.0 (c) + * - real flow rate = 83.42 l/min (M) + * + * new = M / (c * D) = 83.42 / (1 * 254.39) = 0.328 + * Cmd: Sensor96 x 328 +\*********************************************************************************************/ + +bool FlowMeterCommand(void) { + bool show_parms = true; + char argument[XdrvMailbox.data_len]; + + long value = 0; + for (uint32_t ca = 0; ca < XdrvMailbox.data_len; ca++) { + if ((' ' == XdrvMailbox.data[ca]) || ('=' == XdrvMailbox.data[ca])) { XdrvMailbox.data[ca] = ','; } + } + bool any_value = (strchr(XdrvMailbox.data, ',') != nullptr); + if (any_value) { + value = strtol(ArgV(argument, 2), nullptr, 10); + } + + switch (XdrvMailbox.payload) { + case 1: // Calibration value + case 2: // Calibration value + if (any_value) { + Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + ResponseCmndNumber(value); + show_parms = false; + } + break; + case 9: // Unit + if (any_value) { + Settings->SensorBits1.flowmeter_unit = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; + } + + if (show_parms) { + Response_P(PSTR("{\"Sensor%d\":{"), XSNS_96); + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { + float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1.0; + ResponseAppend_P(PSTR("\"" D_JSON_POWERFACTOR "-%d\":%3_f,"), i+1, &flowmeter_factor); + } + ResponseAppend_P(PSTR("\"" D_JSON_FLOW_UNIT "\":\"%s\"}}"), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); + } + + return true; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns96(uint8_t function) +{ + bool result = false; + + if (PinUsed(GPIO_FLOWMETER_IN, GPIO_ANY)) { + switch (function) { + case FUNC_INIT: + FlowMeterInit(); + break; + case FUNC_EVERY_250_MSECOND: + FlowMeterRead(); + break; + case FUNC_COMMAND_SENSOR: + if (XSNS_96 == XdrvMailbox.index) { + result = FlowMeterCommand(); + } + break; + case FUNC_JSON_APPEND: + FlowMeterShow(true); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + FlowMeterShow(false); + break; +#endif // USE_WEBSERVER + + } + } + return result; +} + +#endif // USE_FLOWMETER diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index 19e517add..f6ded405d 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -299,4 +299,6 @@ BL6523_RX = GPIO_BL6523_RX ADE7880_IRQ = GPIO_ADE7880_IRQ RESET = GPIO_RESET +FLOWMETER_SIGNAL = GPIO_FLOWMETER_IN + SENSOR_END = GPIO_SENSOR_END From abc4f74fbcbaa722f11e7ad0c935a1dc7ba5ac43 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Tue, 26 Apr 2022 14:52:26 +0200 Subject: [PATCH 086/376] Refactor flowmeter calc --- tasmota/xsns_96_flowmeter.ino | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 80478e125..1923fb6e9 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -105,30 +105,17 @@ void FlowMeterInit(void) void FlowMeterShow(bool json) { for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_period_float = 0; - float flowmeter_rate_float = 0; - float flowmeter_period_avg_float = 0; float flowmeter_rate_avg_float = 0; - float flowmeter_factor = 1.0; - float flowmeter_unit_factor = Settings->SensorBits1.flowmeter_unit ? 500 : 8333;; - - if (Settings->flowmeter_calibration[i]) { - flowmeter_factor = (float)Settings->flowmeter_calibration[i] / 1000; - } if (flowmeter_period[i]) { - flowmeter_period_float = (float)flowmeter_period[i] / 1000; - flowmeter_period_avg_float = flowmeter_period_avg[i] / 1000; - - flowmeter_rate_float = flowmeter_unit_factor / (float)flowmeter_period[i] * (flowmeter_factor * 1000); - flowmeter_rate_avg_float = flowmeter_unit_factor / flowmeter_period_avg[i] * (flowmeter_factor * 1000); + flowmeter_rate_avg_float = + ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) / flowmeter_period_avg[i] * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); } if (PinUsed(GPIO_FLOWMETER_IN, i)) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_PERIOD "\":%*_f,\"" D_JSON_FLOWRATE "\":%*_f}"), + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_FLOWRATE "\":%*_f}"), i+1, - Settings->flag2.frequency_resolution, &flowmeter_period_float, Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float ); #ifdef USE_WEBSERVER @@ -141,11 +128,11 @@ void FlowMeterShow(bool json) #endif // USE_WEBSERVER } } - if (json) { - ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE - ); - } + } + if (json) { + ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ); } } From fb796187c2baba3843b61e12d3e758d7dfadda9b Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:20:30 +0200 Subject: [PATCH 087/376] Flowmeter integration --- BUILDS.md | 1 + tasmota/my_user_config.h | 2 ++ tasmota/support_features.ino | 4 +++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/BUILDS.md b/BUILDS.md index 44b82d93a..4b3681d80 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -216,6 +216,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_HRE | - | - / x | - | x | - | - | | USE_A4988_STEPPER | - | - / - | - | - | - | - | | USE_NEOPOOL | - | - / - | - | - | - | - | +| USE_FLOWMETER | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_DISPLAY | - | - / - | - | - | - | x | diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 6a197c5d5..3fdeca42c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,6 +948,8 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address +//#define FLOWMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) + // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat #define THERMOSTAT_CONTROLLER_OUTPUTS 1 // Number of outputs to be controlled independently diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index c2e6535c7..b1ac73281 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -806,7 +806,9 @@ void ResponseAppendFeatures(void) #ifdef USE_IMPROV feature8 |= 0x04000000; // xdrv_62_improv.ino #endif -// feature8 |= 0x08000000; +#ifdef USE_FLOWMETER + feature8 |= 0x08000000; // nsns_96_flowmeter.ino +#endif // feature8 |= 0x10000000; // feature8 |= 0x20000000; From 732359a885be6261120e3d3f32af4b54c5169a77 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:22:46 +0200 Subject: [PATCH 088/376] Refactor ISR --- tasmota/xsns_96_flowmeter.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 1923fb6e9..2bfd21845 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -50,18 +50,18 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { - uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - uint32_t i = irq; + // uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); + // uint32_t i = irq; if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = time - flowmeter_last_irq[i]; + if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[irq] = time - flowmeter_last_irq[irq]; } else { - flowmeter_period[i] = 0; + flowmeter_period[irq] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[i] = time; + flowmeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From f192284660d4c42ac32544e2c41c4e4bef0e984c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:23:27 +0200 Subject: [PATCH 089/376] Refactor Sensor cmnd --- tasmota/xsns_96_flowmeter.ino | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 2bfd21845..13df5a0a8 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -142,9 +142,9 @@ void FlowMeterShow(bool json) * Supported commands for Sensor96: * * Sensor96 - Show current settings + * Sensor96 0 0|1 - Show flow value in l/min (0) or m³/h (1) * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' * Sensor96 2 - Set sensor 2 factor (x 1000) - * Sensor96 9 0|1 - Show flow value in l/min (0) or m³/h (1) * * Flowmeter calibration: * - get the current displayed flow rate (D) @@ -175,21 +175,21 @@ bool FlowMeterCommand(void) { } switch (XdrvMailbox.payload) { - case 1: // Calibration value - case 2: // Calibration value - if (any_value) { - Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; - ResponseCmndNumber(value); - show_parms = false; - } - break; - case 9: // Unit + case 0: // Unit if (any_value) { Settings->SensorBits1.flowmeter_unit = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } break; + case 1: // Sensor calibration value + case 2: + if (any_value) { + Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + ResponseCmndNumber(value); + show_parms = false; + } + break; } if (show_parms) { From 96a36b7bdb85b1e92e48784740653f68b0897ee4 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:28:01 +0200 Subject: [PATCH 090/376] Revert "Refactor ISR" This reverts commit 9033ada3c70c6214770de05c573139c90e08678f. --- tasmota/xsns_96_flowmeter.ino | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index 13df5a0a8..f30feb7f7 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -50,18 +50,18 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - // uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - // GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); - // uint32_t i = irq; + uint32_t i = irq; if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[irq] = time - flowmeter_last_irq[irq]; + if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[i] = time - flowmeter_last_irq[i]; } else { - flowmeter_period[irq] = 0; + flowmeter_period[i] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[irq] = time; + flowmeter_last_irq[i] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From 52757cb8a4ac0ab07c3fb123bc7cf608135bd1df Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 08:32:09 +0200 Subject: [PATCH 091/376] Refactor ISR --- tasmota/xsns_96_flowmeter.ino | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index f30feb7f7..f57675b6e 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -51,17 +51,16 @@ bool flowmeter_valuesread = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); - GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); uint32_t time = micros(); - uint32_t i = irq; + GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[i]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = time - flowmeter_last_irq[i]; + if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { + flowmeter_period[irq] = time - flowmeter_last_irq[irq]; } else { - flowmeter_period[i] = 0; + flowmeter_period[irq] = 0; } flowmeter_valuesread = true; - flowmeter_last_irq[i] = time; + flowmeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: From ff3adb9bf03347a7a40a4350786a50aa48705fb6 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 14:03:05 +0200 Subject: [PATCH 092/376] Add flow rate value source type --- tasmota/i18n.h | 1 - tasmota/xsns_96_flowmeter.ino | 60 +++++++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/tasmota/i18n.h b/tasmota/i18n.h index a36001ac9..473bd8b4a 100644 --- a/tasmota/i18n.h +++ b/tasmota/i18n.h @@ -225,7 +225,6 @@ #define D_JSON_RESETTABLE_TOTAL_ACTIVE "ResetTotalActive" #define D_JSON_SIGNALSTRENGTH "SignalStrength" #define D_JSON_CHIPTEMPERATURE "ChipTemperature" -#define D_JSON_FLOW_UNIT "FLowUnit" #define D_RSLT_ENERGY "ENERGY" #define D_RSLT_HASS_STATE "HASS_STATE" diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowmeter.ino index f57675b6e..67c755dda 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowmeter.ino @@ -2,6 +2,7 @@ xsns_96_flowmeter.ino - flowmeter support for Tasmota Up to two flowmeter YF-DN50 and similary supported (f = 1 Hz up to 5 kHz) + Uses the FreqRes resolution Copyright (C) 2022 Norbert Richter @@ -21,17 +22,22 @@ #ifdef USE_FLOWMETER +// The Arduino standard GPIO routines are not enough, +// must use some from the Espressif SDK as well +// extern "C" { +// #include "gpio.h" +// } + #define XSNS_96 96 #define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples #define FLOWMETER_MIN_FREQ 1 // Hz -// The Arduino standard GPIO routines are not enough, -// must use some from the Espressif SDK as well -extern "C" { -#include "gpio.h" -} - +#define D_JSON_FLOWMETER_RATE "Rate" +#define D_JSON_FLOWMETER_VALUE "Value" +#define D_JSON_FLOWMETER_UNIT "Unit" +#define D_JSON_FLOWMETER_VALUE_AVG "average" +#define D_JSON_FLOWMETER_VALUE_RAW "raw" #ifdef USE_WEBSERVER const char HTTP_SNS_FLOWMETER[] PROGMEM = @@ -46,7 +52,7 @@ uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; bool flowmeter_valuesread = false; - +bool flowmeter_raw_value = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { @@ -63,7 +69,7 @@ void IRAM_ATTR FlowMeterIR(uint16_t irq) flowmeter_last_irq[irq] = time; } } -// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way: +// GPIO_STATUS is always 0 (?), so can only determine the IR source using this way void IRAM_ATTR FlowMeter1IR(void) { FlowMeterIR(0); @@ -103,20 +109,27 @@ void FlowMeterInit(void) void FlowMeterShow(bool json) { + if (json) { + ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "\":{\"" D_JSON_FLOWMETER_RATE "\":[")); + } + for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { float flowmeter_rate_avg_float = 0; if (flowmeter_period[i]) { flowmeter_rate_avg_float = - ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) / flowmeter_period_avg[i] * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); + ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) + / (flowmeter_raw_value ? flowmeter_period[i] : flowmeter_period_avg[i]) + * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); } if (PinUsed(GPIO_FLOWMETER_IN, i)) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "-%d\":{\"" D_JSON_FLOWRATE "\":%*_f}"), - i+1, + ResponseAppend_P(PSTR("%s%*_f"), + i ? PSTR(",") : PSTR(""), Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float ); + #ifdef USE_WEBSERVER } else { WSContentSend_PD(HTTP_SNS_FLOWMETER, @@ -125,11 +138,15 @@ void FlowMeterShow(bool json) Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER + } } } if (json) { - ResponseAppend_P(PSTR(",\"" D_JSON_FLOW_UNIT "\":\"%s\""), + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), + flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}"), Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } @@ -144,6 +161,7 @@ void FlowMeterShow(bool json) * Sensor96 0 0|1 - Show flow value in l/min (0) or m³/h (1) * Sensor96 1 - Set sensor 1 factor (x 1000) - to set to 0.2 enter 'Sensor96 1 200' * Sensor96 2 - Set sensor 2 factor (x 1000) + * Sensor96 9 0|1 - Value mode: Switch between displaying avg(0) / raw(1) readings (not permanently) * * Flowmeter calibration: * - get the current displayed flow rate (D) @@ -189,15 +207,25 @@ bool FlowMeterCommand(void) { show_parms = false; } break; + case 9: // avg/raw values + if (any_value) { + flowmeter_raw_value = value & 1; + ResponseCmndNumber(value & 1); + show_parms = false; + } + break; } if (show_parms) { - Response_P(PSTR("{\"Sensor%d\":{"), XSNS_96); + Response_P(PSTR("{\"Sensor%d\":{\"" D_JSON_POWERFACTOR "\":["), XSNS_96); for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1.0; - ResponseAppend_P(PSTR("\"" D_JSON_POWERFACTOR "-%d\":%3_f,"), i+1, &flowmeter_factor); + float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1; + ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowmeter_factor); } - ResponseAppend_P(PSTR("\"" D_JSON_FLOW_UNIT "\":\"%s\"}}"), + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), + flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ); + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}}"), Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } From b1933f7c0e695ebf0f6e6819e717c87b7037e24e Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 16:49:16 +0200 Subject: [PATCH 093/376] Rename flowratemeter --- BUILDS.md | 2 +- CHANGELOG.md | 2 +- tasmota/berry/include/be_gpio_defines.h | 2 +- tasmota/language/af_AF.h | 7 +- tasmota/language/bg_BG.h | 7 +- tasmota/language/cs_CZ.h | 7 +- tasmota/language/de_DE.h | 7 +- tasmota/language/el_GR.h | 7 +- tasmota/language/en_GB.h | 7 +- tasmota/language/es_ES.h | 7 +- tasmota/language/fr_FR.h | 7 +- tasmota/language/fy_NL.h | 7 +- tasmota/language/he_HE.h | 7 +- tasmota/language/hu_HU.h | 5 +- tasmota/language/it_IT.h | 5 +- tasmota/language/ko_KO.h | 7 +- tasmota/language/nl_NL.h | 7 +- tasmota/language/pl_PL.h | 7 +- tasmota/language/pt_BR.h | 7 +- tasmota/language/pt_PT.h | 7 +- tasmota/language/ro_RO.h | 7 +- tasmota/language/ru_RU.h | 7 +- tasmota/language/sk_SK.h | 7 +- tasmota/language/sv_SE.h | 7 +- tasmota/language/tr_TR.h | 7 +- tasmota/language/uk_UA.h | 7 +- tasmota/language/vi_VN.h | 7 +- tasmota/language/zh_CN.h | 7 +- tasmota/language/zh_TW.h | 7 +- tasmota/my_user_config.h | 2 +- tasmota/settings.h | 4 +- tasmota/support_features.ino | 4 +- tasmota/tasmota_template.h | 10 +- ...lowmeter.ino => xsns_96_flowratemeter.ino} | 140 +++++++++--------- tools/lv_gpio/lv_gpio_enum.h | 2 +- 35 files changed, 161 insertions(+), 185 deletions(-) rename tasmota/{xsns_96_flowmeter.ino => xsns_96_flowratemeter.ino} (52%) diff --git a/BUILDS.md b/BUILDS.md index 4b3681d80..c3d70ad51 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -216,7 +216,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_HRE | - | - / x | - | x | - | - | | USE_A4988_STEPPER | - | - / - | - | - | - | - | | USE_NEOPOOL | - | - / - | - | - | - | - | -| USE_FLOWMETER | - | - / - | - | - | - | - | +| USE_FLOWRATEMETER | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_DISPLAY | - | - / - | - | - | - | x | diff --git a/CHANGELOG.md b/CHANGELOG.md index a74756c3a..deb2e5f28 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) -- Support for flow meter +- Support for flowrate meters like YF-DN50 and similary ### Changed diff --git a/tasmota/berry/include/be_gpio_defines.h b/tasmota/berry/include/be_gpio_defines.h index b6431945f..6b66aace8 100644 --- a/tasmota/berry/include/be_gpio_defines.h +++ b/tasmota/berry/include/be_gpio_defines.h @@ -73,7 +73,7 @@ const be_const_member_t lv_gpio_constants[] = { { "ETH_PHY_POWER", (int32_t) GPIO_ETH_PHY_POWER }, { "EXS_ENABLE", (int32_t) GPIO_EXS_ENABLE }, { "FALLING", FALLING }, - { "FLOWMETER_SIGNAL", (int32_t) GPIO_FLOWMETER_IN }, + { "FLOWRATEMETER_SIGNAL", (int32_t) GPIO_FLOWRATEMETER_IN }, { "FTC532", (int32_t) GPIO_FTC532 }, { "GPS_RX", (int32_t) GPIO_GPS_RX }, { "GPS_TX", (int32_t) GPIO_GPS_TX }, diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 32b04c81c..e421316cc 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Wagwoord geverifieer" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowmeter" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index f36280949..0e3a49ac0 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Грешка" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 32bcea496..69d11e2d8 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index c82ea0864..2581479ef 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Übereinstimmung" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fehler" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Durchflussmesser" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 2115df377..2586f53fd 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 991b51d60..750e68227 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index e6a61f1af..30fc163f9 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Clave Correcta" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 56781aaf5..387bb189f 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Mot-de-passe vérifié" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erreur" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index a758a583e..3526a45e0 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 043401686..f0af2f18b 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 0eb7d874d..c93e4f809 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -1056,9 +1056,8 @@ #define D_FP_PASSVERIFY "Jelszó ellenőrizve" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Hiba" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 7e7ab8830..9197025a6 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -1056,9 +1056,8 @@ #define D_FP_PASSVERIFY "Password verificata" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Errore" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index de24ea75e..f2182dde3 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index d7db56006..5b13fe1eb 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Wachtwoord herkend" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Fout" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 9c6532741..c46c699ee 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Zweryfikowano poprawnie" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Błąd" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ba1b8d5d4..1b05ad513 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Senha verificada" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Erro" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 1ac353e61..c5200a61d 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index bc28c0959..095f2a777 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 713dca26f..66b3ded98 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "А" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 17bc2c417..2205db29e 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 28d584288..6727802c7 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index e05adff5b..7e0782f36 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 8022a2302..0d9238bc7 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "А" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index f04d1196e..98194eae9 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index d209c207c..d8631eee4 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 3cf448b2e..81616bcfc 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -866,7 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" -#define D_SENSOR_FLOWMETER "Flowmeter" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "安培" @@ -1057,9 +1057,8 @@ #define D_FP_PASSVERIFY "Password verified" // 0x21 Verify the fingerprint passed #define D_FP_UNKNOWNERROR "Error" // Any other error -// xsns_96_flowmeter.ino -#define D_FLOWMETER_NAME "Flowmeter" -#define D_FLOWMETER_RATE "Rate" +// xsns_96_flowratemeter.ino +#define D_FLOWRATEMETER_NAME "Flowrate" // xsns_83_neopool.ino #define D_NEOPOOL_MACH_NONE "NeoPool" // Machine names diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 3fdeca42c..47dfef80b 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,7 +948,7 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address -//#define FLOWMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) +//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat diff --git a/tasmota/settings.h b/tasmota/settings.h index 264b50494..8a302ad55 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -351,7 +351,7 @@ typedef union { uint8_t data; struct { uint8_t spare0 : 1; - uint8_t flowmeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) + uint8_t flowratemeter_unit : 1; // Sensor96 9,x - unit l/min (0) or m³/h (1) uint8_t bh1750_2_resolution : 2; uint8_t bh1750_1_resolution : 2; // Sensor10 1,2,3 uint8_t hx711_json_weight_change : 1; // Sensor34 8,x - Enable JSON message on weight change @@ -782,7 +782,7 @@ typedef struct { uint8_t free_f61[23]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below - uint16_t flowmeter_calibration[2]; // F78 + uint16_t flowratemeter_calibration[2];// F78 int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 uint32_t energy_kWhtotal; // F9C diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index b1ac73281..bf3b17011 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -806,8 +806,8 @@ void ResponseAppendFeatures(void) #ifdef USE_IMPROV feature8 |= 0x04000000; // xdrv_62_improv.ino #endif -#ifdef USE_FLOWMETER - feature8 |= 0x08000000; // nsns_96_flowmeter.ino +#ifdef USE_FLOWRATEMETER + feature8 |= 0x08000000; // xsns_96_flowratemeter.ino #endif // feature8 |= 0x10000000; diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 0a8f428dc..5c6fa8237 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -187,7 +187,7 @@ enum UserSelectablePins { GPIO_RESET, // Generic reset GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes - GPIO_FLOWMETER_IN, // Flow Meter Pin + GPIO_FLOWRATEMETER_IN, // Flowrate Meter GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -419,14 +419,14 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDIO_D1 "|" D_SENSOR_SDIO_D2 "|" D_SENSOR_SDIO_D3 "|" - D_SENSOR_FLOWMETER "|" + D_SENSOR_FLOWRATEMETER "|" ; const char kSensorNamesFixed[] PROGMEM = D_SENSOR_USER; #define MAX_MAX31865S 6 -#define MAX_FLOWMETER 2 +#define MAX_FLOWRATEMETER 2 #define MAX_A4988_MSS 3 #define MAX_WEBCAM_DATA 8 #define MAX_WEBCAM_HSD 3 @@ -977,8 +977,8 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_CM11_RXD), // CM110x Serial interface #endif -#if defined(USE_FLOWMETER) - AGPIO(GPIO_FLOWMETER_IN) + MAX_FLOWMETER, // Flow meter Pin +#if defined(USE_FLOWRATEMETER) + AGPIO(GPIO_FLOWRATEMETER_IN) + MAX_FLOWRATEMETER, // Flow meter Pin #endif /*-------------------------------------------------------------------------------------------*\ diff --git a/tasmota/xsns_96_flowmeter.ino b/tasmota/xsns_96_flowratemeter.ino similarity index 52% rename from tasmota/xsns_96_flowmeter.ino rename to tasmota/xsns_96_flowratemeter.ino index 67c755dda..b2ff90cab 100644 --- a/tasmota/xsns_96_flowmeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -1,8 +1,8 @@ /* - xsns_96_flowmeter.ino - flowmeter support for Tasmota - Up to two flowmeter YF-DN50 and similary supported - (f = 1 Hz up to 5 kHz) - Uses the FreqRes resolution + xsns_96_flowratemeter.ino - flowratemeter support for Tasmota + - up to two flowratemeter YF-DN50 and similary + - flow rate frequencies f = 1 Hz up to 5 kHz + - uses the FreqRes resolution Copyright (C) 2022 Norbert Richter @@ -20,7 +20,7 @@ along with this program. If not, see . */ -#ifdef USE_FLOWMETER +#ifdef USE_FLOWRATEMETER // The Arduino standard GPIO routines are not enough, // must use some from the Espressif SDK as well @@ -30,43 +30,45 @@ #define XSNS_96 96 -#define FLOWMETER_WEIGHT_AVG_SAMPLE 20 // samples -#define FLOWMETER_MIN_FREQ 1 // Hz +#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // samples +#define FLOWRATEMETER_MIN_FREQ 1 // Hz -#define D_JSON_FLOWMETER_RATE "Rate" -#define D_JSON_FLOWMETER_VALUE "Value" -#define D_JSON_FLOWMETER_UNIT "Unit" -#define D_JSON_FLOWMETER_VALUE_AVG "average" -#define D_JSON_FLOWMETER_VALUE_RAW "raw" +#define D_JSON_FLOWRATEMETER_RATE "Rate" +#define D_JSON_FLOWRATEMETER_VALUE "Value" +#define D_JSON_FLOWRATEMETER_UNIT "Unit" +#define D_JSON_FLOWRATEMETER_VALUE_AVG "average" +#define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" #ifdef USE_WEBSERVER -const char HTTP_SNS_FLOWMETER[] PROGMEM = - "{s}" D_FLOWMETER_NAME "-%d " D_FLOWMETER_RATE "{m}%*_f %s{e}" +const char HTTP_SNS_FLOWRATEMETER[] PROGMEM = + "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" ; #endif // USE_WEBSERVER -int32_t flowmeter_period[MAX_FLOWMETER] = {0}; -float flowmeter_period_avg[MAX_FLOWMETER] = {0}; -uint32_t flowmeter_count[MAX_FLOWMETER] = {0}; -volatile uint32_t flowmeter_last_irq[MAX_FLOWMETER] = {0}; +int32_t flowratemeter_period[MAX_FLOWRATEMETER] = {0}; +float flowratemeter_period_avg[MAX_FLOWRATEMETER] = {0}; +uint32_t flowratemeter_count[MAX_FLOWRATEMETER] = {0}; +volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {0}; -bool flowmeter_valuesread = false; -bool flowmeter_raw_value = false; +bool flowratemeter_valuesread = false; +bool flowratemeter_raw_value = false; void IRAM_ATTR FlowMeterIR(uint16_t irq) { - uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); uint32_t time = micros(); +#if defined(ESP8266) + uint32_t gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS); GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status); - if (irq < MAX_FLOWMETER) { - if ((time - flowmeter_last_irq[irq]) < (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[irq] = time - flowmeter_last_irq[irq]; +#endif + if (irq < MAX_FLOWRATEMETER) { + if ((time - flowratemeter_last_irq[irq]) < (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period[irq] = time - flowratemeter_last_irq[irq]; } else { - flowmeter_period[irq] = 0; + flowratemeter_period[irq] = 0; } - flowmeter_valuesread = true; - flowmeter_last_irq[irq] = time; + flowratemeter_valuesread = true; + flowratemeter_last_irq[irq] = time; } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way @@ -81,61 +83,61 @@ void IRAM_ATTR FlowMeter2IR(void) void FlowMeterRead(void) { - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - if ((micros() - flowmeter_last_irq[i]) >= (1000000 / FLOWMETER_MIN_FREQ)) { - flowmeter_period[i] = 0; - flowmeter_period_avg[i] = 0; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + if ((micros() - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { + flowratemeter_period[i] = 0; + flowratemeter_period_avg[i] = 0; } // exponentially weighted average - if (flowmeter_count[i] <= FLOWMETER_WEIGHT_AVG_SAMPLE) { - flowmeter_count[i]++; + if (flowratemeter_count[i] <= FLOWRATEMETER_WEIGHT_AVG_SAMPLE) { + flowratemeter_count[i]++; } - flowmeter_period_avg[i] -= flowmeter_period_avg[i] / flowmeter_count[i]; - flowmeter_period_avg[i] += float(flowmeter_period[i]) / flowmeter_count[i]; + flowratemeter_period_avg[i] -= flowratemeter_period_avg[i] / flowratemeter_count[i]; + flowratemeter_period_avg[i] += float(flowratemeter_period[i]) / flowratemeter_count[i]; } } void FlowMeterInit(void) { - void (* irq_service[MAX_FLOWMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; - flowmeter_valuesread = false; - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - pinMode(Pin(GPIO_FLOWMETER_IN, i), INPUT); - attachInterrupt(Pin(GPIO_FLOWMETER_IN, i), irq_service[i], RISING); + flowratemeter_valuesread = false; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + pinMode(Pin(GPIO_FLOWRATEMETER_IN, i), INPUT); + attachInterrupt(Pin(GPIO_FLOWRATEMETER_IN, i), irq_service[i], RISING); } } void FlowMeterShow(bool json) { if (json) { - ResponseAppend_P(PSTR(",\"" D_FLOWMETER_NAME "\":{\"" D_JSON_FLOWMETER_RATE "\":[")); + ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); } - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_rate_avg_float = 0; + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + float flowratemeter_rate_avg_float = 0; - if (flowmeter_period[i]) { - flowmeter_rate_avg_float = - ((Settings->SensorBits1.flowmeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) - / (flowmeter_raw_value ? flowmeter_period[i] : flowmeter_period_avg[i]) - * (Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] : 1000.0); + if (flowratemeter_period[i]) { + flowratemeter_rate_avg_float = + ((Settings->SensorBits1.flowratemeter_unit ? (1000000.0 / 1000.0) : (1000000 / 60.0)) / 2.0) + / (flowratemeter_raw_value ? flowratemeter_period[i] : flowratemeter_period_avg[i]) + * (Settings->flowratemeter_calibration[i] ? (float)Settings->flowratemeter_calibration[i] : 1000.0); } - if (PinUsed(GPIO_FLOWMETER_IN, i)) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, i)) { if (json) { ResponseAppend_P(PSTR("%s%*_f"), i ? PSTR(",") : PSTR(""), - Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float + Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float ); #ifdef USE_WEBSERVER } else { - WSContentSend_PD(HTTP_SNS_FLOWMETER, + WSContentSend_PD(HTTP_SNS_FLOWRATEMETER, i+1, - Settings->flag2.frequency_resolution, &flowmeter_rate_avg_float, - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->flag2.frequency_resolution, &flowratemeter_rate_avg_float, + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER @@ -143,11 +145,11 @@ void FlowMeterShow(bool json) } } if (json) { - ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), - flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); - ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}"), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } } @@ -194,7 +196,7 @@ bool FlowMeterCommand(void) { switch (XdrvMailbox.payload) { case 0: // Unit if (any_value) { - Settings->SensorBits1.flowmeter_unit = value & 1; + Settings->SensorBits1.flowratemeter_unit = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } @@ -202,14 +204,14 @@ bool FlowMeterCommand(void) { case 1: // Sensor calibration value case 2: if (any_value) { - Settings->flowmeter_calibration[XdrvMailbox.payload - 1] = value; + Settings->flowratemeter_calibration[XdrvMailbox.payload - 1] = value; ResponseCmndNumber(value); show_parms = false; } break; case 9: // avg/raw values if (any_value) { - flowmeter_raw_value = value & 1; + flowratemeter_raw_value = value & 1; ResponseCmndNumber(value & 1); show_parms = false; } @@ -218,15 +220,15 @@ bool FlowMeterCommand(void) { if (show_parms) { Response_P(PSTR("{\"Sensor%d\":{\"" D_JSON_POWERFACTOR "\":["), XSNS_96); - for (uint32_t i = 0; i < MAX_FLOWMETER; i++) { - float flowmeter_factor = Settings->flowmeter_calibration[i] ? (float)Settings->flowmeter_calibration[i] / 1000 : 1; - ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowmeter_factor); + for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { + float flowratemeter_factor = Settings->flowratemeter_calibration[i] ? (float)Settings->flowratemeter_calibration[i] / 1000 : 1; + ResponseAppend_P(PSTR("%s%3_f"), i ? PSTR(",") : PSTR(""), &flowratemeter_factor); } - ResponseAppend_P(PSTR("],\"" D_JSON_FLOWMETER_VALUE "\":\"%s\""), - flowmeter_raw_value ? PSTR(D_JSON_FLOWMETER_VALUE_RAW) : PSTR(D_JSON_FLOWMETER_VALUE_AVG) + ResponseAppend_P(PSTR("],\"" D_JSON_FLOWRATEMETER_VALUE "\":\"%s\""), + flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); - ResponseAppend_P(PSTR(",\"" D_JSON_FLOWMETER_UNIT "\":\"%s\"}}"), - Settings->SensorBits1.flowmeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}}"), + Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); } @@ -241,7 +243,7 @@ bool Xsns96(uint8_t function) { bool result = false; - if (PinUsed(GPIO_FLOWMETER_IN, GPIO_ANY)) { + if (PinUsed(GPIO_FLOWRATEMETER_IN, GPIO_ANY)) { switch (function) { case FUNC_INIT: FlowMeterInit(); @@ -268,4 +270,4 @@ bool Xsns96(uint8_t function) return result; } -#endif // USE_FLOWMETER +#endif // USE_FLOWRATEMETER diff --git a/tools/lv_gpio/lv_gpio_enum.h b/tools/lv_gpio/lv_gpio_enum.h index f6ded405d..cea920168 100644 --- a/tools/lv_gpio/lv_gpio_enum.h +++ b/tools/lv_gpio/lv_gpio_enum.h @@ -299,6 +299,6 @@ BL6523_RX = GPIO_BL6523_RX ADE7880_IRQ = GPIO_ADE7880_IRQ RESET = GPIO_RESET -FLOWMETER_SIGNAL = GPIO_FLOWMETER_IN +FLOWRATEMETER_SIGNAL = GPIO_FLOWRATEMETER_IN SENSOR_END = GPIO_SENSOR_END From b5a0c5ca79f50e0fc29daa9e77e4ae73f357564c Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:23:34 +0200 Subject: [PATCH 094/376] Fix missing lang definition --- tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + 2 files changed, 2 insertions(+) diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index c93e4f809..fd862bbc8 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 SER" #define D_SENSOR_CM11_TX "CM110x TX" #define D_SENSOR_CM11_RX "CM110x RX" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 9197025a6..b19f68536 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -866,6 +866,7 @@ #define D_GPIO_SHIFT595_SER "74x595 - SER" #define D_SENSOR_CM11_TX "CM110x - TX" #define D_SENSOR_CM11_RX "CM110x - RX" +#define D_SENSOR_FLOWRATEMETER "Flowrate" // Units #define D_UNIT_AMPERE "A" From 8d9c945ceee82ad090a23d3aa8f7c95c21090df7 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:25:20 +0200 Subject: [PATCH 095/376] Refactor string const --- tasmota/xsns_96_flowratemeter.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/xsns_96_flowratemeter.ino index b2ff90cab..010b21885 100644 --- a/tasmota/xsns_96_flowratemeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -149,7 +149,7 @@ void FlowMeterShow(bool json) flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}"), - Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) ); } } @@ -228,7 +228,7 @@ bool FlowMeterCommand(void) { flowratemeter_raw_value ? PSTR(D_JSON_FLOWRATEMETER_VALUE_RAW) : PSTR(D_JSON_FLOWRATEMETER_VALUE_AVG) ); ResponseAppend_P(PSTR(",\"" D_JSON_FLOWRATEMETER_UNIT "\":\"%s\"}}"), - Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE + Settings->SensorBits1.flowratemeter_unit ? PSTR(D_UNIT_CUBICMETER_PER_HOUR) : PSTR(D_UNIT_LITER_PER_MINUTE) ); } From 8857698bc7bddf3063a5d40a85df8b8e09b50372 Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:32:52 +0200 Subject: [PATCH 096/376] Update module consumtion --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 47dfef80b..a3344e41f 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -948,7 +948,7 @@ //#define USE_NEOPOOL // Add support for Sugar Valley NeoPool Controller - also known under brands Hidrolife, Aquascenic, Oxilife, Bionet, Hidroniser, UVScenic, Station, Brilix, Bayrol and Hay (+6k flash, +60 mem) // #define NEOPOOL_MODBUS_ADDRESS 1 // Any modbus address -//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k5 code) +//#define FLOWRATEMETER // Add support for water flow meter YF-DN50 and similary (+1k7 code) // -- Thermostat control ---------------------------- //#define USE_THERMOSTAT // Add support for Thermostat From 0ae8bfe2eb603886056c2238b02e2902349884bf Mon Sep 17 00:00:00 2001 From: Norbert Richter Date: Wed, 27 Apr 2022 17:50:41 +0200 Subject: [PATCH 097/376] Refactor names --- tasmota/xsns_96_flowratemeter.ino | 49 ++++++++++++++----------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/xsns_96_flowratemeter.ino index 010b21885..1b727dba0 100644 --- a/tasmota/xsns_96_flowratemeter.ino +++ b/tasmota/xsns_96_flowratemeter.ino @@ -22,15 +22,11 @@ #ifdef USE_FLOWRATEMETER -// The Arduino standard GPIO routines are not enough, -// must use some from the Espressif SDK as well -// extern "C" { -// #include "gpio.h" -// } - #define XSNS_96 96 -#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // samples + + +#define FLOWRATEMETER_WEIGHT_AVG_SAMPLE 20 // number of samples for smooth weigted average #define FLOWRATEMETER_MIN_FREQ 1 // Hz #define D_JSON_FLOWRATEMETER_RATE "Rate" @@ -39,6 +35,8 @@ #define D_JSON_FLOWRATEMETER_VALUE_AVG "average" #define D_JSON_FLOWRATEMETER_VALUE_RAW "raw" + + #ifdef USE_WEBSERVER const char HTTP_SNS_FLOWRATEMETER[] PROGMEM = "{s}" D_FLOWRATEMETER_NAME "-%d{m}%*_f %s{e}" @@ -54,7 +52,9 @@ volatile uint32_t flowratemeter_last_irq[MAX_FLOWRATEMETER] = {0}; bool flowratemeter_valuesread = false; bool flowratemeter_raw_value = false; -void IRAM_ATTR FlowMeterIR(uint16_t irq) + + +void IRAM_ATTR FlowRateMeterIR(uint16_t irq) { uint32_t time = micros(); #if defined(ESP8266) @@ -72,16 +72,16 @@ void IRAM_ATTR FlowMeterIR(uint16_t irq) } } // GPIO_STATUS is always 0 (?), so can only determine the IR source using this way -void IRAM_ATTR FlowMeter1IR(void) +void IRAM_ATTR FlowRateMeter1IR(void) { - FlowMeterIR(0); + FlowRateMeterIR(0); } -void IRAM_ATTR FlowMeter2IR(void) +void IRAM_ATTR FlowRateMeter2IR(void) { - FlowMeterIR(1); + FlowRateMeterIR(1); } -void FlowMeterRead(void) +void FlowRateMeterRead(void) { for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { if ((micros() - flowratemeter_last_irq[i]) >= (1000000 / FLOWRATEMETER_MIN_FREQ)) { @@ -98,9 +98,9 @@ void FlowMeterRead(void) } } -void FlowMeterInit(void) +void FlowRateMeterInit(void) { - void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowMeter1IR, FlowMeter2IR}; + void (* irq_service[MAX_FLOWRATEMETER])(void)= {FlowRateMeter1IR, FlowRateMeter2IR}; flowratemeter_valuesread = false; for (uint32_t i = 0; i < MAX_FLOWRATEMETER; i++) { @@ -109,7 +109,7 @@ void FlowMeterInit(void) } } -void FlowMeterShow(bool json) +void FlowRateMeterShow(bool json) { if (json) { ResponseAppend_P(PSTR(",\"" D_FLOWRATEMETER_NAME "\":{\"" D_JSON_FLOWRATEMETER_RATE "\":[")); @@ -140,7 +140,6 @@ void FlowMeterShow(bool json) Settings->SensorBits1.flowratemeter_unit ? D_UNIT_CUBICMETER_PER_HOUR : D_UNIT_LITER_PER_MINUTE ); #endif // USE_WEBSERVER - } } } @@ -154,8 +153,6 @@ void FlowMeterShow(bool json) } } - - /*********************************************************************************************\ * Supported commands for Sensor96: * @@ -179,8 +176,7 @@ void FlowMeterShow(bool json) * new = M / (c * D) = 83.42 / (1 * 254.39) = 0.328 * Cmd: Sensor96 x 328 \*********************************************************************************************/ - -bool FlowMeterCommand(void) { +bool FlowRateMeterCommand(void) { bool show_parms = true; char argument[XdrvMailbox.data_len]; @@ -246,25 +242,24 @@ bool Xsns96(uint8_t function) if (PinUsed(GPIO_FLOWRATEMETER_IN, GPIO_ANY)) { switch (function) { case FUNC_INIT: - FlowMeterInit(); + FlowRateMeterInit(); break; case FUNC_EVERY_250_MSECOND: - FlowMeterRead(); + FlowRateMeterRead(); break; case FUNC_COMMAND_SENSOR: if (XSNS_96 == XdrvMailbox.index) { - result = FlowMeterCommand(); + result = FlowRateMeterCommand(); } break; case FUNC_JSON_APPEND: - FlowMeterShow(true); + FlowRateMeterShow(true); break; #ifdef USE_WEBSERVER case FUNC_WEB_SENSOR: - FlowMeterShow(false); + FlowRateMeterShow(false); break; #endif // USE_WEBSERVER - } } return result; From 7acead02f202a985e6154cd8294829c4e49c2d15 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 27 Apr 2022 17:55:14 +0200 Subject: [PATCH 098/376] ArduinoIDE removed --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index aad266191..59d85d472 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ![Tasmota logo](/tools/logo/TASMOTA_FullLogo_Vector.svg) Alternative firmware for [ESP8266](https://en.wikipedia.org/wiki/ESP8266) and [ESP32](https://en.wikipedia.org/wiki/ESP32) based devices with **easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX**. -_Written for PlatformIO with limited support for Arduino IDE._ +_Written for PlatformIO._ [![GitHub version](https://img.shields.io/github/release/arendst/Tasmota.svg)](http://ota.tasmota.com/tasmota/release) [![GitHub download](https://img.shields.io/github/downloads/arendst/Tasmota/total.svg)](https://github.com/arendst/Tasmota/releases/latest) From 79c171892beef3a04ba85407157e04ddab40a89c Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 27 Apr 2022 18:11:34 +0200 Subject: [PATCH 099/376] Berry fix wrong solidification of class name --- lib/libesp32/berry/src/be_solidifylib.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry/src/be_solidifylib.c b/lib/libesp32/berry/src/be_solidifylib.c index aa030e263..c7d614dbe 100644 --- a/lib/libesp32/berry/src/be_solidifylib.c +++ b/lib/libesp32/berry/src/be_solidifylib.c @@ -511,7 +511,7 @@ static void m_solidify_subclass(bvm *vm, bbool str_literal, bclass *cl, int buil size_t id_len = toidentifier_length(class_name); char id_buf[id_len]; toidentifier(id_buf, class_name); - logfmt(" &be_const_str_%s,\n", id_buf); + logfmt(" (bstring*) &be_const_str_%s\n", id_buf); } else { size_t id_len = toliteral_length(class_name); char id_buf[id_len]; From d3e55ad43e70043120830ca1d245365ce55f0782 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 27 Apr 2022 18:16:15 +0200 Subject: [PATCH 100/376] Berry solidification of the partition core engine --- lib/libesp32/berry/default/be_modtab.c | 2 + lib/libesp32/berry/generate/be_const_strtab.h | 62 + .../berry/generate/be_const_strtab_def.h | 2417 +++++++++-------- .../berry_tasmota/src/be_partition_module.c | 2085 ++++++++++++++ .../src/embedded/partition_embedded.be | 567 ++++ 5 files changed, 3971 insertions(+), 1162 deletions(-) create mode 100644 lib/libesp32/berry_tasmota/src/be_partition_module.c create mode 100644 lib/libesp32/berry_tasmota/src/embedded/partition_embedded.be diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index 000e36881..3c8560ce8 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -46,6 +46,7 @@ be_extern_native_module(hue_ntv); be_extern_native_module(hue_bridge); be_extern_native_module(uuid); be_extern_native_module(animate); +be_extern_native_module(partition); #ifdef USE_LVGL be_extern_native_module(lv); be_extern_native_module(lv_extra); @@ -146,6 +147,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { &be_native_module(webserver), #endif // USE_WEBSERVER &be_native_module(flash), + &be_native_module(partition), /* user-defined modules register end */ NULL /* do not remove */ diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index d4c016e07..332f57979 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -1,4 +1,6 @@ extern const bcstring be_const_str_; +extern const bcstring be_const_str_00; +extern const bcstring be_const_str_AA50; extern const bcstring be_const_str_AES_GCM; extern const bcstring be_const_str_ALIGN_BOTTOM_MID; extern const bcstring be_const_str_ALIGN_LEFT_MID; @@ -16,6 +18,7 @@ extern const bcstring be_const_str_Auto_X2Dconfiguration; extern const bcstring be_const_str_BECDFE; extern const bcstring be_const_str_BLE; extern const bcstring be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20; +extern const bcstring be_const_str_BRY_X3A_X20Exception_X3E_X20_X27; extern const bcstring be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s; extern const bcstring be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function; extern const bcstring be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29; @@ -50,12 +53,14 @@ extern const bcstring be_const_str_COLOR_BLACK; extern const bcstring be_const_str_COLOR_WHITE; extern const bcstring be_const_str_CT; extern const bcstring be_const_str_DIMMER; +extern const bcstring be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF; extern const bcstring be_const_str_EC_C25519; extern const bcstring be_const_str_EVENT_DELETE; extern const bcstring be_const_str_EVENT_DRAW_MAIN; extern const bcstring be_const_str_EVENT_DRAW_PART_BEGIN; extern const bcstring be_const_str_EVENT_DRAW_PART_END; extern const bcstring be_const_str_EXTERNAL_I2S; +extern const bcstring be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF; extern const bcstring be_const_str_False; extern const bcstring be_const_str_GET; extern const bcstring be_const_str_HTTP_GET; @@ -64,17 +69,22 @@ extern const bcstring be_const_str_I2C_Driver; extern const bcstring be_const_str_I2C_X3A; extern const bcstring be_const_str_INTERNAL_DAC; extern const bcstring be_const_str_INTERNAL_PDM; +extern const bcstring be_const_str_Invalid_X20ota_X20partition_X20number; extern const bcstring be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback; extern const bcstring be_const_str_Leds; extern const bcstring be_const_str_MAX_RMT; extern const bcstring be_const_str_MD5; extern const bcstring be_const_str_MI32; +extern const bcstring be_const_str_No_X20SPIFFS_X20partition_X20found; extern const bcstring be_const_str_None; extern const bcstring be_const_str_OPTION_A; extern const bcstring be_const_str_OneWire; extern const bcstring be_const_str_PART_MAIN; extern const bcstring be_const_str_POST; extern const bcstring be_const_str_Parameter_X20error; +extern const bcstring be_const_str_Partition; +extern const bcstring be_const_str_Partition_info; +extern const bcstring be_const_str_Partition_otadata; extern const bcstring be_const_str_RELAY; extern const bcstring be_const_str_RES_OK; extern const bcstring be_const_str_RGB; @@ -111,6 +121,7 @@ extern const bcstring be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X extern const bcstring be_const_str_TASMOTA; extern const bcstring be_const_str_Tasmota; extern const bcstring be_const_str_Tele; +extern const bcstring be_const_str_Too_X20many_X20partiition_X20slots; extern const bcstring be_const_str_Trigger; extern const bcstring be_const_str_True; extern const bcstring be_const_str_Unknown; @@ -120,7 +131,10 @@ extern const bcstring be_const_str_WS2812_GRB; extern const bcstring be_const_str_Wire; extern const bcstring be_const_str__; extern const bcstring be_const_str__X0A; +extern const bcstring be_const_str__X0A_X29_X3E; extern const bcstring be_const_str__X20; +extern const bcstring be_const_str__X20_X20; +extern const bcstring be_const_str__X20_X28; extern const bcstring be_const_str__X21_X3D; extern const bcstring be_const_str__X21_X3D_X3D; extern const bcstring be_const_str__X22; @@ -138,7 +152,9 @@ extern const bcstring be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_ extern const bcstring be_const_str__X25s_X2Eautoconf; extern const bcstring be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B; extern const bcstring be_const_str__X26lt_X3BNone_X26gt_X3B; +extern const bcstring be_const_str__X27_X20_X2D_X20; extern const bcstring be_const_str__X28_X29; +extern const bcstring be_const_str__X29; extern const bcstring be_const_str__X2A; extern const bcstring be_const_str__X2B; extern const bcstring be_const_str__X2C; @@ -172,6 +188,9 @@ extern const bcstring be_const_str__X3C_X3D; extern const bcstring be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E; extern const bcstring be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E; extern const bcstring be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E; +extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A; +extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E; +extern const bcstring be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E; extern const bcstring be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29; extern const bcstring be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E; extern const bcstring be_const_str__X3Clambda_X3E; @@ -195,6 +214,7 @@ extern const bcstring be_const_str__X3E_X3D; extern const bcstring be_const_str__X3F; extern const bcstring be_const_str__X5B; extern const bcstring be_const_str__X5D; +extern const bcstring be_const_str__X5D_X2C_X0A_X20_X20; extern const bcstring be_const_str__X7B; extern const bcstring be_const_str__X7B_X7D; extern const bcstring be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D; @@ -240,10 +260,12 @@ extern const bcstring be_const_str__settings_ptr; extern const bcstring be_const_str__splash; extern const bcstring be_const_str__t; extern const bcstring be_const_str__timers; +extern const bcstring be_const_str__validate; extern const bcstring be_const_str__write; extern const bcstring be_const_str_a; extern const bcstring be_const_str_abs; extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_active_otadata; extern const bcstring be_const_str_add; extern const bcstring be_const_str_add_anim; extern const bcstring be_const_str_add_cb_event_closure; @@ -264,6 +286,7 @@ extern const bcstring be_const_str_allocated; extern const bcstring be_const_str_alternate; extern const bcstring be_const_str_animate; extern const bcstring be_const_str_animators; +extern const bcstring be_const_str_app; extern const bcstring be_const_str_arc_dsc; extern const bcstring be_const_str_arch; extern const bcstring be_const_str_area; @@ -353,11 +376,15 @@ extern const bcstring be_const_str_content_stop; extern const bcstring be_const_str_continue; extern const bcstring be_const_str_coord_arr; extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_coredump; extern const bcstring be_const_str_cos; extern const bcstring be_const_str_cosh; extern const bcstring be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus; extern const bcstring be_const_str_count; extern const bcstring be_const_str_counters; +extern const bcstring be_const_str_crc32_ota_seq; +extern const bcstring be_const_str_crc32_table; +extern const bcstring be_const_str_crc32_update; extern const bcstring be_const_str_create_custom_widget; extern const bcstring be_const_str_create_matrix; extern const bcstring be_const_str_create_segment; @@ -366,6 +393,7 @@ extern const bcstring be_const_str_ctor; extern const bcstring be_const_str_ctypes_bytes; extern const bcstring be_const_str_ctypes_bytes_dyn; extern const bcstring be_const_str_dac_voltage; +extern const bcstring be_const_str_data; extern const bcstring be_const_str_day; extern const bcstring be_const_str_debug; extern const bcstring be_const_str_decode; @@ -403,6 +431,7 @@ extern const bcstring be_const_str_driver_name; extern const bcstring be_const_str_dump; extern const bcstring be_const_str_duration; extern const bcstring be_const_str_editable; +extern const bcstring be_const_str_efuse_em; extern const bcstring be_const_str_elements_X20must_X20be_X20a_X20lv_point; extern const bcstring be_const_str_elif; extern const bcstring be_const_str_else; @@ -413,6 +442,7 @@ extern const bcstring be_const_str_energy_struct; extern const bcstring be_const_str_engine; extern const bcstring be_const_str_erase; extern const bcstring be_const_str_escape; +extern const bcstring be_const_str_esphttpd; extern const bcstring be_const_str_eth; extern const bcstring be_const_str_event; extern const bcstring be_const_str_event_cb; @@ -428,9 +458,11 @@ extern const bcstring be_const_str_exec_tele; extern const bcstring be_const_str_exists; extern const bcstring be_const_str_exp; extern const bcstring be_const_str_f; +extern const bcstring be_const_str_factory; extern const bcstring be_const_str_false; extern const bcstring be_const_str_fast_loop; extern const bcstring be_const_str_fast_loop_enabled; +extern const bcstring be_const_str_fat; extern const bcstring be_const_str_file; extern const bcstring be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27; extern const bcstring be_const_str_files; @@ -438,6 +470,8 @@ extern const bcstring be_const_str_find; extern const bcstring be_const_str_find_key_i; extern const bcstring be_const_str_find_op; extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_flags; +extern const bcstring be_const_str_flash; extern const bcstring be_const_str_floor; extern const bcstring be_const_str_flush; extern const bcstring be_const_str_font_embedded; @@ -460,6 +494,7 @@ extern const bcstring be_const_str_gc; extern const bcstring be_const_str_gen_cb; extern const bcstring be_const_str_get; extern const bcstring be_const_str_get_MAC; +extern const bcstring be_const_str_get_active; extern const bcstring be_const_str_get_alternate; extern const bcstring be_const_str_get_aps_voltage; extern const bcstring be_const_str_get_bat_charge_current; @@ -476,12 +511,14 @@ extern const bcstring be_const_str_get_event_cb; extern const bcstring be_const_str_get_free_heap; extern const bcstring be_const_str_get_height; extern const bcstring be_const_str_get_hor_res; +extern const bcstring be_const_str_get_image_size; extern const bcstring be_const_str_get_input_power_status; extern const bcstring be_const_str_get_light; extern const bcstring be_const_str_get_log; extern const bcstring be_const_str_get_name; extern const bcstring be_const_str_get_object_from_ptr; extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_get_ota_slot; extern const bcstring be_const_str_get_percentage; extern const bcstring be_const_str_get_pixel_color; extern const bcstring be_const_str_get_power; @@ -540,12 +577,16 @@ extern const bcstring be_const_str_int64; extern const bcstring be_const_str_internal_error; extern const bcstring be_const_str_introspect; extern const bcstring be_const_str_invalid_X20GPIO_X20number; +extern const bcstring be_const_str_invalid_X20magic_X20number_X20_X2502X; extern const bcstring be_const_str_invalidate; +extern const bcstring be_const_str_invalidate_spiffs; extern const bcstring be_const_str_io_error; extern const bcstring be_const_str_ip; extern const bcstring be_const_str_is_dirty; extern const bcstring be_const_str_is_first_time; +extern const bcstring be_const_str_is_ota; extern const bcstring be_const_str_is_running; +extern const bcstring be_const_str_is_spiffs; extern const bcstring be_const_str_isinstance; extern const bcstring be_const_str_ismethod; extern const bcstring be_const_str_isnan; @@ -575,6 +616,7 @@ extern const bcstring be_const_str_list_handlers; extern const bcstring be_const_str_listdir; extern const bcstring be_const_str_load; extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_load_otadata; extern const bcstring be_const_str_load_templates; extern const bcstring be_const_str_local; extern const bcstring be_const_str_log; @@ -610,6 +652,8 @@ extern const bcstring be_const_str_manuf; extern const bcstring be_const_str_map; extern const bcstring be_const_str_math; extern const bcstring be_const_str_matrix; +extern const bcstring be_const_str_maxota; +extern const bcstring be_const_str_md5; extern const bcstring be_const_str_member; extern const bcstring be_const_str_members; extern const bcstring be_const_str_memory; @@ -631,6 +675,8 @@ extern const bcstring be_const_str_no_X20more_X20RMT_X20channel_X20available; extern const bcstring be_const_str_now; extern const bcstring be_const_str_null_cb; extern const bcstring be_const_str_number; +extern const bcstring be_const_str_nvs; +extern const bcstring be_const_str_nvskeys; extern const bcstring be_const_str_o; extern const bcstring be_const_str_obj; extern const bcstring be_const_str_obj_class_create_obj; @@ -641,12 +687,17 @@ extern const bcstring be_const_str_on; extern const bcstring be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E; extern const bcstring be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E; extern const bcstring be_const_str_open; +extern const bcstring be_const_str_ota; +extern const bcstring be_const_str_ota_max; +extern const bcstring be_const_str_otadata; extern const bcstring be_const_str_out_X20of_X20range; extern const bcstring be_const_str_p1; extern const bcstring be_const_str_p2; extern const bcstring be_const_str_page_autoconf_ctl; extern const bcstring be_const_str_page_autoconf_mgr; extern const bcstring be_const_str_param; +extern const bcstring be_const_str_parse; +extern const bcstring be_const_str_partition; extern const bcstring be_const_str_path; extern const bcstring be_const_str_pc; extern const bcstring be_const_str_pc_abs; @@ -655,6 +706,7 @@ extern const bcstring be_const_str_pct; extern const bcstring be_const_str_percentage; extern const bcstring be_const_str_persist; extern const bcstring be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map; +extern const bcstring be_const_str_phy; extern const bcstring be_const_str_pi; extern const bcstring be_const_str_pin; extern const bcstring be_const_str_pin_mode; @@ -683,6 +735,7 @@ extern const bcstring be_const_str_rad; extern const bcstring be_const_str_raise; extern const bcstring be_const_str_rand; extern const bcstring be_const_str_range; +extern const bcstring be_const_str_raw; extern const bcstring be_const_str_read; extern const bcstring be_const_str_read12; extern const bcstring be_const_str_read13; @@ -710,6 +763,7 @@ extern const bcstring be_const_str_remove_driver; extern const bcstring be_const_str_remove_light; extern const bcstring be_const_str_remove_rule; extern const bcstring be_const_str_remove_timer; +extern const bcstring be_const_str_remove_trailing_zeroes; extern const bcstring be_const_str_reset; extern const bcstring be_const_str_reset_search; extern const bcstring be_const_str_resize; @@ -748,9 +802,12 @@ extern const bcstring be_const_str_seg7_font; extern const bcstring be_const_str_select; extern const bcstring be_const_str_send; extern const bcstring be_const_str_send_multicast; +extern const bcstring be_const_str_seq0; +extern const bcstring be_const_str_seq1; extern const bcstring be_const_str_serial; extern const bcstring be_const_str_set; extern const bcstring be_const_str_set_MAC; +extern const bcstring be_const_str_set_active; extern const bcstring be_const_str_set_align; extern const bcstring be_const_str_set_alternate; extern const bcstring be_const_str_set_auth; @@ -776,6 +833,7 @@ extern const bcstring be_const_str_set_light; extern const bcstring be_const_str_set_matrix_pixel_color; extern const bcstring be_const_str_set_mode_ct; extern const bcstring be_const_str_set_mode_rgb; +extern const bcstring be_const_str_set_ota_max; extern const bcstring be_const_str_set_percentage; extern const bcstring be_const_str_set_pixel_color; extern const bcstring be_const_str_set_power; @@ -824,7 +882,9 @@ extern const bcstring be_const_str_sin; extern const bcstring be_const_str_sinh; extern const bcstring be_const_str_size; extern const bcstring be_const_str_skip; +extern const bcstring be_const_str_slots; extern const bcstring be_const_str_solidified; +extern const bcstring be_const_str_spiffs; extern const bcstring be_const_str_splash; extern const bcstring be_const_str_splash_init; extern const bcstring be_const_str_splash_remove; @@ -844,6 +904,7 @@ extern const bcstring be_const_str_strip; extern const bcstring be_const_str_strptime; extern const bcstring be_const_str_style_prop_arr; extern const bcstring be_const_str_subscribe; +extern const bcstring be_const_str_subtype; extern const bcstring be_const_str_success; extern const bcstring be_const_str_super; extern const bcstring be_const_str_sys; @@ -858,6 +919,7 @@ extern const bcstring be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20depreca extern const bcstring be_const_str_tasmota_log_reader; extern const bcstring be_const_str_tcpclient; extern const bcstring be_const_str_tele; +extern const bcstring be_const_str_test; extern const bcstring be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function; extern const bcstring be_const_str_time_dump; extern const bcstring be_const_str_time_reached; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 23aceb41b..5d31477c0 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,779 +1,837 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_driver_name); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_autoexec); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_stop); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_editable); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_cb_obj); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_RGBW); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str__X2F_X2Eautoconf); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_write); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_SERIAL_5O1); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_font_embedded); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_INTERNAL_PDM); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_MD5); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_False); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_classname); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_EXTERNAL_I2S); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str__X2A); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_Auto_X2Dconfiguration); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_pc); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_h); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_send_multicast); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_available); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str__settings_def); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, NULL); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_isnan); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, NULL); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_BECDFE); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_add_driver); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_load_templates); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_animate); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_RGB); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_get_input_power_status); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_begin); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_AES_GCM); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_get_bri); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_assign_rmt); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_load_freetype_font); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_class_init_obj); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_every_second); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_get_alternate); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_arc_dsc); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str___lower__); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_EVENT_DELETE); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_POST); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

RSjE~EVzmgbdDUDN>dUnV}nnQg3 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⪼#+lsaoK*8y>IG(9;M7=!E0=-5p~hEJX$2fqH>WepR*x= zzPZL~u`>KN5md1`NI8$z(KBo6M!Tce%%U zlltr?d`%jW)->yJTdjyYZ$eV}=3|zxfFky zaz~Kaa<-~fxGrwA30S3Zi=Ymzdb3%_*JA(HI`4a*@fc6{=5$1wgdt?y+w4o_cej5T zql{JR2f*bsez=0HhXReZ=$T}fTer`wSK`&bvA7|#h;(0ZHNH?AxuuP)bnqPXI-k;~ zIYxfN#Ltjt-pJGF)ugdahzB}mmDbnM*?hTl?IKwfh;f*=7*&lqPM!IK|7NhvpC@nS zCbk@V>mO88HtBy`fKkxts;}XT11-)He%S7bPwebYL1c4w+H4v7Mg?2Ro!n%a zj}7yqb9uj{1DJ#+D>z5MBX65$i)&l`7XIDP6|Q$PR%B0>*8MUfITrqmXa_%Z^<>x3 zLzCsnYFi?3GgXfIcZloW)sy*q4^5`^XnjlW&fKSRF6R7R{zjv@-;A77IhHy^pRh3> zy+s@?N^?sLzt8ywJLywexsW9Ni#A$+yQd<@jraqiOY&T?N@Am4dPI-iMnZvP?1SCM zF&*7a!RoX6mmL2NXnrSS#kMJ?2t?dCoRDfgd15!ELB$u2908SbpO5oX^54WMMd_OQ zn+yECc%A%H!h9Ka{!iZ}+eEe-@GTMmr;RL+^&xIf8tCOD1Na&`1mk5Z$Kc{7OmOEG zIAOGB)NcZ9$5gkhjzfOu?KTwbV2@2ZMdfM{aqU#)>m5suMcH{MyAFj{q+9SJQ#{?< zc#QXj=~D^@!s;JuhqiM*HlWroM;4MOSpAiGQ!4v8l#*-z1C(ZCoCd|b{Z=S^>Cd59 zuL$0|54*~2)q?0pT-#cE(f|+X>K{9M=^8xWpt*cvPvJso#Hh@PNht`^Q~e~iN}EUd zl3OtZH~t($Tr22oU>YozlG|F1HesCp?Z3t zR=uo2wHMwB)%@Dep=LD+UO}a`@ee~Qs;{rOn&XHFoUaq4l}N?7iP)xKZSX& z2d4D}4Q2q@>3jRW)bn$gjsNOxeb&=Ig$YlUD2>v_XEdl1ym@<}+E@M@s`F$oR3iNh zYDY(l2G#jn4JwbdSAklJorEs<%Fm(39qWZ!^2E=eA`)GL8aEG60cQ~@MedhgsIFx{ zhgx-@7pisc&!Bd6bZAhk9@U`Qm);81{0Ge@pjrgjJXR}s@2M^nX-Vln9-S(gGw2Ap ztk2bNwBNnz7s!Qj){4Bg?^^UNazG0W@8P4I()T7~4HstIX#cqAjNPudD{|{fBi_QZ3UPMsN ztJs(xFTY1)Dfb@2U(ng=&*FD4Vj5Q*uJBCeF1=CQoSdxBik()`v51R3>MH9)ghdq{ zb2#LaE4dEc;Bzq;+Xjyhct0pS4UPpA?*sm!$0=R6(*67!J7A}TcDmMv+`--NKaBt9 z{bN4<-*o6u?@76avKn1Ef_`7;6V zcUec}!)wk2v>A-n^)Kt*glO689~WJEBm3LrvEazm%P)2HZ(kF8B-Z}s!d*gpev|Ti zE-|L?Key^8k61Q#8)E*^D`X;>~LYEbq==sZlCPHiR+v*Y57%jp> z`K@N1+CO^Lm)zWA^8#HAnBEF|0%$0zi1Cw+cIl3bx(#;MFi-foeDe^0xVl~;^BQ)D%E)xx+-UdJws-So zp773m^HzWO<;r5Q!q~2(XF52~*|D=I7x@M^+6(I$1?EnRd)2g^?ygzvWWf0@%?hnZ z$`uCF-nr8G@&$E`_|hNF>hWzf65AB&)zcZ+7HtwnMOD|2c7N>M1CJP$vQzXM?)f&r zr}u4Fq zk1PDF$f?trUK&I86r~i!+D&cs-L_Yw0!5>!W!KrnXmK|5(h~fN$}Gh`RKwovSFr~h z)pIU=tcra{K*QaL+_s|~euEQQ0hQJABFedsi#FIPcWC>ZYWuK8pI~^&zFxf2ISnss zY3XTMjG!?9xjW%IwkJ2K_%xATZ_-l=T*GiCq_5F?TUxSyxN}g`@>!Z(1x~kQ?TQPj z3b#(p@tx|lnF?icA)C$I*83;r_-1$7*i+UhOHOF&y0?9gU$L1U@3eh>>5H6X;lrAB z>O7y7I4S2}Ijn5Sy?&#fdZ|6#ZkUSwUb16iBu<3bT=UD`a&f=3EONB8j;@1+ zxh42z^A*Cr=Hb2|T`zWrcyTD<2J&U)#|*o4p6?~4C$jtBg(XGI3TFKZM0 zLMn}D4^4#yuyt^CxlE~u7qpg@n0skxjJM?Mt>kczUR)IQ{A0gtgt+QrZA~4Fzpj0* z5w$qIr#|ld2$^t>2hG9UP~5V0t@{BnxS-=kz8L&+SXZyS<*TDp79U8q-x6FY7!Lq=g%alUX!4zHwUWHJJTL( ze^`W_NJpi2Y!Q_rj58!TM*T^DsqZ(wdk#*nCp`aO!bO*g#DvvHFuC(6p~qGI`Qi_$xlrK+#9GKblB zX*`zt3Q-J`{aw8yMpW>;P}Fy>O^P-4rFt9N<4z8iM=k@BXQ(jJ>@qfaq!k_g+)iHAkeBaO$wp!W~CDXsa zoow3`n!8)r?~3Nx>YMW)&rttbu_YP%ZOpbv);)qKT>ii67EG&<7oJ=b8}K@4Ki_u< zr|s`#r^V-NFPx<6y4C}|8d%^hjYs!fVjL>ncuQYA=fABNgnH`nRJp0Q54vW>11goZ zxQ(n2R^;8<2mI?AeA^{;uKd;?!Z7jcdu5GN=Kc4mtSM_OSr%gTiYZ4jZMz%;ZMnvs z>TKn-ueDqBz8A0H!j~2&dGHU8aZX6H*WzXM8ebC9lKQVFzS)>HV!XsR%gd?r$+z)2 zIH6;G`;Ddzvi(1uO_5PHvOQe7SY{Z6`?@94q?4X0!#)P~66BO`B6uRtz{&z2hWBhbE zS^s?H!}K}4>6-L(nXXop_;!QzZ5erh*5aD3Rf|&Jc73+^Xk`YV^CW0&y84i~S;q76t%IjGxBpxl7%5+LgBbtb#LFIw5iLe$+1Do`;{c8JedKU$s zX}ZZ;iT2%OT==^3q=?+T2Aovu?gtGaBxq>D>;(iCks=-uTUe{hrMpA*yOEiz)6gJF*OQGG#AJPV7P9af zAJ+5m@TZ=L6TV1VP)c!SY$ve5Me^srt`-cZ9_pD$~L#rmRv2; zt7R_~>CqCDRpLNfSD?*1&}N3WYP{MCE2G|?$*7;@r_`ej3iS=jlSX}Djz)dsSXMi0 zoI)eT+tGu!@pio3r;?u8fis#RT&$JSyF6c`!8uxm@+(FIKa*iSej8S4x=QJN>^E+- ze~~Wh%;Yl%H%!}bl)Y=bm;F{HF-X!hmETjqrR(gSc`99lup{sog>vY+uI*wUetUf% zlczr-#p($s^4mRqmd}#H;3u`+7@lk39J|)9-e)dv4r6-*t*)YN_i-hNeWZdbSj$&B z`2=IQZ~ZWMzKmVpZ({zd{r2$*^?js3J;@e>XAL*ZBRj&XRT+@%s_wm%X1s&Lea0?m z-|)z?`*E_Iv<$HaksUgp*w$?-8o+TG!a-lZeq60vD)><6i}?&E`j=%>dmG}mr}=yX zu!dzwry=>XQfb_8>wRk`$!dEiFdhWPmwSEg>V2l-48piXesQ1xXF249=J{fh=W89? zU3tcsQ0n6%zFb5ePRzsmrIn$&4OXgU&X9jI@8p`_oX3v+e1SFD=T{KBN3D8r0YtSzz?nId2;Icq53H8TM5q(P3`$s zrNg(Lr$!Fn`f4Q!p4{|lu>x}yYZCJzJr|-#8MoVcTqa`@pl_3!S_=X8DFEQmZ ze)w{+`` zQ2I4fY=0xOp1o=8GpkFGR#I6o{kJo^aO0*WKedVTnm5XOm;ee2$S z^gRDgJ(uLk<;K^T9`6Icrt1?-eMm@BpX*k6O17AkKZKKF`{?rPDJ>domD37snIhd^ z_u%L6n6nwHQb$|%PT-9gRL>8q3Fq*?J7OFtsOdX0Bn8?36s{$hhi?rpmv@N|9j9ey zeLK+6&jx#ExY_bm_#jc*a1q*(x$jrub8V&gpVpqid zs6K*MXl3mzxtrEU4#{xZwy!&I6H`R+wW2Ocm%OmxpxSfaxg4KGQ2b8tm43+-Pp;AU zn)Q7)a=jKr6z=t7&+5zRAJz4$3@n;G$SuI=|fy;HC)Aw zWt>!C7+8^$%N0zVJIz(sp92>rjNiYm4tvz7;xCsE7{5QI&S$LAMTL9qd6MJ9@9O(FU|CL9x?spdZe^EJnT);JbW3Ka$@Xfru-}2 zoQOPwArsTKICzWF_mlJlYt!plpi1MLhJIf+|%`g-f9hh$^TU0I~Q zJ-z&i2mKYoITD;1aTWJ>gzYKZTgkpP9+&dN$wYBVx-@SQ$LL$Y=-Zr`&Wkl+9~Wir zzw|+HQpC+~3Y+|_mh%W5QM7+CZaSJ~TeXx%~FWC?ISsazgp5j!=ves*D^WM@nYeNNkV58lJ zxguY@yc=*rAQkj9@1QI$-RryJA#bYv5*PSy5aMbXgnIyCo%jqOh&?q()qkr&_OTk# zs8J|x-s@YR%t^-$21akyKeHW_{j2!gO z*n`i1JcHKl-=R_Yu4BHsF2QqEYJlgbvQqN_o8tyE7j;lzMyD%2`xlB@UKp|=#c z%8Y#m;;d^xRP4c-x6V&nVFOik&|oF?w^i3WW%rNu4HtA+3SzCUntHDID1$mhXI80lI3ayNqrcUX zia$#)FJLDJEY~n&A73r>Bdpf(g_qWthj)Yxv}KB2`BPNswE8rT1a_+M55db-;k5J) z-KlDP8K~OU#?_k&hZ5jbPW!4dEMAik6@|OQRLQN%jkWUIjN#^;MPcTWVG-tcjbY|; zV;HjOvhlEbwB`*CD=;i%tUtEj(jTQhK*agVW%kXyO{Hgx*8xtpvbTX!_Lkp_%!FTK zzU|UrnYUQni1nTo-0!&wTa|HiT`*98(>EZMP(GxfhpFblX5z*buyes%xn;3+$w2Gv zT7om1b1YSNRHa3f7s!Jqm?2PdLiYa92z@a;!7D zDg7R8)g2eSYj?{=tL^~Ri2S_T(uKRkbqhDzf1(j7TxeW0Gh{~27YdK!UO9o?tH^D% z3gU<~v%5K*V#B%F7bnD|uxr*&-k84^qox*8?Sek1lU}h!e+<8LgPReGgUCFlfn#K8jI{}+410oUOSuRe`#lv=^EI0 zH0O4{Q8}3bzOA+&&n{A^Z+uO9DAXXN(cIpMR^0MHQ!mc{t!*!x+V&dn^T^6?OaAS+ zxwJ{Ze5eOA$&(I*8bZ@ptYzdIx3sqCe~X!FB>%m&Q)z2Ot+m80orZUqgZBI)!ao|3 z#?FH7L!z#pb{7r#U-DY9N*t@~kR8~!9$Rs9zJvOKCu_UnG)uvh)C3tcL@Dz07n@(1 zOBHE%JtSu!vU>lH@XNKl$H7TO{tr=af_$Azx8(qCua)i_(nZ}cJMnM55@p0oNY*<}`!{(N03x0;@{FDB6{)Zz50 z@mI?KV--8D!r|aVjO?1S5H`{RDTp(kwXFd$82et+ClvEIJ);)5t^u(J6WuDLxL7Nl zjk6udEfrN9a5++G9Q0zVCDtnEt*duAe#@RCW3680d8YE56}i2b$9&iiYlO1jQAU2& zV6Ct1<0;PtQJP$)*p5vDhN@c027A|>hyap6iP1+Goxul?dl8Wzn_g#fVovUwLoJK! ztLuIlw;@Ppwqj1eipFM@q@Bnqrp-X6enSae#Vom<=dlVz?m?EZvB-Z;cdO2?f-!|R zxQtk<tFZF~*I=jjya|y*2-eRk~#$0}#v@}*;z&qXcBJ-B(I#$}*7qj9c!kP`A zX8gE%4#mq>fVc-@tutivR-+DnwD5X8`k#FGJi;pTpAlV(t`Mo7Gb=5yZbt4+Kl-%_ zdX6H)!T4MCkXY;TS?i8M|6nTtA8S23d1DoO%7P_|aV&U`Iu9Q$>(8L@vGnZ1=MEKo zcMc_|3Y^eq;EN)3&3Wb!vQ@x_f-_u3!7&Cc?xv!X-IYQ9g_9m?3F+AlDY%{8;WP6O z(|x2Guady(m0a6k4WB+q&YYaTCi5U7iI1}P&Kt<5q(eR>9nGvu>v72H!s?Q{%k#!v zQtMwiRZQ33Gm~+5K{;|dL8D|}vaTi}Cj3??7)M5W;t_d-w%}GiR;^Y~BoqlMjbsoS zTQ^vDVgA%;o2S~Fs(zsKe1RN8ibd$ojaI(Co)bR(iRP<(Eg{f+P3^4=V%4`Bt!E}v z-M2^cRk%}f>F{nQ*XYYbWl^jbTzWtBD3ez&_@GBkRmLc?th@CBGK}!XzPMRKY?;1q z6h?aMG{tl3g+_+Q+C)#osb-10i%XziLZ_s8y zp5VEVsf9E%7QAAzrl z=YL4am2n=3J%XO@Z+EUppoN@sI0`?|1#!#@Qr5mroVo4&Jw@w65Em4ZVZ$+_?|7yS~8z!dIPiA9=Wp_^`rI zPi}a`2q}djHhSL;i#);if0w~ihWbm;|CzJ}j;ZtDkvjys52D!^aXWif>xAI%3va0M z{I_^{yWEnsc$_M)A8?KaKdTqqA2TT_%)$HrjQg%}YMq^dsLWJf?g7i7?}igC_Hxt{TlTCcJP~K>wi98 zW-T{Yvld97PzW*97l%Un-miEhnRoh;XNbmGRbEE^Pt;udj8@aNm(?_XM0b7uEBhxT z85^*!r@d={4~Yw>3AX6sdL<`~GNOYYnR3(K9gS#EWEIMqk&K?WyB%JOl&7!#D#_p_ z2E&Z?=BVwY(~qpD;~AGrie#KrAE8lIS*;6u=CfjycyP1>vCzsY=-Ndi#Gi3czad>6 z@*Y&Tkf^b^m%+fsxO0WV7igF8!UJENc6!1dpM#z8kLC2tJ?s4^ReWocjruH{ufsNj zGmD#D{UcVjuX$4c#OlR_e5#zwXN}5WWv%OaF=Q7gIP+u=F>IH@R z!T%|jX|Eic!6>S7|4-DDPbY!XwCr@;@T}4=_u|c30{Vw5^nY~ANPJ7>uaX0hX3K^A zXT+zmJa-csEx1L8&Y{-jTO3%GvZhaB&n58t*G4n{27_VWKs6Oa+#9I1gvMlh;Tt?E zN-}nYBpbuCGAH{DH{fqXHRsHO{$`SO)jlZAB&;e5wqw?szt?XO=ZpDi zNr-e~F=Iwp_+9lLScq9)SA7R>o-FJ}$=|2B(yB>vT2=S*{vR8btU>LgSEqF$i`>#R zrbQi*SMk&i8|Bh9^1@kbuHrNxwo0SAbdBvWqdTyg(ZZMqe^_>AJMluJ7W7y zp_mg4Lcek^V&hvkeQ)tfgM~ZdC*$PL_^r;hEnC*0(Yu@Ya*yEigjo}1ti+Kx9iu(; zj!0Df`J~UCEr&L=Wa*Y+4v21#YRQ_od{q^4_b4--bwB%c25A4{G*xtMuNUX1vbT*5 zmeo(nJ6Ee^Ygid$I?iEnn=swuRn^mYpQq%DDm>>w6%NYOt7WVQEUQ;pH7Je$r19f8 ztz7{qD^xrm-3}$Lp1m)ruQ2B6%H7m^=abj@Z3om=HU49}hHtMltpvJQn7UuEeyn|o z+e`2HF@=somMF*>xVwl17eSvP8>>S7^cnFM3y2NpO&8z z<12&Jwl6qi#omFuVn6rBD}l?3j^$V4am0I53PP+c#|C$?8qTx?Eq?=tEJ6w{^E|7~ z7Ol5oR%Q6C)Wdvx(V1zZ9l&-pTE$j1QKQ!Wq#1seT6wDt*2=YX{FmIo{0uwpg-Qn5 z^(bux^%`K1t-nS_W@s&)Z^Z6b>3ML!RcL6j{=l>6xN(_QQ;`VWgK85SMAI@);f8vX zaq+V_D^RG*8n3mW3R!UI%#HmFfeIxA`H4TM~U3BX>6xBD0}PaCdax zxAv|70vD>!o*2SlWifW#HSM|Rf|w6Q*`GdMhmX=-U|;fjq&R0bA^n8@#S z?ztn{?tXsXKa@N7o`?5&pZ7WEecq1>@Q7N1EhgR7HWqOa*p#p~mqx2abZk0~Bp$IM zVEfDbs{HR=ZBdARoPI9L%#8?UgfQh`SfDXNcJSaxvu*S=c)VeKD!Ze(t-&(Jqes|w zOk;9X<(SQRc3yS%I2|!Fs^qA$mU!JZ)w)#*cy}&q%JdqxDw)!whO&)-+^^AGGmIL+ zLT5Fi2mD_LXBgGP(6Xx2hG=-oKG4G$%I;^kxcL{a63$l|RhfXuAvLrYqn`WQw7#sF z!hIo(p)v>F{$||F>@0X^*6;x0W9Eu8Z99Tt>0l_kAwvug$*iz|wR5CxbTFX547vyG zG6fj#l__B`I8?T}7n-MaVF9UZG6wmp6a%E)-dLOkn@t@JaaJpTXxT{ z`)wXXB%;HPKV$#V$%p1)*S^UV1PdjaU~&(?Q14%(`C(}p!SKQ||7y(-WNtEV&!uq= zII3wA8)@s_P~3`ZvHvlyoSIsAa^4rLaI1{fkh0X0bqSgHgCu6K#KCXPVcJjheMC+V z+{PAr|2W?mlfzGc2iEQm<{elkA0hbJej7i*!jKU7wa^h}*2RYzt6jlISaybMZB1>) zQ2)KbmtC4!+Jf2utr~rPPV*IP{3M(#KD6Y25!Xpt`L<#DnTX#nQ5`p&a>L=sTg+OT z5=q1a`UduwwXleV#pA?db1XVg0ysIWwpE?9bi*sC7G$qceL)Q5* zDwXc->$l=wiUjsmD(4lv3D&)>zG;Y7h2U8$KZi$JhWkm~>g>ykkBYb*sxacQVA$Cj zN}gA4Bu~y3dQXRK%nsCi^BRY!?>85$Gn6&JE2+Qs{%1+u{a^2YcIC$XUtc|q(!qC? z4qoc1%pTr2-$LkFIxm&o%HpZo#HRWUNoiB(Cl>tZLRQ!~)fojO+oZ2$-JGGURZGsn zyS@a=UxLxUbc=}19(j!0iG3ZvT&nAR)!i!gAFYv7kHTYQPGV$IQ{vFpen`JLh@EkS^rqtpPPQv_@yU$NIt2Nr?&id)O*6MF~q=x=`Fm32a79U}3O5j9{$wrwi#SRH*md8hLXWo|W~P`kkm z%!L;Y@t{Yqca|M+N7(@=JHQjTtZ}cUj}rr#<48s{wvLBK-NaeQ9w)5~ zpAMg z?#s+W$!wbot&m$2`Mv%T3aRfBg;Z!JHwA91N;Ul3cwT`B4&n@*Q>Bt&IEHLaNiM!) zAZ|R&LnA98_n^33ycFj*v;M&}i~!MO+k2SEP~jRfmnl|bCG1e$6fSlthz+6c%?P}64Vedy zBO}%D_tu-FT~F&u&-TKrp4d}tQk{oLKH_KXk;f|>8QOxL+hUzHX58`3x?n~@d|Jrp zJ0dj4!keMT((Gb{HOTs6XLkapktaQ3im3E&GQ&rTVkS}Eg$)f^78Vph&L?jZ{bo2! zaU#@Jis4BabLq@wN~>cTlUN^Vg2qDC&8TOth|oFLmHUVsN|NXRtL~Vg%%^&6pE_Q}DbtC~iU~ z6Q|5HcDZ{~!yBEAwgz}KHbgK5t@sVw10tJ8yygq~r;szEUbwack$9uZ{J-zI<;<^+ z?_lcOL*>yX?k8G(V6V#%v<15*@^&FlSp}Y7MI;%*RShF?=_N>gR7)d4>f1|jL{>@k z7W&n{kL(S$(G4o+r)2Mv?wV4)#Jv;~HfaA%E0*LT9@JXI8B;BXy<>TyqF!DH8&`IX zx5N}edLZ>sv76pZYgJKoY9lNHrQR}2$Vn~3vzwOW{+@TlUBoPgbj-$D8*Q6%3%=)l zbOw#z(X!m%UDt*%C5On~E!yf(oXl^t7G9xrJX?u(fo*hMnCTT$ctT0#TEv)Ks|%^q zxRiD5G<(+cjC*YjX^e3E7f9id_4c(+g>A=C_!q=EN1LW?Fzj9%`e2!uG#qqCu(tVH z_!W``ocw-5JUxp0hnaD`^*EFDsb;B$4`9@=#jRpk|69GcN{#U<=Aaun7UQy8nc+%d z*+)!#5L27*p77>J%$EG>ZY$gKGuG6%v4_fYgnPqab(_mH8O4zBkc16el!fkltkvDq zSTegLa-nOJiWUBNfc-8{7!b<*D9!^+Q!ZDo8Q#by3oq|ylknTq_T&3;VFyezJ=LO` z+_BCHONk&a zwEf_#D4i6DNrtjH>=Nj4$=Ela#~yGWe~+zUFI)1dkfUK9eSq8+1vNjIlyQ#W8Zbj7 zXC>dwXkO4LA1xSVj(1#FdUbs%hn#-Fnn$P9YUg@}pyyVF?R64$4?Q%K->^hTKhQ|O_feRe z5RQYkg82VZjYOec`^BsDo$m$uj(a}VUQ*Mp{rOcuqy70s+!iv)?o+0qAv&vs^% zon*%WUG1pM4R1pxKnq6Njr?2^hJ|M;MdHCuWX{i#R(6$_WUXBx^Q;sC!yF<5g&nn+ zqK=0}HKj@K2-}EYHJh^M(%Z}g?Azi}?EexCG*5|j4s9!+w&k^L%f8$c@jG2`u=@A4 z2j6FB>O%e&><;;CN_;7^SezjgF60c+l`NzawBBQ+2ikgb%rw!mgu>{5l2G)IB50q| z*j!sG%lci*dPUsH7+K%XKxV!GUh=uOY)QjegOXS1Yd*KmsbQ^Yb>CR^xbHvA>g%df z#oP)-m%=uBhK-yHVr#_r6$+)ogv=+n-?6j@W>(?1&{c3Td9J)LMY+Aiqr+JdC7%^n z-C0Mb!Y`)pm!5pnGQX?!W`$w{m*HuelXl8`s>jWZIHq_-p3%&fm^^=E*exC82g3tY zZY2C$R(oL9js82RW-5`5>-Yd377uV~ItH4}&L8^UMTe)EuYRFF+?1MDdl7kR1TmgH zYb2aJ;&kJ=*eq;pWz^=Cr(I%TMA3;$P6EE#g)$6@k4PLS?iYwK3+lj%AAALHoDk>(>GX95Y51C)k77TIfl)xG@JY=(4aBk>=ENp?FO$s$9 z8wn2*)~JL{K(SGX>Q0 z+vv89;aQ=5zcOykX(rZzbqt-1nwQ}jlWfJUm*K3bifYF;hHbABr-}*LGCkZ+Tk?&G zSA8~x8|}EI;}>iFgH?S8#mVxn!;HNu-??xLMo;4$I8_zZ{26dsQeR8=ORKw8VTh>` zPgvI^PJU0O`w_Hte+=Ds{(tM=cX$2h;d1@^?yN5?*{`g2zz>!7{@QhgxU6?b^_$n2 zO_#6alaibKbnJ$xG^;xCU|~_mMC?I}SJBqEdjqXitVEwy-4q+ zy%}`0H`)iMC37WfV!qw4AT#!nU8ls1T~u@9om|pf1#ryp-^{X17011IM4khqHr6iP z_@sIFhq*CZwjG!)C1z`bs_z}<5#0Yq5q;86IKz6%Eu*maQHZ<)1N+e8&J}@`s@k1B z%M_ZDj7XX>Qz@i2^)}*(=M`?k4wlk84;};@^B>C7EW)duj5?*VC~hL+z*!;~S|^c@ z<2NvI`*tv0G@_qWuYz3?9lsBHK)&v#48ynXh)0a^{3AwaVNKAAzDD00zr#K!?|$Ak z+9roc-c(;oq41#%GJnxe%HMBsJF-4-yQMhOw~Br7c!KQ;L*&qg?J5R3jlRgbv^v6> z2Uec#deJO$4n;@NHhev_ZLXWXXC9*O6R#6J9WcAQ0D0X7Wed}kc-~VATUa8MBDeDu z(A!Eo%r>iruc56}{3P3U7)c+@A81>)pZiOOACvp*fE|kjiMN85GF%P7Sn&gkcnQcD z<^0GwncP!uj<-C3`{1zd@GH+-maC^_>rLCG+`Qo}5#BefLaBy{^v1&bbxQYm5=%s) z4cqs6W29HO1{p4(t<%=IpSOI5n9rmxw^PL_ihJA?mc&+i>o9Bd#sU(5N2+i57V=bS z9GP#cy{~oYVC{y^2 zKVcbI>3GAk z(-PblWX?#wu+108TVBO%O=${mdBajJqBZ0XC3sl`jxsPii2oMYVcbwKqJWBh54z$CA@1(ayr!`k%lHRcJ){3wiWcqUj?O|iGn^Nl# zt2-9uHlL2U-M8%sZO7Np-_DdT<^E6n=XOZUZ_>`Nll|>*^)fuZ{&qYkWq6KiuDpQ^ zrW&i>WEfh5IE`D_rqq~hX8@j~{q5M~)#E$Z-_Dd{l;$rqM72GScEZul_|KNBNgD-n z8;cJ2w~=^2#^)!b4dAm;9*>XWvnha2=)?nazGeCcT9GjrSw@De+T+u=BniSAKX#@ zfLwq7o%O~3`XAp>f45x!Z+F!HSgya9)+hKUSijx>zB}qy%Jp~LQGcIY|3g}z;GJOn zcKtnf)ZZ@GubAW@>%+xsl~~=?24vB(Sx+hqh-Hr~=!y#bZZa15yuKzQ?3x(8x76tM z7Wgy0rDo1LoE252wN=(niW2JgdAPADjObx47I|Oh-X%L}00aI!Wy;+2-A*A-IpE(R zj+P+CeOs$dv`F{kP_;Ue+X_oH>7G#bF1a^^My`=h&awjXd#zfnk-sCC4ZdsCQS$G6 z>37tcNcs0VseI(^@_D~1zm}WEhHxnlhYUUZc#?~^Gh^hIGS@<~VYRcuMl0^VTUlXQ z8!)qhg{*dJkHToI@zfe8x;flPxTJ8_W?@;vc~4MFV|fMMmcSCh&!g^_1Lsxdkf+HF z+5cw-neFA%FXv#+)ZF^qh}wUxd1lR*j<*?df)QyGq}$pP53_BC=o}J}8Z~j3{aY?VR&i&dpmZ{BaH&v-WfA^HyXMTGPWohc)mU$16qu%GL!%D@hAwi$qOzPL8QE z&(+g2aO6co$q$2)PY*@hlw$!(HjG%x3ieQ(i+^VfWkoDG`3jm3+J(|!$WiU446E># zgL!_F;0#tCT>G$x1MFAl3HP2+Otm2Xf3$a0W!_KLr6)&0JN&p;ZLYHD-s%}hW|2Zd zaslufBl5UCBa(apWf`P=`pFuPUi*l)cb;MG8E6gtL%VN%j**bjRt&hRAnS39^^r)@ zMy7IhlVQNa9M1RIm3gLKf3EU}Cft4!>`}fn-za;5uh<8A@s50^+Ja!w;nc)|0sacBg7WzHT@faKU-mabXP?+>pRJuAl z2Occ3c=#7!ON30+Sm6>KCO#c&$NHA&k9+d%r$p<@ba>1Kf3yY`;7)>ps%+9HfwnT2 zLc8h&puIBQa>StnhCh?A1DS_*Ry^KcBv|KW)F8@!55uLLRPevcGV4O_hec+oGA?HX zD_OUo-PzJuNNq9}BJJoq5>+RJFXbq-H6Dx!ZOwKB%77jpUU8D#DFV<7Rx+MJTIBqb zM&O^iG99+9YY8r@vI+D7*kfhbJ++ng2it7GF*oC+0(zL4f?~NUF4+EG;38V?RW-3r zwvp&GMr#GOOL@f3@9f9<>@{(Yzq9=?z8->{#F!CYsaxJTFkzF$T?y?_0OCaC@#q-% zMD~{=Y1#AbTn}fk1c}MQZ*(d;23!2f^aM}^tXGwYvg{=ByT;pv&}#}Zs=%1GXOk>S zlH}CQx6#=r-#&Ld;h^8J=P06f66}#1)|4M9{Qd!5Hv+I2CXoFn0(S%37)ubJENoH_ zr7$G^c4hiO83rOTCbTd)C(yqz^qL}oSDber2*2U)t+JkLWv73hJ1;Wx-2 zMAmvLqzv~!`+;3Z`_j<1F*px^Aio-#O3mxxD)V%MDR2(wQbvyl+I6 zbwz5EwRecHs+$Rni9mJ)w5U~5{lJuR4r@>ctLZGOpa1?R7oNi0b9<|-2Yg@kw|ul@ z8L}}A?vm~;qBh-=(yOSivNnF*gg(&2Uw+*K86miWjwz*-y2%Qnw{0OMU4GU=KM}(qZ-c9qS=@jQ*`Zi2otV9hhgC27c4^W6D1H zS=n_7-uz_#t-^iZ2Fde}y;G~izU7=`7xdS_5qAtEcAuUD0ooC?cS2a{+)Z@29T(Ou zy=t?D;}#RG6rd;3sWO#9ajRUPXj)dttD20vT*70!*89iTZbL|RAVJ%$q;LpoCPjQ< z9AapU(1sl*y8)?3_#x)byXX~YV@Z0CddMO;e?wt6FZvr4+~#E?~e5Ly3_EF zV$0V_YjKdiKnP5%c-;r`I=DhbfObp;6=?u zvtewHwWl}QcBL?<-J+G``=C@o&V3=QQSC}y086OtMK=?9P4$^pM$E18mmI24UBt}j zQ2O(19@+_8LN__B=4cTgSh}y%v+JtI zuMO!W&m*)o9$SNxHDumkU@IVYZEC#*dqP%V|NV|Z#!v1S(dtJfX$84oELB$8AHU6&$@dFs zWZp9sxk_-&Sqid>4Qojp;=XTe^>&uGy3Wi4*2;^j2cKcCC&DJ!*UvMjyUCrx$WKN37ScUMA2O-AMdcEa4DYO+t}@1JV%hwvSD zQuH_2yAzJKf4Cy?w0rX5UU$NgUboFUl6AI{eU8Ywh!l$O& zYiViD8|a(-wU9FvwF{-%o8;QI|NY3ZJDb)V?;vLl>aUUO|MNfA_tAd+?qBzN{3fku z+aIV$`r8yJzxP)?!D`@x9$G`#_n&I`_WY^_V9UQoYa~|PS!0)vU}TSd2K9?$jiLq8C*(^#n*^F_b_kqMpfv$vq1X?411DHaLSc%>fcioNODO+hR zt};+dniUC#LKy~bdtf#emD19N9f8t;J`82B9+2jf_TwubXQ#DH;je?1FKmsvSVb+_ zB`CRyKntXnD9vM@JdfPwz$}t;2;93&1HR3HI)PqSXC_;o;*kN;a@b1#Uo$;Gm%jHw zJBkG_!rGXE5j?)UbT_7Zpfjn3l1h_w_S5oZHCklQm*atX%M|Gs>Wz+L8NQB zyn~kat)^Ow6rX-3av?T+0zP&;R{Ek}VslbzbU{6R<)RB&&vcUp6B;PGLvs7!zPOQf z8|MsDwXwXH+_uoDznPV9VhlQ_EsM z{aJ5}5m_^lP-nOqDPtmXK9elNA8uQQ6HXeH0rotITY`+&MJLF~-ke@zbrEkWL{gM^ zypC1PS>{JCz6#$rB1vg}w$lDE#Rce-Y6#FJH%wH z5^KnQkoXWhwM6a$TxMG(L>LtZ%k{{A4@wn z)F;FLXsrDcQQ{<}Rp2!eS*|>u$*`Y5YqTWs?O&N1Yrm7a$S$gHGz7OW`txb$$vVc# ziW7Xw8F;xWX)FGTa{V|LZ()`YD@m!R=ojVhaq@TM0q99htIKiVR-k&AO+eh03cDm9 z12@@|n&8zZj~5fb9l<+636Ite&yCp6#w3TDU69}EO~Khs(^nUq7dsx?pKSxNRyS3`GSTmG2jxWSj1 zh3oXD^`AwWo50HRe%qNAbi=t{sZvom$98E`J8xdioHGqy`eZ>;qzPH{Mmw4L(_e=@l}d52P*J35 z$r!X1x9o(Q#GiWy`KP%EV!A4YC!G4WxOda!Rx{#$Fe9+#T8tXii3wc(~ z_?&UMLhg0gC^Qn;j<#Dt&cdx)V##vhOsst=EL0$gmU=d5=E=|-wFe;Y6WVvcV?cRB zr@W-~Un#mt{7t4DHnnV#d~p4jif)QlGQ-?xCzp}tS2~bCLZ@n0`Tx*;-4)6z3RnNj zG0)+;c5UEnr*bXE*J1IXYQHl)F`Eb7co9MAbh$hr?O@CRFR!dDjGRs|nII~P=v-7>O|z^>b!B(=2``^vOsPc1qfhC#Gayoz`Ig>P z*a9)3h_#O$5Ip`qyrmEc-xG*J&HRg0(~R9++9zNeB+Yfj_r0n5rnDwQv{IQ?3kxvp zVXHPDbEjF-Q@b`2T?K8&fB7PE*j>0vYbAag=w-g8ClzuRxs>hFRg_xQPD}Y)`bz;q zWw+w$Je&ms&M@kQI+a&N;!HXfxh-lfY~*L%lS*#; z+eLvVaimdeJ)1ohAD<))nakeYdT$hM{~U=U zFti8U7;Sx3dCIxKDi)4q$!{0^{fawKVo}*XdGx+|&QQmgp2J@88y^d-=Z@AscY6=0 zIP6z(w=$mdD}8;O0oF1DPN@99|NTvFTpjm5v`{|wr?uRJBBvYBtP+;*W|1vVm0(Xg zJQ-5-j)7BiC*_PsbS}(Hc9%j>UQ-kvI)raE3SUCc7?|_a}e`;;QE7`Y#lda1oL94ki7u9NhRYC zkMASex}PkMBkq;F&v?_j1pZn0kwK~&-UI8p35Q zBr@0gpnD;u?oI7EWc9C2?d7beSiidaW{TS%u>ewRQp2+E8>`=$+FcW%zz@hAEKFC_ z3mPu?V9qB_A{9rp5Zst9w7_op3gN;2a5e0r?iwN`|7M=%0eE3j7`=OA#3k~M&F$u% z$x;aI(^OUFCvtnIi%KHNBr;6lmrjK?Qu4y-81``#q%Li47>Fwb|8(~AoM&+B2#u86 z`yej(8PmLtqVlBMHaAN__Rx+oRjK~4uInV)3?MohYk#VX?0X}$Pf3!sz1n?}erp1B zZ{&TgHb7m%mfIr>;er!#CQBo$#F>ftKTEV(WMs$vJRRB4B#aD}XcB)^w&T%bq&0hZ z$xhn>jO+Qynkw_OyT{epsU+i)^f7;nXdxahg8zTmCvs+EM9&1ym5T6|YG;aRHbzCI zxFT*o{dlvzPezKdF|+Q)NR?f;=;(T+(d^YiUko@VXnUm5)@lPcDDFLIYt~Gb^l6eW z6*Os@mMV*MK7Rr^wY1mx3+X;nu|CbRGIb&L8l6UD$qs&H_nb!M^3p*U0$yK`rttA9Iiz^kEJ+e1oKful-D*fvx^re|srV8)3 zMrN7AruEmE@;70qMWt+VDNm?+7igw|*J|qwA`rZ%f}bQ#pMs?MR&6BVO&;$(lxmB$ zbHbW<{!8i9TeJhQ5|h3p8i0<0O^^2K(+Gbi44M9`or&&CbKQ^k^zVZIa09NtPUv3X zCT)@(Tj)$>UBS(&EOYMyeugf@taQ#0I_HGY(QPhcTli_c3sQCpQ6lza(&w;k{s{iZ zD{ift{$8}!Ka~IB^AvbOG0a;+?kGf9 z3pt^3PIF=8eqrM+d3_cLgXVICs>z6dd&{rq|MmF-b>zyCLeA~+ZNT{cB`Vw87+oaM z;SO}6{U(fvv!x7&3_O2#SdA`c5EHj{0xP_e!+uWZFIUjam2tUfeQ(rf8&-Ju;5s+$ zYf65~fgy2{#A7KNt_zOV79QK}c%U)Z;fkndLW%v0(iQYD`-wecUWKxO;lU$azEzxv z+b+13`PNa{gky=#(MY_-Y!SB*w6=_~y|CJvkt(cj4Nj|-Z^_Z^WpkqtS)`6laRu|y zy$i(O$*Uk*ZyJ?-q)@V@$_;QS?Pc52p2^8@Z+8?Y3WH(iohYc{xdN4tbwgPL`)}+b zW#ThwX4q9YS{Y$UcaXHQf(Ql|9p2=@on9HwZc){Eh@ECUyGM1-U8C~9f8&NuqlxxI z&7a|UBSqR}w+Z|%rUtjInV!|qSezJ`R{O41e;5*YMo8~g7=k;QC7zY3ep~B}j8y-+ z)(+BtxJMVP)jsOxUxAf>c$9noLeNKOx0+&;d+Mx(1vdy@Uj-ZO5se(tM7e^UtY*3^ z*Q^wNmlISj?O{(|6$UQF=|6~h0yph(fc_7EU2-mfM{ZVdcDXc<$D3AktxwA#+WY2J zKQFzSBb|az?p)b}*=Nd2c%}dK3BBcFu;kOweop?red+1Bvh53z)h~5Z?GVum5&h8J zx}pD5P9RYUmlSIcH9G4gEcc%G(AoAUrKRj@km)GVY^lMW`K+0Ye1=)a*W&cvd_!Kn z*JsQkIL|+oHj9NuD(wVq!8et@U2=|U_vR8lmeOTH8u;qQ2Hq!@)W~Eh3}cASYh?r?K{w-XoOL`0)slvZ3!)KP-?>zXQ_wFh{$|BZ&Mc z3aRg5SXQUcIy&eCyke2F*`*nO`g9>^A>yk|Jhy)oRTnzr3GpjDZ~l7X zPNlJGhTu>}h7t>|j)D7zwj8nwT{jh>GxX+S<5z{EiuXqviALaTO}H=AH{TfQ4foIR z>TAW2r(g?q(mlhs)>~UsT+{2;n@hfjyi7r8Ys%L+OQjk14@)+Ns(a^PU;N;Zl}M)) z^@MKj)GJecq-@29xs7V6vf9kU*@GKK)n6q0_L@$G(zxUqvUdwiNobQ<*kEOAjddPk ziFTJ2T8AfVX_wM?G4&r_P;f-In)KL{N^Z}>ech0Y0*=awSE;mg%CRHTO{4D!fw}Ma z!(B6s1P`k`x9MqU*H7e4`*yyEu7JKq>6QvhiL_*#37b?MIU&MnV@-V4%^u#;s z8Yl3mJAt9!7RSl`v$U>oi&$C*YGyu6zb5w4ueO`A{r+F+dmlun2yc&O132a!z~ns#T#Pnd#o!?67M0=8g3D|9>hzdeHlfy7ZI7i zj}c{fUH`DY=E?MCS?7ArNxsUoH(NVoUG;KCJ=jk7rbe2G?1uQT4eJhkF@7Og)Ju?7 z{K#5b+yQ89-!t&T#%+`BR4%YY93_5wMPA9vWqFMi(VrCajiOa;B%Van@2u=?wUNS@ ziTGL+I-?V^cd2#Xx3UL=7Ff+}e*UCq0VEEAJ-UL}{mamn)l1$FTdl$Hll+#Bz=`D0rhR^jTK?z?PORqcG1bbBp z4*$_g=QwymPH9Uy)?YJPfEK2$z!LDtSiBs1{g#L2IrATNCn=`JX1lWMXZF`woK^}; zO8$}%tWi81$hr4&`sre$A$lTW;EZHHalkk5Qe@p4FS|3+C^*^_jJd{Rh#7$x3JcvI zIW}1Rf6cyC+`yM5*h{S^J$kdgPF;K2t+6a|`-f_7MwG;vebX z=qqxIKTt|H9_#NVGmm07@t+i*wvXfY!v6^Q9wGT+Xg#AtZzNtxu;K9{atER$b2}Ok zg@n-}9?14q#3XUxmx4qG+1d)9NgkFcWCX~qD$$MYBigp1iVd%H5}%M+42hk?Ki%$~ za-Qs>L*S()1a~R;ws*~Le1C{RPT!|-KAafn1P{{IzIftaYThEbuggi6F+@7J2YxN> z>m)xEsgH^eNWG|(<&0L1-E7V%aT+2v{uZ@Y_EcGgzmDd{K&Ex|wWy>}HDssKE{l+{ zy`+{-!@RYeK@Lk%l0oBqF=!sAizbtVAGs>7%Uo7i^ms$--D@^s-MEFIKsB(IhD#ZrpS+=!gB!8WUg z$@?BWDzDzb%BdmL`_?Cqpi~AyIH{XKeLWrsNw#CTz-}qf2mHk!i(mCs2dS z521S>19}NOd!OikW~9u%q~+2?XDfwDuo+e(SGcv#6F5n@O!=IA{_a-G?&zTmF&6_p zluaSy!O9F_5;fn_y3I?57^FLBhRg22u3~0Nz7L#j-tfRvbU0&P0V(9>>!n5#o$=}y zv^Mixltsq&|4<4kgK(Fe1&MDGn4mv)LP8ZnOM6rG#ig_=mKh zcRC+0kogF|M89R;gbabdDy@#qXW2%%f6Q$(q;7j|V>DXD2Jnfyq*goAQw+| zOfLTj;(B^$Z?>mU?>h9}5@!6f>084rVtWYs3NnJzdx@d@Q6`cVf^Z z_7vvBLD*jgAySZNLQY{aN5-%_o(J9W99CdWIP8v>Y>tW*^@`6Dju?W5bFTvXf=Ue+ ziUd2!2qgP?OXWZ@48d7+mF0YUbHPdqbH$?xcHDHNktW8wTQ!fZOlK|J)`oOC7mSAP z>9Ec)E?kRQD0?x6wrYGj00)ymcn7RKCZS$YOTRY5=3op%XQ}z8z?1hTyqjOBp12i} z&@vOUlH&NS3VLRHb7Qj$U^N;jY5Z5WN*@%#aauDJZ7OR{c>s@-G1z@{OQ4}qA|U=QD=b|c2_hUq7! z)4Z3i`fGib~>_qm5GT?2ehIlqpSSu@>LN8h*Qt^IWElM^k+)@?X`YWk^9Pd$0+ z_|fSu)Vi{c{F=M&#BukFip3|UrRSeLa&}t$_FouX(6yUS;aBm~y>B9p<`-uXMHzu* z5M%c&eMaW>vtP7luG&Er`&DjAAdBeSMK`S-j%g*XK{msqzD6e;m;_{A%^B}rqLcys7t8E)1#qE-!#SPNdWW6^c~3O7Qj z4oiAKI(rs%^DTs<1DCses9}`&@%{9d_~!8YW5lf6aEvuTGb8QR+;s{^VwcNNlf5C4 zSX*On|(LCPLn%?`CK#b?-Eey?y?5%J2S?F_vVp5}d6AgcrL*g&frY-YTqZ z9S~ng;1Crn$I2yFJvCO1litka$hUXqnOJyeunu7mKY*68yeW=VSe6c#@wGZ{xY{@> zdj_N^WF<#0gamph9}4ceqhNB0T&iyMM6^39`vJL>aS2LA@}V&(bux}e3v%scVKuZ} zi+!xrE;3$7?J_SyehMC(9~+pb;hqSqkdLU*zy?{f!n#&PxYb|O`V)nd|I>qR8RC_^ z{8aaLlt=#h&cpIM{?D4g*FU!$kbBQcA4Ozg=@XtB6+e>T$fEzpxJTWAuLq>B1>-l} z{)%>`3_F%A=QvXHpf3L){3-W)<$=X&#Gz6(?@6SE1vB54DYODQo+L zLHq3mm(nunB#{;{YrbCl+$mMK&YB*$`3uAQR zG<{(VJRte$Z|;e8AsT%-aJ({Rnkd+o!`@0%mc;nqwfEsxrSM0>RYzLQ{*SqlqWX5f z`{R*m8~pu;I)n)m&5+eKtS$<_m}SOH-0Qqm;%#T%_yetJbAQ}Mp{>{(;DNpGkvJ2s zAjgMU&?GrN9GR2gwy3&vv5cfy7FhL7_sr4Qx{(vfD5j z*TPo%tzrwLrRI?-t~0f)uB&^X@EZJ?d7jG{1ljquca=*!X^X-Z_?YmpKb2Zc{Oc}j z+zVZbI7^oz>I(Q1+?qE344#wIt>}Vpz=fY^E$*+RE%GjK+Eu)73P&VJue+P2eAyvn zaIGEtB4S2MzsZe^+_Zv4jC{O}c9|G=yF~PH!EmFk&a^YycMoetdMU{%{`RTq~J0 zZ?ZY62ItqeWGx`C!y$~mRi6ww=?p|Ap}#N7t8st2yl?Xd&_|0J`N21TOLx7xgP4y? zz{a85*r)|I>I1k)W)cq5kt|M5mdCVsX5gtT`6c;XX437a>47J2Qs@lu4iX*~X9vzp z!LB#&`GWS&e*$=#5ceG(P4b(60-mqcX55Fqk|D&KzH=Hxc`!NTww@f>M&-}_@5%;J z9@J=u?d9!~(T_`<@4o7Ny8=A5xJ%|=GQW(?&PyWqi=yIpxUovRecAi%C(>VO?=Zax z2~~Jh3?zV$#4A6W0xS1dxRJHJZrs-7b77u)8=`!Vt?h;MZW%1G4z+6sk2A#VVr+O9 zzYFITuUSIhzxMz)0_E`Auyq%t52Wn8`;%+ioB!}#`-l1d+Yy|~h}5iXMmuxQg!oI? zr}3|yc{dhvTip1~F9^TepbWf+#Ptv4UHTwl`35C;rYf8xRYLj(CE-`eooNicHAysN zj2dBqQI>#n(0YH{J7C0hONPhoG)XT$+ZS}qF`4WjdclJE@OPp$mQotai|cB3UR1#2ig{1B#n+4N6RJ7 zcNft;1Rgtx_{722BiRIRMr5?vU35~lPIU;U+eKu57B-w=^oLewYOIlmUPB&kby!}m z-+AU1nc*<2e?#l70(dhZE3zlgI>-cW&_Ob9gjod}Je;kz9YJANH=fHk?7SAbIMUpKq*&*i^U$A5E`cUvh2bNGXWO{VzKH<7)*CttJd zTz(TEg{6<9jwL72sl@nE_%`_Jx>G*1eB8~5u>VFr9kl(bwRdnAZ8z_H-m49(Gap&# z#2NmSEi4z-4df0ppgYLzu2lk`Mnswqy4Dw$eHz}|*ZLBQ;!+zF@2aYKw<2SR?yc^D z<5ksX+=|{6x-YHFigj~RrUsc-Us-o@-JHfbDe*ztz5}@giqBQZ$=CSULib>#fgPLx zpYE>wh53{5_p$SYBXGw*49&UfM2g3~?0E&A%9glE{2U>_1#3mHwM|nXh;x(v;_Xmq$kA?(Un%^7UU3oaQ-m@aEV?`g@S6q^@|jt2=^OiMcENymYqH z*@bVVpCf)b-s(+Z4f~(2K|Y6TsulV71wEC&U%GP=n9qJu{It_q(zpegUW(B+xt9`r ztjIs_ra4cpxCfa?+;dk~*OY%I=~UfQD*2xLWBLEAmu9!CYgig!Q#BvUPeXlD_9iJi ztZ6pN4ub+3Wt#xWAmr4@c(Zgifha@5_juJ+P!Ykr?hIguq@K^6bjQ1qh`)Os6vO8} zamU+kZef3#I=b$N$AollwmY-$?$~Eo)$;zi)NlBr)!bzu0Rf*wqDfPr15oZ^NmlGlmeE zK=IQQ`^8^SIxs{+plQ|5R?i+Z+i45W5?6~kdAVUuXMN;sK9}SU7n9=lZD-=*o0$@< zHj>{fKv9N!h_sa0pY;7gyn5pJeTu2PDJ!gQKW3Y~**h3q%aj%QQ~3pXJ0;2>QSHxu z5!j^!Euo5Li7LPqQG6hN>#%Ov-cE_D+aa|k(`%UCn$yNF<5btd_u zxcwzd%BVx%Z>qVT2#=4hu7Q*5$6JxhpkpRh;&|(IAHkSPTMSsRMxMs%ZYMR=Cc-zS z&7^!IiMFgOQn4nR@X}>wa`yT|u==iVz}g}!|ClEZdmINXpQwtgX>sePLZ_Y7flTFC zQB(AX22Dk2-x-uvC&p!Wp_GBy&cK6S8mDl}bw*@}=Z~(lYaojZOMDygtJaasM$$QH zOf7e?)=f$5U2mJ`%J{e$e%JfOb7<+XBzT!fJtSU_S1K2~luG8N88qmPb)L(=Sz9^_ z&&`AyBP^vS=xGprRC*ij4r07m=O^GJ0dMRT`7166_i32Jso(a`BE(mysQxNE-Q{cty?jPiQzGO#~bsGeu3XzlbCzS z@1N=KjJI_w;u)R#`jl9{x{GJYTcNLBA-vh3Jp1%(8%YnkWe$e?eH_15XF8LF-<)C2 zLRJRalwnwrzt2O;sT74CVI}#hTV|E&EZlg`9cX8v+?tAA8o=*2BuhcOhA~E6#Q&KD z+d5!wxiwzRWV)=#OmTS>yS!o0(~voNGa`D|4fwKlmp^}m`w6Zv=)4m zWsR^FCJnuNyn0Byq2m~%)@ia>{#ClJn(JL5ta4foqL_z;W{NYulk8!qc!`vzug;|m z&19#Gugt6&m0N9pg%vYp8`gu;cVD&R6_Zd{q!E=;9>fmMKgs)5hYZp0GvUG8OZ+9% zfBD9GFq=arQsIx?%qI@v=gZ6|+2I<0(fxfN6;(TXjIL9UGOnH!67`)Cm08x|&HoO& z7jnemOXxgsA7P}%{*eyF{uAZdo+G;bS8jGLaFgGS?kuab#of(G{H?y9zt}_MKjcJU ztMtNVgyQ% z@2}kPogsD%*sDkj$T}f?|C9WEyfwgkBf~^!;H;_G6?F`!3YRfg_`%J%>c>^kXhrp&N= zg33^4))>m|$TK4-;fsfCA{2IC@#COcS~7amIX5zU%oTFBDfna}qY*NB{y?&DWxqmr zeZPV`tRfMP6hcHK7bm(ITQc%@kWzVS>5c*Y@w>$5r>~v1UEvCF1-|u^D?n5S>8_Dk zT!jdctd-ci5emL=JuoN2dWu1AtxLryAzAybA$U@*lw0fKnV>4W@L9bwHk-)JdQ*32 zzs>Z{g*5pu3E($2e_QDsdWFO=hb(e{d|u8cv)ZY^Ev$hHs$oVskrS$+cW#&^VMDn? zxbJ0XrUPX&7d%1iDlmV`7{QUJ;vB7g0%(rR7MUGa)L7Qi7jqW(rF2%ee zTN1E)c`##O&M+1Eqx%f`4YzpB9uGJM6ZSL72EaN1zy8!hbE|fd=)&S&BF7}YWrUK2 zONd*{NjK+}c~+vSg8aTAp^)PvuupFOg?wAa82%(hG@<2|SLPP2C%0SUDyfgZTL;A7 zI6NgbH!G$088$^1oU^w#O&5k)AMzMGO{6XOmb;Ln{_`SxV&T!|G$C{YC%lpi?U)O+ z_#ARwk@lFC{KcqdAq+dw+b^)yj$FppfYbiH9jtIFhbhk)O(ixRvc~VI$tV4N2^bJ@JZ7VA_^0|*UaNCsX zm~2EDbqX_iHHl}h6E!jgL_eYf23Rw}L&iK<^(bxp5Jo7dQ-)dNRF|Mx)(jvX@G9JA zh=(M%!>l%BjbY5a9Ox-?V$+O$Ul53* zB#4fn+#YL*XBz&tc-om4AJUt)$m8`b!g!t7QEIE~lR&$xE|ps(S(#f?TPY%A&a*tT z4K}JhG{?Hsx9_<$W0o}f7I!3iftBV+rFs;`-Q$^*y&b)r^H6O17u?;&CwExG}4NpjT0S!#~qS9VYc9U&cz)3$wdSP`% zXQN_f(~JPj1n#m=@vKa;#6 zUbK+v*AfdX5`$YgQ0W>Y~72 z=!=lYqr0m6{k{$N zdJAl}2DU|9JT~IauMPP6G5HE?{I)gfA}G5@ZtvE|S)$XBz2_7;!TV2fLyt~mPYvhk ziPhZbj>j!OTg9B6y60uwuuhT8jAswI?BFn*JrigtZ)N1Hv{`Yg7GvDR7G_hPGf#N( zL#E`S@IxEPGzIzY#S64#^iK7O87FjN)+zZ!M8+=)kH3?SFR>#whd?k6u|0?L@sBED zmq6tD#+vGo2`sevr*=)#%s?JI#DNfoA_DF0wv6?N`6JDMt(}{xWQ2hW*;3q!W`oiM z-9nD!q9sw@3^6@S)Xvgm|7u5H>5P3A@*Tf67WMKr;QyoS&EulDvOVysuC87{w6Q_JU_?t$(Ks%N zjJ||4_EKQfsH36=6HIB0naM=+vWzqF1?(=ML84BpsL>H^SKh=)G}@C)B8`B!Z{t2{ zAO#YWF^!HJM&$Rsb*sh9yx;Hh`TZeQ-{sux+;h)8_bh74h(&y{P*A1LDuv~53bjmr zhET%9D#X)Kd+5JP^X%USFv8DfL5mHMrO5pHJhz^9BL*y)HF)>ZzPxqB)2>k7pQW== z?j!R^Vc8pKTJ9hJeH9ejrw`AxDy@z8FI1+Hbu=0gfnnifFJOCdZopn0?|xxw;y+Jk zKAPXLc<5p_i$V=RWWP06uK@;PQwHQ`|C z>~hBv;faaP5@G}Z&uO~*NJq^)JG?gG4opW|zs7p|Ru{VB_5N^bd3kuyj8vB=*CdX8O!5y!Br_;R{TWXqh?ns zPsl$(Hm71Q_f<#l^6bP*E{O$Iqj90-i+2@2&Gvu6`vN~kTDJzAN;oI!kKr98{f#?> z9b|fg%^5>1V;7ad-n}v>Q}Mpvo`XF@Qt<1Kh3!q+j;NPNZXw|_J5Akn(5 zDmJgRe~~8_2}Na0Z6E^va9Do@-pTN;ZjxQA>^U!n<;Qny%KbYJiTt@!^`g9vlB5ig z5_{`RcDlof{2`5;7rgUycozt3iH-^6*M)`k@S3zW!<)(IYHrF@ zbU+tYQ0R4!pjR*JfNm#J07{>ilCu?>=v`RHI`Hajaaw_H6wyp@t%UVnZnp`U*7ml)7(L6<@M&=eP6)6YA#+Idb89aV4rBN}=Rm?+ zbQOs&RNOEudA-B)q3Vs)Qr_t|u&PHrGc5fr<(9dZ+p>os zR+-79JFmN_yQI64e!BNrimOQ;wiY_q@FPD2b}y!Qnrd4_A=O8@H&qqM;LqS!Ev7c%RIq&m&q^*{t}>9yi$#pQoOj z-ogH$ptSt^(EL@?a*aj71#Lts1s+<3!2LJjHt`Z}G1)W=I$HZjb&a;xb;&2T32GWM z3LYOA3bT5?R{yOE&ju&pt9Ey}-G)@@;mHGh;GGJ@HUu?S(}SJCqpE$e|5ojBAzo_i zdDZm0uFKTmDm!mn1%B$AI~OW_dJDYYYVhY)0NN`zU_aN8M)0pMB1;>MmUKB9XMFp= ztoremr^;h8r1dKy^s_`^U?1q?Vh^fg_Pr}h2;P#{HIF5fH>7{s@Pp5*{WR>i{08Ui?CYVWVU*>-8G*^*~=@IZ-!*L^>tAoA%C~ChXYMiFF>uYVcSM z(q4GqyN8kf4z|PwJ2~{3z5(xaBj>*2ophti%Zzi>DitPiQZ zA=u-{R}Smlz6^VKRgRbFUNEtheYyAgeTK^-_(R%KPgHYMt zG9rxXbq9#IXxNI>r0l1-TK<$qXHkEM3)TWE1_uWmaFE{`KBp4wQ)w)7h|u?`n=9k9 za-3uA%YGp9v?!1K)z(*NJF`6F`dK=1dy>g66!XkiqPJvq-P|_#!dSYjGwVb|ckuL~ zrGtB%sZ7j}>u71I2Ui#93?0N0whnUj@}y^>RaTz#JcV4{BaAur1hPL9Gpmk2>wtEI z?o9QwjtwRGb*4;|e)?Gl@!7o$zo8{uUXI^nwr3np%sHdvJETr#_*41Tp{2cYW#B1Y^AC@u5SgjEU;JHtd|uZ_^!=}<1O40N zKqp5|rYSQmo*QK~nSShD7{(vqO;rCI(0F7)6+_9DJbY~8#Js;^)-wIO0l8#d-PEZv zYz^+}h*b}G@=nWOVUx#Gtgf%9kO}S2I*A@x*#D-zSznv)ki+!XWOM2>mmMIq3;M4t zB!SH++w#qK1h=EM(b+vRozV#txdtUXDleVQNk-(^9Kr7#c&POe5>v(82TB5?O_+cp#UUUCXHfOJ3&Qwr}vSytrGwNu_GXLd7M{oJ@ z)&VOGoj-%QH0k|k zj<`ia`*$CPHw$=o#y@Cu!aFDkA#0YnHbeX=D;T>zes-1d`YMv=L4N-=|`bLuOsv*TBUzckLaKB9i>MT zjywx`B$t#{tC#|h7Gy0xgSU=4e^XJ&B|AF>-h&3;7DFWCJa1>CV{B5FI>U(4jVqQzc^e{$)qf~&X*@Yu-F<5<-sAL3w#e1Qk8zj^ zDTl~OPfp&9v*byc>F1Pap47cN~)jT>f>R!pxN@}&LZ)-KO_9I3L{ra^(HihA?D^B447&egstMCW9!bp1IdaM7 zJ+7vmIFFq8)2l?}pS~m_|9qI&mHs!}lcY~K6W@s~>%X17du_&;llkDZiR6@06Zdv) zy|*kXd-qK2>|UTI?9tT+*Jk9Lyp)l6X00>l%q3?cVjvVM%>6D3;dVdPLL&jbmX8yxEFiK|& zN4h>N?4;QK+w{TPkfVVX-+%YyU&nyk;gu`R4~jBFOP9t0zZ7zpw=X1hG4F0-H5-ET zHUT%kw+a~Bf=dMR+wUy6V9IO_5IE1@NjOTpDoKbcLpYh|Z%5ZsxYFO78GSHCURW7b zOJZ6lS>##*AM5|_Ao&QnA8Vg`p|)!q5^kymgsc^ka4Y)O!BkbgXFYS-h}p zpre=Gq;UOjbmVWw>2-X)mj7!l|8>0Q;B}Vlx}oHirqf`|*<0&yKB%*(yxtGE&<}CS z!CgX!6MP@^Gl>MQA8u%`lUthF5BICS1$Vlz(TJs1JWl>n-s2hR#T#%Q>yip0xARYt-(Jk&EjZzOgS1$TRc~SXJ9_A|FlfPeN4J{%)w9lCh@qIoNu3cF%QzT( zjudl;NwlpE;)GOt=6`uKq*OS!>HJHrh)zRZu)TGV2j$&j7FG&*ddQMVs<-4i^v0$5 z?;|8xMAR+Z{P;T&()BtF0kvg#uq7=kF?SxWwZXz5*a{Ey zdB&zn^43UO4Zd_O;I4zsPBZoOdp$75G)1O&Cty+iM4Z8SeN&4M*g|4()%(^f!iOSQF+$d-Q*5@?Q6mbp8UE4Q>4tf^PxlF+3DHi4UL}?Go%S} z%wiG)s=o*;W3Evry;x|77V+{E)yPQBLOm~%6~VWwP`4{Bk6CFm z1>zZ{y>+s-CK6tqmCm;wl!{8^tp{YDTcHQHT~zdq4_Ka8s3+TpsQdS}Jl=uaye{YERwRoX&gjg#oQH^(= z6Ay|FfwAHlQ86^$A?2K61F3%}OWZ6j3``I&5cszyiM`H!s3_ix_&(1X~5+TA`uUhb>}!JgoDW zmQkz|K7~};AocD{;!)qAb5bp6sXZYh_6~(^)5x0i;-UL?c=vhyX84IvF{{3BR~H$v z53v!TM}JHfhaO5jG5pBLQ|YH!$JiI750>k96?<&b?_T0|8H<^C%Ou!!6Hl&D{S#^z zPKIPzr4sf;H~joffUjJ?`37?>@PVbHWUpQ`+olx!#xjgA4&(EauUk%%^-E)&3st!# zw^{6JK1zG6#8Q71<(nyNAude)>@nmFbN6+0g}k@x>cgt6_ymy^=bfWvr5M96!qojmw$;tFRMN)_Ctrg{5`W~a&NPKtvs27>^@o05UqpXRV^w+S z=DM!1?N(c2WLZ?Y-F`sRja{=Yhx?HC6SUXIA6IlHMj(t=o1A4TQ|yizprE%VKfn1hT* z=k;y6uEM|AXyE)6t0&)^XpZ68H)!#qVe5f`asxMw6HG4Dg`Iu;yM?!@1>O^QP6yxRIAQ-vqC;gCGN zAQKUE`j9qLSclZJ4|`1Q!N%c$pF8wJRT@UyZx~isjN4{0LtBs5qt1}laLZRH{e-L= z*i#vzt0sIy`z2jUFA7I)tB~PK3H%!^!ClsRela6@DC7cP7QVy$5|+)F;RoUUQ+<(^ z;m$t}g|zcc3x(o8PfI9g{@X zmVfx?y{LbK_F~`59lg-K8t%oYSHf`W=XUhMevra)?ec*LL~-=jc59?|QnV{!(0 z&!GH8?V-ZaShEz&0x7w(dl)0!fBQM?-V-`tzdES{_M!o_$bjL7;E!YX6d5f$>rZP-lZhNybdOmFVO^jui=?1hW?!o3s`PkTATMyrXn5Sxx++&yTgb1gi-e+7AIAGC@aXKEp}1t$JRLqIlK zbZR;N4#T++Ed}*t!%nTNJCl@+McD%_oRe=!U1@#qP8X9dbtUIAv~cju)Bhv?lKl_i z^WDWW6@@+?Iz^CGar@&iI)kytq6tgT+lR`^+Yj9$v`Whg*qMa|M$)3>g!Z@bHmnPL zb?@JUcWL!>w68@x*Zq4+MlMb-0rfm2nfREYu8QKYER7wF(f+B{W1XQY+c#-6L*lDiEIYvk=}zcQ>7a5B`f$i(Ikg;=ua?Ez zW#h;-caL<{*aL?sRsYe8p7{7NpZW<3w7GIt59_}}|%YAb#-jXk7 zxMECuSGqBO?)?Vzo;QB-k-y8ihsuh&htmr>SyXs`BY!{qN{wZ!(p#Z;xaTQE3WH^a zI@7`<3JU%eo(AYn=DgZE6i_Y1;f3>+l>)`d@8S)(LG-XU%E+^(M4eh~5-hJRRm zH|wPTUN9e?SrOf04|>_pq>fgFmiv2*cJ#R)HL@s2K*#th~bKEW?mx<@`FYt^$NAMuqikK$kxqP@8cj1+y=1RAlr8Lu7A znWPVM80oj)if@bQCw3Jg($y3r>ziE2TF(|T*2#s;*QL*VieouIp+qdm)gi|!A!x?xfFM3hKB^2h9fmYLntkF_PxGD&ZK0c@EWpkueI zzW<1ivJkWX!;OgOxl_yuf+DKD^3SHF6l@rk2VOzbg;_LRni(o*2ZCdwbNVVx<#NFh zOrdFRb$rb_VTQl}uf@r5PUJI2Aj(|v8e2*ZieA~S5%QxSK@_hom+ z8i`mNYZ^OS&xy8PB?---Ecf;qtK9jH*z#U;U<-W@x0AuGOQyq%(jLZYY+^YPHmQ#1 zN(5M*%zqyxK5ShQ4ZC^4a-Yd^5&5o_Pi26|>KX=fq7akokj^a<3z;`qKVryyT_Qx> zXD-SqD-8y1KBrd{COC)56}p|S^c7x26M&{X!!u?cWxL#dIE;5@6zxj@bof@_V;EYC z$#&N*U*g{7`~bV_rZIl?|13t}$?pWlul|o$7{e{{wy(}0)bUy};19Hsc}~O4 z>dfadXUv!8o@a>fyO|ocD5Hr^q=6+dXNKc!8&pDh59V5hXXfPvuy=y~48_%P@0j8( zmUwV*z{L-neUbWhSYXK!xZ|<9eAmpFo0+4Rr|jz;#0kM&DYP2B3^YrieHu#o^ciy3 zOwst7VB^=7Liqyr6Rl^$^XS)tvp?&XlyNyzxp)3y>S8Nz(CsTx`-fOUgGzRFI%}hS z3|^`5%s)e7iP0V=Ik+Q_VlApTF?bg-ea_0Ppy-Z5F?iG&IC@Z8PJU4?7d^nFv* z5nnAFW_*F&;38vw6=SwM@%WhY&O`+=%tHA9c8E4=`_MFUvom_EMRxeiQCH1AZ0d|v z)j88vR};N^I?DQ!H!8Wl&gj@`x+kg!jmb#$tgcN&tUvWdF;#D&wWVJy%IkHImXZd7 zkD8#()6v(*(66MUuTP?1c}KWpN0gR-*b1*!89 zZPSDu#zee>_YQqp6-UZIejQEAx?z*xOH=vxmj50+Kh_G3h|QvOZ7XBdTlx%}w284g zZng78R!0nDedkse+#+cGD6M`(M)b%UP)N^EVpEkg{)65kyrv%A=~^w0me=kJC7qC@ z*cA*osb6hE3{CZIP=z3vDFn$-0ly1_JfWnPuCWJ6^p16PMK(anji2N*%8)BbJ?}DO z#=Glc!S4|&ePIbdhj@2nogt=AmewD=)*sfrm5(Dg$w3}?P&W)BG0z6qPaf)$;U)3T zBdTU+rEX@tXhY)M^^T6u8f<%zsl-7;RCci8Gu5V_PojwrW+qa645u?XRl^~vK7B0e zqt<;kt4ce&l)KaBqckj#i%fJSliIc2X@j?z{zM`HFJQKjr?{{<3y6Ec@_SGHTN|hMp5+8b9Pe_c z==*d1YWlg89sM}87{)NEXSII5Yh-ZfKH%CcUbGhU&%ulDtDtHJ7Ro)g!SgD+xm}ly zUiMSs@7}?=B=^thXVK>7$02Q8ietcHMETJ0{(Ar0v$YdNx;o(zWQ?WX6g^~tsr z=43?cYIOU}kmH@ZO!2wqG-8%?$N+@NS|-(p`)cUi_n0M zY+`y5>9ny4UUGn~Todz|`f6r{9}38=BAXscuVGg}&PycB_}_xHXPO@3%eGFes$3x+ zgoiqb0nBd+Odm=RsKBuAwgM)8n+Q~R$dVW3C6M1b0u}P>*P9;pAir(3fenC7G1>n2 zFFkv`Zg3Es7^hluUs%G`^+>!Zu#e@5{v8nA3xsAz_&g53_`wSmgerc&%6rMTDuPaJGLrWqf=$yT$TtZhOADoLi&pWfF6<1AUmdG3p&GE@Ia0jyTIT}wH{H(#{D?P0z zFHKhH=}2*x4gN(Aqu_2djK&#gmEX~L)}+4>ns`;V@|VK==#Jk8H%@(9Yii#`OP>1#-cayuT<&pJcbv#{8O*C#6RGtRj#fD zcM}IX&)sG6orAE;D7O0lK<+!y+6>X(Am?GJw1(O;ue8@Xf;B&W+$#})bvHOSurPOkkURRY78 z+vs}Q*U%mas|dZc;xu-rh>1^$ke_)9ZIGcb8nv2MHjmt8f}@1q%M)o`p^Vm*mJ@kV zf2U@r_mjJ?z8~V3K$kvxzwC;Fen`k-nHJu))jnE_TNZ{KDqj{)S|_{!=zV;29qSaf z7~?}NFSg+XMf@tQy``~7XJ8G#F9s+(@MNdR6Z`qkZ zc&?Q~;(xG*6aE*Dr61W*jELy)OaS{ZoQRnk)n`89fL~r0xm`;9*@%hLKtJ?EuTUSC z@5m3qvs|})*JxlvC~5GELcdMjd{4(R?qq%3$!lESnz%q62WyqMh}IF@A2{V)r?$W#d(Sg7-4Esbg!Fzw1${M4DS3pYxV9 zMaQ=wLS%rHQT}B7QR!sPd#@cC~!Dk!;eo%Vjj;TTPMLZ2HrU$rteQqFL zNlHcJ^tfwqi%&D$=swK+ZX1oen(->WrjXg--ZkewV_joZsi*XYiHjPK4ghMaidd0H3X-1~`<@~*;P9RoeW9}pP= z^&+p)S5b9j{;8|0l?3y{nUEA1rw)7n2Szd&pNxWbz%{1V9Le|t-uXd`Y)afu58PX$ zx-B~%00-X-{1QLK$}eZ=$}uk~+2!}W*Uf{nid=) z;^PLO_mz!crGFUp?yW~HifsIz7p1ssU6CJA1)22Su7rb*;ljOSGRf>AO?J8tXmb~I zO)oqP3}h^1?`6g#qFt$C;jjAcdKqv8jI_jP!#U3>E6t4(6P4Zz)baUE z%wn+rqa_Egn>bmr@?CFcOMe2j*;<jQ4v5wf%_czlh@f2pwicN2DTFT`L@`(RGr-R(18YbWQt^x<6w@Z*4U#m!6_FnHk- zb2GtPXndbuCn|U6obkQ?2S)K3PXi+&WD#d_yQTC#i)iM4uj%DR2-%|{dEDsJ=9 zIF(B(Fn}W%+hbuVIY+@oy@ROg-xD0bss6-W=4N(2w8)OCvt1gG7me?>h-5b|V7+w& zKa_LE??_Jxy#qGjwqE-y+G1W`K)OmLxgN&rBDYAgCX(q~SIC}X&oLRq!lO|ZW$=GO zMH@T@zxc%#QCR!j0HGo(RVp)D+;x`+EIUl#kBP^vdMYUVa%CJ}@2)HDA+0c4$SBa~ zWbkGskMm}U@xQYWZj53BGqIvr;rJ_fiMP4WZ5m*net>i~0vv6GVdqqC3*lkYz#D9y6Tqm*$fl^AnAO-f=TL!9u61CXHjFcXlgeTn z*R&0IqHFj%pYX^nFK!*~+TuJ`ppL8Mt!v77{>LG^+~-OMz#c-cc#S`Do5x~CEPo&r zT>X;1bt=HtVCISJgHkN|e>tA^(!LRO!9D%yZ6A`KS?JeEzNTV&N1}zKPn%mfYl> zPkqHZmB^@#f&U`dMR-W7eE4;WTMQdM9o$=@66xvS6<;otmfz_{sRwKT$88Z;D{U`* zvQ5R)OU8%8UEJov;?8&Lvo3(Rkuj=oTG!0YhKfIOUnfrg8J=Lz(N3Ff=BNp^xL{zNwF6CMY3%=L0)2Kc&0e&UfIq(8Fxx z&y)%kU#Cj(tr6=)Yp0TS<=&iY;aRpC>(n`ZwE**bx}rqs4$6NnOPgEJm!7Q#P#T;j zN{_pZKR->9lmO=P=ch@11DSoLd5)6yEa)+~RV#l)oBO2t>EP6k%zgZ<>9Q4Zmg{|I z<}xz;O5=oR`NeLshMRX!U;G)7BXw=P;(PxC2K?3~74r9mmkIqP`;)9B`ahS@-)A-Y z`q@GR@1~#TZuG(K1 zbSnk+BZ;AU-vD3sX6C7U-Yb{*nN0)DPRP6mB3kIKw9T-#!ww@m4>mGSg_6qq3Mreq z5lT&YH|_{+(+*Dh04XmU6CgjUD zjb`m3HNOgu4ba|mJIMNw8>-Kc%v8wmc#$adKG&Ui3&l+}`i#zJsMiUb&UNRu6n1xS zG4>^r;zcWI-=shLaKnS-O6A@CTf;av(!19S-_n3QtXmxeD~u^Sib36{RLH=(Ze+c7 zb%U2=SZKXFUr4R#2I}=vf=ftkj2Trd3_RTpH;(RFfB%=1PH>T3maNTPaC@k}+DUFC zLg!7XWS*t2cQKFFx09R5y=w|MTy>{e=DkOET$exgD#vNEbbgz^iyn0LSFb*WweY=K zQT!VsOttS%fEN$hbwFFycTp)KH z+*K{}W{o}bPL|c+gdRC=usDTU(q^i9e*Q(q-}nl%f8)=?dmucF-BK-QfQ8S2!~Bj* z!QCy{(Vg@$Hl;0Fd6B;-^x4#%yd$Xk;urJ9x!T;ieG^nWWXOfp8rtkkT4oW+OMiyxG8oX=S-Y>X7?iX4TJ}b zaA$8C0L=(inrw_%@ILW_D)b<$<>|pq^9(5c0q0!(H{W6R4mkLOb%8kvww6o)xFfrG zw3(cv&I!}vB=j!dxq6%LeY5_?IWE}&P9=9<>M`wW>P_e63qIqC|6hDcmkY`S{+{e4 z+ArQ(+S1ZzK`C~TyDj&7(#!l1>5cV0bJC;U)UR(?T^XwH@?hb~lL7AB)&ah5ajbI2 z@PPQ}d>5Qyb1LRzfVr7>_};zMWk!IzP&feP5wU#X?f-;UdFfi^7tX8zSsl>AoTo(I zNp7-Dan{{^p#wvD)2vf|OYjA2g1gE*d%kEsXa$ubH1PGY-X*?39EsGd_S^kiTBG{c zq=rh@HrI7asQuh-HF#_U&*zynIM34>(yz&@G$%g8d`tLjys&f5WM&k;d-F3&!#${e zt)g&H;m{(Y&$IfV&jcyXs%|XwW8a}rxH;go^oV8c-T!b@!Iv_uaV@rJ$e`8!+h@A_ z@`>I|yz{J#6S%&79GB{hb0^Dj?mo3~?*4o{^yzic$^}GJzQd^g>*y-X1f>9z)<(M#f5Dss96(p^@<$HZg(`b&SwJU45(5 z*P`EqmW;vsu+?M)Gjhz!F?$yV;KVu3iPr|8$DIf8{CF&U5gKgI)Tu|IzkvrM1A*jL!tetS1K znW9@aNgt*4x0uJqhH;Vctq}eAih>mc-bdE`UnN$H#1;b7{Qu0|AXWv4pXC2L_cL*9 zplXh?`d0maw)}}WEf8&oWpl}#D>Fo{pN1`cp-?!#?uylTqK$V64CdFs@LAd99pBHM zW&|BpOjm=~d&~z{!}M}W%QqVYthZl}T&$~~pG9~Xb!GKcv^L9RGW>#8x%-h<{ zYRj>}J-|gj2!8D*c_!uK%_qXCw0AX3DL5tR$?ph{748-KLwe>n>Dk=@UQ{gKkw`uN znag~Ex=LyDE!>a))O^TC$^fqpYW<}cm0wBsq(5b6F+7TTGNP%(7m@)Lzv>6=(ibxe zV~7TBTI+Zw?ei|srilsqBA*UgJ1r0T%qODKYgUgLI~E%5L900-NgnGnbZ4Z-l{l9# zZ{u7MuwNO@ZiLmv{fBN>cjo$8^4BM)FsD{X-+$f-{o424TxZ+zQCo z@HLa+^J#ed<%=sssr8(W>fAssy?duiicaP@*BkJUwuj|hzh}(f3+0a>Y`h3NAFE+H zBYn7%krrMC=bg$xV`Zn5AOlO@V1#WKnfaAU+ogLn=bKNZ#M!KxQ$bt5(M|aCMP_rQ zl=v=9-|;BD{Gv_{C_UxdYWa;9b)>f_zv-fGLqPRnsnRO}R!n@G_0HWco5Al%jr&2D zi7nslR`QCs!X-7`LBCeqSJQqXX?V?OBxz+25aAIx9e-(o0Du8vwb8Tykd1+K>1f2wDf zrxuZkS74pMsj5A8NA_0zP(FWO%H)}yPP1O-{Yy4KyapYw8(Lk?h`L^Ac%5i3-zoC5 ztonC44f7Q0dOLlmvzg8Ay~_iI6>ji~-=(k6aA@opCUsx53$k{KQ|4j(a+^lK#-#2W z!$gCoWid2`F@<~M*U{c851<0k_Ntv_u(8=$*|dMMBC6 z8!*Lk_W`N%GG>wZW~^)?uRYQvUe7sGurkkov(pK=)4kpj z3~knT?{tx7Z%4WuIkb$zXl9<$&SK&FjOcs^UpvT?x?j~fJE8KGh^ZQV5dJF*QkK(I zDgRMm^w8c4&#CeqT^n~J(ZBN!gWjr7{uw0O4d-P7<>*hla5tpy-j)AC z+`*GRIR@|RgZ9&yM!5?sJUgALop+For+(qw%H9Q-|9=SO+nMXIaMo~5vA+Lq`wDOq zQtVwF$>Vtn!M32n^V~_*l5jOGn|DQE@UmEGofeDvPSBzr2H%54!%6rNDj?%|JI)8v6Q2adXMB}40V~DTjXKJJIvHz zct-|Ls(R{bJN6?zR5;B#>0k~#@5m*~>P%W&xo=>m)K-IYX%f_Hcgg;FoEj@YB_x`W-xz7U|-ZOtx# zckTjcKnU@-!B_2u_EHn@DVdcRGw$o~OsUe0^8L$#MZw2<9aOzm(!82SoaNV9S_IbM z%UXZ;x>KBqv7+?$IgOfde*>Q4J<5hR!kWG*@bO1WR{xET174^y5;MM7l2~;Qpxw8?3*vZF z^{8P(t956rQPwW zKPIbzT~PL=cL5@3NWY6?ReM3YOICx6ntSe{YyZCDbgVY~9|za(Bfce|?Pp@yLwI4C zh;;=G2*sF)W&@!Im6v7l8P_RDKB9F36Yg{U>VhfpmT;MG8Z7ahEWI(utPcIzmk$p$ zw+M9%w(rBq9O#y9iBDg-%W#*8H>J~cgVwifr1*4Fn|+~V!TbgGl`l!Zv!d5dZA|vk z47)P-?+;zYq}L;1orPEZV9x+_X4RfS(}RzO?k*y3)Ad+tu@uWGq%T;3SH8%1N%5!k z5rtO@h$bb`cx^w6(drHrk{6|M1yl?6`T7`)=8BrX9xubF8R(5wMFd_IYHmqbw_?-7{ljR$Yt zGeIXa@Xv=<5vQ4HeLsB#i3MbRCKgnbM-Kd!?b{&c>`UCwXOdDvih&jS8Q@I`|56Q1 z&N0L$``4aCH+VDTa|^Pib@#fvGjZA$HnmG-_{P1R6O&am7SHX<(8fgYkX<1YBgXONc6G{lkA z^9Q;bF=ywRb?~Od%*gIl{%*E1b@27@O1r1LnXMFGc*w%Z(d=x6zyI)ZWzmtt2wC;@SG&TFlivwFUd+#tG=jCpxFnS7+SHZ2G7#N|-o_bA zMj0~-ks8-G8j{EMQb-j&jC8p#iIRFkAkiGX4&Xrzx!q3h+eO%DX50=94xcZ;rUPW-$~CgpJ!7#r5$+-~ovvvZ4=THuECIg!I+YL@|>1 ziE`J3@nEC=^5WFxa}%y*?>^xB7;wb}MzZsIm*kJOE{;p`E$*9SEjA{p_6B=_NoJY# zijrXkn=eXMCtD?QTMsgFM06xLh%K#*a%9Z|v<=%XUVM3ZzL>IFdbuy_7Gtn4^yXFy8m56H(^Ra$S*-DS^A6^c$WkV`X=|S3;MLanXim&QY z-O}iD%ooRqH(s0^YHi_{z(e_}4r{&Q>cf2n=>_}c?u34S!fqQ?xVOMnP&QbV)yzrt zTnogTNXn@Fq2P;`QawX6XS8O(W@(hHmHFjtqM>S2qORVbU%3O(WmeRd?w4Y&>S$kt zU+f_~kqWQ=nJ`_Y{qRHgUn@1B$NU|t|K6QmytdsO;(}#w{P6whHHfXF)-50MI}@?Y zP9`$re~r{2+6M1*Z4^^ak2^d3d}-ZUW@`M?mME9XX9q)v7Bd;-4oB-hm8^~4-}mR` zjvr|tG9VpxqE0%pm1yBWGq;ymB@!K4>d%JkRQP;=4lUWGyT!|aDiMAe>3(=}{`}P9 z9mPXSz9gFVGO_a8>)GdZd1%XdDV?V!xNxWHd_{&msM?!gp9I&pILmsm+Hb*%cbH>1 zk?3!m`dj)H-)Rf68dK}!^`d3^#cRKl2&Jydg69jSAxjweG_U@4NHNeD!YkC1lV=?{ z2HU_7Z#EDeo~iv#5Z?yFiZ(G{L1q-xzr&E1#EG&LVK#(5?Rj(Xm_HLsG}^!J1INr8 z^Ob4u3L?AH+DrIg%)l{&$0LQ?yMpA=bS9p4j@9PY9{ug3G3Iqka9xpyRH}AwD%9Lq zGJ-AgbCsb_Km2D#oHxF^GUGjr zvXQq9X}3W)cxMtxO{S@QI5k;K|~m1Qd7<0)L1n&mO|jdsXS7xw|QOc z(X`z-wfWh>MS1kg`RFV8(bwchU$KwAczjvW--<%knQ;6$(T^K4X8pbZ%~HtdaK|D# zro3~R(Te{6dkJ$#34WPT_Ii%nqP?x-L6JL}atpGQ9(heki$p61u`FV-|Y~`{1 ze`|%}y8UJj>?g)#wZ-LBC1#Om5kB5#B%I@0>*$`AZqkze5d4UbCwE!fMv5o4=hG0w z7cWq^-6=Ji{*?dM&uix*I`Hjy z;ui>YZKSR8_h~P<@3sCmr)s^ZUrk}u4<|nD@UnQ@y`@g;MeY!qmphDDmvpi%JNVUD z>$$rb(*8z9dZLVxuy4p1*Q;Zj!w8LQGtAJ2O$>tX`VoGJDb>BgWWX;?F(QJMK%=pd z_N2Q0gGp}Uk;x;nQqKsT^ic%!L8i234mZ63THGw;mg?A&8u^C&BSQJpEDQb6(K4xn zlkU55o*9)w(g^l?V58>|zjqdvF#FZEyn9Ob74Ki{8go{gz1$KXUU`Q?`k2NNn>pN( zRGKfHON-)|VQrh()RG+~5*Nk1`FFB*xTSweX0HAN_(-@g4mws7wAs$PD5O5kOG~06 zGF(4`Ryj1<#ax&!U(tHa^nQFc*%!2VOw|5=GH}jK^kH)=%AP$E$j%|(OVd~MJ566# z^@dqTXvyH;-F;vSnBp;BI6~|;^oH=fl%Ja2mY00j%7VJa^bG2X!Zaw5)*k1NrV69E+ z5osV1nZBBu{{yri3LNaW>YL~*-|{$7$m?kPajtI`BL7Hdnss=&U`ngGzFuaro$G6i zlVa}bS#ep_s*F|D-dYyt4$2>K;|-k^_Y{`?&?7`*vW=EwfHOUhxdCUR2hl-$w=$o7 zEhPQK%nhWJcx>i?kn{z!SFQ^D`NhFw6xW^y>4j^d*I)UoK0}LuFf~QK76_lb?p;g$2TPVJp&t(|4y~1~S|7qm509xGrm7IH(Z43V_Cw-tTF19Hbz)BZ)$W`xJH zaRFolJ3PFz0Z}=%{gRdH8BsOV6*xzHpNL}mF|rece#xxkpruxTzeHl`mwEzuw|smp z^STK(`)AWnhvt1|PN)s9PVV!>PlYqgnfyr`*~jkM{f2E*tOaKc>ju&>C~Ik+055f#&=*k$j{1INVnX|d!739{?()Q(?SPPDNHxrXVcxtzJh9O$>`_%6y z_05zQNA8pNn`cL<@AlHVtKd8x42dhrLjJN<7d_j`Z+>^=igj82%cEz10`KCR-yOx9 zMcs*vd_U8mOQ*gF2A9tgqBrP#{3K9p_&j;b%I9_B=awxc)Ft={Ke}yF0I~bh{s2GJ zk=V1H7T{)e$SUO-p^I_&AEEN&e;H#6efrjF=?T8uDN!mic1yH*e~5OCFtm%C_|Azo z+!p@SY)Ic9*a{sT=+K&HXNc(sbmzSoee8Tc%ObKm_07L1xM<&^nnnBlrW?A@;NX}Gt^m$JV7Zn{%GZG20BwoA6Kb5?c=C?BFWNM$|%>ZVq)T7E%+X| zsXKo)2vb|44Lb1@ zUzSAf3%P2n0bY%T%fCjr^|U74DB+{#uGY+Z?RfVWH$o@ckOvO`4tTdRYE@tVfocV3 zZo(N$TVXnrHgMNb`{)0S58fonOB9(k;Ui;LPyn@e(%dw(0nHnpzZbF$&kFyN@oP$E z_!r+Avb-mTf7RmGN|y$C4uzx43I+X+*lVB=^A=4vH|0Bdg2B*JX-I%Ae;jsOQ)p?= zbD{bg{C;H{b{XxN6g4YK4^Q!GZ`|dPlYCAsPRlxDs1?MP~rDX9VxG!CcAKou_LA6 zyJbijZsI!36$K2*H)O=_?lO9{Wg)t$<^*&yuXlxd=Nb+dk z_rHtuhR5sB5xCw-^<*_Yo=(TH|Ls)IQ_zH^Jy+XMN8`e&)Bor2)iLdV3+aGQ$3@E1 zk-2`G>WOOV7~R#^$t%)ei_{%a)!`$8aO8B9_5s*IEw41g1B|*NTtDou7MkboPt&SX za1Rb?<@-fd(Nrm!%u9s~JyFaVYMrMggcPglGd5gK>8+L9xHSfpq2+mPSNa87jzV)M z5e|Sv?)kUaI^}QGt38CL*`9aQ7a?_Zs(aFUT#sPxW~&CYUPZv;d1sk4PH#3SvQLGzb+|#ANlqb z_U)NoL%s$Dk=o-xRk4gnMCD!n8QxQFE3I2?83c`~N!@76LRXq9bul?d88Q}yY`!OG zj@zP@j|%7fOYJ4(*_~;Q&?(jP8R#!P3G#L&)Y6{dh^tLh*A4ftP8xi(3Er$G&ZV%c zBTUYPu~a$@jT^k1AJE4*$=Iz%G1j^=g&A7bsd^neFk1Osi{!hb58!lyG$}lOJ()|4 zGiGPmaNvZI4dw1!kWfXUSkM;yS`9w7H9%LM#88K|xxwZ$b?5&n?El-lW7{0~@o;3cPrZN4_1HoU*87_Ho=CuPzR znj=8lg67y;X-?iDn&ZAt)2r_ymQ@x_v$xVT_npxAjlZU8oJy^mb@tmxdzYqFs}#Cf z$K48zAEoudeVf*;zKOIqX*v5Xn&!R{8o%#XG>!WgO|!Rz#((<~O{=~^)3{K`Hgp0_ zbF2HZSyz2MH2&4MX_{T#m$*^=6Xjl{Y21&ruKkCQ?dCX|R{c+!#(f{MP1MrdKhU)5 z?@(?GEoc9prn#F#wm-f=)3|Fi&3+YajHYST%`}Z`3Rw!K&@}he5%Y(ieaB)rHu8M> z#Zi}BSKw*FvSrduTQB$@)5?Dv8o#Vhk9=A~QfR8bKJ;lwoqgcvw=_-qCN%iCmzGoN zX_{~))bivqn&$t8rYV<@wwR_#S7@65AEDd{FVi&PGEI{%hH~e>O4F2o&@|yfD7UHy zP4i!*Y09}Y6O%`HE{Yw&t6IKF-OXx#hD%E|spny0~s z!aU&zxLR;b@=lp}6`>_;Z|{V3XAfeutNP0~^PS*K)$icVFy&LKX>Fk@#27kJi2i*v zO{t_kPSQ>sA$;EKrRl+0TKP(?{8!=G%o{;-xV<#T{x{W&huPeXSd0^m zHL;=b&tD?(qUed}^VGz`pUL>1SHWdoCtR%7-cbCmt&mCHht1)0vsznaZZ|De|2l2k zzK6E$-lbuWho)D5PSd%agS_(W3JDk)!=1yWwS=CF{d%BT)#JME) zntJD#M8@I#Qs}KmBzS@W^%W$aoFqP@jMoman~;RqtJP+4RozTTYV{UR_4&HI!_cx1 z%-3eszaD3IQk6h@1dZxAa0PMk!RTt+|3lfk$2D>0`{Og2nGE5M0Rf8@9hJ&jYo#s6 zo-IwxWkl_5R|>YcYNxH+b9zyGx~;qQD`661P%1PaP<2JAVmaMzmDOzBwGg?)OYycU z*lLAFNUgO&3sSuP-p@?1?w<2{o!9S=Kr)x-@_9bb=lR?}&BHa#_{2~}v(&NU)mhd4 zQJs~4J$aW-O+mJ9QU{6jj9wGtO;Tx*X1IFUUGJxc-v1!afP5kFt=bFyU!9^)ALa#3 zRchOEdAGTNtVPZ`QQRzK zXXJ-S+(+!v*Zh3=HTc6(FAd{QS*XVgb(%%y49=mpjdnA1@MMNwZ)3|dTzWaU_}F8M zNxNk}<@;}K<~aCR5l-$PbYY|iw2$0I>TH@zLL**9d~-f22A6J^p4CzwmMUPzUa1>Jw5iTlds4+B?ss(a-x4H)!*UMoG)1CdvvuS}srK;GOmfvPeiBks82crHqO?^-k&Q zNXmBpW{Qwn&cH)Gbu$HOgm)HG@^Zj-rQRNimG}2LZv|r?d^ZynA)(daomb#R9xk1) z)b85vK-T;Iux@JxdqR^D>4c`|d&+X|>{oK)8cKfd3(9>qpF%uR?#BwP$wUNVRtwtt zJw9(ctm#D!)$8cuD7TYMEHE+m&ra04*hI%{eRv-u#YTlqbL=7&KG*cK$WBwxuXTv? z8oR9x+7p^R>*S6i_<#@_zfg`$_;qR2pBlTx2EJdjr&30yznde4@(x(rDm>~NoRz$@ zjS?!_C=wyC!!!J}P{C8(p?4kDJ(a?`4r*SboYqcPUu4prpeG$+?kl0)yh!ZoaXd2( zco+9NKL1IuJiW+Y=Im#HmCXH7)JGn~``?zzKGwW%m7YCHF(+X{aXr?v#p-G!-^aS{ z@0Lo#wH&{h&uL@;C3wlFl~B4v(##L&*DF&@Br=|8lo`NGcLW(F(%S#myI)YrhpI2i zX;Jjnul(W%gFm2lD0%l!|6nFWp<2=k8j)79Wsgm>+8ROe6ikqwPj|}JMCv1vWV>f_ z;L))DDmzz95l?vIXK(P9x6Yj{tm3E>tvgV|YsdzWF_2ru*2i78Y zMHe(fL0cf@DFL4U$mfzSlzvE6i^OAJ#T`>_zG;IOF?RQnJH$5}vaQoEf|M)^_!J?rul}f{VC?GgZbtx)S6=Htix3XSu|3dS$cVpqRrBe0ct~2sbLOu z=9RI^IsD8x2e(KaGc(7H#Tjmw8XamE_F~Qcmm1a4GZrPQBMA&2ib(Y%6;=UyHD($$tW0uRIAYZByPSnakB>2mk{qBA24>0NKGZbuA7MXa(!x4a zjGkTXgMOY-;UPWx3^%I+lp^M>lPhuthSx81ie1-6w_^uPJ^F8S3#e}Dv4_+*{F%6F z@Jg3L&oUW$odvn_W;uwj;WJUP*iYR|BwEE<9`P%_hRjk_nI>nc?rHKuMUKVg(&v?F!^ujX9F3FHEkRO--}wuR5rVN1CXt zw%x^3T;bZXi_F#tLS<9S-kH!%DCTu)r-=Nx<_#w1D<_q2mgZigq;Fs3;tgeo^9{Bm zJ1ue@JcnV?VNP+HRi@1xB=i%gVKtdWMPlSTq4dj>DN?n1nnlh zV}tBDAqjPUAEg>}>kWGb*d@lX;qaUt`)SZYw%mzRL7u(LOdfb;$y6 z0T*5onwx2i3Oi#QfsAeWzrZdin_0SKzdXrIMc&yvj#V7sI0bv&_zwKmTb_i40vd?( z!xY^#+GeqtX*0ao75LST0u~n5JL6iDj5Mhz`V;X?P~k4zqdp_SQ*gmeaAG~dB^8Ue zq6RZKFlB~JvigKczo$5>7}ku{ip^*BK9@}#D?Wt0yFvl+(etklz^7!a7$5tuS04JO zEA$*a*;SF)RZmEk7nyHFq2?NO1*>(9D$Es9uTk&k3gfO(TXKb(A!=tXIrm0yv3((3 zTmuhU>^goTvJE#RmQX`$H(r#YP&NL}omqG8lm#U@B3kNR6Rp1Un>%-geAr*n>EJMt z+hwr6q)=Ssm2m!163Kwvl{3FH|`%NPMaxxyGG;27>aq~ zSz10LBcX)4@Sf|i6dy)O&vl`K#GXo~&UuTA%w8*e7`P?zI*rsb{7weAlz5Z+PT4`% z0rhGAw(|6LJnf9Q`)TKOJl%jEF1=TFP6`qi*t>Y}%F?Loul zG4+I#S#oj)3rxau$B;R<2DNKUn^#vKkwu!Z1+Tykg!-B%yl-b6$4Q{2Q3dd_hTJ13 z0h6BIS{oK#@ZOQ$-MHampWE&KXOqJoz z834~$^$ajvCgV7_pSHkyp+HHxNKOK^&C*|n+Wb1}OkvYo!}Pf)z1U!6COJTvS`n-P zE!-iAMSLUQ7X#~2RDYIq*ohNSV*97+`BIG(e*O`OVaMs&qgvO;utZFiH2wc3ec{xg zr>Xvg{#&5ZwB+LNO)-9Sq)MEAXoJbEr4U7MR7+^KRM`UTC;BEiN^VjswG)m$wjFM)g@!*rVA$T37!AH!WH1rdLmcc;<0^zXS*TX+X3tt}i zCizDVT_yjedxs)70RBope@xS<&-{lC1UaNA?)}bM^Y~?2eBFuzhT1YPjXYYML zU9s9D`3pEi)(3Fv4N=K8qJKSKlHsGu zqz9DUZv(>b`G~cTm7G4xYn7@ypb^eNcHYydlH?L!^9VJ_hUB?3{_n8nsoie|r|wuL z)OX>j5{Xx7$HD^f3N6ZS3GJkQLb zeyhKb?>&?2^1w?!`hr%!q+EEg&B|^d*_2e>LBQCs*-Zc+$al$v!8u8I?C3qN^s<*0sRbcmjD2@r0fKTK1(e zIpBE1>0KSTzM4N%g(y(|%+KrNFYWkN7IPIGTs{nm!N8Yz+RlH8r)mDnyPmG@IR8si ziAN~VK{_Gr0`5as`;v_QDE?Fm8ULvylhLXN?EUe+Z;oR9{JP#Bq=?h-A(UpP(O6IV z0y0thM_zz$B_BC@7xFGJ7c>dTaB<){g|u%5% z(3`M+vvd&qESgOL&57y%H!_N`^@JKpy8f5%(1}|Lod~}$LYkSzfD-6bN&tF6VW*57 zQmRr(DMMj*=s`)EZldE)+w{)G$oF+2lHg?p?~fb027lZunYwu6-os4YEbN?uEV(Y6 z$`F0vD6c~PlA3w#nd8sYe1y2Lp-9K#Kk;b)Dk2yMGr1JwW*_l@wpl>&q7j#o+V@ty zV+HJq$nnzmg!#_?rj9Kg=Fa6Z&^1sljG7su=xk85^O^KS$HUt<7%rWw5?6f1d>Br> zpp*GThSXY3ZXuj?ZP=iOHczk7XAj+O7*u~xbS$mK=zB9!E%=QK^UT?e@y6D#|Myw= zoA_%RPOWGx5&hRPZ>AWBIvC8dv*Rtur2Z?JLn+3+===V2|AhD7laUZg7T2OwB}3+n zU8qVX;Quq8DrBgjG$|^zeXoN=>#`F5d!cdgyF0FiiO?p*?`XvTf+dfadGLR#;r~6{ zh}rK?V=(LIha#1op~cP^eWA;LEAvO-?;8FG;3Uaegz?q70-8yU1QUipNrqU^g`}ac z{VrXfg8$zG(^>xeyT-h!qf2g6$NZ;*?tqgjYsBn=c)Ec94(*ok-;#C(w0mHe-=X^+ zcVzxsWygGbS3B!F&X9Gj)eN$)>;;7SGB4uE_xSU8GJ-#U*OTiyz9jha%jS~3XV;(I zg%MuM4B**S{5N=(1BEl`aW)a!?=KB>%D}O#7V<_`8(=Vch$VX<=G23&9%v-oMb3jX zJldTHjn*|YDtdNUGx!eR;5czrb7%83Xw<;b9ekBSyym9`52w5QF}km@L-@0QXO?(cule6~S-hBBqQl=hDE9l_PQK9%K%jd%YNwge)*pIs6q%}}h=losXYvu|S@uMF;K z7yUz-?N}ivzhA+h{dcWUMWA0+)<#*U{c>F~l?4iYkP@P4ifIj}v%UzXE_pcJ?&r8~ zcZgE#Q2cWa`J-^`z$2f5j*SRG_>{7Wr^qTw>$up

>>wbrcFS=_=n0vD5b}vFgwZ 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 KKGib*wf`TmfawkZ From 6c13558fdf93b80e4c9702596c23c4b322de131a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 2 May 2022 23:28:01 +0200 Subject: [PATCH 131/376] Update esp32_4M_2APP.json --- boards/esp32_4M_2APP.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json index e92826140..a998cdc7f 100644 --- a/boards/esp32_4M_2APP.json +++ b/boards/esp32_4M_2APP.json @@ -31,7 +31,7 @@ "flash_extra_images": [ [ "0x10000", - "variants/tasmota/tasmota32-minicustom.bin" + "variants/tasmota/tasmota32-safemode.bin" ] ] }, From 6715cf14d0f7b35ebca00f4c67e8cbe9cbbea0da Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 2 May 2022 23:28:51 +0200 Subject: [PATCH 132/376] Update esp32c3_2APP.json --- boards/esp32c3_2APP.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards/esp32c3_2APP.json b/boards/esp32c3_2APP.json index cc40ed091..58d029c3c 100644 --- a/boards/esp32c3_2APP.json +++ b/boards/esp32c3_2APP.json @@ -28,7 +28,7 @@ "flash_extra_images": [ [ "0x10000", - "variants/tasmota/tasmota32c3-minicustom.bin" + "variants/tasmota/tasmota32c3-safemode.bin" ] ] }, From 1718428f95dc2587421cebc8e097b0eb1e2763fe Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 3 May 2022 11:19:02 +0200 Subject: [PATCH 133/376] GUI Show SafeMode instead of Minimal --- tasmota/xdrv_01_webserver.ino | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 683dc0b00..2c1646ab9 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -243,7 +243,11 @@ const char HTTP_HEAD_STYLE3[] PROGMEM = "" "

" // COLOR_TEXT #ifdef FIRMWARE_MINIMAL +#ifdef FIRMWARE_SAFEMODE + "

SafeMode

" // COLOR_TEXT_SUCCESS +#else "

" D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "

" // COLOR_TEXT_WARNING +#endif #endif "
" // COLOR_TITLE /* @@ -879,7 +883,11 @@ void WSContentSendStyle_P(const char* formatP, ...) { } WSContentSend_P(HTTP_HEAD_STYLE3, WebColor(COL_TEXT), #ifdef FIRMWARE_MINIMAL +#ifdef FIRMWARE_SAFEMODE + WebColor(COL_TEXT_SUCCESS), +#else WebColor(COL_TEXT_WARNING), +#endif #endif WebColor(COL_TITLE), (Web.initial_config) ? "" : ModuleName().c_str(), SettingsText(SET_DEVICENAME)); @@ -2970,7 +2978,7 @@ void HandleSwitchFactory(void) const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); esp_ota_set_boot_partition(partition); } - + if (api_mode) { WSReturnSimpleString("false"); AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART)); From a0e89926fd84c73d8581d1c12b4df2ffd1dd5ef2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 3 May 2022 13:21:15 +0200 Subject: [PATCH 134/376] add safemode env (#15522) * add firmware variant `SAFEMODE` * add safemode env * Update Tasmota_build_devel.yml * add safemode to CI --- .github/workflows/Tasmota_build_devel.yml | 8 +- .github/workflows/build_all_the_things.yml | 4 + platformio_tasmota_env32.ini | 47 +++++++ tasmota/tasmota_configurations_ESP32.h | 144 +++++++++++++++++++++ 4 files changed, 202 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 438d657cd..adedf4720 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -39,6 +39,10 @@ jobs: - tasmota32-lvgl - tasmota32c3 - tasmota32solo1 + - tasmota32-safemode + - tasmota32c3-safemode + - tasmota32s2-safemode + - tasmota32s3-safemode steps: - uses: actions/checkout@v2 with: @@ -117,7 +121,9 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/languages/ + [ ! -f ./mv_firmware/firmware/tasmota32-safemode ] || mv ./mv_firmware/firmware/tasmota32-safemode ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/ + [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ - name: Display files to transfer run: ls -R ./* diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 9259cdf50..6c9f09770 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -43,6 +43,10 @@ jobs: - tasmota32s2 - tasmota32c3 - tasmota32solo1 + - tasmota32-safemode + - tasmota32c3-safemode + - tasmota32s2-safemode + - tasmota32s3-safemode steps: - uses: actions/checkout@v2 - name: Set up Python diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 7aa37c90c..16426521e 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -116,6 +116,53 @@ lib_ignore = Micro-RTSP epdiy +[env:tasmota32-safemode] +extends = env:tasmota32_base +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + +[env:tasmota32s2-safemode] +extends = env:tasmota32_base +board = esp32s2 +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + +[env:tasmota32s3-safemode] +extends = env:tasmota32_base +board = esp32s3 +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + +[env:tasmota32c3-safemode] +extends = env:tasmota32_base +board = esp32c3 +build_unflags = ${env:tasmota32_base.build_unflags} + -flto + -mtarget-align +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE + -fno-lto +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + [env:tasmota32-AF] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=af_AF -DFIRMWARE_TASMOTA32 diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index c79d7f287..d85b93e09 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -22,6 +22,150 @@ #ifdef ESP32 +/*********************************************************************************************\ + * [tasmota32x-safemode.bin] + * Provide an image with useful supported sensors enabled +\*********************************************************************************************/ + +#ifdef FIRMWARE_SAFEMODE +#define FIRMWARE_MINIMAL + +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "safemode" + +#define USE_TLS +#define USE_WEBSERVER +#define USE_WEBCLIENT +#define USE_WEBCLIENT_HTTPS + +#undef USE_UFILESYS +#undef GUI_TRASH_FILE +#undef GUI_EDIT_FILE +#undef USE_PING +#undef USE_AUTOCONF +#undef USE_BERRY + +#undef FIRMWARE_LITE // Disable tasmota-lite with no sensors +#undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled +#undef FIRMWARE_KNX_NO_EMULATION // Disable tasmota-knx with KNX but without Emulation +#undef FIRMWARE_DISPLAYS // Disable tasmota-display with display drivers enabled +#undef FIRMWARE_IR // Disable tasmota-ir with IR full protocols activated +#undef FIRMWARE_WEBCAM +#undef FIRMWARE_BLUETOOTH +#undef FIRMWARE_LVGL +#undef FIRMWARE_TASMOTA32 + +#undef USE_IMPROV // Disable support for IMPROV serial protocol as used by esp-web-tools (+2k code) +#undef USE_TASMESH // Disable Tasmota Mesh using ESP-NOW (+11k code) +#undef USE_ARDUINO_OTA // Disable support for Arduino OTA +#undef USE_INFLUXDB // Disable influxdb support (+5k code) +#undef USE_DOMOTICZ // Disable Domoticz +#undef USE_HOME_ASSISTANT // Disable Home Assistant +#undef USE_TASMOTA_DISCOVERY // Disable Tasmota Discovery support (+2k code) +#undef USE_TELEGRAM // Disable support for Telegram protocol (+49k code, +7.0k mem and +4.8k additional during connection handshake) +//#undef USE_MQTT_TLS // Disable TLS support won't work as the MQTTHost is not set +#undef USE_KNX // Disable KNX IP Protocol Support +//#undef USE_WEBSERVER // Disable Webserver +#undef USE_ENHANCED_GUI_WIFI_SCAN // Disable wifi scan output with BSSID (+0k5 code) +#undef USE_WEBSEND_RESPONSE // Disable command WebSend response message (+1k code) +#undef USE_EMULATION // Disable Wemo or Hue emulation +#undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common) +#undef USE_EMULATION_WEMO // Disable Belkin WeMo emulation for Alexa (+6k code, +2k mem common) +#undef USE_CUSTOM // Disable Custom features +#undef USE_DISCOVERY // Disable Discovery services for both MQTT and web server +#undef USE_TIMERS // Disable support for up to 16 timers +#undef USE_TIMERS_WEB // Disable support for timer webpage +#undef USE_SUNRISE // Disable support for Sunrise and sunset tools +#undef USE_PING // Disable Ping command (+2k code) +#undef USE_UNISHOX_COMPRESSION // Disable support for string compression in Rules or Scripts +#undef USE_RULES // Disable support for rules +#undef USE_SCRIPT // Disable support for script + +// -- Optional modules ---------------------------- +#undef ROTARY_V1 // Disable support for MI Desk Lamp +#undef USE_SONOFF_RF // Disable support for Sonoff Rf Bridge (+3k2 code) + #undef USE_RF_FLASH // Disable support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB +#undef USE_SONOFF_SC // Disable support for Sonoff Sc (+1k1 code) +#undef USE_TUYA_MCU // Disable support for Tuya Serial MCU +#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code) +#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer and Sonoff L1 (+2k code) +#undef USE_SONOFF_IFAN // Disable support for Sonoff iFan02 and iFan03 (+2k code) +#undef USE_BUZZER // Disable support for a buzzer (+0k6 code) +#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller +#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code) +#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code) +#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer +#undef USE_HOTPLUG // Disable support for HotPlug +#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code) +#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code) +#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer +#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code) +#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code) +#undef USE_SHELLY_DIMMER // Disable support for Shelly Dimmer (+3k code) + +// -- Optional light modules ---------------------- +#undef USE_LIGHT // Disable support for lights + +#undef USE_COUNTER // Disable counters +#define USE_ADC_VCC // Display Vcc in Power status. Disable for use as Analog input on selected devices +#undef USE_DS18x20 // Disable DS18x20 sensor + +#undef USE_I2C // Disable all I2C sensors and devices +#undef USE_SPI // Disable all SPI devices +#undef USE_DISPLAY // Disable Display support + +#undef USE_MHZ19 // Disable support for MH-Z19 CO2 sensor +#undef USE_SENSEAIR // Disable support for SenseAir K30, K70 and S8 CO2 sensor +#undef USE_PMS5003 // Disable support for PMS5003 and PMS7003 particle concentration sensor +#undef USE_NOVA_SDS // Disable support for SDS011 and SDS021 particle concentration sensor +#undef USE_HPMA // Disable support for Honeywell HPMA115S0 particle concentration sensor +#undef USE_SR04 // Disable support for HC-SR04 ultrasonic devices (+1k code) +#undef USE_DYP // Disable support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) +#undef USE_SERIAL_BRIDGE // Disable support for software Serial Bridge +#undef USE_TCP_BRIDGE // DIsable support for Serial to TCP bridge (+1.3k code) +#undef USE_MP3_PLAYER // Disable DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop +#undef USE_AZ7798 // Disable support for AZ-Instrument 7798 CO2 datalogger +#undef USE_PN532_HSU // Disable support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) +#undef USE_ZIGBEE // Disable serial communication with Zigbee CC2530 flashed with ZNP +#undef USE_RDM6300 // Disable support for RDM6300 125kHz RFID Reader (+0k8) +#undef USE_IBEACON // Disable support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) +#undef USE_GPS // Disable support for GPS and NTP Server for becoming Stratus 1 Time Source (+ 3.1kb flash, +132 bytes RAM) +#undef USE_HM10 // (ESP8266 only) Disable support for HM-10 as a BLE-bridge for the LYWSD03 (+5k1 code) +#undef USE_BLE_ESP32 // (ESP32 only) Disable support for native BLE on ESP32 - use new driver +#undef USE_MI_ESP32 // (ESP32 only) Disable support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) +#undef USE_HRXL // Disable support for MaxBotix HRXL-MaxSonar ultrasonic range finders (+0k7) +#undef USE_TASMOTA_CLIENT // Disable support for Arduino Uno/Pro Mini via serial interface including flashing (+2k3 code, 44 mem) +#undef USE_OPENTHERM // Disable support for OpenTherm (+15k code) +#undef USE_MIEL_HVAC // Disable support for Mitsubishi Electric HVAC serial interface (+5k code) +#undef USE_PROJECTOR_CTRL // Disable support for LCD/DLP Projector serial control interface +#undef USE_AS608 // Disable support for AS608 optical and R503 capacitive fingerprint sensor (+3k4 code) +#undef USE_TFMINIPLUS // Disable support for TFmini Plus (TFmini, TFmini-S) LiDAR modules via UART interface (+0k8) +#undef USE_HRG15 // Disable support for Hydreon RG-15 Solid State Rain sensor (+1k5 code) +#undef USE_VINDRIKTNING // Disable support for IKEA VINDRIKTNING particle concentration sensor (+0k6 code) + +#undef USE_ENERGY_SENSOR // Disable energy sensors + +#undef USE_DHT // Disable support for DHT11, AM2301 (DHT21, DHT22, AM2302, AM2321) and SI7021 Temperature and Humidity sensor +#undef USE_MAX31855 // Disable MAX31855 K-Type thermocouple sensor using softSPI +#undef USE_MAX31865 // Disable support for MAX31865 RTD sensors using softSPI +#undef USE_LMT01 // Disable support for TI LMT01 temperature sensor, count pulses on single GPIO (+0k5 code) +#undef USE_IR_REMOTE // Disable IR driver +#undef USE_TM1638 // Disable support for TM1638 switches copying Switch1 .. Switch8 +#undef USE_HX711 // Disable support for HX711 load cell +#undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer +#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer +#undef USE_WINDMETER // Disable support for analog anemometer (+2k2 code) +#undef USE_RC_SWITCH // Disable support for RF transceiver using library RcSwitch +#undef USE_RF_SENSOR // Disable support for RF sensor receiver (434MHz or 868MHz) (+0k8 code) +#undef USE_HRE // Disable support for Badger HR-E Water Meter (+1k4 code) +#undef USE_A4988_STEPPER // Disable support for A4988_Stepper +#undef USE_THERMOSTAT // Disable support for Thermostat +#undef USE_PROMETHEUS // Disable support for https://prometheus.io/ metrics exporting over HTTP /metrics endpoint +#undef DEBUG_THEO // Disable debug code +#undef USE_DEBUG_DRIVER // Disable debug code +#undef USE_AC_ZERO_CROSS_DIMMER // Disable support for AC_ZERO_CROSS_DIMMER +#endif // FIRMWARE_SAFEMODE + /*********************************************************************************************\ * [tasmota32-webcam.bin] * Provide an image with useful supported sensors enabled From 960cee17abfb7428e1c9f80e5c418d1c621142ef Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 3 May 2022 13:45:28 +0200 Subject: [PATCH 135/376] Update Tasmota_build_devel.yml --- .github/workflows/Tasmota_build_devel.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index adedf4720..eec1bccf5 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -121,7 +121,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ - [ ! -f ./mv_firmware/firmware/tasmota32-safemode ] || mv ./mv_firmware/firmware/tasmota32-safemode ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-safemode* ] || mv ./mv_firmware/firmware/tasmota32-safemode* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/* ] || mv ./mv_firmware/firmware/* ./firmware/tasmota/languages/ From 160282b261443b14cfb8fd420f802cbf8c9631f2 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 3 May 2022 13:49:19 +0200 Subject: [PATCH 136/376] safemode bin repo is arendst/Tasmota-firmware/ --- pio-tools/post_esp32.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 76a83d1df..0207fb8ce 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -38,7 +38,7 @@ variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") def esp32_fetch_safemode_bin(chip): - safemode_fw_url = "https://github.com/Jason2866/Tasmota-specials/raw/firmware/firmware/tasmota32/other/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" safemode_fw_name = safemode_dir + "/tasmota" + chip[3:] + "-safemode.bin" if(exists(safemode_fw_name)): print("Safemode binary already downloaded.") From fe734e6d21b22c5b975f215800ef49bd7e26116c Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Tue, 3 May 2022 15:21:11 +0200 Subject: [PATCH 137/376] Update italian language --- tasmota/language/it_IT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index e8622e37e..1bc0ea809 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v11.0.0.7 - Last update 30.04.2022 + * Updated until v9.4.0.1 - Last update 03.05.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -372,7 +372,7 @@ #define D_OTA_URL "URL OTA" #define D_START_UPGRADE "Esegui aggiornamento" #define D_UPGRADE_BY_FILE_UPLOAD "Aggiornamento tramite file locale" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Passaggio a partizione avvio sicuro" #define D_UPLOAD_STARTED "Caricamento..." #define D_UPGRADE_STARTED "Aggiornamento..." #define D_UPLOAD_DONE "Caricamento completato" From 3a96ac45287fc965b685dc1e4db74c5e1087b34d Mon Sep 17 00:00:00 2001 From: pkkrusty <79770016+pkkrusty@users.noreply.github.com> Date: Tue, 3 May 2022 19:22:51 +0000 Subject: [PATCH 138/376] define INFLUXDB_RP --- tasmota/my_user_config.h | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a3344e41f..bbb5ec3b9 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -415,6 +415,7 @@ // #define INFLUXDB_ORG "" // [IfxUser, IfxOrg] Influxdb v1 username or v2 organisation // #define INFLUXDB_TOKEN "" // [IfxPassword, IfxToken] Influxdb v1 password or v2 token // #define INFLUXDB_BUCKET "db" // [IfxDatabase, IfxBucket] Influxdb v1 database or v2 bucket +// #define INFLUXDB_RP "" // [IfxRP] Influxdb retention policy // -- MQTT ---------------------------------------- #define MQTT_LWT_OFFLINE "Offline" // MQTT LWT offline topic message From 0f14c14e7fab45f60721f7af7470c934ee134750 Mon Sep 17 00:00:00 2001 From: barbudor Date: Tue, 3 May 2022 22:16:24 +0200 Subject: [PATCH 139/376] so140 for persistent mqtt session --- tasmota/settings.h | 2 +- tasmota/settings.ino | 1 + tasmota/xdrv_02_9_mqtt.ino | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 8a302ad55..35c6b71d5 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -169,7 +169,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) uint32_t mm_vs_inch : 1; // bit 25 (v11.1.0.1) - SetOption139 - (Pressure) Switch between mmHg (0) or inHg (1) when SO24 1 - uint32_t spare26 : 1; // bit 26 + uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - 0=MQTT clean session (default), 1=MQTT persistent session uint32_t spare27 : 1; // bit 27 uint32_t spare28 : 1; // bit 28 uint32_t spare29 : 1; // bit 29 diff --git a/tasmota/settings.ino b/tasmota/settings.ino index 54b68a35a..b0fefb41b 100644 --- a/tasmota/settings.ino +++ b/tasmota/settings.ino @@ -983,6 +983,7 @@ void SettingsDefaultSet2(void) { flag5.mqtt_info_retain |= MQTT_INFO_RETAIN; flag5.mqtt_state_retain |= MQTT_STATE_RETAIN; flag5.mqtt_switches |= MQTT_SWITCHES; + flag5.mqtt_persistent |= ~MQTT_CLEAN_SESSION; // flag.mqtt_serial |= 0; flag.device_index_enable |= MQTT_POWER_FORMAT; flag3.time_append_timezone |= MQTT_APPEND_TIMEZONE; diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index 05432e965..9f4e38387 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -1098,9 +1098,9 @@ void MqttReconnect(void) { } String azureMqtt_userString = String(SettingsText(SET_MQTT_HOST)) + "/" + String(SettingsText(SET_MQTT_CLIENT)); + "/?api-version=2018-06-30"; - if (MqttClient.connect(TasmotaGlobal.mqtt_client, azureMqtt_userString.c_str(), azureMqtt_password.c_str(), stopic, 1, lwt_retain, ResponseData(), MQTT_CLEAN_SESSION)) { + if (MqttClient.connect(TasmotaGlobal.mqtt_client, azureMqtt_userString.c_str(), azureMqtt_password.c_str(), stopic, 1, lwt_retain, ResponseData(), Settings->flag5.mqtt_persistent ? 0:1)) { #else - if (MqttClient.connect(TasmotaGlobal.mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, lwt_retain, ResponseData(), MQTT_CLEAN_SESSION)) { + if (MqttClient.connect(TasmotaGlobal.mqtt_client, mqtt_user, mqtt_pwd, stopic, 1, lwt_retain, ResponseData(), Settings->flag5.mqtt_persistent ? 0:1)) { #endif // USE_MQTT_AZURE_IOT #ifdef USE_MQTT_TLS if (Mqtt.mqtt_tls) { From 1b7c182656fa413fdeaecb35a512d6e697a71616 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 3 May 2022 22:25:23 +0200 Subject: [PATCH 140/376] Safemode refactor (again ;-) ) (#15529) * add more safemode boards.json * no safemode folder * staars changes --- boards/esp32c3_2APP.json | 2 +- boards/esp32s2_2APP.json | 43 +++++++++++++++++++++++++++++++ boards/esp32s3_2APP.json | 46 +++++++++++++++++++++++++++++++++ pio-tools/post_esp32.py | 49 +++++++++++++++++++----------------- platformio_tasmota_env32.ini | 7 +++--- safemode/placeholder | 1 - 6 files changed, 120 insertions(+), 28 deletions(-) create mode 100644 boards/esp32s2_2APP.json create mode 100644 boards/esp32s3_2APP.json delete mode 100644 safemode/placeholder diff --git a/boards/esp32c3_2APP.json b/boards/esp32c3_2APP.json index 58d029c3c..1d21ff1df 100644 --- a/boards/esp32c3_2APP.json +++ b/boards/esp32c3_2APP.json @@ -22,7 +22,7 @@ "arduino", "espidf" ], - "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", "upload": { "arduino": { "flash_extra_images": [ diff --git a/boards/esp32s2_2APP.json b/boards/esp32s2_2APP.json new file mode 100644 index 000000000..0227a4a11 --- /dev/null +++ b/boards/esp32s2_2APP.json @@ -0,0 +1,43 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s2_out.ld" + }, + "core": "esp32", + "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DESP32_4M -DESP32S2", + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dout", + "mcu": "esp32s2", + "variant": "esp32s2", + "partitions": "esp32_partition_app2880k_spiffs320k.csv" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32s2.cfg" + }, + "frameworks": [ + "espidf", + "arduino" + ], + "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32s2-safemode.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-saola-1-v1.2.html", + "vendor": "Espressif" +} diff --git a/boards/esp32s3_2APP.json b/boards/esp32s3_2APP.json new file mode 100644 index 000000000..1a37483e4 --- /dev/null +++ b/boards/esp32s3_2APP.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "memory_type": "qspi_qspi" + }, + "core": "esp32", + "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DESP32_4M -DESP32S3", + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "mcu": "esp32s3", + "variant": "esp32s3", + "partitions": "esp32_partition_app2880k_spiffs320k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "espidf", + "arduino" + ], + "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32s3-safemode.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/", + "vendor": "Espressif" +} diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 0207fb8ce..d149d9405 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -33,23 +33,25 @@ sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) import esptool FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") -safemode_dir = join(env["PROJECT_DIR"], "safemode") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") - def esp32_fetch_safemode_bin(chip): safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" - safemode_fw_name = safemode_dir + "/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") if(exists(safemode_fw_name)): - print("Safemode binary already downloaded.") - return safemode_fw_name + print("Safemode binary already in place.") + return print("Will download safemode binary from URL:") print(safemode_fw_url) response = requests.get(safemode_fw_url) open(safemode_fw_name, "wb").write(response.content) - print("Safemode binary written to safemode dir.") - return safemode_fw_name + print("Safemode binary written to variants dir.") +def esp32_copy_new_safemode_bin(chip,new_local_safemode_fw): + print("Copy new local safemode firmware to variants dir -> using it for further flashing operations") + safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") + if os.path.exists(variants_dir): + shutil.copy(new_local_safemode_fw, safemode_fw_name) def esp32_create_combined_bin(source, target, env): #print("Generating combined binary for serial flashing") @@ -72,17 +74,22 @@ def esp32_create_combined_bin(source, target, env): line_count += 1 if(row[0] == 'app0'): app_offset = int(row[3],base=16) - elif(row[0] == 'factory'): - factory_offset = int(row[3],base=16) - elif(row[0] == 'spiffs'): - spiffs_offset = int(row[3],base=16) -# print("Got app_offset from .csv:", row[3]) + # elif(row[0] == 'factory'): + # factory_offset = int(row[3],base=16) + # elif(row[0] == 'spiffs'): + # spiffs_offset = int(row[3],base=16) + new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") - esp32_fetch_safemode_bin(chip) + if not os.path.exists(variants_dir): + os.makedirs(variants_dir) + if("safemode" in firmware_name): + esp32_copy_new_safemode_bin(chip,firmware_name) + else: + esp32_fetch_safemode_bin(chip) flash_size = env.BoardConfig().get("upload.flash_size") cmd = [ "--chip", @@ -100,16 +107,12 @@ def esp32_create_combined_bin(source, target, env): print(f" - {sect_adr} | {sect_file}") cmd += [sect_adr, sect_file] - if os.path.exists(safemode_dir): - #print("safemode.bin dir exists") - if os.path.exists(variants_dir): - #print("variants/tasmota exists") - shutil.rmtree(variants_dir) - shutil.copytree(safemode_dir, variants_dir) - - # "main" firmware to app0 - mandatory - print(f" - {hex(app_offset)} | {firmware_name}") - cmd += [hex(app_offset), firmware_name] + # "main" firmware to app0 - mandatory, except we just built a new safemode bin locally + if("safemode" not in firmware_name): + print(f" - {hex(app_offset)} | {firmware_name}") + cmd += [hex(app_offset), firmware_name] + else: + print("Upload new safemode binary only") #print('Using esptool.py arguments: %s' % ' '.join(cmd)) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 16426521e..93f980e3d 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -118,6 +118,7 @@ lib_ignore = [env:tasmota32-safemode] extends = env:tasmota32_base +board = esp32_4M_2APP build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -128,7 +129,7 @@ lib_ignore = [env:tasmota32s2-safemode] extends = env:tasmota32_base -board = esp32s2 +board = esp32s2_2APP build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -139,7 +140,7 @@ lib_ignore = [env:tasmota32s3-safemode] extends = env:tasmota32_base -board = esp32s3 +board = esp32s3_2APP build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -150,7 +151,7 @@ lib_ignore = [env:tasmota32c3-safemode] extends = env:tasmota32_base -board = esp32c3 +board = esp32c3_2APP build_unflags = ${env:tasmota32_base.build_unflags} -flto -mtarget-align diff --git a/safemode/placeholder b/safemode/placeholder deleted file mode 100644 index 8b1378917..000000000 --- a/safemode/placeholder +++ /dev/null @@ -1 +0,0 @@ - From ca9eca5e84effcd97aad1869c9eb8255fe306ab0 Mon Sep 17 00:00:00 2001 From: Philipp Richter Date: Wed, 4 May 2022 00:23:26 +0200 Subject: [PATCH 141/376] Better describe WcFeature --- tasmota/xdrv_81_esp32_webcam.ino | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_81_esp32_webcam.ino b/tasmota/xdrv_81_esp32_webcam.ino index 253a22b2f..b00c3504d 100644 --- a/tasmota/xdrv_81_esp32_webcam.ino +++ b/tasmota/xdrv_81_esp32_webcam.ino @@ -59,7 +59,7 @@ * WcSaturation = Set picture Saturation -2 ... +2 * WcBrightness = Set picture Brightness -2 ... +2 * WcContrast = Set picture Contrast -2 ... +2 - * WcSpecialEffekt = Set Special Picture Effect: 0 = off, 1 = , 2 = , 3 = , 4 = , 5 = , 6 = + * WcSpecialEffekt = Set Special Picture Effect: 0 = off, 1 = , 2 = , 3 = , 4 = , 5 = , 6 = * WcAWB = Auto White Balance, 0 = no, 1 = yes * WcWBMode = White Balance Mode, 0 = auto, 1 = * WcAWBGain = Auto White Balance Gain, 0 = no, 1 = yes @@ -81,6 +81,15 @@ * WcInit = Init Camera Interface * WcRtsp = Control RTSP Server, 0=disable, 1=enable (forces restart) (if defined ENABLE_RTSPSERVER) * + * WcFeature Explanation + * See https://hobbylad.files.wordpress.com/2020/02/ov2640-camera-module-software-application-notes.pdf + * for more Information + * 0: Normal Operation + * 1: Reduced FPS: Set XCLK Divisor to 2. Reduces Framerate and also increases exposure time. This causes + * better low light performance. See above document, page 6 + * 2: Night Mode: Further increase exposure time and lower the Framerate depending on available light. + * See above Document, Page 8 + * * Only boards with PSRAM should be used. To enable PSRAM board should be se set to esp32cam in common32 of platform_override.ini * board = esp32cam * To speed up cam processing cpu frequency should be better set to 240Mhz in common32 of platform_override.ini From d280dc535f605817f18f26be919e084f89617793 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 10:07:24 +0200 Subject: [PATCH 142/376] Add features to SafeMode binary --- tasmota/my_user_config.h | 4 ++- tasmota/support_command.ino | 8 ++--- tasmota/tasmota_configurations.h | 2 ++ tasmota/tasmota_configurations_ESP32.h | 43 ++++++++++++++++++-------- tasmota/xdrv_01_webserver.ino | 10 ++---- tasmota/xdrv_02_9_mqtt.ino | 8 ++--- tasmota/xsns_127_esp32_sensors.ino | 2 ++ 7 files changed, 48 insertions(+), 29 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a3344e41f..54ae4d6ae 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -999,6 +999,8 @@ #define SET_ESP32_STACK_SIZE (8 * 1024) // Set the stack size for Tasmota. The default value is 8192 for Arduino, some builds might need to increase it +#define USE_ESP32_SENSORS // Add support for ESP32 temperature and optional hall effect sensor + //#define USE_SONOFF_SPM // Add support for ESP32 based Sonoff Smart Stackable Power Meter (+11k code) //#define USE_ETHERNET // Add support for ethernet (+20k code) @@ -1084,7 +1086,7 @@ #define BE_LV_WIDGET_SPINNER #define BE_LV_WIDGET_QRCODE - + #endif // ESP32 /*********************************************************************************************\ diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 7a568e4a2..33c055caf 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -22,7 +22,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_SO_WIFINOSLEEP "|" // Other commands D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|" D_CMND_SERIALLOG "|" D_CMND_RESTART "|" -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_SLEEP "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SAVEDATA "|" D_CMND_SO "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|" D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|" @@ -48,7 +48,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix #ifdef ESP32 "|Info|" D_CMND_TOUCH_CAL "|" D_CMND_TOUCH_THRES "|" D_CMND_TOUCH_NUM "|" D_CMND_CPU_FREQUENCY #endif // ESP32 -#endif //FIRMWARE_MINIMAL +#endif //FIRMWARE_MINIMAL_ONLY ; SO_SYNONYMS(kTasmotaSynonyms, @@ -57,7 +57,7 @@ SO_SYNONYMS(kTasmotaSynonyms, void (* const TasmotaCommand[])(void) PROGMEM = { &CmndUpgrade, &CmndUpgrade, &CmndOtaUrl, &CmndSeriallog, &CmndRestart, -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY &CmndBacklog, &CmndDelay, &CmndPower, &CmndStatus, &CmndState, &CmndSleep, &CmndPowerOnState, &CmndPulsetime, &CmndBlinktime, &CmndBlinkcount, &CmndSavedata, &CmndSetoption, &CmndSetoption, &CmndTemperatureResolution, &CmndHumidityResolution, &CmndPressureResolution, &CmndPowerResolution, @@ -83,7 +83,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = { #ifdef ESP32 , &CmndInfo, &CmndTouchCal, &CmndTouchThres, &CmndTouchNum, &CmndCpuFrequency #endif // ESP32 -#endif //FIRMWARE_MINIMAL +#endif //FIRMWARE_MINIMAL_ONLY }; const char kWifiConfig[] PROGMEM = diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index d97569395..f6b7682c4 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -778,6 +778,8 @@ #undef CODE_IMAGE_STR #define CODE_IMAGE_STR "minimal" +#define FIRMWARE_MINIMAL_ONLY + #undef FIRMWARE_LITE // Disable tasmota-lite with no sensors #undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled #undef FIRMWARE_KNX_NO_EMULATION // Disable tasmota-knx with KNX but without Emulation diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index d85b93e09..39a6c39c2 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -25,26 +25,15 @@ /*********************************************************************************************\ * [tasmota32x-safemode.bin] * Provide an image with useful supported sensors enabled + * + * Is a copy of FIRMWARE_MINIMAL with some additional features enabled \*********************************************************************************************/ #ifdef FIRMWARE_SAFEMODE -#define FIRMWARE_MINIMAL #undef CODE_IMAGE_STR #define CODE_IMAGE_STR "safemode" -#define USE_TLS -#define USE_WEBSERVER -#define USE_WEBCLIENT -#define USE_WEBCLIENT_HTTPS - -#undef USE_UFILESYS -#undef GUI_TRASH_FILE -#undef GUI_EDIT_FILE -#undef USE_PING -#undef USE_AUTOCONF -#undef USE_BERRY - #undef FIRMWARE_LITE // Disable tasmota-lite with no sensors #undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled #undef FIRMWARE_KNX_NO_EMULATION // Disable tasmota-knx with KNX but without Emulation @@ -55,6 +44,10 @@ #undef FIRMWARE_LVGL #undef FIRMWARE_TASMOTA32 +/*-------------------------------------------------------------------------------------------*\ + * Start copy of all undefines from FIRMWARE_MINIMAL +\*-------------------------------------------------------------------------------------------*/ + #undef USE_IMPROV // Disable support for IMPROV serial protocol as used by esp-web-tools (+2k code) #undef USE_TASMESH // Disable Tasmota Mesh using ESP-NOW (+11k code) #undef USE_ARDUINO_OTA // Disable support for Arduino OTA @@ -164,6 +157,30 @@ #undef DEBUG_THEO // Disable debug code #undef USE_DEBUG_DRIVER // Disable debug code #undef USE_AC_ZERO_CROSS_DIMMER // Disable support for AC_ZERO_CROSS_DIMMER + +/*-------------------------------------------------------------------------------------------*\ + * End copy of all undefines from FIRMWARE_MINIMAL + * + * Start FIRMWARE_SAFEMODE specific additions +\*-------------------------------------------------------------------------------------------*/ + +#define FIRMWARE_MINIMAL + +#undef FIRMWARE_MINIMAL_ONLY + +#undef USE_ESP32_SENSORS +#undef USE_UFILESYS +#undef GUI_TRASH_FILE +#undef GUI_EDIT_FILE +#undef USE_PING +#undef USE_AUTOCONF +#undef USE_BERRY + +#define USE_TLS +#define USE_WEBSERVER +#define USE_WEBCLIENT +#define USE_WEBCLIENT_HTTPS + #endif // FIRMWARE_SAFEMODE /*********************************************************************************************\ diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 2c1646ab9..eebed27fe 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -244,11 +244,11 @@ const char HTTP_HEAD_STYLE3[] PROGMEM = "
" // COLOR_TEXT #ifdef FIRMWARE_MINIMAL #ifdef FIRMWARE_SAFEMODE - "

SafeMode

" // COLOR_TEXT_SUCCESS + "

" D_SAFEMODE "

" // COLOR_TEXT_WARNING #else "

" D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "

" // COLOR_TEXT_WARNING -#endif -#endif +#endif // FIRMWARE_SAFEMODE +#endif // FIRMWARE_MINIMAL "
" // COLOR_TITLE /* #ifdef LANGUAGE_MODULE_NAME @@ -883,11 +883,7 @@ void WSContentSendStyle_P(const char* formatP, ...) { } WSContentSend_P(HTTP_HEAD_STYLE3, WebColor(COL_TEXT), #ifdef FIRMWARE_MINIMAL -#ifdef FIRMWARE_SAFEMODE - WebColor(COL_TEXT_SUCCESS), -#else WebColor(COL_TEXT_WARNING), -#endif #endif WebColor(COL_TITLE), (Web.initial_config) ? "" : ModuleName().c_str(), SettingsText(SET_DEVICENAME)); diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index 05432e965..f5446207a 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -45,7 +45,7 @@ WiFiClient EspClient; // Wifi Client - non-TLS #endif // USE_MQTT_AZURE_IOT const char kMqttCommands[] PROGMEM = "|" // No prefix -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY // SetOption synonyms D_SO_MQTTJSONONLY "|" #ifdef USE_MQTT_TLS @@ -67,7 +67,7 @@ const char kMqttCommands[] PROGMEM = "|" // No prefix D_CMND_FULLTOPIC "|" D_CMND_PREFIX "|" D_CMND_GROUPTOPIC "|" D_CMND_TOPIC "|" D_CMND_PUBLISH "|" D_CMND_MQTTLOG "|" D_CMND_BUTTONTOPIC "|" D_CMND_SWITCHTOPIC "|" D_CMND_BUTTONRETAIN "|" D_CMND_SWITCHRETAIN "|" D_CMND_POWERRETAIN "|" D_CMND_SENSORRETAIN "|" D_CMND_INFORETAIN "|" D_CMND_STATERETAIN -#endif // FIRMWARE_MINIMAL +#endif // FIRMWARE_MINIMAL_ONLY ; SO_SYNONYMS(kMqttSynonyms, @@ -79,7 +79,7 @@ SO_SYNONYMS(kMqttSynonyms, ); void (* const MqttCommand[])(void) PROGMEM = { -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY #if defined(USE_MQTT_TLS) &CmndMqttFingerprint, #endif @@ -94,7 +94,7 @@ void (* const MqttCommand[])(void) PROGMEM = { &CmndFullTopic, &CmndPrefix, &CmndGroupTopic, &CmndTopic, &CmndPublish, &CmndMqttlog, &CmndButtonTopic, &CmndSwitchTopic, &CmndButtonRetain, &CmndSwitchRetain, &CmndPowerRetain, &CmndSensorRetain, &CmndInfoRetain, &CmndStateRetain -#endif // FIRMWARE_MINIMAL +#endif // FIRMWARE_MINIMAL_ONLY }; struct MQTT { diff --git a/tasmota/xsns_127_esp32_sensors.ino b/tasmota/xsns_127_esp32_sensors.ino index 5b6ff3e69..8ac2ee7f6 100644 --- a/tasmota/xsns_127_esp32_sensors.ino +++ b/tasmota/xsns_127_esp32_sensors.ino @@ -18,6 +18,7 @@ */ #ifdef ESP32 +#ifdef USE_ESP32_SENSORS #ifndef CONFIG_IDF_TARGET_ESP32S3 /*********************************************************************************************\ * ESP32 CPU Temperature and optional Hall Effect sensor @@ -140,4 +141,5 @@ bool Xsns127(uint8_t function) { } #endif // Not CONFIG_IDF_TARGET_ESP32S3 +#endif // USE_ESP32_SENSORS #endif // ESP32 From 35bbb8192c2000ba2116a94c6734ff72469d265d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 10:10:04 +0200 Subject: [PATCH 143/376] Updated language files --- tasmota/language/af_AF.h | 3 ++- tasmota/language/bg_BG.h | 3 ++- tasmota/language/cs_CZ.h | 3 ++- tasmota/language/de_DE.h | 3 ++- tasmota/language/el_GR.h | 3 ++- tasmota/language/en_GB.h | 3 ++- tasmota/language/es_ES.h | 3 ++- tasmota/language/fr_FR.h | 3 ++- tasmota/language/fy_NL.h | 3 ++- tasmota/language/he_HE.h | 3 ++- tasmota/language/hu_HU.h | 3 ++- tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 3 ++- tasmota/language/nl_NL.h | 3 ++- tasmota/language/pl_PL.h | 3 ++- tasmota/language/pt_BR.h | 3 ++- tasmota/language/pt_PT.h | 3 ++- tasmota/language/ro_RO.h | 3 ++- tasmota/language/ru_RU.h | 3 ++- tasmota/language/sk_SK.h | 3 ++- tasmota/language/sv_SE.h | 3 ++- tasmota/language/tr_TR.h | 3 ++- tasmota/language/uk_UA.h | 3 ++- tasmota/language/vi_VN.h | 3 ++- tasmota/language/zh_CN.h | 3 ++- tasmota/language/zh_TW.h | 3 ++- 26 files changed, 51 insertions(+), 25 deletions(-) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 8d96dd5d8..6786c67e4 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Skakel JavaScript aan om Tasmota te gebruik" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
gradeer asseblief op" #define D_WEBSERVER_ACTIVE_ON "Webbediener aktief op" #define D_WITH_IP_ADDRESS "met IP-adres" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Begin opgradering" #define D_UPGRADE_BY_FILE_UPLOAD "Gradeer op volgens lêeroplaai" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Oplaai begin" #define D_UPGRADE_STARTED "Opgradering is begin" #define D_UPLOAD_DONE "Oplaai gedoen" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index d38d30f81..475e67f14 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "За да използвате Tasmota разрешете JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Вграденият софтуер е MINIMAL
надградете го" #define D_WEBSERVER_ACTIVE_ON "Уеб сървърът е достъпен на" #define D_WITH_IP_ADDRESS "с адрес по IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "Адрес на сървър за OTA" #define D_START_UPGRADE "Начало на обновяване" #define D_UPGRADE_BY_FILE_UPLOAD "Обновяване от файл" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Качване" #define D_UPGRADE_STARTED "Обновяване" #define D_UPLOAD_DONE "Качването завърши" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 628a87aca..a64798a84 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Pro používání prostředí Tasmota povolte JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMÁLNÍ
prosím zaktualizujte" #define D_WEBSERVER_ACTIVE_ON "Aktivní Web server" #define D_WITH_IP_ADDRESS "na IP adrese" @@ -372,7 +373,7 @@ #define D_OTA_URL "URL OTA" #define D_START_UPGRADE "Start aktualizace" #define D_UPGRADE_BY_FILE_UPLOAD "Aktualizace nahráním souboru" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Nahrávání zahájeno" #define D_UPGRADE_STARTED "Zahájení aktualizace" #define D_UPLOAD_DONE "Nahrávání ukončeno" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index b4365df39..022ca04d1 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "JavaScript aktivieren um Tasmota benutzen zu können" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMUM-Firmware
bitte upgraden" #define D_WEBSERVER_ACTIVE_ON "Web-Server aktiv bei" #define D_WITH_IP_ADDRESS "mit IP-Adresse" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA-URL" #define D_START_UPGRADE "Update starten" #define D_UPGRADE_BY_FILE_UPLOAD "Update Datei hochladen" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Upload gestartet" #define D_UPGRADE_STARTED "Update gestartet" #define D_UPLOAD_DONE "Upload abgeschlossen" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 4ce0c2b43..62faa826b 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -243,6 +243,7 @@ // webserver.ino #define D_NOSCRIPT "To use Tasmota, please enable JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
παρακαλώ αναβαθμίστε" #define D_WEBSERVER_ACTIVE_ON "Ενεργός διακομιστής Web στο" #define D_WITH_IP_ADDRESS "με διεύθυνση IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA URL" #define D_START_UPGRADE "Εκκίνηση αναβάθμισης" #define D_UPGRADE_BY_FILE_UPLOAD "Αναβάθμιση με μεταφόρτωση αρχείου" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Η μεταφόρτωση ξεκίνησε" #define D_UPGRADE_STARTED "Η αναβάθμιση ξεκίνησε" #define D_UPLOAD_DONE "Η μεταφόρτωση ολοκληρώθηκε" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index cdb40a7a7..2fe59ac05 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "To use Tasmota, please enable JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
please upgrade" #define D_WEBSERVER_ACTIVE_ON "Web server active on" #define D_WITH_IP_ADDRESS "with IP address" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Start upgrade" #define D_UPGRADE_BY_FILE_UPLOAD "Upgrade by file upload" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Upload started" #define D_UPGRADE_STARTED "Upgrade started" #define D_UPLOAD_DONE "Upload done" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 2479a92d9..37fe02bf4 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Habilitar JavaScript para usar Tasmota" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MÍNIMO
actualice por favor" #define D_WEBSERVER_ACTIVE_ON "Servidor web activo en" #define D_WITH_IP_ADDRESS "con dirección IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Comenzar actualización" #define D_UPGRADE_BY_FILE_UPLOAD "Actualizar cargando archivo bin" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Cargando archivo" #define D_UPGRADE_STARTED "Actualización iniciada" #define D_UPLOAD_DONE "Carga finalizada" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 37d99584c..823898c8a 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Pour utiliser Tasmota, veuillez activer JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMAL
merci de mettre à jour" #define D_WEBSERVER_ACTIVE_ON "Serveur web actif sur" #define D_WITH_IP_ADDRESS "avec l'adresse IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "URL OTA" #define D_START_UPGRADE "Lancer la mise à jour" #define D_UPGRADE_BY_FILE_UPLOAD "Mise à jour par téléchargement fichier" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Téléchargement lancé" #define D_UPGRADE_STARTED "Mise à jour lancée" #define D_UPLOAD_DONE "Téléchargement terminé" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 15b92f7c3..32dc0a11f 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Aktivearje JavaScript foar Tasmota" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMALE firmware
upgrade" #define D_WEBSERVER_ACTIVE_ON "Webserver aktyf op" #define D_WITH_IP_ADDRESS "mei IP-adres" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Begjin upgrade" #define D_UPGRADE_BY_FILE_UPLOAD "Upgrade op bestân upload" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Upload begon" #define D_UPGRADE_STARTED "Upgrade begon" #define D_UPLOAD_DONE "Upload dien" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index e157192cb..451dd939f 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "JavaScript - כדי להשתמש בקושחת אסמוטה אנא הפעל" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "קושחה מינימלית
בבקשה אנא שדרג" #define D_WEBSERVER_ACTIVE_ON "שרת ווב פעיל" #define D_WITH_IP_ADDRESS "IP עם כתובת" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA כתובת" #define D_START_UPGRADE "התחל בשדרוג" #define D_UPGRADE_BY_FILE_UPLOAD "שדרוג דרך קובץ נכשל" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "העלאה מתחילה" #define D_UPGRADE_STARTED "שדרוג מתחיל" #define D_UPLOAD_DONE "העלאה הסתיימה" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index e83341bca..c049063cf 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "A Tasmota használatához engedélyezd a Javascriptet!" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMÁLIS firmware
frissítsd!" #define D_WEBSERVER_ACTIVE_ON "Webszerver aktív:" #define D_WITH_IP_ADDRESS "IP cím:" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA URL" #define D_START_UPGRADE "Frissítés" #define D_UPGRADE_BY_FILE_UPLOAD "Frissítés helyi fájllal" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Feltöltés elindítva" #define D_UPGRADE_STARTED "Frissítés elindítva" #define D_UPLOAD_DONE "Feltöltés kész" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 1bc0ea809..0d4692009 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Per usare Tasmota abilita JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMALE
Effettua aggiornamento" #define D_WEBSERVER_ACTIVE_ON "Server web attivo in" #define D_WITH_IP_ADDRESS "con indirizzo IP" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 261345b88..fcaf0397b 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Tasmota를 사용하려면 JavaScript를 활성화 하십시오." +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
업그레이드가 필요합니다" #define D_WEBSERVER_ACTIVE_ON "Web 서버 작동 중" #define D_WITH_IP_ADDRESS "IP 주소" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "업그레이드 시작" #define D_UPGRADE_BY_FILE_UPLOAD "파일에서 업로드해 업그레이드" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "업로드 시작됨" #define D_UPGRADE_STARTED "업그레이드 시작됨" #define D_UPLOAD_DONE "업그레이드 완료" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index db0de2f7e..c278872c3 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Zet JavaScript aan voor Tasmota" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
opwaarderen" #define D_WEBSERVER_ACTIVE_ON "Webserver actief op" #define D_WITH_IP_ADDRESS "met IP adres" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Start opwaarderen" #define D_UPGRADE_BY_FILE_UPLOAD "Opwaarderen dmv verzenden bestand" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Verzending gestart" #define D_UPGRADE_STARTED "Opwaarderen gestart" #define D_UPLOAD_DONE "Opwaarderen klaar" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 88eb1f797..d21bb7c46 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Aby korzystać z Tasmota, włącz obsługę JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Oprogramowanie MINIMAL
proszę uaktualnić" #define D_WEBSERVER_ACTIVE_ON "Aktywny serwer Web" #define D_WITH_IP_ADDRESS "z adresem IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "Adres serwera" #define D_START_UPGRADE "Aktualizuj" #define D_UPGRADE_BY_FILE_UPLOAD "Aktualizacja z pliku" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Wgrywanie rozpoczęte" #define D_UPGRADE_STARTED "Aktualizacja rozpoczęta" #define D_UPLOAD_DONE "Wgrywanie zakończone" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index ae3234214..44828d477 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Para usar o Tasmota, por favor habilite o JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware mínimo
Atualizar por favor" #define D_WEBSERVER_ACTIVE_ON "Servidor WEB ativo em" #define D_WITH_IP_ADDRESS "com o endereço IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA URL" #define D_START_UPGRADE "Iniciar atualização" #define D_UPGRADE_BY_FILE_UPLOAD "Atualização por arquivo local" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Início do envio" #define D_UPGRADE_STARTED "Atualização iniciada" #define D_UPLOAD_DONE "Atualização finalizada" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 10b0252bc..2c67c2ee6 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Para utilizar o Tasmota, por favor ative o JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MÍNIMO
Por favor atualize" #define D_WEBSERVER_ACTIVE_ON "Servidor WEB ativo em" #define D_WITH_IP_ADDRESS "com o endereço IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "Url OTA" #define D_START_UPGRADE "Iniciar atualização" #define D_UPGRADE_BY_FILE_UPLOAD "Atualizar por envio de ficheiro" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Envio Iniciado" #define D_UPGRADE_STARTED "Atualização Iniciada" #define D_UPLOAD_DONE "Atualização Finalizada" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index bdb183bf9..1378ec958 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Pentru a folosi Tasmota, vă rugăm activați JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "firmware MINIMAL
vă rugăm actualizați" #define D_WEBSERVER_ACTIVE_ON "Server Web activ" #define D_WITH_IP_ADDRESS "cu adresa IP " @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Porneste actualizare" #define D_UPGRADE_BY_FILE_UPLOAD "Actualizare prin încărcare fișier" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Încărcare începută" #define D_UPGRADE_STARTED "Actualizare începută" #define D_UPLOAD_DONE "Încărcare terminată" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index e37f5142d..9d231fef7 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "To use Tasmota, please enable JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Прошивка MINIMAL
пожалуйста обновите" #define D_WEBSERVER_ACTIVE_ON "Веб-сервер активен" #define D_WITH_IP_ADDRESS "с IP-адресом" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Начать обновление" #define D_UPGRADE_BY_FILE_UPLOAD "Обновление путем загрузки файлов" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Загрузка началась" #define D_UPGRADE_STARTED "Обновление началось" #define D_UPLOAD_DONE "Загрузка завершена" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 564783ee3..63b978443 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Pre používanie prostredia Tasmota povoľte JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMÁLNY
prosím aktualizujte" #define D_WEBSERVER_ACTIVE_ON "Aktívny Web server" #define D_WITH_IP_ADDRESS "na IP adrese" @@ -372,7 +373,7 @@ #define D_OTA_URL "URL OTA" #define D_START_UPGRADE "Spustiť aktualizáciu" #define D_UPGRADE_BY_FILE_UPLOAD "Aktualizácia nahraním súboru" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Nahrávanie spustené" #define D_UPGRADE_STARTED "Aktualizácia spustená" #define D_UPLOAD_DONE "Nahrávanie ukončené" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 1021c512b..e8e9a4d38 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "För att använda Tasmota, aktivera JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL firmware
var god uppgradera" #define D_WEBSERVER_ACTIVE_ON "Webbserver aktiv på" #define D_WITH_IP_ADDRESS "med IP-adress" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Starta uppdatering" #define D_UPGRADE_BY_FILE_UPLOAD "Uppgradering via filuppladdning" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Uppladdning startad" #define D_UPGRADE_STARTED "Uppgradeing startad" #define D_UPLOAD_DONE "Uppladdning klar" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 78a0924e5..a6d24574d 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "To use Tasmota, please enable JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Donanım yazılımı çok düşük
lütfen yükseltin" #define D_WEBSERVER_ACTIVE_ON "Web sunucusu aktif" #define D_WITH_IP_ADDRESS "IP adres ile" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA Url" #define D_START_UPGRADE "Yükseltmeyi başlat" #define D_UPGRADE_BY_FILE_UPLOAD "Dosya kullanrak yükset" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Yükleme başlatıldı" #define D_UPGRADE_STARTED "YÜkestlme başlatıldı" #define D_UPLOAD_DONE "Yükleme Tamamlandı" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index e5b948ec7..79ec52539 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Для використання Tasmota треба увімкнути JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Прошивка MINIMAL
будь-ласка оновіть" #define D_WEBSERVER_ACTIVE_ON "Веб-сервер активний" #define D_WITH_IP_ADDRESS "з IP-адресою" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA URL" #define D_START_UPGRADE "Почати оновлення" #define D_UPGRADE_BY_FILE_UPLOAD "Оновлення шляхом завантаження файлів" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Завантаження почалось" #define D_UPGRADE_STARTED "Оновлення почалось" #define D_UPLOAD_DONE "Завантаження завершено" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index bb9d23a57..f69e61f57 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Để sử dụng Tasmota, vui lòng bật JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Đang sử dụng bản MINIMAL
vui lòng nâng cấp" #define D_WEBSERVER_ACTIVE_ON "Máy chủ Web đã bật" #define D_WITH_IP_ADDRESS "với địa chỉ IP" @@ -372,7 +373,7 @@ #define D_OTA_URL "Đường dẫn OTA" #define D_START_UPGRADE "Bắt đầu nâng cấp" #define D_UPGRADE_BY_FILE_UPLOAD "Nâng cấp thông qua tải lên tệp" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "Bắt đầu tải lên" #define D_UPGRADE_STARTED "Bắt đầu nâng cấp" #define D_UPLOAD_DONE "Hoàn thành tải tệp" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index a5c6381a6..cd9c91fd2 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -243,6 +243,7 @@ // webserver.ino #define D_NOSCRIPT "Tasmota 要求浏览器支持 JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "当前是精简版固件
请升级" #define D_WEBSERVER_ACTIVE_ON "Web 服务器地址:" #define D_WITH_IP_ADDRESS "IP 地址:" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA 地址" #define D_START_UPGRADE "开始升级" #define D_UPGRADE_BY_FILE_UPLOAD "通过文件升级" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "开始上传" #define D_UPGRADE_STARTED "开始升级" #define D_UPLOAD_DONE "上传完成" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 5aab42a00..68deb4a6b 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -243,6 +243,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "為了要使用 Tasmota,請啟用 JavaScript" +#define D_SAFEMODE "SAFEMODE" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "MINIMAL韌體
請升級" #define D_WEBSERVER_ACTIVE_ON "網頁伺服器已經啟動,位於:" #define D_WITH_IP_ADDRESS "IP位址:" @@ -372,7 +373,7 @@ #define D_OTA_URL "OTA網址" #define D_START_UPGRADE "開始升級" #define D_UPGRADE_BY_FILE_UPLOAD "透過檔案升級" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Switching to safemode partition" #define D_UPLOAD_STARTED "已開始上傳" #define D_UPGRADE_STARTED "已開始升級" #define D_UPLOAD_DONE "已上傳完成" From 829d3a49ada3c1feb4165f9dd27fafe34b2d066c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 10:19:49 +0200 Subject: [PATCH 144/376] Allow all commands in SafeMode --- tasmota/xdrv_01_webserver.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index eebed27fe..33d509885 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -3420,7 +3420,7 @@ const char kWebCmndStatus[] PROGMEM = D_JSON_DONE "|" D_JSON_WRONG_PARAMETERS "| const char kWebCommands[] PROGMEM = "|" // No prefix D_CMND_WEBLOG "|" -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY D_CMND_WEBTIME "|" #ifdef USE_EMULATION D_CMND_EMULATION "|" @@ -3436,12 +3436,12 @@ const char kWebCommands[] PROGMEM = "|" // No prefix #ifdef USE_CORS "|" D_CMND_CORS #endif -#endif // FIRMWARE_MINIMAL +#endif // FIRMWARE_MINIMAL_ONLY ; void (* const WebCommand[])(void) PROGMEM = { &CmndWeblog, -#ifndef FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY &CmndWebTime, #ifdef USE_EMULATION &CmndEmulation, @@ -3457,7 +3457,7 @@ void (* const WebCommand[])(void) PROGMEM = { #ifdef USE_CORS , &CmndCors #endif -#endif // FIRMWARE_MINIMAL +#endif // FIRMWARE_MINIMAL_ONLY }; /*********************************************************************************************\ From 7bf98fb52f909a18a1f3928e2b9200ffad3ac7f3 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 11:43:11 +0200 Subject: [PATCH 145/376] Use newest Tasmota Arduino framework based on IDF441. Support for Safemode --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 8c604f663..48b2597ca 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -38,7 +38,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-Tasmota-safe.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 4d0bcf641dd6daf730defda20f10d9692ffea77a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 12:12:40 +0200 Subject: [PATCH 146/376] Update solo1 to safemode framework --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 48b2597ca..038fd8e60 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -45,7 +45,7 @@ build_flags = ${esp32_defaults.build_flags} [core32solo1] -platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3solo1.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-Tasmota-solo1-safe.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 618c9b39d81fc2269d28ab2ff24aa5c4b7dd4706 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 4 May 2022 13:05:04 +0200 Subject: [PATCH 147/376] Address #15405 overflow of uint32_t 4h+ cause deepsleep to behave unexpected because of buffer overflow --- tasmota/xdrv_29_deepsleep.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 4a77c3f91..284100b52 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -79,7 +79,7 @@ void DeepSleepPrepare(void) // Timeslip in 0.1 seconds between the real wakeup and the calculated wakeup // Because deepsleep is in second and timeslip in 0.1 sec the compare always check if the slip is in the 10% range - int16_t timeslip = (int16_t)(RtcSettings.nextwakeup + millis() / 1000 - LocalTime()) * 10; + int32_t timeslip = ((int32_t)RtcSettings.nextwakeup + millis() / 1000 - (int32_t)LocalTime()) * 10; // Allow 10% of deepsleep error to count as valid deepsleep; expecting 3-4% // if more then 10% timeslip = 0 == non valid wakeup; maybe manual @@ -111,11 +111,12 @@ void DeepSleepStart(void) WifiShutdown(); RtcSettingsSave(); RtcRebootReset(); + uint64_t deepsleepticker = 100 * (uint64_t)RtcSettings.deepsleep_slip * (uint64_t)(RtcSettings.nextwakeup>LocalTime()?RtcSettings.nextwakeup - LocalTime():RtcSettings.nextwakeup); #ifdef ESP8266 - ESP.deepSleep((uint64_t) 100 * RtcSettings.deepsleep_slip * (RtcSettings.nextwakeup - LocalTime())); + ESP.deepSleep(deepsleepticker); #endif // ESP8266 #ifdef ESP32 - esp_sleep_enable_timer_wakeup((uint64_t) 100 * RtcSettings.deepsleep_slip * (RtcSettings.nextwakeup - LocalTime())); + esp_sleep_enable_timer_wakeup(deepsleepticker); esp_deep_sleep_start(); #endif // ESP32 yield(); From e16c1aa40d4968293f2160608abd8ca3dbc56e16 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 13:26:32 +0200 Subject: [PATCH 148/376] safemode for all 4MB devices --- boards/esp32-cam.json | 12 +++++- boards/esp32_4M.json | 80 +++++++++++++++++++++----------------- boards/esp32_4M_2APP.json | 46 ---------------------- boards/esp32_solo1_4M.json | 12 +++++- boards/esp32c3.json | 74 +++++++++++++++++++---------------- boards/esp32c3_2APP.json | 43 -------------------- boards/esp32s2.json | 12 +++++- boards/esp32s2_2APP.json | 43 -------------------- boards/esp32s3.json | 12 +++++- boards/esp32s3_2APP.json | 46 ---------------------- 10 files changed, 125 insertions(+), 255 deletions(-) delete mode 100644 boards/esp32_4M_2APP.json delete mode 100644 boards/esp32c3_2APP.json delete mode 100644 boards/esp32s2_2APP.json delete mode 100644 boards/esp32s3_2APP.json diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json index 4691051e4..30fb7d3c4 100644 --- a/boards/esp32-cam.json +++ b/boards/esp32-cam.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, "connectivity": [ "wifi", @@ -25,8 +25,16 @@ "arduino", "espidf" ], - "name": "AI Thinker ESP32-CAM, 4M Flash 4MB PSRAM, Tasmota 1856k Code/OTA, 320k FS", + "name": "AI Thinker ESP32-CAM, 4M Flash 4MB PSRAM, Tasmota 2880k Code/OTA, 320k FS", "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32-safemode.bin" + ] + ] + }, "flash_size": "4MB", "maximum_ram_size": 327680, "maximum_size": 4194304, diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index ee7effe39..a998cdc7f 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -1,38 +1,46 @@ { - "build": { - "arduino":{ - "ldscript": "esp32_out.ld" + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M", + "f_cpu": "80000000L", + "f_flash": "40000000L", + "flash_mode": "dout", + "mcu": "esp32", + "variant": "esp32", + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, - "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M", - "f_cpu": "80000000L", - "f_flash": "40000000L", - "flash_mode": "dout", - "mcu": "esp32", - "variant": "esp32", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" - }, - "connectivity": [ - "wifi", - "bluetooth", - "ethernet", - "can" - ], - "debug": { - "openocd_target": "esp32.cfg" - }, - "frameworks": [ - "arduino", - "espidf" - ], - "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS", - "upload": { - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://en.wikipedia.org/wiki/ESP32", - "vendor": "Espressif" -} + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_target": "esp32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32-safemode.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://en.wikipedia.org/wiki/ESP32", + "vendor": "Espressif" + } diff --git a/boards/esp32_4M_2APP.json b/boards/esp32_4M_2APP.json deleted file mode 100644 index a998cdc7f..000000000 --- a/boards/esp32_4M_2APP.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "esp32_out.ld" - }, - "core": "esp32", - "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M", - "f_cpu": "80000000L", - "f_flash": "40000000L", - "flash_mode": "dout", - "mcu": "esp32", - "variant": "esp32", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" - }, - "connectivity": [ - "wifi", - "bluetooth", - "ethernet", - "can" - ], - "debug": { - "openocd_target": "esp32.cfg" - }, - "frameworks": [ - "arduino", - "espidf" - ], - "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS", - "upload": { - "arduino": { - "flash_extra_images": [ - [ - "0x10000", - "variants/tasmota/tasmota32-safemode.bin" - ] - ] - }, - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://en.wikipedia.org/wiki/ESP32", - "vendor": "Espressif" - } diff --git a/boards/esp32_solo1_4M.json b/boards/esp32_solo1_4M.json index e5b86ade8..ec6532969 100644 --- a/boards/esp32_solo1_4M.json +++ b/boards/esp32_solo1_4M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, "connectivity": [ "wifi", @@ -25,8 +25,16 @@ "arduino", "espidf" ], - "name": "Espressif Generic ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS", "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32solo1-safemode.bin" + ] + ] + }, "flash_size": "4MB", "maximum_ram_size": 327680, "maximum_size": 4194304, diff --git a/boards/esp32c3.json b/boards/esp32c3.json index 8e1dae3d5..0de9a401c 100644 --- a/boards/esp32c3.json +++ b/boards/esp32c3.json @@ -1,35 +1,43 @@ { - "build": { - "arduino":{ - "ldscript": "esp32c3_out.ld" + "build": { + "arduino":{ + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3", + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "dout", + "mcu": "esp32c3", + "variant": "esp32c3", + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, - "core": "esp32", - "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3", - "f_cpu": "160000000L", - "f_flash": "80000000L", - "flash_mode": "dout", - "mcu": "esp32c3", - "variant": "esp32c3", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" - }, - "connectivity": [ - "wifi" - ], - "debug": { - "openocd_target": "esp32c3.cfg" - }, - "frameworks": [ - "arduino", - "espidf" - ], - "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 1856k Code/OTA, 320k FS", - "upload": { - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", - "vendor": "Espressif" -} + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32c3-safemode.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", + "vendor": "Espressif" + } diff --git a/boards/esp32c3_2APP.json b/boards/esp32c3_2APP.json deleted file mode 100644 index 1d21ff1df..000000000 --- a/boards/esp32c3_2APP.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "esp32c3_out.ld" - }, - "core": "esp32", - "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3", - "f_cpu": "160000000L", - "f_flash": "80000000L", - "flash_mode": "dout", - "mcu": "esp32c3", - "variant": "esp32c3", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" - }, - "connectivity": [ - "wifi" - ], - "debug": { - "openocd_target": "esp32c3.cfg" - }, - "frameworks": [ - "arduino", - "espidf" - ], - "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", - "upload": { - "arduino": { - "flash_extra_images": [ - [ - "0x10000", - "variants/tasmota/tasmota32c3-safemode.bin" - ] - ] - }, - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", - "vendor": "Espressif" - } diff --git a/boards/esp32s2.json b/boards/esp32s2.json index 07c043b2f..d2ce7a5db 100644 --- a/boards/esp32s2.json +++ b/boards/esp32s2.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32s2", "variant": "esp32s2", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, "connectivity": [ "wifi" @@ -22,8 +22,16 @@ "espidf", "arduino" ], - "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 2880k Code/OTA, 320k FS", "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32s2-safemode.bin" + ] + ] + }, "flash_size": "4MB", "maximum_ram_size": 327680, "maximum_size": 4194304, diff --git a/boards/esp32s2_2APP.json b/boards/esp32s2_2APP.json deleted file mode 100644 index 0227a4a11..000000000 --- a/boards/esp32s2_2APP.json +++ /dev/null @@ -1,43 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "esp32s2_out.ld" - }, - "core": "esp32", - "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DESP32_4M -DESP32S2", - "f_cpu": "240000000L", - "f_flash": "80000000L", - "flash_mode": "dout", - "mcu": "esp32s2", - "variant": "esp32s2", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" - }, - "connectivity": [ - "wifi" - ], - "debug": { - "openocd_target": "esp32s2.cfg" - }, - "frameworks": [ - "espidf", - "arduino" - ], - "name": "Espressif Generic ESP32-S2 4M Flash, Tasmota 2880k Code/OTA, 320k FS", - "upload": { - "arduino": { - "flash_extra_images": [ - [ - "0x10000", - "variants/tasmota/tasmota32s2-safemode.bin" - ] - ] - }, - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s2/hw-reference/esp32s2/user-guide-saola-1-v1.2.html", - "vendor": "Espressif" -} diff --git a/boards/esp32s3.json b/boards/esp32s3.json index 78f03cced..312b7cb7d 100644 --- a/boards/esp32s3.json +++ b/boards/esp32s3.json @@ -11,7 +11,7 @@ "flash_mode": "dio", "mcu": "esp32s3", "variant": "esp32s3", - "partitions": "esp32_partition_app1856k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_spiffs320k.csv" }, "connectivity": [ "wifi", @@ -25,8 +25,16 @@ "espidf", "arduino" ], - "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 1856k Code/OTA, 320k FS", + "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32s3-safemode.bin" + ] + ] + }, "flash_size": "4MB", "maximum_ram_size": 327680, "maximum_size": 4194304, diff --git a/boards/esp32s3_2APP.json b/boards/esp32s3_2APP.json deleted file mode 100644 index 1a37483e4..000000000 --- a/boards/esp32s3_2APP.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "build": { - "arduino":{ - "ldscript": "esp32s3_out.ld", - "memory_type": "qspi_qspi" - }, - "core": "esp32", - "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=0 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DESP32_4M -DESP32S3", - "f_cpu": "240000000L", - "f_flash": "80000000L", - "flash_mode": "dio", - "mcu": "esp32s3", - "variant": "esp32s3", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" - }, - "connectivity": [ - "wifi", - "bluetooth", - "ethernet" - ], - "debug": { - "openocd_target": "esp32s3.cfg" - }, - "frameworks": [ - "espidf", - "arduino" - ], - "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", - "upload": { - "arduino": { - "flash_extra_images": [ - [ - "0x10000", - "variants/tasmota/tasmota32s3-safemode.bin" - ] - ] - }, - "flash_size": "4MB", - "maximum_ram_size": 327680, - "maximum_size": 4194304, - "require_upload_port": true, - "speed": 460800 - }, - "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/", - "vendor": "Espressif" -} From 3a32fdb7303bdb78508a4bbfb2582b656bac6633 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 13:38:04 +0200 Subject: [PATCH 149/376] add solo1 safemode --- platformio_tasmota_env32.ini | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 93f980e3d..63ba038c8 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -118,7 +118,19 @@ lib_ignore = [env:tasmota32-safemode] extends = env:tasmota32_base -board = esp32_4M_2APP +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + +[env:tasmota32solo1-safemode] +extends = env:tasmota32_base +board = esp32_solo1_4M +platform = ${core32solo1.platform} +platform_packages = ${core32solo1.platform_packages} build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -129,7 +141,6 @@ lib_ignore = [env:tasmota32s2-safemode] extends = env:tasmota32_base -board = esp32s2_2APP build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -140,7 +151,6 @@ lib_ignore = [env:tasmota32s3-safemode] extends = env:tasmota32_base -board = esp32s3_2APP build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEMODE lib_extra_dirs = lib/lib_ssl, lib/libesp32 lib_ignore = @@ -151,7 +161,6 @@ lib_ignore = [env:tasmota32c3-safemode] extends = env:tasmota32_base -board = esp32c3_2APP build_unflags = ${env:tasmota32_base.build_unflags} -flto -mtarget-align From 6c7ab96222f1fae4d2256e9f426d3c2642305971 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 13:41:39 +0200 Subject: [PATCH 150/376] Add solo1-safemode to actions --- .github/workflows/Tasmota_build_devel.yml | 1 + .github/workflows/build_all_the_things.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index eec1bccf5..1c04b1059 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -39,6 +39,7 @@ jobs: - tasmota32-lvgl - tasmota32c3 - tasmota32solo1 + - tasmota32solo1-safemode - tasmota32-safemode - tasmota32c3-safemode - tasmota32s2-safemode diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 6c9f09770..9e6839403 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -43,6 +43,7 @@ jobs: - tasmota32s2 - tasmota32c3 - tasmota32solo1 + - tasmota32solo1-safemode - tasmota32-safemode - tasmota32c3-safemode - tasmota32s2-safemode From cab5cb4753b93c4ada338d83e02d852a512ec221 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 15:34:26 +0200 Subject: [PATCH 151/376] Update changelogs --- CHANGELOG.md | 7 +++++-- RELEASENOTES.md | 5 +++++ tasmota/settings.h | 2 +- tools/decode-status.py | 5 +++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index deb2e5f28..b93a3270d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,10 @@ All notable changes to this project will be documented in this file. - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only (#13515) - Sonoff SPM delayed SetPowerOnState (#13447) - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` (#15350) -- Support for flowrate meters like YF-DN50 and similary +- Support for flowrate meters like YF-DN50 and similary (#15474) +- Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy (#15513) +- Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) (#15530) +- ESP32 Preparations for Tasmota SafeMode with changed partition scheme allowing larger binaries ### Changed @@ -21,7 +24,7 @@ All notable changes to this project will be documented in this file. - BL09xx negative power presentation (#15374) ### Removed - +- Arduino IDE support ## [Released] diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3bd937aae..72dabd7ea 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -107,10 +107,14 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ## Changelog v11.1.0.1 ### Added - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) +- Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) +- Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy [#15513](https://github.com/arendst/Tasmota/issues/15513) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) - Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) +- Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) +- ESP32 Preparations for Tasmota SafeMode with changed partition scheme allowing larger binaries ### Breaking Changed @@ -122,3 +126,4 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - BL09xx negative power presentation [#15374](https://github.com/arendst/Tasmota/issues/15374) ### Removed +- Arduino IDE support diff --git a/tasmota/settings.h b/tasmota/settings.h index 35c6b71d5..07792022a 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -169,7 +169,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t tuya_exclude_from_mqtt : 1; // bit 23 (v11.0.0.5) - SetOption137 - (Tuya) When Set, avoid the (MQTT-) publish of defined Tuya CMDs (see xdrv_16_tuyamcu.ino) if SetOption66 is active uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) uint32_t mm_vs_inch : 1; // bit 25 (v11.1.0.1) - SetOption139 - (Pressure) Switch between mmHg (0) or inHg (1) when SO24 1 - uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - 0=MQTT clean session (default), 1=MQTT persistent session + uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - (MQTT) MQTT clean session (0 = default) or persistent session (1) uint32_t spare27 : 1; // bit 27 uint32_t spare28 : 1; // bit 28 uint32_t spare29 : 1; // bit 29 diff --git a/tools/decode-status.py b/tools/decode-status.py index 3227e8a39..a86e10eeb 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -194,7 +194,8 @@ a_setoption = [[ "(Tuya) When Set, avoid the (mqtt-) publish of Tuya MCU Heartbeat response if SetOption66 is active", "(GUI) Align (energy) table values left (0) or right (1)", "(Pressure) Switch between mmHg (0) or inHg (1) when SO24 1", - "","", + "(MQTT) MQTT clean session (0 = default) or persistent session (1)", + "", "","","","" ]] @@ -268,7 +269,7 @@ a_features = [[ "USE_HRG15","USE_VINDRIKTNING","USE_SCD40","USE_HM330X", "USE_HDC2010","USE_LSC_MCSL","USE_SONOFF_SPM","USE_SHIFT595", "USE_SDM230","USE_CM110x","USE_BL6523","USE_ADE7880", - "USE_PCF85363","USE_DS3502","USE_IMPROV","", + "USE_PCF85363","USE_DS3502","USE_IMPROV","USE_FLOWRATEMETER", "","","","" ]] From d47c69559faa681a3c4e06508ebe6a0c76e6b6b5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 16:56:19 +0200 Subject: [PATCH 152/376] Allow more telegram messages in queue --- tasmota/xdrv_40_telegram.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_40_telegram.ino b/tasmota/xdrv_40_telegram.ino index aebb2579a..a988fff8f 100644 --- a/tasmota/xdrv_40_telegram.ino +++ b/tasmota/xdrv_40_telegram.ino @@ -83,7 +83,7 @@ bool TelegramInit(void) { if (!telegramClient) { telegramClient = new BearSSL::WiFiClientSecure_light(tls_rx_size, tls_tx_size); - if (Settings->flag5.tls_use_fingerprint) { + if (Settings->flag5.tls_use_fingerprint) { // SetOption132 - (TLS) Use fingerprint validation instead of CA based telegramClient->setPubKeyFingerprint(Telegram_Fingerprint, Telegram_Fingerprint, false); // check server fingerprint } else { telegramClient->setTrustAnchor(&GoDaddyCAG2_TA, 1); @@ -144,7 +144,7 @@ String TelegramConnectToTelegram(const String &command) { } if (available) { response += c; - if (response.length() > 800) { // Allow up to two messages + if (response.length() > 2000) { // Allow up to 5 messages break; } } From dfa8f544575587f0d8f40380d473ad5c47797820 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 18:00:12 +0200 Subject: [PATCH 153/376] Use release Tasmota Core 2.0.3 --- platformio_tasmota32.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 038fd8e60..4a69368c9 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -38,14 +38,14 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-Tasmota-safe.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-v.2.0.3.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} [core32solo1] -platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-Tasmota-solo1-safe.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-solo1-v.2.0.3.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 94ebef496d837d478a1e0cabf5be0c007dfa4ad9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 4 May 2022 18:09:26 +0200 Subject: [PATCH 154/376] Version bump to v11.1.0.2 --- CHANGELOG.md | 18 ++++++++++++++---- RELEASENOTES.md | 4 ++-- tasmota/tasmota_version.h | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b93a3270d..04aaac405 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,20 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [11.1.0.1] +## [11.1.0.2] +### Added + + +### Changed +- ESP32 Tasmota SafeMode with changed partition scheme allowing larger binaries + +### Fixed + + +### Removed + + +## [11.1.0.1] 20220504 ### Added - Support for Sonoff MS01 soil moisture sensor (#15335) - Support for daisy chaining MAX7219 displays (#15345) @@ -14,9 +27,6 @@ All notable changes to this project will be documented in this file. - Support for flowrate meters like YF-DN50 and similary (#15474) - Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy (#15513) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) (#15530) -- ESP32 Preparations for Tasmota SafeMode with changed partition scheme allowing larger binaries - -### Changed ### Fixed - SCD40 start low power command (#15361) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 72dabd7ea..9b12773fe 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -104,7 +104,7 @@ 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 v11.1.0.1 +## Changelog v11.1.0.2 ### Added - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) @@ -114,11 +114,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) - Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) -- ESP32 Preparations for Tasmota SafeMode with changed partition scheme allowing larger binaries ### Breaking Changed ### Changed +- ESP32 Tasmota SafeMode with changed partition scheme allowing larger binaries ### Fixed - Improv initial or erase device installation failing to provide Configure WiFi option diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 49d55ffbd..51101a782 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 = 0x0B010001; // 11.1.0.1 +const uint32_t VERSION = 0x0B010001; // 11.1.0.2 #endif // _TASMOTA_VERSION_H_ From 49aba4ddf6424f1ac9e756059375a28b5e15343f Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 4 May 2022 18:56:16 +0200 Subject: [PATCH 155/376] Update xdrv_29_deepsleep.ino --- tasmota/xdrv_29_deepsleep.ino | 53 +++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 284100b52..0fec046cf 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -37,6 +37,7 @@ #endif const uint32_t DEEPSLEEP_MAX = 10 * 366 * 24 * 60 * 60; // Allow max 10 years sleep +const uint32_t DEEPSLEEP_MAX_CYCLE = 60 * 60; // Maximum time for a deepsleep as defined by chip hardware const uint32_t DEEPSLEEP_MIN_TIME = 5; // Allow 5 seconds skew const uint32_t DEEPSLEEP_START_COUNTDOWN = 4; // Allow 4 seconds to update web console before deepsleep @@ -46,6 +47,7 @@ const char kDeepsleepCommands[] PROGMEM = D_PRFX_DEEPSLEEP "|" void (* const DeepsleepCommand[])(void) PROGMEM = { &CmndDeepsleepTime }; +uint32_t deepsleep_sleeptime = 0; uint8_t deepsleep_flag = 0; bool DeepSleepEnabled(void) @@ -59,9 +61,34 @@ bool DeepSleepEnabled(void) pinMode(Pin(GPIO_DEEPSLEEP), INPUT_PULLUP); return (digitalRead(Pin(GPIO_DEEPSLEEP))); // Disable DeepSleep if user holds pin GPIO_DEEPSLEEP low } + return true; // Enabled } +void DeepSleepReInit(void) +{ + if ((ResetReason() == REASON_DEEP_SLEEP_AWAKE) && DeepSleepEnabled()) { + if ((RtcSettings.ultradeepsleep > DEEPSLEEP_MAX_CYCLE) && (RtcSettings.ultradeepsleep < 1700000000)) { + // Go back to sleep after 60 minutes if requested deepsleep has not been reached + RtcSettings.ultradeepsleep = RtcSettings.ultradeepsleep - DEEPSLEEP_MAX_CYCLE; + AddLog(LOG_LEVEL_ERROR, PSTR("DSL: Remain DeepSleep %d"), RtcSettings.ultradeepsleep); + RtcSettingsSave(); + RtcRebootReset(); +#ifdef ESP8266 + ESP.deepSleep(100 * RtcSettings.deepsleep_slip * (DEEPSLEEP_MAX_CYCLE < RtcSettings.ultradeepsleep ? DEEPSLEEP_MAX_CYCLE : RtcSettings.ultradeepsleep), WAKE_RF_DEFAULT); +#endif // ESP8266 +#ifdef ESP32 + esp_sleep_enable_timer_wakeup(100 * RtcSettings.deepsleep_slip * (DEEPSLEEP_MAX_CYCLE < RtcSettings.ultradeepsleep ? DEEPSLEEP_MAX_CYCLE : RtcSettings.ultradeepsleep)); + esp_deep_sleep_start(); +#endif // ESP32 + yield(); + // Sleeping + } + } + // Stay awake + RtcSettings.ultradeepsleep = 0; +} + void DeepSleepPrepare(void) { // Deepsleep_slip is ideally 10.000 == 100% @@ -79,44 +106,49 @@ void DeepSleepPrepare(void) // Timeslip in 0.1 seconds between the real wakeup and the calculated wakeup // Because deepsleep is in second and timeslip in 0.1 sec the compare always check if the slip is in the 10% range - int32_t timeslip = ((int32_t)RtcSettings.nextwakeup + millis() / 1000 - (int32_t)LocalTime()) * 10; + int16_t timeslip = (int16_t)(RtcSettings.nextwakeup + millis() / 1000 - LocalTime()) * 10; // Allow 10% of deepsleep error to count as valid deepsleep; expecting 3-4% // if more then 10% timeslip = 0 == non valid wakeup; maybe manual timeslip = (timeslip < -(int32_t)Settings->deepsleep) ? 0 : (timeslip > (int32_t)Settings->deepsleep) ? 0 : 1; if (timeslip) { - RtcSettings.nextwakeup += Settings->deepsleep; - RtcSettings.deepsleep_slip = (RtcSettings.nextwakeup - LocalTime()) * RtcSettings.deepsleep_slip / tmax((Settings->deepsleep - (millis() / 1000)),5); + RtcSettings.deepsleep_slip = (Settings->deepsleep + RtcSettings.nextwakeup - LocalTime()) * RtcSettings.deepsleep_slip / tmax((Settings->deepsleep - (millis() / 1000)),5); // Avoid crazy numbers. Again maximum 10% deviation. RtcSettings.deepsleep_slip = tmin(tmax(RtcSettings.deepsleep_slip, 9000), 11000); - + RtcSettings.nextwakeup += Settings->deepsleep; } // It may happen that wakeup in just <5 seconds in future // In this case also add deepsleep to nextwakeup - if (RtcSettings.nextwakeup <= (LocalTime() + DEEPSLEEP_MIN_TIME)) { + if (RtcSettings.nextwakeup <= (LocalTime() - DEEPSLEEP_MIN_TIME)) { // ensure nextwakeup is at least in the future RtcSettings.nextwakeup += (((LocalTime() + DEEPSLEEP_MIN_TIME - RtcSettings.nextwakeup) / Settings->deepsleep) + 1) * Settings->deepsleep; } String dt = GetDT(RtcSettings.nextwakeup); // 2017-03-07T11:08:02 + // Limit sleeptime to DEEPSLEEP_MAX_CYCLE + // uint32_t deepsleep_sleeptime = DEEPSLEEP_MAX_CYCLE < (RtcSettings.nextwakeup - LocalTime()) ? (uint32_t)DEEPSLEEP_MAX_CYCLE : RtcSettings.nextwakeup - LocalTime(); + deepsleep_sleeptime = tmin((uint32_t)DEEPSLEEP_MAX_CYCLE ,RtcSettings.nextwakeup - LocalTime()); // stat/tasmota/DEEPSLEEP = {"DeepSleep":{"Time":"2019-11-12T21:33:45","Epoch":1573590825}} Response_P(PSTR("{\"" D_PRFX_DEEPSLEEP "\":{\"" D_JSON_TIME "\":\"%s\",\"Epoch\":%d}}"), (char*)dt.c_str(), RtcSettings.nextwakeup); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_DEEPSLEEP)); + +// Response_P(S_LWT_OFFLINE); +// MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic } void DeepSleepStart(void) { WifiShutdown(); + RtcSettings.ultradeepsleep = RtcSettings.nextwakeup - LocalTime(); RtcSettingsSave(); RtcRebootReset(); - uint64_t deepsleepticker = 100 * (uint64_t)RtcSettings.deepsleep_slip * (uint64_t)(RtcSettings.nextwakeup>LocalTime()?RtcSettings.nextwakeup - LocalTime():RtcSettings.nextwakeup); #ifdef ESP8266 - ESP.deepSleep(deepsleepticker); + ESP.deepSleep(100 * RtcSettings.deepsleep_slip * deepsleep_sleeptime); #endif // ESP8266 #ifdef ESP32 - esp_sleep_enable_timer_wakeup(deepsleepticker); + esp_sleep_enable_timer_wakeup(100 * RtcSettings.deepsleep_slip * deepsleep_sleeptime); esp_deep_sleep_start(); #endif // ESP32 yield(); @@ -179,13 +211,16 @@ bool Xdrv29(uint8_t function) DeepSleepEverySecond(); break; case FUNC_AFTER_TELEPERIOD: - if (DeepSleepEnabled() && !deepsleep_flag && (Settings->tele_period == 10 || Settings->tele_period == 300 || millis() > 20000 )) { + if (DeepSleepEnabled() && !deepsleep_flag && (Settings->tele_period == 10 || Settings->tele_period == 300 || UpTime() > Settings->tele_period)) { deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds } break; case FUNC_COMMAND: result = DecodeCommand(kDeepsleepCommands, DeepsleepCommand); break; + case FUNC_PRE_INIT: + DeepSleepReInit(); + break; } return result; } From 0c43ef7b79cad77c50902c5cc9905365d97fe344 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 4 May 2022 19:00:25 +0200 Subject: [PATCH 156/376] Update xdrv_29_deepsleep.ino --- tasmota/xdrv_29_deepsleep.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index 0fec046cf..a5a402e90 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -211,7 +211,7 @@ bool Xdrv29(uint8_t function) DeepSleepEverySecond(); break; case FUNC_AFTER_TELEPERIOD: - if (DeepSleepEnabled() && !deepsleep_flag && (Settings->tele_period == 10 || Settings->tele_period == 300 || UpTime() > Settings->tele_period)) { + if (DeepSleepEnabled() && !deepsleep_flag && (Settings->tele_period == 10 || Settings->tele_period == 300 || millis() > 20000)) { deepsleep_flag = DEEPSLEEP_START_COUNTDOWN; // Start deepsleep in 4 seconds } break; From cdce233f43513a17991775e4e4450f0f1c50c98a Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 4 May 2022 19:04:43 +0200 Subject: [PATCH 157/376] Update xdrv_29_deepsleep.ino --- tasmota/xdrv_29_deepsleep.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index a5a402e90..dc7d76adc 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -120,7 +120,7 @@ void DeepSleepPrepare(void) // It may happen that wakeup in just <5 seconds in future // In this case also add deepsleep to nextwakeup - if (RtcSettings.nextwakeup <= (LocalTime() - DEEPSLEEP_MIN_TIME)) { + if (RtcSettings.nextwakeup <= (LocalTime() + DEEPSLEEP_MIN_TIME)) { // ensure nextwakeup is at least in the future RtcSettings.nextwakeup += (((LocalTime() + DEEPSLEEP_MIN_TIME - RtcSettings.nextwakeup) / Settings->deepsleep) + 1) * Settings->deepsleep; } From c022e353887348a087842d30984af7d7af776855 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Wed, 4 May 2022 19:07:22 +0200 Subject: [PATCH 158/376] Update xdrv_29_deepsleep.ino --- tasmota/xdrv_29_deepsleep.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_29_deepsleep.ino b/tasmota/xdrv_29_deepsleep.ino index dc7d76adc..9cfa1f070 100644 --- a/tasmota/xdrv_29_deepsleep.ino +++ b/tasmota/xdrv_29_deepsleep.ino @@ -112,10 +112,10 @@ void DeepSleepPrepare(void) // if more then 10% timeslip = 0 == non valid wakeup; maybe manual timeslip = (timeslip < -(int32_t)Settings->deepsleep) ? 0 : (timeslip > (int32_t)Settings->deepsleep) ? 0 : 1; if (timeslip) { - RtcSettings.deepsleep_slip = (Settings->deepsleep + RtcSettings.nextwakeup - LocalTime()) * RtcSettings.deepsleep_slip / tmax((Settings->deepsleep - (millis() / 1000)),5); + RtcSettings.nextwakeup += Settings->deepsleep; + RtcSettings.deepsleep_slip = (RtcSettings.nextwakeup - LocalTime()) * RtcSettings.deepsleep_slip / tmax((Settings->deepsleep - (millis() / 1000)),5); // Avoid crazy numbers. Again maximum 10% deviation. RtcSettings.deepsleep_slip = tmin(tmax(RtcSettings.deepsleep_slip, 9000), 11000); - RtcSettings.nextwakeup += Settings->deepsleep; } // It may happen that wakeup in just <5 seconds in future From 3c13fb1b8d19b509adf08b438ed5ce0ec1c01721 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 19:44:41 +0200 Subject: [PATCH 159/376] fix solo1 safemode --- pio-tools/post_esp32.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index d149d9405..782eed772 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -36,8 +36,13 @@ FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") def esp32_fetch_safemode_bin(chip): - safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" - safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") + if "solo1" in env.subst("$BUILD_DIR"): + safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota32solo1-safemode.bin" + safemode_fw_name = join(variants_dir,"tasmota32solo1-safemode.bin") + else: + safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") + if(exists(safemode_fw_name)): print("Safemode binary already in place.") return From d722b8a4d8bb2a4621da318b3d7a08b51cdb2cf6 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 20:25:06 +0200 Subject: [PATCH 160/376] real Python fix ;-) --- pio-tools/post_esp32.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 782eed772..f0e670a72 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -36,13 +36,8 @@ FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") def esp32_fetch_safemode_bin(chip): - if "solo1" in env.subst("$BUILD_DIR"): - safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota32solo1-safemode.bin" - safemode_fw_name = join(variants_dir,"tasmota32solo1-safemode.bin") - else: - safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" - safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") - + safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safemode.bin") if(exists(safemode_fw_name)): print("Safemode binary already in place.") return @@ -54,7 +49,7 @@ def esp32_fetch_safemode_bin(chip): def esp32_copy_new_safemode_bin(chip,new_local_safemode_fw): print("Copy new local safemode firmware to variants dir -> using it for further flashing operations") - safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") + safemode_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safemode.bin") if os.path.exists(variants_dir): shutil.copy(new_local_safemode_fw, safemode_fw_name) From bc64dd6b9d8a011cdf9377e111ae635508dd5c2b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 20:26:29 +0200 Subject: [PATCH 161/376] Real Python fix ;-) Thx @Staars --- pio-tools/post_esp32.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 782eed772..f0e670a72 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -36,13 +36,8 @@ FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") def esp32_fetch_safemode_bin(chip): - if "solo1" in env.subst("$BUILD_DIR"): - safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota32solo1-safemode.bin" - safemode_fw_name = join(variants_dir,"tasmota32solo1-safemode.bin") - else: - safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" - safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") - + safemode_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + chip[3:] + "-safemode.bin" + safemode_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safemode.bin") if(exists(safemode_fw_name)): print("Safemode binary already in place.") return @@ -54,7 +49,7 @@ def esp32_fetch_safemode_bin(chip): def esp32_copy_new_safemode_bin(chip,new_local_safemode_fw): print("Copy new local safemode firmware to variants dir -> using it for further flashing operations") - safemode_fw_name = join(variants_dir,"tasmota" + chip[3:] + "-safemode.bin") + safemode_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safemode.bin") if os.path.exists(variants_dir): shutil.copy(new_local_safemode_fw, safemode_fw_name) From 94f2d7b7c24dd858a5b3ba039e6cab961b0e2824 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 4 May 2022 21:03:22 +0200 Subject: [PATCH 162/376] rename SPIFFS to fs --- boards/esp32-cam.json | 2 +- boards/esp32-m5core2.json | 2 +- boards/esp32-odroid.json | 2 +- boards/esp32_16M.json | 2 +- boards/esp32_4M.json | 2 +- boards/esp32_4M_FS.json | 46 +++++++++++++++++++ boards/esp32_8M.json | 2 +- boards/esp32_solo1_4M.json | 2 +- boards/esp32c3.json | 2 +- boards/esp32s2.json | 2 +- boards/esp32s3.json | 2 +- boards/esp32s3_8M.json | 2 +- ...csv => esp32_partition_app1572k_fs983k.csv | 0 esp32_partition_app1856k_fs1344k.csv | 6 +++ ...csv => esp32_partition_app1856k_fs320k.csv | 0 ...csv => esp32_partition_app2880k_fs320k.csv | 0 ....csv => esp32_partition_app2944k_fs10M.csv | 0 ...M.csv => esp32_partition_app2944k_fs2M.csv | 0 18 files changed, 63 insertions(+), 11 deletions(-) create mode 100644 boards/esp32_4M_FS.json rename esp32_partition_app1572k_spiffs983k.csv => esp32_partition_app1572k_fs983k.csv (100%) create mode 100644 esp32_partition_app1856k_fs1344k.csv rename esp32_partition_app1856k_spiffs320k.csv => esp32_partition_app1856k_fs320k.csv (100%) rename esp32_partition_app2880k_spiffs320k.csv => esp32_partition_app2880k_fs320k.csv (100%) rename esp32_partition_app2944k_spiffs10M.csv => esp32_partition_app2944k_fs10M.csv (100%) rename esp32_partition_app2944k_spiffs2M.csv => esp32_partition_app2944k_fs2M.csv (100%) diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json index 30fb7d3c4..b034f6b77 100644 --- a/boards/esp32-cam.json +++ b/boards/esp32-cam.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json index 137f023a9..8567085ea 100644 --- a/boards/esp32-m5core2.json +++ b/boards/esp32-m5core2.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "m5stack_core2", - "partitions": "esp32_partition_app2944k_spiffs10M.csv" + "partitions": "esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json index 119af3d9e..a21cedaa9 100644 --- a/boards/esp32-odroid.json +++ b/boards/esp32-odroid.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "odroid_esp32", - "partitions": "esp32_partition_app2944k_spiffs10M.csv" + "partitions": "esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json index 9667b46ff..8314fa5b7 100644 --- a/boards/esp32_16M.json +++ b/boards/esp32_16M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2944k_spiffs10M.csv" + "partitions": "esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index a998cdc7f..e872ec7af 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_4M_FS.json b/boards/esp32_4M_FS.json new file mode 100644 index 000000000..6178700f9 --- /dev/null +++ b/boards/esp32_4M_FS.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_ESP32_DEV -DBOARD_HAS_PSRAM -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M", + "f_cpu": "80000000L", + "f_flash": "40000000L", + "flash_mode": "dout", + "mcu": "esp32", + "variant": "esp32", + "partitions": "esp32_partition_app1856k_fs1344k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet", + "can" + ], + "debug": { + "openocd_target": "esp32.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32-safemode.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://en.wikipedia.org/wiki/ESP32", + "vendor": "Espressif" + } diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json index b5dcfd676..cca93e38d 100644 --- a/boards/esp32_8M.json +++ b/boards/esp32_8M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2944k_spiffs2M.csv" + "partitions": "esp32_partition_app2944k_fs2M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_solo1_4M.json b/boards/esp32_solo1_4M.json index ec6532969..cbd2ac2fd 100644 --- a/boards/esp32_solo1_4M.json +++ b/boards/esp32_solo1_4M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32c3.json b/boards/esp32c3.json index 0de9a401c..cfbb41aec 100644 --- a/boards/esp32c3.json +++ b/boards/esp32c3.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32c3", "variant": "esp32c3", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi" diff --git a/boards/esp32s2.json b/boards/esp32s2.json index d2ce7a5db..b6dc307ca 100644 --- a/boards/esp32s2.json +++ b/boards/esp32s2.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32s2", "variant": "esp32s2", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi" diff --git a/boards/esp32s3.json b/boards/esp32s3.json index 312b7cb7d..6299a5317 100644 --- a/boards/esp32s3.json +++ b/boards/esp32s3.json @@ -11,7 +11,7 @@ "flash_mode": "dio", "mcu": "esp32s3", "variant": "esp32s3", - "partitions": "esp32_partition_app2880k_spiffs320k.csv" + "partitions": "esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32s3_8M.json b/boards/esp32s3_8M.json index 1996236c7..affbb0479 100644 --- a/boards/esp32s3_8M.json +++ b/boards/esp32s3_8M.json @@ -11,7 +11,7 @@ "flash_mode": "dio", "mcu": "esp32s3", "variant": "esp32s3", - "partitions": "esp32_partition_app2944k_spiffs2M.csv" + "partitions": "esp32_partition_app2944k_fs2M.csv" }, "connectivity": [ "wifi", diff --git a/esp32_partition_app1572k_spiffs983k.csv b/esp32_partition_app1572k_fs983k.csv similarity index 100% rename from esp32_partition_app1572k_spiffs983k.csv rename to esp32_partition_app1572k_fs983k.csv diff --git a/esp32_partition_app1856k_fs1344k.csv b/esp32_partition_app1856k_fs1344k.csv new file mode 100644 index 000000000..7a9b95b8c --- /dev/null +++ b/esp32_partition_app1856k_fs1344k.csv @@ -0,0 +1,6 @@ +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 0x5000, +otadata, data, ota, 0xe000, 0x2000, +factory, app, factory, 0x10000, 0xD0000, +app0, app, ota_0, 0xE0000, 0x1D0000, +spiffs, data, spiffs, 0x2B0000,0x150000, diff --git a/esp32_partition_app1856k_spiffs320k.csv b/esp32_partition_app1856k_fs320k.csv similarity index 100% rename from esp32_partition_app1856k_spiffs320k.csv rename to esp32_partition_app1856k_fs320k.csv diff --git a/esp32_partition_app2880k_spiffs320k.csv b/esp32_partition_app2880k_fs320k.csv similarity index 100% rename from esp32_partition_app2880k_spiffs320k.csv rename to esp32_partition_app2880k_fs320k.csv diff --git a/esp32_partition_app2944k_spiffs10M.csv b/esp32_partition_app2944k_fs10M.csv similarity index 100% rename from esp32_partition_app2944k_spiffs10M.csv rename to esp32_partition_app2944k_fs10M.csv diff --git a/esp32_partition_app2944k_spiffs2M.csv b/esp32_partition_app2944k_fs2M.csv similarity index 100% rename from esp32_partition_app2944k_spiffs2M.csv rename to esp32_partition_app2944k_fs2M.csv From f28dc39b826b63a26d2fdf4c1e232406abf42b81 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 4 May 2022 21:13:32 +0200 Subject: [PATCH 163/376] Berry flash write unaligned and download to flash --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 2540 +++++++++-------- .../generate/be_fixed_be_class_webclient.h | 33 +- .../berry_tasmota/src/be_webclient_lib.c | 2 + tasmota/xdrv_52_3_berry_flash.ino | 44 +- tasmota/xdrv_52_3_berry_webclient.ino | 51 + 6 files changed, 1383 insertions(+), 1288 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index daf7ff25c..937364720 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -1016,6 +1016,7 @@ extern const bcstring be_const_str_write8; extern const bcstring be_const_str_write_bit; extern const bcstring be_const_str_write_bytes; extern const bcstring be_const_str_write_file; +extern const bcstring be_const_str_write_flash; extern const bcstring be_const_str_write_gpio; extern const bcstring be_const_str_x; extern const bcstring be_const_str_x1; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 49a12d477..2029d7cca 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,993 +1,993 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_get_bat_power); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_as); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_SERIAL_7N1); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_SERIAL_8E2); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_Leds); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str__X3C); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_json); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_attrdump); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_EVENT_DELETE); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_screenshot); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__persist_X2Ejson); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X2Flights_X2F); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); +be_define_const_str(_X20, " ", 621580159u, 0, 1, NULL); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, NULL); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_connect); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_animate); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, NULL); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, NULL); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_font_montserrat); be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_get_style_pad_right); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_content_start); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_consume_silence); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_cb_obj); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_atleast1); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_add_header); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_maxota); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str__X2A); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_crc32); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_None); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_SERIAL_7O2); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_adv_cb); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_RGBW); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_decrypt); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str__X2F_X2Eautoconf); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_bri); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_CFG_X3A_X20loaded_X20_X20); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_set_style_img_recolor); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_groups); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_set_align); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str__X3A); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_available); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_AA50); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_base_class); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_add_anim); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_SERIAL_5N2); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_BLE); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_clock_icon); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_refr_size); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str__settings_ptr); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_allocated); -be_define_const_str(00, "00", 569209421u, 0, 2, NULL); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_set_y); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_serial); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_response_append); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_setrange); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_register_button_encoder); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_remove); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_nvs); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_reverse); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str_eth); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_lv_point_arr); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_CFG_X3A_X20running_X20); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_COLOR_BLACK); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__rmt); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_frombytes); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_call); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_to_gamma); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__def); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_get_switches); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_compress); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, NULL); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_obj); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_EXTERNAL_I2S); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_acos); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_contains); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, NULL); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_fast_loop_enabled); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_get_bat_power); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_gen_cb); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_bytes); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_hs2rgb); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__request_from); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_get_switches); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_compress); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, NULL); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_obj); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_EXTERNAL_I2S); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 666780908u, 0, 73, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_acos); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_contains); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str__X2Ebec); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_gamma); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_f); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_assert); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str__fl); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_bytes); +be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_HTTP_POST); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_type); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_dim); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_set_time); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_int64); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str__X3D_X3C_X3E_X21); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_isinstance); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_HTTP_GET); +be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_cos); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_animators); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_AudioFileSource); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str__ptr); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_get_alternate); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_get_input_power_status); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_function); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_assign_rmt); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_class_init_obj); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_consume_silence); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_is_first_time); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, NULL); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_begin); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_member); +be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, NULL); +be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_widget_struct_by_class); +be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_web_add_handler); +be_define_const_str(_X2F, "/", 705468254u, 0, 1, NULL); +be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27); +be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_tag); +be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_find); +be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_EVENT_DRAW_PART_END); +be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_coredump); +be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_get_free_heap); +be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_pow); +be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_SERIAL_6E2); +be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_get_name); +be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_set_reachable); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_ct); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_AudioGeneratorMP3); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_b); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_SERIAL_8E1); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_arg_size); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_INTERNAL_DAC); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_set_user_data); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, NULL); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_json_append); be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, NULL); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_fast_loop_enabled); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_get_bat_power); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_gen_cb); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_bytes); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_hs2rgb); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__request_from); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", 4247924536u, 0, 19, &be_const_str_color); +be_define_const_str(_X3D, "=", 940354920u, 0, 1, &be_const_str_BUTTON_CONFIGURATION); +be_define_const_str(_X3D_X3C_X3E_X21, "=<>!", 2664470277u, 0, 4, &be_const_str_type_to_string); +be_define_const_str(_X3D_X3D, "==", 2431966415u, 0, 2, &be_const_str_autorun); +be_define_const_str(_X3E, ">", 990687777u, 0, 1, &be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27); +be_define_const_str(_X3E_X3D, ">=", 284975636u, 0, 2, &be_const_str_get_switch); +be_define_const_str(_X3F, "?", 973910158u, 0, 1, &be_const_str_CFG_X3A_X20running_X20); +be_define_const_str(AA50, "AA50", 2265997666u, 0, 4, NULL); +be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, NULL); +be_define_const_str(ALIGN_BOTTOM_MID, "ALIGN_BOTTOM_MID", 3933267889u, 0, 16, &be_const_str__global_addr); +be_define_const_str(ALIGN_LEFT_MID, "ALIGN_LEFT_MID", 1043035067u, 0, 14, &be_const_str_gamma10); +be_define_const_str(AXP192, "AXP192", 757230128u, 0, 6, &be_const_str_set_ldo_voltage); +be_define_const_str(Animate_X20pc_X20is_X20out_X20of_X20range, "Animate pc is out of range", 1854929421u, 0, 26, &be_const_str_true); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_webserver); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str__end_transmission); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_fromstring); +be_define_const_str(AudioOpusDecoder, "AudioOpusDecoder", 1187272062u, 0, 16, &be_const_str_toptr); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_get_pixel_color); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_deinit); +be_define_const_str(Auto_X2Dconfiguration, "Auto-configuration", 1665006109u, 0, 18, &be_const_str_draw_arc_dsc); +be_define_const_str(BECDFE, "BECDFE", 608341218u, 0, 6, &be_const_str_clear_to); +be_define_const_str(BLE, "BLE", 3933843306u, 0, 3, &be_const_str_cb_obj); +be_define_const_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, "BRY: ERROR, bad json: ", 2715135809u, 0, 22, &be_const_str_Partition); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27, "BRY: Exception> '", 3883673906u, 0, 17, &be_const_str_format); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: Exception> '%s' - %s", 2246990964u, 0, 25, &be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map); +be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: argument must be a function", 3917068408u, 0, 32, &be_const_str__X5D); +be_define_const_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, "BRY: bytecode has wrong version '%s' (%i)", 2140321415u, 0, 41, &be_const_str_CFG_X3A_X20loading_X20); +be_define_const_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, "BRY: corrupt bytecode '%s'", 4009923544u, 0, 26, &be_const_str__validate); +be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, &be_const_str_None); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, "BRY: failed to load '%s' (%s - %s)", 1047433014u, 0, 34, &be_const_str_asin); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_lower); +be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, &be_const_str_coord_arr); +be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str_content_stop); +be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_TASMOTA); +be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_init_draw_line_dsc); +be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, &be_const_str_groups); +be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_SERIAL_8E2); +be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, &be_const_str_stop); +be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_is_ota); +be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_get_style_bg_color); +be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, NULL); +be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, NULL); +be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_RGB); +be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, &be_const_str_set_bits_per_sample); +be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_SK6812_GRBW); +be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, &be_const_str_has); +be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_tan); +be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_list); +be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_invalidate_spiffs); +be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str_arg_name); +be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, NULL); +be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_SERIAL_6E1); +be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); +be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, &be_const_str_SERIAL_7E2); +be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str_lv_extra); +be_define_const_str(CT, "CT", 1792671826u, 0, 2, &be_const_str_x1); +be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, NULL); +be_define_const_str(EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 3217293201u, 0, 32, &be_const_str_every_second); +be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_Restart_X201); +be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, &be_const_str_get_battery_chargin_status); +be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str_widget_width_def); +be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, &be_const_str__begin_transmission); +be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_json_fdump); +be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_Invalid_X20ota_X20partition_X20number); +be_define_const_str(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 2684107141u, 0, 48, &be_const_str__X7B_X7D); +be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str_SERIAL_5N1); +be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, &be_const_str_detect); +be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_imin); +be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, &be_const_str_RGBCT); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_full_state); +be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, &be_const_str_check_not_method); +be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str_efuse_em); +be_define_const_str(Invalid_X20ota_X20partition_X20number, "Invalid ota partition number", 1611602265u, 0, 28, NULL); +be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str_can_show); +be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, NULL); +be_define_const_str(MAX_RMT, "MAX_RMT", 1615574873u, 0, 7, &be_const_str_internal_error); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); +be_define_const_str(MI32, "MI32", 4074273414u, 0, 4, NULL); +be_define_const_str(No_X20SPIFFS_X20partition_X20found, "No SPIFFS partition found", 4165718279u, 0, 25, &be_const_str_deg); +be_define_const_str(None, "None", 810547195u, 0, 4, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_files); +be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, &be_const_str_nan); +be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, &be_const_str_a); +be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_lv_signal_bars); +be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, &be_const_str_SERIAL_7O2); +be_define_const_str(Partition, "Partition", 3077057705u, 0, 9, &be_const_str_RGBW); +be_define_const_str(Partition_info, "Partition_info", 3970922042u, 0, 14, &be_const_str_lv_clock_icon); +be_define_const_str(Partition_otadata, "Partition_otadata", 2666256496u, 0, 17, &be_const_str_Too_X20many_X20partiition_X20slots); +be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, NULL); +be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, &be_const_str_bri); +be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, &be_const_str_set_percentage); +be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_SERIAL_8O2); +be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_raw); +be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_base_class); +be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_driver_name); +be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, NULL); +be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_ins_ramp); +be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, NULL); +be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_flush); +be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_add_header); +be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, NULL); +be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str__crons); +be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_char); +be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_chars_in_string); +be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize); +be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, &be_const_str_maxota); +be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, NULL); +be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_zip); +be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_while); +be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str_read24); +be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_input); +be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str__dirty); +be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_delay); +be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, &be_const_str_event_cb); +be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_crc8); +be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_int); +be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_lv_point); +be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_Trigger); +be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, NULL); +be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, NULL); +be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str_conn_cb); +be_define_const_str(TASMOTA, "TASMOTA", 2487641028u, 0, 7, &be_const_str_before_del); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_seq0); +be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_cb_event_closure); +be_define_const_str(Too_X20many_X20partiition_X20slots, "Too many partiition slots", 3190277896u, 0, 25, &be_const_str_atleast1); +be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, NULL); +be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str_real); +be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str_get_warning_level); +be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_adv_block); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_uuid4); +be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, &be_const_str__timers); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_load_freetype_font); +be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_montserrat_font); +be_define_const_str(_X5D, "]", 3624670792u, 0, 1, NULL); +be_define_const_str(_X5D_X2C_X0A_X20_X20, "],\n ", 2456223650u, 0, 5, &be_const_str__p); +be_define_const_str(_, "_", 3658226030u, 0, 1, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_acos); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_discover); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_digital_write); +be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, &be_const_str_isrunning); +be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, NULL); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_every_50ms); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_hs2rgb); +be_define_const_str(_change_buffer, "_change_buffer", 2101848693u, 0, 14, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); +be_define_const_str(_class, "_class", 2732146350u, 0, 6, &be_const_str_active_otadata); be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); -be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, &be_const_str_content_stop); -be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_digital_write); -be_define_const_str(_def, "_def", 1985022181u, 0, 4, NULL); -be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_search); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_pop); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_eth); -be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_base_class); -be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_arg_name); -be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, &be_const_str_lv_obj); -be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_get_percentage); -be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_get_image_size); -be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_except); -be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, NULL); +be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, &be_const_str_add_driver); +be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_argument_X20must_X20be_X20a_X20list); +be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_esphttpd); +be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_quality); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_point); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); +be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_get_coords); +be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_connected); +be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, NULL); +be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); +be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_round_end); +be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_crc); +be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_ins_goto); be_define_const_str(_p, "_p", 1594591802u, 0, 2, NULL); -be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_get_vbus_voltage); +be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_skip); be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, NULL); -be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_started); be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); -be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, &be_const_str_del); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_set_active); -be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_connected); -be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_driver_name); +be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, &be_const_str_duration); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, NULL); +be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, NULL); be_define_const_str(_splash, "_splash", 3660617917u, 0, 7, NULL); -be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_upper); -be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_pin); +be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_allocated); +be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_memory); be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); -be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, &be_const_str_name); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf); -be_define_const_str(a, "a", 3826002220u, 0, 1, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_lv_point_arr); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_arg); -be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_full_status); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_factory); -be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_collect); -be_define_const_str(add_cb_event_closure, "add_cb_event_closure", 1775958321u, 0, 20, &be_const_str_clock_icon); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_fromptr); -be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_cb_do_nothing); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_attrdump); -be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, &be_const_str_splash_remove); -be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, NULL); +be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, &be_const_str_load_otadata); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_make_cb); +be_define_const_str(a, "a", 3826002220u, 0, 1, &be_const_str_classname); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_clock_icon); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_fromb64); +be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_to_gamma); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_set_pixel_color); +be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, NULL); +be_define_const_str(add_cb_event_closure, "add_cb_event_closure", 1775958321u, 0, 20, &be_const_str_point_arr); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj); +be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_concat); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_run_cron); +be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, &be_const_str_get_bat_power); +be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, &be_const_str_widget_event); be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, NULL); -be_define_const_str(add_header, "add_header", 927130612u, 0, 10, NULL); -be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_split); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_module); -be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, &be_const_str_from_to); -be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, &be_const_str_set_hum); -be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_int); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_erase); -be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_rotate); -be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_set_style_border_width); -be_define_const_str(animators, "animators", 279858213u, 0, 9, NULL); -be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_set_channels); -be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_cb); -be_define_const_str(arch, "arch", 2952804297u, 0, 4, NULL); -be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_fromstring); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_next); -be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, NULL); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_read_sensors); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); -be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_cmd); -be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, NULL); -be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, &be_const_str_event_send); +be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); +be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, NULL); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_h); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_battery_present); +be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, NULL); +be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, NULL); +be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_destructor_cb); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_set_dcdc_enable); +be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, NULL); +be_define_const_str(animate, "animate", 3885786800u, 0, 7, NULL); +be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_set_size); +be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_lights); +be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_seti); +be_define_const_str(arch, "arch", 2952804297u, 0, 4, &be_const_str_bus); +be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_import); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_seq1); +be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, &be_const_str_math); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_font_seg7); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_get_vbus_voltage); +be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_partition_core); +be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_call_native); +be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, &be_const_str_get_event_cb); be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_init); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_persist); -be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, NULL); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str__X7D); -be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); -be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_lights); -be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_file); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_ctypes_bytes_dyn); -be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, &be_const_str_concat); -be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_has); -be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_read12); -be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_get_event_cb); -be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, NULL); -be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, NULL); -be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_before_del); -be_define_const_str(before_del, "before_del", 815924436u, 0, 10, &be_const_str_i2c_enabled); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_closure); -be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_draw_arc); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_get_cb_list); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); +be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, &be_const_str_get_hor_res); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_number); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_gen_cb); +be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, NULL); +be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_remove_driver); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_every_250ms); +be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, &be_const_str_create_matrix); +be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, NULL); +be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_digital_read); +be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_read13); +be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_set_style_img_recolor); +be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, &be_const_str_set_ota_max); +be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_register_obj); +be_define_const_str(before_del, "before_del", 815924436u, 0, 10, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_draw_line_dsc_init); +be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_get_MAC); be_define_const_str(bool, "bool", 3365180733u, 0, 4, NULL); be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_set_dc_voltage); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_json_fdump_any); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_get_MAC); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); -be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_ins_time); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); -be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_switch_factory); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_get_name); -be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_instance); -be_define_const_str(cb, "cb", 1428787088u, 0, 2, NULL); -be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, &be_const_str_group_def); -be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_set_bits_per_sample); +be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_exec_rules); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_return_X20code_X3D_X25i); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_cb); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_read8); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_eth); +be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_detected_X20on_X20bus); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_hue); +be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_clear_first_time); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_path); +be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_set_bri); +be_define_const_str(cb, "cb", 1428787088u, 0, 2, &be_const_str_get_percentage); +be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, &be_const_str_is_dirty); +be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, NULL); be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, NULL); be_define_const_str(ccronexpr, "ccronexpr", 258146169u, 0, 9, NULL); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_deregister_obj); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_set_style_radius); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); -be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_sys); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_day); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_web_add_console_button); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_resolvecmnd); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_publish_result); +be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_lv); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, NULL); be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_pixel_size); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_lv_timer_cb); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_isrunning); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_load_freetype_font); -be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_widget_event_impl); -be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, NULL); -be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_run_deferred); -be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, NULL); -be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_rand); -be_define_const_str(closure, "closure", 1548407746u, 0, 7, &be_const_str_tcpclient); +be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_super); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_parse); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_widget_dtor_impl); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_del); +be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_floor); +be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_geti); +be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_test); +be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_from_to); +be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_loop); +be_define_const_str(closure, "closure", 1548407746u, 0, 7, &be_const_str_consume_stereo); be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); -be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL); -be_define_const_str(code, "code", 4180765940u, 0, 4, NULL); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_consume_silence); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_r); -be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_percentage); +be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); +be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_cosh); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_decrypt); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_get_option); +be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_ota_max); be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_update); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_dump); -be_define_const_str(conn_cb, "conn_cb", 1381122945u, 0, 7, &be_const_str_content_flush); -be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_publish_result); -be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_frombytes); -be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_tobytes); -be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, &be_const_str_solidified); -be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str_devices); +be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_tostring); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); +be_define_const_str(conn_cb, "conn_cb", 1381122945u, 0, 7, NULL); +be_define_const_str(connect, "connect", 2866859257u, 0, 7, NULL); +be_define_const_str(connected, "connected", 1424938192u, 0, 9, NULL); +be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_matrix); +be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, &be_const_str_is_spiffs); +be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, NULL); be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, NULL); -be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_data); -be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_load_otadata); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_id); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_otadata); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_udp); +be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_widget_event_cb); +be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_find_op); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_splash_remove); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_trig); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_crc32_ota_seq); be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_lv_module_init); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, &be_const_str_delay); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, NULL); -be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, &be_const_str_gc); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_resp_cmnd); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_no_X20more_X20RMT_X20channel_X20available); -be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_strftime); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_get_alternate); -be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_font_seg7); -be_define_const_str(crc, "crc", 3812935353u, 0, 3, &be_const_str_setrange); -be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, &be_const_str_getfloat); -be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, &be_const_str_started); -be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_find_op); -be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, NULL); -be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_light_to_id); -be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_readline); -be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, &be_const_str_invalidate); -be_define_const_str(ct, "ct", 1261010898u, 0, 2, &be_const_str_set_size); +be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, &be_const_str_spiffs); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_get_style_line_color); +be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, NULL); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_every_100ms); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, NULL); +be_define_const_str(count, "count", 967958004u, 0, 5, NULL); +be_define_const_str(counters, "counters", 4095866864u, 0, 8, NULL); +be_define_const_str(crc, "crc", 3812935353u, 0, 3, &be_const_str_json_fdump_any); +be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, &be_const_str_delete_all_configs); +be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, &be_const_str_set_x); +be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_load); +be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, &be_const_str_depower); +be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_param); +be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_static); +be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, NULL); +be_define_const_str(ct, "ct", 1261010898u, 0, 2, &be_const_str_model); be_define_const_str(ctor, "ctor", 375399343u, 0, 4, NULL); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_set_ldo_enable); -be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, NULL); -be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_out_X20of_X20range); -be_define_const_str(data, "data", 3631407781u, 0, 4, &be_const_str_set_user_data); -be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_reset); -be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_files); -be_define_const_str(decode, "decode", 3007678287u, 0, 6, NULL); -be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_get_aps_voltage); -be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, NULL); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_font_embedded); +be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, &be_const_str_draw_line_dsc); +be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, NULL); +be_define_const_str(data, "data", 3631407781u, 0, 4, &be_const_str_light_state); +be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_i2c_enabled); +be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_signal_bars); +be_define_const_str(decode, "decode", 3007678287u, 0, 6, &be_const_str_instance_X20required); +be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_remove_cron); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_lv_point_arr); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_init_draw_line_dsc); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_get); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_get_switches); be_define_const_str(del, "del", 3478752842u, 0, 3, NULL); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_offseta); -be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, &be_const_str_widget_ctor_impl); -be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_get_hor_res); -be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_toint); -be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, NULL); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_draw_line); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_shared_key); +be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, NULL); +be_define_const_str(depower, "depower", 3563819571u, 0, 7, NULL); +be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, NULL); +be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, &be_const_str_unsubscribe); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_hue_ntv); be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, NULL); -be_define_const_str(devices, "devices", 2701822848u, 0, 7, &be_const_str_json_append); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_round_end); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); -be_define_const_str(dim, "dim", 3496118841u, 0, 3, NULL); -be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_energy_struct); -be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, &be_const_str_members); -be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_lv_signal_bars); -be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_insert); -be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, &be_const_str_get_option); +be_define_const_str(devices, "devices", 2701822848u, 0, 7, &be_const_str_obj_class_create_obj); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_publish); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_engine); +be_define_const_str(dim, "dim", 3496118841u, 0, 3, &be_const_str_open); +be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_dirty); +be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, NULL); +be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_fast_loop); +be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_reverse); +be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, NULL); be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, NULL); -be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, &be_const_str_ins_ramp); -be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_tan); -be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, &be_const_str_power_off); -be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_refr_pos); -be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, &be_const_str_engine); -be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, NULL); -be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, NULL); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_set_height); -be_define_const_str(editable, "editable", 60532369u, 0, 8, NULL); -be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, NULL); -be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_y); +be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_y); +be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, &be_const_str_load_templates); +be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_lv_wifi_bars); +be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, &be_const_str_lvgl_timer_dispatch); +be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, NULL); +be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, NULL); +be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_enabled); +be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, &be_const_str_lv_wifi_arcs); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); +be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf); +be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_target_search); +be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, &be_const_str_pin_used); +be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_public_key); be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); be_define_const_str(enabled, "enabled", 49525662u, 0, 7, NULL); -be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, NULL); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_webclient); be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, NULL); -be_define_const_str(engine, "engine", 3993360443u, 0, 6, &be_const_str_get); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_invalid_X20GPIO_X20number); -be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_map); -be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, NULL); -be_define_const_str(eth, "eth", 2191266556u, 0, 3, &be_const_str_save); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_height_def); -be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_next_cron); -be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_hue_ntv); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_font_embedded); -be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, NULL); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_signal_bars); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_tomap); -be_define_const_str(except, "except", 950914032u, 69, 6, &be_const_str_false); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_is_ota); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); -be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, &be_const_str_get_current_module_path); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_lv_extra); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_init_draw_arc_dsc); -be_define_const_str(f, "f", 3809224601u, 0, 1, &be_const_str_is_spiffs); -be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_get_switch); +be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_mqtt); +be_define_const_str(engine, "engine", 3993360443u, 0, 6, &be_const_str_set_style_text_font); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_json_fdump_list); +be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_event_send); +be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, &be_const_str_exists); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_pc_abs); +be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_get_power); +be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_var); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, NULL); +be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, &be_const_str_no_X20more_X20RMT_X20channel_X20available); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_insert); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_get_bat_current); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_tcpclient); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_write8); +be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, NULL); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_traceback); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_is_factory); +be_define_const_str(f, "f", 3809224601u, 0, 1, NULL); +be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_is_running); be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_introspect); +be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_find_key_i); be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, NULL); -be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_set_gain); -be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_sat); -be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, &be_const_str_get_bri); -be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_loop); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_imax); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_rollback); +be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_io_error); +be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_leds); +be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, &be_const_str_set_mode_ct); +be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_tanh); +be_define_const_str(find, "find", 3186656602u, 0, 4, NULL); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_lv_clock); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_set_exten); be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(flags, "flags", 2624027180u, 0, 5, NULL); -be_define_const_str(flash, "flash", 2944773417u, 0, 5, &be_const_str_geti); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); -be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_set_style_text_color); -be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_get_ota_slot); -be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, &be_const_str_register_button_encoder); -be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_maxota); +be_define_const_str(flags, "flags", 2624027180u, 0, 5, &be_const_str_get_width); +be_define_const_str(flash, "flash", 2944773417u, 0, 5, &be_const_str_set_ldo_enable); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_r); +be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_json_fdump_map); +be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_start); +be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, &be_const_str_resp_cmnd_str); +be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, NULL); be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_hex); -be_define_const_str(from_to, "from_to", 21625507u, 0, 7, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pi); +be_define_const_str(from_to, "from_to", 21625507u, 0, 7, &be_const_str_getfloat); be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, NULL); -be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, &be_const_str_line_dsc); -be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, &be_const_str_gamma); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_get_log); -be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_toupper); -be_define_const_str(full_status, "full_status", 648242459u, 0, 11, &be_const_str_set_time); -be_define_const_str(function, "function", 2664841801u, 0, 8, &be_const_str_hue_status); -be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_size); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_lv_obj_class); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_ip); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, &be_const_str_ptr); -be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_hour); -be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, &be_const_str_read32); +be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, NULL); +be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, NULL); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_event_cb); +be_define_const_str(full_state, "full_state", 255687770u, 0, 10, NULL); +be_define_const_str(full_status, "full_status", 648242459u, 0, 11, NULL); +be_define_const_str(function, "function", 2664841801u, 0, 8, &be_const_str_search); +be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_isnan); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_lv_obj_class); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_min); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_set_style_border_width); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_set_gain); +be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, NULL); +be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_hex); +be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, &be_const_str_set_matrix_pixel_color); be_define_const_str(get_aps_voltage, "get_aps_voltage", 2293036435u, 0, 15, NULL); -be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str_is_dirty); +be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, NULL); be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, NULL); -be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, NULL); -be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, NULL); +be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, &be_const_str_label); +be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, &be_const_str_save_before_restart); be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, NULL); -be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); -be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, &be_const_str_matrix); -be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_seq1); -be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str_select); -be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); -be_define_const_str(get_event_cb, "get_event_cb", 375876088u, 0, 12, &be_const_str_rad); +be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, &be_const_str_try_get_bec_version); +be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, &be_const_str_set_active); +be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_global); +be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str_refr_size); +be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, &be_const_str_pct); +be_define_const_str(get_event_cb, "get_event_cb", 375876088u, 0, 12, &be_const_str_ismethod); be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); -be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_return_X20code_X3D_X25i); -be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, &be_const_str_lvgl_timer_dispatch); -be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, &be_const_str_set_hue16sat); -be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, &be_const_str_lv); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); -be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, NULL); -be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, &be_const_str_number); -be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_real); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_img); -be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, &be_const_str_parse); +be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, NULL); +be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, &be_const_str_print); +be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, NULL); +be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, &be_const_str_remove_trailing_zeroes); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_topic); +be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_introspect); +be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, NULL); +be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_log); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); +be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, &be_const_str_set_hue16sat); be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, NULL); be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, NULL); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_set_style_text_font); -be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_item); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_ptr); +be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, NULL); be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, NULL); -be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, &be_const_str_mqtt); -be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, &be_const_str_sin); -be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, &be_const_str_width_def); -be_define_const_str(get_switches, "get_switches", 4116216928u, 0, 12, &be_const_str_reapply); -be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, NULL); +be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, NULL); +be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, &be_const_str_set_channels); +be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_set_auth); +be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, NULL); +be_define_const_str(get_switches, "get_switches", 4116216928u, 0, 12, NULL); +be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_set_huesat); be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, NULL); -be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, &be_const_str_test); -be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, &be_const_str_iter); -be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, NULL); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); -be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, NULL); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_set_style_img_recolor_opa); -be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_instance_X20required); -be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, &be_const_str_publish_rule); -be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, &be_const_str_issubclass); -be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_raw); -be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_load); -be_define_const_str(has, "has", 3988721635u, 0, 3, &be_const_str_signal_arcs); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_traceback); +be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, NULL); +be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, &be_const_str_map); +be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, &be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_wifi_bars); +be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, &be_const_str_list_handlers); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_rotate); +be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_name); +be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, &be_const_str_has_factory); +be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, NULL); +be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_push_path); +be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_hour); +be_define_const_str(has, "has", 3988721635u, 0, 3, NULL); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_local); +be_define_const_str(has_factory, "has_factory", 2702829042u, 0, 11, &be_const_str_line_dsc); be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, NULL); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_widget_width_def); -be_define_const_str(hour, "hour", 3053661199u, 0, 4, NULL); -be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, NULL); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, &be_const_str_write_flash); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_lower); -be_define_const_str(hue, "hue", 3817694041u, 0, 3, NULL); -be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_range); -be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_try_remove_file); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_run); +be_define_const_str(hour, "hour", 3053661199u, 0, 4, &be_const_str_resp_cmnd_error); +be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, &be_const_str_module); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, &be_const_str_lv_wifi_arcs_icon); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_subtype); +be_define_const_str(hue, "hue", 3817694041u, 0, 3, &be_const_str_resize); +be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, NULL); +be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_ip); be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_pixel_count); -be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27); +be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_try_compile); +be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, NULL); be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); -be_define_const_str(img, "img", 2229740804u, 0, 3, &be_const_str_mqtt_listener); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_xy); +be_define_const_str(img, "img", 2229740804u, 0, 3, &be_const_str_time_str); be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_partition_core); -be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, &be_const_str_nvs); -be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, &be_const_str_web_sensor); +be_define_const_str(init, "init", 380752755u, 0, 4, NULL); +be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, &be_const_str_pin); +be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, &be_const_str_invalidate); be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); -be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, NULL); -be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); -be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, &be_const_str_setitem); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_label); -be_define_const_str(instance, "instance", 193386898u, 0, 8, &be_const_str_month); -be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_tele); -be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, &be_const_str_setbits); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_seq0); -be_define_const_str(int64, "int64", 64103268u, 0, 5, &be_const_str_missing_X20name); +be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, &be_const_str_lv_module_init); +be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str_round_start); +be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, NULL); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_lv_event); +be_define_const_str(instance, "instance", 193386898u, 0, 8, NULL); +be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_sat); +be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, NULL); +be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); +be_define_const_str(int64, "int64", 64103268u, 0, 5, NULL); be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, NULL); -be_define_const_str(introspect, "introspect", 164638290u, 0, 10, &be_const_str_set_light); -be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, &be_const_str_widget_event); -be_define_const_str(invalid_X20magic_X20number_X20_X2502X, "invalid magic number %02X", 2836756259u, 0, 25, &be_const_str_set_auth); -be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, &be_const_str_splash_init); -be_define_const_str(invalidate_spiffs, "invalidate_spiffs", 1470453498u, 0, 17, NULL); -be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, &be_const_str_json_fdump_map); -be_define_const_str(ip, "ip", 1261996636u, 0, 2, &be_const_str_valuer_error); +be_define_const_str(introspect, "introspect", 164638290u, 0, 10, &be_const_str_resp_cmnd); +be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); +be_define_const_str(invalid_X20magic_X20number_X20_X2502X, "invalid magic number %02X", 2836756259u, 0, 25, NULL); +be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, &be_const_str_pc_rel); +be_define_const_str(invalidate_spiffs, "invalidate_spiffs", 1470453498u, 0, 17, &be_const_str_offset); +be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, NULL); +be_define_const_str(ip, "ip", 1261996636u, 0, 2, &be_const_str_top); be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, NULL); -be_define_const_str(is_factory, "is_factory", 1312753376u, 0, 10, &be_const_str_scale_uint); -be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, &be_const_str_set_bat); -be_define_const_str(is_ota, "is_ota", 2892315548u, 0, 6, &be_const_str_load_templates); +be_define_const_str(is_factory, "is_factory", 1312753376u, 0, 10, &be_const_str_set_light); +be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, NULL); +be_define_const_str(is_ota, "is_ota", 2892315548u, 0, 6, &be_const_str_lv_wifi_bars_icon); be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, NULL); be_define_const_str(is_spiffs, "is_spiffs", 3196570601u, 0, 9, NULL); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_read13); -be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, NULL); -be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, &be_const_str_reverse_gamma10); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_return); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_log); -be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_refr_size); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, &be_const_str_settings); +be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, &be_const_str_resp_cmnd_failed); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_lv_signal_arcs); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(json, "json", 916562499u, 0, 4, NULL); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_keys); -be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, &be_const_str_response_append); -be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, NULL); +be_define_const_str(json, "json", 916562499u, 0, 4, &be_const_str_response_append); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, NULL); +be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, NULL); +be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_pixel_size); be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, NULL); -be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, NULL); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); -be_define_const_str(label, "label", 4137097213u, 0, 5, &be_const_str_to_gamma); -be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, NULL); -be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_lv_point); -be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_tasmota_log_reader); -be_define_const_str(light, "light", 3801947695u, 0, 5, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); -be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, &be_const_str_print); -be_define_const_str(light_state, "light_state", 905783845u, 0, 11, NULL); -be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, &be_const_str_remove_cron); -be_define_const_str(lights, "lights", 425118420u, 0, 6, NULL); -be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, &be_const_str_setfloat); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_success); -be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, &be_const_str_lv_clock_icon); -be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_write); +be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, &be_const_str_lv_obj); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_otadata); +be_define_const_str(label, "label", 4137097213u, 0, 5, &be_const_str_select); +be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_set_style_bg_color); +be_define_const_str(leds, "leds", 558858555u, 0, 4, NULL); +be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_tob64); +be_define_const_str(light, "light", 3801947695u, 0, 5, &be_const_str_value_error); +be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, NULL); +be_define_const_str(light_state, "light_state", 905783845u, 0, 11, &be_const_str_wifi_bars_icon); +be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, &be_const_str_y1); +be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_size); +be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, NULL); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_next_cron); +be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, NULL); +be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_manuf); be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_ota); -be_define_const_str(load_otadata, "load_otadata", 1955073712u, 0, 12, &be_const_str_set_width); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str__X7D); +be_define_const_str(load_otadata, "load_otadata", 1955073712u, 0, 12, &be_const_str_web_send); be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, NULL); -be_define_const_str(local, "local", 2621662984u, 0, 5, NULL); +be_define_const_str(local, "local", 2621662984u, 0, 5, &be_const_str_rad); be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_false); be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); -be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_memory); -be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_write_bytes); -be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, &be_const_str_srand); -be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, &be_const_str_push_path); -be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, NULL); -be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, &be_const_str_lv_style_prop_arr); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_readbytes); -be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_width); -be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, NULL); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_tomap); +be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_tobytes); +be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_power_off); +be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, &be_const_str_missing_X20name); +be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, NULL); +be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, &be_const_str_widget_group_def); +be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, NULL); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_web_add_main_button); +be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_yield); +be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, &be_const_str_set); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_as); be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_ota_); +be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); be_define_const_str(lv_signal_arcs, "lv_signal_arcs", 2839156988u, 0, 14, NULL); -be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_pixels_buffer); -be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_set_timer); -be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, &be_const_str_set_ldo_voltage); -be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, NULL); -be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, NULL); -be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_remove_light); -be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, &be_const_str_manuf); -be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_point); -be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, &be_const_str_set_x); -be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, &be_const_str_set_exten); -be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, &be_const_str_style_prop_arr); -be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, NULL); -be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_set_power); -be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_null_cb); -be_define_const_str(matrix, "matrix", 365099244u, 0, 6, NULL); -be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, &be_const_str_resp_cmnd_done); -be_define_const_str(md5, "md5", 2393554675u, 0, 3, &be_const_str_set_pixel_color); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_seti); -be_define_const_str(members, "members", 937576464u, 0, 7, NULL); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_wire); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); -be_define_const_str(min, "min", 3381609815u, 0, 3, &be_const_str_pi); -be_define_const_str(minute, "minute", 954666857u, 0, 6, &be_const_str_open); -be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); -be_define_const_str(model, "model", 2961925722u, 0, 5, NULL); -be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_string); -be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_run_cron); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_value); -be_define_const_str(mqtt_data, "mqtt_data", 2538213364u, 0, 9, &be_const_str_set_MAC); -be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, NULL); -be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_web_add_main_button); -be_define_const_str(nan, "nan", 797905850u, 0, 3, NULL); -be_define_const_str(next, "next", 1555467752u, 0, 4, NULL); -be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, &be_const_str_widget_editable); +be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_remove_timer); +be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, NULL); +be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, NULL); +be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, &be_const_str_persist); +be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_tr); +be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_write_flash); +be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, &be_const_str_running); +be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, NULL); +be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, NULL); +be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, NULL); +be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, NULL); +be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, &be_const_str_next); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_refr_pos); +be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_set_bat); +be_define_const_str(matrix, "matrix", 365099244u, 0, 6, &be_const_str_nil); +be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, NULL); +be_define_const_str(md5, "md5", 2393554675u, 0, 3, NULL); +be_define_const_str(member, "member", 719708611u, 0, 6, NULL); +be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_write_bytes); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_width_def); +be_define_const_str(min, "min", 3381609815u, 0, 3, &be_const_str_setfloat); +be_define_const_str(minute, "minute", 954666857u, 0, 6, &be_const_str_offseta); +be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, &be_const_str_set_first_time); +be_define_const_str(model, "model", 2961925722u, 0, 5, &be_const_str_sec); +be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_read_bytes); +be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_splash_init); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, &be_const_str_try_run_compiled); +be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_wire1); +be_define_const_str(mqtt_data, "mqtt_data", 2538213364u, 0, 9, &be_const_str_mqtt_listener); +be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, &be_const_str_readbytes); +be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_signal_change); +be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_nvs); +be_define_const_str(next, "next", 1555467752u, 0, 4, &be_const_str_setrange); +be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, NULL); be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, &be_const_str_on); -be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, NULL); -be_define_const_str(now, "now", 682728183u, 0, 3, &be_const_str_pin_mode); -be_define_const_str(null_cb, "null_cb", 2333536460u, 0, 7, NULL); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_write_gpio); +be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, &be_const_str_save); +be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, &be_const_str_scr_act); +be_define_const_str(now, "now", 682728183u, 0, 3, &be_const_str_x); +be_define_const_str(null_cb, "null_cb", 2333536460u, 0, 7, &be_const_str_web_sensor); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_page_autoconf_ctl); be_define_const_str(nvs, "nvs", 477704066u, 0, 3, NULL); -be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, NULL); +be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, &be_const_str_pin_mode); be_define_const_str(o, "o", 3926667934u, 0, 1, NULL); -be_define_const_str(obj, "obj", 3343205242u, 0, 3, NULL); -be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_redirect); -be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, &be_const_str_set_chg_current); +be_define_const_str(obj, "obj", 3343205242u, 0, 3, &be_const_str_p1); +be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_target); +be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, &be_const_str_set_text); be_define_const_str(offset, "offset", 348705738u, 0, 6, NULL); be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, NULL); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_pct); -be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str_rounded); -be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, &be_const_str_signal_change); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(ota, "ota", 3524801837u, 0, 3, &be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map); +be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str_range); +be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, NULL); +be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_read_sensors); +be_define_const_str(ota_, "ota_", 773595766u, 0, 4, &be_const_str_wd); be_define_const_str(ota_max, "ota_max", 2940511240u, 0, 7, NULL); be_define_const_str(otadata, "otadata", 1962391757u, 0, 7, NULL); -be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, &be_const_str_set_percentage); -be_define_const_str(p1, "p1", 2689521274u, 0, 2, NULL); -be_define_const_str(p2, "p2", 2672743655u, 0, 2, NULL); -be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, NULL); -be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, &be_const_str_wifi_arcs); +be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, &be_const_str_time_reached); +be_define_const_str(p1, "p1", 2689521274u, 0, 2, &be_const_str_end); +be_define_const_str(p2, "p2", 2672743655u, 0, 2, &be_const_str_sqrt); +be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_success); +be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, NULL); be_define_const_str(param, "param", 1309554226u, 0, 5, NULL); -be_define_const_str(parse, "parse", 1111180012u, 0, 5, NULL); -be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, &be_const_str_resolvecmnd); -be_define_const_str(path, "path", 2223459638u, 0, 4, NULL); -be_define_const_str(pc, "pc", 1313756516u, 0, 2, &be_const_str_nil); +be_define_const_str(parse, "parse", 1111180012u, 0, 5, &be_const_str_tasmota); +be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, NULL); +be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_pop_path); +be_define_const_str(pc, "pc", 1313756516u, 0, 2, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, NULL); -be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_tasmota); -be_define_const_str(pct, "pct", 1431300144u, 0, 3, &be_const_str_super); -be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, &be_const_str_reverse); +be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_pop); +be_define_const_str(pct, "pct", 1431300144u, 0, 3, &be_const_str_scan); +be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, NULL); be_define_const_str(persist, "persist", 3917083779u, 0, 7, NULL); -be_define_const_str(persist_X2E_p_X20is_X20not_X20a_X20map, "persist._p is not a map", 1176528732u, 0, 23, &be_const_str_run_bat); +be_define_const_str(persist_X2E_p_X20is_X20not_X20a_X20map, "persist._p is not a map", 1176528732u, 0, 23, NULL); be_define_const_str(phy, "phy", 1648673716u, 0, 3, NULL); be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_settings); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, &be_const_str_show); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_reapply); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); -be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, &be_const_str_tr); -be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, NULL); -be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_skip); -be_define_const_str(point, "point", 414084241u, 0, 5, &be_const_str_subscribe); +be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, &be_const_str_set_zoom); +be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, &be_const_str_seg7_font); +be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_set_style_img_recolor_opa); +be_define_const_str(point, "point", 414084241u, 0, 5, NULL); be_define_const_str(point_arr, "point_arr", 1140859857u, 0, 9, NULL); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_set_reachable); -be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, &be_const_str_wd); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, &be_const_str_wire1); -be_define_const_str(power_off, "power_off", 3568741752u, 0, 9, &be_const_str_set_mode_rgb); -be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, NULL); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_set_y); -be_define_const_str(ptr, "ptr", 1433816073u, 0, 3, NULL); -be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, NULL); -be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_def); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); +be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, &be_const_str_register_button_encoder); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(power_off, "power_off", 3568741752u, 0, 9, NULL); +be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str_web_send_decimal); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(ptr, "ptr", 1433816073u, 0, 3, &be_const_str_tolower); +be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_do); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); -be_define_const_str(publish_rule, "publish_rule", 1829459523u, 0, 12, &be_const_str_write8); +be_define_const_str(publish_rule, "publish_rule", 1829459523u, 0, 12, &be_const_str_set_mode_rgb); be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); be_define_const_str(push_path, "push_path", 1155254157u, 0, 9, NULL); -be_define_const_str(quality, "quality", 2597670950u, 0, 7, &be_const_str_sinh); +be_define_const_str(quality, "quality", 2597670950u, 0, 7, NULL); be_define_const_str(r, "r", 4144776981u, 0, 1, NULL); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, &be_const_str_wire); be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_slots); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(raw, "raw", 1140790001u, 0, 3, &be_const_str_webserver); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_send_multicast); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_style_prop_arr); +be_define_const_str(raw, "raw", 1140790001u, 0, 3, NULL); be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_top); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_set_chg_current); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_set_xy); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_uuid4); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, &be_const_str_wifi_bars); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_rtc); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, NULL); -be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, NULL); -be_define_const_str(readline, "readline", 1212709927u, 0, 8, NULL); +be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_show); +be_define_const_str(readline, "readline", 1212709927u, 0, 8, &be_const_str_send); be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_elif); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_stop); -be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, &be_const_str_resize); +be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, NULL); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); +be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, NULL); be_define_const_str(refr_pos, "refr_pos", 1020780033u, 0, 8, NULL); -be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, &be_const_str_true); +be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, &be_const_str_set_pwm); be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, NULL); -be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, NULL); -be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, &be_const_str_set_bri); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, &be_const_str_rounded); +be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, NULL); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_widget_height_def); be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, &be_const_str_round_start); -be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, NULL); -be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, NULL); +be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, NULL); +be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, &be_const_str_str); +be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, &be_const_str_run_bat); be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); -be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, &be_const_str_widget_struct_by_class); -be_define_const_str(reset, "reset", 1695364032u, 0, 5, &be_const_str__X7B); +be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, &be_const_str_solidified); +be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, &be_const_str_srand); +be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL); be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, NULL); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_class); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_import); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_set_style_pad_right); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_set_temp); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, &be_const_str_set_tasmota_logo); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_slots); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_rule); be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, NULL); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_widget_dtor_impl); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_serial); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_set_timer); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); be_define_const_str(rollback, "rollback", 2093668477u, 0, 8, NULL); be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, NULL); -be_define_const_str(round_end, "round_end", 985288225u, 0, 9, &be_const_str_set); -be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_subtype); -be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, &be_const_str_var); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_for); -be_define_const_str(rule, "rule", 4230889683u, 0, 4, &be_const_str_widget_constructor); +be_define_const_str(round_end, "round_end", 985288225u, 0, 9, NULL); +be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_set_style_line_color); +be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); +be_define_const_str(rule, "rule", 4230889683u, 0, 4, NULL); be_define_const_str(run, "run", 718098122u, 0, 3, NULL); -be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, NULL); +be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, &be_const_str_set_temp); be_define_const_str(run_cron, "run_cron", 1929098555u, 0, 8, NULL); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_trig); -be_define_const_str(running, "running", 343848780u, 0, 7, &be_const_str_set_zoom); -be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_year); -be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_raise); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(running, "running", 343848780u, 0, 7, NULL); +be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_set_height); +be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_set_dc_voltage); be_define_const_str(scr_act, "scr_act", 2080211456u, 0, 7, NULL); be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(search, "search", 2150836393u, 0, 6, &be_const_str_splash); +be_define_const_str(search, "search", 2150836393u, 0, 6, NULL); be_define_const_str(sec, "sec", 3139892658u, 0, 3, NULL); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, &be_const_str_type_error); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); be_define_const_str(select, "select", 297952813u, 0, 6, NULL); -be_define_const_str(send, "send", 1919010991u, 0, 4, NULL); -be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, NULL); -be_define_const_str(seq0, "seq0", 880225636u, 0, 4, NULL); +be_define_const_str(send, "send", 1919010991u, 0, 4, &be_const_str_set_style_pad_all); +be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, &be_const_str_if); +be_define_const_str(seq0, "seq0", 880225636u, 0, 4, &be_const_str_set_useragent); be_define_const_str(seq1, "seq1", 897003255u, 0, 4, NULL); -be_define_const_str(serial, "serial", 3687697785u, 0, 6, &be_const_str_widget_struct_default); +be_define_const_str(serial, "serial", 3687697785u, 0, 6, NULL); be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(set_MAC, "set_MAC", 1617581015u, 0, 7, &be_const_str_wifi_arcs_icon); -be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, &be_const_str_set_style_bg_color); -be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, &be_const_str_state); -be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, NULL); -be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, &be_const_str_tag); -be_define_const_str(set_bat, "set_bat", 2736667351u, 0, 7, &be_const_str_set_style_pad_all); +be_define_const_str(set_MAC, "set_MAC", 1617581015u, 0, 7, &be_const_str_width); +be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, &be_const_str_splash); +be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, &be_const_str_widget_destructor); +be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str__X7B); +be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, &be_const_str_web_add_button); +be_define_const_str(set_bat, "set_bat", 2736667351u, 0, 7, NULL); be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, NULL); -be_define_const_str(set_bri, "set_bri", 2789118779u, 0, 7, &be_const_str_set_timeouts); -be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, &be_const_str_x1); +be_define_const_str(set_bri, "set_bri", 2789118779u, 0, 7, &be_const_str_subscribe); +be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, NULL); be_define_const_str(set_chg_current, "set_chg_current", 336304386u, 0, 15, NULL); -be_define_const_str(set_chr, "set_chr", 102133743u, 0, 7, &be_const_str_touch_update); +be_define_const_str(set_chr, "set_chr", 102133743u, 0, 7, NULL); be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, NULL); -be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, NULL); +be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_toupper); be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, NULL); -be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, &be_const_str_webclient); -be_define_const_str(set_first_time, "set_first_time", 3111247550u, 0, 14, NULL); -be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, &be_const_str_unsubscribe); +be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, NULL); +be_define_const_str(set_first_time, "set_first_time", 3111247550u, 0, 14, &be_const_str_w); +be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, NULL); be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, NULL); -be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, NULL); -be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, NULL); +be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, &be_const_str_sinh); +be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, &be_const_str_widget_constructor); be_define_const_str(set_hum, "set_hum", 964296026u, 0, 7, NULL); be_define_const_str(set_ldo_enable, "set_ldo_enable", 2916502041u, 0, 14, NULL); be_define_const_str(set_ldo_voltage, "set_ldo_voltage", 4090501160u, 0, 15, NULL); @@ -833,89 +834,90 @@ be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, NULL); be_define_const_str(set_mode_ct, "set_mode_ct", 665073295u, 0, 11, NULL); be_define_const_str(set_mode_rgb, "set_mode_rgb", 852310875u, 0, 12, NULL); -be_define_const_str(set_ota_max, "set_ota_max", 4093779527u, 0, 11, NULL); +be_define_const_str(set_ota_max, "set_ota_max", 4093779527u, 0, 11, &be_const_str_set_xy); be_define_const_str(set_percentage, "set_percentage", 2952022724u, 0, 14, NULL); -be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, NULL); +be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, &be_const_str_switch_factory); be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(set_pwm, "set_pwm", 3781811012u, 0, 7, NULL); +be_define_const_str(set_pwm, "set_pwm", 3781811012u, 0, 7, &be_const_str_setitem); be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, NULL); -be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, &be_const_str_set_svc); -be_define_const_str(set_rgb, "set_rgb", 3380244855u, 0, 7, &be_const_str_widget_dtor_cb); +be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, NULL); +be_define_const_str(set_rgb, "set_rgb", 3380244855u, 0, 7, NULL); be_define_const_str(set_size, "set_size", 2183165325u, 0, 8, NULL); be_define_const_str(set_style_bg_color, "set_style_bg_color", 1689513089u, 0, 18, NULL); -be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, NULL); +be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, &be_const_str_signal_arcs); be_define_const_str(set_style_img_recolor, "set_style_img_recolor", 1245681294u, 0, 21, NULL); be_define_const_str(set_style_img_recolor_opa, "set_style_img_recolor_opa", 2667062087u, 0, 25, NULL); -be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, NULL); +be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, &be_const_str_wire_scan); be_define_const_str(set_style_pad_all, "set_style_pad_all", 3987000607u, 0, 17, NULL); -be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, &be_const_str_wifi_bars_icon); +be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, NULL); be_define_const_str(set_style_radius, "set_style_radius", 3868404032u, 0, 16, NULL); -be_define_const_str(set_style_text_color, "set_style_text_color", 943105189u, 0, 20, NULL); +be_define_const_str(set_style_text_color, "set_style_text_color", 943105189u, 0, 20, &be_const_str_sin); be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, NULL); -be_define_const_str(set_svc, "set_svc", 752734654u, 0, 7, &be_const_str_time_str); -be_define_const_str(set_tasmota_logo, "set_tasmota_logo", 4090375591u, 0, 16, NULL); +be_define_const_str(set_svc, "set_svc", 752734654u, 0, 7, NULL); +be_define_const_str(set_tasmota_logo, "set_tasmota_logo", 4090375591u, 0, 16, &be_const_str_setbits); be_define_const_str(set_temp, "set_temp", 1952131250u, 0, 8, NULL); -be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, &be_const_str_stop_iteration); -be_define_const_str(set_time, "set_time", 900236405u, 0, 8, &be_const_str_try_get_bec_version); +be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, NULL); +be_define_const_str(set_time, "set_time", 900236405u, 0, 8, NULL); be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, NULL); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_time_dump); -be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_subtype_to_string); +be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, NULL); be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, NULL); be_define_const_str(set_width, "set_width", 484671920u, 0, 9, NULL); be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, NULL); -be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, &be_const_str_y1); +be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, NULL); be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, NULL); be_define_const_str(set_zoom, "set_zoom", 1925134407u, 0, 8, NULL); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_widget_ctor_impl); be_define_const_str(setfloat, "setfloat", 2799488807u, 0, 8, NULL); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_break); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_try_remove_file); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_udp); be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL); -be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, NULL); +be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str_for); be_define_const_str(show, "show", 2840060476u, 0, 4, NULL); -be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, &be_const_str_as); +be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, NULL); be_define_const_str(signal_bars, "signal_bars", 3181573600u, 0, 11, NULL); be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, NULL); be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(skip, "skip", 1097563074u, 0, 4, &be_const_str_static); +be_define_const_str(size, "size", 597743964u, 0, 4, &be_const_str_write_bit); +be_define_const_str(skip, "skip", 1097563074u, 0, 4, &be_const_str_timer_cb); be_define_const_str(slots, "slots", 1023330342u, 0, 5, NULL); -be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, NULL); +be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, &be_const_str_class); be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, NULL); be_define_const_str(splash, "splash", 2531464038u, 0, 6, NULL); -be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_try); +be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_stop_iteration); be_define_const_str(splash_remove, "splash_remove", 3132020807u, 0, 13, NULL); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, &be_const_str_wifi); +be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_raise); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(started, "started", 2153339806u, 0, 7, NULL); +be_define_const_str(started, "started", 2153339806u, 0, 7, &be_const_str_write_gpio); be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, NULL); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_string); be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL); -be_define_const_str(string, "string", 398550328u, 0, 6, NULL); -be_define_const_str(strip, "strip", 4246411473u, 0, 5, &be_const_str_x); +be_define_const_str(string, "string", 398550328u, 0, 6, &be_const_str_break); +be_define_const_str(strip, "strip", 4246411473u, 0, 5, NULL); be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, NULL); -be_define_const_str(style_prop_arr, "style_prop_arr", 3019174322u, 0, 14, &be_const_str_toptr); -be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, NULL); -be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, NULL); +be_define_const_str(style_prop_arr, "style_prop_arr", 3019174322u, 0, 14, NULL); +be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, &be_const_str_time_dump); +be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, &be_const_str_toint); +be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, NULL); be_define_const_str(success, "success", 979353360u, 0, 7, NULL); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(super, "super", 4152230356u, 0, 5, &be_const_str_year); be_define_const_str(switch_factory, "switch_factory", 4206217516u, 0, 14, NULL); be_define_const_str(sys, "sys", 3277365014u, 0, 3, NULL); -be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_tolower); +be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_widget_instance_size); be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(target, "target", 845187144u, 0, 6, NULL); +be_define_const_str(target, "target", 845187144u, 0, 6, &be_const_str_wifi_arcs_icon); be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL); -be_define_const_str(tasmota, "tasmota", 424643812u, 0, 7, &be_const_str_try_compile); -be_define_const_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, "tasmota.get_light() is deprecated, use light.get()", 3525753647u, 0, 50, &be_const_str_web_send); +be_define_const_str(tasmota, "tasmota", 424643812u, 0, 7, NULL); +be_define_const_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, "tasmota.get_light() is deprecated, use light.get()", 3525753647u, 0, 50, NULL); be_define_const_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29, "tasmota.set_light() is deprecated, use light.set()", 2124937871u, 0, 50, NULL); be_define_const_str(tasmota_log_reader, "tasmota_log_reader", 3555069257u, 0, 18, NULL); be_define_const_str(tcpclient, "tcpclient", 3828797983u, 0, 9, NULL); @@ -923,10 +925,10 @@ be_define_const_str(tele, "tele", 3474458061u, 0, 4, NULL); be_define_const_str(test, "test", 2949673445u, 0, 4, NULL); be_define_const_str(the_X20second_X20argument_X20is_X20not_X20a_X20function, "the second argument is not a function", 3954574469u, 0, 37, NULL); be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_try_rule); be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, &be_const_str_topic); -be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, &be_const_str_value_error); +be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, NULL); +be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, NULL); be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL); be_define_const_str(tobytes, "tobytes", 595962279u, 0, 7, NULL); be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); @@ -936,39 +938,40 @@ be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); be_define_const_str(topic, "topic", 3264522692u, 0, 5, NULL); be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL); be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, &be_const_str_widget_group_def); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, NULL); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, &be_const_str_widget_ctor_cb); be_define_const_str(tr, "tr", 1195724803u, 0, 2, NULL); be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); be_define_const_str(trig, "trig", 2073314619u, 0, 4, NULL); be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(try_compile, "try_compile", 4263879840u, 0, 11, NULL); -be_define_const_str(try_get_bec_version, "try_get_bec_version", 3143116423u, 0, 19, &be_const_str_web_add_handler); -be_define_const_str(try_remove_file, "try_remove_file", 3025429926u, 0, 15, &be_const_str_wire2); +be_define_const_str(try_compile, "try_compile", 4263879840u, 0, 11, &be_const_str_type_error); +be_define_const_str(try_get_bec_version, "try_get_bec_version", 3143116423u, 0, 19, NULL); +be_define_const_str(try_remove_file, "try_remove_file", 3025429926u, 0, 15, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); be_define_const_str(try_run_compiled, "try_run_compiled", 2339741218u, 0, 16, NULL); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(type, "type", 1361572173u, 0, 4, &be_const_str_web_add_config_button); be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, NULL); -be_define_const_str(udp, "udp", 1253872004u, 0, 3, NULL); +be_define_const_str(type_to_string, "type_to_string", 1072804509u, 0, 14, NULL); +be_define_const_str(udp, "udp", 1253872004u, 0, 3, &be_const_str_write); be_define_const_str(unknown_X20instruction, "unknown instruction", 1093911841u, 0, 19, NULL); be_define_const_str(unsubscribe, "unsubscribe", 4190043798u, 0, 11, NULL); -be_define_const_str(update, "update", 672109684u, 0, 6, &be_const_str_widget_destructor); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL); be_define_const_str(uuid4, "uuid4", 1153582450u, 0, 5, NULL); be_define_const_str(value, "value", 1113510858u, 0, 5, NULL); be_define_const_str(value_error, "value_error", 773297791u, 0, 11, NULL); -be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, &be_const_str_wire_scan); +be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, NULL); be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); be_define_const_str(w, "w", 4060888886u, 0, 1, NULL); be_define_const_str(wd, "wd", 1531424278u, 0, 2, NULL); be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); -be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, &be_const_str_widget_instance_size); -be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str_widget_event_cb); +be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); +be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, &be_const_str_wifi_arcs); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); @@ -979,15 +982,15 @@ be_define_const_str(widget_cb, "widget_cb", 2763583055u, 0, 9, NULL); be_define_const_str(widget_constructor, "widget_constructor", 2543785934u, 0, 18, NULL); be_define_const_str(widget_ctor_cb, "widget_ctor_cb", 876007560u, 0, 14, NULL); be_define_const_str(widget_ctor_impl, "widget_ctor_impl", 194252479u, 0, 16, NULL); -be_define_const_str(widget_destructor, "widget_destructor", 4207388345u, 0, 17, NULL); +be_define_const_str(widget_destructor, "widget_destructor", 4207388345u, 0, 17, &be_const_str_widget_struct_default); be_define_const_str(widget_dtor_cb, "widget_dtor_cb", 3151545845u, 0, 14, NULL); be_define_const_str(widget_dtor_impl, "widget_dtor_impl", 520430610u, 0, 16, NULL); -be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); +be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, &be_const_str_wire2); be_define_const_str(widget_event, "widget_event", 1951408186u, 0, 12, NULL); be_define_const_str(widget_event_cb, "widget_event_cb", 1508466754u, 0, 15, NULL); be_define_const_str(widget_event_impl, "widget_event_impl", 2178430561u, 0, 17, NULL); be_define_const_str(widget_group_def, "widget_group_def", 1246968785u, 0, 16, NULL); -be_define_const_str(widget_height_def, "widget_height_def", 3131667813u, 0, 17, &be_const_str_xy); +be_define_const_str(widget_height_def, "widget_height_def", 3131667813u, 0, 17, NULL); be_define_const_str(widget_instance_size, "widget_instance_size", 2055354779u, 0, 20, NULL); be_define_const_str(widget_struct_by_class, "widget_struct_by_class", 3806373842u, 0, 22, NULL); be_define_const_str(widget_struct_default, "widget_struct_default", 781673633u, 0, 21, NULL); @@ -1001,15 +1004,15 @@ be_define_const_str(wifi_bars, "wifi_bars", 653141243u, 0, 9, NULL); be_define_const_str(wifi_bars_icon, "wifi_bars_icon", 3641522557u, 0, 14, NULL); be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, &be_const_str_try); be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, &be_const_str_else); be_define_const_str(write_file, "write_file", 3177658879u, 0, 10, NULL); be_define_const_str(write_flash, "write_flash", 3003629621u, 0, 11, NULL); -be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, &be_const_str_if); +be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, NULL); be_define_const_str(x, "x", 4245442695u, 0, 1, NULL); be_define_const_str(x1, "x1", 274927234u, 0, 2, NULL); be_define_const_str(xy, "xy", 1482915802u, 0, 2, NULL); @@ -1029,513 +1032,514 @@ be_define_const_str(_X7B_X7D, "{}", 1415952421u, 0, 2, NULL); be_define_const_str(_X7D, "}", 4161554600u, 0, 1, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_add, - (const bstring *)&be_const_str_md5, - (const bstring *)&be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E, - (const bstring *)&be_const_str_SERIAL_7N2, - NULL, - NULL, - (const bstring *)&be_const_str_add_header, - NULL, - (const bstring *)&be_const_str__X2Ebe, - (const bstring *)&be_const_str_app, - (const bstring *)&be_const_str_draw_ctx, - (const bstring *)&be_const_str__error, - (const bstring *)&be_const_str__X23init_X2Ebat, - (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, - NULL, - NULL, - (const bstring *)&be_const_str_unknown_X20instruction, - (const bstring *)&be_const_str__X2F_X3Frst_X3D, - (const bstring *)&be_const_str__filename, - (const bstring *)&be_const_str_Unknown_X20command, - (const bstring *)&be_const_str_BLE, - (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, - NULL, - (const bstring *)&be_const_str_get_input_power_status, - (const bstring *)&be_const_str_Unknown, - (const bstring *)&be_const_str_class_init_obj, - (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, - (const bstring *)&be_const_str_every_second, - (const bstring *)&be_const_str_Restart_X201, - (const bstring *)&be_const_str__X22, - (const bstring *)&be_const_str_ccronexpr, - (const bstring *)&be_const_str__X2Elen, - (const bstring *)&be_const_str__X2Fstate_X2F, - (const bstring *)&be_const_str_RES_OK, - (const bstring *)&be_const_str__X2Etapp, - (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, - NULL, - (const bstring *)&be_const_str_obj_class_create_obj, - (const bstring *)&be_const_str_SERIAL_6O2, - (const bstring *)&be_const_str_SERIAL_7E1, - (const bstring *)&be_const_str_char, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, - (const bstring *)&be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, - (const bstring *)&be_const_str_autorun, - NULL, - (const bstring *)&be_const_str_cosh, - (const bstring *)&be_const_str__X2502d_X25s_X2502d, - (const bstring *)&be_const_str_add_light, - (const bstring *)&be_const_str_OneWire, - (const bstring *)&be_const_str__X2Ep1, - (const bstring *)&be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - NULL, - (const bstring *)&be_const_str_do, - (const bstring *)&be_const_str_EC_C25519, - (const bstring *)&be_const_str_lv_wifi_bars_icon, - (const bstring *)&be_const_str__settings_def, - (const bstring *)&be_const_str_light_state, - (const bstring *)&be_const_str_SERIAL_7N1, - (const bstring *)&be_const_str_yield, - (const bstring *)&be_const_str_pow, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list, - (const bstring *)&be_const_str_get_light, - (const bstring *)&be_const_str_alternate, - (const bstring *)&be_const_str_AES_GCM, - (const bstring *)&be_const_str_serial, - (const bstring *)&be_const_str_create_matrix, - (const bstring *)&be_const_str_available, - (const bstring *)&be_const_str_destructor_cb, - (const bstring *)&be_const_str_f, - (const bstring *)&be_const_str_allocated, - NULL, - (const bstring *)&be_const_str_HTTP_GET, - (const bstring *)&be_const_str_instance_size, - (const bstring *)&be_const_str_MI32, - (const bstring *)&be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - (const bstring *)&be_const_str_montserrat_font, - (const bstring *)&be_const_str_rtc, - (const bstring *)&be_const_str__global_def, - (const bstring *)&be_const_str__X3C_X3D, - (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, - NULL, - NULL, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str__X2D, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, - (const bstring *)&be_const_str__, - (const bstring *)&be_const_str_remove_timer, - (const bstring *)&be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, - (const bstring *)&be_const_str__X23preinit_X2Ebe, - (const bstring *)&be_const_str__cmd, - NULL, - (const bstring *)&be_const_str_begin_multicast, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, - (const bstring *)&be_const_str_add_cron, - NULL, - (const bstring *)&be_const_str_obj_event_base, - (const bstring *)&be_const_str_set_chr, - (const bstring *)&be_const_str_AudioGeneratorWAV, - (const bstring *)&be_const_str_send, - (const bstring *)&be_const_str_get_temp, - (const bstring *)&be_const_str__t, - (const bstring *)&be_const_str_register_obj, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str__X3E, - NULL, - (const bstring *)&be_const_str_h, - (const bstring *)&be_const_str_check_not_method, - (const bstring *)&be_const_str__X2F_X2Eautoconf, - NULL, - (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, - (const bstring *)&be_const_str_while, - (const bstring *)&be_const_str_Partition_info, - (const bstring *)&be_const_str_draw_arc_dsc_init, - (const bstring *)&be_const_str_function, - NULL, - (const bstring *)&be_const_str_member, - (const bstring *)&be_const_str__X27_X20_X2D_X20, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_exec_tele, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_a, - (const bstring *)&be_const_str__X20_X20, - (const bstring *)&be_const_str_get_warning_level, - (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, - NULL, - NULL, - (const bstring *)&be_const_str_bri, - (const bstring *)&be_const_str_scr_act, - (const bstring *)&be_const_str_strptime, - NULL, - (const bstring *)&be_const_str_conn_cb, - (const bstring *)&be_const_str__X25s_X2Eautoconf, - (const bstring *)&be_const_str__X21_X3D, - (const bstring *)&be_const_str_content_start, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str__X2C, - NULL, - (const bstring *)&be_const_str_arch, - (const bstring *)&be_const_str_write_file, - (const bstring *)&be_const_str_get_style_bg_color, - (const bstring *)&be_const_str_add_anim, - (const bstring *)&be_const_str_content_send, - (const bstring *)&be_const_str_escape, - (const bstring *)&be_const_str__available, - (const bstring *)&be_const_str__X3D_X3D, - (const bstring *)&be_const_str_lv_signal_arcs, - (const bstring *)&be_const_str_global, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, - NULL, - (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, - (const bstring *)&be_const_str_display_X2Eini, - (const bstring *)&be_const_str_get_width, - (const bstring *)&be_const_str__X25, - NULL, - (const bstring *)&be_const_str_Auto_X2Dconfiguration, - (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, - (const bstring *)&be_const_str_exec_cmd, - NULL, - (const bstring *)&be_const_str_web_add_console_button, - (const bstring *)&be_const_str_set_alternate, - (const bstring *)&be_const_str_model, - (const bstring *)&be_const_str_clear, - NULL, - (const bstring *)&be_const_str_sec, - (const bstring *)&be_const_str__debug_present, - NULL, - (const bstring *)&be_const_str__fl, - (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, - (const bstring *)&be_const_str_add_fast_loop, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, - (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str_SERIAL_5O2, - (const bstring *)&be_const_str_remove_driver, - (const bstring *)&be_const_str_get_size, - (const bstring *)&be_const_str_crc16, - NULL, - (const bstring *)&be_const_str_display, - (const bstring *)&be_const_str_SERIAL_7O2, - (const bstring *)&be_const_str_back_forth, - (const bstring *)&be_const_str_lv_clock, - (const bstring *)&be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, - (const bstring *)&be_const_str_ALIGN_LEFT_MID, - (const bstring *)&be_const_str__drivers, - (const bstring *)&be_const_str__X2Ep, - (const bstring *)&be_const_str_get_pixel_color, - (const bstring *)&be_const_str_depower, - NULL, - (const bstring *)&be_const_str_crc, - (const bstring *)&be_const_str_Trigger, - (const bstring *)&be_const_str__X2F, - (const bstring *)&be_const_str_getbits, - NULL, - (const bstring *)&be_const_str__X20_X28, - NULL, - (const bstring *)&be_const_str_asstring, - (const bstring *)&be_const_str__X2Ebec, - (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_find, (const bstring *)&be_const_str_OPTION_A, - NULL, - (const bstring *)&be_const_str_url_encode, - (const bstring *)&be_const_str_active_otadata, + (const bstring *)&be_const_str_unknown_X20instruction, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_publish_rule, + (const bstring *)&be_const_str_phy, + (const bstring *)&be_const_str__X20_X28, + (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_light, + (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_deregister_obj, + (const bstring *)&be_const_str__subscribe, + (const bstring *)&be_const_str_ALIGN_LEFT_MID, + (const bstring *)&be_const_str__X25s_X2Eautoconf, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, (const bstring *)&be_const_str_Parameter_X20error, - (const bstring *)&be_const_str_set_style_line_color, - (const bstring *)&be_const_str__X5D_X2C_X0A_X20_X20, - (const bstring *)&be_const_str__splash, - (const bstring *)&be_const_str_get_free_heap, - (const bstring *)&be_const_str_set_dcdc_enable, - (const bstring *)&be_const_str_SERIAL_5N2, - (const bstring *)&be_const_str_begin, - (const bstring *)&be_const_str_assign_rmt, - (const bstring *)&be_const_str__X23autoexec_X2Ebat, - (const bstring *)&be_const_str_EVENT_DRAW_PART_BEGIN, - (const bstring *)&be_const_str_get_cb_list, - (const bstring *)&be_const_str_CFG_X3A_X20running_X20, - (const bstring *)&be_const_str_nvskeys, - (const bstring *)&be_const_str_cb_event_closure, - (const bstring *)&be_const_str_write_bit, - NULL, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, - NULL, - (const bstring *)&be_const_str__global_addr, - (const bstring *)&be_const_str_imin, - (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, - NULL, - (const bstring *)&be_const_str_cmd_res, - (const bstring *)&be_const_str_dac_voltage, - (const bstring *)&be_const_str_refr_now, - (const bstring *)&be_const_str_c, - (const bstring *)&be_const_str__X2E_X2E, - (const bstring *)&be_const_str_run, - (const bstring *)&be_const_str_call_native, - (const bstring *)&be_const_str__X3Clambda_X3E, - (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_counters, - (const bstring *)&be_const_str_invalid_X20magic_X20number_X20_X2502X, - (const bstring *)&be_const_str_read8, - (const bstring *)&be_const_str_MAX_RMT, - (const bstring *)&be_const_str_Wire, - NULL, - (const bstring *)&be_const_str__X0A, - (const bstring *)&be_const_str_remove_rule, - (const bstring *)&be_const_str__class, - (const bstring *)&be_const_str__X2E, - (const bstring *)&be_const_str__X21_X3D_X3D, - (const bstring *)&be_const_str_now, - NULL, - (const bstring *)&be_const_str_math, - (const bstring *)&be_const_str_rule, - (const bstring *)&be_const_str_save_before_restart, - (const bstring *)&be_const_str_fromb64, - NULL, - (const bstring *)&be_const_str_EVENT_DELETE, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, - (const bstring *)&be_const_str_Leds, - (const bstring *)&be_const_str_INTERNAL_DAC, - (const bstring *)&be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, - (const bstring *)&be_const_str_adv_cb, - (const bstring *)&be_const_str_get_current_module_name, - NULL, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str_setmember, - (const bstring *)&be_const_str_add_event_cb, - (const bstring *)&be_const_str_param, - NULL, - NULL, - (const bstring *)&be_const_str_target, - (const bstring *)&be_const_str_get_bat_voltage, - (const bstring *)&be_const_str_read_bytes, - (const bstring *)&be_const_str_AA50, - NULL, - (const bstring *)&be_const_str_continue, - NULL, - (const bstring *)&be_const_str_decompress, - (const bstring *)&be_const_str_floor, - (const bstring *)&be_const_str_json_fdump_list, - (const bstring *)&be_const_str_publish, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, - (const bstring *)&be_const_str_scan, - (const bstring *)&be_const_str_is_first_time, - (const bstring *)&be_const_str_enabled, - (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str_b, - (const bstring *)&be_const_str_SERIAL_5E2, - (const bstring *)&be_const_str_draw_arc_dsc, - (const bstring *)&be_const_str_consume_stereo, - (const bstring *)&be_const_str_list, - (const bstring *)&be_const_str_get_power, - (const bstring *)&be_const_str_addr, - NULL, - (const bstring *)&be_const_str_event_cb, - (const bstring *)&be_const_str_SERIAL_8N2, - (const bstring *)&be_const_str_set_huesat, - (const bstring *)&be_const_str_full_state, - (const bstring *)&be_const_str_try_rule, - (const bstring *)&be_const_str__X2Fac, - (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, - (const bstring *)&be_const_str__X29, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, - (const bstring *)&be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, - NULL, - (const bstring *)&be_const_str__ccmd, - (const bstring *)&be_const_str__X3D_X3C_X3E_X21, - NULL, - (const bstring *)&be_const_str_get_height, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_page_autoconf_mgr, - (const bstring *)&be_const_str_remove, - (const bstring *)&be_const_str_GET, - (const bstring *)&be_const_str_remove_trailing_zeroes, - NULL, - (const bstring *)&be_const_str__rmt, - (const bstring *)&be_const_str_SK6812_GRBW, - (const bstring *)&be_const_str_coord_arr, - (const bstring *)&be_const_str__change_buffer, - (const bstring *)&be_const_str__X3A, - (const bstring *)&be_const_str_make_cb, - (const bstring *)&be_const_str_RGB, - (const bstring *)&be_const_str_resp_cmnd_failed, - NULL, - (const bstring *)&be_const_str_compile, - (const bstring *)&be_const_str_Invalid_X20ota_X20partition_X20number, - (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, - (const bstring *)&be_const_str_COLOR_WHITE, - (const bstring *)&be_const_str_add_driver, - (const bstring *)&be_const_str_read24, - (const bstring *)&be_const_str_find_key_i, - (const bstring *)&be_const_str__anonymous_, - (const bstring *)&be_const_str_deg, - NULL, - (const bstring *)&be_const_str_connection_error, - (const bstring *)&be_const_str_SERIAL_5O1, - (const bstring *)&be_const_str_input, - (const bstring *)&be_const_str_COLOR_BLACK, - NULL, - (const bstring *)&be_const_str_pin_used, - (const bstring *)&be_const_str__X23autoexec_X2Ebe, - (const bstring *)&be_const_str_dimmer, - (const bstring *)&be_const_str_create_segment, - (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, - NULL, - (const bstring *)&be_const_str__dirty, - (const bstring *)&be_const_str__X22_X3A, - (const bstring *)&be_const_str_AXP192, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, - (const bstring *)&be_const_str_set_ota_max, - (const bstring *)&be_const_str_decode, (const bstring *)&be_const_str_set_rgb, - (const bstring *)&be_const_str_tob64, - (const bstring *)&be_const_str_calldepth, - (const bstring *)&be_const_str_SERIAL_8O1, + (const bstring *)&be_const_str_debug, + NULL, + (const bstring *)&be_const_str_gpio, + (const bstring *)&be_const_str_set_ct, + NULL, + (const bstring *)&be_const_str_add_cron, + (const bstring *)&be_const_str_height_def, + (const bstring *)&be_const_str_No_X20SPIFFS_X20partition_X20found, + (const bstring *)&be_const_str_id, + NULL, + (const bstring *)&be_const_str__X2Etapp, + NULL, + (const bstring *)&be_const_str_area, + (const bstring *)&be_const_str__X3A, (const bstring *)&be_const_str_gamma8, NULL, - (const bstring *)&be_const_str_draw_line_dsc_init, - (const bstring *)&be_const_str__timers, - (const bstring *)&be_const_str_io_error, + (const bstring *)&be_const_str_run_deferred, + (const bstring *)&be_const_str_collect, + (const bstring *)&be_const_str_WS2812, + (const bstring *)&be_const_str__filename, + (const bstring *)&be_const_str_touch_update, + (const bstring *)&be_const_str__def, NULL, - (const bstring *)&be_const_str_every_250ms, - (const bstring *)&be_const_str__X2Eautoconf, - (const bstring *)&be_const_str_resp_cmnd_error, - (const bstring *)&be_const_str_get_bat_current, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, - (const bstring *)&be_const_str_asin, - (const bstring *)&be_const_str_get_bat_charge_current, - (const bstring *)&be_const_str_is_running, NULL, - (const bstring *)&be_const_str_clear_to, - (const bstring *)&be_const_str_internal_error, - (const bstring *)&be_const_str_Partition_otadata, - (const bstring *)&be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, - (const bstring *)&be_const_str__end_transmission, - (const bstring *)&be_const_str_EVENT_DRAW_MAIN, - (const bstring *)&be_const_str_HTTP_POST, - (const bstring *)&be_const_str_screenshot, - (const bstring *)&be_const_str_remote_port, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_AudioGenerator, - (const bstring *)&be_const_str_detected_X20on_X20bus, - (const bstring *)&be_const_str_shared_key, - (const bstring *)&be_const_str_ctor, - (const bstring *)&be_const_str_detect, - (const bstring *)&be_const_str_quality, - (const bstring *)&be_const_str__X2D_X2A, - (const bstring *)&be_const_str__settings_ptr, - (const bstring *)&be_const_str_push, - NULL, - (const bstring *)&be_const_str_pc_abs, - (const bstring *)&be_const_str___lower__, - (const bstring *)&be_const_str_coredump, - (const bstring *)&be_const_str_add_cmd, - (const bstring *)&be_const_str_p1, - (const bstring *)&be_const_str_copy, - (const bstring *)&be_const_str_Too_X20many_X20partiition_X20slots, - (const bstring *)&be_const_str_count, - (const bstring *)&be_const_str_WS2812_GRB, - (const bstring *)&be_const_str_SERIAL_6E2, - (const bstring *)&be_const_str_invalidate_spiffs, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_ota_max, - (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, - (const bstring *)&be_const_str_set_first_time, - (const bstring *)&be_const_str_leds, - (const bstring *)&be_const_str_lv_event_cb, - (const bstring *)&be_const_str__X2B, - (const bstring *)&be_const_str_set_matrix_pixel_color, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, - (const bstring *)&be_const_str_json_fdump, - (const bstring *)&be_const_str_byte, - (const bstring *)&be_const_str_str, - (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, - (const bstring *)&be_const_str_crc8, - (const bstring *)&be_const_str__buffer, - (const bstring *)&be_const_str_mqtt_data, - (const bstring *)&be_const_str_delete_all_configs, - (const bstring *)&be_const_str_AudioOpusDecoder, - (const bstring *)&be_const_str_None, - (const bstring *)&be_const_str_DIMMER, - (const bstring *)&be_const_str__X2Esize, - (const bstring *)&be_const_str_resp_cmnd_str, - (const bstring *)&be_const_str__X20, - (const bstring *)&be_const_str_atan2, - (const bstring *)&be_const_str_json, - (const bstring *)&be_const_str_exists, (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_isinstance, + (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, + NULL, + (const bstring *)&be_const_str__settings_def, (const bstring *)&be_const_str__X23display_X2Eini, + (const bstring *)&be_const_str__X2502d_X25s_X2502d, + (const bstring *)&be_const_str__X3Clambda_X3E, + (const bstring *)&be_const_str_GET, + (const bstring *)&be_const_str_wifi, + (const bstring *)&be_const_str_content_send, + (const bstring *)&be_const_str_c, + (const bstring *)&be_const_str_SERIAL_7O1, + (const bstring *)&be_const_str__X23preinit_X2Ebe, + (const bstring *)&be_const_str_month, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, + (const bstring *)&be_const_str_get_bri, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_url_encode, + (const bstring *)&be_const_str_AA50, NULL, - (const bstring *)&be_const_str_INTERNAL_PDM, - (const bstring *)&be_const_str_web_add_management_button, + (const bstring *)&be_const_str_def, + (const bstring *)&be_const_str_rollback, + (const bstring *)&be_const_str_lvgl_event_dispatch, + (const bstring *)&be_const_str_pixel_count, + (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str_get_size, + (const bstring *)&be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, + (const bstring *)&be_const_str__X23autoexec_X2Ebe, + (const bstring *)&be_const_str_flags, + (const bstring *)&be_const_str__X22_X3A, + (const bstring *)&be_const_str_set_svc, + (const bstring *)&be_const_str_set_MAC, + (const bstring *)&be_const_str_invalid_X20GPIO_X20number, + (const bstring *)&be_const_str_valuer_error, NULL, - (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, - (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str_resp_cmnd_done, NULL, + (const bstring *)&be_const_str_widget_dtor_cb, + (const bstring *)&be_const_str_arc_dsc, + (const bstring *)&be_const_str_refr_now, + (const bstring *)&be_const_str_remove_rule, + (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_instance, + (const bstring *)&be_const_str_getbits, + (const bstring *)&be_const_str_RES_OK, + (const bstring *)&be_const_str_data, + (const bstring *)&be_const_str__energy, NULL, + (const bstring *)&be_const_str_read32, + (const bstring *)&be_const_str_get_string, + NULL, + (const bstring *)&be_const_str__X2Ep, + (const bstring *)&be_const_str_copy, + (const bstring *)&be_const_str_consume_mono, + (const bstring *)&be_const_str_widget_editable, + (const bstring *)&be_const_str__X3D_X3D, + (const bstring *)&be_const_str_except, + (const bstring *)&be_const_str_screenshot, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27, + NULL, + (const bstring *)&be_const_str_set_timeouts, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, + (const bstring *)&be_const_str__X2Ep1, + (const bstring *)&be_const_str_get_image_size, + (const bstring *)&be_const_str_available, + (const bstring *)&be_const_str_Unknown, + (const bstring *)&be_const_str_finish, + (const bstring *)&be_const_str___upper__, + (const bstring *)&be_const_str_add_anim, + (const bstring *)&be_const_str_add_event_cb, + (const bstring *)&be_const_str___lower__, + (const bstring *)&be_const_str_add_handler, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, (const bstring *)&be_const_str_BECDFE, - (const bstring *)&be_const_str__X3D, - (const bstring *)&be_const_str_int64, - (const bstring *)&be_const_str_o, - (const bstring *)&be_const_str_SERIAL_6N1, - (const bstring *)&be_const_str_debug, - (const bstring *)&be_const_str_CT, - (const bstring *)&be_const_str_path, - (const bstring *)&be_const_str_remove_cmd, - (const bstring *)&be_const_str_set_align, - (const bstring *)&be_const_str_SERIAL_6E1, - (const bstring *)&be_const_str_lv_wifi_bars, - (const bstring *)&be_const_str__X2Ew, - (const bstring *)&be_const_str_ins_goto, - (const bstring *)&be_const_str_code, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, - (const bstring *)&be_const_str_RGBW, - (const bstring *)&be_const_str_lv_, + (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, + (const bstring *)&be_const_str_continue, (const bstring *)&be_const_str__X2A, - (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_SERIAL_8O1, + NULL, + (const bstring *)&be_const_str_get_current_module_path, + (const bstring *)&be_const_str_display_X2Eini, + (const bstring *)&be_const_str__X21_X3D_X3D, + NULL, + (const bstring *)&be_const_str_PART_MAIN, + NULL, + (const bstring *)&be_const_str_instance_size, + (const bstring *)&be_const_str__X27_X20_X2D_X20, + (const bstring *)&be_const_str_on, + (const bstring *)&be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + (const bstring *)&be_const_str_imax, + (const bstring *)&be_const_str_energy_struct, + (const bstring *)&be_const_str_connection_error, + NULL, + (const bstring *)&be_const_str__X0A_X29_X3E, + NULL, + (const bstring *)&be_const_str_has_arg, + (const bstring *)&be_const_str_minute, + (const bstring *)&be_const_str_get_log, + (const bstring *)&be_const_str__X2Ep2, + (const bstring *)&be_const_str_get_current_module_name, + (const bstring *)&be_const_str__X2E_X2E, + NULL, + (const bstring *)&be_const_str_gc, + NULL, + (const bstring *)&be_const_str_setmember, + (const bstring *)&be_const_str_remove_light, + (const bstring *)&be_const_str_split, + (const bstring *)&be_const_str__X2Ebe, + (const bstring *)&be_const_str_alternate, + (const bstring *)&be_const_str__class, + (const bstring *)&be_const_str_remote_port, + (const bstring *)&be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, + (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, + (const bstring *)&be_const_str__X2B, + (const bstring *)&be_const_str_I2C_X3A, + (const bstring *)&be_const_str_frombytes, + NULL, + (const bstring *)&be_const_str_get_temp, + (const bstring *)&be_const_str_set_chr, + (const bstring *)&be_const_str__error, + (const bstring *)&be_const_str__X23autoexec_X2Ebat, + (const bstring *)&be_const_str_get_bat_charge_current, + NULL, + (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, + (const bstring *)&be_const_str_SERIAL_6N1, + (const bstring *)&be_const_str_item, + NULL, + (const bstring *)&be_const_str__X25, + (const bstring *)&be_const_str_SERIAL_5N2, + (const bstring *)&be_const_str_set_alternate, + (const bstring *)&be_const_str_file, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, + (const bstring *)&be_const_str_font_montserrat, + (const bstring *)&be_const_str_iter, + (const bstring *)&be_const_str_AudioGeneratorWAV, + (const bstring *)&be_const_str__X3E, + (const bstring *)&be_const_str__X2Fac, + (const bstring *)&be_const_str_full_status, + NULL, + (const bstring *)&be_const_str_erase, + (const bstring *)&be_const_str_sys, + (const bstring *)&be_const_str_arg, + (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, + NULL, + (const bstring *)&be_const_str_get_style_pad_right, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, + (const bstring *)&be_const_str__archive, + (const bstring *)&be_const_str__X23init_X2Ebat, + (const bstring *)&be_const_str_get_vbus_current, NULL, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, - (const bstring *)&be_const_str_lv_solidified, - (const bstring *)&be_const_str_strip, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, - (const bstring *)&be_const_str_BUTTON_CONFIGURATION, - (const bstring *)&be_const_str_efuse_em, (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, - (const bstring *)&be_const_str_nan, + (const bstring *)&be_const_str_draw_ctx, + (const bstring *)&be_const_str_clear, + (const bstring *)&be_const_str_json, + (const bstring *)&be_const_str_WS2812_GRB, + (const bstring *)&be_const_str_SERIAL_7E1, + (const bstring *)&be_const_str__cmd, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_exp, + (const bstring *)&be_const_str_flash, + (const bstring *)&be_const_str_decompress, + (const bstring *)&be_const_str_add_light, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_escape, + (const bstring *)&be_const_str_now, + (const bstring *)&be_const_str_fast_loop_enabled, + (const bstring *)&be_const_str_lv_coord_arr, + (const bstring *)&be_const_str_classof, + (const bstring *)&be_const_str_md5, NULL, + (const bstring *)&be_const_str__X20_X20, + (const bstring *)&be_const_str__X3F, + (const bstring *)&be_const_str_EC_C25519, + (const bstring *)&be_const_str_asstring, + (const bstring *)&be_const_str_strptime, + (const bstring *)&be_const_str_addr, + (const bstring *)&be_const_str_close, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_keys, + (const bstring *)&be_const_str_dac_voltage, + NULL, + (const bstring *)&be_const_str_animate, + (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, + (const bstring *)&be_const_str_adv_cb, + (const bstring *)&be_const_str_lv_style_prop_arr, + (const bstring *)&be_const_str__X29, + (const bstring *)&be_const_str_set_style_text_color, + (const bstring *)&be_const_str_lv_solidified, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_Partition_otadata, + (const bstring *)&be_const_str_reset_search, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, + (const bstring *)&be_const_str_get_aps_voltage, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + (const bstring *)&be_const_str_set_power, + (const bstring *)&be_const_str_draw_line, + (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, + (const bstring *)&be_const_str_log10, (const bstring *)&be_const_str__rules, NULL, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, - (const bstring *)&be_const_str_list_handlers, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__X23, - (const bstring *)&be_const_str_ismethod, - (const bstring *)&be_const_str__X5D, - (const bstring *)&be_const_str__X0A_X29_X3E, - (const bstring *)&be_const_str_set_pwm, - (const bstring *)&be_const_str__X3E_X3D, - (const bstring *)&be_const_str_finish, - (const bstring *)&be_const_str_offset, - (const bstring *)&be_const_str_STATE_DEFAULT, + (const bstring *)&be_const_str_content_flush, + (const bstring *)&be_const_str_draw_arc, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_readline, + (const bstring *)&be_const_str_ceil, + (const bstring *)&be_const_str__X2F_X2Eautoconf, + (const bstring *)&be_const_str_RELAY, + (const bstring *)&be_const_str__X3C, + (const bstring *)&be_const_str_init_draw_arc_dsc, + (const bstring *)&be_const_str_Tele, + (const bstring *)&be_const_str_SERIAL_8N2, + (const bstring *)&be_const_str_millis, + (const bstring *)&be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, + (const bstring *)&be_const_str_last_modified, + (const bstring *)&be_const_str__persist_X2Ejson, + (const bstring *)&be_const_str_get_height, + (const bstring *)&be_const_str_code, + (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_get_ota_slot, + (const bstring *)&be_const_str_reset, + (const bstring *)&be_const_str__X2E, + (const bstring *)&be_const_str_OneWire, + (const bstring *)&be_const_str_cmd, + (const bstring *)&be_const_str__X2Fstate_X2F, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, + (const bstring *)&be_const_str_AudioOpusDecoder, + (const bstring *)&be_const_str_add_cmd, + (const bstring *)&be_const_str_listdir, + (const bstring *)&be_const_str_EXTERNAL_I2S, + (const bstring *)&be_const_str_CT, + (const bstring *)&be_const_str_ctypes_bytes_dyn, + (const bstring *)&be_const_str_SERIAL_6N2, + (const bstring *)&be_const_str_Auto_X2Dconfiguration, + (const bstring *)&be_const_str__X2D_X2A, + (const bstring *)&be_const_str_atan, + (const bstring *)&be_const_str_False, NULL, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, - (const bstring *)&be_const_str_button_pressed, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, - (const bstring *)&be_const_str_get_vbus_current, - (const bstring *)&be_const_str__crons, + (const bstring *)&be_const_str_crc16, + (const bstring *)&be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, + (const bstring *)&be_const_str_get_light, + (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, + NULL, + (const bstring *)&be_const_str_dump, + (const bstring *)&be_const_str__X3D, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str_Partition_info, + (const bstring *)&be_const_str_SERIAL_8N1, + (const bstring *)&be_const_str_hue_status, + (const bstring *)&be_const_str__X0A, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str__buffer, + (const bstring *)&be_const_str_strip, + (const bstring *)&be_const_str_closure, + (const bstring *)&be_const_str_elif, + (const bstring *)&be_const_str_count, + (const bstring *)&be_const_str_display, + (const bstring *)&be_const_str__X2F, + (const bstring *)&be_const_str_issubclass, + NULL, + NULL, + (const bstring *)&be_const_str_read12, + (const bstring *)&be_const_str_dimmer, + (const bstring *)&be_const_str_COLOR_BLACK, + (const bstring *)&be_const_str_remove, + (const bstring *)&be_const_str__read, + NULL, + (const bstring *)&be_const_str_devices, + (const bstring *)&be_const_str_ins_time, + (const bstring *)&be_const_str__X5D_X2C_X0A_X20_X20, + (const bstring *)&be_const_str_lv_timer_cb, + (const bstring *)&be_const_str_mqtt_data, + (const bstring *)&be_const_str_push, + (const bstring *)&be_const_str_EVENT_DRAW_MAIN, + (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_set_width, + (const bstring *)&be_const_str_redirect, + (const bstring *)&be_const_str_add_fast_loop, + (const bstring *)&be_const_str_invalid_X20magic_X20number_X20_X2502X, + (const bstring *)&be_const_str_draw_arc_dsc_init, + (const bstring *)&be_const_str_SERIAL_5O1, + (const bstring *)&be_const_str_AES_GCM, + (const bstring *)&be_const_str_decode, + (const bstring *)&be_const_str_contains, + (const bstring *)&be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_BLE, + (const bstring *)&be_const_str_Leds, + (const bstring *)&be_const_str_null_cb, + (const bstring *)&be_const_str_percentage, + (const bstring *)&be_const_str_SERIAL_7N1, + (const bstring *)&be_const_str_ctypes_bytes, + (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, + (const bstring *)&be_const_str_SERIAL_6O2, + NULL, + (const bstring *)&be_const_str__X2C, + (const bstring *)&be_const_str_add, + (const bstring *)&be_const_str_clock, + (const bstring *)&be_const_str_state, + (const bstring *)&be_const_str_create_segment, + (const bstring *)&be_const_str_attrdump, + (const bstring *)&be_const_str_arch, + (const bstring *)&be_const_str__X5B, + (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, + NULL, + (const bstring *)&be_const_str_scale_uint, + (const bstring *)&be_const_str_upper, + (const bstring *)&be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E, + (const bstring *)&be_const_str_MAX_RMT, + (const bstring *)&be_const_str_encrypt, + (const bstring *)&be_const_str_zero, + NULL, + (const bstring *)&be_const_str__change_buffer, + NULL, + (const bstring *)&be_const_str_widget_cb, + NULL, + (const bstring *)&be_const_str__drivers, + (const bstring *)&be_const_str__X28_X29, + (const bstring *)&be_const_str_strftime, + NULL, + (const bstring *)&be_const_str_day, + NULL, + (const bstring *)&be_const_str_write_file, + (const bstring *)&be_const_str_AXP192, + (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, + (const bstring *)&be_const_str_obj, + (const bstring *)&be_const_str_SERIAL_7N2, + (const bstring *)&be_const_str_preinit, + (const bstring *)&be_const_str_factory, + (const bstring *)&be_const_str_COLOR_WHITE, + (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str__X2D, + (const bstring *)&be_const_str_set_align, + (const bstring *)&be_const_str__X3C_X3D, + (const bstring *)&be_const_str_abs, (const bstring *)&be_const_str_pc, NULL, - (const bstring *)&be_const_str_running, + (const bstring *)&be_const_str_cb_do_nothing, + (const bstring *)&be_const_str_return, + (const bstring *)&be_const_str_members, + (const bstring *)&be_const_str_call, + (const bstring *)&be_const_str_set_hum, NULL, - (const bstring *)&be_const_str_hue, - (const bstring *)&be_const_str__X2Ep2, - (const bstring *)&be_const_str__energy, - (const bstring *)&be_const_str_can_show, - (const bstring *)&be_const_str_set_text, - (const bstring *)&be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27 + (const bstring *)&be_const_str_fat, + (const bstring *)&be_const_str_00, + (const bstring *)&be_const_str_SERIAL_5E2, + (const bstring *)&be_const_str_POST, + (const bstring *)&be_const_str_Wire, + (const bstring *)&be_const_str_ccronexpr, + (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, + (const bstring *)&be_const_str_begin_multicast, + (const bstring *)&be_const_str_INTERNAL_PDM, + (const bstring *)&be_const_str__splash, + (const bstring *)&be_const_str_nvskeys, + (const bstring *)&be_const_str_page_autoconf_mgr, + (const bstring *)&be_const_str_group_def, + (const bstring *)&be_const_str_exec_tele, + NULL, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + NULL, + (const bstring *)&be_const_str__ccmd, + (const bstring *)&be_const_str_o, + (const bstring *)&be_const_str_p2, + (const bstring *)&be_const_str_lv_, + (const bstring *)&be_const_str_connect, + (const bstring *)&be_const_str__X2Ew, + (const bstring *)&be_const_str_init, + (const bstring *)&be_const_str_STATE_DEFAULT, + (const bstring *)&be_const_str__X22, + (const bstring *)&be_const_str_MI32, + (const bstring *)&be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, + (const bstring *)&be_const_str_set_style_radius, + (const bstring *)&be_const_str_add_cb_event_closure, + (const bstring *)&be_const_str_cmd_res, + (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, + (const bstring *)&be_const_str__X2Flights_X2F, + (const bstring *)&be_const_str_True, + (const bstring *)&be_const_str_set_style_pad_right, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, + (const bstring *)&be_const_str__X2Elen, + (const bstring *)&be_const_str_tasmota_log_reader, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, + (const bstring *)&be_const_str__X3E_X3D, + (const bstring *)&be_const_str__debug_present, + (const bstring *)&be_const_str__settings_ptr, + (const bstring *)&be_const_str_pixels_buffer, + (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, + (const bstring *)&be_const_str_widget_event_impl, + (const bstring *)&be_const_str_get_active, + (const bstring *)&be_const_str_EVENT_DELETE, + (const bstring *)&be_const_str_SERIAL_5O2, + (const bstring *)&be_const_str_out_X20of_X20range, + (const bstring *)&be_const_str_back_forth, + (const bstring *)&be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, + (const bstring *)&be_const_str_Unknown_X20command, + (const bstring *)&be_const_str_get_object_from_ptr, + (const bstring *)&be_const_str_create_custom_widget, + (const bstring *)&be_const_str__X2F_X3Frst_X3D, + NULL, + (const bstring *)&be_const_str__available, + NULL, + (const bstring *)&be_const_str_light_to_id, + (const bstring *)&be_const_str_SERIAL_6O1, + NULL, + (const bstring *)&be_const_str__X23, + (const bstring *)&be_const_str_autoexec, + (const bstring *)&be_const_str_img, + (const bstring *)&be_const_str_bool, + (const bstring *)&be_const_str_rand, + (const bstring *)&be_const_str_set_y, + (const bstring *)&be_const_str__X2Eautoconf, + (const bstring *)&be_const_str_editable, + NULL, + (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, + NULL, + (const bstring *)&be_const_str_remote_ip, + (const bstring *)&be_const_str__t, + (const bstring *)&be_const_str_content_send_style, + (const bstring *)&be_const_str_EVENT_DRAW_PART_BEGIN, + (const bstring *)&be_const_str__global_def, + NULL, + (const bstring *)&be_const_str_obj_event_base, + (const bstring *)&be_const_str_app, + NULL, + NULL, + (const bstring *)&be_const_str_atan2, + (const bstring *)&be_const_str_check_privileged_access, + (const bstring *)&be_const_str_fromptr, + (const bstring *)&be_const_str_value, + (const bstring *)&be_const_str__lvgl, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, + (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, + (const bstring *)&be_const_str_set_rate, + (const bstring *)&be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, + NULL, + (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_MD5, + (const bstring *)&be_const_str_update, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str_adv_watch, + (const bstring *)&be_const_str__X20, + (const bstring *)&be_const_str_counters, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, + NULL, + NULL, + (const bstring *)&be_const_str_crc32, + (const bstring *)&be_const_str_compress, + (const bstring *)&be_const_str__, + (const bstring *)&be_const_str___iterator__, + (const bstring *)&be_const_str__X2Esize, + (const bstring *)&be_const_str_constructor_cb, + (const bstring *)&be_const_str_get_bat_voltage, + (const bstring *)&be_const_str__X21_X3D, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_tele, + (const bstring *)&be_const_str_remove_cmd, + (const bstring *)&be_const_str_content_button }; static const struct bconststrtab m_const_string_table = { - .size = 503, - .count = 1029, + .size = 504, + .count = 1032, .table = m_string_table }; diff --git a/lib/libesp32/berry_tasmota/src/be_flash_lib.c b/lib/libesp32/berry_tasmota/src/be_flash_lib.c index b952bd564..fe8504069 100644 --- a/lib/libesp32/berry_tasmota/src/be_flash_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_flash_lib.c @@ -11,13 +11,8 @@ #include "esp_partition.h" // Forces the next restart to use the `factory` partition if any is present -void p_factory(void) { - const esp_partition_t *otadata_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL); - if (otadata_partition) { - esp_partition_erase_range(otadata_partition, 0, SPI_FLASH_SEC_SIZE * 2); - } -} -BE_FUNC_CTYPE_DECLARE(p_factory, "", ""); +extern void p_factory(bbool force_ota); +BE_FUNC_CTYPE_DECLARE(p_factory, "", "b"); extern int p_flash_read(bvm *vm); extern int p_flash_write(bvm *vm); diff --git a/lib/libesp32/berry_tasmota/src/be_partition_core_module.c b/lib/libesp32/berry_tasmota/src/be_partition_core_module.c index 045ac7135..884d545ff 100644 --- a/lib/libesp32/berry_tasmota/src/be_partition_core_module.c +++ b/lib/libesp32/berry_tasmota/src/be_partition_core_module.c @@ -7,124 +7,6 @@ *******************************************************************/ #include "be_constobj.h" -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Partition_otadata_tostring, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* 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_str(string), - /* K1 */ be_nested_str(format), - /* K2 */ be_nested_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25d_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E), - /* K3 */ be_nested_str(active_otadata), - /* K4 */ be_nested_str(seq0), - /* K5 */ be_nested_str(seq1), - /* K6 */ be_nested_str(maxota), - }), - &be_const_str_tostring, - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x88140103, // 0003 GETMBR R5 R0 K3 - 0x88180104, // 0004 GETMBR R6 R0 K4 - 0x881C0105, // 0005 GETMBR R7 R0 K5 - 0x88200106, // 0006 GETMBR R8 R0 K6 - 0x7C080C00, // 0007 CALL R2 6 - 0x80040400, // 0008 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load -********************************************************************/ -be_local_closure(Partition_otadata_load, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* 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_str(flash), - /* K1 */ be_nested_str(read), - /* K2 */ be_nested_str(seq0), - /* K3 */ be_nested_str(get), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str(seq1), - /* K6 */ be_nested_str(crc32_ota_seq), - /* K7 */ be_nested_str(_validate), - }), - &be_const_str_load, - &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x5412DFFF, // 0002 LDINT R4 57344 - 0x5416001F, // 0003 LDINT R5 32 - 0x7C080600, // 0004 CALL R2 3 - 0x8C0C0301, // 0005 GETMET R3 R1 K1 - 0x5416EFFF, // 0006 LDINT R5 61440 - 0x541A001F, // 0007 LDINT R6 32 - 0x7C0C0600, // 0008 CALL R3 3 - 0x8C100503, // 0009 GETMET R4 R2 K3 - 0x58180004, // 000A LDCONST R6 K4 - 0x541E0003, // 000B LDINT R7 4 - 0x7C100600, // 000C CALL R4 3 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x8C100703, // 000E GETMET R4 R3 K3 - 0x58180004, // 000F LDCONST R6 K4 - 0x541E0003, // 0010 LDINT R7 4 - 0x7C100600, // 0011 CALL R4 3 - 0x90020A04, // 0012 SETMBR R0 K5 R4 - 0x8C100503, // 0013 GETMET R4 R2 K3 - 0x541A001B, // 0014 LDINT R6 28 - 0x541E0003, // 0015 LDINT R7 4 - 0x7C100600, // 0016 CALL R4 3 - 0x8C140106, // 0017 GETMET R5 R0 K6 - 0x881C0102, // 0018 GETMBR R7 R0 K2 - 0x7C140400, // 0019 CALL R5 2 - 0x1C100805, // 001A EQ R4 R4 R5 - 0x8C140703, // 001B GETMET R5 R3 K3 - 0x541E001B, // 001C LDINT R7 28 - 0x54220003, // 001D LDINT R8 4 - 0x7C140600, // 001E CALL R5 3 - 0x8C180106, // 001F GETMET R6 R0 K6 - 0x88200105, // 0020 GETMBR R8 R0 K5 - 0x7C180400, // 0021 CALL R6 2 - 0x1C140A06, // 0022 EQ R5 R5 R6 - 0x5C180800, // 0023 MOVE R6 R4 - 0x741A0001, // 0024 JMPT R6 #0027 - 0x4C180000, // 0025 LDNIL R6 - 0x90020406, // 0026 SETMBR R0 K2 R6 - 0x5C180A00, // 0027 MOVE R6 R5 - 0x741A0001, // 0028 JMPT R6 #002B - 0x4C180000, // 0029 LDNIL R6 - 0x90020A06, // 002A SETMBR R0 K5 R6 - 0x8C180107, // 002B GETMET R6 R0 K7 - 0x7C180200, // 002C CALL R6 1 - 0x80000000, // 002D RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: save ********************************************************************/ @@ -214,46 +96,259 @@ be_local_closure(Partition_otadata_save, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: tostring ********************************************************************/ -be_local_closure(Partition_otadata_init, /* name */ +be_local_closure(Partition_otadata_tostring, /* name */ be_nested_proto( - 5, /* nstack */ - 3, /* argc */ + 9, /* nstack */ + 1, /* argc */ 2, /* 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_str(maxota), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str(offset), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str(string), + /* K1 */ be_nested_str(format), + /* K2 */ be_nested_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E), /* K3 */ be_nested_str(active_otadata), /* K4 */ be_const_int(0), - /* K5 */ be_nested_str(load), + /* K5 */ be_nested_str(ota_), + /* K6 */ be_nested_str(factory), + /* K7 */ be_nested_str(seq0), + /* K8 */ be_nested_str(seq1), + /* K9 */ be_nested_str(maxota), }), - &be_const_str_init, + &be_const_str_tostring, &be_const_str_solidified, ( &(const binstruction[17]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x88140103, // 0003 GETMBR R5 R0 K3 + 0x28140B04, // 0004 GE R5 R5 K4 + 0x78160004, // 0005 JMPF R5 #000B + 0x60140008, // 0006 GETGBL R5 G8 + 0x88180103, // 0007 GETMBR R6 R0 K3 + 0x7C140200, // 0008 CALL R5 1 + 0x00160A05, // 0009 ADD R5 K5 R5 + 0x70020000, // 000A JMP #000C + 0x58140006, // 000B LDCONST R5 K6 + 0x88180107, // 000C GETMBR R6 R0 K7 + 0x881C0108, // 000D GETMBR R7 R0 K8 + 0x88200109, // 000E GETMBR R8 R0 K9 + 0x7C080C00, // 000F CALL R2 6 + 0x80040400, // 0010 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _validate +********************************************************************/ +be_local_closure(Partition_otadata__validate, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str(active_otadata), + /* K1 */ be_nested_str(has_factory), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str(seq0), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str(maxota), + /* K6 */ be_nested_str(seq1), + }), + &be_const_str__validate, + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x78060001, // 0001 JMPF R1 #0004 + 0x5405FFFE, // 0002 LDINT R1 -1 + 0x70020000, // 0003 JMP #0005 + 0x58040002, // 0004 LDCONST R1 K2 + 0x90020001, // 0005 SETMBR R0 K0 R1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060005, // 0009 JMPF R1 #0010 + 0x88040103, // 000A GETMBR R1 R0 K3 + 0x04040304, // 000B SUB R1 R1 K4 + 0x88080105, // 000C GETMBR R2 R0 K5 + 0x00080504, // 000D ADD R2 R2 K4 + 0x10040202, // 000E MOD R1 R1 R2 + 0x90020001, // 000F SETMBR R0 K0 R1 + 0x88040106, // 0010 GETMBR R1 R0 K6 + 0x4C080000, // 0011 LDNIL R2 + 0x20040202, // 0012 NE R1 R1 R2 + 0x7806000D, // 0013 JMPF R1 #0022 + 0x88040103, // 0014 GETMBR R1 R0 K3 + 0x4C080000, // 0015 LDNIL R2 + 0x1C040202, // 0016 EQ R1 R1 R2 + 0x74060003, // 0017 JMPT R1 #001C + 0x88040106, // 0018 GETMBR R1 R0 K6 + 0x88080103, // 0019 GETMBR R2 R0 K3 + 0x24040202, // 001A GT R1 R1 R2 + 0x78060005, // 001B JMPF R1 #0022 + 0x88040106, // 001C GETMBR R1 R0 K6 + 0x04040304, // 001D SUB R1 R1 K4 + 0x88080105, // 001E GETMBR R2 R0 K5 + 0x00080504, // 001F ADD R2 R2 K4 + 0x10040202, // 0020 MOD R1 R1 R2 + 0x90020001, // 0021 SETMBR R0 K0 R1 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_ota_max +********************************************************************/ +be_local_closure(Partition_otadata_set_ota_max, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str(maxota), + }), + &be_const_str_set_ota_max, + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x880C0100, // 0001 GETMBR R3 R0 K0 - 0x4C100000, // 0002 LDNIL R4 - 0x1C0C0604, // 0003 EQ R3 R3 R4 - 0x780E0000, // 0004 JMPF R3 #0006 - 0x90020101, // 0005 SETMBR R0 K0 K1 - 0x90020402, // 0006 SETMBR R0 K2 R2 - 0x880C0102, // 0007 GETMBR R3 R0 K2 - 0x4C100000, // 0008 LDNIL R4 - 0x1C0C0604, // 0009 EQ R3 R3 R4 - 0x780E0001, // 000A JMPF R3 #000D - 0x540EDFFF, // 000B LDINT R3 57344 - 0x90020403, // 000C SETMBR R0 K2 R3 - 0x90020704, // 000D SETMBR R0 K3 K4 - 0x8C0C0105, // 000E GETMET R3 R0 K5 - 0x7C0C0200, // 000F CALL R3 1 - 0x80000000, // 0010 RET 0 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load +********************************************************************/ +be_local_closure(Partition_otadata_load, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* 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_str(flash), + /* K1 */ be_nested_str(read), + /* K2 */ be_nested_str(seq0), + /* K3 */ be_nested_str(get), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str(seq1), + /* K6 */ be_nested_str(crc32_ota_seq), + /* K7 */ be_nested_str(_validate), + }), + &be_const_str_load, + &be_const_str_solidified, + ( &(const binstruction[46]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x5412DFFF, // 0002 LDINT R4 57344 + 0x5416001F, // 0003 LDINT R5 32 + 0x7C080600, // 0004 CALL R2 3 + 0x8C0C0301, // 0005 GETMET R3 R1 K1 + 0x5416EFFF, // 0006 LDINT R5 61440 + 0x541A001F, // 0007 LDINT R6 32 + 0x7C0C0600, // 0008 CALL R3 3 + 0x8C100503, // 0009 GETMET R4 R2 K3 + 0x58180004, // 000A LDCONST R6 K4 + 0x541E0003, // 000B LDINT R7 4 + 0x7C100600, // 000C CALL R4 3 + 0x90020404, // 000D SETMBR R0 K2 R4 + 0x8C100703, // 000E GETMET R4 R3 K3 + 0x58180004, // 000F LDCONST R6 K4 + 0x541E0003, // 0010 LDINT R7 4 + 0x7C100600, // 0011 CALL R4 3 + 0x90020A04, // 0012 SETMBR R0 K5 R4 + 0x8C100503, // 0013 GETMET R4 R2 K3 + 0x541A001B, // 0014 LDINT R6 28 + 0x541E0003, // 0015 LDINT R7 4 + 0x7C100600, // 0016 CALL R4 3 + 0x8C140106, // 0017 GETMET R5 R0 K6 + 0x881C0102, // 0018 GETMBR R7 R0 K2 + 0x7C140400, // 0019 CALL R5 2 + 0x1C100805, // 001A EQ R4 R4 R5 + 0x8C140703, // 001B GETMET R5 R3 K3 + 0x541E001B, // 001C LDINT R7 28 + 0x54220003, // 001D LDINT R8 4 + 0x7C140600, // 001E CALL R5 3 + 0x8C180106, // 001F GETMET R6 R0 K6 + 0x88200105, // 0020 GETMBR R8 R0 K5 + 0x7C180400, // 0021 CALL R6 2 + 0x1C140A06, // 0022 EQ R5 R5 R6 + 0x5C180800, // 0023 MOVE R6 R4 + 0x741A0001, // 0024 JMPT R6 #0027 + 0x4C180000, // 0025 LDNIL R6 + 0x90020406, // 0026 SETMBR R0 K2 R6 + 0x5C180A00, // 0027 MOVE R6 R5 + 0x741A0001, // 0028 JMPT R6 #002B + 0x4C180000, // 0029 LDNIL R6 + 0x90020A06, // 002A SETMBR R0 K5 R6 + 0x8C180107, // 002B GETMET R6 R0 K7 + 0x7C180200, // 002C CALL R6 1 + 0x80000000, // 002D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: crc32_ota_seq +********************************************************************/ +be_local_closure(Partition_otadata_crc32_ota_seq, /* 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[ 3]) { /* constants */ + /* K0 */ be_nested_str(crc), + /* K1 */ be_nested_str(crc32), + /* K2 */ be_nested_str(add), + }), + &be_const_str_crc32_ota_seq, + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x5411FFFE, // 0002 LDINT R4 -1 + 0x60140015, // 0003 GETGBL R5 G21 + 0x7C140000, // 0004 CALL R5 0 + 0x8C140B02, // 0005 GETMET R5 R5 K2 + 0x5C1C0000, // 0006 MOVE R7 R0 + 0x54220003, // 0007 LDINT R8 4 + 0x7C140600, // 0008 CALL R5 3 + 0x7C080600, // 0009 CALL R2 3 + 0x80040400, // 000A RET 1 R2 }) ) ); @@ -332,77 +427,12 @@ be_local_closure(Partition_otadata_set_active, /* name */ /******************************************************************** -** Solidified function: set_ota_max +** Solidified function: init ********************************************************************/ -be_local_closure(Partition_otadata_set_ota_max, /* name */ +be_local_closure(Partition_otadata_init, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str(maxota), - }), - &be_const_str_set_ota_max, - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: crc32_ota_seq -********************************************************************/ -be_local_closure(Partition_otadata_crc32_ota_seq, /* 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[ 3]) { /* constants */ - /* K0 */ be_nested_str(crc), - /* K1 */ be_nested_str(crc32), - /* K2 */ be_nested_str(add), - }), - &be_const_str_crc32_ota_seq, - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x5411FFFE, // 0002 LDINT R4 -1 - 0x60140015, // 0003 GETGBL R5 G21 - 0x7C140000, // 0004 CALL R5 0 - 0x8C140B02, // 0005 GETMET R5 R5 K2 - 0x5C1C0000, // 0006 MOVE R7 R0 - 0x54220003, // 0007 LDINT R8 4 - 0x7C140600, // 0008 CALL R5 3 - 0x7C080600, // 0009 CALL R2 3 - 0x80040400, // 000A RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _validate -********************************************************************/ -be_local_closure(Partition_otadata__validate, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 6, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -410,46 +440,35 @@ be_local_closure(Partition_otadata__validate, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str(active_otadata), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str(seq0), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str(maxota), - /* K5 */ be_nested_str(seq1), + /* K0 */ be_nested_str(maxota), + /* K1 */ be_nested_str(has_factory), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str(offset), + /* K4 */ be_nested_str(active_otadata), + /* K5 */ be_nested_str(load), }), - &be_const_str__validate, + &be_const_str_init, &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x90020101, // 0000 SETMBR R0 K0 K1 - 0x88040102, // 0001 GETMBR R1 R0 K2 - 0x4C080000, // 0002 LDNIL R2 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040102, // 0005 GETMBR R1 R0 K2 - 0x04040303, // 0006 SUB R1 R1 K3 - 0x88080104, // 0007 GETMBR R2 R0 K4 - 0x00080503, // 0008 ADD R2 R2 K3 - 0x10040202, // 0009 MOD R1 R1 R2 - 0x90020001, // 000A SETMBR R0 K0 R1 - 0x88040105, // 000B GETMBR R1 R0 K5 - 0x4C080000, // 000C LDNIL R2 - 0x20040202, // 000D NE R1 R1 R2 - 0x7806000D, // 000E JMPF R1 #001D - 0x88040102, // 000F GETMBR R1 R0 K2 - 0x4C080000, // 0010 LDNIL R2 - 0x1C040202, // 0011 EQ R1 R1 R2 - 0x74060003, // 0012 JMPT R1 #0017 - 0x88040105, // 0013 GETMBR R1 R0 K5 - 0x88080102, // 0014 GETMBR R2 R0 K2 - 0x24040202, // 0015 GT R1 R1 R2 - 0x78060005, // 0016 JMPF R1 #001D - 0x88040105, // 0017 GETMBR R1 R0 K5 - 0x04040303, // 0018 SUB R1 R1 K3 - 0x88080104, // 0019 GETMBR R2 R0 K4 - 0x00080503, // 001A ADD R2 R2 K3 - 0x10040202, // 001B MOD R1 R1 R2 - 0x90020001, // 001C SETMBR R0 K0 R1 - 0x80000000, // 001D RET 0 + ( &(const binstruction[19]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x88100100, // 0002 GETMBR R4 R0 K0 + 0x4C140000, // 0003 LDNIL R5 + 0x1C100805, // 0004 EQ R4 R4 R5 + 0x78120000, // 0005 JMPF R4 #0007 + 0x90020102, // 0006 SETMBR R0 K0 K2 + 0x90020603, // 0007 SETMBR R0 K3 R3 + 0x88100103, // 0008 GETMBR R4 R0 K3 + 0x4C140000, // 0009 LDNIL R5 + 0x1C100805, // 000A EQ R4 R4 R5 + 0x78120001, // 000B JMPF R4 #000E + 0x5412DFFF, // 000C LDINT R4 57344 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0x5411FFFE, // 000E LDINT R4 -1 + 0x90020804, // 000F SETMBR R0 K4 R4 + 0x8C100105, // 0010 GETMET R4 R0 K5 + 0x7C100200, // 0011 CALL R4 1 + 0x80000000, // 0012 RET 0 }) ) ); @@ -460,31 +479,82 @@ be_local_closure(Partition_otadata__validate, /* name */ ** Solidified class: Partition_otadata ********************************************************************/ be_local_class(Partition_otadata, - 5, + 6, NULL, - be_nested_map(13, + be_nested_map(14, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(tostring, 1), be_const_closure(Partition_otadata_tostring_closure) }, - { be_const_key(_validate, -1), be_const_closure(Partition_otadata__validate_closure) }, - { be_const_key(crc32_ota_seq, 12), be_const_static_closure(Partition_otadata_crc32_ota_seq_closure) }, - { be_const_key(active_otadata, -1), be_const_var(2) }, - { be_const_key(save, 8), be_const_closure(Partition_otadata_save_closure) }, - { be_const_key(seq1, -1), be_const_var(4) }, - { be_const_key(init, 7), be_const_closure(Partition_otadata_init_closure) }, - { be_const_key(set_ota_max, -1), be_const_closure(Partition_otadata_set_ota_max_closure) }, - { be_const_key(seq0, 10), be_const_var(3) }, + { be_const_key(init, -1), be_const_closure(Partition_otadata_init_closure) }, + { be_const_key(seq1, 13), be_const_var(5) }, + { be_const_key(save, -1), be_const_closure(Partition_otadata_save_closure) }, + { be_const_key(tostring, -1), be_const_closure(Partition_otadata_tostring_closure) }, + { be_const_key(_validate, 6), be_const_closure(Partition_otadata__validate_closure) }, + { be_const_key(set_ota_max, 0), be_const_closure(Partition_otadata_set_ota_max_closure) }, + { be_const_key(has_factory, -1), be_const_var(1) }, + { be_const_key(load, 8), be_const_closure(Partition_otadata_load_closure) }, + { be_const_key(crc32_ota_seq, -1), be_const_static_closure(Partition_otadata_crc32_ota_seq_closure) }, + { be_const_key(active_otadata, 11), be_const_var(3) }, + { be_const_key(offset, 9), be_const_var(2) }, + { be_const_key(seq0, -1), be_const_var(4) }, { be_const_key(set_active, -1), be_const_closure(Partition_otadata_set_active_closure) }, - { be_const_key(offset, -1), be_const_var(1) }, - { be_const_key(load, 2), be_const_closure(Partition_otadata_load_closure) }, { be_const_key(maxota, -1), be_const_var(0) }, })), (bstring*) &be_const_str_Partition_otadata ); /******************************************************************** -** Solidified function: load_otadata +** Solidified function: has_factory ********************************************************************/ -be_local_closure(Partition_load_otadata, /* name */ +be_local_closure(Partition_has_factory, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* 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_str(slots), + /* K1 */ be_nested_str(type), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str(subtype), + /* K4 */ be_nested_str(stop_iteration), + }), + &be_const_str_has_factory, + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x7C040200, // 0002 CALL R1 1 + 0xA802000B, // 0003 EXBLK 0 #0010 + 0x5C080200, // 0004 MOVE R2 R1 + 0x7C080000, // 0005 CALL R2 0 + 0x880C0501, // 0006 GETMBR R3 R2 K1 + 0x1C0C0702, // 0007 EQ R3 R3 K2 + 0x780E0005, // 0008 JMPF R3 #000F + 0x880C0503, // 0009 GETMBR R3 R2 K3 + 0x1C0C0702, // 000A EQ R3 R3 K2 + 0x780E0002, // 000B JMPF R3 #000F + 0x500C0200, // 000C LDBOOL R3 1 0 + 0xA8040001, // 000D EXBLK 1 1 + 0x80040600, // 000E RET 1 R3 + 0x7001FFF3, // 000F JMP #0004 + 0x58040004, // 0010 LDCONST R1 K4 + 0xAC040200, // 0011 CATCH R1 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x50040000, // 0013 LDBOOL R1 0 0 + 0x80040200, // 0014 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save +********************************************************************/ +be_local_closure(Partition_save, /* name */ be_nested_proto( 7, /* nstack */ 1, /* argc */ @@ -494,7 +564,135 @@ be_local_closure(Partition_load_otadata, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str(flash), + /* K1 */ be_nested_str(tobytes), + /* K2 */ be_nested_str(erase), + /* K3 */ be_nested_str(write), + /* K4 */ be_nested_str(otadata), + /* K5 */ be_nested_str(save), + }), + &be_const_str_save, + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C0C0302, // 0003 GETMET R3 R1 K2 + 0x54167FFF, // 0004 LDINT R5 32768 + 0x541A0FFF, // 0005 LDINT R6 4096 + 0x7C0C0600, // 0006 CALL R3 3 + 0x8C0C0303, // 0007 GETMET R3 R1 K3 + 0x54167FFF, // 0008 LDINT R5 32768 + 0x5C180400, // 0009 MOVE R6 R2 + 0x7C0C0600, // 000A CALL R3 3 + 0x880C0104, // 000B GETMBR R3 R0 K4 + 0x8C0C0705, // 000C GETMET R3 R3 K5 + 0x7C0C0200, // 000D CALL R3 1 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active +********************************************************************/ +be_local_closure(Partition_get_active, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* 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_str(otadata), + /* K1 */ be_nested_str(active_otadata), + }), + &be_const_str_get_active, + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invalidate_spiffs +********************************************************************/ +be_local_closure(Partition_invalidate_spiffs, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* 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_str(flash), + /* K1 */ be_nested_str(slots), + /* K2 */ be_nested_str(is_spiffs), + /* K3 */ be_nested_str(value_error), + /* K4 */ be_nested_str(No_X20SPIFFS_X20partition_X20found), + /* K5 */ be_nested_str(00), + /* K6 */ be_nested_str(write), + /* K7 */ be_nested_str(start), + }), + &be_const_str_invalidate_spiffs, + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x5409FFFE, // 0001 LDINT R2 -1 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x94080602, // 0003 GETIDX R2 R3 R2 + 0x8C100502, // 0004 GETMET R4 R2 K2 + 0x7C100200, // 0005 CALL R4 1 + 0x74120000, // 0006 JMPT R4 #0008 + 0xB0060704, // 0007 RAISE 1 K3 K4 + 0x600C0015, // 0008 GETGBL R3 G21 + 0x58100005, // 0009 LDCONST R4 K5 + 0x7C0C0200, // 000A CALL R3 1 + 0x8C100306, // 000B GETMET R4 R1 K6 + 0x88180507, // 000C GETMBR R6 R2 K7 + 0x5C1C0600, // 000D MOVE R7 R3 + 0x7C100600, // 000E CALL R4 3 + 0x8C100306, // 000F GETMET R4 R1 K6 + 0x88180507, // 0010 GETMBR R6 R2 K7 + 0x541E0FFF, // 0011 LDINT R7 4096 + 0x00180C07, // 0012 ADD R6 R6 R7 + 0x5C1C0600, // 0013 MOVE R7 R3 + 0x7C100600, // 0014 CALL R4 3 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_otadata +********************************************************************/ +be_local_closure(Partition_load_otadata, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str(ota_max), /* K1 */ be_nested_str(slots), /* K2 */ be_nested_str(type), @@ -506,10 +704,11 @@ be_local_closure(Partition_load_otadata, /* name */ /* K8 */ be_nested_str(otadata), /* K9 */ be_nested_str(partition_core), /* K10 */ be_nested_str(Partition_otadata), + /* K11 */ be_nested_str(has_factory), }), &be_const_str_load_otadata, &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[29]) { /* code */ 0x5406DFFF, // 0000 LDINT R1 57344 0x8C080100, // 0001 GETMET R2 R0 K0 0x7C080200, // 0002 CALL R2 1 @@ -533,10 +732,98 @@ be_local_closure(Partition_load_otadata, /* name */ 0xB80E1200, // 0014 GETNGBL R3 K9 0x8C0C070A, // 0015 GETMET R3 R3 K10 0x5C140400, // 0016 MOVE R5 R2 - 0x5C180200, // 0017 MOVE R6 R1 - 0x7C0C0600, // 0018 CALL R3 3 - 0x90021003, // 0019 SETMBR R0 K8 R3 - 0x80000000, // 001A RET 0 + 0x8C18010B, // 0017 GETMET R6 R0 K11 + 0x7C180200, // 0018 CALL R6 1 + 0x5C1C0200, // 0019 MOVE R7 R1 + 0x7C0C0800, // 001A CALL R3 4 + 0x90021003, // 001B SETMBR R0 K8 R3 + 0x80000000, // 001C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(Partition_tostring, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str(_X3Cinstance_X3A_X20Partition_X28_X5B_X0A), + /* K1 */ be_nested_str(slots), + /* K2 */ be_nested_str(_X20_X20), + /* K3 */ be_nested_str(tostring), + /* K4 */ be_nested_str(_X0A), + /* K5 */ be_nested_str(stop_iteration), + /* K6 */ be_nested_str(_X5D_X2C_X0A_X20_X20), + /* K7 */ be_nested_str(otadata), + /* K8 */ be_nested_str(_X0A_X29_X3E), + }), + &be_const_str_tostring, + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0xA8020007, // 0004 EXBLK 0 #000D + 0x5C0C0400, // 0005 MOVE R3 R2 + 0x7C0C0000, // 0006 CALL R3 0 + 0x00040302, // 0007 ADD R1 R1 K2 + 0x8C100703, // 0008 GETMET R4 R3 K3 + 0x7C100200, // 0009 CALL R4 1 + 0x00040204, // 000A ADD R1 R1 R4 + 0x00040304, // 000B ADD R1 R1 K4 + 0x7001FFF7, // 000C JMP #0005 + 0x58080005, // 000D LDCONST R2 K5 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x00040306, // 0010 ADD R1 R1 K6 + 0x88080107, // 0011 GETMBR R2 R0 K7 + 0x8C080503, // 0012 GETMET R2 R2 K3 + 0x7C080200, // 0013 CALL R2 1 + 0x00040202, // 0014 ADD R1 R1 R2 + 0x00040308, // 0015 ADD R1 R1 K8 + 0x80040200, // 0016 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: switch_factory +********************************************************************/ +be_local_closure(Partition_switch_factory, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* 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_str(flash), + /* K1 */ be_nested_str(rollback), + }), + &be_const_str_switch_factory, + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -611,129 +898,6 @@ be_local_closure(Partition_tobytes, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Partition_tostring, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str(_X3Cinstance_X3A_X20Partition_X28_X5B_X0A), - /* K1 */ be_nested_str(slots), - /* K2 */ be_nested_str(_X20_X20), - /* K3 */ be_nested_str(tostring), - /* K4 */ be_nested_str(_X0A), - /* K5 */ be_nested_str(stop_iteration), - /* K6 */ be_nested_str(_X5D_X2C_X0A_X20_X20), - /* K7 */ be_nested_str(otadata), - /* K8 */ be_nested_str(_X0A_X29_X3E), - }), - &be_const_str_tostring, - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x880C0101, // 0002 GETMBR R3 R0 K1 - 0x7C080200, // 0003 CALL R2 1 - 0xA8020007, // 0004 EXBLK 0 #000D - 0x5C0C0400, // 0005 MOVE R3 R2 - 0x7C0C0000, // 0006 CALL R3 0 - 0x00040302, // 0007 ADD R1 R1 K2 - 0x8C100703, // 0008 GETMET R4 R3 K3 - 0x7C100200, // 0009 CALL R4 1 - 0x00040204, // 000A ADD R1 R1 R4 - 0x00040304, // 000B ADD R1 R1 K4 - 0x7001FFF7, // 000C JMP #0005 - 0x58080005, // 000D LDCONST R2 K5 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x00040306, // 0010 ADD R1 R1 K6 - 0x88080107, // 0011 GETMBR R2 R0 K7 - 0x8C080503, // 0012 GETMET R2 R2 K3 - 0x7C080200, // 0013 CALL R2 1 - 0x00040202, // 0014 ADD R1 R1 R2 - 0x00040308, // 0015 ADD R1 R1 K8 - 0x80040200, // 0016 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active -********************************************************************/ -be_local_closure(Partition_get_active, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* 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_str(otadata), - /* K1 */ be_nested_str(active_otadata), - }), - &be_const_str_get_active, - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Partition_init, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str(slots), - /* K1 */ be_nested_str(load), - /* K2 */ be_nested_str(parse), - /* K3 */ be_nested_str(load_otadata), - }), - &be_const_str_init, - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x8C040103, // 0007 GETMET R1 R0 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: ota_max ********************************************************************/ @@ -792,6 +956,123 @@ be_local_closure(Partition_ota_max, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_ota_slot +********************************************************************/ +be_local_closure(Partition_get_ota_slot, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str(slots), + /* K1 */ be_nested_str(is_ota), + /* K2 */ be_nested_str(stop_iteration), + }), + &be_const_str_get_ota_slot, + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080010, // 0000 GETGBL R2 G16 + 0x880C0100, // 0001 GETMBR R3 R0 K0 + 0x7C080200, // 0002 CALL R2 1 + 0xA8020008, // 0003 EXBLK 0 #000D + 0x5C0C0400, // 0004 MOVE R3 R2 + 0x7C0C0000, // 0005 CALL R3 0 + 0x8C100701, // 0006 GETMET R4 R3 K1 + 0x7C100200, // 0007 CALL R4 1 + 0x1C100801, // 0008 EQ R4 R4 R1 + 0x78120001, // 0009 JMPF R4 #000C + 0xA8040001, // 000A EXBLK 1 1 + 0x80040600, // 000B RET 1 R3 + 0x7001FFF6, // 000C JMP #0004 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x4C080000, // 0010 LDNIL R2 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load +********************************************************************/ +be_local_closure(Partition_load, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str(flash), + /* K1 */ be_nested_str(raw), + /* K2 */ be_nested_str(read), + }), + &be_const_str_load, + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080302, // 0001 GETMET R2 R1 K2 + 0x54127FFF, // 0002 LDINT R4 32768 + 0x54160FFF, // 0003 LDINT R5 4096 + 0x7C080600, // 0004 CALL R2 3 + 0x90020202, // 0005 SETMBR R0 K1 R2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Partition_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str(slots), + /* K1 */ be_nested_str(load), + /* K2 */ be_nested_str(parse), + /* K3 */ be_nested_str(load_otadata), + }), + &be_const_str_init, + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x8C040103, // 0007 GETMET R1 R0 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: parse ********************************************************************/ @@ -884,214 +1165,6 @@ be_local_closure(Partition_parse, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: invalidate_spiffs -********************************************************************/ -be_local_closure(Partition_invalidate_spiffs, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* 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_str(flash), - /* K1 */ be_nested_str(slots), - /* K2 */ be_nested_str(is_spiffs), - /* K3 */ be_nested_str(value_error), - /* K4 */ be_nested_str(No_X20SPIFFS_X20partition_X20found), - /* K5 */ be_nested_str(00), - /* K6 */ be_nested_str(write), - /* K7 */ be_nested_str(start), - }), - &be_const_str_invalidate_spiffs, - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x5409FFFE, // 0001 LDINT R2 -1 - 0x880C0101, // 0002 GETMBR R3 R0 K1 - 0x94080602, // 0003 GETIDX R2 R3 R2 - 0x8C100502, // 0004 GETMET R4 R2 K2 - 0x7C100200, // 0005 CALL R4 1 - 0x74120000, // 0006 JMPT R4 #0008 - 0xB0060704, // 0007 RAISE 1 K3 K4 - 0x600C0015, // 0008 GETGBL R3 G21 - 0x58100005, // 0009 LDCONST R4 K5 - 0x7C0C0200, // 000A CALL R3 1 - 0x8C100306, // 000B GETMET R4 R1 K6 - 0x88180507, // 000C GETMBR R6 R2 K7 - 0x5C1C0600, // 000D MOVE R7 R3 - 0x7C100600, // 000E CALL R4 3 - 0x8C100306, // 000F GETMET R4 R1 K6 - 0x88180507, // 0010 GETMBR R6 R2 K7 - 0x541E0FFF, // 0011 LDINT R7 4096 - 0x00180C07, // 0012 ADD R6 R6 R7 - 0x5C1C0600, // 0013 MOVE R7 R3 - 0x7C100600, // 0014 CALL R4 3 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save -********************************************************************/ -be_local_closure(Partition_save, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* 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_str(flash), - /* K1 */ be_nested_str(tobytes), - /* K2 */ be_nested_str(erase), - /* K3 */ be_nested_str(write), - /* K4 */ be_nested_str(otadata), - /* K5 */ be_nested_str(save), - }), - &be_const_str_save, - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x8C0C0302, // 0003 GETMET R3 R1 K2 - 0x54167FFF, // 0004 LDINT R5 32768 - 0x541A0FFF, // 0005 LDINT R6 4096 - 0x7C0C0600, // 0006 CALL R3 3 - 0x8C0C0303, // 0007 GETMET R3 R1 K3 - 0x54167FFF, // 0008 LDINT R5 32768 - 0x5C180400, // 0009 MOVE R6 R2 - 0x7C0C0600, // 000A CALL R3 3 - 0x880C0104, // 000B GETMBR R3 R0 K4 - 0x8C0C0705, // 000C GETMET R3 R3 K5 - 0x7C0C0200, // 000D CALL R3 1 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ota_slot -********************************************************************/ -be_local_closure(Partition_get_ota_slot, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str(slots), - /* K1 */ be_nested_str(is_ota), - /* K2 */ be_nested_str(stop_iteration), - }), - &be_const_str_get_ota_slot, - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080010, // 0000 GETGBL R2 G16 - 0x880C0100, // 0001 GETMBR R3 R0 K0 - 0x7C080200, // 0002 CALL R2 1 - 0xA8020008, // 0003 EXBLK 0 #000D - 0x5C0C0400, // 0004 MOVE R3 R2 - 0x7C0C0000, // 0005 CALL R3 0 - 0x8C100701, // 0006 GETMET R4 R3 K1 - 0x7C100200, // 0007 CALL R4 1 - 0x1C100801, // 0008 EQ R4 R4 R1 - 0x78120001, // 0009 JMPF R4 #000C - 0xA8040001, // 000A EXBLK 1 1 - 0x80040600, // 000B RET 1 R3 - 0x7001FFF6, // 000C JMP #0004 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x4C080000, // 0010 LDNIL R2 - 0x80040400, // 0011 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: switch_factory -********************************************************************/ -be_local_closure(Partition_switch_factory, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* 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_str(flash), - /* K1 */ be_nested_str(rollback), - }), - &be_const_str_switch_factory, - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load -********************************************************************/ -be_local_closure(Partition_load, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str(flash), - /* K1 */ be_nested_str(raw), - /* K2 */ be_nested_str(read), - }), - &be_const_str_load, - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080302, // 0001 GETMET R2 R1 K2 - 0x54127FFF, // 0002 LDINT R4 32768 - 0x54160FFF, // 0003 LDINT R5 4096 - 0x7C080600, // 0004 CALL R2 3 - 0x90020202, // 0005 SETMBR R0 K1 R2 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_active ********************************************************************/ @@ -1146,317 +1219,30 @@ be_local_closure(Partition_set_active, /* name */ be_local_class(Partition, 4, NULL, - be_nested_map(17, + be_nested_map(18, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(load_otadata, -1), be_const_closure(Partition_load_otadata_closure) }, - { be_const_key(set_active, -1), be_const_closure(Partition_set_active_closure) }, - { be_const_key(tostring, 12), be_const_closure(Partition_tostring_closure) }, - { be_const_key(raw, -1), be_const_var(0) }, - { be_const_key(get_active, 16), be_const_closure(Partition_get_active_closure) }, - { be_const_key(load, -1), be_const_closure(Partition_load_closure) }, + { be_const_key(has_factory, 1), be_const_closure(Partition_has_factory_closure) }, + { be_const_key(set_active, 14), be_const_closure(Partition_set_active_closure) }, + { be_const_key(get_active, -1), be_const_closure(Partition_get_active_closure) }, { be_const_key(parse, -1), be_const_closure(Partition_parse_closure) }, - { be_const_key(ota_max, 1), be_const_closure(Partition_ota_max_closure) }, - { be_const_key(slots, -1), be_const_var(2) }, - { be_const_key(save, -1), be_const_closure(Partition_save_closure) }, - { be_const_key(invalidate_spiffs, -1), be_const_closure(Partition_invalidate_spiffs_closure) }, - { be_const_key(tobytes, 9), be_const_closure(Partition_tobytes_closure) }, - { be_const_key(get_ota_slot, 6), be_const_closure(Partition_get_ota_slot_closure) }, - { be_const_key(switch_factory, -1), be_const_closure(Partition_switch_factory_closure) }, - { be_const_key(md5, -1), be_const_var(1) }, - { be_const_key(init, 5), be_const_closure(Partition_init_closure) }, + { be_const_key(load_otadata, -1), be_const_closure(Partition_load_otadata_closure) }, + { be_const_key(raw, 6), be_const_var(0) }, { be_const_key(otadata, -1), be_const_var(3) }, + { be_const_key(tostring, -1), be_const_closure(Partition_tostring_closure) }, + { be_const_key(md5, -1), be_const_var(1) }, + { be_const_key(tobytes, -1), be_const_closure(Partition_tobytes_closure) }, + { be_const_key(ota_max, -1), be_const_closure(Partition_ota_max_closure) }, + { be_const_key(get_ota_slot, -1), be_const_closure(Partition_get_ota_slot_closure) }, + { be_const_key(slots, -1), be_const_var(2) }, + { be_const_key(load, 8), be_const_closure(Partition_load_closure) }, + { be_const_key(invalidate_spiffs, 17), be_const_closure(Partition_invalidate_spiffs_closure) }, + { be_const_key(init, -1), be_const_closure(Partition_init_closure) }, + { be_const_key(switch_factory, 3), be_const_closure(Partition_switch_factory_closure) }, + { be_const_key(save, -1), be_const_closure(Partition_save_closure) }, })), (bstring*) &be_const_str_Partition ); -/******************************************************************** -** Solidified function: remove_trailing_zeroes -********************************************************************/ -be_local_closure(Partition_info_remove_trailing_zeroes, /* 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[ 3]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str(resize), - }), - &be_const_str_remove_trailing_zeroes, - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0x6004000C, // 0000 GETGBL R1 G12 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x58080000, // 0003 LDCONST R2 K0 - 0x140C0401, // 0004 LT R3 R2 R1 - 0x780E0007, // 0005 JMPF R3 #000E - 0x540DFFFE, // 0006 LDINT R3 -1 - 0x040C0602, // 0007 SUB R3 R3 R2 - 0x940C0003, // 0008 GETIDX R3 R0 R3 - 0x200C0700, // 0009 NE R3 R3 K0 - 0x780E0000, // 000A JMPF R3 #000C - 0x70020001, // 000B JMP #000E - 0x00080501, // 000C ADD R2 R2 K1 - 0x7001FFF5, // 000D JMP #0004 - 0x240C0500, // 000E GT R3 R2 K0 - 0x780E0005, // 000F JMPF R3 #0016 - 0x8C0C0102, // 0010 GETMET R3 R0 K2 - 0x6014000C, // 0011 GETGBL R5 G12 - 0x5C180000, // 0012 MOVE R6 R0 - 0x7C140200, // 0013 CALL R5 1 - 0x04140A02, // 0014 SUB R5 R5 R2 - 0x7C0C0400, // 0015 CALL R3 2 - 0x80040000, // 0016 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Partition_info_tostring, /* name */ - be_nested_proto( - 15, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str(string), - /* K1 */ be_nested_str(), - /* K2 */ be_nested_str(type), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str(app), - /* K5 */ be_nested_str(subtype), - /* K6 */ be_nested_str(factory), - /* K7 */ be_nested_str(ota), - /* K8 */ be_nested_str(test), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str(data), - /* K11 */ be_nested_str(otadata), - /* K12 */ be_nested_str(phy), - /* K13 */ be_const_int(2), - /* K14 */ be_nested_str(nvs), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str(coredump), - /* K17 */ be_nested_str(nvskeys), - /* K18 */ be_nested_str(efuse_em), - /* K19 */ be_nested_str(esphttpd), - /* K20 */ be_nested_str(fat), - /* K21 */ be_nested_str(spiffs), - /* K22 */ be_nested_str(_X20_X28), - /* K23 */ be_nested_str(_X29), - /* K24 */ be_nested_str(format), - /* K25 */ be_nested_str(_X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E), - /* K26 */ be_nested_str(start), - /* K27 */ be_nested_str(size), - /* K28 */ be_nested_str(label), - /* K29 */ be_nested_str(flags), - }), - &be_const_str_tostring, - &be_const_str_solidified, - ( &(const binstruction[109]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x580C0001, // 0002 LDCONST R3 K1 - 0x88100102, // 0003 GETMBR R4 R0 K2 - 0x1C100903, // 0004 EQ R4 R4 K3 - 0x7812001B, // 0005 JMPF R4 #0022 - 0x58080004, // 0006 LDCONST R2 K4 - 0x88100105, // 0007 GETMBR R4 R0 K5 - 0x1C100903, // 0008 EQ R4 R4 K3 - 0x78120001, // 0009 JMPF R4 #000C - 0x580C0006, // 000A LDCONST R3 K6 - 0x70020014, // 000B JMP #0021 - 0x88100105, // 000C GETMBR R4 R0 K5 - 0x5416000F, // 000D LDINT R5 16 - 0x28100805, // 000E GE R4 R4 R5 - 0x7812000B, // 000F JMPF R4 #001C - 0x88100105, // 0010 GETMBR R4 R0 K5 - 0x5416001F, // 0011 LDINT R5 32 - 0x14100805, // 0012 LT R4 R4 R5 - 0x78120007, // 0013 JMPF R4 #001C - 0x60100008, // 0014 GETGBL R4 G8 - 0x88140105, // 0015 GETMBR R5 R0 K5 - 0x541A000F, // 0016 LDINT R6 16 - 0x04140A06, // 0017 SUB R5 R5 R6 - 0x7C100200, // 0018 CALL R4 1 - 0x00120E04, // 0019 ADD R4 K7 R4 - 0x5C0C0800, // 001A MOVE R3 R4 - 0x70020004, // 001B JMP #0021 - 0x88100105, // 001C GETMBR R4 R0 K5 - 0x5416001F, // 001D LDINT R5 32 - 0x1C100805, // 001E EQ R4 R4 R5 - 0x78120000, // 001F JMPF R4 #0021 - 0x580C0008, // 0020 LDCONST R3 K8 - 0x70020034, // 0021 JMP #0057 - 0x88100102, // 0022 GETMBR R4 R0 K2 - 0x1C100909, // 0023 EQ R4 R4 K9 - 0x78120031, // 0024 JMPF R4 #0057 - 0x5808000A, // 0025 LDCONST R2 K10 - 0x88100105, // 0026 GETMBR R4 R0 K5 - 0x1C100903, // 0027 EQ R4 R4 K3 - 0x78120001, // 0028 JMPF R4 #002B - 0x580C000B, // 0029 LDCONST R3 K11 - 0x7002002B, // 002A JMP #0057 - 0x88100105, // 002B GETMBR R4 R0 K5 - 0x1C100909, // 002C EQ R4 R4 K9 - 0x78120001, // 002D JMPF R4 #0030 - 0x580C000C, // 002E LDCONST R3 K12 - 0x70020026, // 002F JMP #0057 - 0x88100105, // 0030 GETMBR R4 R0 K5 - 0x1C10090D, // 0031 EQ R4 R4 K13 - 0x78120001, // 0032 JMPF R4 #0035 - 0x580C000E, // 0033 LDCONST R3 K14 - 0x70020021, // 0034 JMP #0057 - 0x88100105, // 0035 GETMBR R4 R0 K5 - 0x1C10090F, // 0036 EQ R4 R4 K15 - 0x78120001, // 0037 JMPF R4 #003A - 0x580C0010, // 0038 LDCONST R3 K16 - 0x7002001C, // 0039 JMP #0057 - 0x88100105, // 003A GETMBR R4 R0 K5 - 0x54160003, // 003B LDINT R5 4 - 0x1C100805, // 003C EQ R4 R4 R5 - 0x78120001, // 003D JMPF R4 #0040 - 0x580C0011, // 003E LDCONST R3 K17 - 0x70020016, // 003F JMP #0057 - 0x88100105, // 0040 GETMBR R4 R0 K5 - 0x54160004, // 0041 LDINT R5 5 - 0x1C100805, // 0042 EQ R4 R4 R5 - 0x78120001, // 0043 JMPF R4 #0046 - 0x580C0012, // 0044 LDCONST R3 K18 - 0x70020010, // 0045 JMP #0057 - 0x88100105, // 0046 GETMBR R4 R0 K5 - 0x5416007F, // 0047 LDINT R5 128 - 0x1C100805, // 0048 EQ R4 R4 R5 - 0x78120001, // 0049 JMPF R4 #004C - 0x580C0013, // 004A LDCONST R3 K19 - 0x7002000A, // 004B JMP #0057 - 0x88100105, // 004C GETMBR R4 R0 K5 - 0x54160080, // 004D LDINT R5 129 - 0x1C100805, // 004E EQ R4 R4 R5 - 0x78120001, // 004F JMPF R4 #0052 - 0x580C0014, // 0050 LDCONST R3 K20 - 0x70020004, // 0051 JMP #0057 - 0x88100105, // 0052 GETMBR R4 R0 K5 - 0x54160081, // 0053 LDINT R5 130 - 0x1C100805, // 0054 EQ R4 R4 R5 - 0x78120000, // 0055 JMPF R4 #0057 - 0x580C0015, // 0056 LDCONST R3 K21 - 0x20100501, // 0057 NE R4 R2 K1 - 0x78120002, // 0058 JMPF R4 #005C - 0x00122C02, // 0059 ADD R4 K22 R2 - 0x00100917, // 005A ADD R4 R4 K23 - 0x5C080800, // 005B MOVE R2 R4 - 0x20100701, // 005C NE R4 R3 K1 - 0x78120002, // 005D JMPF R4 #0061 - 0x00122C03, // 005E ADD R4 K22 R3 - 0x00100917, // 005F ADD R4 R4 K23 - 0x5C0C0800, // 0060 MOVE R3 R4 - 0x8C100318, // 0061 GETMET R4 R1 K24 - 0x58180019, // 0062 LDCONST R6 K25 - 0x881C0102, // 0063 GETMBR R7 R0 K2 - 0x5C200400, // 0064 MOVE R8 R2 - 0x88240105, // 0065 GETMBR R9 R0 K5 - 0x5C280600, // 0066 MOVE R10 R3 - 0x882C011A, // 0067 GETMBR R11 R0 K26 - 0x8830011B, // 0068 GETMBR R12 R0 K27 - 0x8834011C, // 0069 GETMBR R13 R0 K28 - 0x8838011D, // 006A GETMBR R14 R0 K29 - 0x7C101400, // 006B CALL R4 10 - 0x80040800, // 006C RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: tobytes -********************************************************************/ -be_local_closure(Partition_info_tobytes, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str(AA50), - /* K1 */ be_nested_str(resize), - /* K2 */ be_const_int(2), - /* K3 */ be_nested_str(add), - /* K4 */ be_nested_str(type), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str(subtype), - /* K7 */ be_nested_str(start), - /* K8 */ be_nested_str(size), - /* K9 */ be_nested_str(fromstring), - /* K10 */ be_nested_str(label), - /* K11 */ be_nested_str(flags), - }), - &be_const_str_tobytes, - &be_const_str_solidified, - ( &(const binstruction[39]) { /* code */ - 0x60040015, // 0000 GETGBL R1 G21 - 0x58080000, // 0001 LDCONST R2 K0 - 0x7C040200, // 0002 CALL R1 1 - 0x8C080301, // 0003 GETMET R2 R1 K1 - 0x5412001F, // 0004 LDINT R4 32 - 0x7C080400, // 0005 CALL R2 2 - 0x8C080501, // 0006 GETMET R2 R2 K1 - 0x58100002, // 0007 LDCONST R4 K2 - 0x7C080400, // 0008 CALL R2 2 - 0x8C080303, // 0009 GETMET R2 R1 K3 - 0x88100104, // 000A GETMBR R4 R0 K4 - 0x58140005, // 000B LDCONST R5 K5 - 0x7C080600, // 000C CALL R2 3 - 0x8C080303, // 000D GETMET R2 R1 K3 - 0x88100106, // 000E GETMBR R4 R0 K6 - 0x58140005, // 000F LDCONST R5 K5 - 0x7C080600, // 0010 CALL R2 3 - 0x8C080303, // 0011 GETMET R2 R1 K3 - 0x88100107, // 0012 GETMBR R4 R0 K7 - 0x54160003, // 0013 LDINT R5 4 - 0x7C080600, // 0014 CALL R2 3 - 0x8C080303, // 0015 GETMET R2 R1 K3 - 0x88100108, // 0016 GETMBR R4 R0 K8 - 0x54160003, // 0017 LDINT R5 4 - 0x7C080600, // 0018 CALL R2 3 - 0x60080015, // 0019 GETGBL R2 G21 - 0x7C080000, // 001A CALL R2 0 - 0x8C080509, // 001B GETMET R2 R2 K9 - 0x8810010A, // 001C GETMBR R4 R0 K10 - 0x7C080400, // 001D CALL R2 2 - 0x8C0C0501, // 001E GETMET R3 R2 K1 - 0x5416000F, // 001F LDINT R5 16 - 0x7C0C0400, // 0020 CALL R3 2 - 0x00040202, // 0021 ADD R1 R1 R2 - 0x8C0C0303, // 0022 GETMET R3 R1 K3 - 0x8814010B, // 0023 GETMBR R5 R0 K11 - 0x541A0003, // 0024 LDINT R6 4 - 0x7C0C0600, // 0025 CALL R3 3 - 0x80040200, // 0026 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: is_factory ********************************************************************/ @@ -1493,6 +1279,45 @@ be_local_closure(Partition_info_is_factory, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: type_to_string +********************************************************************/ +be_local_closure(Partition_info_type_to_string, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* 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_str(type), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str(app), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str(data), + }), + &be_const_str_type_to_string, + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x1C040301, // 0001 EQ R1 R1 K1 + 0x78060001, // 0002 JMPF R1 #0005 + 0x80060400, // 0003 RET 1 K2 + 0x70020003, // 0004 JMP #0009 + 0x88040100, // 0005 GETMBR R1 R0 K0 + 0x1C040303, // 0006 EQ R1 R1 K3 + 0x78060000, // 0007 JMPF R1 #0009 + 0x80060800, // 0008 RET 1 K4 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -1596,6 +1421,321 @@ be_local_closure(Partition_info_init, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: subtype_to_string +********************************************************************/ +be_local_closure(Partition_info_subtype_to_string, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str(type), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str(subtype), + /* K3 */ be_nested_str(factory), + /* K4 */ be_nested_str(ota_), + /* K5 */ be_nested_str(test), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str(otadata), + /* K8 */ be_nested_str(phy), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str(nvs), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str(coredump), + /* K13 */ be_nested_str(nvskeys), + /* K14 */ be_nested_str(efuse_em), + /* K15 */ be_nested_str(esphttpd), + /* K16 */ be_nested_str(fat), + /* K17 */ be_nested_str(spiffs), + }), + &be_const_str_subtype_to_string, + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x1C040301, // 0001 EQ R1 R1 K1 + 0x7806001A, // 0002 JMPF R1 #001E + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x1C040301, // 0004 EQ R1 R1 K1 + 0x78060001, // 0005 JMPF R1 #0008 + 0x80060600, // 0006 RET 1 K3 + 0x70020014, // 0007 JMP #001D + 0x88040102, // 0008 GETMBR R1 R0 K2 + 0x540A000F, // 0009 LDINT R2 16 + 0x28040202, // 000A GE R1 R1 R2 + 0x7806000B, // 000B JMPF R1 #0018 + 0x88040102, // 000C GETMBR R1 R0 K2 + 0x540A001F, // 000D LDINT R2 32 + 0x14040202, // 000E LT R1 R1 R2 + 0x78060007, // 000F JMPF R1 #0018 + 0x60040008, // 0010 GETGBL R1 G8 + 0x88080102, // 0011 GETMBR R2 R0 K2 + 0x540E000F, // 0012 LDINT R3 16 + 0x04080403, // 0013 SUB R2 R2 R3 + 0x7C040200, // 0014 CALL R1 1 + 0x00060801, // 0015 ADD R1 K4 R1 + 0x80040200, // 0016 RET 1 R1 + 0x70020004, // 0017 JMP #001D + 0x88040102, // 0018 GETMBR R1 R0 K2 + 0x540A001F, // 0019 LDINT R2 32 + 0x1C040202, // 001A EQ R1 R1 R2 + 0x78060000, // 001B JMPF R1 #001D + 0x80060A00, // 001C RET 1 K5 + 0x70020033, // 001D JMP #0052 + 0x88040100, // 001E GETMBR R1 R0 K0 + 0x1C040306, // 001F EQ R1 R1 K6 + 0x78060030, // 0020 JMPF R1 #0052 + 0x88040102, // 0021 GETMBR R1 R0 K2 + 0x1C040301, // 0022 EQ R1 R1 K1 + 0x78060001, // 0023 JMPF R1 #0026 + 0x80060E00, // 0024 RET 1 K7 + 0x7002002B, // 0025 JMP #0052 + 0x88040102, // 0026 GETMBR R1 R0 K2 + 0x1C040306, // 0027 EQ R1 R1 K6 + 0x78060001, // 0028 JMPF R1 #002B + 0x80061000, // 0029 RET 1 K8 + 0x70020026, // 002A JMP #0052 + 0x88040102, // 002B GETMBR R1 R0 K2 + 0x1C040309, // 002C EQ R1 R1 K9 + 0x78060001, // 002D JMPF R1 #0030 + 0x80061400, // 002E RET 1 K10 + 0x70020021, // 002F JMP #0052 + 0x88040102, // 0030 GETMBR R1 R0 K2 + 0x1C04030B, // 0031 EQ R1 R1 K11 + 0x78060001, // 0032 JMPF R1 #0035 + 0x80061800, // 0033 RET 1 K12 + 0x7002001C, // 0034 JMP #0052 + 0x88040102, // 0035 GETMBR R1 R0 K2 + 0x540A0003, // 0036 LDINT R2 4 + 0x1C040202, // 0037 EQ R1 R1 R2 + 0x78060001, // 0038 JMPF R1 #003B + 0x80061A00, // 0039 RET 1 K13 + 0x70020016, // 003A JMP #0052 + 0x88040102, // 003B GETMBR R1 R0 K2 + 0x540A0004, // 003C LDINT R2 5 + 0x1C040202, // 003D EQ R1 R1 R2 + 0x78060001, // 003E JMPF R1 #0041 + 0x80061C00, // 003F RET 1 K14 + 0x70020010, // 0040 JMP #0052 + 0x88040102, // 0041 GETMBR R1 R0 K2 + 0x540A007F, // 0042 LDINT R2 128 + 0x1C040202, // 0043 EQ R1 R1 R2 + 0x78060001, // 0044 JMPF R1 #0047 + 0x80061E00, // 0045 RET 1 K15 + 0x7002000A, // 0046 JMP #0052 + 0x88040102, // 0047 GETMBR R1 R0 K2 + 0x540A0080, // 0048 LDINT R2 129 + 0x1C040202, // 0049 EQ R1 R1 R2 + 0x78060001, // 004A JMPF R1 #004D + 0x80062000, // 004B RET 1 K16 + 0x70020004, // 004C JMP #0052 + 0x88040102, // 004D GETMBR R1 R0 K2 + 0x540A0081, // 004E LDINT R2 130 + 0x1C040202, // 004F EQ R1 R1 R2 + 0x78060000, // 0050 JMPF R1 #0052 + 0x80062200, // 0051 RET 1 K17 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(Partition_info_tostring, /* name */ + be_nested_proto( + 15, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str(string), + /* K1 */ be_nested_str(type_to_string), + /* K2 */ be_nested_str(subtype_to_string), + /* K3 */ be_nested_str(), + /* K4 */ be_nested_str(_X20_X28), + /* K5 */ be_nested_str(_X29), + /* K6 */ be_nested_str(format), + /* K7 */ be_nested_str(_X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E), + /* K8 */ be_nested_str(type), + /* K9 */ be_nested_str(subtype), + /* K10 */ be_nested_str(start), + /* K11 */ be_nested_str(size), + /* K12 */ be_nested_str(label), + /* K13 */ be_nested_str(flags), + }), + &be_const_str_tostring, + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x8C0C0102, // 0003 GETMET R3 R0 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x20100503, // 0005 NE R4 R2 K3 + 0x78120002, // 0006 JMPF R4 #000A + 0x00120802, // 0007 ADD R4 K4 R2 + 0x00100905, // 0008 ADD R4 R4 K5 + 0x5C080800, // 0009 MOVE R2 R4 + 0x20100703, // 000A NE R4 R3 K3 + 0x78120002, // 000B JMPF R4 #000F + 0x00120803, // 000C ADD R4 K4 R3 + 0x00100905, // 000D ADD R4 R4 K5 + 0x5C0C0800, // 000E MOVE R3 R4 + 0x8C100306, // 000F GETMET R4 R1 K6 + 0x58180007, // 0010 LDCONST R6 K7 + 0x881C0108, // 0011 GETMBR R7 R0 K8 + 0x5C200400, // 0012 MOVE R8 R2 + 0x88240109, // 0013 GETMBR R9 R0 K9 + 0x5C280600, // 0014 MOVE R10 R3 + 0x882C010A, // 0015 GETMBR R11 R0 K10 + 0x8830010B, // 0016 GETMBR R12 R0 K11 + 0x8834010C, // 0017 GETMBR R13 R0 K12 + 0x8838010D, // 0018 GETMBR R14 R0 K13 + 0x7C101400, // 0019 CALL R4 10 + 0x80040800, // 001A RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tobytes +********************************************************************/ +be_local_closure(Partition_info_tobytes, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str(AA50), + /* K1 */ be_nested_str(resize), + /* K2 */ be_const_int(2), + /* K3 */ be_nested_str(add), + /* K4 */ be_nested_str(type), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str(subtype), + /* K7 */ be_nested_str(start), + /* K8 */ be_nested_str(size), + /* K9 */ be_nested_str(fromstring), + /* K10 */ be_nested_str(label), + /* K11 */ be_nested_str(flags), + }), + &be_const_str_tobytes, + &be_const_str_solidified, + ( &(const binstruction[39]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x58080000, // 0001 LDCONST R2 K0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C080301, // 0003 GETMET R2 R1 K1 + 0x5412001F, // 0004 LDINT R4 32 + 0x7C080400, // 0005 CALL R2 2 + 0x8C080501, // 0006 GETMET R2 R2 K1 + 0x58100002, // 0007 LDCONST R4 K2 + 0x7C080400, // 0008 CALL R2 2 + 0x8C080303, // 0009 GETMET R2 R1 K3 + 0x88100104, // 000A GETMBR R4 R0 K4 + 0x58140005, // 000B LDCONST R5 K5 + 0x7C080600, // 000C CALL R2 3 + 0x8C080303, // 000D GETMET R2 R1 K3 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x58140005, // 000F LDCONST R5 K5 + 0x7C080600, // 0010 CALL R2 3 + 0x8C080303, // 0011 GETMET R2 R1 K3 + 0x88100107, // 0012 GETMBR R4 R0 K7 + 0x54160003, // 0013 LDINT R5 4 + 0x7C080600, // 0014 CALL R2 3 + 0x8C080303, // 0015 GETMET R2 R1 K3 + 0x88100108, // 0016 GETMBR R4 R0 K8 + 0x54160003, // 0017 LDINT R5 4 + 0x7C080600, // 0018 CALL R2 3 + 0x60080015, // 0019 GETGBL R2 G21 + 0x7C080000, // 001A CALL R2 0 + 0x8C080509, // 001B GETMET R2 R2 K9 + 0x8810010A, // 001C GETMBR R4 R0 K10 + 0x7C080400, // 001D CALL R2 2 + 0x8C0C0501, // 001E GETMET R3 R2 K1 + 0x5416000F, // 001F LDINT R5 16 + 0x7C0C0400, // 0020 CALL R3 2 + 0x00040202, // 0021 ADD R1 R1 R2 + 0x8C0C0303, // 0022 GETMET R3 R1 K3 + 0x8814010B, // 0023 GETMBR R5 R0 K11 + 0x541A0003, // 0024 LDINT R6 4 + 0x7C0C0600, // 0025 CALL R3 3 + 0x80040200, // 0026 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_trailing_zeroes +********************************************************************/ +be_local_closure(Partition_info_remove_trailing_zeroes, /* 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[ 3]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str(resize), + }), + &be_const_str_remove_trailing_zeroes, + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x6004000C, // 0000 GETGBL R1 G12 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x58080000, // 0003 LDCONST R2 K0 + 0x140C0401, // 0004 LT R3 R2 R1 + 0x780E0007, // 0005 JMPF R3 #000E + 0x540DFFFE, // 0006 LDINT R3 -1 + 0x040C0602, // 0007 SUB R3 R3 R2 + 0x940C0003, // 0008 GETIDX R3 R0 R3 + 0x200C0700, // 0009 NE R3 R3 K0 + 0x780E0000, // 000A JMPF R3 #000C + 0x70020001, // 000B JMP #000E + 0x00080501, // 000C ADD R2 R2 K1 + 0x7001FFF5, // 000D JMP #0004 + 0x240C0500, // 000E GT R3 R2 K0 + 0x780E0005, // 000F JMPF R3 #0016 + 0x8C0C0102, // 0010 GETMET R3 R0 K2 + 0x6014000C, // 0011 GETGBL R5 G12 + 0x5C180000, // 0012 MOVE R6 R0 + 0x7C140200, // 0013 CALL R5 1 + 0x04140A02, // 0014 SUB R5 R5 R2 + 0x7C0C0400, // 0015 CALL R3 2 + 0x80040000, // 0016 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: is_spiffs ********************************************************************/ @@ -1633,6 +1773,47 @@ be_local_closure(Partition_info_is_spiffs, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: is_ota +********************************************************************/ +be_local_closure(Partition_info_is_ota, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str(subtype), + /* K1 */ be_nested_str(type), + /* K2 */ be_const_int(0), + }), + &be_const_str_is_ota, + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x1C080502, // 0002 EQ R2 R2 K2 + 0x780A0008, // 0003 JMPF R2 #000D + 0x540A000F, // 0004 LDINT R2 16 + 0x28080202, // 0005 GE R2 R1 R2 + 0x780A0005, // 0006 JMPF R2 #000D + 0x540A001F, // 0007 LDINT R2 32 + 0x14080202, // 0008 LT R2 R1 R2 + 0x780A0002, // 0009 JMPF R2 #000D + 0x540A000F, // 000A LDINT R2 16 + 0x04080202, // 000B SUB R2 R1 R2 + 0x80040400, // 000C RET 1 R2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: get_image_size ********************************************************************/ @@ -1748,69 +1929,30 @@ be_local_closure(Partition_info_get_image_size, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: is_ota -********************************************************************/ -be_local_closure(Partition_info_is_ota, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str(subtype), - /* K1 */ be_nested_str(type), - /* K2 */ be_const_int(0), - }), - &be_const_str_is_ota, - &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x1C080502, // 0002 EQ R2 R2 K2 - 0x780A0008, // 0003 JMPF R2 #000D - 0x540A000F, // 0004 LDINT R2 16 - 0x28080202, // 0005 GE R2 R1 R2 - 0x780A0005, // 0006 JMPF R2 #000D - 0x540A001F, // 0007 LDINT R2 32 - 0x14080202, // 0008 LT R2 R1 R2 - 0x780A0002, // 0009 JMPF R2 #000D - 0x540A000F, // 000A LDINT R2 16 - 0x04080202, // 000B SUB R2 R1 R2 - 0x80040400, // 000C RET 1 R2 - 0x80000000, // 000D RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Partition_info ********************************************************************/ be_local_class(Partition_info, 6, NULL, - be_nested_map(14, + be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key(start, -1), be_const_var(2) }, - { be_const_key(type, -1), be_const_var(0) }, - { be_const_key(tobytes, 1), be_const_closure(Partition_info_tobytes_closure) }, - { be_const_key(tostring, 2), be_const_closure(Partition_info_tostring_closure) }, { be_const_key(is_factory, -1), be_const_closure(Partition_info_is_factory_closure) }, - { be_const_key(init, 9), be_const_closure(Partition_info_init_closure) }, - { be_const_key(size, -1), be_const_var(3) }, - { be_const_key(is_spiffs, 8), be_const_closure(Partition_info_is_spiffs_closure) }, - { be_const_key(subtype, -1), be_const_var(1) }, { be_const_key(get_image_size, -1), be_const_closure(Partition_info_get_image_size_closure) }, + { be_const_key(flags, 6), be_const_var(5) }, + { be_const_key(init, -1), be_const_closure(Partition_info_init_closure) }, + { be_const_key(label, 10), be_const_var(4) }, + { be_const_key(tostring, -1), be_const_closure(Partition_info_tostring_closure) }, { be_const_key(is_ota, -1), be_const_closure(Partition_info_is_ota_closure) }, - { be_const_key(label, -1), be_const_var(4) }, - { be_const_key(flags, -1), be_const_var(5) }, - { be_const_key(remove_trailing_zeroes, 0), be_const_static_closure(Partition_info_remove_trailing_zeroes_closure) }, + { be_const_key(tobytes, -1), be_const_closure(Partition_info_tobytes_closure) }, + { be_const_key(is_spiffs, -1), be_const_closure(Partition_info_is_spiffs_closure) }, + { be_const_key(remove_trailing_zeroes, 8), be_const_static_closure(Partition_info_remove_trailing_zeroes_closure) }, + { be_const_key(subtype, 11), be_const_var(1) }, + { be_const_key(type, 14), be_const_var(0) }, + { be_const_key(size, 2), be_const_var(3) }, + { be_const_key(type_to_string, 4), be_const_closure(Partition_info_type_to_string_closure) }, + { be_const_key(subtype_to_string, -1), be_const_closure(Partition_info_subtype_to_string_closure) }, + { be_const_key(start, 1), be_const_var(2) }, })), (bstring*) &be_const_str_Partition_info ); diff --git a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be index 91b27bd87..8cfc4c922 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be +++ b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be @@ -140,30 +140,39 @@ class Partition_info end end + def type_to_string() + if self.type == 0 return "app" + elif self.type == 1 return "data" + end + end + + def subtype_to_string() + if self.type == 0 + if self.subtype == 0 return "factory" + elif self.subtype >= 0x10 && self.subtype < 0x20 return "ota_" + str(self.subtype - 0x10) + elif self.subtype == 0x20 return "test" + end + elif self.type == 1 + if self.subtype == 0x00 return "otadata" + elif self.subtype == 0x01 return "phy" + elif self.subtype == 0x02 return "nvs" + elif self.subtype == 0x03 return "coredump" + elif self.subtype == 0x04 return "nvskeys" + elif self.subtype == 0x05 return "efuse_em" + elif self.subtype == 0x80 return "esphttpd" + elif self.subtype == 0x81 return "fat" + elif self.subtype == 0x82 return "spiffs" + end + end + end + # Human readable version of Partition information # this method is not included in the solidified version to save space, # it is included only in the optional application `tapp` version def tostring() import string - var type_s = "" - var subtype_s = "" - if self.type == 0 type_s = "app" - if self.subtype == 0 subtype_s = "factory" - elif self.subtype >= 0x10 && self.subtype < 0x20 subtype_s = "ota" + str(self.subtype - 0x10) - elif self.subtype == 0x20 subtype_s = "test" - end - elif self.type == 1 type_s = "data" - if self.subtype == 0x00 subtype_s = "otadata" - elif self.subtype == 0x01 subtype_s = "phy" - elif self.subtype == 0x02 subtype_s = "nvs" - elif self.subtype == 0x03 subtype_s = "coredump" - elif self.subtype == 0x04 subtype_s = "nvskeys" - elif self.subtype == 0x05 subtype_s = "efuse_em" - elif self.subtype == 0x80 subtype_s = "esphttpd" - elif self.subtype == 0x81 subtype_s = "fat" - elif self.subtype == 0x82 subtype_s = "spiffs" - end - end + var type_s = self.type_to_string() + var subtype_s = self.subtype_to_string() # reformat strings if type_s != "" type_s = " (" + type_s + ")" end @@ -223,11 +232,12 @@ partition_core.Partition_info = Partition_info seq will add (x + n*1 + 1 - seq)%n -------------------------------------------------------------# class Partition_otadata - var maxota #- number of highest OTA partition, default 1 (double ota0/ota1) -# - var offset #- offset of the otadata partition (0x2000 in length), default 0xE000 -# - var active_otadata #- which otadata block is active, 0 or 1, i.e. 0xE000 or 0xF000 -# - var seq0 #- ota_seq of first block -# - var seq1 #- ota_seq of second block -# + var maxota # number of highest OTA partition, default 1 (double ota0/ota1) + var has_factory # is there a factory partition + var offset # offset of the otadata partition (0x2000 in length), default 0xE000 + var active_otadata # which otadata block is active, 0 or 1, i.e. 0xE000 or 0xF000 -- or -1 if no OTA active, i.e. boot on factory + var seq0 # ota_seq of first block + var seq1 # ota_seq of second block #- crc32 for ota_seq as 32 bits unsigned, with init vector -1 -# static def crc32_ota_seq(seq) @@ -238,12 +248,13 @@ class Partition_otadata #---------------------------------------------------------------------# # Rest of the class #---------------------------------------------------------------------# - def init(maxota, offset) + def init(maxota, has_factory, offset) self.maxota = maxota + self.has_factory = has_factory if self.maxota == nil self.maxota = 1 end self.offset = offset if self.offset == nil self.offset = 0xE000 end - self.active_otadata = 0 + self.active_otadata = -1 self.load() end @@ -300,7 +311,7 @@ class Partition_otadata #- internally used, validate data -# def _validate() - self.active_otadata = 0 #- if none is valid, default to OTA0 -# + self.active_otadata = self.has_factory ? -1 : 0 # if no valid otadata, then use factory (-1) if any, or ota_0 if self.seq0 != nil self.active_otadata = (self.seq0 - 1) % (self.maxota + 1) end @@ -344,8 +355,9 @@ class Partition_otadata # Produce a human-readable representation of the object with relevant information def tostring() import string - return string.format("", - self.active_otadata, self.seq0, self.seq1, self.maxota) + return string.format("", + self.active_otadata >= 0 ? "ota_" + str(self.active_otadata) : "factory", + self.seq0, self.seq1, self.maxota) end end partition_core.Partition_otadata = Partition_otadata @@ -408,6 +420,15 @@ class Partition return ota_max end + def has_factory() + for slot:self.slots + if (slot.type == 0) && (slot.subtype == 0) + return true + end + end + return false + end + def load_otadata() #- look for otadata partition offset, and max_ota -# var otadata_offset = 0xE000 #- default value -# @@ -418,7 +439,7 @@ class Partition end end - self.otadata = partition_core.Partition_otadata(ota_max, otadata_offset) + self.otadata = partition_core.Partition_otadata(ota_max, self.has_factory(), otadata_offset) end # get the active OTA app partition number diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index 012217e9a..dca558cb6 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -313,7 +313,6 @@ uint32_t EspRunningFactoryPartition(void) { } void EspPrepRestartToSafeBoot(void) { -// esp_ota_mark_app_invalid_rollback_and_reboot(); // Doesn't work 20220501 const esp_partition_t *otadata_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL); if (otadata_partition) { esp_partition_erase_range(otadata_partition, 0, SPI_FLASH_SEC_SIZE * 2); diff --git a/tasmota/xdrv_52_3_berry_flash.ino b/tasmota/xdrv_52_3_berry_flash.ino index 7cb094fe2..39428ade3 100644 --- a/tasmota/xdrv_52_3_berry_flash.ino +++ b/tasmota/xdrv_52_3_berry_flash.ino @@ -139,6 +139,16 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } + // Forces the next restart to use the `factory` partition if any is present + void p_factory(bbool force_ota) { + const esp_partition_t *otadata_partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_OTA, NULL); + if (otadata_partition) { + esp_partition_erase_range(otadata_partition, 0, SPI_FLASH_SEC_SIZE * 2); + } + if (force_ota) { + RtcSettings.ota_loader = 1; // force OTA at next reboot + } + } } #endif // USE_BERRY From c73c0cb9c008c18bf59fb8b4ac0eadbd16681fc0 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Fri, 6 May 2022 21:45:58 +0200 Subject: [PATCH 187/376] Update Italian language Please check and merge. Thanks. --- tasmota/language/it_IT.h | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 89847333c..90a977c7a 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 03.05.2022 + * Updated until v9.4.0.1 - Last update 05.05.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -102,7 +102,7 @@ #define D_FILE "File" #define D_FLOW_RATE "Flusso dati" #define D_FRAGMENTATION "framm." // Lower case abbreviated version of fragmentation used in "memory fragmentation" -#define D_FRAME_RATE "Frame rate" +#define D_FRAME_RATE "Frequenza fotogrammi" #define D_FREE_MEMORY "Memoria libera" #define D_PSR_MAX_MEMORY "PS-RAM - Memoria" #define D_PSR_FREE_MEMORY "PS-RAM - Memoria libera" @@ -244,7 +244,7 @@ // xdrv_02_webserver.ino #define D_NOSCRIPT "Per usare Tasmota abilita JavaScript" -#define D_SAFEBOOT "SAFEBOOT" +#define D_SAFEBOOT "BOOT SICURO" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Firmware MINIMALE
Effettua aggiornamento" #define D_WEBSERVER_ACTIVE_ON "Server web attivo in" #define D_WITH_IP_ADDRESS "con indirizzo IP" @@ -552,7 +552,7 @@ #define D_COLOR_GREEN "Verde" #define D_COLOR_BLUE "Blu" #define D_CCT "CCT" -#define D_PROXIMITY "Vicinanza" +#define D_PROXIMITY "Prossimità" // xsns_32_mpu6050.ino #define D_AX_AXIS "Accelerazione asse X" @@ -800,8 +800,8 @@ #define D_SENSOR_ADC_RANGE "ADC - Intervallo" #define D_SENSOR_ADC_CT_POWER "ADC - CTR alimentazione" #define D_SENSOR_ADC_JOYSTICK "ADC - Joystick" -#define D_SENSOR_ADC_PH "ADC pH" -#define D_SENSOR_ADC_MQ "ADC MQ" +#define D_SENSOR_ADC_PH "ADC - pH" +#define D_SENSOR_ADC_MQ "ADC - MQ" #define D_GPIO_WEBCAM_PWDN "Webcam - PWDN" #define D_GPIO_WEBCAM_RESET "Webcam - RESET" #define D_GPIO_WEBCAM_XCLK "Webcam - XCLK" From 07f1c5f3028a5a54316435e7c56780b6735de459 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 7 May 2022 11:05:10 +0200 Subject: [PATCH 188/376] Fix single partition free space --- tasmota/support_esp.ino | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index dca558cb6..57ad66046 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -461,11 +461,6 @@ uint32_t ESP_getChipId(void) { return id; } -uint32_t ESP_getFreeSketchSpace(void) { - uint32_t size = EspRunningFactoryPartition(); - return (size) ? size : ESP.getFreeSketchSpace(); -} - uint32_t ESP_getSketchSize(void) { static uint32_t sketchsize = 0; @@ -475,6 +470,17 @@ uint32_t ESP_getSketchSize(void) { return sketchsize; } +uint32_t ESP_getFreeSketchSpace(void) { + if (EspSingleOtaPartition()) { + uint32_t size = EspRunningFactoryPartition(); + if (!size) { + size = ESP.getFreeSketchSpace(); + } + return size - ESP_getSketchSize(); + } + return ESP.getFreeSketchSpace(); +} + uint32_t ESP_getFreeHeap(void) { // ESP_getFreeHeap() returns also IRAM which we don't use return heap_caps_get_free_size(MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT); From 8689563d9091c9718641b0edd2f8634018acd4f4 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 8 May 2022 14:15:36 +0200 Subject: [PATCH 189/376] Berry add additional primitives to partition_core --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 2514 +++++++++-------- .../src/be_partition_core_module.c | 1009 +++---- .../src/embedded/partition_core.be | 25 +- 4 files changed, 1788 insertions(+), 1761 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index f917ed1f4..5be139ac4 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -511,6 +511,7 @@ extern const bcstring be_const_str_get_coords; extern const bcstring be_const_str_get_current_module_name; extern const bcstring be_const_str_get_current_module_path; extern const bcstring be_const_str_get_event_cb; +extern const bcstring be_const_str_get_factory_slot; extern const bcstring be_const_str_get_free_heap; extern const bcstring be_const_str_get_height; extern const bcstring be_const_str_get_hor_res; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index b9abb0877..8a2fb2f8b 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,931 +1,932 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__rmt); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_calldepth); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_ctor); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_read); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_content_start); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_DIMMER); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_codedump); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_CFG_X3A_X20running_X20); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_Auto_X2Dconfiguration); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, NULL); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_show); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, NULL); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, NULL); be_define_const_str(_X22, "\"", 655135397u, 0, 1, NULL); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str__X2Ebec); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_gamma); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_f); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_assert); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str__fl); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_bytes); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_HTTP_POST); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_type); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_dim); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_set_time); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_int64); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str__X3D_X3C_X3E_X21); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_isinstance); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_HTTP_GET); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_cos); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_animators); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_AudioFileSource); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str__ptr); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_get_alternate); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_get_input_power_status); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_function); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_gamma8); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_finish); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_set_alternate); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_pc); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, NULL); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_clock_icon); +be_define_const_str(_X25, "%", 537692064u, 0, 1, NULL); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_get_free_heap); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_before_del); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_BLE); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_EVENT_DRAW_PART_BEGIN); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_exec_cmd); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str__X3F); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_set_light); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__X2Elen); +be_define_const_str(_X29, ")", 739023492u, 0, 1, NULL); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_widget_event_cb); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_add); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_CFG_X3A_X20removing_X20autoconf_X20files); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, NULL); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, NULL); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_MI32); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_get_coords); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, NULL); be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_assign_rmt); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_class_init_obj); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_consume_silence); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_is_first_time); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_check_privileged_access); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_addr); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, NULL); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, NULL); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_begin); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_member); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, NULL); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_widget_struct_by_class); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_web_add_handler); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, NULL); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_tag); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_find); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_EVENT_DRAW_PART_END); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_coredump); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_get_free_heap); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_pow); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_SERIAL_6E2); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_get_name); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_set_reachable); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_ct); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_AudioGeneratorMP3); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_b); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_SERIAL_8E1); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_arg_size); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_INTERNAL_DAC); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_set_user_data); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_json_append); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, NULL); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str__anonymous_); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_SERIAL_5E1); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_web_add_management_button); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_button_pressed); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_compile); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, NULL); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_get_bat_power); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_draw_line_dsc_init); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_tag); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_PART_MAIN); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str__ptr); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_flush); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, NULL); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_HTTP_GET); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_coredump); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_set_style_text_color); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_Leds); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_AudioGenerator); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_CFG_X3A_X20loading_X20); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, NULL); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", fs_max_size_k, current_fs_size_k)) + webserver.content_send("

") + + webserver.content_send("

") + end + end + end + + #- ---------------------------------------------------------------------- -# + #- Tests for factory layout + #- ---------------------------------------------------------------------- -# + # Returns if the device already has a factory layout: + # devices has 1 factory partition + # device has at least 1 OTA partition + # last partition is FS + # + # returns true or false + def has_factory_layout(p) + return p.has_factory() && p.ota_max() != nil && p.slots[-1].is_spiffs() + end + + #- ---------------------------------------------------------------------- -# + #- Tests for factory migration + #- ---------------------------------------------------------------------- -# + # Returns if the device is eligible for a migration to factory layout: + # devices has 2x OTA partitions + # device has no factory partition + # + # returns true or false + def factory_migrate_eligible(p) + if p.ota_max() <= 0 return false end # device does not have 2x OTA + if p.get_factory_slot() != nil return false end + if !p.slots[-1].is_spiffs() return false end + return true # device does not have factory partition + end + + # ---------------------------------------------------------------------- + # Step 1: + # - pre-condition: + # factory_migrate_eligible(p) returns true + # - DONE state: + # boot on `app1` + # - READY state: + # boot on `app0` + # - Needed steps: + # check that `app1` is large enough for firmware in `app0` + # copy `app0` to `app1` + # restart on `app1` + # set continuation marker in persist to continue migration process at next boto + # + # Returns: + # - false if READY + # - true if DONE + # - string if ERROR, indicating the error + def test_step_1(p) + import string + if !self.factory_migrate_eligible(p) return "not eligible to migration" end + + var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... + if cur_part == 1 return true end + if cur_part != 0 return string.format("active_otadata=%i", cur_part) end # unsupported configuration + # current partition is `app0` + # get size of firmware in `app0` and check if it fits on `app1` + var app0 = p.get_ota_slot(0) + var app1 = p.get_ota_slot(0) + var app0_firmware_size = (app0 != nil) ? app0.get_image_size() : -1 + var app1_size = (app1 != nil) ? app1.size : -1 + if app0_firmware_size < 0 || app1_size < 0 return "can't find app0/1 sizes" end + if app0_firmware_size >= app1_size return "`app1` is too small" end + return false + end + + # ---------------------------------------------------------------------- + # Step 2: + # - pre-condition: + # factory_migrate_eligible(p) returns true + # - DONE state: + # `safeboot` flashed to `app0` + # `safeboot` is smaller than 832KB + # - READY state: + # false `safeboot` to `app0` + # - Needed steps: + # get `safeboot` URL + # check that `app0` is large enough for `safeboot` + # check that `safeboot` is smaller than 832KB + # flash `safeboot` on `app0` + # + # Returns: + # - false if READY + # - true if DONE + # - string if ERROR, indicating the error + def test_step_2(p) + import string + if !self.factory_migrate_eligible(p) return "not eligible to migration" end + + var app0 = p.get_ota_slot(0) + if app0.size < (self.app_size_min * 1024) return "`app0` is too small for `safeboot`" end + var app0_image_size = app0.get_image_size() + if (app0_image_size > 0) && (app0_image_size < (self.app_size_min * 1024)) return true end + return false + end + + # ---------------------------------------------------------------------- + # Step 3: + # - pre-condition: + # booted on `app1` and `safeboot` flashed to `app0` + # - DONE state: + # Partition map is: + # `factory` with `safeboot` flashed, sized to 832KB + # `app0` resized to take all the remaining size but empty + # - READY state: + # `app0` is flashed with `safeboot` + # - Needed steps: + # `app0` renamed to `safeboot` + # `app0` changed subtype to `factory` + # `app1` moved to right after `factory` and resized + # `app1` chaned subtype to `app0` and renamed `app0` + # + # Returns: + # - false if READY + # - true if DONE + # - string if ERROR, indicating the error + def test_step_3(p) + import string + if !self.factory_migrate_eligible(p) return "not eligible to migration" end + + return false + # var app0 = p.get_ota_slot(0) + # if app0.get_image_size() > (self.app_size_min * 1024) return "`app0` is too small for `safeboot`" end + end + + + # ---------------------------------------------------------------------- + # Step 4: + # - pre-condition: + # + # Returns: + # - false if READY + # - true if DONE + # - string if ERROR, indicating the error + def test_step_4(p) + import string + + return false + # var app0 = p.get_ota_slot(0) + # if app0.get_image_size() > (self.app_size_min * 1024) return "`app0` is too small for `safeboot`" end + end + + static def copy_ota(from_addr, to_addr, size) + import flash + import string + var size_left = size + var offset = 0 + + tasmota.log(string.format("UPL: Copy flash from 0x%06X to 0x%06X (size: %ikB)", from_addr, to_addr, size / 1024), 2) + while size_left > 0 + var b = flash.read(from_addr + offset, 4096) + flash.erase(to_addr + offset, 4096) + flash.write(to_addr + offset, b, true) + size_left -= 4096 + offset += 4096 + if ((offset-4096) / 102400) < (offset / 102400) + tasmota.log(string.format("UPL: Progress %ikB", offset/1024), 3) + end + end + tasmota.log("UPL: done", 2) + end + + def do_step_1(p) + var step1_state = self.test_step_1(p) + if step1_state == true return true end + if type(step1_state) == 'string)' raise "internal_error", step1_state end + + # copy firmware frop `app0` to `app1` + var app0 = p.get_ota_slot(0) + var app1 = p.get_ota_slot(1) + var app0_size = app0.get_image_size() + if app0_size > app1.size raise "internal_error", "`app1` too small to copy firmware form `app0`" end + self.copy_ota(app0.start, app1.start, app0_size) + + p.set_active(1) + p.save() + + tasmota.log("UPL: restarting on `app1`", 2) + tasmota.cmd("Restart 1") + end + + def do_step_2(p, safeboot_url) + import string + if safeboot_url == nil || safeboot_url == "" + safeboot_url = self.default_safeboot_URL() + tasmota.log("UPL: no `safeboot` URL, defaulting to "+safeboot_url, 2) + end + + var step2_state = self.test_step_2(p) + if step2_state == true return true end + if type(step2_state) == 'string)' raise "internal_error", step2_state end + if safeboot_url == nil || size(safeboot_url) == 0 raise "internal_error", "wrong safeboot URL "+str(safeboot_url) end + + var cl = webclient() + cl.begin(safeboot_url) + var r = cl.GET() + if r != 200 raise "network_error", "GET returned "+str(r) end + var safeboot_size = cl.get_size() + if safeboot_size <= 500000 raise "internal_error", "wrong safeboot size "+str(safeboot_size) end + if safeboot_size > (self.app_size_min * 1024) raise "internal_error", "safeboot is too large "+str(safeboot_size / 1024)+"kB" end + tasmota.log(string.format("UPL: flashing `safeboot` from %s %ikB", safeboot_url, (safeboot_size / 1024) + 1), 2) + var app0 = p.get_ota_slot(0) + if app0.start != 0x10000 raise "internal_error", "`app0` offset is not 0x10000" end + cl.write_flash(app0.start) + cl.close() + return true + end + + + def do_step_3(p) + import string + import flash + + var step3_state = self.test_step_3(p) + if step3_state == true return true end + if type(step3_state) == 'string)' raise "internal_error", step3_state end + + var app0 = p.get_ota_slot(0) + var app1 = p.get_ota_slot(1) + if app0 == nil || app1 == nil raise "internal_error", "there are no `app0` or `app1` partitions" end + var factory_size = self.app_size_min * 1024 + + var firm0_size = app0.get_image_size() + if firm0_size <= 0 raise "internal_error", "invalid size in app0 partition" end + if firm0_size >= factory_size raise "internal_error", "app0 partition is too big for factory" end + + # do the change + app0.subtype = 0 # factory subtype + app0.size = factory_size + app0.label = 'safeboot' + + app1.subtype = 0x10 # app1 becomes app0 + app1.label = 'app0' + var f1_start = app1.start + app1.start = app0.start + factory_size + app1.size += f1_start - app1.start + + # swicth partitions + p.set_active(0) + p.save() + + p.switch_factory(true) + tasmota.cmd("Restart 1") + + return true + end + + + # display the step state DONE/READY/ERROR with color and either step description or error message + # arg + # state: true=DONE, false=READY, string=ERROR with message + # msg: description if DONE or READY + # returns HTML string + def display_step_state(state, msg) + if state == true + return "DONE "+msg + elif state == false + return "READY "+msg + else + return "ERROR "+str(state) + end + end + #- ---------------------------------------------------------------------- -# + #- Show page to migrate to factory layout + single OTA + #- ---------------------------------------------------------------------- -# + def show_migrate_to_factory(p) + # display ota partitions + import webserver + import string + + if !self.factory_migrate_eligible(p) return end + + webserver.content_send("
 Migrate to safeboot partition layout 

") + + webserver.content_send("

The `safeboot` layout allows for increased size
of firmware or file-system.

") + webserver.content_send("

Please see Safeboot layout documentation

") + webserver.content_send("

 

") + + webserver.content_send(string.format("

Step 1: %s

", self.display_step_state(self.test_step_1(p), "boot on `app1`"))) + webserver.content_send(string.format("

Step 2: %s

", self.display_step_state(self.test_step_2(p), "flash `safeboot` to `app0`"))) + webserver.content_send(string.format("

Step 3: %s

", self.display_step_state(self.test_step_3(p), "change partition map"))) + webserver.content_send(string.format("

Step 4: %s

", self.display_step_state(self.test_step_4(p), "flash final firmware"))) + + webserver.content_send("
") + var ota_url = tasmota.cmd("OtaUrl").find("OtaUrl", "") + webserver.content_send(string.format("
OTA Url

", + ota_url)) + + import persist + var safeboot_url = persist.find("safeboot_url", self.default_safeboot_URL()) + webserver.content_send(string.format("
SAFEBOOT Url (don't change)
", + safeboot_url)) + + webserver.content_send("

") + + webserver.content_send("

") + end + + #- ---------------------------------------------------------------------- -# + #- Show each partition one after the other - only OTA and SPIFFS + #- ---------------------------------------------------------------------- -# + def show_current_partitions(p) + # display ota partitions + import webserver + import string + var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... + + webserver.content_send("
 Current partitions 

") + + # don't show portion + #webserver.content_send("") + + for slot:p.slots + var is_ota = slot.is_ota() + var is_factory = slot.is_factory() + if (is_ota != nil) || is_factory # display only partitions with app type + var current_boot_partition = (is_ota == cur_part) || (is_factory && cur_part == -1) + + var usage_str = "unknown" + var used = slot.get_image_size() + if (used >= 0) && (used <= slot.size) + usage_str = string.format("used %i%%", ((used / 1024) * 100) / (slot.size / 1024)) + end + var title = string.format("%ssubtype:%s offset:0x%06X size:0x%06X", current_boot_partition ? "booted " : "", slot.subtype_to_string(), slot.start, slot.size) + var col_before = "" + var col_after = "" + if current_boot_partition + col_before = "[" + col_after = "]" + end + # webserver.content_send(string.format("

%s [%s]: %i KB (%s)

", slot.label, slot.subtype_to_string(), slot.size / 1024, usage_str)) + webserver.content_send(string.format("", + title, col_before, slot.label, col_after, slot.size / 1024, usage_str)) + elif slot.is_spiffs() + # spiffs partition + var title = string.format("subtype:%s offset:0x%06X size:0x%06X", slot.subtype_to_string(), slot.start, slot.size) + webserver.content_send(string.format("", title, slot.size / 1024)) + end + end + + var unallocated = self.get_unallocated_k(p) + if unallocated > 0 + var last_slot = p.slots[-1] + # verify that last slot is file-system + var partition_end_k = (last_slot.start + last_slot.size) / 1024 # last kb used for fs + webserver.content_send(string.format("", + partition_end_k * 1024, unallocated * 1024, unallocated)) + end + webserver.content_send("
<sys>:  64 KB
%s%s%s %i KB  (%s)
fs %i KB
<free>:  %i KB
") + + # display if layout is factory + if self.has_factory_layout(p) + webserver.content_send("

This device uses the safeboot layout

") + end + + webserver.content_send("

") + + end + + ####################################################################### + # Display the complete page + ####################################################################### + def page_part_mgr() + import webserver + import string + import partition_core + if !webserver.check_privileged_access() return nil end + var p = partition_core.Partition() # load partition layout + + webserver.content_start("Partition Wizard") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + + if webserver.has_arg("wait") + webserver.content_send("

Migration process will start in 5 seconds
Magic is happening, leave device alone for 3 minutes.

") + webserver.content_button(webserver.BUTTON_MAIN) #- button back to main page -# + else + webserver.content_send("

Warning: actions below can brick your device.

") + self.show_current_partitions(p) + self.show_resize_fs(p) + # show page for migration to factory + self.show_migrate_to_factory(p) + webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# + end + + webserver.content_stop() #- end of web page -# + end + + ####################################################################### + # Web Controller, called by POST to `/part_wiz` + ####################################################################### + def page_part_ctl() + import webserver + if !webserver.check_privileged_access() return nil end + + import string + import partition_core + import persist + + + #- check that the partition is valid -# + var p = partition_core.Partition() + + try + + #---------------------------------------------------------------------# + # Resize FS to max + #---------------------------------------------------------------------# + if webserver.has_arg("max_fs") + var unallocated = self.get_unallocated_k(p) + if unallocated <= 0 raise "value_error", "FS already at max size" end + + self.resize_max_flash_size_k(p) # resize if needed + + # since unallocated succeeded, we know the last slot is FS + var fs_slot = p.slots[-1] + fs_slot.size += unallocated * 1024 + p.save() + p.invalidate_spiffs() # erase SPIFFS or data is corrupt + + #- and force restart -# + webserver.redirect("/?rst=") + + #---------------------------------------------------------------------# + # Resize FS to arbitrary size + #---------------------------------------------------------------------# + elif webserver.has_arg("resize_fs") + if !self.has_factory_layout(p) raise "internal_error", "Device does not avec safeboot layout" end + + var fs = p.slots[-1] + var last_app = p.slots[-2] + if (last_app.get_image_size() <= 0) raise "internal_error", "last `app` partition has no firmware" end + + var max_fs_start_k = self.get_max_fs_start_k(p) + var flash_size_k = self.get_max_flash_size_k(p) + + var fs_max_size_k = flash_size_k - max_fs_start_k + var current_fs_size_k = self.get_cur_fs_size_k(p) + + var fs_target = int(webserver.arg("fs_size")) + if (fs_target < 64) || (fs_target > fs_max_size_k) raise "value_error", string.format("Invalid FS #%d", fs_target) end + + # apply the change + # shrink last OTA App + var delta = (fs_target * 1024) - fs.size + last_app.size -= delta + + # move fs + fs.start -= delta + fs.size += delta + p.save() + p.invalidate_spiffs() + + #- and force restart -# + webserver.redirect("/?rst=") + #---------------------------------------------------------------------# + # Switch OTA partition from one to another + #---------------------------------------------------------------------# + elif webserver.has_arg("factory") + var ota_url = webserver.arg("o1") + var safeboot_url = webserver.arg("o2") + + if safeboot_url != nil && safeboot_url != "" + persist.safeboot_url = safeboot_url + persist.save() + end + + if ota_url != nil && ota_url != "" + tasmota.cmd("OtaUrl "+ota_url) + end + + tasmota.set_timer(5000, /-> self.do_safeboot_partitioning()) + webserver.redirect("/part_wiz?wait=") + + else + raise "value_error", "Unknown command" + end + except .. as e, m + tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) + #- display error page -# + webserver.content_start("Parameter error") #- title of the web page -# + webserver.content_send_style() #- send standard Tasmota styles -# + + webserver.content_send(string.format("

Exception:
'%s'
%s

", e, m)) + # webserver.content_send("

") + + webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# + webserver.content_stop() #- end of web page -# + end + end + + + + #---------------------------------------------------------------------# + # Apply the repartitioning process + #---------------------------------------------------------------------# + # returns: + # `true`: already completed + # `false`: in progress + # string: error with description of error + def do_safeboot_partitioning() + import webserver + import string + import partition_core + + var p = partition_core.Partition() # load partition layout + if !self.factory_migrate_eligible(p) return true end + + # STEP 1 + var step1_state = self.test_step_1(p) + if type(step1_state) == 'string' return step1_state end + if step1_state == false + import persist + tasmota.log("UPL: Starting step 1", 2) + try + self.do_step_1(p) + except .. as e, m + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + return m + end + persist.factory_migrate = true + persist.save() + return false + end + tasmota.log("UPL: Step 1 Done", 2) + + # STEP 2 + var step2_state = self.test_step_2(p) + if type(step2_state) == 'string' return step2_state end + if step2_state == false + tasmota.log("UPL: Starting step 2", 2) + import persist + var safeboot_url = persist.find("safeboot_url") + try + self.do_step_2(p, safeboot_url) + except .. as e, m + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + return m + end + end + tasmota.log("UPL: Step 2 Done", 2) + + # STEP 3 + var step3_state = self.test_step_3(p) + if type(step3_state) == 'string' return step3_state end + if step3_state == false + tasmota.log("UPL: Starting step 3", 2) + try + self.do_step_3(p) + except .. as e, m + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) + return m + end + end + tasmota.log("UPL: Step 3 Done", 2) + + # STEP 4 + # Nothing to do, it's automatic + return false + end + + #- ---------------------------------------------------------------------- -# + # respond to web_add_handler() event to register web listeners + #- ---------------------------------------------------------------------- -# + #- this is called at Tasmota start-up, as soon as Wifi/Eth is up and web server running -# + def web_add_handler() + import webserver + #- we need to register a closure, not just a function, that captures the current instance -# + webserver.on("/part_wiz", / -> self.page_part_mgr(), webserver.HTTP_GET) + webserver.on("/part_wiz", / -> self.page_part_ctl(), webserver.HTTP_POST) + end +end +partition_wizard.Partition_wizard_UI = Partition_wizard_UI + + +#- create and register driver in Tasmota -# +if tasmota + import partition_core + var partition_wizard_ui = partition_wizard.Partition_wizard_UI() + tasmota.add_driver(partition_wizard_ui) + ## can be removed if put in 'autoexec.bat' + partition_wizard_ui.web_add_handler() +end + +return partition_wizard + +#- Example + +import partition + +# read +p = partition.Partition() +print(p) + +-# diff --git a/tasmota/berry/modules/Partition_wizard.tapp b/tasmota/berry/modules/Partition_wizard.tapp new file mode 100644 index 0000000000000000000000000000000000000000..9c9f5cd3036d5e7d9b2a1d028a5e6d9fdf8ea0d0 GIT binary patch literal 31911 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 Date: Wed, 11 May 2022 10:41:32 +0200 Subject: [PATCH 207/376] Fix possible ota_loader mismatch --- tasmota/support_tasmota.ino | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 0ea18563f..171f70d6d 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1419,19 +1419,16 @@ void Every250mSeconds(void) case 3: // Every x.75 second if (!TasmotaGlobal.global_state.network_down) { #ifdef FIRMWARE_MINIMAL - #ifdef CONFIG_IDF_TARGET_ESP32C3 if (OtaFactoryRead()) { OtaFactoryWrite(false); TasmotaGlobal.ota_state_flag = 3; } -#else +#endif if (1 == RtcSettings.ota_loader) { RtcSettings.ota_loader = 0; TasmotaGlobal.ota_state_flag = 3; } -#endif - #endif // FIRMWARE_MINIMAL #ifdef USE_DISCOVERY From 865ba51b7a443e3112ecf1ec4e759cd411b31ed2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 11 May 2022 14:31:39 +0200 Subject: [PATCH 208/376] Add command upload 2 Add command upload 2 to upload saveboot binary from production partition --- .../src/HTTPUpdateLight.cpp | 35 +- .../src/HTTPUpdateLight.h | 14 +- .../Berry-HttpClientLight/src/TasUpdate.h | 194 +++++++++ .../Berry-HttpClientLight/src/TasUpdater.cpp | 404 ++++++++++++++++++ tasmota/support_command.ino | 10 +- tasmota/support_tasmota.ino | 16 + tasmota/tasmota.ino | 1 + 7 files changed, 655 insertions(+), 19 deletions(-) create mode 100644 lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h create mode 100644 lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp index 694502ea5..a3c798f1c 100644 --- a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp +++ b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.cpp @@ -117,7 +117,7 @@ String HTTPUpdateLight::getLastErrorString(void) // error from Update class if(_lastError > 0) { StreamString error; - Update.printError(error); + TasUpdate.printError(error); error.trim(); // remove line ending return String("Update error: ") + error; } @@ -418,14 +418,17 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma StreamString error; if (_cbProgress) { - Update.onProgress(_cbProgress); + TasUpdate.onProgress(_cbProgress); } - if(!Update.begin(size, command, _ledPin, _ledOn)) { - _lastError = Update.getError(); - Update.printError(error); +// Start Tasmota Factory patch +// if(!Update.begin(size, command, _ledPin, _ledOn)) { + if(!TasUpdate.begin(size, command, _ledPin, _ledOn, NULL, _factory)) { +// End Tasmota Factory patch + _lastError = TasUpdate.getError(); + TasUpdate.printError(error); error.trim(); // remove line ending - log_e("Update.begin failed! (%s)\n", error.c_str()); + log_e("TasUpdate.begin failed! (%s)\n", error.c_str()); return false; } @@ -434,20 +437,20 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma } if(md5.length()) { - if(!Update.setMD5(md5.c_str())) { + if(!TasUpdate.setMD5(md5.c_str())) { _lastError = HTTP_UE_SERVER_FAULTY_MD5; - log_e("Update.setMD5 failed! (%s)\n", md5.c_str()); + log_e("TasUpdate.setMD5 failed! (%s)\n", md5.c_str()); return false; } } // To do: the SHA256 could be checked if the server sends it - if(Update.writeStream(in) != size) { - _lastError = Update.getError(); - Update.printError(error); + if(TasUpdate.writeStream(in) != size) { + _lastError = TasUpdate.getError(); + TasUpdate.printError(error); error.trim(); // remove line ending - log_e("Update.writeStream failed! (%s)\n", error.c_str()); + log_e("TasUpdate.writeStream failed! (%s)\n", error.c_str()); return false; } @@ -455,11 +458,11 @@ bool HTTPUpdateLight::runUpdate(Stream& in, uint32_t size, String md5, int comma _cbProgress(size, size); } - if(!Update.end()) { - _lastError = Update.getError(); - Update.printError(error); + if(!TasUpdate.end()) { + _lastError = TasUpdate.getError(); + TasUpdate.printError(error); error.trim(); // remove line ending - log_e("Update.end failed! (%s)\n", error.c_str()); + log_e("TasUpdate.end failed! (%s)\n", error.c_str()); return false; } diff --git a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h index cbed38bd6..372f9f1b0 100644 --- a/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h +++ b/lib/libesp32/Berry-HttpClientLight/src/HTTPUpdateLight.h @@ -31,7 +31,7 @@ #include #include #include -#include +#include #include /// note we use HTTP client errors too so we start at 100 @@ -69,7 +69,7 @@ public: { _rebootOnUpdate = reboot; } - + /** * set redirect follow mode. See `followRedirects_t` enum for avaliable modes. * @param follow @@ -85,6 +85,13 @@ public: _ledOn = ledOn; } +// Start Tasmota Factory patch + void setFactory(bool factory = false) + { + _factory = factory; + } +// End Tasmota Factory patch + // t_httpUpdate_return update(WiFiClient& client, const String& url, const String& currentVersion = ""); // t_httpUpdate_return update(WiFiClient& client, const String& host, uint16_t port, const String& uri = "/", @@ -131,6 +138,9 @@ private: int _ledPin; uint8_t _ledOn; +// Start Tasmota Factory patch + bool _factory; +// End Tasmota Factory patch }; #if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_HTTPUPDATE) diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h b/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h new file mode 100644 index 000000000..0aaac13b3 --- /dev/null +++ b/lib/libesp32/Berry-HttpClientLight/src/TasUpdate.h @@ -0,0 +1,194 @@ +#ifndef TASUPDATER_H +#define TASUPDATER_H + +#include +#include +#include +#include "esp_partition.h" + +#define UPDATE_ERROR_OK (0) +#define UPDATE_ERROR_WRITE (1) +#define UPDATE_ERROR_ERASE (2) +#define UPDATE_ERROR_READ (3) +#define UPDATE_ERROR_SPACE (4) +#define UPDATE_ERROR_SIZE (5) +#define UPDATE_ERROR_STREAM (6) +#define UPDATE_ERROR_MD5 (7) +#define UPDATE_ERROR_MAGIC_BYTE (8) +#define UPDATE_ERROR_ACTIVATE (9) +#define UPDATE_ERROR_NO_PARTITION (10) +#define UPDATE_ERROR_BAD_ARGUMENT (11) +#define UPDATE_ERROR_ABORT (12) + +#define UPDATE_SIZE_UNKNOWN 0xFFFFFFFF + +#define U_FLASH 0 +#define U_SPIFFS 100 +#define U_AUTH 200 + +#define ENCRYPTED_BLOCK_SIZE 16 + +class TasUpdateClass { + public: + typedef std::function THandlerFunction_Progress; + + TasUpdateClass(); + + /* + This callback will be called when Update is receiving data + */ + TasUpdateClass& onProgress(THandlerFunction_Progress fn); + + /* + Call this to check the space needed for the update + Will return false if there is not enough space + */ +// Start Tasmota Factory patch +// bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL); + bool begin(size_t size=UPDATE_SIZE_UNKNOWN, int command = U_FLASH, int ledPin = -1, uint8_t ledOn = LOW, const char *label = NULL, bool factory = false); +// End Tasmota Factory patch + + /* + Writes a buffer to the flash and increments the address + Returns the amount written + */ + size_t write(uint8_t *data, size_t len); + + /* + Writes the remaining bytes from the Stream to the flash + Uses readBytes() and sets UPDATE_ERROR_STREAM on timeout + Returns the bytes written + Should be equal to the remaining bytes when called + Usable for slow streams like Serial + */ + size_t writeStream(Stream &data); + + /* + If all bytes are written + this call will write the config to eboot + and return true + If there is already an update running but is not finished and !evenIfRemaining + or there is an error + this will clear everything and return false + the last error is available through getError() + evenIfRemaining is helpfull when you update without knowing the final size first + */ + bool end(bool evenIfRemaining = false); + + /* + Aborts the running update + */ + void abort(); + + /* + Prints the last error to an output stream + */ + void printError(Print &out); + + const char * errorString(); + + /* + sets the expected MD5 for the firmware (hexString) + */ + bool setMD5(const char * expected_md5); + + /* + returns the MD5 String of the successfully ended firmware + */ + String md5String(void){ return _md5.toString(); } + + /* + populated the result with the md5 bytes of the successfully ended firmware + */ + void md5(uint8_t * result){ return _md5.getBytes(result); } + + //Helpers + uint8_t getError(){ return _error; } + void clearError(){ _error = UPDATE_ERROR_OK; } + bool hasError(){ return _error != UPDATE_ERROR_OK; } + bool isRunning(){ return _size > 0; } + bool isFinished(){ return _progress == _size; } + size_t size(){ return _size; } + size_t progress(){ return _progress; } + size_t remaining(){ return _size - _progress; } + + /* + Template to write from objects that expose + available() and read(uint8_t*, size_t) methods + faster than the writeStream method + writes only what is available + */ + template + size_t write(T &data){ + size_t written = 0; + if (hasError() || !isRunning()) + return 0; + + size_t available = data.available(); + while(available) { + if(_bufferLen + available > remaining()){ + available = remaining() - _bufferLen; + } + if(_bufferLen + available > 4096) { + size_t toBuff = 4096 - _bufferLen; + data.read(_buffer + _bufferLen, toBuff); + _bufferLen += toBuff; + if(!_writeBuffer()) + return written; + written += toBuff; + } else { + data.read(_buffer + _bufferLen, available); + _bufferLen += available; + written += available; + if(_bufferLen == remaining()) { + if(!_writeBuffer()) { + return written; + } + } + } + if(remaining() == 0) + return written; + available = data.available(); + } + return written; + } + + /* + check if there is a firmware on the other OTA partition that you can bootinto + */ + bool canRollBack(); + /* + set the other OTA partition as bootable (reboot to enable) + */ + bool rollBack(); + + private: + void _reset(); + void _abort(uint8_t err); + bool _writeBuffer(); + bool _verifyHeader(uint8_t data); + bool _verifyEnd(); + bool _enablePartition(const esp_partition_t* partition); + + + uint8_t _error; + uint8_t *_buffer; + uint8_t *_skipBuffer; + size_t _bufferLen; + size_t _size; + THandlerFunction_Progress _progress_callback; + uint32_t _progress; + uint32_t _paroffset; + uint32_t _command; + const esp_partition_t* _partition; + + String _target_md5; + MD5Builder _md5; + + int _ledPin; + uint8_t _ledOn; +}; + +extern TasUpdateClass TasUpdate; + +#endif // TASUPDATER_H diff --git a/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp b/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp new file mode 100644 index 000000000..e359ff96f --- /dev/null +++ b/lib/libesp32/Berry-HttpClientLight/src/TasUpdater.cpp @@ -0,0 +1,404 @@ +#include "TasUpdate.h" +#include "Arduino.h" +#include "esp_spi_flash.h" +#include "esp_ota_ops.h" +#include "esp_image_format.h" + +static const char * _err2str(uint8_t _error){ + if(_error == UPDATE_ERROR_OK){ + return ("No Error"); + } else if(_error == UPDATE_ERROR_WRITE){ + return ("Flash Write Failed"); + } else if(_error == UPDATE_ERROR_ERASE){ + return ("Flash Erase Failed"); + } else if(_error == UPDATE_ERROR_READ){ + return ("Flash Read Failed"); + } else if(_error == UPDATE_ERROR_SPACE){ + return ("Not Enough Space"); + } else if(_error == UPDATE_ERROR_SIZE){ + return ("Bad Size Given"); + } else if(_error == UPDATE_ERROR_STREAM){ + return ("Stream Read Timeout"); + } else if(_error == UPDATE_ERROR_MD5){ + return ("MD5 Check Failed"); + } else if(_error == UPDATE_ERROR_MAGIC_BYTE){ + return ("Wrong Magic Byte"); + } else if(_error == UPDATE_ERROR_ACTIVATE){ + return ("Could Not Activate The Firmware"); + } else if(_error == UPDATE_ERROR_NO_PARTITION){ + return ("Partition Could Not be Found"); + } else if(_error == UPDATE_ERROR_BAD_ARGUMENT){ + return ("Bad Argument"); + } else if(_error == UPDATE_ERROR_ABORT){ + return ("Aborted"); + } + return ("UNKNOWN"); +} + +static bool _partitionIsBootable(const esp_partition_t* partition){ + uint8_t buf[ENCRYPTED_BLOCK_SIZE]; + if(!partition){ + return false; + } + if(!ESP.partitionRead(partition, 0, (uint32_t*)buf, ENCRYPTED_BLOCK_SIZE)) { + return false; + } + + if(buf[0] != ESP_IMAGE_HEADER_MAGIC) { + return false; + } + return true; +} + +bool TasUpdateClass::_enablePartition(const esp_partition_t* partition){ + if(!partition){ + return false; + } + return ESP.partitionWrite(partition, 0, (uint32_t*) _skipBuffer, ENCRYPTED_BLOCK_SIZE); +} + +TasUpdateClass::TasUpdateClass() +: _error(0) +, _buffer(0) +, _bufferLen(0) +, _size(0) +, _progress_callback(NULL) +, _progress(0) +, _paroffset(0) +, _command(U_FLASH) +, _partition(NULL) +{ +} + +TasUpdateClass& TasUpdateClass::onProgress(THandlerFunction_Progress fn) { + _progress_callback = fn; + return *this; +} + +void TasUpdateClass::_reset() { + if (_buffer) + delete[] _buffer; + _buffer = 0; + _bufferLen = 0; + _progress = 0; + _size = 0; + _command = U_FLASH; + + if(_ledPin != -1) { + digitalWrite(_ledPin, !_ledOn); // off + } +} + +bool TasUpdateClass::canRollBack(){ + if(_buffer){ //Update is running + return false; + } + const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL); + return _partitionIsBootable(partition); +} + +bool TasUpdateClass::rollBack(){ + if(_buffer){ //Update is running + return false; + } + const esp_partition_t* partition = esp_ota_get_next_update_partition(NULL); + return _partitionIsBootable(partition) && !esp_ota_set_boot_partition(partition); +} + +// Start Tasmota Factory patch +//bool UpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, const char *label) { +bool TasUpdateClass::begin(size_t size, int command, int ledPin, uint8_t ledOn, const char *label, bool factory) { +// End Tasmota Factory patch + if(_size > 0){ + log_w("already running"); + return false; + } + + _ledPin = ledPin; + _ledOn = !!ledOn; // 0(LOW) or 1(HIGH) + + _reset(); + _error = 0; + _target_md5 = emptyString; + _md5 = MD5Builder(); + + if(size == 0) { + _error = UPDATE_ERROR_SIZE; + return false; + } + + if (command == U_FLASH) { +// Start Tasmota Factory patch +// _partition = esp_ota_get_next_update_partition(NULL); + if (factory) { + _partition = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_APP_FACTORY, NULL); + } else { + _partition = esp_ota_get_next_update_partition(NULL); + } +// End Tasmota Factory patch + if(!_partition){ + _error = UPDATE_ERROR_NO_PARTITION; + return false; + } + log_d("OTA Partition: %s", _partition->label); + } + else if (command == U_SPIFFS) { + _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_SPIFFS, label); + _paroffset = 0; + if(!_partition){ + _partition = esp_partition_find_first(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_DATA_FAT, NULL); + _paroffset = 0x1000; //Offset for ffat, assuming size is already corrected + if(!_partition){ + _error = UPDATE_ERROR_NO_PARTITION; + return false; + } + } + } + else { + _error = UPDATE_ERROR_BAD_ARGUMENT; + log_e("bad command %u", command); + return false; + } + + if(size == UPDATE_SIZE_UNKNOWN){ + size = _partition->size; + } else if(size > _partition->size){ + _error = UPDATE_ERROR_SIZE; + log_e("too large %u > %u", size, _partition->size); + return false; + } + + //initialize + _buffer = (uint8_t*)malloc(SPI_FLASH_SEC_SIZE); + if(!_buffer){ + log_e("malloc failed"); + return false; + } + _size = size; + _command = command; + _md5.begin(); + return true; +} + +void TasUpdateClass::_abort(uint8_t err){ + _reset(); + _error = err; +} + +void TasUpdateClass::abort(){ + _abort(UPDATE_ERROR_ABORT); +} + +bool TasUpdateClass::_writeBuffer(){ + //first bytes of new firmware + uint8_t skip = 0; + if(!_progress && _command == U_FLASH){ + //check magic + if(_buffer[0] != ESP_IMAGE_HEADER_MAGIC){ + _abort(UPDATE_ERROR_MAGIC_BYTE); + return false; + } + + //Stash the first 16 bytes of data and set the offset so they are + //not written at this point so that partially written firmware + //will not be bootable + skip = ENCRYPTED_BLOCK_SIZE; + _skipBuffer = (uint8_t*)malloc(skip); + if(!_skipBuffer){ + log_e("malloc failed"); + return false; + } + memcpy(_skipBuffer, _buffer, skip); + } + if (!_progress && _progress_callback) { + _progress_callback(0, _size); + } + if(!ESP.partitionEraseRange(_partition, _progress, SPI_FLASH_SEC_SIZE)){ + _abort(UPDATE_ERROR_ERASE); + return false; + } + if (!ESP.partitionWrite(_partition, _progress + skip, (uint32_t*)_buffer + skip/sizeof(uint32_t), _bufferLen - skip)) { + _abort(UPDATE_ERROR_WRITE); + return false; + } + //restore magic or md5 will fail + if(!_progress && _command == U_FLASH){ + _buffer[0] = ESP_IMAGE_HEADER_MAGIC; + } + _md5.add(_buffer, _bufferLen); + _progress += _bufferLen; + _bufferLen = 0; + if (_progress_callback) { + _progress_callback(_progress, _size); + } + return true; +} + +bool TasUpdateClass::_verifyHeader(uint8_t data) { + if(_command == U_FLASH) { + if(data != ESP_IMAGE_HEADER_MAGIC) { + _abort(UPDATE_ERROR_MAGIC_BYTE); + return false; + } + return true; + } else if(_command == U_SPIFFS) { + return true; + } + return false; +} + +bool TasUpdateClass::_verifyEnd() { + if(_command == U_FLASH) { + if(!_enablePartition(_partition) || !_partitionIsBootable(_partition)) { + _abort(UPDATE_ERROR_READ); + return false; + } + + if(esp_ota_set_boot_partition(_partition)){ + _abort(UPDATE_ERROR_ACTIVATE); + return false; + } + _reset(); + return true; + } else if(_command == U_SPIFFS) { + _reset(); + return true; + } + return false; +} + +bool TasUpdateClass::setMD5(const char * expected_md5){ + if(strlen(expected_md5) != 32) + { + return false; + } + _target_md5 = expected_md5; + return true; +} + +bool TasUpdateClass::end(bool evenIfRemaining){ + if(hasError() || _size == 0){ + return false; + } + + if(!isFinished() && !evenIfRemaining){ + log_e("premature end: res:%u, pos:%u/%u\n", getError(), progress(), _size); + _abort(UPDATE_ERROR_ABORT); + return false; + } + + if(evenIfRemaining) { + if(_bufferLen > 0) { + _writeBuffer(); + } + _size = progress(); + } + + _md5.calculate(); + if(_target_md5.length()) { + if(_target_md5 != _md5.toString()){ + _abort(UPDATE_ERROR_MD5); + return false; + } + } + + return _verifyEnd(); +} + +size_t TasUpdateClass::write(uint8_t *data, size_t len) { + if(hasError() || !isRunning()){ + return 0; + } + + if(len > remaining()){ + _abort(UPDATE_ERROR_SPACE); + return 0; + } + + size_t left = len; + + while((_bufferLen + left) > SPI_FLASH_SEC_SIZE) { + size_t toBuff = SPI_FLASH_SEC_SIZE - _bufferLen; + memcpy(_buffer + _bufferLen, data + (len - left), toBuff); + _bufferLen += toBuff; + if(!_writeBuffer()){ + return len - left; + } + left -= toBuff; + } + memcpy(_buffer + _bufferLen, data + (len - left), left); + _bufferLen += left; + if(_bufferLen == remaining()){ + if(!_writeBuffer()){ + return len - left; + } + } + return len; +} + +size_t TasUpdateClass::writeStream(Stream &data) { + size_t written = 0; + size_t toRead = 0; + int timeout_failures = 0; + + if(hasError() || !isRunning()) + return 0; + + if(!_verifyHeader(data.peek())) { + _reset(); + return 0; + } + + if(_ledPin != -1) { + pinMode(_ledPin, OUTPUT); + } + + while(remaining()) { + if(_ledPin != -1) { + digitalWrite(_ledPin, _ledOn); // Switch LED on + } + size_t bytesToRead = SPI_FLASH_SEC_SIZE - _bufferLen; + if(bytesToRead > remaining()) { + bytesToRead = remaining(); + } + + /* + Init read&timeout counters and try to read, if read failed, increase counter, + wait 100ms and try to read again. If counter > 300 (30 sec), give up/abort + */ + toRead = 0; + timeout_failures = 0; + while(!toRead) { + toRead = data.readBytes(_buffer + _bufferLen, bytesToRead); + if(toRead == 0) { + timeout_failures++; + if (timeout_failures >= 300) { + _abort(UPDATE_ERROR_STREAM); + return written; + } + delay(100); + } + } + + if(_ledPin != -1) { + digitalWrite(_ledPin, !_ledOn); // Switch LED off + } + _bufferLen += toRead; + if((_bufferLen == remaining() || _bufferLen == SPI_FLASH_SEC_SIZE) && !_writeBuffer()) + return written; + written += toRead; + + delay(1); // Fix solo WDT + } + return written; +} + +void TasUpdateClass::printError(Print &out){ + out.println(_err2str(_error)); +} + +const char * TasUpdateClass::errorString(){ + return _err2str(_error); +} + +TasUpdateClass TasUpdate; diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 1549f5aca..556569a55 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -837,7 +837,15 @@ void CmndUpgrade(void) TasmotaGlobal.ota_state_flag = 3; char stemp1[TOPSZ]; Response_P(PSTR("{\"%s\":\"" D_JSON_VERSION " %s " D_JSON_FROM " %s\"}"), XdrvMailbox.command, TasmotaGlobal.version, GetOtaUrl(stemp1, sizeof(stemp1))); - } else { + } +#if defined(ESP32) && defined(USE_WEBCLIENT_HTTPS) + else if (EspSingleOtaPartition() && !EspRunningFactoryPartition() && (1 == XdrvMailbox.data_len) && (2 == XdrvMailbox.payload)) { + TasmotaGlobal.ota_factory = true; + TasmotaGlobal.ota_state_flag = 3; + ResponseCmndChar(PSTR("Saveboot")); + } +#endif // ESP32 and WEBCLIENT_HTTPS + else { Response_P(PSTR("{\"%s\":\"" D_JSON_ONE_OR_GT "\"}"), XdrvMailbox.command, TasmotaGlobal.version); } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 171f70d6d..454d59fae 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1248,6 +1248,21 @@ void Every250mSeconds(void) #ifdef ESP32 #ifndef FIRMWARE_MINIMAL +#ifdef USE_WEBCLIENT_HTTPS + if (TasmotaGlobal.ota_factory) { + char *bch = strrchr(full_ota_url, '/'); // Only consider filename after last backslash prevent change of urls having "-" in it + if (bch == nullptr) { bch = full_ota_url; } // No path found so use filename only + char *ech = strchr(bch, '.'); // Find file type in filename (none, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz) + if (ech == nullptr) { ech = full_ota_url + strlen(full_ota_url); } // Point to '/0' at end of full_ota_url becoming an empty string + char ota_url_type[strlen(ech) +1]; + strncpy(ota_url_type, ech, sizeof(ota_url_type)); // Either empty, .ino.bin, .ino.bin.gz, .bin, .bin.gz or .gz + + char *pch = strrchr(bch, '-'); // Find last dash (-) and ignore remainder - handles tasmota-DE + if (pch == nullptr) { pch = ech; } // No dash so ignore filetype + *pch = '\0'; // full_ota_url = http://domus1:80/api/arduino/tasmota + snprintf_P(full_ota_url, sizeof(full_ota_url), PSTR("%s-safeboot%s"), full_ota_url, ota_url_type); // Saveboot filename must be filename-safeboot + } else +#endif // USE_WEBCLIENT_HTTPS if (EspSingleOtaPartition()) { #ifdef CONFIG_IDF_TARGET_ESP32C3 OtaFactoryWrite(true); @@ -1271,6 +1286,7 @@ void Every250mSeconds(void) ota_result = -999; } else { httpUpdateLight.rebootOnUpdate(false); + httpUpdateLight.setFactory(TasmotaGlobal.ota_factory); ota_result = (HTTP_UPDATE_FAILED != httpUpdateLight.update(OTAclient, version)); } #else // standard OTA over HTTP diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 44d39780f..dc815a21b 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -186,6 +186,7 @@ struct TasmotaGlobal_t { bool i2c_enabled; // I2C configured #ifdef ESP32 bool i2c_enabled_2; // I2C configured, second controller on ESP32, Wire1 + bool ota_factory; // Select safeboot binary #endif bool ntp_force_sync; // Force NTP sync bool skip_light_fade; // Temporarily skip light fading From 8253f579f3ca573f4c6054d28b89541ce9572f71 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 11 May 2022 14:45:09 +0200 Subject: [PATCH 209/376] Fix safeboot naming --- tasmota/support_command.ino | 2 +- tasmota/support_tasmota.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 556569a55..62f305d8f 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -842,7 +842,7 @@ void CmndUpgrade(void) else if (EspSingleOtaPartition() && !EspRunningFactoryPartition() && (1 == XdrvMailbox.data_len) && (2 == XdrvMailbox.payload)) { TasmotaGlobal.ota_factory = true; TasmotaGlobal.ota_state_flag = 3; - ResponseCmndChar(PSTR("Saveboot")); + ResponseCmndChar(PSTR("Safeboot")); } #endif // ESP32 and WEBCLIENT_HTTPS else { diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 454d59fae..42f573d54 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -1260,7 +1260,7 @@ void Every250mSeconds(void) char *pch = strrchr(bch, '-'); // Find last dash (-) and ignore remainder - handles tasmota-DE if (pch == nullptr) { pch = ech; } // No dash so ignore filetype *pch = '\0'; // full_ota_url = http://domus1:80/api/arduino/tasmota - snprintf_P(full_ota_url, sizeof(full_ota_url), PSTR("%s-safeboot%s"), full_ota_url, ota_url_type); // Saveboot filename must be filename-safeboot + snprintf_P(full_ota_url, sizeof(full_ota_url), PSTR("%s-safeboot%s"), full_ota_url, ota_url_type); // Safeboot filename must be filename-safeboot } else #endif // USE_WEBCLIENT_HTTPS if (EspSingleOtaPartition()) { From f70174142f85c1561b78c31e51ec7005bc73182c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 11 May 2022 15:07:12 +0200 Subject: [PATCH 210/376] Remove ethernet from ESP32-Solo1 --- tasmota/tasmota_globals.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tasmota/tasmota_globals.h b/tasmota/tasmota_globals.h index ddeab70a3..284e7f314 100644 --- a/tasmota/tasmota_globals.h +++ b/tasmota/tasmota_globals.h @@ -104,6 +104,12 @@ String EthernetMacAddress(void); #if CONFIG_IDF_TARGET_ESP32 +#ifdef CORE32SOLO1 +#ifdef USE_ETHERNET +#undef USE_ETHERNET // ESP32-Solo1 does not support ethernet +#endif +#endif // CORE32SOLO1 + #else // Disable features not present in other ESP32 like ESP32C3, ESP32S2, ESP32S3 etc. #ifdef USE_ETHERNET #undef USE_ETHERNET // All non-ESP32 do not support ethernet From 24c4dcec72e51629ed2ed4b40f9e0a88362cd495 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 11 May 2022 18:30:20 +0200 Subject: [PATCH 211/376] add littlefs partition option --- pio-tools/post_esp32.py | 49 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 5bb057fab..5b58b0c0a 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -14,7 +14,9 @@ # - 0x1000 | ~\.platformio\packages\framework-arduinoespressif32\tools\sdk\esp32\bin\bootloader_dout_40m.bin # - 0x8000 | ~\Tasmota\.pio\build\\partitions.bin # - 0xe000 | ~\.platformio\packages\framework-arduinoespressif32\tools\partitions\boot_app0.bin -# - 0x10000 | ~\Tasmota\.pio\build\/firmware.bin +# - 0x10000 | ~\.platformio/packages/framework-arduinoespressif32/variants/tasmota/\-safeboot.bin +# - 0xe0000 | ~\Tasmota\.pio\build\/firmware.bin +# - 0x3b0000| ~\Tasmota\.pio\build\/littlefs.bin Import("env") @@ -28,6 +30,7 @@ from os.path import join import csv import requests import shutil +import subprocess sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) import esptool @@ -35,6 +38,19 @@ import esptool FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") +def esp32_build_filesystem(fs_size): + files = env.GetProjectOption("custom_files_upload").splitlines() + filesystem_dir = join(env.subst("$BUILD_DIR"),"littlefs_data") + if not os.path.exists(filesystem_dir): + os.makedirs(filesystem_dir) + print("Creating filesystem with content:") + for file in files: + shutil.copy(file, filesystem_dir) + env.Replace( MKSPIFFSTOOL=platform.get_package_dir("tool-mklittlefs") + '/mklittlefs' ) + tool = env.subst(env["MKSPIFFSTOOL"]) + cmd = (tool,"-c",filesystem_dir,"-s",fs_size,join(env.subst("$BUILD_DIR"),"littlefs.bin")) + returncode = subprocess.call(cmd, shell=False) + def esp32_fetch_safeboot_bin(chip): safeboot_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin" safeboot_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin") @@ -60,7 +76,7 @@ def esp32_create_combined_bin(source, target, env): # This is defined in the partition .csv file factory_offset = -1 # error code value app_offset = 0x10000 # default value for "old" scheme - spiffs_offset = -1 # error code value + fs_offset = -1 # error code value with open(env.BoardConfig().get("build.partitions")) as csv_file: print("Read partitions from ",env.BoardConfig().get("build.partitions")) csv_reader = csv.reader(csv_file, delimiter=',') @@ -76,8 +92,9 @@ def esp32_create_combined_bin(source, target, env): app_offset = int(row[3],base=16) # elif(row[0] == 'factory'): # factory_offset = int(row[3],base=16) - # elif(row[0] == 'spiffs'): - # spiffs_offset = int(row[3],base=16) + elif(row[0] == 'spiffs'): + fs_offset = int(row[3],base=16) + esp32_build_filesystem(row[4]) new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") @@ -111,10 +128,32 @@ def esp32_create_combined_bin(source, target, env): if("safeboot" not in firmware_name): print(f" - {hex(app_offset)} | {firmware_name}") cmd += [hex(app_offset), firmware_name] + else: print("Upload new safeboot binary only") - #print('Using esptool.py arguments: %s' % ' '.join(cmd)) + if(fs_offset != -1): + fs_bin = join(env.subst("$BUILD_DIR"),"littlefs.bin") + if exists(fs_bin): + print(f" - {hex(fs_offset)}| {fs_bin}") + cmd += [hex(fs_offset), fs_bin] + env.Replace( + UPLOADERFLAGS=[ + "--chip", chip, + "--port", '"$UPLOAD_PORT"', + "--baud", "$UPLOAD_SPEED", + "--before", "default_reset", + "--after", "hard_reset", + "write_flash", "-z", + "--flash_mode", "${__get_board_flash_mode(__env__)}", + "--flash_freq", "${__get_board_f_flash(__env__)}", + "--flash_size", flash_size + ], + UPLOADCMD='"$PYTHONEXE" "$UPLOADER" $UPLOADERFLAGS ' + " ".join(cmd[7:]) + ) + print("Will use custom upload command for flashing operation to add file system defined for this build target.") + + # print('Using esptool.py arguments: %s' % ' '.join(cmd)) esptool.main(cmd) From aa1a0179a41b651b563f9b120481ab6617b5a819 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 11 May 2022 22:50:17 +0200 Subject: [PATCH 212/376] OpenHASP event value --- .../berry_tasmota/src/be_lv_openhasp.c | 614 ++++++++++-------- tasmota/berry/openhasp/openhasp.tapp | Bin 57378 -> 57664 bytes tasmota/berry/openhasp/openhasp_demo.tapp | Bin 188184 -> 188470 bytes tasmota/berry/openhasp_src/openhasp.tapp | Bin 57378 -> 57664 bytes .../openhasp_src/openhasp_core/openhasp.be | 213 +++--- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 188184 -> 188470 bytes 6 files changed, 451 insertions(+), 376 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index c69a10b02..b8d1b05e8 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -957,7 +957,7 @@ be_local_closure(lvh_obj_set_text, /* name */ ********************************************************************/ be_local_closure(lvh_obj_event_cb, /* name */ be_nested_proto( - 12, /* nstack */ + 14, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -997,7 +997,7 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 6), + be_local_const_upval(1, 7), }), 0, /* has sup protos */ NULL, /* no sub protos */ @@ -1018,7 +1018,7 @@ be_local_closure(lvh_obj_event_cb, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[20]) { /* constants */ /* K0 */ be_nested_str_literal("_page"), /* K1 */ be_nested_str_literal("_oh"), /* K2 */ be_nested_str_literal("code"), @@ -1032,14 +1032,17 @@ be_local_closure(lvh_obj_event_cb, /* name */ /* K10 */ be_nested_str_literal("_event_map"), /* K11 */ be_nested_str_literal("find"), /* K12 */ be_nested_str_literal("string"), - /* K13 */ be_nested_str_literal("format"), - /* K14 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":\"%s\"}}"), - /* K15 */ be_nested_str_literal("_page_id"), - /* K16 */ be_nested_str_literal("id"), + /* K13 */ be_nested_str_literal("EVENT_VALUE_CHANGED"), + /* K14 */ be_nested_str_literal("val"), + /* K15 */ be_nested_str_literal("format"), + /* K16 */ be_nested_str_literal(",\"val\":%i"), + /* K17 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":{\"event\":\"%s\"%s}}}"), + /* K18 */ be_nested_str_literal("_page_id"), + /* K19 */ be_nested_str_literal("id"), }), be_str_literal("event_cb"), &be_const_str_solidified, - ( &(const binstruction[38]) { /* code */ + ( &(const binstruction[58]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x88080501, // 0001 GETMBR R2 R2 K1 0x880C0302, // 0002 GETMBR R3 R1 K2 @@ -1061,23 +1064,43 @@ be_local_closure(lvh_obj_event_cb, /* name */ 0x7C100400, // 0012 CALL R4 2 0x4C140000, // 0013 LDNIL R5 0x20140805, // 0014 NE R5 R4 R5 - 0x7816000D, // 0015 JMPF R5 #0024 + 0x78160021, // 0015 JMPF R5 #0038 0xA4161800, // 0016 IMPORT R5 K12 - 0x8C180B0D, // 0017 GETMET R6 R5 K13 - 0x5820000E, // 0018 LDCONST R8 K14 - 0x88240100, // 0019 GETMBR R9 R0 K0 - 0x8824130F, // 001A GETMBR R9 R9 K15 - 0x88280110, // 001B GETMBR R10 R0 K16 - 0x5C2C0800, // 001C MOVE R11 R4 - 0x7C180A00, // 001D CALL R6 5 - 0xB81E0E00, // 001E GETNGBL R7 K7 - 0x8C1C0F08, // 001F GETMET R7 R7 K8 - 0x58240009, // 0020 LDCONST R9 K9 - 0x84280001, // 0021 CLOSURE R10 P1 - 0x7C1C0600, // 0022 CALL R7 3 - 0xA0140000, // 0023 CLOSE R5 - 0xA0000000, // 0024 CLOSE R0 - 0x80000000, // 0025 RET 0 + 0x58180004, // 0017 LDCONST R6 K4 + 0x881C0302, // 0018 GETMBR R7 R1 K2 + 0xB8220A00, // 0019 GETNGBL R8 K5 + 0x8820110D, // 001A GETMBR R8 R8 K13 + 0x1C1C0E08, // 001B EQ R7 R7 R8 + 0x781E000C, // 001C JMPF R7 #002A + 0xA8020007, // 001D EXBLK 0 #0026 + 0x881C010E, // 001E GETMBR R7 R0 K14 + 0x8C200B0F, // 001F GETMET R8 R5 K15 + 0x58280010, // 0020 LDCONST R10 K16 + 0x5C2C0E00, // 0021 MOVE R11 R7 + 0x7C200600, // 0022 CALL R8 3 + 0x5C181000, // 0023 MOVE R6 R8 + 0xA8040001, // 0024 EXBLK 1 1 + 0x70020003, // 0025 JMP #002A + 0xAC1C0000, // 0026 CATCH R7 0 0 + 0x70020000, // 0027 JMP #0029 + 0x70020000, // 0028 JMP #002A + 0xB0080000, // 0029 RAISE 2 R0 R0 + 0x8C1C0B0F, // 002A GETMET R7 R5 K15 + 0x58240011, // 002B LDCONST R9 K17 + 0x88280100, // 002C GETMBR R10 R0 K0 + 0x88281512, // 002D GETMBR R10 R10 K18 + 0x882C0113, // 002E GETMBR R11 R0 K19 + 0x5C300800, // 002F MOVE R12 R4 + 0x5C340C00, // 0030 MOVE R13 R6 + 0x7C1C0C00, // 0031 CALL R7 6 + 0xB8220E00, // 0032 GETNGBL R8 K7 + 0x8C201108, // 0033 GETMET R8 R8 K8 + 0x58280009, // 0034 LDCONST R10 K9 + 0x842C0001, // 0035 CLOSURE R11 P1 + 0x7C200600, // 0036 CALL R8 3 + 0xA0140000, // 0037 CLOSE R5 + 0xA0000000, // 0038 CLOSE R0 + 0x80000000, // 0039 RET 0 }) ) ); @@ -1809,7 +1832,7 @@ be_local_closure(lvh_obj_set_enabled, /* name */ ********************************************************************/ be_local_closure(lvh_obj_setmember, /* name */ be_nested_proto( - 11, /* nstack */ + 12, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1817,109 +1840,112 @@ be_local_closure(lvh_obj_setmember, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_literal("_attr_ignore"), - /* K1 */ be_nested_str_literal("find"), - /* K2 */ be_nested_str_literal("_attr_map"), - /* K3 */ be_nested_str_literal("contains"), - /* K4 */ be_nested_str_literal("string"), - /* K5 */ be_nested_str_literal("introspect"), - /* K6 */ be_nested_str_literal("get"), - /* K7 */ be_nested_str_literal("_lv_obj"), - /* K8 */ be_nested_str_literal("set_"), - /* K9 */ be_nested_str_literal("is_color_attribute"), - /* K10 */ be_nested_str_literal("parse_color"), - /* K11 */ be_nested_str_literal("function"), - /* K12 */ be_nested_str_literal("style_"), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_literal("HSP: Could not find function set_"), - /* K15 */ be_nested_str_literal("HSP: unknown attribute:"), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_literal("string"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_literal("set_"), + /* K5 */ be_nested_str_literal("get_"), + /* K6 */ be_nested_str_literal("_attr_ignore"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("get"), + /* K9 */ be_nested_str_literal("function"), + /* K10 */ be_nested_str_literal("_attr_map"), + /* K11 */ be_nested_str_literal("contains"), + /* K12 */ be_nested_str_literal("_lv_obj"), + /* K13 */ be_nested_str_literal("is_color_attribute"), + /* K14 */ be_nested_str_literal("parse_color"), + /* K15 */ be_nested_str_literal("style_"), + /* K16 */ be_nested_str_literal("HSP: Could not find function set_"), + /* K17 */ be_nested_str_literal("HSP: unknown attribute:"), }), be_str_literal("setmember"), &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x4C100000, // 0004 LDNIL R4 - 0x200C0604, // 0005 NE R3 R3 R4 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x880C0102, // 0008 GETMBR R3 R0 K2 - 0x8C0C0703, // 0009 GETMET R3 R3 K3 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C0C0400, // 000B CALL R3 2 - 0x780E003F, // 000C JMPF R3 #004D - 0xA40E0800, // 000D IMPORT R3 K4 - 0xA4120A00, // 000E IMPORT R4 K5 - 0x88140102, // 000F GETMBR R5 R0 K2 - 0x94140A01, // 0010 GETIDX R5 R5 R1 - 0x7816002B, // 0011 JMPF R5 #003E - 0x8C180906, // 0012 GETMET R6 R4 K6 - 0x88200107, // 0013 GETMBR R8 R0 K7 - 0x00261005, // 0014 ADD R9 K8 R5 - 0x7C180600, // 0015 CALL R6 3 - 0x601C0004, // 0016 GETGBL R7 G4 - 0x5C200A00, // 0017 MOVE R8 R5 - 0x7C1C0200, // 0018 CALL R7 1 - 0x1C1C0F04, // 0019 EQ R7 R7 K4 - 0x781E0007, // 001A JMPF R7 #0023 - 0x8C1C0109, // 001B GETMET R7 R0 K9 - 0x5C240A00, // 001C MOVE R9 R5 + ( &(const binstruction[83]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x40160503, // 0002 CONNECT R5 K2 K3 + 0x94140205, // 0003 GETIDX R5 R1 R5 + 0x1C180B04, // 0004 EQ R6 R5 K4 + 0x741A0001, // 0005 JMPT R6 #0008 + 0x1C180B05, // 0006 EQ R6 R5 K5 + 0x781A0000, // 0007 JMPF R6 #0009 + 0x80000C00, // 0008 RET 0 + 0x88180106, // 0009 GETMBR R6 R0 K6 + 0x8C180D07, // 000A GETMET R6 R6 K7 + 0x5C200200, // 000B MOVE R8 R1 + 0x7C180400, // 000C CALL R6 2 + 0x4C1C0000, // 000D LDNIL R7 + 0x20180C07, // 000E NE R6 R6 R7 + 0x781A0000, // 000F JMPF R6 #0011 + 0x80000C00, // 0010 RET 0 + 0x8C180908, // 0011 GETMET R6 R4 K8 + 0x5C200000, // 0012 MOVE R8 R0 + 0x00260801, // 0013 ADD R9 K4 R1 + 0x7C180600, // 0014 CALL R6 3 + 0x601C0004, // 0015 GETGBL R7 G4 + 0x5C200C00, // 0016 MOVE R8 R6 + 0x7C1C0200, // 0017 CALL R7 1 + 0x1C1C0F09, // 0018 EQ R7 R7 K9 + 0x781E0004, // 0019 JMPF R7 #001F + 0x5C1C0C00, // 001A MOVE R7 R6 + 0x5C200000, // 001B MOVE R8 R0 + 0x5C240400, // 001C MOVE R9 R2 0x7C1C0400, // 001D CALL R7 2 - 0x781E0003, // 001E JMPF R7 #0023 - 0x8C1C010A, // 001F GETMET R7 R0 K10 - 0x5C240400, // 0020 MOVE R9 R2 - 0x7C1C0400, // 0021 CALL R7 2 - 0x5C080E00, // 0022 MOVE R2 R7 - 0x601C0004, // 0023 GETGBL R7 G4 - 0x5C200C00, // 0024 MOVE R8 R6 - 0x7C1C0200, // 0025 CALL R7 1 - 0x1C1C0F0B, // 0026 EQ R7 R7 K11 - 0x781E0011, // 0027 JMPF R7 #003A - 0x8C1C0701, // 0028 GETMET R7 R3 K1 - 0x5C240A00, // 0029 MOVE R9 R5 - 0x5828000C, // 002A LDCONST R10 K12 - 0x7C1C0600, // 002B CALL R7 3 - 0x1C1C0F0D, // 002C EQ R7 R7 K13 - 0x781E0005, // 002D JMPF R7 #0034 - 0x5C1C0C00, // 002E MOVE R7 R6 - 0x88200107, // 002F GETMBR R8 R0 K7 - 0x5C240400, // 0030 MOVE R9 R2 - 0x5828000D, // 0031 LDCONST R10 K13 - 0x7C1C0600, // 0032 CALL R7 3 - 0x70020003, // 0033 JMP #0038 - 0x5C1C0C00, // 0034 MOVE R7 R6 - 0x88200107, // 0035 GETMBR R8 R0 K7 - 0x5C240400, // 0036 MOVE R9 R2 - 0x7C1C0400, // 0037 CALL R7 2 - 0x80000E00, // 0038 RET 0 - 0x70020002, // 0039 JMP #003D - 0x601C0001, // 003A GETGBL R7 G1 - 0x00221C05, // 003B ADD R8 K14 R5 - 0x7C1C0200, // 003C CALL R7 1 - 0x7002000D, // 003D JMP #004C - 0x8C180906, // 003E GETMET R6 R4 K6 - 0x5C200000, // 003F MOVE R8 R0 - 0x00261001, // 0040 ADD R9 K8 R1 - 0x7C180600, // 0041 CALL R6 3 - 0x601C0004, // 0042 GETGBL R7 G4 - 0x5C200C00, // 0043 MOVE R8 R6 - 0x7C1C0200, // 0044 CALL R7 1 - 0x1C1C0F0B, // 0045 EQ R7 R7 K11 - 0x781E0004, // 0046 JMPF R7 #004C - 0x5C1C0C00, // 0047 MOVE R7 R6 - 0x5C200000, // 0048 MOVE R8 R0 - 0x5C240400, // 0049 MOVE R9 R2 - 0x7C1C0400, // 004A CALL R7 2 - 0x80000E00, // 004B RET 0 - 0x70020003, // 004C JMP #0051 - 0x600C0001, // 004D GETGBL R3 G1 - 0x5810000F, // 004E LDCONST R4 K15 - 0x5C140200, // 004F MOVE R5 R1 - 0x7C0C0400, // 0050 CALL R3 2 - 0x80000000, // 0051 RET 0 + 0x80000E00, // 001E RET 0 + 0x881C010A, // 001F GETMBR R7 R0 K10 + 0x8C1C0F0B, // 0020 GETMET R7 R7 K11 + 0x5C240200, // 0021 MOVE R9 R1 + 0x7C1C0400, // 0022 CALL R7 2 + 0x781E0029, // 0023 JMPF R7 #004E + 0x881C010A, // 0024 GETMBR R7 R0 K10 + 0x941C0E01, // 0025 GETIDX R7 R7 R1 + 0x8C200908, // 0026 GETMET R8 R4 K8 + 0x8828010C, // 0027 GETMBR R10 R0 K12 + 0x002E0807, // 0028 ADD R11 K4 R7 + 0x7C200600, // 0029 CALL R8 3 + 0x5C181000, // 002A MOVE R6 R8 + 0x8C20010D, // 002B GETMET R8 R0 K13 + 0x5C280E00, // 002C MOVE R10 R7 + 0x7C200400, // 002D CALL R8 2 + 0x78220003, // 002E JMPF R8 #0033 + 0x8C20010E, // 002F GETMET R8 R0 K14 + 0x5C280400, // 0030 MOVE R10 R2 + 0x7C200400, // 0031 CALL R8 2 + 0x5C081000, // 0032 MOVE R2 R8 + 0x60200004, // 0033 GETGBL R8 G4 + 0x5C240C00, // 0034 MOVE R9 R6 + 0x7C200200, // 0035 CALL R8 1 + 0x1C201109, // 0036 EQ R8 R8 K9 + 0x78220011, // 0037 JMPF R8 #004A + 0x8C200707, // 0038 GETMET R8 R3 K7 + 0x5C280E00, // 0039 MOVE R10 R7 + 0x582C000F, // 003A LDCONST R11 K15 + 0x7C200600, // 003B CALL R8 3 + 0x1C201102, // 003C EQ R8 R8 K2 + 0x78220005, // 003D JMPF R8 #0044 + 0x5C200C00, // 003E MOVE R8 R6 + 0x8824010C, // 003F GETMBR R9 R0 K12 + 0x5C280400, // 0040 MOVE R10 R2 + 0x582C0002, // 0041 LDCONST R11 K2 + 0x7C200600, // 0042 CALL R8 3 + 0x70020003, // 0043 JMP #0048 + 0x5C200C00, // 0044 MOVE R8 R6 + 0x8824010C, // 0045 GETMBR R9 R0 K12 + 0x5C280400, // 0046 MOVE R10 R2 + 0x7C200400, // 0047 CALL R8 2 + 0x80001000, // 0048 RET 0 + 0x70020002, // 0049 JMP #004D + 0x60200001, // 004A GETGBL R8 G1 + 0x00262007, // 004B ADD R9 K16 R7 + 0x7C200200, // 004C CALL R8 1 + 0x70020003, // 004D JMP #0052 + 0x601C0001, // 004E GETGBL R7 G1 + 0x58200011, // 004F LDCONST R8 K17 + 0x5C240200, // 0050 MOVE R9 R1 + 0x7C1C0400, // 0051 CALL R7 2 + 0x80000000, // 0052 RET 0 }) ) ); @@ -2440,7 +2466,7 @@ be_local_closure(lvh_obj_get_val, /* name */ ********************************************************************/ be_local_closure(lvh_obj_member, /* name */ be_nested_proto( - 10, /* nstack */ + 11, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2448,90 +2474,96 @@ be_local_closure(lvh_obj_member, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_literal("string"), - /* K1 */ be_nested_str_literal("_attr_ignore"), - /* K2 */ be_nested_str_literal("find"), - /* K3 */ be_nested_str_literal("_attr_map"), - /* K4 */ be_nested_str_literal("contains"), - /* K5 */ be_nested_str_literal("introspect"), - /* K6 */ be_nested_str_literal("get"), - /* K7 */ be_nested_str_literal("get_"), - /* K8 */ be_nested_str_literal("function"), - /* K9 */ be_nested_str_literal("_lv_obj"), - /* K10 */ be_nested_str_literal("style_"), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_literal("unknown attribute "), - /* K13 */ be_nested_str_literal("value_error"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_literal("set_"), + /* K5 */ be_nested_str_literal("get_"), + /* K6 */ be_nested_str_literal("_attr_ignore"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("get"), + /* K9 */ be_nested_str_literal("function"), + /* K10 */ be_nested_str_literal("_attr_map"), + /* K11 */ be_nested_str_literal("contains"), + /* K12 */ be_nested_str_literal("_lv_obj"), + /* K13 */ be_nested_str_literal("style_"), + /* K14 */ be_nested_str_literal("unknown attribute "), + /* K15 */ be_nested_str_literal("value_error"), }), be_str_literal("member"), &be_const_str_solidified, - ( &(const binstruction[65]) { /* code */ + ( &(const binstruction[69]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C0C0400, // 0004 CALL R3 2 - 0x4C100000, // 0005 LDNIL R4 - 0x200C0604, // 0006 NE R3 R3 R4 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x880C0103, // 0009 GETMBR R3 R0 K3 - 0x8C0C0704, // 000A GETMET R3 R3 K4 - 0x5C140200, // 000B MOVE R5 R1 - 0x7C0C0400, // 000C CALL R3 2 - 0x780E002C, // 000D JMPF R3 #003B - 0xA40E0A00, // 000E IMPORT R3 K5 - 0x88100103, // 000F GETMBR R4 R0 K3 - 0x94100801, // 0010 GETIDX R4 R4 R1 - 0x4C140000, // 0011 LDNIL R5 - 0x1C140805, // 0012 EQ R5 R4 R5 - 0x7816000D, // 0013 JMPF R5 #0022 - 0x8C140706, // 0014 GETMET R5 R3 K6 - 0x5C1C0000, // 0015 MOVE R7 R0 - 0x00220E01, // 0016 ADD R8 K7 R1 - 0x7C140600, // 0017 CALL R5 3 - 0x60180004, // 0018 GETGBL R6 G4 - 0x5C1C0A00, // 0019 MOVE R7 R5 - 0x7C180200, // 001A CALL R6 1 - 0x1C180D08, // 001B EQ R6 R6 K8 - 0x781A0003, // 001C JMPF R6 #0021 - 0x5C180A00, // 001D MOVE R6 R5 - 0x5C1C0000, // 001E MOVE R7 R0 - 0x7C180200, // 001F CALL R6 1 - 0x80040C00, // 0020 RET 1 R6 - 0x70020018, // 0021 JMP #003B - 0x8C140706, // 0022 GETMET R5 R3 K6 - 0x881C0109, // 0023 GETMBR R7 R0 K9 - 0x00220E04, // 0024 ADD R8 K7 R4 - 0x7C140600, // 0025 CALL R5 3 - 0x60180004, // 0026 GETGBL R6 G4 - 0x5C1C0A00, // 0027 MOVE R7 R5 - 0x7C180200, // 0028 CALL R6 1 - 0x1C180D08, // 0029 EQ R6 R6 K8 - 0x781A000F, // 002A JMPF R6 #003B - 0x8C180502, // 002B GETMET R6 R2 K2 - 0x5C200800, // 002C MOVE R8 R4 - 0x5824000A, // 002D LDCONST R9 K10 - 0x7C180600, // 002E CALL R6 3 - 0x1C180D0B, // 002F EQ R6 R6 K11 - 0x781A0005, // 0030 JMPF R6 #0037 - 0x5C180A00, // 0031 MOVE R6 R5 - 0x881C0109, // 0032 GETMBR R7 R0 K9 - 0x5820000B, // 0033 LDCONST R8 K11 - 0x7C180400, // 0034 CALL R6 2 - 0x80040C00, // 0035 RET 1 R6 - 0x70020003, // 0036 JMP #003B - 0x5C180A00, // 0037 MOVE R6 R5 - 0x881C0109, // 0038 GETMBR R7 R0 K9 - 0x7C180200, // 0039 CALL R6 1 - 0x80040C00, // 003A RET 1 R6 - 0x600C0008, // 003B GETGBL R3 G8 - 0x5C100200, // 003C MOVE R4 R1 - 0x7C0C0200, // 003D CALL R3 1 - 0x000E1803, // 003E ADD R3 K12 R3 - 0xB0061A03, // 003F RAISE 1 K13 R3 - 0x80000000, // 0040 RET 0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x40120503, // 0002 CONNECT R4 K2 K3 + 0x94100204, // 0003 GETIDX R4 R1 R4 + 0x1C140904, // 0004 EQ R5 R4 K4 + 0x74160001, // 0005 JMPT R5 #0008 + 0x1C140905, // 0006 EQ R5 R4 K5 + 0x78160000, // 0007 JMPF R5 #0009 + 0x80000A00, // 0008 RET 0 + 0x88140106, // 0009 GETMBR R5 R0 K6 + 0x8C140B07, // 000A GETMET R5 R5 K7 + 0x5C1C0200, // 000B MOVE R7 R1 + 0x7C140400, // 000C CALL R5 2 + 0x4C180000, // 000D LDNIL R6 + 0x20140A06, // 000E NE R5 R5 R6 + 0x78160000, // 000F JMPF R5 #0011 + 0x80000A00, // 0010 RET 0 + 0x8C140708, // 0011 GETMET R5 R3 K8 + 0x5C1C0000, // 0012 MOVE R7 R0 + 0x00220A01, // 0013 ADD R8 K5 R1 + 0x7C140600, // 0014 CALL R5 3 + 0x60180004, // 0015 GETGBL R6 G4 + 0x5C1C0A00, // 0016 MOVE R7 R5 + 0x7C180200, // 0017 CALL R6 1 + 0x1C180D09, // 0018 EQ R6 R6 K9 + 0x781A0003, // 0019 JMPF R6 #001E + 0x5C180A00, // 001A MOVE R6 R5 + 0x5C1C0000, // 001B MOVE R7 R0 + 0x7C180200, // 001C CALL R6 1 + 0x80040C00, // 001D RET 1 R6 + 0x8818010A, // 001E GETMBR R6 R0 K10 + 0x8C180D0B, // 001F GETMET R6 R6 K11 + 0x5C200200, // 0020 MOVE R8 R1 + 0x7C180400, // 0021 CALL R6 2 + 0x781A001B, // 0022 JMPF R6 #003F + 0x8818010A, // 0023 GETMBR R6 R0 K10 + 0x94180C01, // 0024 GETIDX R6 R6 R1 + 0x8C1C0708, // 0025 GETMET R7 R3 K8 + 0x8824010C, // 0026 GETMBR R9 R0 K12 + 0x002A0A06, // 0027 ADD R10 K5 R6 + 0x7C1C0600, // 0028 CALL R7 3 + 0x5C140E00, // 0029 MOVE R5 R7 + 0x601C0004, // 002A GETGBL R7 G4 + 0x5C200A00, // 002B MOVE R8 R5 + 0x7C1C0200, // 002C CALL R7 1 + 0x1C1C0F09, // 002D EQ R7 R7 K9 + 0x781E000F, // 002E JMPF R7 #003F + 0x8C1C0507, // 002F GETMET R7 R2 K7 + 0x5C240C00, // 0030 MOVE R9 R6 + 0x5828000D, // 0031 LDCONST R10 K13 + 0x7C1C0600, // 0032 CALL R7 3 + 0x1C1C0F02, // 0033 EQ R7 R7 K2 + 0x781E0005, // 0034 JMPF R7 #003B + 0x5C1C0A00, // 0035 MOVE R7 R5 + 0x8820010C, // 0036 GETMBR R8 R0 K12 + 0x58240002, // 0037 LDCONST R9 K2 + 0x7C1C0400, // 0038 CALL R7 2 + 0x80040E00, // 0039 RET 1 R7 + 0x70020003, // 003A JMP #003F + 0x5C1C0A00, // 003B MOVE R7 R5 + 0x8820010C, // 003C GETMBR R8 R0 K12 + 0x7C1C0200, // 003D CALL R7 1 + 0x80040E00, // 003E RET 1 R7 + 0x60180008, // 003F GETGBL R6 G8 + 0x5C1C0200, // 0040 MOVE R7 R1 + 0x7C180200, // 0041 CALL R6 1 + 0x001A1C06, // 0042 ADD R6 K14 R6 + 0xB0061E06, // 0043 RAISE 1 K15 R6 + 0x80000000, // 0044 RET 0 }) ) ); @@ -3733,73 +3765,34 @@ be_local_class(lvh_obj, { be_const_key_literal("get_value_ofs_x", 16), be_const_closure(lvh_obj_get_value_ofs_x_closure) }, { be_const_key_literal("set_line_width", -1), be_const_closure(lvh_obj_set_line_width_closure) }, { be_const_key_literal("_attr_map", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { - be_const_map( * be_nested_map(65, + be_const_map( * be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("x", -1), be_nested_str_literal("x") }, - { be_const_key_literal("pad_left2", -1), be_const_nil() }, - { be_const_key_literal("end_angle", -1), be_nested_str_literal("bg_end_angle") }, { be_const_key_literal("rotation", -1), be_nested_str_literal("rotation") }, - { be_const_key_literal("radius", -1), be_nested_str_literal("style_radius") }, - { be_const_key_literal("value_ofs_y", -1), be_const_nil() }, - { be_const_key_literal("val", 38), be_const_nil() }, - { be_const_key_literal("line_width", -1), be_const_nil() }, - { be_const_key_literal("speed", 57), be_const_nil() }, - { be_const_key_literal("radius2", -1), be_const_nil() }, - { be_const_key_literal("qr_text", -1), be_const_nil() }, - { be_const_key_literal("text_rule_formula", 42), be_const_nil() }, - { be_const_key_literal("bg_grad_dir", -1), be_nested_str_literal("style_bg_grad_dir") }, - { be_const_key_literal("mode", 59), be_const_nil() }, { be_const_key_literal("bg_opa", -1), be_nested_str_literal("style_bg_opa") }, - { be_const_key_literal("text", -1), be_const_nil() }, - { be_const_key_literal("value_color", -1), be_const_nil() }, - { be_const_key_literal("enabled", 29), be_const_nil() }, - { be_const_key_literal("text_font", -1), be_const_nil() }, - { be_const_key_literal("text_rule_format", -1), be_const_nil() }, - { be_const_key_literal("value_str", 3), be_const_nil() }, - { be_const_key_literal("border_width", 62), be_nested_str_literal("style_border_width") }, - { be_const_key_literal("max", -1), be_const_nil() }, - { be_const_key_literal("angle", -1), be_const_nil() }, - { be_const_key_literal("text_rule", 21), be_const_nil() }, - { be_const_key_literal("min", 19), be_const_nil() }, - { be_const_key_literal("start_angle", 32), be_nested_str_literal("bg_start_angle") }, - { be_const_key_literal("qr_light_color", -1), be_const_nil() }, + { be_const_key_literal("end_angle", 3), be_nested_str_literal("bg_end_angle") }, + { be_const_key_literal("w", 18), be_nested_str_literal("width") }, + { be_const_key_literal("src", 6), be_nested_str_literal("src") }, + { be_const_key_literal("x", -1), be_nested_str_literal("x") }, + { be_const_key_literal("border_color", -1), be_nested_str_literal("style_border_color") }, + { be_const_key_literal("bg_grad_color", 0), be_nested_str_literal("style_bg_grad_color") }, + { be_const_key_literal("pad_all", -1), be_nested_str_literal("style_pad_all") }, + { be_const_key_literal("bg_color", 20), be_nested_str_literal("style_bg_color") }, + { be_const_key_literal("y", 8), be_nested_str_literal("y") }, + { be_const_key_literal("line_color", -1), be_nested_str_literal("style_line_color") }, + { be_const_key_literal("image_recolor_opa", 10), be_nested_str_literal("style_img_recolor_opa") }, + { be_const_key_literal("start_angle", 5), be_nested_str_literal("bg_start_angle") }, + { be_const_key_literal("end_angle1", 11), be_nested_str_literal("end_angle") }, { be_const_key_literal("border_side", -1), be_nested_str_literal("style_border_side") }, - { be_const_key_literal("src", -1), be_nested_str_literal("src") }, - { be_const_key_literal("w", 35), be_nested_str_literal("width") }, - { be_const_key_literal("value_font", 18), be_const_nil() }, - { be_const_key_literal("pad_bottom2", -1), be_const_nil() }, - { be_const_key_literal("value_ofs_x", -1), be_const_nil() }, - { be_const_key_literal("pad_right", 23), be_nested_str_literal("style_pad_right") }, + { be_const_key_literal("pad_bottom", 9), be_nested_str_literal("style_pad_bottom") }, + { be_const_key_literal("radius", 4), be_nested_str_literal("style_radius") }, { be_const_key_literal("pad_left", -1), be_nested_str_literal("style_pad_left") }, - { be_const_key_literal("h", -1), be_nested_str_literal("height") }, - { be_const_key_literal("line_color", 43), be_nested_str_literal("style_line_color") }, { be_const_key_literal("image_recolor", -1), be_nested_str_literal("style_img_recolor") }, - { be_const_key_literal("qr_dark_color", 22), be_const_nil() }, + { be_const_key_literal("border_width", -1), be_nested_str_literal("style_border_width") }, + { be_const_key_literal("pad_right", -1), be_nested_str_literal("style_pad_right") }, { be_const_key_literal("start_angle1", -1), be_nested_str_literal("start_angle") }, - { be_const_key_literal("align", 30), be_const_nil() }, - { be_const_key_literal("text_color", -1), be_const_nil() }, - { be_const_key_literal("y", -1), be_nested_str_literal("y") }, - { be_const_key_literal("val_rule", 15), be_const_nil() }, - { be_const_key_literal("qr_size", 49), be_const_nil() }, - { be_const_key_literal("bg_grad_color", -1), be_nested_str_literal("style_bg_grad_color") }, - { be_const_key_literal("asjustable", 54), be_const_nil() }, - { be_const_key_literal("hidden", 40), be_const_nil() }, - { be_const_key_literal("pad_top2", -1), be_const_nil() }, - { be_const_key_literal("pad_top", -1), be_nested_str_literal("style_pad_top") }, - { be_const_key_literal("end_angle1", 37), be_nested_str_literal("end_angle") }, - { be_const_key_literal("click", -1), be_const_nil() }, - { be_const_key_literal("pad_right2", -1), be_const_nil() }, - { be_const_key_literal("action", -1), be_const_nil() }, - { be_const_key_literal("image_recolor_opa", -1), be_nested_str_literal("style_img_recolor_opa") }, - { be_const_key_literal("border_color", 33), be_nested_str_literal("style_border_color") }, - { be_const_key_literal("toggle", -1), be_const_nil() }, - { be_const_key_literal("pad_all2", -1), be_const_nil() }, - { be_const_key_literal("type", -1), be_const_nil() }, - { be_const_key_literal("line_width1", -1), be_const_nil() }, - { be_const_key_literal("val_rule_formula", -1), be_const_nil() }, - { be_const_key_literal("pad_bottom", -1), be_nested_str_literal("style_pad_bottom") }, - { be_const_key_literal("bg_color", -1), be_nested_str_literal("style_bg_color") }, - { be_const_key_literal("pad_all", 55), be_nested_str_literal("style_pad_all") }, + { be_const_key_literal("h", -1), be_nested_str_literal("height") }, + { be_const_key_literal("pad_top", 16), be_nested_str_literal("style_pad_top") }, + { be_const_key_literal("bg_grad_dir", 14), be_nested_str_literal("style_bg_grad_dir") }, })) ) } )) }, { be_const_key_literal("set_adjustable", -1), be_const_closure(lvh_obj_set_adjustable_closure) }, { be_const_key_literal("_val_rule_formula", -1), be_const_var(6) }, @@ -4339,9 +4332,9 @@ void be_load_lvh_img_class(bvm *vm) { } /******************************************************************** -** Solidified function: set_val +** Solidified function: set_options ********************************************************************/ -be_local_closure(lvh_roller_set_val, /* name */ +be_local_closure(lvh_roller_set_options, /* name */ be_nested_proto( 6, /* nstack */ 2, /* argc */ @@ -4351,20 +4344,22 @@ be_local_closure(lvh_roller_set_val, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("set_selected"), - /* K2 */ be_const_int(0), + /* K1 */ be_nested_str_literal("set_options"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("ROLLER_MODE_NORMAL"), }), - be_str_literal("set_val"), + be_str_literal("set_options"), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 7]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x5C100200, // 0002 MOVE R4 R1 - 0x58140002, // 0003 LDCONST R5 K2 - 0x7C080600, // 0004 CALL R2 3 - 0x80000000, // 0005 RET 0 + 0xB8160400, // 0003 GETNGBL R5 K2 + 0x88140B03, // 0004 GETMBR R5 R5 K3 + 0x7C080600, // 0005 CALL R2 3 + 0x80000000, // 0006 RET 0 }) ) ); @@ -4401,6 +4396,69 @@ be_local_closure(lvh_roller_get_val, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_val +********************************************************************/ +be_local_closure(lvh_roller_set_val, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_selected"), + /* K2 */ be_const_int(0), + }), + be_str_literal("set_val"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x7C080600, // 0004 CALL R2 3 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_options +********************************************************************/ +be_local_closure(lvh_roller_get_options, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_options"), + }), + be_str_literal("get_options"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: lvh_roller ********************************************************************/ @@ -4408,11 +4466,13 @@ extern const bclass be_class_lvh_obj; be_local_class(lvh_roller, 0, &be_class_lvh_obj, - be_nested_map(3, + be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("set_val", -1), be_const_closure(lvh_roller_set_val_closure) }, - { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_roller) }, + { be_const_key_literal("set_options", 3), be_const_closure(lvh_roller_set_options_closure) }, { be_const_key_literal("get_val", -1), be_const_closure(lvh_roller_get_val_closure) }, + { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_roller) }, + { be_const_key_literal("set_val", -1), be_const_closure(lvh_roller_set_val_closure) }, + { be_const_key_literal("get_options", -1), be_const_closure(lvh_roller_get_options_closure) }, })), be_str_literal("lvh_roller") ); diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/openhasp/openhasp.tapp index 9e8e495599f157de92025b41329f09114d40aa15..954fe51268a8a9c92107678059bb27d2be8400b8 100644 GIT binary patch delta 1776 zcmcIlUuauZ7*DKrHcglGrpa16m*dT{CYq(zP24(bTWy_SYfJ60rlvP1x#uRA+&}5P zXI;dODZV&i`0yb^5CmTYry>MjySX=gaUer*NCi;@#W&fDPQR0zRHH>i@RECye1Cr5 z@B4k{-23*Gt}9o&K0M*S@8yp!EniAq_(9tC`NZAp+wZe$%&JhgmMyYV%RRoX7}+f1 z-O&6G_4pI;W?;~tXfy&x{rKm*-YHy@!Kt1Ek!gwRwgqE-_rQhVAz`WLs>(dejo<)A z{uG?R_1?Zm5u(}$0^--blenG;3CEex^kD&H=w(YDCzftx0t7F#aaQMwW?Q_&4%?xb zyV~B8ZP-qy`*?U3Vb6w#aD6=-PhzO4{}tM#_0Fu%!;Pq*VU-Qm>ABdSMx@LAu@d@g zR8@*L=eGGkN0jF=n8tUrJ9@dYtAiRwXFO!3B364%igjbP4Qjwwl4#^(X&K@M=7m5!61^J%*BwQrPF2}Ow)x0@98e{)I6TX#tFR4b zamBP9Mka_XHwRL(&6>eXbWrDcqEb$q=!EDRX~t(oMKUo#jEyX8rDG7D890|99HY5S z%8V0UVZ>r*2zJ)W6|>%;j<8@Qml;~N)A=_xE_ZaRoYic{q&zi}5i-f+NqrG=k@J;q`I74{n_l1e3K>W z*0!U_F5`+!HaGulLo~EGjGuNa!Ys9!mJotdjxrQabJUX#n~dl#(Jg|9NQ}(TU7jJd zXgeJGS0Zrjnber3J1!@s3M*AbK28DyF^dwD@rtb?j>%L~5G7Yq=|TWrT#JMI>>)Un z8+@{*YKw`M5`*%(6RcXaEIhEgSD>{T&P?nAYC&Ob0Aec#;Z}aQ+rxzexd*Y#BD|B! z!1dfD#8#hxdLe}0QGXi3C*zIA>a-ueeSZjk{6yN*QX6hPH+b%USN9*pMfNbT5=MRH zV=WE-t;}NDf5>c5NyxnH$w54QaX+_rv!{F0```7xnNLAHC&RmI5^Swa-ll6Xq$FWV zIdHoG1x-07NcaQrR_>h7SvO}k9(pG}WZfZbdDfNXC#by?FUiQxJWM*f^ zndzDattkEg@qF={Qo#?Ff-oo|h895!LHyvypr}7U5EU#)iTBQClUdV&%iK9H&pG#b z&Ye5oq;A|veYTi9_3_P5SO0nU&2RtyIg#M2H!+cLTxvHI-z}>2rPXvIb!2N(9p2gu z_2hgSKkOL|zw9}i#NT_*W3lf%I(^UM?Y_AWAHeBJ$N!tnuZQpc_!wE$ZkWB5Zfx(^|8wJbE{`R)uIGAlaBAInEFE{Zk0Fr?^Q;-O1?4iIwmn$hsK#OV`Pv=K_-)Kr3W6L( z;geN@>uZy^DNSIpay%*E?9T8LmQNo9Vk?2sq7WT)??~;wI#_vpPVPlZ%HkW+W&B<$ z;yq~@=PMV}0JIH?k5}@n%B>4?;dZ5zZ0zf`v;;m4I;w#wLQ9BnV-Z9I%~E`yb6eno z3L;Cg^kS7yL6yiqa^~%14*kZ0Vrvsms-8NeUa6 z8U#+nCa*8@oy~iWOq%0))OQ`b#)QQ`)`t6lqnNEYH;-ULUY>{?!8Ml_%$C44n`zI{ z3`|esO?e7`kO9BAFo5^uGmOX+DF%VxN#`OmA69dCS2-IabXS>*qO&Vm{8t&ki|RR? z-|1iI7Ln6`Fb=*;HA6SF&Rpr9(~OwxbUQcNb(!=syEi%~7dNDnBT*C&0MH{HxLBB8 m5sv_bZ>yi=!>`^s_3A+P-xmM+^)dc)#S_25(e+;v?D-EC!OndE diff --git a/tasmota/berry/openhasp/openhasp_demo.tapp b/tasmota/berry/openhasp/openhasp_demo.tapp index 4a1e54df087ce2dd7dd34f09ce180420a230d535..9e69b789593547a6b03942abe5e5a04391f69377 100644 GIT binary patch delta 1949 zcmcgtT})e59B=<)P+BM-888Itp#^ENHe;LF#4+fgL9_A^Hi~?7m)rJ~Ug^EJ-g}B{ zvarObnfPEfJ=>G765^B2YGR1`=)#jes(Uj_)ZmMWiNW|kw|teMF)^|2?K$WF@%w-L z{`cN{8?H~jaNYXYUbpRj^TGPnb^qHx)jzV?>K}2>w!N{Uk*p-}DqPsMpR0VzN4&E6 zYTjgWB1^r!L{qXsC&7=eaJwAN+U-96c?AsM@<(y$b-i}1 znppOsq@F_iK9XGuMPiZBt5Pf+os39>FNH^kBSSmZgfQd!-d+IXnJ}F!P)1mWN<^ct z6J-8?&5~>g3FczbY&uk`d?H_y8H%xSoQgZpMyQ}~bFFz(!Q4e&qXaIJ9fS=i{}n`=

zSqNq)!YJwWxAXyApm5JavgQk^bENgN0R48;NZYi*xyK?NkNtxs& zD=P=Ys--M9pWs1eSbHMRDAD8=l@i4yibn7@6ij9nlLd*K&<)1#T!9yR z(u!d+lFZQLqHxCMqZPWyM5QdFrw~M?DKanOz2XndJNYk@;NdS%!ZX|yyWuIQ=D*2M zbIymXE&mOcoXa5}f?`=C(b#ZwKTWE=C?aFSQW@Nu&=i@U)Xoagsv zA;{Nb&@TcuaQhUT;rHjDMjSnY%6dM~3T1`cQxLZEp(}Vkk_GJLJ_|Su{|6CmRulh` zi09Am5cqHT5HoRrk4vHf79V%xPjF8qFV%x1gx9pLFNpD;yp delta 1620 zcmZWqU1%It6waPBO*WhCCTV_6n!VmlnjM)$(gp%CNfS)|&Dc&d%J)PG@#z zJ2Tn-;4cV5{Xs=~N>M24lRk)6Tu@ql@wIP0Nvsb(D1s@eE)E#sp;VkCU+zKt#J2Rq4(~!>ilkGHrh`W z@8Y)SD+PQ~8=P#Vis~DVEzG0% zb{Dju(*|R$v}kA=t2ck!20d+**`k6LhUbsKAryA(j>2;FTom4o;IHkl*g}1F#SeqX zEocpc^cXCipo(Q|*>x?FAU3Bvw%=f_DAqO$%wfxK#h??T9T4vi6I91?+`0^$?toJR zG)!}JFL$Nh`A!EUleAi$<(Q%LB85t(=bs1J$xKonw z$&;{IeR>k^P2imh9CN&cjnfYLTfX zF?8Y=88O*aVtB-~oy#_UvkuZrDWdqkYZSJ9w&w{-h$3cXj-+|2$0O`5i3Av@*PcCH zmt-p?Mw}4dDO_Z#PbP_GxZ+S!%4MGT2wtAwjy#7WYKm(^@>|T$&6}0QJSj21=xB|2 z_{T7$5Hc`2%X={^WMM&EuNtc8Qxzy;zOaD_FNDmdrF;;DiFKg3w8mjpGceK;8lPW- zA-u5y3Cw1pL#l(Z72l{Z5=>f~DQs*HEs3)kev8j$;4FTafhoM7fo0UP{8Eo);RK$~ zLbrH*9N$=hboF)?<|FNUsx4ytIT)PYe_y0BQ7y&u1e<9gq9haXn92!xa-2ws*T&B) z&=<(s!&TfDZeLG)Z3uet?_n4bgbi$oWf2T<;*^?WkH_c!3UAo8(hG2#0emJ@Z7#4EHkzC+`H&^&4 zNvJoKBFysG{w8>3rW(4T{=ZSW>y!dU_xhb42&t*vBz=Kj8a-h73}3ar+KeJb4-}C} zMH2O8;B5|`f|06s0j?+Umm9EN{ryGwGk@?W@!JC!Yvw-*?D`qV;iVs;sj2Bdi(l!t diff --git a/tasmota/berry/openhasp_src/openhasp.tapp b/tasmota/berry/openhasp_src/openhasp.tapp index 9e8e495599f157de92025b41329f09114d40aa15..954fe51268a8a9c92107678059bb27d2be8400b8 100644 GIT binary patch delta 1776 zcmcIlUuauZ7*DKrHcglGrpa16m*dT{CYq(zP24(bTWy_SYfJ60rlvP1x#uRA+&}5P zXI;dODZV&i`0yb^5CmTYry>MjySX=gaUer*NCi;@#W&fDPQR0zRHH>i@RECye1Cr5 z@B4k{-23*Gt}9o&K0M*S@8yp!EniAq_(9tC`NZAp+wZe$%&JhgmMyYV%RRoX7}+f1 z-O&6G_4pI;W?;~tXfy&x{rKm*-YHy@!Kt1Ek!gwRwgqE-_rQhVAz`WLs>(dejo<)A z{uG?R_1?Zm5u(}$0^--blenG;3CEex^kD&H=w(YDCzftx0t7F#aaQMwW?Q_&4%?xb zyV~B8ZP-qy`*?U3Vb6w#aD6=-PhzO4{}tM#_0Fu%!;Pq*VU-Qm>ABdSMx@LAu@d@g zR8@*L=eGGkN0jF=n8tUrJ9@dYtAiRwXFO!3B364%igjbP4Qjwwl4#^(X&K@M=7m5!61^J%*BwQrPF2}Ow)x0@98e{)I6TX#tFR4b zamBP9Mka_XHwRL(&6>eXbWrDcqEb$q=!EDRX~t(oMKUo#jEyX8rDG7D890|99HY5S z%8V0UVZ>r*2zJ)W6|>%;j<8@Qml;~N)A=_xE_ZaRoYic{q&zi}5i-f+NqrG=k@J;q`I74{n_l1e3K>W z*0!U_F5`+!HaGulLo~EGjGuNa!Ys9!mJotdjxrQabJUX#n~dl#(Jg|9NQ}(TU7jJd zXgeJGS0Zrjnber3J1!@s3M*AbK28DyF^dwD@rtb?j>%L~5G7Yq=|TWrT#JMI>>)Un z8+@{*YKw`M5`*%(6RcXaEIhEgSD>{T&P?nAYC&Ob0Aec#;Z}aQ+rxzexd*Y#BD|B! z!1dfD#8#hxdLe}0QGXi3C*zIA>a-ueeSZjk{6yN*QX6hPH+b%USN9*pMfNbT5=MRH zV=WE-t;}NDf5>c5NyxnH$w54QaX+_rv!{F0```7xnNLAHC&RmI5^Swa-ll6Xq$FWV zIdHoG1x-07NcaQrR_>h7SvO}k9(pG}WZfZbdDfNXC#by?FUiQxJWM*f^ zndzDattkEg@qF={Qo#?Ff-oo|h895!LHyvypr}7U5EU#)iTBQClUdV&%iK9H&pG#b z&Ye5oq;A|veYTi9_3_P5SO0nU&2RtyIg#M2H!+cLTxvHI-z}>2rPXvIb!2N(9p2gu z_2hgSKkOL|zw9}i#NT_*W3lf%I(^UM?Y_AWAHeBJ$N!tnuZQpc_!wE$ZkWB5Zfx(^|8wJbE{`R)uIGAlaBAInEFE{Zk0Fr?^Q;-O1?4iIwmn$hsK#OV`Pv=K_-)Kr3W6L( z;geN@>uZy^DNSIpay%*E?9T8LmQNo9Vk?2sq7WT)??~;wI#_vpPVPlZ%HkW+W&B<$ z;yq~@=PMV}0JIH?k5}@n%B>4?;dZ5zZ0zf`v;;m4I;w#wLQ9BnV-Z9I%~E`yb6eno z3L;Cg^kS7yL6yiqa^~%14*kZ0Vrvsms-8NeUa6 z8U#+nCa*8@oy~iWOq%0))OQ`b#)QQ`)`t6lqnNEYH;-ULUY>{?!8Ml_%$C44n`zI{ z3`|esO?e7`kO9BAFo5^uGmOX+DF%VxN#`OmA69dCS2-IabXS>*qO&Vm{8t&ki|RR? z-|1iI7Ln6`Fb=*;HA6SF&Rpr9(~OwxbUQcNb(!=syEi%~7dNDnBT*C&0MH{HxLBB8 m5sv_bZ>yi=!>`^s_3A+P-xmM+^)dc)#S_25(e+;v?D-EC!OndE diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index 64aaa506b..f9b8b6ef4 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -71,8 +71,8 @@ class lvh_obj "w": "width", "h": "height", # arc - "asjustable": nil, - "mode": nil, + # "asjustable": nil, + # "mode": nil, "start_angle": "bg_start_angle", "start_angle1": "start_angle", "end_angle": "bg_end_angle", @@ -81,13 +81,13 @@ class lvh_obj "border_side": "style_border_side", "border_width": "style_border_width", "border_color": "style_border_color", - "line_width": nil, # depends on class - "line_width1": nil, # depends on class - "action": nil, # store the action in self.action - "hidden": nil, # apply to self - "enabled": nil, # apply to self - "click": nil, # synonym to enabled - "toggle": nil, + # "line_width": nil, # depends on class + # "line_width1": nil, # depends on class + # "action": nil, # store the action in self.action + # "hidden": nil, # apply to self + # "enabled": nil, # apply to self + # "click": nil, # synonym to enabled + # "toggle": nil, "bg_color": "style_bg_color", "bg_opa": "style_bg_opa", "bg_grad_color": "style_bg_grad_color", @@ -98,48 +98,50 @@ class lvh_obj "pad_top": "style_pad_top", "pad_bottom": "style_pad_bottom", "pad_all": "style_pad_all", # write-only - "type": nil, + # "type": nil, # below automatically create a sub-label - "text": nil, # apply to self - "value_str": nil, # synonym to 'text' - "align": nil, - "text_font": nil, - "value_font": nil, # synonym to text_font - "text_color": nil, - "value_color": nil, # synonym to text_color - "value_ofs_x": nil, - "value_ofs_y": nil, + # "text": nil, # apply to self + # "value_str": nil, # synonym to 'text' + # "align": nil, + # "text_font": nil, + # "value_font": nil, # synonym to text_font + # "text_color": nil, + # "value_color": nil, # synonym to text_color + # "value_ofs_x": nil, + # "value_ofs_y": nil, # - "min": nil, - "max": nil, - "val": nil, + # "min": nil, + # "max": nil, + # "val": nil, "rotation": "rotation", # img "src": "src", "image_recolor": "style_img_recolor", "image_recolor_opa": "style_img_recolor_opa", # spinner - "angle": nil, - "speed": nil, + # "angle": nil, + # "speed": nil, # padding of knob - "pad_top2": nil, - "pad_bottom2": nil, - "pad_left2": nil, - "pad_right2": nil, - "pad_all2": nil, - "radius2": nil, + # "pad_top2": nil, + # "pad_bottom2": nil, + # "pad_left2": nil, + # "pad_right2": nil, + # "pad_all2": nil, + # "radius2": nil, # rule based update of attributes # supporting both `val` and `text` - "val_rule": nil, - "val_rule_formula": nil, - "text_rule": nil, - "text_rule_formula": nil, - "text_rule_format": nil, + # "val_rule": nil, + # "val_rule_formula": nil, + # "text_rule": nil, + # "text_rule_formula": nil, + # "text_rule_format": nil, + # roller + # "options": nil, # qrcode - "qr_size": nil, - "qr_dark_color": nil, - "qr_light_color": nil, - "qr_text": nil, + # "qr_size": nil, + # "qr_dark_color": nil, + # "qr_light_color": nil, + # "qr_text": nil, } #==================================================================== @@ -317,9 +319,18 @@ class lvh_obj if event_hasp != nil import string - var val = string.format('{"hasp":{"p%ib%i":"%s"}}', self._page._page_id, self.id, event_hasp) + var tas_event_more = "" # complementary data + if event.code == lv.EVENT_VALUE_CHANGED + try + # try to get the new val + var val = self.val + tas_event_more = string.format(',"val":%i', val) + except .. + end + end + var tas_event = string.format('{"hasp":{"p%ib%i":{"event":"%s"%s}}}', self._page._page_id, self.id, event_hasp, tas_event_more) # print("val=",val) - tasmota.set_timer(0, /-> tasmota.publish_rule(val)) + tasmota.set_timer(0, /-> tasmota.publish_rule(tas_event)) end end @@ -641,37 +652,35 @@ class lvh_obj #- ------------------------------------------------------------# def member(k) import string - # ignore attributes - # print("member","self=",self,"k=",k) + import introspect + + # print("> getmember", k) + var prefix = k[0..3] + if prefix == "set_" || prefix == "get_" return end + # if attribute name is in ignore list, abort if self._attr_ignore.find(k) != nil return end - # check if the key is known + # first check if there is a method named `get_X()` + var f = introspect.get(self, "get_" + k) # call self method + if type(f) == 'function' + return f(self) + end + + # next check if there is a mapping to an LVGL attribute if self._attr_map.contains(k) - # attribute is known - # kv: (if string) the LVGL attribute name of the object - direct mapping - # kv: (if `nil`) call `get_` method of the object - import introspect var kv = self._attr_map[k] - if kv == nil - # call the object's `get_X()` - var f = introspect.get(self, "get_" + k) # call self method - if type(f) == 'function' - return f(self) - end - else - # call the native LVGL object method - var f = introspect.get(self._lv_obj, "get_" + kv) - if type(f) == 'function' # found and function, call it - if string.find(kv, "style_") == 0 - # style function need a selector as second parameter - return f(self._lv_obj, 0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#) - else - return f(self._lv_obj) - end + f = introspect.get(self._lv_obj, "get_" + kv) + if type(f) == 'function' # found and function, call it + if string.find(kv, "style_") == 0 + # style function need a selector as second parameter + return f(self._lv_obj, 0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#) + else + return f(self._lv_obj) end end end + # fallback to exception if attribute unknown or not a function raise "value_error", "unknown attribute " + str(k) end @@ -680,45 +689,44 @@ class lvh_obj # `setmember` virtual setter #- ------------------------------------------------------------# def setmember(k, v) - # print(">> setmember", k, v) - # print(">>", classname(self), self._attr_map) - # ignore attributes + import string + import introspect + + # print("> setmember", k, v) + var prefix = k[0..3] + if prefix == "set_" || prefix == "get_" return end + # if attribute name is in ignore list, abort if self._attr_ignore.find(k) != nil return end - # is attribute known + + # first check if there is a method named `set_X()` + var f = introspect.get(self, "set_" + k) + if type(f) == 'function' + f(self, v) + return + end + + # next check if there is a mapping to an LVGL attribute if self._attr_map.contains(k) - import string - import introspect - var kv = self._attr_map[k] - # if a string is attached to the name, then set the corresponding LVGL attribute - if kv - var f = introspect.get(self._lv_obj, "set_" + kv) - # if the attribute contains 'color', convert to lv_color - if type(kv) == 'string' && self.is_color_attribute(kv) - v = self.parse_color(v) - end - # print("f=", f, v, kv, self._lv_obj, self) - if type(f) == 'function' - if string.find(kv, "style_") == 0 - # style function need a selector as second parameter - f(self._lv_obj, v, 0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#) - else - f(self._lv_obj, v) - end - return - else - print("HSP: Could not find function set_"+kv) - end - else - # else call the specific method from self - var f = introspect.get(self, "set_" + k) - # print("f==",f) - if type(f) == 'function' - f(self, v) - return - end - end + var kv = self._attr_map[k] + f = introspect.get(self._lv_obj, "set_" + kv) + # if the attribute contains 'color', convert to lv_color + if self.is_color_attribute(kv) + v = self.parse_color(v) + end + # print("f=", f, v, kv, self._lv_obj, self) + if type(f) == 'function' + if string.find(kv, "style_") == 0 + # style function need a selector as second parameter + f(self._lv_obj, v, 0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#) + else + f(self._lv_obj, v) + end + return + else + print("HSP: Could not find function set_"+kv) + end else print("HSP: unknown attribute:", k) end @@ -1010,6 +1018,13 @@ class lvh_roller : lvh_obj def get_val() return self._lv_obj.get_selected() end + + def set_options(t) + self._lv_obj.set_options(t, lv.ROLLER_MODE_NORMAL) + end + def get_options() + return self._lv_obj.get_options() + end end ################################################################################# diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp index 4a1e54df087ce2dd7dd34f09ce180420a230d535..9e69b789593547a6b03942abe5e5a04391f69377 100644 GIT binary patch delta 1949 zcmcgtT})e59B=<)P+BM-888Itp#^ENHe;LF#4+fgL9_A^Hi~?7m)rJ~Ug^EJ-g}B{ zvarObnfPEfJ=>G765^B2YGR1`=)#jes(Uj_)ZmMWiNW|kw|teMF)^|2?K$WF@%w-L z{`cN{8?H~jaNYXYUbpRj^TGPnb^qHx)jzV?>K}2>w!N{Uk*p-}DqPsMpR0VzN4&E6 zYTjgWB1^r!L{qXsC&7=eaJwAN+U-96c?AsM@<(y$b-i}1 znppOsq@F_iK9XGuMPiZBt5Pf+os39>FNH^kBSSmZgfQd!-d+IXnJ}F!P)1mWN<^ct z6J-8?&5~>g3FczbY&uk`d?H_y8H%xSoQgZpMyQ}~bFFz(!Q4e&qXaIJ9fS=i{}n`=

zSqNq)!YJwWxAXyApm5JavgQk^bENgN0R48;NZYi*xyK?NkNtxs& zD=P=Ys--M9pWs1eSbHMRDAD8=l@i4yibn7@6ij9nlLd*K&<)1#T!9yR z(u!d+lFZQLqHxCMqZPWyM5QdFrw~M?DKanOz2XndJNYk@;NdS%!ZX|yyWuIQ=D*2M zbIymXE&mOcoXa5}f?`=C(b#ZwKTWE=C?aFSQW@Nu&=i@U)Xoagsv zA;{Nb&@TcuaQhUT;rHjDMjSnY%6dM~3T1`cQxLZEp(}Vkk_GJLJ_|Su{|6CmRulh` zi09Am5cqHT5HoRrk4vHf79V%xPjF8qFV%x1gx9pLFNpD;yp delta 1620 zcmZWqU1%It6waPBO*WhCCTV_6n!VmlnjM)$(gp%CNfS)|&Dc&d%J)PG@#z zJ2Tn-;4cV5{Xs=~N>M24lRk)6Tu@ql@wIP0Nvsb(D1s@eE)E#sp;VkCU+zKt#J2Rq4(~!>ilkGHrh`W z@8Y)SD+PQ~8=P#Vis~DVEzG0% zb{Dju(*|R$v}kA=t2ck!20d+**`k6LhUbsKAryA(j>2;FTom4o;IHkl*g}1F#SeqX zEocpc^cXCipo(Q|*>x?FAU3Bvw%=f_DAqO$%wfxK#h??T9T4vi6I91?+`0^$?toJR zG)!}JFL$Nh`A!EUleAi$<(Q%LB85t(=bs1J$xKonw z$&;{IeR>k^P2imh9CN&cjnfYLTfX zF?8Y=88O*aVtB-~oy#_UvkuZrDWdqkYZSJ9w&w{-h$3cXj-+|2$0O`5i3Av@*PcCH zmt-p?Mw}4dDO_Z#PbP_GxZ+S!%4MGT2wtAwjy#7WYKm(^@>|T$&6}0QJSj21=xB|2 z_{T7$5Hc`2%X={^WMM&EuNtc8Qxzy;zOaD_FNDmdrF;;DiFKg3w8mjpGceK;8lPW- zA-u5y3Cw1pL#l(Z72l{Z5=>f~DQs*HEs3)kev8j$;4FTafhoM7fo0UP{8Eo);RK$~ zLbrH*9N$=hboF)?<|FNUsx4ytIT)PYe_y0BQ7y&u1e<9gq9haXn92!xa-2ws*T&B) z&=<(s!&TfDZeLG)Z3uet?_n4bgbi$oWf2T<;*^?WkH_c!3UAo8(hG2#0emJ@Z7#4EHkzC+`H&^&4 zNvJoKBFysG{w8>3rW(4T{=ZSW>y!dU_xhb42&t*vBz=Kj8a-h73}3ar+KeJb4-}C} zMH2O8;B5|`f|06s0j?+Umm9EN{ryGwGk@?W@!JC!Yvw-*?D`qV;iVs;sj2Bdi(l!t From ba3a258247fe474d61f2556788d9f89d5fbb0a3b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 10:58:36 +0200 Subject: [PATCH 213/376] Update post_esp32.py --- pio-tools/post_esp32.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 5b58b0c0a..837187d4f 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -45,11 +45,18 @@ def esp32_build_filesystem(fs_size): os.makedirs(filesystem_dir) print("Creating filesystem with content:") for file in files: + if "no_files" in file: + continue shutil.copy(file, filesystem_dir) + if not os.listdir(filesystem_dir): + print("No files added -> will NOT create littlefs.bin and NOT overwrite fs partition!") + return False env.Replace( MKSPIFFSTOOL=platform.get_package_dir("tool-mklittlefs") + '/mklittlefs' ) tool = env.subst(env["MKSPIFFSTOOL"]) cmd = (tool,"-c",filesystem_dir,"-s",fs_size,join(env.subst("$BUILD_DIR"),"littlefs.bin")) returncode = subprocess.call(cmd, shell=False) + # print(retrncode) + return True def esp32_fetch_safeboot_bin(chip): safeboot_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin" @@ -74,9 +81,9 @@ def esp32_create_combined_bin(source, target, env): # The offset from begin of the file where the app0 partition starts # This is defined in the partition .csv file - factory_offset = -1 # error code value + # factory_offset = -1 # error code value - currently unused app_offset = 0x10000 # default value for "old" scheme - fs_offset = -1 # error code value + fs_offset = -1 # error code value with open(env.BoardConfig().get("build.partitions")) as csv_file: print("Read partitions from ",env.BoardConfig().get("build.partitions")) csv_reader = csv.reader(csv_file, delimiter=',') @@ -92,9 +99,9 @@ def esp32_create_combined_bin(source, target, env): app_offset = int(row[3],base=16) # elif(row[0] == 'factory'): # factory_offset = int(row[3],base=16) - elif(row[0] == 'spiffs'): - fs_offset = int(row[3],base=16) - esp32_build_filesystem(row[4]) + elif(row[0] == 'spiffs'): + if esp32_build_filesystem(row[4]): + fs_offset = int(row[3],base=16) new_file_name = env.subst("$BUILD_DIR/${PROGNAME}.factory.bin") From 1a9ca0d7748a00192aa355ee56ef0c3807f8760f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 10:59:21 +0200 Subject: [PATCH 214/376] Update platformio_tasmota_env32.ini --- platformio_tasmota_env32.ini | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 18e1fa60a..7977b8394 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -34,6 +34,11 @@ lib_ignore = BluetoothSerial ; Disable next if you want to use ArduinoOTA in Tasmota32 (default disabled) ArduinoOTA +; Add files to Filesystem for all env (global). Remove no files entry and add add a line with the file to include +; Example for adding the Partition Manager +; custom_files_upload = +; tasmota/berry/modules/Partition_Manager.tapp +custom_files_upload = no_files [env:tasmota32] extends = env:tasmota32_base From a610db2e900bb3160270f08361de309888a93957 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 11:02:10 +0200 Subject: [PATCH 215/376] Example for custom Partition file upload --- platformio_tasmota_cenv_sample.ini | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index b4b2438aa..3205cde3f 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -12,6 +12,14 @@ build_flags = ${env:tasmota32_base.build_flags} -D USE_WIFI_RANGE_EXTENDER -D USE_WIFI_RANGE_EXTENDER_NAPT +[env:tasmota32s3] +extends = env:tasmota32_base +board = esp32s3 +build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASMOTA32 +; example for custom file upload in Tasmota Filesystem +; custom_files_upload = ${env:tasmota32_base.custom_files_upload} +; tasmota/berry/modules/Partition_wizard.tapp + ; *** Debug version used for PlatformIO Home Project Inspection [env:tasmota-debug] build_type = debug From 232594153d58fc06f7b008c84d4a566fb9ba0891 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 12:41:48 +0200 Subject: [PATCH 216/376] Update tasmota_lib_changes.md --- lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md b/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md index bea02c652..6177f9d7d 100644 --- a/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md +++ b/lib/lib_audio/ESP8266Audio/tasmota_lib_changes.md @@ -13,6 +13,13 @@ remove in file `lib/lib_audio/ESP8266Audio/src/AudioFileSourceFS.cpp` #endif ``` +add in file `lib/lib_audio/ESP8266Audio/src/spiram-fast.h` +``` +#ifndef SPECIAL +#define SPECIAL 0xF0 +#endif +``` + Files to delete: ``` lib/lib_audio/ESP8266Audio/src/AudioFileSourceSPIFFS.h From e6e1127a1e9ba1934a26fd5852a9fc8fedab12ea Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 13:13:39 +0200 Subject: [PATCH 217/376] Support more target build names --- pio-tools/post_esp32.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 837187d4f..2e919391b 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -38,6 +38,13 @@ import esptool FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") +def esp32_create_chip_string(chip): + tasmota_platform = env.subst("$BUILD_DIR").split('/')[-1] + tasmota_platform = tasmota_platform.split('-')[0] + if 'tasmota' and chip[3:] not in tasmota_platform: # quick check for a valid name like 'tasmota' + '32c3' + print('Unexpected naming conventions in this build environment -> Undefined behavior for further build process!!') + return tasmota_platform + def esp32_build_filesystem(fs_size): files = env.GetProjectOption("custom_files_upload").splitlines() filesystem_dir = join(env.subst("$BUILD_DIR"),"littlefs_data") @@ -55,12 +62,12 @@ def esp32_build_filesystem(fs_size): tool = env.subst(env["MKSPIFFSTOOL"]) cmd = (tool,"-c",filesystem_dir,"-s",fs_size,join(env.subst("$BUILD_DIR"),"littlefs.bin")) returncode = subprocess.call(cmd, shell=False) - # print(retrncode) + # print(returncode) return True -def esp32_fetch_safeboot_bin(chip): - safeboot_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin" - safeboot_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin") +def esp32_fetch_safeboot_bin(tasmota_platform): + safeboot_fw_url = "https://github.com/arendst/Tasmota-firmware/raw/main/firmware/tasmota32/" + tasmota_platform + "-safeboot.bin" + safeboot_fw_name = join(variants_dir, tasmota_platform + "-safeboot.bin") if(exists(safeboot_fw_name)): print("safeboot binary already in place.") return @@ -70,9 +77,9 @@ def esp32_fetch_safeboot_bin(chip): open(safeboot_fw_name, "wb").write(response.content) print("safeboot binary written to variants dir.") -def esp32_copy_new_safeboot_bin(chip,new_local_safeboot_fw): +def esp32_copy_new_safeboot_bin(tasmota_platform,new_local_safeboot_fw): print("Copy new local safeboot firmware to variants dir -> using it for further flashing operations") - safeboot_fw_name = join(variants_dir,"tasmota" + ("32solo1" if "solo1" in env.subst("$BUILD_DIR") else chip[3:]) + "-safeboot.bin") + safeboot_fw_name = join(variants_dir, tasmota_platform + "-safeboot.bin") if os.path.exists(variants_dir): shutil.copy(new_local_safeboot_fw, safeboot_fw_name) @@ -108,12 +115,13 @@ def esp32_create_combined_bin(source, target, env): sections = env.subst(env.get("FLASH_EXTRA_IMAGES")) firmware_name = env.subst("$BUILD_DIR/${PROGNAME}.bin") chip = env.get("BOARD_MCU") + tasmota_platform = esp32_create_chip_string(chip) if not os.path.exists(variants_dir): os.makedirs(variants_dir) if("safeboot" in firmware_name): - esp32_copy_new_safeboot_bin(chip,firmware_name) + esp32_copy_new_safeboot_bin(tasmota_platform,firmware_name) else: - esp32_fetch_safeboot_bin(chip) + esp32_fetch_safeboot_bin(tasmota_platform) flash_size = env.BoardConfig().get("upload.flash_size", "4MB") cmd = [ "--chip", From 2478bb2707a4c758db2756be502be29d6245480f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 13:46:45 +0200 Subject: [PATCH 218/376] Remove duplicate S3 entry fix formatting of `custom_files_upload` S3 is not alpha anymore. Considering it as stable like S2/C3 --- platformio_tasmota_cenv_sample.ini | 24 +----------------------- 1 file changed, 1 insertion(+), 23 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 3205cde3f..d2ac59086 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -18,7 +18,7 @@ board = esp32s3 build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASMOTA32 ; example for custom file upload in Tasmota Filesystem ; custom_files_upload = ${env:tasmota32_base.custom_files_upload} -; tasmota/berry/modules/Partition_wizard.tapp +; tasmota/berry/modules/Partition_wizard.tapp ; *** Debug version used for PlatformIO Home Project Inspection [env:tasmota-debug] @@ -60,25 +60,3 @@ debug_init_break = tbreak setup build_unflags = ${core32solo1.build_unflags} build_flags = ${core32solo1.build_flags} monitor_filters = esp32_exception_decoder - -; *** alpha S3 Version -[env:tasmota32s3] -extends = env:tasmota32_base -board = esp32s3 -build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_BLUETOOTH -lib_extra_dirs = - lib/lib_basic - lib/lib_ssl - lib/lib_i2c - lib/lib_rf - lib/lib_div - lib/lib_display - lib/lib_audio - lib/libesp32 - lib/libesp32_lvgl - lib/libesp32_div - lib/libesp32_eink -lib_ignore = - TTGO TWatch Library - Micro-RTSP - epdiy From a93db3aa92c57c058a6d82521fe56207f75f307a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 12 May 2022 14:17:25 +0200 Subject: [PATCH 219/376] Add esp32c3usb.json board file --- boards/esp32c3usb.json | 43 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 boards/esp32c3usb.json diff --git a/boards/esp32c3usb.json b/boards/esp32c3usb.json new file mode 100644 index 000000000..09651ac8b --- /dev/null +++ b/boards/esp32c3usb.json @@ -0,0 +1,43 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32c3_out.ld" + }, + "core": "esp32", + "extra_flags": "-DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DESP32_4M -DESP32C3 -DUSE_USB_SERIAL_CONSOLE", + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "dout", + "mcu": "esp32c3", + "variant": "esp32c3", + "partitions": "esp32_partition_app2880k_fs320k.csv" + }, + "connectivity": [ + "wifi" + ], + "debug": { + "openocd_target": "esp32c3.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32-C3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32c3usb-safeboot.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/hw-reference/esp32c3/user-guide-devkitm-1.html", + "vendor": "Espressif" + } From c401fdd87db30090996c78a442b805d534a42172 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 14:57:48 +0200 Subject: [PATCH 220/376] add tasmota32c3usb-safeboot, tasmota32c3usb --- platformio_tasmota_env32.ini | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 7977b8394..bb6e9b57a 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -110,6 +110,9 @@ lib_ignore = TTGO TWatch Library Micro-RTSP epdiy +[env:tasmota32c3usb] +extends = env:tasmota32c3 +board = esp32c3usb [env:tasmota32s2] extends = env:tasmota32_base @@ -181,6 +184,10 @@ lib_ignore = Micro-RTSP epdiy +[env:tasmota32c3usb-safeboot] +extends = tasmota32c3-safeboot +board = esp32c3usb + [env:tasmota32-AF] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DMY_LANGUAGE=af_AF -DFIRMWARE_TASMOTA32 From 87c5a4cfccaacd6d9ed35764775fd7bd6ea6b9e1 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 12 May 2022 15:02:37 +0200 Subject: [PATCH 221/376] add tasmota32c3usb to github actions (#15605) --- .github/workflows/Tasmota_build_devel.yml | 2 ++ .github/workflows/build_all_the_things.yml | 2 ++ 2 files changed, 4 insertions(+) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index e855f4cb6..3f9fe9e06 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -38,10 +38,12 @@ jobs: - tasmota32-ir - tasmota32-lvgl - tasmota32c3 + - tasmota32c3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot - tasmota32c3-safeboot + - tasmota32c3usb-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot steps: diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index f81bae9df..e1d062771 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -42,10 +42,12 @@ jobs: - tasmota32-lvgl - tasmota32s2 - tasmota32c3 + - tasmota32c3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot - tasmota32c3-safeboot + - tasmota32c3usb-safebot - tasmota32s2-safeboot - tasmota32s3-safeboot steps: From d43e5eb7b9f4d84f1fe07a702954071d158a48f7 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 13 May 2022 09:30:31 +0200 Subject: [PATCH 222/376] Esp32 upload file checked done against OTA partitionsize --- tasmota/xdrv_01_webserver.ino | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 518b48ef3..ebd73199c 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -353,18 +353,22 @@ const char HTTP_FORM_UPG[] PROGMEM = "

" "

 " D_UPGRADE_BY_FILE_UPLOAD " "; const char HTTP_FORM_RST_UPG[] PROGMEM = - "
" + "" "

" - "
" + "
" "
" "
" ""; // upload via factory partition const char HTTP_FORM_RST_UPG_FCT[] PROGMEM = - "
" + "" "

" - "
" + "
" "" "
" "" @@ -436,6 +440,7 @@ ESP8266WebServer *Webserver; struct WEB { String chunk_buffer = ""; // Could be max 2 * CHUNKED_BUFFER_SIZE + uint32_t upload_size = 0; uint16_t upload_error = 0; uint8_t state = HTTP_OFF; uint8_t upload_file_type; @@ -2775,11 +2780,15 @@ void HandleUploadLoop(void) { return; } if (0xE9 == upload.buf[0]) { - uint32_t bin_flash_size = ESP.magicFlashChipSize((upload.buf[3] & 0xf0) >> 4); #ifdef ESP8266 + uint32_t bin_flash_size = ESP.magicFlashChipSize((upload.buf[3] & 0xf0) >> 4); if (bin_flash_size > ESP.getFlashChipRealSize()) { #else - if (bin_flash_size > ESP.getFlashChipSize()) { // TODO revisit this test + char tmp[16]; + WebGetArg("fsz", tmp, sizeof(tmp)); // filesize + uint32_t upload_size = (!strlen(tmp)) ? 0 : atoi(tmp); + AddLog(LOG_LEVEL_DEBUG, D_LOG_UPLOAD "freespace=%i filesize=%i", ESP.getFreeSketchSpace(), upload_size); + if (upload_size > ESP.getFreeSketchSpace()) { // TODO revisit this test #endif Web.upload_error = 4; // Program flash size is larger than real flash size return; From 86c2c086980ab4262af90da33b9e5fae7fe84b02 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 10:16:48 +0200 Subject: [PATCH 223/376] fix typo --- .github/workflows/build_all_the_things.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index e1d062771..3303759f4 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -47,7 +47,7 @@ jobs: - tasmota32solo1-safeboot - tasmota32-safeboot - tasmota32c3-safeboot - - tasmota32c3usb-safebot + - tasmota32c3usb-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot steps: From 89e2be4efeeb9f73940d184fae542c653826ec08 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 10:36:01 +0200 Subject: [PATCH 224/376] Retrigger Build --- platformio_override_sample.ini | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 629f03e67..e78d20cdb 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -36,6 +36,7 @@ default_envs = ; tasmota32solo1 ; tasmota32c3 ; tasmota32s2 +; tasmota32s3 ; tasmota32-odroidgo ; tasmota32-core2 @@ -90,8 +91,8 @@ lib_extra_dirs = ${library.lib_extra_dirs} [env:tasmota32_base] ; *** Uncomment next lines ";" to enable development Tasmota Arduino version ESP32 -;platform = https://github.com/tasmota/platform-espressif32/releases/download/v2.0.3rc1/platform-espressif32-2.0.3new.zip -;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/825/framework-arduinoespressif32-v4.4_work-c4b83228a5.tar.gz +;platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-v.2.0.3.zip +;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/837/framework-arduinoespressif32-v4.4_dev-6fa4526c0d.tar.gz build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 614a899dd36b99fabba028d7b0b11fc3b83a6491 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 10:48:34 +0200 Subject: [PATCH 225/376] correct env --- platformio_tasmota_env32.ini | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index bb6e9b57a..ee7be6bd1 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -185,8 +185,19 @@ lib_ignore = epdiy [env:tasmota32c3usb-safeboot] -extends = tasmota32c3-safeboot +extends = env:tasmota32_base board = esp32c3usb +build_unflags = ${env:tasmota32_base.build_unflags} + -flto + -mtarget-align +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT + -fno-lto +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy [env:tasmota32-AF] extends = env:tasmota32_base From e6411a5d691c61c82d20862fac34ca6034736540 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 13 May 2022 12:12:48 +0200 Subject: [PATCH 226/376] OpenHASP support for roller's text attribute --- .../berry_tasmota/src/be_lv_openhasp.c | 5858 +++++++++-------- .../generate/be_lv_c_mapping.h | 6 +- .../generate/be_lvgl_module.c | 3 +- .../lv_binding_berry/tools/convert.py | 7 +- tasmota/berry/openhasp/openhasp.tapp | Bin 57664 -> 58548 bytes tasmota/berry/openhasp/openhasp_demo.tapp | Bin 188470 -> 189354 bytes tasmota/berry/openhasp_src/gen_openhasp.sh | 5 + tasmota/berry/openhasp_src/openhasp.tapp | Bin 57664 -> 58548 bytes .../openhasp_src/openhasp_core/openhasp.be | 34 +- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 188470 -> 189354 bytes 10 files changed, 3051 insertions(+), 2862 deletions(-) create mode 100755 tasmota/berry/openhasp_src/gen_openhasp.sh diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index b8d1b05e8..07b0d04a3 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -465,309 +465,9 @@ void be_load_lvh_page_class(bvm *vm) { } /******************************************************************** -** Solidified function: get_value_font +** Solidified function: set_radius2 ********************************************************************/ -be_local_closure(lvh_obj_get_value_font, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("get_text_font"), - }), - be_str_literal("get_value_font"), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_ofs_x -********************************************************************/ -be_local_closure(lvh_obj_get_value_ofs_x, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_label"), - /* K1 */ be_nested_str_literal("get_x"), - }), - be_str_literal("get_value_ofs_x"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_align -********************************************************************/ -be_local_closure(lvh_obj_set_align, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_literal("check_label"), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_literal("left"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("TEXT_ALIGN_LEFT"), - /* K5 */ be_const_int(1), - /* K6 */ be_nested_str_literal("center"), - /* K7 */ be_nested_str_literal("TEXT_ALIGN_CENTER"), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_literal("right"), - /* K10 */ be_nested_str_literal("TEXT_ALIGN_RIGHT"), - /* K11 */ be_nested_str_literal("_lv_label"), - /* K12 */ be_nested_str_literal("set_style_text_align"), - }), - be_str_literal("set_align"), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x8C0C0100, // 0001 GETMET R3 R0 K0 - 0x7C0C0200, // 0002 CALL R3 1 - 0x1C0C0301, // 0003 EQ R3 R1 K1 - 0x740E0001, // 0004 JMPT R3 #0007 - 0x1C0C0302, // 0005 EQ R3 R1 K2 - 0x780E0002, // 0006 JMPF R3 #000A - 0xB80E0600, // 0007 GETNGBL R3 K3 - 0x88080704, // 0008 GETMBR R2 R3 K4 - 0x7002000C, // 0009 JMP #0017 - 0x1C0C0305, // 000A EQ R3 R1 K5 - 0x740E0001, // 000B JMPT R3 #000E - 0x1C0C0306, // 000C EQ R3 R1 K6 - 0x780E0002, // 000D JMPF R3 #0011 - 0xB80E0600, // 000E GETNGBL R3 K3 - 0x88080707, // 000F GETMBR R2 R3 K7 - 0x70020005, // 0010 JMP #0017 - 0x1C0C0308, // 0011 EQ R3 R1 K8 - 0x740E0001, // 0012 JMPT R3 #0015 - 0x1C0C0309, // 0013 EQ R3 R1 K9 - 0x780E0001, // 0014 JMPF R3 #0017 - 0xB80E0600, // 0015 GETNGBL R3 K3 - 0x8808070A, // 0016 GETMBR R2 R3 K10 - 0x880C010B, // 0017 GETMBR R3 R0 K11 - 0x8C0C070C, // 0018 GETMET R3 R3 K12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x58180001, // 001A LDCONST R6 K1 - 0x7C0C0600, // 001B CALL R3 3 - 0x80000000, // 001C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val_rule -********************************************************************/ -be_local_closure(lvh_obj_get_val_rule, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_val_rule"), - }), - be_str_literal("get_val_rule"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_bottom -********************************************************************/ -be_local_closure(lvh_obj_get_pad_bottom, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("get_style_pad_bottom"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("get_pad_bottom"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_line_width -********************************************************************/ -be_local_closure(lvh_obj_set_line_width, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("set_style_line_width"), - /* K2 */ be_const_int(0), - }), - be_str_literal("set_line_width"), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x60100009, // 0002 GETGBL R4 G9 - 0x5C140200, // 0003 MOVE R5 R1 - 0x7C100200, // 0004 CALL R4 1 - 0x58140002, // 0005 LDCONST R5 K2 - 0x7C080600, // 0006 CALL R2 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(lvh_obj_init, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_page"), - /* K1 */ be_nested_str_literal("_lv_class"), - /* K2 */ be_nested_str_literal("_lv_obj"), - /* K3 */ be_nested_str_literal("post_init"), - }), - be_str_literal("init"), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x90020002, // 0000 SETMBR R0 K0 R2 - 0x4C140000, // 0001 LDNIL R5 - 0x1C140805, // 0002 EQ R5 R4 R5 - 0x78160007, // 0003 JMPF R5 #000C - 0x88140101, // 0004 GETMBR R5 R0 K1 - 0x78160005, // 0005 JMPF R5 #000C - 0x88140101, // 0006 GETMBR R5 R0 K1 - 0x5C180A00, // 0007 MOVE R6 R5 - 0x5C1C0200, // 0008 MOVE R7 R1 - 0x7C180200, // 0009 CALL R6 1 - 0x90020406, // 000A SETMBR R0 K2 R6 - 0x70020000, // 000B JMP #000D - 0x90020404, // 000C SETMBR R0 K2 R4 - 0x8C140103, // 000D GETMET R5 R0 K3 - 0x7C140200, // 000E CALL R5 1 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_str -********************************************************************/ -be_local_closure(lvh_obj_get_value_str, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("get_text"), - }), - be_str_literal("get_value_str"), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_all2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_all2, /* name */ +be_local_closure(lvh_obj_set_radius2, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -780,11 +480,11 @@ be_local_closure(lvh_obj_set_pad_all2, /* name */ ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_part2_selector"), /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_pad_all"), + /* K2 */ be_nested_str_literal("set_style_radius"), /* K3 */ be_nested_str_literal("lv"), /* K4 */ be_nested_str_literal("STATE_DEFAULT"), }), - be_str_literal("set_pad_all2"), + be_str_literal("set_radius2"), &be_const_str_solidified, ( &(const binstruction[15]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 @@ -808,751 +508,6 @@ be_local_closure(lvh_obj_set_pad_all2, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_text_rule -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("text_rule_matched"), - }), - be_str_literal(""), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68040000, // 0000 GETUPV R1 U0 - 0x8C040300, // 0001 GETMET R1 R1 K0 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_text_rule"), - /* K1 */ be_nested_str_literal("tasmota"), - /* K2 */ be_nested_str_literal("remove_rule"), - /* K3 */ be_nested_str_literal("add_rule"), - }), - be_str_literal("set_text_rule"), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0004, // 0003 JMPF R2 #0009 - 0xB80A0200, // 0004 GETNGBL R2 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x88100100, // 0006 GETMBR R4 R0 K0 - 0x5C140000, // 0007 MOVE R5 R0 - 0x7C080600, // 0008 CALL R2 3 - 0x60080008, // 0009 GETGBL R2 G8 - 0x5C0C0200, // 000A MOVE R3 R1 - 0x7C080200, // 000B CALL R2 1 - 0x90020002, // 000C SETMBR R0 K0 R2 - 0xB80A0200, // 000D GETNGBL R2 K1 - 0x8C080503, // 000E GETMET R2 R2 K3 - 0x88100100, // 000F GETMBR R4 R0 K0 - 0x84140000, // 0010 CLOSURE R5 P0 - 0x5C180000, // 0011 MOVE R6 R0 - 0x7C080800, // 0012 CALL R2 4 - 0xA0000000, // 0013 CLOSE R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_adjustable -********************************************************************/ -be_local_closure(lvh_obj_get_adjustable, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("has_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), - }), - be_str_literal("get_adjustable"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text -********************************************************************/ -be_local_closure(lvh_obj_set_text, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_literal("check_label"), - /* K1 */ be_nested_str_literal("_lv_label"), - /* K2 */ be_nested_str_literal("set_text"), - }), - be_str_literal("set_text"), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x60100008, // 0004 GETGBL R4 G8 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C100200, // 0006 CALL R4 1 - 0x7C080400, // 0007 CALL R2 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_cb -********************************************************************/ -be_local_closure(lvh_obj_event_cb, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 3]) { /* upvals */ - be_local_const_upval(1, 2), - be_local_const_upval(1, 0), - be_local_const_upval(1, 3), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("do_action"), - }), - be_str_literal(""), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x680C0002, // 0003 GETUPV R3 U2 - 0x7C000600, // 0004 CALL R0 3 - 0x80040000, // 0005 RET 1 R0 - }) - ), - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 7), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_literal("tasmota"), - /* K1 */ be_nested_str_literal("publish_rule"), - }), - be_str_literal(""), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0xB8020000, // 0000 GETNGBL R0 K0 - 0x8C000101, // 0001 GETMET R0 R0 K1 - 0x68080000, // 0002 GETUPV R2 U0 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_literal("_page"), - /* K1 */ be_nested_str_literal("_oh"), - /* K2 */ be_nested_str_literal("code"), - /* K3 */ be_nested_str_literal("action"), - /* K4 */ be_nested_str_literal(""), - /* K5 */ be_nested_str_literal("lv"), - /* K6 */ be_nested_str_literal("EVENT_CLICKED"), - /* K7 */ be_nested_str_literal("tasmota"), - /* K8 */ be_nested_str_literal("set_timer"), - /* K9 */ be_const_int(0), - /* K10 */ be_nested_str_literal("_event_map"), - /* K11 */ be_nested_str_literal("find"), - /* K12 */ be_nested_str_literal("string"), - /* K13 */ be_nested_str_literal("EVENT_VALUE_CHANGED"), - /* K14 */ be_nested_str_literal("val"), - /* K15 */ be_nested_str_literal("format"), - /* K16 */ be_nested_str_literal(",\"val\":%i"), - /* K17 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":{\"event\":\"%s\"%s}}}"), - /* K18 */ be_nested_str_literal("_page_id"), - /* K19 */ be_nested_str_literal("id"), - }), - be_str_literal("event_cb"), - &be_const_str_solidified, - ( &(const binstruction[58]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x880C0302, // 0002 GETMBR R3 R1 K2 - 0x88100103, // 0003 GETMBR R4 R0 K3 - 0x20100904, // 0004 NE R4 R4 K4 - 0x78120008, // 0005 JMPF R4 #000F - 0xB8120A00, // 0006 GETNGBL R4 K5 - 0x88100906, // 0007 GETMBR R4 R4 K6 - 0x1C100604, // 0008 EQ R4 R3 R4 - 0x78120004, // 0009 JMPF R4 #000F - 0xB8120E00, // 000A GETNGBL R4 K7 - 0x8C100908, // 000B GETMET R4 R4 K8 - 0x58180009, // 000C LDCONST R6 K9 - 0x841C0000, // 000D CLOSURE R7 P0 - 0x7C100600, // 000E CALL R4 3 - 0x8810010A, // 000F GETMBR R4 R0 K10 - 0x8C10090B, // 0010 GETMET R4 R4 K11 - 0x5C180600, // 0011 MOVE R6 R3 - 0x7C100400, // 0012 CALL R4 2 - 0x4C140000, // 0013 LDNIL R5 - 0x20140805, // 0014 NE R5 R4 R5 - 0x78160021, // 0015 JMPF R5 #0038 - 0xA4161800, // 0016 IMPORT R5 K12 - 0x58180004, // 0017 LDCONST R6 K4 - 0x881C0302, // 0018 GETMBR R7 R1 K2 - 0xB8220A00, // 0019 GETNGBL R8 K5 - 0x8820110D, // 001A GETMBR R8 R8 K13 - 0x1C1C0E08, // 001B EQ R7 R7 R8 - 0x781E000C, // 001C JMPF R7 #002A - 0xA8020007, // 001D EXBLK 0 #0026 - 0x881C010E, // 001E GETMBR R7 R0 K14 - 0x8C200B0F, // 001F GETMET R8 R5 K15 - 0x58280010, // 0020 LDCONST R10 K16 - 0x5C2C0E00, // 0021 MOVE R11 R7 - 0x7C200600, // 0022 CALL R8 3 - 0x5C181000, // 0023 MOVE R6 R8 - 0xA8040001, // 0024 EXBLK 1 1 - 0x70020003, // 0025 JMP #002A - 0xAC1C0000, // 0026 CATCH R7 0 0 - 0x70020000, // 0027 JMP #0029 - 0x70020000, // 0028 JMP #002A - 0xB0080000, // 0029 RAISE 2 R0 R0 - 0x8C1C0B0F, // 002A GETMET R7 R5 K15 - 0x58240011, // 002B LDCONST R9 K17 - 0x88280100, // 002C GETMBR R10 R0 K0 - 0x88281512, // 002D GETMBR R10 R10 K18 - 0x882C0113, // 002E GETMBR R11 R0 K19 - 0x5C300800, // 002F MOVE R12 R4 - 0x5C340C00, // 0030 MOVE R13 R6 - 0x7C1C0C00, // 0031 CALL R7 6 - 0xB8220E00, // 0032 GETNGBL R8 K7 - 0x8C201108, // 0033 GETMET R8 R8 K8 - 0x58280009, // 0034 LDCONST R10 K9 - 0x842C0001, // 0035 CLOSURE R11 P1 - 0x7C200600, // 0036 CALL R8 3 - 0xA0140000, // 0037 CLOSE R5 - 0xA0000000, // 0038 CLOSE R0 - 0x80000000, // 0039 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_color -********************************************************************/ -be_local_closure(lvh_obj_get_text_color, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("get_style_text_color"), - /* K2 */ be_const_int(0), - }), - be_str_literal("get_text_color"), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_radius2 -********************************************************************/ -be_local_closure(lvh_obj_get_radius2, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("get_style_radius"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("get_radius2"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val -********************************************************************/ -be_local_closure(lvh_obj_set_val, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("set_value"), - }), - be_str_literal("set_val"), - &be_const_str_solidified, - ( &(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 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_get_text_rule_formula, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_text_rule_formula"), - }), - be_str_literal("get_text_rule_formula"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_enabled -********************************************************************/ -be_local_closure(lvh_obj_get_enabled, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("has_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), - }), - be_str_literal("get_enabled"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_format -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule_format, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_text_rule_format"), - }), - be_str_literal("set_text_rule_format"), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_toggle -********************************************************************/ -be_local_closure(lvh_obj_get_toggle, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("has_state"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("STATE_CHECKED"), - }), - be_str_literal("get_toggle"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_left2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_left2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_pad_left"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("set_pad_left2"), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_adjustable -********************************************************************/ -be_local_closure(lvh_obj_set_adjustable, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("add_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), - /* K4 */ be_nested_str_literal("clear_flag"), - }), - be_str_literal("set_adjustable"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_right2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_right2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_pad_right"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("set_pad_right2"), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_toggle -********************************************************************/ -be_local_closure(lvh_obj_set_toggle, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_literal("string"), - /* K1 */ be_nested_str_literal("toupper"), - /* K2 */ be_nested_str_literal("TRUE"), - /* K3 */ be_nested_str_literal("FALSE"), - /* K4 */ be_nested_str_literal("_lv_obj"), - /* K5 */ be_nested_str_literal("add_state"), - /* K6 */ be_nested_str_literal("lv"), - /* K7 */ be_nested_str_literal("STATE_CHECKED"), - /* K8 */ be_nested_str_literal("clear_state"), - }), - be_str_literal("set_toggle"), - &be_const_str_solidified, - ( &(const binstruction[26]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x60140008, // 0002 GETGBL R5 G8 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C140200, // 0004 CALL R5 1 - 0x7C0C0400, // 0005 CALL R3 2 - 0x5C040600, // 0006 MOVE R1 R3 - 0x1C0C0302, // 0007 EQ R3 R1 K2 - 0x780E0000, // 0008 JMPF R3 #000A - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x1C0C0303, // 000A EQ R3 R1 K3 - 0x780E0000, // 000B JMPF R3 #000D - 0x50040000, // 000C LDBOOL R1 0 0 - 0x78060005, // 000D JMPF R1 #0014 - 0x880C0104, // 000E GETMBR R3 R0 K4 - 0x8C0C0705, // 000F GETMET R3 R3 K5 - 0xB8160C00, // 0010 GETNGBL R5 K6 - 0x88140B07, // 0011 GETMBR R5 R5 K7 - 0x7C0C0400, // 0012 CALL R3 2 - 0x70020004, // 0013 JMP #0019 - 0x880C0104, // 0014 GETMBR R3 R0 K4 - 0x8C0C0708, // 0015 GETMET R3 R3 K8 - 0xB8160C00, // 0016 GETNGBL R5 K6 - 0x88140B07, // 0017 GETMBR R5 R5 K7 - 0x7C0C0400, // 0018 CALL R3 2 - 0x80000000, // 0019 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_rule -********************************************************************/ -be_local_closure(lvh_obj_get_text_rule, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_text_rule"), - }), - be_str_literal("get_text_rule"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: register_event_cb ********************************************************************/ @@ -1603,9 +558,9 @@ be_local_closure(lvh_obj_register_event_cb, /* name */ /******************************************************************** -** Solidified function: get_text +** Solidified function: get_value_ofs_x ********************************************************************/ -be_local_closure(lvh_obj_get_text, /* name */ +be_local_closure(lvh_obj_get_value_ofs_x, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -1617,168 +572,15 @@ be_local_closure(lvh_obj_get_text, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_label"), - /* K1 */ be_nested_str_literal("get_text"), + /* K1 */ be_nested_str_literal("get_x"), }), - be_str_literal("get_text"), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060001, // 0003 JMPF R1 #0006 - 0x4C040000, // 0004 LDNIL R1 - 0x80040200, // 0005 RET 1 R1 - 0x88040100, // 0006 GETMBR R1 R0 K0 - 0x8C040301, // 0007 GETMET R1 R1 K1 - 0x7C040200, // 0008 CALL R1 1 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_color -********************************************************************/ -be_local_closure(lvh_obj_set_value_color, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("set_text_color"), - }), - be_str_literal("set_value_color"), + be_str_literal("get_value_ofs_x"), &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_radius2 -********************************************************************/ -be_local_closure(lvh_obj_set_radius2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_radius"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("set_radius2"), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_hidden -********************************************************************/ -be_local_closure(lvh_obj_set_hidden, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("add_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_HIDDEN"), - /* K4 */ be_nested_str_literal("clear_flag"), - }), - be_str_literal("set_hidden"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_action -********************************************************************/ -be_local_closure(lvh_obj_get_action, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_action"), - /* K1 */ be_nested_str_literal(""), - }), - be_str_literal("get_action"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060001, // 0001 JMPF R1 #0004 - 0x5C080200, // 0002 MOVE R2 R1 - 0x70020000, // 0003 JMP #0005 - 0x58080001, // 0004 LDCONST R2 K1 - 0x80040400, // 0005 RET 1 R2 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -1786,11 +588,11 @@ be_local_closure(lvh_obj_get_action, /* name */ /******************************************************************** -** Solidified function: set_enabled +** Solidified function: set_value_ofs_x ********************************************************************/ -be_local_closure(lvh_obj_set_enabled, /* name */ +be_local_closure(lvh_obj_set_value_ofs_x, /* name */ be_nested_proto( - 5, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1798,29 +600,23 @@ be_local_closure(lvh_obj_set_enabled, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("add_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), - /* K4 */ be_nested_str_literal("clear_flag"), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("check_label"), + /* K1 */ be_nested_str_literal("_lv_label"), + /* K2 */ be_nested_str_literal("set_x"), }), - be_str_literal("set_enabled"), + be_str_literal("set_value_ofs_x"), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x78060005, // 0000 JMPF R1 #0007 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0xB8120400, // 0003 GETNGBL R4 K2 - 0x88100903, // 0004 GETMBR R4 R4 K3 - 0x7C080400, // 0005 CALL R2 2 - 0x70020004, // 0006 JMP #000C - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080504, // 0008 GETMET R2 R2 K4 - 0xB8120400, // 0009 GETNGBL R4 K2 - 0x88100903, // 000A GETMBR R4 R4 K3 - 0x7C080400, // 000B CALL R2 2 - 0x80000000, // 000C RET 0 + ( &(const binstruction[ 9]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x8C080502, // 0003 GETMET R2 R2 K2 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C100200, // 0006 CALL R4 1 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 }) ) ); @@ -1828,350 +624,9 @@ be_local_closure(lvh_obj_set_enabled, /* name */ /******************************************************************** -** Solidified function: setmember +** Solidified function: get_radius2 ********************************************************************/ -be_local_closure(lvh_obj_setmember, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_literal("string"), - /* K1 */ be_nested_str_literal("introspect"), - /* K2 */ be_const_int(0), - /* K3 */ be_const_int(3), - /* K4 */ be_nested_str_literal("set_"), - /* K5 */ be_nested_str_literal("get_"), - /* K6 */ be_nested_str_literal("_attr_ignore"), - /* K7 */ be_nested_str_literal("find"), - /* K8 */ be_nested_str_literal("get"), - /* K9 */ be_nested_str_literal("function"), - /* K10 */ be_nested_str_literal("_attr_map"), - /* K11 */ be_nested_str_literal("contains"), - /* K12 */ be_nested_str_literal("_lv_obj"), - /* K13 */ be_nested_str_literal("is_color_attribute"), - /* K14 */ be_nested_str_literal("parse_color"), - /* K15 */ be_nested_str_literal("style_"), - /* K16 */ be_nested_str_literal("HSP: Could not find function set_"), - /* K17 */ be_nested_str_literal("HSP: unknown attribute:"), - }), - be_str_literal("setmember"), - &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x40160503, // 0002 CONNECT R5 K2 K3 - 0x94140205, // 0003 GETIDX R5 R1 R5 - 0x1C180B04, // 0004 EQ R6 R5 K4 - 0x741A0001, // 0005 JMPT R6 #0008 - 0x1C180B05, // 0006 EQ R6 R5 K5 - 0x781A0000, // 0007 JMPF R6 #0009 - 0x80000C00, // 0008 RET 0 - 0x88180106, // 0009 GETMBR R6 R0 K6 - 0x8C180D07, // 000A GETMET R6 R6 K7 - 0x5C200200, // 000B MOVE R8 R1 - 0x7C180400, // 000C CALL R6 2 - 0x4C1C0000, // 000D LDNIL R7 - 0x20180C07, // 000E NE R6 R6 R7 - 0x781A0000, // 000F JMPF R6 #0011 - 0x80000C00, // 0010 RET 0 - 0x8C180908, // 0011 GETMET R6 R4 K8 - 0x5C200000, // 0012 MOVE R8 R0 - 0x00260801, // 0013 ADD R9 K4 R1 - 0x7C180600, // 0014 CALL R6 3 - 0x601C0004, // 0015 GETGBL R7 G4 - 0x5C200C00, // 0016 MOVE R8 R6 - 0x7C1C0200, // 0017 CALL R7 1 - 0x1C1C0F09, // 0018 EQ R7 R7 K9 - 0x781E0004, // 0019 JMPF R7 #001F - 0x5C1C0C00, // 001A MOVE R7 R6 - 0x5C200000, // 001B MOVE R8 R0 - 0x5C240400, // 001C MOVE R9 R2 - 0x7C1C0400, // 001D CALL R7 2 - 0x80000E00, // 001E RET 0 - 0x881C010A, // 001F GETMBR R7 R0 K10 - 0x8C1C0F0B, // 0020 GETMET R7 R7 K11 - 0x5C240200, // 0021 MOVE R9 R1 - 0x7C1C0400, // 0022 CALL R7 2 - 0x781E0029, // 0023 JMPF R7 #004E - 0x881C010A, // 0024 GETMBR R7 R0 K10 - 0x941C0E01, // 0025 GETIDX R7 R7 R1 - 0x8C200908, // 0026 GETMET R8 R4 K8 - 0x8828010C, // 0027 GETMBR R10 R0 K12 - 0x002E0807, // 0028 ADD R11 K4 R7 - 0x7C200600, // 0029 CALL R8 3 - 0x5C181000, // 002A MOVE R6 R8 - 0x8C20010D, // 002B GETMET R8 R0 K13 - 0x5C280E00, // 002C MOVE R10 R7 - 0x7C200400, // 002D CALL R8 2 - 0x78220003, // 002E JMPF R8 #0033 - 0x8C20010E, // 002F GETMET R8 R0 K14 - 0x5C280400, // 0030 MOVE R10 R2 - 0x7C200400, // 0031 CALL R8 2 - 0x5C081000, // 0032 MOVE R2 R8 - 0x60200004, // 0033 GETGBL R8 G4 - 0x5C240C00, // 0034 MOVE R9 R6 - 0x7C200200, // 0035 CALL R8 1 - 0x1C201109, // 0036 EQ R8 R8 K9 - 0x78220011, // 0037 JMPF R8 #004A - 0x8C200707, // 0038 GETMET R8 R3 K7 - 0x5C280E00, // 0039 MOVE R10 R7 - 0x582C000F, // 003A LDCONST R11 K15 - 0x7C200600, // 003B CALL R8 3 - 0x1C201102, // 003C EQ R8 R8 K2 - 0x78220005, // 003D JMPF R8 #0044 - 0x5C200C00, // 003E MOVE R8 R6 - 0x8824010C, // 003F GETMBR R9 R0 K12 - 0x5C280400, // 0040 MOVE R10 R2 - 0x582C0002, // 0041 LDCONST R11 K2 - 0x7C200600, // 0042 CALL R8 3 - 0x70020003, // 0043 JMP #0048 - 0x5C200C00, // 0044 MOVE R8 R6 - 0x8824010C, // 0045 GETMBR R9 R0 K12 - 0x5C280400, // 0046 MOVE R10 R2 - 0x7C200400, // 0047 CALL R8 2 - 0x80001000, // 0048 RET 0 - 0x70020002, // 0049 JMP #004D - 0x60200001, // 004A GETGBL R8 G1 - 0x00262007, // 004B ADD R9 K16 R7 - 0x7C200200, // 004C CALL R8 1 - 0x70020003, // 004D JMP #0052 - 0x601C0001, // 004E GETGBL R7 G1 - 0x58200011, // 004F LDCONST R8 K17 - 0x5C240200, // 0050 MOVE R9 R1 - 0x7C1C0400, // 0051 CALL R7 2 - 0x80000000, // 0052 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_val_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_set_val_rule_formula, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_val_rule_formula"), - /* K1 */ be_nested_str_literal("return / val -> ("), - /* K2 */ be_nested_str_literal(")"), - /* K3 */ be_nested_str_literal("_val_rule_function"), - /* K4 */ be_nested_str_literal("string"), - /* K5 */ be_nested_str_literal("format"), - /* K6 */ be_nested_str_literal("HSP: failed to compile '%s' - %s (%s)"), - }), - be_str_literal("set_val_rule_formula"), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x000A0202, // 0005 ADD R2 K1 R2 - 0x00080502, // 0006 ADD R2 R2 K2 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90020604, // 000D SETMBR R0 K3 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000C, // 000F JMP #001D - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020009, // 0011 JMP #001C - 0xA4160800, // 0012 IMPORT R5 K4 - 0x60180001, // 0013 GETGBL R6 G1 - 0x8C1C0B05, // 0014 GETMET R7 R5 K5 - 0x58240006, // 0015 LDCONST R9 K6 - 0x5C280400, // 0016 MOVE R10 R2 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x5C300800, // 0018 MOVE R12 R4 - 0x7C1C0A00, // 0019 CALL R7 5 - 0x7C180200, // 001A CALL R6 1 - 0x70020000, // 001B JMP #001D - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80000000, // 001D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_font -********************************************************************/ -be_local_closure(lvh_obj_set_text_font, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_literal("int"), - /* K1 */ be_nested_str_literal("lv"), - /* K2 */ be_nested_str_literal("font_embedded"), - /* K3 */ be_nested_str_literal("robotocondensed"), - /* K4 */ be_nested_str_literal("montserrat"), - /* K5 */ be_nested_str_literal("string"), - /* K6 */ be_nested_str_literal("split"), - /* K7 */ be_nested_str_literal(":"), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_literal("-"), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_literal("load_font"), - /* K12 */ be_const_int(2), - /* K13 */ be_nested_str_literal("concat"), - /* K14 */ be_nested_str_literal("_lv_obj"), - /* K15 */ be_nested_str_literal("set_style_text_font"), - /* K16 */ be_nested_str_literal("HSP: Unsupported font:"), - }), - be_str_literal("set_text_font"), - &be_const_str_solidified, - ( &(const binstruction[114]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x600C0004, // 0001 GETGBL R3 G4 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x1C0C0700, // 0004 EQ R3 R3 K0 - 0x780E001B, // 0005 JMPF R3 #0022 - 0xA8020007, // 0006 EXBLK 0 #000F - 0xB80E0200, // 0007 GETNGBL R3 K1 - 0x8C0C0702, // 0008 GETMET R3 R3 K2 - 0x58140003, // 0009 LDCONST R5 K3 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C0C0600, // 000B CALL R3 3 - 0x5C080600, // 000C MOVE R2 R3 - 0xA8040001, // 000D EXBLK 1 1 - 0x70020011, // 000E JMP #0021 - 0xAC0C0000, // 000F CATCH R3 0 0 - 0x7002000E, // 0010 JMP #0020 - 0xA8020007, // 0011 EXBLK 0 #001A - 0xB80E0200, // 0012 GETNGBL R3 K1 - 0x8C0C0702, // 0013 GETMET R3 R3 K2 - 0x58140004, // 0014 LDCONST R5 K4 - 0x5C180200, // 0015 MOVE R6 R1 - 0x7C0C0600, // 0016 CALL R3 3 - 0x5C080600, // 0017 MOVE R2 R3 - 0xA8040001, // 0018 EXBLK 1 1 - 0x70020004, // 0019 JMP #001F - 0xAC0C0000, // 001A CATCH R3 0 0 - 0x70020001, // 001B JMP #001E - 0x80000600, // 001C RET 0 - 0x70020000, // 001D JMP #001F - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x70020000, // 001F JMP #0021 - 0xB0080000, // 0020 RAISE 2 R0 R0 - 0x70020041, // 0021 JMP #0064 - 0x600C0004, // 0022 GETGBL R3 G4 - 0x5C100200, // 0023 MOVE R4 R1 - 0x7C0C0200, // 0024 CALL R3 1 - 0x1C0C0705, // 0025 EQ R3 R3 K5 - 0x780E003C, // 0026 JMPF R3 #0064 - 0xA40E0A00, // 0027 IMPORT R3 K5 - 0x8C100706, // 0028 GETMET R4 R3 K6 - 0x5C180200, // 0029 MOVE R6 R1 - 0x581C0007, // 002A LDCONST R7 K7 - 0x58200008, // 002B LDCONST R8 K8 - 0x7C100800, // 002C CALL R4 4 - 0x8C140706, // 002D GETMET R5 R3 K6 - 0x5C1C0200, // 002E MOVE R7 R1 - 0x58200009, // 002F LDCONST R8 K9 - 0x7C140600, // 0030 CALL R5 3 - 0x6018000C, // 0031 GETGBL R6 G12 - 0x5C1C0800, // 0032 MOVE R7 R4 - 0x7C180200, // 0033 CALL R6 1 - 0x24180D08, // 0034 GT R6 R6 K8 - 0x781A000A, // 0035 JMPF R6 #0041 - 0x6018000C, // 0036 GETGBL R6 G12 - 0x941C090A, // 0037 GETIDX R7 R4 K10 - 0x7C180200, // 0038 CALL R6 1 - 0x1C180D08, // 0039 EQ R6 R6 K8 - 0x781A0005, // 003A JMPF R6 #0041 - 0xB81A0200, // 003B GETNGBL R6 K1 - 0x8C180D0B, // 003C GETMET R6 R6 K11 - 0x5C200200, // 003D MOVE R8 R1 - 0x7C180400, // 003E CALL R6 2 - 0x5C080C00, // 003F MOVE R2 R6 - 0x70020022, // 0040 JMP #0064 - 0x6018000C, // 0041 GETGBL R6 G12 - 0x5C1C0A00, // 0042 MOVE R7 R5 - 0x7C180200, // 0043 CALL R6 1 - 0x28180D0C, // 0044 GE R6 R6 K12 - 0x781A001D, // 0045 JMPF R6 #0064 - 0x60180009, // 0046 GETGBL R6 G9 - 0x541DFFFE, // 0047 LDINT R7 -1 - 0x941C0A07, // 0048 GETIDX R7 R5 R7 - 0x7C180200, // 0049 CALL R6 1 - 0x541DFFFD, // 004A LDINT R7 -2 - 0x401E1407, // 004B CONNECT R7 K10 R7 - 0x941C0A07, // 004C GETIDX R7 R5 R7 - 0x8C1C0F0D, // 004D GETMET R7 R7 K13 - 0x58240009, // 004E LDCONST R9 K9 - 0x7C1C0400, // 004F CALL R7 2 - 0x24200D0A, // 0050 GT R8 R6 K10 - 0x78220011, // 0051 JMPF R8 #0064 - 0x6020000C, // 0052 GETGBL R8 G12 - 0x5C240E00, // 0053 MOVE R9 R7 - 0x7C200200, // 0054 CALL R8 1 - 0x2420110A, // 0055 GT R8 R8 K10 - 0x7822000C, // 0056 JMPF R8 #0064 - 0xA8020007, // 0057 EXBLK 0 #0060 - 0xB8220200, // 0058 GETNGBL R8 K1 - 0x8C201102, // 0059 GETMET R8 R8 K2 - 0x5C280E00, // 005A MOVE R10 R7 - 0x5C2C0C00, // 005B MOVE R11 R6 - 0x7C200600, // 005C CALL R8 3 - 0x5C081000, // 005D MOVE R2 R8 - 0xA8040001, // 005E EXBLK 1 1 - 0x70020003, // 005F JMP #0064 - 0xAC200000, // 0060 CATCH R8 0 0 - 0x70020000, // 0061 JMP #0063 - 0x70020000, // 0062 JMP #0064 - 0xB0080000, // 0063 RAISE 2 R0 R0 - 0x4C0C0000, // 0064 LDNIL R3 - 0x200C0403, // 0065 NE R3 R2 R3 - 0x780E0005, // 0066 JMPF R3 #006D - 0x880C010E, // 0067 GETMBR R3 R0 K14 - 0x8C0C070F, // 0068 GETMET R3 R3 K15 - 0x5C140400, // 0069 MOVE R5 R2 - 0x5818000A, // 006A LDCONST R6 K10 - 0x7C0C0600, // 006B CALL R3 3 - 0x70020003, // 006C JMP #0071 - 0x600C0001, // 006D GETGBL R3 G1 - 0x58100010, // 006E LDCONST R4 K16 - 0x5C140200, // 006F MOVE R5 R1 - 0x7C0C0400, // 0070 CALL R3 2 - 0x80000000, // 0071 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_align -********************************************************************/ -be_local_closure(lvh_obj_get_align, /* name */ +be_local_closure(lvh_obj_get_radius2, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -2181,97 +636,29 @@ be_local_closure(lvh_obj_get_align, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_label"), - /* K1 */ be_nested_str_literal("get_style_text_align"), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("TEXT_ALIGN_LEFT"), - /* K5 */ be_nested_str_literal("left"), - /* K6 */ be_nested_str_literal("TEXT_ALIGN_CENTER"), - /* K7 */ be_nested_str_literal("center"), - /* K8 */ be_nested_str_literal("TEXT_ALIGN_RIGHT"), - /* K9 */ be_nested_str_literal("right"), - }), - be_str_literal("get_align"), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060001, // 0003 JMPF R1 #0006 - 0x4C040000, // 0004 LDNIL R1 - 0x80040200, // 0005 RET 1 R1 - 0x4C040000, // 0006 LDNIL R1 - 0x88080100, // 0007 GETMBR R2 R0 K0 - 0x8C080501, // 0008 GETMET R2 R2 K1 - 0x58100002, // 0009 LDCONST R4 K2 - 0x7C080400, // 000A CALL R2 2 - 0xB80A0600, // 000B GETNGBL R2 K3 - 0x88080504, // 000C GETMBR R2 R2 K4 - 0x1C080202, // 000D EQ R2 R1 R2 - 0x780A0001, // 000E JMPF R2 #0011 - 0x80060A00, // 000F RET 1 K5 - 0x7002000D, // 0010 JMP #001F - 0xB80A0600, // 0011 GETNGBL R2 K3 - 0x88080506, // 0012 GETMBR R2 R2 K6 - 0x1C080202, // 0013 EQ R2 R1 R2 - 0x780A0001, // 0014 JMPF R2 #0017 - 0x80060E00, // 0015 RET 1 K7 - 0x70020007, // 0016 JMP #001F - 0xB80A0600, // 0017 GETNGBL R2 K3 - 0x88080508, // 0018 GETMBR R2 R2 K8 - 0x1C080202, // 0019 EQ R2 R1 R2 - 0x780A0001, // 001A JMPF R2 #001D - 0x80061200, // 001B RET 1 K9 - 0x70020001, // 001C JMP #001F - 0x4C080000, // 001D LDNIL R2 - 0x80040400, // 001E RET 1 R2 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_bottom2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_bottom2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_pad_bottom"), + /* K2 */ be_nested_str_literal("get_style_radius"), /* K3 */ be_nested_str_literal("lv"), /* K4 */ be_nested_str_literal("STATE_DEFAULT"), }), - be_str_literal("set_pad_bottom2"), + be_str_literal("get_radius2"), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 }) ) ); @@ -2279,12 +666,12 @@ be_local_closure(lvh_obj_set_pad_bottom2, /* name */ /******************************************************************** -** Solidified function: set_click +** Solidified function: get_text_rule ********************************************************************/ -be_local_closure(lvh_obj_set_click, /* name */ +be_local_closure(lvh_obj_get_text_rule, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2292,15 +679,13 @@ be_local_closure(lvh_obj_set_click, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("set_enabled"), + /* K0 */ be_nested_str_literal("_text_rule"), }), - be_str_literal("set_click"), + be_str_literal("get_text_rule"), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -2349,613 +734,6 @@ be_local_closure(lvh_obj_get_pad_right, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_text_color -********************************************************************/ -be_local_closure(lvh_obj_set_text_color, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("set_style_text_color"), - /* K2 */ be_nested_str_literal("parse_color"), - /* K3 */ be_const_int(0), - }), - be_str_literal("set_text_color"), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100102, // 0002 GETMET R4 R0 K2 - 0x5C180200, // 0003 MOVE R6 R1 - 0x7C100400, // 0004 CALL R4 2 - 0x58140003, // 0005 LDCONST R5 K3 - 0x7C080600, // 0006 CALL R2 3 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: check_label -********************************************************************/ -be_local_closure(lvh_obj_check_label, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_label"), - /* K1 */ be_nested_str_literal("lv"), - /* K2 */ be_nested_str_literal("label"), - /* K3 */ be_nested_str_literal("get_obj"), - /* K4 */ be_nested_str_literal("set_align"), - /* K5 */ be_nested_str_literal("ALIGN_CENTER"), - }), - be_str_literal("check_label"), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x7806000A, // 0003 JMPF R1 #000F - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x8C0C0103, // 0006 GETMET R3 R0 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x7C040400, // 0008 CALL R1 2 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x88040100, // 000A GETMBR R1 R0 K0 - 0x8C040304, // 000B GETMET R1 R1 K4 - 0xB80E0200, // 000C GETNGBL R3 K1 - 0x880C0705, // 000D GETMBR R3 R3 K5 - 0x7C040400, // 000E CALL R1 2 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val -********************************************************************/ -be_local_closure(lvh_obj_get_val, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("get_value"), - }), - be_str_literal("get_val"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: member -********************************************************************/ -be_local_closure(lvh_obj_member, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_literal("string"), - /* K1 */ be_nested_str_literal("introspect"), - /* K2 */ be_const_int(0), - /* K3 */ be_const_int(3), - /* K4 */ be_nested_str_literal("set_"), - /* K5 */ be_nested_str_literal("get_"), - /* K6 */ be_nested_str_literal("_attr_ignore"), - /* K7 */ be_nested_str_literal("find"), - /* K8 */ be_nested_str_literal("get"), - /* K9 */ be_nested_str_literal("function"), - /* K10 */ be_nested_str_literal("_attr_map"), - /* K11 */ be_nested_str_literal("contains"), - /* K12 */ be_nested_str_literal("_lv_obj"), - /* K13 */ be_nested_str_literal("style_"), - /* K14 */ be_nested_str_literal("unknown attribute "), - /* K15 */ be_nested_str_literal("value_error"), - }), - be_str_literal("member"), - &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x40120503, // 0002 CONNECT R4 K2 K3 - 0x94100204, // 0003 GETIDX R4 R1 R4 - 0x1C140904, // 0004 EQ R5 R4 K4 - 0x74160001, // 0005 JMPT R5 #0008 - 0x1C140905, // 0006 EQ R5 R4 K5 - 0x78160000, // 0007 JMPF R5 #0009 - 0x80000A00, // 0008 RET 0 - 0x88140106, // 0009 GETMBR R5 R0 K6 - 0x8C140B07, // 000A GETMET R5 R5 K7 - 0x5C1C0200, // 000B MOVE R7 R1 - 0x7C140400, // 000C CALL R5 2 - 0x4C180000, // 000D LDNIL R6 - 0x20140A06, // 000E NE R5 R5 R6 - 0x78160000, // 000F JMPF R5 #0011 - 0x80000A00, // 0010 RET 0 - 0x8C140708, // 0011 GETMET R5 R3 K8 - 0x5C1C0000, // 0012 MOVE R7 R0 - 0x00220A01, // 0013 ADD R8 K5 R1 - 0x7C140600, // 0014 CALL R5 3 - 0x60180004, // 0015 GETGBL R6 G4 - 0x5C1C0A00, // 0016 MOVE R7 R5 - 0x7C180200, // 0017 CALL R6 1 - 0x1C180D09, // 0018 EQ R6 R6 K9 - 0x781A0003, // 0019 JMPF R6 #001E - 0x5C180A00, // 001A MOVE R6 R5 - 0x5C1C0000, // 001B MOVE R7 R0 - 0x7C180200, // 001C CALL R6 1 - 0x80040C00, // 001D RET 1 R6 - 0x8818010A, // 001E GETMBR R6 R0 K10 - 0x8C180D0B, // 001F GETMET R6 R6 K11 - 0x5C200200, // 0020 MOVE R8 R1 - 0x7C180400, // 0021 CALL R6 2 - 0x781A001B, // 0022 JMPF R6 #003F - 0x8818010A, // 0023 GETMBR R6 R0 K10 - 0x94180C01, // 0024 GETIDX R6 R6 R1 - 0x8C1C0708, // 0025 GETMET R7 R3 K8 - 0x8824010C, // 0026 GETMBR R9 R0 K12 - 0x002A0A06, // 0027 ADD R10 K5 R6 - 0x7C1C0600, // 0028 CALL R7 3 - 0x5C140E00, // 0029 MOVE R5 R7 - 0x601C0004, // 002A GETGBL R7 G4 - 0x5C200A00, // 002B MOVE R8 R5 - 0x7C1C0200, // 002C CALL R7 1 - 0x1C1C0F09, // 002D EQ R7 R7 K9 - 0x781E000F, // 002E JMPF R7 #003F - 0x8C1C0507, // 002F GETMET R7 R2 K7 - 0x5C240C00, // 0030 MOVE R9 R6 - 0x5828000D, // 0031 LDCONST R10 K13 - 0x7C1C0600, // 0032 CALL R7 3 - 0x1C1C0F02, // 0033 EQ R7 R7 K2 - 0x781E0005, // 0034 JMPF R7 #003B - 0x5C1C0A00, // 0035 MOVE R7 R5 - 0x8820010C, // 0036 GETMBR R8 R0 K12 - 0x58240002, // 0037 LDCONST R9 K2 - 0x7C1C0400, // 0038 CALL R7 2 - 0x80040E00, // 0039 RET 1 R7 - 0x70020003, // 003A JMP #003F - 0x5C1C0A00, // 003B MOVE R7 R5 - 0x8820010C, // 003C GETMBR R8 R0 K12 - 0x7C1C0200, // 003D CALL R7 1 - 0x80040E00, // 003E RET 1 R7 - 0x60180008, // 003F GETGBL R6 G8 - 0x5C1C0200, // 0040 MOVE R7 R1 - 0x7C180200, // 0041 CALL R6 1 - 0x001A1C06, // 0042 ADD R6 K14 R6 - 0xB0061E06, // 0043 RAISE 1 K15 R6 - 0x80000000, // 0044 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: text_rule_matched -********************************************************************/ -be_local_closure(lvh_obj_text_rule_matched, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("int"), - /* K1 */ be_nested_str_literal("_text_rule_function"), - /* K2 */ be_nested_str_literal("string"), - /* K3 */ be_nested_str_literal("format"), - /* K4 */ be_nested_str_literal("HSP: failed to run self._text_rule_function - %s (%s)"), - /* K5 */ be_nested_str_literal("_text_rule_format"), - /* K6 */ be_nested_str_literal(""), - /* K7 */ be_nested_str_literal("text"), - }), - be_str_literal("text_rule_matched"), - &be_const_str_solidified, - ( &(const binstruction[49]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080500, // 0003 EQ R2 R2 K0 - 0x780A0003, // 0004 JMPF R2 #0009 - 0x6008000A, // 0005 GETGBL R2 G10 - 0x5C0C0200, // 0006 MOVE R3 R1 - 0x7C080200, // 0007 CALL R2 1 - 0x5C040400, // 0008 MOVE R1 R2 - 0x88080101, // 0009 GETMBR R2 R0 K1 - 0x4C0C0000, // 000A LDNIL R3 - 0x200C0403, // 000B NE R3 R2 R3 - 0x780E0012, // 000C JMPF R3 #0020 - 0xA8020005, // 000D EXBLK 0 #0014 - 0x5C0C0400, // 000E MOVE R3 R2 - 0x5C100200, // 000F MOVE R4 R1 - 0x7C0C0200, // 0010 CALL R3 1 - 0x5C040600, // 0011 MOVE R1 R3 - 0xA8040001, // 0012 EXBLK 1 1 - 0x7002000B, // 0013 JMP #0020 - 0xAC0C0002, // 0014 CATCH R3 0 2 - 0x70020008, // 0015 JMP #001F - 0xA4160400, // 0016 IMPORT R5 K2 - 0x60180001, // 0017 GETGBL R6 G1 - 0x8C1C0B03, // 0018 GETMET R7 R5 K3 - 0x58240004, // 0019 LDCONST R9 K4 - 0x5C280600, // 001A MOVE R10 R3 - 0x5C2C0800, // 001B MOVE R11 R4 - 0x7C1C0800, // 001C CALL R7 4 - 0x7C180200, // 001D CALL R6 1 - 0x70020000, // 001E JMP #0020 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x880C0105, // 0020 GETMBR R3 R0 K5 - 0x60100004, // 0021 GETGBL R4 G4 - 0x5C140600, // 0022 MOVE R5 R3 - 0x7C100200, // 0023 CALL R4 1 - 0x1C100902, // 0024 EQ R4 R4 K2 - 0x78120006, // 0025 JMPF R4 #002D - 0xA4120400, // 0026 IMPORT R4 K2 - 0x8C140903, // 0027 GETMET R5 R4 K3 - 0x5C1C0600, // 0028 MOVE R7 R3 - 0x5C200200, // 0029 MOVE R8 R1 - 0x7C140600, // 002A CALL R5 3 - 0x5C0C0A00, // 002B MOVE R3 R5 - 0x70020000, // 002C JMP #002E - 0x580C0006, // 002D LDCONST R3 K6 - 0x90020E03, // 002E SETMBR R0 K7 R3 - 0x50100000, // 002F LDBOOL R4 0 0 - 0x80040800, // 0030 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_mode -********************************************************************/ -be_local_closure(lvh_obj_set_mode, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_literal("expand"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_width"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("SIZE_CONTENT"), - /* K5 */ be_nested_str_literal("break"), - /* K6 */ be_nested_str_literal("LABEL_LONG_WRAP"), - /* K7 */ be_nested_str_literal("dots"), - /* K8 */ be_nested_str_literal("LABEL_LONG_DOT"), - /* K9 */ be_nested_str_literal("scroll"), - /* K10 */ be_nested_str_literal("LABEL_LONG_SCROLL"), - /* K11 */ be_nested_str_literal("loop"), - /* K12 */ be_nested_str_literal("LABEL_LONG_SCROLL_CIRCULAR"), - /* K13 */ be_nested_str_literal("crop"), - /* K14 */ be_nested_str_literal("LABEL_LONG_CLIP"), - /* K15 */ be_nested_str_literal("check_label"), - /* K16 */ be_nested_str_literal("_lv_label"), - /* K17 */ be_nested_str_literal("set_long_mode"), - }), - be_str_literal("set_mode"), - &be_const_str_solidified, - ( &(const binstruction[43]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C0C0300, // 0001 EQ R3 R1 K0 - 0x780E0005, // 0002 JMPF R3 #0009 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0xB8160600, // 0005 GETNGBL R5 K3 - 0x88140B04, // 0006 GETMBR R5 R5 K4 - 0x7C0C0400, // 0007 CALL R3 2 - 0x70020017, // 0008 JMP #0021 - 0x1C0C0305, // 0009 EQ R3 R1 K5 - 0x780E0002, // 000A JMPF R3 #000E - 0xB80E0600, // 000B GETNGBL R3 K3 - 0x88080706, // 000C GETMBR R2 R3 K6 - 0x70020012, // 000D JMP #0021 - 0x1C0C0307, // 000E EQ R3 R1 K7 - 0x780E0002, // 000F JMPF R3 #0013 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x88080708, // 0011 GETMBR R2 R3 K8 - 0x7002000D, // 0012 JMP #0021 - 0x1C0C0309, // 0013 EQ R3 R1 K9 - 0x780E0002, // 0014 JMPF R3 #0018 - 0xB80E0600, // 0015 GETNGBL R3 K3 - 0x8808070A, // 0016 GETMBR R2 R3 K10 - 0x70020008, // 0017 JMP #0021 - 0x1C0C030B, // 0018 EQ R3 R1 K11 - 0x780E0002, // 0019 JMPF R3 #001D - 0xB80E0600, // 001A GETNGBL R3 K3 - 0x8808070C, // 001B GETMBR R2 R3 K12 - 0x70020003, // 001C JMP #0021 - 0x1C0C030D, // 001D EQ R3 R1 K13 - 0x780E0001, // 001E JMPF R3 #0021 - 0xB80E0600, // 001F GETNGBL R3 K3 - 0x8808070E, // 0020 GETMBR R2 R3 K14 - 0x4C0C0000, // 0021 LDNIL R3 - 0x200C0403, // 0022 NE R3 R2 R3 - 0x780E0005, // 0023 JMPF R3 #002A - 0x8C0C010F, // 0024 GETMET R3 R0 K15 - 0x7C0C0200, // 0025 CALL R3 1 - 0x880C0110, // 0026 GETMBR R3 R0 K16 - 0x8C0C0711, // 0027 GETMET R3 R3 K17 - 0x5C140400, // 0028 MOVE R5 R2 - 0x7C0C0400, // 0029 CALL R3 2 - 0x80000000, // 002A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_text_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_set_text_rule_formula, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_text_rule_formula"), - /* K1 */ be_nested_str_literal("return / val -> ("), - /* K2 */ be_nested_str_literal(")"), - /* K3 */ be_nested_str_literal("_text_rule_function"), - /* K4 */ be_nested_str_literal("string"), - /* K5 */ be_nested_str_literal("format"), - /* K6 */ be_nested_str_literal("HSP: failed to compile '%s' - %s (%s)"), - }), - be_str_literal("set_text_rule_formula"), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x000A0202, // 0005 ADD R2 K1 R2 - 0x00080502, // 0006 ADD R2 R2 K2 - 0xA8020007, // 0007 EXBLK 0 #0010 - 0x600C000D, // 0008 GETGBL R3 G13 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x5C100600, // 000B MOVE R4 R3 - 0x7C100000, // 000C CALL R4 0 - 0x90020604, // 000D SETMBR R0 K3 R4 - 0xA8040001, // 000E EXBLK 1 1 - 0x7002000C, // 000F JMP #001D - 0xAC0C0002, // 0010 CATCH R3 0 2 - 0x70020009, // 0011 JMP #001C - 0xA4160800, // 0012 IMPORT R5 K4 - 0x60180001, // 0013 GETGBL R6 G1 - 0x8C1C0B05, // 0014 GETMET R7 R5 K5 - 0x58240006, // 0015 LDCONST R9 K6 - 0x5C280400, // 0016 MOVE R10 R2 - 0x5C2C0600, // 0017 MOVE R11 R3 - 0x5C300800, // 0018 MOVE R12 R4 - 0x7C1C0A00, // 0019 CALL R7 5 - 0x7C180200, // 001A CALL R6 1 - 0x70020000, // 001B JMP #001D - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x80000000, // 001D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_hidden -********************************************************************/ -be_local_closure(lvh_obj_get_hidden, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("has_flag"), - /* K2 */ be_nested_str_literal("lv"), - /* K3 */ be_nested_str_literal("OBJ_FLAG_HIDDEN"), - }), - be_str_literal("get_hidden"), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0xB80E0400, // 0002 GETNGBL R3 K2 - 0x880C0703, // 0003 GETMBR R3 R3 K3 - 0x7C040400, // 0004 CALL R1 2 - 0x80040200, // 0005 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: post_init -********************************************************************/ -be_local_closure(lvh_obj_post_init, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("register_event_cb"), - }), - be_str_literal("post_init"), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_val_rule_formula -********************************************************************/ -be_local_closure(lvh_obj_get_val_rule_formula, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_val_rule_formula"), - }), - be_str_literal("get_val_rule_formula"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_color -********************************************************************/ -be_local_closure(lvh_obj_get_value_color, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("get_value_color"), - }), - be_str_literal("get_value_color"), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_top -********************************************************************/ -be_local_closure(lvh_obj_get_pad_top, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("get_style_pad_top"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("get_pad_top"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: set_value_ofs_y ********************************************************************/ @@ -2992,409 +770,6 @@ be_local_closure(lvh_obj_set_value_ofs_y, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_pad_left -********************************************************************/ -be_local_closure(lvh_obj_get_pad_left, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("get_style_pad_left"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("get_pad_left"), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060007, // 0003 JMPF R1 #000C - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0100, // 0006 GETMBR R3 R0 K0 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x88100904, // 0008 GETMBR R4 R4 K4 - 0x300C0604, // 0009 OR R3 R3 R4 - 0x7C040400, // 000A CALL R1 2 - 0x80040200, // 000B RET 1 R1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_font -********************************************************************/ -be_local_closure(lvh_obj_set_value_font, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("set_text_font"), - }), - be_str_literal("set_value_font"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_pad_top2 -********************************************************************/ -be_local_closure(lvh_obj_set_pad_top2, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_lv_part2_selector"), - /* K1 */ be_nested_str_literal("_lv_obj"), - /* K2 */ be_nested_str_literal("set_style_pad_top"), - /* K3 */ be_nested_str_literal("lv"), - /* K4 */ be_nested_str_literal("STATE_DEFAULT"), - }), - be_str_literal("set_pad_top2"), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0009, // 0003 JMPF R2 #000E - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C080502, // 0005 GETMET R2 R2 K2 - 0x60100009, // 0006 GETGBL R4 G9 - 0x5C140200, // 0007 MOVE R5 R1 - 0x7C100200, // 0008 CALL R4 1 - 0x88140100, // 0009 GETMBR R5 R0 K0 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x88180D04, // 000B GETMBR R6 R6 K4 - 0x30140A06, // 000C OR R5 R5 R6 - 0x7C080600, // 000D CALL R2 3 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: val_rule_matched -********************************************************************/ -be_local_closure(lvh_obj_val_rule_matched, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* 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_str_literal("_val_rule_function"), - /* K1 */ be_nested_str_literal("string"), - /* K2 */ be_nested_str_literal("format"), - /* K3 */ be_nested_str_literal("HSP: failed to run self._val_rule_function - %s (%s)"), - /* K4 */ be_nested_str_literal("val"), - }), - be_str_literal("val_rule_matched"), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0x6008000A, // 0000 GETGBL R2 G10 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x4C100000, // 0004 LDNIL R4 - 0x20100604, // 0005 NE R4 R3 R4 - 0x78120012, // 0006 JMPF R4 #001A - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C100200, // 000A CALL R4 1 - 0x5C080800, // 000B MOVE R2 R4 - 0xA8040001, // 000C EXBLK 1 1 - 0x7002000B, // 000D JMP #001A - 0xAC100002, // 000E CATCH R4 0 2 - 0x70020008, // 000F JMP #0019 - 0xA41A0200, // 0010 IMPORT R6 K1 - 0x601C0001, // 0011 GETGBL R7 G1 - 0x8C200D02, // 0012 GETMET R8 R6 K2 - 0x58280003, // 0013 LDCONST R10 K3 - 0x5C2C0800, // 0014 MOVE R11 R4 - 0x5C300A00, // 0015 MOVE R12 R5 - 0x7C200800, // 0016 CALL R8 4 - 0x7C1C0200, // 0017 CALL R7 1 - 0x70020000, // 0018 JMP #001A - 0xB0080000, // 0019 RAISE 2 R0 R0 - 0x60100009, // 001A GETGBL R4 G9 - 0x5C140400, // 001B MOVE R5 R2 - 0x7C100200, // 001C CALL R4 1 - 0x90020804, // 001D SETMBR R0 K4 R4 - 0x50100000, // 001E LDBOOL R4 0 0 - 0x80040800, // 001F RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_pad_all -********************************************************************/ -be_local_closure(lvh_obj_get_pad_all, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_literal("get_pad_all"), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_action -********************************************************************/ -be_local_closure(lvh_obj_set_action, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_action"), - }), - be_str_literal("set_action"), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x60080008, // 0000 GETGBL R2 G8 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_text_font -********************************************************************/ -be_local_closure(lvh_obj_get_text_font, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_literal("get_text_font"), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_color_attribute -********************************************************************/ -be_local_closure(lvh_obj_is_color_attribute, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_literal("re"), - /* K1 */ be_nested_str_literal("search"), - /* K2 */ be_nested_str_literal("color$"), - }), - be_str_literal("is_color_attribute"), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080017, // 0001 GETGBL R2 G23 - 0x8C0C0301, // 0002 GETMET R3 R1 K1 - 0x58140002, // 0003 LDCONST R5 K2 - 0x60180008, // 0004 GETGBL R6 G8 - 0x5C1C0000, // 0005 MOVE R7 R0 - 0x7C180200, // 0006 CALL R6 1 - 0x7C0C0600, // 0007 CALL R3 3 - 0x7C080200, // 0008 CALL R2 1 - 0x80040400, // 0009 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_str -********************************************************************/ -be_local_closure(lvh_obj_set_value_str, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("set_text"), - }), - be_str_literal("set_value_str"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_line_width -********************************************************************/ -be_local_closure(lvh_obj_get_line_width, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("get_style_line_width"), - /* K2 */ be_const_int(0), - }), - be_str_literal("get_line_width"), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x80040200, // 0004 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_mode -********************************************************************/ -be_local_closure(lvh_obj_get_mode, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_literal("get_mode"), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_obj -********************************************************************/ -be_local_closure(lvh_obj_get_obj, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_obj"), - }), - be_str_literal("get_obj"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_color ********************************************************************/ @@ -3554,6 +929,2633 @@ be_local_closure(lvh_obj_parse_color, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: get_text_font +********************************************************************/ +be_local_closure(lvh_obj_get_text_font, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_text_font"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: text_rule_matched +********************************************************************/ +be_local_closure(lvh_obj_text_rule_matched, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("int"), + /* K1 */ be_nested_str_literal("_text_rule_function"), + /* K2 */ be_nested_str_literal("string"), + /* K3 */ be_nested_str_literal("format"), + /* K4 */ be_nested_str_literal("HSP: failed to run self._text_rule_function - %s (%s)"), + /* K5 */ be_nested_str_literal("_text_rule_format"), + /* K6 */ be_nested_str_literal(""), + /* K7 */ be_nested_str_literal("text"), + }), + be_str_literal("text_rule_matched"), + &be_const_str_solidified, + ( &(const binstruction[49]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080500, // 0003 EQ R2 R2 K0 + 0x780A0003, // 0004 JMPF R2 #0009 + 0x6008000A, // 0005 GETGBL R2 G10 + 0x5C0C0200, // 0006 MOVE R3 R1 + 0x7C080200, // 0007 CALL R2 1 + 0x5C040400, // 0008 MOVE R1 R2 + 0x88080101, // 0009 GETMBR R2 R0 K1 + 0x4C0C0000, // 000A LDNIL R3 + 0x200C0403, // 000B NE R3 R2 R3 + 0x780E0012, // 000C JMPF R3 #0020 + 0xA8020005, // 000D EXBLK 0 #0014 + 0x5C0C0400, // 000E MOVE R3 R2 + 0x5C100200, // 000F MOVE R4 R1 + 0x7C0C0200, // 0010 CALL R3 1 + 0x5C040600, // 0011 MOVE R1 R3 + 0xA8040001, // 0012 EXBLK 1 1 + 0x7002000B, // 0013 JMP #0020 + 0xAC0C0002, // 0014 CATCH R3 0 2 + 0x70020008, // 0015 JMP #001F + 0xA4160400, // 0016 IMPORT R5 K2 + 0x60180001, // 0017 GETGBL R6 G1 + 0x8C1C0B03, // 0018 GETMET R7 R5 K3 + 0x58240004, // 0019 LDCONST R9 K4 + 0x5C280600, // 001A MOVE R10 R3 + 0x5C2C0800, // 001B MOVE R11 R4 + 0x7C1C0800, // 001C CALL R7 4 + 0x7C180200, // 001D CALL R6 1 + 0x70020000, // 001E JMP #0020 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x880C0105, // 0020 GETMBR R3 R0 K5 + 0x60100004, // 0021 GETGBL R4 G4 + 0x5C140600, // 0022 MOVE R5 R3 + 0x7C100200, // 0023 CALL R4 1 + 0x1C100902, // 0024 EQ R4 R4 K2 + 0x78120006, // 0025 JMPF R4 #002D + 0xA4120400, // 0026 IMPORT R4 K2 + 0x8C140903, // 0027 GETMET R5 R4 K3 + 0x5C1C0600, // 0028 MOVE R7 R3 + 0x5C200200, // 0029 MOVE R8 R1 + 0x7C140600, // 002A CALL R5 3 + 0x5C0C0A00, // 002B MOVE R3 R5 + 0x70020000, // 002C JMP #002E + 0x580C0006, // 002D LDCONST R3 K6 + 0x90020E03, // 002E SETMBR R0 K7 R3 + 0x50100000, // 002F LDBOOL R4 0 0 + 0x80040800, // 0030 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_bottom2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_bottom2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_style_pad_bottom"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("set_pad_bottom2"), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_align +********************************************************************/ +be_local_closure(lvh_obj_set_align, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_literal("check_label"), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_literal("left"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("TEXT_ALIGN_LEFT"), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_literal("center"), + /* K7 */ be_nested_str_literal("TEXT_ALIGN_CENTER"), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_literal("right"), + /* K10 */ be_nested_str_literal("TEXT_ALIGN_RIGHT"), + /* K11 */ be_nested_str_literal("_lv_label"), + /* K12 */ be_nested_str_literal("set_style_text_align"), + }), + be_str_literal("set_align"), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x8C0C0100, // 0001 GETMET R3 R0 K0 + 0x7C0C0200, // 0002 CALL R3 1 + 0x1C0C0301, // 0003 EQ R3 R1 K1 + 0x740E0001, // 0004 JMPT R3 #0007 + 0x1C0C0302, // 0005 EQ R3 R1 K2 + 0x780E0002, // 0006 JMPF R3 #000A + 0xB80E0600, // 0007 GETNGBL R3 K3 + 0x88080704, // 0008 GETMBR R2 R3 K4 + 0x7002000C, // 0009 JMP #0017 + 0x1C0C0305, // 000A EQ R3 R1 K5 + 0x740E0001, // 000B JMPT R3 #000E + 0x1C0C0306, // 000C EQ R3 R1 K6 + 0x780E0002, // 000D JMPF R3 #0011 + 0xB80E0600, // 000E GETNGBL R3 K3 + 0x88080707, // 000F GETMBR R2 R3 K7 + 0x70020005, // 0010 JMP #0017 + 0x1C0C0308, // 0011 EQ R3 R1 K8 + 0x740E0001, // 0012 JMPT R3 #0015 + 0x1C0C0309, // 0013 EQ R3 R1 K9 + 0x780E0001, // 0014 JMPF R3 #0017 + 0xB80E0600, // 0015 GETNGBL R3 K3 + 0x8808070A, // 0016 GETMBR R2 R3 K10 + 0x880C010B, // 0017 GETMBR R3 R0 K11 + 0x8C0C070C, // 0018 GETMET R3 R3 K12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x58180001, // 001A LDCONST R6 K1 + 0x7C0C0600, // 001B CALL R3 3 + 0x80000000, // 001C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule_format +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule_format, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_text_rule_format"), + }), + be_str_literal("set_text_rule_format"), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val +********************************************************************/ +be_local_closure(lvh_obj_set_val, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_value"), + }), + be_str_literal("set_val"), + &be_const_str_solidified, + ( &(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 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule_format +********************************************************************/ +be_local_closure(lvh_obj_get_text_rule_format, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_text_rule_format"), + }), + be_str_literal("get_text_rule_format"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_action +********************************************************************/ +be_local_closure(lvh_obj_set_action, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_action"), + }), + be_str_literal("set_action"), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule_formula, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_text_rule_formula"), + /* K1 */ be_nested_str_literal("return / val -> ("), + /* K2 */ be_nested_str_literal(")"), + /* K3 */ be_nested_str_literal("_text_rule_function"), + /* K4 */ be_nested_str_literal("string"), + /* K5 */ be_nested_str_literal("format"), + /* K6 */ be_nested_str_literal("HSP: failed to compile '%s' - %s (%s)"), + }), + be_str_literal("set_text_rule_formula"), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x000A0202, // 0005 ADD R2 K1 R2 + 0x00080502, // 0006 ADD R2 R2 K2 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000C, // 000F JMP #001D + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020009, // 0011 JMP #001C + 0xA4160800, // 0012 IMPORT R5 K4 + 0x60180001, // 0013 GETGBL R6 G1 + 0x8C1C0B05, // 0014 GETMET R7 R5 K5 + 0x58240006, // 0015 LDCONST R9 K6 + 0x5C280400, // 0016 MOVE R10 R2 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x5C300800, // 0018 MOVE R12 R4 + 0x7C1C0A00, // 0019 CALL R7 5 + 0x7C180200, // 001A CALL R6 1 + 0x70020000, // 001B JMP #001D + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: val_rule_matched +********************************************************************/ +be_local_closure(lvh_obj_val_rule_matched, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_val_rule_function"), + /* K1 */ be_nested_str_literal("string"), + /* K2 */ be_nested_str_literal("format"), + /* K3 */ be_nested_str_literal("HSP: failed to run self._val_rule_function - %s (%s)"), + /* K4 */ be_nested_str_literal("val"), + }), + be_str_literal("val_rule_matched"), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x6008000A, // 0000 GETGBL R2 G10 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x4C100000, // 0004 LDNIL R4 + 0x20100604, // 0005 NE R4 R3 R4 + 0x78120012, // 0006 JMPF R4 #001A + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C100600, // 0008 MOVE R4 R3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C100200, // 000A CALL R4 1 + 0x5C080800, // 000B MOVE R2 R4 + 0xA8040001, // 000C EXBLK 1 1 + 0x7002000B, // 000D JMP #001A + 0xAC100002, // 000E CATCH R4 0 2 + 0x70020008, // 000F JMP #0019 + 0xA41A0200, // 0010 IMPORT R6 K1 + 0x601C0001, // 0011 GETGBL R7 G1 + 0x8C200D02, // 0012 GETMET R8 R6 K2 + 0x58280003, // 0013 LDCONST R10 K3 + 0x5C2C0800, // 0014 MOVE R11 R4 + 0x5C300A00, // 0015 MOVE R12 R5 + 0x7C200800, // 0016 CALL R8 4 + 0x7C1C0200, // 0017 CALL R7 1 + 0x70020000, // 0018 JMP #001A + 0xB0080000, // 0019 RAISE 2 R0 R0 + 0x60100009, // 001A GETGBL R4 G9 + 0x5C140400, // 001B MOVE R5 R2 + 0x7C100200, // 001C CALL R4 1 + 0x90020804, // 001D SETMBR R0 K4 R4 + 0x50100000, // 001E LDBOOL R4 0 0 + 0x80040800, // 001F RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_trailing_zeroes +********************************************************************/ +be_local_closure(lvh_obj_remove_trailing_zeroes, /* 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[ 3]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_literal("resize"), + }), + be_str_literal("remove_trailing_zeroes"), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x6004000C, // 0000 GETGBL R1 G12 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x58080000, // 0003 LDCONST R2 K0 + 0x140C0401, // 0004 LT R3 R2 R1 + 0x780E0007, // 0005 JMPF R3 #000E + 0x540DFFFE, // 0006 LDINT R3 -1 + 0x040C0602, // 0007 SUB R3 R3 R2 + 0x940C0003, // 0008 GETIDX R3 R0 R3 + 0x200C0700, // 0009 NE R3 R3 K0 + 0x780E0000, // 000A JMPF R3 #000C + 0x70020001, // 000B JMP #000E + 0x00080501, // 000C ADD R2 R2 K1 + 0x7001FFF5, // 000D JMP #0004 + 0x240C0500, // 000E GT R3 R2 K0 + 0x780E0005, // 000F JMPF R3 #0016 + 0x8C0C0102, // 0010 GETMET R3 R0 K2 + 0x6014000C, // 0011 GETGBL R5 G12 + 0x5C180000, // 0012 MOVE R6 R0 + 0x7C140200, // 0013 CALL R5 1 + 0x04140A02, // 0014 SUB R5 R5 R2 + 0x7C0C0400, // 0015 CALL R3 2 + 0x80040000, // 0016 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: post_init +********************************************************************/ +be_local_closure(lvh_obj_post_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("register_event_cb"), + }), + be_str_literal("post_init"), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_mode +********************************************************************/ +be_local_closure(lvh_obj_get_mode, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_mode"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_top2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_top2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_style_pad_top"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("set_pad_top2"), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_font +********************************************************************/ +be_local_closure(lvh_obj_set_value_font, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("set_text_font"), + }), + be_str_literal("set_value_font"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_enabled +********************************************************************/ +be_local_closure(lvh_obj_set_enabled, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("add_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), + /* K4 */ be_nested_str_literal("clear_flag"), + }), + be_str_literal("set_enabled"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_align +********************************************************************/ +be_local_closure(lvh_obj_get_align, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_label"), + /* K1 */ be_nested_str_literal("get_style_text_align"), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("TEXT_ALIGN_LEFT"), + /* K5 */ be_nested_str_literal("left"), + /* K6 */ be_nested_str_literal("TEXT_ALIGN_CENTER"), + /* K7 */ be_nested_str_literal("center"), + /* K8 */ be_nested_str_literal("TEXT_ALIGN_RIGHT"), + /* K9 */ be_nested_str_literal("right"), + }), + be_str_literal("get_align"), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060001, // 0003 JMPF R1 #0006 + 0x4C040000, // 0004 LDNIL R1 + 0x80040200, // 0005 RET 1 R1 + 0x4C040000, // 0006 LDNIL R1 + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080501, // 0008 GETMET R2 R2 K1 + 0x58100002, // 0009 LDCONST R4 K2 + 0x7C080400, // 000A CALL R2 2 + 0xB80A0600, // 000B GETNGBL R2 K3 + 0x88080504, // 000C GETMBR R2 R2 K4 + 0x1C080202, // 000D EQ R2 R1 R2 + 0x780A0001, // 000E JMPF R2 #0011 + 0x80060A00, // 000F RET 1 K5 + 0x7002000D, // 0010 JMP #001F + 0xB80A0600, // 0011 GETNGBL R2 K3 + 0x88080506, // 0012 GETMBR R2 R2 K6 + 0x1C080202, // 0013 EQ R2 R1 R2 + 0x780A0001, // 0014 JMPF R2 #0017 + 0x80060E00, // 0015 RET 1 K7 + 0x70020007, // 0016 JMP #001F + 0xB80A0600, // 0017 GETNGBL R2 K3 + 0x88080508, // 0018 GETMBR R2 R2 K8 + 0x1C080202, // 0019 EQ R2 R1 R2 + 0x780A0001, // 001A JMPF R2 #001D + 0x80061200, // 001B RET 1 K9 + 0x70020001, // 001C JMP #001F + 0x4C080000, // 001D LDNIL R2 + 0x80040400, // 001E RET 1 R2 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_left +********************************************************************/ +be_local_closure(lvh_obj_get_pad_left, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("get_style_pad_left"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("get_pad_left"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_font +********************************************************************/ +be_local_closure(lvh_obj_set_text_font, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_literal("int"), + /* K1 */ be_nested_str_literal("lv"), + /* K2 */ be_nested_str_literal("font_embedded"), + /* K3 */ be_nested_str_literal("robotocondensed"), + /* K4 */ be_nested_str_literal("montserrat"), + /* K5 */ be_nested_str_literal("string"), + /* K6 */ be_nested_str_literal("split"), + /* K7 */ be_nested_str_literal(":"), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_literal("-"), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_literal("load_font"), + /* K12 */ be_const_int(2), + /* K13 */ be_nested_str_literal("concat"), + /* K14 */ be_nested_str_literal("_lv_obj"), + /* K15 */ be_nested_str_literal("set_style_text_font"), + /* K16 */ be_nested_str_literal("HSP: Unsupported font:"), + }), + be_str_literal("set_text_font"), + &be_const_str_solidified, + ( &(const binstruction[114]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x600C0004, // 0001 GETGBL R3 G4 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x1C0C0700, // 0004 EQ R3 R3 K0 + 0x780E001B, // 0005 JMPF R3 #0022 + 0xA8020007, // 0006 EXBLK 0 #000F + 0xB80E0200, // 0007 GETNGBL R3 K1 + 0x8C0C0702, // 0008 GETMET R3 R3 K2 + 0x58140003, // 0009 LDCONST R5 K3 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C0C0600, // 000B CALL R3 3 + 0x5C080600, // 000C MOVE R2 R3 + 0xA8040001, // 000D EXBLK 1 1 + 0x70020011, // 000E JMP #0021 + 0xAC0C0000, // 000F CATCH R3 0 0 + 0x7002000E, // 0010 JMP #0020 + 0xA8020007, // 0011 EXBLK 0 #001A + 0xB80E0200, // 0012 GETNGBL R3 K1 + 0x8C0C0702, // 0013 GETMET R3 R3 K2 + 0x58140004, // 0014 LDCONST R5 K4 + 0x5C180200, // 0015 MOVE R6 R1 + 0x7C0C0600, // 0016 CALL R3 3 + 0x5C080600, // 0017 MOVE R2 R3 + 0xA8040001, // 0018 EXBLK 1 1 + 0x70020004, // 0019 JMP #001F + 0xAC0C0000, // 001A CATCH R3 0 0 + 0x70020001, // 001B JMP #001E + 0x80000600, // 001C RET 0 + 0x70020000, // 001D JMP #001F + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x70020000, // 001F JMP #0021 + 0xB0080000, // 0020 RAISE 2 R0 R0 + 0x70020041, // 0021 JMP #0064 + 0x600C0004, // 0022 GETGBL R3 G4 + 0x5C100200, // 0023 MOVE R4 R1 + 0x7C0C0200, // 0024 CALL R3 1 + 0x1C0C0705, // 0025 EQ R3 R3 K5 + 0x780E003C, // 0026 JMPF R3 #0064 + 0xA40E0A00, // 0027 IMPORT R3 K5 + 0x8C100706, // 0028 GETMET R4 R3 K6 + 0x5C180200, // 0029 MOVE R6 R1 + 0x581C0007, // 002A LDCONST R7 K7 + 0x58200008, // 002B LDCONST R8 K8 + 0x7C100800, // 002C CALL R4 4 + 0x8C140706, // 002D GETMET R5 R3 K6 + 0x5C1C0200, // 002E MOVE R7 R1 + 0x58200009, // 002F LDCONST R8 K9 + 0x7C140600, // 0030 CALL R5 3 + 0x6018000C, // 0031 GETGBL R6 G12 + 0x5C1C0800, // 0032 MOVE R7 R4 + 0x7C180200, // 0033 CALL R6 1 + 0x24180D08, // 0034 GT R6 R6 K8 + 0x781A000A, // 0035 JMPF R6 #0041 + 0x6018000C, // 0036 GETGBL R6 G12 + 0x941C090A, // 0037 GETIDX R7 R4 K10 + 0x7C180200, // 0038 CALL R6 1 + 0x1C180D08, // 0039 EQ R6 R6 K8 + 0x781A0005, // 003A JMPF R6 #0041 + 0xB81A0200, // 003B GETNGBL R6 K1 + 0x8C180D0B, // 003C GETMET R6 R6 K11 + 0x5C200200, // 003D MOVE R8 R1 + 0x7C180400, // 003E CALL R6 2 + 0x5C080C00, // 003F MOVE R2 R6 + 0x70020022, // 0040 JMP #0064 + 0x6018000C, // 0041 GETGBL R6 G12 + 0x5C1C0A00, // 0042 MOVE R7 R5 + 0x7C180200, // 0043 CALL R6 1 + 0x28180D0C, // 0044 GE R6 R6 K12 + 0x781A001D, // 0045 JMPF R6 #0064 + 0x60180009, // 0046 GETGBL R6 G9 + 0x541DFFFE, // 0047 LDINT R7 -1 + 0x941C0A07, // 0048 GETIDX R7 R5 R7 + 0x7C180200, // 0049 CALL R6 1 + 0x541DFFFD, // 004A LDINT R7 -2 + 0x401E1407, // 004B CONNECT R7 K10 R7 + 0x941C0A07, // 004C GETIDX R7 R5 R7 + 0x8C1C0F0D, // 004D GETMET R7 R7 K13 + 0x58240009, // 004E LDCONST R9 K9 + 0x7C1C0400, // 004F CALL R7 2 + 0x24200D0A, // 0050 GT R8 R6 K10 + 0x78220011, // 0051 JMPF R8 #0064 + 0x6020000C, // 0052 GETGBL R8 G12 + 0x5C240E00, // 0053 MOVE R9 R7 + 0x7C200200, // 0054 CALL R8 1 + 0x2420110A, // 0055 GT R8 R8 K10 + 0x7822000C, // 0056 JMPF R8 #0064 + 0xA8020007, // 0057 EXBLK 0 #0060 + 0xB8220200, // 0058 GETNGBL R8 K1 + 0x8C201102, // 0059 GETMET R8 R8 K2 + 0x5C280E00, // 005A MOVE R10 R7 + 0x5C2C0C00, // 005B MOVE R11 R6 + 0x7C200600, // 005C CALL R8 3 + 0x5C081000, // 005D MOVE R2 R8 + 0xA8040001, // 005E EXBLK 1 1 + 0x70020003, // 005F JMP #0064 + 0xAC200000, // 0060 CATCH R8 0 0 + 0x70020000, // 0061 JMP #0063 + 0x70020000, // 0062 JMP #0064 + 0xB0080000, // 0063 RAISE 2 R0 R0 + 0x4C0C0000, // 0064 LDNIL R3 + 0x200C0403, // 0065 NE R3 R2 R3 + 0x780E0005, // 0066 JMPF R3 #006D + 0x880C010E, // 0067 GETMBR R3 R0 K14 + 0x8C0C070F, // 0068 GETMET R3 R3 K15 + 0x5C140400, // 0069 MOVE R5 R2 + 0x5818000A, // 006A LDCONST R6 K10 + 0x7C0C0600, // 006B CALL R3 3 + 0x70020003, // 006C JMP #0071 + 0x600C0001, // 006D GETGBL R3 G1 + 0x58100010, // 006E LDCONST R4 K16 + 0x5C140200, // 006F MOVE R5 R1 + 0x7C0C0400, // 0070 CALL R3 2 + 0x80000000, // 0071 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_cb +********************************************************************/ +be_local_closure(lvh_obj_event_cb, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 3]) { /* upvals */ + be_local_const_upval(1, 2), + be_local_const_upval(1, 0), + be_local_const_upval(1, 3), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("do_action"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x680C0002, // 0003 GETUPV R3 U2 + 0x7C000600, // 0004 CALL R0 3 + 0x80040000, // 0005 RET 1 R0 + }) + ), + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 7), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_literal("tasmota"), + /* K1 */ be_nested_str_literal("publish_rule"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0xB8020000, // 0000 GETNGBL R0 K0 + 0x8C000101, // 0001 GETMET R0 R0 K1 + 0x68080000, // 0002 GETUPV R2 U0 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[24]) { /* constants */ + /* K0 */ be_nested_str_literal("_page"), + /* K1 */ be_nested_str_literal("_oh"), + /* K2 */ be_nested_str_literal("code"), + /* K3 */ be_nested_str_literal("action"), + /* K4 */ be_nested_str_literal(""), + /* K5 */ be_nested_str_literal("lv"), + /* K6 */ be_nested_str_literal("EVENT_CLICKED"), + /* K7 */ be_nested_str_literal("tasmota"), + /* K8 */ be_nested_str_literal("set_timer"), + /* K9 */ be_const_int(0), + /* K10 */ be_nested_str_literal("_event_map"), + /* K11 */ be_nested_str_literal("find"), + /* K12 */ be_nested_str_literal("string"), + /* K13 */ be_nested_str_literal("EVENT_VALUE_CHANGED"), + /* K14 */ be_nested_str_literal("val"), + /* K15 */ be_nested_str_literal("format"), + /* K16 */ be_nested_str_literal(",\"val\":%i"), + /* K17 */ be_nested_str_literal("text"), + /* K18 */ be_nested_str_literal("json"), + /* K19 */ be_nested_str_literal(",\"text\":"), + /* K20 */ be_nested_str_literal("dump"), + /* K21 */ be_nested_str_literal("{\"hasp\":{\"p%ib%i\":{\"event\":\"%s\"%s}}}"), + /* K22 */ be_nested_str_literal("_page_id"), + /* K23 */ be_nested_str_literal("id"), + }), + be_str_literal("event_cb"), + &be_const_str_solidified, + ( &(const binstruction[71]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x880C0302, // 0002 GETMBR R3 R1 K2 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x20100904, // 0004 NE R4 R4 K4 + 0x78120008, // 0005 JMPF R4 #000F + 0xB8120A00, // 0006 GETNGBL R4 K5 + 0x88100906, // 0007 GETMBR R4 R4 K6 + 0x1C100604, // 0008 EQ R4 R3 R4 + 0x78120004, // 0009 JMPF R4 #000F + 0xB8120E00, // 000A GETNGBL R4 K7 + 0x8C100908, // 000B GETMET R4 R4 K8 + 0x58180009, // 000C LDCONST R6 K9 + 0x841C0000, // 000D CLOSURE R7 P0 + 0x7C100600, // 000E CALL R4 3 + 0x8810010A, // 000F GETMBR R4 R0 K10 + 0x8C10090B, // 0010 GETMET R4 R4 K11 + 0x5C180600, // 0011 MOVE R6 R3 + 0x7C100400, // 0012 CALL R4 2 + 0x4C140000, // 0013 LDNIL R5 + 0x20140805, // 0014 NE R5 R4 R5 + 0x7816002E, // 0015 JMPF R5 #0045 + 0xA4161800, // 0016 IMPORT R5 K12 + 0x58180004, // 0017 LDCONST R6 K4 + 0x881C0302, // 0018 GETMBR R7 R1 K2 + 0xB8220A00, // 0019 GETNGBL R8 K5 + 0x8820110D, // 001A GETMBR R8 R8 K13 + 0x1C1C0E08, // 001B EQ R7 R7 R8 + 0x781E0019, // 001C JMPF R7 #0037 + 0xA8020014, // 001D EXBLK 0 #0033 + 0x881C010E, // 001E GETMBR R7 R0 K14 + 0x4C200000, // 001F LDNIL R8 + 0x20200E08, // 0020 NE R8 R7 R8 + 0x78220004, // 0021 JMPF R8 #0027 + 0x8C200B0F, // 0022 GETMET R8 R5 K15 + 0x58280010, // 0023 LDCONST R10 K16 + 0x5C2C0E00, // 0024 MOVE R11 R7 + 0x7C200600, // 0025 CALL R8 3 + 0x5C181000, // 0026 MOVE R6 R8 + 0x88200111, // 0027 GETMBR R8 R0 K17 + 0x4C240000, // 0028 LDNIL R9 + 0x20241009, // 0029 NE R9 R8 R9 + 0x78260005, // 002A JMPF R9 #0031 + 0xA4262400, // 002B IMPORT R9 K18 + 0x00180D13, // 002C ADD R6 R6 K19 + 0x8C281314, // 002D GETMET R10 R9 K20 + 0x5C301000, // 002E MOVE R12 R8 + 0x7C280400, // 002F CALL R10 2 + 0x00180C0A, // 0030 ADD R6 R6 R10 + 0xA8040001, // 0031 EXBLK 1 1 + 0x70020003, // 0032 JMP #0037 + 0xAC1C0000, // 0033 CATCH R7 0 0 + 0x70020000, // 0034 JMP #0036 + 0x70020000, // 0035 JMP #0037 + 0xB0080000, // 0036 RAISE 2 R0 R0 + 0x8C1C0B0F, // 0037 GETMET R7 R5 K15 + 0x58240015, // 0038 LDCONST R9 K21 + 0x88280100, // 0039 GETMBR R10 R0 K0 + 0x88281516, // 003A GETMBR R10 R10 K22 + 0x882C0117, // 003B GETMBR R11 R0 K23 + 0x5C300800, // 003C MOVE R12 R4 + 0x5C340C00, // 003D MOVE R13 R6 + 0x7C1C0C00, // 003E CALL R7 6 + 0xB8220E00, // 003F GETNGBL R8 K7 + 0x8C201108, // 0040 GETMET R8 R8 K8 + 0x58280009, // 0041 LDCONST R10 K9 + 0x842C0001, // 0042 CLOSURE R11 P1 + 0x7C200600, // 0043 CALL R8 3 + 0xA0140000, // 0044 CLOSE R5 + 0xA0000000, // 0045 CLOSE R0 + 0x80000000, // 0046 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_color +********************************************************************/ +be_local_closure(lvh_obj_get_value_color, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("get_value_color"), + }), + be_str_literal("get_value_color"), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule +********************************************************************/ +be_local_closure(lvh_obj_get_val_rule, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_val_rule"), + }), + be_str_literal("get_val_rule"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(lvh_obj_get_val, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_value"), + }), + be_str_literal("get_val"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_click +********************************************************************/ +be_local_closure(lvh_obj_get_click, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("get_enabled"), + }), + be_str_literal("get_click"), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_click +********************************************************************/ +be_local_closure(lvh_obj_set_click, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("set_enabled"), + }), + be_str_literal("set_click"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: member +********************************************************************/ +be_local_closure(lvh_obj_member, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_literal("string"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_literal("set_"), + /* K5 */ be_nested_str_literal("get_"), + /* K6 */ be_nested_str_literal("_attr_ignore"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("get"), + /* K9 */ be_nested_str_literal("function"), + /* K10 */ be_nested_str_literal("_attr_map"), + /* K11 */ be_nested_str_literal("contains"), + /* K12 */ be_nested_str_literal("_lv_obj"), + /* K13 */ be_nested_str_literal("style_"), + /* K14 */ be_nested_str_literal("unknown attribute "), + /* K15 */ be_nested_str_literal("value_error"), + }), + be_str_literal("member"), + &be_const_str_solidified, + ( &(const binstruction[69]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x40120503, // 0002 CONNECT R4 K2 K3 + 0x94100204, // 0003 GETIDX R4 R1 R4 + 0x1C140904, // 0004 EQ R5 R4 K4 + 0x74160001, // 0005 JMPT R5 #0008 + 0x1C140905, // 0006 EQ R5 R4 K5 + 0x78160000, // 0007 JMPF R5 #0009 + 0x80000A00, // 0008 RET 0 + 0x88140106, // 0009 GETMBR R5 R0 K6 + 0x8C140B07, // 000A GETMET R5 R5 K7 + 0x5C1C0200, // 000B MOVE R7 R1 + 0x7C140400, // 000C CALL R5 2 + 0x4C180000, // 000D LDNIL R6 + 0x20140A06, // 000E NE R5 R5 R6 + 0x78160000, // 000F JMPF R5 #0011 + 0x80000A00, // 0010 RET 0 + 0x8C140708, // 0011 GETMET R5 R3 K8 + 0x5C1C0000, // 0012 MOVE R7 R0 + 0x00220A01, // 0013 ADD R8 K5 R1 + 0x7C140600, // 0014 CALL R5 3 + 0x60180004, // 0015 GETGBL R6 G4 + 0x5C1C0A00, // 0016 MOVE R7 R5 + 0x7C180200, // 0017 CALL R6 1 + 0x1C180D09, // 0018 EQ R6 R6 K9 + 0x781A0003, // 0019 JMPF R6 #001E + 0x5C180A00, // 001A MOVE R6 R5 + 0x5C1C0000, // 001B MOVE R7 R0 + 0x7C180200, // 001C CALL R6 1 + 0x80040C00, // 001D RET 1 R6 + 0x8818010A, // 001E GETMBR R6 R0 K10 + 0x8C180D0B, // 001F GETMET R6 R6 K11 + 0x5C200200, // 0020 MOVE R8 R1 + 0x7C180400, // 0021 CALL R6 2 + 0x781A001B, // 0022 JMPF R6 #003F + 0x8818010A, // 0023 GETMBR R6 R0 K10 + 0x94180C01, // 0024 GETIDX R6 R6 R1 + 0x8C1C0708, // 0025 GETMET R7 R3 K8 + 0x8824010C, // 0026 GETMBR R9 R0 K12 + 0x002A0A06, // 0027 ADD R10 K5 R6 + 0x7C1C0600, // 0028 CALL R7 3 + 0x5C140E00, // 0029 MOVE R5 R7 + 0x601C0004, // 002A GETGBL R7 G4 + 0x5C200A00, // 002B MOVE R8 R5 + 0x7C1C0200, // 002C CALL R7 1 + 0x1C1C0F09, // 002D EQ R7 R7 K9 + 0x781E000F, // 002E JMPF R7 #003F + 0x8C1C0507, // 002F GETMET R7 R2 K7 + 0x5C240C00, // 0030 MOVE R9 R6 + 0x5828000D, // 0031 LDCONST R10 K13 + 0x7C1C0600, // 0032 CALL R7 3 + 0x1C1C0F02, // 0033 EQ R7 R7 K2 + 0x781E0005, // 0034 JMPF R7 #003B + 0x5C1C0A00, // 0035 MOVE R7 R5 + 0x8820010C, // 0036 GETMBR R8 R0 K12 + 0x58240002, // 0037 LDCONST R9 K2 + 0x7C1C0400, // 0038 CALL R7 2 + 0x80040E00, // 0039 RET 1 R7 + 0x70020003, // 003A JMP #003F + 0x5C1C0A00, // 003B MOVE R7 R5 + 0x8820010C, // 003C GETMBR R8 R0 K12 + 0x7C1C0200, // 003D CALL R7 1 + 0x80040E00, // 003E RET 1 R7 + 0x60180008, // 003F GETGBL R6 G8 + 0x5C1C0200, // 0040 MOVE R7 R1 + 0x7C180200, // 0041 CALL R6 1 + 0x001A1C06, // 0042 ADD R6 K14 R6 + 0xB0061E06, // 0043 RAISE 1 K15 R6 + 0x80000000, // 0044 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_get_text_rule_formula, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_text_rule_formula"), + }), + be_str_literal("get_text_rule_formula"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_ofs_y +********************************************************************/ +be_local_closure(lvh_obj_get_value_ofs_y, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_label"), + /* K1 */ be_nested_str_literal("get_y"), + }), + be_str_literal("get_value_ofs_y"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_obj +********************************************************************/ +be_local_closure(lvh_obj_get_obj, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + }), + be_str_literal("get_obj"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_color_attribute +********************************************************************/ +be_local_closure(lvh_obj_is_color_attribute, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("re"), + /* K1 */ be_nested_str_literal("search"), + /* K2 */ be_nested_str_literal("color$"), + }), + be_str_literal("is_color_attribute"), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x60080017, // 0001 GETGBL R2 G23 + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x60180008, // 0004 GETGBL R6 G8 + 0x5C1C0000, // 0005 MOVE R7 R0 + 0x7C180200, // 0006 CALL R6 1 + 0x7C0C0600, // 0007 CALL R3 3 + 0x7C080200, // 0008 CALL R2 1 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode +********************************************************************/ +be_local_closure(lvh_obj_set_mode, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_literal("expand"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_width"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("SIZE_CONTENT"), + /* K5 */ be_nested_str_literal("break"), + /* K6 */ be_nested_str_literal("LABEL_LONG_WRAP"), + /* K7 */ be_nested_str_literal("dots"), + /* K8 */ be_nested_str_literal("LABEL_LONG_DOT"), + /* K9 */ be_nested_str_literal("scroll"), + /* K10 */ be_nested_str_literal("LABEL_LONG_SCROLL"), + /* K11 */ be_nested_str_literal("loop"), + /* K12 */ be_nested_str_literal("LABEL_LONG_SCROLL_CIRCULAR"), + /* K13 */ be_nested_str_literal("crop"), + /* K14 */ be_nested_str_literal("LABEL_LONG_CLIP"), + /* K15 */ be_nested_str_literal("check_label"), + /* K16 */ be_nested_str_literal("_lv_label"), + /* K17 */ be_nested_str_literal("set_long_mode"), + }), + be_str_literal("set_mode"), + &be_const_str_solidified, + ( &(const binstruction[43]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C0C0300, // 0001 EQ R3 R1 K0 + 0x780E0005, // 0002 JMPF R3 #0009 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0xB8160600, // 0005 GETNGBL R5 K3 + 0x88140B04, // 0006 GETMBR R5 R5 K4 + 0x7C0C0400, // 0007 CALL R3 2 + 0x70020017, // 0008 JMP #0021 + 0x1C0C0305, // 0009 EQ R3 R1 K5 + 0x780E0002, // 000A JMPF R3 #000E + 0xB80E0600, // 000B GETNGBL R3 K3 + 0x88080706, // 000C GETMBR R2 R3 K6 + 0x70020012, // 000D JMP #0021 + 0x1C0C0307, // 000E EQ R3 R1 K7 + 0x780E0002, // 000F JMPF R3 #0013 + 0xB80E0600, // 0010 GETNGBL R3 K3 + 0x88080708, // 0011 GETMBR R2 R3 K8 + 0x7002000D, // 0012 JMP #0021 + 0x1C0C0309, // 0013 EQ R3 R1 K9 + 0x780E0002, // 0014 JMPF R3 #0018 + 0xB80E0600, // 0015 GETNGBL R3 K3 + 0x8808070A, // 0016 GETMBR R2 R3 K10 + 0x70020008, // 0017 JMP #0021 + 0x1C0C030B, // 0018 EQ R3 R1 K11 + 0x780E0002, // 0019 JMPF R3 #001D + 0xB80E0600, // 001A GETNGBL R3 K3 + 0x8808070C, // 001B GETMBR R2 R3 K12 + 0x70020003, // 001C JMP #0021 + 0x1C0C030D, // 001D EQ R3 R1 K13 + 0x780E0001, // 001E JMPF R3 #0021 + 0xB80E0600, // 001F GETNGBL R3 K3 + 0x8808070E, // 0020 GETMBR R2 R3 K14 + 0x4C0C0000, // 0021 LDNIL R3 + 0x200C0403, // 0022 NE R3 R2 R3 + 0x780E0005, // 0023 JMPF R3 #002A + 0x8C0C010F, // 0024 GETMET R3 R0 K15 + 0x7C0C0200, // 0025 CALL R3 1 + 0x880C0110, // 0026 GETMBR R3 R0 K16 + 0x8C0C0711, // 0027 GETMET R3 R3 K17 + 0x5C140400, // 0028 MOVE R5 R2 + 0x7C0C0400, // 0029 CALL R3 2 + 0x80000000, // 002A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_color +********************************************************************/ +be_local_closure(lvh_obj_set_value_color, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("set_text_color"), + }), + be_str_literal("set_value_color"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_rule +********************************************************************/ +be_local_closure(lvh_obj_set_text_rule, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("text_rule_matched"), + }), + be_str_literal(""), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68040000, // 0000 GETUPV R1 U0 + 0x8C040300, // 0001 GETMET R1 R1 K0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_text_rule"), + /* K1 */ be_nested_str_literal("tasmota"), + /* K2 */ be_nested_str_literal("remove_rule"), + /* K3 */ be_nested_str_literal("add_rule"), + }), + be_str_literal("set_text_rule"), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0004, // 0003 JMPF R2 #0009 + 0xB80A0200, // 0004 GETNGBL R2 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x5C140000, // 0007 MOVE R5 R0 + 0x7C080600, // 0008 CALL R2 3 + 0x60080008, // 0009 GETGBL R2 G8 + 0x5C0C0200, // 000A MOVE R3 R1 + 0x7C080200, // 000B CALL R2 1 + 0x90020002, // 000C SETMBR R0 K0 R2 + 0xB80A0200, // 000D GETNGBL R2 K1 + 0x8C080503, // 000E GETMET R2 R2 K3 + 0x88100100, // 000F GETMBR R4 R0 K0 + 0x84140000, // 0010 CLOSURE R5 P0 + 0x5C180000, // 0011 MOVE R6 R0 + 0x7C080800, // 0012 CALL R2 4 + 0xA0000000, // 0013 CLOSE R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_adjustable +********************************************************************/ +be_local_closure(lvh_obj_get_adjustable, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("has_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), + }), + be_str_literal("get_adjustable"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_toggle +********************************************************************/ +be_local_closure(lvh_obj_get_toggle, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("has_state"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("STATE_CHECKED"), + }), + be_str_literal("get_toggle"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_str +********************************************************************/ +be_local_closure(lvh_obj_get_value_str, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("get_text"), + }), + be_str_literal("get_value_str"), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_right2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_right2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_style_pad_right"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("set_pad_right2"), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_set_val_rule_formula, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_val_rule_formula"), + /* K1 */ be_nested_str_literal("return / val -> ("), + /* K2 */ be_nested_str_literal(")"), + /* K3 */ be_nested_str_literal("_val_rule_function"), + /* K4 */ be_nested_str_literal("string"), + /* K5 */ be_nested_str_literal("format"), + /* K6 */ be_nested_str_literal("HSP: failed to compile '%s' - %s (%s)"), + }), + be_str_literal("set_val_rule_formula"), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x60080008, // 0000 GETGBL R2 G8 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x000A0202, // 0005 ADD R2 K1 R2 + 0x00080502, // 0006 ADD R2 R2 K2 + 0xA8020007, // 0007 EXBLK 0 #0010 + 0x600C000D, // 0008 GETGBL R3 G13 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x5C100600, // 000B MOVE R4 R3 + 0x7C100000, // 000C CALL R4 0 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0xA8040001, // 000E EXBLK 1 1 + 0x7002000C, // 000F JMP #001D + 0xAC0C0002, // 0010 CATCH R3 0 2 + 0x70020009, // 0011 JMP #001C + 0xA4160800, // 0012 IMPORT R5 K4 + 0x60180001, // 0013 GETGBL R6 G1 + 0x8C1C0B05, // 0014 GETMET R7 R5 K5 + 0x58240006, // 0015 LDCONST R9 K6 + 0x5C280400, // 0016 MOVE R10 R2 + 0x5C2C0600, // 0017 MOVE R11 R3 + 0x5C300800, // 0018 MOVE R12 R4 + 0x7C1C0A00, // 0019 CALL R7 5 + 0x7C180200, // 001A CALL R6 1 + 0x70020000, // 001B JMP #001D + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x80000000, // 001D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_line_width +********************************************************************/ +be_local_closure(lvh_obj_get_line_width, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_style_line_width"), + /* K2 */ be_const_int(0), + }), + be_str_literal("get_line_width"), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_left2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_left2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_style_pad_left"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("set_pad_left2"), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val_rule_formula +********************************************************************/ +be_local_closure(lvh_obj_get_val_rule_formula, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("_val_rule_formula"), + }), + be_str_literal("get_val_rule_formula"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: check_label +********************************************************************/ +be_local_closure(lvh_obj_check_label, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_label"), + /* K1 */ be_nested_str_literal("lv"), + /* K2 */ be_nested_str_literal("label"), + /* K3 */ be_nested_str_literal("get_obj"), + /* K4 */ be_nested_str_literal("set_align"), + /* K5 */ be_nested_str_literal("ALIGN_CENTER"), + }), + be_str_literal("check_label"), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x7806000A, // 0003 JMPF R1 #000F + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x8C0C0103, // 0006 GETMET R3 R0 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x7C040400, // 0008 CALL R1 2 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x88040100, // 000A GETMBR R1 R0 K0 + 0x8C040304, // 000B GETMET R1 R1 K4 + 0xB80E0200, // 000C GETNGBL R3 K1 + 0x880C0705, // 000D GETMBR R3 R3 K5 + 0x7C040400, // 000E CALL R1 2 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(lvh_obj_get_text, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_label"), + /* K1 */ be_nested_str_literal("get_text"), + }), + be_str_literal("get_text"), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060001, // 0003 JMPF R1 #0006 + 0x4C040000, // 0004 LDNIL R1 + 0x80040200, // 0005 RET 1 R1 + 0x88040100, // 0006 GETMBR R1 R0 K0 + 0x8C040301, // 0007 GETMET R1 R1 K1 + 0x7C040200, // 0008 CALL R1 1 + 0x80040200, // 0009 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_hidden +********************************************************************/ +be_local_closure(lvh_obj_set_hidden, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("add_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_HIDDEN"), + /* K4 */ be_nested_str_literal("clear_flag"), + }), + be_str_literal("set_hidden"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_pad_all2 +********************************************************************/ +be_local_closure(lvh_obj_set_pad_all2, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("set_style_pad_all"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("set_pad_all2"), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0009, // 0003 JMPF R2 #000E + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0x8C080502, // 0005 GETMET R2 R2 K2 + 0x60100009, // 0006 GETGBL R4 G9 + 0x5C140200, // 0007 MOVE R5 R1 + 0x7C100200, // 0008 CALL R4 1 + 0x88140100, // 0009 GETMBR R5 R0 K0 + 0xB81A0600, // 000A GETNGBL R6 K3 + 0x88180D04, // 000B GETMBR R6 R6 K4 + 0x30140A06, // 000C OR R5 R5 R6 + 0x7C080600, // 000D CALL R2 3 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text_color +********************************************************************/ +be_local_closure(lvh_obj_set_text_color, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_style_text_color"), + /* K2 */ be_nested_str_literal("parse_color"), + /* K3 */ be_const_int(0), + }), + be_str_literal("set_text_color"), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C100400, // 0004 CALL R4 2 + 0x58140003, // 0005 LDCONST R5 K3 + 0x7C080600, // 0006 CALL R2 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_bottom +********************************************************************/ +be_local_closure(lvh_obj_get_pad_bottom, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("get_style_pad_bottom"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("get_pad_bottom"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_top +********************************************************************/ +be_local_closure(lvh_obj_get_pad_top, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_part2_selector"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("get_style_pad_top"), + /* K3 */ be_nested_str_literal("lv"), + /* K4 */ be_nested_str_literal("STATE_DEFAULT"), + }), + be_str_literal("get_pad_top"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060007, // 0003 JMPF R1 #000C + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0100, // 0006 GETMBR R3 R0 K0 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x88100904, // 0008 GETMBR R4 R4 K4 + 0x300C0604, // 0009 OR R3 R3 R4 + 0x7C040400, // 000A CALL R1 2 + 0x80040200, // 000B RET 1 R1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_adjustable +********************************************************************/ +be_local_closure(lvh_obj_set_adjustable, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("add_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), + /* K4 */ be_nested_str_literal("clear_flag"), + }), + be_str_literal("set_adjustable"), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x78060005, // 0000 JMPF R1 #0007 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0xB8120400, // 0003 GETNGBL R4 K2 + 0x88100903, // 0004 GETMBR R4 R4 K3 + 0x7C080400, // 0005 CALL R2 2 + 0x70020004, // 0006 JMP #000C + 0x88080100, // 0007 GETMBR R2 R0 K0 + 0x8C080504, // 0008 GETMET R2 R2 K4 + 0xB8120400, // 0009 GETNGBL R4 K2 + 0x88100903, // 000A GETMBR R4 R4 K3 + 0x7C080400, // 000B CALL R2 2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_enabled +********************************************************************/ +be_local_closure(lvh_obj_get_enabled, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("has_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_CLICKABLE"), + }), + be_str_literal("get_enabled"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: setmember +********************************************************************/ +be_local_closure(lvh_obj_setmember, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_literal("string"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(3), + /* K4 */ be_nested_str_literal("set_"), + /* K5 */ be_nested_str_literal("get_"), + /* K6 */ be_nested_str_literal("_attr_ignore"), + /* K7 */ be_nested_str_literal("find"), + /* K8 */ be_nested_str_literal("get"), + /* K9 */ be_nested_str_literal("function"), + /* K10 */ be_nested_str_literal("_attr_map"), + /* K11 */ be_nested_str_literal("contains"), + /* K12 */ be_nested_str_literal("_lv_obj"), + /* K13 */ be_nested_str_literal("is_color_attribute"), + /* K14 */ be_nested_str_literal("parse_color"), + /* K15 */ be_nested_str_literal("style_"), + /* K16 */ be_nested_str_literal("HSP: Could not find function set_"), + /* K17 */ be_nested_str_literal("HSP: unknown attribute:"), + }), + be_str_literal("setmember"), + &be_const_str_solidified, + ( &(const binstruction[83]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x40160503, // 0002 CONNECT R5 K2 K3 + 0x94140205, // 0003 GETIDX R5 R1 R5 + 0x1C180B04, // 0004 EQ R6 R5 K4 + 0x741A0001, // 0005 JMPT R6 #0008 + 0x1C180B05, // 0006 EQ R6 R5 K5 + 0x781A0000, // 0007 JMPF R6 #0009 + 0x80000C00, // 0008 RET 0 + 0x88180106, // 0009 GETMBR R6 R0 K6 + 0x8C180D07, // 000A GETMET R6 R6 K7 + 0x5C200200, // 000B MOVE R8 R1 + 0x7C180400, // 000C CALL R6 2 + 0x4C1C0000, // 000D LDNIL R7 + 0x20180C07, // 000E NE R6 R6 R7 + 0x781A0000, // 000F JMPF R6 #0011 + 0x80000C00, // 0010 RET 0 + 0x8C180908, // 0011 GETMET R6 R4 K8 + 0x5C200000, // 0012 MOVE R8 R0 + 0x00260801, // 0013 ADD R9 K4 R1 + 0x7C180600, // 0014 CALL R6 3 + 0x601C0004, // 0015 GETGBL R7 G4 + 0x5C200C00, // 0016 MOVE R8 R6 + 0x7C1C0200, // 0017 CALL R7 1 + 0x1C1C0F09, // 0018 EQ R7 R7 K9 + 0x781E0004, // 0019 JMPF R7 #001F + 0x5C1C0C00, // 001A MOVE R7 R6 + 0x5C200000, // 001B MOVE R8 R0 + 0x5C240400, // 001C MOVE R9 R2 + 0x7C1C0400, // 001D CALL R7 2 + 0x80000E00, // 001E RET 0 + 0x881C010A, // 001F GETMBR R7 R0 K10 + 0x8C1C0F0B, // 0020 GETMET R7 R7 K11 + 0x5C240200, // 0021 MOVE R9 R1 + 0x7C1C0400, // 0022 CALL R7 2 + 0x781E0029, // 0023 JMPF R7 #004E + 0x881C010A, // 0024 GETMBR R7 R0 K10 + 0x941C0E01, // 0025 GETIDX R7 R7 R1 + 0x8C200908, // 0026 GETMET R8 R4 K8 + 0x8828010C, // 0027 GETMBR R10 R0 K12 + 0x002E0807, // 0028 ADD R11 K4 R7 + 0x7C200600, // 0029 CALL R8 3 + 0x5C181000, // 002A MOVE R6 R8 + 0x8C20010D, // 002B GETMET R8 R0 K13 + 0x5C280E00, // 002C MOVE R10 R7 + 0x7C200400, // 002D CALL R8 2 + 0x78220003, // 002E JMPF R8 #0033 + 0x8C20010E, // 002F GETMET R8 R0 K14 + 0x5C280400, // 0030 MOVE R10 R2 + 0x7C200400, // 0031 CALL R8 2 + 0x5C081000, // 0032 MOVE R2 R8 + 0x60200004, // 0033 GETGBL R8 G4 + 0x5C240C00, // 0034 MOVE R9 R6 + 0x7C200200, // 0035 CALL R8 1 + 0x1C201109, // 0036 EQ R8 R8 K9 + 0x78220011, // 0037 JMPF R8 #004A + 0x8C200707, // 0038 GETMET R8 R3 K7 + 0x5C280E00, // 0039 MOVE R10 R7 + 0x582C000F, // 003A LDCONST R11 K15 + 0x7C200600, // 003B CALL R8 3 + 0x1C201102, // 003C EQ R8 R8 K2 + 0x78220005, // 003D JMPF R8 #0044 + 0x5C200C00, // 003E MOVE R8 R6 + 0x8824010C, // 003F GETMBR R9 R0 K12 + 0x5C280400, // 0040 MOVE R10 R2 + 0x582C0002, // 0041 LDCONST R11 K2 + 0x7C200600, // 0042 CALL R8 3 + 0x70020003, // 0043 JMP #0048 + 0x5C200C00, // 0044 MOVE R8 R6 + 0x8824010C, // 0045 GETMBR R9 R0 K12 + 0x5C280400, // 0046 MOVE R10 R2 + 0x7C200400, // 0047 CALL R8 2 + 0x80001000, // 0048 RET 0 + 0x70020002, // 0049 JMP #004D + 0x60200001, // 004A GETGBL R8 G1 + 0x00262007, // 004B ADD R9 K16 R7 + 0x7C200200, // 004C CALL R8 1 + 0x70020003, // 004D JMP #0052 + 0x601C0001, // 004E GETGBL R7 G1 + 0x58200011, // 004F LDCONST R8 K17 + 0x5C240200, // 0050 MOVE R9 R1 + 0x7C1C0400, // 0051 CALL R7 2 + 0x80000000, // 0052 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(lvh_obj_init, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_page"), + /* K1 */ be_nested_str_literal("_lv_class"), + /* K2 */ be_nested_str_literal("_lv_obj"), + /* K3 */ be_nested_str_literal("post_init"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x90020002, // 0000 SETMBR R0 K0 R2 + 0x4C140000, // 0001 LDNIL R5 + 0x1C140805, // 0002 EQ R5 R4 R5 + 0x78160007, // 0003 JMPF R5 #000C + 0x88140101, // 0004 GETMBR R5 R0 K1 + 0x78160005, // 0005 JMPF R5 #000C + 0x88140101, // 0006 GETMBR R5 R0 K1 + 0x5C180A00, // 0007 MOVE R6 R5 + 0x5C1C0200, // 0008 MOVE R7 R1 + 0x7C180200, // 0009 CALL R6 1 + 0x90020406, // 000A SETMBR R0 K2 R6 + 0x70020000, // 000B JMP #000D + 0x90020404, // 000C SETMBR R0 K2 R4 + 0x8C140103, // 000D GETMET R5 R0 K3 + 0x7C140200, // 000E CALL R5 1 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_value_str +********************************************************************/ +be_local_closure(lvh_obj_set_value_str, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("set_text"), + }), + be_str_literal("set_value_str"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_line_width +********************************************************************/ +be_local_closure(lvh_obj_set_line_width, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_style_line_width"), + /* K2 */ be_const_int(0), + }), + be_str_literal("set_line_width"), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x60100009, // 0002 GETGBL R4 G9 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C100200, // 0004 CALL R4 1 + 0x58140002, // 0005 LDCONST R5 K2 + 0x7C080600, // 0006 CALL R2 3 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_toggle +********************************************************************/ +be_local_closure(lvh_obj_set_toggle, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_literal("string"), + /* K1 */ be_nested_str_literal("toupper"), + /* K2 */ be_nested_str_literal("TRUE"), + /* K3 */ be_nested_str_literal("FALSE"), + /* K4 */ be_nested_str_literal("_lv_obj"), + /* K5 */ be_nested_str_literal("add_state"), + /* K6 */ be_nested_str_literal("lv"), + /* K7 */ be_nested_str_literal("STATE_CHECKED"), + /* K8 */ be_nested_str_literal("clear_state"), + }), + be_str_literal("set_toggle"), + &be_const_str_solidified, + ( &(const binstruction[26]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x60140008, // 0002 GETGBL R5 G8 + 0x5C180200, // 0003 MOVE R6 R1 + 0x7C140200, // 0004 CALL R5 1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x5C040600, // 0006 MOVE R1 R3 + 0x1C0C0302, // 0007 EQ R3 R1 K2 + 0x780E0000, // 0008 JMPF R3 #000A + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x1C0C0303, // 000A EQ R3 R1 K3 + 0x780E0000, // 000B JMPF R3 #000D + 0x50040000, // 000C LDBOOL R1 0 0 + 0x78060005, // 000D JMPF R1 #0014 + 0x880C0104, // 000E GETMBR R3 R0 K4 + 0x8C0C0705, // 000F GETMET R3 R3 K5 + 0xB8160C00, // 0010 GETNGBL R5 K6 + 0x88140B07, // 0011 GETMBR R5 R5 K7 + 0x7C0C0400, // 0012 CALL R3 2 + 0x70020004, // 0013 JMP #0019 + 0x880C0104, // 0014 GETMBR R3 R0 K4 + 0x8C0C0708, // 0015 GETMET R3 R3 K8 + 0xB8160C00, // 0016 GETNGBL R5 K6 + 0x88140B07, // 0017 GETMBR R5 R5 K7 + 0x7C0C0400, // 0018 CALL R3 2 + 0x80000000, // 0019 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_val_rule ********************************************************************/ @@ -3629,37 +3631,9 @@ be_local_closure(lvh_obj_set_val_rule, /* name */ /******************************************************************** -** Solidified function: get_click +** Solidified function: set_text ********************************************************************/ -be_local_closure(lvh_obj_get_click, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("get_enabled"), - }), - be_str_literal("get_click"), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_value_ofs_x -********************************************************************/ -be_local_closure(lvh_obj_set_value_ofs_x, /* name */ +be_local_closure(lvh_obj_set_text, /* name */ be_nested_proto( 6, /* nstack */ 2, /* argc */ @@ -3672,16 +3646,16 @@ be_local_closure(lvh_obj_set_value_ofs_x, /* name */ ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_literal("check_label"), /* K1 */ be_nested_str_literal("_lv_label"), - /* K2 */ be_nested_str_literal("set_x"), + /* K2 */ be_nested_str_literal("set_text"), }), - be_str_literal("set_value_ofs_x"), + be_str_literal("set_text"), &be_const_str_solidified, ( &(const binstruction[ 9]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 0x7C080200, // 0001 CALL R2 1 0x88080101, // 0002 GETMBR R2 R0 K1 0x8C080502, // 0003 GETMET R2 R2 K2 - 0x60100009, // 0004 GETGBL R4 G9 + 0x60100008, // 0004 GETGBL R4 G8 0x5C140200, // 0005 MOVE R5 R1 0x7C100200, // 0006 CALL R4 1 0x7C080400, // 0007 CALL R2 2 @@ -3693,36 +3667,9 @@ be_local_closure(lvh_obj_set_value_ofs_x, /* name */ /******************************************************************** -** Solidified function: get_text_rule_format +** Solidified function: get_action ********************************************************************/ -be_local_closure(lvh_obj_get_text_rule_format, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("_text_rule_format"), - }), - be_str_literal("get_text_rule_format"), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_value_ofs_y -********************************************************************/ -be_local_closure(lvh_obj_get_value_ofs_y, /* name */ +be_local_closure(lvh_obj_get_action, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -3733,16 +3680,136 @@ be_local_closure(lvh_obj_get_value_ofs_y, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_literal("_lv_label"), - /* K1 */ be_nested_str_literal("get_y"), + /* K0 */ be_nested_str_literal("_action"), + /* K1 */ be_nested_str_literal(""), }), - be_str_literal("get_value_ofs_y"), + be_str_literal("get_action"), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060001, // 0001 JMPF R1 #0004 + 0x5C080200, // 0002 MOVE R2 R1 + 0x70020000, // 0003 JMP #0005 + 0x58080001, // 0004 LDCONST R2 K1 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_value_font +********************************************************************/ +be_local_closure(lvh_obj_get_value_font, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("get_text_font"), + }), + be_str_literal("get_value_font"), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_hidden +********************************************************************/ +be_local_closure(lvh_obj_get_hidden, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("has_flag"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("OBJ_FLAG_HIDDEN"), + }), + be_str_literal("get_hidden"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 + 0xB80E0400, // 0002 GETNGBL R3 K2 + 0x880C0703, // 0003 GETMBR R3 R3 K3 + 0x7C040400, // 0004 CALL R1 2 + 0x80040200, // 0005 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pad_all +********************************************************************/ +be_local_closure(lvh_obj_get_pad_all, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_literal("get_pad_all"), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text_color +********************************************************************/ +be_local_closure(lvh_obj_get_text_color, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_style_text_color"), + /* K2 */ be_const_int(0), + }), + be_str_literal("get_text_color"), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x80040200, // 0004 RET 1 R1 }) ) ); @@ -3755,15 +3822,52 @@ be_local_closure(lvh_obj_get_value_ofs_y, /* name */ be_local_class(lvh_obj, 12, NULL, - be_nested_map(87, + be_nested_map(88, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("get_value_font", 58), be_const_closure(lvh_obj_get_value_font_closure) }, - { be_const_key_literal("_text_rule", 25), be_const_var(8) }, - { be_const_key_literal("get_value_ofs_y", -1), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, + { be_const_key_literal("set_radius2", 68), be_const_closure(lvh_obj_set_radius2_closure) }, + { be_const_key_literal("register_event_cb", -1), be_const_closure(lvh_obj_register_event_cb_closure) }, { be_const_key_literal("get_text_rule_format", -1), be_const_closure(lvh_obj_get_text_rule_format_closure) }, - { be_const_key_literal("get_val_rule", -1), be_const_closure(lvh_obj_get_val_rule_closure) }, - { be_const_key_literal("get_value_ofs_x", 16), be_const_closure(lvh_obj_get_value_ofs_x_closure) }, - { be_const_key_literal("set_line_width", -1), be_const_closure(lvh_obj_set_line_width_closure) }, + { be_const_key_literal("set_value_ofs_x", -1), be_const_closure(lvh_obj_set_value_ofs_x_closure) }, + { be_const_key_literal("get_radius2", -1), be_const_closure(lvh_obj_get_radius2_closure) }, + { be_const_key_literal("_attr_ignore", 30), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(10, + ( (struct bvalue*) &(const bvalue[]) { + be_nested_str_literal("tostring"), + be_nested_str_literal("obj"), + be_nested_str_literal("page"), + be_nested_str_literal("comment"), + be_nested_str_literal("parentid"), + be_nested_str_literal("auto_size"), + be_nested_str_literal("prev"), + be_nested_str_literal("next"), + be_nested_str_literal("back"), + be_nested_str_literal("berry_run"), + })) ) } )) }, + { be_const_key_literal("val_rule_matched", -1), be_const_closure(lvh_obj_val_rule_matched_closure) }, + { be_const_key_literal("set_pad_top2", -1), be_const_closure(lvh_obj_set_pad_top2_closure) }, + { be_const_key_literal("get_value_font", -1), be_const_closure(lvh_obj_get_value_font_closure) }, + { be_const_key_literal("_text_rule_function", -1), be_const_var(10) }, + { be_const_key_literal("_text_rule_format", -1), be_const_var(11) }, + { be_const_key_literal("set_text_font", -1), be_const_closure(lvh_obj_set_text_font_closure) }, + { be_const_key_literal("parse_color", -1), be_const_static_closure(lvh_obj_parse_color_closure) }, + { be_const_key_literal("get_text_font", -1), be_const_closure(lvh_obj_get_text_font_closure) }, + { be_const_key_literal("text_rule_matched", 70), be_const_closure(lvh_obj_text_rule_matched_closure) }, + { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_obj) }, + { be_const_key_literal("set_text", 78), be_const_closure(lvh_obj_set_text_closure) }, + { be_const_key_literal("set_align", -1), be_const_closure(lvh_obj_set_align_closure) }, + { be_const_key_literal("set_val_rule", 35), be_const_closure(lvh_obj_set_val_rule_closure) }, + { be_const_key_literal("set_val", -1), be_const_closure(lvh_obj_set_val_closure) }, + { be_const_key_literal("get_pad_right", 80), be_const_closure(lvh_obj_get_pad_right_closure) }, + { be_const_key_literal("_text_rule_formula", 79), be_const_var(9) }, + { be_const_key_literal("set_action", -1), be_const_closure(lvh_obj_set_action_closure) }, + { be_const_key_literal("get_value_ofs_x", 86), be_const_closure(lvh_obj_get_value_ofs_x_closure) }, + { be_const_key_literal("set_value_ofs_y", 6), be_const_closure(lvh_obj_set_value_ofs_y_closure) }, + { be_const_key_literal("remove_trailing_zeroes", 41), be_const_static_closure(lvh_obj_remove_trailing_zeroes_closure) }, + { be_const_key_literal("post_init", 18), be_const_closure(lvh_obj_post_init_closure) }, + { be_const_key_literal("get_mode", -1), be_const_closure(lvh_obj_get_mode_closure) }, + { be_const_key_literal("_action", -1), be_const_var(4) }, + { be_const_key_literal("_lv_label", 7), be_const_var(2) }, + { be_const_key_literal("set_toggle", 31), be_const_closure(lvh_obj_set_toggle_closure) }, { be_const_key_literal("_attr_map", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(26, ( (struct bmapnode*) &(const bmapnode[]) { @@ -3794,56 +3898,40 @@ be_local_class(lvh_obj, { be_const_key_literal("pad_top", 16), be_nested_str_literal("style_pad_top") }, { be_const_key_literal("bg_grad_dir", 14), be_nested_str_literal("style_bg_grad_dir") }, })) ) } )) }, - { be_const_key_literal("set_adjustable", -1), be_const_closure(lvh_obj_set_adjustable_closure) }, - { be_const_key_literal("_val_rule_formula", -1), be_const_var(6) }, - { be_const_key_literal("set_pad_all2", -1), be_const_closure(lvh_obj_set_pad_all2_closure) }, - { be_const_key_literal("_action", -1), be_const_var(4) }, - { be_const_key_literal("set_text_rule", 20), be_const_closure(lvh_obj_set_text_rule_closure) }, - { be_const_key_literal("get_adjustable", 3), be_const_closure(lvh_obj_get_adjustable_closure) }, - { be_const_key_literal("set_text", -1), be_const_closure(lvh_obj_set_text_closure) }, - { be_const_key_literal("event_cb", -1), be_const_closure(lvh_obj_event_cb_closure) }, - { be_const_key_literal("set_pad_right2", 86), be_const_closure(lvh_obj_set_pad_right2_closure) }, - { be_const_key_literal("get_radius2", -1), be_const_closure(lvh_obj_get_radius2_closure) }, - { be_const_key_literal("set_val", -1), be_const_closure(lvh_obj_set_val_closure) }, - { be_const_key_literal("get_text_rule_formula", 8), be_const_closure(lvh_obj_get_text_rule_formula_closure) }, + { be_const_key_literal("set_line_width", -1), be_const_closure(lvh_obj_set_line_width_closure) }, + { be_const_key_literal("set_value_str", 72), be_const_closure(lvh_obj_set_value_str_closure) }, + { be_const_key_literal("is_color_attribute", -1), be_const_static_closure(lvh_obj_is_color_attribute_closure) }, + { be_const_key_literal("_lv_obj", -1), be_const_var(1) }, { be_const_key_literal("set_value_color", -1), be_const_closure(lvh_obj_set_value_color_closure) }, - { be_const_key_literal("_lv_label", -1), be_const_var(2) }, - { be_const_key_literal("get_value_str", 37), be_const_closure(lvh_obj_get_value_str_closure) }, - { be_const_key_literal("set_pad_left2", -1), be_const_closure(lvh_obj_set_pad_left2_closure) }, - { be_const_key_literal("get_enabled", 7), be_const_closure(lvh_obj_get_enabled_closure) }, - { be_const_key_literal("get_mode", 21), be_const_closure(lvh_obj_get_mode_closure) }, - { be_const_key_literal("_val_rule", 70), be_const_var(5) }, - { be_const_key_literal("set_enabled", -1), be_const_closure(lvh_obj_set_enabled_closure) }, - { be_const_key_literal("set_value_str", -1), be_const_closure(lvh_obj_set_value_str_closure) }, - { be_const_key_literal("_text_rule_function", -1), be_const_var(10) }, - { be_const_key_literal("_lv_part2_selector", -1), be_const_nil() }, - { be_const_key_literal("get_text_rule", -1), be_const_closure(lvh_obj_get_text_rule_closure) }, - { be_const_key_literal("register_event_cb", -1), be_const_closure(lvh_obj_register_event_cb_closure) }, - { be_const_key_literal("get_text", -1), be_const_closure(lvh_obj_get_text_closure) }, - { be_const_key_literal("set_val_rule_formula", -1), be_const_closure(lvh_obj_set_val_rule_formula_closure) }, - { be_const_key_literal("set_radius2", -1), be_const_closure(lvh_obj_set_radius2_closure) }, - { be_const_key_literal("set_hidden", 34), be_const_closure(lvh_obj_set_hidden_closure) }, - { be_const_key_literal("_lv_class", 85), be_const_class(be_class_lv_obj) }, - { be_const_key_literal("set_align", 55), be_const_closure(lvh_obj_set_align_closure) }, - { be_const_key_literal("init", 27), be_const_closure(lvh_obj_init_closure) }, - { be_const_key_literal("setmember", -1), be_const_closure(lvh_obj_setmember_closure) }, - { be_const_key_literal("member", -1), be_const_closure(lvh_obj_member_closure) }, - { be_const_key_literal("set_text_font", -1), be_const_closure(lvh_obj_set_text_font_closure) }, - { be_const_key_literal("get_align", -1), be_const_closure(lvh_obj_get_align_closure) }, - { be_const_key_literal("set_pad_bottom2", -1), be_const_closure(lvh_obj_set_pad_bottom2_closure) }, - { be_const_key_literal("_text_rule_format", -1), be_const_var(11) }, - { be_const_key_literal("set_click", -1), be_const_closure(lvh_obj_set_click_closure) }, - { be_const_key_literal("get_pad_right", -1), be_const_closure(lvh_obj_get_pad_right_closure) }, - { be_const_key_literal("id", -1), be_const_var(0) }, - { be_const_key_literal("set_text_color", -1), be_const_closure(lvh_obj_set_text_color_closure) }, - { be_const_key_literal("set_action", -1), be_const_closure(lvh_obj_set_action_closure) }, - { be_const_key_literal("check_label", 54), be_const_closure(lvh_obj_check_label_closure) }, - { be_const_key_literal("get_pad_all", -1), be_const_closure(lvh_obj_get_pad_all_closure) }, + { be_const_key_literal("get_value_color", -1), be_const_closure(lvh_obj_get_value_color_closure) }, + { be_const_key_literal("get_val_rule", -1), be_const_closure(lvh_obj_get_val_rule_closure) }, { be_const_key_literal("get_val", -1), be_const_closure(lvh_obj_get_val_closure) }, - { be_const_key_literal("_text_rule_formula", -1), be_const_var(9) }, - { be_const_key_literal("set_pad_top2", 79), be_const_closure(lvh_obj_set_pad_top2_closure) }, - { be_const_key_literal("set_mode", -1), be_const_closure(lvh_obj_set_mode_closure) }, + { be_const_key_literal("get_click", -1), be_const_closure(lvh_obj_get_click_closure) }, + { be_const_key_literal("get_enabled", 81), be_const_closure(lvh_obj_get_enabled_closure) }, + { be_const_key_literal("set_adjustable", -1), be_const_closure(lvh_obj_set_adjustable_closure) }, + { be_const_key_literal("get_pad_left", 16), be_const_closure(lvh_obj_get_pad_left_closure) }, + { be_const_key_literal("get_value_ofs_y", -1), be_const_closure(lvh_obj_get_value_ofs_y_closure) }, + { be_const_key_literal("_val_rule_formula", 76), be_const_var(6) }, + { be_const_key_literal("get_text_rule", 34), be_const_closure(lvh_obj_get_text_rule_closure) }, + { be_const_key_literal("set_value_font", 74), be_const_closure(lvh_obj_set_value_font_closure) }, + { be_const_key_literal("_val_rule", -1), be_const_var(5) }, + { be_const_key_literal("event_cb", 58), be_const_closure(lvh_obj_event_cb_closure) }, + { be_const_key_literal("set_text_rule", -1), be_const_closure(lvh_obj_set_text_rule_closure) }, + { be_const_key_literal("get_adjustable", -1), be_const_closure(lvh_obj_get_adjustable_closure) }, + { be_const_key_literal("get_toggle", -1), be_const_closure(lvh_obj_get_toggle_closure) }, + { be_const_key_literal("get_value_str", -1), be_const_closure(lvh_obj_get_value_str_closure) }, + { be_const_key_literal("set_pad_right2", -1), be_const_closure(lvh_obj_set_pad_right2_closure) }, + { be_const_key_literal("set_val_rule_formula", 66), be_const_closure(lvh_obj_set_val_rule_formula_closure) }, + { be_const_key_literal("id", 5), be_const_var(0) }, + { be_const_key_literal("set_pad_bottom2", 33), be_const_closure(lvh_obj_set_pad_bottom2_closure) }, + { be_const_key_literal("get_pad_top", 36), be_const_closure(lvh_obj_get_pad_top_closure) }, + { be_const_key_literal("get_val_rule_formula", -1), be_const_closure(lvh_obj_get_val_rule_formula_closure) }, + { be_const_key_literal("set_hidden", -1), be_const_closure(lvh_obj_set_hidden_closure) }, { be_const_key_literal("_page", -1), be_const_var(3) }, + { be_const_key_literal("check_label", -1), be_const_closure(lvh_obj_check_label_closure) }, + { be_const_key_literal("get_text", -1), be_const_closure(lvh_obj_get_text_closure) }, + { be_const_key_literal("set_text_rule_format", 60), be_const_closure(lvh_obj_set_text_rule_format_closure) }, + { be_const_key_literal("set_pad_all2", -1), be_const_closure(lvh_obj_set_pad_all2_closure) }, { be_const_key_literal("_event_map", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { @@ -3855,47 +3943,27 @@ be_local_class(lvh_obj, { be_const_key_int(5, -1), be_nested_str_literal("long") }, { be_const_key_int(6, -1), be_nested_str_literal("hold") }, })) ) } )) }, - { be_const_key_literal("set_toggle", 66), be_const_closure(lvh_obj_set_toggle_closure) }, - { be_const_key_literal("set_text_rule_formula", -1), be_const_closure(lvh_obj_set_text_rule_formula_closure) }, - { be_const_key_literal("get_hidden", -1), be_const_closure(lvh_obj_get_hidden_closure) }, - { be_const_key_literal("post_init", -1), be_const_closure(lvh_obj_post_init_closure) }, - { be_const_key_literal("set_value_ofs_y", 41), be_const_closure(lvh_obj_set_value_ofs_y_closure) }, - { be_const_key_literal("get_val_rule_formula", -1), be_const_closure(lvh_obj_get_val_rule_formula_closure) }, - { be_const_key_literal("get_value_color", -1), be_const_closure(lvh_obj_get_value_color_closure) }, - { be_const_key_literal("get_pad_top", 56), be_const_closure(lvh_obj_get_pad_top_closure) }, - { be_const_key_literal("set_text_rule_format", 63), be_const_closure(lvh_obj_set_text_rule_format_closure) }, - { be_const_key_literal("get_pad_left", -1), be_const_closure(lvh_obj_get_pad_left_closure) }, - { be_const_key_literal("set_value_font", -1), be_const_closure(lvh_obj_set_value_font_closure) }, - { be_const_key_literal("text_rule_matched", -1), be_const_closure(lvh_obj_text_rule_matched_closure) }, - { be_const_key_literal("val_rule_matched", -1), be_const_closure(lvh_obj_val_rule_matched_closure) }, - { be_const_key_literal("_attr_ignore", 52), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { - be_const_list( * be_nested_list(10, - ( (struct bvalue*) &(const bvalue[]) { - be_nested_str_literal("tostring"), - be_nested_str_literal("obj"), - be_nested_str_literal("page"), - be_nested_str_literal("comment"), - be_nested_str_literal("parentid"), - be_nested_str_literal("auto_size"), - be_nested_str_literal("prev"), - be_nested_str_literal("next"), - be_nested_str_literal("back"), - be_nested_str_literal("berry_run"), - })) ) } )) }, - { be_const_key_literal("_val_rule_function", 50), be_const_var(7) }, - { be_const_key_literal("get_text_font", -1), be_const_closure(lvh_obj_get_text_font_closure) }, - { be_const_key_literal("is_color_attribute", 2), be_const_static_closure(lvh_obj_is_color_attribute_closure) }, - { be_const_key_literal("_lv_obj", -1), be_const_var(1) }, - { be_const_key_literal("get_text_color", 28), be_const_closure(lvh_obj_get_text_color_closure) }, - { be_const_key_literal("get_line_width", -1), be_const_closure(lvh_obj_get_line_width_closure) }, - { be_const_key_literal("get_action", -1), be_const_closure(lvh_obj_get_action_closure) }, - { be_const_key_literal("get_obj", -1), be_const_closure(lvh_obj_get_obj_closure) }, - { be_const_key_literal("parse_color", -1), be_const_static_closure(lvh_obj_parse_color_closure) }, - { be_const_key_literal("set_val_rule", -1), be_const_closure(lvh_obj_set_val_rule_closure) }, - { be_const_key_literal("get_click", -1), be_const_closure(lvh_obj_get_click_closure) }, - { be_const_key_literal("set_value_ofs_x", -1), be_const_closure(lvh_obj_set_value_ofs_x_closure) }, - { be_const_key_literal("get_toggle", -1), be_const_closure(lvh_obj_get_toggle_closure) }, + { be_const_key_literal("set_text_color", -1), be_const_closure(lvh_obj_set_text_color_closure) }, + { be_const_key_literal("_text_rule", -1), be_const_var(8) }, { be_const_key_literal("get_pad_bottom", -1), be_const_closure(lvh_obj_get_pad_bottom_closure) }, + { be_const_key_literal("_lv_part2_selector", -1), be_const_nil() }, + { be_const_key_literal("set_pad_left2", 42), be_const_closure(lvh_obj_set_pad_left2_closure) }, + { be_const_key_literal("get_line_width", 11), be_const_closure(lvh_obj_get_line_width_closure) }, + { be_const_key_literal("setmember", -1), be_const_closure(lvh_obj_setmember_closure) }, + { be_const_key_literal("set_mode", -1), be_const_closure(lvh_obj_set_mode_closure) }, + { be_const_key_literal("init", -1), be_const_closure(lvh_obj_init_closure) }, + { be_const_key_literal("get_obj", -1), be_const_closure(lvh_obj_get_obj_closure) }, + { be_const_key_literal("set_enabled", 32), be_const_closure(lvh_obj_set_enabled_closure) }, + { be_const_key_literal("get_text_rule_formula", -1), be_const_closure(lvh_obj_get_text_rule_formula_closure) }, + { be_const_key_literal("get_align", -1), be_const_closure(lvh_obj_get_align_closure) }, + { be_const_key_literal("set_click", 2), be_const_closure(lvh_obj_set_click_closure) }, + { be_const_key_literal("_val_rule_function", -1), be_const_var(7) }, + { be_const_key_literal("get_action", -1), be_const_closure(lvh_obj_get_action_closure) }, + { be_const_key_literal("member", 8), be_const_closure(lvh_obj_member_closure) }, + { be_const_key_literal("get_hidden", -1), be_const_closure(lvh_obj_get_hidden_closure) }, + { be_const_key_literal("get_pad_all", -1), be_const_closure(lvh_obj_get_pad_all_closure) }, + { be_const_key_literal("set_text_rule_formula", -1), be_const_closure(lvh_obj_set_text_rule_formula_closure) }, + { be_const_key_literal("get_text_color", -1), be_const_closure(lvh_obj_get_text_color_closure) }, })), be_str_literal("lvh_obj") ); @@ -4367,9 +4435,57 @@ be_local_closure(lvh_roller_set_options, /* name */ /******************************************************************** -** Solidified function: get_val +** Solidified function: get_text ********************************************************************/ -be_local_closure(lvh_roller_get_val, /* name */ +be_local_closure(lvh_roller_get_text, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("resize"), + /* K1 */ be_nested_str_literal("_lv_obj"), + /* K2 */ be_nested_str_literal("get_selected_str"), + /* K3 */ be_nested_str_literal("_buffer"), + /* K4 */ be_nested_str_literal("remove_trailing_zeroes"), + /* K5 */ be_nested_str_literal("asstring"), + }), + be_str_literal("get_text"), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60040015, // 0000 GETGBL R1 G21 + 0x7C040000, // 0001 CALL R1 0 + 0x8C040300, // 0002 GETMET R1 R1 K0 + 0x540E00FF, // 0003 LDINT R3 256 + 0x7C040400, // 0004 CALL R1 2 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x8C080502, // 0006 GETMET R2 R2 K2 + 0x8C100303, // 0007 GETMET R4 R1 K3 + 0x7C100200, // 0008 CALL R4 1 + 0x541600FF, // 0009 LDINT R5 256 + 0x7C080600, // 000A CALL R2 3 + 0x8C080104, // 000B GETMET R2 R0 K4 + 0x5C100200, // 000C MOVE R4 R1 + 0x7C080400, // 000D CALL R2 2 + 0x5C040400, // 000E MOVE R1 R2 + 0x8C080305, // 000F GETMET R2 R1 K5 + 0x7C080200, // 0010 CALL R2 1 + 0x80040400, // 0011 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_options +********************************************************************/ +be_local_closure(lvh_roller_get_options, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -4381,9 +4497,9 @@ be_local_closure(lvh_roller_get_val, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("get_selected"), + /* K1 */ be_nested_str_literal("get_options"), }), - be_str_literal("get_val"), + be_str_literal("get_options"), &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -4430,9 +4546,37 @@ be_local_closure(lvh_roller_set_val, /* name */ /******************************************************************** -** Solidified function: get_options +** Solidified function: set_text ********************************************************************/ -be_local_closure(lvh_roller_get_options, /* name */ +be_local_closure(lvh_roller_set_text, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("attribute_error"), + /* K1 */ be_nested_str_literal("set_text unsupported on roller"), + }), + be_str_literal("set_text"), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0xB0060101, // 0000 RAISE 1 K0 K1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(lvh_roller_get_val, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -4444,9 +4588,9 @@ be_local_closure(lvh_roller_get_options, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_obj"), - /* K1 */ be_nested_str_literal("get_options"), + /* K1 */ be_nested_str_literal("get_selected"), }), - be_str_literal("get_options"), + be_str_literal("get_val"), &be_const_str_solidified, ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -4466,13 +4610,15 @@ extern const bclass be_class_lvh_obj; be_local_class(lvh_roller, 0, &be_class_lvh_obj, - be_nested_map(5, + be_nested_map(7, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("set_options", 3), be_const_closure(lvh_roller_set_options_closure) }, - { be_const_key_literal("get_val", -1), be_const_closure(lvh_roller_get_val_closure) }, - { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_roller) }, - { be_const_key_literal("set_val", -1), be_const_closure(lvh_roller_set_val_closure) }, + { be_const_key_literal("set_options", 2), be_const_closure(lvh_roller_set_options_closure) }, + { be_const_key_literal("get_text", -1), be_const_closure(lvh_roller_get_text_closure) }, { be_const_key_literal("get_options", -1), be_const_closure(lvh_roller_get_options_closure) }, + { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_roller) }, + { be_const_key_literal("set_text", -1), be_const_closure(lvh_roller_set_text_closure) }, + { be_const_key_literal("set_val", 4), be_const_closure(lvh_roller_set_val_closure) }, + { be_const_key_literal("get_val", -1), be_const_closure(lvh_roller_get_val_closure) }, })), be_str_literal("lvh_roller") ); diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h index 3b18a9a2a..aac9f4a35 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lv_c_mapping.h @@ -875,7 +875,7 @@ const be_ntv_func_def_t lv_dropdown_func[] = { { "get_options", { (const void*) &lv_dropdown_get_options, "s", "(lv.lv_obj)" } }, { "get_selected", { (const void*) &lv_dropdown_get_selected, "i", "(lv.lv_obj)" } }, { "get_selected_highlight", { (const void*) &lv_dropdown_get_selected_highlight, "b", "(lv.lv_obj)" } }, - { "get_selected_str", { (const void*) &lv_dropdown_get_selected_str, "", "(lv.lv_obj)si" } }, + { "get_selected_str", { (const void*) &lv_dropdown_get_selected_str, "", "(lv.lv_obj)ci" } }, { "get_symbol", { (const void*) &lv_dropdown_get_symbol, "s", "(lv.lv_obj)" } }, { "get_text", { (const void*) &lv_dropdown_get_text, "s", "(lv.lv_obj)" } }, { "is_open", { (const void*) &lv_dropdown_is_open, "b", "(lv.lv_obj)" } }, @@ -898,7 +898,7 @@ const be_ntv_func_def_t lv_label_func[] = { { "get_letter_pos", { (const void*) &lv_label_get_letter_pos, "", "(lv.lv_obj)i(lv.lv_point)" } }, { "get_long_mode", { (const void*) &lv_label_get_long_mode, "i", "(lv.lv_obj)" } }, { "get_recolor", { (const void*) &lv_label_get_recolor, "b", "(lv.lv_obj)" } }, - { "get_text", { (const void*) &lv_label_get_text, "s", "(lv.lv_obj)" } }, + { "get_text", { (const void*) &lv_label_get_text, "c", "(lv.lv_obj)" } }, { "get_text_selection_end", { (const void*) &lv_label_get_text_selection_end, "i", "(lv.lv_obj)" } }, { "get_text_selection_start", { (const void*) &lv_label_get_text_selection_start, "i", "(lv.lv_obj)" } }, { "ins_text", { (const void*) &lv_label_ins_text, "", "(lv.lv_obj)is" } }, @@ -928,7 +928,7 @@ const be_ntv_func_def_t lv_roller_func[] = { { "get_option_cnt", { (const void*) &lv_roller_get_option_cnt, "i", "(lv.lv_obj)" } }, { "get_options", { (const void*) &lv_roller_get_options, "s", "(lv.lv_obj)" } }, { "get_selected", { (const void*) &lv_roller_get_selected, "i", "(lv.lv_obj)" } }, - { "get_selected_str", { (const void*) &lv_roller_get_selected_str, "", "(lv.lv_obj)si" } }, + { "get_selected_str", { (const void*) &lv_roller_get_selected_str, "", "(lv.lv_obj)ci" } }, { "set_options", { (const void*) &lv_roller_set_options, "", "(lv.lv_obj)s(lv.lv_roller_mode)" } }, { "set_selected", { (const void*) &lv_roller_set_selected, "", "(lv.lv_obj)ii" } }, { "set_visible_row_count", { (const void*) &lv_roller_set_visible_row_count, "", "(lv.lv_obj)i" } }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c index 14707d20b..aec4cbf45 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c @@ -75,7 +75,7 @@ const be_ntv_func_def_t lv_func[] = { { "draw_arc_dsc_init", { (const void*) &lv_draw_arc_dsc_init, "", "(lv.lv_draw_arc_dsc)" } }, { "draw_arc_get_area", { (const void*) &lv_draw_arc_get_area, "", "iiiiiib(lv.lv_area)" } }, { "draw_img", { (const void*) &lv_draw_img, "", "(lv.lv_draw_ctx)(lv.lv_draw_img_dsc)(lv.lv_area)." } }, - { "draw_img_decoded", { (const void*) &lv_draw_img_decoded, "", "(lv.lv_draw_ctx)(lv.lv_draw_img_dsc)(lv.lv_area)(lv.uint8)i" } }, + { "draw_img_decoded", { (const void*) &lv_draw_img_decoded, "", "(lv.lv_draw_ctx)(lv.lv_draw_img_dsc)(lv.lv_area)ci" } }, { "draw_img_dsc_init", { (const void*) &lv_draw_img_dsc_init, "", "(lv.lv_draw_img_dsc)" } }, { "draw_init", { (const void*) &lv_draw_init, "", "" } }, { "draw_label", { (const void*) &lv_draw_label, "", "(lv.lv_draw_ctx)(lv.lv_draw_label_dsc)(lv.lv_area)s(lv.lv_draw_label_hint)" } }, @@ -109,6 +109,7 @@ const be_ntv_func_def_t lv_func[] = { { "event_stop_bubbling", { (const void*) &lv_event_stop_bubbling, "", "(lv.lv_event)" } }, { "event_stop_processing", { (const void*) &lv_event_stop_processing, "", "(lv.lv_event)" } }, { "flex_init", { (const void*) &lv_flex_init, "", "" } }, + { "font_get_glyph_bitmap", { (const void*) &lv_font_get_glyph_bitmap, "c", "(lv.lv_font)i" } }, { "font_get_glyph_dsc", { (const void*) &lv_font_get_glyph_dsc, "b", "(lv.lv_font)(lv.lv_font_glyph_dsc)ii" } }, { "font_get_glyph_width", { (const void*) &lv_font_get_glyph_width, "i", "(lv.lv_font)ii" } }, { "font_get_line_height", { (const void*) &lv_font_get_line_height, "i", "(lv.lv_font)" } }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py index bb36141e3..c305bdc34 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py @@ -35,8 +35,10 @@ return_types = { "int32_t": "i", "void *": ".", "const void *": ".", - "char *": "s", + "char *": "c", + "uint8_t *": "c", "const char *": "s", + "constchar *": "s", # special construct "lv_obj_user_data_t": "i", "lv_objmask_mask_t *": ".", @@ -122,6 +124,7 @@ return_types = { "lv_anim_start_cb_t": "c", # arrays + "constchar * []": "str_arr", "char * []": "str_arr", "lv_coord_t []": "lv_coord_arr", "lv_point_t []": "lv_point_arr", @@ -161,6 +164,7 @@ return_types = { "lv_timer_t *": "lv_timer", "lv_coord_t *": "c", # treat as a simple pointer, decoding needs to be done at Berry level "char **": "c", # treat as a simple pointer, decoding needs to be done at Berry level + "constchar **": "c", # treat as a simple pointer, decoding needs to be done at Berry level # callbacks "lv_group_focus_cb_t": "lv_group_focus_cb", @@ -229,6 +233,7 @@ with open(lv_widgets_file) as f: l_raw = l_raw.strip(" \t\n\r") # remove leading or trailing spaces l_raw = re.sub('static ', '', l_raw) l_raw = re.sub('inline ', '', l_raw) + l_raw = re.sub('const\s+char\s*\*', 'constchar *', l_raw) l_raw = re.sub('const ', '', l_raw) l_raw = re.sub('struct ', '', l_raw) if (len(l_raw) == 0): continue diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/openhasp/openhasp.tapp index 954fe51268a8a9c92107678059bb27d2be8400b8..e7f8e8ae139be04b415d98ca584fff71cf35a0e9 100644 GIT binary patch delta 891 zcmZ`&OKTHR6ix^TRxDNm+Unw%2ubKn()a=&aZwSvs0yXUh3MqY$QTe`?GhC9tPNSnovrLDj@+ z@y^Qe_}R)_eDUk-q`CBDZH>6*Y!zz9FseE|O)`T*C^1corEQ@@8x^u-L21f_C{)p4 zAf(0)h!CU*0+gj0h;OtO#${kZAUvk=AO9q+n_amyX=1EuZF+oX&R?jRVaY>4CL;?F zl9CcxaxhLXbcEZhZ&Jquphxu`@?X`hJE=vhHEY=@(@9L7M40;gfA*26BN@^vnM%z( cdGqMpz1jWuDgOQKw7EX~p2Kn6|jd!oSB@qhsc0C&qUF8}}l diff --git a/tasmota/berry/openhasp/openhasp_demo.tapp b/tasmota/berry/openhasp/openhasp_demo.tapp index 9e69b789593547a6b03942abe5e5a04391f69377..79b11f4845a1087c13a22d3ae507569111511d73 100644 GIT binary patch delta 983 zcmZ{j&ui2`6vuZXSZGlcrQpeDR@f}NS*)Um(hBOeC~7^4q?7DRJ8ga}Gn3UWxa+BZ zg83gTUW&L!y?OU6R(caD`Ukk+n@l3B;#`uv`M%G4FY}$Z?-yQuSa|WKes+4gx$%1a z_};bKsmp_3^q$7|oknI2_y;8!Vy$VakM-`+b4mV3GWpo7= zRm;*YH!W3ifhrRT_{7j5dNisv`MzkqJAaCR0~YBH5+3FIZR^^2rh{rch0l~85TmfG z-^&K|HUWxVLzvm1t+<~G1=})B{)j6kJse=7yjUM74cYA28e%Uu=V4h>%k{5P!@9jJ z?mIfcOl!n6;N)}LI(RUqV*1o1Do=}?QbsnD2sTq>8S(*oEk@Sf@afMLMs`}&ab3NBqh-2o0GXOB zM-d~^Y5Dz!*17!nxiz=$k-;6m>lvog>S(1Yt+~aCn0xd;dsZIkGHEW0lYe??1(R&M35_w?(bb@>F{)BMaA3r>DKv}(25FBwTO4FCWD delta 121 zcmZ2=oO{~=?uIRlf`9p%x2_IZt$QTe`?GhC9tPNSnovrLDj@+ z@y^Qe_}R)_eDUk-q`CBDZH>6*Y!zz9FseE|O)`T*C^1corEQ@@8x^u-L21f_C{)p4 zAf(0)h!CU*0+gj0h;OtO#${kZAUvk=AO9q+n_amyX=1EuZF+oX&R?jRVaY>4CL;?F zl9CcxaxhLXbcEZhZ&Jquphxu`@?X`hJE=vhHEY=@(@9L7M40;gfA*26BN@^vnM%z( cdGqMpz1jWuDgOQKw7EX~p2Kn6|jd!oSB@qhsc0C&qUF8}}l diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index f9b8b6ef4..3c0e552ff 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -175,6 +175,21 @@ class lvh_obj return bool(re.search("color$", str(t))) end + #- remove trailing NULL chars from a bytes buffer before converting to string -# + #- Berry strings can contain NULL, but this messes up C-Berry interface -# + static def remove_trailing_zeroes(b) + var sz = size(b) + var i = 0 + while i < sz + if b[-1-i] != 0 break end + i += 1 + end + if i > 0 + b.resize(size(b)-i) + end + return b + end + ################################################################################# # Parses a color attribute # @@ -324,7 +339,13 @@ class lvh_obj try # try to get the new val var val = self.val - tas_event_more = string.format(',"val":%i', val) + if val != nil tas_event_more = string.format(',"val":%i', val) end + var text = self.text + if text != nil + import json + tas_event_more += ',"text":' + tas_event_more += json.dump(text) + end except .. end end @@ -1025,6 +1046,17 @@ class lvh_roller : lvh_obj def get_options() return self._lv_obj.get_options() end + + def set_text(t) + raise "attribute_error", "set_text unsupported on roller" + end + def get_text() + # allocate a bytes buffer + var b = bytes().resize(256) # force 256 bytes + self._lv_obj.get_selected_str(b._buffer(), 256) + b = self.remove_trailing_zeroes(b) + return b.asstring() + end end ################################################################################# diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp index 9e69b789593547a6b03942abe5e5a04391f69377..79b11f4845a1087c13a22d3ae507569111511d73 100644 GIT binary patch delta 983 zcmZ{j&ui2`6vuZXSZGlcrQpeDR@f}NS*)Um(hBOeC~7^4q?7DRJ8ga}Gn3UWxa+BZ zg83gTUW&L!y?OU6R(caD`Ukk+n@l3B;#`uv`M%G4FY}$Z?-yQuSa|WKes+4gx$%1a z_};bKsmp_3^q$7|oknI2_y;8!Vy$VakM-`+b4mV3GWpo7= zRm;*YH!W3ifhrRT_{7j5dNisv`MzkqJAaCR0~YBH5+3FIZR^^2rh{rch0l~85TmfG z-^&K|HUWxVLzvm1t+<~G1=})B{)j6kJse=7yjUM74cYA28e%Uu=V4h>%k{5P!@9jJ z?mIfcOl!n6;N)}LI(RUqV*1o1Do=}?QbsnD2sTq>8S(*oEk@Sf@afMLMs`}&ab3NBqh-2o0GXOB zM-d~^Y5Dz!*17!nxiz=$k-;6m>lvog>S(1Yt+~aCn0xd;dsZIkGHEW0lYe??1(R&M35_w?(bb@>F{)BMaA3r>DKv}(25FBwTO4FCWD delta 121 zcmZ2=oO{~=?uIRlf`9p%x2_IZt Date: Fri, 13 May 2022 12:28:48 +0200 Subject: [PATCH 227/376] Include shutter tilt config in discovery message --- tasmota/xdrv_12_discovery.ino | 12 ++++++++++++ tasmota/xdrv_12_home_assistant.ino | 12 ++++++++++++ 2 files changed, 24 insertions(+) diff --git a/tasmota/xdrv_12_discovery.ino b/tasmota/xdrv_12_discovery.ino index 5d5f71431..44c3325c7 100644 --- a/tasmota/xdrv_12_discovery.ino +++ b/tasmota/xdrv_12_discovery.ino @@ -209,6 +209,18 @@ void TasDiscoverMessage(void) { } ResponseAppend_P(PSTR("]," // Shutter Options (end) + "\"sht\":[")); // Shutter Tilt (start) + for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { +#ifdef USE_SHUTTER + ResponseAppend_P(PSTR("%s[%d,%d,%d]"), (i > 0 ? "," : ""), + Settings->shutter_tilt_config[0][i], + Settings->shutter_tilt_config[1][i], + Settings->shutter_tilt_config[2][i]); +#else + ResponseAppend_P(PSTR("%s[0,0,0]"), (i > 0 ? "," : "")); +#endif // USE_SHUTTER + } + ResponseAppend_P(PSTR("]," // Shutter Tilt (end) "\"ver\":1}")); // Discovery version } diff --git a/tasmota/xdrv_12_home_assistant.ino b/tasmota/xdrv_12_home_assistant.ino index 00bbf6734..ffc099e5d 100644 --- a/tasmota/xdrv_12_home_assistant.ino +++ b/tasmota/xdrv_12_home_assistant.ino @@ -376,6 +376,18 @@ void HassDiscoverMessage(void) { } ResponseAppend_P(PSTR("]," // Shutter Options (end) + "\"sht\":[")); // Shutter Tilt (start) + for (uint32_t i = 0; i < MAX_SHUTTERS; i++) { +#ifdef USE_SHUTTER + ResponseAppend_P(PSTR("%s[%d,%d,%d]"), (i > 0 ? "," : ""), + Settings->shutter_tilt_config[0][i], + Settings->shutter_tilt_config[1][i], + Settings->shutter_tilt_config[2][i]); +#else + ResponseAppend_P(PSTR("%s[0,0,0]"), (i > 0 ? "," : "")); +#endif // USE_SHUTTER + } + ResponseAppend_P(PSTR("]," // Shutter Tilt (end) "\"ver\":1}")); // Discovery version } From 5680bc9cef45222694b0699e870b7e1d94a4675e Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 13 May 2022 12:37:38 +0200 Subject: [PATCH 228/376] Removed duplicated announcement of shutter --- tasmota/xdrv_27_shutter.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index d4cbd0191..e94cf8088 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -1653,7 +1653,7 @@ void CmndShutterTiltConfig(void) 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]); + snprintf_P(setting_chr, sizeof(setting_chr), PSTR("%d %d %d %d %d"), 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]); From 02e62782129f1323e036051294e1d351a93412e4 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 12:48:22 +0200 Subject: [PATCH 229/376] add tasmota32c3usb --- .github/workflows/Tasmota_build_master.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index f065fd5f6..d39246639 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -37,12 +37,14 @@ jobs: - tasmota32-ir - tasmota32-lvgl - tasmota32c3 + - tasmota32c3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot - tasmota32c3-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot + - tasmota32c3usb-safeboot steps: - uses: actions/checkout@v3 with: From 9971e5924c81abb0fbfed072682dde8ac8056462 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 13 May 2022 16:20:04 +0200 Subject: [PATCH 230/376] Partition Wizard compiled bytecode --- tasmota/berry/modules/Partition_Manager.tapp | Bin 16837 -> 17005 bytes .../modules/Partition_Manager/partition.bec | Bin 16468 -> 16636 bytes tasmota/berry/modules/Partition_Wizard.tapp | Bin 0 -> 16175 bytes .../Partition_Wizard/partition_wizard.bec | Bin 0 -> 15732 bytes tasmota/berry/modules/Partition_wizard.tapp | Bin 31911 -> 16175 bytes tasmota/berry/modules/partition.be | 530 +++++++++++++++--- .../partition_wizard.be | 3 +- 7 files changed, 443 insertions(+), 90 deletions(-) create mode 100644 tasmota/berry/modules/Partition_Wizard.tapp create mode 100644 tasmota/berry/modules/Partition_Wizard/partition_wizard.bec rename tasmota/berry/modules/{Partition_Wizard => }/partition_wizard.be (99%) diff --git a/tasmota/berry/modules/Partition_Manager.tapp b/tasmota/berry/modules/Partition_Manager.tapp index 8e2c8b91b5dd2f8b33e4bd39089a6169fb7feb6c..013bd556ed34a419418ff93590f13532cc06a35f 100644 GIT binary patch delta 2669 zcmb_e-D@0G6hHH^^F6b>$z(H`Owvi5v}+pEY24N^hBSdHiV^a#(x{;(trhd233ZDr zjBfoNWYv_(gNW#Z0ShV=f)ISxCw&q05Aew+9|Rwz>+kN&>iUU-3(Glk&&NIIcg{Wc ze(@6b!^@nxdcPoQ#D4d^_r^7ILVnmhcj3Hw?%JulZ`*kBlloio=Rf_tM8y6kd9<^6 zxv|yQ+J0*G!ljE3)>RU|dE)sC_+R_*v{)cIb?v(kPN~E<$>aBlq(fB@+r*18x!Pf| zpnxx}lc>Zcf$>UA#2*rgSIY;Va^H=$6rN@g3@rDF*Y-)Y_64EDtYVG^8bqZPQpBsG zoUIiEyDgEoMxq_d;EA_m1ys$~7_a5L&Oxqt*gexR@^w?S6HB*~qHYJv3RRlSsFVxK ze`7QNok77%m@^wZ+Za(_9ZJ8R8Yx-7;q>Um?aP@PO#QioJY;n9*EQXMuI}_e}t_~v*>aqx6g6U0n1`ETR#|^evad}pGn_6?tvV9cKjW_ zHN?}K-SYmsX1>Jn*ZUiK7QLvFy&($@n%oCiPTXy9-LVC78>;G{T23r!P9T!o)Cx{p zXL?$Ie4V%@InoW2DQP~s9>(OY$cE<$G~Textkg=;vqc(*v4@JHwX`aXy;z1VN8W~3 z@NpObhBkwB9|3rAS%odz1Z_B=ddXlh^JSxbhVu3dIli^SvZ>@JX}&L;N?$fNJ0taB zIFT%8kHX2rk+P4h{Maq~d!uH69-Xdh1A(EIe6dJJ>!3zX6)NF4vz9S@k4J}iW@by^ z$3|MxjXye6^uXrmXhYV5pg>2Fb1s*}yACYc!1O%W3 zin{3T4ypkH4dRKM+CqTr;Y$qSAJH|17P6nrv%i4sZ&C9BrQ1GEbTfcM44=00>mYL4 zQ#mp>J7Yk_Pvnxf=M}S!5JcnH14xQxtYsPZvPZ_vDrBmfAuv_;ea!XA=B-#fqNj87 zlb)q#etL+Wp$yrn!GO~5=ls?r8x>-R8qdUPCA4{(YfN)tVpPIFqPgbrLfD>RI+cZW z8dzGN=FTQSE;fLeQVD_5T=TXrN^^DCD8^!CcT^9PBYG{tXd>gZyW0_ZGIw{>gv{*8 z##@=t4wcbjcTqGJ#{qK)m_xvvQCkQBa~A093}&D_nk+iQVCuJ(WUCh8l8TK+$R_ zS{SS8#_gjmg_hRHIg1kAixRCQWYl64B~qydiwNjIE=I7Z#V5HavD^ryo=2&>d?3?2 zN*%RB=uOetHFED=KM6n6+$wxUvBk>mL^yHtP0fu^_W9;qx9k}7PSjGYZrvl)eIY4& z5n0{3vs)m7jMW`7vnLxz*&(Y$D0_EJw7O-FkZOdoXVgaEL%qOJ_S>-`N8B_Qa{_driURgfIUWMuV%f585j7{hlAI<`h delta 2617 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 E0HZPN`Tzg` delta 2458 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

!T=n8KX7U-W0>^OyMEn|~%S ze=??CkEg{^*5knl)^jcdKGOmJn+PXhe*HBSyfs}v*3ZvlO-oo4u-(kPb;>?~)w9%% zGoGr!`pNRx-kQ8|Cj#T159}F?_nyoNjS0*ht}Cw@?keO>J}2*|k9C9;a*R{66$RPB zdw+qgIkp@jKl<|&-aM}!>*wY$&m!iDd9h{2a|ON|=d(aKg5^kmp6(cvfiZlS`65BS z48>T_MB;<-_R*ff8PKI|b?mzBoRL;pmq{P{$OfxWal@5OeKmHY&(&VwLdNd|gNtIu zHq(Pnz7M6Ce)rs~cz~G3shKT8;>c*n>G2owx(sj{JxNpE>o92PLuZS~E%07M&x>b! zzB#<-n}I%Vp6cVK>;vaOl%ZPPZUf76F)Nr*jy0@qxV#8Q6!d^U#_1FzuP_!z2s#0$ zlROJ=xmT~a^`N!3&KMpixNw|Yb?ec~f%K|pMq|hi9)0%EgOCN#>tR^)M;`)f{`}#G z55D}ShD9`d`1$9LKKC2)LP$m2w(hw94_`E=z?_q91Ho8i>c~w{^?U;UXBd8`4AP=r z?fIbk&nccd){qzw^%4W5Yo;^qMZd)FAcp@yw>|}Xq;ZzyG(@&{Tf<;HojAPQ*#qWe z(iiou`a9omHJb>GTeUkkKoL+6@EgkS*{o&901`H#r1z|HWee~$s)w%`+d^)Rm~spy zhPCN1G-L+UaTxc%7>}0#jr<%|8?WU+Vm1Ase!`osJFmbbFd@byo%*iT;R*dt(c#hB z4m}gPXZ1V8B^**Ud>0gi;j`$9kpuFO1DLTerOd9;Gi70B0(K_dSPw^J$nh|un+Rhu z=3*LQJqu(JCaRWIrD}|8K91ssc>)L)_?m4N>D~lA8Q)@Xp<&)P_iuRfQMJRe+<1j9 zZGZd3mau9H4XY0(xJct$NAwQ$oY2DfokWZJH1WG9ddNkmdMOpIi!*pX{3JsVToL*H z01tz9r4R}#r~$B`>pA1~+8qqpOP_;BCNrfxd3sxHBDnMHgV~~j|9J%WLc>-xjP>W1%%0_<=SyE2TvGdRiLo{WL+vxjQj zcy$+XWF?wE3?s`yx-F?ZeH}(N1Fk3T)mS0-{;qp9fGI-qL+k^sCtW+>6Bve@aUIY7 z43OO?^`I}Ybn0fr(f}0l!7{GvW4PQ~&+C!ThPyqZYKJipXX;46o1_JOjI1zhkKPSa zsub2z_Ylo`g}{c?lq%{XQ3G}QD-F@BXebNs4B`XXVyr*USOvz zyM1#pbaHa?v%cXnl0ML5(7~wyDD4{>Hv`2HyO;#1D|hNFD)~*mdD!>Ob?r?sD>Q;Q zTeKHPli?Wb&XglVGqAVW{?=n0ugk-CmIS586E4wdV*na~G$!yoY8DWlxw3DdtX-UV z8O=|;G%ruQap^$;3J^$=XIyL6Nu;dX@K7xW?T$z?cxY} z1vg&u=ygPx(aX_9erD7>)WCr!;mMK~&+1Ut(DhJXDeXY_ePAH(oUwemovYA&e;BGy z;!@I-`yC@h!>GdF@*p1rsF?QAgJ1+t9$FuZI3rKx)&%qPkW@EtJA7k9V+#G9eB0HZ zEaJS_$tvr5QXwET1{c-WcrE z#sQuI2>ANsQYo1bhX@6~k_oWJoSsS-4gqdaEI;)!?SWaQCltm2gk?M@d<)J7k2&rM zm^&CV8yFJ+g){M8?G49*lZgLv^3iWkzJqe%P|xIFolm<0Aa-sJbGy2qLtE)6bHV@| z(x@+QZc3lA222I!xwosVS^ipiY+WO}^ykC{v1o zj>Ihpt6N>uyN-o#VIS^c>|5P}w-4X(_JM(zJoaVUyU&O7NAEBgg8hc0z6!8FFo;=5 z3&hQ*_oF|`yiCVjp(~#oLPYp^Qiw2v3ait{vj7#ewX1NUkTi$;cX9uVapXqQJp2OD z<#V~}oeKj6-^DpI&~OQ5FA5zZBfagZB{pVV;4^74wotyd;k? zU+%-X_YVHD5uEv;!cNm!myOKp>@6BNZ&w8(Z`-9 z#1_9ZQ|qZIw5_cUzris{o&#SwA#d2%BH#Sc1yl9^ zr%R9ihaCHms^MBpL9z#@)erM`B2fJb{P(Y2zrE+bOW#G)T!aIDie$H-&pzmskNjw5 z!K$2NVpwlDl1KXj za)W`78!mRws*&rbJvGVYzRIM70#4?X3h60|w?Nke4Ep8U!qM(WVHU^Jdh)er{39&I z`I~QvRLhus2{{OTd(e9cItJfp+0t07H>=P$oFUBNFy{W&R!<(Y*TESK*W3&SH#Y$x z^!CacJ~*>2VOz)(t%#kDwRLB9cIB}jI&&u{YOU(tE+TjG)3)V>iW~Gt;G^v&@Jcz; z`xpmV?(LPw5~Rmx2CfhqhE1P>*>AweqY4o<){PyV{_rF!ThfLzI#V!YA z+ekoxmS=dy_Odw!wVCE=Gk6*@G6A|qJ~T)HDZr0P9||Zs&H$D*Zn6TPu-Vp)S%E-8 z)!Jz_YF6jYEShrAxSx?AQ@oLv-M5nl)ar1c#Vq@SKmPEehxZ>nD)}=IbNF%u`Hb%F zzw2dA$jK}YOvZn8_>4y6vv{V!@GObPyoLQN&NFZwtIW6Lvq(vP+J}>N257DyeGWcH zlH&+i$9zURj?=bpFD!H_&#!OSot?c+r0sM(i{LtpjRn95_+HdmD7oL+UGtNM7x^5*&`Jk372oUwr8GWbx#hqL&?_RP0!a>;9-gp{eU8%sF* zy*ZpL@9*^=bK%t2=Mneo^MQ}JgB_mzC_LC9@)kM#arzT=`H47s9`bqk+9wgltnpEs MLchkfxx#n<1GPsQyZ`_I literal 0 HcmV?d00001 diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec b/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec new file mode 100644 index 0000000000000000000000000000000000000000..843fe128c1416ba47658cbab1637631184b24934 GIT binary patch literal 15732 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 O7GKz2__j?h`F{Y8)TQwN literal 0 HcmV?d00001 diff --git a/tasmota/berry/modules/Partition_wizard.tapp b/tasmota/berry/modules/Partition_wizard.tapp index 9c9f5cd3036d5e7d9b2a1d028a5e6d9fdf8ea0d0..f98760d4f0ca96332dc7a63395eea7115ef709b6 100644 GIT binary patch literal 16175 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

!T=n8KX7U-W0>^OyMEn|~%S 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 MLchkfxx#n<1GPsQyZ`_I literal 31911 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 0 + if b[-1] == 0 b.resize(size(b)-1) + else break end + end + return b + end + + # + def init(raw) + if raw == nil || !issubclass(bytes, raw) # no payload, empty partition information + self.type = 0 + self.subtype = 0 + self.start = 0 + self.size = 0 + self.label = '' + self.flags = 0 + return + end + + #- we have a payload, parse it -# + var magic = raw.get(0,2) + if magic == 0x50AA #- partition entry -# + + self.type = raw.get(2,1) + self.subtype = raw.get(3,1) + self.start = raw.get(4,4) + self.size = raw.get(8,4) + self.label = self.remove_trailing_zeroes(raw[12..27]).asstring() + self.flags = raw.get(28,4) + + elif magic == 0xEBEB #- MD5 -# + else + import string + raise "internal_error", string.format("invalid magic number %02X", magic) + end + + end + + # check if the parition is an OTA partition + # if yes, return OTA number (starting at 0) + # if no, return nil + def is_ota() + if self.type == 0 && (self.subtype >= 0x10 && self.subtype < 0x20) + return self.subtype - 0x10 + end + end + + # check if the parition is a SPIFFS partition + # returns bool + def is_spiffs() + return self.type == 1 && self.subtype == 130 + end + + # get the actual image size give of the partition + # returns -1 if the partition is not an app ota partition + def get_image_size() + import flash + if self.is_ota() == nil return -1 end + try + var addr = self.start + var magic_byte = flash.read(addr, 1).get(0, 1) + if magic_byte != 0xE9 return -1 end + + var seg_count = flash.read(addr+1, 1).get(0, 1) + # print("Segment count", seg_count) + + var seg_offset = addr + 0x20 # sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) = 24 + 8 + + for seg_num:0..seg_count-1 + # print(string.format("Reading 0x%08X", seg_offset)) + var segment_header = flash.read(seg_offset - 8, 8) + var seg_start_addr = segment_header.get(0, 4) + var seg_size = segment_header.get(4,4) + # print(string.format("Segment %i: flash_offset=0x%08X start_addr=0x%08X size=0x%08X", seg_num, seg_offset, seg_start_addr, seg_size)) + + seg_offset += seg_size + 8 # add segment_length + sizeof(esp_image_segment_header_t) + end + var total_size = seg_offset - addr + 1 # add 1KB for safety + + # print(string.format("Total size = %i KB", total_size/1024)) + + return total_size + except .. as e, m + print("BRY: Exception> '" + e + "' - " + m) + return -1 + end + end + + def tostring() + import string + var type_s = "" + var subtype_s = "" + if self.type == 0 type_s = "app" + if self.subtype == 0 subtype_s = "factory" + elif self.subtype >= 0x10 && self.subtype < 0x20 subtype_s = "ota" + str(self.subtype - 0x10) + elif self.subtype == 0x20 subtype_s = "test" + end + elif self.type == 1 type_s = "data" + if self.subtype == 0x00 subtype_s = "otadata" + elif self.subtype == 0x01 subtype_s = "phy" + elif self.subtype == 0x02 subtype_s = "nvs" + elif self.subtype == 0x03 subtype_s = "coredump" + elif self.subtype == 0x04 subtype_s = "nvskeys" + elif self.subtype == 0x05 subtype_s = "efuse_em" + elif self.subtype == 0x80 subtype_s = "esphttpd" + elif self.subtype == 0x81 subtype_s = "fat" + elif self.subtype == 0x82 subtype_s = "spiffs" + end + end + + #- reformat strings -# + if type_s != "" type_s = " (" + type_s + ")" end + if subtype_s != "" subtype_s = " (" + subtype_s + ")" end + return string.format("", + self.type, type_s, + self.subtype, subtype_s, + self.start, self.size, + self.label, self.flags) + end + + def tobytes() + #- convert to raw bytes -# + var b = bytes('AA50') #- set magic number -# + b.resize(32).resize(2) #- pre-reserve 32 bytes -# + b.add(self.type, 1) + b.add(self.subtype, 1) + b.add(self.start, 4) + b.add(self.size, 4) + var label = bytes().fromstring(self.label) + label.resize(16) + b = b + label + b.add(self.flags, 4) + return b + end + +end +partition.Partition_info = Partition_info #------------------------------------------------------------- - OTA Data @@ -73,77 +200,302 @@ var partition = module('partition') so current ota app sub type id is x , dest bin subtype is y,total ota app count is n seq will add (x + n*1 + 1 - seq)%n -------------------------------------------------------------# -# class Partition_otadata -# var maxota #- number of highest OTA partition, default 1 (double ota0/ota1) -# -# var offset #- offset of the otadata partition (0x2000 in length), default 0xE000 -# -# var active_otadata #- which otadata block is active, 0 or 1, i.e. 0xE000 or 0xF000 -# -# var seq0 #- ota_seq of first block -# -# var seq1 #- ota_seq of second block -# -# -# #- crc32 for ota_seq as 32 bits unsigned, with init vector -1 -# -# static def crc32_ota_seq(seq) -# -# #---------------------------------------------------------------------# -# # Rest of the class -# #---------------------------------------------------------------------# -# def init(maxota, offset) -# -# #- update ota_max, needs to recompute everything -# -# def set_ota_max(n) -# -# # change the active OTA partition -# def set_active(n) -# -# #- load otadata from SPI Flash -# -# def load() -# -# # Save partition information to SPI Flash -# def save() -# -# # Produce a human-readable representation of the object with relevant information -# def tostring() -#end +class Partition_otadata + var maxota #- number of highest OTA partition, default 1 (double ota0/ota1) -# + var offset #- offset of the otadata partition (0x2000 in length), default 0xE000 -# + var active_otadata #- which otadata block is active, 0 or 1, i.e. 0xE000 or 0xF000 -# + var seq0 #- ota_seq of first block -# + var seq1 #- ota_seq of second block -# + + #------------------------------------------------------------- + - Simple CRC32 imple + - + - adapted from Python https://rosettacode.org/wiki/CRC-32#Python + -------------------------------------------------------------# + static def crc32_create_table() + var a = [] + for i:0..255 + var k = i + for j:0..7 + if k & 1 + k = (k >> 1) & 0x7FFFFFFF + k ^= 0xedb88320 + else + k = (k >> 1) & 0x7FFFFFFF + end + end + a.push(k) + end + return a + end + static crc32_table = Partition_otadata.crc32_create_table() + + static def crc32_update(buf, crc) + crc ^= 0xffffffff + for k:0..size(buf)-1 + crc = (crc >> 8 & 0x00FFFFFF) ^ Partition_otadata.crc32_table[(crc & 0xff) ^ buf[k]] + end + return crc ^ 0xffffffff + end + + #- crc32 for ota_seq as 32 bits unsigned, with init vector -1 -# + static def crc32_ota_seq(seq) + return Partition_otadata.crc32_update(bytes().add(seq, 4), 0xFFFFFFFF) + end + + #---------------------------------------------------------------------# + # Rest of the class + #---------------------------------------------------------------------# + def init(maxota, offset) + self.maxota = maxota + if self.maxota == nil self.maxota = 1 end + self.offset = offset + if self.offset == nil self.offset = 0xE000 end + self.active_otadata = 0 + self.load() + end + + #- update ota_max, needs to recompute everything -# + def set_ota_max(n) + self.maxota = n + end + + # change the active OTA partition + def set_active(n) + var seq_max = 0 #- current highest seq number -# + var block_act = 0 #- block number containing the highest seq number -# + + if self.seq0 != nil + seq_max = self.seq0 + block_act = 0 + end + if self.seq1 != nil && self.seq1 > seq_max + seq_max = self.seq1 + block_act = 1 + end + + #- compute the next sequence number -# + var actual_ota = (seq_max - 1) % (self.maxota + 1) + if actual_ota != n #- change only if different -# + if n > actual_ota seq_max += n - actual_ota + else seq_max += (self.maxota + 1) - actual_ota + n + end + + #- update internal structure -# + if block_act == 1 #- current block is 1, so update block 0 -# + self.seq0 = seq_max + else #- or write to block 1 -# + self.seq1 = seq_max + end + self._validate() + end + end + + #- load otadata from SPI Flash -# + def load() + import flash + var otadata0 = flash.read(0xE000, 32) + var otadata1 = flash.read(0xF000, 32) + self.seq0 = otadata0.get(0, 4) #- ota_seq for block 1 -# + self.seq1 = otadata1.get(0, 4) #- ota_seq for block 2 -# + var valid0 = otadata0.get(28, 4) == self.crc32_ota_seq(self.seq0) #- is CRC32 valid? -# + var valid1 = otadata1.get(28, 4) == self.crc32_ota_seq(self.seq1) #- is CRC32 valid? -# + if !valid0 self.seq0 = nil end + if !valid1 self.seq1 = nil end + + self._validate() + end + + #- internally used, validate data -# + def _validate() + self.active_otadata = 0 #- if none is valid, default to OTA0 -# + if self.seq0 != nil + self.active_otadata = (self.seq0 - 1) % (self.maxota + 1) + end + if self.seq1 != nil && (self.seq0 == nil || self.seq1 > self.seq0) + self.active_otadata = (self.seq1 - 1) % (self.maxota + 1) + end + end + + # Save partition information to SPI Flash + def save() + import flash + #- check the block number to save, 0 or 1. Choose the highest ota_seq -# + var block_to_save = -1 #- invalid -# + var seq_to_save = -1 #- invalid value -# + + # check seq0 + if self.seq0 != nil + seq_to_save = self.seq0 + block_to_save = 0 + end + if (self.seq1 != nil) && (self.seq1 > seq_to_save) + seq_to_save = self.seq1 + block_to_save = 1 + end + # if none was good + if block_to_save < 0 block_to_save = 0 end + if seq_to_save < 0 seq_to_save = 1 end + + var offset_to_save = self.offset + 0x1000 * block_to_save #- default 0xE000 or 0xF000 -# + + var bytes_to_save = bytes() + bytes_to_save.add(seq_to_save, 4) + bytes_to_save += bytes("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF") + bytes_to_save.add(self.crc32_ota_seq(seq_to_save), 4) + + #- erase flash area and write -# + flash.erase(offset_to_save, 0x1000) + flash.write(offset_to_save, bytes_to_save) + end + + # Produce a human-readable representation of the object with relevant information + def tostring() + import string + return string.format("", + self.active_otadata, self.seq0, self.seq1, self.maxota) + end +end +partition.Partition_otadata = Partition_otadata #------------------------------------------------------------- - Class for a partition table entry -------------------------------------------------------------# -#class Partition -# var raw #- raw bytes of the partition table in flash -# -# var md5 #- md5 hash of partition list -# -# var slots -# var otadata #- instance of Partition_otadata() -# -# -# def init() -# -# # Load partition information from SPI Flash -# def load() -# -# def get_ota_slot(n) -# -# #- compute the highest ota partition -# -# def ota_max() -# -# def load_otadata() -# -# # get the active OTA app partition number -# def get_active() -# -# #- change the active partition -# -# def set_active(n) -# -# #- convert to human readble -# -# def tostring() -# -# #- convert the slots to raw bytes, ready to falsh to parition page -# -# def tobytes() -# -# #- write back to flash -# -# def save() -# -# #- invalidate SPIFFS partition to force format at next boot -# -# #- we simply erase the first byte of the first 2 blocks in the SPIFFS partition -# -# def invalidate_spiffs() -#end +class Partition + var raw #- raw bytes of the partition table in flash -# + var md5 #- md5 hash of partition list -# + var slots + var otadata #- instance of Partition_otadata() -# + + def init() + self.slots = [] + self.load() + self.parse() + self.load_otadata() + end + + # Load partition information from SPI Flash + def load() + import flash + self.raw = flash.read(0x8000,0x1000) + end + + #- parse the raw bytes to a structured list of partition items -# + def parse() + for i:0..94 # there are maximum 95 slots + md5 (0xC00) + var item_raw = self.raw[i*32..(i+1)*32-1] + var magic = item_raw.get(0,2) + if magic == 0x50AA #- partition entry -# + var slot = Partition_info(item_raw) + self.slots.push(slot) + elif magic == 0xEBEB #- MD5 -# + self.md5 = self.raw[i*32+16..i*33-1] + break + else + break + end + end + end + + def get_ota_slot(n) + for slot: self.slots + if slot.is_ota() == n return slot end + end + return nil + end + + #- compute the highest ota partition -# + def ota_max() + var ota_max = 0 + for slot:self.slots + if slot.type == 0 && (slot.subtype >= 0x10 && slot.subtype < 0x20) + var ota_num = slot.subtype - 0x10 + if ota_num > ota_max ota_max = ota_num end + end + end + return ota_max + end + + def load_otadata() + #- look for otadata partition offset, and max_ota -# + var otadata_offset = 0xE000 #- default value -# + var ota_max = self.ota_max() + for slot:self.slots + if slot.type == 1 && slot.subtype == 0 #- otadata -# + otadata_offset = slot.start + end + end + + self.otadata = Partition_otadata(ota_max, otadata_offset) + end + + # get the active OTA app partition number + def get_active() + return self.otadata.active_otadata + end + + #- change the active partition -# + def set_active(n) + if n < 0 || n > self.ota_max() raise "value_error", "Invalid ota partition number" end + self.otadata.set_ota_max(self.ota_max()) #- update ota_max if it changed -# + self.otadata.set_active(n) + end + + #- convert to human readble -# + def tostring() + var ret = " 95 raise "value_error", "Too many partiition slots" end + var b = bytes() + for slot: self.slots + b += slot.tobytes() + end + #- compute MD5 -# + var md5 = MD5() + md5.update(b) + #- add the last segment -# + b += bytes("EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF") + b += md5.finish() + #- complete -# + return b + end + + #- write back to flash -# + def save() + import flash + var b = self.tobytes() + #- erase flash area and write -# + flash.erase(0x8000, 0x1000) + flash.write(0x8000, b) + self.otadata.save() + end + + #- invalidate SPIFFS partition to force format at next boot -# + #- we simply erase the first byte of the first 2 blocks in the SPIFFS partition -# + def invalidate_spiffs() + import flash + #- we expect the SPIFFS partition to be the last one -# + var spiffs = self.slots[-1] + if !spiffs.is_spiffs() raise 'value_error', 'No SPIFFS partition found' end + + var b = bytes("00") #- flash memory: we can turn bits from '1' to '0' -# + flash.write(spiffs.start , b) #- block #0 -# + flash.write(spiffs.start + 0x1000, b) #- block #1 -# + end +end +partition.Partition = Partition ################################################################################# # Partition_manager_UI @@ -159,7 +511,7 @@ class Partition_manager_UI def web_add_button() import webserver webserver.content_send( - "

") + "

") end #- ---------------------------------------------------------------------- -# diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.be b/tasmota/berry/modules/partition_wizard.be similarity index 99% rename from tasmota/berry/modules/Partition_Wizard/partition_wizard.be rename to tasmota/berry/modules/partition_wizard.be index c73814e01..445a7a345 100644 --- a/tasmota/berry/modules/Partition_Wizard/partition_wizard.be +++ b/tasmota/berry/modules/partition_wizard.be @@ -4,6 +4,7 @@ # use : `import partition_wizard` # # Provides low-level objects and a Web UI +# rm Partition_Wizard.tapp; zip Partition_Wizard.tapp -j -0 Partition_Wizard/* ####################################################################### var partition_wizard = module('partition_wizard') @@ -50,7 +51,7 @@ class Partition_wizard_UI def web_add_button() import webserver webserver.content_send( - "
") + "

") end #- ---------------------------------------------------------------------- -# From 8a3e6a88e4e7177faaf8fdd15fe0e1d241834324 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 18:38:43 +0200 Subject: [PATCH 231/376] Quick Solo1 safeboot fix --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 4a69368c9..67019f589 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -46,6 +46,6 @@ build_flags = ${esp32_defaults.build_flags} [core32solo1] platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-solo1-v.2.0.3.zip -platform_packages = +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/836/framework-arduinoespressif32-solo1-heads_v4.4.1-3010c4571f.tar.gz build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From e50199491906794578b119160f0a7e76fc58d44f Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 13 May 2022 19:11:00 +0200 Subject: [PATCH 232/376] Bugfixes removed some errors in RESULT message. Wrong values Limit tilt duration time to 127 steps (6.35sec) and avoid negative numbers --- tasmota/xdrv_27_shutter.ino | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/tasmota/xdrv_27_shutter.ino b/tasmota/xdrv_27_shutter.ino index e94cf8088..cb8a8a9be 100644 --- a/tasmota/xdrv_27_shutter.ino +++ b/tasmota/xdrv_27_shutter.ino @@ -1,7 +1,7 @@ /* xdrv_27_Shutter[i].ino - Shutter/Blind support for Tasmota - Copyright (C) 2022 Stefan Bode + Copyright (C) 2022 Stefan Bode 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 @@ -126,6 +126,7 @@ struct SHUTTERGLOBAL { #define SHT_DIV_ROUND(__A, __B) (((__A) + (__B)/2) / (__B)) + void ShutterLogPos(uint32_t i) { char stemp2[10]; @@ -175,7 +176,7 @@ void ShutterRtc50mS(void) if (Shutter[i].accelerator) { //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Accelerator i=%d -> %d"),i, Shutter[i].accelerator); ShutterUpdateVelocity(i); - digitalWrite(Pin(GPIO_PWM1, i), LOW); + digitalWrite(Pin(GPIO_PWM1, i), LOW); #ifdef ESP8266 // Convert frequency into clock cycles uint32_t cc = microsecondsToClockCycles(1000000UL) / Shutter[i].pwm_velocity; @@ -1242,8 +1243,8 @@ void CmndShutterPosition(void) ShutterReportPosition(true, index); } XdrvMailbox.index = index +1; // Fix random index for ShutterClose - if (XdrvMailbox.command) - ResponseCmndIdxNumber((Settings->shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent); + strcpy( XdrvMailbox.command , D_CMND_SHUTTER_POSITION); + ResponseCmndIdxNumber((Settings->shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent); } else { ShutterReportPosition(true, MAX_SHUTTERS); if (XdrvMailbox.command) @@ -1632,7 +1633,6 @@ void CmndShutterSetTilt(void) } XdrvMailbox.data[0] = '\0'; AddLog(LOG_LEVEL_INFO, PSTR("SHT: TiltTarget %d, payload %d"), Shutter[XdrvMailbox.index -1].tilt_target_pos,XdrvMailbox.payload); - ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos); Shutter[XdrvMailbox.index -1].tiltmoving = 1; CmndShutterPosition(); } @@ -1649,27 +1649,26 @@ void CmndShutterTiltConfig(void) 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); } + // avoid negative runtime + Settings->shutter_tilt_config[2][XdrvMailbox.index -1] = Shutter[XdrvMailbox.index -1].tilt_config[2] = Shutter[XdrvMailbox.index -1].tilt_config[2] >= 0 ? Shutter[XdrvMailbox.index -1].tilt_config[2] : 127; ShutterInit(); - ResponseCmndIdxChar(XdrvMailbox.data); - } else { - char setting_chr[30] = "0"; - snprintf_P(setting_chr, sizeof(setting_chr), PSTR("%d %d %d %d %d"), 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]); + char setting_chr[30] = "0"; + snprintf_P(setting_chr, sizeof(setting_chr), PSTR("%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]); } } void CmndShutterTiltIncDec(void) { //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Change in: payload %s (%d), payload %d, idx %d, src %d"), XdrvMailbox.data , XdrvMailbox.data_len, XdrvMailbox.payload , XdrvMailbox.index, TasmotaGlobal.last_source ); - if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present)) { - if (XdrvMailbox.data_len > 0) { - XdrvMailbox.payload = Shutter[XdrvMailbox.index -1].tilt_target_pos+XdrvMailbox.payload; - CmndShutterSetTilt(); - } + if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= TasmotaGlobal.shutters_present) && XdrvMailbox.data_len > 0) { + XdrvMailbox.payload = Shutter[XdrvMailbox.index -1].tilt_target_pos+XdrvMailbox.payload; + CmndShutterSetTilt(); + } else { + ResponseCmndIdxNumber(XdrvMailbox.payload); } - ResponseCmndNumber(Shutter[XdrvMailbox.index -1].tilt_target_pos); } /*********************************************************************************************\ From d07598277afc5f2cf0001db7386378ed723f5cdf Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 21:30:48 +0200 Subject: [PATCH 233/376] fixed solo1 framework --- platformio_tasmota32.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 67019f589..4a69368c9 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -46,6 +46,6 @@ build_flags = ${esp32_defaults.build_flags} [core32solo1] platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-solo1-v.2.0.3.zip -platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/836/framework-arduinoespressif32-solo1-heads_v4.4.1-3010c4571f.tar.gz +platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 63f45d1a1ea117fcb8b2694ede29dd12b9bcf5d0 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 13 May 2022 21:53:48 +0200 Subject: [PATCH 234/376] Delete Partition_wizard.tapp --- tasmota/berry/modules/Partition_wizard.tapp | Bin 16175 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tasmota/berry/modules/Partition_wizard.tapp diff --git a/tasmota/berry/modules/Partition_wizard.tapp b/tasmota/berry/modules/Partition_wizard.tapp deleted file mode 100644 index f98760d4f0ca96332dc7a63395eea7115ef709b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16175 zcmcIr-)|e)bv_&pheL8mjwo8DWm>+`QkK?{En3!Y9j`2V9eb0_YS+q|#(Gf|6h)3C z))Yx_Mr%1C8Wl(pJqWEI477bq0Rs(?v@nW3=%HwVzVxB!V_*7D^tC{dRljp*h8$6( zchR&m=(%&}&i#3Qe&@{ECt)>C{P)%4Uzh&rXy-FB!j-4 zc$mvNk9CZ34=_HN=9#6M<21PYgPFn&%Ek zdreCGHL0oB;jqcm?S?4hU~;RZs|RY-t&4=SM;hgyf=aqklu5~UbzEa!okkP;aomH{ zWE%tJWH^7w?Ng+*`B}<)mJZ>4J&$e4cFjO}EKuh6Gv52-DD!xj>;coL8KdXcrfqe; zvO1wFRQJNWuB+%j#YhDZg=Wm)f?8fRV!DjRm-;Ves7P>Bvo5Y$7(ud z+rb9nNP5qNOU7oV-^6Ox(C$UUGNZIpvCEatwyDzdO5HJyQ?1N8Ew@)bt#5ZK%t)f$ zY4OnFdA-pPawJi2iuZ(VVfdQ8yxCd#w6a~Vin=X!z-?9&Ynm4gtMZj4YSvfvswFCo zR?`w&t&X@UcI(YO$Fi?4FSJ*%bbk$-dydm;nhCo9q*QwJS^3isKmN?DVk#IDv%WL? zyk2v5Zr@xiw)a1nU0L4r>#MCst8@FEt@qxaUHPKY;n8m|FKn)eN|onti%qN1dM>J! zrr7M%tIx!X)?UY(m^+E{Wbd?|m#cf74(}#Yqm&^wrYE0tEW7>_tGs37WMsvz+#Rdz zw8~o;rqy|2j`b)0*@r)P`02yXO2LhFT5Tp-I!|6_yOsU&R-3nNj)+-|K?Y8mS)g1Z)vlNX9dspPGrG~Ihj6A#w)^bcR5O;@Mo zr`$%xSUSybP`0>E%6vB=u2W)KdxI@J$lyP4g;TM2TTTUhxohq6kw!=!5ZGj^-mIB% z_qN=zDh=}@ZCj3afHe!xU9AJA05$YkTg7o#YN0Sj2tiR1|0o2BP3Zl3r|wv0m>R8Z zyaDdmtvKdQda|~9TU2){&25mfkW&D;`a_7VPHR^b_lt{9h0{V|1|?A6^G>VRnkhcvNT-g~bp9w3D?nY%V{@5Mm)1|hw@WGYmO=4CH%fD8m+vZx zd|{fV_Vs8UZ3}dgc9}F56-Syfhx_YbTG5Sr_mrAPU&S@jMfW5dBwYmSUzb@%{f$*;xmDK9-#|HJ{W$?%A^8fw!Kb{R(u*_xYM=k{r|57Cu;2X5Oe%I8p4Bg;q0=!2sPT762nwRM^-t)EXmJ*52l zx{=(#m|LX_#SMe9wRJKdbV*(AW-vxBSwR1VE_4d!TsXP_a?2zk`;{WbT*8>Q4w)^~ z$Q=4F9!+8_$}FSL{yIp<8q~S&UxP$1vMyAzzkyVFlV^)faV@z-B3H=JB=+(`NrUC4 zrE;&vlLGx04#5U=622l?gUtN88W9+4?&y-w3aKSsvS|F4PI2g?_#DO)m{aa(iUjN4 z?&VMpV+rWpTvx$3{7iVyxcnWj3}QK$#(yBnAy#6PAYEz|D5w;%Y4erE;zm{s7;vA_ z@>bny)NIRHS!VOGS%bZ_a;3Rxw?Fv4YvqW(mE+d4$+W!Sw{D}1pHtavSSw&7yU}uN zD5<*5gF+Re;9EXX+G{>*ww^aJF;XB0>&QOmoqk7l`Atg|Kr`b?Qe{O?L)gtqrTm| zGux?e?>Mt7n7{bszF1yxpL)AHH)Fr+RxO}+Y+R!P^AiV({j%G2EYB?XlYjeye>7r# zTi<$afqB4=g#lWIx#1f1*g-z2J=g|~R<(kCEk84BgCmYSjoFne4d;Wcj%8ihc0Twv z`xKZ9)bD~vR~hMvcyv^5RA8Aq<|4Zvr5$(^p7Q`|v4yi^37n2y*|L}rq=E0gApM98 zI_=ZEOTFMEq8QbfM67oCMxZ!CW+xQ7&M$@f&M)lfwXkZy)=lkmnKXEoWNg5OhDtTM zu(ct3Q~Qdly$OeXdmFYlJkkiOb=cZk)b#?RvD~2+&lLzVK#yo|Vvq|^(TDL^0dj0^ zo%CEc5zgT~S8f<6!(Q*wZ^mDTLhLYQA)pN?+mu79c7Ve?RHMdWBx>UDGdO$` z_LF*`MNOgNJ{mEPbZNIiiD+h*pT%(Kns?|ixc)xu0HwaF={do|KOXZA6$*|O4pDwJ z8qbRm?72h&u!F3>RML_n8=`4PON%VA9hTD$qK250XyFO(ih-k1N!IAOnrcw&S(OkhJb8TnzIfF zrU`)xGFiAG#k>vl$fGVWeviQ9`3#d1!|Fzyv#QV-_v4{hafC z6Z|)vFo|3##6Bg?#8ZF&yMvd*yw#O`>%$QXh%0nK_8fn0LR2c@%sm#BX*O{+h)pu# zg-nzHJLqAUKNJ`6fLyV5j`ABSi!_+OQ6mS=o7@kP3e#9U_)nN{5i;=1kR}|4IM8?# zJU=}k!aO%Xp@-iCDW2ASa%Q8qYxI*5s|9_X=RQ4}0vMAEfu3MwN}5pyXf61RX^!O# z)12zj9G*M=yFT4X2U_wdQ<`g4nJxg~qEAwUkEFms6l?H)#KKI4K9-y1c`!lrD3&dp z17Z~PX1J`uA&v4;>d?IVA#sX!aLB0A|psYpbp;ecj zQVIx@35#Bz$2#2i#{=yWUKv~T7HoHjq2-?6fX)8!Z8keJ9V0p)J(g0tvhN$FXD#-= zkX~go>dV%i1U{{O*u1cGVMJ{KP!{$J*ay2}^Mz~0US|;ZW5X1^=?|C(Xt&E zBb~+k08n|L>YZ5`pkVA~R_t2NPOEljwvEQK0+=m8*S*c%x&vF;a`rk+?v^ctxoK(E zNg(;b!_|kShjK>#pslSl6XZ!(D=+{>MR*3m_33v3|C&#DdD2I5fn(9E?81nbsH#0H zsz6rlJG0)i&5l)@T^Za(*pL!)MmM}P*&DQ^-|rcF5@>or^84m$M)ILMF03w&WIQvo z{mKBu>sj5vnE@qxu&=rDtq%SzC;sV>gT_|cJBTej8{E-vanhgAa=qE!a|AnOcV?S= zyPH-Ar(B2c^ZpVFm3=r%wOPR?rd#Fiy|<=W@l~a<#|~8;=k(*=ex5of9406l+wcuX zHSCO}OzIo+i-F>BNfu5kGMFeKH$;b2Rho28C}QTLFy#~}+1P~BA+<8cYRo)R;*%uJ zH<)(OfaHUjxCX@q#RR+@WmZhU*f(Ii!yiCoDUpRg0LhqPY#G?Pngv!f;Q-u#&)~L+ zqYdiz^*~)@VuB+4PHy5D?{$+2C`Q%A3{qT%AMh_URf4-AREGYbD9ONcR+Ljy6cyT= zF~;n1pGk|H3X@SMu|cT<+K8@xWtw#KpA8A%EfUYr^^_=RUOQQrDj2fu)oGd-6SBPz z|D6Zskpt#Iss~A?ZW$LY-GZi?>q@v1FyLfZK%xVpgfzZ5RyaI4L98GnajX6Oxc25! zqHuI^Y#x!dLU#&f#&#I5qKtZQ8K>H}W>C%&Fz?D<1Fnqc^Oc``zIw)6xZ-*X&6e2k z+ieImoM*_KUuOpbwyx_s1kJC-w>U?xh#vPqb-!coSGeFzwNXc?2pV_O0!j}IpP}m{ z{|`CEGLMmpBsDGPd8_lx#oyr&vB$-P9}<5RP{obadMw|6fW2reDC~azULTMYU)@A+#Z9qB54-Z3SvaR zN`&0F7peI!8=f4?QYinMIIfhsa;%RRj*Q6sQF6dSh%;|!pl7&b?81RD-hda^qWQ^} zX%EkZtG7leJWov?>+s!87`hxkV}E{(ts33scQwG

!T=n8KX7U-W0>^OyMEn|~%S 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 MLchkfxx#n<1GPsQyZ`_I From 1e55a9ba50264c127a53765022083720366595dd Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 13 May 2022 22:28:17 +0200 Subject: [PATCH 235/376] OpenHASP support for dropdown attributes --- .../berry_mapping/src/be_class_wrapper.c | 1 + .../berry_tasmota/src/be_lv_openhasp.c | 386 +++++++++++++++++- tasmota/berry/openhasp/openhasp.tapp | Bin 58548 -> 60625 bytes tasmota/berry/openhasp/openhasp_demo.tapp | Bin 189354 -> 191431 bytes tasmota/berry/openhasp_src/openhasp.tapp | Bin 58548 -> 60625 bytes .../openhasp_src/openhasp_core/openhasp.be | 72 +++- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 189354 -> 191431 bytes 7 files changed, 457 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_mapping/src/be_class_wrapper.c b/lib/libesp32/berry_mapping/src/be_class_wrapper.c index 2591477ce..a1f6502bb 100644 --- a/lib/libesp32/berry_mapping/src/be_class_wrapper.c +++ b/lib/libesp32/berry_mapping/src/be_class_wrapper.c @@ -222,6 +222,7 @@ intptr_t be_convert_single_elt(bvm *vm, int idx, const char * arg_type, int *buf type_ok = (arg_type[0] == '.'); // any type is accepted type_ok = type_ok || (arg_type[0] == provided_type && arg_type[1] == 0); // or type is a match (single char only) type_ok = type_ok || (ret == 0 && arg_type_len != 1); // or NULL is accepted for an instance + type_ok = type_ok || (ret == 0 && arg_type[0] == 's' && arg_type[1] == 0); // accept nil for string, can be dangerous if (!type_ok) { be_raisef(vm, "type_error", "Unexpected argument type '%c', expected '%s'", provided_type, arg_type); diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index 07b0d04a3..9c1241a03 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -5144,6 +5144,372 @@ void be_load_lvh_textarea_class(bvm *vm) { be_pop(vm, 1); } +/******************************************************************** +** Solidified function: get_val +********************************************************************/ +be_local_closure(lvh_dropdown_get_val, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_selected"), + }), + be_str_literal("get_val"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_direction +********************************************************************/ +be_local_closure(lvh_dropdown_set_direction, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_dir"), + /* K2 */ be_nested_str_literal("_dir"), + }), + be_str_literal("set_direction"), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x60100009, // 0002 GETGBL R4 G9 + 0x5C140200, // 0003 MOVE R5 R1 + 0x7C100200, // 0004 CALL R4 1 + 0x88140102, // 0005 GETMBR R5 R0 K2 + 0x94100A04, // 0006 GETIDX R4 R5 R4 + 0x7C080400, // 0007 CALL R2 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_options +********************************************************************/ +be_local_closure(lvh_dropdown_set_options, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_options"), + /* K2 */ be_nested_str_literal("lv"), + /* K3 */ be_nested_str_literal("ROLLER_MODE_NORMAL"), + }), + be_str_literal("set_options"), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0xB8160400, // 0003 GETNGBL R5 K2 + 0x88140B03, // 0004 GETMBR R5 R5 K3 + 0x7C080600, // 0005 CALL R2 3 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_val +********************************************************************/ +be_local_closure(lvh_dropdown_set_val, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_selected"), + /* K2 */ be_const_int(0), + }), + be_str_literal("set_val"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x58140002, // 0003 LDCONST R5 K2 + 0x7C080600, // 0004 CALL R2 3 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_text +********************************************************************/ +be_local_closure(lvh_dropdown_get_text, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_text"), + /* K2 */ be_nested_str_literal("resize"), + /* K3 */ be_nested_str_literal("get_selected_str"), + /* K4 */ be_nested_str_literal("_buffer"), + /* K5 */ be_nested_str_literal("remove_trailing_zeroes"), + /* K6 */ be_nested_str_literal("asstring"), + }), + be_str_literal("get_text"), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0012, // 0005 JMPF R2 #0019 + 0x60080015, // 0006 GETGBL R2 G21 + 0x7C080000, // 0007 CALL R2 0 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x541200FF, // 0009 LDINT R4 256 + 0x7C080400, // 000A CALL R2 2 + 0x880C0100, // 000B GETMBR R3 R0 K0 + 0x8C0C0703, // 000C GETMET R3 R3 K3 + 0x8C140504, // 000D GETMET R5 R2 K4 + 0x7C140200, // 000E CALL R5 1 + 0x541A00FF, // 000F LDINT R6 256 + 0x7C0C0600, // 0010 CALL R3 3 + 0x8C0C0105, // 0011 GETMET R3 R0 K5 + 0x5C140400, // 0012 MOVE R5 R2 + 0x7C0C0400, // 0013 CALL R3 2 + 0x5C080600, // 0014 MOVE R2 R3 + 0x8C0C0506, // 0015 GETMET R3 R2 K6 + 0x7C0C0200, // 0016 CALL R3 1 + 0x80040600, // 0017 RET 1 R3 + 0x70020000, // 0018 JMP #001A + 0x80040200, // 0019 RET 1 R1 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_direction +********************************************************************/ +be_local_closure(lvh_dropdown_get_direction, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_dir"), + /* K2 */ be_nested_str_literal("_dir"), + /* K3 */ be_nested_str_literal("stop_iteration"), + }), + be_str_literal("get_direction"), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x60080010, // 0003 GETGBL R2 G16 + 0x880C0102, // 0004 GETMBR R3 R0 K2 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020008, // 0006 EXBLK 0 #0010 + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x88100102, // 0009 GETMBR R4 R0 K2 + 0x94100803, // 000A GETIDX R4 R4 R3 + 0x1C100204, // 000B EQ R4 R1 R4 + 0x78120001, // 000C JMPF R4 #000F + 0xA8040001, // 000D EXBLK 1 1 + 0x80040600, // 000E RET 1 R3 + 0x7001FFF6, // 000F JMP #0007 + 0x58080003, // 0010 LDCONST R2 K3 + 0xAC080200, // 0011 CATCH R2 1 0 + 0xB0080000, // 0012 RAISE 2 R0 R0 + 0x5409FFFE, // 0013 LDINT R2 -1 + 0x80040400, // 0014 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_show_selected +********************************************************************/ +be_local_closure(lvh_dropdown_set_show_selected, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_text"), + }), + be_str_literal("set_show_selected"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x78060003, // 0000 JMPF R1 #0005 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x4C100000, // 0003 LDNIL R4 + 0x7C080400, // 0004 CALL R2 2 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_text +********************************************************************/ +be_local_closure(lvh_dropdown_set_text, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("set_text"), + }), + be_str_literal("set_text"), + &be_const_str_solidified, + ( &(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 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_options +********************************************************************/ +be_local_closure(lvh_dropdown_get_options, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_options"), + }), + be_str_literal("get_options"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_show_selected +********************************************************************/ +be_local_closure(lvh_dropdown_get_show_selected, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("_lv_obj"), + /* K1 */ be_nested_str_literal("get_text"), + }), + be_str_literal("get_show_selected"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: lvh_dropdown ********************************************************************/ @@ -5151,9 +5517,27 @@ extern const bclass be_class_lvh_obj; be_local_class(lvh_dropdown, 0, &be_class_lvh_obj, - be_nested_map(1, + be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_literal("get_show_selected", 8), be_const_closure(lvh_dropdown_get_show_selected_closure) }, + { be_const_key_literal("set_direction", -1), be_const_closure(lvh_dropdown_set_direction_closure) }, + { be_const_key_literal("set_options", -1), be_const_closure(lvh_dropdown_set_options_closure) }, + { be_const_key_literal("set_val", 4), be_const_closure(lvh_dropdown_set_val_closure) }, + { be_const_key_literal("get_text", -1), be_const_closure(lvh_dropdown_get_text_closure) }, + { be_const_key_literal("get_direction", 9), be_const_closure(lvh_dropdown_get_direction_closure) }, { be_const_key_literal("_lv_class", -1), be_const_class(be_class_lv_dropdown) }, + { be_const_key_literal("set_show_selected", 6), be_const_closure(lvh_dropdown_set_show_selected_closure) }, + { be_const_key_literal("set_text", -1), be_const_closure(lvh_dropdown_set_text_closure) }, + { be_const_key_literal("_dir", -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + be_const_list( * be_nested_list(4, + ( (struct bvalue*) &(const bvalue[]) { + be_const_int(8), + be_const_int(4), + be_const_int(1), + be_const_int(2), + })) ) } )) }, + { be_const_key_literal("get_options", -1), be_const_closure(lvh_dropdown_get_options_closure) }, + { be_const_key_literal("get_val", 0), be_const_closure(lvh_dropdown_get_val_closure) }, })), be_str_literal("lvh_dropdown") ); diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/openhasp/openhasp.tapp index e7f8e8ae139be04b415d98ca584fff71cf35a0e9..e5f536b07d2b07718300077c800f16a2214efa9e 100644 GIT binary patch delta 1196 zcmah}&1(}u6i-^ITEC!3v0&lZDorE?tCw0WqG&&$l3G(mLP&PAv&ramC+^NB)Z!JS$=Zz2xFS@L2I8UVG5iQ~v_r%qFQp!G&brypP}e?eD$h-RJK0Z{2Us zhfkK@zDjO~z8-kF849V-zR=MSFA}Fax1lC4Y+PJ(kOh7B4$GF}2z!-#-|rw4A*Fo-hQ>LB^skOh5`) zDSl;UK65#dOeU_yTGwP^u5Hg=olLeb^D|S^Nl3#moW^q1C)SYm0|FR$Ov*@D8mDz#Yej=>J^!>L@X#53_(i71yLYSGMG;g z2(YW~5y(1}WkGNS0j80=tFtr$x3%pNMsfmic1qD@$L062{XHr%B4n2K%NG}SPnHa~ zNh07ifv}jGVWkW=@5J*>zLBVAK<&=t2|zL!k=fdid{{dtS1ufqpK2p=s}_}gD@SD4 z$HSFCa}BRSh-2ZYzVR3a90jta+yRFWONo->4!*pnT(-*>A%VLwed)#=IR2uE0Wcg3 zW^Yc-j(CV*5hR5)+c*&skZleL{x>DLKGt8s>PYbBXr-uw8b#9zCt$0ZC@prH1U-~| z=)-~kC7VJFl5Fk*9dDx}sCrOKU8zeeC^_CzG_67|5x(mHZ8mR_Xa`P>Hi_YZJ5}K2 z459}!kC>dZC{QJ2TR6kAsFGOcbB8U#A~785_7S)zK49Shet_$jJ@e7!J` z?kwGr_mB1Ym&_VC$ZpCO>8Q{v8kNsov;Jh|OSrza`XP0&^B+j&H;#814f%BASkJ(( H5I(;FCd!wX delta 130 zcmcb3lX=TY<_*@2TIvaFL*Dvt`qTD^fdPcM8Dtpp3sUnk5{nD;l2SuMI2o9;bn23F zbT+3lHaAYLYhJi{Ys+e;$t#LNH^1q-#K@6SlwXjNU!FI)VS>tJoeqx8YbKnE=0i1i Va?2YPrYxPwtKKNG{dvp)1OTbYHjMxP diff --git a/tasmota/berry/openhasp/openhasp_demo.tapp b/tasmota/berry/openhasp/openhasp_demo.tapp index 79b11f4845a1087c13a22d3ae507569111511d73..eb402a46a883d309cd765a563b8581f20e97ff0e 100644 GIT binary patch delta 1273 zcma)6O=uHA6i(*Q*3=(7Snwde8lefqU@H_U#Bs$bb_qR-Qzkd59x>J)cHponW;BbriFFovhY zY>|Q+X!(4#C}P;rVm1U!7-d?2Qzdtz)wsS2_Eab%0NNT#yDT1*9J;|Qs1&JSW#)q@ zGAL6gWQYdXIt&=(UGC&TcnShcT6m(fG=gVqJ75kg2*l}>qRURpXY=HAzsgLAqfRTMK0IKO*u41 z&dFCbG9nLZBv}RUnFxIs%rp%G;d6Jj*_k;(<8kejE@(X)b1gj8FCKBg_2J{V=Yq?a zr8q2jE^-wpm+gCNkSQ^D`tH&KxZ#?K0ibiP1+&Xjvm*gQw6@X)LNaut|J|%ypC=cp zSe|H*gw_go6{k4`)Re4E12X8Ap zrTihYIOG5u5x=YGU;u1X-TF*(j?h>V-KYx%&B=Q@o#-(lm delta 126 zcmX?poqN@B?uIRlf`9qc6V`^j_22ZT?GXb*+oS37e;LKtvUKW_a&)#^|7C1$oE}oo zv~YWO1Ji1z>2-Nbq1z92Fk%y=GEj T%F>y>;5CyX+ok(V3=9kaofZ!JS$=Zz2xFS@L2I8UVG5iQ~v_r%qFQp!G&brypP}e?eD$h-RJK0Z{2Us zhfkK@zDjO~z8-kF849V-zR=MSFA}Fax1lC4Y+PJ(kOh7B4$GF}2z!-#-|rw4A*Fo-hQ>LB^skOh5`) zDSl;UK65#dOeU_yTGwP^u5Hg=olLeb^D|S^Nl3#moW^q1C)SYm0|FR$Ov*@D8mDz#Yej=>J^!>L@X#53_(i71yLYSGMG;g z2(YW~5y(1}WkGNS0j80=tFtr$x3%pNMsfmic1qD@$L062{XHr%B4n2K%NG}SPnHa~ zNh07ifv}jGVWkW=@5J*>zLBVAK<&=t2|zL!k=fdid{{dtS1ufqpK2p=s}_}gD@SD4 z$HSFCa}BRSh-2ZYzVR3a90jta+yRFWONo->4!*pnT(-*>A%VLwed)#=IR2uE0Wcg3 zW^Yc-j(CV*5hR5)+c*&skZleL{x>DLKGt8s>PYbBXr-uw8b#9zCt$0ZC@prH1U-~| z=)-~kC7VJFl5Fk*9dDx}sCrOKU8zeeC^_CzG_67|5x(mHZ8mR_Xa`P>Hi_YZJ5}K2 z459}!kC>dZC{QJ2TR6kAsFGOcbB8U#A~785_7S)zK49Shet_$jJ@e7!J` z?kwGr_mB1Ym&_VC$ZpCO>8Q{v8kNsov;Jh|OSrza`XP0&^B+j&H;#814f%BASkJ(( H5I(;FCd!wX delta 130 zcmcb3lX=TY<_*@2TIvaFL*Dvt`qTD^fdPcM8Dtpp3sUnk5{nD;l2SuMI2o9;bn23F zbT+3lHaAYLYhJi{Ys+e;$t#LNH^1q-#K@6SlwXjNU!FI)VS>tJoeqx8YbKnE=0i1i Va?2YPrYxPwtKKNG{dvp)1OTbYHjMxP diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be index 3c0e552ff..20c2fceca 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/openhasp_src/openhasp_core/openhasp.be @@ -1022,6 +1022,9 @@ class lvh_qrcode : lvh_obj def get_qr_text() end end +#==================================================================== +# slider +#==================================================================== class lvh_slider : lvh_obj static _lv_class = lv.slider @@ -1030,6 +1033,9 @@ class lvh_slider : lvh_obj end end +#==================================================================== +# roller +#==================================================================== class lvh_roller : lvh_obj static _lv_class = lv.roller @@ -1059,6 +1065,71 @@ class lvh_roller : lvh_obj end end +#==================================================================== +# dropdown +#==================================================================== +class lvh_dropdown : lvh_obj + static _lv_class = lv.dropdown + static _dir = [ lv.DIR_BOTTOM, lv.DIR_TOP, lv.DIR_LEFT, lv.DIR_RIGHT ] # 0 = down, 1 = up, 2 = left, 3 = right + + def set_val(t) + self._lv_obj.set_selected(t, 0) # add second parameter - no animation + end + def get_val() + return self._lv_obj.get_selected() + end + + def set_options(t) + self._lv_obj.set_options(t, lv.ROLLER_MODE_NORMAL) + end + def get_options() + return self._lv_obj.get_options() + end + + def set_text(t) + # set_text sets a static text displayed whatever the value + # use `nil` to set back the text of the selected value + self._lv_obj.set_text(t) + end + def get_text() + var static_text = self._lv_obj.get_text() + if static_text == nil + # allocate a bytes buffer + var b = bytes().resize(256) # force 256 bytes + self._lv_obj.get_selected_str(b._buffer(), 256) + b = self.remove_trailing_zeroes(b) + return b.asstring() + else + return static_text + end + end + + # direction needs a conversion from OpenHASP numbers and LVGL's + def set_direction(t) + # 0 = down, 1 = up, 2 = left, 3 = right + self._lv_obj.set_dir(self._dir[int(t)]) + end + def get_direction() + var dir = self._lv_obj.get_dir() + for i:self._dir + if dir == self._dir[i] return i end + end + return -1 + end + + # show_selected (bool) is a OpenHASP addition + # only meaningful if set to `true`, setting to false requires a call to `set_text` + def set_show_selected(t) + if t + self._lv_obj.set_text(nil) # undo static text + end + end + def get_show_selected() + var static_text = self._lv_obj.get_text() + return (static_text == nil) + end +end + ################################################################################# # # All other subclasses than just map the LVGL object @@ -1069,7 +1140,6 @@ class lvh_bar : lvh_obj static _lv_class = lv.bar end class lvh_btn : lvh_obj static _lv_class = lv.btn end class lvh_btnmatrix : lvh_obj static _lv_class = lv.btnmatrix end class lvh_checkbox : lvh_obj static _lv_class = lv.checkbox end -class lvh_dropdown : lvh_obj static _lv_class = lv.dropdown end class lvh_line : lvh_obj static _lv_class = lv.line end class lvh_textarea : lvh_obj static _lv_class = lv.textarea end # special case for scr (which is actually lv_obj) diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/openhasp_src/openhasp_demo.tapp index 79b11f4845a1087c13a22d3ae507569111511d73..eb402a46a883d309cd765a563b8581f20e97ff0e 100644 GIT binary patch delta 1273 zcma)6O=uHA6i(*Q*3=(7Snwde8lefqU@H_U#Bs$bb_qR-Qzkd59x>J)cHponW;BbriFFovhY zY>|Q+X!(4#C}P;rVm1U!7-d?2Qzdtz)wsS2_Eab%0NNT#yDT1*9J;|Qs1&JSW#)q@ zGAL6gWQYdXIt&=(UGC&TcnShcT6m(fG=gVqJ75kg2*l}>qRURpXY=HAzsgLAqfRTMK0IKO*u41 z&dFCbG9nLZBv}RUnFxIs%rp%G;d6Jj*_k;(<8kejE@(X)b1gj8FCKBg_2J{V=Yq?a zr8q2jE^-wpm+gCNkSQ^D`tH&KxZ#?K0ibiP1+&Xjvm*gQw6@X)LNaut|J|%ypC=cp zSe|H*gw_go6{k4`)Re4E12X8Ap zrTihYIOG5u5x=YGU;u1X-TF*(j?h>V-KYx%&B=Q@o#-(lm delta 126 zcmX?poqN@B?uIRlf`9qc6V`^j_22ZT?GXb*+oS37e;LKtvUKW_a&)#^|7C1$oE}oo zv~YWO1Ji1z>2-Nbq1z92Fk%y=GEj T%F>y>;5CyX+ok(V3=9kaof Date: Fri, 13 May 2022 22:39:51 +0200 Subject: [PATCH 236/376] OpenHASP fix dropdown direction --- .../berry_tasmota/src/be_lv_openhasp.c | 42 +++++++++--------- tasmota/berry/openhasp/openhasp.tapp | Bin 60625 -> 60662 bytes tasmota/berry/openhasp/openhasp_demo.tapp | Bin 191431 -> 191468 bytes tasmota/berry/openhasp_src/openhasp.tapp | Bin 60625 -> 60662 bytes .../openhasp_src/openhasp_core/openhasp.be | 4 +- tasmota/berry/openhasp_src/openhasp_demo.tapp | Bin 191431 -> 191468 bytes 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c index 9c1241a03..1f82d2643 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c @@ -5349,36 +5349,34 @@ be_local_closure(lvh_dropdown_get_direction, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_literal("_lv_obj"), /* K1 */ be_nested_str_literal("get_dir"), - /* K2 */ be_nested_str_literal("_dir"), - /* K3 */ be_nested_str_literal("stop_iteration"), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_literal("_dir"), + /* K4 */ be_const_int(1), }), be_str_literal("get_direction"), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x8C040301, // 0001 GETMET R1 R1 K1 0x7C040200, // 0002 CALL R1 1 - 0x60080010, // 0003 GETGBL R2 G16 - 0x880C0102, // 0004 GETMBR R3 R0 K2 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020008, // 0006 EXBLK 0 #0010 - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x88100102, // 0009 GETMBR R4 R0 K2 - 0x94100803, // 000A GETIDX R4 R4 R3 - 0x1C100204, // 000B EQ R4 R1 R4 - 0x78120001, // 000C JMPF R4 #000F - 0xA8040001, // 000D EXBLK 1 1 - 0x80040600, // 000E RET 1 R3 - 0x7001FFF6, // 000F JMP #0007 - 0x58080003, // 0010 LDCONST R2 K3 - 0xAC080200, // 0011 CATCH R2 1 0 - 0xB0080000, // 0012 RAISE 2 R0 R0 - 0x5409FFFE, // 0013 LDINT R2 -1 - 0x80040400, // 0014 RET 1 R2 + 0x58080002, // 0003 LDCONST R2 K2 + 0x600C000C, // 0004 GETGBL R3 G12 + 0x88100103, // 0005 GETMBR R4 R0 K3 + 0x7C0C0200, // 0006 CALL R3 1 + 0x140C0403, // 0007 LT R3 R2 R3 + 0x780E0006, // 0008 JMPF R3 #0010 + 0x880C0103, // 0009 GETMBR R3 R0 K3 + 0x940C0602, // 000A GETIDX R3 R3 R2 + 0x1C0C0203, // 000B EQ R3 R1 R3 + 0x780E0000, // 000C JMPF R3 #000E + 0x80040400, // 000D RET 1 R2 + 0x00080504, // 000E ADD R2 R2 K4 + 0x7001FFF3, // 000F JMP #0004 + 0x540DFFFE, // 0010 LDINT R3 -1 + 0x80040600, // 0011 RET 1 R3 }) ) ); diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/openhasp/openhasp.tapp index e5f536b07d2b07718300077c800f16a2214efa9e..f14e884386fa460d2319108f8e0d3608ff76d483 100644 GIT binary patch delta 125 zcmcb3llj|C<_*@2TJBrchJ0|?{^!Ii1_lu3W{_dXFG$VHNGvYUOG*t5;bdSwcAzfl z#DUGJj1}FJ-$_gIWmctX6sP8->BXmH7HLj?(_=JQUq*EDzwPXsb$dPIc~Q)q-26tB R>DYnEtKKNG*}Y)^0stRyH3t9y delta 114 zcmex%llkIJ<_*@2TIHM8hJ0eU!n^nt0|N+iGsrOH7o_H8Bo-IwC8dUja569_?yXBo z+PgWGv7(zlEx$-1)2cW%CrvLtC9`NUORv#p=iZ2TUKE2SuXv-%l(={D`8SGel5ZG* F000BXmH7HLj?(_=JQUq*EDzwPXsb$dPIc~Q)q-26tB R>DYnEtKKNG*}Y)^0stRyH3t9y delta 114 zcmex%llkIJ<_*@2TIHM8hJ0eU!n^nt0|N+iGsrOH7o_H8Bo-IwC8dUja569_?yXBo z+PgWGv7(zlEx$-1)2cW%CrvLtC9`NUORv#p=iZ2TUKE2SuXv-%l(={D`8SGel5ZG* F000 Date: Sat, 14 May 2022 11:37:56 +0200 Subject: [PATCH 237/376] Partition Manager rename SPIFFS to filesystem --- tasmota/berry/modules/Partition_Manager.tapp | Bin 17005 -> 17087 bytes .../modules/Partition_Manager/autoexec.be | 1 + .../modules/Partition_Manager/partition.bec | Bin 16636 -> 16636 bytes tasmota/berry/modules/partition.be | 32 +++++++++--------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/tasmota/berry/modules/Partition_Manager.tapp b/tasmota/berry/modules/Partition_Manager.tapp index 013bd556ed34a419418ff93590f13532cc06a35f..282490659078c0c4c69a6d99bed5c0a4ecc6c005 100644 GIT binary patch delta 655 zcmaFc!nnVc(KNuDnT3l11m?!93sGy#`CbcTgD^LP3`1gRNq%ZYYO-EZYG?>21G8mC zeG(8)G}Q`JRw&9<2uLg{$t=mt&x`j>%u7s9Ez&DVEGV#6sLCwBA*Z05rJ!qoDXFhD zF-}Ie3+RRkH{`niI504PFfY&z1u#2+jz|W(LKx@@Al|rKPnuPf!7pE7^F3)1Rz|nU z_Y`F&^D7FnspTaV7g$eLP~6Mt2o%&n2#9W$RyxZBRQggyS(JfIriOtWiz|yu zQgfkBR@4^TJWc+g;2XWL}LyUqtoP%S_V*`ZC2F& z#>K?WFj>~jUR8p@C$YFhp*SbML?N?SArDBo1uK+P7NiR3F?i;cCFW$NC`|4&(_@lg zn7r3)5;P1W%uQGsr%dj($>VZ^J8Lte?LHP>l%z5FjH9X@C?S+qa5FHn{9t4NdKu`; n0B=SnIc7*&!i+}=pb7|B(s*dHzLO|3Fa{^PJ1MZSI)TIiz%09$ delta 647 zcmdnr%J{a0(KNuDnT3l11U%>UhV&oLSJeixL71CCh9R-EBtNwxHCZnyH8g~ifjNpd zJSmPhe4?q=#EsIr2~BH5`q__s`QyOA0K&XL9R-O+C7C6e`FTJs$zVNKGU}3mc;in! zX--K7zkG$@08h8gIx-@xj1H3>6?G>kD2Yz)R9wMm4dls8_EX~7oS^iGiP3$sv#PQr z8?#Oa1BXlv1B*xv6T3(cGp9@sJA+CD$K+~Nbv{lIi&>+CNkoI;Kl9`SRk2VmpwNG2 ztq?924ITzIghrruB4CE_AhCgthKqv?=R+}4FN9k}gNI|Xw3@agKaxrTC>t0~4T6*7 z)eIS3CQno|lUFUa(ND6o(a%XuPt8lQ6JTX1E&+xJkj_a=O3j(PURz=_i@G!;qu*o& z4RfjDg3PqE;`rjss#JA_vc#OyR9kh`Om#bfpvk!!mTaJqatq$PL1PXRqs?SrZG+9t z+TXa?xEVnDCRdx;>&h_rBo>z_6zAlZC}b8ZZ$`2G2a8v6(3fU>*0( z^w?w=Knf=Fn@>WDjb-L0tc(*T-?qtv*%@rRkA)W{Nlcb=QndpmfYJ(X21b@2j10iw r1o}U~n~_P58Ip!DQ-lOi1q3WBOg7 diff --git a/tasmota/berry/modules/Partition_Manager/autoexec.be b/tasmota/berry/modules/Partition_Manager/autoexec.be index 87af9edd9..e934b0715 100644 --- a/tasmota/berry/modules/Partition_Manager/autoexec.be +++ b/tasmota/berry/modules/Partition_Manager/autoexec.be @@ -1,2 +1,3 @@ # start Partition Manager +# rm Partition_Manager.tapp; zip Partition_Manager.tapp -j -0 Partition_Manager/* import partition diff --git a/tasmota/berry/modules/Partition_Manager/partition.bec b/tasmota/berry/modules/Partition_Manager/partition.bec index 5520f9af96c038dffe33ff1cccd8ed584f51a267..30064881a02ce6af29da439b9829443844b18f01 100644 GIT binary patch delta 434 zcmey<$oQv`af6&Rt0;qCzQW{%X2P4Tq#0Qm-6q>8=(4HhB^4J~Pxe<7om{7|g3%Eu zC?gb(+04qar3D7T_Z>kzIGI~w^XDdBfLtTbFtvJ3ovnqA6m7NC{!hp?l z)#orVIWbJ`SJmZEErtfp9#y%`9a=ZInAjO6rUN)Op0FzsKt^fc4 delta 376 zcmey<$oQv`af6&RrzC@4zCv(-r`u*_X%SXNhsm0XGLu6T1Se-J>}9kD@-#MwD?Vak zbf0XcqAbbAtkc23AydP^B2vS|F4DuyDbvHwpc26`xkyEwl@rXGry|eDHF=+k_~eHw z5~{omG7-qC`9NxzH9D9?G#LIf>xFQOXz*}M7E;xg%WV5RD2Yl?AB+Mhu>LK%+BL6u>&Jnd-60Fn|") - webserver.content_send(string.format(" %s%s", + webserver.content_send(string.format(" %s%s ", slot.start / 0x1000, slot.label, active ? " (active)" : "")) webserver.content_send(string.format("

Partition size: %i KB

", slot.size / 1024)) @@ -564,8 +564,8 @@ class Partition_manager_UI def page_show_spiffs(slot, free_mem) import webserver import string - webserver.content_send(string.format("
 %s", - slot.start / 0x1000, slot.label)) + webserver.content_send(string.format("
 filesystem ", + slot.start / 0x1000)) webserver.content_send(string.format("

Partition size: %i KB

", slot.size / 1024)) @@ -578,8 +578,8 @@ class Partition_manager_UI webserver.content_send("

New size: (multiple of 16 KB)

") webserver.content_send("
") - webserver.content_send(string.format("", (slot.size + free_mem) / 1024, ((slot.size + free_mem) / 1024 / 16)*16)) - webserver.content_send("

") + webserver.content_send(string.format("", (slot.size + free_mem) / 1024, ((slot.size + free_mem) / 1024 / 16)*16)) + webserver.content_send("

") webserver.content_send("

") end @@ -624,7 +624,7 @@ class Partition_manager_UI var flash_size_kb = tasmota.memory()['flash'] - webserver.content_send("

Resize app Partitions.
It is highly recommended to set
both partition with the same size.
SPIFFS is adjusted accordinlgy.

") + webserver.content_send("

Resize app Partitions.
It is highly recommended to set
both partition with the same size.
Filesystem is adjusted accordinlgy.

") webserver.content_send("
") @@ -659,13 +659,13 @@ class Partition_manager_UI webserver.content_send_style() #- send standard Tasmota styles -# # webserver.content_send("

Warning: This can brick your device. Don't use unless you know what you are doing.

") - webserver.content_send("
 Partition Manager

") + webserver.content_send("
 Partition Manager 

") webserver.content_send("

Warning: This can brick your device.

") self.page_show_partitions(p) webserver.content_send("

") if p.otadata.maxota > 0 - webserver.content_send("
 Re-partition

") + webserver.content_send("
 Re-partition 

") self.page_show_repartition_asym(p) webserver.content_send("

") end @@ -711,19 +711,19 @@ class Partition_manager_UI #---------------------------------------------------------------------# # Resize the SPIFFS partition, generally to extend it to full free size #---------------------------------------------------------------------# - elif webserver.has_arg("spiffs_size") + elif webserver.has_arg("fs_size") #- SPIFFS size change -# - var spiffs_size_kb = int(webserver.arg("spiffs_size")) + var spiffs_size_kb = int(webserver.arg("fs_size")) var spiffs_slot = p.slots[-1] # last slot var spiffs_max_size = ((tasmota.memory()['flash'] - (spiffs_slot.start / 1024)) / 16) * 16 - if spiffs_slot == nil || !spiffs_slot.is_spiffs() raise "value_error", "Last slot is not SPIFFS type" end + if spiffs_slot == nil || !spiffs_slot.is_spiffs() raise "value_error", "Last slot is not FS type" end var flash_size_kb = tasmota.memory()['flash'] if spiffs_size_kb < 0 || spiffs_size_kb > spiffs_max_size - raise "value_error", string.format("Invalid spiffs_size %i, should be between 0 and %i", spiffs_size_kb, spiffs_max_size) + raise "value_error", string.format("Invalid fs_size %i, should be between 0 and %i", spiffs_size_kb, spiffs_max_size) end - if spiffs_size_kb == spiffs_slot.size/1024 raise "value_error", "SPIFFS size unchanged, abort" end + if spiffs_size_kb == spiffs_slot.size/1024 raise "value_error", "FS size unchanged, abort" end #- write the new SPIFFS partition size -# spiffs_slot.size = spiffs_size_kb * 1024 @@ -743,7 +743,7 @@ class Partition_manager_UI var app1 = p.get_ota_slot(1) var spiffs = p.slots[-1] - if !spiffs.is_spiffs() raise 'internal_error', 'No SPIFFS partition found' end + if !spiffs.is_spiffs() raise 'internal_error', 'No FS partition found' end if app0 == nil || app1 == nil raise "internal_error", "Unable to find partitions app0 and app1" end @@ -785,7 +785,7 @@ class Partition_manager_UI var app1 = p.get_ota_slot(1) var spiffs = p.slots[-1] - if !spiffs.is_spiffs() raise 'internal_error', 'No SPIFFS partition found' end + if !spiffs.is_spiffs() raise 'internal_error', 'No FS partition found' end if app0 == nil || app1 == nil raise "internal_error", "Unable to find partitions app0 and app1" end From da0a2280b599460330ce76f5b3281add6e9f8804 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 May 2022 14:47:50 +0200 Subject: [PATCH 238/376] Add support for Sonoff SPM v1.2.0 - Add support for Sonoff SPM v1.2.0 - Bump version to v11.1.0.3 --- CHANGELOG.md | 15 ++++-- RELEASENOTES.md | 3 +- tasmota/tasmota_version.h | 2 +- tasmota/xdrv_86_esp32_sonoff_spm.ino | 73 ++++++++++++++++++++++++---- 4 files changed, 77 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cadcc0282..aac70f934 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [11.1.0.2] +## [11.1.0.3] ### Added -- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production +- Support for Sonoff SPM v1.2.0 ### Changed -- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota -- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries + ### Fixed @@ -17,6 +16,14 @@ All notable changes to this project will be documented in this file. ### Removed +## [11.1.0.2] 20220514 +### Added +- ESP32 Command ``Restart 3`` to switch between SafeBoot and Production + +### Changed +- Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota +- ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries + ## [11.1.0.1] 20220504 ### Added - Support for Sonoff MS01 soil moisture sensor (#15335) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e9fe4d89e..24af1c458 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -104,7 +104,7 @@ 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 v11.1.0.2 +## Changelog v11.1.0.3 ### Added - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) @@ -113,6 +113,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) - Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) +- Support for Sonoff SPM v1.2.0 - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production diff --git a/tasmota/tasmota_version.h b/tasmota/tasmota_version.h index 72db321c3..f4b32b051 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 = 0x0B010002; // 11.1.0.2 +const uint32_t VERSION = 0x0B010003; // 11.1.0.3 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index c2ef0ef83..64016d963 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -32,7 +32,7 @@ * Each SPM-4Relay has 4 bistable relays with their own CSE7761 energy monitoring device handled by an ARM processor. * Green led is controlled by ARM processor indicating SD-Card access. * ESP32 is used as interface between eWelink and ARM processor in SPM-Main unit communicating over proprietary serial protocol. - * Power on sequence for two SPM-4Relay modules is 00-00-15-10-(0F)-(13)-(13)-(19)-0C-09-04-09-04-0B-0B + * Power on sequence for two SPM-4Relay modules is 00-00-15-10-(0F)-(13)-(13)-(19)-0C-09-04-[25]-09-04-[25]-0B-0B * Up to 180 days of daily energy are stored on the SD-Card. Previous data is lost. * Tasmota support is based on Sonoff SPM v1.0.0 ARM firmware. * Energy history cannot be guaranteed using either SD-Card or internal flash. As a solution Tasmota stores the total energy and yesterday energy just after midnight. @@ -143,6 +143,7 @@ #define SSPM_FUNC_GET_LOG 26 // 0x1A #define SSPM_FUNC_ENERGY_PERIOD 27 // 0x1B #define SSPM_FUNC_RESET 28 // 0x1C - Remove device from eWelink and factory reset +#define SSPM_FUNC_GET_NEW1 37 // 0x25 // From ARM to ESP #define SSPM_FUNC_ENERGY_RESULT 6 // 0x06 @@ -166,6 +167,9 @@ #define SSPM_MODULE_NAME_SIZE 12 +#define SSPM_MAIN_V1_0_0 0x00010000 +#define SSPM_MAIN_V1_2_0 0x00010200 + /*********************************************************************************************/ #define SSPM_TOTAL_MODULES 32 // Max number of SPM-4RELAY units for a total of 128 relays @@ -176,9 +180,10 @@ enum SspmMachineStates { SPM_NONE, // Do nothing SPM_WAIT, // Wait 100ms SPM_RESET, // Toggle ARM reset pin SPM_POLL_ARM, // Wait for first acknowledge from ARM after reset - SPM_POLL_ARM_SPI, // Wait for first acknowledge from ARM SPI after reset - SPM_POLL_ARM_2, // Wait for second acknowledge from ARM after reset - SPM_POLL_ARM_3, // Wait for second acknowledge from ARM after reset +// Removed to accomodate v1.2.0 too +// SPM_POLL_ARM_SPI, // Wait for first acknowledge from ARM SPI after reset +// SPM_POLL_ARM_2, // Wait for second acknowledge from ARM after reset +// SPM_POLL_ARM_3, // Wait for second acknowledge from ARM after reset SPM_SEND_FUNC_UNITS, // Get number of units SPM_START_SCAN, // Start module scan sequence SPM_WAIT_FOR_SCAN, // Wait for scan sequence to complete @@ -250,6 +255,7 @@ typedef struct { float overload_max_current; uint32_t timeout; + uint32_t main_version; power_t old_power; power_t power_on_state; uint16_t last_totals; @@ -894,6 +900,23 @@ void SSPMSendGetEnergyPeriod(uint32_t relay) { } +void SSPMSendGetNew1(uint32_t module) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + aa 55 01 6b 7e 32 37 39 37 34 13 4b 35 36 37 00 25 00 00 08 c0 0a + Marker |Module id |Ac|Cm|Size |Ix|Chksm| + */ + if (module >= Sspm->module_max) { return; } + + SSPMInitSend(); + memcpy(SspmBuffer +3, Sspm->module[SSPMGetMappedModuleId(module)], SSPM_MODULE_NAME_SIZE); + SspmBuffer[16] = SSPM_FUNC_GET_NEW1; // 0x25 + Sspm->command_sequence++; + SspmBuffer[19] = Sspm->command_sequence; + + SSPMSend(22); +} + /*********************************************************************************************/ void SSPMAddModule(void) { @@ -1051,11 +1074,15 @@ void SSPMHandleReceivedData(void) { MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR("SSPMOverload")); Sspm->overload_relay = 255; } else { - Sspm->module_selected--; - if (Sspm->module_selected > 0) { - SSPMSendGetModuleState(Sspm->module_selected -1); + if (Sspm->main_version > SSPM_MAIN_V1_0_0) { + SSPMSendGetNew1(Sspm->module_selected -1); } else { - SSPMSendGetScheme(Sspm->module_selected); + Sspm->module_selected--; + if (Sspm->module_selected > 0) { + SSPMSendGetModuleState(Sspm->module_selected -1); + } else { + SSPMSendGetScheme(Sspm->module_selected); + } } } break; @@ -1101,9 +1128,14 @@ void SSPMHandleReceivedData(void) { case SSPM_FUNC_SET_TIME: /* 0x0C AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 0c 00 01 00 04 3e 62 + v1.2.0: adds response from each 4-relay module + AA 55 01 8b 34 32 37 39 37 34 13 4b 35 36 37 80 0c 00 01 00 19 4c 09 */ - TasmotaGlobal.devices_present = 0; - SSPMSendGetModuleState(Sspm->module_selected -1); + if (0 == SspmBuffer[3]) { + // Discard v1.2.0 additions + TasmotaGlobal.devices_present = 0; + SSPMSendGetModuleState(Sspm->module_selected -1); + } break; case SSPM_FUNC_INIT_SCAN: /* 0x10 @@ -1117,7 +1149,11 @@ void SSPMHandleReceivedData(void) { AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 15 00 04 00 01 00 00 01 81 b1 |St|FwVersio| | | 1.0.0| + v1.2.0: + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 15 00 04 00 01 02 00 01 41 10 + | | 1.2.0| */ + Sspm->main_version = SspmBuffer[20] << 16 | SspmBuffer[21] << 8 | SspmBuffer[22]; // 0x00010000 or 0x00010200 AddLog(LOG_LEVEL_INFO, PSTR("SPM: Main version %d.%d.%d found"), SspmBuffer[20], SspmBuffer[21], SspmBuffer[22]); Sspm->mstate = SPM_START_SCAN; @@ -1314,6 +1350,19 @@ void SSPMHandleReceivedData(void) { */ // TasmotaGlobal.restart_flag = 2; break; + case SSPM_FUNC_GET_NEW1: + /* 0x25 v1.2.0 + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 21 22 23 + AA 55 01 8b 34 32 37 39 37 34 13 4b 35 36 37 80 25 00 01 01 06 98 06 + Marker |Module id |Ac|Cm|Size |St|Ix|Chksm| + */ + Sspm->module_selected--; + if (Sspm->module_selected > 0) { + SSPMSendGetModuleState(Sspm->module_selected -1); + } else { + SSPMSendGetScheme(Sspm->module_selected); + } + break; } } else { // Initiated by ARM @@ -1515,6 +1564,7 @@ void SSPMHandleReceivedData(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Relay scan done - none found")); Sspm->mstate = SPM_NONE; + Sspm->error_led_blinks = 255; } SSPMSendSetTime(); @@ -1755,6 +1805,8 @@ void SSPMEvery100ms(void) { // Wait for first acknowledge from ARM after reset SSPMSendCmnd(SSPM_FUNC_FIND); break; +/* + // Removed to accomodate v1.2.0 too case SPM_POLL_ARM_SPI: SSPMSendSPIFind(); Sspm->mstate = SPM_POLL_ARM_2; @@ -1766,6 +1818,7 @@ void SSPMEvery100ms(void) { case SPM_POLL_ARM_3: // Wait for second acknowledge from ARM after reset break; +*/ case SPM_SEND_FUNC_UNITS: // Get number of units SSPMSendCmnd(SSPM_FUNC_UNITS); From 5f53f36563f9aaf2ee4af298bc215960f5d5d81d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 14 May 2022 17:41:52 +0200 Subject: [PATCH 239/376] Add ESP32 partition info to GUI --- tasmota/language/af_AF.h | 2 ++ tasmota/language/bg_BG.h | 2 ++ tasmota/language/cs_CZ.h | 2 ++ tasmota/language/de_DE.h | 2 ++ tasmota/language/el_GR.h | 2 ++ tasmota/language/en_GB.h | 2 ++ tasmota/language/es_ES.h | 2 ++ tasmota/language/fr_FR.h | 2 ++ tasmota/language/fy_NL.h | 2 ++ tasmota/language/he_HE.h | 2 ++ tasmota/language/hu_HU.h | 2 ++ tasmota/language/it_IT.h | 2 ++ tasmota/language/ko_KO.h | 2 ++ tasmota/language/nl_NL.h | 2 ++ tasmota/language/pl_PL.h | 2 ++ tasmota/language/pt_BR.h | 2 ++ tasmota/language/pt_PT.h | 2 ++ tasmota/language/ro_RO.h | 2 ++ tasmota/language/ru_RU.h | 2 ++ tasmota/language/sk_SK.h | 2 ++ tasmota/language/sv_SE.h | 2 ++ tasmota/language/tr_TR.h | 2 ++ tasmota/language/uk_UA.h | 2 ++ tasmota/language/vi_VN.h | 2 ++ tasmota/language/zh_CN.h | 2 ++ tasmota/language/zh_TW.h | 2 ++ tasmota/support_esp.ino | 28 ++++++++++++++++++++++++++++ tasmota/xdrv_01_webserver.ino | 16 ++++++++++++++++ 28 files changed, 96 insertions(+) diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 825d23be4..968c0e1cd 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Wagwoord" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Poort" #define D_POWER_FACTOR "Krag faktor" #define D_POWERUSAGE "Krag" @@ -183,6 +184,7 @@ #define D_UPGRADE "opgradeer" #define D_UPLOAD "Laai op" #define D_UPTIME "Uptyd" +#define D_USED "used" #define D_USER "Gebruiker" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Indeks" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index c3af37b86..c59f70c66 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Парола" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Порт" #define D_POWER_FACTOR "Фактор на мощността" #define D_POWERUSAGE "Мощност" @@ -183,6 +184,7 @@ #define D_UPGRADE "Обновяване" #define D_UPLOAD "Качването е" #define D_UPTIME "Време на работа" +#define D_USED "used" #define D_USER "Потребител" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Индекс на UV" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 74a161c07..b1b1ec1ab 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Heslo" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Účiník" #define D_POWERUSAGE "Příkon" @@ -183,6 +184,7 @@ #define D_UPGRADE "aktualizace" #define D_UPLOAD "Nahrání..." #define D_UPTIME "Uptime" +#define D_USED "used" #define D_USER "Uživatel" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 545e376c8..1d7916525 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Passwort" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Leistungsfaktor" #define D_POWERUSAGE "Leistung" @@ -183,6 +184,7 @@ #define D_UPGRADE "update" #define D_UPLOAD "Upload" #define D_UPTIME "Laufzeit" +#define D_USED "used" #define D_USER "Benutzer" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV-Index" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 2c7678402..45c6f9038 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Κωδικός" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Θύρα" #define D_POWER_FACTOR "Συντελεστής Ισχύος" #define D_POWERUSAGE "Ισχύς" @@ -183,6 +184,7 @@ #define D_UPGRADE "αναβάθμιση" #define D_UPLOAD "Ανέβασμα" #define D_UPTIME "Χρόνος λειτουργίας" +#define D_USED "used" #define D_USER "Χρήστης" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Δείκτης UV" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 1a0a40251..ba25d36ae 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Password" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Power Factor" #define D_POWERUSAGE "Power" @@ -183,6 +184,7 @@ #define D_UPGRADE "upgrade" #define D_UPLOAD "Upload" #define D_UPTIME "Uptime" +#define D_USED "used" #define D_USER "User" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index a8f9af1d3..acc71ce36 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Clave" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Puerto" #define D_POWER_FACTOR "Factor de Potencia" #define D_POWERUSAGE "Potencia" @@ -183,6 +184,7 @@ #define D_UPGRADE "Actualización" #define D_UPLOAD "Carga" #define D_UPTIME "Tiempo Encendido" +#define D_USED "used" #define D_USER "Usuario" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Índice UV" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index a91d40aa2..c27665fe7 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Mot de passe" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Fact de puiss" #define D_POWERUSAGE "Puissance" @@ -183,6 +184,7 @@ #define D_UPGRADE "la mise à jour" // "Lancer la mise à jour" #define D_UPLOAD "Upload" // Not better in french #define D_UPTIME "Durée d'activité" +#define D_USED "used" #define D_USER "Utilisateur" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indice UV" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 66fbd2807..db6150f80 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Wachtwurd" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Poort" #define D_POWER_FACTOR "Krêftfaktor" #define D_POWERUSAGE "Krêft" @@ -183,6 +184,7 @@ #define D_UPGRADE "upgrade" #define D_UPLOAD "Stjoere" #define D_UPTIME "Betjenstiid" +#define D_USED "used" #define D_USER "Brûker" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV-index" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index ede44be67..9ca125c10 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -140,6 +140,7 @@ #define D_PASSWORD "סיסמא" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "פורט" #define D_POWER_FACTOR "גורם כוח" #define D_POWERUSAGE "כוח" @@ -183,6 +184,7 @@ #define D_UPGRADE "שדרוג" #define D_UPLOAD "העלאה" #define D_UPTIME "זמן עליה" +#define D_USED "used" #define D_USER "משתמש" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV אינדקס" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index 85e025581..ee64407b3 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Jelszó" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Teljesítménytényező" #define D_POWERUSAGE "Energiafelhasználás" @@ -183,6 +184,7 @@ #define D_UPGRADE "Frissítés" #define D_UPLOAD "Feltöltés" #define D_UPTIME "Üzemidő" +#define D_USED "used" #define D_USER "Felhasználó" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV index" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 90a977c7a..c494f382a 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Password" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Porta" #define D_POWER_FACTOR "Fattore di potenza" #define D_POWERUSAGE "Potenza" @@ -183,6 +184,7 @@ #define D_UPGRADE "aggiornamento" #define D_UPLOAD "Caricamento" #define D_UPTIME "Tempo accensione" +#define D_USED "used" #define D_USER "Utente" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indice UV" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index c70b64479..40f4cd824 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -140,6 +140,7 @@ #define D_PASSWORD "비밀번호" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "포트" #define D_POWER_FACTOR "Power Factor" #define D_POWERUSAGE "전원" @@ -183,6 +184,7 @@ #define D_UPGRADE "업그레이드" #define D_UPLOAD "업로드" #define D_UPTIME "가동시간" +#define D_USED "used" #define D_USER "User" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV 색인" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 8ff61cd1c..0e5cf5a06 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Wachtwoord" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Poort" #define D_POWER_FACTOR "Arbeidsfactor" #define D_POWERUSAGE "Vermogen" @@ -183,6 +184,7 @@ #define D_UPGRADE "opwaarderen" #define D_UPLOAD "Verzenden" #define D_UPTIME "Bedrijfstijd" +#define D_USED "used" #define D_USER "Gebruiker" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV-index" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index e4f65d35a..81b2bf557 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Hasło" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Cosinus fi" #define D_POWERUSAGE "Moc" @@ -183,6 +184,7 @@ #define D_UPGRADE "aktualizacji" #define D_UPLOAD "Wgraj" #define D_UPTIME "Czas pracy" +#define D_USED "used" #define D_USER "Użytkownik" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indeks UV" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index d689d83ce..866960151 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Senha" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Porta" #define D_POWER_FACTOR "Fator de potência" #define D_POWERUSAGE "Potência" @@ -183,6 +184,7 @@ #define D_UPGRADE "atualização" #define D_UPLOAD "Enviar" #define D_UPTIME "Tempo de atividade" +#define D_USED "used" #define D_USER "Usuário" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Índice UV" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 715904df4..6da2d62cb 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Palavra Chave" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Porta" #define D_POWER_FACTOR "Factor de Potência" #define D_POWERUSAGE "Potência" @@ -183,6 +184,7 @@ #define D_UPGRADE "Atualizar" #define D_UPLOAD "Enviar" #define D_UPTIME "Tempo de Atividade" +#define D_USED "used" #define D_USER "Utilizador" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indíce UV" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index a57b8bade..4cfa25cb6 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Parolă" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Factor de Putere" #define D_POWERUSAGE "Putere" @@ -183,6 +184,7 @@ #define D_UPGRADE "actualizare" #define D_UPLOAD "Încărcăre" #define D_UPTIME "Folosință" +#define D_USED "used" #define D_USER "Utilizator" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Index UV" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index ea148c878..fc83143b0 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Пароль" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Порт" #define D_POWER_FACTOR "Коэффициент мощности" #define D_POWERUSAGE "Мощность" @@ -183,6 +184,7 @@ #define D_UPGRADE "обновление" #define D_UPLOAD "Загрузить" #define D_UPTIME "Uptime" +#define D_USED "used" #define D_USER "Пользователь" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index e0626e909..840edb230 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Heslo" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Účinník" #define D_POWERUSAGE "Príkon" @@ -183,6 +184,7 @@ #define D_UPGRADE "aktualizáciu" #define D_UPLOAD "Nahrávanie..." #define D_UPTIME "Uptime" +#define D_USED "used" #define D_USER "Používateľ" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 38ef28862..1a3b7c6fd 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Lösenord" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Spänningsfaktor" #define D_POWERUSAGE "Spänning" @@ -183,6 +184,7 @@ #define D_UPGRADE "uppgradera" #define D_UPLOAD "Ladda upp" #define D_UPTIME "Upptid" +#define D_USED "used" #define D_USER "Användare" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index b6005ade9..a2c341ee6 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Şifre" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Güç Faktörü" #define D_POWERUSAGE "Güç" @@ -183,6 +184,7 @@ #define D_UPGRADE "yükseltme" #define D_UPLOAD "Yükleme" #define D_UPTIME "Açık Kalma Süresi" +#define D_USED "used" #define D_USER "Kullanıcı" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Indeksi" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 756e61b44..c93062ef7 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Гасло" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Порт" #define D_POWER_FACTOR "Коефіцієнт потужності" #define D_POWERUSAGE "Потужність" @@ -183,6 +184,7 @@ #define D_UPGRADE "оновлення" #define D_UPLOAD "Завантажити" #define D_UPTIME "Час роботи" +#define D_USED "used" #define D_USER "Користувач" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Індекс УФ" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 3fdb716bd..44d92507b 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -140,6 +140,7 @@ #define D_PASSWORD "Mật khẩu" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "Cổng" #define D_POWER_FACTOR "Hệ số công suất" #define D_POWERUSAGE "Công suất" @@ -183,6 +184,7 @@ #define D_UPGRADE "nâng cấp" #define D_UPLOAD "Tải lên" #define D_UPTIME "Thời gian chạy" +#define D_USED "used" #define D_USER "Người dùng" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV Index" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index a2437a739..cde32877e 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -140,6 +140,7 @@ #define D_PASSWORD "密码" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "端口" #define D_POWER_FACTOR "功率因数" #define D_POWERUSAGE "功率" @@ -183,6 +184,7 @@ #define D_UPGRADE "升级" #define D_UPLOAD "上传" #define D_UPTIME "运行时间" +#define D_USED "used" #define D_USER "用户名" #define D_UTC_TIME "UTC" #define D_UV_INDEX "紫外线指数" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 205162560..95639cc38 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -140,6 +140,7 @@ #define D_PASSWORD "密碼" #define D_PH "pH" #define D_MQ "MQ" +#define D_PARTITION "Partition" // As in flash and firmware partition #define D_PORT "通訊埠" #define D_POWER_FACTOR "功率因數" #define D_POWERUSAGE "用電量" @@ -183,6 +184,7 @@ #define D_UPGRADE "升級" #define D_UPLOAD "上傳" #define D_UPTIME "啟動時間" +#define D_USED "used" #define D_USER "使用者名稱" #define D_UTC_TIME "世界協調時間(UTC)" #define D_UV_INDEX "紫外線指數" diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index 65a9b01c9..ef53ee7d2 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -319,6 +319,34 @@ extern "C" { #include "rom/spi_flash.h" #endif +/* +void EspDumpPartitionTable(void) { + esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); + uint32_t count = 0; + for (; it != NULL; it = esp_partition_next(it)) { + ++count; + const esp_partition_t *partition = esp_partition_get(it); + AddLog(LOG_LEVEL_DEBUG, PSTR("Partition #%d, name %s, type %d, subtype %d, size %d"), count, partition->label, partition->type, partition->subtype, partition->size); + } + esp_partition_iterator_release(it); +} +*/ + +uint32_t EspProgramSize(const char *label) { + const esp_partition_t *part = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, label); + if (!part) { + return 0; + } + const esp_partition_pos_t part_pos = { + .offset = part->address, + .size = part->size, + }; + esp_image_metadata_t data; + data.start_addr = part_pos.offset; + esp_image_verify(ESP_IMAGE_VERIFY, &part_pos, &data); + return data.image_len; +} + bool EspSingleOtaPartition(void) { return (1 == esp_ota_get_app_partition_count()); } diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index ebd73199c..fa7ba8ac8 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2468,6 +2468,22 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1" D_PSR_MAX_MEMORY "}2%d kB"), ESP.getPsramSize() / 1024); WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d kB"), ESP.getFreePsram() / 1024); } + WSContentSend_P(PSTR("}1}2 ")); // Empty line + esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); + for (; it != NULL; it = esp_partition_next(it)) { + const esp_partition_t *part = esp_partition_get(it); +// AddLog(LOG_LEVEL_DEBUG, PSTR("Partition type %d, subtype %d, name %s, size %d"), part->type, part->subtype, part->label, part->size); + uint32_t part_size = part->size / 1024; + if (0 == part->type) { // app + uint32_t prog_size = EspProgramSize(part->label); + uint32_t part_used = ((prog_size / 1024) * 100) / part_size; + WSContentSend_PD(PSTR("}1" D_PARTITION " %s}2%d kB (" D_USED " %d%%)"), part->label, part_size, part_used); + } + if ((1 == part->type) && (130 == part->subtype)) { // data and fs + WSContentSend_PD(PSTR("}1" D_PARTITION " fs}2%d kB"), part_size); + } + } + esp_partition_iterator_release(it); #else // ESP32 WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f kB"), &freemem); #endif // ESP32 From 7da3f278ee7068bda96920306143a1b584f4cd3a Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 14 May 2022 19:10:34 +0200 Subject: [PATCH 240/376] move partitions.json in folder --- boards/esp32-cam.json | 2 +- boards/esp32-m5core2.json | 2 +- boards/esp32-odroid.json | 2 +- boards/esp32_16M.json | 2 +- boards/esp32_4M.json | 2 +- boards/esp32_4M_FS.json | 2 +- boards/esp32_8M.json | 2 +- boards/esp32_solo1_4M.json | 2 +- boards/esp32c3.json | 2 +- boards/esp32c3usb.json | 2 +- boards/esp32s2.json | 2 +- boards/esp32s3.json | 2 +- boards/esp32s3_8M.json | 2 +- .../esp32_partition_app1572k_fs983k.csv | 0 .../esp32_partition_app1856k_fs1344k.csv | 0 .../esp32_partition_app1856k_fs320k.csv | 0 .../esp32_partition_app2880k_fs320k.csv | 0 .../esp32_partition_app2944k_fs10M.csv | 0 .../esp32_partition_app2944k_fs2M.csv | 0 19 files changed, 13 insertions(+), 13 deletions(-) rename esp32_partition_app1572k_fs983k.csv => partitions/esp32_partition_app1572k_fs983k.csv (100%) rename esp32_partition_app1856k_fs1344k.csv => partitions/esp32_partition_app1856k_fs1344k.csv (100%) rename esp32_partition_app1856k_fs320k.csv => partitions/esp32_partition_app1856k_fs320k.csv (100%) rename esp32_partition_app2880k_fs320k.csv => partitions/esp32_partition_app2880k_fs320k.csv (100%) rename esp32_partition_app2944k_fs10M.csv => partitions/esp32_partition_app2944k_fs10M.csv (100%) rename esp32_partition_app2944k_fs2M.csv => partitions/esp32_partition_app2944k_fs2M.csv (100%) diff --git a/boards/esp32-cam.json b/boards/esp32-cam.json index 84ece18d0..20113163e 100644 --- a/boards/esp32-cam.json +++ b/boards/esp32-cam.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32-m5core2.json b/boards/esp32-m5core2.json index 8567085ea..5168ea57d 100644 --- a/boards/esp32-m5core2.json +++ b/boards/esp32-m5core2.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "m5stack_core2", - "partitions": "esp32_partition_app2944k_fs10M.csv" + "partitions": "partitions/esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32-odroid.json b/boards/esp32-odroid.json index a21cedaa9..6d155670e 100644 --- a/boards/esp32-odroid.json +++ b/boards/esp32-odroid.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "odroid_esp32", - "partitions": "esp32_partition_app2944k_fs10M.csv" + "partitions": "partitions/esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_16M.json b/boards/esp32_16M.json index 8314fa5b7..df52ebac4 100644 --- a/boards/esp32_16M.json +++ b/boards/esp32_16M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2944k_fs10M.csv" + "partitions": "partitions/esp32_partition_app2944k_fs10M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_4M.json b/boards/esp32_4M.json index 4821878f7..c4875e1bd 100644 --- a/boards/esp32_4M.json +++ b/boards/esp32_4M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_4M_FS.json b/boards/esp32_4M_FS.json index 30c1fd74f..bc5447ad1 100644 --- a/boards/esp32_4M_FS.json +++ b/boards/esp32_4M_FS.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app1856k_fs1344k.csv" + "partitions": "partitions/esp32_partition_app1856k_fs1344k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_8M.json b/boards/esp32_8M.json index cca93e38d..5a7842f75 100644 --- a/boards/esp32_8M.json +++ b/boards/esp32_8M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2944k_fs2M.csv" + "partitions": "partitions/esp32_partition_app2944k_fs2M.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32_solo1_4M.json b/boards/esp32_solo1_4M.json index d95940d68..6a7d9ed44 100644 --- a/boards/esp32_solo1_4M.json +++ b/boards/esp32_solo1_4M.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32", "variant": "esp32", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32c3.json b/boards/esp32c3.json index f5e7321e4..c1fceed9a 100644 --- a/boards/esp32c3.json +++ b/boards/esp32c3.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32c3", "variant": "esp32c3", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi" diff --git a/boards/esp32c3usb.json b/boards/esp32c3usb.json index 09651ac8b..5ce1f4a67 100644 --- a/boards/esp32c3usb.json +++ b/boards/esp32c3usb.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32c3", "variant": "esp32c3", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi" diff --git a/boards/esp32s2.json b/boards/esp32s2.json index 7f48731af..4077ee33d 100644 --- a/boards/esp32s2.json +++ b/boards/esp32s2.json @@ -10,7 +10,7 @@ "flash_mode": "dout", "mcu": "esp32s2", "variant": "esp32s2", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi" diff --git a/boards/esp32s3.json b/boards/esp32s3.json index a86ea38f9..e2d61eada 100644 --- a/boards/esp32s3.json +++ b/boards/esp32s3.json @@ -11,7 +11,7 @@ "flash_mode": "dio", "mcu": "esp32s3", "variant": "esp32s3", - "partitions": "esp32_partition_app2880k_fs320k.csv" + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" }, "connectivity": [ "wifi", diff --git a/boards/esp32s3_8M.json b/boards/esp32s3_8M.json index affbb0479..d0c15a19f 100644 --- a/boards/esp32s3_8M.json +++ b/boards/esp32s3_8M.json @@ -11,7 +11,7 @@ "flash_mode": "dio", "mcu": "esp32s3", "variant": "esp32s3", - "partitions": "esp32_partition_app2944k_fs2M.csv" + "partitions": "partitions/esp32_partition_app2944k_fs2M.csv" }, "connectivity": [ "wifi", diff --git a/esp32_partition_app1572k_fs983k.csv b/partitions/esp32_partition_app1572k_fs983k.csv similarity index 100% rename from esp32_partition_app1572k_fs983k.csv rename to partitions/esp32_partition_app1572k_fs983k.csv diff --git a/esp32_partition_app1856k_fs1344k.csv b/partitions/esp32_partition_app1856k_fs1344k.csv similarity index 100% rename from esp32_partition_app1856k_fs1344k.csv rename to partitions/esp32_partition_app1856k_fs1344k.csv diff --git a/esp32_partition_app1856k_fs320k.csv b/partitions/esp32_partition_app1856k_fs320k.csv similarity index 100% rename from esp32_partition_app1856k_fs320k.csv rename to partitions/esp32_partition_app1856k_fs320k.csv diff --git a/esp32_partition_app2880k_fs320k.csv b/partitions/esp32_partition_app2880k_fs320k.csv similarity index 100% rename from esp32_partition_app2880k_fs320k.csv rename to partitions/esp32_partition_app2880k_fs320k.csv diff --git a/esp32_partition_app2944k_fs10M.csv b/partitions/esp32_partition_app2944k_fs10M.csv similarity index 100% rename from esp32_partition_app2944k_fs10M.csv rename to partitions/esp32_partition_app2944k_fs10M.csv diff --git a/esp32_partition_app2944k_fs2M.csv b/partitions/esp32_partition_app2944k_fs2M.csv similarity index 100% rename from esp32_partition_app2944k_fs2M.csv rename to partitions/esp32_partition_app2944k_fs2M.csv From 8c2658bb3f4a1a28e8d5b469968de76dd688791c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 11:40:24 +0200 Subject: [PATCH 241/376] Speed up ESP32 GUI information partition display --- tasmota/support_esp.ino | 13 ------------- tasmota/xdrv_01_webserver.ino | 32 +++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index ef53ee7d2..eedcb125b 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -319,19 +319,6 @@ extern "C" { #include "rom/spi_flash.h" #endif -/* -void EspDumpPartitionTable(void) { - esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); - uint32_t count = 0; - for (; it != NULL; it = esp_partition_next(it)) { - ++count; - const esp_partition_t *partition = esp_partition_get(it); - AddLog(LOG_LEVEL_DEBUG, PSTR("Partition #%d, name %s, type %d, subtype %d, size %d"), count, partition->label, partition->type, partition->subtype, partition->size); - } - esp_partition_iterator_release(it); -} -*/ - uint32_t EspProgramSize(const char *label) { const esp_partition_t *part = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, label); if (!part) { diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index fa7ba8ac8..809ea78da 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2472,14 +2472,36 @@ void HandleInformation(void) esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); for (; it != NULL; it = esp_partition_next(it)) { const esp_partition_t *part = esp_partition_get(it); -// AddLog(LOG_LEVEL_DEBUG, PSTR("Partition type %d, subtype %d, name %s, size %d"), part->type, part->subtype, part->label, part->size); + + AddLog(LOG_LEVEL_DEBUG, PSTR("PRT: Type %d, Subtype %d, Name %s, Size %d"), part->type, part->subtype, part->label, part->size); + uint32_t part_size = part->size / 1024; - if (0 == part->type) { // app - uint32_t prog_size = EspProgramSize(part->label); + if (ESP_PARTITION_TYPE_APP == part->type) { + + uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY; + const esp_partition_t *running_ota = esp_ota_get_running_partition(); + if (running_ota) { + cur_part = running_ota->subtype; + } + + uint32_t prog_size = 0; // No active ota partition + if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { + prog_size = EspProgramSize(part->label); // safeboot partition + } + else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { + if (running_ota->subtype == part->subtype) { + prog_size = ESP_getSketchSize(); // Active running ota partition + } + } + char running[2] = { 0 }; + if (part->subtype == cur_part) { + running[0] = '*'; + } + uint32_t part_used = ((prog_size / 1024) * 100) / part_size; - WSContentSend_PD(PSTR("}1" D_PARTITION " %s}2%d kB (" D_USED " %d%%)"), part->label, part_size, part_used); + WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d kB (" D_USED " %d%%)"), part->label, running, part_size, part_used); } - if ((1 == part->type) && (130 == part->subtype)) { // data and fs + if ((ESP_PARTITION_TYPE_DATA == part->type) && (ESP_PARTITION_SUBTYPE_DATA_SPIFFS == part->subtype)) { WSContentSend_PD(PSTR("}1" D_PARTITION " fs}2%d kB"), part_size); } } From 777309c3278f83d80d7a3cc2c4411c0bff4a0f6d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 12:31:27 +0200 Subject: [PATCH 242/376] Add ESP32 GUI information to safeboot --- tasmota/xdrv_01_webserver.ino | 83 +++++++++++++++++++---------------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 809ea78da..bd8dbef4f 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -561,8 +561,10 @@ const WebServerDispatch_t WebServerDispatch[] PROGMEM = { { "dl", HTTP_ANY, HandleBackupConfiguration }, { "rs", HTTP_ANY, HandleRestoreConfiguration }, { "rt", HTTP_ANY, HandleResetConfiguration }, - { "in", HTTP_ANY, HandleInformation }, #endif // Not FIRMWARE_MINIMAL +#ifndef FIRMWARE_MINIMAL_ONLY + { "in", HTTP_ANY, HandleInformation }, +#endif // Not FIRMWARE_MINIMAL_ONLY }; void WebServer_on(const char * prefix, void (*func)(void), uint8_t method = HTTP_ANY) { @@ -1291,7 +1293,14 @@ void HandleRoot(void) if (HTTP_ADMIN == Web.state) { #ifdef FIRMWARE_MINIMAL +#ifdef ESP32 +#ifndef FIRMWARE_MINIMAL_ONLY + WSContentSpaceButton(BUTTON_INFORMATION); + WSContentButton(BUTTON_FIRMWARE_UPGRADE); +#endif // FIRMWARE_MINIMAL_ONLY +#else // ESP8266 WSContentSpaceButton(BUTTON_FIRMWARE_UPGRADE); +#endif // ESP32 WSContentButton(BUTTON_CONSOLE); #else WSContentSpaceButton(BUTTON_CONFIGURATION); @@ -1836,25 +1845,6 @@ void ModuleSaveSettings(void) { /*-------------------------------------------------------------------------------------------*/ -const char kUnescapeCode[] = "&><\"\'\\"; -const char kEscapeCode[] PROGMEM = "&|>|<|"|'|\"; - -String HtmlEscape(const String unescaped) { - char escaped[10]; - size_t ulen = unescaped.length(); - String result = ""; - for (size_t i = 0; i < ulen; i++) { - char c = unescaped[i]; - char *p = strchr(kUnescapeCode, c); - if (p != nullptr) { - result += GetTextIndexed(escaped, sizeof(escaped), p - kUnescapeCode, kEscapeCode); - } else { - result += c; - } - } - return result; -} - void HandleWifiConfiguration(void) { char tmp[TOPSZ]; // Max length is currently 150 @@ -2330,8 +2320,31 @@ void HandleRestoreConfiguration(void) Web.upload_file_type = UPL_SETTINGS; } +#endif // Not FIRMWARE_MINIMAL + /*-------------------------------------------------------------------------------------------*/ +#ifndef FIRMWARE_MINIMAL_ONLY + +const char kUnescapeCode[] = "&><\"\'\\"; +const char kEscapeCode[] PROGMEM = "&|>|<|"|'|\"; + +String HtmlEscape(const String unescaped) { + char escaped[10]; + size_t ulen = unescaped.length(); + String result = ""; + for (size_t i = 0; i < ulen; i++) { + char c = unescaped[i]; + char *p = strchr(kUnescapeCode, c); + if (p != nullptr) { + result += GetTextIndexed(escaped, sizeof(escaped), p - kUnescapeCode, kEscapeCode); + } else { + result += c; + } + } + return result; +} + void HandleInformation(void) { if (!HttpCheckPriviledgedAccess()) { return; } @@ -2469,35 +2482,31 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d kB"), ESP.getFreePsram() / 1024); } WSContentSend_P(PSTR("}1}2 ")); // Empty line + uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY; // 0 + const esp_partition_t *running_ota = esp_ota_get_running_partition(); + if (running_ota) { cur_part = running_ota->subtype; } // 16 - 32 esp_partition_iterator_t it = esp_partition_find(ESP_PARTITION_TYPE_ANY, ESP_PARTITION_SUBTYPE_ANY, NULL); for (; it != NULL; it = esp_partition_next(it)) { const esp_partition_t *part = esp_partition_get(it); - AddLog(LOG_LEVEL_DEBUG, PSTR("PRT: Type %d, Subtype %d, Name %s, Size %d"), part->type, part->subtype, part->label, part->size); +// AddLog(LOG_LEVEL_DEBUG, PSTR("PRT: Type %d, Subtype %d, Name %s, Size %d"), part->type, part->subtype, part->label, part->size); uint32_t part_size = part->size / 1024; if (ESP_PARTITION_TYPE_APP == part->type) { - - uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY; - const esp_partition_t *running_ota = esp_ota_get_running_partition(); - if (running_ota) { - cur_part = running_ota->subtype; - } - - uint32_t prog_size = 0; // No active ota partition + uint32_t prog_size = 0; // No active ota partition if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // safeboot partition + prog_size = EspProgramSize(part->label); // safeboot partition } else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { - if (running_ota->subtype == part->subtype) { - prog_size = ESP_getSketchSize(); // Active running ota partition + if (cur_part == part->subtype) { + prog_size = ESP_getSketchSize(); // Active running ota partition + } + else if (cur_part == ESP_PARTITION_SUBTYPE_APP_FACTORY) { + prog_size = EspProgramSize(part->label); // Only app partition when safeboot partitions } } char running[2] = { 0 }; - if (part->subtype == cur_part) { - running[0] = '*'; - } - + if (part->subtype == cur_part) { running[0] = '*'; } uint32_t part_used = ((prog_size / 1024) * 100) / part_size; WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d kB (" D_USED " %d%%)"), part->label, running, part_size, part_used); } @@ -2520,7 +2529,7 @@ void HandleInformation(void) WSContentSpaceButton(BUTTON_MAIN); WSContentStop(); } -#endif // Not FIRMWARE_MINIMAL +#endif // Not FIRMWARE_MINIMAL_ONLY /*-------------------------------------------------------------------------------------------*/ From b3f3e29b0cc93d378d43162052865752508845aa Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 14:22:32 +0200 Subject: [PATCH 243/376] Change safeboot GUI restart to production partition --- tasmota/support_command.ino | 2 +- tasmota/support_esp.ino | 30 ++++++++++++++++++++++++------ tasmota/xdrv_01_webserver.ino | 9 ++++++--- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 62f305d8f..0f1bbc082 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -891,7 +891,7 @@ void CmndRestart(void) break; #ifdef ESP32 case 3: - if (EspPrepSwitchToOtherPartition()) { + if (EspPrepSwitchPartition(2)) { // Toggle partition between safeboot and production TasmotaGlobal.restart_flag = 2; ResponseCmndChar(PSTR("Switching")); } diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index eedcb125b..902b6a17d 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -354,15 +354,33 @@ void EspPrepRestartToSafeBoot(void) { } } -bool EspPrepSwitchToOtherPartition(void) { +bool EspPrepSwitchPartition(uint32_t state) { bool valid = EspSingleOtaPartition(); if (valid) { bool running_factory = EspRunningFactoryPartition(); - if (!running_factory) { - EspPrepRestartToSafeBoot(); - } else { - const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); - esp_ota_set_boot_partition(partition); + switch (state) { + case 0: // Off = safeboot + if (!running_factory) { + EspPrepRestartToSafeBoot(); + } else { + valid = false; + } + break; + case 1: // On = ota0 + if (running_factory) { + const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); + esp_ota_set_boot_partition(partition); + } else { + valid = false; + } + break; + case 2: // Toggle + if (!running_factory) { + EspPrepRestartToSafeBoot(); + } else { + const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); + esp_ota_set_boot_partition(partition); + } } } return valid; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index bd8dbef4f..963e002fc 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1053,6 +1053,9 @@ void WebRestart(uint32_t type) if (!(2 == type)) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART)); ShowWebSource(SRC_WEBGUI); +#ifdef ESP32 + if (0 == type) { EspPrepSwitchPartition(1); } // Switch to production partition if on safeboot +#endif // ESP32 TasmotaGlobal.restart_flag = 2; } } @@ -2495,14 +2498,14 @@ void HandleInformation(void) if (ESP_PARTITION_TYPE_APP == part->type) { uint32_t prog_size = 0; // No active ota partition if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // safeboot partition + prog_size = EspProgramSize(part->label); // safeboot partition (slow response) } else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { if (cur_part == part->subtype) { - prog_size = ESP_getSketchSize(); // Active running ota partition + prog_size = ESP_getSketchSize(); // Active running ota partition (fast response) } else if (cur_part == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // Only app partition when safeboot partitions + prog_size = EspProgramSize(part->label); // One app partition when safeboot partitions (slow response) } } char running[2] = { 0 }; From ba324b270e8a7b906ae7922c2d160ae7d7742f24 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 14:23:50 +0200 Subject: [PATCH 244/376] Revert "Change safeboot GUI restart to production partition" This reverts commit b3f3e29b0cc93d378d43162052865752508845aa. --- tasmota/support_command.ino | 2 +- tasmota/support_esp.ino | 30 ++++++------------------------ tasmota/xdrv_01_webserver.ino | 9 +++------ 3 files changed, 10 insertions(+), 31 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 0f1bbc082..62f305d8f 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -891,7 +891,7 @@ void CmndRestart(void) break; #ifdef ESP32 case 3: - if (EspPrepSwitchPartition(2)) { // Toggle partition between safeboot and production + if (EspPrepSwitchToOtherPartition()) { TasmotaGlobal.restart_flag = 2; ResponseCmndChar(PSTR("Switching")); } diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index 902b6a17d..eedcb125b 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -354,33 +354,15 @@ void EspPrepRestartToSafeBoot(void) { } } -bool EspPrepSwitchPartition(uint32_t state) { +bool EspPrepSwitchToOtherPartition(void) { bool valid = EspSingleOtaPartition(); if (valid) { bool running_factory = EspRunningFactoryPartition(); - switch (state) { - case 0: // Off = safeboot - if (!running_factory) { - EspPrepRestartToSafeBoot(); - } else { - valid = false; - } - break; - case 1: // On = ota0 - if (running_factory) { - const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); - esp_ota_set_boot_partition(partition); - } else { - valid = false; - } - break; - case 2: // Toggle - if (!running_factory) { - EspPrepRestartToSafeBoot(); - } else { - const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); - esp_ota_set_boot_partition(partition); - } + if (!running_factory) { + EspPrepRestartToSafeBoot(); + } else { + const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); + esp_ota_set_boot_partition(partition); } } return valid; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 963e002fc..bd8dbef4f 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1053,9 +1053,6 @@ void WebRestart(uint32_t type) if (!(2 == type)) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART)); ShowWebSource(SRC_WEBGUI); -#ifdef ESP32 - if (0 == type) { EspPrepSwitchPartition(1); } // Switch to production partition if on safeboot -#endif // ESP32 TasmotaGlobal.restart_flag = 2; } } @@ -2498,14 +2495,14 @@ void HandleInformation(void) if (ESP_PARTITION_TYPE_APP == part->type) { uint32_t prog_size = 0; // No active ota partition if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // safeboot partition (slow response) + prog_size = EspProgramSize(part->label); // safeboot partition } else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { if (cur_part == part->subtype) { - prog_size = ESP_getSketchSize(); // Active running ota partition (fast response) + prog_size = ESP_getSketchSize(); // Active running ota partition } else if (cur_part == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // One app partition when safeboot partitions (slow response) + prog_size = EspProgramSize(part->label); // Only app partition when safeboot partitions } } char running[2] = { 0 }; From e15990b0538638f2f5465deab0be641701913c77 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 14:59:39 +0200 Subject: [PATCH 245/376] Change safeboot GUI restart to production partition --- tasmota/support_command.ino | 2 +- tasmota/support_esp.ino | 30 ++++++++++++++++++++++++------ tasmota/xdrv_01_webserver.ino | 21 ++++++++++++++------- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 62f305d8f..0f1bbc082 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -891,7 +891,7 @@ void CmndRestart(void) break; #ifdef ESP32 case 3: - if (EspPrepSwitchToOtherPartition()) { + if (EspPrepSwitchPartition(2)) { // Toggle partition between safeboot and production TasmotaGlobal.restart_flag = 2; ResponseCmndChar(PSTR("Switching")); } diff --git a/tasmota/support_esp.ino b/tasmota/support_esp.ino index eedcb125b..902b6a17d 100644 --- a/tasmota/support_esp.ino +++ b/tasmota/support_esp.ino @@ -354,15 +354,33 @@ void EspPrepRestartToSafeBoot(void) { } } -bool EspPrepSwitchToOtherPartition(void) { +bool EspPrepSwitchPartition(uint32_t state) { bool valid = EspSingleOtaPartition(); if (valid) { bool running_factory = EspRunningFactoryPartition(); - if (!running_factory) { - EspPrepRestartToSafeBoot(); - } else { - const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); - esp_ota_set_boot_partition(partition); + switch (state) { + case 0: // Off = safeboot + if (!running_factory) { + EspPrepRestartToSafeBoot(); + } else { + valid = false; + } + break; + case 1: // On = ota0 + if (running_factory) { + const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); + esp_ota_set_boot_partition(partition); + } else { + valid = false; + } + break; + case 2: // Toggle + if (!running_factory) { + EspPrepRestartToSafeBoot(); + } else { + const esp_partition_t* partition = esp_ota_get_next_update_partition(nullptr); + esp_ota_set_boot_partition(partition); + } } } return valid; diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index bd8dbef4f..43d5d4c2e 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -1002,12 +1002,16 @@ void WSContentStop(void) { /*********************************************************************************************/ -void WebRestart(uint32_t type) -{ +void WebRestart(uint32_t type) { // type 0 = restart // type 1 = restart after config change // type 2 = Checking WiFi Connection - no restart, only refresh page. // type 3 = restart after WiFi Connection Test Successful + // type 4 = type 0 without auto switch to production + bool prep_switch_partition = false; + if (0 == type) { prep_switch_partition = true; } + if (4 == type) { type = 0; } + bool reset_only = (HTTP_MANAGER_RESET_ONLY == Web.state); WSContentStart_P((type) ? PSTR(D_SAVE_CONFIGURATION) : PSTR(D_RESTART), !reset_only); @@ -1040,7 +1044,7 @@ void WebRestart(uint32_t type) #endif } } - if (type<2) { + if (type < 2) { WSContentSend_P(HTTP_MSG_RSTRT); if (HTTP_MANAGER == Web.state || reset_only) { Web.state = HTTP_ADMIN; @@ -1053,6 +1057,9 @@ void WebRestart(uint32_t type) if (!(2 == type)) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART)); ShowWebSource(SRC_WEBGUI); +#ifdef ESP32 + if (prep_switch_partition) { EspPrepSwitchPartition(1); } // Switch to production partition if on safeboot +#endif // ESP32 TasmotaGlobal.restart_flag = 2; } } @@ -2495,14 +2502,14 @@ void HandleInformation(void) if (ESP_PARTITION_TYPE_APP == part->type) { uint32_t prog_size = 0; // No active ota partition if (part->subtype == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // safeboot partition + prog_size = EspProgramSize(part->label); // safeboot partition (slow response) } else if ((part->subtype >= ESP_PARTITION_SUBTYPE_APP_OTA_MIN) && (part->subtype <= ESP_PARTITION_SUBTYPE_APP_OTA_MAX)) { if (cur_part == part->subtype) { - prog_size = ESP_getSketchSize(); // Active running ota partition + prog_size = ESP_getSketchSize(); // Active running ota partition (fast response) } else if (cur_part == ESP_PARTITION_SUBTYPE_APP_FACTORY) { - prog_size = EspProgramSize(part->label); // Only app partition when safeboot partitions + prog_size = EspProgramSize(part->label); // One app partition when safeboot partitions (slow response) } } char running[2] = { 0 }; @@ -3037,7 +3044,7 @@ void HandleSwitchBootPartition(void) AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_RESTART)); EspRestart(); } else { - WebRestart(0); + WebRestart(4); } } else { if (api_mode) { From 55618c0c7b28873c1fcd8828abb52ff8a8483822 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 15 May 2022 17:35:45 +0200 Subject: [PATCH 246/376] Fix GUI kilobytes --- tasmota/xdrv_01_webserver.ino | 22 ++++---- tasmota/xdrv_86_esp32_sonoff_spm.ino | 84 +++++++++++++++++++++++++--- 2 files changed, 86 insertions(+), 20 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 43d5d4c2e..55e98e862 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2478,15 +2478,15 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1}2 ")); // Empty line WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str()); WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X"), ESP_getFlashChipId()); - WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d kB"), ESP_getFlashChipRealSize() / 1024); - WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d kB"), ESP.getFlashChipSize() / 1024); - WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%d kB"), ESP_getSketchSize() / 1024); - WSContentSend_P(PSTR("}1" D_FREE_PROGRAM_SPACE "}2%d kB"), ESP_getFreeSketchSpace() / 1024); + WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP_getFlashChipRealSize() / 1024); + WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d KB"), ESP.getFlashChipSize() / 1024); + WSContentSend_P(PSTR("}1" D_PROGRAM_SIZE "}2%d KB"), ESP_getSketchSize() / 1024); + WSContentSend_P(PSTR("}1" D_FREE_PROGRAM_SPACE "}2%d KB"), ESP_getFreeSketchSpace() / 1024); #ifdef ESP32 - WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f kB (" D_FRAGMENTATION " %d%%)"), &freemem, ESP_getHeapFragmentation()); + WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB (" D_FRAGMENTATION " %d%%)"), &freemem, ESP_getHeapFragmentation()); if (UsePSRAM()) { - WSContentSend_P(PSTR("}1" D_PSR_MAX_MEMORY "}2%d kB"), ESP.getPsramSize() / 1024); - WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d kB"), ESP.getFreePsram() / 1024); + WSContentSend_P(PSTR("}1" D_PSR_MAX_MEMORY "}2%d KB"), ESP.getPsramSize() / 1024); + WSContentSend_P(PSTR("}1" D_PSR_FREE_MEMORY "}2%d KB"), ESP.getFreePsram() / 1024); } WSContentSend_P(PSTR("}1}2 ")); // Empty line uint32_t cur_part = ESP_PARTITION_SUBTYPE_APP_FACTORY; // 0 @@ -2515,15 +2515,15 @@ void HandleInformation(void) char running[2] = { 0 }; if (part->subtype == cur_part) { running[0] = '*'; } uint32_t part_used = ((prog_size / 1024) * 100) / part_size; - WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d kB (" D_USED " %d%%)"), part->label, running, part_size, part_used); + WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d KB (" D_USED " %d%%)"), part->label, running, part_size, part_used); } if ((ESP_PARTITION_TYPE_DATA == part->type) && (ESP_PARTITION_SUBTYPE_DATA_SPIFFS == part->subtype)) { - WSContentSend_PD(PSTR("}1" D_PARTITION " fs}2%d kB"), part_size); + WSContentSend_PD(PSTR("}1" D_PARTITION " fs}2%d KB"), part_size); } } esp_partition_iterator_release(it); #else // ESP32 - WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f kB"), &freemem); + WSContentSend_PD(PSTR("}1" D_FREE_MEMORY "}2%1_f KB"), &freemem); #endif // ESP32 WSContentSend_P(PSTR("")); @@ -2889,7 +2889,7 @@ void HandleUploadLoop(void) { return; } if (upload.totalSize && !(upload.totalSize % 102400)) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "Progress %d kB"), upload.totalSize / 1024); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPLOAD "Progress %d KB"), upload.totalSize / 1024); } } diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 64016d963..55b91e1c1 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -122,7 +122,7 @@ #define XDRV_86 86 #define SSPM_MAX_MODULES 8 // Currently supports up to 8 SPM-4RELAY units for a total of 32 relays restricted by 32-bit power_t size -#define SSPM_SERIAL_BUFFER_SIZE 512 // Needs to accomodate Energy total history for 180 days (408 bytes) +#define SSPM_SERIAL_BUFFER_SIZE 548 // Needs to accomodate firmware upload data blocks (546 bytes) //#define SSPM_SIMULATE 2 // Simulate additional 4Relay modules based on first detected 4Relay module (debugging purposes only!!) @@ -137,12 +137,16 @@ #define SSPM_FUNC_SET_TIME 12 // 0x0C #define SSPM_FUNC_IAMHERE 13 // 0x0D #define SSPM_FUNC_INIT_SCAN 16 // 0x10 +#define SSPM_FUNC_UPLOAD_HEADER 20 // 0x14 - Upload header #define SSPM_FUNC_UNITS 21 // 0x15 #define SSPM_FUNC_GET_ENERGY_TOTAL 22 // 0x16 #define SSPM_FUNC_GET_ENERGY 24 // 0x18 #define SSPM_FUNC_GET_LOG 26 // 0x1A #define SSPM_FUNC_ENERGY_PERIOD 27 // 0x1B #define SSPM_FUNC_RESET 28 // 0x1C - Remove device from eWelink and factory reset +#define SSPM_FUNC_ARM_RESTART 30 // 0x1E - Restart ARM +#define SSPM_FUNC_UPLOAD_DATA 31 // 0x1F - Upload incremental data blocks of max 512 bytes to ARM +#define SSPM_FUNC_UPLOAD_DONE 33 // 0x21 - Finish upload #define SSPM_FUNC_GET_NEW1 37 // 0x25 // From ARM to ESP @@ -153,14 +157,18 @@ #define SSPM_FUNC_SCAN_DONE 25 // 0x19 // Unknown -#define SSPM_FUNC_01 -#define SSPM_FUNC_02 -#define SSPM_FUNC_05 -#define SSPM_FUNC_14 -#define SSPM_FUNC_17 -#define SSPM_FUNC_18 -#define SSPM_FUNC_20 -#define SSPM_FUNC_23 +#define SSPM_FUNC_01 1 // 0x01 +#define SSPM_FUNC_02 2 // 0x02 +#define SSPM_FUNC_05 5 // 0x05 +#define SSPM_FUNC_14 14 // 0x0E +#define SSPM_FUNC_17 17 // 0x11 +#define SSPM_FUNC_18 18 // 0x12 +#define SSPM_FUNC_23 23 // 0x17 +#define SSPM_FUNC_29 29 // 0x1D +#define SSPM_FUNC_32 32 // 0x20 +#define SSPM_FUNC_34 34 // 0x22 +#define SSPM_FUNC_35 35 // 0x23 +#define SSPM_FUNC_36 36 // 0x24 #define SSPM_GPIO_ARM_RESET 15 #define SSPM_GPIO_LED_ERROR 33 @@ -791,6 +799,21 @@ void SSPMSendInitScan(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Start relay scan...")); } +void SSPMSendUploadHeader(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 0b 09 09 00 1b e5 a4 c7 00 02 88 74 00 6d df + Marker | | |Cm|Size | |Checksum |UploadSize |Ix|Chksm| + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_UPLOAD_HEADER; // 0x14 + SspmBuffer[18] = 0x0B; + + + SspmBuffer[30] = 0; + SSPMSend(33); +} + void SSPMSendGetEnergyTotal(uint32_t relay) { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 @@ -900,6 +923,49 @@ void SSPMSendGetEnergyPeriod(uint32_t relay) { } +void SSPMSendArmRestart(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + aa 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1e 00 01 00 01 fe 05 + Marker | | |Cm|Size | |Ix|Chksm| + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_ARM_RESTART; // 0x1E + SspmBuffer[18] = 1; + Sspm->command_sequence++; + SspmBuffer[20] = Sspm->command_sequence; + SSPMSend(23); +} + +void SSPMSendUpload(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 539 540 541 542 543 544 545 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 00 00 00 00 02 00 a2 99 c3 22 00 00 01 20 cd 95 01 08 ... 04 48 af f3 01 xx yy + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 02 00 00 00 02 00 27 f7 24 87 00 80 01 23 23 70 10 bd ... 21 fa 04 f3 02 xx yy + ... + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 02 86 00 00 00 02 00 f8 f5 25 6d f1 61 00 08 02 01 ff 00 ... 44 xx yy + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 80 00 02 88 00 00 00 00 74 95 4e 01 c1 c5 e5 02 08 c5 e5 02 08 ... 45 xx yy + Marker | | |Cm|Size |Address |UploadSize |Checksum |512 data bytes |Ix |Chksm | + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_UPLOAD_DATA; // 0x1F + + + + Sspm->command_sequence++; + SspmBuffer[543] = Sspm->command_sequence; + SSPMSend(546); +} + +void SSPMSendUploadDone(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 46 32 da + Marker | | |Cm|Size |Ix|Chksm| + */ + SSPMSendCmnd(SSPM_FUNC_UPLOAD_DONE); // 0x21 +} + void SSPMSendGetNew1(uint32_t module) { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 From 0a3302471944d0f0567ee94b60123ef46f57a945 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 15 May 2022 18:42:08 +0200 Subject: [PATCH 247/376] Zigbee disable autoresponder for broadcast messages from self --- tasmota/xdrv_23_zigbee_5_converters.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 805297380..4d57c1906 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -1489,8 +1489,10 @@ void ZCLFrame::parseReadAttributes(Z_attribute_list& attr_list) { attr_list.addAttributePMEM(PSTR("Read")).setStrRaw(attr_numbers.toString().c_str()); attr_list.addAttributePMEM(PSTR("ReadNames")).setStrRaw(attr_names.toString(true).c_str()); - // call auto-responder - autoResponder(read_attr_ids, len/2); + // call auto-responder only if src address if different from ourselves and it was a broadcast + if (_srcaddr != localShortAddr || !_wasbroadcast) { + autoResponder(read_attr_ids, len/2); + } } // ZCL_CONFIGURE_REPORTING_RESPONSE From 1b51678036fd73d93193e5b5d9f182c62423ac8a Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Sun, 15 May 2022 18:42:23 +0200 Subject: [PATCH 248/376] Update Italian language Please check and merge. Thanks. --- tasmota/language/it_IT.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index c494f382a..dd6d4e146 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 05.05.2022 + * Updated until v9.4.0.1 - Last update 15.05.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -140,7 +140,7 @@ #define D_PASSWORD "Password" #define D_PH "pH" #define D_MQ "MQ" -#define D_PARTITION "Partition" // As in flash and firmware partition +#define D_PARTITION "Partizione" // As in flash and firmware partition #define D_PORT "Porta" #define D_POWER_FACTOR "Fattore di potenza" #define D_POWERUSAGE "Potenza" @@ -178,13 +178,13 @@ #define D_TOGGLE "ON/OFF" #define D_TOPIC "Topic" #define D_TOTAL_USAGE "Uso totale" -#define D_TRANSMIT "Trasmesso" +#define D_TRANSMIT "Trasmessi" #define D_TRUE "Vero" #define D_TVOC "TVOC" #define D_UPGRADE "aggiornamento" #define D_UPLOAD "Caricamento" #define D_UPTIME "Tempo accensione" -#define D_USED "used" +#define D_USED "usati" #define D_USER "Utente" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indice UV" From 99cde31140dd093f249043677efd9698ef44346d Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 15 May 2022 18:50:59 +0200 Subject: [PATCH 249/376] Zigbee fix ambiguous 0xFFFE device --- tasmota/xdrv_23_zigbee_A_impl.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 8abe92121..30930f76d 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -201,8 +201,8 @@ void zigbeeZCLSendCmd(class ZCLMessage &zcl) { zcl.transacSet = true; } - AddLog(LOG_LEVEL_DEBUG, PSTR("ZigbeeZCLSend device: 0x%04X, group: 0x%04X, endpoint:%d, cluster:0x%04X, cmd:0x%02X, send:\"%_B\""), - zcl.shortaddr, zcl.groupaddr, zcl.endpoint, zcl.cluster, zcl.cmd, &zcl.buf); + AddLog(LOG_LEVEL_DEBUG, PSTR("ZigbeeZCLSend %s: 0x%04X, endpoint:%d, cluster:0x%04X, cmd:0x%02X, send:\"%_B\""), + zcl.validShortaddr() ? "device":"group", zcl.validShortaddr() ? zcl.shortaddr : zcl.groupaddr, zcl.endpoint, zcl.cluster, zcl.cmd, &zcl.buf); ZigbeeZCLSend_Raw(zcl); From 91724dc8c123a036ebd9cd4e140c6a63ffa4645e Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 16 May 2022 13:30:20 +0200 Subject: [PATCH 250/376] Update README.md --- lib/lib_basic/OneWire-Stickbreaker/README.md | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/lib/lib_basic/OneWire-Stickbreaker/README.md b/lib/lib_basic/OneWire-Stickbreaker/README.md index fcc566fbf..39dbbbad7 100644 --- a/lib/lib_basic/OneWire-Stickbreaker/README.md +++ b/lib/lib_basic/OneWire-Stickbreaker/README.md @@ -1,11 +1,6 @@ # OneWire library - A modification of the Arduino OneWire library maintained by @PaulStoffregen. This modifications supports the ESP32 under the Arduino-esp32 Environment. - - No changes are required for compatibility with Arduino coding. + A @stickbreaker @arendst modified version of the Arduino OneWire library maintained by @PaulStoffregen. + This modifications supports the ESP8266, ESP32, ESP32c3, ESP32s2 and ESP32s3 under the Arduino-esp32 Environment. + -Original Source is Paul's 2.3 version. Forked 28DEC2017 - -@stickbreaker -V2.3.1 30APR2018 add IRAM_ATTR to read_bit() write_bit() to solve ICache miss timing failure. - thanks @everslick re: https://github.com/espressif/arduino-esp32/issues/1335 -V2.3 28DEC2017 original mods to support ESP32 +Original Source is Paul's 2.3 version. From d4e4440a40bcb2499e505ac9ad4ef0c7e4ee8f0c Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 16 May 2022 19:17:40 +0200 Subject: [PATCH 251/376] Zigbee merge ZCLMessage and ZCLFrame --- tasmota/xdrv_23_zigbee_1_headers.ino | 41 +-- tasmota/xdrv_23_zigbee_2_devices.ino | 11 +- tasmota/xdrv_23_zigbee_2a_devices_impl.ino | 10 +- tasmota/xdrv_23_zigbee_5_converters.ino | 244 ++++++++++-------- ...e_3_hue.ino => xdrv_23_zigbee_6_5_hue.ino} | 4 +- tasmota/xdrv_23_zigbee_6_commands.ino | 6 +- tasmota/xdrv_23_zigbee_8_parsers.ino | 63 ++--- tasmota/xdrv_23_zigbee_9_serial.ino | 36 +-- tasmota/xdrv_23_zigbee_A_impl.ino | 78 +++--- 9 files changed, 244 insertions(+), 249 deletions(-) rename tasmota/{xdrv_23_zigbee_3_hue.ino => xdrv_23_zigbee_6_5_hue.ino} (99%) diff --git a/tasmota/xdrv_23_zigbee_1_headers.ino b/tasmota/xdrv_23_zigbee_1_headers.ino index 063c6ddc6..38359d00b 100644 --- a/tasmota/xdrv_23_zigbee_1_headers.ino +++ b/tasmota/xdrv_23_zigbee_1_headers.ino @@ -30,43 +30,6 @@ // contains some definitions for functions used before their declarations -// -// structure containing all needed information to send a ZCL packet -// -class ZCLMessage { - -public: - ZCLMessage(void); // allocate 16 bytes vy default - ZCLMessage(size_t size); - - inline bool validShortaddr(void) const { return BAD_SHORTADDR != shortaddr; } - inline bool validGroupaddr(void) const { return 0 != groupaddr; } - inline bool validCluster(void) const { return 0xFFFF != cluster; } - inline bool validEndpoint(void) const { return 0x00 != endpoint; } - inline bool validCmd(void) const { return 0xFF != cmd; } - - inline void setTransac(uint8_t _transac) { transac = _transac; transacSet = true; } - - uint16_t shortaddr = BAD_SHORTADDR; // BAD_SHORTADDR is broadcast, so considered invalid - uint16_t groupaddr = 0x0000; // group address valid only if device == BAD_SHORTADDR - uint16_t cluster = 0xFFFF; // no default - uint8_t endpoint = 0x00; // 0x00 is invalid for the dst endpoint - uint8_t cmd = 0xFF; // 0xFF is invalid command number - uint16_t manuf = 0x0000; // default manuf id - bool clusterSpecific = false; - bool needResponse = true; - bool direct = false; // true if direct, false if discover router - bool transacSet = false; // is transac already set - uint8_t transac = 0; // ZCL transaction number - SBuffer buf; - // const uint8_t *msg = nullptr; - // size_t len = 0; -}; - -// define constructor seperately to avoid inlining and reduce Flash size -ZCLMessage::ZCLMessage(void) : buf(12) {}; -ZCLMessage::ZCLMessage(size_t size) : buf(size) {}; - typedef int32_t (*ZB_Func)(uint8_t value); typedef int32_t (*ZB_RecvMsgFunc)(int32_t res, const SBuffer &buf); @@ -150,8 +113,8 @@ public: struct ZigbeeStatus zigbee; SBuffer *zigbee_buffer = nullptr; -void zigbeeZCLSendCmd(ZCLMessage &msg); -void ZigbeeZCLSend_Raw(const ZCLMessage &zcl); +void zigbeeZCLSendCmd(ZCLFrame &msg); +void ZigbeeZCLSend_Raw(const ZCLFrame &zcl); bool ZbAppendWriteBuf(SBuffer & buf, const Z_attribute & attr, bool prepend_status_ok = false); // parse Hex formatted attribute names like '0301/0001" diff --git a/tasmota/xdrv_23_zigbee_2_devices.ino b/tasmota/xdrv_23_zigbee_2_devices.ino index 9ae8114f7..929676bfb 100644 --- a/tasmota/xdrv_23_zigbee_2_devices.ino +++ b/tasmota/xdrv_23_zigbee_2_devices.ino @@ -975,7 +975,7 @@ public: void clean(void); // avoid writing to flash the last changes // Find device by name, can be short_addr, long_addr, number_in_array or name - Z_Device & parseDeviceFromName(const char * param, uint16_t * parsed_shortaddr = nullptr); + Z_Device & parseDeviceFromName(const char * param, uint16_t * parsed_shortaddr = nullptr, int32_t mailbox_payload = 0); bool isTuyaProtocol(uint16_t shortaddr, uint8_t ep = 0) const; @@ -983,7 +983,7 @@ private: LList _devices; // list of devices LList _deferred; // list of deferred calls uint32_t _saveTimer = 0; - uint8_t _seqNumber = 0; // global seqNumber if device is unknown + uint8_t _seqnumber = 0; // global seqNumber if device is unknown //int32_t findShortAddrIdx(uint16_t shortaddr) const; // Create a new entry in the devices list - must be called if it is sure it does not already exist @@ -991,6 +991,13 @@ private: void freeDeviceEntry(Z_Device *device); }; +/*********************************************************************************************\ + * Berry support +\*********************************************************************************************/ +#ifdef USE_BERRY +extern "C" void callBerryZigbeeDispatcher(const char* type, ZCLFrame* zcl_received); +#endif // USE_BERRY + /*********************************************************************************************\ * Singleton variable \*********************************************************************************************/ diff --git a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino index 77027fc91..b28ee0462 100644 --- a/tasmota/xdrv_23_zigbee_2a_devices_impl.ino +++ b/tasmota/xdrv_23_zigbee_2a_devices_impl.ino @@ -345,8 +345,8 @@ uint8_t Z_Devices::getNextSeqNumber(uint16_t shortaddr) { device.seqNumber += 1; return device.seqNumber; } else { - _seqNumber += 1; - return _seqNumber; + _seqnumber += 1; + return _seqnumber; } } @@ -622,7 +622,7 @@ void Z_Devices::clean(void) { // - a friendly name, between quotes, example: "Room_Temp" // // In case the device is not found, the parsed 0x.... short address is passed to *parsed_shortaddr -Z_Device & Z_Devices::parseDeviceFromName(const char * param, uint16_t * parsed_shortaddr) { +Z_Device & Z_Devices::parseDeviceFromName(const char * param, uint16_t * parsed_shortaddr, int32_t mailbox_payload) { if (nullptr == param) { return device_unk; } size_t param_len = strlen(param); char dataBuf[param_len + 1]; @@ -632,8 +632,8 @@ Z_Device & Z_Devices::parseDeviceFromName(const char * param, uint16_t * parsed_ if ((dataBuf[0] >= '0') && (dataBuf[0] <= '9') && (strlen(dataBuf) < 4)) { // simple number 0..99 - if ((XdrvMailbox.payload > 0) && (XdrvMailbox.payload <= 99)) { - return isKnownIndexDevice(XdrvMailbox.payload - 1); + if ((mailbox_payload > 0) && (mailbox_payload <= 99)) { + return isKnownIndexDevice(mailbox_payload - 1); } else { return device_unk; } diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 4d57c1906..5c45df943 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -722,18 +722,25 @@ const __FlashStringHelper* zigbeeFindAttributeById(uint16_t cluster, uint16_t at class ZCLFrame { public: + // constructor used when creating a message from scratch to send it later + ZCLFrame(void); // allocate 16 bytes by default + ZCLFrame(size_t size); + + // constructore used when receiving a Zigbee frame and populating the class ZCLFrame(uint8_t frame_control, uint16_t manuf_code, uint8_t transact_seq, uint8_t cmd_id, const char *buf, size_t buf_len, uint16_t clusterid, uint16_t groupaddr, uint16_t srcaddr, uint8_t srcendpoint, uint8_t dstendpoint, uint8_t wasbroadcast, uint8_t linkquality, uint8_t securityuse, uint8_t seqnumber): - _manuf_code(manuf_code), _transact_seq(transact_seq), _cmd_id(cmd_id), - _payload(buf_len ? buf_len : 250), // allocate the data frame from source or preallocate big enough - _cluster_id(clusterid), _groupaddr(groupaddr), - _srcaddr(srcaddr), _srcendpoint(srcendpoint), _dstendpoint(dstendpoint), _wasbroadcast(wasbroadcast), + manuf(manuf_code), transactseq(transact_seq), cmd(cmd_id), + payload(buf_len ? buf_len : 250), // allocate the data frame from source or preallocate big enough + cluster(clusterid), groupaddr(groupaddr), + shortaddr(srcaddr), _srcendpoint(srcendpoint), dstendpoint(dstendpoint), _wasbroadcast(wasbroadcast), _linkquality(linkquality), _securityuse(securityuse), _seqnumber(seqnumber) { _frame_control.d8 = frame_control; - _payload.addBuffer(buf, buf_len); + clusterSpecific = (_frame_control.b.frame_type != 0); + needResponse = !_frame_control.b.disable_def_resp; + payload.addBuffer(buf, buf_len); }; @@ -746,13 +753,13 @@ public: "\"frametype\":%d,\"direction\":%d,\"disableresp\":%d," "\"manuf\":\"0x%04X\",\"transact\":%d," "\"cmdid\":\"0x%02X\",\"payload\":\"%_B\"}}"), - _groupaddr, _cluster_id, _srcaddr, - _srcendpoint, _dstendpoint, _wasbroadcast, + groupaddr, cluster, shortaddr, + _srcendpoint, dstendpoint, _wasbroadcast, _linkquality, _securityuse, _seqnumber, _frame_control, _frame_control.b.frame_type, _frame_control.b.direction, _frame_control.b.disable_def_resp, - _manuf_code, _transact_seq, _cmd_id, - &_payload); + manuf, transactseq, cmd, + &payload); if (Settings->flag3.tuya_serial_mqtt_publish) { MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_RSLT_SENSOR)); } else { @@ -788,6 +795,7 @@ public: return _frame_control.b.frame_type & 1; } + // parsers for received messages void parseReportAttributes(Z_attribute_list& attr_list); void generateSyntheticAttributes(Z_attribute_list& attr_list); void removeInvalidAttributes(Z_attribute_list& attr_list); @@ -813,47 +821,59 @@ public: void autoResponder(const uint16_t *attr_list_ids, size_t attr_len); inline void setGroupId(uint16_t groupid) { - _groupaddr = groupid; + groupaddr = groupid; } inline void setClusterId(uint16_t clusterid) { - _cluster_id = clusterid; + cluster = clusterid; } - inline uint16_t getSrcAddr(void) const { return _srcaddr; } - inline uint16_t getGroupAddr(void) const { return _groupaddr; } - inline uint16_t getClusterId(void) const { return _cluster_id; } + inline uint16_t getSrcAddr(void) const { return shortaddr; } + inline uint16_t getGroupAddr(void) const { return groupaddr; } + inline uint16_t getClusterId(void) const { return cluster; } inline uint8_t getLinkQuality(void) const { return _linkquality; } - inline uint8_t getCmdId(void) const { return _cmd_id; } + inline uint8_t getCmdId(void) const { return cmd; } inline uint16_t getSrcEndpoint(void) const { return _srcendpoint; } + const SBuffer &getPayload(void) const { return payload; } + uint16_t getManufCode(void) const { return manuf; } - const SBuffer &getPayload(void) const { - return _payload; - } + inline void setTransac(uint8_t _transac) { transactseq = _transac; transacSet = true; } - uint16_t getManufCode(void) const { - return _manuf_code; - } + inline bool validShortaddr(void) const { return BAD_SHORTADDR != shortaddr; } + inline bool validCluster(void) const { return 0xFFFF != cluster; } + inline bool validEndpoint(void) const { return 0x00 != dstendpoint; } + inline bool validCmd(void) const { return 0xFF != cmd; } - -private: - ZCLHeaderFrameControl_t _frame_control = { .d8 = 0 }; - uint16_t _manuf_code = 0; // optional - uint8_t _transact_seq = 0; // transaction sequence number - uint8_t _cmd_id = 0; - SBuffer _payload; - uint16_t _cluster_id = 0; - uint16_t _groupaddr = 0; +public: + uint16_t manuf = 0; // optional + uint8_t transactseq = 0; // transaction sequence number + uint8_t cmd = 0; + SBuffer payload; + uint16_t cluster = 0; + uint16_t groupaddr = 0; // information from decoded ZCL frame - uint16_t _srcaddr; - uint8_t _srcendpoint; - uint8_t _dstendpoint; - uint8_t _wasbroadcast; - uint8_t _linkquality; - uint8_t _securityuse; - uint8_t _seqnumber; + uint16_t shortaddr = BAD_SHORTADDR; // BAD_SHORTADDR is broadcast, so considered invalid + uint8_t dstendpoint = 0x00; // 0x00 is invalid for the dst endpoint + // attributes used in send-only mode + bool clusterSpecific = false; + bool needResponse = true; + bool direct = false; // true if direct, false if discover router + bool transacSet = false; // is transac already set + + // below private attributes are not used when sending a message +private: + uint8_t _srcendpoint = 0x00; // 0x00 is invalid for the src endpoint + ZCLHeaderFrameControl_t _frame_control = { .d8 = 0 }; + bool _wasbroadcast = false; + uint8_t _linkquality = 0x00; + uint8_t _securityuse = 0; // not used by Z2T, logging only + uint8_t _seqnumber = 0; // not used by Z2T, logging only }; +// define constructor seperately to avoid inlining and reduce Flash size +ZCLFrame::ZCLFrame(void) : payload(12) {}; +ZCLFrame::ZCLFrame(size_t size) : payload(size) {}; + // Zigbee ZCL converters // from https://github.com/Koenkk/zigbee-shepherd-converters/blob/638d29f0cace6343052b9a4e7fd60980fa785479/converters/fromZigbee.js#L55 @@ -1197,45 +1217,45 @@ uint32_t parseSingleAttribute(Z_attribute & attr, const SBuffer &buf, // First pass, parse all attributes in their native format void ZCLFrame::parseReportAttributes(Z_attribute_list& attr_list) { uint32_t i = 0; - uint32_t len = _payload.len(); + uint32_t len = payload.len(); if (ZCL_WRITE_ATTRIBUTES == getCmdId()) { attr_list.addAttribute(PSTR("Command"), true).setStr(PSTR("Write")); } while (len >= i + 3) { - uint16_t attrid = _payload.get16(i); + uint16_t attrid = payload.get16(i); i += 2; // exception for Xiaomi lumi.weather - specific field to be treated as octet and not char - if ((0x0000 == _cluster_id) && (0xFF01 == attrid)) { - if (0x42 == _payload.get8(i)) { - _payload.set8(i, 0x41); // change type from 0x42 to 0x41 + if ((0x0000 == cluster) && (0xFF01 == attrid)) { + if (0x42 == payload.get8(i)) { + payload.set8(i, 0x41); // change type from 0x42 to 0x41 } } // TODO look for suffix - Z_attribute & attr = attr_list.addAttribute(_cluster_id, attrid); + Z_attribute & attr = attr_list.addAttribute(cluster, attrid); - i += parseSingleAttribute(attr, _payload, i); + i += parseSingleAttribute(attr, payload, i); } // Issue Philips outdoor motion sensor SML002, see https://github.com/Koenkk/zigbee2mqtt/issues/897 // The sensor expects the coordinator to send a Default Response to acknowledge the attribute reporting if (0 == _frame_control.b.disable_def_resp) { // the device expects a default response - ZCLMessage zcl(2); // message is 2 bytes - zcl.shortaddr = _srcaddr; - zcl.cluster = _cluster_id; - zcl.endpoint = _srcendpoint; + ZCLFrame zcl(2); // message is 2 bytes + zcl.shortaddr = shortaddr; + zcl.cluster = cluster; + zcl.dstendpoint = _srcendpoint; zcl.cmd = ZCL_DEFAULT_RESPONSE; - zcl.manuf = _manuf_code; + zcl.manuf = manuf; zcl.clusterSpecific = false; /* not cluster specific */ zcl.needResponse = false; /* noresponse */ zcl.direct = true; /* direct no retry */ - zcl.setTransac(_transact_seq); - zcl.buf.add8(_cmd_id); - zcl.buf.add8(0); // Status = OK + zcl.setTransac(transactseq); + zcl.payload.add8(cmd); + zcl.payload.add8(0); // Status = OK zigbeeZCLSendCmd(zcl); } } @@ -1295,8 +1315,8 @@ void ZCLFrame::removeInvalidAttributes(Z_attribute_list& attr_list) { // Note: both function are now split to compute on extracted attributes // void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) { - const Z_Device & device = zigbee_devices.findShortAddr(_srcaddr); - const char * model_c = zigbee_devices.getModelId(_srcaddr); // null if unknown + const Z_Device & device = zigbee_devices.findShortAddr(shortaddr); + const char * model_c = zigbee_devices.getModelId(shortaddr); // null if unknown String modelId((char*) model_c); // scan through attributes and apply specific converters for (auto &attr : attr_list) { @@ -1324,7 +1344,7 @@ void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) { case 0x02010008: // Pi Heating Demand - solve Eutotronic bug case 0x02014008: // Eurotronic Host Flags decoding { - const char * manufacturer_c = zigbee_devices.getManufacturerId(_srcaddr); // null if unknown + const char * manufacturer_c = zigbee_devices.getManufacturerId(shortaddr); // null if unknown String manufacturerId((char*) manufacturer_c); if (manufacturerId.equals(F("Eurotronic"))) { if (ccccaaaa == 0x02010008) { @@ -1382,7 +1402,7 @@ void ZCLFrame::computeSyntheticAttributes(Z_attribute_list& attr_list) { } break; case 0x05000002: // ZoneStatus - const Z_Data_Alarm & alarm = (const Z_Data_Alarm&) zigbee_devices.getShortAddr(_srcaddr).data.find(Z_Data_Type::Z_Alarm, _srcendpoint); + const Z_Data_Alarm & alarm = (const Z_Data_Alarm&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_Alarm, _srcendpoint); if (&alarm != nullptr) { alarm.convertZoneStatus(attr_list, attr.getUInt()); } @@ -1405,15 +1425,15 @@ void ZCLFrame::generateCallBacks(Z_attribute_list& attr_list) { uint32_t occupancy = attr.getUInt(); if (occupancy) { uint32_t pir_timer = OCCUPANCY_TIMEOUT; - const Z_Data_PIR & pir_found = (const Z_Data_PIR&) zigbee_devices.getShortAddr(_srcaddr).data.find(Z_Data_Type::Z_PIR, _srcendpoint); + const Z_Data_PIR & pir_found = (const Z_Data_PIR&) zigbee_devices.getShortAddr(shortaddr).data.find(Z_Data_Type::Z_PIR, _srcendpoint); if (&pir_found != nullptr) { pir_timer = pir_found.getTimeoutSeconds() * 1000; } if (pir_timer > 0) { - zigbee_devices.setTimer(_srcaddr, 0 /* groupaddr */, pir_timer, _cluster_id, _srcendpoint, Z_CAT_VIRTUAL_OCCUPANCY, 0, &Z_OccupancyCallback); + zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, pir_timer, cluster, _srcendpoint, Z_CAT_VIRTUAL_OCCUPANCY, 0, &Z_OccupancyCallback); } } else { - zigbee_devices.resetTimersForDevice(_srcaddr, 0 /* groupaddr */, Z_CAT_VIRTUAL_OCCUPANCY); + zigbee_devices.resetTimersForDevice(shortaddr, 0 /* groupaddr */, Z_CAT_VIRTUAL_OCCUPANCY); } break; } @@ -1460,16 +1480,16 @@ void sendHueUpdate(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uin // ZCL_READ_ATTRIBUTES void ZCLFrame::parseReadAttributes(Z_attribute_list& attr_list) { uint32_t i = 0; - uint32_t len = _payload.len(); + uint32_t len = payload.len(); uint16_t read_attr_ids[len/2]; - attr_list.addAttributePMEM(PSTR(D_CMND_ZIGBEE_CLUSTER)).setUInt(_cluster_id); + attr_list.addAttributePMEM(PSTR(D_CMND_ZIGBEE_CLUSTER)).setUInt(cluster); JsonGeneratorArray attr_numbers; Z_attribute_list attr_names; while (len >= 2 + i) { - uint16_t attrid = _payload.get16(i); + uint16_t attrid = payload.get16(i); attr_numbers.add(attrid); read_attr_ids[i/2] = attrid; @@ -1479,7 +1499,7 @@ void ZCLFrame::parseReadAttributes(Z_attribute_list& attr_list) { uint16_t conv_cluster = CxToCluster(pgm_read_byte(&converter->cluster_short)); uint16_t conv_attribute = pgm_read_word(&converter->attribute); - if ((conv_cluster == _cluster_id) && (conv_attribute == attrid)) { + if ((conv_cluster == cluster) && (conv_attribute == attrid)) { attr_names.addAttribute(Z_strings + pgm_read_word(&converter->name_offset), true).setBool(true); break; } @@ -1490,29 +1510,29 @@ void ZCLFrame::parseReadAttributes(Z_attribute_list& attr_list) { attr_list.addAttributePMEM(PSTR("ReadNames")).setStrRaw(attr_names.toString(true).c_str()); // call auto-responder only if src address if different from ourselves and it was a broadcast - if (_srcaddr != localShortAddr || !_wasbroadcast) { + if (shortaddr != localShortAddr || !_wasbroadcast) { autoResponder(read_attr_ids, len/2); } } // ZCL_CONFIGURE_REPORTING_RESPONSE void ZCLFrame::parseConfigAttributes(Z_attribute_list& attr_list) { - uint32_t len = _payload.len(); + uint32_t len = payload.len(); Z_attribute_list attr_config_list; for (uint32_t i=0; len >= i+4; i+=4) { - uint8_t status = _payload.get8(i); - uint16_t attr_id = _payload.get8(i+2); + uint8_t status = payload.get8(i); + uint16_t attr_id = payload.get8(i+2); Z_attribute_list attr_config_response; attr_config_response.addAttributePMEM(PSTR("Status")).setUInt(status); attr_config_response.addAttributePMEM(PSTR("StatusMsg")).setStr(getZigbeeStatusMessage(status).c_str()); - const __FlashStringHelper* attr_name = zigbeeFindAttributeById(_cluster_id, attr_id, nullptr, nullptr); + const __FlashStringHelper* attr_name = zigbeeFindAttributeById(cluster, attr_id, nullptr, nullptr); if (attr_name) { attr_config_list.addAttribute(attr_name).setStrRaw(attr_config_response.toString(true).c_str()); } else { - attr_config_list.addAttribute(_cluster_id, attr_id).setStrRaw(attr_config_response.toString(true).c_str()); + attr_config_list.addAttribute(cluster, attr_id).setStrRaw(attr_config_response.toString(true).c_str()); } } @@ -1522,21 +1542,21 @@ void ZCLFrame::parseConfigAttributes(Z_attribute_list& attr_list) { // ZCL_WRITE_ATTRIBUTES_RESPONSE void ZCLFrame::parseWriteAttributesResponse(Z_attribute_list& attr_list) { - parseResponse_inner(ZCL_WRITE_ATTRIBUTES_RESPONSE, false, _payload.get8(0)); + parseResponse_inner(ZCL_WRITE_ATTRIBUTES_RESPONSE, false, payload.get8(0)); } // ZCL_READ_REPORTING_CONFIGURATION_RESPONSE void ZCLFrame::parseReadConfigAttributes(Z_attribute_list& attr_list) { uint32_t i = 0; - uint32_t len = _payload.len(); + uint32_t len = payload.len(); Z_attribute &attr_root = attr_list.addAttributePMEM(PSTR("ReadConfig")); Z_attribute_list attr_1; while (len >= i + 4) { - uint8_t status = _payload.get8(i); - uint8_t direction = _payload.get8(i+1); - uint16_t attrid = _payload.get16(i+2); + uint8_t status = payload.get8(i); + uint8_t direction = payload.get8(i+1); + uint16_t attrid = payload.get16(i+2); Z_attribute_list attr_2; if (direction) { @@ -1550,7 +1570,7 @@ void ZCLFrame::parseReadConfigAttributes(Z_attribute_list& attr_list) { uint16_t conv_cluster = CxToCluster(pgm_read_byte(&converter->cluster_short)); uint16_t conv_attribute = pgm_read_word(&converter->attribute); - if ((conv_cluster == _cluster_id) && (conv_attribute == attrid)) { + if ((conv_cluster == cluster) && (conv_attribute == attrid)) { const char * attr_name = Z_strings + pgm_read_word(&converter->name_offset); attr_2.addAttribute(attr_name, true).setBool(true); multiplier = CmToMultiplier(pgm_read_byte(&converter->multiplier_idx)); @@ -1565,22 +1585,22 @@ void ZCLFrame::parseReadConfigAttributes(Z_attribute_list& attr_list) { // no error, decode data if (direction) { // only Timeout period is present - uint16_t attr_timeout = _payload.get16(i); + uint16_t attr_timeout = payload.get16(i); i += 2; attr_2.addAttributePMEM(PSTR("TimeoutPeriod")).setUInt((0xFFFF == attr_timeout) ? -1 : attr_timeout); } else { // direction == 0, we have a data type - uint8_t attr_type = _payload.get8(i); + uint8_t attr_type = payload.get8(i); bool attr_discrete = Z_isDiscreteDataType(attr_type); - uint16_t attr_min_interval = _payload.get16(i+1); - uint16_t attr_max_interval = _payload.get16(i+3); + uint16_t attr_min_interval = payload.get16(i+1); + uint16_t attr_max_interval = payload.get16(i+3); i += 5; attr_2.addAttributePMEM(PSTR("MinInterval")).setUInt((0xFFFF == attr_min_interval) ? -1 : attr_min_interval); attr_2.addAttributePMEM(PSTR("MaxInterval")).setUInt((0xFFFF == attr_max_interval) ? -1 : attr_max_interval); if (!attr_discrete) { // decode Reportable Change Z_attribute &attr_change = attr_2.addAttributePMEM(PSTR("ReportableChange")); - i += parseSingleAttribute(attr_change, _payload, i, attr_type); + i += parseSingleAttribute(attr_change, payload, i, attr_type); if ((1 != multiplier) && (0 != multiplier)) { float fval = attr_change.getFloat(); if (multiplier > 0) { fval = fval * multiplier; } @@ -1590,7 +1610,7 @@ void ZCLFrame::parseReadConfigAttributes(Z_attribute_list& attr_list) { } } } - attr_1.addAttribute(_cluster_id, attrid).setStrRaw(attr_2.toString(true).c_str()); + attr_1.addAttribute(cluster, attrid).setStrRaw(attr_2.toString(true).c_str()); } attr_root.setStrRaw(attr_1.toString(true).c_str()); } @@ -1598,16 +1618,16 @@ void ZCLFrame::parseReadConfigAttributes(Z_attribute_list& attr_list) { // ZCL_READ_ATTRIBUTES_RESPONSE void ZCLFrame::parseReadAttributesResponse(Z_attribute_list& attr_list) { uint32_t i = 0; - uint32_t len = _payload.len(); + uint32_t len = payload.len(); while (len >= i + 4) { - uint16_t attrid = _payload.get16(i); + uint16_t attrid = payload.get16(i); i += 2; - uint8_t status = _payload.get8(i++); + uint8_t status = payload.get8(i++); if (0 == status) { - Z_attribute & attr = attr_list.addAttribute(_cluster_id, attrid); - i += parseSingleAttribute(attr, _payload, i); + Z_attribute & attr = attr_list.addAttribute(cluster, attrid); + i += parseSingleAttribute(attr, payload, i); } } } @@ -1618,15 +1638,15 @@ void ZCLFrame::parseResponse_inner(uint8_t cmd, bool cluster_specific, uint8_t s // "Device" char s[12]; - snprintf_P(s, sizeof(s), PSTR("0x%04X"), _srcaddr); + snprintf_P(s, sizeof(s), PSTR("0x%04X"), shortaddr); attr_list.addAttributePMEM(PSTR(D_JSON_ZIGBEE_DEVICE)).setStr(s); // "Name" - const char * friendlyName = zigbee_devices.getFriendlyName(_srcaddr); + const char * friendlyName = zigbee_devices.getFriendlyName(shortaddr); if (friendlyName) { attr_list.addAttributePMEM(PSTR(D_JSON_ZIGBEE_NAME)).setStr(friendlyName); } // "Command" - snprintf_P(s, sizeof(s), PSTR("%04X%c%02X"), _cluster_id, cluster_specific ? '!' : '_', cmd); + snprintf_P(s, sizeof(s), PSTR("%04X%c%02X"), cluster, cluster_specific ? '!' : '_', cmd); attr_list.addAttributePMEM(PSTR(D_JSON_ZIGBEE_CMD)).setStr(s); // "Status" attr_list.addAttributePMEM(PSTR(D_JSON_ZIGBEE_STATUS)).setUInt(status); @@ -1635,8 +1655,8 @@ void ZCLFrame::parseResponse_inner(uint8_t cmd, bool cluster_specific, uint8_t s // Add Endpoint attr_list.addAttributePMEM(PSTR(D_CMND_ZIGBEE_ENDPOINT)).setUInt(_srcendpoint); // Add Group if non-zero - if (_groupaddr) { // TODO what about group zero - attr_list.group_id = _groupaddr; + if (groupaddr) { // TODO what about group zero + attr_list.group_id = groupaddr; } // Add linkquality attr_list.lqi = _linkquality; @@ -1647,9 +1667,9 @@ void ZCLFrame::parseResponse_inner(uint8_t cmd, bool cluster_specific, uint8_t s // ZCL_DEFAULT_RESPONSE void ZCLFrame::parseResponse(void) { - if (_payload.len() < 2) { return; } // wrong format - uint8_t cmd = _payload.get8(0); - uint8_t status = _payload.get8(1); + if (payload.len() < 2) { return; } // wrong format + uint8_t cmd = payload.get8(0); + uint8_t status = payload.get8(1); parseResponse_inner(cmd, true, status); } @@ -1665,22 +1685,22 @@ void Z_ResetDebounce(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, u // Parse non-normalized attributes void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { // Check if debounce is active and if the packet is a duplicate - Z_Device & device = zigbee_devices.getShortAddr(_srcaddr); - if ((device.debounce_endpoint != 0) && (device.debounce_endpoint == _srcendpoint) && (device.debounce_transact == _transact_seq)) { + Z_Device & device = zigbee_devices.getShortAddr(shortaddr); + if ((device.debounce_endpoint != 0) && (device.debounce_endpoint == _srcendpoint) && (device.debounce_transact == transactseq)) { // this is a duplicate, drop the packet - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Discarding duplicate command from 0x%04X, endpoint %d"), _srcaddr, _srcendpoint); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_ZIGBEE "Discarding duplicate command from 0x%04X, endpoint %d"), shortaddr, _srcendpoint); } else { // reset the duplicate marker, parse the packet normally, and set a timer to reset the marker later (which will discard any existing timer for the same device/endpoint) device.debounce_endpoint = _srcendpoint; - device.debounce_transact = _transact_seq; - zigbee_devices.setTimer(_srcaddr, 0 /* groupaddr */, USE_ZIGBEE_DEBOUNCE_COMMANDS, 0 /*clusterid*/, _srcendpoint, Z_CAT_DEBOUNCE_CMD, 0, &Z_ResetDebounce); + device.debounce_transact = transactseq; + zigbee_devices.setTimer(shortaddr, 0 /* groupaddr */, USE_ZIGBEE_DEBOUNCE_COMMANDS, 0 /*clusterid*/, _srcendpoint, Z_CAT_DEBOUNCE_CMD, 0, &Z_ResetDebounce); - convertClusterSpecific(attr_list, _cluster_id, _cmd_id, _frame_control.b.direction, _srcaddr, _srcendpoint, _payload); + convertClusterSpecific(attr_list, cluster, cmd, _frame_control.b.direction, shortaddr, _srcendpoint, payload); if (!Settings->flag5.zb_disable_autoquery) { // read attributes unless disabled if (!_frame_control.b.direction) { // only handle server->client (i.e. device->coordinator) if (_wasbroadcast) { // only update for broadcast messages since we don't see unicast from device to device and we wouldn't know the target - sendHueUpdate(BAD_SHORTADDR, _groupaddr, _cluster_id); + sendHueUpdate(BAD_SHORTADDR, groupaddr, cluster); } } } @@ -1688,18 +1708,18 @@ void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { // Send Default Response to acknowledge the attribute reporting if (0 == _frame_control.b.disable_def_resp) { // the device expects a default response - ZCLMessage zcl(2); // message is 4 bytes - zcl.shortaddr = _srcaddr; - zcl.cluster = _cluster_id; - zcl.endpoint = _srcendpoint; + ZCLFrame zcl(2); // message is 4 bytes + zcl.shortaddr = shortaddr; + zcl.cluster = cluster; + zcl.dstendpoint = _srcendpoint; zcl.cmd = ZCL_DEFAULT_RESPONSE; - zcl.manuf = _manuf_code; + zcl.manuf = manuf; zcl.clusterSpecific = false; /* not cluster specific */ zcl.needResponse = false; /* noresponse */ zcl.direct = true; /* direct no retry */ - zcl.setTransac(_transact_seq); - zcl.buf.add8(_cmd_id); - zcl.buf.add8(0x00); // Status = OK + zcl.setTransac(transactseq); + zcl.payload.add8(cmd); + zcl.payload.add8(0x00); // Status = OK zigbeeZCLSendCmd(zcl); } } @@ -1707,7 +1727,7 @@ void ZCLFrame::parseClusterSpecificCommand(Z_attribute_list& attr_list) { // ====================================================================== // Convert AnalogValue according to the device type void ZCLFrame::syntheticAnalogValue(Z_attribute_list &attr_list, class Z_attribute &attr) { - const char * modelId_c = zigbee_devices.getModelId(_srcaddr); // null if unknown + const char * modelId_c = zigbee_devices.getModelId(shortaddr); // null if unknown String modelId((char*) modelId_c); if (modelId.startsWith(F("lumi.sensor_cube"))) { @@ -1731,7 +1751,7 @@ void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribu uint32_t i = 0; uint32_t len = buf2.len(); - const char * modelId_c = zigbee_devices.getModelId(_srcaddr); // null if unknown + const char * modelId_c = zigbee_devices.getModelId(shortaddr); // null if unknown String modelId((char*) modelId_c); while (len >= 2 + i) { @@ -1830,7 +1850,7 @@ void ZCLFrame::syntheticAqaraSensor2(class Z_attribute_list &attr_list, class Z_ // Aqara Cube and Button void ZCLFrame::syntheticAqaraCubeOrButton(class Z_attribute_list &attr_list, class Z_attribute &attr) { - const char * modelId_c = zigbee_devices.findShortAddr(_srcaddr).modelId; // null if unknown + const char * modelId_c = zigbee_devices.findShortAddr(shortaddr).modelId; // null if unknown String modelId((char*) modelId_c); if (modelId.startsWith(F("lumi.sensor_cube"))) { // only for Aqara cube diff --git a/tasmota/xdrv_23_zigbee_3_hue.ino b/tasmota/xdrv_23_zigbee_6_5_hue.ino similarity index 99% rename from tasmota/xdrv_23_zigbee_3_hue.ino rename to tasmota/xdrv_23_zigbee_6_5_hue.ino index 0485e244a..33d6c9a61 100644 --- a/tasmota/xdrv_23_zigbee_3_hue.ino +++ b/tasmota/xdrv_23_zigbee_6_5_hue.ino @@ -152,14 +152,14 @@ void ZigbeeHueGroups(String * lights) { } void ZigbeeSendHue(uint16_t shortaddr, uint16_t cluster, uint8_t cmd, const SBuffer & s) { - ZCLMessage zcl(s.len()); + ZCLFrame zcl(s.len()); zcl.shortaddr = shortaddr; zcl.cluster = cluster; zcl.cmd = cmd; zcl.clusterSpecific = true; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.replace(s); + zcl.payload.replace(s); zigbeeZCLSendCmd(zcl); } diff --git a/tasmota/xdrv_23_zigbee_6_commands.ino b/tasmota/xdrv_23_zigbee_6_commands.ino index 9df4a3c60..3921a9aef 100644 --- a/tasmota/xdrv_23_zigbee_6_commands.ino +++ b/tasmota/xdrv_23_zigbee_6_commands.ino @@ -183,16 +183,16 @@ void Z_ReadAttrCallback(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster shortaddr = BAD_SHORTADDR; // if group address, don't send to device } - ZCLMessage zcl(attrs_len); // message is `attrs_len` bytes + ZCLFrame zcl(attrs_len); // message is `attrs_len` bytes zcl.shortaddr = shortaddr; zcl.groupaddr = groupaddr; zcl.cluster = cluster; - zcl.endpoint = endpoint; + zcl.dstendpoint = endpoint; zcl.cmd = ZCL_READ_ATTRIBUTES; zcl.clusterSpecific = false; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.addBuffer(attrs, attrs_len); + zcl.payload.addBuffer(attrs, attrs_len); zigbeeZCLSendCmd(zcl); } } diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index f728e1827..348e8e7b7 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -1380,15 +1380,15 @@ void Z_SendSimpleDescReq(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluste // Iterate among // void Z_SendDeviceInfoRequest(uint16_t shortaddr) { - ZCLMessage zcl(4); // message is 4 bytes + ZCLFrame zcl(4); // message is 4 bytes zcl.shortaddr = shortaddr; zcl.cluster = 0; zcl.cmd = ZCL_READ_ATTRIBUTES; zcl.clusterSpecific = false; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.add16(0x0005); - zcl.buf.add16(0x0004); + zcl.payload.add16(0x0005); + zcl.payload.add16(0x0004); zigbeeZCLSendCmd(zcl); } @@ -1396,15 +1396,15 @@ void Z_SendDeviceInfoRequest(uint16_t shortaddr) { // Send single attribute read request in Timer // void Z_SendSingleAttributeRead(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uint8_t endpoint, uint32_t value) { - ZCLMessage zcl(2); // message is 2 bytes + ZCLFrame zcl(2); // message is 2 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; - zcl.endpoint = endpoint; + zcl.dstendpoint = endpoint; zcl.cmd = ZCL_READ_ATTRIBUTES; zcl.clusterSpecific = false; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.add16(value); // 04000500 + zcl.payload.add16(value); // 04000500 zigbeeZCLSendCmd(zcl); } @@ -1413,17 +1413,17 @@ void Z_SendSingleAttributeRead(uint16_t shortaddr, uint16_t groupaddr, uint16_t // void Z_WriteCIEAddress(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uint8_t endpoint, uint32_t value) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Sending CIE Address for Cluster %d in Endpoint %d of Device 0x%04X"), cluster, endpoint, shortaddr); - ZCLMessage zcl(12); // message is 12 bytes + ZCLFrame zcl(12); // message is 12 bytes zcl.shortaddr = shortaddr; zcl.cluster = 0x0500; - zcl.endpoint = endpoint; + zcl.dstendpoint = endpoint; zcl.cmd = ZCL_WRITE_ATTRIBUTES; zcl.clusterSpecific = false; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.add16(0x0010); // attribute 0x0010 - zcl.buf.add8(ZEUI64); - zcl.buf.add64(localIEEEAddr); + zcl.payload.add16(0x0010); // attribute 0x0010 + zcl.payload.add8(ZEUI64); + zcl.payload.add64(localIEEEAddr); zigbeeZCLSendCmd(zcl); } @@ -1433,16 +1433,16 @@ void Z_WriteCIEAddress(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, // void Z_SendCIEZoneEnrollResponse(uint16_t shortaddr, uint16_t groupaddr, uint16_t cluster, uint8_t endpoint, uint32_t value) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "Sending Enroll Zone %d for Cluster %d in Endpoint %d of Device 0x%04X"), Z_B0(value), cluster, endpoint, shortaddr); - ZCLMessage zcl(2); // message is 2 bytes + ZCLFrame zcl(2); // message is 2 bytes zcl.shortaddr = shortaddr; zcl.cluster = 0x0500; - zcl.endpoint = endpoint; + zcl.dstendpoint = endpoint; zcl.cmd = 0x00; // Zone Enroll Response zcl.clusterSpecific = true; zcl.needResponse = true; zcl.direct = false; // discover route - zcl.buf.add8(0x00); // success - zcl.buf.add8(Z_B0(value)); // ZoneID + zcl.payload.add8(0x00); // success + zcl.payload.add8(Z_B0(value)); // ZoneID zigbeeZCLSendCmd(zcl); } @@ -1579,15 +1579,15 @@ void Z_AutoConfigReportingForCluster(uint16_t shortaddr, uint16_t groupaddr, uin if (buf.len() > 0) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_ZIGBEE "auto-bind `%s`"), ResponseData()); - ZCLMessage zcl(buf.len()); // message is 4 bytes + ZCLFrame zcl(buf.len()); // message is 4 bytes zcl.shortaddr = shortaddr; zcl.cluster = cluster; - zcl.endpoint = endpoint; + zcl.dstendpoint = endpoint; zcl.cmd = ZCL_CONFIGURE_REPORTING; zcl.clusterSpecific = false; /* not cluster specific */ zcl.needResponse = false; /* noresponse */ zcl.direct = false; /* discover route */ - zcl.buf.addBuffer(buf); + zcl.payload.addBuffer(buf); zigbeeZCLSendCmd(zcl); } } @@ -1639,6 +1639,11 @@ void Z_IncomingMessage(class ZCLFrame &zcl_received) { // log the packet details zcl_received.log(); +#ifdef USE_BERRY + // Berry pre-process messages + // callBerryZigbeeDispatcher("pre", &zcl_received); +#endif // USE_BERRY + // create the device entry if it does not exist and if it's not the local device Z_Device & device = (srcaddr != localShortAddr) ? zigbee_devices.getShortAddr(srcaddr) : device_unk; @@ -2097,9 +2102,9 @@ void ZCLFrame::autoResponder(const uint16_t *attr_list_ids, size_t attr_len) { for (uint32_t i=0; iflag5.zb_disable_autoquery) { // read back attribute value unless it is disabled - sendHueUpdate(zcl.shortaddr, zcl.groupaddr, zcl.cluster, zcl.endpoint); + sendHueUpdate(zcl.shortaddr, zcl.groupaddr, zcl.cluster, zcl.dstendpoint); } } } @@ -321,15 +321,15 @@ bool ZbAppendWriteBuf(SBuffer & buf, const Z_attribute & attr, bool prepend_stat // Parse "Report", "Write", "Response" or "Config" attribute // Operation is one of: ZCL_REPORT_ATTRIBUTES (0x0A), ZCL_WRITE_ATTRIBUTES (0x02) or ZCL_READ_ATTRIBUTES_RESPONSE (0x01) // -void ZbSendReportWrite(class JsonParserToken val_pubwrite, class ZCLMessage & zcl) { - zcl.buf.reserve(200); // buffer to store the binary output of attibutes - SBuffer & buf = zcl.buf; // synonym +void ZbSendReportWrite(class JsonParserToken val_pubwrite, class ZCLFrame & zcl) { + zcl.payload.reserve(200); // buffer to store the binary output of attibutes + SBuffer & buf = zcl.payload; // synonym if (nullptr == XdrvMailbox.command) { XdrvMailbox.command = (char*) ""; // prevent a crash when calling ReponseCmndChar and there was no previous command } - bool tuya_protocol = zigbee_devices.isTuyaProtocol(zcl.shortaddr, zcl.endpoint); + bool tuya_protocol = zigbee_devices.isTuyaProtocol(zcl.shortaddr, zcl.dstendpoint); // iterate on keys for (auto key : val_pubwrite.getObject()) { @@ -449,7 +449,7 @@ void ZbSendReportWrite(class JsonParserToken val_pubwrite, class ZCLMessage & zc } // Parse the "Send" attribute and send the command -void ZbSendSend(class JsonParserToken val_cmd, ZCLMessage & zcl) { +void ZbSendSend(class JsonParserToken val_cmd, ZCLFrame & zcl) { zcl.clusterSpecific = true; static const char delim[] = ", "; // delimiters for parameters @@ -525,7 +525,7 @@ void ZbSendSend(class JsonParserToken val_cmd, ZCLMessage & zcl) { } else { zcl.cmd = cmd_var; // or simply copy the cmd number } - zigbeeCmdAddParams(zcl.buf, tasmota_cmd, x, y, z); // fill in parameters + zigbeeCmdAddParams(zcl.payload, tasmota_cmd, x, y, z); // fill in parameters } else { // we have zero command, pass through until last error for missing command return; @@ -563,7 +563,7 @@ void ZbSendSend(class JsonParserToken val_cmd, ZCLMessage & zcl) { // delimiter is optional if ('/' == *data) { data++; } // skip delimiter - zcl.buf.replace(SBuffer::SBufferFromHex(data, strlen(data))); + zcl.payload.replace(SBuffer::SBufferFromHex(data, strlen(data))); zigbeeZCLSendCmd(zcl); } else { // we have an unsupported command type @@ -574,7 +574,7 @@ void ZbSendSend(class JsonParserToken val_cmd, ZCLMessage & zcl) { } // Parse the "Send" attribute and send the command -void ZbSendRead(JsonParserToken val_attr, ZCLMessage & zcl) { +void ZbSendRead(JsonParserToken val_attr, ZCLFrame & zcl) { // ZbSend {"Device":"0xF289","Cluster":0,"Endpoint":3,"Read":5} // ZbSend {"Device":"0xF289","Cluster":"0x0000","Endpoint":"0x0003","Read":"0x0005"} // ZbSend {"Device":"0xF289","Cluster":0,"Endpoint":3,"Read":[5,6,7,4]} @@ -670,9 +670,9 @@ void ZbSendRead(JsonParserToken val_attr, ZCLMessage & zcl) { if (attrs_len > 0) { // all good, send the packet - zcl.buf.reserve(attrs_len); - zcl.buf.setLen(0); // clear any previous buffer - zcl.buf.addBuffer(attrs, attrs_len); + zcl.payload.reserve(attrs_len); + zcl.payload.setLen(0); // clear any previous buffer + zcl.payload.addBuffer(attrs, attrs_len); zigbeeZCLSendCmd(zcl); ResponseCmndDone(); } else { @@ -712,7 +712,7 @@ void CmndZbSend(void) { if (!root) { ResponseCmndChar_P(PSTR(D_JSON_INVALID_JSON)); return; } // params - ZCLMessage zcl; // prepare the ZCL structure + ZCLFrame zcl; // prepare the ZCL structure // parse "Device" and "Group" JsonParserToken val_device = root[PSTR(D_CMND_ZIGBEE_DEVICE)]; @@ -733,15 +733,15 @@ void CmndZbSend(void) { // read other parameters zcl.cluster = root.getUInt(PSTR(D_CMND_ZIGBEE_CLUSTER), zcl.cluster); - zcl.endpoint = root.getUInt(PSTR(D_CMND_ZIGBEE_ENDPOINT), zcl.endpoint); + zcl.dstendpoint = root.getUInt(PSTR(D_CMND_ZIGBEE_ENDPOINT), zcl.dstendpoint); zcl.manuf = root.getUInt(PSTR(D_CMND_ZIGBEE_MANUF), zcl.manuf); // infer endpoint if (!zcl.validShortaddr()) { - zcl.endpoint = 0xFF; // endpoint not used for group addresses, so use a dummy broadcast endpoint + zcl.dstendpoint = 0xFF; // endpoint not used for group addresses, so use a dummy broadcast endpoint } else if (!zcl.validEndpoint()) { // if it was not already specified, try to guess it - zcl.endpoint = zigbee_devices.findFirstEndpoint(zcl.shortaddr); - AddLog(LOG_LEVEL_DEBUG, PSTR("ZIG: guessing endpoint %d"), zcl.endpoint); + zcl.dstendpoint = zigbee_devices.findFirstEndpoint(zcl.shortaddr); + AddLog(LOG_LEVEL_DEBUG, PSTR("ZIG: guessing endpoint %d"), zcl.dstendpoint); } if (!zcl.validEndpoint()) { // after this, if it is still zero, then it's an error ResponseCmndChar_P(PSTR("Missing endpoint")); @@ -848,7 +848,7 @@ void ZbBindUnbind(bool unbind) { // false = bind, true = unbind // Information about source device: "Device", "Endpoint", "Cluster" // - the source endpoint must have a known IEEE address - const Z_Device & src_device = zigbee_devices.parseDeviceFromName(root.getStr(PSTR(D_CMND_ZIGBEE_DEVICE), nullptr)); + const Z_Device & src_device = zigbee_devices.parseDeviceFromName(root.getStr(PSTR(D_CMND_ZIGBEE_DEVICE))); if (!src_device.valid()) { ResponseCmndChar_P(PSTR("Unknown source device")); return; } // check if IEEE address is known uint64_t srcLongAddr = src_device.longaddr; @@ -961,7 +961,7 @@ void CmndZbUnbind(void) { // void CmndZbLeave(void) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } - uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data).shortaddr; + uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload).shortaddr; if (BAD_SHORTADDR == shortaddr) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } #ifdef USE_ZIGBEE_ZNP @@ -993,7 +993,7 @@ void CmndZbLeave(void) { void CmndZbBindState_or_Map(bool map) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } uint16_t parsed_shortaddr;; - uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, &parsed_shortaddr).shortaddr; + uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, &parsed_shortaddr, XdrvMailbox.payload).shortaddr; if (BAD_SHORTADDR == shortaddr) { if ((map) && (parsed_shortaddr != shortaddr)) { shortaddr = parsed_shortaddr; // allow a non-existent address when ZbMap @@ -1069,7 +1069,7 @@ void CmndZbProbe(void) { // void CmndZbProbeOrPing(boolean probe) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } - uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data).shortaddr; + uint16_t shortaddr = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload).shortaddr; if (BAD_SHORTADDR == shortaddr) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } // set a timer for Reachable - 2s default value @@ -1107,7 +1107,7 @@ void CmndZbName(void) { strtok_r(XdrvMailbox.data, ",", &p); // parse first part, - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // it's the only case where we create a new device + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // it's the only case where we create a new device if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } if (p == nullptr) { @@ -1139,7 +1139,7 @@ void CmndZbModelId(void) { strtok_r(XdrvMailbox.data, ",", &p); // parse first part, - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } if (p != nullptr) { @@ -1166,7 +1166,7 @@ void CmndZbLight(void) { strtok_r(XdrvMailbox.data, ", ", &p); // parse first part, - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } if (p) { @@ -1210,7 +1210,7 @@ void CmndZbOccupancy(void) { strtok_r(XdrvMailbox.data, ", ", &p); // parse first part, - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } int8_t occupancy_time = -1; @@ -1237,7 +1237,7 @@ void CmndZbOccupancy(void) { // void CmndZbForget(void) { if (zigbee.init_phase) { ResponseCmndChar_P(PSTR(D_ZIGBEE_NOT_STARTED)); return; } - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } // everything is good, we can send the command @@ -1267,7 +1267,7 @@ void CmndZbInfo(void) { CmndZbInfo_inner(device); } } else { // try JSON - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } // everything is good, we can send the command @@ -1337,7 +1337,7 @@ void CmndZbenroll(void) { if ((XdrvMailbox.data_len) && (ArgC() > 1)) { // Process parameter entry char argument[XdrvMailbox.data_len]; - Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1)); + Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1), nullptr, XdrvMailbox.payload); int enrollEndpoint = atoi(ArgV(argument, 2)); if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } @@ -1355,7 +1355,7 @@ void CmndZbcie(void) { if ((XdrvMailbox.data_len) && (ArgC() > 1)) { // Process parameter entry char argument[XdrvMailbox.data_len]; - Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1)); + Z_Device & device = zigbee_devices.parseDeviceFromName(ArgV(argument, 1), nullptr, XdrvMailbox.payload); int enrollEndpoint = atoi(ArgV(argument, 2)); if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } @@ -1576,7 +1576,7 @@ void CmndZbStatus(void) { if (0 == XdrvMailbox.index) { dump = zigbee_devices.dumpCoordinator(); } else { - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); if (XdrvMailbox.data_len > 0) { if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } dump = zigbee_devices.dumpDevice(XdrvMailbox.index, device); @@ -1608,7 +1608,7 @@ void CmndZbData(void) { strtok_r(XdrvMailbox.data, ",", &p); // parse first part, - Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data); // in case of short_addr, it must be already registered + Z_Device & device = zigbee_devices.parseDeviceFromName(XdrvMailbox.data, nullptr, XdrvMailbox.payload); // in case of short_addr, it must be already registered if (!device.valid()) { ResponseCmndChar_P(PSTR(D_ZIGBEE_UNKNOWN_DEVICE)); return; } if (p) { From b1edb98495449888a280ed4aa05fadc393675bf1 Mon Sep 17 00:00:00 2001 From: TID Date: Tue, 17 May 2022 13:33:36 +0200 Subject: [PATCH 252/376] Update pl_PL.h --- tasmota/language/pl_PL.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 81b2bf557..a8b514340 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v10.1.0.7 - Last update 04.02.2022 + * Updated until v11.1.0.3 - Last update 17.05.2022 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -140,7 +140,7 @@ #define D_PASSWORD "Hasło" #define D_PH "pH" #define D_MQ "MQ" -#define D_PARTITION "Partition" // As in flash and firmware partition +#define D_PARTITION "Partycja" // As in flash and firmware partition #define D_PORT "Port" #define D_POWER_FACTOR "Cosinus fi" #define D_POWERUSAGE "Moc" @@ -184,7 +184,7 @@ #define D_UPGRADE "aktualizacji" #define D_UPLOAD "Wgraj" #define D_UPTIME "Czas pracy" -#define D_USED "used" +#define D_USED "użyte" #define D_USER "Użytkownik" #define D_UTC_TIME "UTC" #define D_UV_INDEX "Indeks UV" @@ -203,8 +203,8 @@ #define D_WEIGHT "Waga" #define D_WARMLIGHT "Temperatura światła" #define D_WEB_SERVER "Serwer Web" -#define D_SOC "State of Charge" -#define D_SOH "State of Health" +#define D_SOC "Stan naładowania" +#define D_SOH "Kondycja" // tasmota.ino #define D_WARNING_MINIMAL_VERSION "UWAGA Ta wersja nie obsługuje zapisu ustawień" From 54dfead6d998d76263d34300db67d79c26785b88 Mon Sep 17 00:00:00 2001 From: Paul C Diem Date: Tue, 17 May 2022 08:11:56 -0500 Subject: [PATCH 253/376] Use adjusted bri for LED's after timeout --- tasmota/tasmota.ino | 1 + tasmota/xdrv_04_light.ino | 5 ++++- tasmota/xdrv_35_pwm_dimmer.ino | 8 ++++---- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index dc815a21b..d15cfc001 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -240,6 +240,7 @@ struct TasmotaGlobal_t { uint8_t discovery_counter; // Delayed discovery counter #ifdef USE_PWM_DIMMER uint8_t restore_powered_off_led_counter; // Seconds before powered-off LED (LEDLink) is restored + uint8_t pwm_dimmer_led_bri; // Adjusted brightness LED level #endif // USE_PWM_DIMMER #ifndef SUPPORT_IF_STATEMENT diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 0ecdeffca..4a11cabf6 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -2168,7 +2168,10 @@ void LightSetOutputs(const uint16_t *cur_col_10) { #ifdef USE_PWM_DIMMER // Animate brightness LEDs to follow PWM dimmer brightness - if (PWM_DIMMER == TasmotaGlobal.module_type) PWMDimmerSetBrightnessLeds(change10to8(max_col)); + if (PWM_DIMMER == TasmotaGlobal.module_type) { + TasmotaGlobal.pwm_dimmer_led_bri = change10to8(max_col); + PWMDimmerSetBrightnessLeds(-1); + } #endif // USE_PWM_DIMMER } // char msg[24]; diff --git a/tasmota/xdrv_35_pwm_dimmer.ino b/tasmota/xdrv_35_pwm_dimmer.ino index d95e5c03d..4a8587dc8 100644 --- a/tasmota/xdrv_35_pwm_dimmer.ino +++ b/tasmota/xdrv_35_pwm_dimmer.ino @@ -152,7 +152,7 @@ void PWMModulePreInit(void) #endif // USE_PWM_DIMMER_REMOTE } -// bri: -1 = set to current light bri, -2 = timeout, 0-255 = set to bri +// bri: -1 = set to last local light bri, -2 = timeout, 0-255 = set to bri void PWMDimmerSetBrightnessLeds(int32_t bri) { // Find out how many of the LEDs have their ledmask bit set. @@ -169,7 +169,7 @@ void PWMDimmerSetBrightnessLeds(int32_t bri) if (leds) { led_timeout_seconds = 5; if (bri < 0) { - bri = ((bri == -2 && Settings->flag4.led_timeout) || !Light.power ? 0 : light_state.getBri()); + bri = ((bri == -2 && Settings->flag4.led_timeout) || !Light.power ? 0 : TasmotaGlobal.pwm_dimmer_led_bri); if (!bri || !Settings->flag4.led_timeout) led_timeout_seconds = 0; } @@ -438,13 +438,13 @@ void PWMDimmerHandleButton(uint32_t button_index, bool pressed) if (!active_remote_pwm_dimmer) { #endif // USE_PWM_DIMMER_REMOTE - // Toggle the powered-off LED option. + // Toggle the LED timeout. if (down_button_tapped) { Settings->flag4.led_timeout ^= 1; if (Light.power) PWMDimmerSetBrightnessLeds(Settings->flag4.led_timeout ? 0 : -1); } - // Toggle the LED timeout. + // Toggle the powered-off LED option. else { Settings->flag4.powered_off_led ^= 1; PWMDimmerSetPoweredOffLed(); From 1fda07cd2c29d6cf5c4996fd6292e8e044f58b00 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 18 May 2022 20:20:53 +0200 Subject: [PATCH 254/376] rm commented code --- lib/lib_basic/OneWire-Stickbreaker/OneWire.h | 32 -------------------- 1 file changed, 32 deletions(-) diff --git a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h index 5f4b613c2..c92dda8d0 100644 --- a/lib/lib_basic/OneWire-Stickbreaker/OneWire.h +++ b/lib/lib_basic/OneWire-Stickbreaker/OneWire.h @@ -210,28 +210,12 @@ void directModeInput(IO_REG_TYPE pin) ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); 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 -// int8_t rtc_io = esp32_gpioMux[pin].rtc; -// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; -// if ( rtc_reg ) // RTC pins PULL settings -// { -// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); -// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); -// } #endif // Input if ( pin < 32 ) GPIO.enable_w1tc = ((uint32_t)1 << pin); else GPIO.enable1_w1tc.val = ((uint32_t)1 << (pin - 32)); - -// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? -// pinFunction |= FUN_IE; // input enable but required for output as well? -// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); - -// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - -// GPIO.pin[pin].val = 0; } #endif } @@ -252,28 +236,12 @@ void directModeOutput(IO_REG_TYPE pin) ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_gpio_desc[pin].mux); 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 -// int8_t rtc_io = esp32_gpioMux[pin].rtc; -// uint32_t rtc_reg = (rtc_io != -1)?rtc_io_desc[rtc_io].reg:0; -// if ( rtc_reg ) // RTC pins PULL settings -// { -// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].mux); -// ESP_REG(rtc_reg) = ESP_REG(rtc_reg) & ~(rtc_io_desc[rtc_io].pullup | rtc_io_desc[rtc_io].pulldown); -// } #endif // Output 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)); - -// uint32_t pinFunction((uint32_t)2 << FUN_DRV_S); // what are the drivers? -// pinFunction |= FUN_IE; // input enable but required for output as well? -// pinFunction |= ((uint32_t)PIN_FUNC_GPIO << MCU_SEL_S); - -// ESP_REG(DR_REG_IO_MUX_BASE + esp32_gpioMux[pin].reg) = pinFunction; - -// GPIO.pin[pin].val = 0; } #endif } From e496e368262abab28781ea6dafdf4c4f3de9e2f0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 19 May 2022 13:37:18 +0200 Subject: [PATCH 255/376] SPM updated with latest knowledge SPM updated with latest knowledge - No functional change --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 162 ++++++++++++++++----------- 1 file changed, 97 insertions(+), 65 deletions(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 55b91e1c1..7c9c37246 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -137,16 +137,15 @@ #define SSPM_FUNC_SET_TIME 12 // 0x0C #define SSPM_FUNC_IAMHERE 13 // 0x0D #define SSPM_FUNC_INIT_SCAN 16 // 0x10 -#define SSPM_FUNC_UPLOAD_HEADER 20 // 0x14 - Upload header +#define SSPM_FUNC_UPLOAD_HEADER 20 // 0x14 - SPI Upload header #define SSPM_FUNC_UNITS 21 // 0x15 #define SSPM_FUNC_GET_ENERGY_TOTAL 22 // 0x16 #define SSPM_FUNC_GET_ENERGY 24 // 0x18 #define SSPM_FUNC_GET_LOG 26 // 0x1A #define SSPM_FUNC_ENERGY_PERIOD 27 // 0x1B #define SSPM_FUNC_RESET 28 // 0x1C - Remove device from eWelink and factory reset -#define SSPM_FUNC_ARM_RESTART 30 // 0x1E - Restart ARM -#define SSPM_FUNC_UPLOAD_DATA 31 // 0x1F - Upload incremental data blocks of max 512 bytes to ARM -#define SSPM_FUNC_UPLOAD_DONE 33 // 0x21 - Finish upload +#define SSPM_FUNC_UPLOAD_DATA 31 // 0x1F - SPI Upload incremental data blocks of max 512 bytes to ARM +#define SSPM_FUNC_UPLOAD_DONE 33 // 0x21 - SPI Finish upload #define SSPM_FUNC_GET_NEW1 37 // 0x25 // From ARM to ESP @@ -155,6 +154,7 @@ #define SSPM_FUNC_SCAN_START 15 // 0x0F #define SSPM_FUNC_SCAN_RESULT 19 // 0x13 #define SSPM_FUNC_SCAN_DONE 25 // 0x19 +#define SSPM_FUNC_UPLOAD_DONE_ACK 30 // 0x1E - Restart ARM // Unknown #define SSPM_FUNC_01 1 // 0x01 @@ -535,6 +535,20 @@ void SSPMSendCmnd(uint32_t command) { /*********************************************************************************************/ +void SSPMSendFindAck(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 80 00 00 01 00 00 FC 73 + Marker |Module id |Ac|Cm|Size | |Ix|Chksm| + */ + SSPMInitSend(); + SspmBuffer[15] = 0x80; // Ack +// SspmBuffer[16] = SSPM_FUNC_FIND; // 0x00 + SspmBuffer[18] = 1; + SspmBuffer[19] = 0; + SSPMSend(23); +} + void SSPMSendOPS(uint32_t relay) { /* Overload Protection @@ -799,21 +813,6 @@ void SSPMSendInitScan(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Start relay scan...")); } -void SSPMSendUploadHeader(void) { - /* - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 0b 09 09 00 1b e5 a4 c7 00 02 88 74 00 6d df - Marker | | |Cm|Size | |Checksum |UploadSize |Ix|Chksm| - */ - SSPMInitSend(); - SspmBuffer[16] = SSPM_FUNC_UPLOAD_HEADER; // 0x14 - SspmBuffer[18] = 0x0B; - - - SspmBuffer[30] = 0; - SSPMSend(33); -} - void SSPMSendGetEnergyTotal(uint32_t relay) { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 @@ -923,49 +922,6 @@ void SSPMSendGetEnergyPeriod(uint32_t relay) { } -void SSPMSendArmRestart(void) { - /* - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 - aa 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1e 00 01 00 01 fe 05 - Marker | | |Cm|Size | |Ix|Chksm| - */ - SSPMInitSend(); - SspmBuffer[16] = SSPM_FUNC_ARM_RESTART; // 0x1E - SspmBuffer[18] = 1; - Sspm->command_sequence++; - SspmBuffer[20] = Sspm->command_sequence; - SSPMSend(23); -} - -void SSPMSendUpload(void) { - /* - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 539 540 541 542 543 544 545 - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 00 00 00 00 02 00 a2 99 c3 22 00 00 01 20 cd 95 01 08 ... 04 48 af f3 01 xx yy - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 02 00 00 00 02 00 27 f7 24 87 00 80 01 23 23 70 10 bd ... 21 fa 04 f3 02 xx yy - ... - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 02 86 00 00 00 02 00 f8 f5 25 6d f1 61 00 08 02 01 ff 00 ... 44 xx yy - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 80 00 02 88 00 00 00 00 74 95 4e 01 c1 c5 e5 02 08 c5 e5 02 08 ... 45 xx yy - Marker | | |Cm|Size |Address |UploadSize |Checksum |512 data bytes |Ix |Chksm | - */ - SSPMInitSend(); - SspmBuffer[16] = SSPM_FUNC_UPLOAD_DATA; // 0x1F - - - - Sspm->command_sequence++; - SspmBuffer[543] = Sspm->command_sequence; - SSPMSend(546); -} - -void SSPMSendUploadDone(void) { - /* - 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 - AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 46 32 da - Marker | | |Cm|Size |Ix|Chksm| - */ - SSPMSendCmnd(SSPM_FUNC_UPLOAD_DONE); // 0x21 -} - void SSPMSendGetNew1(uint32_t module) { /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 @@ -1635,6 +1591,14 @@ void SSPMHandleReceivedData(void) { SSPMSendSetTime(); break; + case SSPM_FUNC_UPLOAD_DONE_ACK: + /* 0x1E + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 + aa 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1e 00 01 00 01 fe 05 + Marker | | |Cm|Size | |Ix|Chksm| + */ + SSPMSendFindAck(); + break; } } } @@ -1766,6 +1730,54 @@ bool SSPMSendSPIFind(void) { return false; } +void SSPMSendSPIUploadHeader(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 14 00 0b 09 09 00 1b e5 a4 c7 00 02 88 74 00 6d df + Marker | | |Cm|Size | |Checksum |UploadSize |Ix|Chksm| + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_UPLOAD_HEADER; // 0x14 + SspmBuffer[18] = 0x0B; + + + SspmBuffer[30] = 0; + SSPMSendSPI(33); +} + +void SSPMSendSPIUpload(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 539 540 541 542 543 544 545 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 00 00 00 00 02 00 a2 99 c3 22 00 00 01 20 cd 95 01 08 ... 04 48 af f3 01 xx yy + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 00 02 00 00 00 02 00 27 f7 24 87 00 80 01 23 23 70 10 bd ... 21 fa 04 f3 02 xx yy + ... + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 02 0c 00 02 86 00 00 00 02 00 f8 f5 25 6d f1 61 00 08 02 01 ff 00 ... 44 xx yy + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 1f 00 80 00 02 88 00 00 00 00 74 95 4e 01 c1 c5 e5 02 08 c5 e5 02 08 ... 45 xx yy + Marker | | |Cm|Size |Address |UploadSize |Checksum |512 data bytes |Ix |Chksm | + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_UPLOAD_DATA; // 0x1F + + + + Sspm->command_sequence++; + SspmBuffer[543] = Sspm->command_sequence; + SSPMSendSPI(546); +} + +void SSPMSendSPIUploadDone(void) { + /* + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 + AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 46 32 da + Marker | | |Cm|Size |Ix|Chksm| + */ + SSPMInitSend(); + SspmBuffer[16] = SSPM_FUNC_UPLOAD_DONE; // 0x21 + Sspm->command_sequence++; + SspmBuffer[19] = Sspm->command_sequence; + SSPMSendSPI(22); +} + /*********************************************************************************************/ void SSPMInit(void) { @@ -1848,7 +1860,7 @@ void SSPMEvery100ms(void) { // Fix race condition if the ARM doesn't respond if ((Sspm->mstate > SPM_NONE) && (Sspm->mstate < SPM_SEND_FUNC_UNITS)) { Sspm->counter++; - if (Sspm->counter > 20) { + if (Sspm->counter > 30) { Sspm->mstate = SPM_NONE; Sspm->error_led_blinks = 255; } @@ -2146,13 +2158,13 @@ const char kSSPMCommands[] PROGMEM = "SSPM|" // Prefix "Display|Dump|" // SetOptions "Log|Energy|History|Scan|IamHere|" "Reset|Map|Overload|" - D_CMND_ENERGYTOTAL "|" D_CMND_ENERGYYESTERDAY; + D_CMND_ENERGYTOTAL "|" D_CMND_ENERGYYESTERDAY "|Send"; void (* const SSPMCommand[])(void) PROGMEM = { &CmndSSPMDisplay, &CmndSSPMDump, &CmndSSPMLog, &CmndSSPMEnergy, &CmndSSPMHistory, &CmndSSPMScan, &CmndSSPMIamHere, &CmndSSPMReset, &CmndSSPMMap, &CmndSSPMOverload, - &CmndSpmEnergyTotal, &CmndSpmEnergyYesterday }; + &CmndSpmEnergyTotal, &CmndSpmEnergyYesterday, &CmndSSPMSend }; void CmndSSPMDisplay(void) { // Select either all relays or only powered on relays @@ -2377,6 +2389,26 @@ void CmndSSPMMap(void) { } } +void CmndSSPMSend(void) { + // Want to send AA 55 01 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 ix ch ks + // SspmSend 00 00 00 00 00 00 00 00 00 00 00 00 00 21 00 00 + char data[TOPSZ]; + if ((XdrvMailbox.data_len > 0) && (XdrvMailbox.data_len < sizeof(data))) { + strlcpy(data, XdrvMailbox.data, sizeof(data)); + uint32_t len = (XdrvMailbox.data_len +1) / 3; + char *p = data; + SSPMInitSend(); + for (uint32_t i = 0; i < len; i++) { + SspmBuffer[i +3] = strtol(p, &p, 16); + } + Sspm->command_sequence++; + SspmBuffer[len +3] = Sspm->command_sequence; + SSPMSend(len +6); + + ResponseCmndIdxChar(ToHex_P((unsigned char *)SspmBuffer, len +6, data, sizeof(data), ' ')); + } +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/ From cc3fc2b0ac75ea070379bd23bee8719a978e2b48 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 19 May 2022 13:46:34 +0200 Subject: [PATCH 256/376] Add Tasmota supported ESP32S3usb board file --- boards/esp32s3usb.json | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 boards/esp32s3usb.json diff --git a/boards/esp32s3usb.json b/boards/esp32s3usb.json new file mode 100644 index 000000000..f495bc5d8 --- /dev/null +++ b/boards/esp32s3usb.json @@ -0,0 +1,46 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32s3_out.ld", + "memory_type": "qspi_qspi" + }, + "core": "esp32", + "extra_flags": "-DBOARD_HAS_PSRAM -DARDUINO_USB_MODE=1 -DARDUINO_USB_CDC_ON_BOOT=0 -DARDUINO_USB_MSC_ON_BOOT=0 -DARDUINO_USB_DFU_ON_BOOT=0 -DUSE_USB_SERIAL_CONSOLE -DESP32_4M -DESP32S3", + "f_cpu": "240000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "mcu": "esp32s3", + "variant": "esp32s3", + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth", + "ethernet" + ], + "debug": { + "openocd_target": "esp32s3.cfg" + }, + "frameworks": [ + "espidf", + "arduino" + ], + "name": "Espressif Generic ESP32-S3 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32s3usb-safeboot.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/", + "vendor": "Espressif" +} From 41b82fd0767dbf554698b85b88a55ee4cf8d42e6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 19 May 2022 18:02:05 +0200 Subject: [PATCH 257/376] Possible pin output toggle after power on Possible pin output toggle after power on (#15630) --- CHANGELOG.md | 2 +- RELEASENOTES.md | 1 + tasmota/support.ino | 12 +++++++++--- tasmota/support_tasmota.ino | 27 +++++++++++++++------------ 4 files changed, 26 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aac70f934..4dbda3dcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ All notable changes to this project will be documented in this file. ### Fixed - +- Possible pin output toggle after power on (#15630) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 24af1c458..25da59439 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -127,6 +127,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Improv initial or erase device installation failing to provide Configure WiFi option - SCD40 start low power command [#15361](https://github.com/arendst/Tasmota/issues/15361) - BL09xx negative power presentation [#15374](https://github.com/arendst/Tasmota/issues/15374) +- Possible pin output toggle after power on [#15630](https://github.com/arendst/Tasmota/issues/15630) ### Removed - Arduino IDE support diff --git a/tasmota/support.ino b/tasmota/support.ino index 6f8dc8288..7364a7230 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1326,10 +1326,16 @@ void SetPin(uint32_t lpin, uint32_t gpio) { TasmotaGlobal.gpio_pin[lpin] = gpio; } -void DigitalWrite(uint32_t gpio_pin, uint32_t index, uint32_t state) -{ +void DigitalWrite(uint32_t gpio_pin, uint32_t index, uint32_t state) { + static uint64_t pinmode_init = 0; // Pins 0 to 63 !!! + if (PinUsed(gpio_pin, index)) { - digitalWrite(Pin(gpio_pin, index), state &1); + uint32_t pin = Pin(gpio_pin, index); + if (!bitRead(pinmode_init, pin)) { + pinMode(pin, OUTPUT); + bitSet(pinmode_init, pin); + } + digitalWrite(pin, state &1); } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 42f573d54..3758f2939 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -2010,12 +2010,14 @@ void GpioInit(void) uint32_t mpin = ValidPin(i, TasmotaGlobal.my_module.io[i]); // AddLog(LOG_LEVEL_DEBUG, PSTR("INI: gpio pin %d, mpin %d"), i, mpin); if (AGPIO(GPIO_OUTPUT_HI) == mpin) { - pinMode(i, OUTPUT); - digitalWrite(i, 1); +// pinMode(i, OUTPUT); +// digitalWrite(i, 1); + DigitalWrite(i, 0, 1); } else if (AGPIO(GPIO_OUTPUT_LO) == mpin) { - pinMode(i, OUTPUT); - digitalWrite(i, 0); +// pinMode(i, OUTPUT); +// digitalWrite(i, 0); + DigitalWrite(i, 0, 0); } /* @@ -2049,8 +2051,9 @@ void GpioInit(void) } if (PinUsed(GPIO_HEARTBEAT)) { - pinMode(Pin(GPIO_HEARTBEAT), OUTPUT); - digitalWrite(Pin(GPIO_HEARTBEAT), TasmotaGlobal.heartbeat_inverted); +// pinMode(Pin(GPIO_HEARTBEAT), OUTPUT); +// digitalWrite(Pin(GPIO_HEARTBEAT), TasmotaGlobal.heartbeat_inverted); + DigitalWrite(GPIO_HEARTBEAT, 0, TasmotaGlobal.heartbeat_inverted); } // Digital input @@ -2106,10 +2109,8 @@ void GpioInit(void) for (uint32_t i = 0; i < MAX_RELAYS; i++) { if (PinUsed(GPIO_REL1, i)) { TasmotaGlobal.devices_present++; - pinMode(Pin(GPIO_REL1, i), OUTPUT); #ifdef ESP8266 if (EXS_RELAY == TasmotaGlobal.module_type) { - digitalWrite(Pin(GPIO_REL1, i), bitRead(TasmotaGlobal.rel_inverted, i) ? 1 : 0); if (i &1) { TasmotaGlobal.devices_present--; } } #endif // ESP8266 @@ -2124,16 +2125,18 @@ void GpioInit(void) } else { #endif TasmotaGlobal.leds_present++; - pinMode(Pin(GPIO_LED1, i), OUTPUT); - digitalWrite(Pin(GPIO_LED1, i), bitRead(TasmotaGlobal.led_inverted, i)); +// pinMode(Pin(GPIO_LED1, i), OUTPUT); +// digitalWrite(Pin(GPIO_LED1, i), bitRead(TasmotaGlobal.led_inverted, i)); + DigitalWrite(GPIO_LED1, i, bitRead(TasmotaGlobal.led_inverted, i)); #ifdef USE_ARILUX_RF } #endif } } if (PinUsed(GPIO_LEDLNK)) { - pinMode(Pin(GPIO_LEDLNK), OUTPUT); - digitalWrite(Pin(GPIO_LEDLNK), TasmotaGlobal.ledlnk_inverted); +// pinMode(Pin(GPIO_LEDLNK), OUTPUT); +// digitalWrite(Pin(GPIO_LEDLNK), TasmotaGlobal.ledlnk_inverted); + DigitalWrite(GPIO_LEDLNK, 0, TasmotaGlobal.ledlnk_inverted); } #ifdef USE_PWM_DIMMER From 90a14ee518adfd1835e9c3ab07a1a06d4a70b205 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 19 May 2022 22:35:59 +0200 Subject: [PATCH 258/376] Fix regression from pin output toggle after power on --- tasmota/support_tasmota.ino | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 3758f2939..53f0768e4 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -2010,14 +2010,12 @@ void GpioInit(void) uint32_t mpin = ValidPin(i, TasmotaGlobal.my_module.io[i]); // AddLog(LOG_LEVEL_DEBUG, PSTR("INI: gpio pin %d, mpin %d"), i, mpin); if (AGPIO(GPIO_OUTPUT_HI) == mpin) { -// pinMode(i, OUTPUT); -// digitalWrite(i, 1); - DigitalWrite(i, 0, 1); + pinMode(i, OUTPUT); + digitalWrite(i, 1); } else if (AGPIO(GPIO_OUTPUT_LO) == mpin) { -// pinMode(i, OUTPUT); -// digitalWrite(i, 0); - DigitalWrite(i, 0, 0); + pinMode(i, OUTPUT); + digitalWrite(i, 0); } /* From 84314cf921a8211ad657eede81a1521f420099ca Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 20 May 2022 11:22:49 +0200 Subject: [PATCH 259/376] Generalize pinmode for most digitalwrites --- tasmota/support.ino | 7 +------ tasmota/support_tasmota.ino | 14 ++------------ 2 files changed, 3 insertions(+), 18 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 7364a7230..6f0e39c35 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1327,14 +1327,9 @@ void SetPin(uint32_t lpin, uint32_t gpio) { } void DigitalWrite(uint32_t gpio_pin, uint32_t index, uint32_t state) { - static uint64_t pinmode_init = 0; // Pins 0 to 63 !!! - if (PinUsed(gpio_pin, index)) { uint32_t pin = Pin(gpio_pin, index); - if (!bitRead(pinmode_init, pin)) { - pinMode(pin, OUTPUT); - bitSet(pinmode_init, pin); - } + pinMode(pin, OUTPUT); digitalWrite(pin, state &1); } } diff --git a/tasmota/support_tasmota.ino b/tasmota/support_tasmota.ino index 53f0768e4..a362a91e5 100644 --- a/tasmota/support_tasmota.ino +++ b/tasmota/support_tasmota.ino @@ -2048,11 +2048,7 @@ void GpioInit(void) #endif // ESP8266 } - if (PinUsed(GPIO_HEARTBEAT)) { -// pinMode(Pin(GPIO_HEARTBEAT), OUTPUT); -// digitalWrite(Pin(GPIO_HEARTBEAT), TasmotaGlobal.heartbeat_inverted); - DigitalWrite(GPIO_HEARTBEAT, 0, TasmotaGlobal.heartbeat_inverted); - } + DigitalWrite(GPIO_HEARTBEAT, 0, TasmotaGlobal.heartbeat_inverted); // Digital input for (uint32_t i = 0; i < MAX_SWITCHES; i++) { @@ -2123,19 +2119,13 @@ void GpioInit(void) } else { #endif TasmotaGlobal.leds_present++; -// pinMode(Pin(GPIO_LED1, i), OUTPUT); -// digitalWrite(Pin(GPIO_LED1, i), bitRead(TasmotaGlobal.led_inverted, i)); DigitalWrite(GPIO_LED1, i, bitRead(TasmotaGlobal.led_inverted, i)); #ifdef USE_ARILUX_RF } #endif } } - if (PinUsed(GPIO_LEDLNK)) { -// pinMode(Pin(GPIO_LEDLNK), OUTPUT); -// digitalWrite(Pin(GPIO_LEDLNK), TasmotaGlobal.ledlnk_inverted); - DigitalWrite(GPIO_LEDLNK, 0, TasmotaGlobal.ledlnk_inverted); - } + DigitalWrite(GPIO_LEDLNK, 0, TasmotaGlobal.ledlnk_inverted); #ifdef USE_PWM_DIMMER if (PWM_DIMMER == TasmotaGlobal.module_type && PinUsed(GPIO_REL1)) { TasmotaGlobal.devices_present--; } From c4c03b7c1bcc14f940aeb5f33963d30f29d79ea7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 20 May 2022 11:38:11 +0200 Subject: [PATCH 260/376] Add pinmode once for digitalwrite --- tasmota/support.ino | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 6f0e39c35..a7c08eeda 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1327,9 +1327,18 @@ void SetPin(uint32_t lpin, uint32_t gpio) { } void DigitalWrite(uint32_t gpio_pin, uint32_t index, uint32_t state) { +#ifdef ESP8266 + static uint32_t pinmode_init = 0; // Pins 0 to 31 !!! - saves 40 bytes code space compared to uint64_t +#else + static uint64_t pinmode_init = 0; // Pins 0 to 63 !!! +#endif + if (PinUsed(gpio_pin, index)) { uint32_t pin = Pin(gpio_pin, index); - pinMode(pin, OUTPUT); + if (!bitRead(pinmode_init, pin)) { + pinMode(pin, OUTPUT); + bitSet(pinmode_init, pin); + } digitalWrite(pin, state &1); } } From 51af8611bbc461de5af5f4ff879b128602b7d4c6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 20 May 2022 12:10:46 +0200 Subject: [PATCH 261/376] Fix max 32-bit bitRead/bitSet size issue --- tasmota/support.ino | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index a7c08eeda..a09a6fe59 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -1327,17 +1327,13 @@ void SetPin(uint32_t lpin, uint32_t gpio) { } void DigitalWrite(uint32_t gpio_pin, uint32_t index, uint32_t state) { -#ifdef ESP8266 - static uint32_t pinmode_init = 0; // Pins 0 to 31 !!! - saves 40 bytes code space compared to uint64_t -#else - static uint64_t pinmode_init = 0; // Pins 0 to 63 !!! -#endif + static uint32_t pinmode_init[2] = { 0 }; // Pins 0 to 63 !!! if (PinUsed(gpio_pin, index)) { - uint32_t pin = Pin(gpio_pin, index); - if (!bitRead(pinmode_init, pin)) { + uint32_t pin = Pin(gpio_pin, index) & 0x3F; // Fix possible overflow over 63 gpios + if (!bitRead(pinmode_init[pin / 32], pin % 32)) { + bitSet(pinmode_init[pin / 32], pin % 32); pinMode(pin, OUTPUT); - bitSet(pinmode_init, pin); } digitalWrite(pin, state &1); } From 606200358d0368a6fa33e5f2216703a130723989 Mon Sep 17 00:00:00 2001 From: Nemobi <> Date: Fri, 20 May 2022 10:30:12 +0000 Subject: [PATCH 262/376] Added auth option to wc --- tasmota/settings.h | 2 +- tasmota/xdrv_81_esp32_webcam.ino | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/tasmota/settings.h b/tasmota/settings.h index 9eaa8605c..08c26db60 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -339,7 +339,7 @@ typedef union { uint32_t gainceiling : 3; uint32_t agc_gain: 5; uint32_t special_effect : 3; - uint32_t spare28 : 1; + uint32_t auth : 1; uint32_t spare29 : 1; uint32_t spare30 : 1; uint32_t upgraded : 1; diff --git a/tasmota/xdrv_81_esp32_webcam.ino b/tasmota/xdrv_81_esp32_webcam.ino index fb75a5ffa..3bada5e62 100644 --- a/tasmota/xdrv_81_esp32_webcam.ino +++ b/tasmota/xdrv_81_esp32_webcam.ino @@ -1081,6 +1081,8 @@ void WcInit(void) { #define D_CMND_WC_INIT "Init" #define D_CMND_RTSP "Rtsp" +#define D_CMND_WC_AUTH "Auth" + const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix "|" D_CMND_WC_STREAM "|" D_CMND_WC_RESOLUTION "|" D_CMND_WC_MIRROR "|" D_CMND_WC_FLIP "|" D_CMND_WC_SATURATION "|" D_CMND_WC_BRIGHTNESS "|" D_CMND_WC_CONTRAST "|" D_CMND_WC_SPECIALEFFECT "|" @@ -1088,7 +1090,7 @@ const char kWCCommands[] PROGMEM = D_PRFX_WEBCAM "|" // Prefix D_CMND_WC_AEC_VALUE "|" D_CMND_WC_AE_LEVEL "|" D_CMND_WC_AEC2 "|" D_CMND_WC_AGC "|" D_CMND_WC_AGC_GAIN "|" D_CMND_WC_GAINCEILING "|" D_CMND_WC_RAW_GMA "|" D_CMND_WC_LENC "|" D_CMND_WC_WPC "|" D_CMND_WC_DCW "|" D_CMND_WC_BPC "|" D_CMND_WC_COLORBAR "|" D_CMND_WC_FEATURE "|" - D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT + D_CMND_WC_SETDEFAULTS "|" D_CMND_WC_STATS "|" D_CMND_WC_INIT "|" D_CMND_WC_AUTH #ifdef ENABLE_RTSPSERVER "|" D_CMND_RTSP #endif // ENABLE_RTSPSERVER @@ -1101,7 +1103,7 @@ void (* const WCCommand[])(void) PROGMEM = { &CmndWebcamAELevel, &CmndWebcamAEC2, &CmndWebcamAGC, &CmndWebcamAGCGain, &CmndWebcamGainCeiling, &CmndWebcamGammaCorrect, &CmndWebcamLensCorrect, &CmndWebcamWPC, &CmndWebcamDCW, &CmndWebcamBPC, &CmndWebcamColorbar, &CmndWebcamFeature, &CmndWebcamSetDefaults, - &CmndWebcamStats, &CmndWebcamInit + &CmndWebcamStats, &CmndWebcamInit, &CmndWebcamAuth #ifdef ENABLE_RTSPSERVER , &CmndWebRtsp #endif // ENABLE_RTSPSERVER @@ -1116,7 +1118,7 @@ void CmndWebcam(void) { D_CMND_WC_AE_LEVEL "\":%d,\"" D_CMND_WC_AEC2 "\":%d,\"" D_CMND_WC_AGC "\":%d,\"" D_CMND_WC_AGC_GAIN "\":%d,\"" D_CMND_WC_GAINCEILING "\":%d,\"" D_CMND_WC_RAW_GMA "\":%d,\"" D_CMND_WC_LENC "\":%d,\"" D_CMND_WC_WPC "\":%d,\"" D_CMND_WC_DCW "\":%d,\"" D_CMND_WC_BPC "\":%d,\"" - D_CMND_WC_COLORBAR "\":%d,\"" D_CMND_WC_FEATURE "\":%d" + D_CMND_WC_COLORBAR "\":%d,\"" D_CMND_WC_FEATURE "\":%d,\"" D_CMND_WC_AUTH "\":%d" #ifdef ENABLE_RTSPSERVER ",\"" D_CMND_RTSP "\":%d" #endif // ENABLE_RTSPSERVER @@ -1129,7 +1131,7 @@ void CmndWebcam(void) { Settings->webcam_config2.ae_level -2, Settings->webcam_config.aec2, Settings->webcam_config.agc, Settings->webcam_config2.agc_gain, Settings->webcam_config2.gainceiling, Settings->webcam_config.raw_gma, Settings->webcam_config.lenc, Settings->webcam_config.wpc, Settings->webcam_config.dcw, Settings->webcam_config.bpc, - Settings->webcam_config.colorbar, Settings->webcam_config.feature + Settings->webcam_config.colorbar, Settings->webcam_config.feature, Settings->webcam_config2.auth #ifdef ENABLE_RTSPSERVER , Settings->webcam_config.rtsp #endif // ENABLE_RTSPSERVER @@ -1336,6 +1338,14 @@ void CmndWebcamFeature(void) { ResponseCmndNumber(Settings->webcam_config.feature); } +void CmndWebcamAuth(void){ + if((XdrvMailbox.payload >=0) && (XdrvMailbox.payload <= 1)){ + Settings->webcam_config2.auth = XdrvMailbox.payload; + WcSetOptions(24, Settings->webcam_config2.auth); + } + ResponseCmndNumber(Settings->webcam_config2.auth); +} + void CmndWebcamInit(void) { WcInterruptControl(); ResponseCmndDone(); From d1692efddf81c3d6ad8a723e038910a863f8d59d Mon Sep 17 00:00:00 2001 From: Nemobi Date: Fri, 20 May 2022 14:42:32 +0200 Subject: [PATCH 263/376] Fixed stream redirect --- tasmota/xdrv_81_esp32_webcam.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_81_esp32_webcam.ino b/tasmota/xdrv_81_esp32_webcam.ino index fb75a5ffa..c654d35d5 100644 --- a/tasmota/xdrv_81_esp32_webcam.ino +++ b/tasmota/xdrv_81_esp32_webcam.ino @@ -911,7 +911,7 @@ void HandleWebcamMjpegTask(void) { void HandleWebcamRoot(void) { //CamServer->redirect("http://" + String(ip) + ":81/cam.mjpeg"); - Wc.CamServer->sendHeader("Location", WiFi.localIP().toString() + ":81/cam.mjpeg"); + Wc.CamServer->sendHeader("Location", "/cam.mjpeg"); Wc.CamServer->send(302, "", ""); AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Root called")); } From 76df8580a1db4b9634f0030ed59c037f297ec9fc Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 20 May 2022 17:00:56 +0200 Subject: [PATCH 264/376] Fix safeboot compilation on windows --- pio-tools/post_esp32.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 2e919391b..3678cbf85 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -39,7 +39,7 @@ FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoespressif32") variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") def esp32_create_chip_string(chip): - tasmota_platform = env.subst("$BUILD_DIR").split('/')[-1] + tasmota_platform = env.subst("$BUILD_DIR").split(os.path.sep)[-1] tasmota_platform = tasmota_platform.split('-')[0] if 'tasmota' and chip[3:] not in tasmota_platform: # quick check for a valid name like 'tasmota' + '32c3' print('Unexpected naming conventions in this build environment -> Undefined behavior for further build process!!') @@ -106,7 +106,7 @@ def esp32_create_combined_bin(source, target, env): app_offset = int(row[3],base=16) # elif(row[0] == 'factory'): # factory_offset = int(row[3],base=16) - elif(row[0] == 'spiffs'): + elif(row[0] == 'spiffs'): if esp32_build_filesystem(row[4]): fs_offset = int(row[3],base=16) @@ -152,7 +152,7 @@ def esp32_create_combined_bin(source, target, env): if exists(fs_bin): print(f" - {hex(fs_offset)}| {fs_bin}") cmd += [hex(fs_offset), fs_bin] - env.Replace( + env.Replace( UPLOADERFLAGS=[ "--chip", chip, "--port", '"$UPLOAD_PORT"', From 35860b6f9e92918df14b9e2799aaebff09e76db2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 20 May 2022 17:51:14 +0200 Subject: [PATCH 265/376] Remove empty used from GUI --- tasmota/xdrv_01_webserver.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 55e98e862..2fdcfa4a0 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -2514,8 +2514,11 @@ void HandleInformation(void) } char running[2] = { 0 }; if (part->subtype == cur_part) { running[0] = '*'; } - uint32_t part_used = ((prog_size / 1024) * 100) / part_size; - WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d KB (" D_USED " %d%%)"), part->label, running, part_size, part_used); + WSContentSend_PD(PSTR("}1" D_PARTITION " %s%s}2%d KB"), part->label, running, part_size); + if (prog_size) { + uint32_t part_used = ((prog_size / 1024) * 100) / part_size; + WSContentSend_PD(PSTR(" (" D_USED " %d%%)"), part_used); + } } if ((ESP_PARTITION_TYPE_DATA == part->type) && (ESP_PARTITION_SUBTYPE_DATA_SPIFFS == part->subtype)) { WSContentSend_PD(PSTR("}1" D_PARTITION " fs}2%d KB"), part_size); From 086c4d6371b43485eb2a69c0cbb94d912fd02cc6 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 20 May 2022 21:29:39 +0200 Subject: [PATCH 266/376] Rename OpenHASP to HASPmota --- lib/libesp32/berry/default/be_modtab.c | 12 +- .../{be_lv_openhasp.c => be_lv_haspmota.c} | 140 +++++++++--------- ...v_theme_openhasp.c => lv_theme_haspmota.c} | 6 +- ...v_theme_openhasp.h => lv_theme_haspmota.h} | 6 +- .../generate/be_lvgl_module.c | 6 +- .../lv_binding_berry/mapping/lv_funcs.h | 6 +- .../lv_binding_berry/tools/convert.py | 2 +- .../lv_binding_berry/tools/preprocessor.py | 2 +- .../openhasp.tapp => haspmota/haspmota.tapp} | Bin 60662 -> 60673 bytes .../haspmota_demo.tapp} | Bin 191468 -> 191479 bytes .../haspmota_widgets.tapp} | Bin .../berry/{openhasp => haspmota}/pages.jsonl | 0 .../robotocondensed_latin1.tapp | Bin tasmota/berry/haspmota_src/gen_haspmota.sh | 5 + .../haspmota.tapp} | Bin 60662 -> 60673 bytes .../haspmota_src/haspmota_core/autoexec.be | 7 + .../haspmota_core/haspmota.be} | 72 ++++----- .../haspmota_demo.tapp} | Bin 191468 -> 191479 bytes .../haspmota_demo}/autoexec.be | 6 +- .../haspmota_demo}/lv_tasmota_info.be | 0 .../haspmota_demo}/lv_tasmota_log.be | 0 .../haspmota_demo}/lv_wifi_graph.be | 0 .../haspmota_demo}/noun_Fan_35097_140.png | Bin .../haspmota_demo}/pages.jsonl | 10 +- .../haspmota_demo}/watch_ren_back_240.png | Bin .../haspmota_demo}/watch_ren_hour_240.png | Bin .../haspmota_demo}/watch_ren_min_240.png | Bin .../haspmota_demo}/watch_ren_sec_240.png | Bin .../haspmota_examples}/demo-all.jsonl | 0 .../haspmota_examples}/demo1.jsonl | 0 .../haspmota_examples}/demo2.jsonl | 0 .../haspmota_examples}/demo3.jsonl | 0 .../haspmota_examples}/lv.jsonl | 0 .../haspmota_widgets.tapp} | Bin .../haspmota_widgets}/autoexec.be | 2 +- .../haspmota_widgets}/lv_tasmota_info.be | 0 .../haspmota_widgets}/lv_tasmota_log.be | 0 .../haspmota_widgets}/lv_wifi_graph.be | 0 tasmota/berry/openhasp_src/gen_openhasp.sh | 5 - .../openhasp_src/openhasp_core/autoexec.be | 7 - tasmota/my_user_config.h | 2 +- tasmota/tasmota_configurations_ESP32.h | 4 +- tasmota/xdrv_52_3_berry_lvgl.ino | 6 +- 43 files changed, 153 insertions(+), 153 deletions(-) rename lib/libesp32/berry_tasmota/src/{be_lv_openhasp.c => be_lv_haspmota.c} (99%) rename lib/libesp32_lvgl/LVGL_assets/src/{lv_theme_openhasp.c => lv_theme_haspmota.c} (99%) rename lib/libesp32_lvgl/LVGL_assets/src/{lv_theme_openhasp.h => lv_theme_haspmota.h} (89%) rename tasmota/berry/{openhasp_src/openhasp.tapp => haspmota/haspmota.tapp} (96%) rename tasmota/berry/{openhasp/openhasp_demo.tapp => haspmota/haspmota_demo.tapp} (97%) rename tasmota/berry/{openhasp/openhasp_widgets.tapp => haspmota/haspmota_widgets.tapp} (100%) rename tasmota/berry/{openhasp => haspmota}/pages.jsonl (100%) rename tasmota/berry/{openhasp => haspmota}/robotocondensed_latin1.tapp (100%) create mode 100755 tasmota/berry/haspmota_src/gen_haspmota.sh rename tasmota/berry/{openhasp/openhasp.tapp => haspmota_src/haspmota.tapp} (96%) create mode 100644 tasmota/berry/haspmota_src/haspmota_core/autoexec.be rename tasmota/berry/{openhasp_src/openhasp_core/openhasp.be => haspmota_src/haspmota_core/haspmota.be} (97%) rename tasmota/berry/{openhasp_src/openhasp_demo.tapp => haspmota_src/haspmota_demo.tapp} (97%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/autoexec.be (87%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/lv_tasmota_info.be (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/lv_tasmota_log.be (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/lv_wifi_graph.be (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/noun_Fan_35097_140.png (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/pages.jsonl (92%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/watch_ren_back_240.png (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/watch_ren_hour_240.png (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/watch_ren_min_240.png (100%) rename tasmota/berry/{openhasp_src/openhasp_demo => haspmota_src/haspmota_demo}/watch_ren_sec_240.png (100%) rename tasmota/berry/{openhasp_src/openhasp_examples => haspmota_src/haspmota_examples}/demo-all.jsonl (100%) rename tasmota/berry/{openhasp_src/openhasp_examples => haspmota_src/haspmota_examples}/demo1.jsonl (100%) rename tasmota/berry/{openhasp_src/openhasp_examples => haspmota_src/haspmota_examples}/demo2.jsonl (100%) rename tasmota/berry/{openhasp_src/openhasp_examples => haspmota_src/haspmota_examples}/demo3.jsonl (100%) rename tasmota/berry/{openhasp_src/openhasp_examples => haspmota_src/haspmota_examples}/lv.jsonl (100%) rename tasmota/berry/{openhasp_src/openhasp_widgets.tapp => haspmota_src/haspmota_widgets.tapp} (100%) rename tasmota/berry/{openhasp_src/openhasp_widgets => haspmota_src/haspmota_widgets}/autoexec.be (64%) rename tasmota/berry/{openhasp_src/openhasp_widgets => haspmota_src/haspmota_widgets}/lv_tasmota_info.be (100%) rename tasmota/berry/{openhasp_src/openhasp_widgets => haspmota_src/haspmota_widgets}/lv_tasmota_log.be (100%) rename tasmota/berry/{openhasp_src/openhasp_widgets => haspmota_src/haspmota_widgets}/lv_wifi_graph.be (100%) delete mode 100755 tasmota/berry/openhasp_src/gen_openhasp.sh delete mode 100644 tasmota/berry/openhasp_src/openhasp_core/autoexec.be diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index 5ed4a99e6..d0b71fc4b 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -52,9 +52,9 @@ be_extern_native_module(crc); be_extern_native_module(lv); be_extern_native_module(lv_extra); be_extern_native_module(lv_tasmota); -#ifdef USE_LVGL_OPENHASP -be_extern_native_module(openhasp); -#endif // USE_LVGL_OPENHASP +#ifdef USE_LVGL_HASPMOTA +be_extern_native_module(haspmota); +#endif // USE_LVGL_HASPMOTA #endif // USE_LVGL /* user-defined modules declare start */ @@ -137,9 +137,9 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { &be_native_module(lv), &be_native_module(lv_extra), &be_native_module(lv_tasmota), -#ifdef USE_LVGL_OPENHASP - &be_native_module(openhasp), -#endif // USE_LVGL_OPENHASP +#ifdef USE_LVGL_HASPMOTA + &be_native_module(haspmota), +#endif // USE_LVGL_HASPMOTA #endif // USE_LVGL #ifdef USE_ENERGY_SENSOR &be_native_module(energy), diff --git a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c similarity index 99% rename from lib/libesp32/berry_tasmota/src/be_lv_openhasp.c rename to lib/libesp32/berry_tasmota/src/be_lv_haspmota.c index 1f82d2643..2bb290dca 100644 --- a/lib/libesp32/berry_tasmota/src/be_lv_openhasp.c +++ b/lib/libesp32/berry_tasmota/src/be_lv_haspmota.c @@ -1,10 +1,10 @@ /******************************************************************** - * Tasmota OpenHASP solidified + * Tasmota HASPmota solidified *******************************************************************/ #include "be_constobj.h" #ifdef USE_LVGL -#ifdef USE_LVGL_OPENHASP +#ifdef USE_LVGL_HASPMOTA extern const bclass be_class_lv_anim; extern const bclass be_class_lv_arc; @@ -5847,39 +5847,10 @@ void be_load_lvh_qrcode_class(bvm *vm) { be_pop(vm, 1); } -/******************************************************************** -** Solidified function: _anonymous_ -********************************************************************/ -be_local_closure(openhasp__anonymous_, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_literal("OpenHASP"), - }), - be_str_literal("_anonymous_"), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x5C080200, // 0001 MOVE R2 R1 - 0x7C080000, // 0002 CALL R2 0 - 0x80040400, // 0003 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: do_action ********************************************************************/ -be_local_closure(OpenHASP_do_action, /* name */ +be_local_closure(HASPmota_do_action, /* name */ be_nested_proto( 10, /* nstack */ 3, /* argc */ @@ -5991,7 +5962,7 @@ be_local_closure(OpenHASP_do_action, /* name */ /******************************************************************** ** Solidified function: pages_list_sorted ********************************************************************/ -be_local_closure(OpenHASP_pages_list_sorted, /* name */ +be_local_closure(HASPmota_pages_list_sorted, /* name */ be_nested_proto( 8, /* nstack */ 2, /* argc */ @@ -6071,7 +6042,7 @@ be_local_closure(OpenHASP_pages_list_sorted, /* name */ /******************************************************************** ** Solidified function: get_page_cur ********************************************************************/ -be_local_closure(OpenHASP_get_page_cur, /* name */ +be_local_closure(HASPmota_get_page_cur, /* name */ be_nested_proto( 3, /* nstack */ 1, /* argc */ @@ -6101,7 +6072,7 @@ be_local_closure(OpenHASP_get_page_cur, /* name */ /******************************************************************** ** Solidified function: start ********************************************************************/ -be_local_closure(OpenHASP_start, /* name */ +be_local_closure(HASPmota_start, /* name */ be_nested_proto( 11, /* nstack */ 3, /* argc */ @@ -6131,7 +6102,7 @@ be_local_closure(OpenHASP_start, /* name */ /* K16 */ be_nested_str_literal("font_embedded"), /* K17 */ be_nested_str_literal("robotocondensed"), /* K18 */ be_nested_str_literal("montserrat"), - /* K19 */ be_nested_str_literal("theme_openhasp_init"), + /* K19 */ be_nested_str_literal("theme_haspmota_init"), /* K20 */ be_const_int(0), /* K21 */ be_nested_str_literal("color"), /* K22 */ be_const_int(16711935), @@ -6263,7 +6234,7 @@ be_local_closure(OpenHASP_start, /* name */ /******************************************************************** ** Solidified function: init ********************************************************************/ -be_local_closure(OpenHASP_init, /* name */ +be_local_closure(HASPmota_init, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -6297,7 +6268,7 @@ be_local_closure(OpenHASP_init, /* name */ /******************************************************************** ** Solidified function: register_event ********************************************************************/ -be_local_closure(OpenHASP_register_event, /* name */ +be_local_closure(HASPmota_register_event, /* name */ be_nested_proto( 13, /* nstack */ 3, /* argc */ @@ -6373,7 +6344,7 @@ be_local_closure(OpenHASP_register_event, /* name */ /******************************************************************** ** Solidified function: parse_page ********************************************************************/ -be_local_closure(OpenHASP_parse_page, /* name */ +be_local_closure(HASPmota_parse_page, /* name */ be_nested_proto( 9, /* nstack */ 2, /* argc */ @@ -6465,7 +6436,7 @@ be_local_closure(OpenHASP_parse_page, /* name */ /******************************************************************** ** Solidified function: deinit ********************************************************************/ -be_local_closure(OpenHASP_deinit, /* name */ +be_local_closure(HASPmota_deinit, /* name */ be_nested_proto( 5, /* nstack */ 1, /* argc */ @@ -6512,7 +6483,7 @@ be_local_closure(OpenHASP_deinit, /* name */ /******************************************************************** ** Solidified function: page_dir_to ********************************************************************/ -be_local_closure(OpenHASP_page_dir_to, /* name */ +be_local_closure(HASPmota_page_dir_to, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -6573,7 +6544,7 @@ be_local_closure(OpenHASP_page_dir_to, /* name */ /******************************************************************** ** Solidified function: _load ********************************************************************/ -be_local_closure(OpenHASP__load, /* name */ +be_local_closure(HASPmota__load, /* name */ be_nested_proto( 14, /* nstack */ 2, /* argc */ @@ -6668,7 +6639,7 @@ be_local_closure(OpenHASP__load, /* name */ /******************************************************************** ** Solidified function: parse ********************************************************************/ -be_local_closure(OpenHASP_parse, /* name */ +be_local_closure(HASPmota_parse, /* name */ be_nested_proto( 9, /* nstack */ 2, /* argc */ @@ -6722,7 +6693,7 @@ be_local_closure(OpenHASP_parse, /* name */ /******************************************************************** ** Solidified function: sort ********************************************************************/ -be_local_closure(OpenHASP_sort, /* name */ +be_local_closure(HASPmota_sort, /* name */ be_nested_proto( 6, /* nstack */ 1, /* argc */ @@ -6778,7 +6749,7 @@ be_local_closure(OpenHASP_sort, /* name */ /******************************************************************** ** Solidified function: parse_obj ********************************************************************/ -be_local_closure(OpenHASP_parse_obj, /* name */ +be_local_closure(HASPmota_parse_obj, /* name */ be_nested_proto( 20, /* nstack */ 3, /* argc */ @@ -7022,7 +6993,7 @@ be_local_closure(OpenHASP_parse_obj, /* name */ /******************************************************************** ** Solidified function: event_dispatch ********************************************************************/ -be_local_closure(OpenHASP_event_dispatch, /* name */ +be_local_closure(HASPmota_event_dispatch, /* name */ be_nested_proto( 9, /* nstack */ 2, /* argc */ @@ -7090,27 +7061,27 @@ be_local_closure(OpenHASP_event_dispatch, /* name */ /******************************************************************** -** Solidified class: OpenHASP +** Solidified class: HASPmota ********************************************************************/ -be_local_class(OpenHASP, +be_local_class(HASPmota, 10, NULL, be_nested_map(43, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_literal("lvh_textarea", 41), be_const_class(be_class_lvh_textarea) }, { be_const_key_literal("scr", -1), be_const_var(3) }, - { be_const_key_literal("event_dispatch", 16), be_const_closure(OpenHASP_event_dispatch_closure) }, + { be_const_key_literal("event_dispatch", 16), be_const_closure(HASPmota_event_dispatch_closure) }, { be_const_key_literal("lvh_bar", -1), be_const_class(be_class_lvh_bar) }, { be_const_key_literal("lvh_img", -1), be_const_class(be_class_lvh_img) }, { be_const_key_literal("event", -1), be_const_var(8) }, - { be_const_key_literal("do_action", 33), be_const_closure(OpenHASP_do_action_closure) }, - { be_const_key_literal("pages_list_sorted", -1), be_const_closure(OpenHASP_pages_list_sorted_closure) }, + { be_const_key_literal("do_action", 33), be_const_closure(HASPmota_do_action_closure) }, + { be_const_key_literal("pages_list_sorted", -1), be_const_closure(HASPmota_pages_list_sorted_closure) }, { be_const_key_literal("lvh_btnmatrix", 42), be_const_class(be_class_lvh_btnmatrix) }, - { be_const_key_literal("start", -1), be_const_closure(OpenHASP_start_closure) }, - { be_const_key_literal("init", 5), be_const_closure(OpenHASP_init_closure) }, + { be_const_key_literal("start", -1), be_const_closure(HASPmota_start_closure) }, + { be_const_key_literal("init", 5), be_const_closure(HASPmota_init_closure) }, { be_const_key_literal("lvh_scr", -1), be_const_class(be_class_lvh_scr) }, - { be_const_key_literal("parse_page", -1), be_const_closure(OpenHASP_parse_page_closure) }, - { be_const_key_literal("register_event", 24), be_const_closure(OpenHASP_register_event_closure) }, + { be_const_key_literal("parse_page", -1), be_const_closure(HASPmota_parse_page_closure) }, + { be_const_key_literal("register_event", 24), be_const_closure(HASPmota_register_event_closure) }, { be_const_key_literal("lvh_roller", 34), be_const_class(be_class_lvh_roller) }, { be_const_key_literal("lvh_page", 11), be_const_class(be_class_lvh_page) }, { be_const_key_literal("lvh_page_cur_idx", -1), be_const_var(6) }, @@ -7118,13 +7089,13 @@ be_local_class(OpenHASP, { be_const_key_literal("hres", 38), be_const_var(1) }, { be_const_key_literal("dark", -1), be_const_var(0) }, { be_const_key_literal("lvh_label", 37), be_const_class(be_class_lvh_label) }, - { be_const_key_literal("deinit", 14), be_const_closure(OpenHASP_deinit_closure) }, - { be_const_key_literal("page_dir_to", -1), be_const_closure(OpenHASP_page_dir_to_closure) }, - { be_const_key_literal("parse_obj", -1), be_const_closure(OpenHASP_parse_obj_closure) }, + { be_const_key_literal("deinit", 14), be_const_closure(HASPmota_deinit_closure) }, + { be_const_key_literal("page_dir_to", -1), be_const_closure(HASPmota_page_dir_to_closure) }, + { be_const_key_literal("parse_obj", -1), be_const_closure(HASPmota_parse_obj_closure) }, { be_const_key_literal("lvh_spinner", -1), be_const_class(be_class_lvh_spinner) }, - { be_const_key_literal("_load", -1), be_const_closure(OpenHASP__load_closure) }, + { be_const_key_literal("_load", -1), be_const_closure(HASPmota__load_closure) }, { be_const_key_literal("lvh_qrcode", -1), be_const_class(be_class_lvh_qrcode) }, - { be_const_key_literal("parse", -1), be_const_closure(OpenHASP_parse_closure) }, + { be_const_key_literal("parse", -1), be_const_closure(HASPmota_parse_closure) }, { be_const_key_literal("lvh_pages", 2), be_const_var(5) }, { be_const_key_literal("lvh_line", -1), be_const_class(be_class_lvh_line) }, { be_const_key_literal("lvh_switch", -1), be_const_class(be_class_lvh_switch) }, @@ -7132,32 +7103,61 @@ be_local_class(OpenHASP, { be_const_key_literal("r16", -1), be_const_var(4) }, { be_const_key_literal("def_templ_name", -1), be_nested_str_literal("pages.jsonl") }, { be_const_key_literal("lvh_obj", 19), be_const_class(be_class_lvh_obj) }, - { be_const_key_literal("sort", 23), be_const_static_closure(OpenHASP_sort_closure) }, + { be_const_key_literal("sort", 23), be_const_static_closure(HASPmota_sort_closure) }, { be_const_key_literal("lvh_dropdown", -1), be_const_class(be_class_lvh_dropdown) }, { be_const_key_literal("lvh_checkbox", -1), be_const_class(be_class_lvh_checkbox) }, { be_const_key_literal("lvh_slider", -1), be_const_class(be_class_lvh_slider) }, { be_const_key_literal("vres", -1), be_const_var(2) }, { be_const_key_literal("lvh_btn", -1), be_const_class(be_class_lvh_btn) }, { be_const_key_literal("event_cb", -1), be_const_var(9) }, - { be_const_key_literal("get_page_cur", -1), be_const_closure(OpenHASP_get_page_cur_closure) }, + { be_const_key_literal("get_page_cur", -1), be_const_closure(HASPmota_get_page_cur_closure) }, })), - be_str_literal("OpenHASP") + be_str_literal("HASPmota") ); /******************************************************************** -** Solidified module: openhasp +** Solidified function: _anonymous_ ********************************************************************/ -be_local_module(openhasp, - "openhasp", +be_local_closure(haspmota__anonymous_, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("HASPmota"), + }), + be_str_literal("_anonymous_"), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x5C080200, // 0001 MOVE R2 R1 + 0x7C080000, // 0002 CALL R2 0 + 0x80040400, // 0003 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified module: haspmota +********************************************************************/ +be_local_module(haspmota, + "haspmota", be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_literal("OpenHASP", -1), be_const_class(be_class_OpenHASP) }, - { be_const_key_literal("init", 0), be_const_closure(openhasp__anonymous__closure) }, + { be_const_key_literal("HASPmota", -1), be_const_class(be_class_HASPmota) }, + { be_const_key_literal("init", -1), be_const_closure(haspmota__anonymous__closure) }, })) ); -BE_EXPORT_VARIABLE be_define_const_native_module(openhasp); +BE_EXPORT_VARIABLE be_define_const_native_module(haspmota); /********************************************************************/ -#endif // USE_LVGL_OPENHASP +#endif // USE_LVGL_HASPMOTA #endif // USE_LVGL \ No newline at end of file diff --git a/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.c b/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.c similarity index 99% rename from lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.c rename to lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.c index d0f78a955..96f4c4c5e 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.c +++ b/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.c @@ -8,7 +8,7 @@ *********************/ #include "../lvgl.h" /*To see all the widgets*/ -#include "lv_theme_openhasp.h" +#include "lv_theme_haspmota.h" #include "misc/lv_gc.h" /********************* @@ -625,7 +625,7 @@ static void style_init(void) * GLOBAL FUNCTIONS **********************/ -lv_theme_t * lv_theme_openhasp_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font) +lv_theme_t * lv_theme_haspmota_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font) { /*This trick is required only to avoid the garbage collection of @@ -658,7 +658,7 @@ lv_theme_t * lv_theme_openhasp_init(lv_disp_t * disp, lv_color_t color_primary, return (lv_theme_t *)&theme; } -bool lv_theme_openhasp_is_inited(void) +bool lv_theme_haspmota_is_inited(void) { return inited; } diff --git a/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.h b/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.h similarity index 89% rename from lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.h rename to lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.h index f1aacfe04..7276f485d 100644 --- a/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_openhasp.h +++ b/lib/libesp32_lvgl/LVGL_assets/src/lv_theme_haspmota.h @@ -1,5 +1,5 @@ /** - * @file lv_theme_openhasp.h + * @file lv_theme_haspmota.h * */ @@ -40,9 +40,9 @@ typedef enum { * @param font pointer to a font to use. * @return a pointer to reference this theme later */ -lv_theme_t * lv_theme_openhasp_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font); +lv_theme_t * lv_theme_haspmota_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font); -bool lv_theme_openhasp_is_inited(void); +bool lv_theme_haspmota_is_inited(void); /********************** * MACROS diff --git a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c index aec4cbf45..9f333f36b 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c +++ b/lib/libesp32_lvgl/lv_binding_berry/generate/be_lvgl_module.c @@ -9,7 +9,7 @@ #include "lvgl.h" #include "be_mapping.h" #include "lv_berry.h" -#include "lv_theme_openhasp.h" +#include "lv_theme_haspmota.h" extern int lv0_member(bvm *vm); // resolve virtual members extern int lv0_load_font(bvm *vm); @@ -163,9 +163,9 @@ const be_ntv_func_def_t lv_func[] = { { "theme_get_font_normal", { (const void*) &lv_theme_get_font_normal, "lv.lv_font", "(lv.lv_obj)" } }, { "theme_get_font_small", { (const void*) &lv_theme_get_font_small, "lv.lv_font", "(lv.lv_obj)" } }, { "theme_get_from_obj", { (const void*) &lv_theme_get_from_obj, "lv.lv_theme", "(lv.lv_obj)" } }, + { "theme_haspmota_init", { (const void*) &lv_theme_haspmota_init, "lv.lv_theme", "(lv.lv_disp)(lv.lv_color)(lv.lv_color)b(lv.lv_font)" } }, + { "theme_haspmota_is_inited", { (const void*) &lv_theme_haspmota_is_inited, "b", "" } }, { "theme_mono_init", { (const void*) &lv_theme_mono_init, "lv.lv_theme", "(lv.lv_disp)b(lv.lv_font)" } }, - { "theme_openhasp_init", { (const void*) &lv_theme_openhasp_init, "lv.lv_theme", "(lv.lv_disp)(lv.lv_color)(lv.lv_color)b(lv.lv_font)" } }, - { "theme_openhasp_is_inited", { (const void*) &lv_theme_openhasp_is_inited, "b", "" } }, { "theme_set_apply_cb", { (const void*) &lv_theme_set_apply_cb, "", "(lv.lv_theme)^lv_theme_apply_cb^" } }, { "theme_set_parent", { (const void*) &lv_theme_set_parent, "", "(lv.lv_theme)(lv.lv_theme)" } }, { "timer_create", { (const void*) &lv_timer_create, "lv.lv_timer", "^lv_timer_cb^i." } }, diff --git a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h index 9827808e3..46c91aa8f 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h +++ b/lib/libesp32_lvgl/lv_binding_berry/mapping/lv_funcs.h @@ -1151,7 +1151,7 @@ void lv_textarea_cursor_left(lv_obj_t * obj) void lv_textarea_cursor_down(lv_obj_t * obj) void lv_textarea_cursor_up(lv_obj_t * obj) -// ../../LVGL_assets/src/lv_theme_openhasp.h -lv_theme_t * lv_theme_openhasp_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font) -bool lv_theme_openhasp_is_inited(void) +// ../../LVGL_assets/src/lv_theme_haspmota.h +lv_theme_t * lv_theme_haspmota_init(lv_disp_t * disp, lv_color_t color_primary, lv_color_t color_secondary, bool dark, const lv_font_t * font) +bool lv_theme_haspmota_is_inited(void) diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py index c305bdc34..11f3a001c 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/convert.py @@ -741,7 +741,7 @@ print("""/******************************************************************** #include "lvgl.h" #include "be_mapping.h" #include "lv_berry.h" -#include "lv_theme_openhasp.h" +#include "lv_theme_haspmota.h" extern int lv0_member(bvm *vm); // resolve virtual members extern int lv0_load_font(bvm *vm); diff --git a/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py b/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py index 892a9cc32..d9b56084c 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py +++ b/lib/libesp32_lvgl/lv_binding_berry/tools/preprocessor.py @@ -78,7 +78,7 @@ lv_fun_globs = [ #"**/*.h", ] headers_names = list_files(lv_src_prefix, lv_fun_globs) -headers_names += list_files("../../LVGL_assets/src/", ["lv_theme_openhasp.h"]) +headers_names += list_files("../../LVGL_assets/src/", ["lv_theme_haspmota.h"]) # headers_names += ["lv_pre_style.h"] # for LVGL v7, add pre-generated style functions from C preprocessor # unit test diff --git a/tasmota/berry/openhasp_src/openhasp.tapp b/tasmota/berry/haspmota/haspmota.tapp similarity index 96% rename from tasmota/berry/openhasp_src/openhasp.tapp rename to tasmota/berry/haspmota/haspmota.tapp index f14e884386fa460d2319108f8e0d3608ff76d483..4ea6c2bdfff20f3b04f542e345543be615da4efd 100644 GIT binary patch delta 1058 zcmaJ=%WD%s9Nz72LpwpR(9+sg{gG9g)Mn!Y1rZM#EYVO%O>%B`)1}#Vw;Pg48>&$1 zrQ!>9Y!y6OA3^ls=FmT(M?o)o@g!msMG!lP=XV=d$b72L1MKQ0Nu3GIorLkyCXen`srK9~T$&pY)b1K|z$iih>}w(@+IU zSSw=4Yo&tiU=1ly&~lU7xB)XJ&Ql0bw7FZwTA^?ZX3YW|icUau|5gu2BRQvN#QKqG z7o1J(H=fx!R!Q9`9F9bgKM3Gjrt5q5$%{2X@UAxqkN-2s`AZA>^5uUFk~oo04bc%G zN@m1Z3(F%<#cMGJHue9%_Q_<^1D{}r)YHibkmYD&;XVdQQhL|Mfa-PNEs@0Ky+@dJ z0C2HvL=cK9Xj&`s6~S?^ow2fIghMPe6hY*ZoFR$8Fo`!;TR0yzx`{wV;ud$cbv5Xt zJ00n59FfnV+Z?zzm1K~Q;=Wb;I(=XJ;I~sg>bPQvKDu!AaX?`Wz_{h;ngxzNVdO9Z zQ1}=mb?YO~B7=)}eeiw}cxBSI^pbnr4@*b4?_uPlfE_TWOl)eFIcosU8^CIiovJ9S(+BAnggjTQANZq?@&-RZ3$UBW$(q{o2qzo_lZo4cf_E{Ml$8r=#zX zCDz(?UYy8vo#&IO`bi(G)Z@Du*(hzqYs1NV@5`x4ccX_Fq(8jav`gBmU2?Y3?}?Pm lHF^*Kt%EMA)!%1%{s0v(tG6NVWs6tcT`KQ_Jf@z2tfAlPCT!u6|#Jb!vhEm8Tq5OPNB zXkg0ZiFkfJ1M`ypkDSRPGe%z4g*S0?6~%o4R!SD@T0%QM3{EH}FBj-oN%-5C1vw~v zT*N@=0B!A_ZQT*F-?g%n-L8g~nL_~pf^v-~xCN$hBBvw2kE!|sM7-QXW?erTxGOuy zSyz<2xBvij?&mqx4 z`TRY%%o2e~9jl5Cu{wa_7JyLZJt2KpK5;7&9lPd$FJq8LCf@PaoGHwVZ(JB;&ikQ- zp_b7sP0_Ux1g#W;jH7?4nbk5$KqBrKnY`V%m@za7do&5f93)C}E9tuPnFlLuxEpo4 zLoOCu9O_|l-zttK>fZw|uI>b%ARP{iLRL(D;AxWuWtE$f;qrC|JS*?$Wq$grso|78 zW$u;Un#jtT8HiK<06>`p0PKQoWh5-twMwZVe_n&iXbS+(X Wmc`tIP%lVykI1_Uba&Y=hVUC)V1W_< diff --git a/tasmota/berry/openhasp/openhasp_demo.tapp b/tasmota/berry/haspmota/haspmota_demo.tapp similarity index 97% rename from tasmota/berry/openhasp/openhasp_demo.tapp rename to tasmota/berry/haspmota/haspmota_demo.tapp index aac2e596797e591c167663d041dd031899eec205..313b3158e03523b531a1223420d5f4f3b82a19a9 100644 GIT binary patch delta 1577 zcmZuxS!fec6rFd|*g7##QE^FZpGMnsOWi8e4eNs1Hnh?d^~ZM7jwUtj#AYIG6~qN% zD`;cT_aXS>_95aDWkkh(2%^Og!KJ7mewj2a>W>@J>dfeS)-Rcx0$vJejA<+vvp#$|1|Yytj{+XR&t8zC)Hr&vzC@#}Zp^qZ$2 zo`@`T%I+OPC?b~PxfD*GLeDK0Rehqv>dyYHFmca5J9*psG+TG{+Y6~9dCwlU>)=91 z0Ry)?dUJFz<0_>f**}O}$<^~lXO?KKDcX%vS8_Q{TUu+v!cH;bX^Ti5A=Vl-d2-9D zPqrMU%~x#!W+kq9rzPatZ6<(R%D|+==UT4`O*DHqF(7%(D#9N7^%7-I(F3BRe+4Lmqi93!1}xw3&G_DU z`DupZw563zE29&!uP^35cQodYcG)L(vTzF$uL%mlW4O~XNW2l@JLk^Fj zW9*>ynfc$y{2C^jjZ}@J3kJo9apagzeSAm~THS@zBy)bC)MRRTG#T22o}3Bu7gMwp z%biiNi08{({2rl`4Iy5M+ojfMNOZI5y15%Rqa4aY`uo7AnF%XU1%GO@EG{Hrs;GH4KFNCnu#6!&^l>4thX1B7 z$ovtgCp`EM@+Je7j7*QI9QgyO`1cae(4Twl@7#gxF=W2dR?ebcY4TtM@Pzy{s6jsg D|0+?| delta 1572 zcmZuxTWAzl7@qS_)}%8oL`?CLs0TNi&23{^BiL3^t45P78*#m~NX=|AYc@_Y%kHcs zdGLaw_@K?Y=pp!MZ3#s*Zec`9&=(0oM5!9YzG||YAf;fvw6Q%idd@i2g|p26{r~y? z`*|@gPmjwDt<7SABv`+TZG+)0@Qmw&D8Js4@fTj(9F1Jx9L3KqVBS~5Kyqjd`LgTErx#RH^0541>+hF~1;IL2RpQD%H5uqi>OGoW z70WR_*XnwKcjg;u#S~B%Zv@fts4g;qx7VDWdRkuM1oLILg&awcF&+Xo&ouO2A$^J zwFl*6bMkhAmpmFIf9`g&PZXC!o4Dg%pnhq z%8uAK2ex~;NbWBN!X-1g1e%@kFmF{s#XLv*d_BC{AeWsWIwZ|v0-dg-01v_7F#+gpng)_*#(jGyiD^2cA L0iIPd3DoF6tt~gR diff --git a/tasmota/berry/openhasp/openhasp_widgets.tapp b/tasmota/berry/haspmota/haspmota_widgets.tapp similarity index 100% rename from tasmota/berry/openhasp/openhasp_widgets.tapp rename to tasmota/berry/haspmota/haspmota_widgets.tapp diff --git a/tasmota/berry/openhasp/pages.jsonl b/tasmota/berry/haspmota/pages.jsonl similarity index 100% rename from tasmota/berry/openhasp/pages.jsonl rename to tasmota/berry/haspmota/pages.jsonl diff --git a/tasmota/berry/openhasp/robotocondensed_latin1.tapp b/tasmota/berry/haspmota/robotocondensed_latin1.tapp similarity index 100% rename from tasmota/berry/openhasp/robotocondensed_latin1.tapp rename to tasmota/berry/haspmota/robotocondensed_latin1.tapp diff --git a/tasmota/berry/haspmota_src/gen_haspmota.sh b/tasmota/berry/haspmota_src/gen_haspmota.sh new file mode 100755 index 000000000..c81c0fdac --- /dev/null +++ b/tasmota/berry/haspmota_src/gen_haspmota.sh @@ -0,0 +1,5 @@ +# generate all haspmota tapp files +rm haspmota.tapp; zip -j -0 haspmota.tapp haspmota_core/* +rm haspmota_demo.tapp ; zip -j -0 haspmota_demo.tapp haspmota_demo/* haspmota_core/haspmota.be +cp haspmota.tapp ../haspmota +cp haspmota_demo.tapp ../haspmota diff --git a/tasmota/berry/openhasp/openhasp.tapp b/tasmota/berry/haspmota_src/haspmota.tapp similarity index 96% rename from tasmota/berry/openhasp/openhasp.tapp rename to tasmota/berry/haspmota_src/haspmota.tapp index f14e884386fa460d2319108f8e0d3608ff76d483..4ea6c2bdfff20f3b04f542e345543be615da4efd 100644 GIT binary patch delta 1058 zcmaJ=%WD%s9Nz72LpwpR(9+sg{gG9g)Mn!Y1rZM#EYVO%O>%B`)1}#Vw;Pg48>&$1 zrQ!>9Y!y6OA3^ls=FmT(M?o)o@g!msMG!lP=XV=d$b72L1MKQ0Nu3GIorLkyCXen`srK9~T$&pY)b1K|z$iih>}w(@+IU zSSw=4Yo&tiU=1ly&~lU7xB)XJ&Ql0bw7FZwTA^?ZX3YW|icUau|5gu2BRQvN#QKqG z7o1J(H=fx!R!Q9`9F9bgKM3Gjrt5q5$%{2X@UAxqkN-2s`AZA>^5uUFk~oo04bc%G zN@m1Z3(F%<#cMGJHue9%_Q_<^1D{}r)YHibkmYD&;XVdQQhL|Mfa-PNEs@0Ky+@dJ z0C2HvL=cK9Xj&`s6~S?^ow2fIghMPe6hY*ZoFR$8Fo`!;TR0yzx`{wV;ud$cbv5Xt zJ00n59FfnV+Z?zzm1K~Q;=Wb;I(=XJ;I~sg>bPQvKDu!AaX?`Wz_{h;ngxzNVdO9Z zQ1}=mb?YO~B7=)}eeiw}cxBSI^pbnr4@*b4?_uPlfE_TWOl)eFIcosU8^CIiovJ9S(+BAnggjTQANZq?@&-RZ3$UBW$(q{o2qzo_lZo4cf_E{Ml$8r=#zX zCDz(?UYy8vo#&IO`bi(G)Z@Du*(hzqYs1NV@5`x4ccX_Fq(8jav`gBmU2?Y3?}?Pm lHF^*Kt%EMA)!%1%{s0v(tG6NVWs6tcT`KQ_Jf@z2tfAlPCT!u6|#Jb!vhEm8Tq5OPNB zXkg0ZiFkfJ1M`ypkDSRPGe%z4g*S0?6~%o4R!SD@T0%QM3{EH}FBj-oN%-5C1vw~v zT*N@=0B!A_ZQT*F-?g%n-L8g~nL_~pf^v-~xCN$hBBvw2kE!|sM7-QXW?erTxGOuy zSyz<2xBvij?&mqx4 z`TRY%%o2e~9jl5Cu{wa_7JyLZJt2KpK5;7&9lPd$FJq8LCf@PaoGHwVZ(JB;&ikQ- zp_b7sP0_Ux1g#W;jH7?4nbk5$KqBrKnY`V%m@za7do&5f93)C}E9tuPnFlLuxEpo4 zLoOCu9O_|l-zttK>fZw|uI>b%ARP{iLRL(D;AxWuWtE$f;qrC|JS*?$Wq$grso|78 zW$u;Un#jtT8HiK<06>`p0PKQoWh5-twMwZVe_n&iXbS+(X Wmc`tIP%lVykI1_Uba&Y=hVUC)V1W_< diff --git a/tasmota/berry/haspmota_src/haspmota_core/autoexec.be b/tasmota/berry/haspmota_src/haspmota_core/autoexec.be new file mode 100644 index 000000000..138301eab --- /dev/null +++ b/tasmota/berry/haspmota_src/haspmota_core/autoexec.be @@ -0,0 +1,7 @@ +# start haspmota +# package with +# rm haspmota.tapp; zip -j -0 haspmota.tapp haspmota_core/* +import haspmota + +# defer start to make sure all modules and tapp applications were loaded first +tasmota.set_timer(1000, /-> haspmota.start()) diff --git a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be similarity index 97% rename from tasmota/berry/openhasp_src/openhasp_core/openhasp.be rename to tasmota/berry/haspmota_src/haspmota_core/haspmota.be index d4de2b209..2e101cef3 100644 --- a/tasmota/berry/openhasp_src/openhasp_core/openhasp.be +++ b/tasmota/berry/haspmota_src/haspmota_core/haspmota.be @@ -1,19 +1,19 @@ -# OpenHASP compatibility module +# HASPMota - OpenHASP compatibility module # -# use `import openhasp` and set the JSONL definitions in `pages.jsonl` +# use `import haspmota` and set the JSONL definitions in `pages.jsonl` # # As an optimization `0 #- lv.PART_MAIN | lv.STATE_DEFAULT -#` is replaced with `0` # -# rm openhasp.tapp; zip -j -0 openhasp.tapp openhasp_core/* +# rm haspmota.tapp; zip -j -0 haspmota.tapp haspmota_core/* ################################################################################# # How to solidify (needs an ESP32 with PSRAM) #- import path -path.remove("openhasp.bec") +path.remove("haspmota.bec") import solidify -var openhasp -load('openhasp.be') +var haspmota +load('haspmota.be') var classes = [ "page", "obj", "scr", @@ -23,12 +23,12 @@ var classes = [ "qrcode" ] for c:classes - solidify.dump(openhasp.OpenHASP.("lvh_"+c), true) + solidify.dump(haspmota.HASPmota.("lvh_"+c), true) end -solidify.dump(openhasp, true) +solidify.dump(haspmota, true) -# -var openhasp = module("openhasp") +var haspmota = module("haspmota") ################################################################################# ################################################################################# @@ -37,7 +37,7 @@ var openhasp = module("openhasp") # Provide a mapping for virtual members # Stores the associated page and object id # -# Adds specific virtual members used by OpenHASP +# Adds specific virtual members used by HASPmota ################################################################################# ################################################################################# class lvh_obj @@ -62,7 +62,7 @@ class lvh_obj # and the Berry or LVGL attribute to set # # We try to map directly an attribute to the LVGL - # Ex: OpenHASP attribute `w` is mapped to LVGL `width` + # Ex: HASPmota attribute `w` is mapped to LVGL `width` # # If mapping is null, we use set_X and get_X from our own class static _attr_map = { @@ -150,7 +150,7 @@ class lvh_obj var _lv_obj # native lvgl object var _lv_label # sub-label if exists var _page # parent page object - var _action # value of the OpenHASP `action` attribute, shouldn't be called `self.action` since we want to trigger the set/member functions + var _action # value of the HASPmota `action` attribute, shouldn't be called `self.action` since we want to trigger the set/member functions #==================================================================== # Rule engine to map value and text to rules @@ -242,10 +242,10 @@ class lvh_obj end #==================================================================== - # init OpenHASP object from its jsonl definition + # init HASPmota object from its jsonl definition # # arg1: LVGL parent object (used to create a sub-object) - # arg2: `jline` JSONL definition of the object from OpenHASP template (used in sub-classes) + # arg2: `jline` JSONL definition of the object from HASPmota template (used in sub-classes) # arg3: (opt) LVGL object if it already exists and was created prior to init() #==================================================================== def init(parent, page, jline, obj) @@ -323,7 +323,7 @@ class lvh_obj # the callback avoids doing anything sophisticated in the cb # defer the actual action to the Tasmota event loop # print("-> CB fired","self",self,"obj",obj,"event",event.tomap(),"code",event.code) - var oh = self._page._oh # openhasp global object + var oh = self._page._oh # haspmota global object var code = event.code # materialize to a local variable, otherwise the value can change (and don't capture event object) if self.action != "" && code == lv.EVENT_CLICKED # if clicked and action is declared, do the page change event @@ -507,7 +507,7 @@ class lvh_obj #==================================================================== # `text_font` # - # For OpenHASP compatiblity, default to "robotocondensed-latin1" + # For HASPmota compatiblity, default to "robotocondensed-latin1" # However we propose an extension to allow for other font names # # Arg1: (int) font size for `robotocondensed-latin1` @@ -1104,7 +1104,7 @@ class lvh_dropdown : lvh_obj end end - # direction needs a conversion from OpenHASP numbers and LVGL's + # direction needs a conversion from HASPmota numbers and LVGL's def set_direction(t) # 0 = down, 1 = up, 2 = left, 3 = right self._lv_obj.set_dir(self._dir[int(t)]) @@ -1119,7 +1119,7 @@ class lvh_dropdown : lvh_obj return -1 end - # show_selected (bool) is a OpenHASP addition + # show_selected (bool) is a HASPmota addition # only meaningful if set to `true`, setting to false requires a call to `set_text` def set_show_selected(t) if t @@ -1159,22 +1159,22 @@ class lvh_page var _obj_id # (map) of `lvh_obj` objects by id numbers var _page_id # (int) id number of this page var _lv_scr # (lv_obj) lvgl screen object - var _oh # OpenHASP global object - # openhasp attributes for page are on item `#0` + var _oh # HASPmota global object + # haspmota attributes for page are on item `#0` var prev, next, back # (int) id values for `prev`, `next`, `back` buttons #==================================================================== # `init` # - # arg1: `page_number` (int) OpenHASP page id + # arg1: `page_number` (int) HASPmota page id # defaults to `1` if not specified # page 0 is special, visible on all pages. Internally uses `layer_top` - # arg2: `oh` global OpenHASP monad object - # page_number: openhasp page number, defaults to `1` if not specified + # arg2: `oh` global HASPmota monad object + # page_number: haspmota page number, defaults to `1` if not specified #==================================================================== def init(page_number, oh) import global - self._oh = oh # memorize OpenHASP parent object + self._oh = oh # memorize HASPmota parent object # if no parameter, default to page #1 page_number = int(page_number) @@ -1283,17 +1283,17 @@ end ################################################################################# # -# class `OpenHASP` to initialize the OpenHASP parsing +# class `HASPmota` to initialize the HASPmota parsing # ################################################################################# # main class controller, meant to be a singleton and the only externally used class -class OpenHASP +class HASPmota var dark # (bool) use dark theme? var hres, vres # (int) resolution var scr # (lv_obj) default LVGL screen var r16 # (lv_font) robotocondensed fonts size 16 - # openhasp objects + # haspmota objects var lvh_pages # (list of lvg_page) list of pages var lvh_page_cur_idx # (int) current page index number # regex patterns @@ -1376,8 +1376,8 @@ class OpenHASP self.r16 = lv.font_embedded("montserrat", 14) # TODO what if does not exist end - # set the theme for OpenHASP - var th2 = lv.theme_openhasp_init(0, lv.color(0xFF00FF), lv.color(0x303030), self.dark, self.r16) + # set the theme for HASPmota + var th2 = lv.theme_haspmota_init(0, lv.color(0xFF00FF), lv.color(0x303030), self.dark, self.r16) self.scr.get_disp().set_theme(th2) self.scr.set_style_bg_color(self.dark ? lv.color(0x000000) : lv.color(0xFFFFFF),0) # set background to white # apply theme to layer_top, but keep it transparent @@ -1675,7 +1675,7 @@ class OpenHASP return end - # extract openhasp class, prefix with `lvh_`. Ex: `btn` becomes `lvh_btn` + # extract haspmota class, prefix with `lvh_`. Ex: `btn` becomes `lvh_btn` # extract parent var parent_lvgl var parent_id = int(jline.find("parentid")) @@ -1746,20 +1746,20 @@ class OpenHASP end end end -openhasp.OpenHASP = OpenHASP +haspmota.HASPmota = HASPmota ################################################################################# # General module initilization ################################################################################# -# automatically instanciate the OpenHASP() monad +# automatically instanciate the HASPmota() monad # note: value is cached in the module cache -# and is returned whenever you call `import openhasp` again +# and is returned whenever you call `import haspmota` again # This means that the object is never garbage collected # -openhasp.init = def (m) # `init(m)` is called during first `import openhasp` - var oh = m.OpenHASP +haspmota.init = def (m) # `init(m)` is called during first `import haspmota` + var oh = m.HASPmota return oh() end -return openhasp +return haspmota diff --git a/tasmota/berry/openhasp_src/openhasp_demo.tapp b/tasmota/berry/haspmota_src/haspmota_demo.tapp similarity index 97% rename from tasmota/berry/openhasp_src/openhasp_demo.tapp rename to tasmota/berry/haspmota_src/haspmota_demo.tapp index aac2e596797e591c167663d041dd031899eec205..313b3158e03523b531a1223420d5f4f3b82a19a9 100644 GIT binary patch delta 1577 zcmZuxS!fec6rFd|*g7##QE^FZpGMnsOWi8e4eNs1Hnh?d^~ZM7jwUtj#AYIG6~qN% zD`;cT_aXS>_95aDWkkh(2%^Og!KJ7mewj2a>W>@J>dfeS)-Rcx0$vJejA<+vvp#$|1|Yytj{+XR&t8zC)Hr&vzC@#}Zp^qZ$2 zo`@`T%I+OPC?b~PxfD*GLeDK0Rehqv>dyYHFmca5J9*psG+TG{+Y6~9dCwlU>)=91 z0Ry)?dUJFz<0_>f**}O}$<^~lXO?KKDcX%vS8_Q{TUu+v!cH;bX^Ti5A=Vl-d2-9D zPqrMU%~x#!W+kq9rzPatZ6<(R%D|+==UT4`O*DHqF(7%(D#9N7^%7-I(F3BRe+4Lmqi93!1}xw3&G_DU z`DupZw563zE29&!uP^35cQodYcG)L(vTzF$uL%mlW4O~XNW2l@JLk^Fj zW9*>ynfc$y{2C^jjZ}@J3kJo9apagzeSAm~THS@zBy)bC)MRRTG#T22o}3Bu7gMwp z%biiNi08{({2rl`4Iy5M+ojfMNOZI5y15%Rqa4aY`uo7AnF%XU1%GO@EG{Hrs;GH4KFNCnu#6!&^l>4thX1B7 z$ovtgCp`EM@+Je7j7*QI9QgyO`1cae(4Twl@7#gxF=W2dR?ebcY4TtM@Pzy{s6jsg D|0+?| delta 1572 zcmZuxTWAzl7@qS_)}%8oL`?CLs0TNi&23{^BiL3^t45P78*#m~NX=|AYc@_Y%kHcs zdGLaw_@K?Y=pp!MZ3#s*Zec`9&=(0oM5!9YzG||YAf;fvw6Q%idd@i2g|p26{r~y? z`*|@gPmjwDt<7SABv`+TZG+)0@Qmw&D8Js4@fTj(9F1Jx9L3KqVBS~5Kyqjd`LgTErx#RH^0541>+hF~1;IL2RpQD%H5uqi>OGoW z70WR_*XnwKcjg;u#S~B%Zv@fts4g;qx7VDWdRkuM1oLILg&awcF&+Xo&ouO2A$^J zwFl*6bMkhAmpmFIf9`g&PZXC!o4Dg%pnhq z%8uAK2ex~;NbWBN!X-1g1e%@kFmF{s#XLv*d_BC{AeWsWIwZ|v0-dg-01v_7F#+gpng)_*#(jGyiD^2cA L0iIPd3DoF6tt~gR diff --git a/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be b/tasmota/berry/haspmota_src/haspmota_demo/autoexec.be similarity index 87% rename from tasmota/berry/openhasp_src/openhasp_demo/autoexec.be rename to tasmota/berry/haspmota_src/haspmota_demo/autoexec.be index 0d3a90376..0bc19a917 100644 --- a/tasmota/berry/openhasp_src/openhasp_demo/autoexec.be +++ b/tasmota/berry/haspmota_src/haspmota_demo/autoexec.be @@ -1,5 +1,5 @@ # OpenHASP demo -# rm openhasp_demo.tapp ; zip -j -0 openhasp_demo.tapp openhasp_demo/* openhasp_core/openhasp.be +# rm haspmota_demo.tapp ; zip -j -0 haspmota_demo.tapp haspmota_demo/* haspmota_core/haspmota.be if !tasmota.memory().contains("psram") print("HSP: Error: OpenHASP demo requires PSRAM") @@ -10,8 +10,8 @@ import lv_tasmota_log import lv_tasmota_info import lv_wifi_graph -import openhasp -openhasp.start(false, "openhasp_demo.tapp#pages.jsonl") +import haspmota +haspmota.start(false, "haspmota_demo.tapp#pages.jsonl") var prev_day = -1 def set_watch() diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be b/tasmota/berry/haspmota_src/haspmota_demo/lv_tasmota_info.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_info.be rename to tasmota/berry/haspmota_src/haspmota_demo/lv_tasmota_info.be diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be b/tasmota/berry/haspmota_src/haspmota_demo/lv_tasmota_log.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/lv_tasmota_log.be rename to tasmota/berry/haspmota_src/haspmota_demo/lv_tasmota_log.be diff --git a/tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be b/tasmota/berry/haspmota_src/haspmota_demo/lv_wifi_graph.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/lv_wifi_graph.be rename to tasmota/berry/haspmota_src/haspmota_demo/lv_wifi_graph.be diff --git a/tasmota/berry/openhasp_src/openhasp_demo/noun_Fan_35097_140.png b/tasmota/berry/haspmota_src/haspmota_demo/noun_Fan_35097_140.png similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/noun_Fan_35097_140.png rename to tasmota/berry/haspmota_src/haspmota_demo/noun_Fan_35097_140.png diff --git a/tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl b/tasmota/berry/haspmota_src/haspmota_demo/pages.jsonl similarity index 92% rename from tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl rename to tasmota/berry/haspmota_src/haspmota_demo/pages.jsonl index 12cd03736..701cc32c9 100644 --- a/tasmota/berry/openhasp_src/openhasp_demo/pages.jsonl +++ b/tasmota/berry/haspmota_src/haspmota_demo/pages.jsonl @@ -36,16 +36,16 @@ {"page":4,"comment":"---------- Page 4 - fan animation ----------"} {"id":0,"bg_color":"#0000A0","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#FFFFFF"} -{"id":11,"obj":"img","src":"A:/openhasp_demo.tapp#noun_Fan_35097_140.png","auto_size":1,"w":140,"h":140,"x":50,"y":50,"image_recolor":"#0080FF","image_recolor_opa":150} +{"id":11,"obj":"img","src":"A:/haspmota_demo.tapp#noun_Fan_35097_140.png","auto_size":1,"w":140,"h":140,"x":50,"y":50,"image_recolor":"#0080FF","image_recolor_opa":150} {"id":12,"obj":"spinner","parentid":11,"x":7,"y":6,"w":126,"h":126,"bg_opa":0,"border_width":0,"line_width":7,"line_width1":7,"type":2,"angle":120,"speed":1000,"value_str":3,"value_font":24} {"page":5,"comment":"---------- Page 5 - fancy watch ----------"} {"id":0,"bg_color":"#000000","bg_grad_color":"#000000","bg_grad_dir":1,"text_color":"#000000"} -{"id":10,"obj":"img","src":"A:/openhasp_demo.tapp#watch_ren_back_240.png","x":40,"y":0,"w":240,"h":240} -{"id":11,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_hour_240.png","auto_size":1,"x":110,"y":45} -{"id":12,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_min_240.png","auto_size":1} -{"id":13,"obj":"img","parentid":10,"src":"A:/openhasp_demo.tapp#watch_ren_sec_240.png","auto_size":1,"x":110,"y":10} +{"id":10,"obj":"img","src":"A:/haspmota_demo.tapp#watch_ren_back_240.png","x":40,"y":0,"w":240,"h":240} +{"id":11,"obj":"img","parentid":10,"src":"A:/haspmota_demo.tapp#watch_ren_hour_240.png","auto_size":1,"x":110,"y":45} +{"id":12,"obj":"img","parentid":10,"src":"A:/haspmota_demo.tapp#watch_ren_min_240.png","auto_size":1} +{"id":13,"obj":"img","parentid":10,"src":"A:/haspmota_demo.tapp#watch_ren_sec_240.png","auto_size":1,"x":110,"y":10} {"id":15,"obj":"label","parentid":10,"x":184,"y":112,"w":18,"h":16,"text":"","align":1,"text_font":"montserrat-14"} diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_back_240.png b/tasmota/berry/haspmota_src/haspmota_demo/watch_ren_back_240.png similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/watch_ren_back_240.png rename to tasmota/berry/haspmota_src/haspmota_demo/watch_ren_back_240.png diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_hour_240.png b/tasmota/berry/haspmota_src/haspmota_demo/watch_ren_hour_240.png similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/watch_ren_hour_240.png rename to tasmota/berry/haspmota_src/haspmota_demo/watch_ren_hour_240.png diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_min_240.png b/tasmota/berry/haspmota_src/haspmota_demo/watch_ren_min_240.png similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/watch_ren_min_240.png rename to tasmota/berry/haspmota_src/haspmota_demo/watch_ren_min_240.png diff --git a/tasmota/berry/openhasp_src/openhasp_demo/watch_ren_sec_240.png b/tasmota/berry/haspmota_src/haspmota_demo/watch_ren_sec_240.png similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_demo/watch_ren_sec_240.png rename to tasmota/berry/haspmota_src/haspmota_demo/watch_ren_sec_240.png diff --git a/tasmota/berry/openhasp_src/openhasp_examples/demo-all.jsonl b/tasmota/berry/haspmota_src/haspmota_examples/demo-all.jsonl similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_examples/demo-all.jsonl rename to tasmota/berry/haspmota_src/haspmota_examples/demo-all.jsonl diff --git a/tasmota/berry/openhasp_src/openhasp_examples/demo1.jsonl b/tasmota/berry/haspmota_src/haspmota_examples/demo1.jsonl similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_examples/demo1.jsonl rename to tasmota/berry/haspmota_src/haspmota_examples/demo1.jsonl diff --git a/tasmota/berry/openhasp_src/openhasp_examples/demo2.jsonl b/tasmota/berry/haspmota_src/haspmota_examples/demo2.jsonl similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_examples/demo2.jsonl rename to tasmota/berry/haspmota_src/haspmota_examples/demo2.jsonl diff --git a/tasmota/berry/openhasp_src/openhasp_examples/demo3.jsonl b/tasmota/berry/haspmota_src/haspmota_examples/demo3.jsonl similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_examples/demo3.jsonl rename to tasmota/berry/haspmota_src/haspmota_examples/demo3.jsonl diff --git a/tasmota/berry/openhasp_src/openhasp_examples/lv.jsonl b/tasmota/berry/haspmota_src/haspmota_examples/lv.jsonl similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_examples/lv.jsonl rename to tasmota/berry/haspmota_src/haspmota_examples/lv.jsonl diff --git a/tasmota/berry/openhasp_src/openhasp_widgets.tapp b/tasmota/berry/haspmota_src/haspmota_widgets.tapp similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_widgets.tapp rename to tasmota/berry/haspmota_src/haspmota_widgets.tapp diff --git a/tasmota/berry/openhasp_src/openhasp_widgets/autoexec.be b/tasmota/berry/haspmota_src/haspmota_widgets/autoexec.be similarity index 64% rename from tasmota/berry/openhasp_src/openhasp_widgets/autoexec.be rename to tasmota/berry/haspmota_src/haspmota_widgets/autoexec.be index edada704e..e174a8098 100644 --- a/tasmota/berry/openhasp_src/openhasp_widgets/autoexec.be +++ b/tasmota/berry/haspmota_src/haspmota_widgets/autoexec.be @@ -1,6 +1,6 @@ # pre-load widgets so future `import` will be already in memory # create tapp file with: -# rm rm openhasp_widgets.tapp; zip -j -0 openhasp_widgets.tapp openhasp_widgets/* +# rm rm haspmota_widgets.tapp; zip -j -0 haspmota_widgets.tapp haspmota_widgets/* import lv_tasmota_log import lv_tasmota_info import lv_wifi_graph diff --git a/tasmota/berry/openhasp_src/openhasp_widgets/lv_tasmota_info.be b/tasmota/berry/haspmota_src/haspmota_widgets/lv_tasmota_info.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_widgets/lv_tasmota_info.be rename to tasmota/berry/haspmota_src/haspmota_widgets/lv_tasmota_info.be diff --git a/tasmota/berry/openhasp_src/openhasp_widgets/lv_tasmota_log.be b/tasmota/berry/haspmota_src/haspmota_widgets/lv_tasmota_log.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_widgets/lv_tasmota_log.be rename to tasmota/berry/haspmota_src/haspmota_widgets/lv_tasmota_log.be diff --git a/tasmota/berry/openhasp_src/openhasp_widgets/lv_wifi_graph.be b/tasmota/berry/haspmota_src/haspmota_widgets/lv_wifi_graph.be similarity index 100% rename from tasmota/berry/openhasp_src/openhasp_widgets/lv_wifi_graph.be rename to tasmota/berry/haspmota_src/haspmota_widgets/lv_wifi_graph.be diff --git a/tasmota/berry/openhasp_src/gen_openhasp.sh b/tasmota/berry/openhasp_src/gen_openhasp.sh deleted file mode 100755 index 711398637..000000000 --- a/tasmota/berry/openhasp_src/gen_openhasp.sh +++ /dev/null @@ -1,5 +0,0 @@ -# generate all openhasp tapp files -rm openhasp.tapp; zip -j -0 openhasp.tapp openhasp_core/* -rm openhasp_demo.tapp ; zip -j -0 openhasp_demo.tapp openhasp_demo/* openhasp_core/openhasp.be -cp openhasp.tapp ../openhasp -cp openhasp_demo.tapp ../openhasp diff --git a/tasmota/berry/openhasp_src/openhasp_core/autoexec.be b/tasmota/berry/openhasp_src/openhasp_core/autoexec.be deleted file mode 100644 index 7a74f523d..000000000 --- a/tasmota/berry/openhasp_src/openhasp_core/autoexec.be +++ /dev/null @@ -1,7 +0,0 @@ -# start openhasp -# package with -# rm openhasp.tapp; zip -j -0 openhasp.tapp openhasp_core/* -import openhasp - -# defer start to make sure all modules and tapp applications were loaded first -tasmota.set_timer(1000, /-> openhasp.start()) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index b28dc2184..c34edb489 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1048,7 +1048,7 @@ // -- LVGL Graphics Library --------------------------------- //#define USE_LVGL // LVGL Engine, requires Berry (+382KB) #define USE_LVGL_PSRAM // Allocate LVGL memory in PSRAM if PSRAM is connected - this might be slightly slower but leaves main memory intact - // #define USE_LVGL_OPENHASP // Enable OpenHASP compatiblity and Robotocondensed fonts (+90KB flash) + // #define USE_LVGL_HASPMOTA // Enable OpenHASP compatiblity and Robotocondensed fonts (+90KB flash) #define USE_LVGL_MAX_SLEEP 10 // max sleep in ms when LVGL is enabled, more than 10ms will make display less responsive #define USE_LVGL_PNG_DECODER // include a PNG image decoder from file system (+16KB) //#define USE_LVGL_TOUCHSCREEN // Use virtual touch screen with Berry driver diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index eb96edc9f..e99cc9fee 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -260,7 +260,7 @@ #ifdef FIRMWARE_LVGL #undef CODE_IMAGE_STR -#define CODE_IMAGE_STR "lvgl-openhasp" +#define CODE_IMAGE_STR "lvgl-haspmota" #undef MODULE #define MODULE WEMOS // [Module] Select default module from tasmota_template.h @@ -276,7 +276,7 @@ #define USE_I2S #define USE_SPI #define USE_LVGL -#define USE_LVGL_OPENHASP +#define USE_LVGL_HASPMOTA #define USE_LVGL_FREETYPE #undef SET_ESP32_STACK_SIZE #define SET_ESP32_STACK_SIZE (24 * 1024) diff --git a/tasmota/xdrv_52_3_berry_lvgl.ino b/tasmota/xdrv_52_3_berry_lvgl.ino index fcd270179..56aa6e833 100644 --- a/tasmota/xdrv_52_3_berry_lvgl.ino +++ b/tasmota/xdrv_52_3_berry_lvgl.ino @@ -306,7 +306,7 @@ extern "C" { { "montserrat", lv_montserrat_fonts }, { "seg7", lv_seg7_fonts }, { "unscii", lv_unscii_fonts}, -#ifdef USE_LVGL_OPENHASP +#ifdef USE_LVGL_HASPMOTA { "robotocondensed", lv_robotocondensed_fonts }, #endif { nullptr, nullptr} @@ -355,9 +355,9 @@ extern "C" { } int lv0_load_robotocondensed_latin1_font(bvm *vm) { -#ifdef USE_LVGL_OPENHASP +#ifdef USE_LVGL_HASPMOTA return lv_load_embedded_font(vm, "robotocondensed", 0); -#endif // USE_LVGL_OPENHASP +#endif // USE_LVGL_HASPMOTA be_raise(vm, kTypeError, nullptr); } From eb798df249da9e229017da54c0034c3ac0de59a4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 21 May 2022 12:15:06 +0200 Subject: [PATCH 267/376] Add more logging to Shelly 3EM Add more logging to Shelly 3EM (#13515) --- tasmota/xnrg_23_ade7880.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/xnrg_23_ade7880.ino b/tasmota/xnrg_23_ade7880.ino index 2bdf9f486..a05baa88a 100644 --- a/tasmota/xnrg_23_ade7880.ino +++ b/tasmota/xnrg_23_ade7880.ino @@ -477,6 +477,7 @@ void Ade7880Cycle(void) { uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0xE502 - 0x000FEFE0 if (!bitRead(status0, 5)) { // LENERGY + AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Unexpected ISR0 0x%08X"), status0); return; } else { Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // 0xE502 - Acknowledge LENERGY - Reset IRQ0 line From a0f59ef2ecddb6bfac5ad737ca26e880b4dc28bf Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 21 May 2022 12:28:21 +0200 Subject: [PATCH 268/376] Add more logging to Shelly 3EM Add more logging to Shelly 3EM (#13515) --- tasmota/xnrg_23_ade7880.ino | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/tasmota/xnrg_23_ade7880.ino b/tasmota/xnrg_23_ade7880.ino index a05baa88a..7adacaa97 100644 --- a/tasmota/xnrg_23_ade7880.ino +++ b/tasmota/xnrg_23_ade7880.ino @@ -476,6 +476,7 @@ void Ade7880Cycle(void) { #endif // ADE7880_PROFILING uint32_t status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0xE502 - 0x000FEFE0 +/* if (!bitRead(status0, 5)) { // LENERGY AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Unexpected ISR0 0x%08X"), status0); return; @@ -483,6 +484,13 @@ void Ade7880Cycle(void) { Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // 0xE502 - Acknowledge LENERGY - Reset IRQ0 line status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0xE502 - 0x000FEFC0 } +*/ + if (!bitRead(status0, 5)) { // LENERGY + AddLog(LOG_LEVEL_DEBUG, PSTR("A78: Unexpected ISR0 0x%08X"), status0); + } + Ade7880WriteVerify(ADE7880_STATUS0, 0x00000020); // 0xE502 - Acknowledge LENERGY - Reset IRQ0 line + status0 = Ade7880ReadVerify(ADE7880_STATUS0); // 0xE502 - 0x000FEFC0 + if (Ade7880.cycle_count) { // Allow calibration stabilization Ade7880.cycle_count--; return; // Skip first cycles From 71ca63e49d729a5866e7fd9c95b7bae7fc145b6b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 21 May 2022 14:01:30 +0200 Subject: [PATCH 269/376] Add platformio S3 and S3usb envs - Add platformio S3 and S3usb envs - Reorganize env32 to compile safeboot before production --- platformio_tasmota_cenv_sample.ini | 2 +- platformio_tasmota_env32.ini | 138 +++++++++++++++-------------- 2 files changed, 74 insertions(+), 66 deletions(-) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index d2ac59086..90d13b59c 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -12,7 +12,7 @@ build_flags = ${env:tasmota32_base.build_flags} -D USE_WIFI_RANGE_EXTENDER -D USE_WIFI_RANGE_EXTENDER_NAPT -[env:tasmota32s3] +[env:tasmota32s3-file] extends = env:tasmota32_base board = esp32s3 build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASMOTA32 diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index ee7be6bd1..177e9dc72 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -40,6 +40,16 @@ lib_ignore = ; tasmota/berry/modules/Partition_Manager.tapp custom_files_upload = no_files +[env:tasmota32-safeboot] +extends = env:tasmota32_base +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + [env:tasmota32] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 @@ -54,13 +64,6 @@ extends = env:tasmota32_base board = esp32_16M build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 -[env:tasmota32solo1] -extends = env:tasmota32_base -board = esp32_solo1_4M -platform = ${core32solo1.platform} -platform_packages = ${core32solo1.platform_packages} -build_flags = ${core32solo1.build_flags} -DFIRMWARE_TASMOTA32 - [env:tasmota32-webcam] extends = env:tasmota32_base board = esp32-cam @@ -98,42 +101,6 @@ extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_ssl -[env:tasmota32c3] -extends = env:tasmota32_base -board = esp32c3 -build_unflags = ${env:tasmota32_base.build_unflags} - -flto - -mtarget-align -build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 - -fno-lto -lib_ignore = - TTGO TWatch Library - Micro-RTSP - epdiy -[env:tasmota32c3usb] -extends = env:tasmota32c3 -board = esp32c3usb - -[env:tasmota32s2] -extends = env:tasmota32_base -board = esp32s2 -build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASMOTA32 -lib_ignore = - TTGO TWatch Library - NimBLE-Arduino - Micro-RTSP - epdiy - -[env:tasmota32-safeboot] -extends = env:tasmota32_base -build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT -lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - TTGO TWatch Library - NimBLE-Arduino - Micro-RTSP - epdiy - [env:tasmota32solo1-safeboot] extends = env:tasmota32_base board = esp32_solo1_4M @@ -147,6 +114,49 @@ lib_ignore = Micro-RTSP epdiy +[env:tasmota32solo1] +extends = env:tasmota32_base +board = esp32_solo1_4M +platform = ${core32solo1.platform} +platform_packages = ${core32solo1.platform_packages} +build_flags = ${core32solo1.build_flags} -DFIRMWARE_TASMOTA32 + +[env:tasmota32c3-safeboot] +extends = env:tasmota32_base +board = esp32c3 +build_unflags = ${env:tasmota32_base.build_unflags} + -flto + -mtarget-align +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT + -fno-lto +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + +[env:tasmota32c3] +extends = env:tasmota32_base +board = esp32c3 +build_unflags = ${env:tasmota32_base.build_unflags} + -flto + -mtarget-align +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 + -fno-lto +lib_ignore = + TTGO TWatch Library + Micro-RTSP + epdiy + +[env:tasmota32c3usb-safeboot] +extends = env:tasmota32c3-safeboot +board = esp32c3usb + +[env:tasmota32c3usb] +extends = env:tasmota32c3 +board = esp32c3usb + [env:tasmota32s2-safeboot] extends = env:tasmota32_base board = esp32s2 @@ -158,6 +168,16 @@ lib_ignore = Micro-RTSP epdiy +[env:tasmota32s2] +extends = env:tasmota32_base +board = esp32s2 +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 +lib_ignore = + TTGO TWatch Library + NimBLE-Arduino + Micro-RTSP + epdiy + [env:tasmota32s3-safeboot] extends = env:tasmota32_base board = esp32s3 @@ -169,35 +189,23 @@ lib_ignore = Micro-RTSP epdiy -[env:tasmota32c3-safeboot] +[env:tasmota32s3] extends = env:tasmota32_base -board = esp32c3 -build_unflags = ${env:tasmota32_base.build_unflags} - -flto - -mtarget-align -build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT - -fno-lto -lib_extra_dirs = lib/lib_ssl, lib/libesp32 +board = esp32s3 +build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 lib_ignore = TTGO TWatch Library NimBLE-Arduino Micro-RTSP epdiy -[env:tasmota32c3usb-safeboot] -extends = env:tasmota32_base -board = esp32c3usb -build_unflags = ${env:tasmota32_base.build_unflags} - -flto - -mtarget-align -build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT - -fno-lto -lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - TTGO TWatch Library - NimBLE-Arduino - Micro-RTSP - epdiy +[env:tasmota32s3usb-safeboot] +extends = env:tasmota32s3-safeboot +board = esp32s3usb + +[env:tasmota32s3usb] +extends = env:tasmota32s3 +board = esp32s3usb [env:tasmota32-AF] extends = env:tasmota32_base From 82e2eaf889772d69847584897ea10a63e1a4182b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 21 May 2022 14:10:25 +0200 Subject: [PATCH 270/376] Add S3usb to workflows --- .github/workflows/Tasmota_build_devel.yml | 2 ++ .github/workflows/Tasmota_build_master.yml | 4 +++- .github/workflows/build_all_the_things.yml | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 3f9fe9e06..b9bc1feae 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -46,6 +46,7 @@ jobs: - tasmota32c3usb-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot + - tasmota32s3usb-safeboot steps: - uses: actions/checkout@v3 with: @@ -124,6 +125,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./firmware/tasmota32/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index d39246639..6b075dcd5 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -42,9 +42,10 @@ jobs: - tasmota32solo1-safeboot - tasmota32-safeboot - tasmota32c3-safeboot + - tasmota32c3usb-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot - - tasmota32c3usb-safeboot + - tasmota32s3usb-safeboot steps: - uses: actions/checkout@v3 with: @@ -132,6 +133,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./release-firmware/tasmota32/languages/ [ ! -f ./mv_firmware/firmware/tasmota32* ] || mv ./mv_firmware/firmware/tasmota32* ./release-firmware/tasmota32/languages/ diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 3303759f4..a8cabfc8b 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -50,6 +50,7 @@ jobs: - tasmota32c3usb-safeboot - tasmota32s2-safeboot - tasmota32s3-safeboot + - tasmota32s3usb-safeboot steps: - uses: actions/checkout@v2 - name: Set up Python From 8aa3f4cb7a81c339321384131ebee13fd9e20d51 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 21 May 2022 15:14:17 +0200 Subject: [PATCH 271/376] Add S2 and S3 to workflows --- .github/workflows/Tasmota_build_devel.yml | 4 ++++ .github/workflows/Tasmota_build_master.yml | 4 ++++ .github/workflows/build_all_the_things.yml | 4 +++- 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index b9bc1feae..c81bc4b65 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -39,6 +39,9 @@ jobs: - tasmota32-lvgl - tasmota32c3 - tasmota32c3usb + - tasmota32s2 + - tasmota32s3 + - tasmota32s3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot @@ -125,6 +128,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./firmware/tasmota32/languages/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 6b075dcd5..ab158fc49 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -38,6 +38,9 @@ jobs: - tasmota32-lvgl - tasmota32c3 - tasmota32c3usb + - tasmota32s2 + - tasmota32s3 + - tasmota32s3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot @@ -133,6 +136,7 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32s2*.* ] || mv ./mv_firmware/firmware/tasmota32s2*.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32s3*.* ] || mv ./mv_firmware/firmware/tasmota32s3*.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-safeboot* ] || mv ./mv_firmware/firmware/tasmota32-safeboot* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-* ] || mv ./mv_firmware/firmware/tasmota32-* ./release-firmware/tasmota32/languages/ diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index a8cabfc8b..f82d04b51 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -40,9 +40,11 @@ jobs: - tasmota32-display - tasmota32-ir - tasmota32-lvgl - - tasmota32s2 - tasmota32c3 - tasmota32c3usb + - tasmota32s2 + - tasmota32s3 + - tasmota32s3usb - tasmota32solo1 - tasmota32solo1-safeboot - tasmota32-safeboot From dd1855005cd726c61db6cd4f9cacee6018820ed5 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 21 May 2022 18:05:40 +0200 Subject: [PATCH 272/376] Zigbee fix regression --- tasmota/xdrv_23_zigbee_5_converters.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index 5c45df943..d80097056 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -849,7 +849,7 @@ public: uint8_t transactseq = 0; // transaction sequence number uint8_t cmd = 0; SBuffer payload; - uint16_t cluster = 0; + uint16_t cluster = 0xFFFF; // invalid cluster by default uint16_t groupaddr = 0; // information from decoded ZCL frame uint16_t shortaddr = BAD_SHORTADDR; // BAD_SHORTADDR is broadcast, so considered invalid From 18dee9ff3b6797c1276bea2a742cdecbcdbfb901 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sat, 21 May 2022 19:02:58 +0200 Subject: [PATCH 273/376] Partition_core suppport unknown types --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 5 +-- .../src/be_partition_core_module.c | 32 ++++++++++++++----- .../src/embedded/partition_core.be | 4 +++ 4 files changed, 32 insertions(+), 10 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index d9cdc2394..ea4270620 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -1,5 +1,6 @@ extern const bcstring be_const_str_; extern const bcstring be_const_str_00; +extern const bcstring be_const_str_0x_X2502X; extern const bcstring be_const_str_AA50; extern const bcstring be_const_str_AES_GCM; extern const bcstring be_const_str_ALIGN_BOTTOM_MID; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index a2d290c79..b87fdfee6 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -50,6 +50,7 @@ be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_pow); be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_AudioGeneratorMP3); be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_keys); be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_find_op); +be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_settings); be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_compile); be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_instance_X20required); be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); @@ -1459,7 +1460,7 @@ static const bstring* const m_string_table[] = { (const bstring *)&be_const_str_TASMOTA, (const bstring *)&be_const_str__X2F, (const bstring *)&be_const_str_lower, - (const bstring *)&be_const_str_settings, + (const bstring *)&be_const_str_0x_X2502X, NULL, (const bstring *)&be_const_str__X2E, (const bstring *)&be_const_str_SERIAL_6N2, @@ -1542,6 +1543,6 @@ static const bstring* const m_string_table[] = { static const struct bconststrtab m_const_string_table = { .size = 505, - .count = 1033, + .count = 1034, .table = m_string_table }; diff --git a/lib/libesp32/berry_tasmota/src/be_partition_core_module.c b/lib/libesp32/berry_tasmota/src/be_partition_core_module.c index 68de711f5..840c6df92 100644 --- a/lib/libesp32/berry_tasmota/src/be_partition_core_module.c +++ b/lib/libesp32/berry_tasmota/src/be_partition_core_module.c @@ -1311,7 +1311,7 @@ be_local_closure(Partition_info_is_factory, /* name */ ********************************************************************/ be_local_closure(Partition_info_type_to_string, /* name */ be_nested_proto( - 2, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1319,16 +1319,19 @@ be_local_closure(Partition_info_type_to_string, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str(type), /* K1 */ be_const_int(0), /* K2 */ be_nested_str(app), /* K3 */ be_const_int(1), /* K4 */ be_nested_str(data), + /* K5 */ be_nested_str(string), + /* K6 */ be_nested_str(format), + /* K7 */ be_nested_str(0x_X2502X), }), &be_const_str_type_to_string, &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[15]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x1C040301, // 0001 EQ R1 R1 K1 0x78060001, // 0002 JMPF R1 #0005 @@ -1338,7 +1341,12 @@ be_local_closure(Partition_info_type_to_string, /* name */ 0x1C040303, // 0006 EQ R1 R1 K3 0x78060000, // 0007 JMPF R1 #0009 0x80060800, // 0008 RET 1 K4 - 0x80000000, // 0009 RET 0 + 0xA4060A00, // 0009 IMPORT R1 K5 + 0x8C080306, // 000A GETMET R2 R1 K6 + 0x58100007, // 000B LDCONST R4 K7 + 0x88140100, // 000C GETMBR R5 R0 K0 + 0x7C080600, // 000D CALL R2 3 + 0x80040400, // 000E RET 1 R2 }) ) ); @@ -1453,7 +1461,7 @@ be_local_closure(Partition_info_init, /* name */ ********************************************************************/ be_local_closure(Partition_info_subtype_to_string, /* name */ be_nested_proto( - 4, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1461,7 +1469,7 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str(type), /* K1 */ be_const_int(0), /* K2 */ be_nested_str(subtype), @@ -1480,10 +1488,13 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ /* K15 */ be_nested_str(esphttpd), /* K16 */ be_nested_str(fat), /* K17 */ be_nested_str(spiffs), + /* K18 */ be_nested_str(string), + /* K19 */ be_nested_str(format), + /* K20 */ be_nested_str(0x_X2502X), }), &be_const_str_subtype_to_string, &be_const_str_solidified, - ( &(const binstruction[83]) { /* code */ + ( &(const binstruction[88]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 0x1C040301, // 0001 EQ R1 R1 K1 0x7806001A, // 0002 JMPF R1 #001E @@ -1566,7 +1577,12 @@ be_local_closure(Partition_info_subtype_to_string, /* name */ 0x1C040202, // 004F EQ R1 R1 R2 0x78060000, // 0050 JMPF R1 #0052 0x80062200, // 0051 RET 1 K17 - 0x80000000, // 0052 RET 0 + 0xA4062400, // 0052 IMPORT R1 K18 + 0x8C080313, // 0053 GETMET R2 R1 K19 + 0x58100014, // 0054 LDCONST R4 K20 + 0x88140102, // 0055 GETMBR R5 R0 K2 + 0x7C080600, // 0056 CALL R2 3 + 0x80040400, // 0057 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be index f72ace0ad..3c48bb7c2 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be +++ b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be @@ -146,6 +146,8 @@ class Partition_info if self.type == 0 return "app" elif self.type == 1 return "data" end + import string + return string.format("0x%02X", self.type) end def subtype_to_string() @@ -166,6 +168,8 @@ class Partition_info elif self.subtype == 0x82 return "spiffs" end end + import string + return string.format("0x%02X", self.subtype) end # Human readable version of Partition information From fc3907677bbb8edb794ced247c3f9e94066f61a8 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 23 May 2022 21:06:36 +0200 Subject: [PATCH 274/376] Berry improve precompiled gen.sh --- lib/libesp32/berry/gen.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/libesp32/berry/gen.sh b/lib/libesp32/berry/gen.sh index 7156e8719..ee97feeef 100755 --- a/lib/libesp32/berry/gen.sh +++ b/lib/libesp32/berry/gen.sh @@ -1,2 +1,8 @@ #!/bin/bash +# +# generate all precompiled Berry structures from multiple modules +# +# Should be eventually included in the build process +# +rm generate/be_*.h python3 tools/pycoc/main.py -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h From 999b477419844c15d2b50583dab26c817edbbc22 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 23 May 2022 21:12:47 +0200 Subject: [PATCH 275/376] Simplified SBuffer --- lib/default/Ext-printf/src/SBuffer.hpp | 23 +++++++---------------- tasmota/xdrv_23_zigbee_9_serial.ino | 5 +---- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/lib/default/Ext-printf/src/SBuffer.hpp b/lib/default/Ext-printf/src/SBuffer.hpp index 67bbbcd48..9c545add0 100644 --- a/lib/default/Ext-printf/src/SBuffer.hpp +++ b/lib/default/Ext-printf/src/SBuffer.hpp @@ -48,7 +48,7 @@ public: inline uint8_t *buf(size_t i = 0) const { return &_buf->buf[i]; } inline char *charptr(size_t i = 0) const { return (char*) &_buf->buf[i]; } - virtual ~SBuffer(void) { + ~SBuffer(void) { delete[] _buf; } @@ -258,6 +258,12 @@ public: return buf2; } + static SBuffer SBufferFromBytes(const uint8_t *bytes, size_t len2) { + SBuffer buf2(len2); + buf2.addBuffer(bytes, len2); + return buf2; + } + // nullptr accepted static bool equalsSBuffer(const class SBuffer * buf1, const class SBuffer * buf2) { if (buf1 == buf2) { return true; } @@ -290,18 +296,3 @@ protected: SBuffer_impl * _buf; } SBuffer; - -typedef class PreAllocatedSBuffer : public SBuffer { - -public: - PreAllocatedSBuffer(const size_t size, void * buffer) { - _buf = (SBuffer_impl*) buffer; - _buf->size = size - 4; - _buf->len = 0; - } - - ~PreAllocatedSBuffer(void) { - // don't deallocate - _buf = nullptr; - } -} PreAllocatedSBuffer; diff --git a/tasmota/xdrv_23_zigbee_9_serial.ino b/tasmota/xdrv_23_zigbee_9_serial.ino index ef3ef350b..7badbcf77 100644 --- a/tasmota/xdrv_23_zigbee_9_serial.ino +++ b/tasmota/xdrv_23_zigbee_9_serial.ino @@ -300,11 +300,8 @@ void ZigbeeInitSerial(void) ZigbeeSerial->begin(115200); if (ZigbeeSerial->hardwareSerial()) { ClaimSerial(); - 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 { - zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE); } + zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE); zigbee.active = true; zigbee.init_phase = true; // start the state machine From 73fc1733b4c5bdb27876b7b6fd9d91ac23608c98 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 24 May 2022 14:08:46 +0200 Subject: [PATCH 276/376] Enable NimBLE library for S3 --- platformio_tasmota_env32.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 177e9dc72..dfb40107c 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -195,7 +195,6 @@ board = esp32s3 build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 lib_ignore = TTGO TWatch Library - NimBLE-Arduino Micro-RTSP epdiy From b1223ad933ff1fe8003b3a8a74c9df66715c5622 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 24 May 2022 16:50:39 +0200 Subject: [PATCH 277/376] fix VSC intelisense warning --- .../berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json index 8faf7e245..1f206315b 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json @@ -3,7 +3,6 @@ "displayName": "Berry Script Language", "description": "A small embedded script language.", "version": "0.1.0", - "icon": "berry-icon.png", "publisher": "skiars", "engines": { "vscode": "^1.15.1" From 208077c808e4f22a4563aabbd8b5c645ffbaa490 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 24 May 2022 21:52:37 +0200 Subject: [PATCH 278/376] Berry add bytes().fromhex() --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 2558 +++++++++-------- .../berry/generate/be_fixed_be_class_bytes.h | 61 +- lib/libesp32/berry/src/be_byteslib.c | 40 + 4 files changed, 1352 insertions(+), 1308 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index ea4270620..32f145077 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -487,6 +487,7 @@ extern const bcstring be_const_str_format; extern const bcstring be_const_str_from_to; extern const bcstring be_const_str_fromb64; extern const bcstring be_const_str_frombytes; +extern const bcstring be_const_str_fromhex; extern const bcstring be_const_str_fromptr; extern const bcstring be_const_str_fromstring; extern const bcstring be_const_str_full_state; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index b87fdfee6..6258f104b 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,839 +1,840 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_CFG_X3A_X20running_X20); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_Auto_X2Dconfiguration); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, NULL); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_show); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, NULL); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, NULL); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, NULL); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_gamma8); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_finish); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_set_alternate); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_pc); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, NULL); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, NULL); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_clock_icon); -be_define_const_str(_X25, "%", 537692064u, 0, 1, NULL); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_get_free_heap); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_before_del); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_BLE); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_EVENT_DRAW_PART_BEGIN); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_exec_cmd); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str__X3F); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_set_light); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__X2Elen); -be_define_const_str(_X29, ")", 739023492u, 0, 1, NULL); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_widget_event_cb); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_add); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_CFG_X3A_X20removing_X20autoconf_X20files); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, NULL); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, NULL); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_MI32); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_get_coords); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__X2F_X3Frst_X3D); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_response_append); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, NULL); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_add_cmd); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str__X3C); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str__X2E_X2E); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str__X3D); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_conn_cb); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_seq1); +be_define_const_str(_X23, "#", 638357778u, 0, 1, NULL); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_imin); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_draw_line_dsc); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, NULL); +be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_cb_do_nothing); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_crc); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, NULL); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_set_huesat); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_set_chr); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_EVENT_DRAW_PART_BEGIN); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_valuer_error); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_color); +be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_delay); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, NULL); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_decrypt); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_begin_multicast); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_coredump); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_CFG_X3A_X20running_X20); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_classname); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str__available); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_load); be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_check_privileged_access); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_addr); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, NULL); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, NULL); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_CT); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_setfloat); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_set_huesat); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str__X2Ew); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_get_string); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_add_anim); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_AudioOpusDecoder); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_pow); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_AudioGeneratorMP3); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_keys); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_find_op); -be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_settings); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_compile); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_instance_X20required); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_get_bat_power); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_draw_line_dsc_init); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_tag); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_PART_MAIN); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "

", 3546571739u, 0, 11, &be_const_str_SERIAL_5E1); +be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_read24); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_switch_factory); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_adv_watch); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_hue); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_cmd_res); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str__ptr); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_flush); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, NULL); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_HTTP_GET); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_coredump); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_set_style_text_color); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_Leds); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_AudioGenerator); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_CFG_X3A_X20loading_X20); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, NULL); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", 4247924536u, 0, 19, &be_const_str_bytes); +be_define_const_str(_X3D, "=", 940354920u, 0, 1, &be_const_str_insert); +be_define_const_str(_X3D_X3C_X3E_X21, "=<>!", 2664470277u, 0, 4, &be_const_str_EC_C25519); +be_define_const_str(_X3D_X3D, "==", 2431966415u, 0, 2, &be_const_str__def); +be_define_const_str(_X3E, ">", 990687777u, 0, 1, &be_const_str_arg_name); +be_define_const_str(_X3E_X3D, ">=", 284975636u, 0, 2, &be_const_str_sys); +be_define_const_str(_X3F, "?", 973910158u, 0, 1, &be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27); +be_define_const_str(AA50, "AA50", 2265997666u, 0, 4, &be_const_str_get_switch); +be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, &be_const_str_RGB); +be_define_const_str(ALIGN_BOTTOM_MID, "ALIGN_BOTTOM_MID", 3933267889u, 0, 16, &be_const_str_DIMMER); +be_define_const_str(ALIGN_LEFT_MID, "ALIGN_LEFT_MID", 1043035067u, 0, 14, NULL); +be_define_const_str(AXP192, "AXP192", 757230128u, 0, 6, &be_const_str_asstring); +be_define_const_str(Animate_X20pc_X20is_X20out_X20of_X20range, "Animate pc is out of range", 1854929421u, 0, 26, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_memory); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_font_embedded); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_copy); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_area); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_atleast1); +be_define_const_str(AudioOpusDecoder, "AudioOpusDecoder", 1187272062u, 0, 16, &be_const_str_check_privileged_access); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str__X7D); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_get_pixel_color); +be_define_const_str(Auto_X2Dconfiguration, "Auto-configuration", 1665006109u, 0, 18, &be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker); +be_define_const_str(BECDFE, "BECDFE", 608341218u, 0, 6, &be_const_str_has_factory); +be_define_const_str(BLE, "BLE", 3933843306u, 0, 3, &be_const_str_Parameter_X20error); +be_define_const_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, "BRY: ERROR, bad json: ", 2715135809u, 0, 22, &be_const_str_gc); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27, "BRY: Exception> '", 3883673906u, 0, 17, &be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: Exception> '%s' - %s", 2246990964u, 0, 25, &be_const_str_draw_arc); +be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: argument must be a function", 3917068408u, 0, 32, &be_const_str_attrdump); +be_define_const_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, "BRY: bytecode has wrong version '%s' (%i)", 2140321415u, 0, 41, &be_const_str_MD5); +be_define_const_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, "BRY: corrupt bytecode '%s'", 4009923544u, 0, 26, &be_const_str_get_current_module_name); +be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, &be_const_str_file); be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, "BRY: failed to load '%s' (%s - %s)", 1047433014u, 0, 34, NULL); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_remove_timer); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_files); -be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, &be_const_str_autorun); -be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, NULL); -be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_connected); -be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_get_warning_level); -be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, &be_const_str_get_power); -be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_exists); -be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, &be_const_str_eth); -be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_tostring); -be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str__begin_transmission); -be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, &be_const_str_EVENT_DELETE); -be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, NULL); -be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_create_custom_widget); -be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, NULL); -be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_calldepth); -be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, &be_const_str_floor); -be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_tanh); -be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, NULL); -be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_clear_to); -be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str_ctypes_bytes); -be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, &be_const_str___lower__); -be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_round_start); -be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_matrix); -be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, &be_const_str_ceil); -be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, NULL); -be_define_const_str(CT, "CT", 1792671826u, 0, 2, &be_const_str_zip); -be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, &be_const_str_driver_name); -be_define_const_str(EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 3217293201u, 0, 32, &be_const_str_POST); -be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_ip); -be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, &be_const_str_Parameter_X20error); -be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str_o); -be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, NULL); -be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_get_cb_list); -be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str__crons); -be_define_const_str(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 2684107141u, 0, 48, &be_const_str_lv_event_cb); -be_define_const_str(False, "False", 2541049336u, 0, 5, NULL); -be_define_const_str(GET, "GET", 2531704439u, 0, 3, NULL); -be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, &be_const_str_rad); -be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_remove); -be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, &be_const_str_log); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_get_bri); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_quality); +be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, NULL); +be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str__rmt); +be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_False); +be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_exec_rules); +be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, NULL); +be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_INTERNAL_DAC); +be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, &be_const_str_EXTERNAL_I2S); +be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_EVENT_DRAW_MAIN); +be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_dimmer); +be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, NULL); +be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, &be_const_str_ct); +be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_SERIAL_5O2); +be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, &be_const_str_start); +be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_add_event_cb); +be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, NULL); +be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_mqtt_data); +be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_SERIAL_5N2); +be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_back_forth); +be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str_read_sensors); +be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, &be_const_str_draw_arc_dsc_init); +be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_init_draw_line_dsc); +be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_run_bat); +be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, &be_const_str__error); +be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str_save_before_restart); +be_define_const_str(CT, "CT", 1792671826u, 0, 2, NULL); +be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, &be_const_str_remove_timer); +be_define_const_str(EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 3217293201u, 0, 32, &be_const_str_read13); +be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_add_cron); +be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, &be_const_str_bool); +be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str_assign_rmt); +be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, &be_const_str_for); +be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_remove_rule); +be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_None); +be_define_const_str(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 2684107141u, 0, 48, NULL); +be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str_is_ota); +be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_getbits); +be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, &be_const_str_SERIAL_5N1); +be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_nan); +be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str__p); be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, NULL); -be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str_day); -be_define_const_str(Invalid_X20ota_X20partition_X20number, "Invalid ota partition number", 1611602265u, 0, 28, NULL); -be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, NULL); -be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, NULL); -be_define_const_str(MAX_RMT, "MAX_RMT", 1615574873u, 0, 7, &be_const_str_int64); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_web_add_handler); -be_define_const_str(MI32, "MI32", 4074273414u, 0, 4, &be_const_str_loop); -be_define_const_str(No_X20SPIFFS_X20partition_X20found, "No SPIFFS partition found", 4165718279u, 0, 25, &be_const_str_write); -be_define_const_str(None, "None", 810547195u, 0, 4, &be_const_str_destructor_cb); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_imax); +be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str__dirty); +be_define_const_str(Invalid_X20ota_X20partition_X20number, "Invalid ota partition number", 1611602265u, 0, 28, &be_const_str_Unknown); +be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str___upper__); +be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, &be_const_str_set_style_bg_color); +be_define_const_str(MAX_RMT, "MAX_RMT", 1615574873u, 0, 7, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_data); +be_define_const_str(MI32, "MI32", 4074273414u, 0, 4, &be_const_str_escape); +be_define_const_str(No_X20SPIFFS_X20partition_X20found, "No SPIFFS partition found", 4165718279u, 0, 25, NULL); +be_define_const_str(None, "None", 810547195u, 0, 4, &be_const_str_SERIAL_7E1); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SERIAL_7N1); be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, NULL); -be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, &be_const_str_init_draw_arc_dsc); -be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_reverse); -be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, &be_const_str_draw_ctx); -be_define_const_str(Partition, "Partition", 3077057705u, 0, 9, &be_const_str_arc_dsc); -be_define_const_str(Partition_info, "Partition_info", 3970922042u, 0, 14, &be_const_str_remove_cmd); -be_define_const_str(Partition_otadata, "Partition_otadata", 2666256496u, 0, 17, &be_const_str_list_handlers); -be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_Tele); -be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, &be_const_str_persist); -be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, NULL); -be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_True); -be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_autoexec); -be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_module); -be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_full_state); -be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_is_first_time); -be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_valuer_error); -be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_readline); -be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_has_factory); -be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_SERIAL_8N1); -be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_gen_cb); -be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_next); -be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_arg); -be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_local); -be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_reapply); -be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, &be_const_str_web_add_main_button); -be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_area); -be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_adv_block); -be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_assign_rmt); -be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str_crc8); -be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_resolvecmnd); -be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str_counters); -be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_super); -be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, &be_const_str_instance); -be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_abs); -be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_copy); -be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_alternate); -be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_consume_stereo); -be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, NULL); -be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str__ccmd); -be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str__X5D_X2C_X0A_X20_X20); -be_define_const_str(TASMOTA, "TASMOTA", 2487641028u, 0, 7, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, NULL); -be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_save_before_restart); -be_define_const_str(Too_X20many_X20partiition_X20slots, "Too many partiition slots", 3190277896u, 0, 25, &be_const_str__X5B); -be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, &be_const_str_list); -be_define_const_str(True, "True", 3453902341u, 0, 4, NULL); -be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str_widget_constructor); -be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_efuse_em); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); -be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, &be_const_str_set_ota_max); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, NULL); -be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_fast_loop_enabled); +be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, NULL); +be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_maxota); +be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, &be_const_str_before_del); +be_define_const_str(Partition, "Partition", 3077057705u, 0, 9, NULL); +be_define_const_str(Partition_info, "Partition_info", 3970922042u, 0, 14, &be_const_str__archive); +be_define_const_str(Partition_otadata, "Partition_otadata", 2666256496u, 0, 17, &be_const_str_name); +be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_every_50ms); +be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, NULL); +be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, &be_const_str__X5D_X2C_X0A_X20_X20); +be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_wifi_bars); +be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_collect); +be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_p2); +be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_get_input_power_status); +be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_pin); +be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_calldepth); +be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_pixel_count); +be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_content_button); +be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_count); +be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_find_key_i); +be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_connect); +be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_millis); +be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_sec); +be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str__end_transmission); +be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, NULL); +be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_get_option); +be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_create_custom_widget); +be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_uuid4); +be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, NULL); +be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_content_send_style); +be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str_global); +be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_ismethod); +be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, NULL); +be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_acos); +be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_fast_loop); +be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_set_dcdc_enable); +be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_deg); +be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, &be_const_str_lvgl_timer_dispatch); +be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str_get_width); +be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str_set_bat); +be_define_const_str(TASMOTA, "TASMOTA", 2487641028u, 0, 7, &be_const_str_del); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_app); +be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_add_light); +be_define_const_str(Too_X20many_X20partiition_X20slots, "Too many partiition slots", 3190277896u, 0, 25, &be_const_str_addr); +be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, &be_const_str_obj_event_base); +be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str__debug_present); +be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str_get_factory_slot); +be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_nvs); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_public_key); +be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, &be_const_str_enabled); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_clear); +be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_get_percentage); be_define_const_str(_X5D, "]", 3624670792u, 0, 1, NULL); -be_define_const_str(_X5D_X2C_X0A_X20_X20, "],\n ", 2456223650u, 0, 5, &be_const_str_get_aps_voltage); -be_define_const_str(_, "_", 3658226030u, 0, 1, &be_const_str_call_native); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_time_reached); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_now); -be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, NULL); -be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, NULL); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_insert); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_crc16); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_add_event_cb); -be_define_const_str(_change_buffer, "_change_buffer", 2101848693u, 0, 14, &be_const_str_allocated); -be_define_const_str(_class, "_class", 2732146350u, 0, 6, &be_const_str_round_end); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_display); -be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, NULL); -be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_adv_watch); -be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_response_append); -be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str__global_addr); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_json_fdump_any); -be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_ismethod); -be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_exec_tele); -be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, NULL); -be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_name); -be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_ota_); -be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_codedump); -be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_file); -be_define_const_str(_p, "_p", 1594591802u, 0, 2, &be_const_str_hue_ntv); -be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_get_bat_voltage); -be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, NULL); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str__subscribe); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_size); -be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, NULL); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_widget_dtor_impl); -be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_b); -be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_deinit); -be_define_const_str(_splash, "_splash", 3660617917u, 0, 7, &be_const_str_contains); -be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_cb_event_closure); -be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_data); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_char); -be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, &be_const_str_lv_extra); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_listdir); -be_define_const_str(a, "a", 3826002220u, 0, 1, NULL); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_bytes); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_resp_cmnd_done); -be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_get_style_bg_color); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_quality); -be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_get_current_module_path); +be_define_const_str(_X5D_X2C_X0A_X20_X20, "],\n ", 2456223650u, 0, 5, &be_const_str_add_header); +be_define_const_str(_, "_", 3658226030u, 0, 1, &be_const_str_end); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_upper); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_adv_cb); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL); +be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, &be_const_str_a); +be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, &be_const_str_connection_error); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_set_active); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_assert); +be_define_const_str(_change_buffer, "_change_buffer", 2101848693u, 0, 14, NULL); +be_define_const_str(_class, "_class", 2732146350u, 0, 6, NULL); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); +be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, &be_const_str_ins_time); +be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_call); +be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_every_second); +be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_tob64); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_is_running); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); +be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_gpio); +be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_signal_bars); +be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, &be_const_str_rule); +be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_debug); +be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_log); +be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_setbits); +be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_byte); +be_define_const_str(_p, "_p", 1594591802u, 0, 2, NULL); +be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_ceil); +be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize); +be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_round_start); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_get_switches); +be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, &be_const_str_depower); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_autorun); +be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_json_fdump_any); +be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, NULL); +be_define_const_str(_splash, "_splash", 3660617917u, 0, 7, &be_const_str_resp_cmnd_error); +be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_coord_arr); +be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_full_state); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_closure); +be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, &be_const_str_digital_read); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_atan); +be_define_const_str(a, "a", 3826002220u, 0, 1, &be_const_str_spiffs); +be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_arg); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_call_native); +be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_else); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_ip); +be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_obj_class_create_obj); be_define_const_str(add_cb_event_closure, "add_cb_event_closure", 1775958321u, 0, 20, NULL); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, NULL); -be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_content_send_style); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); -be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, &be_const_str_add_rule); -be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, &be_const_str_y); -be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, &be_const_str_pct); -be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_draw_arc_dsc); -be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_bool); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_refr_size); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_ct); -be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, &be_const_str_cosh); -be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, &be_const_str_get_alternate); -be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_init); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, NULL); -be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_remove_cron); -be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_collect); -be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_load_templates); -be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_content_button); -be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, NULL); -be_define_const_str(arch, "arch", 2952804297u, 0, 4, &be_const_str_out_X20of_X20range); -be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_f); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); -be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, &be_const_str_content_start); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_reset_search); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_mqtt_listener); -be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_clear_first_time); -be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_close); -be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, &be_const_str_lvgl_timer_dispatch); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_lv_module_init); +be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_strip); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_json_fdump_list); +be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, NULL); +be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, NULL); +be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, &be_const_str_target_search); +be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_classof); +be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_get_style_bg_color); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_int); +be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, &be_const_str_get_coords); +be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, &be_const_str_set_svc); +be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_resp_cmnd_str); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_cb); +be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_content_flush); +be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_get_cb_list); +be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_widget_dtor_cb); +be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_line_dsc); +be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_widget_dtor_impl); +be_define_const_str(arch, "arch", 2952804297u, 0, 4, NULL); +be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_is_dirty); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_light_state); +be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, &be_const_str_screenshot); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_push_path); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_set_reachable); +be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_invalid_X20magic_X20number_X20_X2502X); +be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_get_object_from_ptr); +be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, NULL); be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_set_first_time); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_draw_line); -be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, &be_const_str_lv_clock); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_battery_present); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_dimmer); -be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_refr_pos); -be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_crc32); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_set_bri); -be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, &be_const_str_is_factory); -be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_get_style_line_color); -be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_load); -be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_check_not_method); -be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_style_prop_arr); -be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, NULL); -be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_byte); -be_define_const_str(before_del, "before_del", 815924436u, 0, 10, &be_const_str_closure); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_light); -be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, NULL); -be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_getfloat); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); +be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, &be_const_str_publish); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_toupper); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_fromb64); +be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_leds); +be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_class_init_obj); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_destructor_cb); +be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, NULL); +be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_set_mode_ct); +be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_init_draw_arc_dsc); +be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_write_file); +be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_counters); +be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, &be_const_str_unknown_X20instruction); +be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_bri); +be_define_const_str(before_del, "before_del", 815924436u, 0, 10, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_digital_write); +be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_math); be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_editable); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_dim); +be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_on); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_deregister_obj); be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_ptr); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_factory); -be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_crc); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_deg); -be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_every_250ms); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_get_image_size); -be_define_const_str(can_show, "can_show", 960091187u, 0, 8, NULL); -be_define_const_str(cb, "cb", 1428787088u, 0, 2, NULL); -be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, &be_const_str_decode); -be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_light_state); -be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, NULL); -be_define_const_str(ccronexpr, "ccronexpr", 258146169u, 0, 9, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_has); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_i2c_enabled); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); -be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, NULL); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_content_send); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); +be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_content_response); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_event); +be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_content_stop); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_write); +be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_fromptr); +be_define_const_str(cb, "cb", 1428787088u, 0, 2, &be_const_str_crc16); +be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, NULL); +be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_draw_ctx); +be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, &be_const_str_try_remove_file); +be_define_const_str(ccronexpr, "ccronexpr", 258146169u, 0, 9, NULL); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_gamma8); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_content_start); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); +be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_page_autoconf_mgr); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_zip); be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_img); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_invalidate); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_every_100ms); -be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, NULL); -be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_web_add_config_button); -be_define_const_str(clock, "clock", 363073373u, 0, 5, NULL); -be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_send); -be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_lv_wifi_bars); -be_define_const_str(closure, "closure", 1548407746u, 0, 7, NULL); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_json); -be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL); -be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_set_temp); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, NULL); -be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_get_height); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_get_option); -be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_open); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_pin_used); +be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_cosh); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_break); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_font_montserrat); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_io_error); +be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_get_warning_level); +be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_get_current_module_path); +be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_flash); +be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_decode); +be_define_const_str(close, "close", 667630371u, 0, 5, NULL); +be_define_const_str(closure, "closure", 1548407746u, 0, 7, &be_const_str_while); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_esphttpd); +be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, &be_const_str_preinit); +be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_is_first_time); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_pop_path); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_ctypes_bytes); +be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_pc); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); +be_define_const_str(compress, "compress", 2818084237u, 0, 8, NULL); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); be_define_const_str(conn_cb, "conn_cb", 1381122945u, 0, 7, NULL); -be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_lvgl_event_dispatch); -be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_from_to); -be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_lv_clock_icon); +be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_font_seg7); +be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_type_error); +be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_dac_voltage); be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, NULL); -be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, NULL); -be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, &be_const_str_set_gain); -be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_get_switch); -be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_power_off); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_fast_loop); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_min); -be_define_const_str(content_response, "content_response", 3881475860u, 0, 16, &be_const_str_detect); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_members); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_json_append); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); +be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str_getfloat); +be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, &be_const_str_light_to_id); +be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_remove_cmd); +be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_event_send); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_reset_search); +be_define_const_str(content_response, "content_response", 3881475860u, 0, 16, &be_const_str_encrypt); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_stop); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_get_power); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_get_battery_chargin_status); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_ptr); be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, NULL); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_groups); -be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, NULL); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_issubclass); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_publish); -be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_except); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_seti); -be_define_const_str(counters, "counters", 4095866864u, 0, 8, NULL); -be_define_const_str(crc, "crc", 3812935353u, 0, 3, &be_const_str_ctor); -be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, &be_const_str_display_X2Eini); -be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, &be_const_str_tasmota_log_reader); -be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_minute); -be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, &be_const_str_set_x); -be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_is_ota); -be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_dirty); -be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, NULL); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_obj); +be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, &be_const_str_lv_signal_arcs); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_frombytes); +be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_set_timeouts); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_discover); +be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_instance); +be_define_const_str(crc, "crc", 3812935353u, 0, 3, NULL); +be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, &be_const_str_set_temp); +be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, NULL); +be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_remove_trailing_zeroes); +be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, NULL); +be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_remove_driver); +be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_set_zoom); +be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, &be_const_str_minute); be_define_const_str(ct, "ct", 1261010898u, 0, 2, NULL); -be_define_const_str(ctor, "ctor", 375399343u, 0, 4, &be_const_str_obj_event_base); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_lv_event); -be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, &be_const_str_int); -be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_set_pwm); -be_define_const_str(data, "data", 3631407781u, 0, 4, &be_const_str_widget_editable); -be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_devices); -be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_set_zoom); -be_define_const_str(decode, "decode", 3007678287u, 0, 6, NULL); -be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, NULL); -be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, NULL); +be_define_const_str(ctor, "ctor", 375399343u, 0, 4, &be_const_str_readline); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_refr_pos); +be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, NULL); +be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_tasmota); +be_define_const_str(data, "data", 3631407781u, 0, 4, NULL); +be_define_const_str(day, "day", 3830391293u, 0, 3, NULL); +be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_web_add_console_button); +be_define_const_str(decode, "decode", 3007678287u, 0, 6, &be_const_str_get_MAC); +be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_model); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_delete_all_configs); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_set_style_border_width); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_get_active); -be_define_const_str(del, "del", 3478752842u, 0, 3, &be_const_str_flash); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_traceback); -be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, &be_const_str_json_fdump_map); -be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_function); -be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_height_def); -be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, NULL); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_detected_X20on_X20bus); -be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, NULL); -be_define_const_str(devices, "devices", 2701822848u, 0, 7, NULL); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_touch_update); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_obj); -be_define_const_str(dim, "dim", 3496118841u, 0, 3, &be_const_str_io_error); -be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, NULL); -be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, NULL); -be_define_const_str(discover, "discover", 1383599054u, 0, 8, NULL); -be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_static); -be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, &be_const_str_timer_cb); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_set_dc_voltage); +be_define_const_str(del, "del", 3478752842u, 0, 3, &be_const_str_finish); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); +be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, &be_const_str_json_append); +be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_iter); +be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_tr); +be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, &be_const_str_members); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_publish_result); +be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, &be_const_str_timer_cb); +be_define_const_str(devices, "devices", 2701822848u, 0, 7, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_o); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_engine); +be_define_const_str(dim, "dim", 3496118841u, 0, 3, &be_const_str_function); +be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_light); +be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, &be_const_str_set_ota_max); +be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_lv_event); +be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_floor); +be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, NULL); be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_pc_rel); -be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, NULL); -be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, NULL); +be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_lvgl_event_dispatch); +be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, &be_const_str_point); +be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_find); be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, NULL); -be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_webclient); -be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, &be_const_str_get_bat_current); -be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_raw); -be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, &be_const_str_widget_height_def); +be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_set_alternate); +be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, NULL); +be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_do); +be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, NULL); be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_isinstance); -be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_mqtt_data); -be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, &be_const_str_range); -be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_hs2rgb); +be_define_const_str(duration, "duration", 799079693u, 0, 8, NULL); +be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_instance_X20required); +be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, &be_const_str_seq0); +be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_montserrat_font); be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(enabled, "enabled", 49525662u, 0, 7, &be_const_str_event_cb); -be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, NULL); +be_define_const_str(enabled, "enabled", 49525662u, 0, 7, &be_const_str_reset); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_missing_X20name); be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_get_size); -be_define_const_str(engine, "engine", 3993360443u, 0, 6, NULL); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, &be_const_str_widget_ctor_impl); -be_define_const_str(escape, "escape", 2652972038u, 0, 6, NULL); -be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, &be_const_str_imin); +be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_lv_timer_cb); +be_define_const_str(engine, "engine", 3993360443u, 0, 6, &be_const_str_partition_core); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_set_exten); +be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, &be_const_str_is_spiffs); be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_toptr); -be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_stop); -be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_next_cron); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_set_svc); -be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, &be_const_str_set_user_data); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_read13); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_register_obj); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_x); +be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_get_string); +be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_remove_light); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_get_alternate); +be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, &be_const_str_isinstance); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_get_temp); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_mqtt); be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, NULL); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_widget_struct_by_class); -be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, NULL); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_ins_goto); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); -be_define_const_str(f, "f", 3809224601u, 0, 1, &be_const_str_scan); -be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_p2); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_as); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_wire2); +be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, &be_const_str_publish_rule); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_send_multicast); +be_define_const_str(f, "f", 3809224601u, 0, 1, NULL); +be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_push); be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_lv_); -be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_get_light); -be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_reverse_gamma10); -be_define_const_str(file, "file", 2867484483u, 0, 4, NULL); -be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, &be_const_str_offseta); -be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_switch_factory); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_load_otadata); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_seq0); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); +be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, NULL); +be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_pct); +be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_is_factory); +be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_get_height); +be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, NULL); +be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_find_op); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_resp_cmnd_failed); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_tanh); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_invalidate_spiffs); be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(flags, "flags", 2624027180u, 0, 5, &be_const_str_continue); -be_define_const_str(flash, "flash", 2944773417u, 0, 5, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_get_ota_slot); -be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_read8); -be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, NULL); -be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, &be_const_str_get_input_power_status); -be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_lv_solidified); +be_define_const_str(flags, "flags", 2624027180u, 0, 5, &be_const_str_gamma); +be_define_const_str(flash, "flash", 2944773417u, 0, 5, &be_const_str_out_X20of_X20range); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_hour); +be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_list_handlers); +be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_from_to); +be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, NULL); +be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_get_bat_current); be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pixels_buffer); -be_define_const_str(from_to, "from_to", 21625507u, 0, 7, &be_const_str_obj_class_create_obj); -be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_global); -be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, &be_const_str_unsubscribe); -be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, &be_const_str_lv_signal_bars); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_remove_light); -be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_get_width); -be_define_const_str(full_status, "full_status", 648242459u, 0, 11, NULL); -be_define_const_str(function, "function", 2664841801u, 0, 8, NULL); -be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, NULL); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_lv_point_arr); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_set_mode_ct); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_read24); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_r); -be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_set_channels); -be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, &be_const_str_resp_cmnd); -be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_parse); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_fromstring); +be_define_const_str(from_to, "from_to", 21625507u, 0, 7, NULL); +be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_input); +be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, NULL); +be_define_const_str(fromhex, "fromhex", 1847150394u, 0, 7, NULL); +be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, NULL); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_introspect); +be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_listdir); +be_define_const_str(full_status, "full_status", 648242459u, 0, 11, &be_const_str_otadata); +be_define_const_str(function, "function", 2664841801u, 0, 8, &be_const_str_resize); +be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_load_freetype_font); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_init); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_xy); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_now); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_h); +be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, &be_const_str_sinh); +be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_ins_ramp); be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, NULL); -be_define_const_str(get_aps_voltage, "get_aps_voltage", 2293036435u, 0, 15, &be_const_str_get_current_module_name); -be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str_manuf); +be_define_const_str(get_aps_voltage, "get_aps_voltage", 2293036435u, 0, 15, NULL); +be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str_int64); be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, NULL); -be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, &be_const_str_get_switches); -be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, NULL); -be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, &be_const_str_is_running); -be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, NULL); -be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, &be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map); -be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_real); -be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str_wire_scan); +be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, NULL); +be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, &be_const_str_success); +be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, NULL); +be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, &be_const_str_time_dump); +be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, NULL); +be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_matrix); +be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, NULL); be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, NULL); be_define_const_str(get_event_cb, "get_event_cb", 375876088u, 0, 12, &be_const_str_top); be_define_const_str(get_factory_slot, "get_factory_slot", 3086140407u, 0, 16, NULL); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); -be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_group_def); -be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, &be_const_str_input); -be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, &be_const_str_get_vbus_current); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); +be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_list); +be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, NULL); +be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, NULL); be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, NULL); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_tele); -be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_pixel_count); -be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, &be_const_str_xy); -be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, NULL); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_lv_timer_cb); -be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, NULL); -be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, NULL); -be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, &be_const_str_publish_rule); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_time_dump); -be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_label); -be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); -be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, &be_const_str_rtc); -be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, NULL); -be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, NULL); -be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, NULL); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_power_off); +be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); +be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, &be_const_str_persist); +be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_srand); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); +be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, &be_const_str_set_MAC); +be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, &be_const_str_json_fdump); +be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, &be_const_str_img); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_real); +be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_refr_now); +be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_sqrt); +be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, NULL); +be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, &be_const_str_null_cb); +be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_get_vbus_current); +be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, &be_const_str_imax); be_define_const_str(get_switches, "get_switches", 4116216928u, 0, 12, NULL); -be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_h); -be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, NULL); -be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, NULL); +be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_height_def); +be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, &be_const_str_state); +be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, &be_const_str_set_style_text_color); be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, NULL); -be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, &be_const_str_hex); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_isnan); -be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, NULL); -be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_target); -be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); -be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, NULL); -be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_p1); -be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_var); -be_define_const_str(has, "has", 3988721635u, 0, 3, &be_const_str_percentage); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_rounded); -be_define_const_str(has_factory, "has_factory", 2702829042u, 0, 11, &be_const_str_slots); -be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, NULL); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_introspect); -be_define_const_str(hour, "hour", 3053661199u, 0, 4, &be_const_str_on); -be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, &be_const_str_set_style_bg_color); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, &be_const_str_type_to_string); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_is_dirty); -be_define_const_str(hue, "hue", 3817694041u, 0, 3, &be_const_str_page_autoconf_ctl); -be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, NULL); -be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_y1); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_param); -be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_run_deferred); -be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_instance_size); +be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, NULL); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_internal_error); +be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, &be_const_str_value_error); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_remove_cron); +be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_lv_obj_class); +be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, NULL); +be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, &be_const_str__X7B); +be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_test); +be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_lv_style_prop_arr); +be_define_const_str(has, "has", 3988721635u, 0, 3, NULL); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_if); +be_define_const_str(has_factory, "has_factory", 2702829042u, 0, 11, &be_const_str_set_hum); +be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, &be_const_str_lv_extra); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(hour, "hour", 3053661199u, 0, 4, &be_const_str_keys); +be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, &be_const_str_set); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, NULL); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_pc_abs); +be_define_const_str(hue, "hue", 3817694041u, 0, 3, NULL); +be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_set_style_line_color); +be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_offset); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); +be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_try_run_compiled); +be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_seti); be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_pixel_size); -be_define_const_str(img, "img", 2229740804u, 0, 3, &be_const_str_tobytes); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_set_style_radius); +be_define_const_str(img, "img", 2229740804u, 0, 3, &be_const_str_write_bit); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_set_user_data); be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_send_multicast); -be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, NULL); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_lv_signal_bars); +be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, &be_const_str_register_obj); be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, NULL); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_internal_error); -be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, NULL); -be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str_md5); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, &be_const_str_set_timer); +be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, NULL); be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_readbytes); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); be_define_const_str(instance, "instance", 193386898u, 0, 8, NULL); -be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_lv_style_prop_arr); -be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, &be_const_str_sec); -be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); +be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_pixels_buffer); +be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, &be_const_str_set_pixel_color); +be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_set_matrix_pixel_color); be_define_const_str(int64, "int64", 64103268u, 0, 5, NULL); -be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, NULL); -be_define_const_str(introspect, "introspect", 164638290u, 0, 10, &be_const_str_try_compile); -be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, NULL); +be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, &be_const_str_zero); +be_define_const_str(introspect, "introspect", 164638290u, 0, 10, NULL); +be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, &be_const_str_rand); be_define_const_str(invalid_X20magic_X20number_X20_X2502X, "invalid magic number %02X", 2836756259u, 0, 25, NULL); -be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); -be_define_const_str(invalidate_spiffs, "invalidate_spiffs", 1470453498u, 0, 17, &be_const_str_set_align); -be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, &be_const_str_scr_act); +be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, NULL); +be_define_const_str(invalidate_spiffs, "invalidate_spiffs", 1470453498u, 0, 17, NULL); +be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, &be_const_str_load_otadata); be_define_const_str(ip, "ip", 1261996636u, 0, 2, NULL); -be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, &be_const_str_json_fdump); +be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, NULL); be_define_const_str(is_factory, "is_factory", 1312753376u, 0, 10, NULL); be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, NULL); -be_define_const_str(is_ota, "is_ota", 2892315548u, 0, 6, &be_const_str_type); -be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, &be_const_str_set_dcdc_enable); -be_define_const_str(is_spiffs, "is_spiffs", 3196570601u, 0, 9, NULL); +be_define_const_str(is_ota, "is_ota", 2892315548u, 0, 6, NULL); +be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, NULL); +be_define_const_str(is_spiffs, "is_spiffs", 3196570601u, 0, 9, &be_const_str_set_gain); be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, &be_const_str_refr_now); +be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, NULL); be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, NULL); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_mqtt_listener); be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, NULL); -be_define_const_str(json, "json", 916562499u, 0, 4, NULL); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_montserrat_font); -be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, &be_const_str_lv_module_init); -be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_null_cb); -be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, NULL); -be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, NULL); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); -be_define_const_str(label, "label", 4137097213u, 0, 5, NULL); -be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_lights); -be_define_const_str(leds, "leds", 558858555u, 0, 4, NULL); -be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_set_rate); -be_define_const_str(light, "light", 3801947695u, 0, 5, &be_const_str_set_ldo_voltage); -be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, &be_const_str_read_sensors); -be_define_const_str(light_state, "light_state", 905783845u, 0, 11, &be_const_str_lv_wifi_bars_icon); +be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_set_x); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_loop); +be_define_const_str(json, "json", 916562499u, 0, 4, &be_const_str_return_X20code_X3D_X25i); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_p1); +be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, NULL); +be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_month); +be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, &be_const_str_setfloat); +be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_set_power); +be_define_const_str(label, "label", 4137097213u, 0, 5, &be_const_str_set_bri); +be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, NULL); +be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_map); +be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_reapply); +be_define_const_str(light, "light", 3801947695u, 0, 5, NULL); +be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, NULL); +be_define_const_str(light_state, "light_state", 905783845u, 0, 11, NULL); be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, NULL); -be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_set_size); -be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, &be_const_str_try_run_compiled); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_set_MAC); +be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_slots); +be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, NULL); +be_define_const_str(list, "list", 217798785u, 0, 4, NULL); be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, NULL); -be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, &be_const_str_math); -be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_wifi); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, NULL); +be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_lv_event_cb); be_define_const_str(load_otadata, "load_otadata", 1955073712u, 0, 12, NULL); -be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, NULL); +be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, &be_const_str_lv_wifi_arcs_icon); be_define_const_str(local, "local", 2621662984u, 0, 5, NULL); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str__X7B_X7D); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_set_first_time); be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_widget_dtor_cb); -be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_ota_max); -be_define_const_str(lv_, "lv_", 663721032u, 0, 3, NULL); -be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, &be_const_str_set_y); -be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, &be_const_str_pc_abs); -be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, NULL); -be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, &be_const_str_web_send); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_nvs); -be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, NULL); -be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, &be_const_str_wifi_arcs_icon); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); -be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_number); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_manuf); +be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_open); +be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_set_width); +be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, &be_const_str_pop); +be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, NULL); +be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, &be_const_str_splash_init); +be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, NULL); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); +be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_time_str); +be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, &be_const_str_serial); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, NULL); +be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_save); +be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_write8); be_define_const_str(lv_signal_arcs, "lv_signal_arcs", 2839156988u, 0, 14, NULL); -be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_trig); -be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_test); -be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, &be_const_str_write_gpio); -be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, &be_const_str_pop_path); -be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, NULL); -be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, NULL); -be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, &be_const_str_missing_X20name); -be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_resp_cmnd_str); -be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, &be_const_str_str); -be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, &be_const_str_set_timer); -be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, &be_const_str_memory); -be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, NULL); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(math, "math", 4001929615u, 0, 4, NULL); -be_define_const_str(matrix, "matrix", 365099244u, 0, 6, NULL); -be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, NULL); -be_define_const_str(md5, "md5", 2393554675u, 0, 3, NULL); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_set_ldo_enable); -be_define_const_str(members, "members", 937576464u, 0, 7, NULL); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_width); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_remote_ip); -be_define_const_str(min, "min", 3381609815u, 0, 3, &be_const_str_pop); +be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_set_rgb); +be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_to_gamma); +be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, &be_const_str_offseta); +be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, NULL); +be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_url_encode); +be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_set_ct); +be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, NULL); +be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_try_compile); +be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, &be_const_str_y); +be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, NULL); +be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, NULL); +be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, &be_const_str_shared_key); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_stop_iteration); +be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_search); +be_define_const_str(matrix, "matrix", 365099244u, 0, 6, &be_const_str_path); +be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, &be_const_str_splash_remove); +be_define_const_str(md5, "md5", 2393554675u, 0, 3, &be_const_str_resp_cmnd_done); +be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_return); +be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_udp); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_web_add_config_button); +be_define_const_str(min, "min", 3381609815u, 0, 3, NULL); be_define_const_str(minute, "minute", 954666857u, 0, 6, NULL); be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, NULL); -be_define_const_str(model, "model", 2961925722u, 0, 5, &be_const_str_return); +be_define_const_str(model, "model", 2961925722u, 0, 5, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_point_arr); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, &be_const_str_set_hue16sat); -be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_wifi_bars_icon); +be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_read_bytes); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, &be_const_str_super); +be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_run_cron); be_define_const_str(mqtt_data, "mqtt_data", 2538213364u, 0, 9, NULL); -be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, NULL); -be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_push_path); -be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_subscribe); -be_define_const_str(next, "next", 1555467752u, 0, 4, &be_const_str_publish_result); -be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, NULL); +be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, &be_const_str_widget_event_cb); +be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_set_auth); +be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_page_autoconf_ctl); +be_define_const_str(next, "next", 1555467752u, 0, 4, &be_const_str_web_add_button); +be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, &be_const_str_raw); be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, NULL); -be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, &be_const_str_web_add_console_button); -be_define_const_str(now, "now", 682728183u, 0, 3, &be_const_str_value); +be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, &be_const_str_set_chg_current); +be_define_const_str(now, "now", 682728183u, 0, 3, NULL); be_define_const_str(null_cb, "null_cb", 2333536460u, 0, 7, NULL); -be_define_const_str(number, "number", 467038368u, 0, 6, NULL); -be_define_const_str(nvs, "nvs", 477704066u, 0, 3, &be_const_str_set_tasmota_logo); -be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, NULL); +be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_refr_size); +be_define_const_str(nvs, "nvs", 477704066u, 0, 3, &be_const_str_size); +be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, &be_const_str_param); be_define_const_str(o, "o", 3926667934u, 0, 1, NULL); -be_define_const_str(obj, "obj", 3343205242u, 0, 3, &be_const_str_splash_remove); -be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_write_bytes); -be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, &be_const_str_sat); -be_define_const_str(offset, "offset", 348705738u, 0, 6, NULL); +be_define_const_str(obj, "obj", 3343205242u, 0, 3, &be_const_str_skip); +be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_read12); +be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, NULL); +be_define_const_str(offset, "offset", 348705738u, 0, 6, &be_const_str_false); be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, NULL); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_udp); -be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str_tcpclient); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_pin_mode); +be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str_print); be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, NULL); -be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_rotate); -be_define_const_str(ota_, "ota_", 773595766u, 0, 4, &be_const_str_try); +be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_resolvecmnd); +be_define_const_str(ota_, "ota_", 773595766u, 0, 4, &be_const_str_set_ldo_voltage); be_define_const_str(ota_max, "ota_max", 2940511240u, 0, 7, NULL); -be_define_const_str(otadata, "otadata", 1962391757u, 0, 7, &be_const_str_save); +be_define_const_str(otadata, "otadata", 1962391757u, 0, 7, NULL); be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, NULL); be_define_const_str(p1, "p1", 2689521274u, 0, 2, NULL); -be_define_const_str(p2, "p2", 2672743655u, 0, 2, &be_const_str_widget_cb); -be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_web_add_management_button); -be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, NULL); +be_define_const_str(p2, "p2", 2672743655u, 0, 2, NULL); +be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_webclient); +be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, &be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29); be_define_const_str(param, "param", 1309554226u, 0, 5, NULL); -be_define_const_str(parse, "parse", 1111180012u, 0, 5, NULL); -be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, NULL); -be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_rule); -be_define_const_str(pc, "pc", 1313756516u, 0, 2, &be_const_str_true); +be_define_const_str(parse, "parse", 1111180012u, 0, 5, &be_const_str_widget_constructor); +be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, &be_const_str_subtype); +be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_update); +be_define_const_str(pc, "pc", 1313756516u, 0, 2, NULL); be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, NULL); -be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_try_remove_file); -be_define_const_str(pct, "pct", 1431300144u, 0, 3, &be_const_str_sys); -be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, &be_const_str_uuid4); +be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_nil); +be_define_const_str(pct, "pct", 1431300144u, 0, 3, NULL); +be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, NULL); be_define_const_str(persist, "persist", 3917083779u, 0, 7, NULL); be_define_const_str(persist_X2E_p_X20is_X20not_X20a_X20map, "persist._p is not a map", 1176528732u, 0, 23, NULL); -be_define_const_str(phy, "phy", 1648673716u, 0, 3, &be_const_str_print); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_set_style_radius); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_set_timeouts); +be_define_const_str(phy, "phy", 1648673716u, 0, 3, NULL); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_set_rate); be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, NULL); -be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, &be_const_str_set_mode_rgb); -be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_setrange); -be_define_const_str(point, "point", 414084241u, 0, 5, NULL); +be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, NULL); +be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_widget_group_def); +be_define_const_str(point, "point", 414084241u, 0, 5, &be_const_str_set_text); be_define_const_str(point_arr, "point_arr", 1140859857u, 0, 9, NULL); be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, &be_const_str_resp_cmnd_error); +be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, NULL); be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); be_define_const_str(power_off, "power_off", 3568741752u, 0, 9, NULL); -be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str_seq1); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_write_flash); +be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str_style_prop_arr); +be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_range); be_define_const_str(ptr, "ptr", 1433816073u, 0, 3, NULL); -be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_running); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); +be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_set_percentage); +be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_topic); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_running); be_define_const_str(publish_rule, "publish_rule", 1829459523u, 0, 12, NULL); be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(push_path, "push_path", 1155254157u, 0, 9, &be_const_str_set_matrix_pixel_color); -be_define_const_str(quality, "quality", 2597670950u, 0, 7, NULL); +be_define_const_str(push_path, "push_path", 1155254157u, 0, 9, NULL); +be_define_const_str(quality, "quality", 2597670950u, 0, 7, &be_const_str_year); be_define_const_str(r, "r", 4144776981u, 0, 1, NULL); be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); -be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_set); -be_define_const_str(raw, "raw", 1140790001u, 0, 3, &be_const_str_strftime); -be_define_const_str(read, "read", 3470762949u, 0, 4, &be_const_str_set_style_text_font); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_widget_group_def); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_set_channels); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_set_style_img_recolor); +be_define_const_str(raw, "raw", 1140790001u, 0, 3, NULL); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_rounded); +be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_register_button_encoder); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, &be_const_str_setitem); -be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_widget_event_impl); +be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, &be_const_str_remove); +be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_target); be_define_const_str(readline, "readline", 1212709927u, 0, 8, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_subtype); -be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_setbits); +be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); +be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_touch_update); be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, &be_const_str_signal_change); -be_define_const_str(refr_pos, "refr_pos", 1020780033u, 0, 8, &be_const_str_wire2); +be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, &be_const_str_true); +be_define_const_str(refr_pos, "refr_pos", 1020780033u, 0, 8, &be_const_str_set_mode_rgb); be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, NULL); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_signal_change); be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, NULL); -be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, &be_const_str_splash); -be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, &be_const_str_tan); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, &be_const_str_solidified); -be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, &be_const_str_web_sensor); +be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, &be_const_str_type); +be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, NULL); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_tele); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); +be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, &be_const_str_toptr); be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, NULL); be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, NULL); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_set_exten); -be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, &be_const_str_url_encode); -be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, NULL); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_reverse_gamma10); +be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); +be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, &be_const_str_tostring); be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL); -be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, &be_const_str_raise); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_set_style_pad_right); +be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, NULL); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_set_bat); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_tan); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_sat); be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, &be_const_str_set_width); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_return_X20code_X3D_X25i); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_write_bit); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, &be_const_str_sin); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_scale_uint); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_widget_cb); +be_define_const_str(return, "return", 2246981567u, 60, 6, &be_const_str_static); +be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_try_rule); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, &be_const_str_set_active); -be_define_const_str(round_end, "round_end", 985288225u, 0, 9, NULL); -be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_tolower); -be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, NULL); +be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, NULL); +be_define_const_str(round_end, "round_end", 985288225u, 0, 9, &be_const_str_signal_arcs); +be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_write_gpio); +be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, &be_const_str_web_add_handler); be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); -be_define_const_str(rule, "rule", 4230889683u, 0, 4, &be_const_str_webserver); +be_define_const_str(rule, "rule", 4230889683u, 0, 4, NULL); be_define_const_str(run, "run", 718098122u, 0, 3, NULL); -be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, &be_const_str_target_search); -be_define_const_str(run_cron, "run_cron", 1929098555u, 0, 8, NULL); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_set_hum); +be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, NULL); +be_define_const_str(run_cron, "run_cron", 1929098555u, 0, 8, &be_const_str_widget_event_impl); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_string); be_define_const_str(running, "running", 343848780u, 0, 7, NULL); -be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_set_chr); +be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_sin); be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, NULL); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, &be_const_str_set_style_pad_right); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, &be_const_str_wifi); be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(scr_act, "scr_act", 2080211456u, 0, 7, NULL); +be_define_const_str(scr_act, "scr_act", 2080211456u, 0, 7, &be_const_str_web_send_decimal); be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(search, "search", 2150836393u, 0, 6, NULL); +be_define_const_str(search, "search", 2150836393u, 0, 6, &be_const_str_set_style_border_width); be_define_const_str(sec, "sec", 3139892658u, 0, 3, NULL); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, &be_const_str_shared_key); -be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_string); -be_define_const_str(send, "send", 1919010991u, 0, 4, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); -be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, &be_const_str_serial); -be_define_const_str(seq0, "seq0", 880225636u, 0, 4, &be_const_str_set_bits_per_sample); -be_define_const_str(seq1, "seq1", 897003255u, 0, 4, &be_const_str_widget_destructor); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_widget_struct_default); +be_define_const_str(send, "send", 1919010991u, 0, 4, &be_const_str_set_style_pad_all); +be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, NULL); +be_define_const_str(seq0, "seq0", 880225636u, 0, 4, &be_const_str_splash); +be_define_const_str(seq1, "seq1", 897003255u, 0, 4, NULL); be_define_const_str(serial, "serial", 3687697785u, 0, 6, NULL); be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); be_define_const_str(set_MAC, "set_MAC", 1617581015u, 0, 7, NULL); -be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, &be_const_str_write8); -be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, NULL); -be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str_set_style_img_recolor_opa); +be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, NULL); +be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, &be_const_str_set_xy); +be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str_set_light); be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, NULL); -be_define_const_str(set_bat, "set_bat", 2736667351u, 0, 7, &be_const_str_set_pixel_color); -be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, &be_const_str_split); +be_define_const_str(set_bat, "set_bat", 2736667351u, 0, 7, NULL); +be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, NULL); be_define_const_str(set_bri, "set_bri", 2789118779u, 0, 7, NULL); -be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, &be_const_str_set_text); +be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, NULL); be_define_const_str(set_chg_current, "set_chg_current", 336304386u, 0, 15, NULL); be_define_const_str(set_chr, "set_chr", 102133743u, 0, 7, NULL); -be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, NULL); -be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, NULL); -be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, &be_const_str_subtype_to_string); -be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, NULL); +be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, &be_const_str_tag); +be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_started); +be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, NULL); +be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, &be_const_str_except); be_define_const_str(set_first_time, "set_first_time", 3111247550u, 0, 14, NULL); -be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, &be_const_str_break); -be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, &be_const_str_set_percentage); -be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, &be_const_str_toint); -be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, &be_const_str_sqrt); +be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, NULL); +be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, NULL); +be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, NULL); +be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, NULL); be_define_const_str(set_hum, "set_hum", 964296026u, 0, 7, NULL); -be_define_const_str(set_ldo_enable, "set_ldo_enable", 2916502041u, 0, 14, &be_const_str_strptime); +be_define_const_str(set_ldo_enable, "set_ldo_enable", 2916502041u, 0, 14, NULL); be_define_const_str(set_ldo_voltage, "set_ldo_voltage", 4090501160u, 0, 15, NULL); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_set_style_pad_all); -be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, NULL); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, &be_const_str_set_useragent); be_define_const_str(set_mode_ct, "set_mode_ct", 665073295u, 0, 11, NULL); be_define_const_str(set_mode_rgb, "set_mode_rgb", 852310875u, 0, 12, NULL); be_define_const_str(set_ota_max, "set_ota_max", 4093779527u, 0, 11, NULL); @@ -841,139 +842,139 @@ be_define_const_str(set_percentage, "set_percentage", 2952022724u, 0, 14, NULL); be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, NULL); be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); be_define_const_str(set_pwm, "set_pwm", 3781811012u, 0, 7, NULL); -be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, &be_const_str_spiffs); -be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, &be_const_str_skip); +be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, NULL); +be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, &be_const_str_trig); be_define_const_str(set_rgb, "set_rgb", 3380244855u, 0, 7, NULL); be_define_const_str(set_size, "set_size", 2183165325u, 0, 8, NULL); be_define_const_str(set_style_bg_color, "set_style_bg_color", 1689513089u, 0, 18, NULL); -be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, &be_const_str_stop_iteration); -be_define_const_str(set_style_img_recolor, "set_style_img_recolor", 1245681294u, 0, 21, NULL); +be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, NULL); +be_define_const_str(set_style_img_recolor, "set_style_img_recolor", 1245681294u, 0, 21, &be_const_str_show); be_define_const_str(set_style_img_recolor_opa, "set_style_img_recolor_opa", 2667062087u, 0, 25, NULL); -be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, &be_const_str_start); -be_define_const_str(set_style_pad_all, "set_style_pad_all", 3987000607u, 0, 17, NULL); -be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, &be_const_str_set_useragent); +be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, NULL); +be_define_const_str(set_style_pad_all, "set_style_pad_all", 3987000607u, 0, 17, &be_const_str_setmember); +be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, NULL); be_define_const_str(set_style_radius, "set_style_radius", 3868404032u, 0, 16, NULL); be_define_const_str(set_style_text_color, "set_style_text_color", 943105189u, 0, 20, NULL); be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, NULL); be_define_const_str(set_svc, "set_svc", 752734654u, 0, 7, NULL); be_define_const_str(set_tasmota_logo, "set_tasmota_logo", 4090375591u, 0, 16, NULL); -be_define_const_str(set_temp, "set_temp", 1952131250u, 0, 8, &be_const_str_widget_ctor_cb); -be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, NULL); +be_define_const_str(set_temp, "set_temp", 1952131250u, 0, 8, NULL); +be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, &be_const_str_tolower); be_define_const_str(set_time, "set_time", 900236405u, 0, 8, NULL); -be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, &be_const_str_state); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, &be_const_str_for); -be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, &be_const_str_class); -be_define_const_str(set_width, "set_width", 484671920u, 0, 9, NULL); -be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, NULL); -be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, NULL); -be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, &be_const_str_value_error); +be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, NULL); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_widget_height_def); +be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, NULL); +be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, NULL); +be_define_const_str(set_width, "set_width", 484671920u, 0, 9, &be_const_str_setitem); +be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, &be_const_str_widget_ctor_cb); +be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, &be_const_str_widget_destructor); +be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, NULL); be_define_const_str(set_zoom, "set_zoom", 1925134407u, 0, 8, NULL); be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); -be_define_const_str(setfloat, "setfloat", 2799488807u, 0, 8, &be_const_str_to_gamma); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(setfloat, "setfloat", 2799488807u, 0, 8, NULL); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_wd); be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL); -be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, NULL); -be_define_const_str(show, "show", 2840060476u, 0, 4, &be_const_str_w); +be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str_web_add_main_button); +be_define_const_str(show, "show", 2840060476u, 0, 4, NULL); be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, NULL); -be_define_const_str(signal_bars, "signal_bars", 3181573600u, 0, 11, &be_const_str_tob64); -be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, NULL); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_widget_event); +be_define_const_str(signal_bars, "signal_bars", 3181573600u, 0, 11, NULL); +be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, &be_const_str_widget_event); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(skip, "skip", 1097563074u, 0, 4, &be_const_str__X7B); -be_define_const_str(slots, "slots", 1023330342u, 0, 5, &be_const_str_while); +be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL); +be_define_const_str(slots, "slots", 1023330342u, 0, 5, NULL); be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, NULL); -be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, NULL); -be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_srand); -be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_wd); +be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, &be_const_str_str); +be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_wifi_arcs); +be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_split); be_define_const_str(splash_remove, "splash_remove", 3132020807u, 0, 13, NULL); -be_define_const_str(split, "split", 2276994531u, 0, 5, &be_const_str_unknown_X20instruction); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, &be_const_str_yield); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(started, "started", 2153339806u, 0, 7, NULL); +be_define_const_str(started, "started", 2153339806u, 0, 7, &be_const_str_try); be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, NULL); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, &be_const_str_strptime); +be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_widget_width_def); be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL); be_define_const_str(string, "string", 398550328u, 0, 6, NULL); -be_define_const_str(strip, "strip", 4246411473u, 0, 5, NULL); -be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, &be_const_str_toupper); +be_define_const_str(strip, "strip", 4246411473u, 0, 5, &be_const_str_try_get_bec_version); +be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, NULL); be_define_const_str(style_prop_arr, "style_prop_arr", 3019174322u, 0, 14, NULL); -be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, &be_const_str_success); -be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, NULL); -be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, NULL); -be_define_const_str(success, "success", 979353360u, 0, 7, NULL); +be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, NULL); +be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, &be_const_str_toint); +be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, &be_const_str_type_to_string); +be_define_const_str(success, "success", 979353360u, 0, 7, &be_const_str_widget_struct_by_class); be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); be_define_const_str(switch_factory, "switch_factory", 4206217516u, 0, 14, NULL); be_define_const_str(sys, "sys", 3277365014u, 0, 3, NULL); -be_define_const_str(tag, "tag", 2516003219u, 0, 3, &be_const_str_wire1); +be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL); be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_w); be_define_const_str(target, "target", 845187144u, 0, 6, NULL); -be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, &be_const_str_tr); +be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL); be_define_const_str(tasmota, "tasmota", 424643812u, 0, 7, NULL); be_define_const_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, "tasmota.get_light() is deprecated, use light.get()", 3525753647u, 0, 50, NULL); be_define_const_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29, "tasmota.set_light() is deprecated, use light.set()", 2124937871u, 0, 50, NULL); be_define_const_str(tasmota_log_reader, "tasmota_log_reader", 3555069257u, 0, 18, NULL); -be_define_const_str(tcpclient, "tcpclient", 3828797983u, 0, 9, &be_const_str_web_add_button); +be_define_const_str(tcpclient, "tcpclient", 3828797983u, 0, 9, NULL); be_define_const_str(tele, "tele", 3474458061u, 0, 4, NULL); be_define_const_str(test, "test", 2949673445u, 0, 4, NULL); be_define_const_str(the_X20second_X20argument_X20is_X20not_X20a_X20function, "the second argument is not a function", 3954574469u, 0, 37, NULL); be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_wire1); be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, NULL); +be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, &be_const_str_web_add_management_button); be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, NULL); be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL); -be_define_const_str(tobytes, "tobytes", 595962279u, 0, 7, NULL); +be_define_const_str(tobytes, "tobytes", 595962279u, 0, 7, &be_const_str_width); be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); be_define_const_str(tomap, "tomap", 612167626u, 0, 5, NULL); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(topic, "topic", 3264522692u, 0, 5, &be_const_str_upper); +be_define_const_str(top, "top", 2802900028u, 0, 3, &be_const_str_def); +be_define_const_str(topic, "topic", 3264522692u, 0, 5, &be_const_str_write_bytes); be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL); -be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, &be_const_str_import); -be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, &be_const_str_try_get_bec_version); +be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); +be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, NULL); be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); be_define_const_str(tr, "tr", 1195724803u, 0, 2, NULL); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, &be_const_str_type_error); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); be_define_const_str(trig, "trig", 2073314619u, 0, 4, NULL); be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(try_compile, "try_compile", 4263879840u, 0, 11, &be_const_str_zero); +be_define_const_str(try_compile, "try_compile", 4263879840u, 0, 11, NULL); be_define_const_str(try_get_bec_version, "try_get_bec_version", 3143116423u, 0, 19, NULL); be_define_const_str(try_remove_file, "try_remove_file", 3025429926u, 0, 15, NULL); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, &be_const_str__X7D); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); be_define_const_str(try_run_compiled, "try_run_compiled", 2339741218u, 0, 16, NULL); be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); -be_define_const_str(type_to_string, "type_to_string", 1072804509u, 0, 14, &be_const_str_x1); -be_define_const_str(udp, "udp", 1253872004u, 0, 3, &be_const_str_web_send_decimal); +be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, NULL); +be_define_const_str(type_to_string, "type_to_string", 1072804509u, 0, 14, &be_const_str_width_def); +be_define_const_str(udp, "udp", 1253872004u, 0, 3, NULL); be_define_const_str(unknown_X20instruction, "unknown instruction", 1093911841u, 0, 19, NULL); be_define_const_str(unsubscribe, "unsubscribe", 4190043798u, 0, 11, NULL); be_define_const_str(update, "update", 672109684u, 0, 6, NULL); be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL); +be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, &be_const_str_elif); be_define_const_str(uuid4, "uuid4", 1153582450u, 0, 5, NULL); -be_define_const_str(value, "value", 1113510858u, 0, 5, &be_const_str_wifi_bars); +be_define_const_str(value, "value", 1113510858u, 0, 5, &be_const_str_wire_scan); be_define_const_str(value_error, "value_error", 773297791u, 0, 11, NULL); be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, NULL); be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); be_define_const_str(w, "w", 4060888886u, 0, 1, NULL); -be_define_const_str(wd, "wd", 1531424278u, 0, 2, NULL); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); +be_define_const_str(wd, "wd", 1531424278u, 0, 2, &be_const_str_web_send); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, &be_const_str_web_sensor); be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str__X7B_X7D); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); @@ -985,21 +986,21 @@ be_define_const_str(widget_constructor, "widget_constructor", 2543785934u, 0, 18 be_define_const_str(widget_ctor_cb, "widget_ctor_cb", 876007560u, 0, 14, NULL); be_define_const_str(widget_ctor_impl, "widget_ctor_impl", 194252479u, 0, 16, NULL); be_define_const_str(widget_destructor, "widget_destructor", 4207388345u, 0, 17, NULL); -be_define_const_str(widget_dtor_cb, "widget_dtor_cb", 3151545845u, 0, 14, &be_const_str_end); +be_define_const_str(widget_dtor_cb, "widget_dtor_cb", 3151545845u, 0, 14, NULL); be_define_const_str(widget_dtor_impl, "widget_dtor_impl", 520430610u, 0, 16, NULL); be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, NULL); be_define_const_str(widget_event, "widget_event", 1951408186u, 0, 12, NULL); -be_define_const_str(widget_event_cb, "widget_event_cb", 1508466754u, 0, 15, &be_const_str_width_def); +be_define_const_str(widget_event_cb, "widget_event_cb", 1508466754u, 0, 15, NULL); be_define_const_str(widget_event_impl, "widget_event_impl", 2178430561u, 0, 17, NULL); -be_define_const_str(widget_group_def, "widget_group_def", 1246968785u, 0, 16, &be_const_str_nil); +be_define_const_str(widget_group_def, "widget_group_def", 1246968785u, 0, 16, NULL); be_define_const_str(widget_height_def, "widget_height_def", 3131667813u, 0, 17, NULL); be_define_const_str(widget_instance_size, "widget_instance_size", 2055354779u, 0, 20, NULL); be_define_const_str(widget_struct_by_class, "widget_struct_by_class", 3806373842u, 0, 22, NULL); be_define_const_str(widget_struct_default, "widget_struct_default", 781673633u, 0, 21, NULL); -be_define_const_str(widget_width_def, "widget_width_def", 3986078862u, 0, 16, NULL); +be_define_const_str(widget_width_def, "widget_width_def", 3986078862u, 0, 16, &be_const_str_yield); be_define_const_str(width, "width", 2508680735u, 0, 5, NULL); -be_define_const_str(width_def, "width_def", 1143717879u, 0, 9, &be_const_str_as); -be_define_const_str(wifi, "wifi", 120087624u, 0, 4, &be_const_str_wire); +be_define_const_str(width_def, "width_def", 1143717879u, 0, 9, NULL); +be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); be_define_const_str(wifi_arcs, "wifi_arcs", 3838492904u, 0, 9, NULL); be_define_const_str(wifi_arcs_icon, "wifi_arcs_icon", 767180544u, 0, 14, NULL); be_define_const_str(wifi_bars, "wifi_bars", 653141243u, 0, 9, NULL); @@ -1009,11 +1010,11 @@ be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, NULL); be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_elif); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, &be_const_str_do); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); be_define_const_str(write_file, "write_file", 3177658879u, 0, 10, NULL); -be_define_const_str(write_flash, "write_flash", 3003629621u, 0, 11, NULL); +be_define_const_str(write_flash, "write_flash", 3003629621u, 0, 11, &be_const_str_raise); be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, NULL); be_define_const_str(x, "x", 4245442695u, 0, 1, NULL); be_define_const_str(x1, "x1", 274927234u, 0, 2, NULL); @@ -1025,7 +1026,7 @@ be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); be_define_const_str(zero, "zero", 2339366755u, 0, 4, NULL); be_define_const_str(zip, "zip", 2877453236u, 0, 3, NULL); be_define_const_str(_X7B, "{", 4262220314u, 0, 1, NULL); -be_define_const_str(_X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, "{s}Batt Current{m}%.1f mA{e}", 866537156u, 0, 28, &be_const_str_else); +be_define_const_str(_X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, "{s}Batt Current{m}%.1f mA{e}", 866537156u, 0, 28, NULL); be_define_const_str(_X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, "{s}Batt Voltage{m}%.3f V{e}", 3184308199u, 0, 27, NULL); be_define_const_str(_X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D, "{s}Temp AXP{m}%.1f °C{e}", 2622904081u, 0, 28, NULL); be_define_const_str(_X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, "{s}VBus Current{m}%.1f mA{e}", 1032721155u, 0, 28, NULL); @@ -1034,515 +1035,516 @@ be_define_const_str(_X7B_X7D, "{}", 1415952421u, 0, 2, NULL); be_define_const_str(_X7D, "}", 4161554600u, 0, 1, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str__drivers, - (const bstring *)&be_const_str_get_style_pad_right, - (const bstring *)&be_const_str_pi, - (const bstring *)&be_const_str__X3A, - (const bstring *)&be_const_str_scale_uint, - NULL, - (const bstring *)&be_const_str_SERIAL_7E1, - (const bstring *)&be_const_str_back_forth, - NULL, - (const bstring *)&be_const_str_get_hor_res, - (const bstring *)&be_const_str_a, - (const bstring *)&be_const_str__X2Fstate_X2F, - (const bstring *)&be_const_str_connect, - (const bstring *)&be_const_str_duration, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, - (const bstring *)&be_const_str_lv_point, - NULL, - (const bstring *)&be_const_str__cmd, - (const bstring *)&be_const_str_AES_GCM, - (const bstring *)&be_const_str_create_segment, - (const bstring *)&be_const_str__X2E_X2E, - (const bstring *)&be_const_str_item, - (const bstring *)&be_const_str__settings_def, - (const bstring *)&be_const_str_lv_signal_arcs, - (const bstring *)&be_const_str_wifi_arcs, - NULL, - (const bstring *)&be_const_str__X23autoexec_X2Ebe, - (const bstring *)&be_const_str_no_X20more_X20RMT_X20channel_X20available, - (const bstring *)&be_const_str_RELAY, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str_content_flush, - (const bstring *)&be_const_str_find_key_i, - (const bstring *)&be_const_str__X23autoexec_X2Ebat, - (const bstring *)&be_const_str_consume_mono, - (const bstring *)&be_const_str_EVENT_DRAW_MAIN, - (const bstring *)&be_const_str_preinit, - (const bstring *)&be_const_str_gc, - (const bstring *)&be_const_str_app, - (const bstring *)&be_const_str_BECDFE, - (const bstring *)&be_const_str_bri, - (const bstring *)&be_const_str__X3D_X3D, - (const bstring *)&be_const_str_id, - (const bstring *)&be_const_str_chars_in_string, - (const bstring *)&be_const_str_get_event_cb, - (const bstring *)&be_const_str_No_X20SPIFFS_X20partition_X20found, - (const bstring *)&be_const_str_connection_error, - (const bstring *)&be_const_str_AA50, - (const bstring *)&be_const_str_find, - (const bstring *)&be_const_str__lvgl, - (const bstring *)&be_const_str_if, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str_atleast1, - (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str_discover, - (const bstring *)&be_const_str_set_xy, - (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_WS2812_GRB, - (const bstring *)&be_const_str__X2Fac, - (const bstring *)&be_const_str_GET, - (const bstring *)&be_const_str_read12, - (const bstring *)&be_const_str_tomap, - (const bstring *)&be_const_str_get_factory_slot, - (const bstring *)&be_const_str_get_pixel_color, - (const bstring *)&be_const_str_invalid_X20magic_X20number_X20_X2502X, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, - (const bstring *)&be_const_str__X20_X28, - NULL, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, - (const bstring *)&be_const_str__X0A_X29_X3E, - (const bstring *)&be_const_str_run_cron, - (const bstring *)&be_const_str__X2Ebec, - (const bstring *)&be_const_str_arg_size, - NULL, - (const bstring *)&be_const_str__X2D_X2A, - (const bstring *)&be_const_str_RGB, - (const bstring *)&be_const_str_add_cb_event_closure, - NULL, - (const bstring *)&be_const_str_json_fdump_list, - (const bstring *)&be_const_str_HTTP_POST, - (const bstring *)&be_const_str__X23display_X2Eini, - (const bstring *)&be_const_str_I2C_X3A, - (const bstring *)&be_const_str_SERIAL_6E2, - (const bstring *)&be_const_str_MAX_RMT, - (const bstring *)&be_const_str_base_class, - (const bstring *)&be_const_str_set_rgb, - (const bstring *)&be_const_str_SERIAL_6E1, - (const bstring *)&be_const_str_light_to_id, - (const bstring *)&be_const_str_clock, - NULL, - (const bstring *)&be_const_str_try_rule, - (const bstring *)&be_const_str_hue, - (const bstring *)&be_const_str_SERIAL_6O1, - (const bstring *)&be_const_str_isrunning, - (const bstring *)&be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, - NULL, - (const bstring *)&be_const_str__X3E_X3D, - (const bstring *)&be_const_str__X2Ep2, - (const bstring *)&be_const_str__X20_X20, - NULL, - (const bstring *)&be_const_str_rand, - (const bstring *)&be_const_str__X2Ep1, - (const bstring *)&be_const_str_add_header, - (const bstring *)&be_const_str__X3Clambda_X3E, - (const bstring *)&be_const_str_SERIAL_6O2, - (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, - (const bstring *)&be_const_str_add_fast_loop, - (const bstring *)&be_const_str_font_montserrat, - (const bstring *)&be_const_str__X2Flights_X2F, - NULL, - (const bstring *)&be_const_str_x, - (const bstring *)&be_const_str_started, - (const bstring *)&be_const_str_arch, - (const bstring *)&be_const_str_add_light, - (const bstring *)&be_const_str_set_reachable, - (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, - NULL, - (const bstring *)&be_const_str_load_freetype_font, - NULL, - (const bstring *)&be_const_str_event, - (const bstring *)&be_const_str_asin, - (const bstring *)&be_const_str_EC_C25519, - (const bstring *)&be_const_str__X23init_X2Ebat, - (const bstring *)&be_const_str_set_power, - (const bstring *)&be_const_str_cmd, - (const bstring *)&be_const_str_consume_silence, - (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, - (const bstring *)&be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, - (const bstring *)&be_const_str_INTERNAL_PDM, - (const bstring *)&be_const_str_iter, - NULL, - NULL, - (const bstring *)&be_const_str_time_str, - NULL, - (const bstring *)&be_const_str_update, - (const bstring *)&be_const_str_encrypt, - (const bstring *)&be_const_str_get_MAC, - (const bstring *)&be_const_str_otadata, - (const bstring *)&be_const_str_SERIAL_8O2, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str__end_transmission, - (const bstring *)&be_const_str_set_chg_current, - (const bstring *)&be_const_str_SERIAL_8O1, - (const bstring *)&be_const_str__X2Ebe, - (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, - (const bstring *)&be_const_str_begin_multicast, - (const bstring *)&be_const_str_redirect, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, - (const bstring *)&be_const_str__buffer, - (const bstring *)&be_const_str__X2Ep, - (const bstring *)&be_const_str_begin, - (const bstring *)&be_const_str__error, - NULL, - (const bstring *)&be_const_str_font_embedded, - NULL, - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_set_dc_voltage, - (const bstring *)&be_const_str_Unknown_X20command, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, - (const bstring *)&be_const_str_INTERNAL_DAC, - (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, - (const bstring *)&be_const_str_BUTTON_CONFIGURATION, - NULL, - (const bstring *)&be_const_str_splash_init, - (const bstring *)&be_const_str_class_init_obj, - (const bstring *)&be_const_str_animate, - (const bstring *)&be_const_str_SERIAL_8E1, - NULL, - (const bstring *)&be_const_str__X2F_X2Eautoconf, - (const bstring *)&be_const_str__X2Etapp, - (const bstring *)&be_const_str_geti, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list, - (const bstring *)&be_const_str_debug, - (const bstring *)&be_const_str_ins_time, - NULL, - (const bstring *)&be_const_str_set_time, - (const bstring *)&be_const_str_draw_arc, - (const bstring *)&be_const_str__splash, - (const bstring *)&be_const_str_SERIAL_8E2, - (const bstring *)&be_const_str_draw_arc_dsc_init, - (const bstring *)&be_const_str_decompress, - (const bstring *)&be_const_str_Wire, - (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, - (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, - NULL, - (const bstring *)&be_const_str_00, - (const bstring *)&be_const_str_topic, - (const bstring *)&be_const_str_path, - (const bstring *)&be_const_str_erase, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27, - (const bstring *)&be_const_str_constructor_cb, - (const bstring *)&be_const_str_lv_wifi_arcs, - (const bstring *)&be_const_str_seg7_font, - (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, - (const bstring *)&be_const_str__X3C_X3D, - (const bstring *)&be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, - (const bstring *)&be_const_str_every_50ms, - (const bstring *)&be_const_str_lv_obj_class, - NULL, - NULL, - (const bstring *)&be_const_str_obj, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, - (const bstring *)&be_const_str__X25s_X2Eautoconf, - (const bstring *)&be_const_str_maxota, - NULL, - (const bstring *)&be_const_str_def, - (const bstring *)&be_const_str_AudioGeneratorWAV, - (const bstring *)&be_const_str__request_from, - (const bstring *)&be_const_str_SERIAL_5E1, - (const bstring *)&be_const_str_call, - (const bstring *)&be_const_str_crc32_ota_seq, - (const bstring *)&be_const_str_decrypt, - (const bstring *)&be_const_str_SERIAL_5E2, - (const bstring *)&be_const_str_flags, - (const bstring *)&be_const_str_phy, - (const bstring *)&be_const_str_month, - (const bstring *)&be_const_str_frombytes, - (const bstring *)&be_const_str_full_status, - (const bstring *)&be_const_str_code, - (const bstring *)&be_const_str_setmember, - NULL, - (const bstring *)&be_const_str_engine, - NULL, - (const bstring *)&be_const_str_SERIAL_7O1, - NULL, - (const bstring *)&be_const_str_model, - (const bstring *)&be_const_str_gamma10, - (const bstring *)&be_const_str_SERIAL_7O2, - (const bstring *)&be_const_str__filename, - (const bstring *)&be_const_str_depower, - (const bstring *)&be_const_str__settings_ptr, - NULL, - (const bstring *)&be_const_str_widget_instance_size, - (const bstring *)&be_const_str_COLOR_WHITE, - (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_widget_width_def, - NULL, - (const bstring *)&be_const_str_elements_X20must_X20be_X20a_X20lv_point, - (const bstring *)&be_const_str_acos, - (const bstring *)&be_const_str_screenshot, - (const bstring *)&be_const_str_run, - (const bstring *)&be_const_str__persist_X2Ejson, - (const bstring *)&be_const_str_attrdump, - NULL, - (const bstring *)&be_const_str_get_vbus_voltage, - (const bstring *)&be_const_str_del, - (const bstring *)&be_const_str_Tasmota, - (const bstring *)&be_const_str_fromstring, - NULL, - (const bstring *)&be_const_str__t, - (const bstring *)&be_const_str_reset, - (const bstring *)&be_const_str_delete_all_configs, - (const bstring *)&be_const_str_fromptr, - (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_lv_coord_arr, - NULL, - NULL, - NULL, - (const bstring *)&be_const_str_font_seg7, - (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, - (const bstring *)&be_const_str_resp_cmnd_failed, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, - (const bstring *)&be_const_str_count, - NULL, - (const bstring *)&be_const_str_button_pressed, - (const bstring *)&be_const_str__p, - (const bstring *)&be_const_str__X2Eautoconf, - (const bstring *)&be_const_str_ccronexpr, - (const bstring *)&be_const_str_lv, - (const bstring *)&be_const_str_get_battery_chargin_status, - (const bstring *)&be_const_str_remove_trailing_zeroes, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_RES_OK, - (const bstring *)&be_const_str_Restart_X201, - NULL, - (const bstring *)&be_const_str_signal_arcs, + (const bstring *)&be_const_str_lv_wifi_bars_icon, + (const bstring *)&be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, (const bstring *)&be_const_str_WS2812, - (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, - (const bstring *)&be_const_str_get_bat_charge_current, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, - (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, - (const bstring *)&be_const_str_gamma, NULL, - (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, - (const bstring *)&be_const_str_add_cron, - (const bstring *)&be_const_str_select, + (const bstring *)&be_const_str_adv_block, + (const bstring *)&be_const_str__lvgl, + (const bstring *)&be_const_str_0x_X2502X, + (const bstring *)&be_const_str_subtype_to_string, NULL, - (const bstring *)&be_const_str_Partition, - (const bstring *)&be_const_str_RGBCT, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, - (const bstring *)&be_const_str_widget_struct_default, - NULL, - (const bstring *)&be_const_str_nan, - NULL, - (const bstring *)&be_const_str_cb_do_nothing, - (const bstring *)&be_const_str_strip, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, - (const bstring *)&be_const_str_cmd_res, - (const bstring *)&be_const_str_AXP192, - (const bstring *)&be_const_str__archive, - (const bstring *)&be_const_str_leds, - (const bstring *)&be_const_str_bus, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, - (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - NULL, - (const bstring *)&be_const_str_Invalid_X20ota_X20partition_X20number, - (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, - (const bstring *)&be_const_str_enabled, - (const bstring *)&be_const_str__change_buffer, - (const bstring *)&be_const_str_esphttpd, - (const bstring *)&be_const_str_make_cb, - (const bstring *)&be_const_str__X0A, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str_Partition_info, (const bstring *)&be_const_str_SK6812_GRBW, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, - (const bstring *)&be_const_str_set_style_img_recolor, - (const bstring *)&be_const_str__rmt, - (const bstring *)&be_const_str_RGBW, - (const bstring *)&be_const_str_fat, - (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, - (const bstring *)&be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, - (const bstring *)&be_const_str_nvskeys, - (const bstring *)&be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - (const bstring *)&be_const_str_remote_port, - (const bstring *)&be_const_str_AudioFileSource, - (const bstring *)&be_const_str_EXTERNAL_I2S, - (const bstring *)&be_const_str_last_modified, + (const bstring *)&be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, + (const bstring *)&be_const_str_set_ldo_enable, + (const bstring *)&be_const_str_Too_X20many_X20partiition_X20slots, + (const bstring *)&be_const_str__write, + (const bstring *)&be_const_str_HTTP_POST, + (const bstring *)&be_const_str__X2Ebec, + (const bstring *)&be_const_str__X2F, (const bstring *)&be_const_str__X21_X3D, - (const bstring *)&be_const_str_set_ct, - (const bstring *)&be_const_str_draw_line_dsc, - (const bstring *)&be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, + (const bstring *)&be_const_str_Wire, + (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, + (const bstring *)&be_const_str_detect, + (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, + (const bstring *)&be_const_str_draw_line_dsc_init, + (const bstring *)&be_const_str_read8, + (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, + (const bstring *)&be_const_str_add_cb_event_closure, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, + (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str__X23display_X2Eini, + (const bstring *)&be_const_str__filename, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str_tobytes, + (const bstring *)&be_const_str__X2Ep1, + NULL, + NULL, + (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, + (const bstring *)&be_const_str__X25s_X2Eautoconf, + (const bstring *)&be_const_str_traceback, + (const bstring *)&be_const_str_RES_OK, + (const bstring *)&be_const_str_has, + (const bstring *)&be_const_str_wifi_arcs_icon, + (const bstring *)&be_const_str_Restart_X201, + (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, + (const bstring *)&be_const_str_erase, + NULL, + (const bstring *)&be_const_str_subscribe, + (const bstring *)&be_const_str__X23preinit_X2Ebe, + (const bstring *)&be_const_str_remote_ip, + (const bstring *)&be_const_str_SERIAL_8E1, (const bstring *)&be_const_str__rules, NULL, - (const bstring *)&be_const_str_can_show, - (const bstring *)&be_const_str_remove_driver, - (const bstring *)&be_const_str_clear, - (const bstring *)&be_const_str_public_key, - NULL, - (const bstring *)&be_const_str_dac_voltage, - (const bstring *)&be_const_str_animators, - NULL, - (const bstring *)&be_const_str_COLOR_BLACK, - (const bstring *)&be_const_str__timers, - (const bstring *)&be_const_str_sinh, - (const bstring *)&be_const_str_false, - NULL, - (const bstring *)&be_const_str_SERIAL_5O2, - (const bstring *)&be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, - (const bstring *)&be_const_str_get_percentage, - NULL, - (const bstring *)&be_const_str_SERIAL_8N2, - (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, - (const bstring *)&be_const_str_partition_core, - (const bstring *)&be_const_str__X27_X20_X2D_X20, - (const bstring *)&be_const_str_energy_struct, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, + (const bstring *)&be_const_str_SERIAL_6E1, + (const bstring *)&be_const_str_base_class, + (const bstring *)&be_const_str__X5B, + (const bstring *)&be_const_str_SERIAL_7O1, + (const bstring *)&be_const_str_format, (const bstring *)&be_const_str_add_handler, - (const bstring *)&be_const_str__energy, - (const bstring *)&be_const_str_assert, - (const bstring *)&be_const_str_SERIAL_5O1, + (const bstring *)&be_const_str_get_event_cb, NULL, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str_Trigger, - (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, - (const bstring *)&be_const_str_classof, - (const bstring *)&be_const_str___iterator__, - (const bstring *)&be_const_str_cos, - (const bstring *)&be_const_str_arg_name, - (const bstring *)&be_const_str_, + (const bstring *)&be_const_str__ptr, + (const bstring *)&be_const_str_ALIGN_LEFT_MID, + (const bstring *)&be_const_str_AudioGeneratorWAV, + NULL, + NULL, + (const bstring *)&be_const_str_percentage, + (const bstring *)&be_const_str_get_style_line_color, + (const bstring *)&be_const_str_flush, + (const bstring *)&be_const_str_PART_MAIN, (const bstring *)&be_const_str_ctypes_bytes_dyn, - (const bstring *)&be_const_str_coord_arr, - (const bstring *)&be_const_str__X21_X3D_X3D, - (const bstring *)&be_const_str_signal_bars, - (const bstring *)&be_const_str_map, - (const bstring *)&be_const_str_SERIAL_7N2, - (const bstring *)&be_const_str_asstring, + (const bstring *)&be_const_str__X2Fstate_X2F, NULL, - (const bstring *)&be_const_str_get, - (const bstring *)&be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E, - (const bstring *)&be_const_str_mqtt, - (const bstring *)&be_const_str_invalid_X20GPIO_X20number, - (const bstring *)&be_const_str__X25, - (const bstring *)&be_const_str_read32, - (const bstring *)&be_const_str__X23preinit_X2Ebe, - (const bstring *)&be_const_str__X3D_X3C_X3E_X21, - (const bstring *)&be_const_str_dump, - (const bstring *)&be_const_str_digital_write, - (const bstring *)&be_const_str_SERIAL_5N1, - (const bstring *)&be_const_str_is_spiffs, - (const bstring *)&be_const_str_hue_status, - (const bstring *)&be_const_str_create_matrix, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_set_auth, - (const bstring *)&be_const_str__global_def, - (const bstring *)&be_const_str__X2F_X3Frst_X3D, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_delay, - (const bstring *)&be_const_str__class, - (const bstring *)&be_const_str_point, - (const bstring *)&be_const_str_SERIAL_5N2, - (const bstring *)&be_const_str_STATE_DEFAULT, - (const bstring *)&be_const_str__X20, - (const bstring *)&be_const_str_log10, - (const bstring *)&be_const_str__dirty, - (const bstring *)&be_const_str_cb_obj, - (const bstring *)&be_const_str__X23, - (const bstring *)&be_const_str_add_cmd, - (const bstring *)&be_const_str_content_response, - (const bstring *)&be_const_str_content_stop, - (const bstring *)&be_const_str__X22, - (const bstring *)&be_const_str_gpio, - (const bstring *)&be_const_str_write_file, - (const bstring *)&be_const_str__X22_X3A, - (const bstring *)&be_const_str__X2D, - (const bstring *)&be_const_str_compress, - (const bstring *)&be_const_str_remove_rule, + (const bstring *)&be_const_str_decompress, + (const bstring *)&be_const_str_SERIAL_8E2, + NULL, + (const bstring *)&be_const_str_pow, + (const bstring *)&be_const_str_lv_point_arr, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_widget_editable, + (const bstring *)&be_const_str_groups, + NULL, + NULL, + (const bstring *)&be_const_str_BUTTON_CONFIGURATION, + (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, + (const bstring *)&be_const_str_EVENT_DRAW_PART_END, + (const bstring *)&be_const_str__change_buffer, + (const bstring *)&be_const_str_no_X20more_X20RMT_X20channel_X20available, + NULL, + (const bstring *)&be_const_str_available, + (const bstring *)&be_const_str_widget_ctor_impl, + (const bstring *)&be_const_str_Unknown_X20command, + (const bstring *)&be_const_str_gen_cb, + (const bstring *)&be_const_str_lv_clock_icon, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, + (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, + (const bstring *)&be_const_str_lv_coord_arr, (const bstring *)&be_const_str__X2Esize, - (const bstring *)&be_const_str__X2C, - (const bstring *)&be_const_str_Partition_otadata, - (const bstring *)&be_const_str_tasmota, - (const bstring *)&be_const_str_TASMOTA, - (const bstring *)&be_const_str__X2F, - (const bstring *)&be_const_str_lower, - (const bstring *)&be_const_str_0x_X2502X, + (const bstring *)&be_const_str_issubclass, + (const bstring *)&be_const_str__X2Elen, NULL, + (const bstring *)&be_const_str_has_arg, + (const bstring *)&be_const_str_cmd, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_md5, + (const bstring *)&be_const_str__anonymous_, + (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, + (const bstring *)&be_const_str_OPTION_A, + NULL, + (const bstring *)&be_const_str_RELAY, + (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, + NULL, + (const bstring *)&be_const_str_crc8, + (const bstring *)&be_const_str_clear_to, + (const bstring *)&be_const_str_set_tasmota_logo, + (const bstring *)&be_const_str_AXP192, + (const bstring *)&be_const_str_set_height, + NULL, + (const bstring *)&be_const_str_clock_icon, + (const bstring *)&be_const_str_item, + (const bstring *)&be_const_str_y1, + (const bstring *)&be_const_str_rad, + (const bstring *)&be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, + NULL, + (const bstring *)&be_const_str_get_vbus_voltage, + (const bstring *)&be_const_str_run, + (const bstring *)&be_const_str_lv_wifi_arcs, + (const bstring *)&be_const_str_every_250ms, + NULL, + (const bstring *)&be_const_str_AA50, + (const bstring *)&be_const_str_b, + (const bstring *)&be_const_str_fat, + (const bstring *)&be_const_str_Tele, + (const bstring *)&be_const_str_deinit, + (const bstring *)&be_const_str_day, + (const bstring *)&be_const_str_add_anim, + NULL, + NULL, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str__begin_transmission, + (const bstring *)&be_const_str__X27_X20_X2D_X20, + (const bstring *)&be_const_str_code, + (const bstring *)&be_const_str__X20_X20, + NULL, + (const bstring *)&be_const_str__X20, + (const bstring *)&be_const_str_hue_ntv, + (const bstring *)&be_const_str_get_name, + (const bstring *)&be_const_str_invalidate, + (const bstring *)&be_const_str_ccronexpr, + (const bstring *)&be_const_str_rtc, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list, + (const bstring *)&be_const_str_get_bat_charge_current, + (const bstring *)&be_const_str_draw_arc_dsc, + (const bstring *)&be_const_str_group_def, + (const bstring *)&be_const_str_hs2rgb, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_clock, + (const bstring *)&be_const_str_get_light, + (const bstring *)&be_const_str_read, + (const bstring *)&be_const_str_eth, + (const bstring *)&be_const_str__X23init_X2Ebat, + (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, + (const bstring *)&be_const_str__X23autoexec_X2Ebe, + (const bstring *)&be_const_str_readbytes, + NULL, + (const bstring *)&be_const_str_setrange, + (const bstring *)&be_const_str_set_time, + (const bstring *)&be_const_str_hex, + (const bstring *)&be_const_str_reverse, + (const bstring *)&be_const_str__X2D, + (const bstring *)&be_const_str_json, + (const bstring *)&be_const_str_draw_line, + (const bstring *)&be_const_str__X23autoexec_X2Ebat, + (const bstring *)&be_const_str_value, + (const bstring *)&be_const_str__crons, + (const bstring *)&be_const_str_button_pressed, + (const bstring *)&be_const_str_min, + (const bstring *)&be_const_str__X2Ew, + (const bstring *)&be_const_str_driver_name, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + (const bstring *)&be_const_str_get, + (const bstring *)&be_const_str__timers, + (const bstring *)&be_const_str__X2502d_X25s_X2502d, + (const bstring *)&be_const_str__X2Eautoconf, + (const bstring *)&be_const_str_Trigger, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, + (const bstring *)&be_const_str_BECDFE, + (const bstring *)&be_const_str_dirty, + NULL, + (const bstring *)&be_const_str_load_templates, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str__X3A, + (const bstring *)&be_const_str_connected, (const bstring *)&be_const_str__X2E, + (const bstring *)&be_const_str_ota_, + (const bstring *)&be_const_str__ccmd, + (const bstring *)&be_const_str_read32, + (const bstring *)&be_const_str_create_segment, + (const bstring *)&be_const_str_contains, + (const bstring *)&be_const_str_strftime, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, + NULL, + (const bstring *)&be_const_str__X2Flights_X2F, + (const bstring *)&be_const_str_exists, + (const bstring *)&be_const_str_SERIAL_5E2, + NULL, + (const bstring *)&be_const_str_fast_loop_enabled, + (const bstring *)&be_const_str_can_show, + (const bstring *)&be_const_str_exp, + (const bstring *)&be_const_str_clear_first_time, + (const bstring *)&be_const_str__settings_ptr, + (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, + (const bstring *)&be_const_str_geti, + (const bstring *)&be_const_str_get_ota_slot, + (const bstring *)&be_const_str_import, + (const bstring *)&be_const_str_constructor_cb, + NULL, + (const bstring *)&be_const_str_tcpclient, + (const bstring *)&be_const_str__X2B, + (const bstring *)&be_const_str_compress, + (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_POST, + (const bstring *)&be_const_str_tomap, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_consume_stereo, + (const bstring *)&be_const_str_label, + (const bstring *)&be_const_str_phy, + (const bstring *)&be_const_str_create_matrix, + (const bstring *)&be_const_str_x1, + (const bstring *)&be_const_str_GET, (const bstring *)&be_const_str_SERIAL_6N2, - (const bstring *)&be_const_str__debug_present, + NULL, + (const bstring *)&be_const_str_SERIAL_7O2, + (const bstring *)&be_const_str_module, + (const bstring *)&be_const_str_flags, + (const bstring *)&be_const_str_SERIAL_8O2, + NULL, + (const bstring *)&be_const_str_animators, + (const bstring *)&be_const_str_AudioOpusDecoder, + (const bstring *)&be_const_str_autoexec, + NULL, + (const bstring *)&be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, + (const bstring *)&be_const_str__X20_X28, + (const bstring *)&be_const_str_get_active, + (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, + NULL, + (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str__X0A_X29_X3E, + (const bstring *)&be_const_str_bus, + (const bstring *)&be_const_str_add, + (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, + (const bstring *)&be_const_str_id, + (const bstring *)&be_const_str_consume_mono, + (const bstring *)&be_const_str__X2D_X2A, + (const bstring *)&be_const_str_SERIAL_6N1, + (const bstring *)&be_const_str_scan, + (const bstring *)&be_const_str_seg7_font, + (const bstring *)&be_const_str__X2Fac, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, + (const bstring *)&be_const_str_chars_in_string, + NULL, + (const bstring *)&be_const_str__read, + (const bstring *)&be_const_str__X2F_X2Eautoconf, + (const bstring *)&be_const_str_cb_obj, + (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, + (const bstring *)&be_const_str_pc_rel, + (const bstring *)&be_const_str_SERIAL_5O1, + (const bstring *)&be_const_str_compile, + (const bstring *)&be_const_str__X3D_X3C_X3E_X21, + (const bstring *)&be_const_str__X25, + NULL, + (const bstring *)&be_const_str_begin, + NULL, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, + (const bstring *)&be_const_str_atan2, + (const bstring *)&be_const_str_cos, + (const bstring *)&be_const_str_select, + (const bstring *)&be_const_str_animate, + (const bstring *)&be_const_str_display, + (const bstring *)&be_const_str_get_style_pad_right, + (const bstring *)&be_const_str_get_aps_voltage, + (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, + (const bstring *)&be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function, + (const bstring *)&be_const_str_lower, + (const bstring *)&be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + (const bstring *)&be_const_str__energy, + (const bstring *)&be_const_str_tasmota_log_reader, + (const bstring *)&be_const_str_log10, + (const bstring *)&be_const_str_add_driver, + NULL, + (const bstring *)&be_const_str_full_status, + (const bstring *)&be_const_str_files, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + (const bstring *)&be_const_str_COLOR_WHITE, + (const bstring *)&be_const_str_set_y, + (const bstring *)&be_const_str__subscribe, + (const bstring *)&be_const_str__X0A, + (const bstring *)&be_const_str_isrunning, + (const bstring *)&be_const_str_remote_port, + (const bstring *)&be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map, + (const bstring *)&be_const_str_set_style_text_font, + (const bstring *)&be_const_str_invalid_X20GPIO_X20number, + (const bstring *)&be_const_str__X2Ep, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + NULL, + (const bstring *)&be_const_str_SERIAL_6O1, + (const bstring *)&be_const_str_close, + (const bstring *)&be_const_str_Partition_otadata, + (const bstring *)&be_const_str_arch, + (const bstring *)&be_const_str_TASMOTA, + (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, + NULL, + (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, + (const bstring *)&be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, + (const bstring *)&be_const_str_factory, + NULL, + (const bstring *)&be_const_str_set_hue16sat, + (const bstring *)&be_const_str__X3F, + (const bstring *)&be_const_str__settings_def, + (const bstring *)&be_const_str__X23, + (const bstring *)&be_const_str_get_bat_power, + (const bstring *)&be_const_str__persist_X2Ejson, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_lv_, + (const bstring *)&be_const_str_I2C_X3A, + NULL, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_pi, + (const bstring *)&be_const_str_exec_tele, + NULL, + (const bstring *)&be_const_str_SERIAL_6O2, + NULL, + (const bstring *)&be_const_str_event_cb, + (const bstring *)&be_const_str_rotate, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str_instance_size, + NULL, + (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, + (const bstring *)&be_const_str_Leds, + (const bstring *)&be_const_str_webserver, + (const bstring *)&be_const_str__global_def, + (const bstring *)&be_const_str__fl, + (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, + (const bstring *)&be_const_str_wire, + (const bstring *)&be_const_str__X2C, + (const bstring *)&be_const_str_pin_used, + (const bstring *)&be_const_str_set_style_img_recolor_opa, + (const bstring *)&be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus, + (const bstring *)&be_const_str_next_cron, + (const bstring *)&be_const_str_CT, + (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, + (const bstring *)&be_const_str_crc32, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_lv_clock, + (const bstring *)&be_const_str__X22_X3A, + (const bstring *)&be_const_str_get_hor_res, + (const bstring *)&be_const_str_Partition, + (const bstring *)&be_const_str__, + (const bstring *)&be_const_str_Invalid_X20ota_X20partition_X20number, + (const bstring *)&be_const_str__class, + (const bstring *)&be_const_str__X2Ep2, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, + (const bstring *)&be_const_str_arg_size, + (const bstring *)&be_const_str_asin, + (const bstring *)&be_const_str_get_free_heap, + (const bstring *)&be_const_str_number, + (const bstring *)&be_const_str_set_align, + NULL, NULL, (const bstring *)&be_const_str__X29, - (const bstring *)&be_const_str_classname, - (const bstring *)&be_const_str_hour, - NULL, - (const bstring *)&be_const_str_False, - (const bstring *)&be_const_str_EVENT_DRAW_PART_END, - (const bstring *)&be_const_str_get_log, - (const bstring *)&be_const_str_Unknown, - (const bstring *)&be_const_str__X2B, - (const bstring *)&be_const_str_SERIAL_6N1, - (const bstring *)&be_const_str_OneWire, - (const bstring *)&be_const_str__validate, - (const bstring *)&be_const_str__X2A, - (const bstring *)&be_const_str_every_second, - (const bstring *)&be_const_str__available, - (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, - (const bstring *)&be_const_str_run_bat, - NULL, - NULL, - (const bstring *)&be_const_str_page_autoconf_mgr, - (const bstring *)&be_const_str__X2502d_X25s_X2502d, - (const bstring *)&be_const_str_deregister_obj, - (const bstring *)&be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, - NULL, - (const bstring *)&be_const_str__anonymous_, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_fromb64, - (const bstring *)&be_const_str_get_bri, + (const bstring *)&be_const_str__X3D_X3D, + (const bstring *)&be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, + (const bstring *)&be_const_str_solidified, + (const bstring *)&be_const_str_MI32, + (const bstring *)&be_const_str_crc32_ota_seq, + (const bstring *)&be_const_str__X3Clambda_X3E, + (const bstring *)&be_const_str_point_arr, (const bstring *)&be_const_str__X28_X29, - (const bstring *)&be_const_str_concat, - (const bstring *)&be_const_str_digital_read, - (const bstring *)&be_const_str_read, - (const bstring *)&be_const_str_conn_cb, - (const bstring *)&be_const_str_active_otadata, - (const bstring *)&be_const_str__X5D, - (const bstring *)&be_const_str_line_dsc, + (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, + (const bstring *)&be_const_str__buffer, + (const bstring *)&be_const_str_SERIAL_6E2, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str__splash, + (const bstring *)&be_const_str_detected_X20on_X20bus, + NULL, + (const bstring *)&be_const_str_var, + NULL, + (const bstring *)&be_const_str_add_fast_loop, + (const bstring *)&be_const_str_dim, + (const bstring *)&be_const_str_hue_status, + NULL, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_make_cb, + (const bstring *)&be_const_str__cmd, + (const bstring *)&be_const_str__X2A, + NULL, + (const bstring *)&be_const_str_last_modified, + (const bstring *)&be_const_str__X2Etapp, + (const bstring *)&be_const_str___iterator__, + (const bstring *)&be_const_str_lv_wifi_bars, + (const bstring *)&be_const_str_class, + (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_gamma10, + (const bstring *)&be_const_str_WS2812_GRB, + (const bstring *)&be_const_str_00, + (const bstring *)&be_const_str_set_pwm, + (const bstring *)&be_const_str_EVENT_DELETE, + (const bstring *)&be_const_str_lv_point, NULL, NULL, - NULL, - (const bstring *)&be_const_str_get_name, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, - (const bstring *)&be_const_str__, - (const bstring *)&be_const_str_year, - (const bstring *)&be_const_str_exec_rules, - (const bstring *)&be_const_str_read_bytes, - (const bstring *)&be_const_str_atan, - (const bstring *)&be_const_str__X3D, - (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, + (const bstring *)&be_const_str_time_reached, (const bstring *)&be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_No_X20SPIFFS_X20partition_X20found, + NULL, + (const bstring *)&be_const_str_ins_goto, + (const bstring *)&be_const_str_resp_cmnd, + (const bstring *)&be_const_str_get_size, + (const bstring *)&be_const_str_nvskeys, + (const bstring *)&be_const_str_concat, + (const bstring *)&be_const_str_scr_act, (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__X3C, - (const bstring *)&be_const_str_pin, - (const bstring *)&be_const_str_set_style_line_color, - (const bstring *)&be_const_str_Partition_info, - (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, - (const bstring *)&be_const_str_adv_cb, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str_Too_X20many_X20partiition_X20slots, - (const bstring *)&be_const_str__X3E, - (const bstring *)&be_const_str_escape, - (const bstring *)&be_const_str_resize, - (const bstring *)&be_const_str_init_draw_line_dsc, - (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, - (const bstring *)&be_const_str_push, - (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, + (const bstring *)&be_const_str__X3C_X3D, + (const bstring *)&be_const_str_send, + (const bstring *)&be_const_str_STATE_DEFAULT, + (const bstring *)&be_const_str_RGBW, + (const bstring *)&be_const_str_devices, + (const bstring *)&be_const_str_set_bits_per_sample, + (const bstring *)&be_const_str_fromhex, + (const bstring *)&be_const_str_dump, + (const bstring *)&be_const_str_continue, + (const bstring *)&be_const_str_r, + NULL, + (const bstring *)&be_const_str_f, + (const bstring *)&be_const_str__X2Ebe, + (const bstring *)&be_const_str_SERIAL_7N2, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, + (const bstring *)&be_const_str_run_deferred, + (const bstring *)&be_const_str_energy_struct, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27, + (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, (const bstring *)&be_const_str_SERIAL_7E2, - (const bstring *)&be_const_str_pin_mode, - (const bstring *)&be_const_str__def, - (const bstring *)&be_const_str__fl, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E + (const bstring *)&be_const_str_duration, + (const bstring *)&be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str_BLE, + (const bstring *)&be_const_str_display_X2Eini, + (const bstring *)&be_const_str_lv_solidified, + (const bstring *)&be_const_str_char, + (const bstring *)&be_const_str___lower__, + (const bstring *)&be_const_str_wifi_bars_icon, + (const bstring *)&be_const_str_allocated, + (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, + (const bstring *)&be_const_str_settings, + (const bstring *)&be_const_str_json_fdump_map, + (const bstring *)&be_const_str_every_100ms, + (const bstring *)&be_const_str_Auto_X2Dconfiguration, + (const bstring *)&be_const_str_c, + NULL, + (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str__drivers, + (const bstring *)&be_const_str_register_button_encoder, + (const bstring *)&be_const_str_write_flash, + NULL, + NULL, + (const bstring *)&be_const_str_OneWire, + (const bstring *)&be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, + (const bstring *)&be_const_str_parse, + (const bstring *)&be_const_str_round_end, + (const bstring *)&be_const_str__X21_X3D_X3D, + (const bstring *)&be_const_str_ctor, + (const bstring *)&be_const_str_AES_GCM, + NULL, + (const bstring *)&be_const_str_next, + (const bstring *)&be_const_str__global_addr, + (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, + NULL, + (const bstring *)&be_const_str_get_bat_voltage, + NULL, + (const bstring *)&be_const_str_SERIAL_8N2, + (const bstring *)&be_const_str_True, + (const bstring *)&be_const_str__X3E_X3D, + (const bstring *)&be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, + NULL, + (const bstring *)&be_const_str_widget_instance_size, + (const bstring *)&be_const_str_unsubscribe, + (const bstring *)&be_const_str_RGBCT, + NULL, + (const bstring *)&be_const_str_alternate, + (const bstring *)&be_const_str_isnan, + (const bstring *)&be_const_str_set_size, + (const bstring *)&be_const_str_lights, + (const bstring *)&be_const_str__X3E, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str__X22, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_lv, + (const bstring *)&be_const_str_arc_dsc, + (const bstring *)&be_const_str_redirect, + (const bstring *)&be_const_str_active_otadata, + (const bstring *)&be_const_str_pixel_size }; static const struct bconststrtab m_const_string_table = { - .size = 505, - .count = 1034, + .size = 506, + .count = 1035, .table = m_string_table }; diff --git a/lib/libesp32/berry/generate/be_fixed_be_class_bytes.h b/lib/libesp32/berry/generate/be_fixed_be_class_bytes.h index aec4366d4..6c519b898 100644 --- a/lib/libesp32/berry/generate/be_fixed_be_class_bytes.h +++ b/lib/libesp32/berry/generate/be_fixed_be_class_bytes.h @@ -1,42 +1,43 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_bytes_map) { - { be_const_key(deinit, -1), be_const_func(m_deinit) }, - { be_const_key(get, 5), be_const_func(m_getu) }, - { be_const_key(fromb64, 18), be_const_func(m_fromb64) }, - { be_const_key(copy, -1), be_const_func(m_copy) }, - { be_const_key(_buffer, -1), be_const_func(m_buffer) }, - { be_const_key(getfloat, -1), be_const_func(m_getfloat) }, - { be_const_key(getbits, -1), be_const_closure(getbits_closure) }, - { be_const_key(tob64, -1), be_const_func(m_tob64) }, - { be_const_key(item, -1), be_const_func(m_item) }, - { be_const_key(_X21_X3D, -1), be_const_func(m_nequal) }, - { be_const_key(clear, 28), be_const_func(m_clear) }, - { be_const_key(size, 4), be_const_func(m_size) }, - { be_const_key(fromstring, -1), be_const_func(m_fromstring) }, - { be_const_key(_X2Elen, 21), be_const_var(0) }, - { be_const_key(seti, -1), be_const_func(m_set) }, - { be_const_key(_X2B, 9), be_const_func(m_merge) }, - { be_const_key(_X2Esize, 13), be_const_var(1) }, - { be_const_key(setfloat, 6), be_const_func(m_setfloat) }, - { be_const_key(_X2Ep, -1), be_const_var(2) }, - { be_const_key(set, -1), be_const_func(m_set) }, - { be_const_key(asstring, 0), be_const_func(m_asstring) }, - { be_const_key(add, 24), be_const_func(m_add) }, - { be_const_key(setitem, -1), be_const_func(m_setitem) }, - { be_const_key(_change_buffer, -1), be_const_func(m_change_buffer) }, - { be_const_key(_X3D_X3D, 15), be_const_func(m_equal) }, - { be_const_key(resize, 2), be_const_func(m_resize) }, + { be_const_key(_X2Esize, 9), be_const_var(0) }, + { be_const_key(resize, -1), be_const_func(m_resize) }, + { be_const_key(clear, -1), be_const_func(m_clear) }, + { be_const_key(_X21_X3D, 14), be_const_func(m_nequal) }, + { be_const_key(copy, 11), be_const_func(m_copy) }, { be_const_key(tostring, -1), be_const_func(m_tostring) }, - { be_const_key(setbits, -1), be_const_closure(setbits_closure) }, + { be_const_key(item, -1), be_const_func(m_item) }, + { be_const_key(setbits, 29), be_const_closure(setbits_closure) }, + { be_const_key(deinit, 12), be_const_func(m_deinit) }, + { be_const_key(asstring, -1), be_const_func(m_asstring) }, + { be_const_key(_X2B, -1), be_const_func(m_merge) }, + { be_const_key(setitem, -1), be_const_func(m_setitem) }, + { be_const_key(fromstring, 31), be_const_func(m_fromstring) }, { be_const_key(_X2E_X2E, -1), be_const_func(m_connect) }, - { be_const_key(init, -1), be_const_func(m_init) }, - { be_const_key(geti, -1), be_const_func(m_geti) }, + { be_const_key(set, -1), be_const_func(m_set) }, + { be_const_key(_X3D_X3D, -1), be_const_func(m_equal) }, + { be_const_key(getbits, 18), be_const_closure(getbits_closure) }, + { be_const_key(fromhex, -1), be_const_func(m_fromhex) }, + { be_const_key(getfloat, 27), be_const_func(m_getfloat) }, + { be_const_key(init, 16), be_const_func(m_init) }, + { be_const_key(add, -1), be_const_func(m_add) }, + { be_const_key(_change_buffer, -1), be_const_func(m_change_buffer) }, + { be_const_key(_X2Elen, -1), be_const_var(1) }, + { be_const_key(get, 25), be_const_func(m_getu) }, + { be_const_key(_buffer, 22), be_const_func(m_buffer) }, + { be_const_key(fromb64, -1), be_const_func(m_fromb64) }, + { be_const_key(geti, 17), be_const_func(m_geti) }, + { be_const_key(_X2Ep, -1), be_const_var(2) }, + { be_const_key(size, -1), be_const_func(m_size) }, + { be_const_key(setfloat, -1), be_const_func(m_setfloat) }, + { be_const_key(seti, -1), be_const_func(m_set) }, + { be_const_key(tob64, -1), be_const_func(m_tob64) }, }; static be_define_const_map( be_class_bytes_map, - 31 + 32 ); BE_EXPORT_VARIABLE be_define_const_class( diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index aab229839..b93bb20d0 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -1184,6 +1184,45 @@ static int m_fromb64(bvm *vm) be_return_nil(vm); } +/* + * Converts hex to bytes() + * + * `bytes().fromhexx() -> bytes()` + */ +static int m_fromhex(bvm *vm) +{ + int argc = be_top(vm); + if (argc >= 2 && be_isstring(vm, 2)) { + int32_t from = 0; // skip x chars + if (argc >= 3 && be_isint(vm, 3)) { + from = be_toint(vm, 3); + } + const char *s = be_tostring(vm, 2); + size_t s_len = strlen(s); + if (from < 0) { from = 0; } + if (from > s_len) { from = s_len; } + int32_t bin_len = (s_len - from) / 2; + + buf_impl attr = m_read_attributes(vm, 1); + check_ptr(vm, &attr); + if (attr.fixed && attr.len != bin_len) { + be_raise(vm, BYTES_RESIZE_ERROR, BYTES_RESIZE_MESSAGE); + } + bytes_resize(vm, &attr, bin_len); /* resize if needed */ + if (bin_len > attr.size) { /* avoid overflow */ + be_raise(vm, "memory_error", "cannot allocate buffer"); + } + attr.len = 0; + buf_add_hex(&attr, s + from, s_len - from); + + be_pop(vm, 1); /* remove arg to leave instance */ + m_write_attributes(vm, 1, &attr); /* update instance */ + be_pop(vm, be_top(vm) - 1); /* leave instance on stack */ + be_return(vm); + } + be_raise(vm, "type_error", "operand must be a string"); + be_return_nil(vm); +} /* * Advanced API @@ -1538,6 +1577,7 @@ class be_class_bytes (scope: global, name: bytes) { fromstring, func(m_fromstring) tob64, func(m_tob64) fromb64, func(m_fromb64) + fromhex, func(m_fromhex) add, func(m_add) get, func(m_getu) geti, func(m_geti) From 2a38c1c0f6ad339e6203e2120d9104b8e5b85f70 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 24 May 2022 22:06:50 +0200 Subject: [PATCH 279/376] Berry add crc.sum() --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 5 +++-- lib/libesp32/berry/generate/be_fixed_crc.h | 5 +++-- lib/libesp32/berry_tasmota/src/be_crc32_module.c | 16 +++++++++++++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 32f145077..53f756da7 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -919,6 +919,7 @@ extern const bcstring be_const_str_subscribe; extern const bcstring be_const_str_subtype; extern const bcstring be_const_str_subtype_to_string; extern const bcstring be_const_str_success; +extern const bcstring be_const_str_sum; extern const bcstring be_const_str_super; extern const bcstring be_const_str_switch_factory; extern const bcstring be_const_str_sys; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 6258f104b..f47dcf8fc 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -889,7 +889,7 @@ be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL); be_define_const_str(slots, "slots", 1023330342u, 0, 5, NULL); be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, NULL); be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, &be_const_str_str); -be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_wifi_arcs); +be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_sum); be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_split); be_define_const_str(splash_remove, "splash_remove", 3132020807u, 0, 13, NULL); be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); @@ -911,6 +911,7 @@ be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, NULL); be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, &be_const_str_toint); be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, &be_const_str_type_to_string); be_define_const_str(success, "success", 979353360u, 0, 7, &be_const_str_widget_struct_by_class); +be_define_const_str(sum, "sum", 3712891560u, 0, 3, &be_const_str_wifi_arcs); be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); be_define_const_str(switch_factory, "switch_factory", 4206217516u, 0, 14, NULL); be_define_const_str(sys, "sys", 3277365014u, 0, 3, NULL); @@ -1545,6 +1546,6 @@ static const bstring* const m_string_table[] = { static const struct bconststrtab m_const_string_table = { .size = 506, - .count = 1035, + .count = 1036, .table = m_string_table }; diff --git a/lib/libesp32/berry/generate/be_fixed_crc.h b/lib/libesp32/berry/generate/be_fixed_crc.h index 7c78f4490..468346ba7 100644 --- a/lib/libesp32/berry/generate/be_fixed_crc.h +++ b/lib/libesp32/berry/generate/be_fixed_crc.h @@ -2,13 +2,14 @@ static be_define_const_map_slots(m_libcrc_map) { { be_const_key(crc32, 1), be_const_ctype_func(c_crc32) }, - { be_const_key(crc8, 2), be_const_ctype_func(c_crc8) }, + { be_const_key(sum, -1), be_const_ctype_func(c_sum) }, { be_const_key(crc16, -1), be_const_ctype_func(c_crc16) }, + { be_const_key(crc8, -1), be_const_ctype_func(c_crc8) }, }; static be_define_const_map( m_libcrc_map, - 3 + 4 ); static be_define_const_module( diff --git a/lib/libesp32/berry_tasmota/src/be_crc32_module.c b/lib/libesp32/berry_tasmota/src/be_crc32_module.c index 6a5962ee6..ec9f436b1 100644 --- a/lib/libesp32/berry_tasmota/src/be_crc32_module.c +++ b/lib/libesp32/berry_tasmota/src/be_crc32_module.c @@ -10,21 +10,30 @@ #include "rom/crc.h" -uint32_t c_crc32(uint32_t crc, const uint8_t* buf, size_t size) { +static uint32_t c_crc32(uint32_t crc, const uint8_t* buf, size_t size) { return crc32_le(crc, buf, size); } BE_FUNC_CTYPE_DECLARE(c_crc32, "i", "i(bytes)~") -uint32_t c_crc16(uint32_t crc, const uint8_t* buf, size_t size) { +static uint32_t c_crc16(uint32_t crc, const uint8_t* buf, size_t size) { return crc16_le(crc, buf, size); } BE_FUNC_CTYPE_DECLARE(c_crc16, "i", "i(bytes)~") -uint32_t c_crc8(uint32_t crc, const uint8_t* buf, size_t size) { +static uint32_t c_crc8(uint32_t crc, const uint8_t* buf, size_t size) { return crc8_le(crc, buf, size); } BE_FUNC_CTYPE_DECLARE(c_crc8, "i", "i(bytes)~") +static uint32_t c_sum(const uint8_t* buf, size_t size) { + uint32_t sum = 0; + for (uint32_t i = 0; i < size; i++) { + sum = (sum + buf[i]) & 0xFF; + } + return sum; +} +BE_FUNC_CTYPE_DECLARE(c_sum, "i", "(bytes)~") + // const uint32_t crc32_tab[] = { // 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, // 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, @@ -83,6 +92,7 @@ module crc (scope: global) { crc32, ctype_func(c_crc32) crc16, ctype_func(c_crc16) crc8, ctype_func(c_crc8) + sum, ctype_func(c_sum) } @const_object_info_end */ #include "be_fixed_crc.h" From ce33aa5f9d3b7b3fb574460ab44c493250447643 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 24 May 2022 22:45:04 +0200 Subject: [PATCH 280/376] Berry zigbee phase 1 --- lib/libesp32/berry/default/be_modtab.c | 6 + lib/libesp32/berry/generate/be_const_strtab.h | 6 + .../berry/generate/be_const_strtab_def.h | 2527 +++++++++-------- .../generate/be_fixed_be_class_zb_coord_ntv.h | 23 + .../generate/be_fixed_be_class_zb_device.h | 20 + .../be_fixed_be_class_zcl_frame_ntv.h | 17 + lib/libesp32/berry/generate/be_fixed_zigbee.h | 17 + .../berry_mapping/src/be_const_members.c | 1 + lib/libesp32/berry_tasmota/src/be_zigbee.c | 173 ++ .../berry_tasmota/src/be_zigbee_zb_coord.c | 214 ++ .../berry_tasmota/src/be_zigbee_zcl_frame.c | 255 ++ .../berry_tasmota/src/embedded/zigbee.be | 17 + .../src/embedded/zigbee_zb_coord.be | 59 + .../src/embedded/zigbee_zcl_frame.be | 50 + tasmota/xdrv_23_zigbee_1_headers.ino | 1 - tasmota/xdrv_23_zigbee_2_devices.ino | 2 +- tasmota/xdrv_23_zigbee_5_converters.ino | 8 +- tasmota/xdrv_23_zigbee_8_parsers.ino | 2 +- tasmota/xdrv_52_3_berry_zigbee.ino | 239 ++ 19 files changed, 2371 insertions(+), 1266 deletions(-) create mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zb_coord_ntv.h create mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zb_device.h create mode 100644 lib/libesp32/berry/generate/be_fixed_be_class_zcl_frame_ntv.h create mode 100644 lib/libesp32/berry/generate/be_fixed_zigbee.h create mode 100644 lib/libesp32/berry_tasmota/src/be_zigbee.c create mode 100644 lib/libesp32/berry_tasmota/src/be_zigbee_zb_coord.c create mode 100644 lib/libesp32/berry_tasmota/src/be_zigbee_zcl_frame.c create mode 100644 lib/libesp32/berry_tasmota/src/embedded/zigbee.be create mode 100644 lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be create mode 100644 lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be create mode 100644 tasmota/xdrv_52_3_berry_zigbee.ino diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index d0b71fc4b..8f7addd94 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -48,6 +48,9 @@ be_extern_native_module(uuid); be_extern_native_module(animate); be_extern_native_module(partition_core); be_extern_native_module(crc); +#ifdef USE_ZIGBEE +be_extern_native_module(zigbee); +#endif // USE_ZIGBEE #ifdef USE_LVGL be_extern_native_module(lv); be_extern_native_module(lv_extra); @@ -147,6 +150,9 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #ifdef USE_WEBSERVER &be_native_module(webserver), #endif // USE_WEBSERVER +#ifdef USE_ZIGBEE + &be_native_module(zigbee), +#endif // USE_ZIGBEE &be_native_module(flash), &be_native_module(partition_core), &be_native_module(crc), diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 53f756da7..3b61ccf21 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -265,6 +265,7 @@ extern const bcstring be_const_str__timers; extern const bcstring be_const_str__validate; extern const bcstring be_const_str__write; extern const bcstring be_const_str_a; +extern const bcstring be_const_str_abort; extern const bcstring be_const_str_abs; extern const bcstring be_const_str_acos; extern const bcstring be_const_str_active_otadata; @@ -569,6 +570,7 @@ extern const bcstring be_const_str_imax; extern const bcstring be_const_str_img; extern const bcstring be_const_str_imin; extern const bcstring be_const_str_import; +extern const bcstring be_const_str_info; extern const bcstring be_const_str_init; extern const bcstring be_const_str_init_draw_arc_dsc; extern const bcstring be_const_str_init_draw_line_dsc; @@ -1032,5 +1034,9 @@ extern const bcstring be_const_str_y; extern const bcstring be_const_str_y1; extern const bcstring be_const_str_year; extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_zb_coord_ntv; +extern const bcstring be_const_str_zb_device; +extern const bcstring be_const_str_zcl_frame; +extern const bcstring be_const_str_zcl_frame_ntv; extern const bcstring be_const_str_zero; extern const bcstring be_const_str_zip; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index f47dcf8fc..c9217e6c3 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,981 +1,983 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str__X2F_X3Frst_X3D); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_response_append); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, NULL); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_add_cmd); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str__X3C); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str__X2E_X2E); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str__X3D); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_conn_cb); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_seq1); -be_define_const_str(_X23, "#", 638357778u, 0, 1, NULL); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_imin); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_draw_line_dsc); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_event_cb); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X7B); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_tasmota); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_settings); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_EVENT_DRAW_MAIN); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_chars_in_string); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_dac_voltage); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_depower); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_finish); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_gamma10); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_stop_iteration); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_content_send); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_duration); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_begin); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF); be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, NULL); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_cb_do_nothing); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_crc); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, NULL); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_set_huesat); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_set_chr); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_EVENT_DRAW_PART_BEGIN); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_valuer_error); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_color); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_delay); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, NULL); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_decrypt); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_begin_multicast); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_coredump); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_CFG_X3A_X20running_X20); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_classname); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str__available); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_load); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, NULL); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_COLOR_BLACK); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_member); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_I2C_Driver); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_SERIAL_8N1); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_codedump); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_MAX_RMT); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_get_log); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_battery_present); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, NULL); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_ota_max); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_cb_event_closure); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, NULL); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_Tasmota); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_local); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_consume_silence); -be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str__X5D); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_get_image_size); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_SERIAL_5E1); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_read24); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_switch_factory); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_adv_watch); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_hue); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_cmd_res); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, NULL); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, NULL); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_efuse_em); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_check_not_method); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_INTERNAL_PDM); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, NULL); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_SERIAL_8O1); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str__t); +be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_rule); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str__timers); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_count); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_WS2812_GRB); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_delay); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_get_image_size); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_data); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_set_rgb); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, NULL); +be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_AudioOutputI2S); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_lv_wifi_arcs_icon); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_AudioGeneratorMP3); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_init); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_nvs); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_coord_arr); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_DIMMER); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_draw_line_dsc_init); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_log10); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_COLOR_BLACK); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_set_style_text_color); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_allocated); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_get_vbus_current); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_return_X20code_X3D_X25i); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_collect); +be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_line_dsc); +be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_WS2812); +be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_can_show); +be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str__anonymous_); +be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_obj); +be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); +be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str__global_def); +be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_time_dump); +be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str__persist_X2Ejson); +be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_addr); +be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_draw_ctx); +be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_set_channels); +be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); +be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_lv_extra); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_AudioGenerator); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_lv_); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, NULL); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_publish_result); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_super); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_get_string); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_invalidate_spiffs); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_compile); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_instance); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_Auto_X2Dconfiguration); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, NULL); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_Partition_otadata); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str__crons); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_rtc); be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_HTTP_GET); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_i2c_enabled); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "", 4247924536u, 0, 19, &be_const_str_a); +be_define_const_str(_X3D, "=", 940354920u, 0, 1, &be_const_str_None); +be_define_const_str(_X3D_X3C_X3E_X21, "=<>!", 2664470277u, 0, 4, &be_const_str_animators); +be_define_const_str(_X3D_X3D, "==", 2431966415u, 0, 2, &be_const_str_is_dirty); +be_define_const_str(_X3E, ">", 990687777u, 0, 1, &be_const_str_EVENT_DELETE); +be_define_const_str(_X3E_X3D, ">=", 284975636u, 0, 2, &be_const_str_CFG_X3A_X20return_code_X3D_X25i); +be_define_const_str(_X3F, "?", 973910158u, 0, 1, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson); +be_define_const_str(AA50, "AA50", 2265997666u, 0, 4, &be_const_str_loop); +be_define_const_str(AES_GCM, "AES_GCM", 3832208678u, 0, 7, NULL); +be_define_const_str(ALIGN_BOTTOM_MID, "ALIGN_BOTTOM_MID", 3933267889u, 0, 16, &be_const_str_make_cb); +be_define_const_str(ALIGN_LEFT_MID, "ALIGN_LEFT_MID", 1043035067u, 0, 14, &be_const_str_continue); +be_define_const_str(AXP192, "AXP192", 757230128u, 0, 6, &be_const_str_md5); +be_define_const_str(Animate_X20pc_X20is_X20out_X20of_X20range, "Animate pc is out of range", 1854929421u, 0, 26, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_module); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_flags); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_add_light); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_INTERNAL_DAC); +be_define_const_str(AudioOpusDecoder, "AudioOpusDecoder", 1187272062u, 0, 16, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_SERIAL_7O2); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, &be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s); +be_define_const_str(Auto_X2Dconfiguration, "Auto-configuration", 1665006109u, 0, 18, &be_const_str_classname); +be_define_const_str(BECDFE, "BECDFE", 608341218u, 0, 6, &be_const_str_upper); +be_define_const_str(BLE, "BLE", 3933843306u, 0, 3, NULL); +be_define_const_str(BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, "BRY: ERROR, bad json: ", 2715135809u, 0, 22, NULL); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27, "BRY: Exception> '", 3883673906u, 0, 17, &be_const_str_set_bri); +be_define_const_str(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: Exception> '%s' - %s", 2246990964u, 0, 25, &be_const_str__class); +be_define_const_str(BRY_X3A_X20argument_X20must_X20be_X20a_X20function, "BRY: argument must be a function", 3917068408u, 0, 32, NULL); +be_define_const_str(BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, "BRY: bytecode has wrong version '%s' (%i)", 2140321415u, 0, 41, &be_const_str_trig); +be_define_const_str(BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, "BRY: corrupt bytecode '%s'", 4009923544u, 0, 26, &be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27); +be_define_const_str(BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, "BRY: could not save compiled file %s (%s)", 736659787u, 0, 41, &be_const_str_crc32_ota_seq); be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, "BRY: failed to load '%s' (%s - %s)", 1047433014u, 0, 34, NULL); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_get_bri); -be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_quality); -be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, NULL); -be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str__rmt); -be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_False); -be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_exec_rules); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20_persist_X2Ejson, "BRY: failed to load _persist.json", 2991913445u, 0, 33, &be_const_str_set_ldo_enable); +be_define_const_str(BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, "BRY: failed to load compiled '%s' (%s)", 3488122666u, 0, 38, &be_const_str_is_factory); +be_define_const_str(BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, "BRY: failed to run compiled code '%s' - %s", 380265962u, 0, 42, &be_const_str_set_zoom); +be_define_const_str(BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, "BRY: invalid hue payload: ", 203709367u, 0, 26, &be_const_str__lvgl); +be_define_const_str(BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, "BRY: method not allowed, use a closure like '/ args -> obj.func(args)'", 177121572u, 0, 70, &be_const_str_write_flash); +be_define_const_str(BUTTON_CONFIGURATION, "BUTTON_CONFIGURATION", 70820856u, 0, 20, &be_const_str_time_str); be_define_const_str(CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, "CFG: 'init.bat' done, restarting", 1569670677u, 0, 32, NULL); -be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_INTERNAL_DAC); -be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, &be_const_str_EXTERNAL_I2S); -be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str_EVENT_DRAW_MAIN); -be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_dimmer); -be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, NULL); -be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, &be_const_str_ct); -be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_SERIAL_5O2); -be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, &be_const_str_start); -be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_add_event_cb); -be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, NULL); -be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_mqtt_data); -be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_SERIAL_5N2); -be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_back_forth); -be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str_read_sensors); -be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, &be_const_str_draw_arc_dsc_init); -be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_init_draw_line_dsc); -be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str_run_bat); -be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, &be_const_str__error); -be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str_save_before_restart); +be_define_const_str(CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, "CFG: Exception> '%s' - %s", 1228874553u, 0, 25, &be_const_str_engine); +be_define_const_str(CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, "CFG: No '*.autoconf' file found", 755798501u, 0, 31, &be_const_str_SERIAL_5E1); +be_define_const_str(CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, "CFG: could not run %s (%s - %s)", 1428829580u, 0, 31, &be_const_str__buffer); +be_define_const_str(CFG_X3A_X20downloading_X20_X27_X25s_X27, "CFG: downloading '%s'", 589480701u, 0, 21, &be_const_str_pop); +be_define_const_str(CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, "CFG: exception '%s' - '%s'", 4095407913u, 0, 26, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf); +be_define_const_str(CFG_X3A_X20loaded_X20_X20, "CFG: loaded ", 3710273538u, 0, 13, NULL); +be_define_const_str(CFG_X3A_X20loaded_X20_X27_X25s_X27, "CFG: loaded '%s'", 1699028828u, 0, 16, &be_const_str_button_pressed); +be_define_const_str(CFG_X3A_X20loading_X20, "CFG: loading ", 4010361503u, 0, 13, &be_const_str_get_current_module_path); +be_define_const_str(CFG_X3A_X20loading_X20_X27_X25s_X27, "CFG: loading '%s'", 2285306097u, 0, 17, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, "CFG: multiple autoconf files found, aborting ('%s' + '%s')", 197663371u, 0, 58, &be_const_str_set_bat); +be_define_const_str(CFG_X3A_X20ran_X20_X20, "CFG: ran ", 3579570472u, 0, 10, &be_const_str_del); +be_define_const_str(CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, "CFG: removed file '%s'", 2048602473u, 0, 22, &be_const_str_item); +be_define_const_str(CFG_X3A_X20removing_X20autoconf_X20files, "CFG: removing autoconf files", 4014704970u, 0, 28, &be_const_str_ct); +be_define_const_str(CFG_X3A_X20removing_X20first_X20time_X20marker, "CFG: removing first time marker", 2125556683u, 0, 31, &be_const_str___iterator__); +be_define_const_str(CFG_X3A_X20return_code_X3D_X25i, "CFG: return_code=%i", 2059897320u, 0, 19, &be_const_str__cmd); +be_define_const_str(CFG_X3A_X20running_X20, "CFG: running ", 2478334534u, 0, 13, &be_const_str_ceil); +be_define_const_str(CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, "CFG: skipping 'display.ini' because already present in file-system", 3965549264u, 0, 66, &be_const_str__begin_transmission); +be_define_const_str(COLOR_BLACK, "COLOR_BLACK", 264427940u, 0, 11, NULL); +be_define_const_str(COLOR_WHITE, "COLOR_WHITE", 2536871270u, 0, 11, &be_const_str__error); be_define_const_str(CT, "CT", 1792671826u, 0, 2, NULL); -be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, &be_const_str_remove_timer); -be_define_const_str(EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 3217293201u, 0, 32, &be_const_str_read13); -be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, &be_const_str_add_cron); -be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, &be_const_str_bool); -be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str_assign_rmt); -be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, &be_const_str_for); -be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, &be_const_str_remove_rule); -be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_None); -be_define_const_str(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 2684107141u, 0, 48, NULL); -be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str_is_ota); -be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_getbits); -be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, &be_const_str_SERIAL_5N1); -be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_nan); +be_define_const_str(DIMMER, "DIMMER", 4049308363u, 0, 6, &be_const_str_SERIAL_8O2); +be_define_const_str(EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 3217293201u, 0, 32, &be_const_str_ctypes_bytes_dyn); +be_define_const_str(EC_C25519, "EC_C25519", 95492591u, 0, 9, NULL); +be_define_const_str(EVENT_DELETE, "EVENT_DELETE", 282828603u, 0, 12, &be_const_str_resp_cmnd_str); +be_define_const_str(EVENT_DRAW_MAIN, "EVENT_DRAW_MAIN", 1955620614u, 0, 15, &be_const_str__subscribe); +be_define_const_str(EVENT_DRAW_PART_BEGIN, "EVENT_DRAW_PART_BEGIN", 3391865024u, 0, 21, &be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF); +be_define_const_str(EVENT_DRAW_PART_END, "EVENT_DRAW_PART_END", 3301625292u, 0, 19, NULL); +be_define_const_str(EXTERNAL_I2S, "EXTERNAL_I2S", 4067456169u, 0, 12, &be_const_str_close); +be_define_const_str(FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", 2684107141u, 0, 48, &be_const_str_set_bits_per_sample); +be_define_const_str(False, "False", 2541049336u, 0, 5, &be_const_str_SERIAL_7O1); +be_define_const_str(GET, "GET", 2531704439u, 0, 3, &be_const_str_path); +be_define_const_str(HTTP_GET, "HTTP_GET", 1722467738u, 0, 8, &be_const_str_spiffs); +be_define_const_str(HTTP_POST, "HTTP_POST", 1999554144u, 0, 9, &be_const_str_SERIAL_7N2); be_define_const_str(I2C_X3A, "I2C:", 813483371u, 0, 4, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str__p); -be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, NULL); -be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str__dirty); -be_define_const_str(Invalid_X20ota_X20partition_X20number, "Invalid ota partition number", 1611602265u, 0, 28, &be_const_str_Unknown); -be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str___upper__); -be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, &be_const_str_set_style_bg_color); -be_define_const_str(MAX_RMT, "MAX_RMT", 1615574873u, 0, 7, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_data); -be_define_const_str(MI32, "MI32", 4074273414u, 0, 4, &be_const_str_escape); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_while); +be_define_const_str(INTERNAL_DAC, "INTERNAL_DAC", 1097623719u, 0, 12, &be_const_str_load_templates); +be_define_const_str(INTERNAL_PDM, "INTERNAL_PDM", 3043685628u, 0, 12, &be_const_str_find); +be_define_const_str(Invalid_X20ota_X20partition_X20number, "Invalid ota partition number", 1611602265u, 0, 28, &be_const_str_STATE_DEFAULT); +be_define_const_str(LVG_X3A_X20call_X20to_X20unsupported_X20callback, "LVG: call to unsupported callback", 504176819u, 0, 33, &be_const_str_get_hor_res); +be_define_const_str(Leds, "Leds", 2709245275u, 0, 4, &be_const_str_pixels_buffer); +be_define_const_str(MAX_RMT, "MAX_RMT", 1615574873u, 0, 7, &be_const_str_MI32); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, NULL); +be_define_const_str(MI32, "MI32", 4074273414u, 0, 4, &be_const_str_digital_write); be_define_const_str(No_X20SPIFFS_X20partition_X20found, "No SPIFFS partition found", 4165718279u, 0, 25, NULL); -be_define_const_str(None, "None", 810547195u, 0, 4, &be_const_str_SERIAL_7E1); -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SERIAL_7N1); -be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, NULL); -be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, NULL); -be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_maxota); -be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, &be_const_str_before_del); -be_define_const_str(Partition, "Partition", 3077057705u, 0, 9, NULL); -be_define_const_str(Partition_info, "Partition_info", 3970922042u, 0, 14, &be_const_str__archive); -be_define_const_str(Partition_otadata, "Partition_otadata", 2666256496u, 0, 17, &be_const_str_name); -be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_every_50ms); -be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, NULL); -be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, &be_const_str__X5D_X2C_X0A_X20_X20); -be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_wifi_bars); -be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_collect); -be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_p2); -be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, &be_const_str_get_input_power_status); -be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, &be_const_str_pin); -be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_calldepth); -be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_pixel_count); -be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, &be_const_str_content_button); -be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_count); -be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_find_key_i); -be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_connect); -be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_millis); -be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_sec); -be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str__end_transmission); -be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, NULL); -be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_get_option); -be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_create_custom_widget); -be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_uuid4); -be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, NULL); -be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_content_send_style); -be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, &be_const_str_global); -be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_ismethod); -be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, NULL); -be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_acos); -be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, &be_const_str_fast_loop); -be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_set_dcdc_enable); -be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_deg); -be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, &be_const_str_lvgl_timer_dispatch); -be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str_get_width); -be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str_set_bat); -be_define_const_str(TASMOTA, "TASMOTA", 2487641028u, 0, 7, &be_const_str_del); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_app); -be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_add_light); -be_define_const_str(Too_X20many_X20partiition_X20slots, "Too many partiition slots", 3190277896u, 0, 25, &be_const_str_addr); -be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, &be_const_str_obj_event_base); -be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str__debug_present); -be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str_get_factory_slot); -be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_nvs); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_public_key); -be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, &be_const_str_enabled); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_clear); -be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_get_percentage); -be_define_const_str(_X5D, "]", 3624670792u, 0, 1, NULL); -be_define_const_str(_X5D_X2C_X0A_X20_X20, "],\n ", 2456223650u, 0, 5, &be_const_str_add_header); -be_define_const_str(_, "_", 3658226030u, 0, 1, &be_const_str_end); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_upper); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_adv_cb); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, NULL); -be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, &be_const_str_a); -be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, &be_const_str_connection_error); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, NULL); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_set_active); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_assert); -be_define_const_str(_change_buffer, "_change_buffer", 2101848693u, 0, 14, NULL); -be_define_const_str(_class, "_class", 2732146350u, 0, 6, NULL); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); -be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, &be_const_str_ins_time); -be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_call); -be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_every_second); -be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_tob64); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_is_running); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); -be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_gpio); -be_define_const_str(_error, "_error", 1132109656u, 0, 6, &be_const_str_signal_bars); -be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, &be_const_str_rule); -be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_debug); -be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, &be_const_str_log); -be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_setbits); -be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_byte); -be_define_const_str(_p, "_p", 1594591802u, 0, 2, NULL); -be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, &be_const_str_ceil); -be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize); -be_define_const_str(_read, "_read", 346717030u, 0, 5, &be_const_str_round_start); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_get_switches); -be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, &be_const_str_depower); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_autorun); -be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str_json_fdump_any); -be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, NULL); -be_define_const_str(_splash, "_splash", 3660617917u, 0, 7, &be_const_str_resp_cmnd_error); -be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_coord_arr); -be_define_const_str(_t, "_t", 1527481326u, 0, 2, &be_const_str_full_state); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_closure); -be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, &be_const_str_digital_read); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_atan); -be_define_const_str(a, "a", 3826002220u, 0, 1, &be_const_str_spiffs); -be_define_const_str(abs, "abs", 709362235u, 0, 3, &be_const_str_arg); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_call_native); -be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_else); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_ip); -be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_obj_class_create_obj); +be_define_const_str(None, "None", 810547195u, 0, 4, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, NULL); +be_define_const_str(OneWire, "OneWire", 2298990722u, 0, 7, &be_const_str_lights); +be_define_const_str(PART_MAIN, "PART_MAIN", 2473491508u, 0, 9, &be_const_str_json_fdump); +be_define_const_str(POST, "POST", 1929554311u, 0, 4, &be_const_str_publish); +be_define_const_str(Parameter_X20error, "Parameter error", 3840042038u, 0, 15, &be_const_str_Wire); +be_define_const_str(Partition, "Partition", 3077057705u, 0, 9, &be_const_str_delete_all_configs); +be_define_const_str(Partition_info, "Partition_info", 3970922042u, 0, 14, &be_const_str_get_bat_voltage); +be_define_const_str(Partition_otadata, "Partition_otadata", 2666256496u, 0, 17, &be_const_str_SERIAL_8E2); +be_define_const_str(RELAY, "RELAY", 2163786658u, 0, 5, &be_const_str_hex); +be_define_const_str(RES_OK, "RES_OK", 1233817284u, 0, 6, &be_const_str_debug); +be_define_const_str(RGB, "RGB", 3386082140u, 0, 3, &be_const_str_ip); +be_define_const_str(RGBCT, "RGBCT", 8076251u, 0, 5, &be_const_str_devices); +be_define_const_str(RGBW, "RGBW", 3270986321u, 0, 4, &be_const_str_alternate); +be_define_const_str(Restart_X201, "Restart 1", 3504455855u, 0, 9, &be_const_str_deregister_obj); +be_define_const_str(SERIAL_5E1, "SERIAL_5E1", 1163775235u, 0, 10, NULL); +be_define_const_str(SERIAL_5E2, "SERIAL_5E2", 1180552854u, 0, 10, NULL); +be_define_const_str(SERIAL_5N1, "SERIAL_5N1", 3313031680u, 0, 10, &be_const_str_SERIAL_8O1); +be_define_const_str(SERIAL_5N2, "SERIAL_5N2", 3363364537u, 0, 10, &be_const_str_get_style_pad_right); +be_define_const_str(SERIAL_5O1, "SERIAL_5O1", 3782657917u, 0, 10, NULL); +be_define_const_str(SERIAL_5O2, "SERIAL_5O2", 3732325060u, 0, 10, &be_const_str_begin_multicast); +be_define_const_str(SERIAL_6E1, "SERIAL_6E1", 334249486u, 0, 10, &be_const_str_call_native); +be_define_const_str(SERIAL_6E2, "SERIAL_6E2", 317471867u, 0, 10, &be_const_str_decrypt); +be_define_const_str(SERIAL_6N1, "SERIAL_6N1", 198895701u, 0, 10, &be_const_str_web_add_console_button); +be_define_const_str(SERIAL_6N2, "SERIAL_6N2", 148562844u, 0, 10, &be_const_str_class_init_obj); +be_define_const_str(SERIAL_6O1, "SERIAL_6O1", 266153272u, 0, 10, &be_const_str_getbits); +be_define_const_str(SERIAL_6O2, "SERIAL_6O2", 316486129u, 0, 10, &be_const_str_argument_X20must_X20be_X20a_X20list); +be_define_const_str(SERIAL_7E1, "SERIAL_7E1", 147718061u, 0, 10, &be_const_str_info); +be_define_const_str(SERIAL_7E2, "SERIAL_7E2", 97385204u, 0, 10, &be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj); +be_define_const_str(SERIAL_7N1, "SERIAL_7N1", 1891060246u, 0, 10, &be_const_str_print); +be_define_const_str(SERIAL_7N2, "SERIAL_7N2", 1874282627u, 0, 10, &be_const_str_argument_X20must_X20be_X20a_X20function); +be_define_const_str(SERIAL_7O1, "SERIAL_7O1", 1823802675u, 0, 10, &be_const_str_try_get_bec_version); +be_define_const_str(SERIAL_7O2, "SERIAL_7O2", 1840580294u, 0, 10, NULL); +be_define_const_str(SERIAL_8E1, "SERIAL_8E1", 2371121616u, 0, 10, &be_const_str_get_aps_voltage); +be_define_const_str(SERIAL_8E2, "SERIAL_8E2", 2421454473u, 0, 10, &be_const_str_add_handler); +be_define_const_str(SERIAL_8N1, "SERIAL_8N1", 2369297235u, 0, 10, &be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27); +be_define_const_str(SERIAL_8N2, "SERIAL_8N2", 2386074854u, 0, 10, NULL); +be_define_const_str(SERIAL_8O1, "SERIAL_8O1", 289122742u, 0, 10, &be_const_str_editable); +be_define_const_str(SERIAL_8O2, "SERIAL_8O2", 272345123u, 0, 10, &be_const_str_create_custom_widget); +be_define_const_str(SK6812_GRBW, "SK6812_GRBW", 81157857u, 0, 11, &be_const_str__X5D); +be_define_const_str(STATE_DEFAULT, "STATE_DEFAULT", 712406428u, 0, 13, &be_const_str_arc_dsc); +be_define_const_str(TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, "TAP: Loaded Tasmota App '%s'", 926477145u, 0, 28, &be_const_str_get_size); +be_define_const_str(TASMOTA, "TASMOTA", 2487641028u, 0, 7, NULL); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_set_matrix_pixel_color); +be_define_const_str(Tele, "Tele", 1329980653u, 0, 4, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); +be_define_const_str(Too_X20many_X20partiition_X20slots, "Too many partiition slots", 3190277896u, 0, 25, &be_const_str__available); +be_define_const_str(Trigger, "Trigger", 2783579555u, 0, 7, NULL); +be_define_const_str(True, "True", 3453902341u, 0, 4, &be_const_str_no_X20more_X20RMT_X20channel_X20available); +be_define_const_str(Unknown, "Unknown", 3424652889u, 0, 7, &be_const_str_iter); +be_define_const_str(Unknown_X20command, "Unknown command", 1830905432u, 0, 15, &be_const_str_percentage); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str__read); +be_define_const_str(WS2812_GRB, "WS2812_GRB", 1736405692u, 0, 10, &be_const_str__ptr); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_stop); +be_define_const_str(_X5B, "[", 3725336506u, 0, 1, &be_const_str_autoexec); +be_define_const_str(_X5D, "]", 3624670792u, 0, 1, &be_const_str_atleast1); +be_define_const_str(_X5D_X2C_X0A_X20_X20, "],\n ", 2456223650u, 0, 5, &be_const_str_cb_do_nothing); +be_define_const_str(_, "_", 3658226030u, 0, 1, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_get_bri); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_get_factory_slot); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_imin); +be_define_const_str(_anonymous_, "_anonymous_", 1957281476u, 0, 11, &be_const_str__fl); +be_define_const_str(_archive, "_archive", 4004559404u, 0, 8, &be_const_str_lv_wifi_bars_icon); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_time_reached); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_missing_X20name); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, &be_const_str_lv_event_cb); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_import); +be_define_const_str(_change_buffer, "_change_buffer", 2101848693u, 0, 14, &be_const_str_remove_cron); +be_define_const_str(_class, "_class", 2732146350u, 0, 6, &be_const_str_detect); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_color); +be_define_const_str(_crons, "_crons", 1000733579u, 0, 6, &be_const_str_light_to_id); +be_define_const_str(_debug_present, "_debug_present", 4063411725u, 0, 14, &be_const_str_math); +be_define_const_str(_def, "_def", 1985022181u, 0, 4, &be_const_str_isnan); +be_define_const_str(_dirty, "_dirty", 283846766u, 0, 6, &be_const_str_content_stop); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, &be_const_str_flash); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, &be_const_str_log); +be_define_const_str(_energy, "_energy", 535372070u, 0, 7, &be_const_str_push_path); +be_define_const_str(_error, "_error", 1132109656u, 0, 6, NULL); +be_define_const_str(_filename, "_filename", 1430813195u, 0, 9, &be_const_str_assign_rmt); +be_define_const_str(_fl, "_fl", 4042564892u, 0, 3, &be_const_str_scan); +be_define_const_str(_global_addr, "_global_addr", 533766721u, 0, 12, NULL); +be_define_const_str(_global_def, "_global_def", 646007001u, 0, 11, &be_const_str_rand); +be_define_const_str(_lvgl, "_lvgl", 2689219483u, 0, 5, &be_const_str_add_cmd); +be_define_const_str(_p, "_p", 1594591802u, 0, 2, &be_const_str_cb); +be_define_const_str(_persist_X2Ejson, "_persist.json", 2008425138u, 0, 13, NULL); +be_define_const_str(_ptr, "_ptr", 306235816u, 0, 4, &be_const_str_set_gain); +be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); +be_define_const_str(_rmt, "_rmt", 1094422685u, 0, 4, &be_const_str_file); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_app); +be_define_const_str(_settings_def, "_settings_def", 3775560307u, 0, 13, &be_const_str__settings_ptr); +be_define_const_str(_settings_ptr, "_settings_ptr", 1825772182u, 0, 13, &be_const_str_widget_editable); +be_define_const_str(_splash, "_splash", 3660617917u, 0, 7, &be_const_str_codedump); +be_define_const_str(_subscribe, "_subscribe", 2888456770u, 0, 10, &be_const_str_valuer_error); +be_define_const_str(_t, "_t", 1527481326u, 0, 2, NULL); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_get); +be_define_const_str(_validate, "_validate", 1742604448u, 0, 9, NULL); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_arch); +be_define_const_str(a, "a", 3826002220u, 0, 1, &be_const_str_set_MAC); +be_define_const_str(abort, "abort", 2771110649u, 0, 5, &be_const_str_i2c_enabled); +be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_issubclass); +be_define_const_str(active_otadata, "active_otadata", 3055353486u, 0, 14, &be_const_str_coredump); +be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_write_bit); +be_define_const_str(add_anim, "add_anim", 3980662668u, 0, 8, &be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map); be_define_const_str(add_cb_event_closure, "add_cb_event_closure", 1775958321u, 0, 20, NULL); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_lv_module_init); -be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_strip); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_json_fdump_list); -be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, NULL); -be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, NULL); -be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, &be_const_str_target_search); -be_define_const_str(add_header, "add_header", 927130612u, 0, 10, &be_const_str_classof); -be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, &be_const_str_get_style_bg_color); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, NULL); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_int); -be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, &be_const_str_get_coords); -be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, &be_const_str_set_svc); -be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_resp_cmnd_str); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_cb); -be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, &be_const_str_content_flush); -be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_get_cb_list); -be_define_const_str(animators, "animators", 279858213u, 0, 9, &be_const_str_widget_dtor_cb); -be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_line_dsc); -be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_widget_dtor_impl); -be_define_const_str(arch, "arch", 2952804297u, 0, 4, NULL); -be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_is_dirty); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_light_state); -be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, &be_const_str_screenshot); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_push_path); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, &be_const_str_set_reachable); -be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_invalid_X20magic_X20number_X20_X2502X); -be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_get_object_from_ptr); -be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, NULL); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_arg_size); +be_define_const_str(add_cron, "add_cron", 2475327477u, 0, 8, &be_const_str_toptr); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, &be_const_str_draw_arc_dsc_init); +be_define_const_str(add_event_cb, "add_event_cb", 633097693u, 0, 12, &be_const_str_screenshot); +be_define_const_str(add_fast_loop, "add_fast_loop", 3025842946u, 0, 13, &be_const_str_arg); +be_define_const_str(add_handler, "add_handler", 2055124119u, 0, 11, NULL); +be_define_const_str(add_header, "add_header", 927130612u, 0, 10, NULL); +be_define_const_str(add_light, "add_light", 3169328603u, 0, 9, NULL); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_animate); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_get_option); +be_define_const_str(adv_block, "adv_block", 4243837184u, 0, 9, &be_const_str_fast_loop); +be_define_const_str(adv_cb, "adv_cb", 1957890034u, 0, 6, &be_const_str_available); +be_define_const_str(adv_watch, "adv_watch", 3871786950u, 0, 9, &be_const_str_energy_struct); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_asin); +be_define_const_str(alternate, "alternate", 1140253277u, 0, 9, NULL); +be_define_const_str(animate, "animate", 3885786800u, 0, 7, &be_const_str_find_op); +be_define_const_str(animators, "animators", 279858213u, 0, 9, NULL); +be_define_const_str(app, "app", 527074092u, 0, 3, &be_const_str_back_forth); +be_define_const_str(arc_dsc, "arc_dsc", 2768816310u, 0, 7, &be_const_str_draw_line_dsc); +be_define_const_str(arch, "arch", 2952804297u, 0, 4, &be_const_str_constructor_cb); +be_define_const_str(area, "area", 2601460036u, 0, 4, &be_const_str_seq0); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_int64); +be_define_const_str(arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, "arg must be a subclass of lv_obj", 1641882079u, 0, 32, NULL); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_list_handlers); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); +be_define_const_str(argument_X20must_X20be_X20a_X20function, "argument must be a function", 527172389u, 0, 27, &be_const_str_display_X2Eini); +be_define_const_str(argument_X20must_X20be_X20a_X20list, "argument must be a list", 3056915661u, 0, 23, &be_const_str_min); +be_define_const_str(argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, "argument must be a list or a pointer+size", 241605448u, 0, 41, &be_const_str_consume_mono); be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, NULL); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, &be_const_str_publish); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_toupper); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_fromb64); -be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_leds); -be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, &be_const_str_class_init_obj); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_destructor_cb); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_introspect); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_set_style_line_color); +be_define_const_str(assign_rmt, "assign_rmt", 1047642576u, 0, 10, &be_const_str_tomap); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_bytes); +be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_lv_point); +be_define_const_str(atan2, "atan2", 3173440503u, 0, 5, &be_const_str_lvgl_timer_dispatch); +be_define_const_str(atleast1, "atleast1", 1956331672u, 0, 8, NULL); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_obj_class_create_obj); be_define_const_str(autoexec, "autoexec", 3676861891u, 0, 8, NULL); -be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_set_mode_ct); -be_define_const_str(available, "available", 1727918744u, 0, 9, &be_const_str_init_draw_arc_dsc); -be_define_const_str(b, "b", 3876335077u, 0, 1, &be_const_str_write_file); -be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_counters); -be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, &be_const_str_unknown_X20instruction); -be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, &be_const_str_bri); +be_define_const_str(autorun, "autorun", 1447527407u, 0, 7, &be_const_str_get_current_module_name); +be_define_const_str(available, "available", 1727918744u, 0, 9, NULL); +be_define_const_str(b, "b", 3876335077u, 0, 1, NULL); +be_define_const_str(back_forth, "back_forth", 2665042062u, 0, 10, &be_const_str_check_privileged_access); +be_define_const_str(base_class, "base_class", 1107737279u, 0, 10, NULL); +be_define_const_str(battery_present, "battery_present", 3588397058u, 0, 15, NULL); be_define_const_str(before_del, "before_del", 815924436u, 0, 10, NULL); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); -be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_digital_write); -be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_math); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_isrunning); +be_define_const_str(begin_multicast, "begin_multicast", 57647915u, 0, 15, &be_const_str_offseta); +be_define_const_str(bool, "bool", 3365180733u, 0, 4, &be_const_str_crc32); be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(bri, "bri", 2112284244u, 0, 3, &be_const_str_on); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_deregister_obj); -be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, NULL); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_content_send); +be_define_const_str(bri, "bri", 2112284244u, 0, 3, NULL); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, NULL); +be_define_const_str(button_pressed, "button_pressed", 1694209616u, 0, 14, &be_const_str_io_error); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_crc); be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, NULL); -be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_content_response); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_event); -be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_content_stop); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_write); -be_define_const_str(can_show, "can_show", 960091187u, 0, 8, &be_const_str_fromptr); -be_define_const_str(cb, "cb", 1428787088u, 0, 2, &be_const_str_crc16); +be_define_const_str(c, "c", 3859557458u, 0, 1, &be_const_str_hue_ntv); +be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_lv_event); +be_define_const_str(call_native, "call_native", 1389147405u, 0, 11, &be_const_str_refr_pos); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); +be_define_const_str(can_show, "can_show", 960091187u, 0, 8, NULL); +be_define_const_str(cb, "cb", 1428787088u, 0, 2, NULL); be_define_const_str(cb_do_nothing, "cb_do_nothing", 1488730702u, 0, 13, NULL); -be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, &be_const_str_draw_ctx); -be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, &be_const_str_try_remove_file); +be_define_const_str(cb_event_closure, "cb_event_closure", 3828267325u, 0, 16, NULL); +be_define_const_str(cb_obj, "cb_obj", 1195696482u, 0, 6, &be_const_str_null_cb); be_define_const_str(ccronexpr, "ccronexpr", 258146169u, 0, 9, NULL); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_gamma8); -be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_content_start); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_pc_rel); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_json_fdump_list); be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); -be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_page_autoconf_mgr); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_zip); +be_define_const_str(check_not_method, "check_not_method", 2597324607u, 0, 16, &be_const_str_ota_max); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_mqtt_listener); be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); -be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_cosh); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_break); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_font_montserrat); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_io_error); -be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_get_warning_level); -be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_get_current_module_path); -be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_flash); -be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_decode); -be_define_const_str(close, "close", 667630371u, 0, 5, NULL); -be_define_const_str(closure, "closure", 1548407746u, 0, 7, &be_const_str_while); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_esphttpd); -be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, &be_const_str_preinit); -be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_is_first_time); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_pop_path); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_ctypes_bytes); -be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_pc); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(compress, "compress", 2818084237u, 0, 8, NULL); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); -be_define_const_str(conn_cb, "conn_cb", 1381122945u, 0, 7, NULL); -be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_font_seg7); -be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_type_error); -be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_dac_voltage); -be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, NULL); -be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str_getfloat); -be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, &be_const_str_light_to_id); -be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_remove_cmd); -be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_event_send); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_reset_search); -be_define_const_str(content_response, "content_response", 3881475860u, 0, 16, &be_const_str_encrypt); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_stop); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_get_power); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_get_battery_chargin_status); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_ptr); +be_define_const_str(class_init_obj, "class_init_obj", 178410604u, 0, 14, &be_const_str_create_matrix); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_width); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, NULL); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_clock); +be_define_const_str(clear_first_time, "clear_first_time", 632769909u, 0, 16, &be_const_str_get_free_heap); +be_define_const_str(clear_to, "clear_to", 3528002130u, 0, 8, &be_const_str_instance_size); +be_define_const_str(clock, "clock", 363073373u, 0, 5, &be_const_str_exp); +be_define_const_str(clock_icon, "clock_icon", 544669651u, 0, 10, &be_const_str_copy); +be_define_const_str(close, "close", 667630371u, 0, 5, &be_const_str_signal_arcs); +be_define_const_str(closure, "closure", 1548407746u, 0, 7, NULL); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); +be_define_const_str(cmd_res, "cmd_res", 921166762u, 0, 7, NULL); +be_define_const_str(code, "code", 4180765940u, 0, 4, &be_const_str_web_add_handler); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_get_cb_list); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_detected_X20on_X20bus); +be_define_const_str(color, "color", 1031692888u, 0, 5, &be_const_str_content_flush); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); +be_define_const_str(compress, "compress", 2818084237u, 0, 8, &be_const_str_tele); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_remove_rule); +be_define_const_str(conn_cb, "conn_cb", 1381122945u, 0, 7, &be_const_str_fromptr); +be_define_const_str(connect, "connect", 2866859257u, 0, 7, &be_const_str_resp_cmnd_done); +be_define_const_str(connected, "connected", 1424938192u, 0, 9, &be_const_str_tr); +be_define_const_str(connection_error, "connection_error", 1358926260u, 0, 16, &be_const_str_try_remove_file); +be_define_const_str(constructor_cb, "constructor_cb", 2489105297u, 0, 14, &be_const_str_gpio); +be_define_const_str(consume_mono, "consume_mono", 3577563453u, 0, 12, &be_const_str_destructor_cb); +be_define_const_str(consume_silence, "consume_silence", 1445390925u, 0, 15, NULL); +be_define_const_str(consume_stereo, "consume_stereo", 1834661098u, 0, 14, &be_const_str_month); +be_define_const_str(contains, "contains", 1825239352u, 0, 8, &be_const_str_get_active); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_get_coords); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_exec_cmd); +be_define_const_str(content_response, "content_response", 3881475860u, 0, 16, &be_const_str_o); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_montserrat_font); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, &be_const_str_send); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, NULL); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_obj); -be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, &be_const_str_lv_signal_arcs); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, &be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_frombytes); -be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_set_timeouts); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_discover); -be_define_const_str(counters, "counters", 4095866864u, 0, 8, &be_const_str_instance); -be_define_const_str(crc, "crc", 3812935353u, 0, 3, NULL); -be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, &be_const_str_set_temp); -be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, NULL); -be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_remove_trailing_zeroes); -be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, NULL); -be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, &be_const_str_remove_driver); -be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_set_zoom); -be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, &be_const_str_minute); -be_define_const_str(ct, "ct", 1261010898u, 0, 2, NULL); -be_define_const_str(ctor, "ctor", 375399343u, 0, 4, &be_const_str_readline); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_refr_pos); -be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, NULL); -be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_tasmota); -be_define_const_str(data, "data", 3631407781u, 0, 4, NULL); -be_define_const_str(day, "day", 3830391293u, 0, 3, NULL); -be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_web_add_console_button); -be_define_const_str(decode, "decode", 3007678287u, 0, 6, &be_const_str_get_MAC); -be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_model); -be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_delete_all_configs); +be_define_const_str(coord_arr, "coord_arr", 4189963658u, 0, 9, &be_const_str_counters); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_local); +be_define_const_str(coredump, "coredump", 2141225116u, 0, 8, NULL); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, &be_const_str_json_append); +be_define_const_str(couldn_X27t_X20not_X20initialize_X20noepixelbus, "couldn't not initialize noepixelbus", 2536490812u, 0, 35, &be_const_str_pc_abs); +be_define_const_str(count, "count", 967958004u, 0, 5, NULL); +be_define_const_str(counters, "counters", 4095866864u, 0, 8, NULL); +be_define_const_str(crc, "crc", 3812935353u, 0, 3, &be_const_str_get_input_power_status); +be_define_const_str(crc16, "crc16", 3504496746u, 0, 5, NULL); +be_define_const_str(crc32, "crc32", 3571901412u, 0, 5, &be_const_str_send_multicast); +be_define_const_str(crc32_ota_seq, "crc32_ota_seq", 172417u, 0, 13, &be_const_str_now); +be_define_const_str(crc8, "crc8", 1178893587u, 0, 4, &be_const_str_get_height); +be_define_const_str(create_custom_widget, "create_custom_widget", 1140594778u, 0, 20, NULL); +be_define_const_str(create_matrix, "create_matrix", 3528185923u, 0, 13, &be_const_str_lv_clock_icon); +be_define_const_str(create_segment, "create_segment", 3863522719u, 0, 14, NULL); +be_define_const_str(ct, "ct", 1261010898u, 0, 2, &be_const_str_set_mode_rgb); +be_define_const_str(ctor, "ctor", 375399343u, 0, 4, NULL); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_parse); +be_define_const_str(ctypes_bytes_dyn, "ctypes_bytes_dyn", 915205307u, 0, 16, &be_const_str_every_second); +be_define_const_str(dac_voltage, "dac_voltage", 1552257222u, 0, 11, &be_const_str_discover); +be_define_const_str(data, "data", 3631407781u, 0, 4, &be_const_str_wifi_arcs); +be_define_const_str(day, "day", 3830391293u, 0, 3, &be_const_str_lv_coord_arr); +be_define_const_str(debug, "debug", 1483009432u, 0, 5, &be_const_str_skip); +be_define_const_str(decode, "decode", 3007678287u, 0, 6, NULL); +be_define_const_str(decompress, "decompress", 2887031650u, 0, 10, &be_const_str_running); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_dim); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_set_dc_voltage); -be_define_const_str(del, "del", 3478752842u, 0, 3, &be_const_str_finish); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, &be_const_str_number); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, &be_const_str_param); +be_define_const_str(del, "del", 3478752842u, 0, 3, &be_const_str_lv_wifi_arcs); be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); -be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, &be_const_str_json_append); -be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_iter); -be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_tr); -be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, &be_const_str_members); -be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_publish_result); -be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, &be_const_str_timer_cb); -be_define_const_str(devices, "devices", 2701822848u, 0, 7, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_o); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_engine); -be_define_const_str(dim, "dim", 3496118841u, 0, 3, &be_const_str_function); -be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_light); -be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, &be_const_str_set_ota_max); -be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_lv_event); -be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_floor); -be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, NULL); +be_define_const_str(delete_all_configs, "delete_all_configs", 2382067578u, 0, 18, &be_const_str_setfloat); +be_define_const_str(depower, "depower", 3563819571u, 0, 7, &be_const_str_unsubscribe); +be_define_const_str(deregister_obj, "deregister_obj", 3909966993u, 0, 14, &be_const_str_web_add_main_button); +be_define_const_str(destructor_cb, "destructor_cb", 1930283190u, 0, 13, NULL); +be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); +be_define_const_str(detected_X20on_X20bus, "detected on bus", 1432002650u, 0, 15, NULL); +be_define_const_str(devices, "devices", 2701822848u, 0, 7, &be_const_str_get_event_cb); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_encrypt); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_setrange); +be_define_const_str(dim, "dim", 3496118841u, 0, 3, &be_const_str_height_def); +be_define_const_str(dimmer, "dimmer", 794270539u, 0, 6, &be_const_str_enabled); +be_define_const_str(dirty, "dirty", 2667581083u, 0, 5, NULL); +be_define_const_str(discover, "discover", 1383599054u, 0, 8, &be_const_str_from_to); +be_define_const_str(display, "display", 1164572437u, 0, 7, &be_const_str_pct); +be_define_const_str(display_X2Eini, "display.ini", 2646174001u, 0, 11, &be_const_str_seg7_font); be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, &be_const_str_lvgl_event_dispatch); -be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, &be_const_str_point); -be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_find); -be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, NULL); -be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_set_alternate); +be_define_const_str(draw_arc, "draw_arc", 1828251676u, 0, 8, NULL); +be_define_const_str(draw_arc_dsc, "draw_arc_dsc", 2411410957u, 0, 12, &be_const_str_esphttpd); +be_define_const_str(draw_arc_dsc_init, "draw_arc_dsc_init", 402724044u, 0, 17, &be_const_str_light); +be_define_const_str(draw_ctx, "draw_ctx", 953366593u, 0, 8, &be_const_str_read13); +be_define_const_str(draw_line, "draw_line", 1634465686u, 0, 9, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); be_define_const_str(draw_line_dsc, "draw_line_dsc", 4220676203u, 0, 13, NULL); -be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_do); -be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, NULL); +be_define_const_str(draw_line_dsc_init, "draw_line_dsc_init", 3866693646u, 0, 18, &be_const_str_every_50ms); +be_define_const_str(driver_name, "driver_name", 862681603u, 0, 11, &be_const_str_ins_ramp); be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(duration, "duration", 799079693u, 0, 8, NULL); -be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_instance_X20required); -be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, &be_const_str_seq0); -be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, &be_const_str_montserrat_font); +be_define_const_str(duration, "duration", 799079693u, 0, 8, &be_const_str_set_width); +be_define_const_str(editable, "editable", 60532369u, 0, 8, &be_const_str_efuse_em); +be_define_const_str(efuse_em, "efuse_em", 1643301972u, 0, 8, NULL); +be_define_const_str(elements_X20must_X20be_X20a_X20lv_point, "elements must be a lv_point", 1415796524u, 0, 27, NULL); be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(enabled, "enabled", 49525662u, 0, 7, &be_const_str_reset); -be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_missing_X20name); +be_define_const_str(enabled, "enabled", 49525662u, 0, 7, NULL); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_fromstring); be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, &be_const_str_lv_timer_cb); -be_define_const_str(engine, "engine", 3993360443u, 0, 6, &be_const_str_partition_core); +be_define_const_str(energy_struct, "energy_struct", 1655792843u, 0, 13, NULL); +be_define_const_str(engine, "engine", 3993360443u, 0, 6, &be_const_str_p2); be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_set_exten); -be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, &be_const_str_is_spiffs); +be_define_const_str(escape, "escape", 2652972038u, 0, 6, &be_const_str_flush); +be_define_const_str(esphttpd, "esphttpd", 2255925709u, 0, 8, &be_const_str_event_send); be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); -be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_x); -be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_get_string); -be_define_const_str(event_send, "event_send", 598925582u, 0, 10, &be_const_str_remove_light); -be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_get_alternate); -be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, &be_const_str_isinstance); -be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_get_temp); -be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_mqtt); +be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); +be_define_const_str(event_cb, "event_cb", 3128698017u, 0, 8, &be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29); +be_define_const_str(event_send, "event_send", 598925582u, 0, 10, NULL); +be_define_const_str(every_100ms, "every_100ms", 1546407804u, 0, 11, &be_const_str_get_pixel_color); +be_define_const_str(every_250ms, "every_250ms", 2579240000u, 0, 11, NULL); +be_define_const_str(every_50ms, "every_50ms", 2383884008u, 0, 10, &be_const_str_gen_cb); +be_define_const_str(every_second, "every_second", 2075451465u, 0, 12, &be_const_str_get_vbus_voltage); be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_as); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_wire2); -be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, &be_const_str_publish_rule); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_send_multicast); -be_define_const_str(f, "f", 3809224601u, 0, 1, NULL); -be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_push); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_target); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); +be_define_const_str(exec_tele, "exec_tele", 1020751601u, 0, 9, NULL); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_web_send); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); +be_define_const_str(f, "f", 3809224601u, 0, 1, &be_const_str_format); +be_define_const_str(factory, "factory", 2510088205u, 0, 7, &be_const_str_set); be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, NULL); -be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_pct); -be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_is_factory); -be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_get_height); +be_define_const_str(fast_loop, "fast_loop", 3414422702u, 0, 9, &be_const_str_lv_style_prop_arr); +be_define_const_str(fast_loop_enabled, "fast_loop_enabled", 2567964376u, 0, 17, &be_const_str_font_seg7); +be_define_const_str(fat, "fat", 3203931412u, 0, 3, &be_const_str_lv_module_init); +be_define_const_str(file, "file", 2867484483u, 0, 4, &be_const_str_input); be_define_const_str(file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, "file extension is not '.be' or '.bec'", 3095719639u, 0, 37, NULL); -be_define_const_str(files, "files", 1055342736u, 0, 5, &be_const_str_find_op); -be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_resp_cmnd_failed); -be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, &be_const_str_tanh); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_invalidate_spiffs); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); -be_define_const_str(flags, "flags", 2624027180u, 0, 5, &be_const_str_gamma); -be_define_const_str(flash, "flash", 2944773417u, 0, 5, &be_const_str_out_X20of_X20range); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_hour); -be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_list_handlers); -be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_from_to); -be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, NULL); -be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_get_bat_current); +be_define_const_str(files, "files", 1055342736u, 0, 5, NULL); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_invalid_X20magic_X20number_X20_X2502X); +be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_save); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_type_to_string); +be_define_const_str(flags, "flags", 2624027180u, 0, 5, NULL); +be_define_const_str(flash, "flash", 2944773417u, 0, 5, &be_const_str_get_bat_current); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_widget_struct_default); +be_define_const_str(flush, "flush", 3002334877u, 0, 5, &be_const_str_run); +be_define_const_str(font_embedded, "font_embedded", 1623675143u, 0, 13, &be_const_str_pi); +be_define_const_str(font_montserrat, "font_montserrat", 3790091262u, 0, 15, &be_const_str_lv_wifi_bars); +be_define_const_str(font_seg7, "font_seg7", 1551771835u, 0, 9, &be_const_str_remove_timer); be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_fromstring); -be_define_const_str(from_to, "from_to", 21625507u, 0, 7, NULL); -be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_input); -be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, NULL); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_page_autoconf_mgr); +be_define_const_str(from_to, "from_to", 21625507u, 0, 7, &be_const_str_mqtt); +be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, &be_const_str_redirect); +be_define_const_str(frombytes, "frombytes", 3771700788u, 0, 9, &be_const_str_internal_error); be_define_const_str(fromhex, "fromhex", 1847150394u, 0, 7, NULL); -be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, NULL); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_introspect); -be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_listdir); -be_define_const_str(full_status, "full_status", 648242459u, 0, 11, &be_const_str_otadata); -be_define_const_str(function, "function", 2664841801u, 0, 8, &be_const_str_resize); -be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_load_freetype_font); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_init); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, &be_const_str_xy); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_now); -be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_h); -be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, &be_const_str_sinh); -be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_ins_ramp); -be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, NULL); +be_define_const_str(fromptr, "fromptr", 666189689u, 0, 7, &be_const_str_refr_now); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_write8); +be_define_const_str(full_state, "full_state", 255687770u, 0, 10, &be_const_str_get_name); +be_define_const_str(full_status, "full_status", 648242459u, 0, 11, &be_const_str_wire2); +be_define_const_str(function, "function", 2664841801u, 0, 8, NULL); +be_define_const_str(gamma, "gamma", 3492353034u, 0, 5, &be_const_str_pixel_count); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_slots); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_for); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_set_style_border_width); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_quality); +be_define_const_str(get_MAC, "get_MAC", 2091521771u, 0, 7, NULL); +be_define_const_str(get_active, "get_active", 3504842642u, 0, 10, &be_const_str_set_height); +be_define_const_str(get_alternate, "get_alternate", 1450148894u, 0, 13, &be_const_str_model); be_define_const_str(get_aps_voltage, "get_aps_voltage", 2293036435u, 0, 15, NULL); -be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, &be_const_str_int64); -be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, NULL); -be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, NULL); -be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, &be_const_str_success); +be_define_const_str(get_bat_charge_current, "get_bat_charge_current", 1385293050u, 0, 22, NULL); +be_define_const_str(get_bat_current, "get_bat_current", 1912106073u, 0, 15, &be_const_str_widget_ctor_cb); +be_define_const_str(get_bat_power, "get_bat_power", 3067374853u, 0, 13, &be_const_str_elif); +be_define_const_str(get_bat_voltage, "get_bat_voltage", 706676538u, 0, 15, NULL); be_define_const_str(get_battery_chargin_status, "get_battery_chargin_status", 2233241571u, 0, 26, NULL); -be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, &be_const_str_time_dump); -be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, NULL); -be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_matrix); -be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, NULL); -be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, NULL); -be_define_const_str(get_event_cb, "get_event_cb", 375876088u, 0, 12, &be_const_str_top); -be_define_const_str(get_factory_slot, "get_factory_slot", 3086140407u, 0, 16, NULL); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson); -be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_list); -be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, NULL); -be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, NULL); -be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, NULL); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_power_off); -be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27); -be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, &be_const_str_persist); -be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_srand); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, NULL); -be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, &be_const_str_set_MAC); -be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, &be_const_str_json_fdump); -be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, &be_const_str_img); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_real); -be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_refr_now); -be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_sqrt); -be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, NULL); -be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, &be_const_str_null_cb); -be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_get_vbus_current); -be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, &be_const_str_imax); -be_define_const_str(get_switches, "get_switches", 4116216928u, 0, 12, NULL); -be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_height_def); -be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, &be_const_str_state); -be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, &be_const_str_set_style_text_color); +be_define_const_str(get_bri, "get_bri", 2041809895u, 0, 7, NULL); +be_define_const_str(get_cb_list, "get_cb_list", 1605319182u, 0, 11, &be_const_str_mqtt_data); +be_define_const_str(get_coords, "get_coords", 1044089006u, 0, 10, &be_const_str_get_object_from_ptr); +be_define_const_str(get_current_module_name, "get_current_module_name", 2379270740u, 0, 23, &be_const_str_id); +be_define_const_str(get_current_module_path, "get_current_module_path", 3206673408u, 0, 23, &be_const_str_register_button_encoder); +be_define_const_str(get_event_cb, "get_event_cb", 375876088u, 0, 12, &be_const_str_lv_signal_bars); +be_define_const_str(get_factory_slot, "get_factory_slot", 3086140407u, 0, 16, &be_const_str_set_power); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_set_chg_current); +be_define_const_str(get_height, "get_height", 3571755523u, 0, 10, &be_const_str_resize); +be_define_const_str(get_hor_res, "get_hor_res", 37131144u, 0, 11, &be_const_str_group_def); +be_define_const_str(get_image_size, "get_image_size", 4009859887u, 0, 14, &be_const_str_img); +be_define_const_str(get_input_power_status, "get_input_power_status", 4102829177u, 0, 22, &be_const_str_get_style_line_color); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(get_log, "get_log", 3524441898u, 0, 7, &be_const_str_set_exten); +be_define_const_str(get_name, "get_name", 1616902907u, 0, 8, NULL); +be_define_const_str(get_object_from_ptr, "get_object_from_ptr", 2345019201u, 0, 19, &be_const_str_get_switch); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_phy); +be_define_const_str(get_ota_slot, "get_ota_slot", 2686180151u, 0, 12, &be_const_str_set_chr); +be_define_const_str(get_percentage, "get_percentage", 2880483992u, 0, 14, &be_const_str_lv_timer_cb); +be_define_const_str(get_pixel_color, "get_pixel_color", 337490048u, 0, 15, &be_const_str_has); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, NULL); +be_define_const_str(get_size, "get_size", 2803644713u, 0, 8, &be_const_str_sec); +be_define_const_str(get_string, "get_string", 4195847969u, 0, 10, &be_const_str_is_first_time); +be_define_const_str(get_style_bg_color, "get_style_bg_color", 964794381u, 0, 18, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(get_style_line_color, "get_style_line_color", 805371932u, 0, 20, NULL); +be_define_const_str(get_style_pad_right, "get_style_pad_right", 3150287466u, 0, 19, &be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27); +be_define_const_str(get_switch, "get_switch", 164821028u, 0, 10, &be_const_str_touch_update); +be_define_const_str(get_switches, "get_switches", 4116216928u, 0, 12, &be_const_str_set_user_data); +be_define_const_str(get_temp, "get_temp", 3370919486u, 0, 8, &be_const_str_set_text); +be_define_const_str(get_vbus_current, "get_vbus_current", 1205347942u, 0, 16, &be_const_str_getfloat); +be_define_const_str(get_vbus_voltage, "get_vbus_voltage", 2398210401u, 0, 16, &be_const_str_init_draw_line_dsc); be_define_const_str(get_warning_level, "get_warning_level", 1737834441u, 0, 17, NULL); be_define_const_str(get_width, "get_width", 3293417300u, 0, 9, NULL); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, &be_const_str_internal_error); -be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, &be_const_str_value_error); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_remove_cron); -be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_lv_obj_class); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(getfloat, "getfloat", 2820979603u, 0, 8, &be_const_str_read24); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_set_tasmota_logo); +be_define_const_str(global, "global", 503252654u, 0, 6, &be_const_str_insert); be_define_const_str(gpio, "gpio", 2638155258u, 0, 4, NULL); -be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, &be_const_str__X7B); -be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_test); -be_define_const_str(h, "h", 3977000791u, 0, 1, &be_const_str_lv_style_prop_arr); +be_define_const_str(group_def, "group_def", 1524213328u, 0, 9, NULL); +be_define_const_str(groups, "groups", 2943077229u, 0, 6, &be_const_str_name); +be_define_const_str(h, "h", 3977000791u, 0, 1, NULL); be_define_const_str(has, "has", 3988721635u, 0, 3, NULL); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_if); -be_define_const_str(has_factory, "has_factory", 2702829042u, 0, 11, &be_const_str_set_hum); -be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, &be_const_str_lv_extra); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); -be_define_const_str(hour, "hour", 3053661199u, 0, 4, &be_const_str_keys); -be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, &be_const_str_set); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, NULL); -be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, &be_const_str_pc_abs); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_push); +be_define_const_str(has_factory, "has_factory", 2702829042u, 0, 11, &be_const_str_invalid_X20GPIO_X20number); +be_define_const_str(height_def, "height_def", 2348238838u, 0, 10, &be_const_str_resp_cmnd_error); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, &be_const_str_set_time); +be_define_const_str(hour, "hour", 3053661199u, 0, 4, NULL); +be_define_const_str(hs2rgb, "hs2rgb", 1040816349u, 0, 6, &be_const_str_set_align); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s/%s.autoconf", 2743526309u, 0, 70, &be_const_str_light_state); +be_define_const_str(https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_manifest_X2Ejson, "https://raw.githubusercontent.com/tasmota/autoconf/main/%s_manifest.json", 3657552045u, 0, 72, NULL); be_define_const_str(hue, "hue", 3817694041u, 0, 3, NULL); -be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_set_style_line_color); -be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_offset); +be_define_const_str(hue_ntv, "hue_ntv", 705068642u, 0, 7, &be_const_str_solidified); +be_define_const_str(hue_status, "hue_status", 437978812u, 0, 10, &be_const_str_json); be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, NULL); -be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str_try_run_compiled); -be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_seti); +be_define_const_str(id, "id", 926444256u, 0, 2, &be_const_str__X7D); +be_define_const_str(id_X20must_X20be_X20of_X20type_X20_X27int_X27, "id must be of type 'int'", 2097653458u, 0, 24, &be_const_str_set_style_img_recolor_opa); be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, &be_const_str_set_style_radius); -be_define_const_str(img, "img", 2229740804u, 0, 3, &be_const_str_write_bit); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_set_user_data); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(img, "img", 2229740804u, 0, 3, NULL); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_lv_signal_bars); -be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, &be_const_str_register_obj); -be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, NULL); -be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); -be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, &be_const_str_set_timer); -be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, NULL); +be_define_const_str(info, "info", 263456517u, 0, 4, NULL); +be_define_const_str(init, "init", 380752755u, 0, 4, &be_const_str_load); +be_define_const_str(init_draw_arc_dsc, "init_draw_arc_dsc", 1655274348u, 0, 17, NULL); +be_define_const_str(init_draw_line_dsc, "init_draw_line_dsc", 2507936040u, 0, 18, &be_const_str_pow); +be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_save_before_restart); +be_define_const_str(ins_goto, "ins_goto", 1342843963u, 0, 8, NULL); +be_define_const_str(ins_ramp, "ins_ramp", 1068049360u, 0, 8, &be_const_str_manuf); be_define_const_str(ins_time, "ins_time", 2980245553u, 0, 8, NULL); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); -be_define_const_str(instance, "instance", 193386898u, 0, 8, NULL); -be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_pixels_buffer); -be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, &be_const_str_set_pixel_color); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_set_matrix_pixel_color); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_remove_driver); +be_define_const_str(instance, "instance", 193386898u, 0, 8, &be_const_str_static); +be_define_const_str(instance_X20required, "instance required", 381192159u, 0, 17, &be_const_str_on); +be_define_const_str(instance_size, "instance_size", 4280269518u, 0, 13, NULL); +be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); be_define_const_str(int64, "int64", 64103268u, 0, 5, NULL); -be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, &be_const_str_zero); +be_define_const_str(internal_error, "internal_error", 2519158169u, 0, 14, &be_const_str_obj_event_base); be_define_const_str(introspect, "introspect", 164638290u, 0, 10, NULL); -be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, &be_const_str_rand); -be_define_const_str(invalid_X20magic_X20number_X20_X2502X, "invalid magic number %02X", 2836756259u, 0, 25, NULL); +be_define_const_str(invalid_X20GPIO_X20number, "invalid GPIO number", 4135793328u, 0, 19, NULL); +be_define_const_str(invalid_X20magic_X20number_X20_X2502X, "invalid magic number %02X", 2836756259u, 0, 25, &be_const_str_set_svc); be_define_const_str(invalidate, "invalidate", 2649734928u, 0, 10, NULL); be_define_const_str(invalidate_spiffs, "invalidate_spiffs", 1470453498u, 0, 17, NULL); -be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, &be_const_str_load_otadata); -be_define_const_str(ip, "ip", 1261996636u, 0, 2, NULL); +be_define_const_str(io_error, "io_error", 1970281036u, 0, 8, &be_const_str_map); +be_define_const_str(ip, "ip", 1261996636u, 0, 2, &be_const_str_memory); be_define_const_str(is_dirty, "is_dirty", 418034110u, 0, 8, NULL); be_define_const_str(is_factory, "is_factory", 1312753376u, 0, 10, NULL); -be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, NULL); +be_define_const_str(is_first_time, "is_first_time", 275242384u, 0, 13, &be_const_str_update); be_define_const_str(is_ota, "is_ota", 2892315548u, 0, 6, NULL); -be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, NULL); -be_define_const_str(is_spiffs, "is_spiffs", 3196570601u, 0, 9, &be_const_str_set_gain); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, NULL); +be_define_const_str(is_running, "is_running", 2226847261u, 0, 10, &be_const_str_lvgl_event_dispatch); +be_define_const_str(is_spiffs, "is_spiffs", 3196570601u, 0, 9, &be_const_str_ismethod); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, &be_const_str_rounded); +be_define_const_str(ismethod, "ismethod", 3513438880u, 0, 8, &be_const_str_zero); be_define_const_str(isnan, "isnan", 2981347434u, 0, 5, NULL); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_mqtt_listener); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_topic); be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_set_x); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_loop); -be_define_const_str(json, "json", 916562499u, 0, 4, &be_const_str_return_X20code_X3D_X25i); -be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_p1); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_set_hum); +be_define_const_str(json, "json", 916562499u, 0, 4, NULL); +be_define_const_str(json_append, "json_append", 3002019284u, 0, 11, &be_const_str_next); be_define_const_str(json_fdump, "json_fdump", 1694216580u, 0, 10, NULL); -be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, &be_const_str_month); -be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, &be_const_str_setfloat); -be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_set_power); -be_define_const_str(label, "label", 4137097213u, 0, 5, &be_const_str_set_bri); -be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, NULL); -be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_map); -be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_reapply); -be_define_const_str(light, "light", 3801947695u, 0, 5, NULL); -be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, NULL); +be_define_const_str(json_fdump_any, "json_fdump_any", 3348629385u, 0, 14, NULL); +be_define_const_str(json_fdump_list, "json_fdump_list", 3903879853u, 0, 15, &be_const_str_break); +be_define_const_str(json_fdump_map, "json_fdump_map", 4091954653u, 0, 14, &be_const_str_set_auth); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_setbits); +be_define_const_str(label, "label", 4137097213u, 0, 5, NULL); +be_define_const_str(last_modified, "last_modified", 772177145u, 0, 13, &be_const_str_sum); +be_define_const_str(leds, "leds", 558858555u, 0, 4, &be_const_str_page_autoconf_ctl); +be_define_const_str(length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, "length in bits must be between 0 and 32", 2584509128u, 0, 39, &be_const_str_webclient); +be_define_const_str(light, "light", 3801947695u, 0, 5, &be_const_str_lv_obj_class); +be_define_const_str(light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, "light must be of class 'light_state'", 3669350396u, 0, 36, &be_const_str_millis); be_define_const_str(light_state, "light_state", 905783845u, 0, 11, NULL); -be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, NULL); -be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_slots); -be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, NULL); -be_define_const_str(list, "list", 217798785u, 0, 4, NULL); -be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, NULL); +be_define_const_str(light_to_id, "light_to_id", 1117015647u, 0, 11, &be_const_str_udp); +be_define_const_str(lights, "lights", 425118420u, 0, 6, &be_const_str_zcl_frame_ntv); +be_define_const_str(line_dsc, "line_dsc", 4094490978u, 0, 8, &be_const_str_lv_point_arr); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_ptr); +be_define_const_str(list_handlers, "list_handlers", 593774371u, 0, 13, &be_const_str_lv_solidified); be_define_const_str(listdir, "listdir", 2005220720u, 0, 7, NULL); -be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_lv_event_cb); -be_define_const_str(load_otadata, "load_otadata", 1955073712u, 0, 12, NULL); -be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(local, "local", 2621662984u, 0, 5, NULL); -be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str__X7B_X7D); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_set_first_time); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_manuf); -be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_open); -be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_set_width); -be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, &be_const_str_pop); +be_define_const_str(load, "load", 3859241449u, 0, 4, &be_const_str_p1); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); +be_define_const_str(load_otadata, "load_otadata", 1955073712u, 0, 12, &be_const_str_widget_cb); +be_define_const_str(load_templates, "load_templates", 3513870133u, 0, 14, NULL); +be_define_const_str(local, "local", 2621662984u, 0, 5, &be_const_str_wire1); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_set_mode_ct); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_lv_clock); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, &be_const_str_top); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, NULL); +be_define_const_str(lv, "lv", 1529997255u, 0, 2, &be_const_str_str); +be_define_const_str(lv_, "lv_", 663721032u, 0, 3, &be_const_str_show); +be_define_const_str(lv_clock, "lv_clock", 2859904766u, 0, 8, NULL); be_define_const_str(lv_clock_icon, "lv_clock_icon", 3257216210u, 0, 13, NULL); -be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, &be_const_str_splash_init); -be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, NULL); +be_define_const_str(lv_coord_arr, "lv_coord_arr", 1197238601u, 0, 12, NULL); +be_define_const_str(lv_event, "lv_event", 2434089968u, 0, 8, &be_const_str_value_error); be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, &be_const_str_time_str); -be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, &be_const_str_serial); +be_define_const_str(lv_extra, "lv_extra", 399561998u, 0, 8, NULL); +be_define_const_str(lv_module_init, "lv_module_init", 1133027755u, 0, 14, NULL); be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, NULL); -be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_save); -be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, &be_const_str_write8); +be_define_const_str(lv_obj_class, "lv_obj_class", 4039656294u, 0, 12, &be_const_str_seq1); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_reset_search); +be_define_const_str(lv_point_arr, "lv_point_arr", 3959768858u, 0, 12, NULL); be_define_const_str(lv_signal_arcs, "lv_signal_arcs", 2839156988u, 0, 14, NULL); -be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, &be_const_str_set_rgb); -be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_to_gamma); -be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, &be_const_str_offseta); -be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, NULL); -be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_url_encode); -be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_set_ct); -be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, NULL); -be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, &be_const_str_try_compile); -be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, &be_const_str_y); -be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, NULL); -be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, NULL); -be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, &be_const_str_shared_key); -be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_stop_iteration); -be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_search); -be_define_const_str(matrix, "matrix", 365099244u, 0, 6, &be_const_str_path); -be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, &be_const_str_splash_remove); -be_define_const_str(md5, "md5", 2393554675u, 0, 3, &be_const_str_resp_cmnd_done); -be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_return); -be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_udp); +be_define_const_str(lv_signal_bars, "lv_signal_bars", 3513972559u, 0, 14, NULL); +be_define_const_str(lv_solidified, "lv_solidified", 2274121310u, 0, 13, &be_const_str_write); +be_define_const_str(lv_style_prop_arr, "lv_style_prop_arr", 2504347499u, 0, 17, NULL); +be_define_const_str(lv_timer_cb, "lv_timer_cb", 1383473763u, 0, 11, &be_const_str_set_hue16sat); +be_define_const_str(lv_wifi_arcs, "lv_wifi_arcs", 2082091963u, 0, 12, &be_const_str_maxota); +be_define_const_str(lv_wifi_arcs_icon, "lv_wifi_arcs_icon", 1507982909u, 0, 17, &be_const_str_range); +be_define_const_str(lv_wifi_bars, "lv_wifi_bars", 2109539196u, 0, 12, &be_const_str_set_dcdc_enable); +be_define_const_str(lv_wifi_bars_icon, "lv_wifi_bars_icon", 2805815540u, 0, 17, NULL); +be_define_const_str(lvgl_event_dispatch, "lvgl_event_dispatch", 2104396622u, 0, 19, NULL); +be_define_const_str(lvgl_timer_dispatch, "lvgl_timer_dispatch", 975257833u, 0, 19, &be_const_str_pin_used); +be_define_const_str(make_cb, "make_cb", 71252785u, 0, 7, &be_const_str_read_sensors); +be_define_const_str(manuf, "manuf", 4120929560u, 0, 5, &be_const_str_round_start); +be_define_const_str(map, "map", 3751997361u, 0, 3, &be_const_str_value); +be_define_const_str(math, "math", 4001929615u, 0, 4, &be_const_str_set_xy); +be_define_const_str(matrix, "matrix", 365099244u, 0, 6, &be_const_str_r); +be_define_const_str(maxota, "maxota", 2594898265u, 0, 6, NULL); +be_define_const_str(md5, "md5", 2393554675u, 0, 3, NULL); +be_define_const_str(member, "member", 719708611u, 0, 6, NULL); +be_define_const_str(members, "members", 937576464u, 0, 7, NULL); be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_web_add_config_button); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, &be_const_str_timer_cb); be_define_const_str(min, "min", 3381609815u, 0, 3, NULL); -be_define_const_str(minute, "minute", 954666857u, 0, 6, NULL); -be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, NULL); -be_define_const_str(model, "model", 2961925722u, 0, 5, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); +be_define_const_str(minute, "minute", 954666857u, 0, 6, &be_const_str_state); +be_define_const_str(missing_X20name, "missing name", 3635024006u, 0, 12, &be_const_str_widget_dtor_impl); +be_define_const_str(model, "model", 2961925722u, 0, 5, NULL); be_define_const_str(module, "module", 3617558685u, 0, 6, NULL); -be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_read_bytes); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, &be_const_str_super); -be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_run_cron); -be_define_const_str(mqtt_data, "mqtt_data", 2538213364u, 0, 9, NULL); -be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, &be_const_str_widget_event_cb); -be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_set_auth); -be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_page_autoconf_ctl); -be_define_const_str(next, "next", 1555467752u, 0, 4, &be_const_str_web_add_button); -be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, &be_const_str_raw); +be_define_const_str(month, "month", 3598321157u, 0, 5, &be_const_str_uuid4); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(mqtt, "mqtt", 353147387u, 0, 4, &be_const_str_set_y); +be_define_const_str(mqtt_data, "mqtt_data", 2538213364u, 0, 9, &be_const_str_rad); +be_define_const_str(mqtt_listener, "mqtt_listener", 2764719532u, 0, 13, NULL); +be_define_const_str(name, "name", 2369371622u, 0, 4, &be_const_str_started); +be_define_const_str(nan, "nan", 797905850u, 0, 3, &be_const_str_set_style_img_recolor); +be_define_const_str(next, "next", 1555467752u, 0, 4, NULL); +be_define_const_str(next_cron, "next_cron", 3260705337u, 0, 9, NULL); be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); be_define_const_str(no_X20GPIO_X20specified_X20for_X20neopixelbus, "no GPIO specified for neopixelbus", 42078528u, 0, 33, NULL); -be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, &be_const_str_set_chg_current); +be_define_const_str(no_X20more_X20RMT_X20channel_X20available, "no more RMT channel available", 305838632u, 0, 29, &be_const_str_write_file); be_define_const_str(now, "now", 682728183u, 0, 3, NULL); be_define_const_str(null_cb, "null_cb", 2333536460u, 0, 7, NULL); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_refr_size); -be_define_const_str(nvs, "nvs", 477704066u, 0, 3, &be_const_str_size); -be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, &be_const_str_param); -be_define_const_str(o, "o", 3926667934u, 0, 1, NULL); -be_define_const_str(obj, "obj", 3343205242u, 0, 3, &be_const_str_skip); -be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, &be_const_str_read12); +be_define_const_str(number, "number", 467038368u, 0, 6, NULL); +be_define_const_str(nvs, "nvs", 477704066u, 0, 3, &be_const_str_setitem); +be_define_const_str(nvskeys, "nvskeys", 1760042990u, 0, 7, &be_const_str_search); +be_define_const_str(o, "o", 3926667934u, 0, 1, &be_const_str_splash_init); +be_define_const_str(obj, "obj", 3343205242u, 0, 3, NULL); +be_define_const_str(obj_class_create_obj, "obj_class_create_obj", 3304390632u, 0, 20, NULL); be_define_const_str(obj_event_base, "obj_event_base", 1624064363u, 0, 14, NULL); -be_define_const_str(offset, "offset", 348705738u, 0, 6, &be_const_str_false); -be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, NULL); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_pin_mode); -be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str_print); +be_define_const_str(offset, "offset", 348705738u, 0, 6, NULL); +be_define_const_str(offseta, "offseta", 1663383089u, 0, 7, &be_const_str_style_prop_arr); +be_define_const_str(on, "on", 1630810064u, 0, 2, NULL); +be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will cause a restart.\");'>", 232646018u, 0, 57, &be_const_str__X7B_X7D); be_define_const_str(onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, "onsubmit='return confirm(\"This will change the current configuration and cause a restart.\");'>", 3792412559u, 0, 94, NULL); -be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_resolvecmnd); -be_define_const_str(ota_, "ota_", 773595766u, 0, 4, &be_const_str_set_ldo_voltage); +be_define_const_str(open, "open", 3546203337u, 0, 4, &be_const_str_remove_light); +be_define_const_str(ota_, "ota_", 773595766u, 0, 4, &be_const_str_register_obj); be_define_const_str(ota_max, "ota_max", 2940511240u, 0, 7, NULL); be_define_const_str(otadata, "otadata", 1962391757u, 0, 7, NULL); -be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, NULL); -be_define_const_str(p1, "p1", 2689521274u, 0, 2, NULL); +be_define_const_str(out_X20of_X20range, "out of range", 2236631477u, 0, 12, &be_const_str_persist); +be_define_const_str(p1, "p1", 2689521274u, 0, 2, &be_const_str_zip); be_define_const_str(p2, "p2", 2672743655u, 0, 2, NULL); -be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_webclient); -be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, &be_const_str_tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29); -be_define_const_str(param, "param", 1309554226u, 0, 5, NULL); -be_define_const_str(parse, "parse", 1111180012u, 0, 5, &be_const_str_widget_constructor); -be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, &be_const_str_subtype); -be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_update); +be_define_const_str(page_autoconf_ctl, "page_autoconf_ctl", 2453381496u, 0, 17, &be_const_str_width_def); +be_define_const_str(page_autoconf_mgr, "page_autoconf_mgr", 3643937031u, 0, 17, NULL); +be_define_const_str(param, "param", 1309554226u, 0, 5, &be_const_str_set_style_pad_all); +be_define_const_str(parse, "parse", 1111180012u, 0, 5, &be_const_str_x); +be_define_const_str(partition_core, "partition_core", 2913046901u, 0, 14, &be_const_str_write_bytes); +be_define_const_str(path, "path", 2223459638u, 0, 4, &be_const_str_set_ldo_voltage); be_define_const_str(pc, "pc", 1313756516u, 0, 2, NULL); -be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, NULL); -be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_nil); +be_define_const_str(pc_abs, "pc_abs", 920256495u, 0, 6, &be_const_str_set_style_text_font); +be_define_const_str(pc_rel, "pc_rel", 991921176u, 0, 6, &be_const_str_web_send_decimal); be_define_const_str(pct, "pct", 1431300144u, 0, 3, NULL); -be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, NULL); -be_define_const_str(persist, "persist", 3917083779u, 0, 7, NULL); +be_define_const_str(percentage, "percentage", 2538831285u, 0, 10, &be_const_str_set_percentage); +be_define_const_str(persist, "persist", 3917083779u, 0, 7, &be_const_str_read32); be_define_const_str(persist_X2E_p_X20is_X20not_X20a_X20map, "persist._p is not a map", 1176528732u, 0, 23, NULL); -be_define_const_str(phy, "phy", 1648673716u, 0, 3, NULL); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(phy, "phy", 1648673716u, 0, 3, &be_const_str_set_first_time); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, &be_const_str_run_deferred); be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_set_rate); -be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, NULL); -be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, NULL); -be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_widget_group_def); -be_define_const_str(point, "point", 414084241u, 0, 5, &be_const_str_set_text); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_refr_size); +be_define_const_str(pixel_count, "pixel_count", 2439130743u, 0, 11, &be_const_str_set_temp); +be_define_const_str(pixel_size, "pixel_size", 2209135785u, 0, 10, &be_const_str_widget_destructor); +be_define_const_str(pixels_buffer, "pixels_buffer", 1229555807u, 0, 13, &be_const_str_readbytes); +be_define_const_str(point, "point", 414084241u, 0, 5, &be_const_str_publish_rule); be_define_const_str(point_arr, "point_arr", 1140859857u, 0, 9, NULL); be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); be_define_const_str(pop_path, "pop_path", 2403243998u, 0, 8, NULL); be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(power_off, "power_off", 3568741752u, 0, 9, NULL); -be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, &be_const_str_style_prop_arr); -be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_range); +be_define_const_str(power_off, "power_off", 3568741752u, 0, 9, &be_const_str_write_gpio); +be_define_const_str(preinit, "preinit", 2722007100u, 0, 7, NULL); +be_define_const_str(print, "print", 372738696u, 0, 5, &be_const_str_rotate); be_define_const_str(ptr, "ptr", 1433816073u, 0, 3, NULL); -be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, &be_const_str_set_percentage); -be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_topic); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_running); -be_define_const_str(publish_rule, "publish_rule", 1829459523u, 0, 12, NULL); +be_define_const_str(public_key, "public_key", 4169142980u, 0, 10, NULL); +be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_scr_act); +be_define_const_str(publish_rule, "publish_rule", 1829459523u, 0, 12, &be_const_str_remove); be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); be_define_const_str(push_path, "push_path", 1155254157u, 0, 9, NULL); -be_define_const_str(quality, "quality", 2597670950u, 0, 7, &be_const_str_year); -be_define_const_str(r, "r", 4144776981u, 0, 1, NULL); +be_define_const_str(quality, "quality", 2597670950u, 0, 7, &be_const_str_resolvecmnd); +be_define_const_str(r, "r", 4144776981u, 0, 1, &be_const_str_class); be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_set_channels); -be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_set_style_img_recolor); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(range, "range", 4208725202u, 0, 5, &be_const_str_tan); be_define_const_str(raw, "raw", 1140790001u, 0, 3, NULL); -be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_rounded); -be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); +be_define_const_str(read, "read", 3470762949u, 0, 4, &be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, &be_const_str_web_add_button); +be_define_const_str(read13, "read13", 12887293u, 0, 6, &be_const_str_toupper); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, &be_const_str_set_huesat); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_wifi_arcs_icon); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_remote_port); be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, &be_const_str_remove); -be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_target); -be_define_const_str(readline, "readline", 1212709927u, 0, 8, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, &be_const_str_touch_update); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); -be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, &be_const_str_true); -be_define_const_str(refr_pos, "refr_pos", 1020780033u, 0, 8, &be_const_str_set_mode_rgb); -be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, NULL); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_signal_change); -be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, NULL); -be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, &be_const_str_type); +be_define_const_str(read_sensors, "read_sensors", 892689201u, 0, 12, &be_const_str_serial); +be_define_const_str(readbytes, "readbytes", 2716426756u, 0, 9, &be_const_str_set_light); +be_define_const_str(readline, "readline", 1212709927u, 0, 8, &be_const_str_resp_cmnd); +be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_widget_instance_size); +be_define_const_str(reapply, "reapply", 3778939332u, 0, 7, NULL); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_sys); +be_define_const_str(refr_now, "refr_now", 3191284735u, 0, 8, &be_const_str_strftime); +be_define_const_str(refr_pos, "refr_pos", 1020780033u, 0, 8, &be_const_str_splash); +be_define_const_str(refr_size, "refr_size", 1958144468u, 0, 9, &be_const_str_toint); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, &be_const_str_signal_bars); +be_define_const_str(register_obj, "register_obj", 3982614770u, 0, 12, &be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function); +be_define_const_str(remote_ip, "remote_ip", 2953154693u, 0, 9, NULL); be_define_const_str(remote_port, "remote_port", 2163585967u, 0, 11, NULL); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_tele); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, &be_const_str_toptr); -be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, NULL); -be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, NULL); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_reverse_gamma10); +be_define_const_str(remove_cron, "remove_cron", 2914538962u, 0, 11, NULL); +be_define_const_str(remove_driver, "remove_driver", 1030243768u, 0, 13, &be_const_str_web_add_config_button); +be_define_const_str(remove_light, "remove_light", 1783624394u, 0, 12, &be_const_str_set_useragent); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); -be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, &be_const_str_tostring); +be_define_const_str(remove_trailing_zeroes, "remove_trailing_zeroes", 2688378377u, 0, 22, &be_const_str_success); be_define_const_str(reset, "reset", 1695364032u, 0, 5, NULL); be_define_const_str(reset_search, "reset_search", 1350414305u, 0, 12, NULL); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, &be_const_str_scale_uint); be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_tan); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_sat); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_scale_uint); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, &be_const_str_test); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, &be_const_str_subscribe); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, &be_const_str_widget_event); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_widget_cb); -be_define_const_str(return, "return", 2246981567u, 60, 6, &be_const_str_static); -be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_try_rule); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(return_X20code_X3D_X25i, "return code=%i", 2127454401u, 0, 14, &be_const_str_as); be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); be_define_const_str(rotate, "rotate", 2784296202u, 0, 6, NULL); -be_define_const_str(round_end, "round_end", 985288225u, 0, 9, &be_const_str_signal_arcs); -be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_write_gpio); -be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, &be_const_str_web_add_handler); +be_define_const_str(round_end, "round_end", 985288225u, 0, 9, NULL); +be_define_const_str(round_start, "round_start", 2949484384u, 0, 11, &be_const_str_widget_constructor); +be_define_const_str(rounded, "rounded", 1920734138u, 0, 7, NULL); be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); be_define_const_str(rule, "rule", 4230889683u, 0, 4, NULL); be_define_const_str(run, "run", 718098122u, 0, 3, NULL); be_define_const_str(run_bat, "run_bat", 2536903298u, 0, 7, NULL); -be_define_const_str(run_cron, "run_cron", 1929098555u, 0, 8, &be_const_str_widget_event_impl); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_string); +be_define_const_str(run_cron, "run_cron", 1929098555u, 0, 8, &be_const_str_signal_change); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, &be_const_str_widget_ctor_impl); be_define_const_str(running, "running", 343848780u, 0, 7, NULL); -be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_sin); +be_define_const_str(sat, "sat", 3592196823u, 0, 3, &be_const_str_try_compile); be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, &be_const_str_set_style_pad_right); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, &be_const_str_wifi); +be_define_const_str(save_before_restart, "save_before_restart", 1253239338u, 0, 19, &be_const_str_type_error); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); be_define_const_str(scan, "scan", 3974641896u, 0, 4, NULL); -be_define_const_str(scr_act, "scr_act", 2080211456u, 0, 7, &be_const_str_web_send_decimal); +be_define_const_str(scr_act, "scr_act", 2080211456u, 0, 7, &be_const_str_widget_group_def); be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(search, "search", 2150836393u, 0, 6, &be_const_str_set_style_border_width); -be_define_const_str(sec, "sec", 3139892658u, 0, 3, NULL); +be_define_const_str(search, "search", 2150836393u, 0, 6, NULL); +be_define_const_str(sec, "sec", 3139892658u, 0, 3, &be_const_str_set_ota_max); be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_widget_struct_default); -be_define_const_str(send, "send", 1919010991u, 0, 4, &be_const_str_set_style_pad_all); +be_define_const_str(select, "select", 297952813u, 0, 6, &be_const_str_tolower); +be_define_const_str(send, "send", 1919010991u, 0, 4, NULL); be_define_const_str(send_multicast, "send_multicast", 812185870u, 0, 14, NULL); -be_define_const_str(seq0, "seq0", 880225636u, 0, 4, &be_const_str_splash); +be_define_const_str(seq0, "seq0", 880225636u, 0, 4, NULL); be_define_const_str(seq1, "seq1", 897003255u, 0, 4, NULL); be_define_const_str(serial, "serial", 3687697785u, 0, 6, NULL); be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); be_define_const_str(set_MAC, "set_MAC", 1617581015u, 0, 7, NULL); -be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, NULL); -be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, &be_const_str_set_xy); -be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str_set_light); -be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, NULL); +be_define_const_str(set_active, "set_active", 3683994102u, 0, 10, &be_const_str_yield); +be_define_const_str(set_align, "set_align", 2592958913u, 0, 9, NULL); +be_define_const_str(set_alternate, "set_alternate", 1709680562u, 0, 13, &be_const_str_widget_event_cb); +be_define_const_str(set_auth, "set_auth", 1057170930u, 0, 8, &be_const_str_tostring); be_define_const_str(set_bat, "set_bat", 2736667351u, 0, 7, NULL); -be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, NULL); +be_define_const_str(set_bits_per_sample, "set_bits_per_sample", 3747657551u, 0, 19, &be_const_str_sin); be_define_const_str(set_bri, "set_bri", 2789118779u, 0, 7, NULL); -be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, NULL); +be_define_const_str(set_channels, "set_channels", 1370190620u, 0, 12, &be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D); be_define_const_str(set_chg_current, "set_chg_current", 336304386u, 0, 15, NULL); be_define_const_str(set_chr, "set_chr", 102133743u, 0, 7, NULL); -be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, &be_const_str_tag); -be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_started); +be_define_const_str(set_ct, "set_ct", 972363187u, 0, 6, &be_const_str_setmember); +be_define_const_str(set_dc_voltage, "set_dc_voltage", 2181981936u, 0, 14, &be_const_str_type); be_define_const_str(set_dcdc_enable, "set_dcdc_enable", 1594690786u, 0, 15, NULL); -be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, &be_const_str_except); +be_define_const_str(set_exten, "set_exten", 1721782768u, 0, 9, NULL); be_define_const_str(set_first_time, "set_first_time", 3111247550u, 0, 14, NULL); be_define_const_str(set_gain, "set_gain", 3847781975u, 0, 8, NULL); -be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, NULL); -be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, NULL); +be_define_const_str(set_height, "set_height", 1080207399u, 0, 10, &be_const_str_subtype_to_string); +be_define_const_str(set_hue16sat, "set_hue16sat", 1858983599u, 0, 12, &be_const_str_set_pwm); be_define_const_str(set_huesat, "set_huesat", 626496854u, 0, 10, NULL); -be_define_const_str(set_hum, "set_hum", 964296026u, 0, 7, NULL); +be_define_const_str(set_hum, "set_hum", 964296026u, 0, 7, &be_const_str_tob64); be_define_const_str(set_ldo_enable, "set_ldo_enable", 2916502041u, 0, 14, NULL); be_define_const_str(set_ldo_voltage, "set_ldo_voltage", 4090501160u, 0, 15, NULL); be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); -be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, &be_const_str_set_useragent); +be_define_const_str(set_matrix_pixel_color, "set_matrix_pixel_color", 1197149462u, 0, 22, NULL); be_define_const_str(set_mode_ct, "set_mode_ct", 665073295u, 0, 11, NULL); -be_define_const_str(set_mode_rgb, "set_mode_rgb", 852310875u, 0, 12, NULL); +be_define_const_str(set_mode_rgb, "set_mode_rgb", 852310875u, 0, 12, &be_const_str_try_rule); be_define_const_str(set_ota_max, "set_ota_max", 4093779527u, 0, 11, NULL); be_define_const_str(set_percentage, "set_percentage", 2952022724u, 0, 14, NULL); -be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, NULL); +be_define_const_str(set_pixel_color, "set_pixel_color", 1275248356u, 0, 15, &be_const_str_tanh); be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); be_define_const_str(set_pwm, "set_pwm", 3781811012u, 0, 7, NULL); -be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, NULL); -be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, &be_const_str_trig); +be_define_const_str(set_rate, "set_rate", 1154016838u, 0, 8, &be_const_str_seti); +be_define_const_str(set_reachable, "set_reachable", 3280367499u, 0, 13, NULL); be_define_const_str(set_rgb, "set_rgb", 3380244855u, 0, 7, NULL); be_define_const_str(set_size, "set_size", 2183165325u, 0, 8, NULL); -be_define_const_str(set_style_bg_color, "set_style_bg_color", 1689513089u, 0, 18, NULL); -be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, NULL); -be_define_const_str(set_style_img_recolor, "set_style_img_recolor", 1245681294u, 0, 21, &be_const_str_show); -be_define_const_str(set_style_img_recolor_opa, "set_style_img_recolor_opa", 2667062087u, 0, 25, NULL); +be_define_const_str(set_style_bg_color, "set_style_bg_color", 1689513089u, 0, 18, &be_const_str_strip); +be_define_const_str(set_style_border_width, "set_style_border_width", 549034191u, 0, 22, &be_const_str_size); +be_define_const_str(set_style_img_recolor, "set_style_img_recolor", 1245681294u, 0, 21, NULL); +be_define_const_str(set_style_img_recolor_opa, "set_style_img_recolor_opa", 2667062087u, 0, 25, &be_const_str_switch_factory); be_define_const_str(set_style_line_color, "set_style_line_color", 3665238976u, 0, 20, NULL); -be_define_const_str(set_style_pad_all, "set_style_pad_all", 3987000607u, 0, 17, &be_const_str_setmember); +be_define_const_str(set_style_pad_all, "set_style_pad_all", 3987000607u, 0, 17, &be_const_str_sqrt); be_define_const_str(set_style_pad_right, "set_style_pad_right", 3314069054u, 0, 19, NULL); be_define_const_str(set_style_radius, "set_style_radius", 3868404032u, 0, 16, NULL); -be_define_const_str(set_style_text_color, "set_style_text_color", 943105189u, 0, 20, NULL); -be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, NULL); +be_define_const_str(set_style_text_color, "set_style_text_color", 943105189u, 0, 20, &be_const_str_sinh); +be_define_const_str(set_style_text_font, "set_style_text_font", 1028590019u, 0, 19, &be_const_str_string); be_define_const_str(set_svc, "set_svc", 752734654u, 0, 7, NULL); be_define_const_str(set_tasmota_logo, "set_tasmota_logo", 4090375591u, 0, 16, NULL); be_define_const_str(set_temp, "set_temp", 1952131250u, 0, 8, NULL); -be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, &be_const_str_tolower); -be_define_const_str(set_time, "set_time", 900236405u, 0, 8, NULL); -be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, NULL); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, &be_const_str_widget_height_def); -be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, NULL); -be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, NULL); -be_define_const_str(set_width, "set_width", 484671920u, 0, 9, &be_const_str_setitem); -be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, &be_const_str_widget_ctor_cb); -be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, &be_const_str_widget_destructor); -be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, NULL); +be_define_const_str(set_text, "set_text", 1849641155u, 0, 8, NULL); +be_define_const_str(set_time, "set_time", 900236405u, 0, 8, &be_const_str_set_x); +be_define_const_str(set_timeouts, "set_timeouts", 3732850900u, 0, 12, &be_const_str_widget_event_impl); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(set_user_data, "set_user_data", 3596043360u, 0, 13, &be_const_str_widget_width_def); +be_define_const_str(set_useragent, "set_useragent", 612237244u, 0, 13, &be_const_str_split); +be_define_const_str(set_width, "set_width", 484671920u, 0, 9, NULL); +be_define_const_str(set_x, "set_x", 1849400772u, 0, 5, NULL); +be_define_const_str(set_xy, "set_xy", 1155092615u, 0, 6, &be_const_str_shared_key); +be_define_const_str(set_y, "set_y", 1866178391u, 0, 5, &be_const_str_traceback); be_define_const_str(set_zoom, "set_zoom", 1925134407u, 0, 8, NULL); be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); be_define_const_str(setfloat, "setfloat", 2799488807u, 0, 8, NULL); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, &be_const_str_wd); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, &be_const_str_tag); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); be_define_const_str(settings, "settings", 1745255176u, 0, 8, NULL); -be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, &be_const_str_web_add_main_button); +be_define_const_str(shared_key, "shared_key", 2200833624u, 0, 10, NULL); be_define_const_str(show, "show", 2840060476u, 0, 4, NULL); -be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, NULL); +be_define_const_str(signal_arcs, "signal_arcs", 1505996127u, 0, 11, &be_const_str_widget_height_def); be_define_const_str(signal_bars, "signal_bars", 3181573600u, 0, 11, NULL); -be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, &be_const_str_widget_event); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str__X7Bs_X7DBatt_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(signal_change, "signal_change", 3262299350u, 0, 13, NULL); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, &be_const_str_tasmota_log_reader); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_srand); be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(skip, "skip", 1097563074u, 0, 4, NULL); -be_define_const_str(slots, "slots", 1023330342u, 0, 5, NULL); +be_define_const_str(skip, "skip", 1097563074u, 0, 4, &be_const_str_subtype); +be_define_const_str(slots, "slots", 1023330342u, 0, 5, &be_const_str_start); be_define_const_str(solidified, "solidified", 3257553487u, 0, 10, NULL); -be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, &be_const_str_str); -be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_sum); -be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, &be_const_str_split); +be_define_const_str(spiffs, "spiffs", 994943858u, 0, 6, NULL); +be_define_const_str(splash, "splash", 2531464038u, 0, 6, &be_const_str_zcl_frame); +be_define_const_str(splash_init, "splash_init", 1522992293u, 0, 11, NULL); be_define_const_str(splash_remove, "splash_remove", 3132020807u, 0, 13, NULL); be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, &be_const_str_if); be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(started, "started", 2153339806u, 0, 7, &be_const_str_try); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(started, "started", 2153339806u, 0, 7, NULL); +be_define_const_str(state, "state", 2016490230u, 0, 5, &be_const_str_strptime); be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, &be_const_str_strptime); -be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_widget_width_def); +be_define_const_str(stop_iteration, "stop_iteration", 4173793901u, 0, 14, NULL); +be_define_const_str(str, "str", 3259748752u, 0, 3, &be_const_str_target_search); be_define_const_str(strftime, "strftime", 187738851u, 0, 8, NULL); -be_define_const_str(string, "string", 398550328u, 0, 6, NULL); -be_define_const_str(strip, "strip", 4246411473u, 0, 5, &be_const_str_try_get_bec_version); +be_define_const_str(string, "string", 398550328u, 0, 6, &be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D); +be_define_const_str(strip, "strip", 4246411473u, 0, 5, &be_const_str_wifi_bars); be_define_const_str(strptime, "strptime", 1277910361u, 0, 8, NULL); be_define_const_str(style_prop_arr, "style_prop_arr", 3019174322u, 0, 14, NULL); be_define_const_str(subscribe, "subscribe", 2946386435u, 0, 9, NULL); -be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, &be_const_str_toint); -be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, &be_const_str_type_to_string); -be_define_const_str(success, "success", 979353360u, 0, 7, &be_const_str_widget_struct_by_class); -be_define_const_str(sum, "sum", 3712891560u, 0, 3, &be_const_str_wifi_arcs); +be_define_const_str(subtype, "subtype", 2023873341u, 0, 7, NULL); +be_define_const_str(subtype_to_string, "subtype_to_string", 2996733901u, 0, 17, NULL); +be_define_const_str(success, "success", 979353360u, 0, 7, NULL); +be_define_const_str(sum, "sum", 3712891560u, 0, 3, NULL); be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); be_define_const_str(switch_factory, "switch_factory", 4206217516u, 0, 14, NULL); be_define_const_str(sys, "sys", 3277365014u, 0, 3, NULL); be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL); be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_w); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); be_define_const_str(target, "target", 845187144u, 0, 6, NULL); -be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, NULL); +be_define_const_str(target_search, "target_search", 1947846553u, 0, 13, &be_const_str_url_encode); be_define_const_str(tasmota, "tasmota", 424643812u, 0, 7, NULL); be_define_const_str(tasmota_X2Eget_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eget_X28_X29, "tasmota.get_light() is deprecated, use light.get()", 3525753647u, 0, 50, NULL); -be_define_const_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29, "tasmota.set_light() is deprecated, use light.set()", 2124937871u, 0, 50, NULL); +be_define_const_str(tasmota_X2Eset_light_X28_X29_X20is_X20deprecated_X2C_X20use_X20light_X2Eset_X28_X29, "tasmota.set_light() is deprecated, use light.set()", 2124937871u, 0, 50, &be_const_str_wire); be_define_const_str(tasmota_log_reader, "tasmota_log_reader", 3555069257u, 0, 18, NULL); be_define_const_str(tcpclient, "tcpclient", 3828797983u, 0, 9, NULL); -be_define_const_str(tele, "tele", 3474458061u, 0, 4, NULL); +be_define_const_str(tele, "tele", 3474458061u, 0, 4, &be_const_str_tobytes); be_define_const_str(test, "test", 2949673445u, 0, 4, NULL); be_define_const_str(the_X20second_X20argument_X20is_X20not_X20a_X20function, "the second argument is not a function", 3954574469u, 0, 37, NULL); be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_wire1); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, &be_const_str_wifi); be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, &be_const_str_web_add_management_button); +be_define_const_str(timer_cb, "timer_cb", 79918026u, 0, 8, NULL); be_define_const_str(to_gamma, "to_gamma", 1597139862u, 0, 8, NULL); be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL); -be_define_const_str(tobytes, "tobytes", 595962279u, 0, 7, &be_const_str_width); -be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); +be_define_const_str(tobytes, "tobytes", 595962279u, 0, 7, NULL); +be_define_const_str(toint, "toint", 3613182909u, 0, 5, &be_const_str_unknown_X20instruction); be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); be_define_const_str(tomap, "tomap", 612167626u, 0, 5, NULL); -be_define_const_str(top, "top", 2802900028u, 0, 3, &be_const_str_def); -be_define_const_str(topic, "topic", 3264522692u, 0, 5, &be_const_str_write_bytes); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(topic, "topic", 3264522692u, 0, 5, &be_const_str_xy); be_define_const_str(toptr, "toptr", 3379847454u, 0, 5, NULL); be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); be_define_const_str(touch_update, "touch_update", 1918102068u, 0, 12, NULL); be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); be_define_const_str(tr, "tr", 1195724803u, 0, 2, NULL); be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(trig, "trig", 2073314619u, 0, 4, NULL); +be_define_const_str(trig, "trig", 2073314619u, 0, 4, &be_const_str_webserver); be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); be_define_const_str(try_compile, "try_compile", 4263879840u, 0, 11, NULL); be_define_const_str(try_get_bec_version, "try_get_bec_version", 3143116423u, 0, 19, NULL); be_define_const_str(try_remove_file, "try_remove_file", 3025429926u, 0, 15, NULL); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(try_run_compiled, "try_run_compiled", 2339741218u, 0, 16, NULL); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, &be_const_str_x1); +be_define_const_str(try_run_compiled, "try_run_compiled", 2339741218u, 0, 16, &be_const_str_return); be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); be_define_const_str(type_error, "type_error", 3789613824u, 0, 10, NULL); -be_define_const_str(type_to_string, "type_to_string", 1072804509u, 0, 14, &be_const_str_width_def); +be_define_const_str(type_to_string, "type_to_string", 1072804509u, 0, 14, NULL); be_define_const_str(udp, "udp", 1253872004u, 0, 3, NULL); be_define_const_str(unknown_X20instruction, "unknown instruction", 1093911841u, 0, 19, NULL); be_define_const_str(unsubscribe, "unsubscribe", 4190043798u, 0, 11, NULL); be_define_const_str(update, "update", 672109684u, 0, 6, NULL); be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, &be_const_str_elif); +be_define_const_str(url_encode, "url_encode", 528392145u, 0, 10, NULL); be_define_const_str(uuid4, "uuid4", 1153582450u, 0, 5, NULL); -be_define_const_str(value, "value", 1113510858u, 0, 5, &be_const_str_wire_scan); -be_define_const_str(value_error, "value_error", 773297791u, 0, 11, NULL); -be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, NULL); +be_define_const_str(value, "value", 1113510858u, 0, 5, NULL); +be_define_const_str(value_error, "value_error", 773297791u, 0, 11, &be_const_str_wd); +be_define_const_str(valuer_error, "valuer_error", 2567947105u, 0, 12, &be_const_str_def); be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(w, "w", 4060888886u, 0, 1, NULL); -be_define_const_str(wd, "wd", 1531424278u, 0, 2, &be_const_str_web_send); -be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, &be_const_str_web_sensor); +be_define_const_str(w, "w", 4060888886u, 0, 1, &be_const_str_do); +be_define_const_str(wd, "wd", 1531424278u, 0, 2, &be_const_str_false); +be_define_const_str(web_add_button, "web_add_button", 3537875058u, 0, 14, NULL); be_define_const_str(web_add_config_button, "web_add_config_button", 639674325u, 0, 21, NULL); be_define_const_str(web_add_console_button, "web_add_console_button", 3481436192u, 0, 22, NULL); be_define_const_str(web_add_handler, "web_add_handler", 3990174962u, 0, 15, NULL); be_define_const_str(web_add_main_button, "web_add_main_button", 3960367664u, 0, 19, NULL); -be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, NULL); +be_define_const_str(web_add_management_button, "web_add_management_button", 2738877186u, 0, 25, &be_const_str__X7Bs_X7DTemp_X20AXP_X7Bm_X7D_X25_X2E1f_X20_X26deg_X3BC_X7Be_X7D); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); be_define_const_str(web_sensor, "web_sensor", 2900096972u, 0, 10, NULL); @@ -992,13 +994,13 @@ be_define_const_str(widget_dtor_impl, "widget_dtor_impl", 520430610u, 0, 16, NUL be_define_const_str(widget_editable, "widget_editable", 3821793286u, 0, 15, NULL); be_define_const_str(widget_event, "widget_event", 1951408186u, 0, 12, NULL); be_define_const_str(widget_event_cb, "widget_event_cb", 1508466754u, 0, 15, NULL); -be_define_const_str(widget_event_impl, "widget_event_impl", 2178430561u, 0, 17, NULL); +be_define_const_str(widget_event_impl, "widget_event_impl", 2178430561u, 0, 17, &be_const_str_wifi_bars_icon); be_define_const_str(widget_group_def, "widget_group_def", 1246968785u, 0, 16, NULL); be_define_const_str(widget_height_def, "widget_height_def", 3131667813u, 0, 17, NULL); be_define_const_str(widget_instance_size, "widget_instance_size", 2055354779u, 0, 20, NULL); be_define_const_str(widget_struct_by_class, "widget_struct_by_class", 3806373842u, 0, 22, NULL); be_define_const_str(widget_struct_default, "widget_struct_default", 781673633u, 0, 21, NULL); -be_define_const_str(widget_width_def, "widget_width_def", 3986078862u, 0, 16, &be_const_str_yield); +be_define_const_str(widget_width_def, "widget_width_def", 3986078862u, 0, 16, NULL); be_define_const_str(width, "width", 2508680735u, 0, 5, NULL); be_define_const_str(width_def, "width_def", 1143717879u, 0, 9, NULL); be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); @@ -1015,15 +1017,19 @@ be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); be_define_const_str(write_file, "write_file", 3177658879u, 0, 10, NULL); -be_define_const_str(write_flash, "write_flash", 3003629621u, 0, 11, &be_const_str_raise); -be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, NULL); +be_define_const_str(write_flash, "write_flash", 3003629621u, 0, 11, NULL); +be_define_const_str(write_gpio, "write_gpio", 2267940334u, 0, 10, &be_const_str_except); be_define_const_str(x, "x", 4245442695u, 0, 1, NULL); -be_define_const_str(x1, "x1", 274927234u, 0, 2, NULL); +be_define_const_str(x1, "x1", 274927234u, 0, 2, &be_const_str_zb_coord_ntv); be_define_const_str(xy, "xy", 1482915802u, 0, 2, NULL); be_define_const_str(y, "y", 4228665076u, 0, 1, NULL); be_define_const_str(y1, "y1", 2355101727u, 0, 2, NULL); be_define_const_str(year, "year", 2927578396u, 0, 4, NULL); be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); +be_define_const_str(zb_coord_ntv, "zb_coord_ntv", 1266983504u, 0, 12, NULL); +be_define_const_str(zb_device, "zb_device", 2987454808u, 0, 9, NULL); +be_define_const_str(zcl_frame, "zcl_frame", 3755758684u, 0, 9, NULL); +be_define_const_str(zcl_frame_ntv, "zcl_frame_ntv", 4005322111u, 0, 13, NULL); be_define_const_str(zero, "zero", 2339366755u, 0, 4, NULL); be_define_const_str(zip, "zip", 2877453236u, 0, 3, NULL); be_define_const_str(_X7B, "{", 4262220314u, 0, 1, NULL); @@ -1036,516 +1042,519 @@ be_define_const_str(_X7B_X7D, "{}", 1415952421u, 0, 2, NULL); be_define_const_str(_X7D, "}", 4161554600u, 0, 1, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_lv_wifi_bars_icon, - (const bstring *)&be_const_str_file_X20extension_X20is_X20not_X20_X27_X2Ebe_X27_X20or_X20_X27_X2Ebec_X27, - (const bstring *)&be_const_str_WS2812, + (const bstring *)&be_const_str_COLOR_WHITE, + (const bstring *)&be_const_str_cb_obj, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str_calldepth, + (const bstring *)&be_const_str_INTERNAL_PDM, + (const bstring *)&be_const_str_Partition, + (const bstring *)&be_const_str_factory, + (const bstring *)&be_const_str_draw_line, + (const bstring *)&be_const_str_char, + (const bstring *)&be_const_str__X23, NULL, - (const bstring *)&be_const_str_adv_block, - (const bstring *)&be_const_str__lvgl, - (const bstring *)&be_const_str_0x_X2502X, - (const bstring *)&be_const_str_subtype_to_string, - NULL, - (const bstring *)&be_const_str_lv_obj, - (const bstring *)&be_const_str_Partition_info, - (const bstring *)&be_const_str_SK6812_GRBW, - (const bstring *)&be_const_str__X7Bs_X7DBatt_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, - (const bstring *)&be_const_str_set_ldo_enable, - (const bstring *)&be_const_str_Too_X20many_X20partiition_X20slots, - (const bstring *)&be_const_str__write, - (const bstring *)&be_const_str_HTTP_POST, - (const bstring *)&be_const_str__X2Ebec, - (const bstring *)&be_const_str__X2F, - (const bstring *)&be_const_str__X21_X3D, - (const bstring *)&be_const_str_Wire, - (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, - (const bstring *)&be_const_str_detect, - (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, - (const bstring *)&be_const_str_draw_line_dsc_init, - (const bstring *)&be_const_str_read8, - (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Voltage_X7Bm_X7D_X25_X2E3f_X20V_X7Be_X7D, - (const bstring *)&be_const_str_add_cb_event_closure, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, - (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str__X23display_X2Eini, - (const bstring *)&be_const_str__filename, - (const bstring *)&be_const_str__request_from, - (const bstring *)&be_const_str_tobytes, - (const bstring *)&be_const_str__X2Ep1, - NULL, - NULL, - (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, - (const bstring *)&be_const_str__X25s_X2Eautoconf, - (const bstring *)&be_const_str_traceback, - (const bstring *)&be_const_str_RES_OK, - (const bstring *)&be_const_str_has, - (const bstring *)&be_const_str_wifi_arcs_icon, - (const bstring *)&be_const_str_Restart_X201, - (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, - (const bstring *)&be_const_str_erase, - NULL, - (const bstring *)&be_const_str_subscribe, - (const bstring *)&be_const_str__X23preinit_X2Ebe, - (const bstring *)&be_const_str_remote_ip, - (const bstring *)&be_const_str_SERIAL_8E1, (const bstring *)&be_const_str__rules, + (const bstring *)&be_const_str_EXTERNAL_I2S, + (const bstring *)&be_const_str_reverse, + (const bstring *)&be_const_str_BRY_X3A_X20ERROR_X2C_X20bad_X20json_X3A_X20, + (const bstring *)&be_const_str_keys, + (const bstring *)&be_const_str_point, + (const bstring *)&be_const_str_Restart_X201, + (const bstring *)&be_const_str_offset, NULL, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, - (const bstring *)&be_const_str_SERIAL_6E1, - (const bstring *)&be_const_str_base_class, - (const bstring *)&be_const_str__X5B, - (const bstring *)&be_const_str_SERIAL_7O1, - (const bstring *)&be_const_str_format, - (const bstring *)&be_const_str_add_handler, - (const bstring *)&be_const_str_get_event_cb, + (const bstring *)&be_const_str_bool, + (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, NULL, - (const bstring *)&be_const_str__ptr, - (const bstring *)&be_const_str_ALIGN_LEFT_MID, - (const bstring *)&be_const_str_AudioGeneratorWAV, - NULL, - NULL, - (const bstring *)&be_const_str_percentage, - (const bstring *)&be_const_str_get_style_line_color, - (const bstring *)&be_const_str_flush, - (const bstring *)&be_const_str_PART_MAIN, - (const bstring *)&be_const_str_ctypes_bytes_dyn, - (const bstring *)&be_const_str__X2Fstate_X2F, - NULL, - (const bstring *)&be_const_str_decompress, - (const bstring *)&be_const_str_SERIAL_8E2, - NULL, - (const bstring *)&be_const_str_pow, - (const bstring *)&be_const_str_lv_point_arr, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_widget_editable, + (const bstring *)&be_const_str_instance_X20required, + (const bstring *)&be_const_str_get_warning_level, + (const bstring *)&be_const_str_add, + (const bstring *)&be_const_str_draw_arc, + (const bstring *)&be_const_str_read8, + (const bstring *)&be_const_str_GET, + (const bstring *)&be_const_str_dump, + (const bstring *)&be_const_str_pc, + (const bstring *)&be_const_str_HTTP_GET, + (const bstring *)&be_const_str_SERIAL_7N1, + (const bstring *)&be_const_str_try, + (const bstring *)&be_const_str_invalidate, + (const bstring *)&be_const_str_fromb64, (const bstring *)&be_const_str_groups, - NULL, - NULL, - (const bstring *)&be_const_str_BUTTON_CONFIGURATION, - (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, - (const bstring *)&be_const_str_EVENT_DRAW_PART_END, - (const bstring *)&be_const_str__change_buffer, - (const bstring *)&be_const_str_no_X20more_X20RMT_X20channel_X20available, - NULL, - (const bstring *)&be_const_str_available, - (const bstring *)&be_const_str_widget_ctor_impl, - (const bstring *)&be_const_str_Unknown_X20command, - (const bstring *)&be_const_str_gen_cb, - (const bstring *)&be_const_str_lv_clock_icon, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, - (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, - (const bstring *)&be_const_str_lv_coord_arr, - (const bstring *)&be_const_str__X2Esize, - (const bstring *)&be_const_str_issubclass, - (const bstring *)&be_const_str__X2Elen, - NULL, - (const bstring *)&be_const_str_has_arg, - (const bstring *)&be_const_str_cmd, - (const bstring *)&be_const_str_AudioOutput, - (const bstring *)&be_const_str_md5, - (const bstring *)&be_const_str__anonymous_, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, - (const bstring *)&be_const_str_OPTION_A, - NULL, - (const bstring *)&be_const_str_RELAY, - (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, - NULL, - (const bstring *)&be_const_str_crc8, - (const bstring *)&be_const_str_clear_to, - (const bstring *)&be_const_str_set_tasmota_logo, - (const bstring *)&be_const_str_AXP192, - (const bstring *)&be_const_str_set_height, - NULL, - (const bstring *)&be_const_str_clock_icon, - (const bstring *)&be_const_str_item, - (const bstring *)&be_const_str_y1, - (const bstring *)&be_const_str_rad, - (const bstring *)&be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj, - NULL, - (const bstring *)&be_const_str_get_vbus_voltage, - (const bstring *)&be_const_str_run, - (const bstring *)&be_const_str_lv_wifi_arcs, - (const bstring *)&be_const_str_every_250ms, - NULL, - (const bstring *)&be_const_str_AA50, - (const bstring *)&be_const_str_b, - (const bstring *)&be_const_str_fat, - (const bstring *)&be_const_str_Tele, + (const bstring *)&be_const_str_concat, + (const bstring *)&be_const_str__X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, + (const bstring *)&be_const_str_length_X20in_X20bits_X20must_X20be_X20between_X200_X20and_X2032, + (const bstring *)&be_const_str_AudioOpusDecoder, + (const bstring *)&be_const_str_lower, + (const bstring *)&be_const_str_h, + (const bstring *)&be_const_str_draw_arc_dsc, (const bstring *)&be_const_str_deinit, - (const bstring *)&be_const_str_day, - (const bstring *)&be_const_str_add_anim, - NULL, - NULL, - (const bstring *)&be_const_str_add_rule, - (const bstring *)&be_const_str__begin_transmission, - (const bstring *)&be_const_str__X27_X20_X2D_X20, - (const bstring *)&be_const_str_code, - (const bstring *)&be_const_str__X20_X20, + (const bstring *)&be_const_str__X3D_X3D, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, NULL, (const bstring *)&be_const_str__X20, - (const bstring *)&be_const_str_hue_ntv, - (const bstring *)&be_const_str_get_name, - (const bstring *)&be_const_str_invalidate, - (const bstring *)&be_const_str_ccronexpr, - (const bstring *)&be_const_str_rtc, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list, - (const bstring *)&be_const_str_get_bat_charge_current, - (const bstring *)&be_const_str_draw_arc_dsc, - (const bstring *)&be_const_str_group_def, - (const bstring *)&be_const_str_hs2rgb, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, - (const bstring *)&be_const_str_clock, - (const bstring *)&be_const_str_get_light, - (const bstring *)&be_const_str_read, - (const bstring *)&be_const_str_eth, - (const bstring *)&be_const_str__X23init_X2Ebat, - (const bstring *)&be_const_str_CFG_X3A_X20return_code_X3D_X25i, - (const bstring *)&be_const_str__X23autoexec_X2Ebe, - (const bstring *)&be_const_str_readbytes, - NULL, - (const bstring *)&be_const_str_setrange, - (const bstring *)&be_const_str_set_time, - (const bstring *)&be_const_str_hex, - (const bstring *)&be_const_str_reverse, - (const bstring *)&be_const_str__X2D, - (const bstring *)&be_const_str_json, - (const bstring *)&be_const_str_draw_line, - (const bstring *)&be_const_str__X23autoexec_X2Ebat, - (const bstring *)&be_const_str_value, - (const bstring *)&be_const_str__crons, - (const bstring *)&be_const_str_button_pressed, - (const bstring *)&be_const_str_min, - (const bstring *)&be_const_str__X2Ew, - (const bstring *)&be_const_str_driver_name, - (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, - (const bstring *)&be_const_str_get, - (const bstring *)&be_const_str__timers, - (const bstring *)&be_const_str__X2502d_X25s_X2502d, - (const bstring *)&be_const_str__X2Eautoconf, - (const bstring *)&be_const_str_Trigger, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, - (const bstring *)&be_const_str_BECDFE, - (const bstring *)&be_const_str_dirty, - NULL, - (const bstring *)&be_const_str_load_templates, - (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_try_run_compiled, + (const bstring *)&be_const_str_call, + (const bstring *)&be_const_str_get_MAC, (const bstring *)&be_const_str__X3A, - (const bstring *)&be_const_str_connected, - (const bstring *)&be_const_str__X2E, - (const bstring *)&be_const_str_ota_, - (const bstring *)&be_const_str__ccmd, - (const bstring *)&be_const_str_read32, - (const bstring *)&be_const_str_create_segment, - (const bstring *)&be_const_str_contains, - (const bstring *)&be_const_str_strftime, - (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, + (const bstring *)&be_const_str_SERIAL_5N1, + (const bstring *)&be_const_str_real, + (const bstring *)&be_const_str_active_otadata, + (const bstring *)&be_const_str_get_percentage, + (const bstring *)&be_const_str_Trigger, + (const bstring *)&be_const_str__def, NULL, - (const bstring *)&be_const_str__X2Flights_X2F, - (const bstring *)&be_const_str_exists, - (const bstring *)&be_const_str_SERIAL_5E2, + (const bstring *)&be_const_str_content_send_style, NULL, - (const bstring *)&be_const_str_fast_loop_enabled, - (const bstring *)&be_const_str_can_show, - (const bstring *)&be_const_str_exp, - (const bstring *)&be_const_str_clear_first_time, - (const bstring *)&be_const_str__settings_ptr, - (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, - (const bstring *)&be_const_str_geti, - (const bstring *)&be_const_str_get_ota_slot, - (const bstring *)&be_const_str_import, - (const bstring *)&be_const_str_constructor_cb, - NULL, - (const bstring *)&be_const_str_tcpclient, - (const bstring *)&be_const_str__X2B, - (const bstring *)&be_const_str_compress, - (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_POST, - (const bstring *)&be_const_str_tomap, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, - (const bstring *)&be_const_str_consume_stereo, - (const bstring *)&be_const_str_label, - (const bstring *)&be_const_str_phy, - (const bstring *)&be_const_str_create_matrix, - (const bstring *)&be_const_str_x1, - (const bstring *)&be_const_str_GET, - (const bstring *)&be_const_str_SERIAL_6N2, - NULL, - (const bstring *)&be_const_str_SERIAL_7O2, - (const bstring *)&be_const_str_module, - (const bstring *)&be_const_str_flags, - (const bstring *)&be_const_str_SERIAL_8O2, - NULL, - (const bstring *)&be_const_str_animators, - (const bstring *)&be_const_str_AudioOpusDecoder, - (const bstring *)&be_const_str_autoexec, - NULL, - (const bstring *)&be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20change_X20the_X20current_X20configuration_X20and_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27, - (const bstring *)&be_const_str__X20_X28, - (const bstring *)&be_const_str_get_active, - (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, + (const bstring *)&be_const_str_Animate_X20pc_X20is_X20out_X20of_X20range, + (const bstring *)&be_const_str_adv_watch, + (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_reset, + (const bstring *)&be_const_str_widget_dtor_cb, + (const bstring *)&be_const_str_gc, NULL, - (const bstring *)&be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str__X0A_X29_X3E, - (const bstring *)&be_const_str_bus, - (const bstring *)&be_const_str_add, - (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, - (const bstring *)&be_const_str_id, - (const bstring *)&be_const_str_consume_mono, - (const bstring *)&be_const_str__X2D_X2A, - (const bstring *)&be_const_str_SERIAL_6N1, - (const bstring *)&be_const_str_scan, - (const bstring *)&be_const_str_seg7_font, - (const bstring *)&be_const_str__X2Fac, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, - (const bstring *)&be_const_str_chars_in_string, + (const bstring *)&be_const_str_base_class, + (const bstring *)&be_const_str_HTTP_POST, NULL, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str__X2F_X2Eautoconf, - (const bstring *)&be_const_str_cb_obj, - (const bstring *)&be_const_str_CFG_X3A_X20exception_X20_X27_X25s_X27_X20_X2D_X20_X27_X25s_X27, - (const bstring *)&be_const_str_pc_rel, - (const bstring *)&be_const_str_SERIAL_5O1, - (const bstring *)&be_const_str_compile, - (const bstring *)&be_const_str__X3D_X3C_X3E_X21, - (const bstring *)&be_const_str__X25, + (const bstring *)&be_const_str_widget_struct_by_class, + (const bstring *)&be_const_str_sat, NULL, - (const bstring *)&be_const_str_begin, NULL, - (const bstring *)&be_const_str_CFG_X3A_X20removing_X20autoconf_X20files, - (const bstring *)&be_const_str_atan2, - (const bstring *)&be_const_str_cos, - (const bstring *)&be_const_str_select, - (const bstring *)&be_const_str_animate, - (const bstring *)&be_const_str_display, - (const bstring *)&be_const_str_get_style_pad_right, - (const bstring *)&be_const_str_get_aps_voltage, - (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, - (const bstring *)&be_const_str_the_X20second_X20argument_X20is_X20not_X20a_X20function, - (const bstring *)&be_const_str_lower, - (const bstring *)&be_const_str_FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - (const bstring *)&be_const_str__energy, - (const bstring *)&be_const_str_tasmota_log_reader, - (const bstring *)&be_const_str_log10, - (const bstring *)&be_const_str_add_driver, NULL, - (const bstring *)&be_const_str_full_status, - (const bstring *)&be_const_str_files, - (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, - (const bstring *)&be_const_str_COLOR_WHITE, - (const bstring *)&be_const_str_set_y, - (const bstring *)&be_const_str__subscribe, - (const bstring *)&be_const_str__X0A, - (const bstring *)&be_const_str_isrunning, - (const bstring *)&be_const_str_remote_port, - (const bstring *)&be_const_str_persist_X2E_p_X20is_X20not_X20a_X20map, - (const bstring *)&be_const_str_set_style_text_font, - (const bstring *)&be_const_str_invalid_X20GPIO_X20number, - (const bstring *)&be_const_str__X2Ep, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - NULL, - (const bstring *)&be_const_str_SERIAL_6O1, - (const bstring *)&be_const_str_close, - (const bstring *)&be_const_str_Partition_otadata, - (const bstring *)&be_const_str_arch, - (const bstring *)&be_const_str_TASMOTA, - (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, - NULL, - (const bstring *)&be_const_str_CFG_X3A_X20downloading_X20_X27_X25s_X27, - (const bstring *)&be_const_str_light_X20must_X20be_X20of_X20class_X20_X27light_state_X27, - (const bstring *)&be_const_str_factory, - NULL, - (const bstring *)&be_const_str_set_hue16sat, - (const bstring *)&be_const_str__X3F, - (const bstring *)&be_const_str__settings_def, - (const bstring *)&be_const_str__X23, - (const bstring *)&be_const_str_get_bat_power, - (const bstring *)&be_const_str__persist_X2Ejson, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_lv_, + (const bstring *)&be_const_str_set_style_bg_color, + (const bstring *)&be_const_str_every_250ms, (const bstring *)&be_const_str_I2C_X3A, + (const bstring *)&be_const_str__X21_X3D_X3D, + (const bstring *)&be_const_str__debug_present, + (const bstring *)&be_const_str_fromhex, + (const bstring *)&be_const_str__X23autoexec_X2Ebe, + (const bstring *)&be_const_str_set_style_pad_right, + (const bstring *)&be_const_str_exec_rules, NULL, - (const bstring *)&be_const_str_abs, - (const bstring *)&be_const_str_pi, - (const bstring *)&be_const_str_exec_tele, - NULL, - (const bstring *)&be_const_str_SERIAL_6O2, - NULL, - (const bstring *)&be_const_str_event_cb, - (const bstring *)&be_const_str_rotate, - (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str_instance_size, - NULL, - (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, - (const bstring *)&be_const_str_Leds, - (const bstring *)&be_const_str_webserver, - (const bstring *)&be_const_str__global_def, - (const bstring *)&be_const_str__fl, - (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, - (const bstring *)&be_const_str_wire, - (const bstring *)&be_const_str__X2C, - (const bstring *)&be_const_str_pin_used, - (const bstring *)&be_const_str_set_style_img_recolor_opa, - (const bstring *)&be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus, - (const bstring *)&be_const_str_next_cron, - (const bstring *)&be_const_str_CT, - (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, - (const bstring *)&be_const_str_crc32, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_lv_clock, - (const bstring *)&be_const_str__X22_X3A, - (const bstring *)&be_const_str_get_hor_res, - (const bstring *)&be_const_str_Partition, - (const bstring *)&be_const_str__, - (const bstring *)&be_const_str_Invalid_X20ota_X20partition_X20number, - (const bstring *)&be_const_str__class, - (const bstring *)&be_const_str__X2Ep2, + (const bstring *)&be_const_str_SERIAL_8E1, (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20_X27_X25s_X27_X20_X28_X25s_X20_X2D_X20_X25s_X29, - (const bstring *)&be_const_str_arg_size, - (const bstring *)&be_const_str_asin, - (const bstring *)&be_const_str_get_free_heap, - (const bstring *)&be_const_str_number, - (const bstring *)&be_const_str_set_align, - NULL, - NULL, - (const bstring *)&be_const_str__X29, - (const bstring *)&be_const_str__X3D_X3D, - (const bstring *)&be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E, - (const bstring *)&be_const_str_solidified, - (const bstring *)&be_const_str_MI32, - (const bstring *)&be_const_str_crc32_ota_seq, - (const bstring *)&be_const_str__X3Clambda_X3E, - (const bstring *)&be_const_str_point_arr, - (const bstring *)&be_const_str__X28_X29, - (const bstring *)&be_const_str_https_X3A_X2F_X2Fraw_X2Egithubusercontent_X2Ecom_X2Ftasmota_X2Fautoconf_X2Fmain_X2F_X25s_X2F_X25s_X2Eautoconf, - (const bstring *)&be_const_str__buffer, - (const bstring *)&be_const_str_SERIAL_6E2, - (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__splash, - (const bstring *)&be_const_str_detected_X20on_X20bus, - NULL, - (const bstring *)&be_const_str_var, - NULL, - (const bstring *)&be_const_str_add_fast_loop, - (const bstring *)&be_const_str_dim, + (const bstring *)&be_const_str_atan2, (const bstring *)&be_const_str_hue_status, + (const bstring *)&be_const_str__X2D_X2D_X3A_X2D_X2D, + (const bstring *)&be_const_str_OneWire, + (const bstring *)&be_const_str__X22_X3A, + (const bstring *)&be_const_str__X2F_X2Eautoconf, + (const bstring *)&be_const_str_connection_error, + (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_get_switches, + (const bstring *)&be_const_str_frombytes, + (const bstring *)&be_const_str_has_arg, NULL, - (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, - (const bstring *)&be_const_str_make_cb, - (const bstring *)&be_const_str__cmd, + (const bstring *)&be_const_str_SERIAL_5O2, + (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, + (const bstring *)&be_const_str_web_add_management_button, + (const bstring *)&be_const_str_AES_GCM, + (const bstring *)&be_const_str_wire_scan, + (const bstring *)&be_const_str_Unknown, + (const bstring *)&be_const_str_else, + (const bstring *)&be_const_str_SERIAL_6O2, + (const bstring *)&be_const_str_clear, + (const bstring *)&be_const_str___lower__, + (const bstring *)&be_const_str_hue, + NULL, + (const bstring *)&be_const_str__write, + NULL, + (const bstring *)&be_const_str_exists, + (const bstring *)&be_const_str__X2Ew, + (const bstring *)&be_const_str__X5B, + (const bstring *)&be_const_str_EC_C25519, + (const bstring *)&be_const_str_consume_stereo, + (const bstring *)&be_const_str_readline, + (const bstring *)&be_const_str_autorun, + (const bstring *)&be_const_str_BUTTON_CONFIGURATION, + (const bstring *)&be_const_str_abort, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, + NULL, + (const bstring *)&be_const_str_set_ct, + (const bstring *)&be_const_str_round_end, + (const bstring *)&be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29, + (const bstring *)&be_const_str_RGBW, + (const bstring *)&be_const_str_load_otadata, + (const bstring *)&be_const_str_end, + (const bstring *)&be_const_str__X21_X3D, + (const bstring *)&be_const_str__X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, + NULL, + (const bstring *)&be_const_str_ctor, + (const bstring *)&be_const_str_Leds, + (const bstring *)&be_const_str_compress, + (const bstring *)&be_const_str__X2502d_X25s_X2502d, + (const bstring *)&be_const_str_dirty, + (const bstring *)&be_const_str_SERIAL_5E2, + (const bstring *)&be_const_str_CFG_X3A_X20removed_X20file_X20_X27_X25s_X27, + (const bstring *)&be_const_str_every_100ms, + NULL, + (const bstring *)&be_const_str_set_timeouts, + (const bstring *)&be_const_str_digital_read, + (const bstring *)&be_const_str__X23autoexec_X2Ebat, + (const bstring *)&be_const_str_atan, + NULL, + NULL, + (const bstring *)&be_const_str_get_style_bg_color, + (const bstring *)&be_const_str__end_transmission, + (const bstring *)&be_const_str_SERIAL_7E1, + (const bstring *)&be_const_str_reapply, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E, + NULL, + (const bstring *)&be_const_str_BLE, + (const bstring *)&be_const_str_content_response, + NULL, + (const bstring *)&be_const_str_matrix, + (const bstring *)&be_const_str_ins_time, + (const bstring *)&be_const_str_ins_goto, + (const bstring *)&be_const_str_classof, + (const bstring *)&be_const_str__p, + (const bstring *)&be_const_str_BRY_X3A_X20corrupt_X20bytecode_X20_X27_X25s_X27, (const bstring *)&be_const_str__X2A, NULL, - (const bstring *)&be_const_str_last_modified, - (const bstring *)&be_const_str__X2Etapp, - (const bstring *)&be_const_str___iterator__, - (const bstring *)&be_const_str_lv_wifi_bars, - (const bstring *)&be_const_str_class, - (const bstring *)&be_const_str__X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_gamma10, - (const bstring *)&be_const_str_WS2812_GRB, - (const bstring *)&be_const_str_00, - (const bstring *)&be_const_str_set_pwm, - (const bstring *)&be_const_str_EVENT_DELETE, - (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker, + (const bstring *)&be_const_str__X20_X28, + (const bstring *)&be_const_str_to_gamma, + (const bstring *)&be_const_str_RELAY, + (const bstring *)&be_const_str_add_anim, NULL, + (const bstring *)&be_const_str_get_log, NULL, - (const bstring *)&be_const_str_time_reached, - (const bstring *)&be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, - (const bstring *)&be_const_str_No_X20SPIFFS_X20partition_X20found, + (const bstring *)&be_const_str_get_bat_charge_current, + (const bstring *)&be_const_str_eth, NULL, - (const bstring *)&be_const_str_ins_goto, - (const bstring *)&be_const_str_resp_cmnd, - (const bstring *)&be_const_str_get_size, - (const bstring *)&be_const_str_nvskeys, - (const bstring *)&be_const_str_concat, - (const bstring *)&be_const_str_scr_act, - (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, - (const bstring *)&be_const_str__X3C_X3D, - (const bstring *)&be_const_str_send, - (const bstring *)&be_const_str_STATE_DEFAULT, - (const bstring *)&be_const_str_RGBW, - (const bstring *)&be_const_str_devices, - (const bstring *)&be_const_str_set_bits_per_sample, - (const bstring *)&be_const_str_fromhex, - (const bstring *)&be_const_str_dump, - (const bstring *)&be_const_str_continue, - (const bstring *)&be_const_str_r, - NULL, - (const bstring *)&be_const_str_f, - (const bstring *)&be_const_str__X2Ebe, - (const bstring *)&be_const_str_SERIAL_7N2, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, - (const bstring *)&be_const_str_run_deferred, - (const bstring *)&be_const_str_energy_struct, - (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27, - (const bstring *)&be_const_str_LVG_X3A_X20call_X20to_X20unsupported_X20callback, - (const bstring *)&be_const_str_SERIAL_7E2, - (const bstring *)&be_const_str_duration, - (const bstring *)&be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, - (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, - (const bstring *)&be_const_str_BLE, - (const bstring *)&be_const_str_display_X2Eini, - (const bstring *)&be_const_str_lv_solidified, - (const bstring *)&be_const_str_char, - (const bstring *)&be_const_str___lower__, - (const bstring *)&be_const_str_wifi_bars_icon, - (const bstring *)&be_const_str_allocated, - (const bstring *)&be_const_str__X7Bs_X7DVBus_X20Current_X7Bm_X7D_X25_X2E1f_X20mA_X7Be_X7D, - (const bstring *)&be_const_str_settings, - (const bstring *)&be_const_str_json_fdump_map, - (const bstring *)&be_const_str_every_100ms, - (const bstring *)&be_const_str_Auto_X2Dconfiguration, - (const bstring *)&be_const_str_c, - NULL, - (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, - (const bstring *)&be_const_str__drivers, - (const bstring *)&be_const_str_register_button_encoder, - (const bstring *)&be_const_str_write_flash, - NULL, - NULL, - (const bstring *)&be_const_str_OneWire, (const bstring *)&be_const_str_CFG_X3A_X20No_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found, - (const bstring *)&be_const_str_parse, - (const bstring *)&be_const_str_round_end, - (const bstring *)&be_const_str__X21_X3D_X3D, - (const bstring *)&be_const_str_ctor, - (const bstring *)&be_const_str_AES_GCM, + (const bstring *)&be_const_str_No_X20SPIFFS_X20partition_X20found, + (const bstring *)&be_const_str_geti, NULL, - (const bstring *)&be_const_str_next, - (const bstring *)&be_const_str__global_addr, - (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, NULL, - (const bstring *)&be_const_str_get_bat_voltage, + (const bstring *)&be_const_str_label, NULL, - (const bstring *)&be_const_str_SERIAL_8N2, - (const bstring *)&be_const_str_True, - (const bstring *)&be_const_str__X3E_X3D, - (const bstring *)&be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF, - (const bstring *)&be_const_str_AudioFileSource, + NULL, + (const bstring *)&be_const_str_crc16, (const bstring *)&be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting, + (const bstring *)&be_const_str_add_driver, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str__validate, + (const bstring *)&be_const_str_hour, + (const bstring *)&be_const_str_False, NULL, - (const bstring *)&be_const_str_widget_instance_size, - (const bstring *)&be_const_str_unsubscribe, - (const bstring *)&be_const_str_RGBCT, + (const bstring *)&be_const_str_cos, + (const bstring *)&be_const_str_BECDFE, + (const bstring *)&be_const_str_gamma, + (const bstring *)&be_const_str_partition_core, + (const bstring *)&be_const_str_minute, NULL, - (const bstring *)&be_const_str_alternate, - (const bstring *)&be_const_str_isnan, - (const bstring *)&be_const_str_set_size, - (const bstring *)&be_const_str_lights, - (const bstring *)&be_const_str__X3E, - (const bstring *)&be_const_str_AudioGenerator, - (const bstring *)&be_const_str__X22, - (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_ccronexpr, + (const bstring *)&be_const_str_remove_trailing_zeroes, + (const bstring *)&be_const_str__X2Ebec, + (const bstring *)&be_const_str__X3Clambda_X3E, + (const bstring *)&be_const_str__X2B, + NULL, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, + (const bstring *)&be_const_str__X2E_X2E, + (const bstring *)&be_const_str_is_spiffs, + (const bstring *)&be_const_str_content_button, + NULL, + (const bstring *)&be_const_str__X2Fstate_X2F, + (const bstring *)&be_const_str_crc8, + (const bstring *)&be_const_str_true, + (const bstring *)&be_const_str_set_timer, + (const bstring *)&be_const_str__X26lt_X3BNone_X26gt_X3B, + (const bstring *)&be_const_str_assert, + (const bstring *)&be_const_str_tcpclient, + (const bstring *)&be_const_str_MAX_RMT, + (const bstring *)&be_const_str_set_active, + (const bstring *)&be_const_str_last_modified, + (const bstring *)&be_const_str__X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_closure, + (const bstring *)&be_const_str__X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, + (const bstring *)&be_const_str_SERIAL_6O1, + (const bstring *)&be_const_str_set_dc_voltage, + (const bstring *)&be_const_str_asstring, + (const bstring *)&be_const_str_area, + (const bstring *)&be_const_str_list, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_power_off, + (const bstring *)&be_const_str_connect, + NULL, + NULL, + (const bstring *)&be_const_str__drivers, + NULL, + (const bstring *)&be_const_str_TASMOTA, + (const bstring *)&be_const_str_remove_cmd, + (const bstring *)&be_const_str_init_draw_arc_dsc, + (const bstring *)&be_const_str__X23preinit_X2Ebe, + (const bstring *)&be_const_str_isinstance, + (const bstring *)&be_const_str__X25, + NULL, + NULL, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str__X3F, + (const bstring *)&be_const_str_web_sensor, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_info_X28_X25d_X25s_X2C_X25d_X25s_X2C0x_X2508X_X2C0x_X2508X_X2C_X27_X25s_X27_X2C0x_X25X_X29_X3E, + (const bstring *)&be_const_str_raise, + (const bstring *)&be_const_str_OPTION_A, + NULL, + (const bstring *)&be_const_str_year, + (const bstring *)&be_const_str__X28_X29, + NULL, + (const bstring *)&be_const_str_is_running, + (const bstring *)&be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dzip_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, + (const bstring *)&be_const_str_bus, + (const bstring *)&be_const_str_get_alternate, + (const bstring *)&be_const_str_ota_, + (const bstring *)&be_const_str_BRY_X3A_X20method_X20not_X20allowed_X2C_X20use_X20a_X20closure_X20like_X20_X27_X2F_X20args_X20_X2D_X3E_X20obj_X2Efunc_X28args_X29_X27, + (const bstring *)&be_const_str_run_cron, (const bstring *)&be_const_str_lv, - (const bstring *)&be_const_str_arc_dsc, - (const bstring *)&be_const_str_redirect, - (const bstring *)&be_const_str_active_otadata, - (const bstring *)&be_const_str_pixel_size + (const bstring *)&be_const_str_font_embedded, + (const bstring *)&be_const_str_set_pixel_color, + (const bstring *)&be_const_str_RES_OK, + NULL, + NULL, + (const bstring *)&be_const_str_splash_remove, + (const bstring *)&be_const_str_SERIAL_7E2, + (const bstring *)&be_const_str__energy, + (const bstring *)&be_const_str_Too_X20many_X20partiition_X20slots, + (const bstring *)&be_const_str_full_state, + (const bstring *)&be_const_str__, + (const bstring *)&be_const_str_code, + (const bstring *)&be_const_str_b, + NULL, + NULL, + (const bstring *)&be_const_str__X3E_X3D, + (const bstring *)&be_const_str_Partition_info, + (const bstring *)&be_const_str__X2Elen, + (const bstring *)&be_const_str_global, + (const bstring *)&be_const_str_otadata, + (const bstring *)&be_const_str__X29, + NULL, + (const bstring *)&be_const_str__X3C, + (const bstring *)&be_const_str__X27_X20_X2D_X20, + (const bstring *)&be_const_str_display, + (const bstring *)&be_const_str_lv_signal_arcs, + (const bstring *)&be_const_str_get_light, + (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str__X23display_X2Eini, + (const bstring *)&be_const_str__X25s_X2Eautoconf, + (const bstring *)&be_const_str_CT, + (const bstring *)&be_const_str_Tasmota, + (const bstring *)&be_const_str_function, + (const bstring *)&be_const_str_floor, + (const bstring *)&be_const_str_attrdump, + (const bstring *)&be_const_str_elements_X20must_X20be_X20a_X20lv_point, + (const bstring *)&be_const_str_CFG_X3A_X20running_X20, + (const bstring *)&be_const_str_Tele, + (const bstring *)&be_const_str__X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, + (const bstring *)&be_const_str_lv_obj, + (const bstring *)&be_const_str__X2Esize, + NULL, + NULL, + (const bstring *)&be_const_str_get_temp, + (const bstring *)&be_const_str__global_addr, + (const bstring *)&be_const_str_conn_cb, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_adv_block, + (const bstring *)&be_const_str__X2Ep, + (const bstring *)&be_const_str_add_cb_event_closure, + (const bstring *)&be_const_str_preinit, + (const bstring *)&be_const_str_c, + (const bstring *)&be_const_str_read12, + (const bstring *)&be_const_str_add_fast_loop, + (const bstring *)&be_const_str_remote_ip, + NULL, + (const bstring *)&be_const_str_00, + (const bstring *)&be_const_str__t, + (const bstring *)&be_const_str_var, + (const bstring *)&be_const_str__X2E, + (const bstring *)&be_const_str_id_X20must_X20be_X20of_X20type_X20_X27int_X27, + (const bstring *)&be_const_str__X3D, + (const bstring *)&be_const_str_json_fdump_map, + (const bstring *)&be_const_str_connected, + (const bstring *)&be_const_str_deg, + NULL, + (const bstring *)&be_const_str_public_key, + (const bstring *)&be_const_str_set_rate, + (const bstring *)&be_const_str_fast_loop_enabled, + (const bstring *)&be_const_str__X2Flights_X2F, + (const bstring *)&be_const_str_json_fdump_any, + (const bstring *)&be_const_str__X2Ep1, + (const bstring *)&be_const_str_content_start, + (const bstring *)&be_const_str_open, + (const bstring *)&be_const_str_BRY_X3A_X20bytecode_X20has_X20wrong_X20version_X20_X27_X25s_X27_X20_X28_X25i_X29, + (const bstring *)&be_const_str__X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, + (const bstring *)&be_const_str_AudioGeneratorWAV, + (const bstring *)&be_const_str_decode, + (const bstring *)&be_const_str__X3D_X3C_X3E_X21, + (const bstring *)&be_const_str_BRY_X3A_X20Exception_X3E_X20_X27, + (const bstring *)&be_const_str__X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, + (const bstring *)&be_const_str_find_key_i, + (const bstring *)&be_const_str_add_header, + (const bstring *)&be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29, + (const bstring *)&be_const_str_get_ota_slot, + (const bstring *)&be_const_str_AudioFileSourceFS, + (const bstring *)&be_const_str_load_freetype_font, + (const bstring *)&be_const_str_imax, + (const bstring *)&be_const_str_SK6812_GRBW, + (const bstring *)&be_const_str_read_bytes, + NULL, + (const bstring *)&be_const_str_EVENT_DRAW_PART_END, + (const bstring *)&be_const_str_w, + (const bstring *)&be_const_str_Invalid_X20ota_X20partition_X20number, + (const bstring *)&be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, + (const bstring *)&be_const_str_day, + (const bstring *)&be_const_str_RGB, + NULL, + (const bstring *)&be_const_str__X2F, + (const bstring *)&be_const_str__X2D_X2A, + NULL, + (const bstring *)&be_const_str_Unknown_X20command, + (const bstring *)&be_const_str_read, + (const bstring *)&be_const_str__X20_X20, + (const bstring *)&be_const_str_raw, + (const bstring *)&be_const_str_get_bat_power, + (const bstring *)&be_const_str__splash, + (const bstring *)&be_const_str__dirty, + (const bstring *)&be_const_str_fat, + (const bstring *)&be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function, + (const bstring *)&be_const_str__X2Ep2, + (const bstring *)&be_const_str_BRY_X3A_X20could_X20not_X20save_X20compiled_X20file_X20_X25s_X20_X28_X25s_X29, + (const bstring *)&be_const_str__X5D_X2C_X0A_X20_X20, + (const bstring *)&be_const_str__archive, + (const bstring *)&be_const_str_add_rule, + (const bstring *)&be_const_str_cmd, + (const bstring *)&be_const_str__settings_def, + (const bstring *)&be_const_str__change_buffer, + (const bstring *)&be_const_str__X0A_X29_X3E, + (const bstring *)&be_const_str_True, + (const bstring *)&be_const_str_SERIAL_6E1, + (const bstring *)&be_const_str_CFG_X3A_X20loading_X20, + (const bstring *)&be_const_str__X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, + NULL, + (const bstring *)&be_const_str_SERIAL_6N1, + (const bstring *)&be_const_str__ccmd, + NULL, + NULL, + (const bstring *)&be_const_str__X3C_X3D, + (const bstring *)&be_const_str__X3Cselect_X20name_X3D_X27zip_X27_X3E, + (const bstring *)&be_const_str_nvskeys, + (const bstring *)&be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, + NULL, + (const bstring *)&be_const_str__X0A, + (const bstring *)&be_const_str___upper__, + NULL, + (const bstring *)&be_const_str_cosh, + (const bstring *)&be_const_str__X2C, + (const bstring *)&be_const_str__X23init_X2Ebat, + (const bstring *)&be_const_str_font_montserrat, + (const bstring *)&be_const_str__X2Eautoconf, + (const bstring *)&be_const_str_MD5, + NULL, + (const bstring *)&be_const_str__rmt, + (const bstring *)&be_const_str_driver_name, + (const bstring *)&be_const_str_PART_MAIN, + (const bstring *)&be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29, + (const bstring *)&be_const_str_ALIGN_LEFT_MID, + (const bstring *)&be_const_str_pin_mode, + (const bstring *)&be_const_str_escape, + (const bstring *)&be_const_str_bri, + (const bstring *)&be_const_str_add_cron, + (const bstring *)&be_const_str_is_ota, + (const bstring *)&be_const_str_AA50, + (const bstring *)&be_const_str_resp_cmnd_failed, + (const bstring *)&be_const_str_full_status, + (const bstring *)&be_const_str_ALIGN_BOTTOM_MID, + (const bstring *)&be_const_str_arg_name, + (const bstring *)&be_const_str_consume_silence, + (const bstring *)&be_const_str_SERIAL_6E2, + (const bstring *)&be_const_str_hs2rgb, + (const bstring *)&be_const_str_check_not_method, + (const bstring *)&be_const_str_member, + NULL, + (const bstring *)&be_const_str_get_power, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, + (const bstring *)&be_const_str_0x_X2502X, + (const bstring *)&be_const_str_f, + (const bstring *)&be_const_str_SERIAL_8N2, + (const bstring *)&be_const_str_CFG_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s, + (const bstring *)&be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27, + (const bstring *)&be_const_str_ctypes_bytes, + (const bstring *)&be_const_str_next_cron, + (const bstring *)&be_const_str_set_reachable, + (const bstring *)&be_const_str_add_event_cb, + (const bstring *)&be_const_str__X2D, + (const bstring *)&be_const_str_BRY_X3A_X20invalid_X20hue_X20payload_X3A_X20, + (const bstring *)&be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27, + (const bstring *)&be_const_str_acos, + NULL, + (const bstring *)&be_const_str_SERIAL_5N2, + (const bstring *)&be_const_str_nil, + (const bstring *)&be_const_str_decompress, + (const bstring *)&be_const_str_cb_event_closure, + (const bstring *)&be_const_str_cmd_res, + (const bstring *)&be_const_str_zb_device, + (const bstring *)&be_const_str_clear_first_time, + (const bstring *)&be_const_str__filename, + (const bstring *)&be_const_str_pixel_size, + (const bstring *)&be_const_str_argument_X20must_X20be_X20a_X20list_X20or_X20a_X20pointer_X2Bsize, + NULL, + (const bstring *)&be_const_str_exec_tele, + (const bstring *)&be_const_str_RGBCT, + (const bstring *)&be_const_str_clock_icon, + (const bstring *)&be_const_str_listdir, + (const bstring *)&be_const_str_files, + (const bstring *)&be_const_str_clear_to, + (const bstring *)&be_const_str_set_alternate, + (const bstring *)&be_const_str_POST, + (const bstring *)&be_const_str_Parameter_X20error, + (const bstring *)&be_const_str__X3Cinstance_X3A_X20Partition_X28_X5B_X0A, + (const bstring *)&be_const_str_create_segment, + (const bstring *)&be_const_str__X2Ebe, + NULL, + (const bstring *)&be_const_str_set_style_radius, + (const bstring *)&be_const_str_run_bat, + (const bstring *)&be_const_str_dimmer, + (const bstring *)&be_const_str_SERIAL_8N1, + (const bstring *)&be_const_str_contains, + (const bstring *)&be_const_str_out_X20of_X20range, + (const bstring *)&be_const_str_y, + NULL, + (const bstring *)&be_const_str_response_append, + (const bstring *)&be_const_str_leds, + (const bstring *)&be_const_str__X22, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, + NULL, + (const bstring *)&be_const_str__X2Etapp, + (const bstring *)&be_const_str_int, + (const bstring *)&be_const_str__X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, + (const bstring *)&be_const_str_gamma8, + (const bstring *)&be_const_str_CFG_X3A_X20ran_X20_X20, + (const bstring *)&be_const_str_pin, + (const bstring *)&be_const_str_reverse_gamma10, + (const bstring *)&be_const_str__X2Fac, + (const bstring *)&be_const_str_before_del, + (const bstring *)&be_const_str_point_arr, + (const bstring *)&be_const_str__X2F_X3Frst_X3D, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_SERIAL_5O1, + (const bstring *)&be_const_str_EVENT_DRAW_PART_BEGIN, + (const bstring *)&be_const_str_CFG_X3A_X20loaded_X20_X20, + (const bstring *)&be_const_str_get_width, + (const bstring *)&be_const_str_pop_path, + (const bstring *)&be_const_str_AXP192, + (const bstring *)&be_const_str_members, + (const bstring *)&be_const_str_select, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_battery_present, + (const bstring *)&be_const_str_nan, + (const bstring *)&be_const_str_SERIAL_6N2, + (const bstring *)&be_const_str_CFG_X3A_X20skipping_X20_X27display_X2Eini_X27_X20because_X20already_X20present_X20in_X20file_X2Dsystem, + NULL, + (const bstring *)&be_const_str_get_battery_chargin_status }; static const struct bconststrtab m_const_string_table = { - .size = 506, - .count = 1036, + .size = 509, + .count = 1042, .table = m_string_table }; diff --git a/lib/libesp32/berry/generate/be_fixed_be_class_zb_coord_ntv.h b/lib/libesp32/berry/generate/be_fixed_be_class_zb_coord_ntv.h new file mode 100644 index 000000000..bbf05448d --- /dev/null +++ b/lib/libesp32/berry/generate/be_fixed_be_class_zb_coord_ntv.h @@ -0,0 +1,23 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_zb_coord_ntv_map) { + { be_const_key(iter, -1), be_const_func(zc_iter) }, + { be_const_key(zcl_frame, -1), be_const_class(be_class_zcl_frame) }, + { be_const_key(zb_device, 3), be_const_class(be_class_zb_device) }, + { be_const_key(info, -1), be_const_func(zc_info) }, + { be_const_key(size, 1), be_const_ctype_func(zc_size) }, + { be_const_key(item, -1), be_const_func(zc_item) }, + { be_const_key(abort, 4), be_const_ctype_func(zc_abort) }, +}; + +static be_define_const_map( + be_class_zb_coord_ntv_map, + 7 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_zb_coord_ntv, + 0, + NULL, + zb_coord_ntv +); diff --git a/lib/libesp32/berry/generate/be_fixed_be_class_zb_device.h b/lib/libesp32/berry/generate/be_fixed_be_class_zb_device.h new file mode 100644 index 000000000..4e486f6fa --- /dev/null +++ b/lib/libesp32/berry/generate/be_fixed_be_class_zb_device.h @@ -0,0 +1,20 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_zb_device_map) { + { be_const_key(init, -1), be_const_ctype_func(zd_init) }, + { be_const_key(tostring, -1), be_const_closure(zb_device_tostring_closure) }, + { be_const_key(_p, -1), be_const_var(0) }, + { be_const_key(member, 0), be_const_func(zd_member) }, +}; + +static be_define_const_map( + be_class_zb_device_map, + 4 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_zb_device, + 1, + NULL, + zb_device +); diff --git a/lib/libesp32/berry/generate/be_fixed_be_class_zcl_frame_ntv.h b/lib/libesp32/berry/generate/be_fixed_be_class_zcl_frame_ntv.h new file mode 100644 index 000000000..8b357f60f --- /dev/null +++ b/lib/libesp32/berry/generate/be_fixed_be_class_zcl_frame_ntv.h @@ -0,0 +1,17 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(be_class_zcl_frame_ntv_map) { + { be_const_key(_def, -1), be_const_comptr(&be_zigbee_zcl_frame_struct) }, +}; + +static be_define_const_map( + be_class_zcl_frame_ntv_map, + 1 +); + +BE_EXPORT_VARIABLE be_define_const_class( + be_class_zcl_frame_ntv, + 0, + (bclass *)&be_class_ctypes_bytes, + zcl_frame_ntv +); diff --git a/lib/libesp32/berry/generate/be_fixed_zigbee.h b/lib/libesp32/berry/generate/be_fixed_zigbee.h new file mode 100644 index 000000000..ed5c510ae --- /dev/null +++ b/lib/libesp32/berry/generate/be_fixed_zigbee.h @@ -0,0 +1,17 @@ +#include "be_constobj.h" + +static be_define_const_map_slots(m_libzigbee_map) { + { be_const_key(init, -1), be_const_func(zigbee_init) }, +}; + +static be_define_const_map( + m_libzigbee_map, + 1 +); + +static be_define_const_module( + m_libzigbee, + "zigbee" +); + +BE_EXPORT_VARIABLE be_define_const_native_module(zigbee); diff --git a/lib/libesp32/berry_mapping/src/be_const_members.c b/lib/libesp32/berry_mapping/src/be_const_members.c index 66174ebca..810de4574 100644 --- a/lib/libesp32/berry_mapping/src/be_const_members.c +++ b/lib/libesp32/berry_mapping/src/be_const_members.c @@ -76,6 +76,7 @@ static bbool be_const_member_dual(bvm *vm, const be_const_member_t * definitions case '>': // call to a ctype function { be_ctype_var_args_t* args = (be_ctype_var_args_t*) definitions[idx].value; + be_pop(vm, be_top(vm) - 1); // make sure we have only the instance left on the stack int ret = be_call_c_func(vm, args->func, args->return_type, NULL); if ((ret == BE_OK) && !be_isnil(vm, -1)) { return btrue; diff --git a/lib/libesp32/berry_tasmota/src/be_zigbee.c b/lib/libesp32/berry_tasmota/src/be_zigbee.c new file mode 100644 index 000000000..bb7d851da --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/be_zigbee.c @@ -0,0 +1,173 @@ +/******************************************************************** + * Zigbee + * + *******************************************************************/ +#ifdef USE_ZIGBEE + +#include "be_constobj.h" +#include "be_mapping.h" +#include "be_ctypes.h" + +#ifndef ARRAY_SIZE +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) +#endif + +extern const void * zd_init(void* d); BE_FUNC_CTYPE_DECLARE(zd_init, "+_p", "c") + +extern int32_t zd_shortaddr(void* d); BE_VAR_CTYPE_DECLARE(zd_shortaddr, "i"); +extern const void* zd_longaddr(void* d, size_t *size, void* p2); BE_VAR_CTYPE_DECLARE(zd_longaddr, "&"); +extern const char* zd_manufacturer(void* d); BE_VAR_CTYPE_DECLARE(zd_manufacturer, "s"); +extern const char* zd_model(void* d); BE_VAR_CTYPE_DECLARE(zd_model, "s"); +extern const char* zd_name(void* d); BE_VAR_CTYPE_DECLARE(zd_name, "s"); +extern bbool zd_router(void* d); BE_VAR_CTYPE_DECLARE(zd_router, "b"); +extern bbool zd_hidden(void* d); BE_VAR_CTYPE_DECLARE(zd_hidden, "b"); +extern bbool zd_reachable(void* d); BE_VAR_CTYPE_DECLARE(zd_reachable, "b"); +extern int32_t zd_lastseen(void* d); BE_VAR_CTYPE_DECLARE(zd_lastseen, "i"); +extern int32_t zd_lqi(void* d); BE_VAR_CTYPE_DECLARE(zd_lqi, "i"); +extern int32_t zd_battery(void* d); BE_VAR_CTYPE_DECLARE(zd_battery, "i"); +extern int32_t zd_battery_lastseen(void* d); BE_VAR_CTYPE_DECLARE(zd_battery_lastseen, "i"); + +// moved to constants array +// MUST BE STORED IN SORTED LIST +const be_const_member_t zd_members[] = { + { ">battery", be_ctype(zd_battery) }, + { ">battery_lastseen", be_ctype(zd_battery_lastseen) }, + { ">hidden", be_ctype(zd_hidden) }, + { ">lastseen", be_ctype(zd_lastseen) }, + { ">longaddr", be_ctype(zd_longaddr) }, + { ">lqi", be_ctype(zd_lqi) }, + { ">manufacturer", be_ctype(zd_manufacturer) }, + { ">model", be_ctype(zd_model) }, + { ">name", be_ctype(zd_name) }, + { ">reachable", be_ctype(zd_reachable) }, + { ">router", be_ctype(zd_router) }, + { ">shortaddr", be_ctype(zd_shortaddr) }, +}; + +static int zd_member(bvm *vm) { + if (be_const_class_member(vm, zd_members, ARRAY_SIZE(zd_members))) { + be_return(vm); + } else { + be_return_nil(vm); + } +} + +extern int zc_info(struct bvm *vm); +extern int zc_item(struct bvm *vm); +extern int32_t zc_size(void* d); BE_FUNC_CTYPE_DECLARE(zc_size, "i", "."); +extern int zc_iter(bvm *vm); +extern void zc_abort(void); BE_FUNC_CTYPE_DECLARE(zc_abort, "", "."); + +extern const bclass be_class_ctypes_bytes; +extern const be_ctypes_structure_t be_zigbee_zcl_frame_struct; +extern const bclass be_class_zcl_frame; + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(zb_device_tostring, /* name */ + be_nested_proto( + 14, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("json"), + /* K1 */ be_nested_str_literal("string"), + /* K2 */ be_nested_str_literal("longaddr"), + /* K3 */ be_nested_str_literal("format"), + /* K4 */ be_nested_str_literal(""), + /* K5 */ be_nested_str_literal("shortaddr"), + /* K6 */ be_nested_str_literal("get"), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_literal("name"), + /* K9 */ be_nested_str_literal("model"), + /* K10 */ be_nested_str_literal("manufacturer"), + }), + be_str_literal("tostring"), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x8C100503, // 0003 GETMET R4 R2 K3 + 0x58180004, // 0004 LDCONST R6 K4 + 0x601C0005, // 0005 GETGBL R7 G5 + 0x5C200000, // 0006 MOVE R8 R0 + 0x7C1C0200, // 0007 CALL R7 1 + 0x88200105, // 0008 GETMBR R8 R0 K5 + 0x8C240706, // 0009 GETMET R9 R3 K6 + 0x542E0003, // 000A LDINT R11 4 + 0x54320003, // 000B LDINT R12 4 + 0x7C240600, // 000C CALL R9 3 + 0x8C280706, // 000D GETMET R10 R3 K6 + 0x58300007, // 000E LDCONST R12 K7 + 0x54360003, // 000F LDINT R13 4 + 0x7C280600, // 0010 CALL R10 3 + 0x882C0108, // 0011 GETMBR R11 R0 K8 + 0x88300109, // 0012 GETMBR R12 R0 K9 + 0x8834010A, // 0013 GETMBR R13 R0 K10 + 0x7C101200, // 0014 CALL R4 9 + 0x80040800, // 0015 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +// Module Zigbee +extern const bclass be_class_zb_coord; +static int zigbee_init(bvm *vm) { + be_pushntvclass(vm, &be_class_zb_coord); + be_call(vm, 0); + be_return(vm); +} + +#include "be_fixed_be_class_zb_device.h" +#include "be_fixed_be_class_zb_coord_ntv.h" +#include "be_fixed_be_class_zcl_frame_ntv.h" +#include "be_fixed_zigbee.h" + +/* @const_object_info_begin +class be_class_zb_device (scope: global, name: zb_device) { + _p, var + init, ctype_func(zd_init) + + member, func(zd_member) + + tostring, closure(zb_device_tostring_closure) +} +@const_object_info_end */ + +/* @const_object_info_begin +class be_class_zb_coord_ntv (scope: global, name: zb_coord_ntv) { + zcl_frame, class(be_class_zcl_frame) + zb_device, class(be_class_zb_device) + + info, func(zc_info) + item, func(zc_item) + size, ctype_func(zc_size) + iter, func(zc_iter) + + abort, ctype_func(zc_abort) +} +@const_object_info_end */ + + +/* @const_object_info_begin +class be_class_zcl_frame_ntv (scope: global, name: zcl_frame_ntv, super: be_class_ctypes_bytes) { + _def, comptr(&be_zigbee_zcl_frame_struct) +} +@const_object_info_end */ + +/* @const_object_info_begin +module zigbee (scope: global) { + init, func(zigbee_init) +} +@const_object_info_end */ + +#endif // USE_LIGHT diff --git a/lib/libesp32/berry_tasmota/src/be_zigbee_zb_coord.c b/lib/libesp32/berry_tasmota/src/be_zigbee_zb_coord.c new file mode 100644 index 000000000..0600c1995 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/be_zigbee_zb_coord.c @@ -0,0 +1,214 @@ +/******************************************************************** + * Zigbee + * + *******************************************************************/ +#ifdef USE_ZIGBEE + +#include "be_constobj.h" + +extern const bclass be_class_zb_coord_ntv; + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(zb_coord_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("init"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x8C040300, // 0003 GETMET R1 R1 K0 + 0x7C040200, // 0004 CALL R1 1 + 0x80000000, // 0005 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_handler +********************************************************************/ +be_local_closure(zb_coord_add_handler, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("instance"), + /* K1 */ be_nested_str_literal("value_error"), + /* K2 */ be_nested_str_literal("instance required"), + /* K3 */ be_nested_str_literal("_handlers"), + /* K4 */ be_nested_str_literal("push"), + }), + be_str_literal("add_handler"), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x20080500, // 0003 NE R2 R2 K0 + 0x780A0000, // 0004 JMPF R2 #0006 + 0xB0060302, // 0005 RAISE 1 K1 K2 + 0x88080103, // 0006 GETMBR R2 R0 K3 + 0x780A0004, // 0007 JMPF R2 #000D + 0x88080103, // 0008 GETMBR R2 R0 K3 + 0x8C080504, // 0009 GETMET R2 R2 K4 + 0x5C100200, // 000A MOVE R4 R1 + 0x7C080400, // 000B CALL R2 2 + 0x70020003, // 000C JMP #0011 + 0x60080012, // 000D GETGBL R2 G18 + 0x7C080000, // 000E CALL R2 0 + 0x400C0401, // 000F CONNECT R3 R2 R1 + 0x90020602, // 0010 SETMBR R0 K3 R2 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: dispatch +********************************************************************/ +be_local_closure(zb_coord_dispatch, /* name */ + be_nested_proto( + 19, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_literal("_handlers"), + /* K1 */ be_nested_str_literal("introspect"), + /* K2 */ be_nested_str_literal("string"), + /* K3 */ be_nested_str_literal("zcl_frame"), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_literal("get"), + /* K6 */ be_nested_str_literal("function"), + /* K7 */ be_nested_str_literal("format"), + /* K8 */ be_nested_str_literal("BRY: Exception> '%s' - %s"), + /* K9 */ be_nested_str_literal("tasmota"), + /* K10 */ be_nested_str_literal("_debug_present"), + /* K11 */ be_nested_str_literal("debug"), + /* K12 */ be_nested_str_literal("traceback"), + /* K13 */ be_const_int(1), + }), + be_str_literal("dispatch"), + &be_const_str_solidified, + ( &(const binstruction[61]) { /* code */ + 0x88140100, // 0000 GETMBR R5 R0 K0 + 0x4C180000, // 0001 LDNIL R6 + 0x1C140A06, // 0002 EQ R5 R5 R6 + 0x78160000, // 0003 JMPF R5 #0005 + 0x80000A00, // 0004 RET 0 + 0xA4160200, // 0005 IMPORT R5 K1 + 0xA41A0400, // 0006 IMPORT R6 K2 + 0x5C1C0600, // 0007 MOVE R7 R3 + 0x1C200503, // 0008 EQ R8 R2 K3 + 0x78220003, // 0009 JMPF R8 #000E + 0x8C200103, // 000A GETMET R8 R0 K3 + 0x5C280600, // 000B MOVE R10 R3 + 0x7C200400, // 000C CALL R8 2 + 0x5C1C1000, // 000D MOVE R7 R8 + 0x58200004, // 000E LDCONST R8 K4 + 0x6024000C, // 000F GETGBL R9 G12 + 0x88280100, // 0010 GETMBR R10 R0 K0 + 0x7C240200, // 0011 CALL R9 1 + 0x14241009, // 0012 LT R9 R8 R9 + 0x78260027, // 0013 JMPF R9 #003C + 0x88240100, // 0014 GETMBR R9 R0 K0 + 0x94241208, // 0015 GETIDX R9 R9 R8 + 0x8C280B05, // 0016 GETMET R10 R5 K5 + 0x5C301200, // 0017 MOVE R12 R9 + 0x5C340200, // 0018 MOVE R13 R1 + 0x7C280600, // 0019 CALL R10 3 + 0x602C0004, // 001A GETGBL R11 G4 + 0x5C301400, // 001B MOVE R12 R10 + 0x7C2C0200, // 001C CALL R11 1 + 0x1C2C1706, // 001D EQ R11 R11 K6 + 0x782E001A, // 001E JMPF R11 #003A + 0xA8020008, // 001F EXBLK 0 #0029 + 0x5C2C1400, // 0020 MOVE R11 R10 + 0x5C301200, // 0021 MOVE R12 R9 + 0x5C340200, // 0022 MOVE R13 R1 + 0x5C380400, // 0023 MOVE R14 R2 + 0x5C3C0E00, // 0024 MOVE R15 R7 + 0x5C400800, // 0025 MOVE R16 R4 + 0x7C2C0A00, // 0026 CALL R11 5 + 0xA8040001, // 0027 EXBLK 1 1 + 0x70020010, // 0028 JMP #003A + 0xAC2C0002, // 0029 CATCH R11 0 2 + 0x7002000D, // 002A JMP #0039 + 0x60340001, // 002B GETGBL R13 G1 + 0x8C380D07, // 002C GETMET R14 R6 K7 + 0x58400008, // 002D LDCONST R16 K8 + 0x5C441600, // 002E MOVE R17 R11 + 0x5C481800, // 002F MOVE R18 R12 + 0x7C380800, // 0030 CALL R14 4 + 0x7C340200, // 0031 CALL R13 1 + 0xB8361200, // 0032 GETNGBL R13 K9 + 0x88341B0A, // 0033 GETMBR R13 R13 K10 + 0x78360002, // 0034 JMPF R13 #0038 + 0xA4361600, // 0035 IMPORT R13 K11 + 0x8C381B0C, // 0036 GETMET R14 R13 K12 + 0x7C380200, // 0037 CALL R14 1 + 0x70020000, // 0038 JMP #003A + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x0020110D, // 003A ADD R8 R8 K13 + 0x7001FFD2, // 003B JMP #000F + 0x80000000, // 003C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: zb_coord +********************************************************************/ +extern const bclass be_class_zb_coord_ntv; +be_local_class(zb_coord, + 1, + &be_class_zb_coord_ntv, + be_nested_map(4, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_literal("dispatch", 1), be_const_closure(zb_coord_dispatch_closure) }, + { be_const_key_literal("add_handler", 2), be_const_closure(zb_coord_add_handler_closure) }, + { be_const_key_literal("_handlers", -1), be_const_var(0) }, + { be_const_key_literal("init", 0), be_const_closure(zb_coord_init_closure) }, + })), + be_str_literal("zb_coord") +); +/*******************************************************************/ + +void be_load_zb_coord_class(bvm *vm) { + be_pushntvclass(vm, &be_class_zb_coord); + be_setglobal(vm, "zb_coord"); + be_pop(vm, 1); +} + + +#endif // USE_LIGHT diff --git a/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_frame.c b/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_frame.c new file mode 100644 index 000000000..35a63c800 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/be_zigbee_zcl_frame.c @@ -0,0 +1,255 @@ +/******************************************************************** + * Zigbee + * + *******************************************************************/ +#ifdef USE_ZIGBEE + +#include "be_constobj.h" + +extern const bclass be_class_zcl_frame_ntv; + + +/******************************************************************** +** Solidified function: member +********************************************************************/ +be_local_closure(zcl_frame_member, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_literal("payload"), + /* K1 */ be_nested_str_literal("_get_bytes"), + /* K2 */ be_nested_str_literal("member"), + }), + be_str_literal("member"), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x1C080300, // 0000 EQ R2 R1 K0 + 0x780A0003, // 0001 JMPF R2 #0006 + 0x8C080101, // 0002 GETMET R2 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x80040400, // 0004 RET 1 R2 + 0x70020006, // 0005 JMP #000D + 0x60080003, // 0006 GETGBL R2 G3 + 0x5C0C0000, // 0007 MOVE R3 R0 + 0x7C080200, // 0008 CALL R2 1 + 0x8C080502, // 0009 GETMET R2 R2 K2 + 0x5C100200, // 000A MOVE R4 R1 + 0x7C080400, // 000B CALL R2 2 + 0x80040400, // 000C RET 1 R2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tomap +********************************************************************/ +be_local_closure(zcl_frame_tomap, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("string"), + /* K1 */ be_nested_str_literal("tomap"), + /* K2 */ be_nested_str_literal("shortaddr_hex"), + /* K3 */ be_nested_str_literal("format"), + /* K4 */ be_nested_str_literal("0x%04X"), + /* K5 */ be_nested_str_literal("shortaddr"), + /* K6 */ be_nested_str_literal("payload"), + }), + be_str_literal("tomap"), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x60080003, // 0001 GETGBL R2 G3 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x8C080501, // 0004 GETMET R2 R2 K1 + 0x7C080200, // 0005 CALL R2 1 + 0x8C0C0303, // 0006 GETMET R3 R1 K3 + 0x58140004, // 0007 LDCONST R5 K4 + 0x88180105, // 0008 GETMBR R6 R0 K5 + 0x7C0C0600, // 0009 CALL R3 3 + 0x980A0403, // 000A SETIDX R2 K2 R3 + 0x880C0106, // 000B GETMBR R3 R0 K6 + 0x980A0C03, // 000C SETIDX R2 K6 R3 + 0x80040400, // 000D RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(zcl_frame_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* 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_str_literal("init"), + /* K1 */ be_nested_str_literal("no_bytes"), + }), + be_str_literal("init"), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x60080003, // 0000 GETGBL R2 G3 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080500, // 0003 GETMET R2 R2 K0 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x60080015, // 0006 GETGBL R2 G21 + 0x7C080000, // 0007 CALL R2 0 + 0x90020202, // 0008 SETMBR R0 K1 R2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _get_bytes +********************************************************************/ +be_local_closure(zcl_frame__get_bytes, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* 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_str_literal("introspect"), + /* K1 */ be_nested_str_literal("toptr"), + /* K2 */ be_nested_str_literal("payload_ptr"), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_literal("get"), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_literal("no_bytes"), + }), + be_str_literal("_get_bytes"), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080301, // 0001 GETMET R2 R1 K1 + 0x88100102, // 0002 GETMBR R4 R0 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x600C0009, // 0004 GETGBL R3 G9 + 0x5C100400, // 0005 MOVE R4 R2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x200C0703, // 0007 NE R3 R3 K3 + 0x780E0013, // 0008 JMPF R3 #001D + 0x600C0015, // 0009 GETGBL R3 G21 + 0x5C100400, // 000A MOVE R4 R2 + 0x5415FFFB, // 000B LDINT R5 -4 + 0x7C0C0400, // 000C CALL R3 2 + 0x8C100704, // 000D GETMET R4 R3 K4 + 0x58180005, // 000E LDCONST R6 K5 + 0x581C0005, // 000F LDCONST R7 K5 + 0x7C100600, // 0010 CALL R4 3 + 0x60140015, // 0011 GETGBL R5 G21 + 0x8C180301, // 0012 GETMET R6 R1 K1 + 0x60200009, // 0013 GETGBL R8 G9 + 0x5C240400, // 0014 MOVE R9 R2 + 0x7C200200, // 0015 CALL R8 1 + 0x54260003, // 0016 LDINT R9 4 + 0x00201009, // 0017 ADD R8 R8 R9 + 0x7C180400, // 0018 CALL R6 2 + 0x5C1C0800, // 0019 MOVE R7 R4 + 0x7C140400, // 001A CALL R5 2 + 0x80040A00, // 001B RET 1 R5 + 0x70020001, // 001C JMP #001F + 0x880C0106, // 001D GETMBR R3 R0 K6 + 0x80040600, // 001E RET 1 R3 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(zcl_frame_tostring, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_literal("tomap"), + }), + be_str_literal("tostring"), + &be_const_str_solidified, + ( &(const binstruction[ 6]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x60080008, // 0002 GETGBL R2 G8 + 0x5C0C0200, // 0003 MOVE R3 R1 + 0x7C080200, // 0004 CALL R2 1 + 0x80040400, // 0005 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: zcl_frame +********************************************************************/ +extern const bclass be_class_zcl_frame_ntv; +be_local_class(zcl_frame, + 1, + &be_class_zcl_frame_ntv, + be_nested_map(6, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_literal("no_bytes", -1), be_const_var(0) }, + { be_const_key_literal("member", 2), be_const_closure(zcl_frame_member_closure) }, + { be_const_key_literal("tostring", -1), be_const_closure(zcl_frame_tostring_closure) }, + { be_const_key_literal("init", -1), be_const_closure(zcl_frame_init_closure) }, + { be_const_key_literal("tomap", 5), be_const_closure(zcl_frame_tomap_closure) }, + { be_const_key_literal("_get_bytes", -1), be_const_closure(zcl_frame__get_bytes_closure) }, + })), + be_str_literal("zcl_frame") +); +/*******************************************************************/ + +void be_load_zcl_frame_class(bvm *vm) { + be_pushntvclass(vm, &be_class_zcl_frame); + be_setglobal(vm, "zcl_frame"); + be_pop(vm, 1); +} + + +#endif // USE_LIGHT diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee.be new file mode 100644 index 000000000..39d4eb227 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee.be @@ -0,0 +1,17 @@ +# zigbee code + +class zb_device + + def tostring() + import json + import string + + var la = self.longaddr # bytes() of size 8, little-endian + return string.format("", + classname(self), self.shortaddr, + la.get(4,4), la.get(0,4), + self.name, self.model, self.manufacturer) + return + end + +end \ No newline at end of file diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be new file mode 100644 index 000000000..a1aa29fa5 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zb_coord.be @@ -0,0 +1,59 @@ +# zigbee zcl_frame class +# solidify.dump(zb_coord,true) + +class zb_coord_ntv end # fake class replaced with native one +#zb_coord_ntv = classof(super(zigbee)) + +class zb_coord : zb_coord_ntv + var _handlers + + def init() + super(self).init() + end + + def add_handler(h) + if type(h) != 'instance' + raise "value_error", "instance required" + end + if self._handlers + self._handlers.push(h) + else + self._handlers = [h] + end + end + + def dispatch(event_type, data_type, data_ptr, idx) + if self._handlers == nil return end + + import introspect + import string + + var data = data_ptr + if data_type == "zcl_frame" + data = self.zcl_frame(data_ptr) + end + + #print(string.format(">ZIG: cmd=%s data_type=%s data=%s idx=%i", event_type, data_type, str(data), idx)) + + var i = 0 + while i < size(self._handlers) + var h = self._handlers[i] + var f = introspect.get(h, event_type) # try to match a function or method with the same name + if type(f) == 'function' + try + f(h, event_type, data_type, data, idx) + except .. as e,m + print(string.format("BRY: Exception> '%s' - %s", e, m)) + if tasmota._debug_present + import debug + debug.traceback() + end + end + end + i += 1 + end + + end + +end + diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be new file mode 100644 index 000000000..9bffc8790 --- /dev/null +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_frame.be @@ -0,0 +1,50 @@ +# zigbee zcl_frame class +# +# solidify.dump(zcl_frame,true) + +var zcl_frame_ntv = super(zcl_frame) + +class zcl_frame : zcl_frame_ntv + var no_bytes + + def init(p) + super(self).init(p) + self.no_bytes = bytes() + end + + def member(name) + if name == "payload" + return self._get_bytes() + else + return super(self).member(name) + end + end + + # return a bytes() object from a pre-populated zcl_frame payload + def _get_bytes() + import introspect + var payload_ptr = introspect.toptr(self.payload_ptr) + if int(payload_ptr) != 0 + var sbuffer = bytes(payload_ptr, -4) + var sbuffer_len = sbuffer.get(2,2) + + return bytes(introspect.toptr(int(payload_ptr) + 4), sbuffer_len) + else + return self.no_bytes + end + end + + def tomap() + import string + var m = super(self).tomap() + m["shortaddr_hex"] = string.format("0x%04X", self.shortaddr) + m["payload"] = self.payload # add payload object which is a synthetic attribute not included in tomap() + return m + end + + def tostring() + var m = self.tomap() + return str(m) + end + +end \ No newline at end of file diff --git a/tasmota/xdrv_23_zigbee_1_headers.ino b/tasmota/xdrv_23_zigbee_1_headers.ino index 38359d00b..685f00ebd 100644 --- a/tasmota/xdrv_23_zigbee_1_headers.ino +++ b/tasmota/xdrv_23_zigbee_1_headers.ino @@ -73,7 +73,6 @@ public: bool state_machine = false; // the state machine is running bool state_waiting = false; // the state machine is waiting for external event or timeout bool state_no_timeout = false; // the current wait loop does not generate a timeout but only continues running - bool ready = false; // cc2530 initialization is complet, ready to operate bool init_phase = true; // initialization phase, before accepting zigbee traffic bool recv_until = false; // ignore all messages until the received frame fully matches bool eeprom_present = false; // is the ZBBridge EEPROM present? diff --git a/tasmota/xdrv_23_zigbee_2_devices.ino b/tasmota/xdrv_23_zigbee_2_devices.ino index 929676bfb..ad4c892b2 100644 --- a/tasmota/xdrv_23_zigbee_2_devices.ino +++ b/tasmota/xdrv_23_zigbee_2_devices.ino @@ -995,7 +995,7 @@ private: * Berry support \*********************************************************************************************/ #ifdef USE_BERRY -extern "C" void callBerryZigbeeDispatcher(const char* type, ZCLFrame* zcl_received); +extern "C" int32_t callBerryZigbeeDispatcher(const char* cmd, const char* type, void* data, int32_t idx); #endif // USE_BERRY /*********************************************************************************************\ diff --git a/tasmota/xdrv_23_zigbee_5_converters.ino b/tasmota/xdrv_23_zigbee_5_converters.ino index d80097056..dda3b7c4a 100644 --- a/tasmota/xdrv_23_zigbee_5_converters.ino +++ b/tasmota/xdrv_23_zigbee_5_converters.ino @@ -855,10 +855,10 @@ public: uint16_t shortaddr = BAD_SHORTADDR; // BAD_SHORTADDR is broadcast, so considered invalid uint8_t dstendpoint = 0x00; // 0x00 is invalid for the dst endpoint // attributes used in send-only mode - bool clusterSpecific = false; - bool needResponse = true; - bool direct = false; // true if direct, false if discover router - bool transacSet = false; // is transac already set + bool clusterSpecific = false; + bool needResponse = true; + bool direct = false; // true if direct, false if discover router + bool transacSet = false; // is transac already set // below private attributes are not used when sending a message private: diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index 348e8e7b7..277dea88d 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -1641,7 +1641,7 @@ void Z_IncomingMessage(class ZCLFrame &zcl_received) { #ifdef USE_BERRY // Berry pre-process messages - // callBerryZigbeeDispatcher("pre", &zcl_received); + callBerryZigbeeDispatcher("incoming", "zcl_frame", &zcl_received, 0); #endif // USE_BERRY // create the device entry if it does not exist and if it's not the local device diff --git a/tasmota/xdrv_52_3_berry_zigbee.ino b/tasmota/xdrv_52_3_berry_zigbee.ino new file mode 100644 index 000000000..bb7614744 --- /dev/null +++ b/tasmota/xdrv_52_3_berry_zigbee.ino @@ -0,0 +1,239 @@ +/* + xdrv_52_3_berry_zigbee.ino - Berry scripting language, native fucnctions + + Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry + + 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 . +*/ + +// Mappgin from internal light and a generic `light_state` Berry class + +#ifdef USE_BERRY +#ifdef USE_ZIGBEE + +#include "berry.h" +#include "be_func.h" + +extern "C" { + extern const bclass be_class_zb_device; + + // Zigbee Device `zd` + const void* zd_init(const class Z_Device* device) { + return device; + } + + int32_t zd_shortaddr(const class Z_Device* d) { + return d->shortaddr; + } + const void* zd_longaddr(const class Z_Device* d, size_t *size, void* p2) { + *size = 8; // 64 bits + return &d->longaddr; + } + + const char* zd_manufacturer(const class Z_Device* d) { + return d->manufacturerId ? d->manufacturerId : ""; + } + extern const char* zd_model(const class Z_Device* d) { + return d->modelId ? d->modelId : ""; + } + extern const char* zd_name(const class Z_Device* d) { + return d->friendlyName ? d->friendlyName : ""; + } + bool zd_router(const class Z_Device* d) { + return d->is_router; + } + bool zd_hidden(const class Z_Device* d) { + return d->hidden; + } + bool zd_reachable(const class Z_Device* d) { + return d->reachable; + } + int32_t zd_lastseen(const class Z_Device* d) { + return d->last_seen; + } + int32_t zd_lqi(const class Z_Device* d) { + return d->lqi == 255 ? -1 : d->lqi; + } + int32_t zd_battery(const class Z_Device* d) { + return d->batterypercent == 255 ? -1 : d->batterypercent; + } + int32_t zd_battery_lastseen(const class Z_Device* d) { + return 0; // TODO not yet known + } +} + +extern "C" { + // Zigbee Coordinator `zc` + int zc_info(struct bvm *vm); + int zc_info(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (top == 1) { // no argument (instance only) + be_newobject(vm, "map"); + be_map_insert_int(vm, "channel", Settings->zb_channel); + be_map_insert_int(vm, "tx_radio", Settings->zb_txradio_dbm); + char tmp[24]; + ext_snprintf_P(tmp, sizeof(tmp), "0x%04X", Settings->zb_pan_id); + be_map_insert_str(vm, "pan_id_hex", tmp); + be_map_insert_int(vm, "pan_id", Settings->zb_pan_id); + ext_snprintf_P(tmp, sizeof(tmp), "0x%_X", &Settings->zb_ext_panid); + be_map_insert_str(vm, "ext_pan_id", tmp); + ext_snprintf_P(tmp, sizeof(tmp), "0x%04X", localShortAddr); + be_map_insert_str(vm, "shortaddr_hex", tmp); + be_map_insert_int(vm, "shortaddr", localShortAddr); + ext_snprintf_P(tmp, sizeof(tmp), "0x%_X", &localIEEEAddr); + be_map_insert_str(vm, "longaddr", tmp); + be_pop(vm, 1); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } + + int zc_item(struct bvm *vm); + int zc_item(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + if (zigbee.init_phase) { + be_raise(vm, "internal_error", "zigbee not started"); + } + if (top >= 2 && (be_isint(vm, 2) || be_isstring(vm, 2))) { + const Z_Device & device = be_isint(vm, 2) ? zigbee_devices.findShortAddr(be_toint(vm, 2)) + : zigbee_devices.parseDeviceFromName(be_tostring(vm, 2)); + if (!device.valid()) { + be_raise(vm, "value_error", "unknown device"); + } + + be_pushntvclass(vm, &be_class_zb_device); + be_pushcomptr(vm, (void*) &device); + be_call(vm, 1); + be_pop(vm, 1); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } + + int32_t zc_size(void*) { + return zigbee_devices.devicesSize(); + } + + // stop zigbee, abort + // The abort state corresponds to state machine stopped but init not finished + void zc_abort(void) { + zigbee.active = false; + zigbee.state_machine = false; // not ready + zigbee.init_phase = false; + } + + // iterator for devices in the coordinator's list of devices + // upval 0: index from 0 to size-1 + static int zc_iter_closure(bvm *vm) + { + /* for better performance, we operate the upvalues + * directly without using by the stack. */ + bntvclos *func = (bntvclos*) var_toobj(vm->cf->func); + bvalue *uv0 = be_ntvclos_upval(func, 0)->value; + bint idx = var_toint(uv0); /* upvalue[0] => lower */ + if (idx >= zigbee_devices.devicesSize()) { + be_stop_iteration(vm); + } + var_toint(uv0) = idx + 1; /* set upvale[0] */ + be_pushntvclass(vm, &be_class_zb_device); + const Z_Device & device = zigbee_devices.isKnownIndexDevice(idx); + be_pushcomptr(vm, (void*) &device); + be_call(vm, 1); + be_pop(vm, 1); + be_return(vm); + } + + int zc_iter(bvm *vm); + int zc_iter(bvm *vm) { + if (zigbee.init_phase) { + be_raise(vm, "internal_error", "zigbee not started"); + } + be_pushntvclosure(vm, zc_iter_closure, 1); + be_pushint(vm, 0); + be_setupval(vm, -2, 0); + be_pop(vm, 1); + be_return(vm); + } + + int32_t callBerryZigbeeDispatcher(const char* cmd, const char* type, void* data, int32_t idx); + int32_t callBerryZigbeeDispatcher(const char* cmd, const char* type, void* data, int32_t idx) { + int32_t ret = 0; + bvm *vm = berry.vm; + + if (nullptr == vm) { return ret; } + checkBeTop(); + be_getglobal(vm, PSTR("zigbee")); // global object of type zb_coord() + if (!be_isnil(vm, -1)) { + be_getmethod(vm, -1, PSTR("dispatch")); // method dispatch + if (!be_isnil(vm, -1)) { + be_pushvalue(vm, -2); // add instance as first arg + be_pushstring(vm, cmd != nullptr ? cmd : ""); + be_pushstring(vm, type != nullptr ? type : ""); + be_pushcomptr(vm, data); + be_pushint(vm, idx); + BrTimeoutStart(); + ret = be_pcall(vm, 5); // 5 arguments + BrTimeoutReset(); + if (ret != 0) { + be_error_pop_all(berry.vm); // clear Berry stack + return ret; + } + be_pop(vm, 5); + if (be_isint(vm, -1) || be_isbool(vm, -1)) { + if (be_isint(vm, -1)) { ret = be_toint(vm, -1); } + if (be_isbool(vm, -1)) { ret = be_tobool(vm, -1); } + } + } + be_pop(vm, 1); // remove method + } + be_pop(vm, 1); // remove instance object + checkBeTop(); + return ret; + } + +} + +/*********************************************************************************************\ + * Mapping for zcl_message + * +\*********************************************************************************************/ +extern "C" { +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Winvalid-offsetof" // avoid warnings since we're using offsetof() in a risky way + + extern const be_ctypes_structure_t be_zigbee_zcl_frame_struct = { + sizeof(ZCLFrame), /* size in bytes */ + 12, /* number of elements */ + nullptr, + (const be_ctypes_structure_item_t[12]) { + { "cluster", offsetof(ZCLFrame, cluster), 0, 0, ctypes_u16, 0 }, + { "cluster_specific", offsetof(ZCLFrame, clusterSpecific), 0, 0, ctypes_u8, 0 }, + { "cmd", offsetof(ZCLFrame, cmd), 0, 0, ctypes_u8, 0 }, + { "direct", offsetof(ZCLFrame, direct), 0, 0, ctypes_u8, 0 }, + { "dstendpoint", offsetof(ZCLFrame, dstendpoint), 0, 0, ctypes_u8, 0 }, + { "groupaddr", offsetof(ZCLFrame, groupaddr), 0, 0, ctypes_u16, 0 }, + { "manuf", offsetof(ZCLFrame, manuf), 0, 0, ctypes_u16, 0 }, + { "need_response", offsetof(ZCLFrame, needResponse), 0, 0, ctypes_u8, 0 }, + { "payload_ptr", offsetof(ZCLFrame, payload), 0, 0, ctypes_ptr32, 0 }, + { "shortaddr", offsetof(ZCLFrame, shortaddr), 0, 0, ctypes_u16, 0 }, + { "transactseq", offsetof(ZCLFrame, transactseq), 0, 0, ctypes_u8, 0 }, + { "transactseq_set", offsetof(ZCLFrame, transacSet), 0, 0, ctypes_u8, 0 }, + }}; + +#pragma GCC diagnostic pop +} + + +#endif // USE_ZIGBEE +#endif // USE_BERRY From 301540f3ac8b1f32fb909b5f6bc63483f5f7674a Mon Sep 17 00:00:00 2001 From: Nemobi <> Date: Tue, 24 May 2022 21:06:41 +0000 Subject: [PATCH 281/376] Added BASIC AUTH for mjpeg stream --- tasmota/xdrv_81_esp32_webcam.ino | 37 +++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/tasmota/xdrv_81_esp32_webcam.ino b/tasmota/xdrv_81_esp32_webcam.ino index 96aa4ae85..b49f781d8 100644 --- a/tasmota/xdrv_81_esp32_webcam.ino +++ b/tasmota/xdrv_81_esp32_webcam.ino @@ -729,6 +729,34 @@ pcopy: return _jpg_buf_len; } +//////////////// Handle authentication ///////////////// + + +bool WebcamAuthenticate(void) +{ + if (strlen(SettingsText(SET_WEBPWD)) && (HTTP_MANAGER_RESET_ONLY != Web.state)) { + return Wc.CamServer->authenticate(WEB_USERNAME, SettingsText(SET_WEBPWD)); + } else { + return true; + } +} + +bool WebcamCheckPriviledgedAccess(bool autorequestauth = true) +{ + + if(Settings->webcam_config2.auth == 0){ + return true; + } + + if (autorequestauth && !WebcamAuthenticate()) { + Wc.CamServer->requestAuthentication(); + return false; + } + return true; +} + +/////////////////////////////////////////////////// + void HandleImage(void) { if (!HttpCheckPriviledgedAccess()) { return; } @@ -818,6 +846,10 @@ void HandleImageBasic(void) { } void HandleWebcamMjpeg(void) { + if(!WebcamCheckPriviledgedAccess()){ + Wc.CamServer->send(403,"",""); + return; + } AddLog(LOG_LEVEL_DEBUG, PSTR("CAM: Handle camserver")); // if (!Wc.stream_active) { // always restart stream @@ -910,6 +942,10 @@ void HandleWebcamMjpegTask(void) { } void HandleWebcamRoot(void) { + if(!WebcamCheckPriviledgedAccess()){ + Wc.CamServer->send(403,"",""); + return; + } //CamServer->redirect("http://" + String(ip) + ":81/cam.mjpeg"); Wc.CamServer->sendHeader("Location", "/cam.mjpeg"); Wc.CamServer->send(302, "", ""); @@ -1341,7 +1377,6 @@ void CmndWebcamFeature(void) { void CmndWebcamAuth(void){ if((XdrvMailbox.payload >=0) && (XdrvMailbox.payload <= 1)){ Settings->webcam_config2.auth = XdrvMailbox.payload; - WcSetOptions(24, Settings->webcam_config2.auth); } ResponseCmndNumber(Settings->webcam_config2.auth); } From f115220e6042aebd2e3a14bdfe8d25e1d2668ded Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 25 May 2022 19:18:39 +0200 Subject: [PATCH 282/376] Zigbee display version of MCU software in UI --- tasmota/xdrv_23_zigbee_1_headers.ino | 6 ++++++ tasmota/xdrv_23_zigbee_8_parsers.ino | 26 +++++++++++++++----------- tasmota/xdrv_23_zigbee_A_impl.ino | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/tasmota/xdrv_23_zigbee_1_headers.ino b/tasmota/xdrv_23_zigbee_1_headers.ino index 685f00ebd..a28afeae1 100644 --- a/tasmota/xdrv_23_zigbee_1_headers.ino +++ b/tasmota/xdrv_23_zigbee_1_headers.ino @@ -97,6 +97,12 @@ public: ZB_RecvMsgFunc recv_func = nullptr; // function to call when message is expected ZB_RecvMsgFunc recv_unexpected = nullptr; // function called when unexpected message is received + // version + uint8_t major_rel = 0; + uint8_t minor_rel = 0; + uint8_t maint_rel = 0; + uint32_t revision = 0; + // Energy scan int8_t energy[USE_ZIGBEE_CHANNEL_COUNT]; diff --git a/tasmota/xdrv_23_zigbee_8_parsers.ino b/tasmota/xdrv_23_zigbee_8_parsers.ino index 277dea88d..a798a8164 100644 --- a/tasmota/xdrv_23_zigbee_8_parsers.ino +++ b/tasmota/xdrv_23_zigbee_8_parsers.ino @@ -447,20 +447,21 @@ int32_t ZNP_ReceiveCheckVersion(int32_t res, SBuffer &buf) { // MinorRel = 6 // MaintRel = 3 // Revision = 20190425 d (0x013414D9) - uint8_t major_rel = buf.get8(4); - uint8_t minor_rel = buf.get8(5); - uint8_t maint_rel = buf.get8(6); - uint32_t revision = buf.get32(7); + zigbee.major_rel = buf.get8(4); + zigbee.minor_rel = buf.get8(5); + zigbee.maint_rel = buf.get8(6); + zigbee.revision = buf.get32(7); Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{" "\"Status\":%d,\"MajorRel\":%d,\"MinorRel\":%d" ",\"MaintRel\":%d,\"Revision\":%d}}"), - ZIGBEE_STATUS_CC_VERSION, major_rel, minor_rel, - maint_rel, revision); + ZIGBEE_STATUS_CC_VERSION, + zigbee.major_rel, zigbee.minor_rel, + zigbee.maint_rel, zigbee.revision); MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_TELE, PSTR(D_JSON_ZIGBEE_STATE)); - if ((0x02 == major_rel) && ((0x06 == minor_rel) || (0x07 == minor_rel))) { + if ((0x02 == zigbee.major_rel) && ((0x06 == zigbee.minor_rel) || (0x07 == zigbee.minor_rel))) { return 0; // version 2.6.x and 2.7.x are ok } else { return ZIGBEE_LABEL_UNSUPPORTED_VERSION; // abort @@ -474,14 +475,17 @@ int32_t EZ_ReceiveCheckVersion(int32_t res, SBuffer &buf) { uint8_t stack_type = buf.get8(3); zigbee.ezsp_version = buf.get16(4); + zigbee.major_rel = (zigbee.ezsp_version & 0xF000) >> 12; + zigbee.minor_rel = (zigbee.ezsp_version & 0x0F00) >> 8; + zigbee.maint_rel = (zigbee.ezsp_version & 0x00F0) >> 4; + zigbee.revision = zigbee.ezsp_version & 0x000F; + Response_P(PSTR("{\"" D_JSON_ZIGBEE_STATE "\":{" "\"Status\":%d,\"Version\":\"%d.%d.%d.%d\",\"Protocol\":%d" ",\"Stack\":%d}}"), ZIGBEE_STATUS_EZ_VERSION, - (zigbee.ezsp_version & 0xF000) >> 12, - (zigbee.ezsp_version & 0x0F00) >> 8, - (zigbee.ezsp_version & 0x00F0) >> 4, - zigbee.ezsp_version & 0x000F, + zigbee.major_rel, zigbee.minor_rel, + zigbee.maint_rel, zigbee.revision, protocol_version, stack_type ); diff --git a/tasmota/xdrv_23_zigbee_A_impl.ino b/tasmota/xdrv_23_zigbee_A_impl.ino index 26d634b8b..f182316ea 100644 --- a/tasmota/xdrv_23_zigbee_A_impl.ino +++ b/tasmota/xdrv_23_zigbee_A_impl.ino @@ -1931,6 +1931,19 @@ uint32_t convert_seconds_to_dhm(uint32_t seconds, char *unit, uint8_t *color){ return 0; } +const char HTTP_ZB_VERSION[] PROGMEM = + "
" + "Zigbee: " +#if defined(USE_ZIGBEE_EZSP) + "EZSP" +#elif defined(USE_ZIGBEE_ZNP) + "ZNP" +#else + "unknown" +#endif + " v%d.%d.%d.%d" + "
"; + const char HTTP_BTN_ZB_BUTTONS[] PROGMEM = "" "

" @@ -2114,6 +2127,12 @@ void ZigbeeShow(bool json) WSContentSend_P(msg[ZB_WEB_PERMITJOIN_ACTIVE], PSTR(D_ZIGBEE_PERMITJOIN_ACTIVE)); } + // show Zigbee MCU version + if (!zigbee.init_phase) { + WSContentSend_P(HTTP_ZB_VERSION, + zigbee.major_rel, zigbee.minor_rel, + zigbee.maint_rel, zigbee.revision); + } #endif } } From 9484f1d2b370833e6bce4cdde3dd7a272a471993 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Thu, 26 May 2022 17:22:39 +0200 Subject: [PATCH 283/376] scripter enhancements --- tasmota/xdrv_10_scripter.ino | 552 ++++++++++++++++++++++++++++------- tasmota/xsns_53_sml.ino | 9 +- 2 files changed, 452 insertions(+), 109 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index dd677e18e..832b98436 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -74,6 +74,7 @@ keywords if then else endif, or, and are better readable for beginners (others m uint32_t EncodeLightId(uint8_t relay_id); uint32_t DecodeLightId(uint32_t hue_id); char *web_send_line(char mc, char *lp); +int32_t web_send_file(char mc, char *file); #define SPECIAL_EEPMODE_SIZE 6200 @@ -451,7 +452,7 @@ struct SCRIPT_MEM { char *fast_script = 0; char *event_script = 0; char *html_script = 0; - char *web_pages[7]; + char *web_pages[10]; uint32_t script_lastmillis; bool event_handeled = false; #ifdef USE_BUTTON_EVENT @@ -1241,7 +1242,7 @@ float *Get_MFAddr(uint8_t index, uint16_t *len, uint16_t *ipos) { char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, struct GVARS *gv); -char *get_array_by_name(char *lp, float **fp, uint16_t *alen) { +char *get_array_by_name(char *lp, float **fp, uint16_t *alen, uint16_t *ipos) { struct T_INDEX ind; uint8_t vtype; lp = isvar(lp, &vtype, &ind, 0, 0, 0); @@ -1250,7 +1251,7 @@ char *get_array_by_name(char *lp, float **fp, uint16_t *alen) { uint16_t index = glob_script_mem.type[ind.index].index; if (glob_script_mem.type[ind.index].bits.is_filter) { - float *fa = Get_MFAddr(index, alen, 0); + float *fa = Get_MFAddr(index, alen, ipos); *fp = fa; return lp; } @@ -2023,6 +2024,10 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, iob = '\n'; } else if (*lp == 'r') { iob = '\r'; + } else if (*lp == '0' && *(lp+1) == 'x') { + lp += 2; + iob = strtol(lp, 0, 16); + lp++; } else if (*lp == '\\') { iob = '\\'; } else { @@ -2295,11 +2300,11 @@ chknext: uint16_t alend; fvar = -1; float *fpd; - lp = get_array_by_name(lp, &fpd, &alend); + lp = get_array_by_name(lp, &fpd, &alend, 0); SCRIPT_SKIP_SPACES uint16_t alens; float *fps; - lp = get_array_by_name(lp, &fps, &alens); + lp = get_array_by_name(lp, &fps, &alens, 0); SCRIPT_SKIP_SPACES if (alens < alend) { alend = alens; @@ -2308,6 +2313,26 @@ chknext: fvar = alend; goto nfuncexit; } + + if (!strncmp(lp, "af(", 3)) { + // array to float + uint16_t alend; + float *fpd; + lp = get_array_by_name(lp + 3, &fpd, &alend, 0); + SCRIPT_SKIP_SPACES + if (fpd) { + uint8_t fbytes[4]; + fbytes[0] = *fpd++; + fbytes[1] = *fpd++; + fbytes[2] = *fpd++; + fbytes[3] = *fpd++; + fpd = (float*)fbytes; + fvar = *fpd; + } else { + fvar = 0; + } + goto nfuncexit; + } break; case 'b': @@ -2906,7 +2931,7 @@ chknext: uint8_t index = 0; while (index < MAX_EXT_ARRAYS) { - lp = get_array_by_name(lp, &a_ptr[index], &a_len[index]); + lp = get_array_by_name(lp, &a_ptr[index], &a_len[index], 0); SCRIPT_SKIP_SPACES index++; if (*lp == ')' || *lp == '\n') { @@ -2952,7 +2977,7 @@ chknext: if (!strncmp(lp, "fwa(", 4)) { uint16_t alen; float *fa; - lp = get_array_by_name(lp + 4, &fa, &alen); + lp = get_array_by_name(lp + 4, &fa, &alen, 0); if (!fa) { fvar = 0; goto exit; @@ -2993,7 +3018,7 @@ chknext: if (!strncmp(lp, "fra(", 4)) { uint16_t alen; float *fa; - lp = get_array_by_name(lp + 4, &fa, &alen); + lp = get_array_by_name(lp + 4, &fa, &alen, 0); if (!fa) { fvar = 0; goto exit; @@ -3370,6 +3395,20 @@ chknext: #endif // USE_SCRIPT_I2C break; +#ifdef USE_KNX + case 'k': + if (!strncmp(lp, "knx(", 4)) { + float type; + lp = GetNumericArgument(lp + 4, OPER_EQU, &type, gv); + SCRIPT_SKIP_SPACES + lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); + SCRIPT_SKIP_SPACES + KnxSensor(type, fvar); + goto nfuncexit; + } + break; +#endif + case 'l': if (!strncmp(lp, "lip", 3)) { if (sp) strlcpy(sp, (const char*)WiFi.localIP().toString().c_str(), glob_script_mem.max_ssize); @@ -4058,13 +4097,72 @@ extern char *SML_GetSVal(uint32_t index); len = 0; goto exit; } + // serial write array + if (!strncmp(lp, "swa(", 4)) { + fvar = -1; + if (glob_script_mem.sp) { + uint8_t modbus_buffer[64]; + uint16_t alen; + float *array; + lp = get_array_by_name(lp + 4, &array, &alen, 0); + SCRIPT_SKIP_SPACES + if (!array) { + goto exit; + } + float len; + lp = GetNumericArgument(lp, OPER_EQU, &len, 0); + SCRIPT_SKIP_SPACES + if (len > alen) len = alen; + if (len < 1) len = 1; + if (*lp != ')') { + float opts = 0; + lp = GetNumericArgument(lp, OPER_EQU, &opts, 0); + SCRIPT_SKIP_SPACES + // calc modbus checksum +#ifdef USE_SML_M + // calc modbus checksum + if (len > sizeof(modbus_buffer)) len = sizeof(modbus_buffer); + for (uint32_t cnt = 0; cnt < len; cnt++) { + modbus_buffer[cnt] = *array++; + } + uint16_t crc = 0xffff; + uint8_t *mbp = modbus_buffer; + if (opts == 1) { + mbp++; + crc = 0; + } + crc = MBUS_calculateCRC(mbp, mbp[2] + 3, crc); + if (opts == 1) { + mbp[mbp[2] + 3] = highByte(crc); + mbp[mbp[2] + 4] = lowByte(crc); + } else { + mbp[mbp[2] + 3] = lowByte(crc); + mbp[mbp[2] + 4] = highByte(crc); + } +#endif + uint8_t *ucp = modbus_buffer; + while (len) { + glob_script_mem.sp->write(*ucp); + //AddLog(LOG_LEVEL_INFO,PSTR(">> %02x"),*ucp); + ucp++; + len--; + } + } else { + while (len) { + glob_script_mem.sp->write((uint8_t)*array++); + len--; + } + } + } + goto nfuncexit; + } // serial read array if (!strncmp(lp, "sra(", 4)) { fvar = -1; if (glob_script_mem.sp) { uint16_t alen; float *array; - lp = get_array_by_name(lp + 4, &array, &alen); + lp = get_array_by_name(lp + 4, &array, &alen, 0); if (!array) { goto exit; } @@ -4082,16 +4180,14 @@ extern char *SML_GetSVal(uint32_t index); for (uint8_t cnt = 0; cnt < 8; cnt++) { modbus_response[cnt] = array[cnt]; } - uint16_t crc = MBUS_calculateCRC(modbus_response, 6); + uint16_t crc = MBUS_calculateCRC(modbus_response, 6, 0xFFFF); if ( (lowByte(crc) != modbus_response[6]) || (highByte(crc) != modbus_response[7]) ) { fvar = -2; } } #endif } - lp++; - len = 0; - goto exit; + goto nfuncexit; } #ifdef USE_SML_M // serial modbus write float, 010404ffffffffxxxx @@ -4104,52 +4200,95 @@ extern char *SML_GetSVal(uint32_t index); float mode; lp = GetNumericArgument(lp, OPER_EQU, &mode, 0); SCRIPT_SKIP_SPACES - float mval; - lp = GetNumericArgument(lp, OPER_EQU, &mval, 0); + + uint16_t alend; + float *fpd; + lp = get_array_by_name(lp, &fpd, &alend, 0); SCRIPT_SKIP_SPACES - uint32_t uval, *uvp; - uvp = &uval; - *(uvp) = *(uint32_t*)&mval; - uint8_t modbus_response[10]; + float nvals; + lp = GetNumericArgument(lp, OPER_EQU, &nvals, 0); + SCRIPT_SKIP_SPACES - uint32_t ui32 = mval; - modbus_response[0] = addr; - modbus_response[1] = 4; - switch ((uint8_t)mode) { - case 0: - // UINT16 - modbus_response[2] = 2; - modbus_response[3] = (ui32 >> 16); - modbus_response[4] = (ui32 >> 0); - break; - case 1: - // UINT32 - modbus_response[2] = 4; - modbus_response[3] = (ui32 >> 24); - modbus_response[4] = (ui32 >> 16); - modbus_response[5] = (ui32 >> 8); - modbus_response[6] = (ui32 >> 0); - break; - - default: - // float - modbus_response[2] = 4; - modbus_response[3] = (uval >> 24); - modbus_response[4] = (uval >> 16); - modbus_response[5] = (uval >> 8); - modbus_response[6] = (uval >> 0); - break; + if (nvals > alend) { + nvals = alend; } + uint8_t modbus_response[128]; - // calc mobus checksum - uint16_t crc = MBUS_calculateCRC(modbus_response, modbus_response[2] + 3); + uint8_t mb_index = 0; + modbus_response[mb_index] = addr; + mb_index++; + modbus_response[mb_index] = 4; + mb_index++; + + if (mode == 0) { + modbus_response[mb_index] = 2 * nvals; + } else { + modbus_response[mb_index] = 4 * nvals; + } + mb_index++; + + for (uint16_t cnt = 0; cnt < nvals; cnt++) { + float fpval = *fpd++; + uint32_t ui32 = fpval; + uint32_t uval, *uvp; + uvp = &uval; + *(uvp) = *(uint32_t*)&fpval; + + switch ((uint8_t)mode) { + case 0: + // UINT16 + modbus_response[mb_index] = (ui32 >> 16); + mb_index++; + modbus_response[mb_index] = (ui32 >> 0); + mb_index++; + break; + case 1: + // UINT32 + modbus_response[mb_index] = (ui32 >> 24); + mb_index++; + modbus_response[mb_index] = (ui32 >> 16); + mb_index++; + modbus_response[mb_index] = (ui32 >> 8); + mb_index++; + modbus_response[mb_index] = (ui32 >> 0); + mb_index++; + break; + default: + // float + modbus_response[mb_index] = (uval >> 24); + mb_index++; + modbus_response[mb_index] = (uval >> 16); + mb_index++; + modbus_response[mb_index] = (uval >> 8); + mb_index++; + modbus_response[mb_index] = (uval >> 0); + mb_index++; + break; + } + } + + // calc modbus checksum + uint16_t crc = MBUS_calculateCRC(modbus_response, modbus_response[2] + 3, 0xFFFF); modbus_response[modbus_response[2] + 3] = lowByte(crc); modbus_response[modbus_response[2] + 4] = highByte(crc); - glob_script_mem.sp->write(modbus_response, 9); + glob_script_mem.sp->write(modbus_response, mb_index + 2); fvar = 0; - +#if 0 + // show response + char hexbuff[256]; + sprintf(hexbuff,"%02x%02x%02x - ",modbus_response[0],modbus_response[1],modbus_response[2]); + for (uint16_t cnt = 3; cnt < mb_index; cnt+=4) { + char cbuff[32]; + sprintf(cbuff," %02x%02x%02x%02x",modbus_response[cnt],modbus_response[cnt+1],modbus_response[cnt+2],modbus_response[cnt+3]); + strcat(hexbuff,cbuff); + } + char cbuff[32]; + sprintf(cbuff," - %02x%02x",modbus_response[mb_index],modbus_response[mb_index+1]); + strcat(hexbuff,cbuff); + AddLog(LOG_LEVEL_INFO,PSTR(">> %s"),hexbuff); +#endif } lp++; len = 0; @@ -4477,6 +4616,16 @@ extern char *SML_GetSVal(uint32_t index); fvar = WcSetMotionDetect(fvar2); } break; + /* +#ifdef USE_FACE_DETECT + case 7: + { float fvar2; + lp = GetNumericArgument(lp, OPER_EQU, &fvar2, gv); + fvar = WcSetFaceDetect(fvar2); + } + break; +#endif //USE_FACE_DETECT +*/ default: fvar = 0; } @@ -5827,22 +5976,22 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { } #ifdef USE_SCRIPT_WEB_DISPLAY else if (!strncmp(lp, "wcs", 3)) { - lp+=4; + lp += 4; // skip one space after cmd web_send_line(0, lp); - /* - char tmp[256]; - Replace_Cmd_Vars(lp ,1 , tmp, sizeof(tmp)); WSContentFlush(); - WSContentSend_P(PSTR("%s"),tmp); - */ - + goto next_line; + } + else if (!strncmp(lp, "wfs", 3)) { + lp += 4; + // skip one space after cmd + web_send_file(0, lp); WSContentFlush(); goto next_line; } #endif else if (!strncmp(lp, "rapp", 3)) { - lp+=4; + lp += 4; // skip one space after cmd char *tmp = (char*)malloc(256); if (tmp) { @@ -6810,20 +6959,39 @@ void SaveScriptEnd(void) { } } + + void set_callbacks() { if (Run_Scripter1(">F", -2, 0) == 99) {glob_script_mem.fast_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.fast_script = 0;} if (Run_Scripter1(">E", -2, 0) == 99) {glob_script_mem.event_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.event_script = 0;} if (Run_Scripter1(">C", -2, 0) == 99) {glob_script_mem.html_script = glob_script_mem.section_ptr + 2;} else {glob_script_mem.html_script = 0;} } +void set_wpages(char *id, uint16_t index) { + uint16_t idlen = strlen(id); + uint16_t idl2 = idlen; + if (id[idlen - 1] ==' ') idl2--; + if (Run_Scripter1(id, -idlen, 0) == 99) {glob_script_mem.web_pages[index] = glob_script_mem.section_ptr + idl2;} else {glob_script_mem.web_pages[index] = 0;} +} + +#define WEB_PAGE_WS 8 +#define WEB_PAGE_WM 9 + +const char SWPAGES[] PROGMEM = {"W|w |w1 |w2 |w3 |w4 |w5 |w6 |WS|WM|$"}; + void script_set_web_pages(void) { - if (Run_Scripter1(">W", -2, 0) == 99) {glob_script_mem.web_pages[0] = glob_script_mem.section_ptr + 2;} else {glob_script_mem.web_pages[0] = 0;} - if (Run_Scripter1(">w ", -3, 0) == 99) {glob_script_mem.web_pages[1] = glob_script_mem.section_ptr + 2;} else {glob_script_mem.web_pages[1] = 0;} - if (Run_Scripter1(">w1 ", -4, 0) == 99) {glob_script_mem.web_pages[2] = glob_script_mem.section_ptr + 3;} else {glob_script_mem.web_pages[2] = 0;} - if (Run_Scripter1(">w2 ", -4, 0) == 99) {glob_script_mem.web_pages[3] = glob_script_mem.section_ptr + 3;} else {glob_script_mem.web_pages[3] = 0;} - if (Run_Scripter1(">w3 ", -4, 0) == 99) {glob_script_mem.web_pages[4] = glob_script_mem.section_ptr + 3;} else {glob_script_mem.web_pages[4] = 0;} - if (Run_Scripter1(">WS", -3, 0) == 99) {glob_script_mem.web_pages[5] = glob_script_mem.section_ptr + 3;} else {glob_script_mem.web_pages[5] = 0;} - if (Run_Scripter1(">WM", -3, 0) == 99) {glob_script_mem.web_pages[6] = glob_script_mem.section_ptr + 3;} else {glob_script_mem.web_pages[6] = 0;} + char lbl[6]; + lbl[0] = '>'; + + uint16_t index = 0; + while (1) { + GetTextIndexed(&lbl[1], sizeof(lbl) - 1, index, SWPAGES); + if (lbl[1] == '$') { + break; + } + set_wpages(lbl, index); + index++; + } } #endif // USE_WEBSERVER @@ -7869,6 +8037,8 @@ void script_download_task(void *path) { } #endif // USE_DLTASK +#define REVERT_M5EPD + void SendFile_sub(char *fname) { char buff[512]; uint8_t sflg = 0; @@ -7915,7 +8085,9 @@ char buff[512]; memset(lbuf, 0, Settings->display_width * 3); if (!lbuf) return; uint8_t dmflg = 0; - if (renderer->disp_bpp & 0x40) dmflg = 1; + if (renderer->disp_bpp & 0x40) { + dmflg = 1; + } int8_t bpp = renderer->disp_bpp & 0xbf;; uint8_t *lbp; uint8_t fileHeader[fileHeaderSize]; @@ -7939,9 +8111,16 @@ char buff[512]; Webserver->client().write((const char*)lbuf, Settings->display_width * 3); } } else { - for (uint32_t lins = 0; linsdisplay_height; lins++) { + for (uint32_t lins = 0; lins < Settings->display_height; lins++) { lbp = lbuf + (Settings->display_width * 3); if (bpp == 4) { + // 16 gray scales +#ifdef REVERT_M5EPD + if (dmflg) { + bp = &renderer->framebuffer[(Settings->display_height - lins) * (Settings->display_width / 2)]; + bp--; + } +#endif for (uint32_t cols = 0; cols < Settings->display_width; cols += 2) { uint8_t pixel; if (!dmflg) { @@ -7956,10 +8135,14 @@ char buff[512]; *--lbp = pixel; *--lbp = pixel; } - + bp++; } else { for (uint32_t cnt = 0; cnt <= 1; cnt++) { +#ifdef REVERT_M5EPD + if (cnt & 1) { +#else if (!(cnt & 1)) { +#endif pixel = *bp >> 4; } else { pixel = *bp & 0xf; @@ -7969,10 +8152,15 @@ char buff[512]; *--lbp = pixel; *--lbp = pixel; } +#ifdef REVERT_M5EPD + bp--; +#else + bp++; +#endif } - bp++; } } else { + // one bit for (uint32_t cols = 0; cols < Settings->display_width; cols += 8) { uint8_t bits = 0x80; while (bits) { @@ -8081,6 +8269,15 @@ void ScriptFullWebpage3(void) { void ScriptFullWebpage4(void) { ScriptFullWebpage(4); } +void ScriptFullWebpage5(void) { + ScriptFullWebpage(5); +} +void ScriptFullWebpage6(void) { + ScriptFullWebpage(6); +} +void ScriptFullWebpage7(void) { + ScriptFullWebpage(7); +} void ScriptFullWebpage(uint8_t page) { uint32_t fullpage_refresh = 10000; @@ -8248,7 +8445,8 @@ const char SCRIPT_MSG_GTABLEbx[] PROGMEM = "google.charts.setOnLoadCallback(drawChart);"; const char SCRIPT_MSG_GOPT1[] PROGMEM = -"title:'%s',isStacked:false"; +"title:'%s',isStacked:%s"; + const char SCRIPT_MSG_GAUGEOPT[] PROGMEM = "max:%d,redFrom:%d,redTo:%d,yellowFrom:%d,yellowTo:%d"; @@ -8257,7 +8455,7 @@ const char SCRIPT_MSG_GOPT2[] PROGMEM = "showRowNumber:true,sort:'disable',allowHtml:true,width:'100%%',height:'100%%',cssClassNames:cssc"; const char SCRIPT_MSG_GOPT3[] PROGMEM = -"title:'%s',isStacked:false,vAxes:{0:{maxValue:%s},1:{maxValue:%s}},series:{0:{targetAxisIndex:0},1:{targetAxisIndex:1}}%s"; +"title:'%s',isStacked:%s,vAxes:{0:{maxValue:%s},1:{maxValue:%s}},series:{0:{targetAxisIndex:0},1:{targetAxisIndex:1}}%s"; const char SCRIPT_MSG_GOPT4[] PROGMEM = //"hAxis:{minValue:new Date(0,1,1,0,0),maxValue:new Date(0,1,2,0,0),format:'HH:mm'}"; @@ -8267,7 +8465,7 @@ const char SCRIPT_MSG_GOPT5[] PROGMEM = "new Date(0,0,0,%d,%d)"; const char SCRIPT_MSG_GOPT6[] PROGMEM = -"title:'%s',isStacked:false,vAxis:{viewWindow:{min:%s,max:%s}}%s"; +"title:'%s',isStacked:%s,vAxis:{viewWindow:{min:%s,max:%s}}%s"; const char SCRIPT_MSG_GTE1[] PROGMEM = "'%s'"; @@ -8387,6 +8585,7 @@ uint32_t cnt; #define WSO_NOCENTER 1 #define WSO_NODIV 2 #define WSO_FORCEPLAIN 4 +#define WSO_FORCEMAIN 8 #define WSO_STOP_DIV 0x80 void WCS_DIV(uint8_t flag) { @@ -8414,7 +8613,7 @@ void ScriptWebShow(char mc, uint8_t page) { //uint8_t web_script; glob_script_mem.web_mode = mc; - if (mc == 'w' || mc == 'x' || page >= 5) { + if (mc == 'w' || mc == 'x' || page >= WEB_PAGE_WS) { if (mc == 'x') { mc = '$'; } @@ -8485,6 +8684,11 @@ void ScriptWebShow(char mc, uint8_t page) { lp = scripter_sub(lp + 1, 0); specopt = sflg; //goto nextwebline; + } else if (!strncmp(lp, "%/", 2)) { + // send file + if (mc) { + web_send_file(mc, lp + 1); + } } else { web_send_line(mc, lp); } @@ -8501,6 +8705,44 @@ nextwebline: } } +#define WSF_BSIZE 256 +int32_t web_send_file(char mc, char *fname) { + char path[32]; + +#ifdef USE_UFILESYS + + char *lbuff = (char*)special_malloc(WSF_BSIZE); + if (!lbuff) { + return -1; + } + + cpy2lf(path, sizeof(path), fname); + File file = ufsp->open(path, FS_FILE_READ); + if (file) { + WSContentFlush(); + while (file.available()) { + uint16_t len; + len = file.readBytesUntil('\n', lbuff, WSF_BSIZE); + lbuff[len] = 0; + char *lp = lbuff; + while (*lp == ' ') lp++; + if (*lp == '/' && *(lp + 1) == '/') { + // skip comment lines + continue; + } + web_send_line(mc, lbuff); + } + file.close(); + free(lbuff); + return 0; + } else { + AddLog(LOG_LEVEL_INFO, PSTR("WEB file %s not found"), path); + } + free(lbuff); +#endif + return -2; +} + char *web_send_line(char mc, char *lp1) { char tmp[256]; char center[10]; @@ -8510,8 +8752,24 @@ const char *gc_str; Replace_Cmd_Vars(lp1, 1, tmp, sizeof(tmp)); char *lin = tmp; - if ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) { + + if (!strncmp(lin, "so(", 3)) { + // set options + float var; + lin = GetNumericArgument(lin + 3, OPER_EQU, &var, 0); + specopt = var; + return lin; + } + + if (specopt & WSO_NOCENTER) { + center[0] = 0; + } else { + strcpy_P(center, PSTR("
")); + } + + if ( ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt&WSO_FORCEMAIN)) ) { // normal web section + //AddLog(LOG_LEVEL_INFO, PSTR("normal %s"), lin); if (*lin == '@') { lin++; optflg = 1; @@ -8525,21 +8783,7 @@ const char *gc_str; strcpy_P(center, PSTR("
")); } - if (!strncmp(lin, "so(", 3)) { - // set options - char *lp = lin; - float var; - lp = GetNumericArgument(lp + 3, OPER_EQU, &var, 0); - SCRIPT_SKIP_SPACES - lp++; - specopt = var; - // bit 0 = center mode - if (specopt & WSO_NOCENTER) { - center[0] = 0; - } else { - strcpy_P(center, PSTR("
")); - } - } else if (!strncmp(lin, "sl(", 3)) { + if (!strncmp(lin, "sl(", 3)) { // insert slider sl(min max var left mid right) char *lp = lin; float min; @@ -8864,14 +9108,63 @@ const char *gc_str; // end standard web interface } else { // main section interface - if (*lin == mc || mc == 'z') { + //AddLog(LOG_LEVEL_INFO, PSTR("main %s"), lin); + if ( (*lin == mc) || (mc == 'z') || (specopt&WSO_FORCEMAIN)) { #ifdef USE_GOOGLE_CHARTS if (mc != 'z') { - lin++; + if (!(specopt&WSO_FORCEMAIN)) { + lin++; + } } exgc: char *lp; + + char *cp = strstr_P(lin, PSTR("insa(")); + if (cp) { + // insert array + char valstr[128]; + uint16_t len = (uint32_t)cp - (uint32_t)lin; + strncpy(valstr, lin, len); + valstr[len] = 0; + WSContentSend_PD(PSTR("%s"), valstr); + float *fpd = 0; + uint16_t alend; + uint16_t ipos; + lp = get_array_by_name(cp + 5, &fpd, &alend, &ipos); + if (ipos >= alend) ipos = 0; + if (fpd) { + for (uint32_t cnt = 0; cnt < alend; cnt++) { + dtostrfd(fpd[ipos], 3, valstr); + ipos++; + if (ipos >= alend) { + ipos = 0; + } + if (cnt == 0) { + WSContentSend_PD(PSTR("%s"), valstr); + } else { + WSContentSend_PD(PSTR(",%s"), valstr); + } + } + } + lp++; + WSContentSend_PD(PSTR("%s"), lp); + return lp; + } + + cp = strstr_P(lin, PSTR("=#")); + if (cp) { + // insert from subroutine + char valstr[128]; + uint16_t len = (uint32_t)cp - (uint32_t)lin; + strncpy(valstr, lin, len); + valstr[len] = 0; + WSContentSend_PD(PSTR("%s"), valstr); + lp = scripter_sub(cp , 0); + WSContentSend_PD(PSTR("%s"), lp); + return lp; + } + if (!strncmp(lin, "gc(", 3)) { // get google table lp = lin + 3; @@ -8920,13 +9213,18 @@ exgc: return lp1; } - - if (gs_ctype=='l' && *lp=='f') { + char stacked[6]; + strcpy_P(stacked,"false"); + if (gs_ctype == 'l' && *lp == 'f') { lp++; func = PSTR(",curveType:'function'"); } else { func = ""; } + if (gs_ctype == 'c' && *lp == 's') { + lp++; + strcpy_P(stacked,"true"); + } if (*lp=='2') { lp++; nanum = 2; @@ -8939,6 +9237,22 @@ exgc: SCRIPT_SKIP_SPACES //Serial.printf("type %d\n",ctype); + float max_entries = 0; + + struct T_INDEX ind; + uint8_t vtype; + char *slp = lp; + lp = isvar(lp, &vtype, &ind, &max_entries, 0, 0); + if (vtype != VAR_NV) { + if ((vtype&STYPE) == 0) { + // numeric result + if (!ind.bits.constant && glob_script_mem.type[ind.index].bits.is_filter) { + // is 1. array + lp = slp; + } + } + } + SCRIPT_SKIP_SPACES float *arrays[MAX_GARRAY]; uint8_t anum = 0; @@ -8950,6 +9264,15 @@ exgc: return lp1; //goto nextwebline; } + + // override array size + if (max_entries > 0) { + if (max_entries > entries) { + max_entries = entries; + } + entries = max_entries; + } + // we know how many arrays and the number of entries //Serial.printf("arrays %d\n",anum); //Serial.printf("entries %d\n",entries); @@ -9061,6 +9384,7 @@ exgc: } } divflg = entries / segments; + if (!divflg) divflg = 1; } uint32_t aind = ipos; @@ -9070,7 +9394,11 @@ exgc: char lbl[16]; if (todflg >= 0) { uint16_t mins = (float)(todflg % divflg) * (float)((float)60 / (float)divflg); - sprintf(lbl, "%d:%02d", todflg / divflg, mins); + if (hmflg) { + sprintf(lbl, "%d:%02d", todflg / divflg, mins); + } else { + sprintf(lbl, "%d", todflg / divflg); + } todflg++; if (hmflg == 0) { if (todflg >= entries) { @@ -9128,7 +9456,7 @@ exgc: snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT2); break; default: - snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT1, header); + snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT1, header, stacked); break; } // check for 2 axis option @@ -9146,11 +9474,11 @@ exgc: char maxstr2[16]; dtostrfd(max2, 3, maxstr2); //snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT3, header, (uint32_t)max1, (uint32_t)max2, func); - snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT3, header, maxstr1, maxstr2, func); + snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT3, header, stacked, maxstr1, maxstr2, func); } else { SCRIPT_SKIP_SPACES - if (gs_ctype!='g') { - if (*lp!=')') { + if (gs_ctype != 'g') { + if (*lp != ')') { float max1; lp = GetNumericArgument(lp, OPER_EQU, &max1, 0); SCRIPT_SKIP_SPACES @@ -9162,12 +9490,12 @@ exgc: char maxstr2[16]; dtostrfd(max2, 3, maxstr2); //nprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT6, header, (uint32_t)max1, (uint32_t)max2, func); - snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT6, header, maxstr1, maxstr2, func); + snprintf_P(options, sizeof(options), SCRIPT_MSG_GOPT6, header, stacked, maxstr1, maxstr2, func); } } } - if (gs_ctype=='g') { + if (gs_ctype == 'g') { float yellowFrom; lp = GetNumericArgument(lp, OPER_EQU, &yellowFrom, 0); SCRIPT_SKIP_SPACES @@ -9190,7 +9518,9 @@ exgc: WSContentSend_PD(PSTR("%s"), lin); } #else - lin++; + if (!(specopt&WSO_FORCEMAIN)) { + lin++; + } WSContentSend_PD(PSTR("%s"), lin); } else { // WSContentSend_PD(PSTR("%s"),lin); @@ -10060,6 +10390,15 @@ void script_add_subpage(uint8_t num) { case 4: wptr = ScriptFullWebpage4; break; + case 5: + wptr = ScriptFullWebpage5; + break; + case 6: + wptr = ScriptFullWebpage6; + break; + case 7: + wptr = ScriptFullWebpage7; + break; } sprintf_P(id, PSTR("/sfd%1d"), num); Webserver->on(id, wptr); @@ -10293,8 +10632,8 @@ bool Xdrv10(uint8_t function) #ifdef USE_SCRIPT_WEB_DISPLAY case FUNC_WEB_ADD_MAIN_BUTTON: if (bitRead(Settings->rule_enabled, 0)) { - if (glob_script_mem.web_pages[6]) { - ScriptWebShow('z', 6); + if (glob_script_mem.web_pages[WEB_PAGE_WM]) { + ScriptWebShow('z', WEB_PAGE_WM); } else { ScriptWebShow('$', 0); } @@ -10303,6 +10642,9 @@ bool Xdrv10(uint8_t function) script_add_subpage(2); script_add_subpage(3); script_add_subpage(4); + script_add_subpage(5); + script_add_subpage(6); + script_add_subpage(7); #endif // SCRIPT_FULL_WEBPAGE } @@ -10338,8 +10680,8 @@ bool Xdrv10(uint8_t function) #ifdef USE_SCRIPT_WEB_DISPLAY case FUNC_WEB_SENSOR: if (bitRead(Settings->rule_enabled, 0)) { - if (glob_script_mem.web_pages[5]) { - ScriptWebShow(0, 5); + if (glob_script_mem.web_pages[WEB_PAGE_WS]) { + ScriptWebShow(0, WEB_PAGE_WS); } else { ScriptWebShow(0, 0); } diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index d4f5e4ca5..a7885f8f0 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -2171,7 +2171,7 @@ void SML_Decode(uint8_t index) { } uint16_t pos = smltbuf[mindex][2]+3; if (pos>32) pos=32; - uint16_t crc = MBUS_calculateCRC(&smltbuf[mindex][0],pos); + uint16_t crc = MBUS_calculateCRC(&smltbuf[mindex][0],pos,0xFFFF); if (lowByte(crc)!=smltbuf[mindex][pos]) goto nextsect; if (highByte(crc)!=smltbuf[mindex][pos+1]) goto nextsect; dval=mbus_dval; @@ -3279,7 +3279,7 @@ void SML_Send_Seq(uint32_t meter,char *seq) { slen += 2; } // append crc - uint16_t crc = MBUS_calculateCRC(sbuff, slen); + uint16_t crc = MBUS_calculateCRC(sbuff, slen, 0xFFFF); *ucp++ = lowByte(crc); *ucp++ = highByte(crc); slen += 2; @@ -3313,9 +3313,10 @@ void SML_Send_Seq(uint32_t meter,char *seq) { } #endif // USE_SCRIPT -uint16_t MBUS_calculateCRC(uint8_t *frame, uint8_t num) { +uint16_t MBUS_calculateCRC(uint8_t *frame, uint8_t num, uint16_t start) { uint16_t crc, flag; - crc = 0xFFFF; + //crc = 0xFFFF; + crc = start; for (uint32_t i = 0; i < num; i++) { crc ^= frame[i]; for (uint32_t j = 8; j; j--) { From a8aa6fac005245cdac7f79d574ff81e6ff147d82 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 May 2022 18:42:00 +0200 Subject: [PATCH 284/376] Zigbee flasher for Sonoff Zigbee Bridge Pro --- tasmota/berry/zigbee/cc2652_flasher.be | 385 ++++++++++++++++++ .../berry/zigbee/cc2652_flasher_example.be | 5 + tasmota/berry/zigbee/intelhex.be | 133 ++++++ tasmota/berry/zigbee/sonoff_zb_pro_flasher.be | 173 ++++++++ 4 files changed, 696 insertions(+) create mode 100644 tasmota/berry/zigbee/cc2652_flasher.be create mode 100644 tasmota/berry/zigbee/cc2652_flasher_example.be create mode 100644 tasmota/berry/zigbee/intelhex.be create mode 100644 tasmota/berry/zigbee/sonoff_zb_pro_flasher.be diff --git a/tasmota/berry/zigbee/cc2652_flasher.be b/tasmota/berry/zigbee/cc2652_flasher.be new file mode 100644 index 000000000..d4431a4fa --- /dev/null +++ b/tasmota/berry/zigbee/cc2652_flasher.be @@ -0,0 +1,385 @@ + +################################################################################# +# +# class `cc2652_flasher` +# +# Flash libraries for CC2652: read, write, verify... +# +# The serial protocol requires the CC2652 to boot in BSL (bootloader) mode. +# On Sonoff Zigbee Bridge Pro, it requires to reset the MCU with DIO_8 low. +# +# When starting the flasher, normal zigbee operations are aborterd. Restarting +# normal zigbee functions requires a Tasmota restart. +# +# Required condiguration: +# - Zigbee Rx: must be configured as `Zigbee Rx` or `TCP Rx` +# - Zigbee Tx: must be configured as `Zigbee Tx` or `TCP Tx` +# - Zigbee Reset: must be configured as `Zigbee Rst - 1`` +# - Zigbee BSL mode (low): must be configured as `Zigbee Rts - 2` +# For Sonoff Zibeee Bridge Pro: Rx=23 Tx=19 Rst-1=15 Rst-2=22 +# +# How to use: +# - `import cc2652_flasher as cc` +# aborts all zigbee operations and configures the serial port +# Output: `FLH: cc2652_flasher rx=23 tx=19 rst=15 bsl=22` +# +# - `cc.start()` to start the flasher` +# restarts the CC2652 in BSL mode, and establishes connection +# Use `cc.start(true)` to enable debug verbose mode +# +# - `cc.ping()` sends a ping command and waits for ACK (does nothing) +# +# - `cc.cmd_get_chip_id()` returns the chip ID +# +# - `cc.flash_read(addr, len)` reads `len` bytes from address `addr`` +# len must be a multiple of 4 and less or equal than 128 bytes +# Returns a bytes() object +# +# - `cc.flash_crc32(addr, len)` returns the CRC32 of a flash region +# +# - `cc.flash_write(addr, data)` writes bytes to the flash +# `data` is a bytes() buffer, its len must be a multiple of 4 and less or equal than 128 +# This call does not erase the flash, so it must have been erased before. +# The bootloader checks that the bytes were correctly written, i.e. that +# the appropriate bits were changed from `1` to `0`. +# Chaning bits from `0` to `1` requires a flash erase. +# +# - `cc.flash_erase()` erase the entire flash. +# Use with caution. After the flash is erased, there is no valid application +# in flash so the MCU always starts in BSL bootloader mode until a valid +# app is flashed. +# +# - `cc.flash_dump_to_file(filename, addr, len)` dumps the CC2652 flash into a file +# `filename` is the output file in binary format, make sure there are 360KB free in filesystem. +# Dumping the complete file is done as follows (it takes 3 minutes during which Tasmota is unresponsive): +# `cc.dump_to_file("cc2652_dump.bin", 0x00000, 0x58000)` +# +################################################################################# + +#- Example + +import string +import cc2652_flasher as cc +cc.start() +cc.ping() +print(string.format("0x%08X", cc.cmd_get_chip_id())) +# output: 0x3202F000 + +# Dumping CC2652 flash into filesystem +# This takes 3 minutes during which Tasmota is unresponsive +# +import cc2652_flasher as cc +cc.start() +cc.flash_dump_to_file("cc2652_dump.bin", 0x00000, 0x58000) + +-# + +class cc2652_flasher + var ser # serial object + var debug # verbose logs? + var rx, tx, rst, bsl # GPIO numbers + + # init - abort zigbee operations and starts the serial driver + # args are optional + def init(rx, tx, rst, bsl) + import string + + self.debug = false + self.rx = (rx == nil) ? -1 : rx + self.tx = (tx == nil) ? -1 : tx + self.rst = (rst == nil) ? -1 : rst + self.bsl = (bsl == nil) ? -1 : bsl + # + if self.rx < 0 self.rx = gpio.pin(gpio.ZIGBEE_RX) end + if self.rx < 0 self.rx = gpio.pin(gpio.TCP_RX) end + if self.tx < 0 self.tx = gpio.pin(gpio.ZIGBEE_TX) end + if self.tx < 0 self.tx = gpio.pin(gpio.TCP_TX) end + if self.rst < 0 self.rst = gpio.pin(gpio.ZIGBEE_RST, 0) end + if self.bsl < 0 self.bsl = gpio.pin(gpio.ZIGBEE_RST, 1) end + print(string.format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl)) + # tasmota.log(string.format("FLH: cc2652_flasher rx=%i tx=%i rst=%i bsl=%i", self.rx, self.tx, self.rst, self.bsl), 3) + if self.rx < 0 || self.tx < 0 || self.rst < 0 || self.bsl < 0 + raise "value_error", "cc2652_flasher unspecified GPIOs" + end + # stop all zigbee activity + import zigbee + zigbee.abort() + # good to go + self.ser = serial(self.rx, self.tx, 115200) # initialize UART serial port + end + + # restart the MCU in BSL mode and establish communication + def start(debug) + if debug == nil debug = false end + self.debug = bool(debug) + self.reset_bsl() + # + # print("FLH: cc2652_flasher started") + end + + ################################################################################# + # Low level methods + ################################################################################# + + # restart MCU and enter BSL + # + # arg: + # ser: serial object + def reset_bsl() + self.ser.flush() + + gpio.digital_write(self.bsl, 0) # trigger BSL + + gpio.digital_write(self.rst, 0) + tasmota.delay(10) # wait 10ms + gpio.digital_write(self.rst, 1) + tasmota.delay(100) # wait 100ms + + self.ser.write(bytes("5555")) # trigger auto baudrate detector + var ret = self.recv_raw(100) + if self.debug print("ret=", ret) end + if ret != bytes('CC') + raise "protocol_error" + end + end + + # received buffer and give up if timeout + def recv_raw(timeout) + var due = tasmota.millis() + timeout + while !tasmota.time_reached(due) + if self.ser.available() + var b = self.ser.read() + if self.debug print("b:",b) end + while size(b) > 0 && b[0] == 0 + b = b[1..] + end + return b + end + tasmota.delay(5) # check every 5ms + end + raise "timeout_error", "serial timeout" + end + + # send simple ACK + def send_ack() + if self.debug print("send ACK") end + self.ser.write(bytes("00CC")) + end + + # encode payload + static def encode_payload(b) + var checksum = 0 + for i:0..size(b)-1 + checksum = (checksum + b[i]) & 0xFF + end + var payload = bytes("0000") + payload[0] = size(b) + 2 + payload[1] = checksum + payload += b + payload += bytes("00") + return payload + end + + static def decode_ack(b) + # skip any 00 or CC bytes + while size(b) > 0 && b[0] == 0 + b = b[1..] + end + if size(b) == 0 || b[0] != 0xCC + raise "serial_error", "missing ACK" + end + end + + static def decode_payload(b) + # skip any 00 or CC bytes + while size(b) > 0 && (b[0] == 0 || b[0] == 0xCC) + b = b[1..] + end + + # check buffer + var sz = b[0] + if size(b) < sz || sz < 2 raise "serial_error", "buffer too small" end + # + var payload = b[2..sz-1] + + var checksum = 0 + for i:0..size(payload)-1 + checksum = (checksum + payload[i]) & 0xFF + end + if checksum != b[1] raise "serial_error", "invalid checksum received" end + + return payload + end + + # send + # args: + # b: logical bytes() to send + # no_response: true if ignore any response, or ignore to get a response + def send(b, no_response) + # compute + var payload = self.encode_payload(b) + if self.debug print("sending:", payload) end + self.ser.write(payload) + var ret = self.recv_raw(500) + if self.debug print("ret=", ret) end + if no_response == true + #ignore + self.decode_ack(ret) + return nil + else + payload = self.decode_payload(ret) + self.send_ack() + return payload + end + end + + # Higher level functions + # 64 - COMMAND_RET_SUCCESS + # 65 - COMMAND_RET_UNKNOWN_CMD + # 66 - COMMAND_RET_INVALID_CMD + # 67 - COMMAND_RET_INVALID_ADR + # 68 - COMMAND_RET_FLASH_FAIL + def cmd_get_status() + var payload = self.send(bytes("23")) + return payload[0] + end + + # Get the value of the 32-bit user ID from the AON_PMCTL JTAGUSERCODE register + def cmd_get_chip_id() + var payload = self.send(bytes("28")) + return payload.get(0, -4) + end + + def cmd_memory_read(addr, len) + if (len % 4 != 0) raise "value_error", "len must be a multiple of 4" end + if len > 128 raise "value_error", "len is bigger than 128" end + var b = bytes("2A") + b.add(addr, -4) + b.add(1) + b.add(len/4) + + return self.send(b) + end + + # does not look to be implemented + # def cmd_memory_write(addr, data) + # var sz = size(data) + # if (sz % 4 != 0) raise "value_error", "len must be a multiple of 4" end + # if sz > 128 raise "value_error", "len is bigger than 128" end + # var b = bytes("2B") + # b.add(addr, -4) + # b.add(1) + # b += data + # print("cmd_memory_write",b) + + # return self.send(b) + # end + + def cmd_download(addr, sz) + if (sz % 4 != 0) raise "value_error", "len must be a multiple of 4" end + if sz > 128 raise "value_error", "len is bigger than 128" end + var b = bytes("21") + b.add(addr, -4) + b.add(sz, -4) + if self.debug print("cmd_download",b) + + return self.send(b, true) + end + + def cmd_send_data(data) + var sz = size(data) + if (sz % 4 != 0) raise "value_error", "len must be a multiple of 4" end + if sz > 128 raise "value_error", "len is bigger than 128" end + var b = bytes("24") + b += data + if self.debug print("cmd_send_data",b) + + return self.send(b, true) + end + + # WARNING: this command erases all of the customer-accessible flash sectors + # After this operation, since CCFG is not configured, the device will always reboot in BSL (bootloader) mode + # until CCFG is actually re-written + # + def cmd_bank_erase() + self.send(bytes("2C"), true) + end + + # compute crc32 for a memory range + # repeat count if forced to 0x00000000 to read each location only once + def cmd_crc32(addr, len) + var b = bytes("27") + b.add(addr, -4) + b.add(len, -4) + b.add(0, -4) # repeat count = 0 + return self.send(b) + end + + ################################################################################# + # High level methods + ################################################################################# + + def flash_read(addr, len) + return self.cmd_memory_read(addr, len) + end + + def flash_crc32(addr, len) + return self.cmd_crc32(addr, len) + end + + def flash_erase() + self.cmd_bank_erase() + end + + # send ping + def ping() + self.send(bytes("20"), true) + end + + # higher level + def flash_write(addr, data) + import string + + var sz = size(data) + if (sz % 4 != 0) raise "value_error", "len must be a multiple of 4" end + if sz > 128 raise "value_error", "len is bigger than 128" end + + var ret + + ret = self.cmd_download(addr, size(data)) + #print(">cmd_download", r) + + var ack + ack = self.cmd_get_status() + if ack != 0x40 raise "serial_error", string.format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end + + ret = self.cmd_send_data(data) + + ack = self.cmd_get_status() + if ack != 0x40 raise "serial_error", string.format("command failed: 0x%02X - 0x%06X (%i)", ack, addr, sz) end + + end + + # dump the flash into a bin file + def flash_dump_to_file(filename, addr, len) + var offset = addr + var f + + try + f = open(filename,"w") + while len > 0 + var b = self.cmd_memory_read(offset, 32) + f.write(b) + offset += 32 + len -= 32 + tasmota.yield() + end + except .. as e, m + if f != nil f.close() end + raise e, m + end + f.close() + end +end + +return cc2652_flasher() diff --git a/tasmota/berry/zigbee/cc2652_flasher_example.be b/tasmota/berry/zigbee/cc2652_flasher_example.be new file mode 100644 index 000000000..b1e7e725d --- /dev/null +++ b/tasmota/berry/zigbee/cc2652_flasher_example.be @@ -0,0 +1,5 @@ +import cc2652_flasher as fl + +fl.start(true) +print("CCFG=",fl.cmd_memory_read(0x57FD8,4)) +print("crc32=",fl.cmd_crc32(0x0,0x30000)) # bytes('1598929A') diff --git a/tasmota/berry/zigbee/intelhex.be b/tasmota/berry/zigbee/intelhex.be new file mode 100644 index 000000000..08393b585 --- /dev/null +++ b/tasmota/berry/zigbee/intelhex.be @@ -0,0 +1,133 @@ +# parse intelhex file +# +# use: `import intelhex` +# +# This class allows to open and parse an Intel HEX format file. +# Basic checks are done to make sure that the format is valid. +# +# If anything goes wrong, an exception is raised. +# +# You provide 3 callbacks: +# - pre: method called when file was opened, but content not parsed - no arg, no return (raise an exception if error) +# this is a good place to erase flash before writing +# - cb: method called for each line containing data to be flashed. args(address:int, len_in_bytes:int, data:bytes, offset:int) +# address: full address in Flash (high and low are automatically combined) +# len_in_bytes: length of the data line, generally max 32 bytes +# data: bytes() object containing raw bytes +# offset: offset in bytes() object, skipping first bytes without needing to reallocate buffer +# - post: method called when all data was parsed, and before the file is closed - no arg, no return (raise an exception if error) +# this is a good place to check CRC32 or any checksum +# + +class intelhex + var filename # filename of hex file + var f # file object + var file_parsed # was the file already parsed. It cannot be flashed if not previously parsed and validated + var file_validated # was the file already validated. It cannot be flashed if not previously parsed and validated + + def init(filename) + self.filename = str(filename) + self.file_parsed = false + self.file_validated = true + end + + def close() + if self.f != nil + self.f.close() + self.f = nil + end + end + + # open the intelhex file and parse from start to end + # + # Args: + # - pre: method called when file was opened, but content not parsed - no arg, no return (raise an exception if error) + # this is a good place to erase flash before writing + # - cb: method called for each line containing data to be flashed. args(address:int, len_in_bytes:int, data:bytes, offset:int) + # address: full address in Flash (high and low are automatically combined) + # len_in_bytes: length of the data line, generally max 32 bytes + # data: bytes() object containing raw bytes + # offset: offset in bytes() object, skipping first bytes without needing to reallocate buffer + # - post: method called when all data was parsed, and before the file is closed - no arg, no return (raise an exception if error) + # this is a good place to check CRC32 or any checksum + # + def parse(pre, parse_cb, post) + try + self.f = open(self.filename, "rb") + self.file_parsed = true # we tried to parse + pre() + + self.munch_line(parse_cb) + + post() # validated is computed internally + + except .. as e, m + self.close() + self.file_validated = false + raise e, m # re-raise + end + + self.close() + end + + # internally used, verify each line + def munch_line(parse_cb) + import crc + var crc_sum = crc.sum + var tas = tasmota + var yield = tasmota.yield + + var offset_high = 0 + var offset_low = 0 + var b = bytes() + var b_get = b.get + var b_fromhex = b.fromhex + var self_f = self.f + var readline = self_f.readline + while true + yield(tas) # tasmota.yield() -- faster version + var line = readline(self_f) # self.f.readline() + # print(line) + if line == "" raise "value_error", "unexpected end of file" end + if line[0] != ":" continue end # ignore empty line or not starting with ':' + + b = b_fromhex(b, line, 1) # b.fromhex(line, 1) # convert to bytes, avoid allocating a new object + var sz = b[0] + + # check size + if size(b) != sz+5 raise "value_error", "invalid size for line: "+line end + + var record_type = b[3] + # 00: low address + data + # 01: end of file + # 04: high address + if record_type != 0 && record_type != 1 && record_type != 4 + raise "value_error", "unsupported record_type: "+str(record_type) + end + + offset_low = b_get(b, 1, -2) # b.get(1,-2) + var checksum = crc_sum(b) + if checksum != 0 raise "value_error", "invalid checksum" end + + if record_type == 1 break end # end of file + if record_type == 0 + # data + var address = offset_high << 16 | offset_low # full address + #var data = b[4..-2] # actual payload + parse_cb(address, sz, b, 4) + + # OK + # do whatever needed + import string + # print(string.format("addr=0x%06X len=0x%02X", address, sz)) + elif record_type == 4 + if offset_low != 0 raise "value_error", "offset_low not null for cmd 04" end + offset_high = b_get(b, 4, -2) # b.get(4,-2) + + end + end + end + +end + +return intelhex diff --git a/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be new file mode 100644 index 000000000..5c6f5e8e8 --- /dev/null +++ b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be @@ -0,0 +1,173 @@ + +################################################################################# +# +# class `sonoff_zb_pro_flasher` +# +################################################################################# + +class sonoff_zb_pro_flasher + static CCFG_address = 0x057FD8 + static CCFG_reference = 0xC5FE08C5 + + ################################################################################# + # Flashing from Intel HEX files + ################################################################################# + var filename # filename of hex file + var f # file object + var file_checked # was the file already parsed. It cannot be flashed if not previously parsed and validated + var file_validated # was the file already validated. It cannot be flashed if not previously parsed and validated + var file_hex # intelhex object + var flasher # low-level flasher object (cc2652_flasher instance) + + def init() + self.file_checked = false + self.file_validated = false + end + + def load(filename) + import intelhex + + if type(filename) != 'string' raise "value_error", "invalid file name" end + self.filename = filename + self.file_hex = intelhex(filename) # prepare the parser object + self.file_checked = false + self.file_validated = false + end + + ################################################################################# + # check that the HEX file is valid + # parse it completely once, and verify some values + ################################################################################# + def check() + self.file_hex.parse(/ -> self._check_pre(), + / address, len, data, offset -> self._check_cb(address, len, data, offset), + / -> self._check_post() + ) + end + + ################################################################################# + # Flash the firmware to the device + # + # Actions: + # 1. + ################################################################################# + def flash() + if !self.file_checked + print("FLH: firmware not checked, use `cc.check()`") + raise "flash_error", "firmware not checked" + end + if !self.file_validated + print("FLH: firmware not validated, use `cc.check()`") + raise "flash_error", "firmware not validated" + end + + import cc2652_flasher # this stops zigbee and configures serial + self.flasher = cc2652_flasher + + try + self.file_hex.parse(/ -> self._flash_pre(), + / address, len, data, offset -> self._flash_cb(address, len, data, offset), + / -> self._flash_post() + ) + except .. as e, m + self.file_checked = false + self.file_validated = false + raise e, m + end + end + + + ################################################################################# + # low-level + ################################################################################# + def _flash_pre() + print("FLH: Flashing started") + self.flasher.start() + self.flasher.ping() + # erase flash + self.flasher.flash_erase() + end + + def _flash_post() + print("FLH: Flashing completed: OK") + var flash_crc = self.flasher.cmd_crc32(0x0,0x30000) + print("FLH: Flash crc32 0x000000 - 0x2FFFF = " + str(flash_crc)); + # tasmota.log("FLH: Verification of HEX file OK", 2) + end + + def _flash_cb(addr, sz, data, offset) + var payload = data[offset .. offset + sz - 1] + + # final check + if size(payload) != sz raise "flash_error", "incomplete payload" end + + self.flasher.flash_write(addr, payload) + end + + + # start verification (log only) + def _check_pre() + print("FLH: Starting verification of HEX file") + # tasmota.log("FLH: Starting verification of HEX file", 2) + end + + # don't flash so ignore data + # check CCFG at location 0x57FD8 (4 bytes) + def _check_cb(addr, sz, data, offset) + # import string + + # check than sz is a multiple of 4 + if (sz % 4 != 0) + import string + raise "value_error", string.format("size of payload is not a mutliple of 4: 0x%06X", addr) + end + + # print(string.format("> addr=0x%06X sz=0x%02X data=%s", addr, sz, data[offset..offset+sz-1])) + var CCFG = self.CCFG_address + if addr <= CCFG && addr+sz > CCFG+4 + # we have CCFG in the buffer + var ccfg_bytes = data.get(4 + CCFG - addr, 4) + + if ccfg_bytes != self.CCFG_reference + import string + raise "value_error", string.format("incorrect CCFG, BSL is not set to DIO_8 LOW (0x%08X expected 0x%08X)", ccfg_bytes, self.CCFG_reference) end + self.file_validated = true # if we are here, it means that the file looks correct + end + end + + def _check_post() + print("FLH: Verification of HEX file OK") + # tasmota.log("FLH: Verification of HEX file OK", 2) + self.file_checked = true + end + +end + +return sonoff_zb_pro_flasher() + + +#- + +import sonoff_zb_pro_flasher as cc +cc.load("znp_patched.hex") +cc.check() +cc.flash() + + +# test with invalid +import sonoff_zb_pro_flasher as cc +cc.load("znp_dont_use.hex") +cc.check() + + + + +print("start") +var f = open("znp_patched.hex") +while true + var r = f.readline() + if r == "" break end +end +print("end") + +-# From b3415c9071ee1719b5a427a7a1f44dd65c957bdf Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 May 2022 19:24:50 +0200 Subject: [PATCH 285/376] Zigbee flasher for Sonoff ZB Bridge Pro - dump + firmware --- tasmota/berry/zigbee/sonoff_zb_pro_flasher.be | 39 +- .../SonoffZBPro_coord_20220219.hex | 5242 +++++++++++++++++ 2 files changed, 5263 insertions(+), 18 deletions(-) create mode 100644 tools/fw_SonoffZigbeeBridgePro_cc2652/SonoffZBPro_coord_20220219.hex diff --git a/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be index 5c6f5e8e8..7eb9f1cd5 100644 --- a/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be +++ b/tasmota/berry/zigbee/sonoff_zb_pro_flasher.be @@ -48,8 +48,6 @@ class sonoff_zb_pro_flasher ################################################################################# # Flash the firmware to the device # - # Actions: - # 1. ################################################################################# def flash() if !self.file_checked @@ -76,12 +74,25 @@ class sonoff_zb_pro_flasher end end + ################################################################################# + # Dump firmware to local file + # + ################################################################################# + def dump_to_file(filename) + import cc2652_flasher # this stops zigbee and configures serial + self.flasher = cc2652_flasher + print("FLH: Dump started (takes 3 minutes during which Tasmota is unresponsive)") + self.flasher.start() + self.flasher.ping() + self.flasher.flash_dump_to_file(filename, 0x000000, 0x58000) + print("FLH: Dump completed") + end ################################################################################# # low-level ################################################################################# def _flash_pre() - print("FLH: Flashing started") + print("FLH: Flashing started (takes 5 minutes during which Tasmota is unresponsive)") self.flasher.start() self.flasher.ping() # erase flash @@ -147,27 +158,19 @@ return sonoff_zb_pro_flasher() #- +# Flash local firmware import sonoff_zb_pro_flasher as cc -cc.load("znp_patched.hex") +cc.load("SonoffZBPro_coord_20220219.hex") cc.check() cc.flash() +-# + +#- +# Dump local firmware -# test with invalid import sonoff_zb_pro_flasher as cc -cc.load("znp_dont_use.hex") -cc.check() - - - - -print("start") -var f = open("znp_patched.hex") -while true - var r = f.readline() - if r == "" break end -end -print("end") +cc.dump_to_file("SonoffZBPro_dump.bin") -# diff --git a/tools/fw_SonoffZigbeeBridgePro_cc2652/SonoffZBPro_coord_20220219.hex b/tools/fw_SonoffZigbeeBridgePro_cc2652/SonoffZBPro_coord_20220219.hex new file mode 100644 index 000000000..7e9feb2a0 --- /dev/null +++ b/tools/fw_SonoffZigbeeBridgePro_cc2652/SonoffZBPro_coord_20220219.hex @@ -0,0 +1,5242 @@ +:20000000003A0120D1F8010039FB021039FB021039FB021039FB021039FB021039FB021017 +:1C00200039FB021039FB021039FB021039FB021039FB021039FB021011FB021002 +:20004000BA492DE9F04F0446B74ADFF8E8920E68A578507800279046ADF1540D29460C29B1 +:2000600007D9DFF8CCB2DFF8D0A2203933290FD953E3DFE811F06D055E0543052D050D0506 +:20008000F704F304DD04C7045203BA04B6049604DFE811F083047F047B046B046704EC0242 +:2000A00051042F04B10287024303430343034303430343030B04F003D303B80359029D034A +:2000C0003402FC01430343034303430343034303E801B5019C0143038C03790183037703BE +:2000E0006A0354012A01E500660362035803C000480382004503670046003400E1788DF871 +:200100002A7031F07F0006D011F07F0F0CBF381C0120CA49087053210DF12A0300F004BD25 +:2001200008F1110332203946012226F039F808F1120333203946012226F032F8C84898F894 +:2001400011100078012905D04FF400611EF0EAFC00F001BD4FF40061642226F0ADFB00F0E9 +:20016000FABC8DF82B7078B9E41C204626F058FA0546A01C0446083026F052FA0246214610 +:20018000284624F0C0F900E012208DF82B0051210DF12B0300F0C8BCE01C26F041FAE51C02 +:2001A000AE784FF6FF748DF80A600546ADF80850AC4218D0E01EA84215D0A01EA84212D0FD +:2001C00002208DF80C00ADF80E5003A81BF040FE012818BF4FF001090CD1BDF80E00ADF8E7 +:2001E0000800012000E038468DF80B0002A81DF0E1FC8146E41EAC4204DC012088F82A00F2 +:2002000088F82B6021F096FD8DF82C904F210BAB00F08ABC20798DF82E00E078012814D0E1 +:20022000022809D0032805D052200DF12E0124F027FB0FE03C4600E0012452200DF12E01D1 +:2002400021F0B8FD88F8004004E052200DF12E0121F0B0FD4D210DF12E0300F065BCE178D0 +:2002600038465EB13279914205D1F2880DEB4003401CC0B21A813668002EF3D18DF830003A +:200280009DF83000012404EB4000C0B2054619F097FE5FEA000806D18DF8307049212246CB +:2002A0000CAB00F042BC02469DF8300002F8010B38469DF8301081420ADC652049212A462B +:2002C000434622F0A5F8404621F0D4FB00F043BC0DEB400108310B7813700988401CC0B2BA +:2002E00009125170921CE4E7301CE4788DF8317013D03E4601798C420BD11EB905680B49B8 +:200300000D6002E001683160056821F0B3FB284601E0064600680028ECD121F06BFD0DF109 +:200320003103472100F000BCE404012064F20020671B0120280401208A010120E01C10F856 +:20034000014B26F06DF90146C7480068224650B13E4603799A4202D1C388994205D00646B8 +:2003600000680028F5D1012008E006B9BE4E0168316021F07FFB21F03DFD38468DF832004E +:200380000DF13203CDE739460DF12200062207911BF024FDE01C07A924F09EFF8DF82200E7 +:2003A000079870B101888DF8231046888DF8256009128DF8241031128DF8261000798DF894 +:2003C0002700432106220DF12203AEE364788DF8377048B1012805D002281CBF01208DF80C +:2003E000370004D1022000E004200DF0BFFE24F01F04202C40F0AF830DF13703EEE22046BE +:2004000090F80180C01C26F00BF959460A7849468E6856B13C4633799A4202D1F3889842FE +:2004200005D034463668002EF5D101200EE03CB9346804B93C468C6004E0C046DC01012028 +:2004400030682060304621F015FB384628F01F088DF83800B8F1200F40F07D830EABBDE213 +:200460005001012020464478C01C26F0D9F80146584600781FF042FF24F01F048DF8390083 +:20048000202C40F068830DF13903A7E2E41C204626F0C6F8A41CADF8080014F8010B04214E +:2004A0008DF81000204625F015F80646201D10F8019B10F8018B26F0B3F8044631464A464C +:2004C000434602A800941DF031FA8DF83A009DF810000F280FD1022053468DF810001888B2 +:2004E00031464A46ADF80800434602A800941DF01DFA8DF83A000DF13A036FE2207826460E +:20050000042806F1030614BF16F8010B02208DF81000304626F084F8D54CADF80800B01C69 +:2005200010F8018B012626700278414602A81EF047FE8DF83B002770404625F0CBFB0DF1B6 +:200540003B0332464BE20220E41C8DF81000204626F066F84E46A11CADF808000C7A7068CB +:2005600026F0CEF97168C4F3400804F00104B8F1010F0F7204D17268107A40F04000107268 +:20058000012C03D1087A40F080000872484602A9342209231DF080FD0DF13D038DF83D0069 +:2005A000C1E20226E41C8DF81060204626F038F8A41CADF80800204626F032F8A2788046DC +:2005C00002A84146144625F023F98DF845009DF810000F280CD1504600888DF81060414642 +:2005E0002246ADF8080002A825F012F98DF845000DF14503F2E10226E41C8DF810602046B6 +:2006000026F00EF8A41CADF8080014F8010B8DF84700204626F004F8A41C14F8019B8046C7 +:2006200002A90DF14700424600944B46019721F011F88DF846009DF810000F2811D150464C +:2006400000888DF810603E4602A94246ADF808004B4600940DF14700019620F0FBFF8DF829 +:2006600046000DF14603B9E164F20020A946E51CA878B846FE280BD1E878FF2808D12078D5 +:20068000082805DB284625F0CBFF294624F0BFF9284608A925F09CF9041C0ED1182019F0B9 +:2006A0008FFC5FEA000807D0BDF8200039461822434625F075FD00B1C824192019F080FC8E +:2006C000061C20D05CB9701C2946082225F066FA06F109004146102225F060FA04E0701CC1 +:2006E000FF2118221BF07AFB3470652049461922334621F08DFE3046394619221BF06EFB74 +:20070000304621F0B7F9B8F1000F00F024824046394618221BF062FBD5E502271BE21BF0C2 +:200720008DFF18E2E01C25F07BFFE51C0246A81C10F8011B1CF074FA4E210DF12D038DF8DB +:200740002D00F1E18DF82F7025F0DCFA0DF12F034C218DF82F00E7E120461BF035FFFAE1F2 +:2007600020461EF08CF8F6E1E01C25F059FF6179A2791DF054FA46210DF133038DF833009E +:20078000D2E1E01C25F04CFF6179A27911F032FE45210DAB8DF83400C6E1E01C11F04CFB62 +:2007A00044210DF135038DF83500BDE1E01C25F037FFE51CA91C0B4608310A4619461FF0F1 +:2007C0005BF842210DF136038DF83600ACE10220E41C8DF81000204625F022FF4E46A11C40 +:2007E000ADF808000C7A706826F08AF8706802A935220923047248461DF04EFC0FAB8DF8B6 +:200800003C00EBE00220E41C8DF81000204625F007FFADF80800A0780DF13F0602A9332291 +:200820008DF83F00012300964846019720F012FF0DF13E038DF83E00D0E00220E41C8DF89A +:200840001000204625F0ECFEADF80800A0780DF1410602A932228DF841000123009648460C +:20086000019720F0F7FE10AB8DF840005BE1C0468C0A01200220E41C8DF81000204625F030 +:20088000CFFEADF80800A0780DF1430602A931228DF84300012300964846019720F0DAFEF1 +:2008A0000DF142038DF842003DE10220E41C8DF81000204625F0B4FEA41CADF8080004219A +:2008C000204624F007FE4E46221D014612F8018B7068137825F056F902A900F8018B3022A1 +:2008E0000370484606231DF0D7FB11AB8DF8440019E10126E41C8DF84860601C25F090FEFD +:20090000814604F10B0025F08BFE804694F800A0637BA07B22F036FC0093E01C494652468D +:20092000434613F06BFC12AB8D498DF84800042025F0A0FE05E60126E41C04218DF8496028 +:20094000204624F0C7FD21791EF08CF885498DF84900022025F08EFE83490DF14903032095 +:20096000E6E7204619F0E6FDF5E0E41C204625F057FEA11C0B4608310A4619461EF07CFF34 +:200980000DF14A038DF84A00CDE020461AF089F9E1E020461AF042F9DDE020460FF0A4FE6E +:2009A000D9E0E01C25F03CFE4E464FF6FD740F22ADF8084071688DF81020022304121522CB +:2009C00001F8010B48460C7002A9F7701DF064FB39468DF84B000DF14B03F17001222946FC +:2009E000A3E0204618F0D8FDB5E0E41C204625F017FEA11C0A7A3B4622F028F813AB8DF8D5 +:200A00004C0090E00220E41C8DF81000204625F007FEADF80800A01C25F002FE01461122EB +:200A200002A824F0F5FE0DF14D038DF84D007AE00220E41C8DF81000204625F0F1FDADF8C6 +:200A40000800A01C25F0ECFD0146102202A824F0DFFE0DF14E038DF84E0064E020460FF0F5 +:200A6000A3F978E00220E41C8DF81000204625F0D7FDADF80800A01C25F0D2FD01460522C1 +:200A800002A824F0C5FE0DF14F038DF84F004AE00220E41C8DF81000204625F0C1FDA41CD7 +:200AA000ADF80800204625F0BBFD4E467268A1781070726803125370706803230422817088 +:200AC00002A948461DF0E8FA14AB8DF850002AE00220E41C8DF81000204625F0A1FDADF8DB +:200AE0000800A01C25F09CFD0146032202A824F08FFE0DF151038DF8510014E00226E41C89 +:200B00008DF81060204625F08BFDADF80800A01C25F086FD0146324602A824F079FE0DF1EA +:200B200052038DF8520029460122652021F070FC11E0E41C204625F073FDA41C14F8011B31 +:200B4000227822F053FB0DF153038DF85300EAE7204617F0FFF9384615B0BDE8F08FC046CC +:200B60006D290200CD4A0200C15101002DE9F04F04464FF6FE70ADF15C0DADF85400A44873 +:200B800040784FF00008022812D1A148007878B92089002807BF30204146102001210EF0F9 +:200BA000FDFE8DF8568052200DF1560121F002F96068217A08AA12F01DFA002800F0D98469 +:200BC0009DF822000228B4BF012747469DF824000228A8BF4746BDF82A104FF6FE7BABF1EC +:200BE000060B8B450ED04FF6FE70401F884209D04FF6FE70001F884204D04FF6FE70C01E80 +:200C0000884200D1474625F0D5FC9DF82310884240F0AF84002F00F0AC847D4840780228DB +:200C200004D19DF85100002840F0A384208D9DF82660678EADF84C00ADF82E70D6B1616839 +:200C40009DF821209DF83C30012024F0FBFF002840F08F84C448001D007801280AD1208DD1 +:200C600025F0F1FD30B1417901F0EF01417141F0080141719DF82570DFF8E492DFF8E4A283 +:200C80004646002F49D19DF83D00474658BBBDF82A00034620F08EFE4546022808BF0125A7 +:200CA000002D9DF8225018BF012749460988994208BF47F0020727B1002D14BF4021202185 +:200CC0000F43184620F076FE012808BF47F00107002D3BD01298007825F0A6FA012818BFA2 +:200CE00027F0010732E09DF8411041B1FF2906D09DF84000119A22F02BFA50B126E0524697 +:200D0000BDF82A10508F884205D092F84A0004281CD101261AE0222718E0BDF82A10FF2009 +:200D200023F0E6F9002804BF3D1C082708D09DF8250047F001052C2740F001008DF8250051 +:200D400005F00305012D08BF47F0110730489DF82650407830F0010005D107F002010E43D5 +:200D600008BF47F08007DFF8DCC295B961460E787EB107F0220122290BD007F042014229EA +:200D800040F0F78312990978062918BF072940F0F083F9094FEAA7155AD3BDF82A201299D6 +:200DA00048B96046C01C0078800804D30878401E0A282FD909E00878C01E01282AD9001F2F +:200DC00028D0C01E26D0801E24D0B8F1000F21D148460088904240F0CC830D780520BDF845 +:200DE0002C408DF8110004A824F036F9002800F0C0830269032313271370511C0F704C70B1 +:200E000022128A70CD70448009F022FAB1E3C046E404012068081BD30878032802D148784F +:200E20000D2815D09DF8280038B1BDF82C000E990EF0AAFB012800F098839DF8270038B1EE +:200E4000BDF82A000D990EF09FFB012800F08A8309F10E00B4F844100088884209D1CDF856 +:200E60000080208DB4F8421094F8462043460AF0C9FF9DF82600002843D0208DB4F8421069 +:200E800020F092FC061C25D19DF8510088B99AF89000012835D112980078062801D1680892 +:200EA0002FD2BDF82E100BF10700884240F0C5805FE3042024F04AF8011C00F05A836420D2 +:200EC000087001274F70208D48809AF800001FF089FC4EE39DF821106068F3780A18527BFF +:200EE0009A4203D0F27040467060606840180421401C24F0EFFA7168814200F23A83401C46 +:200F00007060B348DFF8C4B24078022800F08F8230F0010040F02D839AF832008008C0F0D9 +:200F200028839DF8510030B3BDF82C0024F0E1FDE0B9A5495C46BDF82C000B686269990188 +:200F4000A1EB83019047012840F01383A169BDF82C008847E168BDF82C00884709E3C04616 +:200F60008A01012050010120500101206168487800F0DF0048709DF8320038B16168887957 +:200F8000401E8871C0B28DF8320008B907F07F07380924D39DF82500F9084FF4805814D29F +:200FA00079091AD3811011F0070F01F0070604D0072E1CBF761EF6B20EB907F07F0700F0C8 +:200FC000E30040EA8600C0B205E020F01C00C11021F0030108438DF82500616808729AF84B +:200FE0004A00042800F0E981092800F0E68117F0610F40F0EF809DF82200012811D1129817 +:201000000078052800F0D88003280AD1BDF82A0024F06FFD28B1218D08A815AA002301F074 +:20102000CFFB9DF8320078B99DF82200012804D112980078032800F09C8208A821461EF0B9 +:20104000CBFC96E27F01012024F09EFA002840F090829DF83D0000286DD19DF82400BDF8F4 +:201060002A10FD100028ADF854102ED13A0930D29DF82220012A28D0084600211BF0AEFC96 +:20108000002620B14079012816D0022814D0BDF85400B4F8441020F087FB28B1807823F004 +:2010A00088FF08B1082807DBBDF82C0024F021FD18B104208DF824000126BDF82A10002EF1 +:2010C00008BF022272D09DF824006A0838BF002300D340230DF13D021BF0BAFC30B16168C0 +:2010E000087848F0200800F03F0008709DF83D0040B1BDF82A1010A820F03CFC48F0400837 +:20110000ADF854009DF82200012806D0BDF82A00BDF82C10002217F047FF68082CBF402224 +:201120000022BDF82C10BDF82A0015F029F908B148F0200833E09DF840009DF84110119A04 +:2011400022F006F800282ED09DF8410038B9BDF82A00ADF8540025F076FB00BB1DE01199D2 +:201160009DF8286001EB400030F8020C002EADF854000CBF082110219DF8270008B10831F6 +:20118000C9B29DF82500002200B1012266688918491CCAB2905D401E905548F0400823F011 +:2011A000F1FC8146A8E0BDF82A100B22BDF82C0000231BF059F9DCE1218D08A815AA002379 +:2011C00001F0FEFAD5E1C046BC800200E4020120E404012078084FF0000967D39DF8330052 +:2011E000B4F828B0C04D494616901E20EA79169B934206D1BDF82C302A88934201D1AE789B +:201200002EB9401E05F1080501F10101EED11E2921D0AE79E6B1BAF84810584623F044F8E6 +:2012200008B1761EAE71BE4833210279FF2A02D00288934504D0491E00F12400F5D102E018 +:20124000A879401EA871A8794828A4BF4E46AE7127F060072AE023F095FC81469DF8320095 +:2012600028B9BDF82C00218D814202D11EE0BDF82C00BAF83A10884202D19AF80600A8B1FF +:20128000218D08A84A4610F0DDFA58B1380932BFBDF82A004FF6FE70401C48F00408ADF877 +:2012A000540003E027F020074FF00009B8094FEAA71510D394F8460094F8476094F94830CE +:2012C0008DF81000E26B8DF8116004A98DF8123008A804F037FF68080ED3218D08A815AA7A +:2012E0004B4601F06DFA5FEA000905D012980078012808BF48F01008BDF854104FF6FE70B0 +:20130000884208BF4FF000099C49C97E012927D1628E411C914223D0228D914220D0BDF86C +:201320002A10401F88421BDDBDF82C00904217D025F089FAA0B10179012918BF02290FD149 +:2013400001218DF810104088ADF81C0004A81EF06DFE28B105A81EF0B3F908B120F0EAFC29 +:2013600037F07F0000F00581B9F1000F00F00181208918F025FE071C00F0FB806168228950 +:2013800024F00CFC002605969DF822008DF81000CDF80090CDF8048004AD0296BDF8541024 +:2013A0000395228D237A384614F09EFC002800F0E080384620F05EFBDBE04946BDF82A00A5 +:2013C000098881420AD020F0F5FA022806D09DF8250000F00300012840F0CB809DF82200D8 +:2013E00098B112980178042904D19DF83C10022900F090800078072804D19DF83C100429E9 +:2014000000F0848003287CD0B3E094F846008DF8100094F847708DF8117094F948608DF864 +:201420001260E26B08A804A904F08CFEA1E09AF84A00042818BF092840F09B80B80971D232 +:2014400012986908C0F095800178042903D19DF83C1002295ED00178072903D19DF83C208A +:20146000042A53D003294CD00C2940F08280401C424A10F8017B0578164601215120D21CA6 +:20148000F57025F051F93D4B3B49012658465C79067057B9002C14BF4EF660204FF47A706C +:2014A00051F8241000FB01F405E00846203000684EF6602444430320B4FBF0F441464FF405 +:2014C00080400EF06BFA9AF8000002211DF02AFB68080BD2A8084CD39AF8000002212246C9 +:2014E00025F0E7F945E0C046440200204FF48040214616F085FC4FF4804031460EF04EFAB5 +:2015000037E008A8002112F017FA32E008A81AF0B1FA2EE0002008A90BF018FD29E0C0465B +:201520002C10002094F8460094F847709DF832508DF8100094F948608DF81170012D8DF8A0 +:2015400012607FF46EAF208DBDF82C1088427FF468AFBDF82A0020F02DFA022808BF8DF80B +:2015600032805EE7BDF82A0001E0BDF82C001EF08DFF17B0BDE8F08F98800200E40401202B +:20158000B94A2DE9F04F0846ADF14C0D11780F90000C80F067849246B44D0F9A6878920B20 +:2015A00080F03184022813D10F9A520810D39AF850000F2807D19AF84A0020B1012802D079 +:2015C000002020F09DFF0F9880F0010000F06ABC0F9A920980F04C83DFF89892DFF898829C +:2015E00030F0010740F0BC820F9A520980F03D820F99C90980F0C4819D490F9F0A78390A9A +:2016000080F0AD813946490A43D23946090B2AD20F999AF80370490B1AD20F99C90BC0F09D +:201620009F824C46A06A70B1297D01290BD18047E06A00B180479AF800004FF480414FF4BE +:201640007A7225F036F90F9880F4804000F02ABC27B100208AF803001FF052FF0F9880F4B1 +:20166000805000F01FBC1FF04BFF687C01280BD1A97C49B19AF800004FF47A7212FB01F2AD +:201680004FF4006125F015F9384680F4006000F009BC24F095FF4FF6FE7B834500F05B8182 +:2016A0009AF832008008C0F0568100263446304623F00AF8071C19D03879012816D0022836 +:2016C00014D0F879411CF9719AF88B1081420DDABC727C72388822F011F9388801A923F0A2 +:2016E00096F901A81DF0ECFF20F024FB761C332EDDDBA8F11C0614275D46119436F81C0F49 +:2017000085420CD0307B9AF88B40411C8442317305DA1198B0747074308822F0EFF87F1E79 +:20172000ECD14C46032104F13C0010F8047F0FB17F1E0770491EF8D1B04C332605F1010921 +:2017400034F8240F81451FD001208DF804006788ADF8107001A81EF069FCA8B1A8F11C0588 +:20176000142735F81C0F2188814208D0BDF80610814204D002A8A91C24F000F910B1284685 +:2017800024F08EF97F1EECD1761ED9D1119D2C46284622F099FF48B1077937F0040705D15D +:2017A000807A23F006FC08B1641CE4B26D1C332DEEDB23F02BFB119E5FEA00080ED0354607 +:2017C000284622F087FD28B1807C23F0F2FB08B1761CF6B26D1CEDB2A845F1DCA019C7B229 +:2017E000002F4BD0B80018F0EBFB1090002808BF119F45D0BA00FF211AF0F0FA119E3546AD +:20180000B44218DD284622F05FFF031C10D0187930F004000CD1987A23F0CBFB011C07D08F +:20182000009718885A7A109B19F07EFA761CF6B26D1C332DE4DBB8F1000F21D0119C2046D3 +:2018400022F048FD061C0AD0B07C23F0B2FB011C05D00097109B3088727C19F065FA641C87 +:20186000E4B2A045EBDC0BE050010120E4040120FE090120E40201209C0400201198109088 +:201880009AF83000002808BF4FF0620805D024F0CDF9C0F154005FFA80F80320B8F1600F2E +:2018A00098FBF0FAA8BF4FF01F0ADDF84090ABF1020BB8F1000F0EBF119D2025DDF844807D +:2018C000BA45A6BF3C1C45F040055446032014FB00F0801C8DF8050001A823F0BDFB4E46E8 +:2018E000031C26D01869082104F01F02017045EA02014170801CA4B12246C01E361F16F826 +:20190000041F00F8031F318809124170B17801F0070CF178521E01F0070141EA0C118170CD +:20192000EDD1A3F802B001209876184608F090FC00E00120E90906D2641EE4B20CB109EBF7 +:2019400084093F1BFFB205F040052843B1D0109808B120F08FF80F9880F48070A2E21043EF +:2019600008D1B3480179012902D10021C170017121F0F4F91EF09EFE384680F0800091E2CF +:20198000B44C1E2600214FF006084FF00409A778002F43D07F1EFBB26079A37023F0B6FFEA +:2019A000071C3AD06BB9787B022808BF87F80D8033D087F80D803868407BF0211FF0FEFB63 +:2019C0002BE0A3791BB9787B032812D025E023791BB3E078401EC3B2E370F3B99AF82500BC +:2019E000E0702079401EC3B22371787B032814D133B92046394620F0BDF80EE008100020D8 +:201A000087F80D9024F0C7FE00F00F00401C38819AF8000020211DF01BFB0121761E04F11C +:201A20000804B4D19AF80000012910D040211DF079F895F82A00012813D1002085F82A000F +:201A400095F82B0016F0B0FE20F074F909E040211FF0F0FF28B99AF800004021642224F0E7 +:201A600028FF0F9880F040001CE2084610211FF0E1FF30B99AF8000010214FF47A7224F08D +:201A800018FFBB48DFF8EC82417808F2AC54491ECFB217BB012141700020052123F09CFCB6 +:201AA000071C1BD006253846052123F095FC0646388978B1401E80B2388158B97889C0084C +:201AC00002D3387B21F002FF7D733868407BF0211FF074FB371CE6D100E0477064274FF621 +:201AE000FE7600252079A0B1FF2812D0401E2071C0B270B96079032805D160882188022241 +:201B00001CF060FD6079012803D0268066806571A5717F1E04F10804E4D108F15A04082736 +:201B2000207A401E2072C0B230B9C048214622F01DF890B9668025707F1E04F10A04EFD106 +:201B4000BB4AC82112F8080F08B1401E1070491EF8D10F9880F01000A4E11FF07DF8E4E7B4 +:201B60004C460F992778890864D20F992289890A40D20F99090906D301200F9F8AF80600E3 +:201B800087F008008EE10F99C90A26D20F98400C38BF0020C0F08681C44C332501262079FB +:201BA00080B105280EDA607900090BD28DF804606088ADF8100001A81EF038FA10B102A846 +:201BC0001DF07EFD6D1E04F12404E8D100200F9F8AF8040087F4803064E1022801D11AF052 +:201BE000DBFABAF84800012119F0F2FA0F9880F4806057E1BAF8485004F108015020AAF872 +:201C0000482020F0D7F82689142744466089854205D0864204D0204623F042FF00E0668167 +:201C20007F1E04F11C04F1D10F9880F4007039E1CCE8002087B9BAF83E10012021F0BCFA8F +:201C40006878022810D19AF8000001211CF06AFF0AE0C0464402002001A824F0F8FD24F054 +:201C60009DFC01A91DF03CF90F9880F0020019E1084620211FF0DEFE28B9DAF81000002867 +:201C800008BF012616D024F0D9FF044624F074FC4FF47A716043B0FBF1F1DAF8100000284E +:201CA00008BF002004D088428CBF4FF0FF30081A46086AD00020042123F08EFB071C64D004 +:201CC000FF254FF0FF3B06244FF001093846042123F082FB10903889864204D8801B83B2EC +:201CE0003B8113B14EE000203881BB7B012B02D17889C00840D3002B36D08DF804508DF8BD +:201D000005508DF806B03968086AC97F02AA11F071F94FF00008012808BFC8465FEA08002B +:201D20001DD0788A40F08000ADF83600B87B8DF838007889000908D3BDF8360040F4807045 +:201D4000ADF83600387B8DF83A007B6913B1187BADF8180001A9002202A804F0F3F97C73F9 +:201D6000387B19F007FE0DE087F80D900AE0C046640F0120200100207C733868407BB721B2 +:201D80001FF01CFA109F002FA0D10CF061F89AF800300020012123F01FFB18B118462021E1 +:201DA0001DF056F90020042123F016FBB3B278B152460789147823F00FFBF8B9BB42AEBFE4 +:201DC0000027FF1ABFB2204627B920211DF040F900200DE07A00202124F06EFD24F02EFFFD +:201DE000044624F0C9FB4FF47A716043B0FBF1F0CAF810000F9880F0200053E00289BA42A1 +:201E0000D8BF171CD7E724F095FD294C0546201D00680746C0B157F80C1C9AF8000049B966 +:201E20004FF400511CF06AFB08E0C04621130200E40900204FF400511DF00AF920463946E3 +:201E40000022001D21F0BEFB284624F0F3FE2FB13846FEF78BFE384623F07EF90F9880F407 +:201E600000501FE008461DF0C5F8071C17D0114920310A78FF2A0FD03C780B4600209442C1 +:201E800007D0401CC0B2C200D1189A5CFF2AF6D102E0496838468847384623F05DF90F989E +:201EA00080F4004013B0BDE8F08FC0462C100020E40A0120987C02002DE9F04FC14DC24C8F +:201EC000DFF808A3C44E88465FEA1840ADF11C0D80F09E826F78DFF8F892DFF8F8B25FEA96 +:201EE000580080F01B82384630F0010040F091805FEA980058D25FEA981044D25FEAD8303A +:201F0000C0F087800120022122F0CAFBC5B20DB3E80018F055F8071C1DD0C04C82464FF058 +:201F2000010933262079012818BF02280DD18DF804906088ADF8100001A81EF077F820B1F0 +:201F400002A9504624F0DCFC8246761E04F12404E8D100E0002797B175B10F204FF6FC76C7 +:201F60008DF80C001F24ADF8046001A92A463B46C248009415F032FC38461FF07BFD88F497 +:201F8000804000F00DBC207A38B92078062802D1072023F087FE23F06FF9E07910211DF0D3 +:201FA00057F888F02000FBE3207AE8B92178E079082917D123F0F8FA092023F073FEBF485D +:201FC0000078052806D0072809D10720012105F0D3FA04E0012022F067FC1BF0C1FF23F01A +:201FE0004BF913E010210FE024F0DEFAEF2803DB002022F059FC09E024F0D6FA1030C0B2A3 +:2020000024F0E4FAE07901211DF022F888F00200C6E3CE48CE4B0668B3F900005FEA58110E +:2020200080F04E815FEA181028BF88F0080080F0B7835FEA582080F0D1805FEAD80080F0CC +:20204000B78037F001001CD15FEAD81019D32069A0B116F071F92069076820691FF00AFD36 +:2020600027615FB1FA8802E0F888801AF8803F68002FF9D1E079402124F01EFC88F0400092 +:202080008EE35FEA182064D25FEA98205CD2C84C5FEA18302CD25FEAD82027D3142017F0D0 +:2020A0008FFF071C1FD0002524342E46207A012812D10097042029463246142320F0A6FB5F +:2020C00050B9206838606068294614223B467860042021F0DDF926726D1C0C34C82DE5DBF0 +:2020E00038461FF0C7FC88F4806059E3002057E3182017F065FF071C23D000252E46207AB2 +:20210000012812D10097062029463246182320F07DFB50B9206838616068294618223B4630 +:202120007861062021F0B4F926726D1C0C34032DE5DB38463146182219F050FE38461FF07E +:2021400099FC88F400602BE319F000F888F4007026E31BF005FF207805281DD1E0790421CA +:202160001CF0E0FCE07904211CF0C8F9062023F099FD687830F0010007D15046007800F086 +:202180000700022801D024F0FFF81FF0D3FD18F0DDFF1EF08BF801E01FF0CCFD012021F0F3 +:2021A00055FC0320012105F0E7F988F08000F7E2FF20032120F00AFE24F00EFAC249012040 +:2021C0000860FEE7E4040120C4030120501A0120500101203C0501204C1A01204A4692F8C1 +:2021E0004A00082818BF042845D124322120742124F09AFABF4E6878716832880024B146DD +:20220000A2423DDC30F001002DD1044CFF25002694F82100802822D102E0C0462C1000207C +:202220006788ADF8067023798DF80830A1798DF80A1062798DF809202088ADF80400E77948 +:2022400084F82150237D8DF80B70A7698DF80C3031461022032001AB049721F019F9761C58 +:202260002434332ED4DBBB48006800B180470020022120F0ABFD88F4807091E228040120EC +:20228000A30003EBC403CF5C37F07F0C13D017F07F07CF540B4405D101A8FF210C2219F051 +:2022A0009DFD01AB012021460C2221F0F1F86878D9F804103288641CA4B2A1E76F060120B5 +:2022C000B0F1FF3F37465C4602D1B8480078A0805FB17968087818B1486800781AF088FDA4 +:2022E0003F68002FF5D1B4F90400B0F1FF3F02D0C0B21AF07DFD24F063F9AD49088023F0E9 +:202300001DFC687C012806D14C4620784FF40061642224F0D1FA88F0100041E2012023F0AE +:20232000C1FC3046677801793546122201F0070A11F0070F16D1022F0CD0012F12D108201A +:2023400023F0B0FC24F020F80BE0C046C00A012040050120082023F0A5FC0020014612F00B +:2023600031F90246BAF1010F18BFBAF1020F45D107B3032F1ED0012F40D1BAF1010F3DD1A3 +:202380000A2023F08FFC4C4620784FF480611CF0C9FB502005A922F073FABDF81400A4F855 +:2023A0004800BDF81400002118F012FF2DE0C046E0E8002023F0A8FF002818BF032F16D105 +:2023C000022023F06FFCB749E06809781CF04AFB0246A879000911D28AB959464878401CF0 +:2023E000C0B20428487004BFBB48E06006E024F0D2F90146012012F0E5F802462AB1E079F9 +:2024000001214FF47A7224F057FA88F00100C7E1DFF8CCB2BBE10646B04A337827781168EB +:2024200068781A46521E00F08D81521E00F09480183A00F0A681B93A00F09F812A3A00F0BA +:2024400083801B1F77D05B1E6ED05B1E54D05B1E3CD05B1E2CD05B1E40F0968120BB707F20 +:20246000DBF8109000BBB9F1000F06F1050A1BD0BAF1000F18D04F46B81C5146082222F0A6 +:202480005BFE18B9FF68002FF6D104E038461DF079FDDBF81090B9F1000F05D19BF800003B +:2024A0004FF400611CF03EFB304622F005FF6BE1012818BF022840F06781307916F074F9FD +:2024C0001FF038FC60E1C0467C052043002840F05B813079012800F05781022806D0042894 +:2024E00040F05281304618F001FA4DE1304612F0B7FF49E1DC0A0120012840F045817088BC +:20250000002840F04181301D01A921F0D7F8012840F03A8124F054F8ADF80C00361D0296BA +:2025200001A816F0BBFB2FE1002840F02D81304611F0F2FC28E1012818BF022840F02481B3 +:20254000304608F031FD1FE1002900F01D813046884719E13C090120012818BF022840F029 +:2025600013815846C0795E46072818BF082805D1237A1BB9012104F0FFFF2778032F00F0FA +:2025800093800A2F16D0042F1AD00D2F18D00E2F16D00C2F14D0002F00F0F6801DF086FE60 +:2025A000E07910211CF054FDEEE0C046671B0120E00301208048007800F00700012873D016 +:2025C000277A6078002F35D10020E0720746F7701FF01EF8F8B120780D281CD00E281AD080 +:2025E000062023F05FFB70480078000904D34FF4004001210DF0D2F9687830F0010007D1F2 +:202600006E48007900F00700022801D023F0BCFE1DF04CFEB8E06878022803D108200121B5 +:202620000DF0BCF9052023F03DFB42F2107022F013FEA9E0E17A01280BD003281ED16878BF +:2026400002281BD1594900260E7001270320677113E0491CC8B20428E07204DB54480078B8 +:20266000012809D00AE0534800884FF6FF7181421CBF0426A672E8D10020607021F08EFA74 +:2026800020F07CFC48480078000902D3287D01287AD16078032877D1082001210DF07EF9AA +:2026A00072E0C04699060120207A002848D1E07910211CF0CDFC1EF0ABFF98B968780228B5 +:2026C00003D1082001210DF069F9052023F0EAFA01201FF0CFFB57E000F8FF0728070120E2 +:2026E000680601206F78207837F001070AD10A2808D13149097801F00701022902D02B4A51 +:202700000821117003280BD11DF0D0FDF079022806D1012021F09AF90220012104F02CFF9C +:20272000062023F0BFFA687830F001002CD12248007800F00700022826D023F025FE23E077 +:202740000020C6E7022F1FD1012818BF02281BD123F0A8FF28B113F09BFBA8B168780228E6 +:2027600008D023F0D5FF00280CBF002001201FF099FF09E019F010FD06E0304605F0A2F8D5 +:2027800002E0304606F082FC069822F0E5FCE0791CF030FC002806907FF43DAE88F4004073 +:2027A00007B0BDE8F08FC046521A01209A010120E006012098010120501A01204C1A01201C +:2027C0002DE9F04F064693460020ADF13C0DABF80000B06A099303460078884623F024FD5C +:2027E00048B1708904461FF0E5F8022804BFABF80040B36A01D0002009901878C84DDFF8BE +:202800002493401E0A2800F20B84DFE810F02F03B3020C04A0028D0151010904BE0088005D +:2028200066000B00BD4C207D012840F0F9835B1CB06913F8015B1F7824F032F8002800F0C8 +:20284000F7830379002B00F0F383032B80F2F0830E2D1CDCDFB9D04907752DB901EB850126 +:202860000A6BC261096B0AE001EB85010B6B9A01A2EB8302C2610A6B9101A1EB82018161B2 +:20288000012180F820101FF055FA002500E001250320B689E4788DF8190006A822F0DCFBF2 +:2028A000071C00F0C58338690C2100F8011B00F8015B04700124BC7723F040F9786204A9E8 +:2028C000304622F0A4F810B17C7704A838627E80BC76384607F0BCFCAAE35C1C207820F0D0 +:2028E0001F0700F01F00012840F09A83641C04A8214624F005F8284604A95D3023F03EF898 +:20290000002800F08D83002F40F08A830834A2786178207801EB022120F0B0F988E3688F32 +:202920007189884240F07C835C1C14F8016B04A8214623F0E5FF284604A95D3023F01EF8D9 +:2029400006F01F0726F01F06002800F07183002E40F06E83780017F033FB011C00F0688320 +:2029600067B184460834384663782278401E04F1020402EB03222CF8022BF5D100910EF035 +:2029800058FC08461FF076F852E35C789A1C34F07F0704F01F0E40F04B83377F03201EFB9E +:2029A00000F0801CC1B2B94240F04283002714F01F0F04BF4FF6FE7C614618D0D9789B785A +:2029C00070464D4603EB012C5378117812F802EF01EB03213EF0770340F02A832B888B422F +:2029E00008BF0EF00707521C401EEDD1BFB960464FF6FE72824212D004F06002602A0ED043 +:202A00004D462A88A30907D2E30902D2904203DD0EE3904203DD0BE39142C0F20983B0899F +:202A200023F011FF002836D1B0894FF6FF7121F03BFC041C14D120F011FD041C00F0F88261 +:202A400000211C2219F0CAF9B0894D460E35208028886081AA23A374062222740121617472 +:202A6000207C0C2805DB0620072F2074BCBF7F1CFFB2677400202073A01C22F01CFD002852 +:202A800040F0D682307A002800F0D282B169A01C23F036FFCCE20021C171017A0C2905DBE9 +:202AA0000621072F0172BCBF7F1CFFB24772BFE2484671890088884240F0B282307F02280E +:202AC00040F0AE82AA4CA01D00884FF6FE71814240F0AE82162022F039FA071C00F0A882CC +:202AE00001213970B07900280CBF081C02207870B06A4078B872000902D2B0891FF068FE3A +:202B0000B169B81C23F0FCFE0020F874287839461DF068FEB089E0808AE2C046E404012088 +:202B2000500101208A01012070891EF043FF002840F076825F78B94987B10C2F03F1020399 +:202B400080F276828C463D465A7818786D1E03F1020300EB02202CF8020BF5D14846758940 +:202B60000488DFF8D892AC4200F0B280B37C002B00F05E823B1C0A974FF0000811D0A74A3D +:202B800038464146921E32F8023F9C4206D0401E01F10101F7D104E0688002000A914FF09F +:202BA00001082846002119F019FF00280B907ED0407901287BD10B98807910F0180F76D014 +:202BC0000B984188384622F0AFFE10B9B8F1010F6DD109F55F794FF6FE704FF000080C9719 +:202BE000B6F80CB0CDF820904FF0010A0D90C14611E0B8F1010F08BF4FF0010908D023F063 +:202C0000CAFDC0B290FBF8F101FB08F1A0EB01094FF00008C246089D14271C3D35F81C4F5D +:202C20004FF6FE70A04213D0A34511D00C98214622F07AFE60B96B7C53B1072B08DA08F1AD +:202C40000100BAF1000F5FFA80F801D1C14521DD7F1EE3D1B34D332735F8244F0D98A04240 +:202C60001AD0A34518D00C98214622F05DFE98B96B7A8BB1072B0FDA287901280CD00228C5 +:202C80000AD008F10100BAF1000F5FFA80F803D1C14501DC0D9407E07F1EDDD1B8F1000F93 +:202CA00002D0B9F1000FA4D00D980B994880B37C5A4C581EB074F77C00970A9D01950294B8 +:202CC00001220392B189B269708915F02BFCAFE1B4890C2F80F2AC818846ADF81040BD4853 +:202CE0008DF812700168CDF8148009B104A8884720461CF009FAC82803D14FF6FE701CF0DE +:202D000003FAC82880F2948109EBC00000F6CC05686808B11EF0AEFE2FB1780017F050F9D9 +:202D2000686010B984E1002068606C80C2486F70007828706878002800F07A8168680028E5 +:202D400000F076817A00414622F028FF70E1307F022840F06581099828B94D467189288853 +:202D6000884240F06581099831460AF0EFF85EE1E4020120B5F8481040461EF015FDA8469B +:202D8000074608202FB17D781DB90621397007257D70B16A0A79CC788B794D7891F802A054 +:202DA000CF7904EB02244A7902EB03296A0928BF1020AA0924BF0830C0B235F0700340F048 +:202DC0003781327F904240F0338105F07005680938BF002006D306A8083123F091FD25F06C +:202DE00010050820A90907D3B16A091804A8083123F086FD25F020052046514621F0B2F861 +:202E000008280DDA8D4B410001EBC001C9188879B84240F30D818F71002002E044010020D1 +:202E20000420B8F83A10A14219D048B9B189484601222B460EF06CFC28B1F9E020010020F2 +:202E4000042840F0F58006A804AE009049463A46534601962046029512F0CCF8E8E0B189AD +:202E6000484601222B460EF053FCE1E0B5F8481040461EF099FC4FF00609041C03D06078DB +:202E8000002800F0CD80B06A817847780891C378017900F1050A03EB0120099040461DF072 +:202EA000EDFC9AF8001009185FFA81FAB80928BF4FF00E0937F0780040F0B28007F0180084 +:202EC000182800F0AD80307F814540F0A9804FF00009CDF800900899B0895246434619F026 +:202EE000F1FD032800F09C80002807F078074DD117F0180F18D195F8310028B1B089414683 +:202F000001223B460EF004FC09984FF6FE714A463B460EF0FDFB002838D14FF6FF70ABF82B +:202F2000000039E00810002047F00107780928BF47F00207B089394619F050FD90B1817910 +:202F400011F0180F0ED0417901290BD154B14088B5F848101EF028FC20B1437813B160787F +:202F600098425DDCB089414601223B460EF0D0FB60B94FF6FF70347AABF80000002C0CBFFC +:202F80004946B169B089524622F034FCBBF800104FF6FF70884243D1012000900899B08995 +:202FA0005246434619F08EFD099839461DF0E6FF698F81422ED1099823F045FC60B1007911 +:202FC000012818BF022807D1099804A921F01FFD08E0C0460404012022F0B0FD014604A8AB +:202FE00023F08EFC307A012803D1B16906A823F087FC06A8009004AF0197B06A407840F0A4 +:20300000300002900999089BB0894A4611F0F2FF48460CE0B06A80F805A021F0B3FD06E096 +:203020004FF00009F4E70999304610F085FC099009980FB0BDE8F08FFE0401207A010020F9 +:203040002DE9F04FAD4C04F12C000768ADF1540D17B1002087F84500DFF89C82002517F1C5 +:2030600048030BD0BF6DA34E73612FB940460068D0F84C05804773695868706023F05AFCAE +:203080001390082014F086F91AF0E6F8464610B181A023F0CBFD1CF0C3FB684623F03AF8F4 +:2030A0000427284669468DF8007023F0ADF9206422F072FF09A823F0FFF8284609A98DF8B3 +:2030C000247023F001F9A06322F070FF0DA823F003F928460DA98DF8347023F005F9A16B9D +:2030E000E06319B974A023F0A1FDE06B10B977A023F09CFD206C10B979A023F097FD306872 +:20310000D0F8E00380473068D0F8180280473068D0F8F0028047404600682F460726A03083 +:2031200001687B5823B11846804740460068A030761E07F10407F3D1D0F8B8028047EB20ED +:2031400023F044FAE06A2F4670B105A8FF21082218F044FEE06A05A9082221F0EDFF04F1E9 +:203160002C06012818BF3768654A0CCA05A8391C80E80C0021D1082016F022FF5FEA0008F1 +:2031800056D0A8F10206032723F005FB06F8020F7F1E4FEA20207070F6D13020F82706F8F2 +:2031A000020F4146082204F1480088F8077022F0F5FC40461EF05EFC04E004F148000822DD +:2031C00022F0ECFC0120082105AA23F0A7FA04F14806002818BF092826D121F08AFC8008BF +:2031E0001DD205A8FF21082218F0F8FD07AFFF210822384618F0F2FD0120294608223B463C +:2032000022F0CEFF80B9384605A9082221F094FF28B930463946082222F0C0FC04E00120C9 +:203220000821324623F080FAE22031461EF0C2FD21F05FFC400834BF2F1C0127314E55200C +:20324000012106F1320223F069FA18B917B1284620F0FCFB2C4EE22006F1400121F010FBCD +:2032600038461BF0AFFD05A82946102218F0B6FD707830F001004ED1DFF8908005A9102221 +:20328000404621F059FF002842D105A84146102222F084FC3FE0C04652616E646F6D5F73B4 +:2032A0006565644175746F6D617469632829206661696C656400C04641455343434D206F22 +:2032C00070656E206661696C656400C0414553454342206F70656E206661696C656400C0AC +:2032E00054524E47206F70656E206661696C656400C046C0D405012014010020D4DB002078 +:203300001083020068060120E40401207880020005A820F06BFB6220102105AA23F0FEF9F7 +:2033200028B927B16220102105AA23F0FDF905A82946102218F052FD384612F03FFD38468A +:203340001FF056F9384613F083F87078A8B905A820F04CFB40F20110102105AA23F0DEF9B9 +:2033600030B92FB140F20110102105AA23F0DCF905A82946102218F031FD1FB12846012195 +:203380001FF024FD282016F01BFE0028606400F04081206B616B221D1AF07AFDCA49087057 +:2033A00010211BF055FE616C201D0860206B616B04F108021AF06CFDC2490968D1F84C139F +:2033C0008847616C04F108004860206B616B04F10C021AF05DFD0DF071FB616C04F10C00B7 +:2033E0008860206B616B04F110094A461AF050FDB64F7870B18EBD70381D0180303006F113 +:203400005001119007F1340023F07AFADFF8C08296F8230006F148032946FB604FF4B472C8 +:20342000387008F5057018F0D9FC04F1340B04F1300A626CDBF80010DAF800003C2308F553 +:20344000057C0C324FF6FE7E5B1E2CF806EBF9D1C2F8009004F114021AF01AFD9F4B9D494E +:203460007B629D4A08709E4B606CBA6004F11802DBF80010BB6204F114030361DAF80000F0 +:2034800012921AF005FDDFF85C9289F80700022289F824204FF6FE70A9F81C0022F04EFB7B +:2034A000914811990560AF4823F02AFA4046FF210E22801C18F092FC8C488E4B83608E4A86 +:2034C000C2608B49416005708C4B03618C4A42618E4939618B4B83618B4AC2618C4B7B6156 +:2034E0008C4ABA618E488C4B8C4AFB618E4910618C4FD16009F1300097601EF0CDF81EF0A6 +:2035000065F8984809272C307F1E40F8045BFBD14F46F87948F201011CF0F0FEF8794FF4F2 +:2035200000411CF0EBFEF87948F221011CF0E6FEF87948F222011CF0E1FEF87920211CF021 +:20354000DDFEF87921211CF0D9FEF87922211CF0D5FE606C12994161DAF80000DBF8001099 +:2035600004F11C021AF094FC704F48F2150138701CF0C4FE387838211CF0C0FE6D4B6E4AD6 +:20358000FB606B483A61616C786102234FF6FE72DAF8000087F8283004F11C038B61DBF886 +:2035A00000103A8404F120021AF072FC634904F12003634A0870634F606CDBF80010C36140 +:2035C000DAF80000176004F124073A461AF060FC65497378087023B991F833300BB10221E4 +:2035E000F17148F202011CF089FE606CDBF800100762DAF8000004F128021AF049FC2070B1 +:203600005149087022F0C4FF4870616C04F1280048621BF073FF12F00FFD139823F00AFB29 +:203620000FF03EFA21F086FB26480068D0F8D40090F8430021F090FB22480068D0F85824D2 +:2036400029460120904722F079FD40481D4F05707868C068007830B938460068D0F858247F +:2036600028460146904717F051FA3A4F3D703848058145818581C581058245828582C58282 +:2036800005832B464583344C858307210360344A43603248257021F0A3F816F0BFFB1EF0AC +:2036A000E3FF1DF041FA7078022807D13078012804D14FF4004001210CF070F915B0BDE8DC +:2036C000F08FC04614010020671B0120E006012020010020800A0120892001004D81010021 +:2036E000F9620200C40301204805012020090120DDC700004941020099D901003B2E0200BF +:20370000F14602006913020019470200D5690100D54401003D4B02009DA40000FC09012046 +:20372000F1420100E9B40100193401001C070120152A02001540020031480200C40A012023 +:20374000D00A0120751C020028180020701B0120D8180120691B0120681B0120EC00002069 +:20376000B9690200D8030120680601202DE9F04F0446B54DB5480021ADF14C0D001D2E6831 +:203780000768A0780C910146102910DC102900F0AC80002900F0AE82491E012940F2FD81BA +:2037A000891E00F05581491E00F0248144E3113966D0491E1ED0491E03D0491E00F042834E +:2037C0003AE3207967798DF81000E0788DF8117022F02CF8002808BF022005D00C3004A95B +:2037E000022222F0DBF90C988DF82000132108AB01223BE3204634460421C61C304621F0E0 +:2038000069FE0C9F0121002C35D0A268904203D02468002CF9D12EE06CB3361D304622F00A +:20382000FFFEB778804657B92868844218BF251C2068286020461EF01DF90C991BE0B81C0A +:2038400016F0BEFB051C04BF10210C9F13D00C9828706F7061683A46A81C414422F09EF9B0 +:20386000BE1C642012212B46F2B21EF0D1FD28461EF000F9FDE23170334612217770F4E268 +:2038800020460126C41C8DF82160204622F0C8FE6F68A3780FB3B3B938680090686818300F +:2038A0000190787E0290B87E03903969BA8AFB8A381D08F0A5F98DF8210068681EF0DAF87A +:2038C0000C9868600CE03968E41C1A4609180846214622F063F90C9800E010208DF82100F1 +:2038E000112132460DF12103C0E22546BD4C89462D1DA07815F8011C002937D0491E10D014 +:20390000491E02D0481E67D064E0287822F08CFD002869D041680978E170007820710C98C9 +:2039200054E02D7800285FD1E1200DF1230120F0A7FF9DF8230085424AD00126A670304631 +:2039400022F024FC0C9809A98DF8240052201EF031FA28461CF05AFC002839D0657020781D +:203960003146642222F0A8FFBA202FE000283BD1E1200DF1250120F083FF9B4E06F13C079A +:203980009DF825103878884222D0DDF8308001255220A5700DF126018DF826801EF00AFA5D +:2039A00096F83C000A2805DD1B2803DAE12039461EF000FA8DF8265052200DF126011EF0E1 +:2039C000F9F9404622F0E2FB4046A07002460CE00C9A0AE00220F9E7284622F021FE0C9ADF +:2039E000A97822F0FBFE00B901228DF822200DF122031FE210218DF82710E1788046DFB138 +:203A00007A681278384691420ED03F683FB17A681278914205D038463F68002FF7D1022022 +:203A20000BE03968016002E0B1493868486038461EF020F80C9800E001208DF827000DF182 +:203A40002703CDF83480A5E0FC0A0120BC0A012001218DF828100C990D900C2204A818F02D +:203A6000BDF925460224ED1C8DF81840284622F0D7FDAF1CADF8100017F8010B8DF819008C +:203A800017F8010B22F0D0FC8146384622F0C8FDBD1C0E9015F8010B15F801AB15F8018B2F +:203AA0002E788DF82900700016F08AFA0F9000286CD06D1C4EB183463746284622F0B0FDBA +:203AC000AD1C7F1E2BF8020BF7D1B9F1000F57D0CDF8409015F8013BDDF83C903746AB46BB +:203AE0000C2FBDF8105011934ADA28461BF00CFBC82815D14FF6FE701BF006FBC8280FD1C9 +:203B0000C34890F8CC38012100F6D40C0C981CF8082B9342C4BF131C081C491CC829F6DB59 +:203B2000C74C4FF6FE7604EBC0046068668018B11DF0A0FF0C9860606FB17E00304616F065 +:203B40003FFA6060002808BF102419D060684946324622F023F8C9486580007867700DF121 +:203B6000290620701099CDF800B00E9A0196119BCDF808A004A8CDF80C8008F041F8044698 +:203B80000F988DF828401DF075FF02E010208DF828000AAB0D9881464CE194F801B00121A4 +:203BA0000228814604F103048DF82B101ED114F8010B03288DF8180005D0204622F030FD0F +:203BC000ADF8100004E004A82146082221F0E6FF083414F8010B8DF81900204622F020FD92 +:203BE000A41C11E0C40A01205001012002208DF81800204622F014FDA41CADF8100014F8EA +:203C0000010B8DF819000C98ADF81A0014F8010B22F00AFC8046204622F002FDA41C0D90CD +:203C2000B9F1020F14F8010B14F801AB14F8017B8DF82A001CBF14F8016B06F10A0006D197 +:203C4000204622F0EDFCA41C064606F11400B8F1000F80B240D0FA2830DD6C68002C3BD1B7 +:203C600006F11C0016F0ACF904466C6024B30C9804F11C0504A98DF82B000C222560201D92 +:203C800021F08CFFC4F810800D98A082E6829DF82A50257684F819A0A7760F23E376784CC2 +:203CA000207808214FF47A7222F006FEB8B1207808211BF0CDF912E010200EE000940DF161 +:203CC0002A000D9A019041463346CDF808A004A8039707F095FF00E002208DF82B002BF077 +:203CE0001F0BBBF1200F40F0C4800DF12B03A1E0BC0A01204FF0100A89468DF82CA05046A8 +:203D000016F05EF9071C00F094805D48E41C7860207822F089FB00287CD120780C9E387015 +:203D2000B04687F80C80142016F04AF90028B8606BD014F8011B017062782178A61C01EBD0 +:203D40000221418031787278B41C01EB02218180817914F8022B01F0F00102F00F020A43A7 +:203D60008271B96814F8010BC871BD68EB79464673B1580016F024F9A860B8688568002DE8 +:203D800008BF564604D03046BA68D179814231DC2078B9680873BD682B7B73B1580016F0B9 +:203DA0000FF92861BD682B69002B08BF564606D0641C4046297B814210DC102E2BD1A868B2 +:203DC00010B11DF057FEBD68287B18B128691DF051FEBD6828461DF04DFE1CE062782178E8 +:203DE0002B6901EB022123F81010BD68A41C421CD0B2DFE7637821789268451CA41C01EBDF +:203E0000032122F81010E8B2BEE7564603E0C04620010020B8268DF82C603EB938461DF0CE +:203E20003BFC8DF82C009DF82C0010B138461DF021FE0BAB4946DBE402200C9019E0C046AD +:203E4000EC0900200C988DF810008DF81100E07804A921F09DF89DF8117014219DF81000E3 +:203E60008DF81D7007AB8DF81C00022264201EF0CFFA0C9813B0BDE8F08FC046FE040120AA +:203E8000671B01202DE9F04FADF13C0DC54C0B90C3480C91002147780E919FB137F00106F2 +:203EA00008D0022F12D1207900F0F80141F00201204605E02046017901F0F80141F0010118 +:203EC000017103E0207900F0F8002071261D3078402537F00102657100F00700307005D1BE +:203EE0008E20A0716FB940F0010009E0022F08D1AB4980200978A071012902D140F008005C +:203F0000A0710E99F170317150256572A020B071F171B072F172A089099140F43050A0813A +:203F20002174B2B1022F1CD1012019F00DFE28B9206820F00F0040F0020004E0206820F000 +:203F40000F0040F001006FF30F1048F22021014306E0216894484CF21017084047EA0001B7 +:203F60002160934B9149A0791F780A9381F8320067B90E981AF026FF8C4890F83200000984 +:203F800011D30E9808A98DF8200009E0084690F83200000907D301200DF121018DF8210086 +:203FA00052201DF007FF1BF0A9FA20F0A2FD800838BF0E9803D30E981FF048FD01200028E1 +:203FC000DFF80CA30D9040F0D8800FF031FE5FEA000B40F0C380754ADDF83880212074211F +:203FE0002432174622F09AFB002859D12120414674223B4622F0D4F8002851D16B48408F8C +:204000004FF6FE7181424BD0684890F84A004FF00108082806D0042804D010F0A1FDDDF8CB +:2040200038803DE0C14642200DF122018DF822901DF0C0FE07F12F0143201DF0BBFE07F1D6 +:204040002C0147201DF0B6FE07F11C014A201DF0B1FE07F11A014B201DF0ACFE07F124017E +:2040600028461DF0A7FE07F1160153201DF0A2FE07F12D0154201DF09DFE07F11801E1209D +:204080001DF098FE494890F83200000938BFDDF8389052200DF122018DF822901DF08AFE36 +:2040A0000E9D17E0DAF804100E9AA80000EBC5000C23401881460090294601201EF0A6FB5B +:2040C00030B999F80000FF2804BF099889F800006D1CADB23248BAF800104078A942E1DCD6 +:2040E00030F0010001D10FF0A7FC9548001D006800B180471EF000FCB8F1000F1BD022F092 +:204100005FFA0A99888318B9307800F0F800307023484078022818BF012104D1234A09986E +:20412000032182F84A000A98393741703946143022F0E6FB01E04FF0090B804D0999184F14 +:20414000A81C0180787818B91DF062FA38464078BBF1000FA94605D10E9904E01048DFF880 +:20416000DC91407801210D9110490A9D91F83C20012707FA02F1E96087E00FF059FD10F054 +:20418000EFFC0A4A21207421243222F0CDFA02A8FF210C2217F022FE0E9D574612E0C0467C +:2041A000E40401204C1A01200000FFFF50010120C4030120294601200C2202AB1FF068F93C +:2041C0006D1CADB23888A842F4DCB848407830F001000ED102A8FF21102217F0FFFD0E9D1B +:2041E00003202946102202AB1FF052F96D1C332DF6DB5348006800B180471FF08FFF099881 +:2042000006220E99ADF8100002A817F0E7FD142015F0D6FE5FEA00081BD0A34810300768A2 +:20422000A7B103270225A8B202A90622404421F0B5FCAD1D7F1EF6D104A94046022221F0CC +:20424000ADFC4C201421424622F06EFA40461DF011FC182015F0B4FE071C10D00E9D18229B +:20426000294617F0BBFD0620294618223B461FF00FF96D1C032DF6DB38461DF0FBFB17F097 +:2042800013FF8A48DFF8B49040780D99864D012966D1B44F2437E8B1012807D002280BD190 +:2042A000307800F0F80040F0020004E0307800F0F80040F001003070A34820F08BFE00284B +:2042C00008BF09980BD00A9A04210320917206E0DC0A01203178022001F0F8013170DDF894 +:2042E000288088F8010022F056FA0B996F4E00F07F000818643080B20E90F06B0221C8F8A1 +:204300000C00FF201EF062FD96494FF6FE70431C48870E46F0870998A1F848301EF048FE74 +:2043200062484078012810D10C9801280AD0099902A8082217F052FD02A804E0100A0120D5 +:204340003409012009981DF015FD212074213A4622F0EAF9099802211EF038FD534840789A +:20436000DDF834A018B9A08940F00100A0812F6987B9122015F024FE0646002E2E616ED0D0 +:204380004FF6FE70B61F0327411C26F8060F7F1E7180FAD1BAF1000F61D1099906AB4C20D7 +:2043A000022221F0FDFE002852D1BDF8180000284ED004284CDA182015F002FE03274FF077 +:2043C00002084FF6FE7B0646099C2B691FFA88F14C2006221B1921F0E3FE78BB2869015B24 +:2043E0008B452BD056B300962018099A4188182306201EF00BFA30692A6900F2E93333616D +:204400001019418805F11402880000EBC10029691350081973694188880000EBC1008018E3 +:2044200029694360081941881822334606201FF02FF809993046182217F0D0FC7F1E04F197 +:20444000060408F10608C0D116B130461DF012FB164B099971200822483321F0A1FE13481F +:204460004778381C06D121F069FB21F055FF0F48477817B121F048FF18B10120E870099E59 +:204480002E713248324EC9F80C00C9F810607FB137F0010003D120F0B3F82F480BE020F02C +:2044A000AFF82E4807E0C046CCE80020E404012020F0A6F82A482749BAF1000F086019D07A +:2044C000284890F86500A8B92748407890B9DDF82480622102AA404618F068FB02A84146E4 +:2044E0001FF078FC404614F05FF902A81022414617F074FC0A98006950B10A9C1034076818 +:2045000020681DF0B7FA0A99384600280861F6D10A9A099F01200146107002F109045772DF +:204520008520093222F0FAF828B9852039460122234621F035FE0E9821F040F920F034FB93 +:2045400050460FB0BDE8F08F1407012001F00000E9630200C808012091780100995402007D +:20456000F181010050010120E40401202DE9F04FBE48C84CADF1340D069025694068012111 +:204580004FF0E047C06809934FF000080170C24808921F4080F800804FF0020000EA020011 +:2045A00008BF002840F0E682DFF8F092DFF8F0A21E4611464FF4803018EA060700EA01000A +:2045C00008BF002833D141464FF4003011EA060700EA020008BF00280ED137464FF48000EC +:2045E000394000EA020008BF002800F0B78285F8048019F0B9FDB1E285F80480EB201EF0D1 +:2046000091FE4A46514682F800800878862801D11EF00AFF22F08EF9E1690A6882F8048080 +:204620000968E16122F006FB21F09AF996E285F804801EF0DFFE81262778A4F80C8099495C +:20464000A770994D0860994B2E70FF221A702169069E087A801E81B230684A46D0F8000156 +:2046600082F80080C0890B918842C0F26B82E1690831096804F1180001600426A6810B989C +:20468000657EA17E04F11902C01E80B2069EE37E0B9005EB01205178C1F301193168608136 +:2046A00001F1B80CDCF80010237109780792002908BFB9F1020F00F04582B9F1020F00F3A2 +:2046C000418219B110F0070F00F03C82667800F00705AD1E022D08BF002E00F0338231B139 +:2046E00051460978862902D1002D40F02B82001300F00200022864DA35435AD1DCF81C0016 +:2047000090F88300022851D0E1690C31097805A801700527A78122F00DF95546064628782A +:20472000862840D106980068403001680F6837B9D0F80C05804706980068006C07689DF95D +:20474000140022F035F9787706980068016C096881F81E80006C9DF914100068C1773046DF +:2047600022F068FA2679678922F0E4F851460A7807F01007862A15D1BA4D05F11E031A88CB +:20478000521C1A8087220A7022F054FAE879B04206D11FB9404615F043FE07E01B20FAE7BD +:2047A000E920F8E70646304622F044FA21F0D8F8CAE151460878862803D11EF035FEA7787A +:2047C00066788FB186B9012F00F0BC816089022F03D110F0070F40F0B581032F05D100F0BD +:2047E0000701032901D0ADE16089010980F0AA81011301F00201022902DA810A80F0A2816B +:2048000007994978C1F3810BBBF1010F4FEAA1110A9100F09781012900F09481B9F1020FC3 +:2048200014DA00F00701012918BF03290ED1BBF1000F0BD10A9F002F00F084810699096812 +:20484000AC3109680F78002F00F07C81BC49B9F1020F0DD00A9E11F80B708A5DB918CFB265 +:204860005EB3C10929D3BF1E12E0C046140100200A460A990BEB0207891809793A79521825 +:20488000C109D7B214D20A995BEA010615D0BF1CFFB212E0B4180120B40A0120711B012014 +:2048A000741B0120501B01206F1B01202D1A00200A995BEA010608BF02270B9AC0F3002152 +:2048C000781A61718242C0F23D81069E1046C01B4018316880B2D1F850122081743080B2A6 +:2048E000884700286678606100F02C814146742217F074FA84F8038062891EB9C14902F036 +:2049000020000870BF4861790678C446002E30D000292ED102F00700032808D0012828D122 +:2049200006980068D0F8D40090F882600EB306984068406906781EB121F060FBFE2815D0F7 +:2049400006980068D0F84C02804750B906980068D0F84402804720B96289617994F803C0A3 +:2049600007E00420E0706289617901E00420E07084466569268905F1740305F17400AB6594 +:20498000079B686093F801A02E812089CAF301190029A5F85C001878AA8100F0780049EADA +:2049A00000004CEA000028744FF0FF06AE730CBF2079404685F83AB085F849000A9885F88A +:2049C0003000A089002FA0EB010086B2A68100F0B480E169E78068463A468919083114F082 +:2049E00095FABF19B8B2A0812846017C4FEAAA0212F0030F02F003076D4601F0400B42D0E4 +:204A0000B9F1020F434601D1C9090BD29DF801209DF8001001EB0221A0F844100DF1020576 +:204A2000A0F84210814EB0F84410B6F846208A4203D04FF6FF728A4223D1032F14D06A78A0 +:204A4000297801EB022189B24186B6F84420AD1C01208A4214D04FF6FF728A4218BF181C6B +:204A60000EE0C0460418002060692946323021F047FF60693B363146323020F07FFF083537 +:204A80000346002B56D00798407886111ED06169B9F1020F03D0087CC00903D309E05BEAF7 +:204AA000070306D16A782878AD1C00EB0220A1F84200032E05D068782A7802EB00220A85BC +:204AC00004E060692946283021F01AFF06990968AC310A686089167886B1B9F1020F0DDA89 +:204AE00000F00702012A18BF032A0BD162692FB94F4BB2F842201B8893421BD100F00702FC +:204B0000032A05D0012A18D1886A90F88200A0B1D1F89C116069884778B90798817867698B +:204B2000407884F80380C1F3011100F078000843387402E019F018FB06E00BF087FC03E054 +:204B4000D487020020F0FEFE21F0F4FEE1690A6882F804800968E16122F06CF80899099EBE +:204B6000202047460840374008BF002830D020F0B1FE2DE02F4991F90000002803DD91F95A +:204B80000000401E08702C4991F90000002803DD91F90000401E0870114640461E464FF058 +:204BA00080770840374008BF00280DD0234991F90000002803DD91F90000401E08702048AD +:204BC0000121017021F0CEF885F8048019F0CCFADFF864C09CF90070B7B108994FF0E0472C +:204BE0000220374000EA010008BF002816D09CF90000002812DC06980068D0F84C058047CB +:204C00000CE0C046711B01200E48069F80F800803868D0F85824414608469047069840682C +:204C2000C06880F800800DB0BDE8F08FD40501201A060120B70A0120B60A0120B80A012092 +:204C4000B50A0120B20A01202DE9F04F0446B54EA578F06A4FF0000BADF14C0D2946312974 +:204C600011DC312900F0E280DFF8C882B24F142914D91C3900F06281491E00F01B811339E8 +:204C800000F0E9807FE2323900F0BA80491E69D0491E012929D9891E17D074E2DFE811F0E6 +:204CA0006402A502A102500299027302730224024E010A010D02F8018F0273028902DE0175 +:204CC00073027302C901B801760240B1C06830B1E01C21F0A5FCF16AC968884700E00320E9 +:204CE0008DF8380036210EAB61E201270028A8468DF839702ED0406A60B3204602A920F05C +:204D00009BF9342D044618BF584602D121F088FCA41C2578E0B902A821F07DFA641C0128A6 +:204D20000DD1BDF80C00294622461FF06DFBBDF80C00012803D1E22021461DF03BF8F06AC5 +:204D4000466A02AB93E803002A462346B04702E0042000E003208DF8390041460DF1390320 +:204D60003D46A5E0002840D0C06900283DD0204602A920F061F9054602A821F04CFA0128A5 +:204D800018BF584603D1BDF80C0021F041F90446284621F045FCAD788046F82DA8BFF72521 +:204DA000A81C5FFA80F9484615F00AF9071C1AD0A4B9F06ABE1C02ABC469009693E803003B +:204DC00042462B46A047041C08D1584638704A4633213B467D7061201DF01AFB38461CF035 +:204DE00049FE1CB90DE2102400E0032408A85946022216F0F3FF8DF82040332108ABFCE139 +:204E000068B1806A58B104A9204620F015F9F06A826A04AF97E803009047014600E059463D +:204E200002A820F0AFFE32210422D8E160B1806950B1204602A920F0FFF8F06A826902AFD0 +:204E400097E80300904700E003208DF83A0031210DF13A03ABE101258DF83B5010B30069BC +:204E600000B3204602A920F0E7F8042120F032FB5FEA000814D015F0A3F8F46A071C14D0E3 +:204E80005946424616F0AAFF246902A803C842463B46A0478DF83B0038461CF0EBFD04E034 +:204EA000052000E003208DF83B0030210DF13B032A46A3E1E41C8DF83CB0204621F0B0FBF6 +:204EC000A846092D064609D0A01C21F0A9FB0746201D21F0A5FBA41D054602E0A778E57873 +:204EE000241D242E03D12088352606AC069030461FF006FA7919884216DB27B93046294669 +:204F000022461FF081FA30462946224621F00CFC30B9012E0BD1E22021461CF04BFF04E0A2 +:204F20000A2002E0D4DB002002208DF83C0041460FAB3CE1671B01200C8802002646F61C9E +:204F4000304621F06DFBA9468046B8F1240F46D021F05EF80446082D08BFB67803D0B01C41 +:204F600021F05EFB064640461FF0CAF986422BDA5CBB801B85B2F82DA8BFF725A81C5FFAA8 +:204F800080FA504615F01CF8071C1BD0B81C59462A4616F023FFBB1C404631462A4621F07A +:204FA000FFF848B958463870524649463B467D7061201DF02DFA00E00A2438461CF05AFD7A +:204FC0001CB91EE1102400E002240AA85946022216F004FF8DF8284049460AAB0DE13520D1 +:204FE0005946042207AB21F0DBF838B9BDF81C20584602210425ADF8262002E001205946FD +:2050000002258DF824008DF8251009AB08214FE7E01C21F005FB242802D01FF071F900E06F +:2050200058468DF82C00001213210BAB8DF82D00E3E0E01C21F0F4FA0546601D21F0F0FAF2 +:205040000146242D03D0284621F0EBFB00E058468DF83F0012210DF13F03A8E0E078211DAD +:2050600070B1401E0AD10878012805D020B1522010A91FF005FC08E0522002E0022002E00C +:20508000E0201CF097FE8DF840000F2110AB8EE041460125087814F8031F8DF842500429B2 +:2050A000A8BF022003DA37F8111019F03BFD8DF842000B210DF14203FAE6E41C207804281F +:2050C000A8BF02200ADA601C21F0AAFA267841460246087837F8161021F0EEFB8DF843002E +:2050E0000A210DF1430362E0E01C21F099FA0646601D21F095FAE779E51C0146242E19D013 +:20510000B94205F1050510DD30465A4621F006FB8DF844009DF8440009280ED16FB1304637 +:2051200039462A4621F000FB07E030462A4621F0F5FA00E058468DF84400072111AB36E066 +:205140000127E41CE2208DF8457021461CF032FE30B938460821224621F0E6FA8DF8450095 +:2051600003210DF14503FBE5E078284C30B1401E47D121F031FA01202060FEE721F02CFAC9 +:2051800001202060FEE74FF0020B3AE094F903001F4F8DF83D003868D0F830240DF13D016B +:2051A000E020904714210DF13E038DF83E00012224E08DF841B00E210DF14103F7E721F0E4 +:2051C000EAFA8DF830000C210CAB00128DF8310013E0E22002A91FF053FB0421082202AB91 +:2051E0000CE00C4B02210A2208E05920062701218DF834000DAB8DF83570022261201DF020 +:2052000007F9584613B0BDE8F08FC0467C05204314010020C0870200D249D14A03462DE90C +:20522000F04301F108009D78177800680024ADF1440D2A46402A2ADC402A00F0DE81202A3F +:2052400014DC202A00F010820A2A45D9103A00F03282521E00F02582D21E00F01982521E60 +:2052600000F00F82501E00F0048263E1B2F1210000F0F481401E00F0EB81401E00F0DE81F5 +:20528000401E00F0D481401E00F0C98152E14A2A11DC4A2A00F08E81413A00F0A381D21E4D +:2052A00000F09C81521E30D0D21E00F08B81521E00F084813EE1B2F14B0000F06881801E9C +:2052C00000F06181163800F04F81401E00F039817C3800F031812DE1121E00F0CE80521EA4 +:2052E00070D0521E00F02A82521E00F01582521E00F00282521E00F0F281521E41D0D21E43 +:2053000000F0DE81521E1DD014E1184606A9C01C20F05EFB2E468DF81E0048B99DF81800D5 +:20532000BDF818708DF81F0038128DF8200005E00DF11F00FF21022216F050FD03220DF1E1 +:205340001E031CE0DB1C5F782E460D4638B9684620F058FF012069460DF0B4FCA8603FB120 +:20536000052F03D064211DF083FD03E0012129701DF012F88DF836400DF13603012235468F +:20538000EFE118468DF83740C71C384621F048F9BF782E46C0F304213FB9052903D04FF66F +:2053A000FF7181420BD1204607E0052903D04FF6FF71814203D14FF0FF30D64908600DF151 +:2053C0003703DBE7202014F0FBFD061C00F0CD81FF21202216F002FD731C0120214608228D +:2053E00020F0DEFE751C071C18BF01272146042205AB842020F0D4FE083560B99DF8170049 +:2054000028709DF8160068709DF81500A8709DF81400E87001E047F002078320214602225F +:2054200007AB20F0BDFE2D1D38B99DF81C002870BDF81C000012687001E047F00407ED1C84 +:205440006120214601226B1E20F0AAFE08B147F008072146102262202B4620F0A1FE08B10D +:2054600047F01007012120223346672037701CF0CFFF30461CF0FEFA77E1264637F0010093 +:205480008DF83C600AD10FA818F070FF9DF83C1080460E2000EB4100C7B201E0A0460E276C +:2054A000384614F08DFD5FEA00093DD0054621460822012005F8016B2B4620F071FE21F01A +:2054C0007FF80835072305F8010B001205F8010BA84A05F8013B1078A74905F8010B4B785B +:2054E00033F0010316D19DF83C0028709DF83C308BB141466D1C20469DF83C2082420ADDE6 +:205500000A782A7031F8022B401CC0B212126A70AD1CF1E72E70672021463A464B461CF003 +:2055200077FF48461CF0A6FAB8F1000F00F01D8146469EE7022418E122464720E02113461C +:2055400011E11846C11C4A7A087A00EB02208A7A8DF82E400EF0D8FD0DF12E0300E1C046EB +:20556000E5040120CCE8002018468DF82F400822C01C0146684620F011FB68461AF0A0F894 +:205580000DF12F03ECE018460FF0C0FCEDE0D91C6846082220F002FB8DF80840CDF80CD0E1 +:2055A00002208DF8090002A816F022F80CAB8DF83000D5E018461CF049FFD6E018461FF07B +:2055C00072FAD2E0DE1C307871781FF069F80222307000127070294630466FE0184612F068 +:2055E000F3FFC2E0D81C21F01BF8ADF80200684616F02EFC01AE0822EDE7D91C01A8082205 +:2056000020F0CCFA684618F073FBBDF802000DF122038DF8220000128DF8230016E0F5204A +:205620008DF827400DF126038DF826000EE0F52011460DF131038DF831003AE0F520FF2715 +:205640008DF82A000DF12A038DF82B70022288E0F5200DF132038DF8320081E0F5200DF151 +:2056600033038DF833007BE0F5200DAB8DF8340076E068462146092216F0B0FB16210922B2 +:205680000DE068462146062216F0A8FB152105E068462146062216F0A1FB142106226E462C +:2056A0009AE7D8781CF02CFF11210DF135038DF83500012256E01A78D81C1021034651E036 +:2056C00021F0BCFA054620F057FF2C496843B0FBF1F1684620F056FA09210422DFE7DE1C87 +:2056E00062201EF00DFE01463246622021F01CF80EAB8DF8380033E0DE1C61201EF000FE99 +:2057000001463246612021F00FF80DF139038DF8390025E0900A0120D81C04211FF0DAFE79 +:20572000049084201EF0ECFD014604AA842020F0FBFF0DF13A038DF83A0011E0D81C20F0A8 +:205740006FFFADF81A0083201EF0DAFD01460DF11A02832020F0E8FF0DF13B038DF83B009D +:205760000122294667201CF053FE204611B0BDE8F083C046C4030120E404012040420F00EC +:205780002DE9F04FCF48D04CDFF840830F46390CADF1240D80F06582790927D30023037015 +:2057A000D7494370184620F065FFD649012020F061FFD549062020F05DFFD449072020F090 +:2057C00059FFD849082020F055FF0522D6498DF80C300DF10D0020F0E1F94120802106229E +:2057E00003AB1CF015FE87F0100044E2B80828BF87F0020080F03F822068390931D217F406 +:20580000706F08BF002000F03682380B04D3002020F008FC87F40067F80A04D3012020F0E0 +:2058200001FC87F48067B80A04D3022020F0FAFB87F40077780A04D3032020F0F3FB87F462 +:205840008077384617E22168884205D0016829601CF010F9286804E0016821601CF00AF93E +:20586000206808BB606858B1C27EC17E521E491ED6B2C17626B960681CF0FCF80020606070 +:205880002668002E08BF00280BD04446207808214FF47A7221F010F818B12078082119F05C +:2058A000D7FB87F00800E6E1017B491E0173C9B20029C8D005460068D3E70546D9F8046050 +:2058C00028781A280EDC1A2854D0401E00F06C81401E00F02B81801E00F0B581801E00F00F +:2058E0001781BBE1243800F0A881AD3800F09E81801E03D02A3800F08B81AFE1A87C09304F +:20590000C0B2804614F05CFB061C00F0A781A97800F8011B6988091200F8011B99F80C10B8 +:2059200000F8011B99F80E1000F8011BB9F80E10091200F8011B99F8101000F8011B99F83C +:20594000111000F8011B99F8141000F8011BB9F81410091200F8011BAA7CA96920F01EF9E6 +:205960004520FF21424633461CF052FD30461CF081F873E1B5F824A0E97B0AF114001FFAFA +:2059800080F820F02BFF002640B9A87B032805D0B8F1F00FD8BF4FF0810B16DD08F10A0013 +:2059A0004FF0820B1FFA80F8B8F1FA0F0DDD0AF1100014F005FB061C00F0508106F11000F5 +:2059C000A8EB0A0470601FFA84F8404614F0F8FA079020B9002E00F041813046A0E00446B5 +:2059E000A87804F8010B6888001204F8010B287904F8010BA888BBF1820F4FEA202004F8EA +:205A0000010B1AD1A87B04F8010BA87B032805D0A8792070E8880012607004E0A91D20462E +:205A2000082220F0BBF8E87B083404F8010B287C04F8010B288A001207E0A87904F8010B52 +:205A4000E888001204F8010BE87B04F8010B287D04F8010B687D04F8010BA87D04F8010B8A +:205A6000687E04F8010BE969204620F08BF8241DBBF1820F04D0002004F8010B504606E0F7 +:205A8000002004F8010B04F801AB4FEA2A2004F8010B0E480078DEB10B4909680A4B3160A3 +:205AA0004FF47A721E6008210F23337320F004FF20B106480078082119F0CAFAE869B06037 +:205AC000706807E088040120FC0A0120671B012020465444A96A524620F060F895F82C00C6 +:205AE00004F8010BA88D5FFA88F85946001204F8010B95F82E00079E2070442032E7C04664 +:205B0000D1E3010093350200351902004D370200A878401DC0B214F053FA002800F09E80BA +:205B2000064623E785280200C087020029790B2000EB4100C0B21FF009FA002800F08E8074 +:205B4000A9782E798DF80010EC788DF802608DF801400DF10301FEB1AA792C79EE880A706E +:205B6000022C4FEA26218DF804100DF1050113DB2A7A2C792E890A70032C4FEA26218DF83E +:205B800006100DF1070107D1AA7A6E890A7031128DF808100DF109012A7BAE890A703212FA +:205BA0004A701FF0D9FA59E0002E57D070788DF81500B0788DF816003078FA2819DC9DF822 +:205BC000150000F01E00162811DA2C499DF815000D4600F01F00820050194068091D30B15E +:205BE0008958304688478DF8140028B9BEE6012000E004208DF814009DF8150020F01F00CA +:205C000020287FF4B3AE60200021032205ABABE66878AE78EC788DF8180006AB8DF81960AB +:205C200003228DF81A404420802103E06B1C4520C02101221CF0ECFB10E0F0783346401D67 +:205C4000C2B26920F0E7F078401DC4B2A11E701CC9B220F0E7F8A41904F8010C48461FF01D +:205C60007BFA0748007819F0C5F95FEA00097FF424AE87F4004009B0BDE8F08F8804012045 +:205C8000671B01202DE9FC47D44C0F460646F80B80F00C826078B90F80F0AC81B90880F0D8 +:205CA0009F81DFF84C83F90A80F00281390B80F0CC80380907D2F80FC0F02E8227F08047C9 +:205CC00017F05CFD28E220F035FE81461FF084FA002800F0B480082020F0C0FC002840F02B +:205CE000AE80802020F0BAFC002840F0A880684613F040FA012803D10098002800F09F80D9 +:205D000094F84102002840F09A8000250126E8B220F0E2F948B1837A3BB1867290F9090005 +:205D200006FA00F0C0B21DF0DFF96D1C032DEED3032084F8240004F5CE7020F0F5FD484618 +:205D400020F078FFC34800252A460168056050F8081CD44940F8085C04F160001FF04BF981 +:205D600040460068006B8047A168401A010BE06AC1F1FF3282422CBF08444FF0FF30E062BC +:205D800094F8300020B12069E16AB1EBC02F25D91FF032FA294600B13146081C1BD0C2482E +:205DA00040F6090101804580417B06F00F0221F00F010A434273017B05F00F0321F00F01D3 +:205DC00043EA010202732946416020F0F5FA418811F4406FFBD084F83060E5621AF0D2FF99 +:205DE000D1482946056002201EF038FF02201DF03DFD112011F036F8207818B960685030D5 +:205E000020F0AEFDC948007810B90E2011F02AF894F8310020B184F8315005201DF026FD44 +:205E2000C348A06284F82450B4F9B400B4F9B610884214BF0220072015F0C2F802E048467C +:205E400020F0F8FE27F008073AE720B104201DF00DFD0020607065681CF0C0FD38B128460C +:205E60002D6A6FF4807100224FF00073A847E06858B140460068006B8047E2686168801A56 +:205E8000C860000BC8600026E660AA4904F1600000221FF0B0F80221D4F8A00084F82410DB +:205EA00018B104F1E00020F063FD27F4006707E720F040FD06461FF08FF9D4F89810002898 +:205EC000894600F08480002900F081809A49042504F16000002284F824501FF08CF8304669 +:205EE00020F0A8FE04F5CE7020F01EFD40460068006B8047E0604FF0010884F80180284677 +:205F00001DF0CCFCD9F810006060D9F81000816AC90803D3436A294600229847404618F0ED +:205F200031FE606880F81980606811F0BBF86568D5F808A040F60A02D01F564600F1010CD0 +:205F400000E01E46736833B119888A4203D0884218BF8C45F5D100217160727B08F00F03DD +:205F600022F00F0213437373D9F80C201288904224D06046904221D02B8F03B3E96305F14A +:205F80003802518095F8440001F00F0320F00F00034385F8443095F8450008F00F0320F0E0 +:205FA0000F00034385F845307260707B01F00F0520F00F0045EA0001717300E0E1605046EE +:205FC00020F0FAF9514640461EF048FE02E0304620F030FE27F480679EE0C04668F20020B7 +:205FE0000AF036F8D4F8A00008B927F0020793E08C010010514A116841F08001116020B114 +:2060000004201DF033FC0020607020F093FC80464B480068016804208847216A81421BD13A +:20602000357ECDB1A568BDB1D4F8A8506DB1E968098840F60300884204D0E9680988401CDB +:20604000884202D106F1140001E006F110001BF071FD06E01410044040F6C411316171617A +:206060002062404620F0E6FD1CF0B8FC80B1356A30466FF4807100224FF00073A847D4F83C +:206080009800002808BF47F0020701D017F076FBF569002130464FF080630A46A84727F083 +:2060A000005739E0ADF00100601A012020F042FCD4F8B06066B306F1280106C90A234FF099 +:2060C000E0450B40154008BF002B21D106F1280191E8000306F1280595E8060006F12803B2 +:2060E00022EA090221EA080183E8060020F0A2FDB16879B1B9F1000F08BFB8F1000F09D001 +:206100003069B6F93010B5684B464246A84701E020F090FD27F4804727B104F1E000394646 +:2061200020F026FCBDE8FC870000046086870200B546010035380100B9510200CC210840E7 +:20614000E00100102DE9F04FADF17C0D1B91C0491C923CC9064610A83CC00EC980E80E001D +:2061600000248DF84240327F8DF84340B08D8DF84D40D6F828C0ADF844401746ADF85A00B1 +:20618000F0898DF854706146ADF84A00087800F00303022B8DF8400000F3FD8123461D93B5 +:2061A000491C1E9343083CD200F00C0EBEF10C0F0CD043093CBF11F8013B8DF84230BEF18E +:2061C000080F04BF01238DF84C3001D08DF84C40BEF10C0F0AD0737903F00303012B0CD14C +:2061E00040F00C0073898DF8400004E04D780B78891C03EB0523ADF84430430911D24D78AE +:206200000B78891C03EB0523ADF846300B784D78891C03EB0523ADF8483011F8013B8DF83B +:20622000433011F8013B30F07F058DF855301ED00B7833F003058DF8413040F0A88103F01A +:20624000030EBEF1030F00F0A28113F0030F01F101010ED011F8013B00F00305022D8DF881 +:20626000573004BF11F8013B8DF8583001E08DF841401491A1EB0C017F1AFFB2BA42C0F265 +:206280008681D21B8DF85470D1B28DF84D100F4300F08181C10907D370891BF08BFB0028C2 +:2062A00040F079819DF8400000F00C012746091F08BF0127820932D301221E9279B3B28994 +:2062C00020F07EF9904202D1F08D000A0DD220F077F9904221D0F18D080A38BF101C07D35C +:2062E0009DF8400000F003032DE07089ADF85A20804620F065F9BDF85A10884205D0404636 +:2063000019F09BFC002800F04681A448026810A940469047002840F03E819DF84000F18D28 +:2063200000F003030A0A0ED2C2090CD39DF8412012F0030F07D100F00C020C2A03D0082AAE +:206340001CBF01221D92DFF86082022B00F00081012B00F0CE8010F0030F40F01C81904818 +:2063600090F82F00012803D1B579002D00F013819DF8540002221A900B0A9DF84240BDF8F2 +:2063800046B0BDF848A09DF855E09DF857C0DDF850908DF86420B0899DF84350ADF85C00D4 +:2063A00075D2454605F11C021468002F52D11D9F17B110A913F0ABFA7A484178022936D197 +:2063C0000078012833D1B07C002830D070891BF0F1FA022801D0707948B37449B2893C20A2 +:2063E0008B1F33F8064F944204D19C78F77CBC4200F0D180401EF4D16878891F3C234FF6B3 +:20640000FE7731F8064FA74202D05B1EF9D1C2E00A80F27C8A700C228A8004211BF00AFB8A +:2064200028B9687804214FF4FA7220F045FAF07C1E9F00901C9D0197594C0295B07C1B9B50 +:206440000390B4F8482017A910A811F02FFDA2E068850200307C002C8DF8560000F09B80C1 +:2064600020F0AEF8BDF85C20904240F0948030791E9F00901C9D01971B9A02951D9B039140 +:2064800096F8300010A9049017A8A04783E08DF820208DF822508DF82340ADF83010708966 +:2064A000ADF818008DF835E0ADF826B0ADF828A0CDF82C901A9B8DF836C0327CADF82A303F +:2064C00035798DF83220B47C8DF8335096F832108DF83440324F8DF83810B7F84800ADF84C +:2064E000240096F830708DF8377006A805F08AFD51E01D9FB58937B1080A04D2284610A9D2 +:2065000013F005FAB5899DF85400B6791030C0B21EF01CFD071C3ED07D81022038703E73A0 +:206520007C709DF854203A7207F110057D609DF84000800928BF01247C72149978681FF0DC +:206540002DFB45466D1C287839461AF04BF922E09DF84100B189454624352B6810F0030FF7 +:2065600010D110A807901248ADF8181006A91DF0FDFA80B1062141730068407B21461AF071 +:206580001DFE08E03BB110A82246984703E08DF84D408DF854401FB0BDE8F08FC40801201F +:2065A00050010120E4040120E0060120340300201B0602002DE9F04F4FF0FF084146ADF11F +:2065C0004C0D0E910F914FF0000910914E46089609960A96AD4C0B9604F1300B0C96E06815 +:2065E0000D96494611919EE0E068710306AA042320F0CCF8119903AA30461FF01BF802AA47 +:20660000304601211FF016F83046022101AA1FF011F8069800F0FF0028709DF81900069FF1 +:206620006870C7F30140E8709DF80E30AB702878FF2834D0BDF80C70FE2830D04FF6FF706B +:20664000B8422AD107A81BF03DFFE06871034FF088524FF4005320F099F8BA484FF40057A7 +:2066600050F8041D3F1FBFB2B1F1FF3F07F1885201D1032FF4D810684FF0010A514600F017 +:20668000FF03FF2B18BF8A46491C000A0529F6DB106007981FF06AFA5744EF8001E010201C +:2066A000E8809DF80A00BDF8087028719DF806302F81BDF804206B7129786A81E068FF29E1 +:2066C0002AD0FE2922D07E291AD07C2912D078290BD0702904D00D99491CC9B20D9120E082 +:2066E0000C99491CC9B20C911BE00B99491CC9B20B9116E00A990F96491CC9B20A9110E0B4 +:2067000009990E96491CC9B209910AE00899B046491CC9B2089104E009F1010710965FFADA +:2067200087F9761CF6B2E578B54200F323810D9F002F38D10898022835DA0C98022832DA1D +:20674000099802282FDA4D452BD00C98C0B90898A0B90B980A99084325D01EF019F8854256 +:2067600019DCB9F1000F14D094F83200FE211DF01DF8E5780120DDF8408015E0012013E06C +:20678000089860B9B9F1000F07D11EF001F8854201DC062008E0032006E00220EBE70220D7 +:2067A00002E0119800E004200028A07000F0CC80401E49D0401E00F0AA80401E06D0401E55 +:2067C00000F09880801E00F094800EE11DF0E0FF05460C2084F83C5015FB00B0817E84F87A +:2067E0003D10C07E84F83E000EF030FAE2782D1895FBF2F050432D1AE8B284F83200401C9D +:2068000090FBF2F15143401A84F831007C201CF0C9F8FF2810D17E201CF0C4F8FF280BD195 +:20682000FF201CF0BFF8FF2806D178201CF0BAF8FF2808BF94F8310084F833000C2110FB90 +:2068400001B0808BE0868FE00F9F08F1010090FBF5F184F832806943FF2FA0EB0100C1B287 +:2068600084F8311014D10E98FF2804D10C200E9111FB00B004E00146880000EBC100584452 +:2068800084F83310808BE086AFE0C046C01900203A46D0B2910084F8330001EBC2015944AC +:2068A000898B1729E18640F2A080C91F01AA89B212F058F99DF80F00C0083FD3119F0097E5 +:2068C000BDF81220E18E94F833000323891AC91F01AA89B209F012FB002840F08680BDF8F3 +:2068E0001010002900F081809DF8140019F054FF7BE0FEE7119EB54226DD304610F052FAAE +:206900006178E578761CF6B201436170F3E708F1010084F8328090FBF5F16943401A84F8FD +:2069200031005FFA88F010F03DFA6070FE215FFA88F01CF03BFF012084F83500119801F0AC +:2069400083FF52E00020001111986D1E84F831000C2184F8325010FB01B184F83300898BC6 +:20696000E1867E211CF022FF94F83200FE211CF01DFF3AE00C2116FB01B506AA0423710386 +:206980001FF004FF1199304603AA1EF053FE304602AA01211EF04EFE3046022101AA1EF0C9 +:2069A00049FE0699163501F0FF0201F0FF00FF2A09D0FE2A07D07E2A05D07C2A03D0782A2B +:2069C00018BF702A0AD1119F47B9C1F38542032A04D19622B2EB116F3FF41EAE304610F0F4 +:2069E000E1F9002860703FF4FFAD13B0BDE8F08F2DE9F04FC24CC44AE0790E46F108ADF14A +:206A00001C0D80F07281BF49330C07D3DFF8FCB24FF6FF7A9146AAF1010A42E00F78710BE4 +:206A200027D2300A28BF86F0800080F0D581B0080BD2300B38BF0020C0F0CE81381C01D174 +:206A40000EF04CFB86F40060C6E1012F18BF022F0CD168460021082215F0C0F9684610F0F6 +:206A600009FE18B12078022118F0F2FA86F00200B2E1012F18BF022F10D1401E0AD0801E9D +:206A80000CD1607A022809D10120607200201BF0F1F903E0217A00201CF0DCFB86F4805068 +:206AA0009AE1207818F0A6FA071C08BF86F4004000F092813D78D32D00F00B81E079A84200 +:206AC00020D094F82F000A2D0BD08E480378002B40F00781092D40F004810021B81C884716 +:206AE000FFE03871B9788DF812100322F9788DF814000DF112038DF813104F2080211BF031 +:206B000087FCEEE099F801006D1E00F09080AD1E40F0E780012818BF022840F0E280BD78B4 +:206B200075B36D1E40F0DD807D7820781DB31FF047FD4FF6FE720021824218BF0121081CAE +:206B400004D15846408F1146814209D010465D46ADF8100004A9A5F83AA053201BF02AF98D +:206B60001DF01CF81CF00AFA5946002081F84A0014F040FEB5E0022140F6B83261729DE0F8 +:206B80007D78002D4FD11FF0C3FD002201460BF10800E1600D4602601046002D3FD10029C5 +:206BA000E6D000280D46E3D080468D481EF012FA012809D0B9F830004FF6FF71814209D008 +:206BC0002988884206D022E0854805F10C011EF0D5FEE0B1BBF83E002989884201D182451A +:206BE0000BD199F8010030F0010302D1EB7823B90DE0022801D12B794BB19BF836006979BD +:206C0000884207D199F80600A979884202D028461CF004FFAD69B8F10108C6D1A8E7AD69FC +:206C2000401CC0B2B9E700201BF03CFD59E0012818BF022855D17D7894F838003DB194F8C6 +:206C40003710491CC9B2884284F837103EDB207A401E04D0401E36D0401E1AD041E01FF0BF +:206C600053FB78B994F8390000283AD1002102200D468DF808000246ADF8005068461EF081 +:206C8000C7FD13E001201FF013FD014600F074FC27E0AB2000216A4619F0E6FCCDF808D02B +:206CA00004208DF80C0002A80DF0E4FE20784FF4805117F037FF207841F288324FF4805114 +:206CC0001FF0FAFD0DE01BF015FF0AE001200021DCE7F88948F20201814202D138460AF0E7 +:206CE000E5FE38461EF038FADBE65778217878B1401E6BD0C01E64D0801E58D06AE0C046E0 +:206D000068060120E5040120E40401205001012094F82F00022F904601D181095AD2C1084C +:206D20002CD2800856D3042594F83000E571400850D394F832309BB9012F18BF022F17D19C +:206D40000127E01D00212A46A77015F047F80320E071384619F0FAFA38461EF07AFE05E04A +:206D60001EF072FD2846012100F006FC98F8017087BB2846002100F0FFFB2BE0E01D052526 +:206D800094F8301005708908F3D394F832100029EFD10121A1700422002115F01FF8E571B8 +:206DA000002019F0D3FA02201EF053FE12E0002084F82E00E0713222084604211FF07CFD00 +:206DC00008E01EF041FD04200121D4E7012001461CF040FA86F0040007B0BDE8F08FC04675 +:206DE000D80301202DE9F04FD14CDFF84893DFF84883080CADF1140D019180F0D38108465A +:206E0000400838BF0020C0F0D78167681FF016FF05461FF0B1FB4FF47A764FF6FF7268437E +:206E2000B0FBF6F081B267B13B887888CB1A9BB2984210DDC01A8242C8BF82B2FF68002FCB +:206E4000F2D14FF6FF70904200F09380207801211FF032FD8DE0B87902287DD01FF0EEFEDE +:206E600005461FF089FB97F838106843B0FBF6F0D34D38802878884266DD97F83600FF28B0 +:206E800008D197F83800401C87F8380097F8370087F8360097F8356097F839200020012176 +:206EA00001E0401CC0B282420FDD97F8365001FA00F385F0FF052B42F3D03618814097F829 +:206EC0003600F6B2014387F8361097F83400B98F10FB06F2891A89B28842C7BFFF2087F8F1 +:206EE0003600011C97F8360099F82220FF2818BF97F83A0006D140460078642510FB02F283 +:206F000012FB05F0788046B9388D3E7A40F020003885386C87F82E600BE03A8D4FF6DF70F7 +:206F2000104038853D6C87F82E6097F8342012FB06507862F879CEB287F82D0007F11000C9 +:206F40007E8405F05FF810E0B87E97F82A10FA8BE9231BF097FD05E0387CFF2802D0B86911 +:206F60001EF0FAF838461CF091FB2078012118F06FF8019880F001001EE12878012840F0D0 +:206F80000E8195F8338095F813A06F6995F83100698802221CF036FF05F11C0405F1020BDD +:206FA00006460020002E02907BD1687F400876D3A87FCDF80CA01FF037FABA4605F11009FA +:206FC000071C60D01C2012F0FBFF061C59D000211C2214F003FFA87F69461DF0D9FF9DF826 +:206FE00001000221307530461DF0E2FA6888317DB08095F83100FF22F07102FA01F070748A +:2070000078680078307495F83000B07495F8331011FB00F0303080B21DF098FF0746B7612C +:2070200027B930461CF032FB00262AE01A20387000237B701A467A80E0885946B880B81D33 +:207040001EF05AF9E0783C4BF87303F1200000883882608BB88560897882A0783875207BC4 +:20706000787599F80000B87599F80100F87599F902003876039A7A76C7F81CA007F13001F3 +:20708000B962304600E000200028064600F08780274886F808800078012117F0D9FF002ED8 +:2070A0007DD0307AA8EB0000B0F1FF3F04BF01200290307CFF285DD06078400828BF4FF0AB +:2070C0000008317DF07C4018404503DCF074FF2088407074B069B17C227D806A08FB0100D0 +:2070E00021691EF05BFD029F317D727C012398FBF1F04843A8EB000003FA00F11143C9B2F0 +:207100007174DFB1401CFF2202FA00F001437174B769B17C207D08FB0100B884707CFF282B +:207120000CD1307CB16919F05DFBFF20307421E0800A0120E4040120780101201FF07EFDAF +:2071400007461FF019FA204B204A4FF47A717843B0FBF1F0308093F8221010781F4610FB11 +:2071600001F197F821006423401C10FB01F010FB03F07080F17C327DA8EB0100801AB0F1B5 +:20718000FF3F04D0707CFF2801D0029F3FB1E175707C2076BBF80000214612F0B8FB284653 +:2071A0001DF0DAFF0748007817F024FF051C7FF4E4AE019880F4004005B0BDE8F08FC046A6 +:2071C00005050120800A0120E4040120780101202DE9F04FB64AB74CDFF8DCA20B46ADF19A +:2071E000340D90465178607805931A0C80F09C8031F0010709D11A46520806D3206A00B1BC +:207200008047059880F00100AEE11A46920805D301201F46E07087F00200A5E1022906D161 +:2072200098F80010012902D11946C9085DD21846000938BF0020C0F0978150463230E76AC3 +:2072400000780026B146000922D21FF0F7FC05461FF092F9236BB8F836204FF47A71684348 +:20726000B0FBF1F098F825100690C01A824238D8B0FBF2F39BB29942ACBFDDB20D1C069BFD +:20728000B0FBF2F15143401A81B2581A206300E00125EFB1C846F878A8420ADD401BC0B288 +:2072A000F87040B109F101061FFA86F93E467F680CE087F803807868002E82460CBFC4F826 +:2072C0002CA0706038461AF0D5FB5746002FE2D16078B9F1000F04D100212163082117F000 +:2072E00021FC059880F008003EE1A14B00263C244FF6FE71354633F8062F914208D09A886F +:20730000521E97B2002F9F8006BF19809D700126641EF0D126B104214FF4FA721FF0CCFA11 +:20732000059880F004001FE117F064FE071C00F01881B87FC0B9788CE56A132815D1B7F854 +:207340000290281C11D000260188894508D14568002E0CBFE56275601AF08CFB284601E07E +:20736000064640680028EFD1E56AB87A97F831102E46022853D1788856B13288904204D1B6 +:20738000B27898F82530914247D07668002EF4D181460E46002D08BF002004D0012015B139 +:2073A0006B68002B35D1B8F83810814237DD082012F006FE98F82510002830D0A0F80090B7 +:2073C0008670C17000234360E66A86B9E0629AF83200000911D21FF031FC05461FF0CCF8E5 +:2073E0004FF47A716843B0FBF1F0206300E06860504690F83200000911D3607808211AF0B5 +:2074000019FB60B96078B8F8362008211FF051FA05E0401C1D4680B2C1E7F3709EE05548E2 +:2074200005683878012806D0022840F09780384616F0CCF892E007F11004B81CBE89089442 +:207440003B7E0690FA7C07967969099397F819B00A923C7F0B9107F11C0604F00C000C28B3 +:207460000DD0B87F4FF0FE09FF2804D01EF0DCFF041C11D172E0002D70D06C6810E0B08811 +:20748000FE211BF01BFB8146B9F1FE0F08BF01201EF0CAFF041C61D020781EF0C7F905466D +:2074A0004FF6FF7A11E020781EF0C0F905460CE0E4040120E006012050010120B078FF28B6 +:2074C0004CD12D68002D49D06C68002C46D0AB68AAF1010823B9A3680BB1B3F8028007E030 +:2074E00021780220984718B1B0F800801AF0C2FA3389227898450BD00AB913B908E09A45D7 +:2075000006D0B3F5807F18DB4FF60240984214DD96F80280B27008980090099B01930A996C +:2075200002910B9A0392CDF810B0079B069A3046214610F053FF86F80280307800F00C00E4 +:207540000C28BBD1B08849461BF0B8FA8146B9F1FE0F03D01EF068FF041CA4D138461DF001 +:20756000FBFD059880F400400DB0BDE8F08FC0462E030020C00A01202DE97C43CD4C0E465D +:207580000146DFF83483DFF834936078491E00F04E81491E00F02281491E00F0E580C84AB2 +:2075A000491E00F0B380491E6CD0891E2BD0491E40F07481052102288DF8011040F06E816B +:2075C000444694F82F00B6B1A07AE0710021A17242F2080008F0E2F994F82F00217900F00C +:2075E000DF0084F82F000D2084F82E0001B904201EF058FB52E140F0200084F82F00022695 +:2076000084F82E604AE10025012E8DF801501AD0022813D11FF046F880B1052044468DF861 +:20762000010004F12F01087840F0200008700820294608F0B3F90A201EF034FB444602208E +:2076400084F82E0019E018B909201EF02BFB6078022806D10820294608F0A0F904201EF026 +:2076600021FB14F0E5FC44460D200421C82284F82E002078E5711FF01FF994F82F0000F0D9 +:20768000EF00D1E00221012E8DF8011017D04446082130F0010084F82E102BD194F8320033 +:2076A00040BB002552200DF105018DF805501AF081FB1EF0F8FD15F035F8284618E0002514 +:2076C000484616460570308804F13002208683201FF02AF8032128461BF078FB60780128E1 +:2076E00003D107201EF0DEFA6078444610B909201EF0D8FA0020E0712078042132221FF0E4 +:20770000DBF894F82F0000F0FB008DE00121012E8DF8011004D0D0B902214846017016E027 +:20772000002148461688017004F130022686022183201EF0F9FF6078012803D107201EF0E2 +:20774000B1FA6078022802D106201EF0ABFA44460020E0712078042132221FF0ADF894F884 +:207760002F0000F0FD005FE0012818BF022840F0958044462078042132221FF09DF894F874 +:207780002F10E0685EB101210028E17100F090801CF044F9E0680028FAD1BDE87C8302206D +:2077A00084F82E0000258DF80450E57101268DF8016021F0020184F82F10522001A91AF0C9 +:2077C000F9FA1EF070FD14F0ADFF28461EF06AFAE068002862D01CF021F9F9E700201EF0D5 +:2077E000D5FC04250120207260788DF801507EB1002188F82E10012888F82F1003D107203D +:207800001EF050FA6078022802D106201EF04AFA44460020E0712078294632221FF04CF81A +:2078200094F82F0000F0FE0084F82F0036E0012818BF022832D1012E18D0012044460726C2 +:207840008DF801004FF48051207884F82E6017F069F900201CF0FAF8002084F82F00207802 +:20786000022141F288321FF027F817E0002003211BF0ACFA4446042132222078E1711FF0E2 +:207880001BF80820002108F089F80020207220784FF4805117F046F9BDE87C8348460078C5 +:2078A000002103226B468DF800000A201AF0C2FABDE87C83E4040120680601209606012063 +:2078C000980101202DE9F0410646B948B94DF1890078ADF1380D0F46203F64D07F1E012FCA +:2078E00032D947F6DF72BF1A012F16D9213F012F00F28481002840F0818108352F68002F13 +:2079000000F07C8142328A420CBF03200220B169727C097805F0C0FD70E1304615F09AFF8A +:20792000041C00F06B81207860B9608800218DF80810ADF80A00211D03A81EF0CBFD02A8DC +:207940000BF062FC204657E1307B002840F05681B16902A80C461EF0D3FF083414F8010B0C +:207960008DF8100061782078A41C00EB0120ADF8120014F8010B03288DF81C0006D06178EB +:20798000207800EB0120ADF8140007E005A821461EF0B6FF14F8080F8DF81E00304602A9E5 +:2079A00007F0A0FE2AE1002840F02881707C77888DF80800337CADF80A70B4698DF8093005 +:2079C00061782078A71C00EB0120ADF80C0039460DF10E001EF094FF07F1080414F8010B6E +:2079E00000268DF81600617820780796E41C099600EB0120ADF8180014F8010C8DF81A0098 +:207A000070B19DF81A00400012F0DAFA0246079030B19DF81A0021461DF07AFD044601E0FB +:207A20008DF81A6014F8010B8DF8200068B19DF82000400012F0C4FA0246099028B19DF86D +:207A4000200021461DF064FD01E08DF82060A868C8B9502012F0B4FA0746AF608FB1314687 +:207A6000502214F0BBF9384602A915F034FA40B1A9680120634F81F8400038881CF0D4FD55 +:207A8000B0E0882065E090F84010012940F09480022780F8407002A9203015F01CFA28B9DB +:207AA00088204FF001088DF8340000E0B046AC68207EE16994F83220636B19F083FA84F89D +:207AC0004300B0B110FB07F000B212F079FA6064AC68606C28B988204FF001088DF83400AB +:207AE00007E094F84320606C05F1180152001EF055F894F83800E16BA27C636919F062FAC9 +:207B000084F84800A8B110FB07F000B212F058FAE064AC68E06C002804BF88208DF8340050 +:207B200016D094F84820E06C05F1180152001EF035F8B8F1000F0BD194F8431094F848003C +:207B4000084305D0304601460A4605F0A5FC49E086208DF83400BDF80A000DAF0224ADF894 +:207B600028000AAE009748F2200201239DF809008DF830403146019002A819F06BFDA86848 +:207B800098B190F8401002290FD18DF830400DAF41880097ADF8281040780190A86848F238 +:207BA00020020123314619F055FD17F0DBFA19E0E50401203C050120BDF80A6088200DADEB +:207BC0008DF83400022700950AA948F220028DF830709DF80900ADF828600123019002A8D0 +:207BE00019F038FD9DF81A0010B1079819F042FF9DF8200010B1099819F03CFF0EB0BDE830 +:207C0000F081C046E40601202DE9F04F0E46074630687C68BD68ADF1140D00283AD01EF04C +:207C200089FED4F8E81081460120019008294FF0000088BF0198B168084202D171680842D7 +:207C400005D0019880F00100C0B201281DD1D4F8C000B8B9C4F8C060C4F8C4600020C4F827 +:207C6000D0000146C4F8D41094F8FC30C4F8D810002BC4F8DC100CBF01980520D4F8C410F5 +:207C8000087410E094F8F80030B90320307448461EF0D0FF002050E1D4F8C4004661C4F895 +:207CA000C46006233374D4F8C4000021416194F8FC00012808D1022194F8FB0084F8FC10C1 +:207CC0004FF4E0211CF0CAF8706810F0704F06D128B104201BF0E2FD06201BF0DFFD02200E +:207CE0001BF0DCFD94F8F800DFF85482002840F0B480E86B3168884240F2AF8094F8FC0044 +:207D0000002840F0AA8094F8F90028B1D4F8EC00B0F1FF3F40F0A18048461EF08BFFB76856 +:207D2000AA463FB1D4F8E800B94609282CBF0220019802E004F1F40900207768039037B18B +:207D4000D4F8E80009282CBF0220019802E004F1F60700200290DAF80010D6F800B0486802 +:207D60005FEA0B0540F0020048604ED04046A0F11008D4F8E800ABF1010B092820D301986A +:207D800003460DE0D8F800108A68398890470346002003B10198031C02D002986D1E3F1820 +:207DA000DAF800000DB1012BECD0D8F80010C9680A4669469047BDF80000A9F800001FE00F +:207DC000019803460DE0D8F800108A68397890470346002003B10198031C02D002986D1EAE +:207DE0003F18DAF800000DB1012BECD0D8F80010C9680A46694690479DF8000089F80000B7 +:207E00000398BBF1000F8144B3D17768DAF80010D4F8F030CA680020134218BF0198102BC4 +:207E200018BF80F001000028F4D117F0704F06D12FB106201BF01AFD04201BF017FD0220E3 +:207E40001BF014FDD4F8C010002008740746C4F8C4703E46C4F8C0606EE0D4F8D800002817 +:207E600043D1D4F8DC00002842D128791EF064FD4646D4F8CC0032682969406852680068E1 +:207E800091FAA1F1B1FA81F1134602229847D4F8CC003268696940685268006891FAA1F161 +:207EA000B1FA81F113460222984728791EF03EFD28791EF043FD2046294609F091FE0021F2 +:207EC000D4F8C000C4F8E0100068B0F5806F03D92046294609F084FE94F8FE0060B929680E +:207EE000486840F00200486006E0D4F8DC0018B92046294609F074FE2968486940F00100E6 +:207F0000486148461EF096FE94F8F800A0B9D4F8EC1004F16C0528461EF0BCF960B1D4F86F +:207F2000C00003210174384606F02AFC284600211EF0B0F900200190019805B0BDE8F08FE5 +:207F4000D40100102DE9F04FBF4CDFF80083207889465FEA1941ADF11C0D3FD25FEA5901FD +:207F600011D32079211D88F83C00E12019F022FF1DF032FC0020A8F89400012016F05CF954 +:207F800089F001005CE1E7885FEA990116D25FEA191038BF0020C0F0538194F8310050B125 +:207FA000E06A94F830101DF02DFD20B994F83100401E84F8310089F0080041E1002F04BF3E +:207FC0000020A07007D07F1EB9B24EF66022E18002211EF071FC89F0020031E117F00AF837 +:207FE000071C00F02B81C346387894F83120A178313800F00B81401E00F0BC80A13840F09B +:208000001481FE89383E0FD047F6DD70361A40F00C81B8690678002E40F007814078C00952 +:20802000C0F0038178885CE089490EC904A880E80E00D7F818A0042150461DF04BFA3D46EE +:2080400006460AF1040010F8011B049606298DF8141010DBFE2918BFFF290FD10278FF29AC +:208060008DF816200AD1401C4278007800EB0220ADF8180002E000788DF8150006295ADBBA +:20808000FE2931D0FF2912D0287B002840F0CD8068882084002600963346019332460292FD +:2080A00031460391687C802111F054FBBDE09DF816509BF89600A84205DB002D40F0B580C3 +:2080C000FF2840F0B28028461AF072FF3EB1DBF84C00864203D0CBF84C601DF07DFBBDF8DC +:2080E00018001DF0EBFDA0E09DF8165098F89600A84205DB002D40F09880FF2840F0958027 +:2081000028461AF055FF002001218140314202D1401C1B28F8DB98F83C10884200F085803D +:20812000207198F82B00642110FB01F2012120781EF0C2FB79E02B7B002B76D19DF815A030 +:20814000BAF1000F71D0BAF1060F6EDA30461DF059FC002869D1AAF10106687C8DF8156062 +:208160006B88607004A923840EC904F12C0585E80E005AE0FF2A12D0002016F05DF8024668 +:20818000002000906078B8F894103B4613F071FA94F83100002848D008213222C7E798F85C +:2081A0003C007A6801213B46814011420EBF00213844017A5D68002001228240154203D011 +:2081C000C218127A8A4204DB401C1B28F4DB002018D0B8F8920020841026009621896289D1 +:2081E000002013F046FA0120E070A07840B93C20E080207802214EF660221EF05DFBA078DF +:20820000401CA070002084F831000EE004290CDA1048017810481DF0F5FB30B97888208174 +:20822000FF2684F83160B888608138461CF094FF207816F0DFFE071C7FF4D6AE89F400407C +:2082400007B0BDE8F08FC0461C07012050010120BC860200A201012000F8FF072DE9F04F2C +:20826000ADF1440D0B908069007800210DF12A020F909C200EF01CF8B54D681C007830F03D +:20828000010009D1002004211CF00AFA5FFA80FA9DF82A00504402E001204FF0000A8DF8B7 +:2082A0002A000F989DF82A10884280F2DE809DF82A000F99401AC0B20D900228C4BF0220E5 +:2082C0000D901A2110FB01F000B211F079FE0E90002800F0CD800F980D9F0E9C0C90002FD5 +:2082E00008BF002074D04FF00008B946012645460C9882450ADC0F9940468A4504DAA1EBA3 +:208300000A01C9B20C9163E00C9561E0411CC9B20C911CF0D9F9071C54D08E480146B0F8B6 +:2083200048005D312080A01C1EF0EAFA388860820223E375FF222276B87A60768DF81C5048 +:208340003888ADF81E0007A813F082FDAB46012808BFB34604F10A00BBF1000F06D104F109 +:208360000A00FF21082213F039FD02E008A91EF0C7FA3B797BB93F88002F04BF2575281C8F +:2083800004D07448267590F85C00401E207602206075A57515E06F4890F85C00401C207647 +:2083A0003879032804DB26753879032805D106E0022020753879012801D0667500E06575D8 +:2083C000A6751A34B9F1010908F1010890D140460D9981424CDD0D9DDFF878B104F102085C +:2083E00004F10A0702264FF0000A4FF001091A3C2D1A0C9987206A460DF05AFF5749BDF879 +:208400000A0024F81A0F40461EF07AFA0DF1020138461EF075FABDF800004D4B608258780A +:2084200030F0010003D16675A675FF2006E084F8159084F816A09BF85C00401E2076E675BB +:20844000638A9DF81200002B60760CBF84F814A084F814900C9808F11A081A376D1E00F1E0 +:208460000100C0B20C90C4D102E000200E900D900B98417C0D9F0E9D8DF82B10801C1621D1 +:208480000B9017FB01F0001DC0B28346401C11F097FD5FEA000854D008F101040020A2467A +:2084A0008AF800009DF82A000F9F88F802000D9E88F8037088F8046096B30D9F2E46241D1F +:2084C00006F102090A36204649461EF019FA0834314620461EF014FA0446A87C04F8010B99 +:2084E000688A001204F8010B287D2070697D40EA8100C0B22070A97D40EA011004F8010B3F +:20850000E87D04F8010B287E04F8010B687E09F11A091A367F1E05F11A0504F8010BD2D190 +:208520000D4D0B990DF12B0048F231025B462C1DC4F800A015F0B0FD404619F09BFA09344E +:208540006C600E9808B119F095FA11B0BDE8F08FE40401205001012028040120AD010120DC +:20856000B8492DE9F04F0A68B449ADF11C0D002A06BF8B1C1D780225AB4BDF689E686D1F4E +:2085800000F04B816D1E00F04581DFF8A482002A65D09279012A62D0A44C276B022A04D098 +:2085A000E169002900F03C8139E138460027002851D1780011F004FD5FEA000900F0238132 +:2085C000206B40B10021028829F8112040684E1CF1B20028F7D14446B4F89200618F814202 +:2085E00033D080460A2000EB47008DF80D0003A81CF032FD061C2CD035690920287004F16C +:208600005D016F70A81C1EF07BF95FB108354846017805F8021F30F8021B7F1E4FEA212108 +:208620006970F5D10124B4771DF088FA706201A940461CF0ECF910B1747701A83062A6F844 +:208640000280304601F004FE03E0CDF8009008F0F0FD4E46D4E040687F1CFFB2A7E7407890 +:20866000DFF8D0B18DF810009BF8030070B90BF14801086838B900208DF8050001A9012033 +:208680001BF09CF9CCE0096804A8C8E000208BF803001EF03DF805461EF03AF80027002806 +:2086A00040F0B48064484078002630F0010037D11EF02EF858B10A8801888A4204D08469BE +:2086C00014B1201CF8D102E008B18A4228D01C2011F076FC061C23D04146B1F84800308085 +:2086E00091F83C40B4701DF065FF7071524880795D31B07106F10C001EF002F941200DF152 +:2087000011011CF0BDF89DF8110000280CBF4FF6FE70BBF81C007F1CB5613546FFB23081DD +:208720009BF804A0574510DBA7EB0A005FFA80F8B8F1060FA8BF4FF00508BAF1000F06D00D +:208740005046AD69401EFCD101E04FF000089BF802000C248DF8120018FB04F0001DC0B228 +:208760000690401C11F02CFC5FEA000942D009F10104002120460170059089F8027089F87A +:2087800003A0B8F1000F89F8048021D04746241D4FF0FF0A4FF6FE7805F10C0120461EF040 +:2087A000AFF8A878083404F8010BA8792070697940EA011004F8010B04F801AB28898045BA +:2087C0000CBF0020012004F8010BAD697F1EE3D11B4D05982C1D0BF1260148F23002069BA0 +:2087E00020600DF1120015F057FC484619F042F909346C601048407830F0010003D116B1EA +:20880000304619F037F91AF0B9FB09E080697F1CFFB244E727B1394601E00EB13146884765 +:2088200007B0BDE8F08FC046FC090120E402012050010120C4030120E4040120980101200D +:2088400028040120000A01202DE9F04FB04E4FF0000A8146ADF1140D57467069CDF808A09B +:20886000CDF80CA010B1804700B90B27F078002F40F09B8096F8314096F832700146B9F112 +:20888000000FA1F101011FFA81F818BF012155464FF0F80B86F83F1022E0AF421ED0F068C7 +:2088A00069036A4604231DF071FF009911F4403F1CBF0AF101005FFA80FA01F0FF017C299B +:2088C00018BF782909D1284606215A461CF0C0FE0C2015FB006080F848B0F0786D1CEDB2AB +:2088E000A842DADC401E504503D196F8350000285BD0B8F1000F06F1300500F0CF8003983D +:208900004FF4005B019096F83F30F06813B9012186F83F106A46610304231DF037FFB9F1F0 +:20892000000F05D00099F07811F4403F40F09B80009800F0FF00702803D0204670211AF090 +:2089400035FFF06879036A4604231DF01FFF009800F0FF00FE2803D03846FE211AF026FFC1 +:2089600038460621FE221CF073FEB800FE2300EBC700FF2186F83C70A200A6F840B0401957 +:2089800086F83D4000F1180A8AF80030019B86F83E1002EBC4004019A6F84430808BA6F8EA +:2089A000420001F0C5F8102801D10020ADE0B9F1000F0CBF10214946B9F1000F07D0B6F88E +:2089C0004000C0F50050814207DC01200390B6F84000C0F50050814201DD782100E07C214E +:2089E00038461AF0E3FE0CF031F996F83F300446A8EB04000621FC221FFA80F8181B86F883 +:208A00003F0038461CF024FEFC208AF80000029A96F83210F078091996F83E400C278918F7 +:208A200091FBF0F24243891AC9B286F83210491C91FBF0F24243891A86F8311014FB075144 +:208A4000898B102905D1611C91FBF0F24243891ACCB20198B9F1000F96F83270029019D065 +:208A60000398B8B11AE096F83F30641C94FBF0F1A8F101024143A6F840B01FFA82F8581E54 +:208A8000641A029986F83F00E4B286F83D40481C80B20290B8F1000F7FF435AF7C2019F093 +:208AA00081FF00240746FF2F1CD17E2019F07AFF0746FF2F16D196F831700C2017FB00506B +:208AC000807DFF280AD0F27896F832008018401E90FBF2F15143401AC7B203E038467E21A3 +:208AE0001AF064FE0C2086F8337017FB0050808BF08696F83200FE211AF058FEB6F84000AD +:208B000086F83540C0F5005000B205B0BDE8F08FC01900202DE9F04F81460D462C20ADF180 +:208B2000240D11F04DFA071C00F049811DF048FD698B884214BF012002203870697B28699C +:208B40000026401A7860687B87F82660B8707C68B87887F827602418207800F007007870E0 +:208B60002078C0F3C100387420780421C0F3401A601C1CF0AFFC4FF00508B861BAF1010F20 +:208B800087F81C8006D007F108003146082213F025F908E0397F07F1080009191DF0B0FEA5 +:208BA000387F08303877387C012805D1387F205CB875387F401C38772878DFF80CA200F02D +:208BC0000300012803D0504630300078804687F8018078781DF02AF87877397F28692C7D62 +:208BE00040182861397F7B7F601AC01AC0B22875F8704FF6FF74BC82B869B0F1FF3F32D01F +:208C0000387C01281CD038B9062078823946484614F012FD40B30CE0387C022802D00328A0 +:208C200007D01EE0062078823946484614F004FDD0B1042078823946484608F0BFF913E0DE +:208C40009AF82F507E82B32075B99AF8651001290AD1B87D17F0B2FAB882844218BF301CEB +:208C600002D1A12000E0A32004463878022806D11CF064FF014607F108001DF041FE002C94 +:208C800040F09980514D6878B046012818BF02281CD197F82600012803D097F82700012870 +:208CA00014D1B978F8784018397F4018001D11F087F95FEA000809D0B878FA783C7F7968C0 +:208CC000121840461219121D1CF068FF38460AF081F804466878012818BF022865D1002C70 +:208CE00063D0B8F1000F66D040F203154FF0680A4FF0010900E05C4697F82600012803D0DC +:208D000097F82700012850D1B978FA783B7F786852184146D218121D1CF040FF97F826000C +:208D2000A34630B997F8270040B1BD8287F8276003E0A7F814A087F826607E8238460AF0C2 +:208D400049F8041CD8D168463146142213F046F87B8A8DF81190D3B9B88A682803D085424A +:208D600015D1FF2011E07868C17B0529C3D12A30FF211CF054FE0028BDD005A8082213F0B8 +:208D80002DF805A81DF0C8FAFC208DF8100002A807A9324612F0A4FF01469DF81C0020B141 +:208DA000042014226B461AF073FBB8F1000F02D0404618F05FFE384618F05CFE00E01024C7 +:208DC000204609B0BDE8F08F50010120E40401202DE9F84F1DF0DCFBA94CE06011F0AAF8BC +:208DE000A94800681DF01EFFA64D4FF000084FF0010A4FF0020B38E085F80080A3691CF0F3 +:208E00003BF920B9E06920F00200E06103E018461DF008FFE069010917D360691DF0FEFE45 +:208E2000071C05D0B86817F0D1FF384618F022FE60691DF0EFFE20B9A0691DF0F3FEE069B1 +:208E400003E0E06920F00800E061C1080DD320F00400E06120691DF0DDFE30B9E06940F0BC +:208E60001000E061A0691DF0DDFEA0694FF0FF311DF0CCFE1BF0CEFEE7882689A4F806804A +:208E8000A288A4F80880E169A4F80480114347EA010246EA0201E1611DF047F8E069010A7D +:208EA00024BF20F08000E061207816F0A3F868B316F044F8071C29D00C2011F081F8061C84 +:208EC0001ED01BF0A7FEB7603B7881465BB9206931461DF097FEE06940F01000E061A069DA +:208EE0001DF0A0FE08E0304618F0C4FD78681CF033F9384618F0BEFD48461DF016F805E0B9 +:208F000078681CF029F9384618F0B4FDE06941092DD320691DF07EFEE0B91DF069FBC8B9DC +:208F20001BF078FE064620691DF078FE071C0ED0B9684868498811F07DFFB86840681CF064 +:208F40000BF9B86818F096FD384618F093FD30461CF0EBFF20691DF05DFE20B9A0691DF0F0 +:208F600061FEE06903E0E06920F01000E0618108FFF451AF66E09DF800006B78AE686F6895 +:208F8000A870D81C5FFA80F9494630461CF04AFF9DF80010814205D13FB1484631464246DE +:208FA000B84702E030461CF0D7F885F8008049E0AF68E8789DF80010C019C170E878401C77 +:208FC000C3B2EB701CF058F86978C6B2C91AB1420CDBD8193146C01C1AF038F8E878697890 +:208FE0008019C0B2E870814222D02BE0DB1989B2DB1C18461AF02AF86878E87018E09DF8D9 +:20900000000085F803809DF800706870F81C1BF09DFF0028A8603FF4EFAE6978017085F8E9 +:2090200000A00FE09DF80000A9688870687808B9052006E0042004E09DF80000FE2801D1C2 +:20904000032028701CF018F800283FF4D7AE6846514619F0FBFF28780028EDD0401E08D056 +:20906000401EDFD0401ECAD0401EA1D0401E82D0E8E79DF80000A968487085F800B0E1E74A +:2090800070F70020680A0120EC0101202DE9F04F064606F1060BBBF80000ADF1440DADF8B8 +:2090A0000A00707D8DF81400B088ADF81600707E8DF81800B08C4FF00208401E8DF81A0020 +:2090C000B06A8DF81280411C089100788DF81900708AADF81C00B08DADF824009648076845 +:2090E0000024002F30D04FF0D30A4FF6FF79BDF81600F988884206D0894522D1C10BCD03FB +:2091000001D113281DD19DF81A00203080B21BF01DFF051C15D002A920221CF03FFD9DF82C +:209120001A203AB105F12000A861089905F120001CF034FD85F800A03879294617F052FB66 +:2091400001243F68002FD2D17C4800780D940024002800F0BB80BDF81600B6F804901338C5 +:209160005ED047F6ED71401A01280BD9001F40F08580B08C062880F28180A6F824804020EC +:20918000B0807BE002A814F065FB071C74D0387800286ED1397BBDF816A00D20884600EBB3 +:2091A000480200EB4105D2B20E92E8B210F008FF00280F905DD005463878391D05F8010B21 +:2091C00028461DF09DFBB878083505F8010B7888001205F8010B787B4AF0800A5FFA8AFA57 +:2091E00005F8010B07F10E0005F8018B06E00178297030F8021B09126970AD1C41464A1EEE +:2092000000295FFA82F8F2D1DDF83C800E9A45205146434619F0FCF8404618F02BFC28E017 +:2092200002A80AA91BF0A3FEBDF80A500D2010F0C7FE071C20D0804608F8015B281208F8B5 +:20924000010B9DF8280008F8010BBDF828000DF12A01001208F8010B40461DF051FB9DF8A1 +:209260003200C1210D223B4608F8080F452019F0CFF8384618F0FEFB012027D14FEAD93004 +:20928000C00323D0B08C401CC0B2814610F098FE071C1BD0B0889BF8005040F080003D702B +:2092A0005FFA80F8BBF8000000127870B16AB28CB81C491C521E1CF071FC45204A463B463F +:2092C000414619F0A5F8384618F0D4FB1C48083002884FF6FF7191420DD0BDF81630E500A1 +:2092E0002A18455BAB4221D0641CE4B2E5002A18455BA942F6D10D98D8B9BDF81610C80B3B +:20930000C00316D19DF8140098B9132911D041F4004100919DF8180001909DF819008422F3 +:2093200000230DF10A011AF08BFE02E0516802A8884711B0BDE8F08F3004012011050120E9 +:20934000E07B02002DE9F04305468078ADF14C0D1CF0DCFAA14C071C00F02B816878F87354 +:20936000DFF88092DFF880826878F12809D0CD2807D01A2805D0E92803D0E12818BF1D286D +:2093800011D1607830F0010006D17889000B24BF0520787380F0EA803846002103F0EAFCCA +:2093A000002840F0A38010976B788DF84430A87B8DF84500387C002866D1894802685AB169 +:2093C000384619469047012804D179894FF6FE70084078819DF84430787B02282AD17989C2 +:2093E000890825D3CD2B23D0F02B21D0788A000A07D3B87E28B1B8733868008818F0DAFAC9 +:2094000003E094F82100401CB873B87B401EC0B2B876B87304267E73608E43463881A3F1FA +:2094200032000078202115F013FE9DF84430787B022801D0062818D17889400815D37E6905 +:2094400046B1707810F0030F04D1B078317BB28819F018FB79894FF6FE7008407881386886 +:20946000008818F0A7FA9DF84430607830F001000FD173B948463E680368308818F09AFABA +:2094800028B923B1984702E010A807F0B9FB9DF84430E92B18BF002B07D1396801200090AA +:2094A000EA7B0888498902F0ADFC607830F0010077D140460078800873D3787B022802D14D +:2094C0007889C00806D26878E9286AD1384618F049F966E03B68188818F06CFA20B94FF6E2 +:2094E000FF701880052060E003205EE0607830F001002AD140460078800826D33968086A19 +:2095000018B3C97F02AA09F075FD6B78E92B07D1396801200090EA7B0888498902F072FCD9 +:20952000BDF81200396808809DF80D0000280CBF00224022BDF81200BDF814100CF020FF67 +:2095400018B1788940F0200078816E783889E13E18BFB6F1100608D1798911F0300F04D0AF +:209560001DF019F900F00700801C3881607830F0010016D16878E92813D04846006800B125 +:2095800080471A4E706A60B140460078800808D339680888498918F007F910B1726A6978C7 +:2095A0009047787B022801D106207873A87812F0E1F904F04DFC607802280CD1207850B91B +:2095C00000208DF8480012A9522018F0F3FB2020012106F0E3F913B0BDE8F083E404012063 +:2095E000F80601200403012082010120E40201202DE9FC47A24D009004782F5D002FADF8C5 +:20960000047000F03B81DFF87C820D2C4FF000094ED0052C15D0072C08D00C2C1AD14068CA +:20962000C08A400A28BF4FF0010913E08678002E08BF07F11B000BD0807D242110FB0170D4 +:2096400006E08178012900F01981007CC0192430ADF80400BDF804001BF078FC071C1FD1DA +:209660000C2C40F00B8100984068002800F006811DF060F9064640460068009FD0F85413A9 +:20968000381D8847BDF804001BF060FC071C04D130461DF0CFFABDE8FC8730461DF0CAFAD3 +:2096A000072C20D02A5D009938461CF077FA18E045462868D0F8282401A953209047BDF89C +:2096C00004104FF6FE70884200F0D380BDF80410401C884200F0CD80009F3889002800F012 +:2096E000C880052C46D0072C55D1009908783870487878708878B870C878F8700A7ACE797E +:209700008D79487900EB026000EB064000EB05207860BE78E6B18E7D3E7266B1896951B189 +:20972000B20007F1100002EB46121CF037FA07F11000F86002E00020F86038720098806908 +:2097400048B318F097F9009800218161817522E01B223A72896907F110001CF01FFA07F1E3 +:209760001000009EF860B06918F084F900980021816110E0796807F11805242228461CF004 +:209780000DFA7D6079693A7C05F124001CF006FA7868243078613C48016819B13846884716 +:2097A00000285BD1DFF8E8A00D2C0DD00C2C2CD1009840781A2828D07E6836B3F08A400890 +:2097C00023D30EF000FF20E000984268117801F00203022B3FDA2D4B1B78C1F383018B427F +:2097E00039D1567836F03F0635D190F83000022831D10EF0E8FE0098418E4FF6FF728A426F +:2098000003D140688079022808DAB9F1010F25D050460078394616F0E5FF1FE0381C1AD064 +:2098200057F80C6CAEB910F8021CFF2911D15446217800F8021C17480A22394618F0F4FC7F +:20984000012808D120784FF4005115F001FCBDE8FC871BF081FC454628680BE00C2C0DD10C +:209860000098416851B145462968D1F85413001D03E02868D0F8541368468847BDE8FC87F5 +:209880008086020014010020D00A01208601012050010120E80A01202DE9F04FDFF84C9259 +:2098A00004460D460020ADF1440D01461F460D9016460E9183460F91D9F808A0CDF840B021 +:2098C00011F018FF262803D011F014FF252825D1308843F6070181420ED040F60201814262 +:2098E00006D0B0F5C15F19D1F07B022816DD43E0F07B022812DD3FE096F8240002280DDDCF +:20990000307C0F2838D13169C1F31421B1F5803F04D00F2830D1B1F5A02F2DD1002D2BD0CC +:2099200056B328784FF0010808FA00F01AEA000F22D0304659461DF00BF865606C4DA66096 +:20994000A86980B110A800900DA90EAA0FAB30460AF066FA0E980B214FF6FF7250231AF080 +:2099600003FFFF2808D01CF0E5FF82462878022804DB50461DF05EF95C46B3E000286DD1F0 +:2099800005F06CF85B495C4E086840F00200086009A8C9F800601CF02FFD584E58497078DD +:2099A00009AA0B9005F1E00016F0C2FA554905F58E7009AA16F0BCFA09A81CF0DDFC1921EC +:2099C00009AB3078504A0A9005F1600018F0B0FB4E4A05F17C001A2109AB18F0A9FB4C49B4 +:2099E0005A4605F5AC70134617F064FF49495A4605F5CE70134617F05DFF47480068C0F31E +:209A0000814030B1454A05F1340004215B461AF0E7FEB078012802D10E200DF0BBFC05F13A +:209A2000A0001CF0E1FA05F198001CF0DDFA594685F8241085F83010072085F84002A96032 +:209A4000E962374B1970E960052685F83110354A2E610420AA621BF001F9287805EB80012A +:209A6000401CC1F8B840C0B2287050461DF0E2F81FB901A81CF0FEFA01AF38684FF4FA76CA +:209A8000E6602060B8694146A062388A61766083F8692063786800280CBF40F6C41059467A +:209AA00020616061204E266266622176E661F86800B12062786900B16062B86800B1E061CF +:209AC000C82204F13800594612F088F904F1500059461AF05DFA15495A4604F1B800134604 +:209AE00017F0E8FE204611B0BDE8F08FCC21084068F2002000200940110000E08487020018 +:209B0000155C0200E9650100ADF00100F9DE01009951020031570200B44F00503108020009 +:209B2000661B0120B5460100734A0100BF6802002DE9F04F994E96F83D0096F83F10F37851 +:209B400096F83C800027ADF12C0D0918491E91FBF3F296F83D4077705A43891AC9B208917E +:209B6000810001EBC0018919B1F84C0096F83C10ADF81C00880000EBC1008019B0F84C5074 +:209B8000CDF8248006A818F09DFC70780A97A04500F0A180B946CB46BBF1010F00F09080C2 +:209BA000BDF81C10162966DD002840F09580BDF81C0001AAC01F81B2ADF81C1020460EF012 +:209BC000D1FFBDF81210BDF81C30884608F1070008F1100287B29A4246D89DF80E00962870 +:209BE00042D19DF80F00420839D2800837D3BDF81C0000230093A0EB08001FFA80FA9DF885 +:209C00000D20BDF81C002346401A80B219F038FAF8B9E819B0F5005F15DCF068C5F1885287 +:209C20000AEB443A3B46D21B514602F500521CF0ADFDED1909F10109ADB2B5F5005F08BF74 +:209C40004FF0010B0BE0BDF81C004FF0010BC01D2EE0BDF81C00401EADF81C0004E0BDF83E +:209C60001C00A0EB080023E0204607A914F014FC01281FD030E0F278B9F1000F07D0484B53 +:209C8000BDF81C70A10001EBC401C9188F830899A14220D04249641C94FBF2F05043241A7D +:209CA000E4B2A00000EBC4004018808B4FF00009ADF81C0009997078A1427FF46DAF0AE06D +:209CC000B9F1000F07D0364ABDF81C70A10001EBC40189188F8320B106981BF047FF10203E +:209CE00059E0DDF824804FF6F0704FF40051C5EA0040C5EA0141E1FA40F01FFAA0F283B2AE +:209D0000102102F18852404617F084F871780843707006981BF02AFFA0450FD1F278204FB8 +:209D20001019401E90FBF2F15143401AC4B2A00000EBC400C019808BADF81C00184FBDF8BA +:209D40001C00A6F840504FEA8801A6F8440001EBC80186F83E40C9198D83B6F9422096F8D3 +:209D60003D10012340461AF027FD96F83E10B6F94420022340461AF01FFDBDF81C001628EF +:209D8000DCBF01200A90B5F5005F03DB0A9840F002000A900A980BB0BDE8F08FC01900209E +:209DA000F01900202DE9F04F0546ADF1140D02911CF0C0FD8A4C012D039000F0D280A346FD +:209DC000DBF80000D0F838038047002800F0C58015F0D6FD002800F0C080DBF80410864CA0 +:209DE000896960680F783C30002F40F0B6807D4E0068357880477168F268AB00401AB0FB97 +:209E0000F3F7B0684FF00008C2469146534611464F4573EB0A0301DA884206D84146524689 +:209E200087428A4143DA024600E041461046EB172A46C01B71EB08011CF000F807466F48B2 +:209E400000688846418B00694018643081464FF00001B7EB090778EB0A08784271EB08015E +:209E600025DA1CF089FB024653464146384613F0D1FA884607464FF00001784271EB080125 +:209E800015DA1AF0C7FE054630691CF055FA10B130691CF049FD28461CF047F83069394648 +:209EA0001CF03EFD30691CF03DFD002000E001204D490870884698F8000000284DD1DBF8D6 +:209EC0000000D0F8940000780027394614F048FB00B101274FF0000A381C3CD1DBF8040067 +:209EE00080690078002836D16068404D436C286902216A4698479DF8000060B302984FF00A +:209F0000010901281ED03A4F6268286997F9001011F1020F05D0926B97F900109047626876 +:209F20002869344E96F9001011F1020F05D0926B96F900109047626828696FF001013170B7 +:209F4000397001E062682869DBF80410896981F80090D169884788F800A003981CF06AFE02 +:209F60003AE02068D0F894000078012114F0F8FA03981CF05FFE606880690078012811D11B +:209F80001BF0FAF960B1606880690178012909D10021029F0170012F04D01BF007FF01E05B +:209FA0000EF0F2FC1BF0E8F9B0B960680C30C1680978022909D101680F7837B12068D0F885 +:209FC0004C058047241D20680C3001680F781FB9C16808780228FCD005B0BDE8F08FC0461E +:209FE00014010020D8000020721B0120A4060120B00A0120B10A0120D4050120B40601202F +:20A00000F0B58E4D05F1320184788E4A0E782746ADF11C0D7F1E0B2F03D9FE3F00F0D680D3 +:20A0200008E1DFE817F0C000AC00A0008900F9007B004D003D00300021000C00E100002177 +:20A040008DF80A1010F8031F31F0030706D1521C1170512001211CF067FB02E002208DF8BC +:20A060000A000DF10A03E0E03EB100200146F9F709FF002808BF002000D001208DF80B002D +:20A080000DF10B03D1E0002210F8031F8DF80C2000290CBF101C01201CF010FB03ABC4E05C +:20A0A000C01C002110F8017B8DF80D1004211BF011FA002F0CBF6862A8620DF10D03B4E0D2 +:20A0C000C01C10F8016B002108220746684611F085FEEFB15A4900204870301C15D0401EBC +:20A0E0000ED0401E0AD0401E03D0401E10D101204870384669460CF073F80AE001204870AA +:20A10000384669460CF002FC03E016F05FFA00E002208DF80E000DF10E0386E0002210F8A2 +:20A12000031F8DF80F2000290CBF101C01201BF0A7FB0DF10F0378E0C01C002110F8012BC2 +:20A140008DF811100146521E00F1080004D0521E06D10CF045F801E00CF0D8FB8DF811000F +:20A160000DF1110361E0844600201CF8037F8DF8120007B101200DF11203107055E00021B3 +:20A180008DF8131010F8031F0E2906DCD21C1170532001211CF0C8FA02E002208DF8130066 +:20A1A0000DF1130341E000218DF8141010F8031F0E2906DC921C1170522001211CF0B4FAE0 +:20A1C00002E002208DF8140005AB2EE00025C01C04218DF808501BF07DF91B4948604D80C7 +:20A1E00010F0B4FF02AB20E00021C51C8DF8091028461CF015FA06460421A81C1BF06AF933 +:20A20000014630460DF0FCFD104A352028211CF08BFA0DF1090308E0014600208DF8100014 +:20A2200011F8030F03F0A2FF04AB21466F20012218F0EEF807B00020F0BDC04668060120A0 +:20A24000CCE80020E6040120100A0120300301202DE9F04F8F4E054696F84A00ADF11C0D74 +:20A2600008280CD004280AD0287800F00300012840F0088128690078062840F0038168887C +:20A280004FF6FE74844200F0FD80718F814206D1287F20B9284612F00BFA0446F3E01BF01D +:20A2A00073F9002840F0EC80287FDFF8ECA14FF000082746C34608B30AF12400007804212F +:20A2C00040EAC00010FB01F05FFA80F9698885F81C90FF2019F00CFF48B1E88A49F00103D1 +:20A2E0004FF00108671C2B7740F00400E8825046407830F0010008BF4FF0400B688817F09C +:20A3000059FB08B100206876A87E08B90F20A876287830F07F0008D1E87E50B996F82400C5 +:20A32000411C86F82410E87603E0287800F003002870287E012806D196F82F0018B92878CE +:20A3400008B9002028769AF8010030F0010020D196F8320080081CD3B8F1000F0AD168881F +:20A3600017F028FBA8B1287820B1286900781BF05BFF70B1E88AC00902D3A87E012804D027 +:20A3800028461AF081F820B97AE0E98AE01E0840E8822878012807D128690078022803D1CE +:20A3A000E88A40F04000E882E88AC0093CD2B8F1000F39D19AF8010030F0010034D196F8FF +:20A3C0003200800830D3687E6988AA1D5B4612F03FFB28B10020EB8A687643F02000E8823C +:20A3E000A87978B1698805F1080017F0C3FA07466888B84204BF0021A971E98A41F0400146 +:20A40000E98200E068882978012904D0A9885A460EF0CAFD6888A9885A460BF0B1FF18B197 +:20A42000E88A40F02000E882284606A904F04CFF8046BC4208BF6F88B8F1000F1DD00595D3 +:20A4400028788DF810006C8DADF812406B7D0093E88A019095F82C00029004AA0392728FCA +:20A460009DF81830394640460BF03EFC0446102C04D1404617F0FEFA00E0102420460CE778 +:20A48000112400E0C224284617F0F4FA204607B0BDE8F08F50010120E40401202DE9F04F4D +:20A4A00009AF00268B46ADF14C0D099034469BF80380BBF806100B93B8680A92854D0D903B +:20A4C00038790F964FF00E090C900CE014FB09F02A5C904505D140191AF0F6FB08B1761C70 +:20A4E000B6B2641CE4B2002CF0D0002E0E9600F0D7809BF81450F1B2182000EBC10084B225 +:20A50000281900B20FF05CFD051C06D00F99224611F064FC2E742819E860002D00F0BB8005 +:20A520009BF80340DDF83C80BBF806102046424616F090FD06466C71BBF80600E8809BF88D +:20A540001600688185F808809BF81420E868DBF81010CDF820801BF021FB4446109411948E +:20A56000B8896882387CDFF87091287555E008994FEAC80005EB000A4019817570780AF184 +:20A580001604012810D0B0788AF81D007088ADF81C0004218DF8101004A815F047FDBDF8A4 +:20A5A0001200AAF8180005E00120207001230F9370886080307920719BF80000C00903D32F +:20A5C000A07940F00200A0710F9ED6B9B9F83A006188884215D120798BF80200109E0096FD +:20A5E0000C9B01930D9A0292314603910A9B0999B9F8482058460DF059FCA07940F005003C +:20A60000A07108F101005FFA80F8BBF806109BF80300424616F01EFD064616B10E98404518 +:20A62000A5DC2E4C201D06681198314604E00E4620E00968401CC0B20029FAD1052813DBCE +:20A6400096B1334600E01B6813B99E4202D00BE09E42F8D1306801216060304614F0DEF8FB +:20A66000304617F007FA6668607828716078401C6070284616B131680029D8D11199002EA1 +:20A6800001600CBF606030600C9B00950B993A78584600F077FB0E98002818BF002D15D1F4 +:20A6A0009BF803009BF816708DF81300BBF806608DF814700E9DADF81660002D0CBFB9209A +:20A6C00010208DF8180004A81BF0FDFE13B0BDE8F08FC0462201002050010120EC0A012042 +:20A6E0002DE9F04F0746861CADF11C0D30461CF0D7F886490446182268460EF007FC7D7807 +:20A700000DF10B0031461CF0FBF84FF6FE794FF0000B02208DF816004FF00108ADF8149066 +:20A72000B87A8DF808B0810805D3B87A000934BF0326042603E000092CBF02264646744881 +:20A740000378002B08BF002D00F09680714890F84A10082940F093801BF0D6FD10B1012D7D +:20A7600000F08A80002C27D02079864218BF022D74D1042818BF032803D1042E10D0032ECB +:20A780000ED0022818BF012812D1022E08D0012E06D0022818BF01280AD11CF0DDF807E0F4 +:20A7A000208882461AF0BCF808B9ADF814A003E0B81C14F085FF5C46BDF81430994514D1B4 +:20A7C00019F05AFF70B95448008882462DB11AF0A7F8002808BF504601D01BF0FDFDADF87B +:20A7E000140003464846984235D0BA7A1846B91C2B4611F0F9F907F1020A002841D14648F8 +:20A80000801D016811B1BDF814008847BDF814005146324609F078FC04463E4800784FF408 +:20A82000803141F288321CF047F83A494046087174B1022D05D0012D07D1607940F0100065 +:20A8400002E0607940F0080060718DF816B011E0ADF8149015E04FF0C70812E020888DF88D +:20A8600016B0ADF814002279BDF81400B91C2B4611F0BAF9D84604E04FF0C30801E04FF0CF +:20A88000C208C5B1254803789BB9012D11D144B902208DF816003146012268460FF004FB2C +:20A8A00030E08DF816B00122684631460FF0FCFA04E02A46F8E7684616F0EAF806469CB19E +:20A8C00045B16079022D40F04000607104BF40F020006071B87AC00903D3607940F08000FB +:20A8E0006071A079401CA07156EA08000AD014B1B81C14F0E5FEBDF814104846884201D05D +:20A900001CF02AF807B0BDE8F08FC046A07C0200FC09012050010120EA020120E50401205B +:20A920002DE9FE4F824C00906068C06801910121017080484FF0000A80F800A07E4880F8DA +:20A9400000A02068403001680D681E46174615B9D0F80C0580477949DFF8E481DFF8E49108 +:20A96000886E4FF0E2450AEA0702354008BF002A40F089800D46B5F89E10082253463A40F4 +:20A9800013EA060708BF002A0BD118B14246508B401C50834A4692F90000401E10701D204F +:20A9A000ABE04A4692F90030DFF89CB142F201468E42A3F10103137002D0321D8A4216D163 +:20A9C00018B14246508B401C5083584600680199826C0098904750B1424602F11601008804 +:20A9E000B5F89E30098842F60147874233D15748411C0A78B5F86610B1F5105F12D0AF6E49 +:20AA000042F60600884206D0002FC8D04246508B401C5083C3E7002F71D04246508B401C26 +:20AA200050836CE0A96F5B460C3319604189062A0CD1427A022902F10102427206DB491ED6 +:20AA400089B24181062002F0FBFD58E016F068FE0EF00EFA53E0491C361D88B29E42D082E8 +:20AA600014BFE1201C200FF0DBFC99F9000020B199F90000002854DC48E02068D0F85824AF +:20AA8000514650464CE04A4692F900102768491E117007F1400118B14346588B401C588316 +:20AAA0000868006840680078800925D2284A1078832824D125484378032B1BD1042347795B +:20AAC000D1F8945013707B1CDBB2437195F8241099420DDB817895F831304D1CAB42C4BF2A +:20AAE000491CCBB28370832010701BF0EFF906E0E12002E0852051E7E9200FF091FC99F99E +:20AB0000000040B199F9000000280ADC2068D0F84C05804705E02068D0F8582450460146AE +:20AB200090476068C06880F800A0BDE8FE8FC04614010020B40A0120B30A01205800012093 +:20AB4000D8180120B60A0120D805012004180020741B01202DE9F04F7F4E7068416EADF1D2 +:20AB6000340D02A88847DFF8F4B19BF9000038B17B4890F90000002818BF002040F0E9801E +:20AB80001BF0D8FEDFF8DC910A9099F80000800806D27D2000210CF09FFB0025079001E014 +:20ABA0000025079502958DF80C50059503228DF818206D4CA4F8BE50C4F8C45094F8C80059 +:20ABC000012705F00F013B4620F00F00014384F8C810DFF898A10B9394F8C81063F3C711D0 +:20ABE00094F8D73084F8C81023F0010007F0010343EA000184F8D71094F8D70067F34100D0 +:20AC000084F8D70094F8D70065F3820084F8D70094F8D70065F3C30084F8D70094F8D7001D +:20AC200065F3041084F8D70094F8D70062F3461084F8D700DAF80000D0F8282404F1D80140 +:20AC4000F4209047DFF8288198F80030A3B94946706809788446890910D3C06B8047C4F898 +:20AC6000C40094F8C81021F00F0141F0020184F8C8108DF80C700290D6F804C03E4A3D48D1 +:20AC80004FF080738DE80C00DCF850703B4B006804F1BC01894602AAB8470028708006D560 +:20ACA000022041F2883113F0F1FC0B954DE02C49334F91F90000401C087097F90000401C88 +:20ACC00038709BF90000C6F808902946401C8BF80000022013F0DAFCDAF8001001F1AC0217 +:20ACE0001068077888F8005007B18025308F17684FF67F7303401D432843308794F8D42076 +:20AD0000387860F3C71284F8D420D1F8D400C28CA6F84620428D00F14403A6F844201A686D +:20AD200006F13B052A6058686860D1F8D400C18CA4F8EE10418D00F14407A4F8EC10396803 +:20AD400004F1E4063160786870600A981BF072FF0B980DB0BDE8F08FD4050120B80A012054 +:20AD6000B70A0120701B01205800012014010020B50A0120B4060120200043006D450000C7 +:20AD8000B60A01202DE9F04F0646ADF13C0D032700200A91189D0C93297C0B920CE005EBF3 +:20ADA000C002127F530805D3D30803D212093CBF7F1EFFB2401CC0B2814201DD002FEED19C +:20ADC000B9460124002010E005EBC002177FFB1109D07A0807D307F0040207F00807174359 +:20ADE00004BF641EE4B2401CC0B2814201DD002CEAD1A346B9F1000F08BF002000F0CC805D +:20AE00004FF00008BEE04FEAC8002A184019007F02F11604400880F0B180002760480D97C9 +:20AE2000077837F0010714D1277897B9108B1BF00AFD70B10079012818BF032809D1A0792B +:20AE4000BBF1000F40F08000A07100F0968001200D900C98002814BF2027002700210C2256 +:20AE6000684610F0BBFF237813BB0A9800280EBF4FF0080A47F040074FF00A0A60884FF61B +:20AE8000FE71814228D104208DF81800E379ADF8243006A815F0CAF84FF6FE7000210346DF +:20AEA000B0800A46ADF8003007A813F0CBFE15E03C480078012808D0608847F00C074FF05F +:20AEC0000C0AB0804FF6FF7006E06088FF2147F00807217141F2080AADF800008DF80270D1 +:20AEE000307D8DF8040001238DF80530684607F061FE9DF8141061BB0398417D6171A0F8A2 +:20AF000016A00B9F4776277817B126490978017769890185698A4185297D80F82C106979D8 +:20AF200080F83A10217980F83B10F188C1873189A0F84010717D80F84910B1888187406CE3 +:20AF4000327D31691AF02AFE684616F093FC9DF81410A07940F00100A07151B90D9818B1A7 +:20AF6000ABF101075FFA87FBA9F101075FFA87F903E0A07940F00800A071297C08F10100F3 +:20AF80005FFA80F8414503DDB9F1000F7FF43BAF2846002113F042FC0FB0BDE8F08FC046AB +:20AFA000E5040120DC0101202DE9F041064606F11600ADF1380D16F0DDFE7A48007806F1F4 +:20AFC0001607012818BF02282FD100200DF1320501A905AC8DF8320001220095601A83B25C +:20AFE00001A907A815F084FE98B16F4800680DF1330101AA10F074FEADF81C00BDF81C40E8 +:20B00000C82C12DA03A8394608221AF0C7FD214606E003A8394608221AF0C0FDBDF81C10E5 +:20B020000420142201AB18F033FA3846FF211AF0F6FC10B15D4901200870002402A83946EE +:20B040008DF804401BF05CFC1BF05EF948B901A812F04EFE012804D02046394608AA19F0CD +:20B0600005F83079534D012861D006285FD0691C0B7804282AD0032840F0918038460DF1BD +:20B080001E0119F055FA58B14FF6FE7039460DF11E0218F0EBFF214638460A4613F0D2FDE7 +:20B0A000BDF81E0006A918F0F7FF069838B906A818F0B6F818B9BDF81E0006990880B11D84 +:20B0C00038460EF06DFC12F0FFF868E0002B66D038460DA901AA10F003FE01469DF83400F9 +:20B0E00000285CD08DF8154020460290019001278DF81640142201AB8DF81470042018F07F +:20B10000C7F9B21D4FF4817010211BF007FB06F1060828B94FF48170102142461BF004FB51 +:20B120002D1F384603216C7118F094F837E0721D1021204612F8017F1FB9491E00F10100B8 +:20B14000F8D11B4F10280CD07179B01D18F042FE387808B12878D0B170790DF025FB2C707D +:20B1600015E0387898B9204662210DF1220211F01DFD0DF12200214618F02CFE20460DF097 +:20B1800013FB0DF122002146102210F027FE0A480178052903D1C079802113F059FF0EB003 +:20B1A000BDE8F081E5040120EC060120CFE80020B50101206C060120C40301202DE9FE4FD0 +:20B1C0009B461546894682461BF0B4FB7B49019008680CAF504508BF48687B4C6FF0010827 +:20B1E00028B1B8301BF0A8F8002840F0D68019F023FD061C00F0DB8004F5CE701BF094FBCE +:20B200000023B4F9B400C6F80C90401C86F832306FF31F30A4F8B400C6F808B0B4F8B4003D +:20B2200030866748C6F810A097E80C0020210027B8461940104006F1180383E80300424699 +:20B2400086F8332006F1200383E88001E8683064287C86F8440028687063287986F8380013 +:20B26000A868F0636869B064A869F064287F86F85000687F86F851002F7C27B9EF6817B14C +:20B28000012086F844002F795FB999F80C0000F00F00022805D1012086F83800D9F80800BF +:20B2A0007063484608274568002D18BF002F70D100886FF30900B0F5305F18BF022506D1E1 +:20B2C00096F83300082540F0100086F8330006F1180090E80C00414606F1180745EA02002E +:20B2E000194387E80300D4F8D800824507D194F8DC00410824BF00F0FE0084F8DC003148EA +:20B300000768002F39D004F1A0000090D4F8A810D4F8AC2004F198052B463046B84710F1CC +:20B32000030F10D0B6F93010B4F9B420914207D0B4F9B41001F6FF716FF31F31A4F8B41017 +:20B3400010F1020F1BD010F1030F18D096F83300B6F9308040F0800086F8330000278AF8CB +:20B36000FC702868864205D0F068007B00F00F0002281CD112F002FA19E06FF00200B4F946 +:20B38000B410804601F6FF716FF31F31A4F8B41005E07F1E2846FFB285E76FF0020894F8A8 +:20B3A000DC0040F0040084F8DC00C4F8D8A001981BF040FC4046BDE8FE8FC04620F3002020 +:20B3C000FFEFFF9F040B012068F200202DE9F04F8246DAF8185069782878EA7800EB0120F1 +:20B3E000A978ADF1240D034601EB0221069116F0E1FA012800F0D6804FF00008CDF8108082 +:20B400001846CDF8148016F0D5FA2D1D48B96F480088984205D06E480078022800F0C280DD +:20B42000D0E015F8014B5CB160000EF0C9FD049030B1049A204629461AF06AF8054600E053 +:20B44000444615F8017B5FEA07090AD078000EF0B7FD059028B1059A384629461AF058F828 +:20B4600000E0C1465B480568002D76D04646079608966868017800296CD0AA7B520869D332 +:20B48000AA68002A04BF8668DDF820B004D0012090474FF0010B0646002E5BD070880699C7 +:20B4A000814204D006984FF6FF7181424CD1F279B3680499204618F09EF838B9327B336961 +:20B4C0000599484618F097F800283DD009EB0400022110FB01F01430C0B219F037FD071C47 +:20B4E0002AD0D2203870BAF80200788087F80C90002C3C7104BF0798B86008D007F11400BA +:20B500000499B860620007F114001AF047FBB9F1000F04BF0898386108D0059907EB44005B +:20B520004FEA4902143038611AF038FB686840680078394615F056F93078274908F1010791 +:20B5400001F808005FFA87F8BBF1000F02D0304616F090FA2D68002D8BD1B8F1000F05D1D3 +:20B560009AF80C00A8B90023984600E00023174800880090CDF80480174F02979AF8100067 +:20B5800003909AF811100AF1020248F2060012F01BFD049808B116F06DFA059890B116F066 +:20B5A00069FA0FE000930020019002909AF8100003909AF811100AF10202802348F2060099 +:20B5C00012F002FD09B0BDE8F08FC046E0030120E5040120C00A012054050120FEB50E460D +:20B5E0001BF0A8F900257F4A7F4C517855708A080ED2C9081AD31BF01DFBA4F1080000F177 +:20B6000008048068D0F858242846014690470FE01BF010FB6068C068007828B92068D0F8C8 +:20B6200058242946012090471BF084F91BF002FBB00941D337E02168D1F898205060009861 +:20B64000D1F8401388472168D1F89800D1F85413001D884732E01BF06DF92168CA6B117B2C +:20B66000491E11731BF0E6FA216800983C31CB6D0278586000988DF8042047782FB1162ADC +:20B680000AD1D1F81813684601E0D1F80413884721689DF804203C31162A06D0C86DD1F8DA +:20B6A0001813001D884721683C310868001D18F04CFB00280090CED1300C08D32068D0F8E3 +:20B6C0009400007813F096FC00280090B3D1700907D327682E20D7F840138DF8040001A809 +:20B6E0008847700807D327682520D7F840138DF8040001A88847B00807D327682620D7F8FC +:20B7000040138DF8040001A88847F00807D327682720D7F840138DF8040001A888473009D1 +:20B7200007D327682920D7F840138DF8040001A88847F00909D32D2027688DF80400D7F82B +:20B7400040138DF8055001A88847300A09D3302027688DF80400D7F840138DF8055001A821 +:20B760008847700A09D3352027688DF80400D7F840138DF8055001A88847300B07D38DF829 +:20B78000055037208DF8040001A81BF037FA700B07D38DF8055038208DF8040001A81BF0CB +:20B7A0002DFA2068D0F898000068C8B11BF0C2F82168D1F898100A6800920D601BF03AFA2A +:20B7C00021680098D1F8982050600098D1F8401388472168D1F89800D1F85413001D88478E +:20B7E0002846FEBDD8000020140100207D492DE9F04F0A680646ADF11C0D0DF10E000260E5 +:20B8000049684160F08900280CBF08210221B569764A15F80180D0B973490F781046294621 +:20B820001AF0ACF880B937F001004FF6FE7434D128461BF035F800282FD00179012918BFF5 +:20B8400002292AD1048821E06948048825E069782878674F00EB01243888A0421CD0624973 +:20B860000878002530F0010017D120461AF0EBFF98B10179012910D18DF800504088ADF8B0 +:20B880000C00684614F0D2FB00B101ADB8F1000F18BF4FF0FF0800E015464FF6FE70A04219 +:20B8A00018BF002D03D1377B002F40F0988051494F68A0424FF00B0910D07DB138F00100CA +:20B8C00008D0307B012800F08A804FF0000B4FF0800A0DE04FF0000BDA4609E0F3894FF0B4 +:20B8E000000B4FF0810A002B0CBF441C0DF10E0507F801AB002D14BF291C0DF10E01384691 +:20B900001AF0FEFF0746384D07F8014B20123870287830F0010053D1B8F1010F50D13448EE +:20B920000088A0424CD1BAF1000F49D18DF816B00DF1160012F01AFD7F1C051C3CD0F489EF +:20B94000002C0CBF08210221B0699DF816404018427805EB4201A242A4BF58468DF81600DB +:20B960000ADA9DF81600801A8DF816009DF8160009EB40095FFA89F99DF8160007F8010B8A +:20B980003A709DF816407CB17F1E087807F8020F9DF8164031F8020B00127870601EC4B2A9 +:20B9A000002C8DF81640F0D1284616F063F809F102005FFA80F903E087F800B04FF00C09BC +:20B9C0000C49F28910204B46C87042F4004206F11100B11C12F060FB064880F803B007B0C4 +:20B9E000BDE8F08FE07B0200E50401201C030120E0030120280401202DE9F0470646F08919 +:20BA000017468946ADF1280DC01D80B205460DF00DFE7A4CFF280BD12846FCF715FF8542C0 +:20BA200004DD641C207800B90520E3E0012000E000206178D9B917B1022F18D1B8B1307AEB +:20BA40008DF80C00F788ADF80A70B588ADF8085000230093E18E94F8330001AA032304F0D4 +:20BA60004DFA9DF814003074BDF81070B78194F83310E58EE06806AA0423884649031AF040 +:20BA800085FE069800F0FF0100F0FF007E2806D140467C2117F08AFE069901F0FF017C2942 +:20BAA00040F0A580F08942F20102C11D8FB2E9198A4240F39A80F188327AC1F301238DF8C5 +:20BAC0001D10B18843EA82038DF81C308A1006468DF81E200423C0F3851201F0030142EA42 +:20BAE00081128DF81F2010FB03F1F21D01F0FC01731990B28DF820101FFA83FA0D282BDB9F +:20BB00004846314600221AF079FD0246052107A81AF074FD9DF82010334600F03F064A46E3 +:20BB200041EAA011B0008DF8201040F0020096268DF8210029468DF82260404615F06AF9CC +:20BB40000646514607AA07234046667015F062F9304360704DD135E004F1240049463246D5 +:20BB60000DF0D4F907A90A68301900F12409484609790260731D0171002204F1240099B278 +:20BB80001AF03CFD9DF82010962300F03F068DF8223041EAA011B0008DF820103B4640F0E6 +:20BBA000020007AE49468DF821003268B0790A60B288887140468A8004F12402294615F01A +:20BBC00029F96070E18EED194FEA8806AAB2C919E18606EBC8010919A1F84C2048B1404632 +:20BBE000514614F0D9FD607803E0052000E001206070C0B20AB0BDE8F087C046C0190020DC +:20BC00002DE9F04F09AF3D7AD7F804800E1C9A4693460446ADF12C0D26D0207A29098DF8C2 +:20BC2000260010D302281FD121881AF0C9FC884209D008460322012111F0F1FF002818BF41 +:20BC4000CD2040F0D580237A022B07D00F2B05D0032B0DD0012B0BD033B909E0208815F02E +:20BC6000A9FE18B90F2B03D10220C1E00F2323728DF80830032B1CBF2088ADF8000003D1CD +:20BC8000684621461AF03CFEA8081DD25A484FF000090368ADF8109043B15868864203D0C3 +:20BCA0001B68002BF9D101E09A681AB9B3688BB158880DE031780220904758B10188ADF859 +:20BCC000101015F0D7FE05E04FF6FF704FF00009ADF810006809ADF818900BD39DF808009B +:20BCE0000F2807D0012805D0BDF8180040F00400ADF8180035F07F0005D0BDF8180040F004 +:20BD00001000ADF81800E80938BF484606D3BDF8180040F00100ADF8180001208DF8250081 +:20BD2000E80805D3BDF8180040F04000ADF818008DF82490A80934BF012004208DF81B007F +:20BD400039680591ADF80EB0ADF812A03D7B8DF81C50637A8DF80B3098F800008DF81A007D +:20BD60006189ADF80C1030788DF80A0019F05EFD20B1016911B168468847637A19461AF0BD +:20BD80002DFD78B909A815F041F9504506DA1B480168A1B168468847074611E0684600F06C +:20BDA00031F9F9E716480068D0F80001C0892238C0B2504503DB684605F010FCECE70227B7 +:20BDC0009DF8080002280CD11AF0FAFBBDF80010884206D1307898F800105A463B4616F0EB +:20BDE00051FE27B998F80000401C88F8000038460BB0BDE8F08FC046C00A0120E80601204B +:20BE0000140100202DE9F84F0AAF97F80090984692460D46044615F0C7FC0746754800266D +:20BE2000B346002F38D1B9F1000F20D117F016FB071C00F0DC8031461C220FF0CFFF3C8062 +:20BE4000BAF1000F7D8106BF0120B87487F812A069485E300078012818BF072002D15046A0 +:20BE600019F0A7F8787406203874BDE8F88FB9F1010F0FD105466878B8F1000F52D030F071 +:20BE800001074FD15C49097889084BD3204617F035FD41E005463FE005466878B9F1000F97 +:20BEA00012D1B8F1000F0BD1B97851444910CBB2BB700BB90121B9707B780BB90321797071 +:20BEC000B97806292EDD2BE030F0010306D14B4920310B6813B1184680476878B8F1000F18 +:20BEE0001CD030F001031DD143490978890819D342482430026812B1414638469047387823 +:20BF00000D2809DA401CC0B20C28387004D1204617F0F4FC7E700126687803E03146397035 +:20BF20004FF0010B022825D1B9F1010F22D1B8F1000F1BD0B8F1EB0F18D0B8F1E10F19D039 +:20BF4000B8F1F10F16D0B8F11A0F13D0B8F1190F10D02A49AB7D0A79521CD2B29342C8BF80 +:20BF60000A7107DC002201260A7106E023490022091D0A7056EA0B0739D030F0010714D123 +:20BF80001D490978890810D320461AF05CFC58B1BBF1000F03D0417901F0FE01417136B3A2 +:20BFA000417941F001014171687806B3144E30F001000DD196F83200800809D3204619F055 +:20BFC0008CFD28B12146002017F0F6F8BDE8F88FF08FA0420BD12146012017F0EDF86878C6 +:20BFE000022804D14FF40050012103F0D7FCBDE8F88FC046E404012082010120E4020120E1 +:20C00000500101202DE9F04705467B4895F80B900078ADF1180D002808BFBA2000F0E980CE +:20C02000684600210C220FF0D9FE01264FF0000A298B8DF80560C8080AD39DF80220C810E3 +:20C040000B0942F040028DF8022038BF032602E09DF80220C8104B0928BF46F04006400821 +:20C060000FD342F0C00288098DF8022039BF9DF8030040F002009DF8030040F001008DF8A2 +:20C08000030001EA6100000A28BF46F00806287A5A4F002830D00F2828D0022822D0032833 +:20C0A00018D0012832D1387848B94FF6FD70ADF80000288842F00C0246F0040608E028889C +:20C0C00042F0080246F480564FF0FF09ADF80000824619E02846694617F0F0FA9DF80220A2 +:20C0E000298B13E02888ADF800000FE0288842F0080246F0040605E01AF062FA9DF8022027 +:20C1000042F00402ADF800008DF8022048081AD312F00C0F0DD1288813F08FFD002808BF35 +:20C12000BB2066D09DF80220298B42F020028DF80220480807D302F00C00042804BF42F03F +:20C1400020028DF80220A87C8DF80400684606F031FD9DF8140000284BD1039CE682E87E3D +:20C160006076287FA076287A012804BF38782077A87E2085288B6085E87F84F82C00288B32 +:20C1800000EA6000000A15D395F82000667D804617F0B2F9071C0DD03A7C002008E007EBAB +:20C1A000C001CB7E984504BFCE763A7C401CC0B28242F4DCA87A84F83A0084F83B90A4F8BE +:20C1C0003CA0E889E087288AA4F84000A87E84F84A00A87F84F84B00687F84F84900606CCB +:20C1E00069696A8A19F0DAFC684615F043FB9DF8140006B0BDE8F087E3060120DC01012026 +:20C200002DE9FE4F07462C200DF0DAFE0028386100F0E48000212C220FF0E0FD38694FF607 +:20C22000FF7585823C6938880DF1020111F03AFADFF8B4B158B30DF10200694619F0C8FB26 +:20C24000BDF80000854222D000200626BDF800102074BDF80020634B66828E00A28206EBBD +:20C26000C100C2181168A1611168491C11601E584FF47A74B6FBF4F06043361A07D1012031 +:20C280005E46107230784FF4006112F0E1FE39693888083111F006FA5448846880461AF057 +:20C2A00033F868B138690021418238696826868238690223037438698461621CC8F8082055 +:20C2C0004B48D0F800903869DFF828A10446A18A2E468E4254D104F10800494619F04EFB76 +:20C2E00048B919F02BFC0146484619F047FB10B91AF00AF860B13888396902F065FC00242E +:20C3000000B1012400200CB139698D823969087438690446A18A8E4232D15146303991F829 +:20C320002F303BBB91F86510012923D101200DF10A013A221AF0E3F8C8B901209DF80A5090 +:20C34000207400233A22A5755D466382D8F80410A2822878A161D8F80410491C0129C8F84B +:20C36000041005D14FF4007112F072FE00E0A5823C692046828A3146914204BFA121397512 +:20C38000818A8E4224D0017C01290ED0BE6856B919F0BAFF20B9B878400838BF052100D311 +:20C3A0000D21204602E00D2100E00E210177B87800F0030001281ABF51460878052039694F +:20C3C00048703C69607819F031FC6077BDE8FE8F15F050FB00203861BDE8FE8F10203875D1 +:20C3E000BDE8FE8FE0E80020CB030120100A0120EC060120800101202DE9F04785682A6878 +:20C40000D16944681162490832D3D4F8C01049BB2968486820F0020048602968486A20F07F +:20C4200003004862D4F8CC002A6941686F69096847EA0200C862D4F8CC006E6941682A692A +:20C44000096846EA0200C1F804052968486920F001004861286801210162284618F038FABE +:20C46000BDE8F08703220A7402F08AF9BDE8F087D4F8CC0041682A696F6909684FF0000907 +:20C480000226CA4647EA0200C1F80405D4F8C070002F00F0A880D4F8CC00D5F814E040682B +:20C4A000D4F8E0C0D0F80080BCF1000F04D1EA69A86904F1D80103E004F1DC016A6A286AEA +:20C4C000D8F8043513EA0E0F11D0806810F0070F0DD13868D4F8D030984208D17F6937B985 +:20C4E0002B68586A20F002005862C8F804E5906810F0070F74D10F68002F71D0D4F8D40098 +:20C50000BCF1000F3844C4F8D40014BF48462020C4F8E000C1F80090D4F8C010D4F8D02075 +:20C52000086890424BD8D4F8D420904247D881F81090D4F8C80004F1300730B9D4F8C01087 +:20C54000C4F8C810D4F8C80008E04369002B34D1D4F8C0104161D4F8C01040694969C4F8FE +:20C56000C010C0F814A0D4F8E00000280CBFD4F8D800D4F8DC00C4F8D000D4F8C000C4F8C0 +:20C58000D49088B12046294605F02AFB94F8FE0078B1D4F8CC00406801686869D1F80425F0 +:20C5A000024218BF886204E02968486A20F00300486238461AF0DEF912E01846C5E72046D1 +:20C5C000294605F00DFB94F8FE0048B1D4F8CC00406801686869D1F80425024218BF8862FB +:20C5E000761E7FF453AFBDE8F08770472DE9F84F0746714D714C28684030D0F89410267830 +:20C6000091F883B026B1D0F80C0580472868403001680E6816B9D0F80C058047A046694901 +:20C62000674C0120012F88F80000D1F8009067702AD9DFF894A1654EBF1E59D07F1E52D0BF +:20C640007F1E3DD07F1E73D07F1E34D12968096C096891F86D20628191F86E70002F06BFE3 +:20C66000E070071CE770686840683178007811FB00F0784381005046C16690F8701021F049 +:20C680000F0141F0030151E000202E686071306C0068D6F8D410C08AC00934BF91F8250033 +:20C6A00091F84E00A070B7B9CF78A7B10228C4BF0220A0700FE02868D0F84C05804737E02F +:20C6C0002868006C006890F86910617190F86A00A0700027A77109F0C7F92868006C0068C5 +:20C6E00030BBBDE8F88F0020607116F053F81FE030788700D9F83C00804771683C22401A4E +:20C70000B0FBF7F0B0FBF2F15143401AC0F1780086B2D9F83C00804707FB06015046C16610 +:20C7200090F8701021F00F0141F0020180F870102748007898B92868403001680F682FB9A4 +:20C74000D0F80C0580472868006C07687A686178107800F0200020719078E07100E06178D8 +:20C76000032903D0022918BF062923D11AF0E2F805466078022815D01648077817B9164973 +:20C780000F787FB10221BBF1010F88F8001004D10078832801D112F027FE28461AF04AFAC6 +:20C7A000BDE8F88F832088F8000028461AF042FA18F098FBBDE8F88F14010020741B0120CA +:20C7C00004180020D805012058000120D8000020641B01206F1B0120711B01202DE9F04F61 +:20C7E0000746ADF11C0D10980D460590287A99461646012818BF032805D127B1FF2F02D0DF +:20C80000032802D10EB90020CFE0694C237833BB0420684B8DF800001888ADF8020019F09A +:20C820008DF90DF104080146404619F053FE684606F0EAFC19F0B2FEBDF8021081420BD099 +:20C840004FF6FE71814207D0ADF80200404619F0FEFF684606F0D8FC01202070287A4FF04D +:20C86000040B02284FF000048DF800B015D003280AD001281CBF4FF6FE71ADF80C1017D1BC +:20C880002888ADF80C0012E001A8294619F022FE684611F02DFA38B109E02888ADF8020005 +:20C8A00068460FF0D5FA10B9684606F0ADFC287ABDF80C10012818BF049402D1012026467B +:20C8C00004904FF6FE7088426ED0DFF8EC8025460E2015E015FB00F318F80320BA420DD128 +:20C8E0004344DDF810C05A78624507D15A888A4204D11A79B24208BF1C1C04D06D1CEDB2B6 +:20C90000002DE7D02CB3B9F1000F4DD0DDF814A04F468146AAF1020A3AF8026F2046314672 +:20C9200018F0D2F990B984B1607904280DDA04EB4000C6806079294615FB09834A46401C75 +:20C940006071022016F0A4FD00E000247F1EE3D12AE02546824625E015FB0AF018F800206C +:20C96000FF2A1DD100EB080408F80070049860706180B9F1040F2671C8BFD94605994FEA1B +:20C980004902A01D84F8059019F008F92B01022029465246A3EB4503434416F079FD03E063 +:20C9A0006D1CEDB2002DD7D0204607B0BDE8F08F200901208A010120220100202DE9F04FAC +:20C9C000724C002704F19800ADF1140DB946B846056802978246CDF80C903DB3D4F8AC0092 +:20C9E000B84203D1D4F8A800B8421DD0D4F8A8600EB3D4F8A8102869096988421BD195F8AF +:20CA00003300400917D3D4F8AC60A6B90127D4F8A800C06840880028F9D0D4F8A800C06860 +:20CA200040880128F3D006E0012704E004F1E000022119F09DFF002D43D087F0010B03A845 +:20CA400002AA59460BF010FE5FEA000809D0012F07D0039929B104F5AC7019F071FA4D46BF +:20CA60002FE0002D2DD04A48066856B3B8F1000F27D0039828BBCDF800B002980190D4F8DB +:20CA8000A800D4F8AC100AF108035246B047401E02D0401E08D014E0029800B92846012194 +:20CAA0004B460091014605E001230093D4F8A800D4F8A8100069B1F930104A4604F056FC50 +:20CAC00060E0002F5ED0002D5CD060682969884252D1B8F1000F0BD0039848B1D4F8A8007E +:20CAE00030B9D4F8AC0018B9082016F0FDFA49E0082018F047FE95F8330004F1E006C0F3F3 +:20CB0000001028B9504618F010FAC4F8A80004E0504618F00AFAC4F8AC00A8691D49C043B0 +:20CB20000860A8694A6810434860E869C04341F8080CE86951F8042C104341F8040CEC6874 +:20CB40000820294618F08AF8204618F051F82088A0F6020040B141F21E01401A04D041F615 +:20CB6000E671401A012803D80120214618F076F84FF08041304603E004F1E0004FF48061B0 +:20CB800019F0F6FE05B0BDE8F08FC04668F20020080B0120101004402DE9F047ADF1200D8F +:20CBA000109C1D4682460E469046E811002110221FFA80F920460FF011F9C5F3C307D6B11E +:20CBC00004A82146102218F0E9FF20465146102218F0E4FF04A8214616F088F810262246CF +:20CBE00013781AF8011B761E81EA030102F8011BF6D18035ADB24846411E00281FFA81F9E0 +:20CC000040F09980002F72D00E2F28DA04A82146102218F0C3FF204600210E220FF0DEF880 +:20CC20003A462046414618F0B9FF2E128020E05521461022E5736846A67318F0AFFF04A898 +:20CC4000214616F053F810206B46227813F8011B401E81EA020104F8011BF6D187E004A8BC +:20CC60002146102218F09AFF2046002110220FF0B5F83A462046414618F090FF802021460A +:20CC80001022E055684618F089FF04A8214616F02DF8102721466B460A7813F8010B7F1E2C +:20CCA00080EA020001F8010BF6D104A82146102218F074FF204600210E220FF08FF8281205 +:20CCC000E57321461022A073684618F067FF04A8214616F00BF810206B46227813F8011B76 +:20CCE000401E81EA020104F8011BF6D13FE004A82146102218F052FF204600210E220FF016 +:20CD00006DF82F128020E573214620701022A773684618F043FF04A8214615F0E7FF10200C +:20CD20006B46227813F8011B401E81EA020104F8011BF6D11BE004A82146102218F02EFF61 +:20CD400020464146102218F029FF04A8214615F0CDFF22460021137818F8010B491C1029D2 +:20CD600080EA030002F8010BBFF645AFF3E708B0BDE8F0872DE9F8430646307B8946034689 +:20CD800018F0C4FD0125041C5ED1D6F8008077891C461C200DF014F950B100214173047312 +:20CDA000478101818173C173C0F8008041614160041C00F0C18000270781307C2074708A4C +:20CDC0006082337C23BB716911B30F460E200DF0F7F8E0B1394691F83820027091F8392092 +:20CDE000427091F83A20827091F83B20C270CA8F8280B1F84020C28091F84220027291F808 +:20CE00004A2002734A88428191F849104173074638466061308B20836189B07E4FF67F47FB +:20CE20002E46A07607EA0100C108608108D2454914310A78802707EBC2110843608104E021 +:20CE4000608940F08000F9E700266089DFF8F080B9F1000FC0F3C21224D10AB3810911D2A4 +:20CE6000410909D2C00838BF281C10D319F093FC00F02000801C0AE019F08DFC00F00F00E8 +:20CE80000A3004E019F087FC00F07F005F3020810420474660733878202112F0D9F817E00A +:20CEA000002515E0022060732068C089C00803D3404634300088208152B160894FF67F41F0 +:20CEC0004FF680770140618107EBC21001436181012E32D1667B27893CB3012E0AD0042E1C +:20CEE00002D0022E0BD020E0042017F07DFF142805DD1AE0012017F077FF202815DC6673E6 +:20CF000000202781104960600868002808BF0C6003D00146486830B94C60404600782021C7 +:20CF200012F096F809E00146F4E7606908B114F0A1FD204614F09EFD00252846BDE8F8837A +:20CF400050010120E5040120E40A01202DE9F0430E4680460E220021ADF11C0D03A80EF022 +:20CF60003DFFB06A417811F01F0F18BF002040F0CC80880924BF01208DF8180031F07F002E +:20CF80001CBF01208DF81700C80924BF01208DF816009DF816200024012A03D0307A00B141 +:20CFA000B46902E0F07900B1746934B10DF10E00214619F0A5FC9DF81620554DB189012AA7 +:20CFC0006F78ADF80C1020D1287F27F00102104300F09A80002F00F09780022F04D119F055 +:20CFE000DDFA884240F09080708914F0E3FC002840F08A804CB118F0A1FD01460DF10E001C +:20D0000018F0BCFC00287FD06F78DFF8089137F0010019D148460078800815D39DF816004F +:20D02000012811D0BDF80C1019F0B8FA88420BD09DF81700012807D0084618F05AFD18B193 +:20D04000BDF80C0015F0C4FB9DF81600012821D0BDF80C1019F0A2FA884211D19DF81700B8 +:20D06000012808D02C48007800F00700022807D101208DF818009DF818000AF055FB3EE0F7 +:20D080009DF817209DF8183008460DF10E0107F089FB34E000249DF818008DF81A4028BB6A +:20D0A0006978074631F0010003D0022908BF251C01E09DF8175019F0F6F8484618300078F8 +:20D0C000082818BF042811D14FF6FD70ADF8000018F034FD01908DF809408DF808708DF8CA +:20D0E0000A508DF80B4068460CF0EAFC9DF818000AF01AFB52200DF11A0114F05BFE074883 +:20D10000016809B103A88847404607B0BDE8F083E404012082010120501A01201C040120A4 +:20D120002DE9F043002507460C22ADF1340D294668468DF814500EF051FE6A4CDFF8A8811E +:20D14000B87804282DD001280BD0062809D0022805D003281CBFB3208DF8140024D11B20CA +:20D1600020E06078D8B919F097FA40B9B9684646082206F11C0018F011FD38883080E079EA +:20D1800002280CD1B8680BA906AA0EF0A9FD9DF8280010B99DF82C0008B9B1209FE02320C5 +:20D1A00000E022208DF804009DF81400002840F087803888BE7BADF800003B698DF8056090 +:20D1C0007A7B0293012A14BF012021208DF80200684605F0EFFC9DF81400002870D10398A3 +:20D1E000466C05233370B8787070796829B9B01C294610220EF0F2FD03E0B01C102218F09C +:20D20000CDFCB8781236012812BF0628F87806F8010BB968304619F05DF9B878083604289B +:20D2200006D0012804D006281CBF387B307004D1AB202946324613F017FA388814F0BAFBAB +:20D2400010B103980421C1829DF81400002837D1B878042809D0386918B9684614F00AFBD3 +:20D260002EE068460CF04EF92AE0B8680DF12D0106AA0EF035FD06469DF82D0018B94FF655 +:20D28000FF70B0421CD038694FF0010918B9684614F0F0FA02E068460CF034F9B96808A860 +:20D2A000082218F07BFC8DF8289028468DF8295031461422079006AB0690042016F0E8F887 +:20D2C000607850B919F0E8F938B946462946082206F11C000EF082FD35809DF814000DB0C2 +:20D2E000BDE8F083E4040120B4080120F8B5694C2168054614310868407F002800F0C88026 +:20D30000D1F8C000B5F84220C08C904240F0C080D1F8581305F128008847002800F0B88076 +:20D32000206840690026467721687031486E90F8290028B16068816A0220884721687031A1 +:20D34000086890F82B0018B16068816A01208847287C400908D36068816A1020884720683C +:20D36000D0F82813802088476068C16B202088472168C868D1F8FC1410308847686822683D +:20D3800041785269007800EB0120C0F30321517622685269C0F3003797762268526900F086 +:20D3A0000F03C0F3031793772068D0F8D40080F82C7022680C32D2F8C81091F84F000F28D3 +:20D3C00006D093689B7F984202DD6B68DF780FB19068807F4873106880F83060D2F8C800FB +:20D3E000417B0F290BD19068C07E022850D1D2F8580180472068D0F86C018047F8BDD2F8EF +:20D4000000252846904723680C339868C07E022815D1D3F8F014186888472268D2F8D40044 +:20D420001169467BD06831F81630D2F8F0244FF4707707FA06F1C91A904723680C33D3F8BB +:20D44000C8002A89D3F8A83190F82C1002209847206800F11401D1F8C020D0F8D400527B48 +:20D4600090F82C0082420FD00868D1F8E81488472268D2F87C015169886050694169D2F8B1 +:20D48000F024904721681431D1F8141310208847F8BDC046140100202DE9F047674CA368E9 +:20D4A000002589468046ADF1280D002B8DF8245000F0BC802F46FF264FF6FF7AB8F1030F7C +:20D4C00018BFB8F1020F04D193F84200904240F0AD80384617F0A8F8B8F1010F04BF8520A4 +:20D4E0008DF82400B8F1000F10D0B8F1030F0DD0B8F1020F08D1A068B9F1000F0CBF012112 +:20D50000022180F841100DE0A0680BE0A0680121B8F1030F80F8411004D1B9F1000F18BF2C +:20D520008DF82490B8F1000F4FF0020112D090F84120012A0ED190F8433033B990F84830FC +:20D5400013B15B1E80F8483004E090F84320521E80F8432090F843304BB990F8483083B151 +:20D56000A568C26C867B00F12007AD1D05E00746A568426C97F82E60263502EB430232F8CC +:20D5800002AC9DF824308DF8181043BB3FB390F84110012914BF212422247988254BADF8E0 +:20D5A00010101978032280F842100DF11A0029468DF8222019F0A4F9CDF800A00DF11A005A +:20D5C0000190029678780390BB7BBA1D04A920460DF040FE1848008817F026F826E0418868 +:20D5E000ADF8101009AF009740780190A06848F22002012304A914F02DF804F108052868DE +:20D6000090F8401002290FD1418CADF8101009AF009790F821000190286848F220020123FC +:20D6200004A9203014F016F811F09CFD0AB0BDE8F087C04628040120E40601203C050120AB +:20D640002DE9F047634F8046381D0068416EADF1280D02A888475B4D2A68403210680068C1 +:20D6600020B9D2F80C0580472A68403256484FF001096E6880F80090F068007830B9D2F8E3 +:20D6800018244846002190472A684032106801684C68088921788246C1F3401109F01CFE25 +:20D6A000079010F095FD494E746786F873A00024A6F8664019F03EF9059482463146B8F115 +:20D6C000010FA6F8664004BF4148C1F8B80038F001083E4654D1A1F89E4001F16400C1F8D9 +:20D6E000A00091F8A90002231A4602F00F0220F00F00024381F8A92091F8A80004F00F07EF +:20D7000020F00F0047EA000291F8B3708C6627F00F0081F8A82040F0040009F00F0291F8EB +:20D72000717081F8B30027F00F00024381F8712028684030006800684268127801F1640706 +:20D7400092090FD301F120028A66406891F87150807803F00F0381F82E0025F00F00034348 +:20D7600081F8713001F1100001F19C0242604A7F04F00F0322F00F0213434B77014601E029 +:20D7800064310F467068174A056D08238DE81800114B106802AAA84710490028088006D4EA +:20D7A0000F4991F90000B760401C087004E0484641F2883110F06AFF504619F03BFA0AB047 +:20D7C000BDE8F08714010020B30A012058000120801A0600D405012021A90000D40A01203E +:20D7E000B60A0120B40601202DE9F04FDFF898910646A9F1080000F108078068D0F8000179 +:20D80000807AADF12C0DC0000CF0DAFB0028089008BF1A2500F0B48019F08CF800244FF0CC +:20D82000FF0B25460A9027E0ADF800608DF80240D2F88823D02069469047D8B99DF80C00E9 +:20D84000012802D19DF80B1019B998B99DF8071081B1002814BF082304230DF103005B1E54 +:20D8600000F801BBFBD105703868D0F894246946D0209047641CE4B23A6802F58072106804 +:20D88000C07AA042D0DC4C462068D0F80001C0884FF6FF78AA461DE0089901EBC0018A888C +:20D8A00096421CBF401CC0B261D1C1F800A0A1F804803A68D42004A9904702E07F1CBFB237 +:20D8C00025E020682268D0F800016D1CEDB202F58072C088A842D8BF55464BDDADF80060C6 +:20D8E000ADF80250D2F88823D120694690470028E7D1BDF804008045E3D0ADF810002068F7 +:20D90000D0F8882404A9D420904790BB5746226802F580721068C088B84210DDADF8006014 +:20D92000ADF80270D2F88823D120694690470028C4D1BDF81000BDF804108842BED12068B8 +:20D94000D0F80001C088B842BBD1ADF81480ADF8168006A8594608220EF040FA2068D9F8B4 +:20D96000003000F29447D3F80001837A5046834292DC19250A9819F05DF9089814F07AF8C3 +:20D9800028460BB0BDE8F08F140100202DE9F04160485F4E614C604D70601030B06004F1FA +:20D9A0004400B0E88C1005F17C01A1E88C108DC881E88D00182204F1140705F13400394619 +:20D9C0000BF0A4FA1822394605F14C000BF09EFA05F164071822384604F12C010BF096FA5A +:20D9E00095F870003C2204F1840140F0800085F8700005F1BC000BF089FA95F8CB100120FC +:20DA0000024602F0010221F001010A4385F8CB2095F8CB1060F3820185F8CB1095F8CB1003 +:20DA200021F0200185F8CB1095F8CB1060F3C71185F8CB1004F16401B1E8085105F19C0291 +:20DA4000A2E8085191E80A5082E80A50C5F8A07095F8A81060F3C71185F8A81095F8A91094 +:20DA600021F00F0141F0020185F8A910042385F8AD30052185F8AC1095F8AE1000F01F02DF +:20DA800021F01F010A4385F8AE20032185F8B01095F8B31000F00F0221F00F010A4385F820 +:20DAA000B320B4E8841005F12001A1E8841014CC81E8140095F82C1060F3C71185F82C1025 +:20DAC00095F82F1003F00F0321F00F010B4385F82F3095F82F1060F3C71185F82F1095F8EA +:20DAE0002D1000F00F0021F00F01084385F82D004FF4586028630A48F0600A480068406949 +:20DB0000007808B10CF08AF90AF0BAFCBDE8F081A40601205817002058000120207B02001F +:20DB2000140B01201801002001282DE9F84F40F0B080DFF88491D9F83401012840F0A68015 +:20DB40000220C9F8340117F0C9FD012015F05EF85FEA000805D00120C9F8340117F0CCFD57 +:20DB600099E0112018F074FD00280CBF00250125102018F06DFD08B145F002050F2018F076 +:20DB800067FD08B145F00405444CA06A0068014601208847012805D099F83801012818BF29 +:20DBA000002703D1002004F045FD012718F04AFDDFF8ECA040080AD20026206A8068014637 +:20DBC000504688478346BBF1040FF6D000E00126304600214FF0FF3201F08EFF012E0ED0F9 +:20DBE000BBF1010F05D1206A4068012102465046904732496C39086840F0030008602068D7 +:20DC000040690146284688470B2018F021FD254E30B12068C06A3146091D02460888904734 +:20DC20000A2018F015FD28B12068C06A31460246088890471C4903200124C9F834011B4EE3 +:20DC40000C6000233360284612F05AFD0128FAD1174D2868042014F0D9FF064615480460E6 +:20DC60002868012F02D1204604F0E4FC18F0BAFC082014F0CBFF0746C9F8344117F03CFD60 +:20DC800057EA060018BF4FF0FF3804E06FF0040801E06FF001084046BDE8F88FB8010010DD +:20DCA000004003406A810200282008600C2008402C2009400C400940501800209022084024 +:20DCC000F8B5074661485F4C001DC26A0168B7F5C067C2F30722C4F81071C1F38441C4F821 +:20DCE0001421C069C4F81811C0F38120C4F8280100F0A38094F830616EB9C4F82C71D4F82C +:20DD00001801C4F82001D4F81461C4F81C61D4F82851C4F82451D4F82C01D4F814510028CB +:20DD200054BF02236FF0010304F59072116800EB4000C018431000EB937001EBA001116092 +:20DD4000D4F82011C4F81C5100291CDD1E293DDDD4F8240130B93429B4BF15391E21C4F827 +:20DD6000201125E02A29BABFD4F820010B381E20C4F82001D4F81C013E28D4BF401C3F20B9 +:20DD8000C4F81C011FE0D4F82401032812D011F10A0FA6BFD4F820010B300120C4F8200107 +:20DDA000D4F81C010028CCBF401E0020C4F81C01032009E011F1140FA6BFD4F820011530A8 +:20DDC0000120C4F820010020C4F824014FF08057D7F8A401B4F81C111B4D40684FF47F42CD +:20DDE00008230646009128463021B047D7F8A40101214FF40032112340680091064604217C +:20DE00002846B047D7F8A401B4F8201140684FF4F80212230646009104212846B047D7F8FC +:20DE2000A401B4F8241140684FF440620A230446009120212846A047F8BD002084F83001AF +:20DE4000F8BDC0465018002000A00C4000A00C402DE9F84F604B5879002840F0B88000201E +:20DE6000012117F0B9FA002800F0B1800668002E00F0AD800746594A408951789246C2099F +:20DE800070D231F001054FF6FE7465D1994699F83220920860D3326A51791579400B05EB6E +:20DEA00001252CBF402600263868B7F818800088834613F07FFD002840D15846032113F010 +:20DEC00095FC002838D15846002113F057F831460EF084FD061C2AD07079012804D003284C +:20DEE0001AD0042818D12AE0B179708811F0180F0DD0FF21A842317103D0404518BF844251 +:20DF000008D128464146224606F016FF02E099F838103171844208D17079022807D058463C +:20DF2000072113F063FC10B106E0834604E0584617F082F9044602E05846FBE7641CA542D0 +:20DF400002D0388BA04213D1386801880222002328460EF089FA0FE0022909D118F01EFBF2 +:20DF6000044605E038680088044613F023FD28B94FF6FE70A04203D1CD211EE04FF6FF74EF +:20DF800038680480204613F015FD00280CBF012000203968C8810F4938680AF055FC011C64 +:20DFA0000BD19AF8010002280CD19AF8000048B92020012101F0F2FC04E03868407B13F0D5 +:20DFC000FDF820B91FB138460121FEF7D3FEBDE8F88FC046452C020050010120E40401201D +:20DFE0002DE9FE4F5D4C5E4994F83C80B4F848500A68834601A8026049684160DFF868A16A +:20E0000001A80AF11409494617F0B8FC00280CBF01260026A76887B11EB93888854206D03A +:20E0200008E007F10C00494617F0A8FC10B1B878804502D0BF69002FEED1002F08BFCA203C +:20E0400000F0898039894FF6FE70884208BFC32000F0818018F0B4FA884208BFC2207AD07A +:20E060003888A84218BFA4F8480016F06DFCF87A4946401C84F85C0004F15D0018F040FC01 +:20E0800002208DF80100684616F0E6FF04F12405061C5BD03069062100F8011B94F8321032 +:20E0A00001704FF0010986F81E9017F047FD706286F81A904020F0823889708086F818B06C +:20E0C0003046FCF7C5F8061C41D1092084F84A003B89E38794F83C00804518BF84F83C802D +:20E0E00005F11A014B2013F065FE05F12401502013F060FE05F11801E12013F05BFE05F1F0 +:20E100001601532013F056FE0820494601F046FC4FF40050002101F041FC20784FF4806196 +:20E1200010F000FD0F484178022905D10078012808BF4FF4DC6203D008200FF005FD82006A +:20E1400020784FF4806118F0B7FB00E0102600208AF805003046BDE8FE8FC046500101206C +:20E16000987C0200E4040120C40301202DE9F04120F039055C4E5D4C96F82F00ADF1180D30 +:20E18000002840F08E803078042113F053FC002840F0878096F82F10777805F03F0541EA7B +:20E1A0000500012F41EA050186F82F1001466FD04FF0010806F132035520002186F80180AD +:20E1C0001F46424617F0ECFF387801285ED12078012818BF022842D1454804680021204603 +:20E1E00017F01DFC00283AD118F08EF8002836D1204605A96A460DF073FD04469DF81000EF +:20E20000FD282CD002282AD0C82C16DA6846002114220DF0E3FDFF20214614226B468DF801 +:20E220001000042015F034F93249A000002200EBC4000A5009184A604A720024552041468B +:20E240003A4686F8324018F06FFAFF20032114F0BDFDF4713078042110F0FAFE40E096F804 +:20E260002F00072440F01000F471284386F82F0000200146F5F706FE002831D0002015F0E2 +:20E28000E5FB20460021F9F777F929E096F82F103078002904BF0724F471F2D00021F17178 +:20E2A000D9E7307AE0B9217896F82F00022901D1810915D296F832706FB1A9080BD341096E +:20E2C00009D217F0C1FA04200121F9F755F996F82F0085F0020505F03F05054386F82F5066 +:20E2E00006B0BDE8F081C04668060120E5040120EC06012004E900202DE9F8435F4CDFF8C0 +:20E3000068815B4DD4F83C0100286ED0574E401E0AD0401E60D0401E1CD0401E53D0401E69 +:20E320001AD0401E33D02FE04E4801250221006884F83A51702204234068009100210746D5 +:20E340004046B847356004F1500018F0EBFA2846BDE8F883022100E003214FF08059D9F8D3 +:20E36000A40184F83A1140680025702204232946074600954046B847D9F8A401C0687022A5 +:20E38000294613460125DAE70320BDE8F88300262E606E6028688008FCD268688008FCD2FD +:20E3A000374834490127001D06600E200F6008F059FD022015F05AFAC4F83C6184F83B61DF +:20E3C0000220BDE8F8830520C4F83C010027376030688008FCD242E00320C4F83C010027CC +:20E3E000376030688008FCD239E0234F01260F202E6042F62A21C7F80B004FF08059C7F805 +:20E400000F10D9F8A40140684FF4C072072302218446404600910021E047D9F8A401C06836 +:20E4200000214FF4C072072384464046E0472E6028688008FCD394F83901C7F81B6018B95F +:20E44000032100200E4602E0002028630321C4F83C6147F8011C686068688008FCD20020B0 +:20E46000BDE8F883A401001000A00C4058600C4054600C4004800C4001400C4050180020F2 +:20E4800038500C402DE9F8430446DFF87C81A078471E53D07F1E40F0B480814600252C2060 +:20E4A0008DF8005016F052FD071C04BF01208DF80000E41CA078002818BF02283AD19DF8C5 +:20E4C0000000A8BB14F8010BB87014F8010BF87014F8010B387130B92046042116F0FAFFE5 +:20E4E0000C34B86007E0241D07F108000822214617F054FB083414F8010B387414F8010B9D +:20E50000387514F8010B10222146787507F11C0017F044FB042104F1100016F0DBFFB86133 +:20E520000820387046467D703078394612F05AF96B4661E002208DF80000F9E78146E41CD6 +:20E540000026607C8DF801600546183080B216F0FDFC071C04BF01208DF80100A078002842 +:20E5600018BF022843D19DF80100002842D114F8013B304603B10120B87014F8010BF8707A +:20E5800014F8010B387130B92046042116F0A2FF0C34B86007E0241D07F10800082221468E +:20E5A00017F0FCFA083414F8010B387414F8010B787414F8010B2A462146B87507F117002F +:20E5C00017F0ECFA641914F8010BB87414F8010B787514F8010B0525387520783D70F874E8 +:20E5E00043467E701878394612F0FCF802E002208DF801000DF1010375204946012213F0C9 +:20E6000007FF0020BDE8F883E80901202DE9F84F534D2968D1F8D40090F883A040310868EB +:20E62000006820B9D1F80C05804729684031886F4C4EDFF83491DFF834810078E8B918F01C +:20E6400079F9377883464FB949460F7837B9832041460870584618F0EDFA60E002214046AA +:20E66000BAF1010F017004D13078832801D110F0BBFE584618F0DEFA65E014F08BF83C48ED +:20E6800000683C4F016C38688847044618F052F9824630460778002F44D149460F78002FC8 +:20E6A00040D12868D0F8B800C16C002088472868D0F828246946F42090479DF90000A04267 +:20E6C0001EDC2D4CA079D8B9504618F0B3FA6078042803D02868D0F84C05804704204146E0 +:20E6E000A7792E680870781CA071D6F8B800C16C09B103208847032060810FF001FD22E0E5 +:20E70000832041460870002014F05AFE504618F091FA1A486968C01D09690078087016F03A +:20E72000E1FB10E0022241460A700078832801D110F05AFE504618F07DFA2868D0F8B80076 +:20E74000C16C042088476868C068007828B92868D0F85824002001469047BDE8F88FC04604 +:20E76000140100206F1B0120711B0120741B0120D8050120B406012004180020051800200A +:20E780002DE9F04106467468B56818F0D3F8D4F8C0108046002900F0A18094F8F80028B919 +:20E7A000087C032818BF042840F09D80287918F0C3F8D4F8CC0041686F690968CF6294F8AF +:20E7C000F90018B92968C8684009FCD22968486820F002004860D4F8CC0041682F69096852 +:20E7E000CF622968486A20F003004862D4F8CC002A6941686B69096843EA0200C1F80405DE +:20E800002968486920F001004861286801270762D4F8D400D4F8C0100860D4F8D87067B10B +:20E82000E8698068C0F30910401C874205D3D4F8C0201168C919091A1160D4F8DC7067B10B +:20E84000686A8068C0F30910401C874205D3D4F8C0201168C919091A1160304610F03AFDED +:20E86000287918F063F8287918F068F8D4F8C070386857B100230222397C03291CBF0429B7 +:20E880003A743B607F69002FF6D1D4F8C0100860D4F8C8100022002904BFD4F8C000C4F853 +:20E8A000C80004D04869B8B9D4F8C0004861C4F8D020C4F8D420C4F8D820C4F8DC20C4F8E1 +:20E8C000C020C4F8C420404618F0B4F904F1300018F050F8BDE8F0810146E3E729684868A0 +:20E8E00020F002004860404618F0A4F9BDE8F081F0B504466568267A00213422ADF1740D2B +:20E9000004A80DF06BFA8DF810606978287800EB012004A913F069FC02208DF811009DF805 +:20E920001000AD1C801E8DF82C00608E0E9504F12801ADF81E0019A817F03CFC9DF8120096 +:20E94000032840F0868017F035FE9DF8131088427FD19DF814109DF815009DF816709DF837 +:20E960002D609DF817509DF81830084347EA000146EA010045EA000153EA010069D111A822 +:20E9800000211C220DF02AFA0E9DBDF81E202846ADF84E209DF82C1010F8017B07F0030287 +:20E9A0008DF84470D21E1ED107F00C06082E14BF002301238DF850300C2E06D14678037897 +:20E9C000801C03EB0623ADF8483046780378801C03EB0623ADF84A300378467803EB06230C +:20E9E000ADF84C30801C1590401B081AC0B28DF85800091A8DF851105ABB07F00C0004289C +:20EA000027D007F0200127F07F00084321D1FE2794F94830104894F8466094F847508DF8B8 +:20EA200047709DF823208DF86230007800928DF860608DF8615000270197E16B0291039773 +:20EA4000B4F842208DF8460018AB11A819A909F02DFA1DB0F0BDC046C80A01202DE9F043C3 +:20EA6000584C94F84201ADF1140D002840F091804A484B4E4FF00108027B3368416884F84B +:20EA80004281814684F84121C3F38147C4F86C11BFB9D9F81000A0B156F8085C17F06CFD8B +:20EAA00064210246C5F306604143B1FBF2F23D49002304F1940012F0FDFE3B494FF0004025 +:20EAC000086001A817F053FE00252F4604F10C00029501AB8DF80470344903953A4612F05F +:20EAE000E9FE01A817F043FE04F150000822029501AB8DF804702E49039512F0DBFE2D4A32 +:20EB000004F1D80032213B4613F012FB2B4A2A4F04F1F4002C212B463D6013F009FB306873 +:20EB200099F80D30C0F381501BB1032803D184F8398103281FD002281DD001281BD14FF0FD +:20EB40008059D9F8A4011E4C406803214FF040521C230746009129462046B847D9F8A401F8 +:20EB6000406829464FF4007209230746CDF800802046B84706E0386840F0400038600220F6 +:20EB800014F08CFE56F8040CC00802D2284614F085FE05B00020BDE8F083C046308602004D +:20EBA000B44F0050555E020000A10C4003950100ED0E0200994902009022084081C80100A2 +:20EBC00000A00C40501800202DE9F0430E460024ADF1240DADF8160006F108078DF8144097 +:20EBE000384616F068FC50B905A80DF031F9A124012840F0938005A814F078FD8EE038460D +:20EC00000DF122016A460DF06BF805464FF6FF70A8427FD09DF82200DFF80C81002834D044 +:20EC2000404801789DF8100040B3401E1AD0401E04D0FB381DD0801E1BD051E0012915D0D8 +:20EC4000022913D039B9748240F20110B0829DF8127086F8287006F11E0002A9082216F02C +:20EC60009DFF3DE0012918BF022902D14FF4817001E040F20310B082748231E005219DF88E +:20EC80001300718200F07F0029E002A83946082216F084FF4FF001098DF81190FF208DF807 +:20ECA000100017F078FD274600F00F0000942946142201976B468DF81200042014F0E8FB38 +:20ECC000AF0007EBC507404621460C223F1838460DF084F8748287F8099040F20310B082D9 +:20ECE000A8003474414600EBC5000A58B2610F580A237F1CB7FBF3F20F505A43BF1A0DD19F +:20ED000040180121094F017238784FF4806110F09FF903E0748240F20310B082204609B0D3 +:20ED2000BDE8F083E504012004E90020CB0301202DE9F04F044608469A46ADF1240D2146B2 +:20ED400005908E680692129B04914C68756807935044854238BF6FF00304C0F093804B4D10 +:20ED600028684FF0FF3117F095FA4948328C079F48496368026083460B60780819D238462E +:20ED8000800813D3F768002F3AD03569002D37D000970195012002900599069A0498534648 +:20EDA0000DF036FA5FEA000813D114E04FF0000811E0A0683AEA00070AEA00021CBFB168A8 +:20EDC0000A4405990140049808F09CFB5FEA000801D0044652E034680598DDF818905746EA +:20EDE000241805E0BBF80010049817F02FFAA944AFB90798C00840D3F16809B1306910B91F +:20EE00006FF007043AE00091019000270297069A0599049853460DF0FBF980462DE00498B9 +:20EE200010F082FD38BB049814F048FA18BB04F0FF05C5F58075BD4288BF3D1C210C8DF8B3 +:20EE40000D1002208DF80F40230A8DF80C00BBF8001004988DF80E3017F0EFF903A8042100 +:20EE600011F09CFA7F1B641928B94846294611F095FA0028B6D04FF0FF3844460348006815 +:20EE800017F06EFD204609B0BDE8F08F141B0120101B01200C1B0120F0B50446207CADF1B0 +:20EEA0003C0D0F28C0F2A680656860690DF1260210F0F6FA9DF82600002840F09B80207C84 +:20EEC0000B28C0F29780287A022840F09380A88900F00F010F2940F08D80C0F303100F2884 +:20EEE00040F088809DF82860002E18BF022E40F08180414C414894F84A20022A3BD00068AC +:20EF0000062A39D010B18179012935D0082A18BF042A6FD16D8910B18079022827D0B4F8DA +:20EF20004800854266D1012E07D004F15D000DF12D0116F023FD00285CD120784FF4007140 +:20EF400012F078FD002855D1E06C029001268DF80D6002238DF80E3094F852708DF80C70BE +:20EF600002A80FF0AFFD10B114F008F842E0284615F06EF93EE0006840B900230093288896 +:20EF800069896A7CFCF73EFF9DF828602888ADF810006889ADF81200A87B8DF81400AF894B +:20EFA00000206FF30E0707B101208DF818608DF815009DF827408DF819409DF82C708DF8BA +:20EFC00017709DF82A009DF82B308DF81600687C0DF12D018DF81A009DF838608DF81B30B4 +:20EFE00008228DF81C600DF11D0016F0D7FD04A803F03EFC0FB0F0BD50010120000A01200F +:20F000002DE9F04380460E20ADF1340D15464FF001098DF80100B8F1000F8DF802305048A3 +:20F020008DF8005000F1010000788DF804900F468DF8030047D1112004A93A2217F05FFAE9 +:20F0400000283CD1444E0DF111007B199DF80320716803901C4642F02802481C7060581CBC +:20F06000227016F08FFD054616F068FD0146284617F046FC48460DF131013A2217F03FFA5E +:20F08000083500280CBF9DF831000020287016F055FD01460DF1210017F032FC7088401C7B +:20F0A00080B27080B0F57A7F02D8706801282FD12A4800784FF400710FF0CAFF28E0002027 +:20F0C0007C19039024E07C19ED19687B11F076F83A2808D03B280FD1112004A93B2217F058 +:20F0E0000EFA30B108E0112004A93A2217F007FA10B90DF1110000E0002003909DF80300FA +:20F10000217808432070611D0DF1210017F0F8FB0DF12900611C042216F040FD039E20789E +:20F12000002E8DF82D0008BFA12012D0404669460DF121023B4604F0EBF8054620780021D3 +:20F14000102200F0F80020700DF111000CF046FE28460DB0BDE8F083100A0120CB03012049 +:20F160007F0101202DE9F047564CA4F1080000F108058068D0F80001807AADF1280DC00026 +:20F180000AF01EFF0028089008BF1A2400F0958017F0D0FB8246286800F59162D0F80001B3 +:20F1A00000894FF6FF780026C14608E020682268D0F80001761CB6B202F591620089B042BB +:20F1C000D8BF002473DD2068D0F80001C07A0127002548E0ADF81480ADF8168006A8FF21E2 +:20F1E00008220CF0FBFD2068D0F8942404A9D42090472068ADF80480D0F894246946D120A0 +:20F2000090472068D0F800012268C0886D1CEDB202F5916230E0ADF800608DF8025012687C +:20F22000D02069469047A8B99DF80C00012810D19DF80B0068B90DF102020820002112F836 +:20F24000013FFF2B03D1401E01F10101F7D10829ACD0002720682268D0F800016D1CEDB27F +:20F2600002F59162C07AA842D5DC002F9ED12068D0F80001C0880025A84297DDADF8006010 +:20F28000ADF802501268D120694690470028B8D1BDF804008145B4D0ADF810002068D0F8CD +:20F2A000882404A9D4209047002893D01924504617F0C0FC089812F0DDFB20460AB0BDE8CA +:20F2C000F087C04614010020F8B50546687F0C4600280CBF08201020AF7F0FB10830C0B268 +:20F2E0002F7F0FB1401CC0B2AF7927B1297A00EB4100801CC0B22F7E6870002F0CBF002650 +:20F300000E2647494A78022A0AD10A7D012A07D12A78012A04D0CF78002F18BF012100D1F5 +:20F32000002185F834102F7E297D09188919217037B13C48007816F079FC2178081820709C +:20F340002078742869DC0AF03BFE071C66D017F031F90346A97F6A7F95F834002C7F41EA86 +:20F360004001A87942EA410240EA42012A7E002042EA410204B10120297840EA42006A7E4D +:20F3800041EA830102F0030241EA821141EA002188B2397000127870A878B8706888001296 +:20F3A000F87028793871A88800127871A87EB871E87EF871687F002808BF082405D0296AE8 +:20F3C00007F1080017F09CFA1024A87F28B1696A381917F095FA0834E4B2A87988B1287AD4 +:20F3E0003855697A631CD8B239542A7AE968431CDCB2E019520016F0D1FB287A04EB400433 +:20F40000E4B2287F00B13855687829692A7D8019C0B2C01916F0C2FB00E000273846F8BD77 +:20F42000E4040120800101202DE9F0470546A87A022840F09B804E4CAF7B5248DFF840A1DC +:20F44000A66A002F7CD12169F9B16769EFB1A769DFB1E768CFB114300078012815D1688852 +:20F460008847AE1C88B943490A6830889101A1EB820162699047012878D1A16930888847B6 +:20F48000E16830888847BDE8F0873B486D88006878B101680A88954208D1096A4A78097816 +:20F4A00001EB0221490A01D220B136E040680028EFD10020314933230027012401F60C72EF +:20F4C0001679FF2E02D01688B54206D05B1E02F124024FEA4404F3D100E0274601F1AC0869 +:20F4E00001F13C09002319F803208AB19E0058F8064027420CD0104616F008FA38B1417BC7 +:20F50000052904D1BC431E2348F8064000E000205B1CDBB21E2BE6DB68B1417B05290AD136 +:20F52000016801270D8056464773307820210FF08FFDBDE8F087284611F0D0FABDE8F08772 +:20F54000A6B1017D012911D1C07840080ED3042015F0FCFC011C09D06420087001274F706F +:20F56000688856464880307811F03CF9BDE8F087E4020120BC800200E40A012020010020A8 +:20F5800050010120E40401202DE9F0478A46071CADF1200D08BF002000F099804D480088D8 +:20F5A000B8420AD116F0CAFA0146504616F0E6F900280CBF0125002500E012254FF000094D +:20F5C000ADF8027068468DF800900CF041FC68B101AC204615F06FFF012807D1504621467B +:20F5E00016F0CCF900280CBF01254D46DFF8F0804146087830F0010044D1122D42D1504628 +:20F6000017F04EF928B101888F4202D00679052E03DBB9F1000F34D134E00780EEB1414688 +:20F62000491E0D79032E18DA2B493DB901EB8502126B01EB8501C261096B0AE001EB8501FB +:20F640000B6B9A01A2EB8302C2610A6B9101A1EB8201816180F8209003E06FF00101C161DE +:20F6600081614E46C6600125ADF8107051468DF80E500DF1120016F02DFF0DF10E0003F0E8 +:20F68000C3FD4D463846514610F028FF0A2818D0A02813D1114C142604F102084046514662 +:20F6A00016F06CF930B9761E04F11C0408F11C08F4D100E02780384612F07CFC012D01D0ED +:20F6C00004E001253846494614F0DEFB284608B0BDE8F0878A010120688002009C0400209E +:20F6E000E50401202DE9F041054603200C46ADF1300D8DF81E000DF1160017F001F916F060 +:20F700001DFA01460DF1160016F038F9002878D0217D032918BF012973D1207A00286ED0C1 +:20F72000FE286CDC032904D1A07D002867D0FE2865DC3E490A6809A80260496841603C4F8E +:20F74000082209A9384615F0F7FCC8B9AE1C394831880088884213D0608988B900208DF8CE +:20F7600008003946082203A816F018FA02A80EF0BFFA3088BDF80A10884218BF8D2042D1CC +:20F780002D48EB890768AE1C212B11D02B48076867B1207A6189A37D04F10C02B84728B999 +:20F7A00000208DF82C0012F0C5FA2EE088202AE08C2063898DF82C00ADF822302FB30DF1D7 +:20F7C00022000090A27D207A04F10C010123B847D8B100278DF82C7012F0ACFA207D032858 +:20F7E00013D104F10C0008A913F068FF04F10C0858B9394640460A460FF024FA05E08220F6 +:20F8000000E08420AE1C8DF82C000BA80090287C0190EA893146012305F1110042F40042E4 +:20F8200011F018FF0CB0BDE8F081C046E48702004C0501208A01012024090120F0060120E8 +:20F840002DE9F041524D2968F4310A68064692F84400ADF1180D82281ABF92F84400401C10 +:20F86000002082F84400086890F8441000EBE10090F82C104A1080F82C2048080AD22968F3 +:20F88000F4310A6892F84400401C82F84400C0B28128E8DB2A68F4321168DFF8F88091F802 +:20F8A0004400812824DB8878E8B944462168D1B10868C0B10F4615F0ADF98046386817F0D8 +:20F8C0008BF810B1386817F095F9384617F08EF9384612F0CFF8083C0020A060404616F06C +:20F8E00024FB2A68F4322A203070D2F84C1249E0D2F83C234431E12090472C684FF6FF7335 +:20F900000220ADF80830F43422688DF810009778BFB916F031FE4FF47A71B1FBF0F01E49C4 +:20F92000434600220AF092FB00282DD02868D0F8F4001A2141702A2737702868D0F8401395 +:20F9400020E0022F1CD0012F19BF07208321082080210027009749320192D4F8844202AAE4 +:20F96000A047DB2807D0E52805D0F32803D0DF2818BFE82808D12968D1F8F4104870DAE758 +:20F98000D4F874133046884706B0BDE8F081C046140100207C0A012091590100FEB5524DE4 +:20F9A0006A78022A04D12A78012A04BF4F4A10404F4CB4F8707000290CBF87430743F80BB9 +:20F9C000A4F87070C60308D001208DF8040001A9522012F0EFF9B4F87070B80B62D2F80BD4 +:20F9E0000026C30358D1002F5AD06B784FF0FF306E460090022B4AD12D78002D47D1780852 +:20FA000006D304F14C000168B1F1FF3F38BF061C380906D304F1500032680168914238BF3E +:20FA2000061C780906D304F1540032680168914238BF061CB80906D304F158003268016828 +:20FA4000914238BF061CF80B06D304F15C0032680168914238BF061C780B06D304F16000ED +:20FA600032680168914238BF061CB80806D304F1640032680168914238BF061CF80806D3DD +:20FA800004F1680032680168914238BF061C6846B04208BF002603E0F80B28BF04F15C0669 +:20FAA000374600E00027134D2878BFB1E66E1EB131683A68914215D03968E766012909D04B +:20FAC00001210FF02FF8E16E28780A68012116F0F0FEFEBD01210FF0BBFAFEBDE7660121AC +:20FAE0000FF020F8FEBDC046E4040120C0CFFFFFE4020120500101202DE9F0478246484E74 +:20FB00004E4C56F80C0C9046894680082AD245480068810D28D2051704F13400006800682A +:20FB200080476D1CC0F13E0110F1020F4FEAE101D8BF07218D42B8BF0D1C3B480068C0F38C +:20FB40000320401B102803DA0028D8BF012000E00F20364900F00F0040F0F00081F84D00BF +:20FB6000087801E03248306000203249324F256808603868A96927208847324D304805F154 +:20FB8000300211682B460840106003F17800006820F48070A8672068016B4FF480608847C4 +:20FBA0002068016B4FF4816088472068016B4FF4C0608847244901200860C5F880912860EC +:20FBC00056F80C0C800806D2B8F1FF3F14BF40464FF0404030603868E8698008FCD3072061 +:20FBE00010F0AAF80228FAD1BAF1010F13D0206A164E8168304688470428F8D0012804D1C2 +:20FC0000206A4268032130469047D5F8180220F00300C5F818022068806B8047BDE8F08718 +:20FC20001C000940B44F00500C1300500D620840FD0000400C4009402C200940B8010010B6 +:20FC4000FFFFFEFE0C2008402820086000400340F0B5524C06466078ADF1240D022803D1CF +:20FC60002078002800F097804D4D95F84A00082818BF042840F08F8030460DF10E0115F052 +:20FC800076F9607802280BD115F058FF04A915F075FE28B116F094FCBDF80E1088427AD040 +:20FCA0004FF6FF7012F086F9BDF80E0004AF3946FFF76AFC01286ED00DF11A0016F0C7FD75 +:20FCC0000DF11A00394615F059FE58B1BDF80E2016F064FC904205D005F13E014B200A800E +:20FCE00012F068F8607830F0010019D116F068FCB18A884214D004A816F0D2FD38B1007989 +:20FD0000012818BF022802D104A80FF0D9FC2548016829B1207D012802D1BDF80E0088478B +:20FD2000BDF80E00002114F0ABFFBDF80E0014F01FFE00248DF80040BDF80E00ADF80200FA +:20FD400068460CF085F898B10DF11A00214608220CF044F801AC0DF11A00214615F00EFE15 +:20FD600030B104A9204616F0B5FB684603F04CFA01A804A916F0AEFB68460DF0B9FF50B189 +:20FD8000BDF80E00BDF80210884204D0ADF80200684603F039FA09B0F0BDC046E40401204B +:20FDA00050010120F00201202DE9F04F00210225C41CADF1540D8DF84A1081788DF848504D +:20FDC0002046139116F02CFCA41CADF84000204616F026FCA41C8146204616F021FCA41CE8 +:20FDE00014F8018B8246B8F1110F0DDAB8F1000F0DD047466E46204616F012FCA41C7F1E46 +:20FE000026F8020BF7D102E080208DF84A002678112E63DA5EB1641C37460DF1200B2046E9 +:20FE200016F0FEFBA41C7F1E2BF8020BF7D19DF84A00002855D1304A53684746BC1948461C +:20FE4000514614FB05F4A41D5FFA84FCBCF1500F42DC9DF848400F2C18BF022C08D1BDF854 +:20FE600040504FF6FF74AC4204BFA41EADF840404FF6FF74844208BFA01E03F8010B001286 +:20FE800003F8010B03F8011B0D1203F8015B03F8017B67B168469B1E017803F8021F30F81B +:20FEA000021B7F1E4FEA21215970F5D19B1C1E705EB15B1E08A8017803F8021F30F8021B27 +:20FEC000761E4FEA21215970F5D1104610A9634606220EF0E1F802E0102000E080208DF8B6 +:20FEE0004A001399652001220DF14A0312F090FA15B0BDE8F08FC046280401202DE9F04FFC +:20FF000015460646287A0C4600F03F01E8886FF39F2040EA0130A988ADF1140D6FF39F2118 +:20FF200041EA003B49490E9FC8789A464FF0000988462EE09DF80B10C8080CD3BDF80E00B6 +:20FF4000844204DD241AA4B2162C13D931E02146304610F021FC0020F8F776FC98F83300E9 +:20FF600098F803204FF00009401C90FBF2F15143401AC6B298F803008119491E91FBF0F254 +:20FF80004243891ACEB2B10001EBC6014144B1F84C40484503DC0020A8810A2052E098F8FA +:20FFA000323009F10101B3421FFA81F9E4D0172CE2D3E41F30466A46A4B2214608F0D2FD02 +:20FFC0009DF80B108808B7D34808B5D22A7AEB881AF00F0018D0401E12D0401E07D0401E95 +:20FFE00018BF04202ED100985845A5D10CE09DF808009042A0D1BDF8060098429CD103E0AB +:020000040001F9 +:200000009DF80800904297D1AFB10AF0F000102811D1BA89BB68684600210EF0BDFF00288E +:2000200088D1F988B868BA884018396814F0CAFE00287FF47FAF68460EC80EC503C885E867 +:200040000300002005B0BDE8F08FC046C01900202DE9F84F504CD4F8A000D4F8A06000284C +:2000600000F095800546E86840F6030108274A1C02E040687F1EFFB260B15FB103889942B2 +:2000800018BF9A42F5D129692CC838312CC189C881E8890006F1280090E800034FF0000AE5 +:2000A00006F12807D34687E8000CB16821B357464FF0E24A07EA08001AEA090508BF002897 +:2000C00013D036A090E80C0002EA080213EA090308BF002A04D0B5683069B6F93010A8478B +:2000E000504607EA080800EA0909B5683069B6F930104B464246A84716F01CFC0546B4F9AA +:20010000B600401C6FF31F30A4F8B600214886F833B06FF00207378614F007FF284616F05D +:2001200089FDB4F9B400B4F9B61088422FD16068D4F8B860D4F8BC7090F8FC1000290CBF6F +:20014000052007200AF03CFF58462EB196F8FC5005B9306886F8FCB05E462FB197F8FC50E8 +:2001600005B93E6887F8FCB0864238BF061C66B1B6F1FF3F0BD016F0FFF9B6FBF0F104F5AF +:20018000CE7015F0DDFEBDE8F88F15F0D1FABDE8F88FC04608F3002068F20020F0FFFFFF91 +:2001A000FFFFFF8E2DE9F0478046D8F808603068076CD8F8045047646A6CA96B286C17F406 +:2001C000F06FA0EB020937D1F8091FD2780979D3B9B196F82100464A145C601E814294BFB6 +:2001E0000C1C641E4046214612F064FDA86B001BA863A86B002865D105F18800012116F0B5 +:20020000B7FB4046494613F05DF95BE00029F8D0404612F04FFD014695F82D00A96318B9E0 +:20022000A86B00284ED101E00020A86305F18800012116F09DFB45E0F80A21D24FF0000AB7 +:20024000544603E0A86B401EA863A96B91B14046012112F02FFD3068446814F00F04C0F866 +:2002600004A0EFD0296BAB6B686B491E2963401E6863EBB905F18800012116F079FB13E0D1 +:20028000306844680022202904F00F044260CCBF4FF0200A8A464046514612F00BFDCAF160 +:2002A00020008145C8BF81464946404613F00AF9EC77404610F02EFB706A18B1024621468B +:2002C00040469047B80910D3AF6A77B14046394612F060FDA862AD6A3DB996F82000054965 +:2002E000095C4046C9190FF037F9BDE8F087C0465C88020068880200F8B50546A869837804 +:2003000000242746002B2CD0FE2B2ADC427800784B494C4E00EB022009783288264682421E +:200320000DD031F0010306D115F0D7FB00280CBF8126892616E0022908BF802612E01846E6 +:2003400015F074FA50B18268002A04BF4068846804D00120194690470127044604B98326BB +:2003600000E08226384801685EB954B1227BE0790223801810FB03F00C30C3B2502B01DD35 +:2003800058E0042301F8016BA869007801F8010BA8694078042B01F8010B42DD181F01F8BF +:2003A000010B207801F8010BA07801F8010B6088001201F8010B207901F8010BA0880012A0 +:2003C00001F8010BA07900F00F0001F8010BE07901F8010BE67916B10020864214DC207B04 +:2003E0000870267BFEB1491C002086421BDD26694200965D0E702669925B12124A70267BB3 +:20040000401CC0B2891CF0E7A6684200965D0E70A668925B12124A70E679401CC0B2891C26 +:20042000DBE70020087005F11100A91C48F204020DF032FE1FB114B1204611F01BFBF8BD62 +:20044000E5040120E00301202C040120FEB5524C60692589A689E169806D2A4689190831C4 +:2004600008F054FD6269916D49199165E2697619B0B212180832127801A90A70444EE169E8 +:20048000401C80B20918097A721C401C117081B2E269A18152180832126868460260091DCB +:2004A000A181042115F016F863690090054615F04FFED863284615F0F1F9A3F84000EA206C +:2004C00012F030FF02213548324D017068684069007830B1307810B97078FF2801D0042014 +:2004E000E0706769E078397C084338749DF9040016F05EFA87F8460007F17406BE653989C4 +:200500009DF904007B6887F84800B7F85C000026401AC0187860B88987F84760800A0AD38E +:200520002868D0F80813384688476769786E10B1B7F8680010B397F8600050B12868D0F862 +:200540000C13384688476769F86C10B1B7F85000A0B12968B8310A68107838B1936C2BB1B2 +:2005600019463846884767692968B831D1F8A01138468847666115F0F3F9FEBD2868D0F8F3 +:20058000541204F11400884766610DF0EDFDFEBD2C1A002014010020B41801206F1B012081 +:2005A0002DE9F84F8146D9F80040D9F8047094F82360B4F814A0D4F810B090460D465EB18E +:2005C000A168434815F066FE002818BF6FF001007BD1012084F8260084F8218000262560E8 +:2005E0004A463C483C49E66114F005FD3978272016F0A8F951465846062205F081F8002883 +:2006000057D13749091F086820F00200086094F82000042806D133484C380068406901461A +:20062000272088472D4F4FF0020B4FF0805AC7F8FCB2DAF8FC0140680146062088470AF5A4 +:20064000FE7A38BB584613F029F9B8F1020F4FF0010005D0B8F1040F18BFB8F1060F01D17A +:20066000314600E00421C7F84C11E968C7F85011C7F8546184F82400DAF80000AA68E96828 +:20068000036968681C460B46A04748460DF0FCFABDE8F88F4020386080253D6094F82600EB +:2006A00020B10B4816F05CF984F82660C7F8FC6207E094F8260020B1054816F051F984F819 +:2006C00026604FF0FF30E061E069BDE8F88FC0464C160120AC19012061D501000444024040 +:2006E00088470240FC0100102DE9F04F00214FF00209C41CADF1540D8DF84A1081788DF8E0 +:2007000048902046139115F08BFFA41CADF84000204615F085FF0A34804614F8010B149014 +:20072000204615F07DFFA41C14F8015B8246102D0BDA6DB12F466E46204615F071FFA41CDE +:200740007F1E26F8020BF7D102E080208DF84A002678102E5DDA5EB1641C37460DF1200B70 +:20076000204615F05DFFA41C7F1E2BF8020BF7D19DF84A0000284FD12C4F381D0468AB1936 +:2007800013FB09F00F305FFA80FBBBF1500F3EDC15F016FF404538D184F800804FEA2820F5 +:2007A000607015F0CBF9A41C0146204616F0A8F804461498207084F801A04FEA2A23A37051 +:2007C000E570241D65B16846A41E017804F8021F30F8021B6D1E4FEA21216170F5D1A41CC5 +:2007E00026705EB1641E08A8017804F8021F30F8021B761E4FEA21216170F5D1384610A96A +:2008000020225B460DF048FC04E0484602E0102000E080208DF84A001399652001220DF18F +:200820004A0311F0F5FD15B0BDE8F08F280401202DE9FE4F8246DAF8180090F800900021F4 +:200840006A469D2005F034FD9DF80000814531DA9DF80000A0EB0900C4B20A2CC8BF0A2415 +:20086000E00009F0ADFB5FEA000821D0054624B300262746B34606EB09018B202A4605F0FC +:2008800017FD6879401E0AD0401E06D0401E02D00320687105E00220FBE70120F9E785F864 +:2008A00005B07F1E05F1080506F10106E3D104E0002402E04FF0000844469AF811000AF1D8 +:2008C000020A8DF801000527CDF804A014FB07F0001DC0B20646401C09F072FB4546071CA0 +:2008E00040D0791C0022084602709DF80020BA7087F803903C712CB3491C083D15F8082F06 +:2009000001F8032F2A8812124A706A7902F0070201F8022FAA7912F0180F0BD0D3082CBF27 +:2009200006230223520928BF43F001030A7842EAC3020A70AA784A706A88641E4FEA222236 +:200940008A70DBD10B4D2C1D514648F23202334620600DF101000DF09FFB384611F08AF8BB +:2009600009346C60B8F1000F02D0404611F082F8BDE8FE8F280401202DE9F0470646880F34 +:20098000C0F08E8000200EF0FDF8464815F014FD454C40F60A09A4F8009000256580207B37 +:2009A00005F00F0120F00F00014321736560607B4FF0010808F00F0720F00F0047EA0001F4 +:2009C0003046617306F06EFBD6F808A04A462146D01F574600F1010C00E027467C6834B161 +:2009E00023889A4203D0984218BF9C45F5D179607A7B2E4C05F00F0322F00F0213437B738F +:200A0000D4F8983033B1DA681288904223D06046904220D0338FF3B1F56306F13802558091 +:200A200096F8440005F00F0320F00F00034386F8443096F8450008F00F0320F00F00034344 +:200A400086F845304A60487B05F00F0620F00F0046EA00054D7315F021FB1548A06294F80C +:200A6000310080B91348006801684046884701280FD0787B08F00F0120F00F000143797339 +:200A80000D4EA66205E011F035F80028FBD010F051FA504615F090FC5146404614F0DEF884 +:200AA000BDE8F08701010E04601A012068F20020855C0000E001001035FE0100F8B53C4DB5 +:200AC000002428703B4E85F84A4040F20110308040F60C4009F074FA706028B17068214606 +:200AE00040F60C420BF07AF933483449344B364EC161344A03627778426237F0010718D159 +:200B0000317D012915D13149314F8162F3780761590802D2406B58B90BE02E4F47632E49ED +:200B2000C1622E4B43612E4AC2602E4B836138468047AC602C48046013F030F8707830F022 +:200B400001002FD115F0F0FB28494FF6FE70642721F8080F48800C714C717F1E8C71F7D161 +:200B60002349C82748804C704C607F1E01F8084BF8D120490827A1F1CA02508014727F1E4F +:200B800002F10A02F9D12A781E277F1E21F8080BFBD1194901200870104610214FF47A725F +:200BA00015F087FE03F0DCFF14480460F8BDC04650010120DC0A0120E40201203D3802006B +:200BC000C156020029DE0100E4040120ADA40100614B02001951020079D10100B9BF0100BB +:200BE0001D0102007D670100E40A0120C4060020EC09002044020020650F0120000A0120BC +:200C0000F0B5064631684889ADF1440D4008C0F092804A894FF6FE70104048810868036A04 +:200C2000C57F5978187800EB0120694611F0DDFAD878997801EB0021ADF80A105A791879EB +:200C400000EB0220ADF80C0098799DF807708DF81200D879002F8DF8130008BF082403D044 +:200C600003F10800102405909DF808701FB1181908340690E4B28DF801409DF8057037B181 +:200C8000185D641C8DF80500E4B28DF801409DF806C02A480027BCF1000F06D190F82F201B +:200CA00052B1428F8A4206D106E090F82F201AB99DF8022002B90127A7B9BCF1000F05D1A1 +:200CC0001B190A932D1B8DF81C500CE090F830001B190E330A9314F0A9FF2D1B281A0E38D8 +:200CE0008DF81C000A9B37BB1878042823D10DA800210E220BF072F8BDF80A000A9FADF894 +:200D000034007978880924BF01208DF83F0031F07F001CBF01208DF83E00C80934BF069993 +:200D200005990DF1360015F0EBFD30798DF840000DA80FF03BFE11B0F0BDC04650010120B3 +:200D40002DE9FF4105466E68AF680C4615F0F2FD3178012903D115F06DFF002080E0012105 +:200D6000317015F067FF207870706078B07060687060A068B060E068F06020693061207DF8 +:200D80003075607D7075A07DB075A069B061207F3077607F4FF0000843467077A07F3363FF +:200DA000C6F82080B0771C4674627463B462B46386F82C4086F82D4086F8A84186F8A941CE +:200DC000786806F0E7FA284606F040FB28460CF00BFD684615F0D0FA3A7B06F16C00B96895 +:200DE0000192214A00956B4611F0A2F9684615F003FB396902911D49009506F188006A4603 +:200E00000FF096F8B07830B906F1C400214613F0BFF817483061707830B906F58A7021463B +:200E200013F0B6F81348F060684615F0A0FC01948DF8004006F5B2700F4902950A226B46C4 +:200E400010F038FDB969FA6906F13C0015F019FA0A4A06F1580004212B4613F0C1FC284626 +:200E60000090BDE8FF81C046A501010043E901007F6802002D6802004D120200A9640200F3 +:200E80002DE9F84F80460D462868DFF824A1D8F80040D8F804700689D0F804B0E168914631 +:200EA000504615F0F7F90028CDF8009018BF6FF0010074D148464FF0000960723A496561BD +:200EC00042464B46C4F804903648A37014F093F83978272015F036FD31465846062204F028 +:200EE0000FFCA8B9334E4C3E306840690146272088472E4F4FF0020BC7F8FCB2F06C4068A3 +:200F000001460620884750B14020386080263E60504615F025FD4FF0FF30BDE8F88F584663 +:200F200012F0BCFCF06C95F82010C26928699047F26CDDF800C095F8200095F82110136872 +:200F4000BCF1010F4A4608BF01229847E869C7F85001C7F85491A869C7F85801A96959B131 +:200F6000F06C076968684A461346B847F06C806901461148401E8847207A042804D03068A9 +:200F80000069014627208847F06C0369E969EA68A8681C460B46A04740460DF0B5F9BDE89F +:200FA000F88FC046AC190120A5E90100044402404C160120FC01001003000080F0B50E4699 +:200FC0000746002406F10805ADF1240D28468DF81C4014F070FA18B9384629460CF062FBF9 +:200FE000284607A96A460AF07BFE414D01466878A127012818BF022812D19DF81C30BBB9D1 +:2010000005A8214608220AF0E9FE05A807A96A460AF066FE01464FF6FF70884204D16878CC +:201020009DF81C5025B907E001208DF81C0068784FF6FF728A4207D1002855D115F02CFB74 +:20104000002851D127463AE02A4B9DF810205D782746002A3BD0521E2DD0521E0AD0FB3A22 +:2010600008D0921E40D1012812BF0228012086F8260024E08A0002EBC102B169D218383242 +:2010800053688B4215D8491C012851601CD002281AD038B9748240F20110B0829DF8125049 +:2010A00086F8285006F11E0002A9082214F076FD1AE0A22718E0012806D0022804D040F2EF +:2010C00003107482B0820FE04FF48170F9E705209DF81330708203F07F00B08205B1012464 +:2010E00086F8264086F82740384609B0F0BDC046E4040120CCE800202DE9FC4706467568DE +:20110000D6F808802F780FB1AF6B1FB14FF0FF30BDE8FC8729630024EC77171C6C631BD092 +:2011200005F13C0915F006FC82466946484610F061FD002820D4504615F07CFD9DF8000045 +:20114000296B0870686B296B7F1E00F10100686301F101012963E5D169786A6B286B012919 +:20116000A0EB0200286305D1E868296B0346304698476A6B144659E0AF63D8F80010086B32 +:2011800040F400700863D8F80010886B40F4FA608863504615F04EFD05F5D47014F04CF987 +:2011A000687805F5D47768BB15F0C4FB95F82D1069B1696B59B1A96B49B1AC6315F03AFD08 +:2011C00005F5D47014F028F9686BBDE8FC8715F031FD696805F58A76304615F05BF80028BD +:2011E000F2D0AC633046214615F054F80028EBD0384614F011F91022696B286BEA77401A2D +:201200002863E1E715F096FB95F82D1061B1696B51B1A96B41B1AC6315F00CFD05F1880092 +:20122000012115F0A5FB01E015F004FD2046BDE8FC8770472DE9F04F05468846ADF1140D8E +:201240001C46D5F808B00E990092DBF80400019108EB0401884238BF6FF003047BD3404E0A +:2012600030684FF0FF3115F015F83E48019F01684FF0000978081CD23846CDF80C908008A9 +:2012800027D334B33046DBF800200099066823464244491E521E11F8010F12F8015F05406F +:2012A00085421CBF6FF00604301C52D15B1EF2D10FE034EA010701EA040202D02A480068C6 +:2012C000121801EA080128460DF0D6FF002803903CD1DBF800500FF0E1FE27464544DDF81C +:2012E00000A0029002E0BF1BB244AD1997B1082F8CBF08263E1C15F01DFB0490294632465A +:20130000504614F07BF98146049815F093FCB9F1000FE8D0029813F053FBB9F1000F12D1D0 +:201320000198C00812D38CB1DBF8000000994044491E401E10F8012F11F8013F9A4202D145 +:20134000641EF7D102E04FF0FF3003900448039C006815F005FB204605B0BDE8F08FC046C3 +:20136000001B0120081B0120041B01202DE9FE4F0CAF1D468B465FEA02083E78009014BFEF +:201380004FF0804A4FF0005A15F0D4FA0324DFF804910190BBF1FF3F14D1D9F8A8100098C4 +:2013A00015F012F858B9D9F8AC10009815F00CF800280CBFD9F89870D9F8AC7008E0D9F86D +:2013C000A87005E000985946002211F0B7F80746002F59D097F8330030F07F0053D04C464C +:2013E000D4F8A800B84219D0D4F8AC00B84215D000982A463346394608F0AAFB002842D068 +:2014000094F8240001283CD094F82400042838D0214904F1E00015F0ABFA32E0D4F8A80094 +:201420005346002211F0A8F8D4F8AC005346002211F0A2F8B8F1000F14BF1848184813F034 +:20144000D7FBB6B1D4F8A80000224FF0807311F093F8D4F8AC0000224FF0807311F08CF8AE +:201460003869C4F8D80094F8DC0040F0010084F8DC0035B1D4F8981000982A46334608F073 +:2014800067FB832400E00424019815F0D3FB2046BDE8FE8F68F20020020000400100020474 +:2014A000010001042DE9F04FADF1140D02921D460191DDF83CB00E9C009015F03BFA464AC4 +:2014C0006FF001084FF00109002392F840A2039009FA03F616EA0A0F6FD0B5F1FF3F18BF2A +:2014E000AB426AD1D8B214F0F7FD002865D0877A002F62D192F84012B14382F840124F4651 +:201500008772009D437292F842120560491C82F84212019E06722E4F4760017A07460129DD +:201520001ED0022924D140F20361018290F90930C17C5B1D21F00F0103F00F030B43C37462 +:201540006379817C63F3C7018174C17CA37963F34611C174C17CE37963F30411C17407E044 +:201560000A20388297F90900401DB874A0687861BBF1000F08BF002012D09BF801009BF8D9 +:20158000001097F90960134C4FF6FC75800040EA4110711D40EA012005EA000144EA01003A +:2015A000B861029800B17860506808B9386850600CF0E4F897F9098002E05B1C032B87D354 +:2015C000039815F037FB404605B0BDE8F08FC046734A01000100040668F200202DE9F0414A +:2015E00004464A480078ADF1280D18B9E17A15F0F5F808B9012085E06846002124220AF050 +:20160000EDFB208B00F0010100F00C00084301D1207A08B9B62075E00F288DF808004FF0A3 +:20162000000613D002284FF003050DD0032806D0012812D126884FF6FF700F2508E068463A +:20164000214615F05DF908E0208804E020880B2502218DF80810ADF8000005F00C07B7F167 +:201660000C080CBF03200120678A801DC1B27818C0B28DF81F0008F0A3FC071C40D0089737 +:20168000B81CB8F1000F00F8015B04D100F8016B311200F8011BA17B00F8011BE189091225 +:2016A00000F8011B217C00F8011B218A091200F8011B628A616914F071FA14F07BFF0326BF +:2016C0003A46810041F0030102F8011B80111070A0898DF80C60A37EADF80A0015F00C0FA3 +:2016E0008DF80D300CBF012000200021ADF80E00684607F0A9F80446384610F0BBF900E0A6 +:201700001024E0B20AB0BDE8F081C046C60A01202DE9F84306464FF6FC751C46174688465C +:20172000B54200F0848000210FF028FCDFF804910646B9F83A00B04201D1E00977D3214679 +:2017400030460BF04BF9C0B9A81C00210BF046F998B914F0180F0DD0374B0020997911F02E +:20176000180F03D1642805DA184606E0401C08336428F3DB0220BDE8F883AD1C06804545B3 +:2017800018BFA0F802808471610824BF44F004048471012F0CD04179012913D0817911F018 +:2017A000180F0CBF99F83710FF210171477109E001214171817911F0180F0CBF99F8381092 +:2017C000FF210171012F32D1B9F8481040460FF0EBFF60BB194C1A4F00204101A1EB800174 +:2017E000C919B1F87C6307F2AC52002364215588AE4205D0491E02F1080203F10103F6D11B +:20180000642B04D0401C1C341428E6DB0FE0204600211C220AF0E2FAA4F80080B9F848001D +:201820006081AA27A77401266674062525740020BDE8F88350010120CC0600209C040020B2 +:20184000200100202DE9F0479646464A88461E23002401460125204697782FB15B1E02F12D +:20186000080204F10104F7D11E2C79D03E4C3F4F814633264FF6FF7C82F8069037F824AFFF +:20188000D04510D0638F53450DD03B7933F0040A06D0012B07D14B899C4508BF284302E064 +:2018A00093795B1C9371761E4FEA4505E6D1304D1426ACF1010C35F81C3F98450DD09C454F +:2018C0000BD0B4F848306F89BB4206D16F7C27B1AF7C17B193795B1C9371761EEBD19779A0 +:2018E000082F01DC17B909E0082393718B7C012B04D094F826305B1C137101E082F8049019 +:2019000094F82B30937094F82570D7708E891680CD7C82F805E0D571B8B116491E2201F1E0 +:201920003B030D46494613F8017F37B1BE4504D0521E01F10101F6D107E01E2905DA83F88A +:2019400000E005EB8105C5F8AC002078402110F071F820B920784021642214F0AAFF012040 +:20196000BDE8F08744020020500101200810002080040020200100202DE9F84F8346DBF85D +:201980001800057800216A46A3200EF06DFEBDF800004FF00009854224DABDF80000401BE3 +:2019A00084B2042C01DA0CB91DE00324E00000EB041008F005FB5FEA00090FD007464FF069 +:2019C00000088CB146467119A2203A460EF04CFE761C1837F6B2B442F5DC05E04FF0B508F1 +:2019E000002401E04C46C8469BF81100E1B215278DF8020011FB07F0001DC0B2401C08F062 +:201A0000DFFA4E460BF1020B071C45D0781C82468AF800809DF80010E3B2B970FD700425C1 +:201A20003C7143B3001DE4B2314614F069FF317A00F8011BB17A00F8011B7189091200F862 +:201A4000011B317D00F8011B317D032906D0317B00F8011BB1890E35091205E006F10C01B7 +:201A600014F04EFFB17D1535641EEDB200F8011B06F11806D8D10C4E2B460DF10200594640 +:201A800048F23302341DC4F800A00CF005FB38460FF0F0FF09347460B9F1000F02D0484698 +:201AA0000FF0E8FFBDE8F88F2804012030B54B4C0546E079ADF12C0D012840F0878014F06C +:201AC00023FC002840F08280688800287ED1404905A8122207F01AFA20784FF480510DF008 +:201AE00021F8A96911F8010B0C784A788DF8140004EB0220ADF816009DF81400C8BB881C2B +:201B00009DF8181010F8012B10F8015B10F8014B01F0E00102F01F020A438DF8182010F825 +:201B2000013B8DF8195010F8012B10F8015B8DF81A4010F8014B8DF81B3010F8013B8DF817 +:201B40001C2042788DF81D5005788DF81E4005EB02218DF81F30841CADF8201014F8010BC9 +:201B60008DF8220014F8013B8DF8233025788DF82450BDF82000B0F5285F23D2154800684D +:201B80000DF126016A460AF0ABF80446C82C11DA9DF8100010B1FD208DF8100021461422F5 +:201BA0006B46042011F074FC0B4AA000012100EBC4001154002014F07BFD01200146F5F7C4 +:201BC000DBFC03E00120022111F044FB0BB030BDA6860200EC0601200DE900206806012039 +:201BE0002DE9F84FD0F8E8200023083A002AC8BF0123D0F8C0C0D0F8D020E346DBF8004042 +:201C000094420CD8DBF81470002FBC4678D001228CF81020D0F8C0B04FF0000E00E0964622 +:201C2000DCF80020A2EB0E02B2F5806F88BF4FF48062D0F8D8702FB9C0F8D820D1F81C8004 +:201C40008E6904E0C0F8DC20D1F824800E6ADCF804402CB92B4C9F00E55900F1F6040AE0EA +:201C6000294D9F00ED5903F1010A02FA03F90EFB0A444C44641EB56034600C6804F1080986 +:201C8000C6F80490B56843F6F07A1401103C0AEA04042543B560DCF8086026B9194BDD59A3 +:201CA00000F1F40308E0194DED595F1C02FA03F30EFB07669B195B1EC8F80850C8F804308C +:201CC000C8F80090D8F80830E34544EA0304C8F8084004D1D0F8D0309B18C0F8D03090F8B7 +:201CE000FE706FB90B685A6A42F003025A62D0F8CC004F6943680A69196847EA020088621C +:201D0000BDE8F88F24880200348802002C8802002DE9F04306467568B7680C46ADF1140DD3 +:201D200014F008FE95F8FD1021B96169102901D8042903D214F07EFF00206FE04FF001090E +:201D400085F8FD9014F076FF2069C5F8E4006069C5F8E800207B85F8F900207885F8F8004A +:201D60000020616885F8FC008046C5F8C080C5F8C480C5F8C8802B4AC5F8EC10217E12F861 +:201D8000211085F8FA10F989A5F8F610237B002B0CBF1021494685F8FE00C5F8F010387B27 +:201DA00005F0F8FA30460DF095FA97F83B0085F8FB00304609F090FA684614F0DDFA787985 +:201DC00000966B463979184A0190284610F0B0F9684614F011FBB96802911449009605F1A5 +:201DE00030006A460EF0A4F80EF0BAFD014633460F4AC5F8CC1005F11C00042112F0F0FCDD +:201E000095F8F80030B905F16C00414612F0C0F8084800E0A068C5F8BC00304605B0BDE830 +:201E2000F083C046E8850200F9C300003118020035670200776802002DE9F04FADF1140D20 +:201E400002A913F049FA5FEA000940F08380434F029C3E69218856B1B61F0322002036F83D +:201E6000063F994205D0521E00F10100F7D1C82601E080460026182008F0A2F8051C0ED0BF +:201E80000021182209F0AAFF608818212A4614F04BFC4FF6FF70608028460FF0EBFD4FF63B +:201EA000FE7A4FF0000BA4F800A0002E84F804B050D13869444668B3142008F081F85FEA71 +:201EC000000827D04C205946022203AB14F068F902255E463869B44207D0A9B24C20062299 +:201EE0006B4614F05DF9694603E0610001EB84010918A8B20622404413F050FE761CAD1D9F +:201F0000032EE7DB4C201421424614F00DFC40460FF0B0FD4C205946022203AB14F040F94C +:201F2000C0B93F695FB1610001EB8401BDF80C007A5A5646964204D138B1401E03E0BDF8E1 +:201F40000C00401C80B2ADF80C004C20022103AA14F0EAFB484605B0BDE8F08FCCE80020D6 +:201F6000F0B5ADF13C0D11F0A5FF454E96F84A00082807D0332086F8290086F827000127F7 +:201F80007765B76568460021242209F027FF3D4D2878012804D0012000278DF80A0002E035 +:201FA00000278DF80A700F2446208DF837400DF13701B4700FF0FEFE6D1E8DF82470A8794C +:201FC0008DF8250014F0F6FA8DF826008DF827708DF8287096F85C008DF82A700F28A8BFD8 +:201FE000201C06F15D018DF829000DF12B0014F087FC0DF13300FF21032209F0EFFE96F808 +:2020000096008DF8360009A80CF0D6FB06F1140145200FF0CFFE08F0CBFE8DF80C708DF86D +:20202000207096F850008DF8157096F851508DF80800B6F848308DF8095096F85320ADF8C2 +:20204000043096F83C408DF80B2006F13A018DF8064053200FF0AEFE06F13E014B200FF0D7 +:20206000A9FE96F82B203078642111FB02F2082114F022FC684605F0D1F80FB0F0BDC0468A +:2020800050010120E5040120FEB505462B7A33F001000BD0288804460FF08CFC30B9032B8A +:2020A00006D1284601A911F009FB18B90220FEBDADF80440688A443007F082FF071C08BFCD +:2020C00010206ED00021442209F088FEA87A0DF1060112F05DFF9DF8060087F83A009DF81E +:2020E0000700012187F83900384612F061FA242207F11000294613F051FD07F1440038643E +:20210000688AB88769696A8A386C13F047FDBDF804002449B8808878F8718878401C8870C2 +:2021200014F08CFD044614F027FA97F839604FF47A71FF236043B0FBF1F0388003FA06F051 +:2021400087F83700002487F83600288B8DF80040400834BF201C01208DF80100287A8DF833 +:20216000020068460EF052FF801EC1B2BE8FBD8F87F8341097F8342095FBF1F0C0B2387283 +:2021800096FBF2F15143761A1CBF401C3872064E388D40F008003885307801210CF058FF9B +:2021A0002046FEBDE0060120800A0120F0B50646B16948780D7805EB002543480088ADF136 +:2021C000140DA84271D1414C708802A90BF06AFAB71C241D01281DD19DF80F00042807D150 +:2021E0009DF80E00CF2803D19DF80D008C280BD09DF80F0054280DD19DF80E00EF2809D1AE +:202200009DF80D00442805D15F201123E0700020237102E00020E07020712A490A6802F861 +:20222000010B02F8015B2B1202F8013B2078C11001F0020300F0070001F00101194340EAFA +:20224000C10002F8010B607800F0F80100F00700084302F8010BA07802F8010BE07802F83E +:20226000010B207902F8010B607902F8010BA07902F8010BE07902F8010B207A02F8010BB6 +:202280002089001202F8010BA07A02F8010BE07A02F8010B207B10233946107048F20202F2 +:2022A00006F111000BF0F8FE0AE048F202000090307C0190707CB11C80222B4611F0C0FEA7 +:2022C00005B0F0BD2C040120E00301204C1A0120F8B5474C054620684030816F0F780023A3 +:2022E000B7B395F8987097B92521297501680968C98AC90939BFD0F8940090F82500D0F8E3 +:20230000940090F84E0085F86A00801C0EE01521297501680968C98AC90939BFD0F89400BB +:2023200090F82500D0F8940090F84E0085F86A00042085F8693005F1900185F86B000A68BC +:2023400005F170073A604E687E600889388101E001202875B5F89E0095F8A07095F82C2038 +:20236000E88295F8A160EF760F2A2E770CD02068B5F8A870D0F8046305F12C011A4607B987 +:2023800001222846B047034673B995F83C00FF2801D1A86D38B12068D0F8FC2205F13C01DF +:2023A0002846904703460BB11F461FE020680027D0F87463009795F89C10B5F89A3005F1E4 +:2023C00090022846B047071C10D1216801F5807108682A89C0899042A8BFD1F8781103DABE +:2023E000E5206870D1F86C1128468847F8B2F8BD140100202DE9FF47444D0C460646904688 +:20240000600831D230460EF0B9FD698F814205D03046022122460BF002FC08B9002072E06A +:2024200030464FF6FE7102222346FFF771F9002868D124F02004E0091ED2304602A912F0F0 +:20244000E6FA70B9B5F84810304611F02DFF071C12D0B81C13F02FF870B1B91C02A814F024 +:202460004FFA44F0200407E04FF6FC76A00834BF44F0080444F0100425486B8F90F800907B +:20248000012509F101010022C9B20170491E00951846C9B20AF016FBA0BB4FEA641AA00971 +:2024A00034BF06200E208DF8050001A812F0D4FD071C25D0BD7713F041FB78623869057054 +:2024C00004F07804447080F802903112C670002301715FEA5A01437103D3801D02A914F046 +:2024E0000FFA4FF6FC70B8F1000F788004D0B8F10F0FB8BF87F81A803846F7F7A9FE02E052 +:20250000102000E0C7200090BDE8FF8750010120640F01202DE9F041454C05462078002820 +:2025200000F08280B4F9B600B4F9B41088421DD004F1980128460E4611F035FC70B9D4F8A7 +:20254000A810284613F040FF28B906F10801284611F029FC01E0D4F8A80038B1B0F9301077 +:202560000A224FF0E043284603F0A6F914F0E2F9804604F1B8000168A94219BF0026466083 +:20258000002606602078401EC0B2207000283BD194F82400656002280ED1082010F0A4FD3C +:2025A000404614F047FB05F150004FF0FF3113F071FE14F0BFF9804604F1E00014F0D2F902 +:2025C00004F1600014F0B4F904F58E7014F0CAF904F17C0014F0ACF904F5AC7014F09AF971 +:2025E00004F5CE7014F096F9E16911B104F14800884704F1340012F0BFFD0C48007801281D +:2026000002D10E2004F02EFC606805F15007854208BF6660404614F00DFB384614F09EF987 +:2026200005F1B80014F076F9BDE8F0818687020068F200202DE9F843434D444C3E4EDFF806 +:20264000FC80DFF800910746012F44D139480068006801460120884701283CD096F8380180 +:20266000002838D108342068C0F38140C8B940460068B0B154F8080C000834BF4FF48050B3 +:202680004FF440502E4908600A2014F02DF94846006901460120884706F1940014F042F93C +:2026A00001E012F093FA0121206886F83811C0F3814010B94046006848B913F0C3FF8009BF +:2026C00005D28020A860286840F080002860032011F0E4F82BE057BB0BF03EFBA068C0F3A7 +:2026E0008140A8B94046006890B106F1940014F01BF92068000834BF4FF482514FF4415178 +:20270000134A48461160006910B101460020884796F8380158B12868802720F080002860DE +:202720000320AF6011F0A2F8002086F838010020BDE8F883E0010010501800204086020074 +:20274000A8A00C403086020090220840AC4F005028A10C402DE9F04105460024ADF1500D22 +:2027600028888DF84C400FF025F9002879D13E480078A0B9A87804280FD113F0C5FD60B9A8 +:20278000686813A901AA09F0ABFA80469DF84C0000280CBFAD26261C02E0B62600E0B3263E +:2027A0001E2012F0D3FB074666BB03209DF816108DF84D000FAA03A80CF030FD0DF14D0015 +:2027C00008210FAA0BAB0CF02DFBA8680BA9102212F0B2FCA8B106A80090414622461423DA +:2027E000042010F013F89DF82B0030F07F0003D00DF12B0011F092FA022006AB8DF8280042 +:2028000012E0AD269DF84C00012812D102949DF81700019430F07F0003D101208DF8150001 +:20282000FF248DF8144001AB04204146142210F02FFEB7B10920387028887880A8787E77EC +:20284000387169680822781D13F0A8F9A96807F10D00102213F0A2F90448007839460DF075 +:20286000C1FF14B0BDE8F081E5040120CB03012044492DE9F04105464C310868002877D149 +:202880003E4CA7683E1C0BD068883988884203D12979BA78914218D03E46BF69002FF4D1EC +:2028A0001C2007F08DFBD4F80880071C63D000211C2209F093FA4FF6FE70FF233881B8F197 +:2028C000000FFB720CBFA760B761687AB871287A78712879B87068883880287B3875287A99 +:2028E000012806D107F10C00FF21082209F076FA05E007F10C0005F10D0114F001F8A97A14 +:20290000062938DD6879012803D013F0CBFE002831D0B87A00231E46884202DAEA7A102AA4 +:2029200005DB884204D1F87AE97A884200DD01231348007830F0010203D0022808BFEE7957 +:2029400000E0AE791EB9E08F2988884206D12BB128883881A87AB872E87AF872E87908B161 +:2029600001203871A87908B10120F870BDE8F081096828468847BDE8F081C04650010120D8 +:20298000E5040120C40301202DE9F04F002788460646ADF1140D039713F0CCFF3A4D04906D +:2029A0006868384CC36C2069052103AA9847684613F06AFBDFF8E490CDF80880DFF8D0B054 +:2029C000DFF8D4A0DFF8CC80009629F0010926F00106B1451BD02D4820F00100B0420ED17B +:2029E0009BF900106B68206911F1020F24D059469A6B91F90010904781281BD015E04046AC +:202A00000068D0F84C0580476FF001071AE09AF900106B68206911F1020F0DD051469A6B82 +:202A200091F900109047812804D040460068D0F84C0580476B682069DB6A69463A4698472B +:202A4000071C04D540460068D0F84C058047B14507D00E4820F00100B04204BF58460770AE +:202A600001E05046077001206F6803902069FB6C052103AA9847049814F0DCF805B0BDE86D +:202A8000F08FC046A4060120D4050120B51E0200B10A012014010020B00A0120E9970100AA +:202AA0002DE9F0413C4F3B4C3C4D38696168ADF1300D58B921B92868D0F84C0580476168CB +:202AC000096A07F11C0088473548B8636069016929B12868D0F8D40090F853008847286895 +:202AE000D0F8D40090F942000CF0DCF8B0F1FF3F0A9008D00290000834BFBDF808004FF6BF +:202B0000FF7028490880DFF8A0800026A8F87E60C8F8806098F8890020F00F0040F00100A9 +:202B200088F8890098F88810012363F3C71188F888102868D0F8C403804730B91B49102097 +:202B40006B680870596814230B703869454650B9606804687968164805F17C0207F11C0384 +:202B6000A047386113E0304610F02AFC6068416E02A88847334660680593066D08228DE86B +:202B80000C0038697C35294602AAB047A5600CB0BDE8F081D4050120A406012014010020F4 +:202BA00054F10080E600012058000120D8000020680F0120BCB505460020E860012428616E +:202BC000A978287501F0030348081DD2C80801F00C0201D3042A04D1022B01D1480900D239 +:202BE00002240C2A04BFA41CE4B2022B01D148090AD2241D32F00807E4B203D00C2A18BF4C +:202C0000042A01D1641CE4B231F07F070BD0E878641C10F0030FE4B205D0641C8808E4B219 +:202C200024BF641CE4B213F0CBFC2A88641CE4B290420BD0880909D32148016828468847E0 +:202C4000286918B9A87800F0DF00A870287D002834D150202F6969792B798DF800008DF8A1 +:202C600002101819C0B227B17A7F397F89180918C8B28DF8010068460FF098FAC8B12988EB +:202C8000012747764180A97880F83810E97880F839102979036980F842101919416480F864 +:202CA00048402F691FB13A7F416C89184164E860BCBD284613F056FD10202875BCBDC046A7 +:202CC000B80801202DE9F0410F463E4C3E4904EBC00409782668D4F80480ADF1280D8142BE +:202CE0006BDD07B9394F96F85200002865D198F80100022826D1022086F852000EF0DEFB8B +:202D0000684613F0A3F900258DF800508DF808503968039598F80000019169460EF0CAFEBF +:202D200070607068002848D013F044FDF87998B13A68B979706864235143B1FBF3F113F053 +:202D400034FD09E002F06EF8012198F8000086F85210002586F8540006A813F008FD8DF83D +:202D6000185008941A480795294606AA0EF0C2FDB060B068E8B138683060B87986F8530082 +:202D8000F87988B1401E09D0401E10D1B8884FF6FF72411020460CF0FAFE08E096F8531099 +:202DA000204610F065F802E020460FF0F5FA204604E0706808B113F0F3FC00200AB0BDE8CE +:202DC000F081C046F88602006A83020004880200E3220200F0B50446A178606840182178B7 +:202DE000ADF1440D0546F9B9217F0D2914BF00230123227C617841EAC20141EA431100F81B +:202E0000011BA16912F0BEFE0646012B04D104F1080113F075FD0836207C04F1080101280D +:202E200004BFA07D307005E0297860780843287004F10801A7692E7804A813F061FD06A862 +:202E4000394612F09FFE0670A078237F8DF80000E7788DF8013066788DF80270608A8DF846 +:202E6000036060B9A18A40F201128A4207D194F8281004F11E000CAA0CF0D0F903E0A18A62 +:202E80000CAA09F093FE0CA8FF270390207C8DF84070022803D003280CD1022000E000208D +:202EA0008DF8400008210CAA08AB10A80BF0BAFF08A8039020786368694604AA00F028FA3A +:202EC000044628780021102200F0F800287008A808F084FF0CA80021102208F07FFF204627 +:202EE00011B0F0BD70B53248304E4FF08055B067D5F8D8012F4C036801210A46ADF1280D4B +:202F000020469847D5F8D801426801212046904713F056F8284906F124040822204612F04A +:202F20003DFE26490822204611F04CFF20B924492046082212F032FE2248A060224DE560E5 +:202F4000224B2361224A62612249A161224DE561224B2362224A62622249A16200252563F2 +:202F60006563E562204BA363204AE26320492164F06A10B1F16A2846884706F02BFA0DF069 +:202F8000E5FB684629462422082313F02BFE06F108048DF8185029466A46204613F01EFE03 +:202FA000746013F017FE28460AB070BDE8010120E368020000400340C87F0500EC87020035 +:202FC000F0120050517B0100CD000200B9AE0100DD90010045A60100F1BA0100FD7B01001C +:202FE0000DC8010019F70100555B020009D10100C1DD01002DE9F04104460D461646104628 +:203000000021342208F0EAFE082D5CDB61782078357000EB012031460FF0E7F800280CBF83 +:2030200001270027E178A078A2792379657900EB0120B274E179708103EB0520F174F579D8 +:20304000B081002D08BF082103D004F1080010217061357A084625B160180831B061C9B240 +:203060000846002386F82030757973622DB17070605C491C7071C9B20846757FFDB1481CBF +:20308000C2B2605C7270511C86F82000C9B27170A25C86F821208242A8BF737710DA0C28C7 +:2030A000C8BF0C20DFF85080450009192A46404612F074FD7078C6F824804019C1B27070F0 +:2030C0003078814202DD0020BDE8F081B379401A6418C5B2002B08BFB46209D007480E3D7C +:2030E0000E34EDB2B4620078357712F09FFD2D1A35773846BDE8F081440100208001012089 +:20310000B0B5C16891F838300A6903F0030535F0020702F8013B40D1D90803F00C0401D395 +:20312000042C08D1022D01D1590904D2C16891F83B1002F8011B0C2C09D1C16891F83C102A +:2031400002F8011BC168898F091202F8011B022D01D1590921D2C16891F83E1002F8011B7B +:20316000C168C98F091202F8011BC16891F8401002F8011BC168B1F8401034F008074FEAF7 +:20318000212102F8011B03D00C2C18BF042C04D1C16891F83A1002F8011BC46894F83910DD +:2031A00003F0020701F003010F430DD1618D090A0AD2144DA97884F84910A97802F8011B83 +:2031C000A978491CA97003E094F8491002F8011B33F07F0714D0C16891F839101170C16840 +:2031E00091F8394014F0030F0AD091F84B1002F8011F990804D3C06890F84C0002F8010F61 +:20320000B0BDC046E00601202DE9F04307464FF6FE754FF00008ADF11C0D391DBD8101A89B +:203220008DF8008013F056F968460AF061FD07F10409444601280BD1BDF80C00BDF8021015 +:203240007E88B8818E4218BF6E4602D1012441E046468DF80E807888ADF810000DF10E005B +:2032600008F0F6FD012808BF0DF10E043046012618BB74B97888854206D1484612F01BF984 +:20328000012818BF404602D138460CF0EDF906461FE0A089B881201D12F00DF9012807D083 +:2032A000484612F008F9012813D103213C460DE038460CF0D9F9064606E080893146B881A6 +:2032C00038460DF03BFD24B16580022120460DF035FD34463E78A6B1384611F0B9F90128E8 +:2032E0000FD10A48BD89001D0168AA0002EBC502501889180A78164203D116430E7013F0E1 +:203300002EF9204607B0BDE8F083C046DC0A01202DE9F04F0C46834661782078D4F80C90FB +:203320004018C6B2E0781D469246ADF13C0D0428A8BFA77803DAA07800278019C6B211F063 +:2033400069FC0E90E07812F071FC0D9049461022F01900EB050809A813F0CAF84FF0000986 +:203360000146BBF1000F25D1E078042847DB002946D1684613F05FFA09A8069621780797E1 +:20338000637800900D240D9E01951A46CDF810A0204FCDF8148058188DF8204052188DF86F +:2033A000216040195219039069463868029213F06EFA23E0E078042821DB09BB684613F0EF +:2033C0003AFA09A8069621780797637800900D240D9E01951A46CDF810A00E4FCDF81480CD +:2033E00058188DF8204052188DF8216040195219039069463868029212F05FFB014609B171 +:203400005FFA81F90E9812F090FD48460FB0BDE8F08FC0460CDC00202DE9F04780463D498C +:20342000D8F80460C86CD1F808A07F2500220124A946ADF1200DB0438446C86404FA02F035 +:203440001CEA000F10D05FEA0A074FF0000007D0BB789A4204BF401CC0B2BF69002FF7D148 +:203460008542C4BF051C9146521C1B2AE6DB002E0D4637D1284C5FEA0A0726D02168B5F813 +:2034800048004FF6FF72254B3E88B0421AD1BE78B14517D103F130063688B24208D113F04F +:2034A0001DFAA5F848003E88B0420ED057460AE0002485F84A4009B1C4208847204611F0F4 +:2034C000F3F924E0BF69002FDED185F83C90FEF747FDE0B10020216885F84A00B9B1C42025 +:2034E000884714E0EE64684600211C2208F076FC8DF8044000268DF80760D8F80400009001 +:2035000095F852708DF80570684608F009FE08B0BDE8F087500101200C0A0120E40401202F +:20352000FEB53F4C074694F84A00032803D0012818BF092870D13B4D7878384E69780028B3 +:2035400050D17888B91C608753200EF033FC94F84A00092801D011F0F7F90127422002A9F0 +:203560008DF808700EF026FC0420694684F84A004A2011F085F904F14000694613F0C0F90C +:2035800030780B2805D0B4F84800002107F020FE01E006203070687830F0010008D1E08F61 +:2035A0004FF6FE71814203D06946002200F0ACFD94F83200000934BF0020381C02A98DF8F9 +:2035C000080052200EF0F6FB6878022822D194F83200000934BF381C4FF400403946FCF782 +:2035E000DDF917E002290CD130780B2804BF0A2030700020E87020784FF480410BF092FAF3 +:203600007878B4F848200146104607F0E1FD002084F84A0011F0F0FEFEBDC046C4030120B6 +:2036200050010120E40401202DE9F04391460A68D9F800401678804600271D463846ADF172 +:20364000140D242E02F101020A6058D11678521C4C2E0A600ED1AA68E41C24F00304241D41 +:2036600054F8040C414613F0B1FA2968EF600127091A2960462E1AD1E41C24F00304241D4A +:2036800054F8040CE41C029024F00304241D54F8040C002741460390AA68ADF8047001A86F +:2036A00013F090FA2968EF600127091A2960532E25D1E41C24F00304241D54F8040CE86151 +:2036C000C9F80040288B0090A968EA69D8F800004B4613F073FAD8F80040002744B1A96834 +:2036E0008142D8BF481ED8F800100918C8F80010D9F800402968EF600127091A2960662EE0 +:203700000BD1298B012904D0E41D24F00704083403E0E41C24F00304241D1FB9E9690E70D8 +:203720000127EF60C9F8004005B0BDE8F08370472DE9F04105463E48401C0078ADF1280DCE +:2037400030F0010169D1374C04F13A0109880026A94228D0284613F076F8071C59D03879E4 +:20376000012818BF022854D18DF818607888ADF8240006A80CF05AFC00284AD038882849C1 +:2037800008800DF10B0007A913F0BAF812F024FE8DF81660ADF8140039790222684606F0E1 +:2037A00083FBFE6039E0002D33D030F001004FF001062ED10CF068FBADF82600BDF8260079 +:2037C0000DF12601608753200EF0F4FA1648BDF8264007680EF0AEFA1448007810210BF0F0 +:2037E00037FCA7B14FF0D6087868007860B1042011F0ACFB011C07D081F800804C80786853 +:20380000406800780CF0EEFF3F68002FECD10CF04DFD16B9284611F0ABF80AB0BDE8F08115 +:20382000EA02012050010120C00A0120CB030120E40401203F482DE9F04F001FADF1140D6C +:2038400000F1A80100F1980B8046029100F1AC0103914FF4804012F0EFFBE8B14FF0045094 +:20386000D0F89813D8F8046090F88503C3F38857C1F31501C0F38002C1F31501B805014332 +:20388000B06841EAC2716A4602F040FCD8F804008168012011F0E2F9002702260DF10409C0 +:2038A000234D049759F8044F236883B32068806912F0C2FB82462068002352460EF05CFE05 +:2038C0001AF00A0F08D1BAF1000F20D0206847F48047C8F8B0001AE020681449AB6880696D +:2038E000014023EA0100A8602068C1692A6822EA010028602168102011F0B0F921680BF1B0 +:20390000080011F097F8049847F002072060761EC8D127B108F1E000394613F029F804F03E +:20392000B9FCF9F74BF805B0BDE8F08FFDBFFFFF0C1004406CF200202DE9F8430446A06A89 +:203940000D464778C178807800EB0129207F042866D136480378DFF8DC80354901263846BE +:20396000022829D9C01E072846D90838012819D9801E02D0401E3FD03DE033F001033BD167 +:20398000414691F83200800836D391F84A00082802D14846FFF7CCFE48460CF077FDC52845 +:2039A0002AD122E033F0010026D108460078800822D30DF0A5FD1FE033F001001CD10846AF +:2039C0000078800818D34846002109F007F870B1817911F0180F0AD0A18900910288438828 +:2039E0006189104600220CF0C1FB002604E0484612F090FA00E00025608939464A4610F08C +:203A00006DFD60890DF0D6FF50B1A07C022807DBA18940463A300088884201D0012E02D01A +:203A20000020BDE8F8832846BDE8F883E504012082010120500101202DE9F04FDFF8E4A0E8 +:203A4000DFF8E88000244FF001096FF001064FF6FF7B2546ADF1240D01A80090294622464B +:203A6000102303200EF0D2FE00284BD1BDF804109DF80970A80000EB45102AF80010504459 +:203A800047719DF80A3083719DF80820027180F809900482BDF80610C4729DF80B70418012 +:203AA0000623C771049A0372AA278772B2F1FF3FC46015D1037983B11B4A1778032B0CDA25 +:203AC0002FB958F82720C26158F8272009E058F827309A01A2EB830202E0C661866103E09D +:203AE000C261826180F820408B450BD08DF81490ADF8201005A80CF099FA18B1BDF8040081 +:203B000010F036FF6D1C332DA6DB2046042110F0C7FD3328A4BF0648047007F049F909B045 +:203B2000BDE8F08F2C100020E804012098800200FD0901202DE9F8433A4C364D8146241D55 +:203B400054F8040C800807D254F8080C05F14D01000C40F0F000087033484FF001214FF045 +:203B600080531838DFF8A880C0F804140088D3F8F0012668016803F5F87730468847B00EAE +:203B800003D2700E24BF02202870386842683146484690470FF0CAFE38B12068810C2CBF5F +:203BA000002040F307200EF0D9FB2048BC300068C0F3053188F80010410A39BF402185F863 +:203BC00023104021E974800900F0380040F46050A8F85C0038688168304688470E490F4AE5 +:203BE0000AE0105C9478131D844299BF184410F8010C18444078086008684B689842FCD15E +:203C00000228EED1064901200860BDE8F883C0460EB00C400962084000600C40DC870200EF +:203C200094046042B04F005018A00C4050130050394AF8B52120742112F070FD0A2814BFCA +:203C4000002501250C2006F0BBF9071C14D0FF210C2208F0C3F8314E002407E02146012029 +:203C60000C223B460BF0E4FE641CA4B23088A042F4DC38460DF0FEFE294E707830F0010081 +:203C800015D1102006F09CF9071C10D0FF21102208F0A4F800240320214610223B460BF03E +:203CA000C7FE641C332CF6DB38460DF0E3FE1D48006820B180470A2808BF45F008050FF094 +:203CC0000DF90A2808BF45F01005142006F078F9071C1CD00021142208F080F84C20142189 +:203CE0003A4612F01BFD0446092C04D14C2014213A4612F019FD38460DF0BCFE06F1480227 +:203D00007120082112F00AFD04430A2C01D145F020052846F8BDC04674010120DC0A012071 +:203D2000E4040120300901202DE9F0413A4D04462868ADF1200D18B90FF0BCF9286840B3A5 +:203D400030490978A14224DD4FF0FF3112F0A2FA2D490C2014FB00146768A66838780128FD +:203D60002ED0B268511EC843B86028683368844619420BD17068824208D8B96801408142CC +:203D800004D1706930BB308B042804DB604612F0E7FD002431E0DFF8748058F82030A3B93C +:203DA000684612F0A3F900208DF80C00F1698DF80000307E049169460DF03CFF031C01D10C +:203DC000002417E0308B48F82030114A815C491C815400E003687B601048318C0D4B016017 +:203DE0007A681A60204611F087F90120387020460FF04AFA286812F0B3FD204608B0BDE809 +:203E0000F081C0465C830200A0850200B01A0120401B01200C1B0120141B0120101B0120D8 +:203E20002DE9F8431D463B4B089C1B68C3F340689B0E15D20388A3F6020343B141F21E06BF +:203E40009B1B04D000F11A030B60C06903E000F112030B604069106000202860206056E06B +:203E60000388A3F60203F3B141F21E069B1B17D041F6E6769B1B05D0876AC36A90F8246039 +:203E8000BC4603E0D0F820C0436A002600F11A070F60C1691160C5F800C02360007E0DE03B +:203EA000466A836A01E08669C36900F112070F60416911602E602360C67B007C00F0070709 +:203EC000286888B140F203714FF6FF72052310F04BFC8146B9F1050F06DA3046394609F0FB +:203EE000DBF8296841F82900206880B140F203714FF6FF72052310F037FC0546052D06DA2F +:203F00003046FF2109F0C8F8216841F825004046BDE8F88394120050F0B5014688890425A9 +:203F2000ADF1240DADF8140000248DF81F504A888DF81E40354EADF81C20081D897B069009 +:203F4000022923D10DF121016A4607F0C9FE07469DF82100012856D19DF81000022852D16F +:203F600068462146142207F039FFFF20BB008DF81000142203EBC700345031184C606B4643 +:203F80004C72284639460FF083FA3CE051B3032925D008A96A4607F0A3FE01469DF82000C4 +:203FA00001281AD19DF81000022816D1FF209DF812708DF810008A000194781C00946B4674 +:203FC00000F00F008DF8120002EBC100345082195460284614220FF05BFA012408E0102095 +:203FE000214601E0082001218DF81F008DF81E1005A800F04FFC30B9012C04D1BDF81C0034 +:20400000069906F0AFF809B0F0BDC04604E9002038B505461446480817D2880872D31C200F +:20402000002112F0A1F91D20002112F09DF91E20002112F099F91C20002110F081FB0021E0 +:204040001D2010F07DFB002159E01C20002112F08BF91D20002112F087F91E20002112F02D +:2040600083F9284606F032FB21460090C20F0888A0F6020068B141F21E03C01A09D041F6EC +:20408000E773C01A09D191F8240010F07F0F04D019E0C87B10F07F0F15D1012A0DD01C200F +:2040A000002110F04DFB1D20002110F049FB1E20002110F045FB1C2014E01C202F2110F09A +:2040C0003FFB3221BCE7012A10D01C20002110F037FB1D20002110F033FB1E20002110F02B +:2040E0002FFB1E20012112F03FF938BD1C20002110F026FB1D20322110F022FB2F211E204E +:2041000010F01EFB38BD7047F0B50E1C14460546ADF1140D04D0084612F0C2FB071C1ED1B4 +:20412000324F33203979FF2905D0401E07F12407F8D100274BE001208DF80000ADF80250C3 +:20414000314601A812F0C6F96846FFF75DF8BDF80C00002678802846BE7110F009FC0020E4 +:204160000122014614B1052CB8BF04213D803C71797106263E727A72AA25BD723882F87106 +:20418000F8728023F86087F82130E4B118480678032C18DA17483EB900EB8601096B00EB2F +:2041A0008600F961006B0AE000EB8600036B9901A1EB8301F961016B8801A0EB8100B861CD +:2041C00087F8202003E06FF00100F861B8610020042110F065FA332802DB074900200870A7 +:2041E00006F0E6FD384605B0F0BDC0462C100020E804012068800200FD0901202DE9F0433D +:2042000081463848384C07AFADF1240DADF81E300578ADF81C1094F84A009046042814BF62 +:204220000828C2205BD0BDF81E004FF6FE71814208BFC32053D0684600211C2207F0CEFD5B +:20424000032007A984F84A0050200DF0B3FD4B200DF11E010DF0AEFD84F83C80BDF81C006F +:20426000BDF81E6084F832504946A4F8480004F15D00E68712F044FB1C4805F0CE0646F037 +:20428000800504F1240600788DF81A5030F0010003D13878401C84F85C0002208DF816007D +:2042A0000F258DF80B80002284F85150BDF81E708DF80820BDF81C30ADF80E7006F12D0142 +:2042C000ADF8183054200DF075FD06F12C01472084F850500DF06EFD684603F031FB09B079 +:2042E000BDE8F083521A012050010120E5040120F0B5364D384C0028ADF1140D6978207297 +:204300005ED129B9207818B9082011F0CBFC697831F0010051D168460021102207F05EFDBB +:2043200011F0F2FF002848D0294D05F1240006463930074610F04EFE20B9284938461C3158 +:2043400012F0DEFA06F1160153200DF033FD95F83200000934BF0020012004A98DF8100097 +:2043600052200DF027FD082085F84A0006F020FD07F05EFE1A49486808B901204860E0795F +:204380004FF440710AF064FE68460FF02FFB684600210FF01FFD95F8650010B9002004F03D +:2043A00003FA68460021102207F018FD09480078012802D0012010F077FA01200FF046FB3C +:2043C000E07902210AF044FE05B0F0BDE4040120500101209A060120C403012000DC0020A3 +:2043E000100A01202DE9F84F06467068B6F80A80447800F1020B042C10D0012C07D0062CC9 +:2044000005D090F81A9000F1120500270AE090F8129000F1130700F11B0503E000F1120749 +:2044200000F11A054FF0010A5FB1384611F043F8012806D111F082FB0146384611F09EFA7C +:204440008246BAF1010F20D0204C607830F0010039D1B8F1000F36D1384669460FF02EF968 +:20446000012830D100217172BDF80000708194F8260020B170680078052808BF01213173DB +:2044800030460BF0C5F8BDE8F88F202010F05EFD071C18D004203870A7F80280594610225E +:2044A0003C71B81D87F8059011F078FB07F11600294612F00FF887F81E900548FC77007807 +:2044C00039460CF08FF9BDE8F88FC046E4040120CB030120DFF8E8C02DE9F04300260D466E +:2044E00080464FF0B3094FF00E0E3746ADF11C0D01E07F1CFFB2002F5ED1002422462346DC +:2045000001E05B1CDBB263B913FB0EF01CF80010FF29F6D011464A1C8F42D2B2F1D100EBBD +:204520000C04002CE5D061798919CEB2B045E0DA28460021182207F051FC6179A8EB06005F +:204540004018C0B204EB4000C088688111F0F6FA0146284612F0D4F96078012822D06088E1 +:20456000ADF80C0004218DF8001068460BF05EFDE0B103208DF8160001A90DF10E0012F0C5 +:20458000BFF99DF816709DF81600032F287518BFBDF80E0009D105F10C000DF10E0112F049 +:2045A000AFF903E0012028756088A8812078287220794FF00009A875484607B0BDE8F08314 +:2045C000220100202DE9F043374C0346354A2668364C108E2578012B9146ADF11C0D0746A2 +:2045E00018BF4FF000080CD14FF6F87402E012F0D2F801468C42FADD0029F8D08846B9F805 +:2046000030002B4CE6644FF6FF7184F852500F2684F85060B94284F851604FF0000584F88D +:20462000535004D1814201D112F0B5F80746A4F8487009F1500010F0CDFC09F15007012890 +:2046400004D104F15D00394612F05AF904F15D00074610F0BFFC18B9E220394610F010F9AA +:20466000A4F83A8084F85060E58784F85160052084F85C5029461C2284F84A00684607F0BA +:20468000ADFB8DF804508DF80750E06C009094F852708DF80570684607F042FD07B0BDE859 +:2046A000F083C046E4040120D0030120990601205001012070B5324C0D46A80850D2E8089A +:2046C0005DD30125042065700FF0E8F82D480068006B8047A060606804F198060146306863 +:2046E00070B10069064649B18E4207D0B16AC90803D3436A0421002298477576314661608B +:20470000486821490078086002200FF0C7F8112002F040FE1D48007884F8245010B90E209A +:2047200002F038FE60684168886808B9C86810B1174811F041FE174907200026086016492B +:20474000174B0E60154D4E600A68A36245EA020008601A2012F0F2F8192012F0EFF870BDF4 +:20476000FBF776FC204600F1A001096811B909F005F870BDE03045F0020112F0F9F870BD17 +:2047800068F200208C010010D021084086870200510007060000046014100440024000400E +:2047A000790901002DE9F04781461E46924688460846ADF1180DFDF73FFB404610F04CF84F +:2047C000324807684FB103208DF8080041460822684611F0E3F96846B8472D4C607830F0E6 +:2047E000010047D1ADF80290CDF8048002208DF808000025ADF80050404612F051F82EBB9D +:2048000028B9484641460BF069FEAA281ED111F07BFDD8B9AB20294603AA0BF025FF4046E9 +:2048200005A92A4607F05CFA94F82700012807D19DF8140020B98DF80950684607F08AFECC +:2048400001208DF80900684607F084FE404612F027F878B1007968B105280BDABAF1010F53 +:2048600003D0012818BF022801D112F075F840460AF026FF4846002110F002FA484610F01C +:2048800077F810F091FE06B0BDE8F0872C090120E40401202DE970410546DFF8D880A87A86 +:2048A0000024ADF11C0D60B9E87A400909D230480078012804D1404615300078012800D044 +:2048C000C824002C4DD12888696805AA0FF0CEFBA87A00282DD14046E97A00784A0902D2DA +:2048E000C8081BD321E000BB23480078E8B900208DF81600214858C8694658C109C881E874 +:20490000090068686A460DF1160107F0E9F99DF8160018B19DF81000022806D0E87A00099C +:2049200038BFAD2406D3002408E0284607F015FA04461CB168680FF08FFF94B9104E30689F +:2049400090B1288869680822ADF800000DF1020011F024F928893168ADF80A006846884732 +:2049600002E0284604F09AF9204607B0BDE87081CFE80020E6040120FC09012054850200CA +:2049800024040120F8B5134602465468956808464FF0FF31203856D0401E5FD0401E33D09E +:2049A000401E3FD0401E26D0401E1DD0401E52D1D4F8C070002F5AD094F8FE70002F56D0C6 +:2049C0002968486A40F003004862D4F8CC002A6941686F69096847EA02008862296848683C +:2049E00040F00200486026E0D4F8C070002F3ED10020014605E0D4F8C070002F37D10120FD +:204A0000002184F8FE0032E01E78FF2E15D094F8FB000FF00DFA84F8FB6094F8FB00696B82 +:204A20000FF08EFE94F8FB00FF2804D00FF000FAFF2084F8FB00002119E010462321002204 +:204A4000FFF7A0FF12E094F8F90001280FD1012084F8FC00EFE76FF0010108E094F8FB0002 +:204A600000210FF0FBF9002084F8FC0001460846F8BD7047B0B504462079ADF1580D042812 +:204A800069D136480078002865D011F03DFC002861D1AB20002113AA0BF0E6FD276813A824 +:204AA000874207D0002F56D013A8394610F066FF002850D038460DF1550106AA07F010F998 +:204AC0009DF85500002846D09DF82800012842D14FF48170002110220BAB11F061FB0320F8 +:204AE00008210BAA0FAB8DF8540015A80AF09AF9002568460C228DF81450294607F06EF944 +:204B000041208DF80200ADF8005001278DF805701A238DF804306846FEF74CF89DF8140010 +:204B2000C8B90398456C0F272F702079687011F005F80146082213A811F030F813A9A81C8F +:204B400011F0DEFE0FA9102205F10A0011F026F868460CF08FFE16B0B0BDC046E5040120F5 +:204B60002DE9F04711F017FE354C374D84F82400287C84F82B004FF0020884F836800F2731 +:204B800084F8287084F8507084F85170002684F82C6084F82D604FF0050984F83090E87B65 +:204BA00084F82500A87B84F82600012084F82F0084F890004FF6FE7A84F831002148A4F848 +:204BC0003AA0007884F83200E87AA086287B84F83C60082284F83700687BA4F83EA03146E1 +:204BE00084F8380004F1400007F0F8F804F15D0005F14001A4F848A011F082FEA87C84F8B7 +:204C00008E0084F86560314684F88A70687C84F88B90424684F88D00E87C84F88C6004F10B +:204C2000920384F88F00892011F0BAFA08B1A4F8926030460EF0BCF9A4F89460BDE8F0875A +:204C400050010120521A0120E40401202DE9FF41384D95F83C00012101AA044610F0EAFCAB +:204C60000221204602AA10F0E5FC9DF80A4095F83D10EA78002605F130074FF0100C10E065 +:204C80008C4214BF6346BDF80830880000EBC100491CC019838391FBF2F303FB02F0091AE1 +:204CA000C9B295F83E00401C90FBF2F35343C01A8842E5D195F83D40A84635E0A00000EB5A +:204CC000C400C119898B10291AD03A180421022320461C320CF09EF86870E86861036A46E1 +:204CE000042311F053FD009800F0FF007C2802D0FE280BD1FEE7204678210EF057FD05E022 +:204D0000204602F04FF8761CF6B26870E97898F83E30641C94FBF1F04843241A581CE4B2C0 +:204D200090FBF1F24A43801AA042C7D130460090BDE8FF81C01900202DE9F84F904689463E +:204D400000274FF6FE7B824601223946CDF800B00CE0012F08BF012106D011F01CFDC1B227 +:204D600091FBF7F07843091A00273A462A482B4C1423057834F81C0F834517D0824515D0EC +:204D8000814513D0804511D0667C7EB1082E0DDA072E0AD0012A05D07F1CFFB2B94205DC5F +:204DA000BDE8F88F7F1CFFB200E000905B1EE1D135F0010524D11A4B332433F8240F8345DE +:204DC0001CD082451AD0814518D0804516D05E7AA6B1082E12DA1D79012D0FD0022D0DD0DD +:204DE000072E0AD0012A05D07F1CFFB2B94205DCBDE8F88F7F1CFFB200E00090641EDCD165 +:204E00000FB10029A5D00099584688421CBF081C80B2BDE8F88FC046E50401208004002022 +:204E2000081000202DE9F047ADF1900D11F082FD2D4A1178002952D1114601240C7011F0ED +:204E4000F9FEF9F70BFE092002F0A4FA20A811F093FA4FF0FF302190254A2448102120AB5D +:204E60000DF066F92348244990F800800B7800274046054683421BD3DFF880A08600A14664 +:204E80000DEB0600041FDAF80000315821F0FF0044F8040F880807D2E8B201F0010111F040 +:204EA00063FA09FA05F007436D1C361D9D42EAD91549134C4FEA8800C0EB830201F1D00362 +:204EC000121D1F600DEB0001001904F01FF80D49086820F4F85040F40050086001E011F017 +:204EE000A9FE24B0BDE8F087B00B0120901901207D0002004B8302004C830200E8860200E5 +:204F00000010084000300940002002402DE9F04F044694F802A0FF210E22ADF1240D0DF174 +:204F20000E0006F05BFF4FF0FE09E41C14F8010B8DF81090FF25089014F8010B8DF81150D6 +:204F400003288DF80C0005D0204611F069FBADF8040003E001A8214611F0D2FC083414F842 +:204F600001BB2778002F3BD07E00304605F028F85FEA000834D0611C324610F00FFE08989C +:204F8000CDF8008001A95A463B46F7F727FCC0B1017842798DF80E1047788DF81320468863 +:204FA0008DF80F7005798DF8106005AB8DF8125031128DF811105200811D184610F0EEFDC1 +:204FC0000BE08DF80E508DF80F508DF810908DF811508DF812508DF8135040460CF04AFD7C +:204FE000672051460E220DF10E030DF011FA09B0BDE8F08F2DE9F04F09AF8046ADF11C0DD5 +:205000009B460491386805923D7A0690194640460EF0A8FF0828A8BF4FF6FE7905DA2E4E5E +:20502000410001EBC00136F801904FEA251A680934BF0820102069110391A90924BF0830B4 +:20504000C0B28DF80100684610F006F8061C40D00124B47710F072FD706201A948460FF0B2 +:20506000D6FC30B95FEA5A0006D3C14504D1069800E001A874773062346902202070657056 +:2050800084F802B084F803804FEA28232371049A62711012A07148460BF0F0FB05994018BD +:2050A000E0715FEA5A0038BF002005D3069904F1080011F025FC08200399490804D3796882 +:2050C0000019083011F01CFCA6F802903046F5F7BFF807B0BDE8F08F7E0100202DE9F04756 +:2050E000DFF8D890D9F81000ADF1280D002859D0074600244FF0FF0A2F4EB87A20B1401ED5 +:20510000C0B20028B87247D111F0C6FA5FEA000811D006AD8DF81440B91C0822284610F0C7 +:205120003DFD05A808F0E4FD28B1BDF816003A8829460FF0E8F9B81C0DF126016A4606F05B +:20514000CFFD054609A9B81C0EF00AFAB8F1010F1FD19DF81000E0B102281AD0B81C0FF0EA +:205160007BFB9DF82600012813D168462146142206F034FEA80000EBC5008DF810A01422BB +:20518000345031184C606B464C72042029460EF07FF938460AF0F6FEFF68002FADD1D9F8CD +:2051A000100028B999F800004FF4006109F0BAFC0AB0BDE8F087C04604E9002068060120A2 +:2051C000F8B5364DAC680746B0B9002C64D0207850B1152110FB01F02346401CC521C2B28B +:2051E00045200DF015F9AC68002C55D0A8680CF041FC0020A8604FE044B9FA2004F0E0FE51 +:205200000446002CAC6047D00020207020783978152610FB0640401C00F8011B3988091224 +:2052200000F8011BB97800F8011B7988091200F8011B397900F8011B797900F8011BB979E7 +:2052400000F8011BF97900F8011B397A00F8011B797A00F8011BB97A00F8011BF97A00F834 +:20526000011B397B07F10D03082200F8011B194610F094FC2078401CC0B20A2820700BDD19 +:2052800010FB06F0C5212346401CC2B245200DF0BFF8A968002008700020F8BD8C0A0120A0 +:2052A0002DE9F04116468846044611F043FB074631488325B8F1090F36D8DFE808F0554A59 +:2052C0004744402917053C37044694F82400E8B9D4F89800D0B9316804F1E00010F0BEFC9B +:2052E000316804F58E7010F0B9FC3FE0044694F8240058B9D4F8980040B93168192011F00F +:2053000021FB31681A2011F01DFB2FE000252DE0306828B1012807D180200DF0E5FE25E04D +:20532000802010F02FFA21E003251FE0202031460FF094FC1AE031781048017016E031683B +:205340001030016012E03088A0850FE0308860830CE0012026696369607606F1600020613D +:2053600003F16000606101E030682060384611F061FC2846BDE8F08168F20020A8F4002089 +:205380002DE9F84307467D68BE6890460C4611F0D1FA814630682B78026B02F4807203B165 +:2053A0001AB1484611F046FC56E005F5B27011F0BBFA2C620024EC776C623168086B40F426 +:2053C00080700863484611F035FC05F2A91010F033F8414638460DF0DDFC05F2A919A86239 +:2053E000A8B9384641460AF0B7F8A878D0B9A96805F1C40010F04EFFE8B1AC621020E877A7 +:205400003146284606F0B2F805F2A91022E011F091FA3268916B41F02001916311F00AFCE6 +:20542000A87810B12046BDE8F883A96805F1C40010F030FF10B9686ABDE8F883384641464B +:205440000AF08AF81020AC623146E877284606F08DF848460FF0E0FF4FF0FF30BDE8F883D9 +:205460002DE9F0410546ADF1400D681D06A90EF025F96E1D01285ED168880DF12A0108F06B +:2054800011F9012857D10DF11A002C4C029020788DF8320011F0D2FB074611F06DF84FF47C +:2054A0007A787843B0FBF8F08DF8330011F0C6FB074611F061F87843B0FBF8F0000A8DF8AE +:2054C000340010F03BFB014602220DF1350010F065FB0DF11A000DF1320240230090002007 +:2054E0000146F7F759FB039603278DF8067001238DF812308DF811308DF81030002605962E +:205500006988ADF804109DF81A00207001A8F7F707FE8DF810600DF12A040394BDF8180081 +:20552000ADF8040001A8F7F7FBFD0DF11A001022314606F053FC10B0BDE8F081100A01201C +:205540002DE9F041344C20780D46290C1ED2E80B38BF00205ED30FF05DFB304C804604F1AB +:205560000C00006858B107463E69384611F03EFB38460CF07FFA371CF6D10020E06040460F +:2055800010F0D3FC85F48040BDE8F08109F032FD071C3DD03878233801281CD9001F34D148 +:2055A00008200FF0D3FC061C11D0012030707878C01C04F005FD6478706040B17A78791C4B +:2055C000D21C10F0EBFA204631460BF00BF938460FF0C2FD19E00C200FF0B8FC061C14D002 +:2055E00000210C2206F0FAFB0520307000247470B8783071F8787071F87804F0E1FCB06031 +:2056000018B17968FA7810F0C9FA38460FF0A4FD85F40040BDE8F08128180020380A0120FB +:205620002DE9F04FADF1140D04900DF048F95FEA000861D0002427463D46B94623E008EBF9 +:20564000C500401C834611F02BF9D0B10179012918BF022915D190F82000012811D10C204F +:2056600004F0AEFC061C0CD0594611F049F9C6F80890002C0CBF341CCAF808607F1CB24652 +:20568000FFB26D1CEDB298F80000A842D7DC002F2FD00220049E8DF80C007088ADF80400E0 +:2056A000F80004F08DFC061C21D074B14D46A14606EBC500494611F023F9A46848460CF0CB +:2056C000D9F96D1CEDB2002CF1D148F21F00009004983A4601A93346113002F07FF830469A +:2056E0000CF0C8F905E02046A4680CF0C3F9002CF9D140460CF0BEF905B0BDE8F08F70471F +:205700002DE9F04788461546814600212022ADF1200D684606F062FB4046103808D0083837 +:2057200004D0083814BF0026032602E0022600E00126012404FA05F7274D4FF0805000F58B +:20574000D87A2F60D0F8B001416927208847C5F87C430321C5F88013C5F8FC42C5F88413F0 +:205760006868B04218BF6E60B8F1180F45F8047C1CBF41464E4606D168464946182203F0FE +:20578000C5FB6E46202130460DF02CFC204611F08AF8D5F88C036FF39D000028F6D0D5F8BA +:2057A0008C636FF39D06C5F88463DAF80000016A27208847DAF8000001692720884716F0A6 +:2057C000404F04D12868074218BF002000D1204608B0BDE8F087C046044402402DE9FC47A1 +:2057E00007460E1C14BF4FF0000A4FF0E80A002F5BD0BAF1000F5AD17868401E78603F2130 +:205800000170BD6D002D0CBF802000207968DFF8A4900225083E491E7960A8460870388975 +:20582000A7F85450801C388116F8080FFF2839D02A2834D1706890B3D9F80010D1F8B81097 +:205840008969884705467868401B78607168CA0809D2D9F80020D2F8B820D46900233A4630 +:20586000A04788B113E0D9F8040080680078D9F800408DF80000D4F8B8007168C4697868E0 +:205880003A466B46A04710B9EB20BDE8FC873889B7F85440401938816019A7F85400B8F1C9 +:2058A0000108C1D17868386501E04FF0E80A5046BDE8FC87140100202DE9F8430446994651 +:2058C00090460E1C44BF0020011C5CD411F04CF805463146802220460CF030FE071C04D028 +:2058E00097F8331031F07F0106D1284611F062F902200021BDE8F8834FF0E0400A2107F1AF +:20590000200640EA090941EA080896E8030008EA000019EA010608BF00281CD0284611F023 +:2059200049F907F1200003C804F1B00604F1B00508EA000809EA010986E8000395E80C00FC +:2059400007F1200696E8030007F120059943904385E8030014E00D48B968884203D0B96844 +:20596000C4F8A810B86004F1A00080E80003284611F020F904F150004FF0FF3110F08AFCD9 +:20598000B03494E80300BDE8F883C046E1E80100F8B52F4C334D6788BFB905F1080000683F +:2059A000D0F8F4002B4BC18F012606FA01F08102A1EB801118784FF47A7201F5707148438C +:2059C000B0FBF2F081B2A18000E0A1882078B9421ADD21480068214F016C3868884721789D +:2059E000C0B28142B8BF20706088401C608010F0C3FD4FF47A71B1FBF0F0194904F108036B +:205A0000002204F023FBF8BDA968D1F8F46040B20EF0B8FD96F84410B2695054A868D0F851 +:205A2000F40090F84420012700EBE20002F0070207FA02F1427900238A434271AE6863804B +:205A4000D6F8940023700078042109F001FBF8BD740A0120D8000020D8050120B40601209A +:205A6000915901000C010020F8B50020314C8DF8000010F0D1FEA41EA2782F4D0121914025 +:205A80004FF6FF72521802402868D0F8B81062810878002829D08A6B3AB342F21A00694621 +:205AA0009047204867790678CEB1C7B99DF80060AEB12868D0F8B800C06D80B18047074674 +:205AC0001E48017857B16868406866890078083010FB01F0B7FBF0F17018608167799DF85B +:205AE0000010608907FB01006081607810B904F0C5FB01E008F004FB2868006C006878B10F +:205B000009480B49007840B90848007828B98322084602700FF0E6F9F8BD022208460270EA +:205B2000F8BDC046641B01206F1B0120711B0120741B01200618002014010020D800002097 +:205B400010B504462088ADF1180D0BF033FF002859D110F0D9FB002855D1A0782B4958BB8B +:205B6000207A04284FD1084600686A4605A906F0B7F804469DF81400002844D09DF81000B2 +:205B8000012840D102209DF813308DF8100033F07F0003D00DF113000EF0C0F80420214675 +:205BA00014226B460DF074FC002010F081FD01200146F1F7E1FC26E0207A042823D10846B8 +:205BC00000686A4605A906F08BF801469DF81400C8B19DF81000012815D1002201929DF81F +:205BE0001300009230F07F0003D101208DF81100FF228DF8102004206B4614220DF048FCB4 +:205C000003490220087006B010BDC046EC0601207006012070B5334D06462868D0F83C03E3 +:205C2000ADF1300D8047002818BFFC2057D168463146112203F06AF9B47C707CF37C8DF8C1 +:205C400012402A688DF81100717D8DF81330D2F8D400B47D90F853008DF815108DF8140027 +:205C6000002104B10121347E8DF8161096F825208DF81840F07D8DF8252096F824308DF881 +:205C80001700F48C8DF8243006F119010B220DF11900ADF8264003F039F9707C002448B9FE +:205CA000812004F08DF90A9078B1FF21812206F095F80CE09DF815000A9440B1810001EB2E +:205CC000401004F07DF90A9008B91A2406E02A6802F55172126807206946904720460CB0F6 +:205CE00070BDC046140100202DE9F04F09AF9B4692468946ADF1240DBC8897F800800790EE +:205D0000242004F05DF91026002800904ED00021242206F063F827484078002530F00100C4 +:205D20000FD1484610F08FFD40B10079012818BF032803D1E00938BF44F48064E00A28BF33 +:205D400001251D49009809884181ADF818A080F81FB002230373079A02620372A0F80090EB +:205D60008DF80C8080F80D80F968ADF80A4006C904AB83E80600387A29468DF81A00684660 +:205D8000F6F7F8FF01280ED10A48407830F0010007D1012D05D140460FF0B8FD08B106F027 +:205DA000EBFA002602E000980BF064FE304609B0BDE8F08FE40401209801012070B506467A +:205DC00000210C22ADF1380D06A806F007F80EF090FE30F07F000CBF002501250024072062 +:205DE00021460C2206AB09F023FE30B92DB1072021460C2206AB0DF04BFB641C052CEEDB52 +:205E000007A8FF21082205F0E9FF641EA4B207200C2206AB214609F00BFE30B92DB1214637 +:205E200007200C2206AB0DF033FB68460021182205F0D4FF822018216A4610F06FFC30B981 +:205E4000012E04D1822018216A4610F06DFC09A80021112205F0C2FF3A20112109AA10F050 +:205E60005DFC30B9012E04D13A20112109AA10F05BFC3B20112109AA10F050FC30B9012EA2 +:205E800004D13B20112109AA10F04EFC0EB070BDB0B5314C04F124010878ADF1780D742283 +:205EA0006B46401C08702120002110F079F994F8240074216A468DF80000212010F034FC9E +:205EC000264DE8780027032805DA0BF0A1FB012808BF042000D00D200FF0E4FE618F4FF600 +:205EE000FE70884208BF0127B4F84810401C88422DD06FBB1A49487830F0010008D008788E +:205F0000012805D04FF400500121F9F747FD06E001208DF874001DA952200BF04BFFE878BD +:205F200003280DDA0BF074FB012809D1002028710120F8F755F8E978491C0746E97007E079 +:205F4000012028710020F8F74BF80021F5E7012738461EB0B0BDC046500101206806012050 +:205F6000E40401202DE9F04781463148006888464FF47A711E46ADF1280DB1FBF0F080B232 +:205F800002FB00F50EF046FE8246414648460FF0E3F90824071C37D1142004F011F8071C6A +:205FA0003CD0684600212422234610F0FFFD012E1ABF0020059005950120ADF810001B48CB +:205FC000069729466A46002310F0ECFD03461948083882683B609BB187F80490C7F80880E4 +:205FE00000243E73002A3C6108BF876004D0164633691BB937613B68184609E01E46F7E7F3 +:2060000038460BF037FD09E0386810F0F3FD3868294610F0C3FD386810F0BCFD50460FF09D +:2060200084FF20460AB0BDE8F087C046E1FA0100A0880200400A01207FB500242E482D4DE2 +:206040002F4E04702D482C7031680470D1F800016C70C089D1F850126C61103080B2884709 +:20606000286120B93068D0F84C058047286900908DF804409DF8051004F0030221F00301A4 +:206080000A438DF805209DF8051064F383018DF805109DF8051064F307118DF8051031689E +:2060A000D1F80011C9896A461031ADF80610296913680B6052684A60E8612C6202F0E0F98A +:2060C0007068C168087838B93068D0F858242046014690477068C1680A4804700A4D2C7034 +:2060E000087828B93068D0F8582420460146904700907FBDB41801206F1B0120711B0120CE +:2061000014010020741B0120641B0120F0B50E460021ADF1140D0191029103911446049179 +:2061200003AB02AA04A9009101A9FDF779FE8325310824D2E0B1039F87B10499C6F3150203 +:2061400071B1019840F22B21028038460EF0B1F90298049906F086FE039826E0C6F315023C +:2061600040B1019800884FF6FF71814202D132E0C6F31502019802806280102029E0002882 +:2061800029D00399A9B10499C6F3150699B101984FF6FF720280084632462B210EF089F9F2 +:2061A0000298049907F0C8F8049815212180606012E0C6F3150670B102982B2132460EF07B +:2061C00078F9FF2807D001984FF6FF71018066601420208000E00325284605B0F0BD704758 +:2061E0002DE9F04188463049074648780025ADF1180D8DF8145020B9C879002808BF012009 +:206200004ED0002F14BFB8F1000F022048D0404605A96A4605F064FD06464FF6FF70B04240 +:206220001BD09DF8140060B19DF8100048B99DF81310052010223B4601F07F010DF028F9F4 +:206240002DE02C460520214610223B4609F0F0FB092804D0641C282CF4DBB22020E002A878 +:20626000414608220FF09AFC44F08004284601953146009014228DF810006B468DF81340C1 +:2062800004200DF005F90948B70007EBC60429460C222418204605F0A1FD012060722846E8 +:2062A00006B0BDE8F081C046E404012004E90020F8B507462F48314B067814460A460021C0 +:2062C0003846803851D0C01F3CD0DFF8ACC0001F23D00D3843D0001F44D0401E0CD0401E04 +:2062E0003AD0812F45DBD82F43DC184636383F1817F85D0C014633E036F0010639D16046CC +:2063000064224FF6FE73083030F8085BAB421CBF491CC9B2521EF7D122E036F0010628D176 +:20632000604664234FF6FE7530F8086FB54203D08A4204D0491CC9B25B1EF5D1F8BD082271 +:20634000014605E010460DF0C5FF011C11D01C2220460FF023FCF8BD184600F1140319788E +:206360002170F8BD0EF052FDC4E71846123000882080F8BDE5040120C406002086010120C6 +:206380002DE9F8439146884607460BF013FB002818BF002058D1384600210AF0EFFD494655 +:2063A00006F01CFB0025041C19D138460EF044FF10F049FA002846D041794A0843D38908AE +:2063C0004FF0010606D340463946324608F0FAF880B938E0417941F0020141710AE0607983 +:2063E000032806D001282ED1608807210BF0FEF948BB02261CB1A07910F0180F19D14046CA +:2064000029460AF0BBFD11493A31098881420AD040463946324608F0D5F8A0B938464946C0 +:206420000EF02EFC0EE0384649460822FBF7E2FF08E0608839462A464FF6FE7300904046B1 +:2064400009F094FE01252846BDE8F883500101202DE9F043804600210822ADF1240D06A8B4 +:2064600005F0BCFC0021142201A805F0B7FC0025FF274FF001092E46274C8DF8147004201F +:206480002946142201AB09F0D3FA002837D1B8F1000F27D101A8009029463246142304208A +:2064A0000CF0B4F903A806A908220EF045FE58B90199A80000EBC500231883F809900B31E0 +:2064C00001912150029A5A6004202946142201AB0CF0DEFF01A83146142205F07FFC8DF8CA +:2064E00014700CE004202946142201AB0CF0D0FFA80000EBC50026502018466046726D1CFF +:20650000C82DBCDBB8F1000F02D030460DF006FC09B0BDE8F083C04604E900202DE9F04FB7 +:206520000546287B0E46ADF1240D80460CF0E4FF071C30D06C694EB3414608220DF0F6FE0A +:20654000031C27D03CB3A07893F800B0B3F802A097F80A9008900FF067FF5FEA000819D036 +:2065600008200EF0F3FC011C14D0FE2008704E70089B8B7081F8039081F804B0A1F806A09B +:20658000D8F8040000780AF02DF903E0414604220DF0CCFE0CB9002023E0A088ADF80A0079 +:2065A000E088ADF80C00207A8DF81800F8680590607B2E688DF81900306A4178007800EBD1 +:2065C0000120801110F0030F00F0030208BF0422237801A803F0400103F020030097F4F705 +:2065E000D1FB09B0BDE8F08F2DE9FE4FDFF8C08098F8410200284FD0002501212C4698F815 +:20660000412201FA04F0104203D1641C032CF6D342E098F841221020A040104218BF0D1C13 +:2066200010F088F998F841221121A1408A4388F8412210F0FFFAE0B20FF04EFD60B3877A3A +:2066400057B390F9099019490768012D446851F82960019710D0017A02290DD100F1100193 +:2066600091E8000C00274FF0805317EA0B0703EA0A0108BF002901D105F078FA012D04D026 +:20668000009600224FF0006303E000224FF00073009201984946A04798F8410220B108F5A7 +:2066A0008E70002110F064F9BDE8FE8F9430044068F200202F4870B534380468B4F1FF3F53 +:2066C00008BF00240EF08CFF04283CD10AF0B2FE142838DB28481C4E002510380560306CCC +:2066E000806C80471948006820B1194800682046FDF720FA174818490560184C0A686FF3B3 +:206700005B4244EA0200086015490868C0F30130012806D10A681348104040F400320A60A5 +:206720000860114D0124EC613068016A142088470E49086840F4E02008600D492C60086866 +:206740000028FCD170BDFEE7B001001080012843800520438C2108404820034000003901C3 +:2067600028000940EFFFFCFC00002443002009400C00684250130050940460422DE9FC41FC +:206780000646022568468DF801500EF065FC071C52D03869042260240270411C0C700124A3 +:2067A000BC76BC770FF0CAF978622449F87E7E8038B908462F3890F82420531C80F824304A +:2067C000FA76387E012806D10846007818B9387808B90020387638460DF10601F8F774FDDA +:2067E0005FEA000825D0242003F0EAFB061C1DD00021242205F0F2FA502001A90EF040F890 +:20680000BDF80400708135739DF8063035727888F3773080F481787DC6F82080084970739E +:20682000304602F011F830460BF024F940460BF021F938460BF01EF9BDE8FC817F0101206B +:20684000452C02002DE9F0410FF0C6FE4FF08058D8F8E801406880470FF0F4FE054605F04B +:206860000C000C283FD0E80822D20DF0B7FD234F3C680646012001460EF03BFE39687143DE +:20688000884215D21E4DF020B0FBF4F0311A284610F084F9284610F07DF900BF00BF012084 +:2068A000F7F742F900BF00BF284610F0A3F920E000BF00BF280918D208F5EC7420688068C1 +:2068C0000146104888470428F8D0690903D2002818BF002000D101200CF09EFB0A480121F5 +:2068E0000160006803E000BF00BF10F011F800BF00BF0FF077FEBDE8F081C046A08802002D +:206900005C180020004003402C2009402DE9F04389462F4907464878ADF1140D20B9C87955 +:20692000002808BF012050D0002F40D0B9F1000F3DD010224FF6FF7141F2210001F00106EF +:206940004B0824BF414089B2491016B141F4004189B2521EF2D17E1E10254FF6FF748046F2 +:2069600016F8010F08210EF0D7FC8446802004F40043610010EA0C0F8CB21CBF83F4004311 +:206980009BB213B188EA04018CB24010EFD16D1EE6D1204610210EF0BFFC4FF6FF71484052 +:2069A00084B207F110000FF03BFEA04201D002200BE001A800903A46902300200146F6F7E1 +:2069C000EBF801A84946FFF70BFC05B0BDE8F083E40401202DE9F84315468146287A9846D6 +:2069E0000E46012803D010460CF093FA00E028884FF6FE71814226D0264B00274FF00E0C7A +:206A000001E07F1CFFB2F7B917FB0CF1CC18595C8945F6D1297A012905D16278012A02D1E1 +:206A2000628882420AD00129EBD061780029E8D161888142E5D121798845E2D131462046D5 +:206A40000EF042F910B9B420BDE8F88365792746002D11D007F106010ED0201D30F8022F74 +:206A6000964205D17A79521ED3B27B7113B903E021F8022B6D1EF1D10FB1787930B96588CB +:206A800038460FF0F4FE28460AF074F80020BDE8F883C04622010020F8B5071C0C4604D034 +:206AA000387A022803D0032801D0E820F8BD384603F02AFCFF2818BF1E2046D1387A054687 +:206AC0000FF05CF901210246002001FA00F31A4202D0401C0528F8DB052804D1022D14BF5C +:206AE000032D1A2031D0022D07D01A4A7B68083202EBC00253603B4610E03A8826128DF852 +:206B00000020154D8DF802406B468DF8036012128DF8012005F1080202EB80021B680B4D7F +:206B20000B4C13603B7A022B19BF2A1C1268221C126801FA00F6022B42EA060214BF2A60AA +:206B400022603A7A0BF0D6F90020F8BD08180120041A012004180120001A0120F0B5054678 +:206B60002E4C6878ADF1140DF32850D0DF284ED0E8284CD0DB284AD02068D0F8FC11284688 +:206B80008847071C42D1687C00283FD095F8340000283BD12268B83210680078002835D14E +:206BA000D2F87C2105F1120109209047061C2DD02068D0F8302405F10B01E720904720683A +:206BC000D0F8302405F10801502090472068D0F8302405F10A01E12090474FF6FF720220FE +:206BE0002368ADF80420A97A8DF80C00D3F8C07100912B89304601A9B8470746F32F05D0E9 +:206C0000DF2F03D0E82F18BFDB2F05D16F702068D0F804122846884705B0F0BD14010020AC +:206C20002DE9F0412E4C2068E03081680D68002D54D001686A680968914206DAD0F86C04B5 +:206C400080472068D0F8E80005685DB10CF0D2FB6968884206D2083CA068D0F8D4048047CB +:206C6000BDE8F0812168D1F8E80000680AE02068D0F80015404688473846A8472168D1F8F9 +:206C8000E800006850B34668002E0BD5D1F84C05804721682068D1F8E810D0F8E800096811 +:206CA00000684E68077B856880460CF0A3FBB042DDD22168E0318868006840B1096840684A +:206CC0000968814203DD0BF055F9BDE8F0810FF079F82168D1F8E81000200860BDE8F081E9 +:206CE000140100202DE9F041244D0646287886423AD000283ED1224F3868D0F838038047D7 +:206D0000002837D00FF016FE1E4C8046207818B13868D0F84C0580471B48007818B13868DC +:206D2000D0F84C0580471948007800BB18480078E8B918480078D0B917480078B8B917485E +:206D40000078A0B91648007888B90CF01FFB267040460FF06FFF012E05D0022E03D0386805 +:206D6000D0F84C0580472E700020BDE8F08140460FF060FFE220BDE8F081C0466E1B0120B3 +:206D800014010020B50B0120B41801206F1B0120711B0120741B01206A1B0120701B012096 +:206DA000721B01202DE9FC412D4C05466069002710B1804700284CD0002F4AD1E068226A34 +:206DC00069030FF0D9FC002841D40C2004F1300815FB00F026184044173001783036FE29CE +:206DE000AEBF0121491CC9B20170009840F0FF0061F31F2019496A460423014300912846DD +:206E000039460AF007F8607038B9A800FF2100EBC50040448175032444762846FF214FF099 +:206E2000FF323B460DF0C8FC2846FF214FF0FF3201230DF0C1FC2846FF214FF0FF320223E0 +:206E40000DF0BAFC1020B083FF24347602E0012700E00B273846BDE8FC81C04600000F96E8 +:206E6000C01900202DE9B04304460FF063FD28498146621892F84A01401EC7B2002F82F860 +:206E80004A713ED1264800EB84000478408834F07F07804614D1E0090BD21E480068806935 +:206EA000014640468847404608F046FF0228FAD121E001EB8801D1F86011002088471AE0E5 +:206EC0004FF08055D5F8B801006A014640468847D5F8B801806A014640468847D5F8B80180 +:206EE000006B01464046884701210B4A0B48116001688908FCD304F03F00152801DAFFF746 +:206F0000B1FF48460FF096FE0020BDE8B083C04650180020B8010010282008602820084011 +:206F2000408102002DE9F84305462C684FF0FF36E6620FF0FFFCDFF89CC094F830E0814612 +:206F4000BEF1040F09D16246177837B1224903204860086820F003000860204A204F6369B0 +:206F60001168002090469F4204D019B96246177807B10120BEF1040F4FF0000703D111B16D +:206F8000624613780BB9384301D00DF02DF894F8320028B148460FF04DFE3046BDE8F88387 +:206FA00094F83000042804D0404621460DF042FD03E0404621460DF050FD012084F8320003 +:206FC00048460FF037FE02F021F9284609F046F9BDE8F883AD0B01200C8002400C0B01203E +:206FE00080A9030038B52B4C2068D0F8AC00007808B909F0FBF900F053FD2068D0F8B80097 +:20700000007820B1244808300168012088472348007810B91D48007818B12068D0F84C0537 +:2070200080470FF087FC1E490A78022A1FD10122174D0A706A78022A03D0032A18BF062AEC +:2070400001D183220A700FF0F5FD697831F0010018BF042902D1FEF707FD6978022903D09C +:20706000032918BF062904D10DF03CFF01E00FF0E1FD2168B8310A68107828B1506918B14C +:20708000D1F870121020884738BDC046711B01200418002014010020D80501206F1B0120E4 +:2070A000741B0120034630B50020ADF1140D019002460292039298685C7E42800188049256 +:2070C000A1F60201C9B141F21E05491B15D041F6E675491B012920D8417E012C62F3820121 +:2070E000417606D0018B21F47C7141F43471018313E0018B62F30911F9E7417C012C62F30A +:207100008201417405D0018A21F47C7141F4347102E0018A62F3091101825A7604A902AA73 +:2071200003AB009101A9FCF77BFE50B1019800884FF6FF71814204D10298049906F0FCF86A +:2071400003E00298049905F08DFE04481830016809B10298884705B030BDC04668F2002053 +:207160002DE9F0410646B469ADF1180D20460EF0A2F9DFF8A08038B10EF0E0FC0146204636 +:207180000EF0FCFB012805D141460F78002F3DD0002002E041460F782046022F029004D1A3 +:2071A0001D49B28B0988914230D1377B002F2DD1257AE90939BF0024211C012100248DF833 +:2071C0000C1035F07F050CBF271C01278DF80D708DF80E402FB920B94FF400500121F8F77A +:2071E000DDFB02A800F046FA8DF81000B11C48F23402012304A8009006F1110001940AF014 +:2072000029FA1DB9029808B90FF04DF806B0BDE8F081C046E50401208E010120F0B52C4E2B +:20722000054630680127ADF13C0D0DA9D0F830248DF83470522090470024342268466C750F +:20724000214685F8204004F0C9FD28680090A888ADF80400A8798DF80600287A8DF809005B +:20726000687A8DF80A00A87A214600B13946E87A8DF80B10214600B13946287B8DF80C1007 +:20728000214600B139468DF808400F208DF80740104B8DF8240043F6FF778DF80D101878AA +:2072A000ADF8267001280BD13068D0F83024291D502090473068D0F83024A91DE1209047FB +:2072C0003068D0F828126846884720460FB0F0BD14010020E5040120F8B52D4C064620688C +:2072E000D0F828240D4669464F2090472168D1F8D40090F85300D1F818148847234F0428CF +:207300002DD02168D1F8D40090F85300D1F818148847C0B9397806F10800400080B235B12A +:207320004FF47A7292FBF1F28018163080B29DF80030676801229A407B681B78521E0833EC +:2073400012FB030018E03978F000603080B2A5B14FF47A7292FBF1F2801898300CE03978D0 +:20736000700100F5867080B23DB14FF47A7292FBF1F2801800F5F67080B2122E8CBF2822F8 +:207380000C22801880B241438800F8BDD800002014010020F8B506460FF0CCFA264D074689 +:2073A000711991F84A01421C002881F84A213DD1224C04EB8604267806F03F00152801DA25 +:2073C000FFF7E8FF648836F07F0014D1F0090BD21B4800684069014620468847204609F035 +:2073E0008FF90128FAD121E005EB8405D5F86011012088471AE04FF08055D5F8B801C069AC +:20740000014620468847D5F8B801406A014620468847D5F8B801C06A0146204688470121F6 +:20742000084A0948116001688908FCD338460FF001FC0020F8BDC0465018002040810200CF +:20744000B80100102820086028200840FEB54FF0805684684568D6F8D0112068C96888478B +:20746000216822488A6B1040886340F2F2712068204B41641E4994F8210094F82020085C78 +:207480009A5C21681043486368460FF045FA1C4FDFF868E0D6F8D0112B7FDFF85CC06A7FC4 +:2074A000A87F496857F823705EF82260AA695CF820300D46206801993E433343A84721689F +:2074C000C86A40F01000C8622168086B40F001000863A07D0027FF2802D0E07DFF2800D1E6 +:2074E0001FB1086B40F440400863FEBD0DF8FFFF628802006E8802005886020044880200DA +:20750000088702002DE9FE4F0D4601900BF011FA174600284CD1019841688668254B002F1C +:207520004A6834682448318C1A602C4401603ED04FF6FF7980464FF0D80B4FF0200A0198D4 +:2075400008F0F2F938BB01980BF0B8FE18BBB94507D219EA040F04BF8DF800B04FF480355B +:2075600002D0B5688DF800A0210C8DF80110200A8DF80200B8F8001001988DF803400EF064 +:207580005CFE6846042108F009FF40B1B8F8001001980EF05BFE4FF0FF30BDE8FE8FB8F8CD +:2075A000001001980EF052FE64197F1BC7D10020BDE8FE8F0C1B0120101B01202A48016864 +:2075C000D1F8B020D1F888031060D1F89C03D1F8B0205060D1F8A003D1F8B0209060D1F8DF +:2075E0008002D1F8B020D060D1F8A403D1F8B0201061D1F87C02D1F8B0205061D1F88402E6 +:20760000D1F8B0209061D1F8B0200020D061D1F8B030D1F88C231A62D1F8B020134B5062B0 +:20762000D1F8B0209362124BD1F8B020D362D1F84824D1F8B4301A60D1F8A823D1F8B430F4 +:207640005A60D1F8AC23D1F8B4309A60D1F8B423D1F8B430DA60D1F8B023D1F8B4301A61E6 +:20766000D1F8AC100870704714010020EF680200B56902002DE9F04104460125ADF1200D26 +:20768000607926688DF8080020798DF80B50002E8DF80A0034D0234890F8008030460DF0D6 +:2076A0000AFF68B338F001004FF0000736D130460DF11A010BF054FFBDF81A004FF6FE71D0 +:2076C000814208BFC827A07930B92FB9BDF81A1020688DF809501AE08DF81650BDF81A004E +:2076E0008DF818706679ADF80C0021688DF817600DF10E000FF004F903A809F057F90DE07F +:2077000000208DF809000EF019FA4FF6FD7101906846ADF8001002F0D3F90746384608B0C2 +:20772000BDE8F081E5040120F8B50746012F14BF01200320254C012104F1090260728520DE +:207740000EF0F2FF41F288300DF0E6F9224E204D717831F001000AD128784FF4807107F0E5 +:20776000E1F928784FF4807106F0C8FE7178022904D14FF400500121F8F710F9012F04D005 +:2077800041F288300DF068FDF8BD022603202670012705F15D01607004F1140067710FF0DA +:2077A000AFF885F84A600BF0E9FB0A4C002704212078677007F0B6F92078042106F09EFE16 +:2077C000384684F82F70F6F7D1FCF8BDC40301205001012068060120E40401202DE9FE4F4C +:2077E000294E00900CAF0191301D097A3F8800689A4690460F2903D1019A4FF6FC71118096 +:2078000048F21F01B9421CBF4FF0000B012504D14FF0000B022500F801BB814689F8008006 +:2078200071785C46401C0AEBC1010FF069F871780835EDB2491CC9B2884505D1641C89F801 +:20784000004086F801B017E0641C71700A2CEADB0A24884589F800400EDD1F2F01D10DF0A2 +:207860000BFD48F21F00B84206D1084800784FF4804122460FF020F8009801993A462B4668 +:2078800006F00AFCBDE8FE8F28040120CB030120BCB5054669680C462078401F4AD0801EF0 +:2078A0002CD0801E42D0401F02D0801E3AD0BCBD481C01A90BF002FF093401283DD15020DC +:2078C00000238DF800002F7A8DF80230A7F109008DF8010068460AF069FC071C2DD0BDF897 +:2078E0000400788020783A7D87F83800386921460EF054F93846F2F7ABFCBCBD6D890C208A +:207900000DF024FB071C18D006203870611C08227D80381D0EF042F908480078394608F001 +:2079200061FFBCBD28460DF05FF8BCBD28460CF053FEBCBD2846FCF755FDBCBDCB030120E4 +:20794000B0B5002405462022ADF1200D21462C72684604F043FA0B22684629460EF01EF903 +:20796000E87A0A228DF80B00287B8DF80D4005F10E018DF80C000DF10E000EF00FF9AF7E9F +:2079800006220DF11A00214604F028FA780824BF01208DF81A00B80824BF01208DF81B00A3 +:2079A000F80824BF01208DF81C00380924BF01208DF81D00F80924BF01208DF81E0037F06C +:2079C0007F001CBF01208DF81F00288B074FADF8180038688DF80D40D0F8F4128DF80C40B1 +:2079E00068468847204608B0B0BDC04614010020B0B50546294C297D012905D0152903D069 +:207A0000252918BF35291FD1287E00091CD22268D432106890F8820080B168781B280DD112 +:207A20006068816A012088472068D0F82C134FF480608847002022686870D432D2F85C2252 +:207A4000697828469047B0BD287EC2091ED2012918BF152901D100090ED26F781B2F09D02E +:207A60001FB920683430026802E0206834304268895C04E0232100E031212068343029709C +:207A8000006E0078294608F0ADFEB0BD2068006D016809B168788847B0BDC0461401002012 +:207AA000FEB50EF047FF244CA16962698A4240D0224A1778002F3CD1214A177837F07F07D0 +:207AC00037D1204A1778002F33D161610FF0B2F860691D4E01907068416D20698847019FC4 +:207AE0001A4D0090F90FB1EBD07F16D02868D0F8D40090F8830001280FD00BF047FC706861 +:207B0000826D206939469047832803D02868D0F84C0580470EF026F9FEBD7068826D206981 +:207B200039469047832806D02868D0F84C058047FEBD0FF07FF8FEBDA4060120711B01209A +:207B4000741B01206A1B0120D405012014010020F0B5294C06462078ADF11C0D032848D197 +:207B600000256846182225700823657029460EF0E7FD684629460CF089F820613A2229462C +:207B800004F1300004F02AF904F13C00FF210A2204F024F90CF0BAF93146284609F082F913 +:207BA00004F11801E0600EF0ECFD226AE169B1FBF2F0C0B284F830000428A4BF032084F8E0 +:207BC0003000E070B2F5005F04D1E768B1EB403F00D317B9012020700CE084F83550FF2080 +:207BE00084F833004FF40050E086EEF7E3FC607800E0607007B0F0BDC019002003B42DE967 +:207C0000F04F09AFD7F808A0BC69D7F814903D8ABE894FF6FF709846ADF12C0DBAF1000F2D +:207C2000208009D0B8F1000F06D0B9F1000F03D016B1B5F5005F01DD04202DE019463846F5 +:207C400001AA04F07DF9174F034607F110000068002B18BFD8B21FD102F09CFBCDF818907E +:207C6000ADF81C60ADF81E508346CDF820A006A8009097F83300F98EADF8248001AA1223D2 +:207C8000F8F73CF9C6B216B9BDF8080020803869594605F073F830460BB0BDE8F04F02B0B5 +:207CA0007047C046C0190020F0B5294E05463068D0F8FC11ADF1140D28468847041C3FD10E +:207CC0003068D0F82C1128468847041C38D1687C002835D095F8340090BB3268B832106888 +:207CE000007868BBD2F87C2105F1120109209047071C25D03068D0F8302405F10B01E720A4 +:207D000090473068D0F8302405F10801502090473068D0F8302405F10A01E12090474FF6C0 +:207D2000FF7202203368ADF80420A97A8DF80C00D3F8C04100912B89384601A9A04705E093 +:207D400030686C70D0F844112846884705B0F0BD140100207CB50646284D96F830000328E3 +:207D60003FD196F83A0003283BD12C68D434216806F12800082216310DF024F878BBD4F827 +:207D80005C2306F128014A20904774682B6861782078D3F8302400EB0120ADF800006946A4 +:207DA00050209047A41C2B6861782078D3F8302400EB0120ADF8000069464B209047E41CF7 +:207DC0002B6861782078D3F8302400EB0120ADF800006946532090472C68002003E0EA2035 +:207DE00002E02C68E820D434216A48702A253570D4F86C12304688477CBDC04614010020C3 +:207E000098B5284B284A5C78022C3FD11F78002F3CD1D36E440806D302F14C0421609C4243 +:207E200004BF0023D366040906D302F1500421609C4204BF0023D366440906D302F1540407 +:207E400021609C4204BF0023D366840906D302F1580421609C4204BF0023D366840806D30C +:207E600002F1640421609C4204BF0023D366C40806D302F1680421609C4204BF0023D366A7 +:207E8000440B24BF4FF47A74146600E0D36EC00B06D302F15C000160984204BF0020D0669D +:207EA00098BDC046E4040120E40201202DE9F8430446207D1D46904689463830C0B20DF040 +:207EC00045F808AF061C40D00120307021461C2206F11C000DF062FEB01C49460A220DF022 +:207EE0005DFEA6F80C802878307495F90200B0746878002370743879F362F074B8687061C3 +:207F0000387830766089F081387B7076207D40B106F13800F0622169227D06F138000DF0B4 +:207F20003DFE0B48727F816A407812F0030F09D021B930460DF010F9BDE8F8833046884777 +:207F4000BDE8F883314608F04DFCBDE8F883C046E0060120B0B58478C01C0546083010F854 +:207F6000011B0278ADF1200D284606F06BFE01228DF8180006AB214665200AF049FA1E48D3 +:207F8000007830F0010034D128460EF089FC071C2FD0387901282CD10EF012FB8DF80000C9 +:207FA0008DF807005FFA90F18DF8011000248DF802408DF8034080228DF804208DF80540FD +:207FC0008DF806408DF808108DF809400DF10A0029460EF095FC397800F8011B39881522A8 +:207FE0006B46091200F8011BFF21047045200AF00FFA08B0B0BDC046E5040120F8B5284E4D +:20800000346810346568287EFF2840D0D4F8C47097F88310022927D0AB7E7BB102280DD135 +:20802000D4F8F404804771682C6949683A7909780546083112FB01F1084612E0D4F8F404DB +:2080400080476D69E76AD4F8C43022682D1A93F82C10388977682D1A32F81140D7F8B400F5 +:2080600080472D1B2D1A10E0D4F8F40480476969D4F8C460E76A2568081A96F82C203989D1 +:20808000401A35F81210A0EB0115002D01D50020F8BD4FF6FF70A842C8BFA8B2F8BDC04684 +:2080A0001401002070B5284C2068D0F8D4104D7B4069002141772068C16891F83000401CAE +:2080C00081F8300020680C30016891F83010042931D06068C16B202088472368D3F8D41096 +:2080E00091F84F600F2E0CD058694A7B807F824207DD4873D3F81415884723683546D3F8B3 +:20810000D4101A69D86832F8154090F830200126550006FA05F24E7B4FF47075624305FA59 +:2081200006F18C08944238BF221CA1EB4201D3F8F024904770BDD0F8580180472068D0F8BF +:208140006C01804770BDC04614010020D0B50446607D164601220BF055FE071C44D0002EA5 +:2081600042D1E07D97F8351081423DD197F839103B7A0A18934211DD207EFF2811D1FF20B2 +:20818000884087F8360087F8370097F83500401887F83500002687F8386007E0207EFF28F3 +:2081A00018D087F83700207E87F836000EF046FD04460EF0E1F997F83A600C4B4FF47A71BD +:2081C0006043B0FBF1F03880012118787E8006F03FFFD0BDB87E97F82A10FA8B33460AF050 +:2081E00051FC38460BF052FAD0BDC046800A01202DE9FF4101464C682078801F1AD0801E1F +:2082000002D0C01F33D040E065784E89022D08BFA41C0E200CF09AFE071C36D00720387066 +:208220007E80022D3D711CD1781D214608220DF0B5FC16E0A07A657AB1F80A80E67A05EB30 +:20824000002510200CF082FE071C1ED005203870611C0822A7F80280381DBD810DF09EFC7D +:20826000BE730B480078394608F0BCFA0DE04889ADF8000060788DF80200A71C019704F1C3 +:208280000A0602966846FAF765FA0090BDE8FF81CB0301202DE9F047254EDFF898900025B0 +:2082A00001244FF0020A4FF01108E8B20DF014FF071C38D0B87A012835D197F909001130E6 +:2082C00004FA00F0C14346F8041C31680843306097F9090004FA00F0C0B20DF053FA07F19F +:2082E000100000210BF028FE0146812909D1B86918B100210BF020FE0146812908BF87F806 +:208300000AA081290FD0A9F1040097F9091090F8412208FA01F1114380F84112002100F5CF +:208320008E700EF025FB6D1C032DBED3BDE8F0870C1004406CF200202648B0B5006880889A +:20834000ADF1200D0EF07FFA071C41D0224C04F126000078012806D1787900F0EF007871ED +:2083600040F00800787100258DF80C507888ADF8180003A807F05AFE04AB38880193ADF877 +:2083800000000EF01DF9ADF80800787900EA5001890928BF01258DF80A508DF80B0060780A +:2083A00030B10DF0B1FF18B9684601F095FE02E0684602F057FA20B9787900F0FB007871BB +:2083C00006E004AC20460CF047FA204607F078F908B0B0BDD4030120E40401202DE9F84F13 +:2083E00004460AAF207DD4F810A03D689946934688463030C0B20CF0A9FD061C3ED01A2058 +:208400003070A0887080E0885946B080B01D0CF073FFE078F07398F800003075207B7075C2 +:208420002878B0756878F07595F902003076387A7076F868F061387986F82000608BB08544 +:2084400060897082A6F81090207DB084387C86F82E00B08C002804BF0020B06208D006F1AA +:208460003000B062B28C514606F130000DF096FBD8F804000078314608F0B4F9BDE8F88F9C +:2084800025482649EE381831C0F8CC1024491E39C0F8D01090F8CB1041F0010180F8CB10B8 +:2084A00090F8CB20012161F3410280F8CB2090F8CB2061F3820280F8CB2090F8CB2022F0FA +:2084C000080280F8CB2090F8CB2061F3041280F8CB2090F8CB30002262F3451380F8CB302A +:2084E00090F8CB2061F3861280F8CB2090F8CB2061F3C712052180F8DA1080F8DB100449E2 +:20850000C0F8DC100349C0F8E01080F8CB20704704180120001A012046010120B8180120D8 +:208520001A0601202DE9F84F0AAF3C7BBD683E79994690468A468346002C0EBF02200420C4 +:2085400000EB46008DF8010068460CF085FD031C37D0A3F802B083F81A90A3F804A03878B1 +:20856000D876987F01280BD10EF02AF89988884206D0B8F1000F06BF00209877C3F82480A5 +:208580001969052001F8010BBCB1701C01F8010B66B13046891E2A7801F8022F35F8022BD7 +:2085A000401E4FEA22224A70F5D1891C0EF008F801F8010B0EF004F806120E701846F1F7E2 +:2085C00047FEBDE8F88F7047B0B58478ADF1280DC01C01A90DF0FCF98DF8060068BB1820E1 +:2085E00001F0EEFC071C2ED00097BDF804100620002218230AF00AF9B0B90DF107003946B2 +:2086000010220DF0CBFABDF80400164D830003EBC003E9580DF117000DF0B4FA5B195968E0 +:208620000DF11B000DF0AEFA38460021182203F0D5FB384609F01EFA05E00DF10700FF2147 +:20864000182203F0CBFB6720214619220DF1060309F0DEFE0DF106000021192203F0BEFB16 +:208660000AB0B0BDE0E80020DFF898C0F8B50B1C04464FF000050FD0DCF898702E466FB10B +:20868000F868007B00F00F00022803D03F68002FF6D103E03E4601E0DCF898606EB302B17E +:2086A0001660F168087B012500F00F00022824D1012B14D0098840F60300884205D0401C4F +:2086C00088421CBF3069016901D130694169408B9CF842321922091813FB021103E0316910 +:2086E000888DC9680918706B0CF08EF820600DF043FF2168B1FBF0F000E0002020602846F4 +:20870000F8BDC04668F200202DE9F84F0E46074630684FEA9009224848452CBF002503258D +:208720000EF008F900901F48D0F8BC1000F1B80AB94214BF00240124A10081F004015AF87C +:208740000180834627B107F1B8000DF0F5FDC8B9B8F1000F04D008F1B8000DF0EDFD88B972 +:208760003168A00000EBC40050448160317A01740DF002FFB9FBF0F107F1B8000DF0E0FB61 +:20878000832507E09BF8DC0040F002008BF8DC00CBF8D87000980EF04DFA2846BDE8F88FC8 +:2087A00040420F0068F20020D0B504461120ADF1180D01F005FC071C3FD03B200021112218 +:2087C0003B460DF0EDFC80BB387884422DD1112001F0F6FB061C28D03A200021112233462F +:2087E0000DF0DEFCC8B93A2011213A460DF09CFF13490120087013484468B4F1004F84BF4A +:20880000002444601122394668460DF0C7F9822018216A4605940DF087FF30460021112202 +:2088200003F0DCFA304609F025F938460021112203F0D4FA384609F01DF906B0D0BDC04679 +:20884000B5010120100A012030B50C4605463C220021ADF13C0D684603F0C0FA0A226846E9 +:2088600029460DF09BF96889ADF80A00287B8DF80C00687BE9898DF80D000DF10E000BF036 +:208880006CFE287C8DF81600687C8DF81700A87C8DF83700E87C8DF83800E87FADF828007A +:2088A00001F08EFB099070B1296AEA7F0DF076F94CB19DF828000999A04720B1099809F06E +:2088C000D9F81A200BE007480068D0F88812684688470446099808B109F0CCF820460FB086 +:2088E00030BDC04614010020F0B520480127F84201D008F065F9204D204F214EBD4206D298 +:2089000003CD0478A4003459401CA047F6E71D48002800D08047164D164FBD4202D210CD1E +:20892000A047FAE7F0BD03251BE0416808300A1C2A400BD11A1C2A40AB4305D0046804304F +:208940000C600431043BF9D1131C05D0047801300C700131013BF9D1021C2A4001D0A843C4 +:2089600004300368002BE0D17047C046FFFFFFFF0000000000000000A08D0200088E0200FC +:20898000408D020075F402102DE9F041204D6868416EADF1280D02A888476868C06B80474C +:2089A0001C4CA060217B21F00F0141F002012173029000260596668001208DF80C000DF0E2 +:2089C000B9FF1849091D0968896980460220087069680F6D31468DE803000F480F4B006840 +:2089E00002AA2146B847064640460EF023F9002E06D40B4991F90000AC60401C087004E0CF +:208A0000032041F2883105F041FE0AB0BDE8F081D405012058000120B4060120F5B8010047 +:208A2000B60A0120140100202DE9F0470F4606460EF0ACF8EFF311898246202080F3118800 +:208A4000D6F80880474533D01D481E4B0068002F05D49C690125BD4004EBC70401E01C18FC +:208A60000025307D01281AD130460EF08BF8306C0EF0D0F818B1F1685868884358601869D1 +:208A8000864204D0204631460EF0BCF804E020685C6131460DF05AFE586828435860B760BC +:208AA000F5603464002F44BF002058610120188189F3118850460EF061F84046BDE8F08760 +:208AC00090720200CCFF002070B5064600210C22ADF1180D684603F081F9308801211F4CC4 +:208AE0001F4DADF8000009208DF80400307A8DF80510012810D1212063788DF802006BB99E +:208B00000DF0CAFD50B9716805F11C0008220DF045F83088288001E08DF802106846FAF7C2 +:208B200049F89DF8140050B90398406C072101707168401C0DF0E4FE684608F09BFE607837 +:208B400050B90DF0A9FD38B905F11C000021082203F044F90020288006B070BDE404012037 +:208B6000B40801207CB506462448006814460D4607236A4605EB46310DF008FE9DF8000041 +:208B80009DF80010A58183109DF802209DF801009DF8045001F0030140EA012026749DF8D2 +:208BA0000310E080891141EA82019DF80320237240EA03309206120D42EAA502E2819DF8CE +:208BC00005509DF80420A18041EA003102F00302920142EAA50262729DF806509DF8052034 +:208BE0002160962DA57202F0030206BF42F00402101C42F00100E0727CBDC046CC19002031 +:208C00002DE9F04105462C686E680F460DF092FE94F8311019B91D490978012904D00EF0F4 +:208C200009F80020BDE8F081012184F831104FF0000884F832800DF0FDFF07B9144F94F801 +:208C40003000012806D1786820B9B868002808BF454618D0387884F83000F868206278688B +:208C6000E060B868A5602061B068010A04D00949814288BF011C00D80749616104F134008B +:208C800041460BF085F92846BDE8F081AC0B0120448602000100000180A9030030B505464E +:208CA0002989ADF1240D0DF08BFC884222D06868ADF8081005AA03900021AB2007F0D4FC71 +:208CC00005A807A9002203F00BF81A4827300078012808D19DF81C0028B900208DF81000A5 +:208CE00002A8FFF7F1FE01208DF8100002A8FFF7EBFE1DE000248DF804408DF80540686822 +:208D000000900DF0CDFD18B1017909B1052906DB0DF056FC298888420AD1009403E040791B +:208D2000000938BF01248DF806406846FEF7A2FC09B030BDE4040120B0B5244C2068B8300E +:208D400001680F781E4917B90F783FB909E00F7837F07F0702D11B490F7817B1D0F894046A +:208D600080470DF0E7FD6168174D09692A780978914207D116490978C90803D20DF05AFF02 +:208D80000120B0BD0DF056FF0AF000FB0DF0F4F9012811D12D7808F0C9F918B960680069A8 +:208DA000057009E06068006905702068D0F8D40090F942000CF0BEFF0CF0D4FFB0BDC046C5 +:208DC000741B01206A1B0120A406012014010020701B0120B0B5234C2068B83001680F785D +:208DE0001E4917B90F783FB909E00F7837F07F0702D11D490F7817B1D0F8940480470DF0F4 +:208E000099FD6168194D09692A780978914206D113490978C90802D20DF00CFF19E00DF0CE +:208E200009FF0AF0B3FA0DF0A7F9012811D12D7808F07CF918B960680069057009E06068A1 +:208E4000006905702068D0F8D40090F942000CF071FF0CF087FF0120B0BDC046741B012013 +:208E6000701B0120140100206A1B0120A406012070B5254C216840310868006828B9D1F88E +:208E80000C0580472068006C006840681B4D007800F0200028710DF04DFD194906460878F8 +:208EA000832826D12879D8B1216840310868006890F8780010B9D1F80C05804730460DF037 +:208EC000B9FE1048008842F20341401A0DD0401E18BFE9200AD101200BF08EF91B2005E070 +:208EE0008520087030460DF0A5FE002001F098FA70BD30460DF09EFE70BDC04604180020F1 +:208F0000741B01207A00012014010020002A4AD05FEA000C8B071CD1830722D1102A08D327 +:208F200070B4103A78C978C0103AFBD270BC103238D0042A2CD3082A05D30C2A24BF08C99C +:208F400008C008C908C008C908C092072AD0920F22E00B780370491C401C521E22D08B0736 +:208F6000F7D1C30714D18307D8D0121F12D308C903801B0C4380001D121FF8D20AE008C921 +:208F800003701B0A43701B0A83701B0AC370001D121FF4D2121D05D00B780370491C401C47 +:208FA000521EF9D160467047F0B516460C460546ADF1240D08F0FEFC002840D128460021F3 +:208FC00007F0DCFF314603F009FD071C37D0B879400834D320460CF08CFD012819D0B97976 +:208FE000C8082CD30DF0ECFAA0420BD1002000902146019005AA02900F2303902846FFF7EF +:2090000091FAB97988081AD2B87900F0FB00B87115E004208DF81000ADF8124004A802F08F +:2090200017FF01280BD1002000900127214605AA01900F23029028460397FFF773FA09B0AE +:20904000F0BD704770B52348234C1830E06000F5877020611C48ADF1280DA06008F094FAFB +:2090600068460CF013FE4FF4E130069003208DF81C0000258DF815508DF816508DF81D509B +:2090800001208DF800008DF801001048039010488DF8175069460490284608F02BFE202162 +:2090A0002A4660600DF09FFB0BF0B4FD0646202204F11401606825800DF09AFB30460CF034 +:2090C00034FF0AB070BDC04689240200C9BE01009950020004FC00208C07012003B410466D +:2090E000F0B51E1C05AFADF11C0D14BF0028042038D081B201AA384602F022FF1C4C0746CB +:2091000004F114000068002F2BD110B1804700B90B2720692FBB01F03DF9054600200090AB +:2091200094F83300E18E01AA0323F6F7E7FEC0B278B901A831460222F2F75EFC071C0CD134 +:20914000BDF8101049B19DF8140007F025FB677803E00A280CBF0A2701272069294603F07D +:209160000DFEF8B207B0BDE8F04002B07047C046C01900202DE9F84F8146002100200A4691 +:20918000C9F800006846FFF76FFADFF87C8000264FF0FF354FF0190A34460746E0B20CF0DE +:2091A0009BFFC8B1837ABBB1017A0126022917D04246516892F8423240694A8B09698918AF +:2091C00013FB0A110BF020FB83460DF0D5F9BBFBF0F0854288BF051C641C032CDED300E0B7 +:2091E00000251FB1012E04D0012F05D0012E04D005E00098854200D9009DC9F800503E4323 +:20920000F0B2BDE8F88FC04668F200202DE9F0410DF090FB204C80462078002650B11F48D9 +:209220000322083801688260480803D30AF096FB0AF0DAFE164D2868071C0ED008F03AFDD8 +:20924000B86A796A884207D8284639460BF018FC3046012687F832002868217801290ED0E5 +:2092600050B90F480DF060F948B90A4A4FF0FF30012105F0B7FC02E080680CF0FBFC404668 +:209280000DF0D8FC16B1B86808F0EDFFBDE8F0810C0B012080A90300AD0B0120108002400D +:2092A0007419012030B50546A96948780C7804EB002420480088ADF1240D4A1CA04222D16D +:2092C00050781028A8BF10208DF808009DF80820491C891C0DF109000CF060FC8120112171 +:2092E00002AA0DF021FA9DF80800134920B90846017901F0EF0103E00846017941F0100142 +:209300000171002000E084208DF819008DF81A408DF81B400DF119000090287CA91C48F290 +:2093200014020323019005F1110008F093F909B030BDC046E00301204C1A01209EB5477E86 +:2093400037F07F0743D0017D012903D0032918BF04293CD11E4C2168D1F89810098901F0AE +:20936000020201F00801114331D041684878C0F3810002288DF8080006D003280ED1491D00 +:2093800068460DF0BDFA09E08A79487940EA0220ADF800000879C97841EA00216068426F46 +:2093A000684690471E2809D040B16068006D8047FF280CD16068416D012007E06068006D65 +:2093C0008047FE2803D16068416D002088479EBD14010020F0B51F4D1D4C002124220823CB +:2093E000ADF1240D6846E5620DF0FCFB002604F15007384631466A468DF818600DF0EEFBBB +:209400003C2208236763314604F16C0738460DF0B1FB4FF44060C4F88C000521E5673A46D6 +:20942000334604F1840004F1A805016074300A49C4F8880028460DF099FB084825630849D4 +:209440000160084981600849C16009B0F0BDC046D4DB00200C020120019D01000C010020D1 +:20946000D4800200446C0200547A02008B4208BF824204D90B1C021C002100207047002B77 +:2094800008BF002A0BD10B1C021C00210020002B08BF002A1CBFC943C04307F064BFF0B5B4 +:2094A0001C4615460B46024600200021B4FA84F6202E04BFB5FA85F62036B3FA83F7202FE6 +:2094C00004BFB2FA82F72037F61BB6F1200727BF05FA07F400257F42B4403EBF25FA07F79A +:2094E0003C43B540A34208BFAA4201D3521BA341404149416D0845EAC4756408761EF1D58D +:20950000F0BD704730B501250446ADF11C0D8DF81450F9F7F5FD206918B11E480168204679 +:209520008847207D50BB684600210C2202F056FCA0688DF802500088E368ADF80000187D87 +:209540008DF8055009308DF804006846F9F732FB9DF8140090B90398456C0E232B70A16891 +:209560004968681C0DF0CCF9E2681169127D05F109000CF013FB684608F07CF9E06808B17C +:2095800008F078FA20460DF0EDF89DF8140007B0207530BDBC080120F0B585780221C41CAD +:2095A000ADF11C0D20468DF808100DF039F8A41CADF8000020460DF033F8A11C11F8012BCE +:2095C00006460DF10B008DF80A200CF0E7FA164F3046391D9DF80A400E68102CA8BF10244D +:2095E000102206F8010B001206F8010B202106F8014B304602F0F2FB0DF10B01304622464B +:209600000CF0CCFA142213236946384604F044FD01228DF81B000DF11B032946652008F0EF +:20962000F7FE07B0F0BDC046280401202DE9FC47224D81466D1E95F83340E8784FF0FF08BE +:20964000002642F2010A0AE0204678210AF0AEF8E878641C94FBF0F14143641AE4B2B04242 +:2096600028DD95F83200761CA042B6B2F0D0E86861036A4604230DF089F8009800F0FF00FA +:209680007828E5D005F13007FF2818BF7E2803D120467C210AF08AF8A00085F8334000EBD6 +:2096A000C400C019818BE986808B48448245CBDD95F833804046BDE8FC87C046C11900209E +:2096C00070B50546A96948780C7804EB00241F480088ADF1200DA0422BD181200021112224 +:2096E00002AB0CF05DFD20BB687C194E9DF808108DF81900301D00680023221200F8013BB6 +:20970000091D00F8014BCEB200F8012B9DF8081000F8011B9DF808200DF109010CF03EFA81 +:20972000A91C0DF1190048F21102334604F0B4FC0AE048F211000090287C0190687CA91C40 +:20974000842223460AF07CFC08B070BDE0030120280401202DE9FE4F0CAF3E793C888DF834 +:2097600000001D469246894606F10A00C0B20190401C00F025FC5FEA00082ED008F1010025 +:20978000834651468BF80090401C0CF0FBF900F8015B291200F8011B00F8014B231200F8F6 +:2097A000013B067026B1B968401C32460CF0F6F90B4C0C49C4F804B0E51C48F23802387BFC +:2097C000019B2870684604F067FC404608F052F905F10A0666600020E070BDE8FE8FC04613 +:2097E000280401203C0701202DE9F0411D4F7868C068012101701C496FF0010008701B48CA +:209800000068C06B80471A4C054621786068A2688B002E1AB6FBF3F05843361A880015499A +:2098200002FB03F8B1FBF0F0904203D23868D0F84C058047AD1B1048656008EB0501F9F7AF +:20984000A3F83868D0F8E40480470DF073F80DF0F1F90BF093FA7968C96800200870BDE830 +:20986000F081C04614010020B00A0120D8050120D8000020FFF6C2FFE99701002DE9F041ED +:2098800006467468B5680DF055F88046A06A58B928688169090907D2006B400A04D24046E2 +:2098A0000DF0C8F9BDE8F08104F5B2700DF03CF800274046A7620DF0BDF9A97D3846FF2953 +:2098C00002D0E97DFF2900D118B12046294601F04DFE0DF02FF82A68916B21F020019163A5 +:2098E0002A68116B21F4807111630DF0A3F904F2A9100BF091FD616A206A2769626A401A04 +:209900002062216A3B4630469847BDE8F08170B50C4621780646ADF1180D01F00C0531F00C +:209920007F0018BF45F0800501F0030045F00205012808BF45F01005880928BF45F02005DB +:209940000C226846002102F049FA8DF80250ADF8006060788DF80300012568468DF80550EB +:20996000F9F728F99DF81400C0B903984576A17880F83A10E17880F83B10E188C18721890C +:20998000A0F84010617D80F84910217E80F84C10E17D80F84B10684607F06CFF06B070BD99 +:2099A000FEB50C4601A90AF0C3FD00283CD11F4D2869002838D0871F00210320BDF8042019 +:2099C00037F8063F9A4204D0401E01F10101F5D1FEBD7980182000F0F3FA061C24D00096D6 +:2099E000798806200022182308F010FF3046214610220CF0D3F80024746134617988062051 +:209A00001822334609F044FD30461822214602F0E5F9304608F02EF879881435880000EB21 +:209A2000C1002C5040194460FEBDC046CCE8002038B5224C083CE068D0F8880080470CF05D +:209A400079FF0546E068C06D8047E068416AA068D0F8D40090F942008847E068816CA06899 +:209A6000D0F8AC0000788847E068016EA068D0F8D400C08C8847E068A368416ED3F8D40014 +:209A8000408D8847E068A368816ED3F8D4004430884728460DF0CEF8E068A568016BD5F847 +:209AA000D40090F843008847A268D2F8D410D2F8302452202931904738BDC046140100208F +:209AC00098B5044602208DF8010068460BF0C4FA071C3BD038690422411C02700020087084 +:209AE000227A012A04BF40F020000870607A012803D1087840F040000870A07A01281CBFB7 +:209B00000123BB7604D10878012340F080000870607A012804D1606808B17B7760683862A2 +:209B2000E07A012808BFFB82208807F043FF18B1F88A40F00400F882BB770BF0FFFF78627F +:209B4000208878803846F0F783FB98BD102098BD2DE9FE4F0190214800F19806376899463E +:209B600092460D460024804600E03F6897B3BD42FBD1D7F800B0019839460CF025FC18B3B5 +:209B8000384600224FF0805308F0F6FC06F10800B9F1000F00900ED0384600224FF0807331 +:209BA00008F0EAFC286998F8DC30C8F8D80043F0010088F8DC00304639460AF061FF00988B +:209BC00039460AF037FF641CBAF1000F18BF5FEA0B07CED12046BDE8FE8FC04668F20020B3 +:209BE000F8B515460C460CF0A5FE84461E491D488326A4B1641E2CD0641E22D0A41E19D03B +:209C0000641E15D110300768002F0CBF0021F96829604768002F0CBF0021F9680FE007689F +:209C2000002F08BF802617D0D1F8A800018E12E0032611E0D1F8B8002860D1F8BC1069602E +:209C40000AE0843800780021022808BF0121297002E006480178298060460CF0EBFF3046C5 +:209C6000F8BDC04610F3002068F20020A8F40020F0B50546ADF1340D0CF05CFE1F4C0746F3 +:209C800008342068D0F8080100686968836B102209A89847061C28D12068D0F8080100686A +:209CA000016968468847AE682B8B019609A80693EA680090A98B02926E8B0392731A0793B1 +:209CC0006B698DF82110701A0493801805900D2325688DF82030D5F80811D5F804010968F1 +:209CE00000688A6969469047064638460CF0A2FF002E14BFE42000200DB0F0BD0C01002060 +:209D00002DE9F041E9F79CF91E4C1D49207808704FF4804048601C4800684FF0FF310CF0C5 +:209D200075FF0026DFF86480606B4FF0FF310CF06DFF606C35460A21001F50F8042F1768A1 +:209D40001FB9491E05F10105F7D10A2DECDA0AF061FF616CAF0079580D680E600CF0E5F8A0 +:209D600058F8072030462946904705460AF052FF616C79580A6815430D600CF0D6F8D3E7C1 +:209D8000380A0120D4DB0020EC0101201883020010B50446207AADF1300D04283CD10CF02D +:209DA000B3FA002838D1A07838B960680BA906AA01F096FF9DF82C0070B3002168460C2229 +:209DC0008DF8141002F00AF89DF8140020BB2088A378ADF80000002B0CBF612041208DF89D +:209DE00002000B238DF8043001208DF805006846F8F7E0FE9DF8140070B90398406C10210A +:209E00000170A1784170217A81706168C01C0CF077FD684607F02EFD0CB010BD1CB51E4BD3 +:209E200003F1D4042078012202F0010120F001000143217093F8D40062F3820083F8D4003C +:209E400093F8D40062F3041083F8D40093F8D40062F3861083F8D40010480068406903F1F5 +:209E6000D401027042F20200ADF8000009880DF10200018003F1D601097801A80170B3F89D +:209E8000BE00022806D107480068054C426A2068694690471CBDC0465800012018010020B0 +:209EA000B4060120D80501202DE9F84304460420904689468DF8010068460BF0CDF81C4D08 +:209EC000071C2ED03869072100F8011B217D00F8011BA18A091200F8011BA17D01700126C2 +:209EE0007E7704F10B033B62BE770BF027FE7862B9F1030FBE7604D0B9F1010F18BF4020E9 +:209F000001D14FF48860F8822C46A01D0088B8F1010F788004BF002038763846F0F798F9DB +:209F200000E010204FF6FE71E980BDE8F883C046E4020120002030B50146ADF1240D0CF0B0 +:209F400011FE184C2061002001460CF00BFE002124220823606168460CF044FE04F1280540 +:209F6000012128466A460CF039FEA5610CF0F6FDA16904F11C0203F08BFF20700A49087084 +:209F80000A490B4808600AF045FE0B4904460948C1600A490161FFF755F820460BF0C5FF49 +:209FA00009B030BD70F70020651B01206C0A012035E4010004FC0020A963020099C7010093 +:209FC000F8B5041D14F003001CBF241A241D0AF021FE1D4A054697685560112C28BFD76870 +:209FE000386800231E46010821D226B9844209D93B4601261EE0196809188C42196019D837 +:20A000001F460846DFB11169001B032807D83868091A1161386840F00040386005E0385113 +:20A0200044F000403860091B11613F1D07E080F0004000263F1838680028D4D1002728460C +:20A040000BF073FF3846F8BD501A00202DE9F04114460D4680461E1CADF1280D08BF022026 +:20A0600034D03768EFB90C20FFF7AAFF071C14D068460021242208230CF098FD0023069732 +:20A0800041466A4605931348ADF810300CF08AFD38607D60BC60386808B9082016E0376087 +:20A0A0000CE00AF0B7FD044638680CF095FC10B138680CF09FFD20460BF037FF38684146D8 +:20A0C0000CF06CFD38680CF065FD00200AB0BDE8F081C0462D66020030B50188ADF11C0D5D +:20A0E000ADF802100024ADF800404168C27A019132F07F010AD1D10905D3807A012814BF04 +:20A100000320201C0BE00125284609E0D10905D3807A012814BF0720042000E0052001255A +:20A120008DF80800214603AAAB2006F09DFA03A805A9224601F0D4FD09480078012807D1D9 +:20A140009DF8140020B98DF80940684602F002FA8DF80950684602F0FDF907B030BDC046F5 +:20A160000B0501202DE9F04105464FF6FE708846A84238D01D4C2769B8F1000F33D06FB9CD +:20A180001020FFF71DFF206168B320784FF400614FF47A720CF08DFB20690EE094F834605B +:20A1A000B91C404608220AF0C7FFD8B9F86888B91020FFF705FFF860A8B1002194F83470FC +:20A1C000C1600822877241460580801C0BF0E6FCBDE8F0810746811C082240460AF0ACFF61 +:20A1E0000028E3D0BE72BDE8F081C04668060120F0B50546ADF1340D0CF09CFB1E4C074690 +:20A2000008342068D0F8080100686968836B102209A89847061C26D12068D0F808010068E6 +:20A22000016968468847AE6801962B8B0693698B0791EA68029209A803926E6900900D23EC +:20A240000496297F8DF820302A698DF8211026680592D6F80811D6F80401096800684A6933 +:20A2600069469047064638460CF0E4FC002E14BFE42000200DB0F0BD0C01002070B51E4C67 +:20A280002068D0F85C0280471C490B781C490D7818B91C2000F0C4F870BD0021194E22687F +:20A2A000A6F8AA10D2F8D42092F8314086F8AC4092F8242086F8AD2096F8AE2042F020025A +:20A2C00086F8AE2096F8AE206843800022F01F0242F0020286F8AE2096F8AE20C6F8B80024 +:20A2E00061F3871286F8AE2086F8B03086F8AF1086F8B11070BDC0461401002006180020A5 +:20A30000D8000020580001202DE9FF47067A022E1CBF804608240DD100880F128DF80A10CD +:20A320000DF108088DF8080004248DF80B7000128DF80900DFF85490154F00254FF0010A2C +:20A3400030460BF01BFD0AFA05F1014216D0022E19BF09F1080101EBC50107F1080101EBA7 +:20A36000850122466846FEF7D1FD4046694622460AF0E2FE012808BF281C03D06D1C052D45 +:20A38000DEDBFF200090BDE8FF87C04604180120001A01202DE9F043054620480068ADF1AA +:20A3A000140D05EB00090CF0D9FB071C16D00CF015FB06460CF0EAFB80466868012807D1DA +:20A3C00000246C60EF604046AE600CF0D7FB21E0E868874204D140460CF0D0FB01201AE085 +:20A3E00038460BF0CEFD02970024C7F818D0484669463246039409F030F9E8680CF0EEFA13 +:20A40000B04203DAE8683146FEF70EFB40460CF0B5FBBC61204605B0BDE8F0837C88020020 +:20A42000B0B5074600251D481D4C05701E4805704FB92068006C0068C08AC00803D20CF0E0 +:20A44000FDFB184908602268AC32D168087808B1496C61B91068007808B905F0C7FFFDF732 +:20A460001FFB2068D0F87012384688470BE0384688476068C068007828B92068D0F8582456 +:20A480002846014690472068006C006810B1007D352801D00BF066FCB0BDC046641B0120F8 +:20A4A00014010020940B0120741B01202DE9FF411D4D1F4F1D4C33264FF001082B79002BF0 +:20A4C0002AD0032B28DAE9696269F1B982B13868022B4FEA8011A1EB800107D12888904755 +:20A4E000012805D1A1692888884701E0288890478DF800806888ADF80C00684605F096FD90 +:20A5000050B101A805F0DCF806E0A86910F1020F02D0E869401EE861761E05F12405CDD1A4 +:20A520000090BDE8FF81C0462C100020E4020120BC80020070B5C821ADF1180D8DF8141045 +:20A540001C4986780978C01C39BB0DF115016A4601F0C6FB05469DF8150010B316499DF825 +:20A560001330A800002400EBC50038310C504018446033F07F0003D00DF1130009F0CEFB13 +:20A5800068462146142201F029FC0420294614226B4608F07DFF204601E0F7F74DFC8DF869 +:20A5A000140065203146012205AB07F031FF06B070BDC046E5040120CCE80020F8B51C4EB3 +:20A5C000D6F8600101680120884701282ED0D6F82401184DC4683C21012200232846A04750 +:20A5E000002808BF002022D02F8817F0010704D14FF00120C5F80404288830688047012F5B +:20A6000004BF4FF08070C5F804040D4A0A480B4F936901681069D161A0EB9000C91A07FB70 +:20A6200001F3190C814228BF081C10610120F8BD8000001000A00C403020094040420F0046 +:20A64000D808012003B40021F0B505AF3846ADF11C0D01AA01F074FC1B4C054604F11400BC +:20A6600000682DB910B1804700B90B2520690DB1E8B224E0FFF78EFE002506460095E18E3F +:20A6800094F8330001AA0323F5F738FCC7B28FB99DF81400BDF8101006F07EF8009594F83E +:20A6A0003300E18E01AA0323F5F728FC0A2814BF012767782069314602F060FB384607B089 +:20A6C000BDE8F04002B07047C019002030B5204D45EA0401ADF11C0DC1F315040021019176 +:20A6E00002910391049104A90091806802AA03AB01A9F9F795FB0146019802884FF6FF70D6 +:20A7000090421DD101B3039808B1049840B9D9B102982B2105AA0BF019F8FF2806D113E0C0 +:20A720002B2105AA0BF012F8FF280DD0C4F38850059C80056FF39F54044344F0004403E069 +:20A74000A805204042EA0004204607B030BDC046FFFF3F00F8B5204C0D46280C34D2680859 +:20A7600038BF002037D3607805F050FD071C0BD001208DF800006946522007F01BFB0020AC +:20A780000BF004FD0020A07002200AF0DFFB011C05D0332008704F70E07806F023F885F03D +:20A7A0000100F8BD317820790C2905D00D2908D13046F4F79DF804E0B2787378114608F04A +:20A7C00061F930460AF0C8FC207804F013FC061CE8D185F40040F8BDC40A01208CB5014690 +:20A7E0008A695078137803EB00231B480088984214BF0027194F1A48001D006857B948F2AA +:20A8000003000090087C0190487C8022891C09F017FC8CBD002200F8012B00F8013B1A128A +:20A8200000F8012B3A6802F0F00302F00F021A4300F8012B3A68120A02F0F00302F00F0243 +:20A840001A430523027001F1110048F20302891C03F022FC8CBDC046E00301204C1A01202F +:20A8600028040120B0B50446A07AADF1180D48BB606805A96A4601F033FA0146E07A4009CE +:20A8800020D29DF8140001281CD19DF81000022818D1FF208A009DF81270134D8DF810009A +:20A8A00002EBC102781C531900F00F008DF8120000275F6001970097AF5004206B46142233 +:20A8C00008F0E6FD2046F9F7E5FF071C09D1A07A38B9E07A400904D20BF072FE6168FFF7B8 +:20A8E00041FC384606B0B0BD04E9002030B50446ADF1440D601D0AA908F0E0FE012802D04E +:20A900002079022834D060880DF13A0102F0CAFE01282DD10DF12A0001900DF1420105AAC5 +:20A920000DF13A0001F0DCF99DF8420000B39DF82610019A07A804F071FC01208DF80E0065 +:20A940008DF80D008DF80C00002504956188ADF8001004238DF802300DF13A016846029120 +:20A96000F2F7DEFB0DF12A001022294601F036FA11B030BDF8B51F4CA0F5C060D4F81011C3 +:20A98000C4F82C010029B8BF49420028B8BF404281422BDA4FF08057D7F8A401B4F814115F +:20A9A000154D40684FF47F4208230646009128463021B047D7F8A401B4F8181140684FF497 +:20A9C000F80212230646009104212846B047D7F8A401B4F8281140684FF440620A23064682 +:20A9E000009120212846B047012000E0002084F83001F8BD5018002000A00C407CB5204C8C +:20AA00003C3CE06B00680146042088471B4D02281AD0032818D001282FD1206840680321C5 +:20AA20004FF040521C230646009128460021B0472068406801214FF4007209230446009195 +:20AA400028460021A0477CBD2068406803214FF040521C230646009128460021B0472068F8 +:20AA6000406801214FF4007209230446009128460021A047022008F0F9FE7CBD00A00C40A4 +:20AA8000E0010010B0B505461E484268184C9269217817783FBB174B8A00B3FBF2F2AA421A +:20AAA00004D20068D0F84C0580472178164B042011FB00F001B2181D00686768C06B05FB14 +:20AAC00001748047211AA1F54871090806D30A4A011B891A090828BF00F548740748214654 +:20AAE000F7F752FFB0BD064901200870B0BDC046D8000020FFF6C2FF00093D00E9970100DA +:20AB0000721B012014010020D40501207FB51F4C4FF47000E0600025A560656065701C489E +:20AB200005700AF077F80646206940B10BF004FC10B120690BF0F8FE20690BF016FD6846F6 +:20AB40000BF015FE8DF800500E48019501216A4606F0D0FE0C4D206120B92868D0F84C0534 +:20AB6000804720690BF0DEFE30460BF0DEF92868D0F814150F208847E06800F07BFE0090A6 +:20AB80007FBDC0460D3B020014010020D8000020721B01201B49B0B509684BF2F52250432D +:20ABA0000027040A01F44021B1F5802F03D116480068800C00D38FB14FF08055D5F8EC01AE +:20ABC0000068804706F016FFD5F8E011C96888472111C01000B2484304EBE0340B48007870 +:20ABE00030B90B48006820F07F402418640802E0084880F8407108480460210C4160012735 +:20AC00008760B0BDB44F00508C1300509019002010200940501800207C600C402DE9F04165 +:20AC200085780221C41CADF1280D20468DF818100BF0F6FCA41C2646083414F8018BADF89C +:20AC4000100020460BF0ECFCA41C074614F8010B03288DF8220005D020460BF0E1FCADF8EC +:20AC60001A0004E00DF11A0021460BF049FE00970DF11A00019014F8080F002704A9324666 +:20AC8000434602902120039700F0E4FA8DF824002946012209AB652007F0BAFB0AB0BDE871 +:20ACA000F0812DE9F04185780221C41CADF1280D20468DF818100BF0B3FCA41C26460834E4 +:20ACC00014F8018BADF8100020460BF0A9FCA41C074614F8010B03288DF8220005D02046EF +:20ACE0000BF09EFCADF81A0004E00DF11A0021460BF006FE00970DF11A00019014F8080F3B +:20AD0000002704A93246434602902220039700F0A1FA8DF824002946012209AB652007F0FA +:20AD200077FB0AB0BDE8F081F8B506AF3E7894468E46002E3AD0002735461B1F4FF6FF7142 +:20AD40003C4633F8042F91422BD017B13F88B84201DD824205DC6D1E1F4604F10104F0D18E +:20AD6000F8BDA6421A4608DD361B121F32F8044FA14202D0761EF9D1121D934203D2D11A1B +:20AD8000C91C8F1000E0012732F8041C12F8026C118012F8015C96707F1ED570A2F10402EC +:20ADA000F2D1188083F802C083F803E0F8BDFEE71F4830B5ADF1140D94386A4614300546ED +:20ADC00004F06EFB002404218DF8044020468DF8064009F065FC332807DA09F04DFC20B922 +:20ADE00001208DF804008DF80600684603F0E4FC4520294606F0DEFF9DF8060010B99DF8FD +:20AE0000040000B101248DF8134008499DF8132008784978104001408DF8131041200DF18E +:20AE2000130106F0C7FF05B030BDC046FC090120E4010120F8B50D46074609F0EBFE0646F3 +:20AE40000BF0D6FB68BBB5F5877FDCBF0021081C05DDA5F5877007F587714FF48775134C6E +:20AE600061612A463946E08004F59370FEF74EF801211048A580A7680170781CA06009F0DE +:20AE8000C9FE0B4C07462A462169606865800BF0B4FCB0F1FF3F04BF0020608038460BF0DA +:20AEA00044F830460BF041F8F8BDC04604FC00208C070120B60B012003B41046F0B51E1C4F +:20AEC00005AFADF11C0D14BF002804202FD081B201AA384601F034F8174C074604F11400A7 +:20AEE00000681FBB10B1804700B90B272069EFB9FFF750FA05460020009094F83300E18E03 +:20AF000001AA0323F4F7FAFFC0B250B10A2806D101A831460122F0F76FFD071C02D001274D +:20AF200000E00D272069294601F028FFF8B207B0BDE8F04002B07047C01900202DE9F0410E +:20AF40001D4C804620684FF0FF310BF0A3F9D8F808601A4DD8F80470144A308C736979687A +:20AF600028601160B3B9124A318B89180A78521ED3B20A7073B9404604F0D6FC404609F0CB +:20AF8000F9F878680BF020FC0022318B094B286843F8212081B24046F9F7B5F8002038706D +:20AFA00020680BF0DDFCBDE8F081C0460C1B0120401B0120B01A0120141B0120101B0120CE +:20AFC000F8B505460BF0B6FC1D4C064604F1DC010878A84304F1B80508702868002808BF31 +:20AFE000002706D02868B8300BF0A6F9002700B10127686838B1B8300BF09EF9002538436F +:20B0000018BF01252F4694F8DC00A0B9012F12D0D4F8D80078B1816A89080CD3456A30469E +:20B020000BF008FED4F8D80002210022A8470020C4F8D800F8BD30460BF0FCFDF8BDC046A9 +:20B0400068F20020F8B507460024081C08BF0124002302B90123002F33D01AB197F8446016 +:20B06000002E2ED080B190F844606EB17D6B016CAD08A5EB910539460BF04FFA2D1AB5F148 +:20B08000704F04DB002D02DC012C01D019E00124BAB1D068007B00F00F00022811D1516B06 +:20B0A000386C8D081146A5EB900538460BF035FA01262D1AB5F1704F02DB002DD8BF002699 +:20B0C00033431C40E0B2F8BD70B50646B5681D48296874688A6B10408863002020703046A1 +:20B0E000FEF7CCFB304605F015FC2968C86A20F01000C862296814480A6B10400863304678 +:20B1000007F058FA6868FBF7ADFE04F16C000BF00FFC04F188000BF025FCA07818B904F19B +:20B12000C4000BF01BFC607818B904F58A700BF015FC04F5B2700BF0EDFB04F158000AF04C +:20B140001BF870BD0DF8FFFFFEFCFFFF70B53A2000211122ADF1280D01AB0BF021F81B4DE6 +:20B1600010B9A81C006806908220182101AA0BF0DBFA154E002407A80090214600220C2370 +:20B18000072007F043FB08A93046082209F0D4FF48B9641C052CEEDB08A8FF21082200F0D1 +:20B1A0001DFE641EA4B2069821460C2207AB0790072008F06DF9002101A81822298000F0FE +:20B1C0000DFE0AB070BDC046AD010120120A0120FEB51D4D1D4C0E462E721EBB1C48401C58 +:20B1E0000078022819D108F0D9FC08F037F9071C13D000211C2200F0F1FDE08F04F14001E6 +:20B200003880B81C0BF07CFBB4F848007881AA23BB7406223A7401217974287810B90320D6 +:20B220000AF040FD5035296849B18DF80060608FADF80200E78FADF804706846884702201E +:20B24000002108F0BBFBFEBDC403012050010120E40401202DE9F84F99461E4B82460AAFDB +:20B2600098467C6858683E88237A8B46032B04D0012B0CBF0E250C2500E0152511460BF04F +:20B280003FFB00F8019B00F8016B311200F8011B217A00F8011B217A032907D001290AD1D3 +:20B2A000217800F8011B2188091203E021460BF027FB397A0170102088F8030052465946A8 +:20B2C0002B46404602F0E8FE002188F80310BDE8F88FC0462804012070B506467568B46802 +:20B2E00095F8F900012816D094F83800A16A09F027FA94F83900E16A09F022FA94F83A00E5 +:20B30000216B09F01DFA95F8FB00FF2823D0616B09F016FA70BD94F83800E16A09F010FADB +:20B3200094F83900A16A09F00BFA94F83A00216B09F006FA95F8FB00FF280CD0616B09F0A4 +:20B34000FFF995F8FB0004490AF0ECFB95F8FB0031460BF001F870BD05DA0100B0B507468D +:20B360001A4C1B4D207818B12868D0F84C0580472868D4300168194BCA8C991C0A800FB376 +:20B38000032F1BD0052F06D0012F04D0022F02D0D0F87804804702202070FDF771F82868D5 +:20B3A000D0F8D4104FF6FF72CA84D0F8D400094FC18C094C3980C08C2080B0BDFDF760F8E9 +:20B3C000032000E001202070B0BDC046B4180120140100201A06012046010120A4060120B0 +:20B3E000F8B51F4C2068D0F8E800002505602068D83001680F68A7B181687A68096891429C +:20B400000FDD07F0F7FF2168D8310A6812685368984202DD5060086802680869026020687C +:20B42000D83041680F684FB101690E681EB172687B689A4202DD0F602068D83001690F68DD +:20B440003FB1806879680068884202DD06F092FDF8BD0AF0B7FC2068D0F8E8000560F8BDE9 +:20B460001401002038B51D4C054694F83200000906D21B49086B18B14878082103F0E8FDF6 +:20B480006B78E12B07D0F12B05D01A2B03D0192B18BF002007D1E07918B907F031F86B789D +:20B4A000E07980F00100E0710E48417802290AD1007840B9EB2B18BFE92B04D130200021A4 +:20B4C000F4F76CFA6B7801200090B4F84810E08F0022F0F797FCF2F7BBFC38BD5001012071 +:20B4E000E0060120E40401202DE9F0411D4CC668E76C00210125ADF1200DA04605FA01F221 +:20B500003A4209D0735C0BF04FF8984204DAE06C9043E064D8F84C70491C1B29EEDB47B9AC +:20B52000114F0020396884F84A00C1B1C420884715E0684600211C2200F050FC8DF80450E8 +:20B5400000268DF80760E06C009094F852708DF80570684600F0E4FD062084F84A0008B092 +:20B56000BDE8F081500101200C0A012070B50C4606460BF0DFF92268916B21F020019163CA +:20B580000BF058FB184D207D2946491E02F0C0F8A07D294602F0BCF830468178012906D03A +:20B5A000C4304FF0FF310AF075FE206803E0206881690909FCD20D4D85420CBF10211421AC +:20B5C000207D09F0BDF8A07D0021FF2802D0E27DFF2A00D131B121688D4214BF152111211B +:20B5E00009F0AEF870BDC046026000200010004010B5044600210C22ADF1180D68468DF853 +:20B60000141000F0EBFB6078012809D0042807D002281CBFB3208DF8140004D10A2000E003 +:20B6200002208DF804009DF8140000BB2078ADF8000021238DF8023001228DF80520684648 +:20B64000F7F7B8FA9DF8140088B90398406C08210170617841706178022903D16168801CB8 +:20B660000BF04EF9684606F005F99DF8140006B010BD2DE9F04F1D4690466A68834600266B +:20B680008A464FF0010909AF3046ADF1140D09FA00F10A421CBF761CF6B2401C1B28F6DBDF +:20B6A000A6B13046FEF78CFC041C10D0002001466A6809FA01F3134204D04A19127A431C99 +:20B6C0002254D8B2491C1B29F2DB00E00024CDF800800196029438780390A9786A685346AF +:20B6E0005846FEF737F814B1204606F0C3F905B0BDE8F08FC8B509F073FF01461C480368D4 +:20B700000429C3F34062C3F3C056C3F300674FF0FF302BD1C3F30331491F1BD0C91E24D039 +:20B72000491E1DD0891F21D1180E0ED2980E07D3580E03D2980E03D30F20C8BD1120C8BD74 +:20B74000002F14BF10200B20C8BD002A14BF0E200D20C8BD56B1002A14BF26202520C8BD16 +:20B76000002A14BF0A200920C8BD0C20C8BDC04694120050F8B51C4D0446286818B904F092 +:20B780002FFB286818B116490978A14201DC002423E0144A0C2114FB01246668A7684FF084 +:20B7A000FF310AF077FD114831780268012908BF28680CD039682868531E0B4207D10C4906 +:20B7C0007B6809689A4202D81940994201D0002401E0012131700BF0C3F82046F8BDC046BB +:20B7E0005C830200A0850200001B0120041B0120081B0120BCB51C4DE86848B307460124EA +:20B8000003206C720AF04EFAB87907F0BBFCF87A00903988BA783B8907F10C00F8F7EEFC70 +:20B8200070B913480078000904D210480078D0B9082001E04FF400402146F4F7AFF8BCBDD6 +:20B84000E8688DF8044008F0E9F8214601AB06E00020012168720DF105038DF805000A4601 +:20B86000032006F0E7FABCBD68060120C5030120521A01201D4998B54A68926917783FBB67 +:20B88000154B1A78154F5B68042412FB04F424B2920000FB0434B7FBF2F2824203D2086828 +:20B8A000D0F84C05804712480068C06B8047211AA1F54871090806D3094A011B891A09085D +:20B8C00028BF00F5487407482146F7F75DF898BD05490120087098BDD8000020FFF6C2FF98 +:20B8E00000093D00B51E0200721B012014010020D8050120F8B51D4D6868C06801210170AA +:20B900006868806900781E461746022803D02868D0F84C058047002402204FF0807304EA62 +:20B92000070104EA0602384033400143134308BF00290CD14FF0805304EA0700334008BF76 +:20B94000002804D12868D0F84C05804709E008496F6891F90000401E0870B86904700AF07A +:20B9600025FA6868C0680470F8BDC04614010020B60A0120BFB509F0C9FF002835D0417B4D +:20B98000062932D101680A7A44898DF808200988ADF8001005F060F9200B26D3BDF8001091 +:20B9A000002008F06BFC00BB114CB4F84810684608F055FD0020014608F060FC071C11D035 +:20B9C0004FF6FF75386801888D420ED0B4F84810FBF762F81A2808D03846002108F04EFC8D +:20B9E000071CEFD108460AF0C7FF0090BFBDC046500101202DE9F8438146EFF311882020FF +:20BA000080F311880124164E164DF461164F6C60F86A016A14208847D9F81000810C14BF97 +:20BA2000000C0420A861386802682321002090470E480068C6F8804200280CBF211C0321F6 +:20BA40000B4807680FB141F00401286820F4E02040EA01402860346088F31188BDE8F883CF +:20BA6000000024430020094084010010CC7202002C730200B0B51B4C054620784FF48061AD +:20BA800003F050F8092084F84A0018484178022904BF0021C1700AF051F80146686909F0CF +:20BAA0006DFF01281CD1102009F050FA071C17D002203870A86A8178407800EB01207880F6 +:20BAC000A86AC0787870A9694A2006F073F9A87910B90549052008702078394604F082FEF6 +:20BAE000B0BDC04650010120C4030120E404012003B42DE9F04307AFBD681E469046ADF1BD +:20BB00001C0D002D14BF002E042027D01946384601AA00F015FA144C04F11001096800282D +:20BB200018BF071C19D10846FEF734FC81460020009094F83300E18E01AA0323F4F7DEF976 +:20BB4000C7B237B94146324601A82B4603F024FA07462069494601F011F9F8B207B0BDE8EC +:20BB6000F04302B07047C046C0190020F8B507460AF0E0FE044677B3B87A60B397F90920E6 +:20BB800009F03AFB012303FA02F1CDB240B1144E30681132934098433060DA4346F8042CED +:20BBA0000020B8610346BB723B7207F110063B60024686E80C000B4A7B6002F5107003789C +:20BBC0001943017092F8420210B1401E82F84202284607F089FA20460BF02CF8F8BDC046C5 +:20BBE0000C10044068F20020F8B51D4C0546E07904211E4605F01EFF002818BF01202DD1F8 +:20BC000006F098F836F0010018BF022E25D10820FEF7D6F907462069002F08BF10201DD0A5 +:20BC200010B9276104E0084601680029FBD10760E079402105F0FEFE002180B23960C0F570 +:20BC40001670BD8080B2B0F5167FF88005D1E07940214FF416720AF02FFE0020F8BDC046E0 +:20BC6000C40301202DE9FC470646884691469A461A487168184DB2684B681468118C0360C9 +:20BC80003046296003F050FE07464046241807BB03218DF80010200C8DF80340220A8DF835 +:20BCA000010029888DF8022030460AF0C6FA6846042104F073FB002818BF4FF0FF3704D17D +:20BCC0004846514608F06CFA0746298830460AF0BDFA3846BDE8FC87101B01200C1B012082 +:20BCE000F0B50F46014616464FF6FF70002FADF1240DADF818002ED000292CD0002401AA46 +:20BD00003C7003A80091801A83B201A908221D4606A804F0EDFF002804BF012038700ED015 +:20BD20000DF11A002146082200F058F80DF11A002B4601A90822009006A804F0D9FFBDF8FE +:20BD40001800C82805DA26B1304601A9142209F025FFBDF8180009B0F0BD30B504462088A8 +:20BD60000125ADF1340D3A22ADF8080060688DF80A5007A9049011200AF0C1FB20B107A863 +:20BD80000021112200F02AF80DF11D038DF815509DF81C00039321898DF80B000AF010FCAE +:20BDA000884207D08DF81650ADF8001060680190684602E000208DF81600069002A8F1F776 +:20BDC000AFF904460021112207A800F007F820460DB030BD002213460A46194671B510F01F +:20BDE000030F0BD0002A82BF00F8011BB2F1010210F0030FF6D1002A08BF71BD11F0FF0138 +:20BE000041EA0121042A18D341EA0141082A0FD30E46102A08D30C460D46B2F10F0312F076 +:20BE20000F0272C0103BFCD812F0080F18BF42C012F0040F18BF40F8041B12F0020F18BF81 +:20BE400020F8021B12F0010F18BF017071BD70472DE9F04705460021281D0AF03BFB05F14A +:20BE600004094FF6FE7100206A88A981914227D014490F884E68044688461FE0A10001EBAD +:20BE8000C401725C12F00F0F16D071186B884A889A4211D101F1040A504609F00CFB01283E +:20BEA00007D1484651460AF015FBB8F80070D8F80460AC8101203C46641CA4B2A742DDDCDF +:20BEC000BDE8F087DC0A01202DE9F041174608F0A1FE1A4C80462FB904F108052A68002636 +:20BEE0000C351BE02188E368002604F114053046B1F5877F09DA2A5C5A542E544A1C401C61 +:20BF000091B2C0B287422180F2D8A268B84205D042B161884FF487709047A26812B1B8B23B +:20BF20003146904726806068294620220AF060FC404609F0FAFFBDE8F081C0468C070120F6 +:20BF400010B5B1F5805FA8BF052031DA0378402BA8BF09202CDA4388B3F5806FA8BF072094 +:20BF600026DA8388B3F5806FA8BF082020DA114B5B1E1B78032B08BF032019D0D181017862 +:20BF800001F03F04418800236FF39F2141EA0431848893816FF39F2444EA013414608188DA +:20BFA00091804488D4800178117296249472184610BDC046C1190020FEB5044602208DF8C5 +:20BFC000080019480D460188ADF800406846FAF763FD1A281DD01549FF2600224FF6FF77A9 +:20BFE000091D081F30F8043F9F4203D1FF2E08BF161C01E09C4211D0521C052AF2DB052A75 +:20C000000DD1FF2E07D10748B0F84810684608F026FA0020FEBDB0000C5240184580012001 +:20C02000FEBDC04650010120980101202C010020BFB519490EC901A880E80E00174D002472 +:20C04000274601A8009021463A460C23072006F0DDFB02A92846082209F06EF838B9641C1C +:20C06000052CEEDB019808B90FB912E004240C49887970B9012088710A4D01990C2201F2DF +:20C08000E240019001AB68602146072007F000FA6F800090BFBDC04654870200AD0101204D +:20C0A000C4030120100A012010B500211822ADF1300D6846FFF792FE822018216A460AF0A9 +:20C0C00033FB0021112206A8FFF788FE3A20112106AA0AF029FB3B20112106AA0AF024FB04 +:20C0E0000C49002008700C480078012818BF02280DD10A4A4FF48170102114460AF00EFB69 +:20C1000028B94FF48170102122460AF00DFB0CB010BDC046B5010120E504012088800200F5 +:20C1200030B5002405462822ADF12C0D2146AC716846FFF753FE0B220DF1190005F10B01CB +:20C1400009F02CFD124829680160684609F01AFD28798DF8110068798DF81200E8798DF81E +:20C160001500287A8DF81600687A8DF81700A87A8DF81800074800688DF81440D0F87C1448 +:20C180008DF813406846884720460BB030BDC0464C1B01201401002038B51A491A4C097842 +:20C1A000E06802292DD120B107F038FCE0680028FAD109F021F9E079082805D0012812BF6C +:20C1C000A072012000211AD00825E5710F4C012084F84A000A2009F065FD2078022102F02A +:20C1E000A1FC4FF480400021F3F7D8FB0024522069468DF8004005F0DDFD28462146EBF731 +:20C20000BBF938BDE504012068060120500101202DE9F84F0AAF7C6897F808803E688146EC +:20C22000184692468B46234658B3074600259C4207D10BEB050148463246FFF713FD00BB98 +:20C240000023B8F1010F05EB0A0103EB060005D00278097800208A4208D006E009780078A0 +:20C2600001EA000200208A4200D00120002818BF6FF0060006D17F1E03F1010305F1010528 +:20C28000D5D10020BDE8F88F2DE9F04104460AF051FB194D29688046D1F8EC00D1F8E010AA +:20C2A00050F8240008602968D1F8E410134C08601048083C00682678C06B80476768B10081 +:20C2C000B0FBF1F177B92868D0F8E0000068884208D2B1FBF0F10427484316FB07F109B256 +:20C2E0004143616007F09EFF40460AF0A3FCBDE8F081C046D805012014010020E0000020F7 +:20C3000038B51B4D28684069012444772868A830C16A497B0F2927D0006804706868016C10 +:20C32000202088472B681349D868816103F1D400D96802681B69527B91F8305033F81230A3 +:20C340006D00AC404FF470755C43034605FA02F08008A04238BF041CD3F81C2401F11000F5 +:20C360004B346100904738BDD0F8BC00804738BD14010020A5800100B0B51B4903680F68CB +:20C380001C8800210A466FB17D7B052D07D13D682D88521CD2B2AC4204BF491CC9B27F68A2 +:20C3A000002FF1D1032905DA2D2A03DA0F493431098800E00121018105214173418941F4A2 +:20C3C0000061418118884FF6FF77874206D0054801881846FAF760FB1A2802D101200AF090 +:20C3E000CBFAB0BD98010120E40A012050010120F8B50B4601464C69601E024218BF221CFF +:20C40000651E184610EA05071CBF2044C01B834213D8CF6801F10C0C7FB1531E796803EABB +:20C42000070613EA070518BF561B84198C4206D9BC46DCF80070002FF0D10020F8BD091A26 +:20C44000BA198D1B3EB98E4204BF3868674608D03968674602E07E6025B1396810180160A4 +:20C46000456038601046F8BD2DE9FF4105460420984616460C468DF80100684608F0ECFD0E +:20C48000071C28D0B8F1000F08D00120BC800023B8773878FB7640F0800038703969032202 +:20C4A0000A70481C0670447021128170284605F081FA48B9284601A908F0A9FA20B10120CC +:20C4C000787701AE3E6201E0002078777D803846EDF7BEFE00E001200090BDE8FF8180B528 +:20C4E00003460F1C30D038783A88B97803F8010B10127A8803F8010B101203F8011B397908 +:20C5000003F8010B7A7903F8011BB97903F8012BFA7903F8011B397A03F8012B7A7A03F85E +:20C52000011BB97A03F8012BFA7A03F8011BF96803F8012B184609F025FB1878398A001D8B +:20C540001870387C091201E0FE20FF2103F8010B197080BD30B5044600210C22ADF11C0D53 +:20C560006846FFF73BFC20880121ADF800000C208DF80400607A8DF8051000280CBF081C31 +:20C5800021208DF802006846F6F714FB9DF8141099B90398456C06232B706168681C0AF0C7 +:20C5A000AFF9A078687260880012A872207AE872684605F05FF99DF81410207A002814BF90 +:20C5C000081C002007B030BD1B4930B5044600201222ADF1140D8DF812006846FCF796FC03 +:20C5E000E41C14F8015B20460AF01AF8ADF80000A07810288DF8020003DA9DF8020018B9A0 +:20C6000009E00F208DF802009DF802200DF10300E11C09F0C3FA28466946012200F03AFBAB +:20C620008DF812004B2101220DF11203652005F0EFFE05B030BDC0469486020010B51A4C6B +:20C64000608FADF1180D8DF8000000128DF80100164800788DF80200B4F848008DF8030032 +:20C6600000128DF80400E08F082204F15D018DF8050000128DF806000DF1070009F08EFA86 +:20C6800008220DF10F0004F1400109F087FA94F83C00502118226B468DF81700652005F079 +:20C6A000B7FE06B010BDC04650010120C40301201B4910B504463422ADF1380D6846FCF795 +:20C6C00025FCA088ADF80C006088ADF80A00207D8DF81C0020690A90207F8DF80500208D92 +:20C6E000ADF81000207E8DF80600607E8DF80400608DADF82E0094F82C0000228DF83000A6 +:20C70000FF208DF834000DA98DF835004FF0FF308DF836006846E9F715FD00200EB010BD5D +:20C72000DC82020070B505F09FFF04F0FDF91648007830F0010001D109F0F6FD134C60681B +:20C7400028B1606805F096F9002020806060104D2C687CB120686668006A05F08BF9206855 +:20C7600005F088F9606905F085F9204605F082F9341CEFD10020286008F03EFE0548007880 +:20C78000F4F79CF970BDC046E5040120DC0A0120E40A01205001012070B5054608F06CFC84 +:20C7A000184CC0F5877081B26088A94229DDAEB23118B1F5877F0EDD0319C0F587711A1D1D +:20C7C0008EB2C0F5877399B2104606F0D7FFAD1BAEB20020608000193146001D06F0CEFF65 +:20C7E0006088094D4FF48772801980B290FBF2F15143401A02216080A86929810AF012FAD4 +:20C8000070BDFEE738FE002070F7002003B41046F0B51E1C05AFADF1140D14BF00280420AB +:20C8200027D0114638466A46FFF78AFB134D044605F114000068DCB910B1804700B90B24E0 +:20C840002869ACB9FDF7A6FD0746314600226846EFF7D2F8041C07D1BDF80C1021B19DF8D7 +:20C86000100003F099FF6C782869394600F086FAE0B205B0BDE8F04002B07047C01900203B +:20C8800038B51B4C184A0023164994F83A01136020B3012817D0022807D003281ED151F8DF +:20C8A000350CFEF767F8062016E051F8355C2846F1F706FA40F2FE50A84202D2001DA84252 +:20C8C000F1D8042008E051F8350CFEF763F9074800780028E7D00220C4F83C0109F0C0FB33 +:20C8E00038BDC0463D400C403C500C403E86020050180020F8B50D4606460AF01BF80446AB +:20C90000E8B209F0E9FB8025071C23D0B87A08B3386886421ED11349486891F824100229AD +:20C9200006D03846FFF722F900F028FF812511E097F909100A4E4FF4A06202EB012202F498 +:20C940007F4246EA0201002206F0E8FB05463846FFF70CF920460AF06DF92846F8BDC04635 +:20C960000100080468F2002070B5054609F0E2FF194C06464FF0FF30E06205F1B80009F0DE +:20C98000D3FFB4F9B400B4F9B61088420FD194F8240002280BD094F8DC0040B130460AF0C9 +:20C9A00049F90720FEF70CFB09F0C4FF0646B4F9B400B4F9B61088421CBF012085F8FC00F7 +:20C9C00006D104F5CE7009F0AFFF082006F08CFB30460AF02FF970BD68F20020F8B51B4CAA +:20C9E00001F0400C002264264FF6FE75A4F1080737F8081F884208D185420AD0BB790CF028 +:20CA0000400103F04003994203D0761E02F10102EED11646642E12D1854210D12146642242 +:20CA20000026087928B1521E01F1080106F10106F7D1642E08DA0888614608F021F9642EF6 +:20CA4000B8BF04EBC60000DB0020F8BDCC0600207CB502281E4614460D4612D0042818BFB7 +:20CA6000012829D108461A46012101F0D8F818B33CB1284602F048FBC828BCBF012020708B +:20CA80001ADB28460021FFF7A9FF78B1817911F0180F0BD04FF6FE710091094E028843885D +:20CAA00031881046002203F061FB07E0284631460822F5F79FFC08B100207CBD01207CBD0D +:20CAC0008A0101202DE9F84308AF3F7899461446064607F047FADFF858800D46082816DB0B +:20CAE0004FF6FE70002107F03DFA082808BF02201CD0D7B14100424601EBC000FF231554A7 +:20CB000011184E800B4F8B71387808720AE04100424601EBC0008118C879A042D8BF0320C9 +:20CB200004DD17B1CC71A1F804900020BDE8F8837A01002087010120F0B5024691694878B7 +:20CB4000097801EB002117480768ADF1140D09F037FD154C88421CBF0020802314D13B465E +:20CB6000002002E01B68401CC0B2002BFAD1401E0023C0B247B1A4467D682E780EB10CF849 +:20CB8000016B3F68002FF7D1009101900294107C0390517C48F20500921C01F015FA05B045 +:20CBA000F0BDC046C00A01205405012008B513460A4618BB3A2A14BF3B2A012114D0174922 +:20CBC00040F20310904205D120311846102208F0E5FF08BD10480078682A0AD0B2F5817F03 +:20CBE00018BF622A16D100211046102209F0D8FA08BD0128E9D002280CD1E6E7052808BF08 +:20CC0000052002D0062805D1062000930022102305F0FCFD08BDC046E5040120688002005E +:20CC200070B5ADF1280DADF8002001248DF802400D468DF8035006460196002002904FF646 +:20CC4000FF718DF80E409142049014D0CB1E934211D0891E91420ED002208DF81400ADF8EF +:20CC6000162005A8FFF7F4F8012818BF201C07D106A8029020468DF80D006846F0F750FAC4 +:20CC800004462946304607F0A5F805F053F820460AB070BD2DE9F0470D46298890460446D3 +:20CCA00007F026FA002818BFB82028D109F02AF8002818BFB22022D11820FDF781F9DFF831 +:20CCC0004490D9F80060071C08BF102017D04FF0000AC7F800A0B81D294612223C7108F089 +:20CCE0005DFF16B94E4603E0064630680028FBD1B8F1000F376001D005F07CF85046BDE8F6 +:20CD0000F087C04664F2002090B51B4C22687032116891F82B70ADF1140D57BB516E8F7814 +:20CD20003FB3037AC168D2F8182118469047071C1FD02068016F91F82B0040F0040081F8B8 +:20CD40002B002068D0F85C1302A888476068816A01208847012024680090206F2030019020 +:20CD6000D4F8D400C38CD4F87843394602AA0520A04705B090BDC04614010020F8B50446D2 +:20CD80001A480068251809F0E9FE0B46071C2BD009F0FCFE064623BB384609F01FFEA16883 +:20CDA000884203DDA1683846FBF73EFE284609F031FFA0B9284609F031FF8168E160084615 +:20CDC00009F00CFEEFF31187A060202080F311880846394609F0BEFE87F3118801E00120F3 +:20CDE0006060304609F0CAFEF8BDC0467C880200F8B51B4C103C2578064607F00BFF844667 +:20CE00001648037800278BB1001D10F8181F8E4202D05B1EF9D109E08068074630B13878E6 +:20CE2000D12803D057F80C7C002FF8D1604609F07CF8381C10D1022008F088F80146E079D5 +:20CE400031B1D12008704D70304603F0CBFCF8BD102102F0FDF8F8BD4570F8BD501A002024 +:20CE6000D4030120002980B534D00F0E202F1BD0212F08BF022218D0A02F08BF032214D03F +:20CE800087B1102F08BF05220FD0112F08BF06220BD0402F08BF072207D0502F0CBF08229A +:20CEA000092202E0042200E00122C1F39701090241EA02110268B2F1FF3F41F00F0106D045 +:20CEC000914204D050F8042FB2F1FF3FF8D14FF0FF31016080BDF8B520220D46064608F0F3 +:20CEE0005DFE002401277461A87CF46178B1022110FB01F000B2FDF763F87061002808BF34 +:20CF0000271C04D0AA7C6969520008F047FE287E78B1022110FB01F000B2FDF751F8F06145 +:20CF2000002808BF271C05D02A7EE969520008F035FE3FB9706908B104F09CFDF06908B14A +:20CF400004F098FD3846F8BD1FB504681748617A012913D000686169806891F82110024672 +:20CF6000684690476069416990F82120684605F0C0F810B96FF00200606006E00068616993 +:20CF80008268486991F821109047094840210160802404600021C0F8FC12022006F066FCE9 +:20CFA000044809F0DDFC00901FBDC046FC010010044402404C160120B0B50446E16891F846 +:20CFC000380000F00300012810D12069077C77B9496C0A78052A0AD14978012904D00629B1 +:20CFE0001CBF0321017402D102210174206900210170E068216990F848008870E0682169CB +:20D0000090F84200C870E068216900694860256908F094FD014605F1080009F071FC2069E0 +:20D02000F5F7D8FE2075B0BD2DE9F04380460E464FF6F870ADF1140DB04202DCB8F1000FD5 +:20D0400024D0144C332500F1070901272079FF2818D0B8F1000F05D1B14513D02088B04252 +:20D060000ED00FE08DF800706088ADF80C00684602F0DCFF30B101A9404608F07FFC08B19D +:20D08000204604E06D1E04F12404DFD1002005B0BDE8F0832C100020062809DC062814D080 +:20D0A000C8B1801E14D0801E0FD0401E0AD007E00A3807D0801E08D0C01E03D00F3801D081 +:20D0C00000200AE041F2011007E04FF2011004E04FF4817001E040F20250FF2904BF40F031 +:20D0E000C00121F480610AD031B149082CBF40F0100040F0200001E040F03000014640F237 +:20D10000037040EA01407047F8B51A4C6069002510B1804700B90B2520694DBBFDF73AF950 +:20D1200065780026074606E03046F9F73BFE761CF6B205436570E178B142F5DC002084F80A +:20D140003100491E84F832100C2684F8330010FB0641B1F84C10E1867E2106F027FB94F897 +:20D160003200FE2106F022FB20693946FFF706FE2846F8BDC01900202DE9FE43184D052646 +:20D180004FF6FF790A274FF00208164C35F8040F814521D06B888BB15B1E9BB293FBF7F095 +:20D1A0006B8078431B1A17D128888DF808802188ADF800006846F9F76FFC0DE028888DF876 +:20D1C00008802188ADF80000684607F048F92846FF210422FEF702FE761ED7D1BDE8FE8388 +:20D1E0002C0100209801012010B509F0A3FB154991F82420022A1ED091F8241004291AD0B3 +:20D2000009F018FD10480068006B80470F4A002308F014FE0E4C4FF090531B1820684FF012 +:20D220007A044FEA000244EB010400215B1844EB0204241C04E0074990390C6809F0FAFC98 +:20D24000204610BD68F200208C01001000093D00701A012094300440184930B58422ADF101 +:20D26000BC0D02A8FBF752FE15490EC92CA880E80E0002A800902CA8019004208DF88C00A6 +:20D2800002F0CEFA684623A9FBF7BAFC051C10D00C4928A8142209F024F9284628A906F00B +:20D2A00075FB0446284608F03FFF002C08BF002001D04FF0FF302FB030BDC046A87D0200C5 +:20D2C00060870200741A01202DE9FC410020ADF800001420FCF774FE071C28D0154810304D +:20D2E000006808B38046032402254FF6FE76A8B241460622C01908F051FC38F8060B86420E +:20D3000004D0BDF80000401CADF80000641E05F10605ECD138466946022208F03FFC4C2053 +:20D3200014213A4609F000FA384604F0A3FBBDE8FC81C046CCE80020002980B532D00F0EBC +:20D34000202F1BD0212F08BF022218D0A02F08BF032214D087B1102F08BF05220FD0112F4D +:20D3600008BF06220BD0402F08BF072207D0502F0CBF0822092202E0042200E00122C1F34F +:20D380009701090241EA02110268B2F1FF3F41F00F0106D0914204D050F8042FB2F1FF3F47 +:20D3A000F8D1016080BD98B504466FF002001F688DF800003A462046FDF744FE10B1012004 +:20D3C0008DF800009DF9000010F1030F13D1E068007B00F00F0002280DD167B13A68204651 +:20D3E0003946FDF72FFE18B9002A1746F6D102E002208DF800009DF9000010F1030F04D167 +:20D40000E06B10B104208DF80000059807609DF9000098BD002B08BF002A0FD10B1C021C27 +:20D42000002908BF002807BF0020002100204FF00041C4BFC043C94303F095BF10B55C082B +:20D4400094EA610404D55FF0000E40426EEB010113F0004F04D05FF0000E52426EEB030360 +:20D46000FCF704F8241C04D55FF0000E52426EEB0303640004D55FF0000E40426EEB0101DD +:20D4800010BD70472DE9F8430024002B16460F468046254606D5002FC3F1000302D57F422D +:20D4A000761E2D2599463846494604F0A3FD0CA0405CB7FBF9F7002F04F1010408F8010DE5 +:20D4C000F1D1A64205DD3021301B401E08F8011DFBD10DB108F8015D4046BDE8F883C04614 +:20D4E0003031323334353637383961626364656600007047F8B505462C680F4609F01AFA25 +:20D5000016490978012902D194F8221019B109F091FB0020F8BD012684F8226009F08AFBA9 +:20D5200007B90D4F387884F82000786860603878022814BF0021B96884F82360002084F859 +:20D540002400A16084F8250084F826000B20F9F721FF2846F8BDC046D8860200930B0120E0 +:20D5600070B50646356809F0E5F9002195F8212085F82410032A1CBF042A85F8251009F045 +:20D5800059FB0F4800F108010968090824BF4FF0FF31E9610B490160304605F0D5FC95F84A +:20D5A0002000022807D06C68E9692A6895F821303046A04770BD044809F0D2F970BDC046E7 +:20D5C00088470240010000809C16012010B504466089ADF1200D05A900F064F805A807A9CC +:20D5E0006A46FEF77DFB9DF81C0070B19DF81000FD2818BF002808D10D48007828B9607A12 +:20D6000048B96068007806280FD0607A18B960680078072809D0207B18B9606800780528F0 +:20D6200003D1044801682046884708B010BDC0460D050120C80801201CB50C46217F05298C +:20D6400007D104F1080100F02DF8002808BFC82024D004F10800694608F0BAF9BDF8000008 +:20D660004FF6FF71814218D02078012810D1BDF800100B4B880000EBC10003F10801401804 +:20D68000A16902688A4288BFA22007D8491C0160BDF80000A08200201CBDA1201CBDC0462C +:20D6A000DCE80020D0B50746184800880C46012687421ED008F072FF874216D0384607F00F +:20D6C000A6F906460F480078C8B908F0E5FFB0B9AEB90D490888B84211D187B11C312046B6 +:20D6E000082208F05BFA012609E0084609F0AFF805E008F023FA0146204609F001F93046A5 +:20D70000D0BDC046E5040120B40801208A0101202DE9F041174D804605EB880528680C4613 +:20D72000660824F0FF0186F0010606F0010610F0FF0F0AD109F0FEF8210A6970270CAF70BF +:20D74000210EE97009F076FA00E02960002706B1012727B1404604F0010108F005FE09F021 +:20D76000E9F8054941EA88010F6009F063FA0020BDE8F08100100840001A4442194838B585 +:20D7800090F82410022928D0044694F82400012826D094F82400042822D009F0CBF80546BC +:20D7A0006846FBF7E7FC80B1009949B904F5AC7009F0BAF804F1E000042109F0D9F808E0AE +:20D7C00004F5AC7008F0BCFB03E004F5AC7009F0ABF8284609F02EFA38BD192009F0B0F893 +:20D7E00038BDC04668F2002038B58568184C287DFF2807D02868844214BF14211021287D9F +:20D8000006F09EFF687DFF2806D029688C4214BF13210F2106F094FFA87D0021FF2802D035 +:20D82000EA7DFF2A00D191B1FF2806D029688C4214BF1521112106F083FFE87DFF2806D0D4 +:20D8400029688C4214BF1621122106F079FF38BD00100040F8B50446A07C0C28B2BF00269B +:20D86000A069C67AF01D4000FCF7AAFB071C25D0A46925783D700DBB641C381D214609F00E +:20D880003FF8083461782078002500EB012078803D739EB1A41C14F8010B387314F8010BE1 +:20D8A00007F10E01787362782078761EF6B2A41C002E00EB022021F8020BF4D13846F8BDAF +:20D8C0007FB50646B0690578FF2D08BFFE251448144C0570A4F13E000078802101F022F9F3 +:20D8E00002F0E8FE00248DF8084008F00DFD10B1284608F0EFF90C48007810B9284608F053 +:20D90000E9F9307B50B902A80090B11C48F236020123019406F1110003F09CFE00907FBDDE +:20D92000FE0901208E010120E50401202DE9F8438046174808AF174C00783D88401CC6B264 +:20D940006068914608F01EF9B9F1060F214600F8019B13DBB9F1FE0F18BFB9F1FF0F0BD14F +:20D960000670B9F1FF0F18BF062409D1401C2B12082400F8015B02E0052401E006240370FC +:20D98000084638222346414600F086FBBDE8F883E6010120280401202DE9F0410746387AC3 +:20D9A000012804D0384605F0B4FA064600E03E884FF6FE70B04221D0DFF8448000240E25CF +:20D9C00017E0397A012907D114FB05804278012A02D14288964208D0012908D014FB05803F +:20D9E000437823B941888E4201D108F040FF641CE4B2002CE5D0304603F0BCF8BDE8F081C4 +:20DA00002201002070B5064608F09EFC05466C68304607F0D7FDA0B908F08CFF0546D4F86D +:20DA2000C00040B994F8FB00002106F017FA012084F8FC0001E001210174284609F0FAF814 +:20DA400070BD08F077FF064694F8FB00002106F005FA0121D4F8C00084F8FC1008B104212E +:20DA60000174304609F0E6F82846F0F789FE70BDF8B5194C6068C06800780E4628B92068A4 +:20DA8000D0F8582400210120904708F053FF054608F098F904F04EFA07462068D0F8EC1036 +:20DAA00051F82610D0F8E00001602068D0F8E400016006F0B7FB2268D2F8D8000168D2F842 +:20DAC000E024384690472068D0F8D4048047284609F0B0F8F8BDC04614010020194898B551 +:20DAE00001684969FF220A76016814310B68DC7E012C0CD0D1F8C0104A7B91F82C108A42F7 +:20DB00001ED04068406C804707F038F998BD0020D876886AC77A9FB1D1F8C00090F843300A +:20DB20008DF8003090F852308DF8013090F853008DF80320D1F8C0138DF80200684688474D +:20DB400098BDC046140100201949420824BF081C4C3021D2020924BF081C50301CD2420948 +:20DB600024BF081C543017D2820924BF081C583012D2420B24BF081C60300DD2820824BF03 +:20DB8000081C643008D2C20824BF081C683003D2C20B03D308465C3000687047C11300F451 +:20DBA0000050C903084314BF00204FF0FF307047E402012010B5044600210C22ADF1180DBE +:20DBC0006846FEF70BF92088E178ADF8000001294FF002008DF804004FF001008DF805003A +:20DBE00008BF21208DF802006846F4F7E3FF9DF8140090B90398406C0922411C0270A078D0 +:20DC00000870208803F0D6FE10B103980421C182684603F02FFE9DF8140006B010BDF8B5B2 +:20DC20000C46174605464FF6FE76012C03D1032103F0DCFD20BB2846002103F09FF93946CC +:20DC4000FEF7CCFE012C17D110B14179012903D0F80938BF2E1C00E046884FF6FE74B442DB +:20DC600010D03046032103F0C1FD48B9B54209D0AC422E46F5D105E020B14079844201D179 +:20DC80000020F8BD0120F8BD70B505462C6894F8200004280AD0022818BF00261FD11348B1 +:20DCA0004FF0FF3108F0F6FAE66918E00D480068806901460C488847000824BF4FF0FF305D +:20DCC000E061E669002094F8211084F8240003291CBF042984F82500284605F035F930465B +:20DCE00070BDC046FC010010010000809C1601202DE9F04706464FF6FE70708006F1040A4F +:20DD0000B081504607F0D7FB4FF0000801281DD110480788D0F80490C7B14446A50005EB3B +:20DD2000C4054D44287810F00F0F0BD0291D504607F024FE012805D16888B4814FF001088F +:20DD40003C467080641CA4B2A742E7DC4046BDE8F087C046DC0A0120B0B5154DD5F860012B +:20DD60004268002101209047D5F8600101680120884788B10F4C278817F0010704D14FF0F3 +:20DD80000120C4F80404208828688047012F04BF4FF08070C4F804040748084CD5F86C716C +:20DDA0000068183C6061386880472062B0BDC0468000001000A00C4030200940F00801205C +:20DDC000F8B5184D0C3DE97895F8334000273E4624E095F83200761CA042B6B217D0E86806 +:20DDE00061036A46042308F0D1FC009800F0FF00FF2803D07E2818BF7C2808D1A00000EB1D +:20DE0000C4004019B0F84C003F1A07F50057E978641C94FBF1F04843241AE4B2B142D8DCEE +:20DE20003846F8BDCC190020E1291CB528D10189154C491C89B20181E9B112480078F8B1B4 +:20DE4000943CB4F8941088421ADA002000F0F4F9B4F894206421414391FBF2F11A290FDBE2 +:20DE60000A49091F096859B1ADF80200ADF80020684688471CBD00202080012000F0DCF944 +:20DE80001CBDC04612050120E401012030070120F8B5184B1C780F2C25DA1F78E50005EBC3 +:20DEA0000415ED182C77FD0005EB07151F7803F11C06AD196860F80000EB071080191F7833 +:20DEC000C1601978F800CD0000EB071000278019876005EB01101D7880190774E80000EBA5 +:20DEE000051080194261641CE0B21870401EC0B2F8BDC046501A0020F8B5184C1548D4F8E8 +:20DF0000A86008F049FA1449054608680F6800F02000284007F460270DD066B10300C4F882 +:20DF2000B0600022304604F027FB04F1E0004FF4804108F01DFD17EA05000AD094F8411279 +:20DF400041EA504084F84102002104F58E7008F00FFDF8BD20000E000C10044068F200206E +:20DF6000F0B5184C00250526ADF1140D5D3401A80090294600220C23072004F047FC02AFF0 +:20DF800020460822394607F0D7F848B93846002107F045FD18B96D1C052DE8DB00E02E4630 +:20DFA000052E0CDA02A82146082207F0F7FD002031460C2201AB0190072005F069FA05B0EC +:20DFC000F0BDC046500101202DE9F843DFF85C900446904608AF8DF8001009F104003A79EB +:20DFE0003988006848F20605A5420CBF1025002500F8013B00F8011B0E1200F8016B002AB1 +:20E00000027008BF042605D0111DCEB2B968401C07F0C4FD4F462246684641463346FD70CD +:20E0200000F03AF80020F870BDE8F88328040120F8B5844640F6FF741CF8013B002210E047 +:20E04000481B401E10F8015B7F1E01F8015BF9D103E01CF8010B01F8010B521C5B08082AD4 +:20E06000EADA5808F5D21CF8010B1CF8015B05F00F07FF1CC5F30315122F45EA001508D1D1 +:20E080001CF8016B300A24BF1CF8010B60F3DF16BF19AC42D4D1F8BDF0B50E4617460446BB +:20E0A0001D4600210C22ADF11C0D04A8FDF796FE00208DF81900307A0F498DF8180030889E +:20E0C0004A68ADF81000207802F8010C48686B1C401E3A460090881C0190C878074902903E +:20E0E0000F20039004A8EDF78BFD10B92178491C217007B0F0BDC04628040120F40301201F +:20E100001649174A00200968A2F8AA00D1F8D41091F8313082F8AC3091F8241082F8AD1089 +:20E1200092F8AE1021F0200182F8AE1092F8AE1021F01F0141F0010182F8AE1092F8AE1001 +:20E1400060F3871182F8AE1082F8AF00054982F8B100097882F8B0107047C046140100204D +:20E16000580001200618002070B5154E154C706928B12068D0F8541206F11400884708F0C5 +:20E18000D9FBF1690A68002515710968F16108F051FD0D4A0D49107810B90846007870B146 +:20E1A000157008460570F8F71DFF6068C068007828B92068D0F8582428460146904770BD3E +:20E1C000B4180120140100206F1B0120711B0120F8B508F0AFFB164D164C2E782978012940 +:20E1E0000ED001272F7008F025FD6068C068007840B92068D0F8582400213846904701E0DC +:20E2000008F018FDECF7A6FC074608F093FB07B92E7008F00FFD6068C068007828B9206866 +:20E22000D0F858240020014690473846F8BDC046B20A01201401002002461648F8B507783F +:20E24000002137F0010710D1144833230C460579FF2D06D0078A27B1002A06BF0F44B9B2F3 +:20E2600004825B1E00F12400F1D10B4814234FF6FE75002430F81C6FB54206D0078B27B178 +:20E28000002A06BF0F44B9B204835B1EF2D10846F8BDC046E5040120800400202C100020FB +:20E2A000B0B54778144D17BB082095F85C4085F84A0034B91148016809B13846884706F043 +:20E2C00043FB104C601C0078012802D1384606F0E9FC0B48006868B1207D01280AD1287846 +:20E2E0004FF480414FF47A7208F0E3FAB0BD00204A352870B0BDC046500101200C0A012056 +:20E300000C030120E404012038B505462C6801206070207A042809D0022805D111484FF0D0 +:20E32000FF3107F0B7FF15E0002038BD0A480068806901460C48801E8847000824BF4FF021 +:20E34000FF306060002106486170044908602846FEF7FAFD606838BDFC01001088470240A4 +:20E36000030000809C160120030000802DE9F041DFF858803321044600274246107918B12F +:20E380000328BCBF7F1CFFB2491E02F12402F5D1B7B1022017FB00F000B2FBF711FE051CE5 +:20E3A0000FD0034633214046067926B1032EBCBF028823F8022B491E00F12400F4D101E065 +:20E3C0000025002727702846BDE8F0812C100020F8B50446A178032000EB4100C0B205465E +:20E3E000FBF7EEFD071C23D00146207801F8010B2088001201F8010BA0780870666876B102 +:20E40000491C002008E032780A7036F8022B401CC0B212124A70891CA2788242F3DC4520AD +:20E42000C4212A463B4603F0F3FF384603F022FB0020F8BD2DE9F041054690460C460C20D8 +:20E44000FBF7BEFD06460820FBF7BAFD0746FEB1F7B17C607D80B8F1000FB7600FD10020A6 +:20E460000C4C38706069314608F0CCFBE06940F00800E061A06908F0D5FBBDE8F08120468E +:20E4800006F06AFE384603F0F5FA304603F0F2FABDE8F08170F700202DE9F0410E46348875 +:20E4A000ADF1200D162C22DDDFF84C804703362CDABFA4F1160085B22025D8F800006A46C1 +:20E4C000641B2B46A4B2391908F060F90DEB050010F8011D962904D16419A0B230800120FC +:20E4E00006E06D1EADB2002DF2D1162CDFDC002008B0BDE8F081C046CC1900202DE9F04719 +:20E50000164E074630788A4600244FF01808B14603E099F80000641CE4B2A0421CDDFF2FC5 +:20E5200007D006F11C0114FB08F04518085C874209D0FF2FEDD108F011FB14FB08651C35C9 +:20E5400069688842E5D106F065FB6A69116821EA0A01116007F0E9FCBDE8F087501A0020BF +:20E56000F8B5174C2678002786B1221D12F8183F984203D1002301B101231374157C00230D +:20E580002F4318BF0123761E1F46EFD1A0784FB198B9012005F082F9022005F07FF9A078B4 +:20E5A000401C09E0012808D1012005F05FF9022005F05CF9A078401EA0703846F8BDC0467B +:20E5C000501A0020F8B5174C064604F13A0000880F46B04208BF012504D030460023FDF709 +:20E5E00043FF05463046002102F0C8FC618F814216D138460021FEF7F1F970B1817911F00D +:20E60000180F0AD04FF6FE71009102884388618F1046002201F0AAFD02E0384607F07AFC92 +:20E620002846F8BD500101200246F8B5084611464D68203822D0401E1DD0401E18BF6FF0CD +:20E6400001001FD18C6808F075F90F4E074630680069014620688847B0F1FF3FF7D100245B +:20E660006C64EC64286CAC63401EA864384608F0E1FA2046F8BD0021084601E0012100206F +:20E6800085F82D10F8BDC046D001001070B50E46054606F0BFFA044607F06EFF012DB6FB24 +:20E6A000F0F00ED0022D07D00B4B18B9186807F0C3FF0DE0094908E0094B0028F6D009497B +:20E6C00003E0094B0028F1D008490022FBF7BEFC204607F02AFC70BDF4050120B95802001E +:20E6E000F00501204D5D0200EC050120F55D020098B5174C2268D2F8DC00D2F8D8100768F1 +:20E70000D2F8E00009680068D2F8E024404290475FB12168E0310868026878688242DCBF8C +:20E72000801A78603F68002FF5D1226802F1E4000168D2F8E02009681368994204D011602B +:20E7400005F070FD2068E430D0F8F003804798BD140100202DE9F041164E0D460446002146 +:20E7600070682160C068007820B93068D0F858240120904708F0DEF880462946204607F093 +:20E78000B7F82F682A463FB161687868884203DC3A463F68002FF8D1146027602868844211 +:20E7A00003D13068D0F8D4048047404608F042FABDE8F08114010020F8B5174E054606F12D +:20E7C00014042878A978207068780822707540EA011070752979E878B778B07540EA8100C0 +:20E7E000C0B26979B07540EAC100C0B2A979B07540EAC110E91DB07506F1170007F0CEF90A +:20E80000032205F10F0106F11F0007F0C7F90E2FC4BFA87CA073F8BD50010120FEB5057CAE +:20E82000012300221C460EE000EBC206367F770806D316F00C0F03D0F60828BF002300E0A6 +:20E840000024521CD2B29542EEDC077AAFB9012C18BF012911D141798DF80310012404721B +:20E860008DF80830C788ADF80670817A8DF80410684607F028FE2046FEBD0020FEBD10B551 +:20E88000044600211322ADF1180D6846FDF7A6FAE01C10F8014B07F0C3FE0146204605F029 +:20E8A00027FC002804BF01208DF8000010D0002104888DF8001082788DF8014001AB8DF891 +:20E8C000032021128DF80210C11C184607F066F965204A2113226B4603F09AFD06B010BDD7 +:20E8E0002DE9F0410446D4F8A8501F461646884605B1A84704F1A00003C806400F4008BFD3 +:20E90000002E1CD041462046802203F017FE04F1B00181E8C00058B100F1200106C900F19C +:20E920002003BA43B14383E80600D4F8A81081600020C4F8A80004F1500008F011F8BDE87E +:20E94000F081F8B5044608F011F80746A6686068790805460CD300F5D47006F05DFD696B23 +:20E96000286BEB686A6B401A2863296B20469847B80816D305F2A91006F04EFD3168886BF8 +:20E9800020F0200088633168086B20F480700863286A696A2B696A6A401A2862296A204637 +:20E9A0009847F8BD70B50646356807F0C3FFA978F9B90021697008F03DF90F4800F10801B0 +:20E9C0000968090824BF4FF0FF3169600B4901603046FEF7B9FA287A022806D02C696968BF +:20E9E0006A696B7A3046A04770BD054807F0B8FF70BD08F01FF970BD8847024003000080DC +:20EA00009C1601207FB507F095FF114C06462078012818D0684607F0AFFC00254FF0FF302F +:20EA200027216B4601900C4A0A488DF8085003F07FFB0B48012105F0ABFA0848294605F097 +:20EA4000A7FA01202070304608F0F4F800907FBDBA0A0120AC190120AFAD01009C16012043 +:20EA60004C16012070B5154C054694F84A000E46ADF1200D042814BF0828C2201BD0E56408 +:20EA8000684600211C2284F85260FDF7A7F901208DF804000223009500218DF805600848E8 +:20EAA00084F84A3042788DF80710022A08BFC1706846FDF735FB08B070BDC04650010120B7 +:20EAC000E404012030B5164C05466068ADF11C0D18BB0820FBF774FA6060002808BF1020D2 +:20EAE0001CD0296801602979017169794171A9791C22817168460021FDF770F900228DF86B +:20EB00000720286800902C798DF805406B798DF804306846FDF704FB00E0012007B030BD5C +:20EB2000FC090120F8B50D46064606F073F804462946304606F010FC071C08BF022519D0D7 +:20EB4000386808F057F8384608F050F80C4901F108000068B84207D000E0084601698F421F +:20EB6000FBD13969016101E038698860384602F081FF0025204607F0D8F92846F8BDC046EF +:20EB8000380A01202DE9F0418046154800684068124F46688568C468B8F1000F0AD0002DB1 +:20EBA00008BF002C03D03846503007F005FC36B1F4F7BDFD1EB1B8F1010F00D0B047002D91 +:20EBC00008BF002C08D007F069FA05B1A84704B1A047384606F00CF8BDE8F0810100070633 +:20EBE0006CF20020F8B507461248012416460D4604700820F8F7CEFB022004F04FFE312067 +:20EC0000394607F09FFE0C490320012D486019BF086820F00300086840F00300074A0860DC +:20EC2000106800683146034600200246984704480460F8BDAD0B01200C800240CC01001004 +:20EC4000A80250422DE9FF41154D8046281D066811480F461446414606F090FE002804BF49 +:20EC60000F214FF6FD7002D00C48022100888DF80810ADF800004146304607F041FE6946BD +:20EC8000002200F8017B0A2304702846FFF704FA0090BDE8FF81C0461C030120E0030120DC +:20ECA0002804012098B5154CE768014697B11448001D006800693B78007883420ADC7A7869 +:20ECC000D218824206DD7A68C01AC0B210568842B8BF011C07480068026EA068904700901B +:20ECE000054A00996FF39F518A4214BFA0614FF0FF3098BDD8050120FFFF3F00A406012071 +:20ED00001401002070B5164C05466068C068007828B92068D0F8582400210120904707F0C7 +:20ED200009FE2268D2F8D810D2F8F82406462846904730B92268D2F8DC10D2F8F82428469C +:20ED400090472068D0F8E8000068A84203D104F003FBFCF745FB304607F06CFF70BDC0464E +:20ED60001401002098B5164C2068D0F8E800002101602068D83001680F68A7B181687A6862 +:20ED8000096891420FDD04F035FB2168D8310A6812685368984202DD506008680268086932 +:20EDA00002602068D83041680F683FB10169086818B140687A68904200DD0F6098BDC046AB +:20EDC0001401002015492DE9F041804691F8270000280CBF00200120114F81F8280017E0B7 +:20EDE0007D887E6820462946324607F097FC70B9B8F1000F06D120462A460021334607F032 +:20EE0000CFF904E020462946324607F08DFC08373C88002CE4D1BDE8F081C046E404012070 +:20EE200064750200F0B514461D4610270246ADF1240D264601AB16F8010B7F1E80F03600D2 +:20EE400003F8010BF7D10B46009501A80121EDF7A3FE05A82946102206F0A0FE102001AAF0 +:20EE600014F8011B401E81F05C0102F8011BF7D1009501A8012105AA8023EDF78DFE09B086 +:20EE8000F0BD03B480B502AF39780020012908BF01207978012908BF40F00400B9780129D4 +:20EEA00008BF40F00800F978012908BF40F010003979012908BF40F020007979012908BFDB +:20EEC00040F04000B979012908BF40F08000F979012908BF40F48070BDE8804002B070479A +:20EEE0002DE9FC4180461348457990F820400E4603208DF80100684606F0AEF8071C16D0A8 +:20EF000038690B2100F8011B00F8015B04700125BD7706F013FE7862A7F802807D773E6258 +:20EF20000548BD76002101703846EBF791F9BDE8FC81C046E4040120E4020120F8B50546A5 +:20EF40000820FBF73DF8071C21D02878C01CC0B20446801C05F0FAFF786020B9384602F06B +:20EF600089FD002713E07868FE210170786822462946401CF9F7CAFF7E682146701C06F0E6 +:20EF800051FFA119487000263E70A31C7B80284606F0E2F83846F8BD2DE9F8431446884637 +:20EFA000064600229946F189B0890092727A337C401A80B2054604F063F8071C14D10C48A2 +:20EFC000B28900684544A9B20B199A4205DAF089A042ACBF0627052706E0327C234601EBC3 +:20EFE00042314A4607F0D2FB3846BDE8F883C046CC1900202DE9F047144D80462878002766 +:20F000004FF018093C4605F11C0A19E014FB09A63178884512D106F1080004F096FE07460E +:20F02000B06828B920464FF40041FFF767FA04E020464FF4004100F00BF82878641CE4B21F +:20F04000A042E3DC3846BDE8F087C046501A0020154A2DE9F84F0F461178804600244FF022 +:20F06000180A032002F11C06914618E014FB0AF5725D904511D105F0CDFD83467119486910 +:20F0800002683A430260C86808B107F0CBFD584606F04BFF99F800100020641CE4B2A142E7 +:20F0A000E4DCBDE8F88FC046501A002038B54FF0FF3006F0C1FF05460F4C1049A06A8142F7 +:20F0C0000FD10F4904F16000002205F094FF022084F8240003F082FC18B9F9F7DBF8EDF74E +:20F0E0006DFC0848284205D004F1E0004FF0005107F03EFC38BDC04668F20020855C00002C +:20F100003538010002000040B0B5154C0146C820002522465388994205D0401E02F10802D7 +:20F1200005F10105F6D1C82D17D14FF6FE70884213D1083CC821002514F8087F27B1491EAA +:20F1400005F10105F8D10834C82D06DA6080606818B102F08FFC002060602846B0BDC0462A +:20F16000EC09002010B5154CA06830B3C16C19B1084602F07FFCA068416C19B1084602F0F8 +:20F1800079FCA068416919B1084602F073FCA068C16919B1084602F06DFCA068416B19B1AC +:20F1A000084602F067FCA068C06B08B102F062FCA06802F05FFC0020A06010BD3C050120CC +:20F1C0003EB5154D044628464368197041684A70207A022818BF0F2816D121884FF6FF7075 +:20F1E000884205D0C21E8A4202D0801E88420BD102238DF8083007F0E3F969463622ADF84D +:20F2000000002846FEF748FF2846214636220223FEF742FF3EBDC04628040120DFB5171CA7 +:20F220000C46064626D02EB340F20110002110226B4606F0B5FF04F00F0438460DEB0401E6 +:20F24000C4F1100206F0AAFC381B69462246103006F0A4FC7F1E3046082617F8012F017812 +:20F260003C7A5140397010F8011B761E81EA04013972F2D10090DFBD2DE9F84384680D464C +:20F2800003F02EFA174600BB246801F007FF64198046002F08BF00250FD00D4E07F04AFBE4 +:20F2A0008146204606F0B8F90546484607F0C2FC1DB930683F1A0444F0D1404605F080FB26 +:20F2C000002D14BF4FF0FF300020BDE8F883C046041B012030B584684568ADF1140D204697 +:20F2E00005F0F6FA2168486820F0020048602168486920F00F00486120680321016202A87B +:20F3000007F00AFB09480068D5F8E42001680092D5F8E8000190206895F8F93095F8FA2041 +:20F320000C460399A04705B030BDC046C4010010B0B5124C0546802D03DD2068D0F84C053F +:20F34000804707F0F7FA0F4927680D70D7F8B8100F780B4917B90F783FB90AE00F7837F041 +:20F360007F0702D108490F781FB107F063FC0120B0BD07F05FFCF9F7DFFCB0BD14010020E9 +:20F38000741B0120A40601206A1B0120B0B5124C0546802D03DD2068D0F84C05804707F052 +:20F3A000C9FA0E4927680D70D7F8B8100F780C4917B90F783FB90AE00F7837F07F0702D174 +:20F3C00008490F781FB107F035FC0120B0BD07F031FCF9F7FFFCB0BD14010020A406012053 +:20F3E000741B01206A1B0120154838B508300168D1F8D40090F85300D1F818148847042864 +:20F4000014BF40F6387443F66C4405F003FC054607F0B2F8074A084B127821464A430749FC +:20F42000B2FBF0F00022FAF711FE284606F07DFD38BDC046D8000020F8050120B953020020 +:20F440000C0100201CB50E21F8288DF8001023D1124CA268D432116891F8840050B991F94F +:20F4600042000E2815D0D2F85C23E02069469047A2680DE014208DF8000091F942001428A8 +:20F4800007D0D2F85C23E0206946904708342268D432D2F8F80280471CBDC0460C01002063 +:20F4A00038B5044614F8010B15462870207800F00F00687014F8010B0011A870207800F0D2 +:20F4C0000300E8702078C0F3800028712078C0F3C300687114F8010B08222146C011A871F3 +:20F4E000E81D06F05BFB0834032205F10F00214606F054FB14F8030FA87438BD154808B560 +:20F500004178022922D1007800BB4FF6FF700021F0F744FA012040F6B831F8F771FC082023 +:20F520004FF4DC71F8F76CFC10206421F8F768FC2020F8F765FC4FF480504FF47A71F8F71C +:20F540005FFC034A3520282107F0EEF808BDC04630030120E40401202DE9F0474468894698 +:20F5600004F5B27007F0E0F9DFF844A0677F257FA66907F001F8804606F0FEFFED19ED1D93 +:20F5800004F5B2744946AAB251430AFB01F1B1FBF6F164314144491EB1FBF0F1491C20466A +:20F5A00007F0BEF9204607F0BDF9BDE8F087C04640420F00154909681E280ADC1E2819D0AD +:20F5C0000C380FD00A380FD0001F0FD0C01E0FD01AE0243810D0001F10D0401E10D0801E1B +:20F5E00010D011E0086870474868704788687047C8687047086970474869704788697047E6 +:20F60000C8697047086A7047002070477CFF002010B5044600210C22ADF1180D6846FCF7A5 +:20F62000DDFB6089ADF80000207A8DF80400207B8DF80500607A012814BF012021208DF85F +:20F6400002006846F3F7B6FA9DF8140050B903986168227A406C06F0A1FA684602F00AF9CE +:20F660009DF8140006B010BDF8B507464FF6FE703E78B881002006B3104E328875680446AA +:20F6800019E0A10001EBC4016B5C13F00F0F10D13878685478886D18391D6880281D06F0EC +:20F6A00019FFBC81284606F05AFF3288756801201446641CA4B2A242E3DCF8BDDC0A0120F1 +:20F6C00090B5ADF1140D07F0EBF8071C08BF002410D001248DF800407888FF212422ADF869 +:20F6E0000C003846FCF77AFB802087F82100684603F0FCFF0020042104F0D2FF332805DAF8 +:20F7000004480121401C0170FBF752FB204605B090BDC046FC09012003B40021F0B505AFAA +:20F720003846ADF11C0D01AAFCF70AFC002818BF002015D10D4C2069FAF72CFE002506466D +:20F740000095E18E94F8330001AA0323F0F7D6FB08B9BDF8125020693146FDF70FFB284619 +:20F7600007B0BDE8F04002B07047C046C019002038B5134D95F83901002410B911480078C3 +:20F7800060B107F0D7F895F83B11002906BF012185F83B11012407F04DFA0CB1002038BDAB +:20F7A000022004F07BF80E20F7F7F4FD05F09EFA01280EBF0120002085F83A0138BDC0463C +:20F7C000501800203E860200144BB0B511F1800F43EA0202C2F3150208BF071C19D090F92D +:20F7E000004000277F2C0FD00546D5F801406FF39F54A34208D095F90040A14204DB15F90F +:20F80000054F7F1C7F2CF0D137B107EB87077F1F3F18D7F80100B0BD1046B0BDFFFF3F00F3 +:20F8200038B507F087F80E4C05462078012813D00C480D4A3121002302F07AFC0B480C49EC +:20F840000422082306F05CFC0A4A4FF0FF300121FFF7C8F901202070284607F0EBF938BD7F +:20F86000AC0B0120581901200D920100741901204009012080A903003EB515460C4602AAEE +:20F8800004F0F4FB002818BF012020D1BDF80800694604F001FC009850B9684603F0C0FC19 +:20F8A000002818BF112012D1BDF808000099088020462946FAF774F8204601A905F00CFD17 +:20F8C00010B9019801210171FDF7FEFC00203EBD4EF68851CEF2000108684FF0F00340EA7F +:20F8E000034008600C4885460C4885446F4607208743BD460A486F4607600A48002803D0BD +:20F900007946491D8E460047F8F7EEFF06F0EEF907F01CF9FEE7C046003A01200006000096 +:20F920009C0B0120E1690200FEB506461248B5680078124C8DF8000003E0686A08B106F07E +:20F9400049FB2188304606F078FC6846012100F025FD01A8012104F023FC218807463046AE +:20F9600006F074FC002F18BF381C04D19DF804004008E2D20020FEBD66800200101B01204E +:20F9800010480078A0B91048007888B90F48007870B90F48007858B90E48007840B9064840 +:20F9A000007828B90548007810B90548007808B10020704701207047B20A0120B30A012078 +:20F9C000B40A01206F1B0120711B0120741B01206A1B0120701B012038B5044612480078E5 +:20F9E0000D4640B1114960893A310988814203D101F086FD38BD60890021FCF7EFFF60B188 +:20FA0000807910F0180F08D0688E00906189627F2B8DA08900F0AAFB38BDA08961890022FD +:20FA2000FEF7D0FD38BDC046F504012050010120FEB5144C154604F12C0217681E46FFB159 +:20FA40003A69EAB101228DF80020BA6AADF80200002AADF8041008BF002003D09DE80300B0 +:20FA60009047E76A854208BF00200AD03C699DE803002A463346A047012808BF0A2000D0EF +:20FA80000920FEBDD4DB00202DE9FE43134C06462068984617460D4607F054F88146294622 +:20FAA0003A463046FCF7A4FC07462068494607F045F85FB90848006800900196054C029546 +:20FAC00021880022DD23404607F034F83846BDE8FE83C0466473020028750200007302001B +:20FAE00098B50446A1682079FFF7B2FA207B00BB206807F07FF80F498868A04207D000E0FE +:20FB0000104602699442FBD12269026101E020698860C86800222261CF6817B9CC6004E056 +:20FB200010460269002AFBD1046108784968FFF78FFA98BD380A012038B5054600211420B4 +:20FB400006F012FC00240A20002106F00DFCC4F1070045FA00F1092001F0010106F004FC35 +:20FB60000A20012106F000FC082006F09CFE641C082CE8DB0A20002106F0F6FB1420012190 +:20FB800006F0F2FB4FF42F7006F08DFE38BDD0B504680E1C174622D00FB302F0FDFBA0680C +:20FBA00006F0C2FE4FF6FF70B84205D0B7F5004FA8BF47F6FF777800A4F85800701005F016 +:20FBC000D4FCA4F85600A068B4F8561006F0A8FEA06806F0A7FE022084F85000D0BD05F09A +:20FBE00093F9D0BD7FB506460020029008981D46009002A801903046FDF7D5FB0446012C3B +:20FC000003D12846314604F028FF022C0CD102980268006820B92846314604F00BFF03E0FA +:20FC20002846314604F006FC042C03D12846314604F000FF204600907FBD1FB5044600219C +:20FC4000AB200DF1060200F00FFD05F077FF01460DF1060005F092FEA8B120460DF10601D8 +:20FC600004F0D5FE88B10DF10600694605F034FB18B90098007930B907E00DF1060001A94D +:20FC800004F056FC08B9012000E0002000901FBDB0B505462C680F4606F04CFE104909781D +:20FCA000012901D1217819B106F0C4FF0020B0BD0121217006F0BEFF07B9084F38782072E0 +:20FCC000786820613878022814BF0020B868E0600B20F7F75FFB2846B0BDC046C8860200F2 +:20FCE000BB0A012010B503F019FD114C14202146491CFDF70DFD0A202146FDF709FD092041 +:20FD00002146FDF705FD0B490820FDF701FDB920FFF712FF142004F08BF80A2004F088F8EF +:20FD2000092004F085F8082004F082F810BDC04600620020022000200246134898B570306C +:20FD40000168476D01F00103002007F004071F4318BF0120930802EA000006D301F00204BE +:20FD60000023204318BF01231846D20806D301F004010022084318BF01221046002814BF43 +:20FD80000120022098BDC046D02008402DE9F043171C0D464FF00009ADF1240D19D0DFF8E7 +:20FDA0003C804603202FACBF20243C1C4046006871196A46234606F0E9FC484669462246D7 +:20FDC00005F0BAFA3F1B2D19BFB2ADB28146002FE8D1484609B0BDE8F083C046CC190020F1 +:20FDE00010B510481249104A006800F00F0083025C1E08461360E1430160012004F0DEF89A +:20FE0000044606F097FD094A116831B106F012FF34B1204606F028FC10BD146006F00AFFB4 +:20FE200010BDC04630240340041B0120001B0120081B0120084608B500F0005100F0040058 +:20FE4000084316D00B480068016801208847012808D006F091FB3221B1FBF0F1064806F0B6 +:20FE60006FF808BD0549064828310860054806F0A3FA08BDE0010010C0F3002068F2002016 +:20FE8000855C0000601A0120F0B5134E00274FF6FE75ADF1140D06F07EFC0446301D0088B3 +:20FEA000A042F8D006F07AFBA042F4D0204601F081FD0028EFD1002CEDD08DF80070ADF847 +:20FEC00002406846FBF7C4FF0028E4D1A542E2D0204605B0F0BDC04686010120F8B50D4691 +:20FEE000044606F027FD06466768A0682946874205D1304606F09EFE4FF0FF30F8BDE568F5 +:20FF0000A26923686D1CB5FBF7F078432D1A05FB0230F8F7FBFFA0686169E560401CA0609B +:20FF2000814238BF6061304606F084FEA068F8BDB0B5171C0C460546ADF1280D19D0104852 +:20FF4000B9680068884204D8B1F1FF3F18BF002014D1684600212822082306F0E7FDFA6836 +:20FF60000792386804907B680593B96806916A4600E000222846214605F01CFD0AB0B0BDC5 +:20FF8000D07302002DE9F041124D04462869082204F102084146801C05F0CEF818B12C6936 +:20FFA000E068286111E02F69002657B1FD6841460822A81C05F0C0F810B92F1CF6D100E077 +:20FFC0003E462EB1F068C068F060204601F052FDBDE8F0816806012070B50646B568296884 +:20FFE0007468486820F002004860204606F0A0FCD4F8CC0002F057FF04F1300006F0B2FC1A +:020000040002F8 +:2000000094F8F80018B904F16C0006F0A7FC304602F08CFD287BF6F725FF04F11C0005F0E6 +:20002000ABF8002084F8FD0070BD7047F8B506464FF6FE7000217080301D06F04BFA3046E5 +:2000400004F006FB351D0746012F13D1B0890A4B840004EBC004181D006824186088708082 +:20006000241D204605F027FA012803D12846214606F030FA3846F8BDDC0A012011482DE928 +:20008000F041076800260760B7B1DFF83C800124D8F80410B7FA87F0C0F11F0082008D58D0 +:2000A00004FA00F39F43002D08BF1E4302D08958C0B28847002FEBD116B1304600BF00BF7E +:2000C000BDE8F081E0200240E8860200F8B5124C06466069002710B1804700B90B27206915 +:2000E000BFB9FAF757F927780546381C0DD1E08EC0F5005000B2864203DC002E18BF04272F +:2001000003D10020E8F7A0FB677820692946FCF735FE3846F8BDC046C01900203EB5044605 +:20012000104800224FF6FF75052130F8043F9D4201D09C4204D0491E02F10102F5D13EBD7B +:20014000052A0DDAFF210422FBF748FE064D0220ADF8004029888DF80800684604F07FF959 +:200160003EBDC0462C010020980101202DE9F041044698460D46101C06AF17D1084600217D +:20018000FCF72CFC061C17D0B079400814D3388841462246F4F7D0FD4FF6FE7181420BD02A +:2001A000708028460C222546044600E00B22204629460023FCF758F9BDE8F0811CB5044684 +:2001C0003A220120694606F09AF9E0B99DF80000A04216D001200DF101013B2206F08FF978 +:2001E00088B99DF80100A0420DD19DF800009DF801108842A8BF3B2007DA9DF80100F8F73B +:20020000D3FA3A201CBD4FF6FF701CBD08B58DF80000022004F0E8FDC8B90E480068D0F80D +:200220003403804798B1E120694601F0C3FD01200DF101018DF80100522001F0BBFD064806 +:2002400000220270104605F0A1FF104608BD012008BDC04614010020C60A012038B5046899 +:2002600094F83000042808BF0F4D17D0022805D001280CBF00204FF0FF3038BD216A04F196 +:20028000340006F007F80DE0012006F00CFB281F006810F0030FF7D0F8F7B8FFA06A616A27 +:2002A0008842F1D8E06A38BD0C8002401CB5002004F032FC06F084F9044605F03FFC014657 +:2002C0000C4802780023204602F0C0FB002004F023FC0948417802290AD1007D012807D159 +:2002E000684606F0B4FA06F059F96946FEF7F8FD1CBDC046521A0120E4040120F8B5124C4B +:20030000074604F1080005680E46281C09D001798F4202D1C1888E4213D0054600680028C0 +:20032000F5D10820F9F74CFE002808BF102009D00771C68000210160A16800290CBFA06060 +:2003400028600020F8BDC04628040120114910B50446887808B1886A10B900208870486A46 +:2003600005F080FA0C484178C06B38B9012C14BF052003200021E7F7FFF810BD012903D1DC +:20038000012C18BF012100D100216420E3F77AFD10BDC04668060120E4040120F0B5124C02 +:2003A000074600250E46ADF11C0D2068029577B90121009106AB01933A788DF8182069464B +:2003C00006F007FA48B1761E0AD07F1C206800960197694606F0FDF910B94FF0FF3000E0BC +:2003E000284607B0F0BDC0460C1B012098B506F0A1FA04460D48007898B90D490F78012099 +:2004000037F07F0707D10B490F7837F07F0702D109490F781FB180F00100C0B208B102F0C5 +:20042000B5FF204606F006FC98BDC046701B01206F1B0120741B01206A1B012038B5124C57 +:2004400022680546D2F8EC0050F82100D2F8E01008602168D1F8E41008600A480068A84234 +:2004600003D82068D0F84C058047280803D32068D0F84C05804706F05DFA06F0DBFB03F0BF +:20048000D1FE38BDE000002014010020124AB0B5032311464C88A04208BFC52015D05B1E65 +:2004A00001F10401F6D1114603234FF6FE754C88A54208D05B1E01F10401F8D1111F032228 +:2004C00011F8047F27B94880002004220A70B0BD521EF5D1C720B0BD240301202DE9F0479C +:2004E000114E00258A460746A846B8F1000F18D16C01A4EB8504A01900F10209484604F010 +:20050000DAFF58B1305B874208BF48F00A085146484605F033FA08B148F0A0086D1C142DEA +:20052000E3DB4046BDE8F0879C040020F8B5124C607801281CD004F5C27600204FF4405778 +:2005400031467F1E41F8040BFBD1E82131604BF6FC75A851A5F1E801C6F8E81006F1E80119 +:20056000A160F9F72DFDE060A6600120607025614BF6BE20F8BDC046501A00207CB5124CB0 +:200580000346E06A16460025E0B18269D2B101228DF80020826AADF80230ADF8041082B1D1 +:2005A0009DE80300904760B1864208D1E06A82699DE803009047012808BF0A2502E00C2564 +:2005C00000E0092528467CBDD4DB002030B500240822ADF1240D214605A88DF81C40FBF7AE +:2005E000FDFB05A807A96A46FBF77AFB05469DF81C0078B1684621461422FBF7EFFBFF2024 +:20060000294614226B468DF81000042002F040FF204600E0012009B030BD98B5437B0A4632 +:200620000021042B1ED1077CE7B94769D7B1387810F0030F16D150687C7B437DA34211D141 +:2006400012887B899A420DD1C288BB889A4209D18278BB789A4204D0007800F00C00042882 +:2006600000D10121084698BD38B5104C15466269E368A488A13816D0401E0AD0401E02D0D7 +:2006800008380BD038BD0A48006868B18047044609E04AB108462946904738BD284619462C +:2006A00006F02EF938BD2C8038BDC046E00601202809012010B5104CA41EA07898B10120C3 +:2006C000207004F0E9FDA178FF2910D000200B4BA070A3F13E0000784FF47A724A43802162 +:2006E00006F0EAF803E00020207004F0D5FD4120214601F05FFB10BDFE0901208E01012011 +:200700001149C8B570310A684E6D410806D302F0010106F0040600270E4300D00127810825 +:2007200005D3002117B1930828BF01210F46C00805D3002017B1D10828BF01200746002F1A +:2007400014BF01200220C8BDD020084030B5104CDD214FF4806204F19405ADF13C0D28467F +:20076000FBF73CFB00213C220823684606F002FA4FF480600023074908906A460795042068 +:20078000069004F1440006F0F1F90FB030BDC04670F70020D18D000038B5491D04468DB237 +:2007A000294604F099FC20F0020029460246204604F04EFF0A480C21493014FB0105287824 +:2007C00060B12046022104F087FC20F0030002210246204604F03CFF0020287038BDC04642 +:2007E000C0190020F8B505460F1C08BF05201CD00E4C2078C0B1241D14F8181F8D4211D16D +:2008000004F008FA0646394604F1080003F0B4FA28464FF40041FEF71BFC304605F085FB90 +:200820000020F8BD401EE7D10320F8BD501A0020042870B51ED1104D05F5AC70064605F077 +:200840007BFDB8B105F098FE0446304606F066F86043B0F5967F0DD2304606F065F80520EE +:2008600003F01CF82846012180F831100421E03006F07EF8002070BD68F2002098B5114C16 +:200880000146323C94F82C000727C0B90846B4F8481000F089FF011C11D094F83100012896 +:2008A00007D1887804F085FB49788142A8BF081C02E0887804F07DFB071C08BF07273846F9 +:2008C00098BDC0468201012070B50E46044606F031F8A16805463046B1B1A26923692168EB +:2008E00002FB0311F8F712FB2069A1686368401C491EB0FBF3F2A1605A43801A2061284614 +:2009000006F098F9A06870BD284606F093F94FF0FF3070BDF8B505466C68AE6806F00AF8B6 +:2009200031680746886B20F4FA60886304F5D47004F072FDA06B18B9384606F07BF9F8BD6C +:200940000022616B206BA263401A2063384606F071F9E068216B626B034628469847F8BD72 +:20096000FEB5104D6C682079F6F714FD05F0E2FF2E680746307880B9684605F0FDFCA079AD +:20098000094A0190617900956B46301D01F0D0FB01203070284604F003FF384606F04AF96E +:2009A0002846FEBD1C8802000568020038B5044605F0C4F80146A01C04F0E0FFA51C012851 +:2009C0000BD00B48007830F0010010D12088A27AE37A2946F3F7E6FE38BD064854300168E1 +:2009E00011B12046884710B9E07AF6F79DFE38BDE5040120C40301203EB50546AC690421F6 +:200A0000204604F067FD241D009014F8010B01218DF8040022788DF805108DF80610084865 +:200A2000C1700271022180F82E106988C184697C81706846FEF746F808B102F09FFA3EBD0D +:200A4000C4030120BCB501468A695078177807EB00270D480088074015D0487C0B4D8DF8E9 +:200A60000000686800243A12032300F8014B891C00F8017B1027027048F215026846EF70AC +:200A8000FDF70AFBEC70BCBD581A01202804012010B5002104461822ADF1180D217268463A +:200AA000FBF79CF90B226846214605F077F808220DF10B0004F10B0105F070F8A08AADF8A9 +:200AC0001400A07D8DF8160003480068D0F81C126846884706B010BD1401002030B505463C +:200AE00010484830048800213C22ADF13C0D6846FBF774F902208DF80C00ADF800508DF8FA +:200B000008003121ADF80A400DF10E0003F025FD03480068D0F88812684688470FB030BD2D +:200B200014010020500101200EB510200DF102018DF802005A2001F03DF94FF4FA70694696 +:200B4000ADF80000552001F035F903200DF103018DF80300592001F02DF909208DF804006D +:200B600003480068D0F8302401A9E02090470EBD140100204FF6FE7190B58142ADF1140DAA +:200B80001AD00E4900270E2201E07F1CFFB24FB917FB02146378012BF7D0002BF5D16388B6 +:200BA0009842F2D1012F07D1ADF80C00042168468DF8001002F09AFD05B090BD22010020A9 +:200BC000F8B506460F4D104F7388002417E0A20002EBC402921951689068D26852B9AF4264 +:200BE0000BD00A7855F822200346491C08461946904701E0F8F78AF97388641CA4B2A342CE +:200C0000E5DCF8BD408D02004C8D020010B505F091FE0C49097879B90B49097861B90B4920 +:200C2000097849B90A49097831B90A49097831F0020108BF012400D0002405F0FBFF204646 +:200C400010BDC0466F1B0120711B0120741B01206A1B0120701B0120114980B50B68071C42 +:200C60001DD0181C0DD00022874204D0024640680028F9D105E0834219BF40685060406853 +:200C800008603868006A00F0F5FE386800F0F2FE786908B100F0EEFE384600F0EBFE80BD75 +:200CA000E40A0120F8B503F0B5FF104900252F463E462C46CB68486012E0110809D21FB94F +:200CC00014461D4601270AE02968A4188918296005E082F000420027B44288BF261C9B18DC +:200CE0001A68002AE9D105F020F9F8BD501A002090B5114C2468ADF1240DBCB1276AAFB1E6 +:200D000001248DF818400424ADF81A400024ADF81C400091019202930C9A039206AB04904C +:200D200093E8030022461423B84708B10A2000E0204609B090BDC04600DC002010B5838995 +:200D40009A0002EBC3020E4B1B1D1B6801291A44144618BF02290AD14288022962800BD1C1 +:200D6000001D04F0A8FB08B90020207004E0121D011D104605F0AEFB204605F0F0FB10BD16 +:200D8000DC0A01200E49086820F0020040F4087008600C48032140F8041C41F2300181604A +:200DA000012101605022826001604FF4CA62826001604FF486528260016003480160704788 +:200DC000000004605860044000410440F8B505466C68082004F0BAF8071C12D001203870C6 +:200DE0002078C01CF9F7ECF809490E68786040B122782146D21CF8F789F8F0B23946FFF7A4 +:200E0000F1FC686804F0A8F9284600F033FEF8BD7CF700202DE9FC470F4C8046606900273F +:200E20001D4692460E46B94608B1804758B157B904200090E06806EB48312B46524605F027 +:200E400065FB814600E00B27B9F1000F48BF01273846BDE8FC87C046C01900202DE9F04185 +:200E60000746B86840681C460D4690462919884238BF6FF0030010D3094E30684FF0FF312C +:200E800005F008FA3846294642462346FAF7EAFE0446306805F064FD2046BDE8F081C046EA +:200EA000141B01200E4A98B512780F460446012A01D003F02BF80B480078A0420CDD07B9AC +:200EC000064F09480C2114FB01F140588069394602462046904798BD002098BD78880200ED +:200EE000B10B01205C830200A08502000F49A1F1240000688008FAD30D48001F006801283D +:200F000019BF0122111C20210122074840F8251C002340F83D3C0823C0F8FB3FC0F8FF3F96 +:200F200040F83D2C7047C0463D400C407C600C409019002098B505F0FDFC0446F9F73EFBEB +:200F40000D480021001D0170032002F08FFC204605F070FE074CA068014602208847074644 +:200F6000102001F053FE1FB1A06801460320884798BDC046308602008419002010B504460F +:200F8000C8090FD20E48007830F0010008D1204605F059FC20B1007901280CD002280AD0D4 +:200FA000204610BD2146FF2003F0A2F8002808BF4FF6FE7001D00148008810BD8A0101202E +:200FC000E50401202DE9F84307468C4616469E460020B7B1DFF83090044676B10CEB440587 +:200FE000F046324638F8021B2B88994203D129F81010401CC0B2521EF4D17F1E04F10104B9 +:20100000EBD1BDE8F883C0465405012038B50178012914BF00250825411C8078012814BF6E +:20102000082009200B78C0F16C00C4B22BB1052004F0FCFD241A0D3CE4B20548007820B1A8 +:2010400004F0F4FD241A0E3CE4B2641BE0B238BD800101202DE9F84F0F4E00249046824669 +:201060004FF00E0B274603E0641CE4B27F1CFFB2002F18BF00200DD117FB0BF5705D8245BC +:20108000F4D1AD19284603F01FFE0028EED0A045EADC2846BDE8F88F22010020B0B54FF035 +:2010A0008054D4F8D8010E4D80680146284688472A1D116804F5EC74C7B241F0300111608B +:2010C00067B1206840680021024628469047206880680146284688470028F8D13846B0BD4A +:2010E00000400340BCB50546FEF71EFC002818BF4FF0FF3017D10C4CC72021888DF80000E0 +:20110000284605F09AF868460121FFF747F921880746284605F09AF8002F18BF381C02D1BC +:201120002846FEF701FCBCBD101B0120104A98B5D768C7B10D48006800690078FF2810D087 +:201140003B7883420DDC7978C918814209DD79681778C01AC0B20C56F81AC0B208568442ED +:2011600001D0012098BD002098BDC04618010020A406012070B5054605F0DCFB0E4C226889 +:20118000D2F8D810D2F8F82406462846904730B92268D2F8DC10D2F8F8242846904720684A +:2011A000E83001680968A94202D1D0F8F0038047304605F03FFD70BD1401002038B50446BD +:2011C0000D46142003F0C2FE011C0BD00C2008708C7000248C730A4B4D701878FFF702FB85 +:2011E000204638BD204604F091FB38B106214173007B02F06BFB2046FAF7BCFB102038BDE4 +:201200005001012098B505F095FB0446F9F7D6F90028FBD0032002F029FB0A49002008706A +:20122000204605F007FD084CA0680146022088470746102001F0EAFC1FB1A0680146032025 +:20124000884798BD881900203086020038B58168096844688969080916D305F08DF94FF454 +:20126000FA75B5FBF0F0012898BF012103D905F083F9B5FBF0F104F5B274204605F050FB2A +:20128000204605F04FFB38BD04F18800022105F06FFB38BD70B50D46044605F04BFB6668F5 +:2012A000A1682B468E4204D105F0C4FC4FF0FF3070BDE1682568491CB1FBF6F27243891A98 +:2012C0004B55A2686369E160521CA260934238BF626105F0AFFCA06870BD38B50546297DA5 +:2012E000032905D002291AD1808905F0ACFA03E005F10C0005F0D4FA041C10D0687860B19A +:20130000F12818BFE12804D1A079012801D105F023FBA07918B1401E00E00020A07138BD92 +:2013200090B50F1C4FF00004ADF1340D18D00168086AA8B1C97F6A46F1F75CFE7888BDF810 +:201340000C1088420CD19DF80200012808D10A980178012904D139788078814208BF0124BF +:2013600020460DB090BD70472DE9FC410E4E00254FF00E082C4611E014FB08F7B819214674 +:20138000002243460090022001F040FA20B9F05DFF281CBF6D1CADB2641CE4B2002CEBD0B8 +:2013A0002846BDE8FC81C046220100200E4870B50168D8310868006810B94868006888B175 +:2013C00005F0B8FA06460948001D056802F012F80446304605F02EFC641CA5428CBF281B6F +:2013E000012070BD002070BD14010020E000002010B504460E48ADF1180D047005F092FBFF +:20140000002115226846FAF7E9FC152102A22346684604F055FBFEE75B41737365727420E9 +:20142000526561736F6E5D2030782530325800C0E80101200F4908B5D1F878020B68020F9A +:2014400003F0FF037F2B88BF002304F0C9F801464FF0FF3004290CD11146012908D9891E06 +:2014600003D0491E05D1153300E00B3358B208BD0A2008BDA01000502DE9F0418768786822 +:201480001D460C4690466119884238BF6FF003000FD3094E30684FF0FF3104F0FBFE396856 +:2014A00040462A460919F7F731FD306805F058FA0020BDE8F081C046001B0120B0B505F047 +:2014C00039FA05460B48017801290FD00A49024601230878137048B1084C074620688068ED +:2014E0000146204688470C347F1EF7D1284605F0A1FBB0BDB20B0120000000000000000081 +:2015000010B50E4C20784FF4805100F093FA88B90B48C27C407E012814BF03210121002091 +:20152000F0F768FF20784FF4805141F2883205F0C3F910BD0120E07010BDC0465001012090 +:20154000E4040120B0B505F0F5F905460B48017801290FD00A49024601230878137048B15F +:20156000084C0746206880680146204688470C347F1EF7D1284605F05DFBB0BDB30B012032 +:201580006083020090870200B0B505F0D3F905460B48017801290FD00A49024601230878C8 +:2015A000137048B1084C0746206880680146204688470C347F1EF7D1284605F03BFBB0BD77 +:2015C000B40B0120648302009C87020000B500211122ADF1140D6846FAF700FC81201121E7 +:2015E0006A4605F09BF870B98120002111226B4604F0D6FD38B99DF8000020B103490879F9 +:2016000040F01000087105B000BDC0464C1A012010B5ADF1280DFAF70BFD00248220182281 +:2016200021466B4604F0BCFD88B906A821461022FAF7D4FB0DF1010006A9102203F07CFD51 +:2016400028B9684621461822FAF7C8FB012420460AB010BDF8B50F4C06AF6568D7F800E05B +:201660008446184603E01EF8016B05F8016B0646701E002EC0B2F6D13F79002F07BF002561 +:20168000281C40200025E0706046FCF705FDE570F8BDC0462804012010B50446207804F09E +:2016A000C5F8002818BF022014D11420F8F788FC60B1094A516801604460506000238360E8 +:2016C00032210173012444738473036100280CBF1020002010BDC046BC0A012098B50E4C68 +:2016E000071C03D12068D0F84C05804705F022F90A4A1178B943117005F09CFAFEF776FE2D +:201700006068C068007828B92068D0F8582400200146904798BDC04614010020701B01203A +:2017200098B50E4C083CA06800F1400319680F6837B9D0F84C058047A3684033186807684D +:20174000074810300068044604F002FDF860204604F0A4F819680968088298BD1401002001 +:20176000D405012010B504462168086AADF1380DA8B1C97F01AAF1F73DFC0A48BDF80E10F0 +:201780003A30008888420AD0206800889DF821200090BDF810004FF6FE73FEF7E7FC0EB02C +:2017A00010BDC0465001012038B505460D4800780C4630F001000BD10B480E300088A04295 +:2017C00006D1284605F03FF8002818BF083007D12846214602F068FD002814BF1030002002 +:2017E00038BDC046E50401208A01012038B50F4C0D463A3CB4F84810FFF7D6FF011C10D05B +:20180000887803F0D6FB497859B150B194F83120012A02D18142B8BF011C081C01D085424A +:2018200001DA002038BD012038BDC0468A010120F8B507467D68002616E06069C5F8C800A7 +:201840006068666110F0704F06D128B1062002F00DF8042002F00AF8022002F007F8D5F875 +:20186000BC20384621469047D5F8C840002CE4D1F8BD704710B50446207DA0B92046F1F75B +:201880003FFC206918B10A48016820468847207D20B9E068E8F7DCFC207504E0E06800F0A5 +:2018A000E9F80020E060204604F05CFF10BDC046BC080120F0B515460E4604461F1CADF103 +:2018C000240D08BF00230DD0684600212422082305F06CF93B78ADF81030B86806907A6846 +:2018E00005926B46204631462A4605F017F9204609B0F0BDB0B50C460546171CADF1280D7A +:2019000008BF00220DD0684600212422082305F04DF9B8683B7806907968ADF810306A46A7 +:201920000591034B2846214605F03CF90AB0B0BD800901201FB5044620880822A11C8DF8C1 +:20194000000000128DF801000DF1020004F026F9A07A8DF80A00E07A8DF80B00207BC921C4 +:201960000D226B468DF80C00452000F051FD002000901FBD38B504460D460846FDF7C4FB3C +:20198000C828A8BF4FF6FE7011DA094901EBC001487849686160207030B1421E01EB400123 +:2019A000627031F8020C38BD00206070284638BDEC0900204FF6F87280B50021801A0328F7 +:2019C0000BD9001F07D0401E03D0801E0ED1012704E0022702E0042700E00827044800786A +:2019E000074202D107B1012100E00221084680BDE50201200E4938B58A68CD681B3800FBA2 +:201A000000F482FB04234443C5FB04234C68C4FB002312091807024308681B11C11780189F +:201A20004FEA104041EB03010904084338BDC046D808012070B50C46064603F0EBF80546B5 +:201A40002146304603F088FC002808BF00240AD0006802F04BF9064909684FF47A72B2FB0B +:201A6000F1F1B0FBF1F4284604F05FFA204670BDA0880200B0B5071C19D003F0CBF80C4900 +:201A800048604C690B6957F8042C15080BD322F000428D6847F8042C9B183F1F0B61AF42D5 +:201AA00038BF8F6001E0641C4C6104F03EFAB0BD501A0020C8B50E4601460A480778002006 +:201AC00077B1094A12788A420ADD06B9074E084A0C2011FB00200168C9680A463146904758 +:201AE000C8BDC046B20B012000000000B88502000000000070B504F01DFF06460C48001D4C +:201B0000007850B108480068C0680546074800243C2101222346A84700B10124304605F095 +:201B200089F8204670BDC046A401001000A00C408419002070B504460C4806680C48006840 +:201B40002568006B8047801B000B2060A84202D240194008206040F6C411814204D3B0F577 +:201B6000967F02D24FF49671216070BD70F200208C01001070B500260D460D4B467134463E +:201B80001E202A7B13F8011F8A4204D0401E04F10104F7D102E02846FAF7EEFB1E2C06D12C +:201BA00006202C686873607B3146FFF707FB70BD5B010020F8B504F0BDFE0D490B4FCA685F +:201BC0000C684B680D698E6882EA92024C60ED19CE6082EA42028B6082EA04120D61544073 +:201BE0000C6005F027F828460019F8BDC5870500741A0120B0B50D46044604F09BFEA7688B +:201C0000294697B1226923689A5C0A7021696568A268491C521EB1FBF5F3A2606B43C91A2A +:201C2000216105F007F8A068B0BD05F003F84FF0FF30B0BDC8B50E4601460A4807780020E5 +:201C400077B1094A12788A420ADD06B9074E084A0C2011FB00200168C9680A4631469047D6 +:201C6000C8BDC046B30B012060830200EC8402009087020008B5014608780D2804D00C28C9 +:201C800014D14868C83000E0486878B1027802F00302032A0AD1807800F00300032805D199 +:201CA00003480078FEF79EFD012008BD002008BDC40A01203EB505460EE06A6AAC6AA41A43 +:201CC000082C28BF0824E869694680182246F7F71DF9686A00196862A86A696A884206D976 +:201CE00003486946FEF7F0FDB0F1FF3FE5D13EBD74190120C8B50E4601460A4807780020C1 +:201D000077B1094A12788A420ADD06B9074E084A0C2011FB00200168C9680A463146904715 +:201D2000C8BDC046B40B012064830200848402009C8702000C480E49007802280ED030F0D5 +:201D4000010003D109480078800807D30846007840F6C4124FF4807104F0AEBD0846007858 +:201D60004FF48071FDF774B9E504012082010120CB0301203EB504460C486D46016840681C +:201D80002960002C686014BF201C684604F0C4FA04B12546064C2946204604F0B1FD7120DD +:201DA0000821224604F0C0FC3EBDC0464C8502002C05012038B505460C46E22D02D10A48FE +:201DC00004F09EFD522D05D1207818B908482638007838B105480068D0F830242146284601 +:201DE000904738BD012038BD1CDC002014010020120501200E4830B50468ADF1140DA4B1C1 +:201E000000252079A11D12228DF800000DF1020003F0C4FE2946082014226B4601F038FB36 +:201E200024686B1CDDB2002CEBD105B030BDC04664F200202DE9F84306460D4890F80090F0 +:201E40005FEA030814460D4610D0A01CC0B203F07DF8071C0AD0B81C2246414603F09EFEBC +:201E60003E70484639467D70FEF7BCFCBDE8F883680601207CB50E4C0125032601288DF8D6 +:201E80000050A17984F82E600BD0032904DBE06801F0C4FD002001E0491CC8B2A07129468E +:201EA00000E0002130462A466B46FFF7C3FF7CBD6806012010B56FF001000C490C4C0870C0 +:201EC0002068D0F8E800006878B16068C068012101702068D0F8DC04804704F02BFD04F0AF +:201EE000A9FE6168C9680020087010BDB10A01201401002008B50346104603F03FFF012914 +:201F000007D00121022A01FA03F120EA010007D109E00121022A01FA03F141EA000002D0A7 +:201F20000249086008BD0249086008BD04180120001A012038B50D480D4C01680A48083C9F +:201F4000056860682A1A2078800092FBF0F0D1F8D420527BD1F8EC1051F8221000F04AF887 +:201F60000846656038BDC0460806012014010020E00000200E4870B50068E830016809681A +:201F80000A4C4D6804F108010968A94202D8D0F86404804704F0CEFC0646E5602846F9F75E +:201FA00069FC304604F046FE70BDC046D8000020140100202DE9F0410D4C4FF6FF77054608 +:201FC0001426A7F101081C3C34F81C0F854203D0AF4208D1804506D0A01C03F06CFA10B99A +:201FE000204603F05DFD761EEED1BDE8F081C0469C0400201CB50A1C17D000230124E407EE +:20200000A04238BF041C944201D95200FBE790425B41904228BF801A914201D25208F6E745 +:20202000191C021C081C111C1CBD00B1C843FFF79AF91CBD98B50C4604F0CEFA002700B1D2 +:2020400001270B4A18329069211AB1F1004F08D8011B891DC90F05D1801DA04288BF041C5E +:2020600000E0841D14600FB904F0BCFA98BDC04600200940F8B504F04DFD002808BF00203B +:2020800013D00A480768002F0DDD0948046800250020294604F0A2F80646B068A0476D1CB0 +:2020A0007F1E7060F4D14FF0FF30F8BD8088020098880200F8B50646346817460D4604F066 +:2020C00039FC94F8251021B104F0B4FD4FF0FF30F8BD012184F8251004F0ACFD28680FC899 +:2020E0000C3484E80F003A4630462946EEF758FAF8BD9EB50090171C01914FF000008DF868 +:20210000080010D00346009A01999C5C595C9DF808207F1E03F1010381EA040142EA0102BC +:202120008DF80820EFD19DF8087007B901209EBDF0B514460D4606461F1CADF1340D08BF6A +:2021400000230DD0684600213022082304F0DEFC7B680893386805903A7AADF818206B4670 +:2021600030462946224600F06FFB0DB0F0BDB0B5046860680D4608B1642D01D90020B0BDB1 +:20218000216864226943B1FBF2F7394604F00DFB3946002806BF84F853500120002000297F +:2021A0000CBF0021012184F85110B0BD98B50446617820784018F7F703FF071C13D02278D7 +:2021C0000021F9F70BFE4FF6FE70788004F0F8F9B8802078C01938616078387502F0D2FCCE +:2021E0007875A0783876384698BD00F003028A70C0F38302CA70C0F381120A71C0F3402222 +:202200008A71C0F300224A71C0F380224A77C0F3C022CA71C0F300320A72C0F3403281F84E +:2022200031208013C0B270472DE9F84316468846044602F0EFFC27688146002005462FB14E +:2022400000E0401C57F80C7C002FFAD1864204D92046414601F090FD0125484603F065FE57 +:202260002846BDE8F88398B503680021D9629F690FB10221397093F8301002290DD001292B +:202280000FD19A692AB91C69D96ADA699B6AA04798BDDC68D96AA04798BD03F1340004F04D +:2022A0005FFB98BDB0B500F00AFB071C18D0002410E007EBC400401C054604F0F1FA38B1D1 +:2022C0000079012818BF022802D12846FDF7F8F9641CE4B23878A042EBDC3846FFF7CAFB8D +:2022E000B0BD38B505462C68B4F85610A06804F017FBA06804F016FB284603F076FBB4F8FA +:2023000058004FF6FF71814209D040B1401EA4F85800B4F8580010B9284602F0F5FD38BDBD +:2023200038B50C4C2169054699B1606988B1A06978B16888884760B907490A6868889101E9 +:20234000A1EB820162699047012802D1A1696888884738BDE4020120BC80020010F1240F99 +:2023600000F1240103DB1C28A8BF3F2100E00021032001F00F030F22A0EB2110C3F10F0186 +:2023800002414FF6FF7343FA01F0024B40EA02401860704718A00C4070B50468002584F8F7 +:2023A000515094F85210012907D094F853602946FFF7DDFE84F8536005E094F854002946AB +:2023C00003F0D2FF012094F85010022918BF84F8505070BD38B50B4C207888B10A4D2878D5 +:2023E00060B1022806D0012804D008480068D0F84C0580470020287003F0B4FC002020702C +:2024000038BDC0466E1B0120B50B0120140100202DE9F0411646054698460C46F01C02F0E5 +:2024200095FD071C0DD03E707D70BC7026B1F81C32464146F6F76AFD034800783946FEF7CE +:20244000D1F9BDE8F081C046651B012030B58578C41CADF1240D204603F02DF800280CBFF3 +:202460000020201C627A217A01EB0221FAF7DCFD01466846FAF733F8672024226B462946B2 +:20248000FFF7C6FF09B030BDB0B50C4C002520800F46658010B1216901B1884747B1E26811 +:2024A0000748E188057022B121B9114638468847E18811B16069F8F7BDFCB0BD04FC002075 +:2024C000B60B0120F8B54FF08057064607F5EC7420680A4D81682846884700F00300306027 +:2024E000D7F8D801426800212846904720688168284688470028F9D1F8BDC0460040034046 +:2025000000B500211822ADF11C0D6846F9F766FC02208DF808000848C18FADF80010B0F838 +:202520004800ADF80A0000208DF81400684600F07DF807B000BDC046500101200D4B70B56F +:202540000D4606460824B3F9300085420BD13046194603F039FF30B11AB193F83300024283 +:2025600001D0184670BD641E03F15803EBD1002070BDC046B0F40020F8B51C4615460746A4 +:2025800004F0D8F99FB107F1280106C907F1280307F120062943224383E8060096E806002F +:2025A00007F120030D4344EA020683E8600004F041FBF8BD10B58468207DFF2801D001F093 +:2025C00037FC607DFF2801D001F032FCA07D0021FF2802D0E27DFF2A00D141B1FF2801D05A +:2025E00001F026FCE07DFF2801D001F021FC10BD30B5054600211822ADF11C0D6846F9F7A8 +:20260000EDFB00240620214618226B46FDF710FA38B9012D05D10620214618226B4600F0DB +:2026200037FF641C032CEDDB07B030BD30B5002405461822ADF11C0D21462C756846F9F74E +:20264000CDFB0A226846294603F0A8FA6889ADF80A0004480068D0F8F812684688472046CB +:2026600007B030BD1401002038B50D4C083CA068D0F8C81301208847054600208DF800006C +:20268000A068D0F83024694656209047A0680349D0F83024E2209047284638BD1CDC002056 +:2026A0001401002008B5002101288DF800100FD00A4A907840B1506A30B1917003F0D2F8C4 +:2026C000322003F07BF808BD0320E4F755FF08BD032001226B46FFF7ADFB08BD680601207D +:2026E0000D4B10B51B6801EA03048C4218BF6FF0040010D180684068884298BF6FF003004C +:2027000009D98918884202D31340934202D06FF0050010BD002010BD081B01200D480021C5 +:20272000001F01700748084900680988D0F8D420D184D0F8D400054AC18C11800449C08CFD +:202740000880704714010020A60601201A06012046010120B8180120F8B50F1C044616D096 +:202760000B4E0025786831680019E83178600A681268BA4202D1002848BF7D607868002889 +:2027800002D5D1F8640480473F68002FEAD1F8BD1401002098B50D4CA168D1F8B800077840 +:2027A0009FB1C7698FB1086C0268D06D28B102210023B847A168086C0268106E28B1D1F819 +:2027C000B810CC6900230821A04798BD0C010020F8B504460C480768AFB10026062538683C +:2027E00001888C420CD13E817989C90803D3387B01F06CF838687D73407BF021FEF7DEFC0A +:202800007F68002FEBD1F8BDE40A012030B50D4C2468ADF1140D94B1E46984B101258DF827 +:202820000850ADF80A00ADF80C10089D009502AD95E80300A047012818BF002000D10A2065 +:2028400005B030BD00DC0020F8B507460A480B4C0668E0698D00285886420AD108480090F0 +:20286000384604F04FF9E0692858864218BF381C00D10020F8BDC046C87302001C000120BC +:20288000800901201FB5044620880822A11C8DF8000000128DF801000DF1020003F07EF95A +:2028A0006089CA210C226B468DF80A0000128DF80B004520FFF7ACFD002000901FBDF8B5F7 +:2028C0008469C08948F21F01814208BF641C2778F800401CF7F774FB061C0BD0751C3770D9 +:2028E00047B1641C2846214604F00AF8083408357F1EF7D13046F8BD10B50024ADF1180DE0 +:2029000013E001A800902146002214230820FFF77DFF40B99DF80400FF2804D00DF106019F +:202920000022FAF7B7F9641CA4B2002CE9D006B010BD10B543689B6801EA03048C4218BF8C +:202940006FF0040011D180684068884298BF6FF003000AD98918884203D302EA030090423A +:2029600002D06FF0050010BD002010BD0EB50346042003F051FD18788DF8000058888DF87C +:20298000010000128DF802009888C62105228DF803006B4600128DF804004520FFF738FD0B +:2029A00000200EBD7CB50C4D0646002401E0641CE4B2E878A042D8BFFF200BDDE8686103A7 +:2029C0006A46042303F0E2FE009800F0FF008642EDD120467CBDC046C01900200C4880B519 +:2029E0000168886800E0384647681FB101F13802BA42F8D1407B10F00F0006D1498F40F601 +:202A00000900884208BF012000D0002080BDC0466CF20020B0B50446242002F097FA074687 +:202A2000094805787FB1322038702078B87060687860A1681B2207F1080003F0AFF82846F0 +:202A40003946FDF7CFFEB0BD1C0701203EB515460F220B4C8DF808204FF6FD72ADF8002089 +:202A60006268107000125070901C03F049FF606813220B23694685722046FBF70DFB3EBD27 +:202A8000280401202DE9F0411D4616468846044603F0CAFC071C0FD0062002F057FA011C8A +:202AA0000AD0FD2008704D708C708E8081F8038078680078FDF796FEBDE8F081C8B5FE294A +:202AC0004FF0000608BF0126094A17686FB1FA88904207D1002E18BF387907D13A798A4298 +:202AE00008BF01263F68002FF1D1FE20C8BDC04664F200201CB500200B4C8DF80000042040 +:202B00008DF80100012060716846F8F771FD20784FF48051FCF706F820784FF4805141F2B6 +:202B2000883203F0C9FE1CBD6806012038B58468456894F8380001F07BF994F8390001F054 +:202B400077F994F83A0001F073F995F8F900012803D095F8FB00FF2803D095F8FB0001F065 +:202B600067F938BD38B50C46054600F043FC0A49A04204D2084602682046DC3205E00846DD +:202B80000268DC3250680068001968601168D2F810242846904738BD140100200C48083842 +:202BA0008268D2F8D820002111608268D2F8DC2011608268D2F8E0204FF4700313608268EF +:202BC000D2F8E42013608068D0F8E8000160704714010020094908B5012008700A48863817 +:202BE000006818B10649088B401C0883F02000F099FB04480078E9F7F9FC08BD641B012049 +:202C0000D8180120051800204601012098B504460B48006888B10746B86804420AD0F86886 +:202C20003A690021034620469847002818BF4FF0FF3003D13F68002FEED1002098BDC046F1 +:202C40005018002010B50C1CADF1380D13D001466A462046F0F7CEF99DF8060058B19DF8F5 +:202C600001209DF81C300020214602F0EBFF002818BFA42000D100200EB010BD38B50B4C6C +:202C80000D4694F8961081420EDA00F091F908482146058091F82B200878642313FB02F271 +:202CA0004FF4007103F008FE38BDC04650010120EC020120F8B50C4E446885680F4608E00E +:202CC000216B0870606B216B7F1E401C6063491C21633FB130680069014628688847B0F1BC +:202CE000FF3FEDD13846F8BDD001001010B50C4601461022ADF1200D684603F0F9FB04A828 +:202D000003F09DFD10200790CDF810D004A9044805940068069403F0C0FD08B010BDC046EB +:202D200010DC00202DE9F0410F46044603F04CFA04F1280292E8600033462A46F6F796FB08 +:202D400080460B4642462846314603F077F817B1303484E803004046BDE8F0811CB50C4C2D +:202D6000A06838B9684603F04DFA01206946EFF7A9FFA0602178012909D040B1E178012904 +:202D800002D0FFF709FB1CBD642100F071F81CBDCCE80020F8B5446885680F1C11D00A4E59 +:202DA0003068216A826909782868904748B1216A606A7F1E01F10101216200F10100606207 +:202DC000EED13846F8BDC046D001001038B50C4605460021012203206B468DF8001003F0F0 +:202DE000DFF970B9FF2D19BF9DF80000A0439DF80000204301216A468DF80000032003F0F1 +:202E000093FC38BD0246107800280CBF00200120517809B140F00200917809B140F004007E +:202E2000D17809B140F00800117909B140F04000517909B140F08000704738B50E20F7F7AF +:202E4000BFF8041C12D0FF210E22F8F7C7FF002507E0294602200E222346FCF7E9FD6D1C1C +:202E6000EDB2002DF5D02046FEF704FE002038BD10B5046894F85220012A03D0FFF777F9BC +:202E800030B910BD94F85400012103F06DFA012094F8501002291CBF012184F850100121ED +:202EA00084F8511010BDF8B54568066803F042FD0746307870B1287903F0CAFB012806D1FF +:202EC000286800244460301D03F032FD34702879F3F7C8FF384603F0ADFEF8BD10B5FF217F +:202EE0001422ADF1180D6846F8F778FF002401E0641CE4B2002C18BF002008D1214608201F +:202F000014226B46FCF794FD0A28F1D10A2006B010BD014600B50420ADF1140D8DF8000041 +:202F2000087A022806D001A803F0D4FA6846FAF7DFFE05E00888ADF802006846F8F788FFE9 +:202F4000BDF80C0005B000BD0A4938B5402205680A60802008600024C1F8FC4295F82600EF +:202F600020B1054803F0FCFC85F82640022000F07DFC38BD044402404C16012010B50A4CBD +:202F8000606820B16068FEF775FD0020606002F033FA064C206B30B141682163FEF76AFD23 +:202FA000206B0028F8D110BDFC090120E402012030B50B4C0546ADF1140D84F896506A4643 +:202FC00014342046FCF76CFA68468DF81250FBF7F3FB45202146FEF7EDFE05B030BDC04621 +:202FE000500101200A46014610B5101C0ED069B1074A0323C2F88437D2F88C3713F0030F51 +:20300000FAD1044C012323601160906010BDC046044002400000484210B50A4941F8980CB5 +:2030200008684FF0805440F003000860D4F8B80181692020884704480068D4F8B801806BD0 +:20304000804710BD242208402C20094084460B4838B5028881B1051D4FF48774AB5C521C1E +:20306000491E0CF8013B92B292FBF4F303FB04F3A2EB0302F2D1028038BDC04638FE0020D4 +:2030800038B514460546042211FB02F21846091D02F0FC028DF800208AB22946FCF776FE4D +:2030A00002460121684603F0A9FA84420CBF0020022038BD10B5FEF745FA012000F07EFF13 +:2030C000044603F037FC074A116831B103F0B2FD34B1204603F0C8FA10BD146003F0AAFD57 +:2030E00010BDC046141B012038B5044603F022FC084905460878A04308700878000904D28F +:2031000005480821E03003F033FC284603F092FD38BDC046661B012068F20020F8B51646F7 +:203120000F46044603F006FC05460848001D0068A04205D13846314600F0FEFE044600E018 +:203140000324284603F076FD2046F8BD68F200200C2838B512DA002808BF00240CD0921E33 +:203160000346002403F02CFA32F8025FA84203D05B1E04F10104F5D1A14201D0002038BD7F +:20318000012038BD0B49891F8A7992080ED3084A127882420AD00846017901F0F80141F042 +:2031A000020101710C21817101F0FEBC7047C046EA040120521A01200B4908B509780229BA +:2031C0000FD101280DD10748007850B900F0E6FC03F068FA18B90020FEF74CFE08BDF8F72D +:2031E000DBFF08BDCF030120E50401203EB50225ADF80000094B8DF808505C6804F8010B77 +:20320000001204F8010B184604F8011B0423694622700122FAF740FF3EBDC0462804012015 +:203220000B4A98B50021283A176801606FB1BF1F03224FF6FE7437F8063F9C4203D1076022 +:203240000846387198BD521EF5D1C82098BDC04604E900201CB50B4C21722178012803D04C +:2032600000200121607107E008464FF48051FBF759FC002184F8371001206B460246FEF7B8 +:20328000D9FD1CBD68060120BCB50B4C0546AB2021888DF80000284602F0CFFF01216846E6 +:2032A000FDF77CF821880746284602F0CFFF17B92846FCF739FBBCBD101B01207CB50546DC +:2032C00009480A4C007821888DF80000284602F0B4FF01216846FDF761F82188064628460E +:2032E00002F0B4FF30467CBD67800200101B012080280BDC012803D0032818BF802801D13E +:2033000001207047022805D1022070478428B8BF042006DB842801DB862801DB00207047EB +:203320000320704738B50546EA2D12DBF42D10DA084C083CA068D0F82824694628469047C4 +:203340000098A368401C0090D3F8302469462846904738BD1401002010B5094C94F90000FA +:2033600010F1020F0BD00848064B4238006894F90010826B186890476FF00100207010BD3F +:20338000B10A0120B40601201A0601200A4808B50068D0F8B800007800280CBF0120002092 +:2033A00000F00EF8054991F9000018B191F90000401E087008BDC04614010020B80A012033 +:2033C00038B5054603F0B6FA044600210220FBF75DF9074800688369044800684FF0FF3177 +:2033E0002A469847204603F025FC38BDB4060120D805012038B503F09DFA054608480068BC +:20340000084CC06B8047083C6168401A21788900B0FBF1F4284603F00DFC204638BDC04682 +:20342000D8050120E00000200A4908B5888B401C888303F07FFA08490A78862A02D003F050 +:20344000F9FB08BD87220A7003F0F4FBE920F6F7E7FF08BD04180020741B01204FF6FE706E +:2034600038B5411C00F020FF011C0DD1074C1425A07C08B1607C18B9208800F03FFA2146B2 +:203480006D1E04F11C04F3D1084638BD9C040020BCB50B4D2F68002487B17F6977B10125D3 +:2034A0008DF80050ADF80200ADF804109DE80300B84718B10A280CBF09240A242046BCBD50 +:2034C00000DC0020F8B50B4E456884680F4606E005F13C02C1B21046FDF7DCFE7F1E3FB1BE +:2034E00030680069014620688847B0F1FF3FEFD1F8BDC046D00100100B4910B5096849B16E +:203500000B7C002201E0521CD2B2934204DC09680029F5D1002010BD01EBC204E47EA04237 +:20352000F1D1084610BDC046F00A012038B5B1F1FF3F044608BF05212020EFF3118580F35E +:2035400011880120054B61618840A061586903F0D5FAA06285F3118838BDC046B0FF002076 +:2035600030B50D4601460024ADF1140D01A88DF8004002F0AFFF6846FAF7BAFBBDF80210C0 +:203580004FF6FE72204629808A4218BF012005B030BD1FB504460822208861688DF80000C3 +:2035A00000128DF801000DF1020002F0F7FA217A0B226B4601704520C821FEF729FF00201B +:2035C00000901FBD70B516460C46054601F022FB2968A14219BF54F80C1C46F80C1C54F8E1 +:2035E0000C1C2960002144F80C1CFF2104F8021C02F09BFC70BDF8B58C46071C164611D0C6 +:2036000000245EB13CF814109A1E304632F8025F8D4208BF012006D0401EF7D17F1E04F121 +:203620000104EED10020F8BD70B5044604F128020CCA0846002102F001FC04F1300292E88E +:2036400060002D1846EB0106290C30040143FEF7F1FC383484E8600070BD10B5044603F097 +:2036600049FA034603E0184603F040FA03469C4208D0986803F0B2F99042F4DA184603F0C2 +:2036800065F810BD204603F0BDFA10BD0A4980B50A1D1768874209D057B1F968884202D04E +:2036A0000F1CFAD104E0C168F96001E0FA684A60FEF7E0F980BDC046800A012038B50C46C6 +:2036C000054602F03BFA0146284602F057F9012804D028462146FFF743FF38BD02480088B0 +:2036E0002080012038BDC0468A01012038B5044600F0AEFF0546012D0CD10748A289036853 +:203700002478910001EBC2015A5CC818A2435A5402F025FF284638BDE00A01200A4908B510 +:203720001420F9F7F5FF1420002102F01DFE012003F0B9F81420012102F016FE4FF40C702F +:2037400003F0B1F808BDC0460162002008B503460948007801280BD006481978007809B993 +:2037600008B905E020B94520CB210122FEF750FE002008BDFC0901208C0A012070B50346E3 +:203780000E4601F099FCB04202DA01F095FC0646054C65881846324661191831F5F7B6FB3F +:2037A000AD19A8B2608070BD04FC002038B50A460C460546002101F04BFF07490C39487831 +:2037C00040B97C2C08BF81F833500C2015FB001080F8464038BDC046CC190020F8B50A4C38 +:2037E000054620680E4617464FF0FF3102F052FD284631463A46FBF73FFD0546206803F03C +:20380000AFF82846F8BDC046001B0120F8B50A4C054620680E4617464FF0FF3102F03AFD7D +:20382000284631463A46F3F76DFE0546206803F097F82846F8BDC046141B01200EB50949EB +:203840000A68917969B913680749C268096831B10193029240788DF8000068468847FFF7AA +:203860008DFB0EBD000A01203007012010B5044603F060F8084B1A1992F84311491EC9B2D2 +:2038800082F8431121B99A680121A1408A439A6003F0D0F9002010BD5018002038B504464C +:2038A00003F048F8084A02F108031D680121A140A4182943196094F84311491C84F8431147 +:2038C00003F0B8F9002038BD501800200A4938B500221E230C4614F8015FA84204D05B1E0F +:2038E00002F10102F7D138BD002308462370713040F8223038BDC0465B0100200A4938B52F +:20390000642203254FF6FE748B795B0807D24B88984204D14B79012B04BF4D714C80521ED3 +:2039200001F10801F0D138BDCC06002007480068400909D20748064B074A016803EA912011 +:20394000824208BF012000D000207047B04F0050F1FF0F0050130050F00107001CB54FF00B +:203960008054D4F8CC014068014602208847D4F8CC110090486801460120884701900248FF +:203980006946FCF7ABFA1CBD74190120C8B50F46016887B17E6876B13A78042A0BD1BE68F7 +:2039A0004EB100224A628F617A68CA61BA688A62F3F7B8FAC8BD6FF00200C8BDF8B5044631 +:2039C000094805780E46022001F0C0FA071C09D01EB13146022202F0E1F83C70284639462E +:2039E000FCF700FFF8BDC046CB03012010B504461022ADF1200D04A9684602F072FD064815 +:203A000000686946FFF7C2FF01991022204602F0C5F808B010BDC04614DC00200A4A10B543 +:203A2000D3680146181C0ED0814204D0044680690028F9D110BD834219BF8169A1619969DE +:203A4000D160FEF717F810BD680601200A4A323A92F83210884202D1517801290AD00128B6 +:203A60001CBF002182F82F10323210700121552002F05ABE7047C0469A06012080B5071C36 +:203A800014BF80210021074B188F4FF67F7202401143054A08431887117867F3C711117057 +:203AA00080BDC046D40501202C010120094810B500240470FFF76AFCFAF756FB0649486830 +:203AC000C068007828B90868D0F8582420460146904710BD701B01201401002010B50A4C64 +:203AE0006068C068007828B92068D0F8582400210120904702F01EFF03F09CF82068D0F8B2 +:203B0000B800806E804710BD1401002008B502F011FF084A517841F00201517003F08AF8F2 +:203B200005480068D0F8940000780021FBF790FA08BDC046D80000201401002038B5044630 +:203B400009480068D0F8D85002F0F4FE296831B1A14208BF012403D009680029F8D100243C +:203B600003F068F8204638BD14010020F8B5061C0D464FF000040CD0074807684FB13846E5 +:203B80002946B047012803D07F68002FF7D100E03C462046F8BDC046E40A012038B5094D10 +:203BA0001424284601F07CFF1C35641EF9D106494FF6FE72002303204A80401E01F8043BAC +:203BC000FAD138BD9C0400202403012010B502F089FF02F0DBFF032002F080FF06481030F0 +:203BE000006830B1034C204602F04AFD204602F04DFD10BD439001008CFF002008B502F0F1 +:203C000089FF012801D002F065FF074802F05EFF01F00EF902F056FF02F050FF02F04AFF73 +:203C200002F044FF08BDC046CD3B0200084910B5002008600120C861064C2060216844F8FB +:203C4000280C05480068016A14208847206810BD000024432C200940B001001030B50025F1 +:203C6000ADF1240D0848009502AA01930B46294602F018FF041C03D002A902F003F9254690 +:203C8000284609B030BDC0460C85020030B503460025ADF1240D0848009502AA01912946C3 +:203CA00002F000FF041C03D002A902F0EBF82546284609B030BDC0460C85020030B500257E +:203CC000ADF1240D0848009502AA01930B46294602F0E8FE041C03D002A902F0DFF8254686 +:203CE000284609B030BDC0462C85020038B50446EFF31185202080F31188A08A012809D1CF +:203D000002F09CFFE168A368081A834203D22169814200D2002085F3118838BD10B5041CDC +:203D200009D10024052021461022FCF727FC641C282CF7DB10BD21780520102201F07F01DD +:203D4000FCF71CFC0020207010BD98B5044600F061FF2168002908BF002709D051F80C2CFA +:203D6000002322600F4641F80C3CFF2401F8024C02F0DBF8384698BD38B50C46054600F04C +:203D800049FF6CB1002144F80C1C296811B92C6006E0114651F80C2C002AFAD141F80C4C0E +:203DA00002F0C3F838BD38B50C46054602F0C2FD22680346002442B12846114602F004FB86 +:203DC00000B114461268002AF6D1184602F032FF204638BD00B51022ADF1140D8DF8001056 +:203DE00001460DF1010001F0D9FE3B2011216A4602F09AFC002111226846F7F7EFFF05B05D +:203E000000BD70470346094810B5001D006858B1C479A34205D18488A14202D18479A242A6 +:203E200003D0C0680028F3D1002010BD800A012010B5044601F06AFE07480838006850F85C +:203E400024102046F9F764FC0021204601F06AFE204602F081FA10BDF086020038B50C4641 +:203E6000054602F067FD0749891C01EB85010A78C4F3024322F007021A430A7002F0DAFE00 +:203E800038BDC0460010084038B50446084800780D4630F0010009D12046EFF749FC21468A +:203EA0002B464FF6FD700D22F8F7DEFA38BDC046E504012070B5094D95F88A4064B102F00B +:203EC0006AFC4FF47A7600F07F0016FB040228784FF4807102F0EDFC70BDC046500101206F +:203EE00010B5202918BF6FF0010009D141688368044A4C681B8C146003490B60FDF7F2F85D +:203F000010BDC0460C1B0120101B0120074898B5007838B1064C074654F80C0B006980470B +:203F20007F1EF9D103490120087098BD5C830200A0850200B10B012010B50C46084924313E +:203F40000978022918BF012009D100F051FE04B1206000F0FF0001280CBF8120022010BDFC +:203F600068F20020094A38B50346082400205A325588AB4202D11578A94205D0641E02F107 +:203F80000A0200F10100F3D138BDC0462001002030B50D460446242208230021ADF1240D40 +:203FA000684602F01FFE012029466A468DF81800204602F013FE204609B030BD10B50446E3 +:203FC000002124220823ADF1280D684602F00AFE044A012069468DF81800204602F05EFD66 +:203FE0000AB010BD80090120074810B5002407490460032008600220FFF738FC0820F2F7BC +:2040000031FF0348047010BDA802504210800240AD0B012038B5094C0146E07850B1C878DB +:2040200040B9487830B90448002505800120FAF703F9E57038BDC046E40101201C07012040 +:204040008CB58DF800000848001D0068027004AF43701A1282700022C2703A8804236846E4 +:20406000FAF71AF88CBDC046280401201FB514460222ADF8020001A88DF8002002F02AFA44 +:204080006846EFF7C1F8012814BFC8200020BDF80C10218000901FBD98B5094B00221F68A7 +:2040A0000A6057B1BF1F032337F8064FA04204BF0F60101C02D05B1EF6D1C82098BDC04671 +:2040C000DCE8002010B5074C207838B9064807494FF4B472F4F71AFF0120207001F027FA8D +:2040E00010BDC046B70B01204C400021F4760200094A10B512686AB11379984218BFFF28E0 +:2041000005D1931D1C88A14208BF181C03D01268002AF1D1002010BD64F2002010B5FF2116 +:204120001422ADF1180D6846F7F758FE002407E02146082014226B46FFF7AAF9641CE4B264 +:20414000002CF5D006B010BD38B5094B00200E2401460AE011FB04F29D5CFF2D03D0D21843 +:204160005279121890B2491CC9B20029F2D038BD2201002038B5094C0546B92021888DF871 +:204180000000284602F059F801216846FCF706F92188284602F05AF838BDC046101B01200A +:2041A000094A10B5ADF1180D009100240290114608680194694602F00CFB002814BF201CA2 +:2041C0004FF0FF3006B010BD0C1B012080B5071C04D107480068D0F84C05804702F0AAFB4B +:2041E000044A1178B943117002F024FD80BDC04614010020701B012010B5041C04D107482B +:204200000068D0F84C05804702F094FB044A11780C43147002F00EFD10BDC0461401002026 +:20422000701B0120084838B50068D0F8E000046802F080FB0546054804602046F6F722FC3F +:20424000284602F0F7FC38BD14010020E000002038B5094C0546206B28B101888D420AD0BE +:2042600040680028F9D10820F5F7AAFE216B10B105804160206338BDE402012080B5071C9E +:2042800012BF78680748006850B14289120B04D339B102681288914203D040680028F4D1CD +:2042A000002080BDE40A0120094A38B514234FF6FF7532F81C4FA04205D15489A14214BF82 +:2042C0008D42101C02D05B1EF3D1002038BDC046800400200246094838B5002114234FF6F2 +:2042E000FE7430F81C5FAC4203D08A4204D0491CC9B25B1EF5D1002038BDC046800400206A +:204300000EB5094909680346002061B18A6A52B101218DF80010ADF80200ADF804309DE8E9 +:204320000300904780B20EBD00DC0020F8B5057C002301E05B1CDBB29D42D8BF00200ADDF7 +:20434000DE0084191B342778B942F3D1617880190A4316306270F8BD027A0B7A93420CD1F6 +:204360005AB1022A07D1098800880022814208BF012210467047032A01D00020704701F073 +:20438000FDBA704708602E2088800020888102A0886008467047C0467B756E6B6E6F776EA8 +:2043A0002D696E7374616E63652D6E616D657D000860322088800020888102A0886008466D +:2043C0007047C0467B756E6B6E6F776E2D696E7374616E63652D6E616D657D0038B520209B +:2043E000EFF3118580F31188064CA068002102F051FB6169081AA169814238BF002085F338 +:20440000118838BD4CFF002010B5094C034600E00834208850B18342FAD16088814205D16A +:2044200060680B4611461A4601F0B8FB10BDC04664750200F8B516460D46044602F07AFA4E +:20444000024629463046086043684B60476807B9274639604160104602F0ECFBF8BD10B5B2 +:20446000041C0FD0207A022818BF03280AD12046F5F74AFFFF2805D0227A0021FDF73AFD1D +:20448000002010BDE82010BD00B5817EADF1340D8DF81210C27E8DF813204188ADF80A10A0 +:2044A0008188427DADF80C106846EDF7CBF90DB000BD70B514460E460546002201F046F933 +:2044C000FF280AD02B2E19BF40F22B2141EA8421A10241F02B0145F8201070BD10B51446A3 +:2044E000024602F06DF802F06BF890420AD10B2908D12046002100F0C3FB204600211E2212 +:20450000EDF778FF10BD0EB54FF6FE73834203D0002918BF934201D101200EBDADF800002A +:204520000191ADF808206846F4F7B8FB00200EBD1FB50C46014602208DF8000001A801F037 +:20454000C9FF6846F9F7D4FB012814BFC8200020BDF80C10218000901FBD4A0824BF0122EC +:204560000270CA0824BF012242704A0924BF0122C2708A0924BF01220271490A24BF012150 +:20458000C171704710F15A0F05DB10F1140FC8BF6FF0130001E06FF05900332141F2EE12AB +:2045A0000E2310FB012191FBF3F0C0B27047FEE7C8B507460748466857B116B9476004E0F7 +:2045C0000646F0680028FBD1F760B9710020F860C8BDC046800A012038B5458940684478F5 +:2045E000062000F0B3FC01460448007829B108220A704D800C71FCF7F5F838BDCB0301205F +:20460000044805494160054981600549C160054901617047B408012001C20000B9CF010031 +:204620000D690200158B0000074A517828B90020106208460121FAF775BA044B1362024639 +:204640000846012102F038B9E00601200F6802000146084B89891A8800208A4208DD8A00DE +:2046600002EBC1025968895C11F00F0F18BF01207047C046DC0A01200849091F088850B1FF +:2046800049680C3911F80C2F12F00F0F08BF002002D0401EF6D101207047C046E00A0120F9 +:2046A00038B5084C002233232579A84203DCA942A4BF521CD2B25B1E04F12404F4D11046E9 +:2046C00038BDC0462C100020084933220B79052B05DA002808BF081C06D0401E80B2521E61 +:2046E00001F12401F2D100207047C0462C1000201FB5FF210E226846F7F770FB002407E071 +:20470000214602200E226B46FEF7C2FE641CE4B2002CF5D000901FBD70B5084E00240E2535 +:2047200008E0214614FB056302202A46FEF7B0FE641CE4B2002CF4D070BDC0462201002002 +:2047400070B5084C04EB800425680E4602F0F2F805F0FF053146A94218BF217002F06AFA97 +:2047600070BDC0460010084038B50C4601466BB1091F002051F8045FB5F1FF3F06D0154009 +:20478000AC4204D05B1E00F10100F3D1FF2038BD084910B5087860B139310246002311F88F +:2047A0000C4FFE2C08BF181C03D0521E03F10103F5D110BDC31900201CB55B1C8DF80210D0 +:2047C0009624ADF8002099008DF803406A46042389B2FCF71FFB014908701CBDC119002045 +:2047E00010B5044610460A46211C08D038B1C8608A6004480B6100F01DF9002010BD6FF0EA +:20480000020010BD5018002038B50D460446F8F7EBFC05F57A71241AA008814234BFB0F1BF +:20482000405F002003D2401B012898BF012038BD10B50446062000F089FB011C09D0312003 +:204840000870208848806088024B88801878FBF7C9FF10BD1C07012000B5ADF1140D0DF166 +:204860000E01FFF765FE48B902208DF80000BDF80E30ADF80C306846FEF738FF05B000BD08 +:20488000E22808B505D1064A0846114602F038F808BD044A1268D2F82824904708BDC0461F +:2048A0001CDC00201401002001280AD00749887828B1486A18B100208870FBF747BD0021D5 +:2048C00000E001210520E2F757BEC046680601200168084603E0D1F88C0006E08268C26845 +:2048E000D208FBD20222C0F88020C8684008F2D30020C1F88000704710B5041C04D1064840 +:204900000068D0F84C058047044801780C430470F9F75EFC10BDC04614010020701B0120C9 +:20492000084A014603235088814204D11078002818BF012004D15B1E02F10402F3D1002075 +:204940007047C0462403012070B50748074C142506886089864202D0204601F0A1F86D1EC6 +:2049600004F11C04F5D170BD980101209C04002038B50446074801882046FFF795FC0D4666 +:2049800038B101F08DF820462946FFF78DFC0028F7D138BD9801012038B5084D69682C681E +:2049A00024EA010028600C40E00901D3F6F726F8200A01D3FCF726FCAC6038BD902208403E +:2049C00010B5084C38B1064800684068012102462046001F9047206820F03000206010BD9C +:2049E000D8010010044003400EB5014648894A68ADF8000050788DF8020092788DF808200F +:204A000008B9487A10B16846F1F79AF80EBD1FB50C460021ADF8020068468DF80010F7F740 +:204A200017FA01A9204601F055FD204600F043FD00901FBD38B50D46044601F07BFF0021FA +:204A40002A462346116059685160596801B921460A605A6002F0EEF838BD38B50C4605463D +:204A600001F068FF00212B4622461C6851601460196801B929464A601A6002F0DBF838BDB3 +:204A800038B50D46044601F055FF2A46116801B9214653684B60516801B9214612680A6019 +:204AA00002F0C8F838BD10B58478C078ADF1280DFFF70AFE01466846F7F711FD67202422C7 +:204AC0006B462146FDF7A4FC0AB010BD10B50446022001F0A1FC032001F09EFC0020F0F72F +:204AE0006FFB4520C72101222346FDF791FC002010BD1CB50024032001216A468DF8004056 +:204B000001F00CFE28B90320214601226B4601F047FB9DF800001CBD074A517828B901209E +:204B2000D07008460221F9F7FDBF0023D37002460846022101F0C0BEE0060120428913099C +:204B40000CD3920808D3427B062A05D0E92903D0CD2918BFF02901D1F1F7E0BC0020704747 +:204B600008B501F070FE002808BF002009D0017931B1032904DA8169C161012380F82030D3 +:204B8000012008BD38B5074B9C782546681CC4B29C70284600F0BAFE0028F6D1002DF4D075 +:204BA000284638BDE40201200648017808092CBF03200120890828BF40F004000249087015 +:204BC0007047C046521A0120E5020120054808B50068426801200146904703480349006829 +:204BE000086008BDE001001030200940F008012007490246083908680028FCD10023CB6158 +:204C00000A60C8690028FCD0CB6148687047C0460810044010B501F0B9FF064980B200041D +:204C20002140040C0C4301F085FE80B260F31F44204610BD0000FFFF0749082291F83300F1 +:204C400030F07F0008BF081C04D0521E01F15801F4D100207047C046B0F400200A46064936 +:204C600010B54B683BB18968084204D003490C6801462046984710BD848702006CF200201D +:204C800010B50C460021FCF779F92146F7F7A6FE38B14FF6FE710180418000240471447151 +:204CA000847110BD10B5074CE41F207220B9207810B9062000F0F6FFE0792021FAF7C8F9F4 +:204CC00010BDC046CB03012010B530B14379002201E0521CD2B2934201DC002010BD00EB31 +:204CE0004204E488A142F4D1012010BD064A1068002818BF012006D1044940200860012374 +:204D000048600020D361704704800C4038500C40064902680B390A6042684A6004490268CA +:204D20000A390A60406848607047C0461A060120460101200649002008700648001D006856 +:204D40000069FF2202704FF0FF30886148617047A40601201401002010B504460B2C01DB7E +:204D60001A2C04DD04480068D0F84C0580470148047010BD22010120140100200649487866 +:204D800040F00400487005480068D0F8940000780021FAF75DB9C046D80000201401002043 +:204DA00038B50D460446FEF725FB4019606004480268D2F8D810D2F8EC242046904738BDC7 +:204DC0001401002010B50346002A08BF00200AD05B1E491E11F8014F13F8010F844201D1B9 +:204DE000521EF7D1001B10BD024607480168002041B14B7B9A4212BFFF2A401CC0B2496866 +:204E00000029F6D17047C046E40A0120074910B5142200204FF6FE731C3131F81C4BA342F3 +:204E20001CBF401C80B2521EF7D110BD80040020074808B51030006828B1034801F020FC7B +:204E4000024801F023FC08BD595402006D5E02008CFF0020074810B51030006830B1044C1F +:204E6000204601F00DFC204601F010FC10BDC046731802008CFF0020074908B5283090E887 +:204E80000C000020F4F7F2FA002908BFB0F1FF3F88BF4FF0FF3008BD907E000038B5054680 +:204EA0000024064A0448009429684FF0FF3301F0EDFD2C6038BDC0460C85020049640200F8 +:204EC00038B505460024064A0448009429684FF0FF3301F0DBFD2C6038BDC0462C85020041 +:204EE0005964020007480078022807D0062803D0052806D000F0EABF062000E00220E8F787 +:204F00009FBB70470518002038B505462C6894F85000022808D1A06801F006FD2846FDF73A +:204F20003BFA002084F8500038BD38B5054601F001FD2C6834B121682960216801B92946F7 +:204F400000224A6001F076FE204638BD10B5041C04D004F10C00F5F733F808B9002010BD46 +:204F6000002101600481FF2383720C3010BD38B584690D466178207800EB0120A41C2880F8 +:204F80002146A81C01F0BCFC14F8080FA87238BD08B50B4600F04AFC20B9322018700122F1 +:204FA0005A7008BD00F10C010222184600F0F6FD08BD0C28C8BF01200BDC0628C8BF03209F +:204FC00007DC0228C8BF052003DC002814BF0720002070473EB50546002108226846F6F71C +:204FE000FDFE2846694600F0C9FC0024012818BF012420463EBDF8B516460D46044601F0A3 +:2050000091FD074629463246204601F07CFC384601F010FEF8BD7047012814BF00200120D9 +:20502000044B03491A78087060F345121A7070472C1A00202C01012038B5044614F8030FD7 +:205040000D462870601C01F0EBFA6880E01C01F0E7FAA880601D38BD38B5382101700125E6 +:205060008570FDF7A3F8041C04D02570A57700F065FD6062204638BD0648018840884FF4B6 +:205080008772401A00F5877090FBF2F15143401A80B2704738FE002010B5FFF7BBFD044679 +:2050A0000448826812B1418800209047204600F03CFF10BD8C0701200648418800884FF443 +:2050C0008772401A00F5877090FBF2F15143401A80B2704704FC0020064A08B5126801EBB9 +:2050E0004031012310466A4601F050FB9DF8000008BDC046CC19002010B54FF6FF700C46A9 +:20510000A04205D0EFF78EFE0249E0B2F8F700FB10BDC0460160002038B5064D05242D1D98 +:205120002846FF210422F6F759FE2D1D641EF7D138BDC0462C01002010B5401E491E4AB116 +:2051400011F8013F10F8014FA34218BF002002D1521EF5D1012010BD08B5002808BF05200A +:2051600009D010F8021CFF2918BF042003D10C38FCF780FC002008BD38B5054601F0DAFBA3 +:20518000044604482946FFF77BFC204601F052FD38BDC046501800200648054A816A8A4220 +:2051A00003D0E030042101F0E3BBF8F7E7BAC046855C000068F2002008B54FF0FF3000F04C +:2051C0003BFF800805D303484FF40061E03001F0CFFB08BD68F20020064A92F8241000200E +:2051E000022906D1D2F8A81019B9D2F8AC1001B90120704768F2002005480068400838BFD3 +:20520000002003D303480068C0F3C0107047C04640210840000004403EB50446A0686A46C3 +:20522000F0F774FF0546832D04D1694620460022FDF774FF28463EBD10B5044600F04DFCF5 +:2052400040B9204601F0FFFA08B1007910B14FF6FE7010BD204610BD38B5064C0546E0797C +:205260000421FCF7E7FB20B9E0792A46042101F023FB38BDC403012008B501F08CFA42F219 +:20528000107210401218034800784FF4804101F013FB08BDCB030120054808B500788DF891 +:2052A00000000448016809B16846884708BDC046FE090120200401200EB54188ADF8001089 +:2052C000417F8DF80210411D019100798DF808006846F4F75DFD0EBD1CB50C4600212160FE +:2052E0006946FFF725F928B9BDF800002146FEF7D3FE1CBDC8201CBD10B50446087A20726B +:20530000087A03281CBF0888208002D1204601F0F7FA0020608110BD491E012202FA01F174 +:205320008BB211460022034218BF0A4349005B1089B2F8D1104670470346104610B51A46C5 +:2053400030B1044B11F8014B62409A5C401EF9D1104610BD5C78020002460648006800E031 +:20536000006928B103799A42FAD183689942F7D17047C046400A012005480EB50068436CEB +:205380000448006802216A4698479DF800000EBDD8050120B4060120054808B5001D0068DF +:2053A000016C0448103000688847FFF7EBF808BDD4050120A406012005490878832805D10B +:2053C0000020087003490870F1F70CBE7047C0466F1B0120711B0120002812BF40680548BC +:2053E000006828B1427B914203D040680028F9D100207047E40A012038B5064C04F108004D +:20540000006820B18569FCF735FB281CFAD10020A06038BD5001012038B5044601F08AFA00 +:205420000546207820B10220FEF720FA00202070284601F0FFFB38BD38B5044601F07AFAED +:205440000546207820B90220FEF728FA01202070284601F0EFFB38BD10B5064C206901F0D7 +:2054600011FB0146A06800B9E160A068401CA06010BDC0468CFF0020054808B541680548F5 +:2054800001220838026048698969884708BDC046500001200C20094041680978491F07D0BB +:2054A000091F03D0C91F05D1FFF79EBAFFF794B8EEF798BF7047011C4FF0000308D01A4619 +:2054C000885C08B101230822521CD2B2082AF7DB18467047022908BF017806D0C2780178E2 +:2054E000837801EB026101EB0341407801EB0020704702294FF0000204D0012808BF4FF444 +:205500007A7203E0012808BF40F2EE221046704780B5074608464FB1437801787F1E00F1EB +:20552000020001EB032122F8021BF5D180BD4FF00451002081F82004012081F860040220AE +:2055400081F86A04032081F878047047402807DB6528B8BF403806DBE02801DBF92801DB0D +:20556000FF2070474530C0B2704710B5041C08BF002008D001F000F84FF47A716143B1FBAC +:20558000F0F000B9012010BD08B50420FFF72CFC142804DCFF20FFF727FC302801DD0120DA +:2055A00008BD002008BD7047054808B500784FF48071FCF73FFA08B9FCF7BCFB08BDC04672 +:2055C000CB0301200549C0310968012303FA00F200200A4218BF181C7047C0460020024083 +:2055E000054800684BF641310001B1EB104F14BF4FF0FF30042070471813005008B5044BA4 +:205600001B689B699847034A0021116008BDC046A801001084046042044908B5096849696A +:205620008847034A0021116008BDC046A801001084046042034605480068491C890089B2E7 +:2056400001EB4331042301F0A1B8C046CC19002008B501238DF800206A46FBF7DBFB024925 +:20566000491C087008BDC046C0190020806802680A604068034A4860106800F00F00800237 +:205680008860704730240340054808B5006800F001FE002814BF6FF00200002008BDC0462C +:2056A000001B0120054808B5006800F0F3FD002814BF6FF00200002008BDC046141B0120C5 +:2056C0000549B1F89400401CA1F8940080B210B90120F8F7B1BD70475001012008B501F066 +:2056E00055FA0349086001F0FDF90249086008BD481B0120441B0120044808B5006801F0E2 +:2057000059FA0348006801F039FA08BD441B0120481B01204FF0FF3181600022026002714F +:205720000274027742771146C1604161816170470548B0F9B610B0F9B400814202D1082037 +:20574000FDF7D2BC7047C04668F2002038B514460546502340F2FF32FFF706F81CB155F81A +:205760002010890A216038BD054908B56A46FDF7D5FC81280CBF9DF902006FF07F0008BDC1 +:205780000100030410B5044601F0D4F803490A7814430C7001F04EFA10BDC046661B0120E6 +:2057A00040684FF0FF330168034ACB6201688A6000680121416070470018002005490978B1 +:2057C00018B908460121F9F743BC02460846012101F072B8CB030120054808B500784FF412 +:2057E0008071FCF727F908B9FCF7A4FA08BDC046CB0301200EB5ADF80000044801910168EA +:205800008DF8082009B1684688470EBD080401200346054810B544682170091261701946C9 +:205820000223F8F739FC10BD2804012001460548006830B142681278914202D000680028BF +:20584000F8D17047C00A01200EB54FF6FC70B4210122ADF800000F208DF808006846F9F772 +:20586000AFFC0EBD044A05493B3210600C3108608420042100F058BFE5040120C4030120D2 +:2058800004490128087014BF01200220024908707047C0469B060120EB04012005494A68B2 +:2058A0000978801A8A00B0FBF2F15143401A80B27047C046D8000020054991F900004FF0C9 +:2058C0008073401C0870002002460146F6F712B8B60A01200448002101700448007808B957 +:2058E000F1F780BB7047C046711B01206F1B01200A684AB1904203D11068086001207047A5 +:2059000011461268002AF5D10020704701460548006828B1027B914203D040680028F9D15D +:2059200000207047E40A012040B1054B33F8022F914208BF012002D0401EF7D1002070475A +:2059400042010020054808300068D0F8B800007808B900F005B8F8F707BCC0460C010020AC +:205960000448002101700448007808B9F1F73ABB7047C0466F1B0120711B012010B50822E3 +:2059800011F8013B10F8014BA34218BF002002D1521EF5D1012010BD0F2808D9044B1038EC +:2059A000012100F01F024009914043F82010704780E200E0054B10B5044601F05FF8A06887 +:2059C00000280CBF0020201C10BDC046800901201CB50C466946FFF77FFC002806BF009932 +:2059E00049884FF6FF7121801CBD026892F85110012904D029B992F85310FDF739BAFCF7AB +:205A0000CBBC70470EB500908DF8041000208DF805008DF806006846F9F754F80EBD28B199 +:205A2000401E082210F8013F994201D000207047521EF7D101207047801E08B506D0401E74 +:205A400000D0FEE700F00CFB002008BDF9F790FE08BD08B58DF801000021032201206B4617 +:205A60008DF800000A20FCF7E5F908BD38B10628B8BF012006DB802801DB8A2801DB00201F +:205A800070470220704710B503460C4650080021C0184FF0000341EB0401F3F7E7FC10BDB8 +:205AA00010B5041C08D000211C22F6F797F94FF6FE702080401C608110BD0222EBF7E0B951 +:205AC0000CB480B502AF3A6827F003031B1D00F08BFFBDE8804002B0704708B500F0B3FE83 +:205AE00028B1007918B10528B8BF012000DB002008BD08B500F0A7FE28B1007918B103286E +:205B0000B8BF012000DB002008BD70470449891C01EB8000017801F0FB0101707047C04684 +:205B200000100840044A121F126802EB80000268914218BF01607047F086020010B5044CEE +:205B4000E22038342146FEF79BFE204610BDC046E402012010B5002430B1C01D80B2F3F7DF +:205B600065FDFF2808BF0124204610BD0146034808B5006842680248904708BDD80100104D +:205B80000040034000F8011B0A0A00F8012B0A0C00F8012B090E00F8011B7047034610467B +:205BA0001A4628B111F8013B401E02F8013BF9D11046704738B50C460546FFF72BF82968C8 +:205BC00044F80C1C2C6000F0B0F938BD044908B591F8410118B1D1F86C0100B1804708BD36 +:205BE000501800201CB5C2F3800302F001040093C2F340032246EBF7B9FB1CBD70B515463B +:205C00000C460646FAF711FA214630462A46EEF7FFF970BD10B5044C00F0A8FE0146A26A95 +:205C20006068904710BDC04668F20020044908B51031096809B1884708BD002008BDC04683 +:205C4000100A012010B5044C0C3424680CB1A04710BD012010BDC046100A0120044A1268C0 +:205C60008A4202D8B1F1FF3F01D1FDF75FBC7047D07302000268406892F83030007800212C +:205C8000042B18BF01215269F8F7ACBF044910B51CC91CC01CC91CC00EC980E80E0010BD19 +:205CA0008484020004490A78904204D00870C8791021F9F7CDB97047C40301200449B1F870 +:205CC0009220904203D0A1F89200FFF785BD70475001012000280CBF002001200249C8702A +:205CE0000871FDF73BB8C046CCE800200449B1F1FF3F07BF0021081C0868091DEDF7F2B80E +:205D0000FFFFFFFF04480168002002E00968401CC0B20029FAD1704764F200200349891E7D +:205D200008800349891E08807047C0461A0601204601012008B5F8F7B5FFB0F1FF3F08BFF4 +:205D4000E82002D0F1F7ACFE002008BD044808B50068D0F82C134FF48050884708BDC046CD +:205D60001401002004480078002808BF002001D0F8F72EBA7047C046701B0120022819BF08 +:205D800002480068024800687047C04604180120001A0120044808B50068D0F82C134FF4AF +:205DA0000070884708BDC0461401002010B5044CA06820B1F4F766FEE068F5F75BFD10BD0E +:205DC000D800002008B500F0B5FD034908398A68CA6000F02FFF08BDE00000200449096822 +:205DE000D1F8EC2052F82000D1F8E4100860704714010020044808B50068D0F82C134FF498 +:205E00000060884708BDC04614010020401E082110F8012FFF2A18BF002002D1491EF7D172 +:205E20000120704702460846002128B112F8013B401E83EA0101F9D10846704730B502FB36 +:205E400001F403FB00444FF00005E2FB00542146284630BD044808B54021A8300160FEF73C +:205E6000B5FEFBF7CFF908BD00A00C4004498868401E886003D10869C96800F0FBBD7047AC +:205E80008CFF00200121044A41600021C16012688160801800F0EABD7C88020010B5044665 +:205EA000086903490968A0608847606010BDC046888802002022EFF3118382F31188426ACE +:205EC0001143416283F3118800F0CCBD04480078012802D9C11E012901D8E7F7B1BB704798 +:205EE0000518002030B10449814203D000212022F5F774BF7047C04680090120044800B5B7 +:205F000002680A21ADF12C0D684690470BB000BDDC74020010B500210446FEF7B1FE0021D1 +:205F200008222046ECF766FA10BD08B50090BDF8020000F07FFEBDF8000000F01FFE08BDC9 +:205F400010B50129044698BF012100F0E9FC204600F0E8FC10BD0A7A02720A7A022A02D039 +:205F60000822FFF71BBE09880180704710B50446FEF770FF032000F0B1FD204600F0E6FDF2 +:205F800010BD10B52021EFF3118481F3118800F065FD84F3118810BD08B5F8F733FD024954 +:205FA0000120087008BDC046BB0A012008B5F8F729FD02490120087008BDC046930B012057 +:205FC00008B5E8F74BFDEEF72DFFF9F78BFEE6F70CFB08BD0349096800EB5100B0FBF1F025 +:205FE00000F038BDA088020010B5044600F0A2FC00216160216000F01DFE10BD03480078F7 +:20600000002814BFFE20FF207047C0462C1A0020692803D06B2818BF6A2801D1022070471A +:206020000020704708B5812101228DF800006B464120FCF7EDF908BD034908310A6810408B +:20604000C2430A607047C04608100440034910B51CC91CC00EC980E80E0010BDB88502008D +:2060600008B5E8F749F90028FBD0401E012800D9FEE708BD034938B53CC93CC01EC980E8BC +:206080001E0038BDCC84020010B500210C220446F5F7A4FE4FF0FF30207110BD0349103156 +:2060A00008680028FCD00020086070470C10044008B5C2F3800302F0010200930123EBF75A +:2060C00055F908BD0EB50091019291F904300A680121EBF7E7F90EBD0328BABF024901EB0C +:2060E000401000207047C04648F40020034938B53CC93CC01EC980E81E0038BDEC84020009 +:206100000160426083610021816001614161521EC2607047034910B51CC91CC006C980E840 +:20612000060010BD4486020010B5046804F1340000F014FC002084F8310010BD034991F8F7 +:20614000D40040F0040081F8D400704758000120034A5168401A11788900B0FBF1F0704705 +:20616000D800002002490880024908807047C0461A06012046010120034808B50078FEF7A6 +:20618000EBFD012008BDC046A406012000280CBF00200120014908707047C0465501012036 +:2061A0001CB514460A460146009300202346FCF72DFB1CBD0A7A032A02721CBF09880180FB +:2061C00001D100F09DBB7047034808B508300068006B804708BDC0468401001000B90348B0 +:2061E0008A0002EBC10108187047C046A40A012008B500F02BFC0248006800F033FC08BD50 +:2062000058FF00204FF47A7101606422827100218180C171704701460A780020012A02D10D +:20622000498801B90120704701460120042903D00A291CBF0329002070474FF6FF70884204 +:2062400003D0C8B2002100F08FB870474FF6FF70884203D0C8B2012100F086B870474FF0D1 +:20626000FF3280680A6042684A6080688860704708B58022FCF762F9002814BFC0680020D0 +:2062800008BD016042600021816001614161521EC260704708B500F0B9FC002814BF00206A +:2062A0004FF0FF3008BD08B50020FDF7CFFBFF200321FCF78BFD08BD024910B51EC980E82E +:2062C0001E0010BDC8860200024A02EBC000F9F7DFBCC046F4870200024910B51EC980E81D +:2062E0001E0010BDD8860200024A02EBC000F7F701B9C046FC870200014602480078FAF72D +:2063000071BAC046800A012002480068FF21FFF786BBC046EC06012001460248006800F096 +:20632000EFBAC046EC0601200248FF2140F22C72F5F754BD2C10002008B500F04DFB0021F2 +:2063400000B10121084608BD0249096851F820007047C046F0860200024A126842F82010CD +:206360007047C046F0860200024A01F0010111547047C04600200240002101604FF0FF3134 +:2063800041600121017270470248002153300170EBF7E6BD50010120024A11680840C143A9 +:2063A0001160704708100440024804218180806900F038BC70F70020024900220C39CA61B8 +:2063C000086070470C10044021B10969884208BF012000D00020704710B5F9F755FD044650 +:2063E000F4F7E6FC204610BD00F00300022101FA00F000F01C007047002101604FF0FF32E7 +:2064000082604160C1607047024A02EBC000F2F7F7BBC04614880200024A002142F8201012 +:206420007047C0460404012008B5FFF7FFF9002814BF4068002008BD0F2802D9014910389F +:206440000860704700EF00E002490968401800F0F9BAC0467C88020008B50249406809686A +:20646000884708BD8C88020008B5024B40681B68984708BD8488020008B5024B40681B6856 +:20648000984708BD9088020008B5024A40681268904708BD9488020008B502494068096838 +:2064A000884708BD9C880200042808B502D11046F0F7CCFF002008BD0068002180F8221046 +:2064C0000B20F0F7CFBC03461979DA88D8781B7AFCF7D8BA19B900210822F5F77FBC00F044 +:2064E0000FBA416004238260002103700846704741600223826000210370084670471346F6 +:20650000024618460B460021FFF74ABE38B50468049D646A0095A04738BD0969006981428E +:206520000CBF0020C8687047416882680020914208BF01207047D0F80320C31D08461946EC +:20654000F2F7E4BC08B5FFF73FFE000C0904084308BD0068002101700B20F0F783BC0178D5 +:2065600041F080010170FFF71FB808B50090684600F03CFB08BD0000014800687047C046D6 +:20658000A0880200014800787047C0466E1B0120014800787047C046671B01200148001D22 +:2065A000008870478A010120014800787047C046E7020120014800787047C0468601012042 +:2065C000014800887047C0468A010120014908707047C046E7020120EFF3108072B67047A7 +:2065E00000207047EFF3108062B6704700207047014800787047C046B60B012013460A46A3 +:2066000001461846FEF798BE0148006800F0A8B9001B01200148006800F0A2B9141B012000 +:2066200008B50221FEF756FF80B208BD08B5014688684968884708BD18B1006808B100F026 +:20664000D9BA704701480830006870475018002001491231085C7047881900200149097894 +:2066600008407047661B012008B50090684600F0E5F908BD014A42F8201070470404012056 +:206680000149091F08607047F80A0120014908607047C046F80A0120014800787047C04636 +:2066A0009D060120014800787047C0469A06012001493631087070476806012001490870A6 +:2066C0007047C0469D060120D0F8032008460021F5F784BB08B5FCF721F8F4F717FA08BD2A +:2066E00008B5EFF7A9FCECF7DBF908BD01480021017070476E1B012001490C3108607047F4 +:20670000D4050120014800787047C046B818012001480830006870475001012013460A4655 +:2067200001460020F9F784B913460A4601460020FCF7AEBE08B51046F8F7CCFD002008BDA6 +:2067400001B9014900F076B918860200426808604A60116041607047014880687047C04603 +:20676000B0FF0020006908B1FBF784B970470021816001704160704708B503689B6898476D +:2067800008BD08B50268D268904708BD10B50468E469A04710BD08B5FBF70CFA80B208BD59 +:2067A00008B501680968884708BD08B502681269904708BD08B50168C969884708BD4068DC +:2067C000002180F8FD10704708B501680968884708BD08B502681269904708BD0020FE29AC +:2067E00008BF0120704708B503685B68984708BD08B503681B69984708BD08B50368DB69AF +:20680000984708BD406800680121C1647047012085210022E6F740BE08B5FBF7CBF9C0B21D +:2068200008BD0A4601460020F9F7A8BE406800F58A7000F095B800212422F5F7CFBA0021B5 +:206840001022F5F7CBBA01460020F6F7EDBB01464A20FEF715B84068002101707047002114 +:206860000222F5F7BBBA4068002101707047FF210E22F5F7B3BA40686C3000F071B84068F4 +:20688000C43000F06DB84FF0FF30906070470122EAF7F6BA0222FBF70DBC0122FBF70ABC6C +:2068A0000021F6F7C1BB401EFDD170476FF0010070470123EFF756BB0023EFF753BB0720FB +:2068C000F4F77EBB0022FCF729BC0022FCF726BC4FF0FF3070474FF0FF307047401C80B2CB +:2068E00070470320FAF784BDC000FFF7DCBFE920F3F796BD0846F3F763BB0846FBF7BAB8ED +:206900000822FFF74BB98160426070470120704730BF704700F08AB800F084B8FDF7E6B9AA +:2069200000F03CB900F036B900F064B9FFF734B800F074B800F0F6B800F06CB800F066B8C8 +:20694000FFF77ABD00F05EB800207047002070470020704700207047F4F72ABA00F04EB8E3 +:2069600000F060B900F046B800F0BCB8FFF7F4BEFFF7A0BA00F076B8FEF74EBB00207047D1 +:20698000002070470020704700207047F32070470020704700207047DC207047DD20704793 +:2069A000002070470020704700207047C2207047FDF7E8BDFFF7D6B90020704700207047ED +:2069C000002070470020704700207047012070470120704700207047808A7047806870474B +:2069E000EFF768BE0120704700F000B8DFF800F0B9F80210DFF800F0BDE80210DFF800F03C +:206A0000FDE60210DFF800F019E90210DFF800F01DD90210DFF800F0D9D80210DFF800F086 +:206A200075E40210DFF800F0FDE90210DFF800F049E60210DFF800F0C9F40210DFF800F0C7 +:206A4000DBEC0210DFF800F09DE80210DFF800F0D7DB0210DFF800F001CE0210DFF800F005 +:206A6000B1D70210DFF800F091D80210DFF800F0E5DE0210DFF800F07BEC0210DFF800F097 +:206A800019D70210DFF800F077EC0210DFF800F067F30210DFF800F0C5EA0210DFF800F036 +:206AA00049DC0210DFF800F0F9F20210DFF800F0EBEC0210DFF800F06BEC0210DFF800F034 +:206AC00031EC0210DFF800F0F1DC0210DFF800F059F50210DFF800F01BD00210DFF800F02F +:206AE00011EA0210DFF800F025EA0210DFF800F0D7EC0210DFF800F0D3EC0210DFF800F0A6 +:206B00007DE80210DFF800F021D40210DFF800F049EB0210DFF800F0E5F80210DFF800F0A6 +:206B20008DDD0210DFF800F055EB0210DFF800F0F1EB0210DFF800F039F70210DFF800F03B +:206B4000AFEC0210DFF800F0ABEC0210DFF800F0B1F70210DFF800F0B9DC0210DFF800F062 +:206B6000F5EA0210DFF800F015DF0210DFF800F0D9D50210DFF800F009EC0210DFF800F03B +:206B800045DF0210DFF800F02FEB0210DFF800F04DEA0210DFF800F0E7E90210DFF800F04C +:206BA000C3EC0210DFF800F025DB0210DFF800F09DEB0210DFF800F061DB0210DFF800F0FE +:206BC000F1EC0210DFF800F05DF10210DFF800F0C5F30210DFF800F0A5EA0210DFF800F0DF +:206BE000C1DD0210DFF800F0E5EB0210DFF800F0BBEC0210DFF800F0C5E20210DFF800F075 +:206C00001D870310DFF800F0D9EB0210DFF800F0B1BF0210DFF800F021EB0210DFF800F02B +:206C2000CDEB0210DFF800F021CD0210DFF800F011F70210DFF800F047EC0210DFF800F00F +:046C400011DC021051 +:206C4400301B01202C170120C01A0120A01701200000000018190120381B0120C8190120C5 +:206C6400D01A012034180120A482020028870200CA8702004487020036870200E01A0120C5 +:206C8400F4070120F8070120FC0701200008012004080120080801200C080120100801209B +:206CA40014080120F01A012068170120881A0120601801209E7E02002C7E0200107F020011 +:206CC400827F0200F47F020000860200788702006C870200731B0120181B0120240A012068 +:206CE400E4190120FC0801206B1B01206C1B0120D41701209C1A012058030120180801205E +:206D0400207D02005C790200000000000000000018870200F4130120601B01205C1B0120FC +:206D24001C08012020080120541B012024820200341A0120F81501200000000000000000EC +:206D4400580A012000000000000000000000000000000000C007012068110120980B012066 +:206D6400014A031049480310D549031015470310A97C01005D49031081470310A1460310B9 +:206D84009548031045450310254A031021440310ED47031099490310E14803102149031073 +:206DA4005553031089520310CD520310655003108D4E0310A580010001C30100DDDA01009B +:206DC4000000000059510310ED50031009CD0100CD4B03102952031011530310A95503108A +:206DE4007555031069530310DD55031035550310FD7F010021540310855C03100D56031092 +:206E04004D5D0310A9640310B55B03106D570310E5610310095E0310C5580310856003109C +:206E240071610310B16203109963031055630310FD600310B15E03105D6B0100D55A0310CC +:206E4400D559031009630310D963031019640310555F0310C56403104D62031071640310E2 +:206E64008D64031055640310E16403102975031079720310A16B0310F57203109D7403107A +:206E8400797403102D74031061730310FD7303105574031015750310D96C0310FD7403107B +:206EA400D1220100E17403103D750310F1790100F9640310CD6803102D710310C174031091 +:206EC400F56E0310B973031029670310056E0310C56F03103D930100A1770310797D031084 +:206EE4003D7E031049750310157E0310357D031099760310997C0310257B0310717803108B +:206F0400B57D0310ED7C0310857E03102D790310B97A0310917B0310B1790310ED7B0310C0 +:206F2400E97D0310617E0310357A0310D57E0310457C0310A57E0310BD7E0310DD5701002D +:206F4400D9800310E97E031049830310898403108D8103107D820310E58403102B840310D7 +:206F6400C5830310918703106188031045880310F1850310B18803107D880310C98803105A +:206F84001D870310A186031001850310E188031099880310F9870310BD750100359C031009 +:206FA400819D0310E99A0310359B0310C19B0310419A0310F18803101D8C0310618F03107B +:206FC400F1940310919E0310C19E03103D9E0310699E0310259E0310619D03100D9E0310B4 +:206FE400819B0310ED93031055990310C9970310D9980310BD950310959C0310C19D0310B9 +:20700400A59E03107D9E0310C9910310319A0100699C0310DD9D031095900310FD9B031027 +:20702400CD990310158E0310019D0310E19C0310219D0310419D0310BD9C0310F59D031009 +:20704400A19D031055980310E1920310999A0310B99E0310559E0310F13202006D5A0200B1 +:2070640039A203104D55020069A1031075A20310C59E0310B9A10310F9A1031015A10310DA +:207084009DA20310ED6602004FBE0100E56C0100D523020085650200A59D000031A90310D0 +:2070A400ADA2031041F80000B9A8031099A50310557D010039A803106DA90310155C01000A +:2070C4006DAC031099B1031009AF031059B1031001B103109DA90310A16902009D69020009 +:2070E4008D6902008169020095690200996902008569020091690200A5690200A969020094 +:2071040089690200F1B9031075BA031081BB03109D2B0200E1B3010065ED0100216C0100E9 +:2071240059270200F1E601003D3B020055E70100652B0200A14D0200F158020005ED01007A +:2071440075110200F53302003D04020071DA0100DD5D020089C20100AD1302000D5E020033 +:20716400BD690200C5690200E9D7000065F10000E9C60310C1690200F19500004D69020071 +:20718400052E0200575F020083EE0100E3680200875A020049690200AD69020045F4010056 +:2071A400F1A10100719C010001000000000000000000000000000000FFFFFFFF5C0B0120A5 +:2071C4000400000000000000000000001400000030FD0210180000004C8802006C72020086 +:2071E400340B01200400000000000000000000002400000018FD021018000000FD5E020067 +:20720400080000005C73020020720200C1C8021001BB021091EB0210DDE5021081E00210BF +:20722400B9E5021071E50210310000000100000001000000A488020000000000FFFFFFFFD5 +:20724400540B012004000000000000000000000028000000B8FC0210240000001E00000076 +:207264001800000000000000D4740200807202009BEC021025E2021005EB021025DE0210EB +:20728400FDE10210E1E402102F000000340000002400280000000000D0090120FFFFFFFF7E +:2072A4007C0B0120040000000000000000000000380000006CFC0210280000000100000043 +:2072C400100000000000000000000000F7F1021000001A001000000003000000B487020036 +:2072E400528702000800000036000000600901205408012009001D00A755020054070120CA +:207304000100000000001200FFFFFFFF6C0B012004000000000000000000000010000000AE +:2073240048FD0210180000000000000000001300FFFFFFFF840B0120040000000000000017 +:207344000000000054000000A0FB02103C000000000001002D000000B07102001750020032 +:2073640030000000000000005C7302008473020089FA0100D9DB021059EC0210CDD60210B9 +:2073840085DE02104DE5021029E5021030000000000016000000000000000000FF7F00004C +:2073A40088050120FFFFFFFF640B012004000000000000000000000058000000DCFB02104A +:2073C4003400000039FB021001002F00060000000000000020000000010000001BF80210B3 +:2073E40028000000D4740200FC73020093EC02106DEB02104DEC021029E00210BDE4021092 +:2074040099E402102D000000000000003C0B01200400000000000000000000001000000030 +:2074240040FC02102C000000000000000000030000000F003C000000000000000000000080 +:207444002FF9021010000000080000006C860200FFFFFFFF740B0120040000000000000042 +:20746400000000001C000000DCFC021024000000E8730200240B012004000000000000002D +:20748400000000000C00000000FD0210180000000B5B020000000000000000000800000045 +:2074A400010000000400000000000000000014000000000094810200000019000000180067 +:2074C40024000000E56902000040000000020000B07102000000100055F002100C0000005C +:2074E40029360100000000001C0B01200400000000000000000000002000000010FC02109E +:2075040030000000AC8102000100000087680200AF45020000000000000017000002000007 +:20752400310000000000230000001500010000006C7302004C0B0120040000000000000080 +:20754400000000002000000094FC021024000000C4810200A40A0120200000005C84020029 +:207564008F0001001105012087000100E5040120350028003003012028000100F9040120B6 +:2075840029000100FA040120840004002005012086000100990601202A000100EA0401204F +:2075A4002B000100EF0401202C000100F10401202D000800240501202E000100F20401207F +:2075C4002F000100F304012030000100F404012032000100F504012033000100F604012079 +:2075E40034000100F704012036000100FD04012038000100FE04012039000100F004012032 +:207604008300020014050120630001000A05012065000100FB0401206D0001000C050120ED +:20762400710008002C050120660001000B05012043000100050501204400020016050120F2 +:2076440045000100060501204600020018050120470008003405012048000100070501200F +:207664004B0001000805012004000100900B0120A1000100920B012037000100910B012076 +:2076840088000100120501203C000100FF0401203D00010000050120490002008E0B01205B +:2076A400670001000D0501204D0002001A0501204E000100090501204F0002001C0501208B +:2076C4003E000100F804012051000100E704012052000100E804012053000100E90401202A +:2076E400540001000405012000000000000000005D40002189400021954000213B410021CC +:20770400074C657900F009F861796940490703D50121044A8903116070BD70B5024908473F +:2077240080030021081104402D59000000F00AF800480047577F000000F00AF800480047E6 +:207744001B880000806B0C490007000F48717047094A0A4918235079CB56497EC01881428F +:2077640001DD084602E00F2800DD0F20D189090909010143D1817047E00200218800002145 +:207784000122274B02212548184710B5254880472548406A00280DD124490A20085600282E +:2077A40009DA401C07D008462038406A2049884200D1804710BDFFF7E3FF10BD00211E4B98 +:2077C4001C4A0846184701201C49400208601C48FB220178114001701248EC38004710B51C +:2077E4001849884711492039012807D0020404D50020088514484862012010BD4A6A094B1A +:20780400EC3B9A4201D1114A05E007494A6A104B9A42F2D10F4A4A6210BD00000608000071 +:207824009F060000A1920200080100215401002163920200E7400021B5B4020080E100E0DF +:2078440080030021F7960200DD4000212341002169950200194100210097B92EE5725CCBB7 +:207864005DCAE473B82F0196BA2D03945FC8E671E7705EC90295BB2CE3745ACD0691BF2814 +:20788400BE2907905BCCE27559CEE077BC2B05920493BD2AE17658CF51C6E87FB4230D9AF4 +:2078A4000C9BB522E97E50C7EB7C52C50E99B720B6210F9853C4EA7DB2250B9C57C0EE79D4 +:2078C400EF7856C10A9DB324089FB126ED7A54C355C2EC7BB027099EA2351B8C47D0FE69B4 +:2078E400FF6846D11A8DA334188FA136FD6A44D345D2FC6BA037198E41D6F86FA4331D8A94 +:207904001C8BA532F96E40D7FB6C42D51E89A730A6311F8843D4FA6DF3644ADD1681AF3873 +:20792400AE3917804BDCF26549DEF067AC3B15821483AD3AF16648DF1087A93EF5624CDB53 +:207944004DDAF463A83F1186AA3D13844FD8F661F7604ED91285AB3C0001363601010001BF +:20796400020100010301000104010606080400000C0100340D01000F10040101140100FF55 +:207984001608000020020000220100FF23010001240100FE250100082602000028010001B9 +:2079A400290100012A0200002C01000F2E0200003001000131010008320200FF3401000725 +:2079C400350102FF360100003701000138010001390100FF3A01000F3C0200FF3E01010FB3 +:2079E4003F0100014001041F41010001420100FF43010080440800004E0100084F01000F93 +:207A040050010001510100FF520100005301000054010001580400005C04000060040000A2 +:207A240064040000680400006C0400007004000074040000780400007C040000800100FF96 +:207A4400810100018201000183010202840100011E060120751B0120761B01201D06012021 +:207A64006D1B01201F0601201C060120F9660200EDC50000355D0200F9410200CD410200DD +:207A840031F301008DF30100ED030200DD160200F9480200AD3A02007D3A020019680200ED +:207AA400FD5F02001950020025330200354D0200656102001D5D0200114D0200DD3A02005E +:207AC4000DAB0100996A01005F44020081F90100A5EC0100D5660200E166020000000000AD +:207AE4009953020083D401005DB301001D270200000000005933020005670200D52B0200E7 +:207B0400955D020000000000000000000DE60000795302001D9E01000D0C0200032C0000A6 +:207B24000000000000000000000000000000000003080000000000000000000000016509C7 +:207B44000000000000000000012C000000000000000000000001001E0000000000000000D5 +:207B6400020800000000000000000000000101000800FFFF980A0120B8090120A009012080 +:207B8400022C000000000000000000000000000000000000000000000000000000000000B3 +:207BA4000128000000000000000000000001003000000000000000000003FF1864000000E9 +:207BC40000000000000000007856341200000000BAAB00000000000100000000FFFFFFFF2B +:207BE400FFFFFFFF1300000051FC00001F000000215601001F800000A52202000000000026 +:207C0400EDB7000001000000EDB7000002000000AD21010002800000FF560100030000006B +:207C2400DDA7010004000000F902010004800000DF6101000500000039CB010006000000E6 +:207C4400CDB3000030000000F9090200310000005D820000320000003108010033000000BD +:207C640079190100340000006171010036000000C1D8010011000000C19601001400000019 +:207C8400A592010015000000450A0200FFFF000000000000FFFFFFFFFFFFFFFF000000004C +:207CA400000000000000000000000000000000000000000001000000E1A600000600000032 +:207CC400F3D4010008000000A1E201000B000000DB1202001000000029F400000A0000001B +:207CE40065B4010002000000213501000500000099EE000007000000618500000C00000088 +:207D0400459300000D0000006D0B00006400000021230200FF000000000000003600010022 +:207D24000600000000000000000F000000000000000000000000000000000300FFFF000029 +:207D44000403FFFF0000FFFF0F00E8030005401F0310000100000000FF3F0F000800050B45 +:207D640000000000000000000300010F0000000000000000000000000000000000000000EC +:207D840000000000000000000000000000000000000000000000000000000000AD00000230 +:207DA4000000000000000000000000000000000000000000000000000000000000000000BF +:207DC40000000000000000000000000000000000000000000000000000000000000000009F +:207DE40000000000000000000000000000000000000000000000000000000000000000007F +:207E040000000000000000000000000000000000000000000000000000000000000000005E +:207E24000000000000000000010171010101010111010101310101010101800100011001E9 +:207E440061013B001400630173017201620143010001130106013D013500040112010001D3 +:207E640000010001000104010401330133013C014401320136000001000165010001350000 +:207E8400810100010501820183010001660100010001080109010A010B0103007100300115 +:207EA40060001100700031022003500480000700100061000000140063007300720062007D +:207EC4004300000013000600000000000400120000000000000000000400040037003700B6 +:207EE4003C02440000000000000000006500000035008100000005000000830000006600F3 +:207F040000000000080009000A000B0003027102300160021102700201020202020280021A +:207F24000002100261023A00410063027302720262024302000213023800000200020402FB +:207F44001202000200020002000204020402370037003C024402000239000002000265025D +:207F640000023502810200020502820283020002660200020002080209020A020B0201038F +:207F8400710301030103010301030103220302030103000310030003000300030003000302 +:207FA400000300034203000324030603000300030403120325032303250323030403040373 +:207FC4000003000300034403000300032303000365032100350381030003050300030003C8 +:207FE4000003000325032303080309030A030B03030471040204600411047004020402047C +:2080040001040204000410046104000414046304730472046204430400041304060400048E +:208024000004040412040004000400040004510464000004000400044404000400040004F1 +:208044000004650400043504810464000504000483040004660400040004080409040A0458 +:208064000B040506D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF0000000000000000000000006A +:20808400000000005A6967426565416C6C69616E636530390A000000020000000400000014 +:2080A4000800000010000000200000004000000080000000000100000002000000040000BD +:2080C40000080000001000000020000000400000154C02002B5F0200C19F0100751A020043 +:2080E400395102000D8F0100DDBD01004D4F0200595102004B3D0200793D020029220200DF +:20810400C5350200B55B0200F5EF0100E507020061E5010051F00100DBFD0210C54D0200F3 +:2081240011DC02104DA001003966020059430200B5610200016902007D5902008F00000024 +:208144008F0001008F0002008F000300900000018F00010190000002900000038F0001048D +:208164008F0000058F0008048F0000048A000006510000007F0001003F0004003F00020054 +:208184003F0001007F0002008F0002048F0001027B7374617469632D696E7374616E63656E +:2081A4002D6E616D657D00C07B656D7074792D696E7374616E63652D6E616D657D00C04633 +:2081C4007B756E6B6E6F776E2D696E7374616E63652D6E616D657D00B5F501001FF902106E +:2081E40045F8021059F802106DF8021081F8021095F80210F5B901002D3C020035200200B7 +:2082040029360200794E0200C961020079540200252D020045650200E55E020085D4010096 +:20822400C003000080070000000F0000001E0000003C00000078000000F0000000E001003E +:2082440000C003000080070000000F0000001E0000003C00000078000000F0000000F0000F +:208264000000004017FF0000000000000400FFFF08000000100000004018002030180020AA +:20828400401A0020301A00200A000000090000000C0000000B00000009080AFF0A000000A8 +:2082A4000000000002000000020000000A00000002000000020001000000000000000000A7 +:2082C40000000000000000000000000000000000000000000E00000000000000000000008C +:2082E40000000000000000000000000000000000000000000000000000000000000000007A +:20830400000000000000000000000000FFFFFFFFFFFFFFFF81570000DDB500008115000061 +:20832400D1710000E56D0000B91E0000457F000055A70100F169000041550100010001001A +:2083440001000100010001051E0D0C1C1D1E0F0E0607140A08090001020001000100010023 +:20836400010001020001024057680200AD680200DD3702006D560200E1FD0100895602003F +:2083840075B701007914020009660200351201003DAF0100E13E02000D3802005F6202004C +:2083A400B5300200A5560200293D01005D0E02001566020031ED0000C9B0010029E60100DC +:2083C40067680200410D0100F9100100D16802001509020081530100D76802007D980100E8 +:2083E400000000000060250000100000EC16012040000000000000000000000000093D003B +:2084040014000000640000005C7302002484020069640200796402009964020089640200C9 +:20842400BD3C0200C14E0200B143020032000000001000400600000015000000FF0000009A +:20844400000000000D0CFFFFF818012020000000010300000000000015F9021001E6021093 +:208464002DDA021045E7021041D10210C9D30210A5DF02102DE4021061EA02107520020022 +:2084840000000000FFFFFFFFFFFFFFFF00000000000000000101010100C201000300000016 +:2084A40000000000D4740200BC840200D169020095A301007DCD01005D3C02009D4E0200E4 +:2084C400854302002E000000FFFFFFFF0000000000000000000000003A013A01000000002E +:2084E400000000000000000000000000FFFFFFFF000000000000000040420F0008000000E3 +:208504000000000000000000A88402002C0B012004000000000000000000000020000000AD +:2085240018860200180000000C840200440B01200400000000000000000000001400000065 +:20854400848502001C000000FFFFFFFFFFFFFFFF00000000000000000000000000000000F8 +:208564000000000000000000000000000000000000000000000000000000000000000000F7 +:208584001C0000000000000000000000988502000000000008000000000000006C830200A3 +:2085A400581B01203C88020094830200241B0120E48302000100000040420F0001000000E8 +:2085C400000000000000000000000000D9FF010085490100BF670200111D0100097C000013 +:2085E40081E7000000000000020000000100000003000000100000002000000000000500D4 +:20860400BD00B700B100BC001C003000380008003801020018000000000000000000000096 +:208624002886020008000000000000000000000045680100395A0200010101000000000038 +:20864400020000000000000000000000FFFFFFFF0000000000000000060000000200000010 +:208664008600000082000000010000000000000000000000000001000000010000161000C5 +:208684000018151002000224145800001000002000000000000000000000000000000000D5 +:2086A4000000000000000000000000000000000000000000000000000000000000000000B6 +:2086C400000000000200000000000000FFFFFFFF000000000200000000000000FFFFFFFF9A +:2086E4000000000068020120001501207C150120FFFFFFFF3C1301207488020098130120CD +:20870400768802000000000020000000400000006000000088B2240088130000100000008C +:208724000000000100A6AAACA4A9A9A399B19ABCB6A8313118191A22311C1E203131343180 +:20874400313117191A21241B1D1F313133310000000000000000000000000000FF00000008 +:2087640000000000000100000C0E020B040B0A070800110F000120181A18182C34041E0080 +:20878400FF000100FD5B020007000000D08502006810012064820200BC830200B80D012075 +:2087A40034840200FF0000000000000080A9030025DD021031C8021075DF0210020102073F +:2087C400013B893401000204020101010109020000BE040A00BE02080102000302000103E4 +:2087E400FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF1C1A01206B8302008C180120938602005E +:20880400E80300000000640000080004000200017C140120A88702003819012054880200C4 +:20882400038000CC038000DD0380000C0380005D038000C0038000D5000005000060000016 +:2088440000000000080000000000000000000000000002400A29FF0010040810181C100028 +:208864000810182004040810181C0000010203040601070100000000100000000100000026 +:20888400F5680200D5690200033E0200FB680200A50C02002D050200CD6902000A00000064 +:0488A400CD5B0200A6 +:2088A8009998000015250100000000000000000000000000E55B0200B160020069C90100BC +:2088C80075600200CB680200C5680200C5600200000000005F680200F5C80100E9D10100EC +:2088E80069570200E19B010071620200A1520100BDB10000CDA60100195202000000000019 +:20890800C9F701001557020009870100995F0200C962020053650200B962020037680200F0 +:208928008F680200BB5A0200AD5F0200E9620200B9640200D96202003F6802009B680200BA +:0C89480095680200F1640200E364020084 +:20895800003D00000F05D41B002001BF06017FFFFFDEFFEFA79C01000003FFE38813FCFFD0 +:20897800EFE11FFF2FF50C200601205408C7012001FFE00031FFE96009B301200031FFEDE3 +:20899800FF7FFFE46CFBDC02FFE57007012003FEFFE4FD3B02006D5F028404FEFFE1240621 +:2089B800B0FFE106B9077984CC01F4FFE9A80B083508B10120A9080036FFEBAE0270A00246 +:2089D800B0A4AA02F53A0BB0060E63010E0064C9120CBF000FF10104891080010CD2FFE722 +:2089F800800C4F02FFEFB7010FFFEFEF013514FF0200A88802001489B62CA38DD9FFEF04F9 +:208A18000260004100E120003100B0007200B4000220220174400034013100380102750084 +:208A38003F05F300030570003500001000D700FEFFFFEFD00104FFEF17CB0364483F001DB8 +:208A58007F0F04033F20FFEF1E494CFFE7DF6D37000041FFE41952B6FFEF0C01A0FFEF042E +:208A780085E4519201FF0808020101010307FF0D1E02051E01640AE700020300F00131099E +:208A980003009F030201020A5AA34D3001FFFFFFF401803EE803FD0554B523456789ABCD19 +:208AB80095EFFFEF02FF2558FF0004FFEF22888705012000315C791CD66110B88E5AF43930 +:208AD800EC022CB00FBCFFEF4501DB003064BEC5A7FFE3F1610E6A650100D06D3001750225 +:208AF8007D0177085F4F1568001531032CA054916FF50C6F2BE6FFEF5D6C727C267FF4010D +:208B18000068887CB0003101BF02847E700031FFEF62EDFDD2FFEF05C046C00000F052FF85 +:208B3800E0F085F286312C0034340034153C00344400344C00348FB18FF1033DC52AB749EB +:208B5800912B8D037189F58A31558C00349400349C0034A4003479AC0034FFEF9A0170FF31 +:208B780000200031E6A0BDA3DF3C7342DF0E2BD4D7FFFD0307C201838703FF00C306020172 +:208B9800A86001EE46722B5EC84CD0320583AB870001710501700447B979BB540233B2FF5B +:208BB8000014319F2F9E4D7E2CF7827F2DB7FFE914000A7F130F14201400320010E4AB1049 +:208BD800A2607DFFEF07794F0683880F6F00D388F355320C84B12386B4F1FEFEAE3F007DE8 +:208BF800807DBC0A3F04053B0003B8E24390010032FFE5BFE5FB010055693B370B3E82D025 +:208C1800480A01201CB2300031552400342C00343400343C0034554400344C0034540034E0 +:208C38005C0034556400346C00347400347C0034FD84003400C0FEFF0A0101E061FF070DD5 +:208C5800E9FFF00077063C00000FA72CC54002FFE6FFECC6040000EEC806EF0000F1CA0082 +:208C780040F4CC0A6F0000F6CF0040F7D00090FFFAD4100000FBD612DF0000FD9318FFE0E1 +:208C98005328EF000001560040025932FF0000035D38000004FF634E000005177200FF0056 +:208CB800062A4F1480075FFF281480085A331080FF095F3F10800A664FFF10800BCB213098 +:208CD800800CFFCC273F800DCDC33FFF800ED6271B800FDAFF2F1B8010DE391B80FF11E5D5 +:208CF8004F1B8012E047FF308013E2613F8014FFF5753F807FFFFF3F000690FFEF19FFF0F1 +:208D180000E500000FA1020100BF0514BF027D69023F0035260100C9007016B10503170563 +:208D380020179F54FFF0000031E0010037650200C96602000000000002000000100000000F +:208D580002000000100000000200000010000000020000001000000002000000BF0F0000F5 +:208D7800000100000F15FFF00200000010000000000FAC710200FFF0000FDC810200FFF03B +:208D9800000F4CFF0020FFF058890200501A00205B8C020020010020188D0200501800208C +:208DB800508D0200301A0020588D020030180020608D0200401A0020688D0200401800202B +:208DD800708D0200B80B0120788D0200D8000020808D02000C010020888D02000001002025 +:108DF800908D020004010020988D020008010020D7 +:020000040005F5 +:207FA800000080011000C0FFFDFF58003AC1F9F1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF40 +:207FC800FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC508FEC5FFFFFFFF00FFFFFF00C5C5FF97 +:187FE800000000FF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF92 +:00000001FF From 7977381a94947120674ba88b278ba3dd44140d71 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 26 May 2022 19:31:11 +0200 Subject: [PATCH 286/376] fix_compilation --- tasmota/berry/zigbee/cc2652_flasher.be | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/berry/zigbee/cc2652_flasher.be b/tasmota/berry/zigbee/cc2652_flasher.be index d4431a4fa..08cb2bd34 100644 --- a/tasmota/berry/zigbee/cc2652_flasher.be +++ b/tasmota/berry/zigbee/cc2652_flasher.be @@ -281,7 +281,7 @@ class cc2652_flasher var b = bytes("21") b.add(addr, -4) b.add(sz, -4) - if self.debug print("cmd_download",b) + if self.debug print("cmd_download",b) end return self.send(b, true) end @@ -292,7 +292,7 @@ class cc2652_flasher if sz > 128 raise "value_error", "len is bigger than 128" end var b = bytes("24") b += data - if self.debug print("cmd_send_data",b) + if self.debug print("cmd_send_data",b) end return self.send(b, true) end From 1612b8169a4120332582b674a651c10ed17aee60 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 27 May 2022 15:46:18 +0200 Subject: [PATCH 287/376] Copy Sonoff ZB Pro autoconf in Tasmota repo --- .../Sonoff_ZBPro.autoconf | Bin 0 -> 392 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tools/fw_SonoffZigbeeBridgePro_cc2652/Sonoff_ZBPro.autoconf diff --git a/tools/fw_SonoffZigbeeBridgePro_cc2652/Sonoff_ZBPro.autoconf b/tools/fw_SonoffZigbeeBridgePro_cc2652/Sonoff_ZBPro.autoconf new file mode 100644 index 0000000000000000000000000000000000000000..342c3d5aa0131a29cbbefc534438ef3b012bbc86 GIT binary patch literal 392 zcmZ`#K}*9h810;j40aoyOTb%f+I6j4@zQ|~sdI(Ri{c^avMrD%BTX479=!TH{1^TP ze~uSVCc1$a^YMLo@9{oJUY<4gJB~dk<@@aG^W*in;W)OBjK&1h9>ID>%QeTEx=-LH z9bbS1Or?;Eg?q=Agi<$G5 z)bAM{_e}eJqi=n7IrxM92M8{&(-BB~2!`p@yd`*Ux5jc_bL#r-)ncG= z;f=RsdR3FUqN=mPq5Olo}%@DvdcuC1wIGm?}3|QB>RSv4UZ~Glt#MM?%zm pxmMC6Otf2h*4XPb|4;8HRx{pSEZSw6X9tItH%!ImJ~vrA&NmaNWC8#H literal 0 HcmV?d00001 From a43c194db6cb051f8cdbb9a568f5d61cdacee27e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 27 May 2022 16:08:27 +0200 Subject: [PATCH 288/376] Add support for Sonoff Zigbee Bridge Pro - Add support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701) - Add command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules (#13447) --- CHANGELOG.md | 2 + RELEASENOTES.md | 2 + tasmota/xdrv_86_esp32_sonoff_spm.ino | 58 +++++++++++++++++++++------- 3 files changed, 48 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4dbda3dcc..1b6b620e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to this project will be documented in this file. ## [11.1.0.3] ### Added - Support for Sonoff SPM v1.2.0 +- Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701) +- Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules (#13447) ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 25da59439..08de41613 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,10 +110,12 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) - Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy [#15513](https://github.com/arendst/Tasmota/issues/15513) +- Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules [#13447](https://github.com/arendst/Tasmota/issues/13447) - Support for Sonoff MS01 soil moisture sensor [#15335](https://github.com/arendst/Tasmota/issues/15335) - Support for daisy chaining MAX7219 displays [#15345](https://github.com/arendst/Tasmota/issues/15345) - Sonoff SPM delayed SetPowerOnState [#13447](https://github.com/arendst/Tasmota/issues/13447) - Support for Sonoff SPM v1.2.0 +- Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger [#15701](https://github.com/arendst/Tasmota/issues/15701) - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 7c9c37246..1aa76c03a 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -49,7 +49,7 @@ * - Yellow led blinks 2 seconds if an ARM-ESP comms CRC error is detected. * - Persistence for module mapping, total energy and energy yesterday * - Supported commands: - * SspmDisplay 0|1 - Select alternative GUI rotating display either all (0) or powered on only (1) + * SspmDisplay 0|1|2 - Select alternative GUI rotating display either all (0), powered on only (1) or user selected (2) * SspmDump 0|1 - Select shortenend (0) or full (1) serial receive buffer dumps * SspmEnergyTotal - (p)reset total energy without today's energy * SspmEnergyYesterday - (p)reset energy yesterday @@ -210,9 +210,8 @@ TasmotaSerial *SspmSerial; typedef union { uint16_t data; struct { - uint16_t dump : 1; // bit 0 (v10.1.0.6) - SSPMDump - Short receive dump (0) or full receive dump (1) - uint16_t display : 1; // bit 1 (v10.1.0.6) - SSPMDisplay - GUI display all relays (0) or only powered on relays (1) - uint16_t spare02 : 1; // bit 2 + uint16_t dump : 1; // bit 0 (v10.1.0.6) - SSPMDump - Short receive dump (0) or full receive dump (1) + uint16_t display : 2; // bit 1,2 (v10.1.0.6) - SSPMDisplay - GUI display all relays (0), only powered on relays (1) or user selected relays (2) uint16_t spare03 : 1; // bit 3 uint16_t spare04 : 1; // bit 4 uint16_t spare05 : 1; // bit 5 @@ -2103,7 +2102,8 @@ void SSPMEnergyShow(bool json) { power_t power = TasmotaGlobal.power; for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { if ((0 == Sspm->Settings.flag.display) || - ((1 == Sspm->Settings.flag.display) && (power >> i) &1)) { + ((1 == Sspm->Settings.flag.display) && (power >> i) &1) || + (2 == Sspm->Settings.flag.display)) { relay[index] = i +1; indirect[index] = i; index++; @@ -2111,23 +2111,40 @@ void SSPMEnergyShow(bool json) { } if (index) { - if (index > 4) { - Sspm->rotate++; - } else { - Sspm->rotate = 0; + if (Sspm->Settings.flag.display != 2) { + if (index > 4) { + Sspm->rotate++; + } else { + Sspm->rotate = 0; + } } - if (Sspm->rotate > ((index -1) | 0x3)) { // Always test in case index has changed due to use of SspmDisplay command + if (Sspm->rotate > ((index -1) | 0x3)) { // Always test in case index has changed due to use of SspmDisplay command Sspm->rotate = 0; } uint32_t offset = (Sspm->rotate >> 2) * 4; uint32_t count = index - offset; if (count > 4) { count = 4; } + if (2 == Sspm->Settings.flag.display) { + uint32_t modules = index / 4; + if (modules > 1) { + WSContentSend_P(PSTR("
{t}")); + uint32_t cols_width = 100 / modules; + uint32_t current_module = Sspm->rotate >> 2; + for (uint32_t idx = 0; idx < modules; idx++) { + WSContentSend_P(PSTR(""), // &k86 is related to WebGetArg("k", tmp, sizeof(tmp)); + cols_width, (current_module == idx) ? WebColor(COL_BACKGROUND) : WebColor(COL_TIMER_TAB_BACKGROUND), idx, idx +1); + } + WSContentSend_P(PSTR("")); + } + } else { + WSContentSend_P(PSTR("
")); + } // {s}Head1{e} // {s}Head1Head2{e} // {s}Head1Head2Head3{e} // {s}Head1Head2Head3Head4{e} + WSContentSend_P(PSTR("{t}{s}")); // First column is empty ({t} = , {s} =
) char value_chr[SSPM_SIZE]; - WSContentSend_P(PSTR("

{t}{s}")); // First column is empty ({t} = , {s} = "), (no_label)?"":"L", (no_label)?"":itoa(relay[offset +i], value_chr, 10)); @@ -2150,6 +2167,16 @@ void SSPMEnergyShow(bool json) { } } +#ifdef USE_WEBSERVER + +void SSPMWebGetArg(void) { + char tmp[8]; // WebGetArg numbers only + WebGetArg(PSTR("k86"), tmp, sizeof(tmp)); // 1 - 8 relay modules + if (strlen(tmp)) { Sspm->rotate = atoi(tmp) *4; } +} + +#endif // USE_WEBSERVER + /*********************************************************************************************\ * Commands \*********************************************************************************************/ @@ -2167,9 +2194,9 @@ void (* const SSPMCommand[])(void) PROGMEM = { &CmndSpmEnergyTotal, &CmndSpmEnergyYesterday, &CmndSSPMSend }; void CmndSSPMDisplay(void) { - // Select either all relays or only powered on relays - // SspmDisplay 0 or SspmDisplay 1 - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 1)) { + // Select either all relays, only powered on relays or user selected relay module + // SspmDisplay 0, SspmDisplay 1 or SspmDisplay 2 + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) { Sspm->Settings.flag.display = XdrvMailbox.payload; } ResponseCmndNumber(Sspm->Settings.flag.display); @@ -2440,6 +2467,9 @@ bool Xdrv86(uint8_t function) { case FUNC_WEB_SENSOR: SSPMEnergyShow(false); break; + case FUNC_WEB_GET_ARG: + SSPMWebGetArg(); + break; #endif // USE_WEBSERVER case FUNC_COMMAND: result = DecodeCommand(kSSPMCommands, SSPMCommand); From afc8e7a3d64c21b2b5d3af4e17a4dc4a545cc409 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Fri, 27 May 2022 19:45:09 +0200 Subject: [PATCH 289/376] fs build https:// as source too --- pio-tools/post_esp32.py | 8 ++++++++ platformio_tasmota_cenv_sample.ini | 1 + 2 files changed, 9 insertions(+) diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 3678cbf85..276b0c3ec 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -54,6 +54,14 @@ def esp32_build_filesystem(fs_size): for file in files: if "no_files" in file: continue + if "http" and "://" in file: + response = requests.get(file) + if response.ok: + target = join(filesystem_dir,file.split(os.path.sep)[-1]) + open(target, "wb").write(response.content) + else: + print("Failed to download: ",file) + continue shutil.copy(file, filesystem_dir) if not os.listdir(filesystem_dir): print("No files added -> will NOT create littlefs.bin and NOT overwrite fs partition!") diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 90d13b59c..3fe8dbb14 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -19,6 +19,7 @@ build_flags = ${env:tasmota32_base.build_flags} -D FIRMWARE_TASM ; example for custom file upload in Tasmota Filesystem ; custom_files_upload = ${env:tasmota32_base.custom_files_upload} ; tasmota/berry/modules/Partition_wizard.tapp +; https://github.com/tasmota/autoconf/raw/main/esp32s3/DevKitC-1.autoconf ; *** Debug version used for PlatformIO Home Project Inspection [env:tasmota-debug] From f0d2990894367fa784138ba2be2d82a7a1346301 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Fri, 27 May 2022 20:51:59 +0200 Subject: [PATCH 290/376] fix scan mode switching, return option values --- tasmota/xsns_62_esp32_mi.h | 7 +++- tasmota/xsns_62_esp32_mi.ino | 81 +++++++++++++++++++++++++++--------- 2 files changed, 66 insertions(+), 22 deletions(-) diff --git a/tasmota/xsns_62_esp32_mi.h b/tasmota/xsns_62_esp32_mi.h index ba01d619a..3b5a2e000 100644 --- a/tasmota/xsns_62_esp32_mi.h +++ b/tasmota/xsns_62_esp32_mi.h @@ -169,6 +169,8 @@ struct { uint32_t autoScan:1; uint32_t canScan:1; uint32_t runningScan:1; + uint32_t updateScan:1; + uint32_t deleteScanTask:1; uint32_t canConnect:1; uint32_t willConnect:1; @@ -387,7 +389,7 @@ const char * kMI32DeviceType[] PROGMEM = {kMI32DeviceType1,kMI32DeviceType2,kMI3 const char kMI32_ConnErrorMsg[] PROGMEM = "no Error|could not connect|did disconnect|got no service|got no characteristic|can not read|can not notify|can not write|did not write|notify time out"; -const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start scanning"; +const char kMI32_BLEInfoMsg[] PROGMEM = "Scan ended|Got Notification|Did connect|Did disconnect|Still connected|Start passive scanning|Start active scanning"; const char kMI32_HKInfoMsg[] PROGMEM = "HAP core started|HAP core did not start!!|HAP controller disconnected|HAP controller connected|HAP outlet added"; @@ -426,7 +428,8 @@ enum MI32_BLEInfoMsg { MI32_DID_CONNECT, MI32_DID_DISCONNECT, MI32_STILL_CONNECTED, - MI32_START_SCANNING + MI32_START_SCANNING_PASSIVE, + MI32_START_SCANNING_ACTIVE }; enum MI32_HKInfoMsg { diff --git a/tasmota/xsns_62_esp32_mi.ino b/tasmota/xsns_62_esp32_mi.ino index cf67afb92..1adf5ab08 100644 --- a/tasmota/xsns_62_esp32_mi.ino +++ b/tasmota/xsns_62_esp32_mi.ino @@ -81,7 +81,6 @@ std::vector MIBLEsensors; static BLEScan* MI32Scan; - /*********************************************************************************************\ * Classes \*********************************************************************************************/ @@ -641,6 +640,8 @@ void MI32Init(void) { } if (!MI32.mode.init) { + NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); + NimBLEDevice::setScanDuplicateCacheSize(40); // will not be perfect for every situation (few vs many BLE devices nearby) NimBLEDevice::init(""); AddLog(LOG_LEVEL_INFO,PSTR("M32: Init BLE device")); MI32.mode.init = 1; @@ -1031,13 +1032,11 @@ void MI32StartTask(uint32_t task){ switch(task){ case MI32_TASK_SCAN: if (MI32.mode.connected == 1) return; - if(MI32.option.activeScan){ - AddLog(LOG_LEVEL_INFO,PSTR("M32: Scan mode: active!")); // may have negative side effects!! - } MI32StartScanTask(); break; case MI32_TASK_CONN: if (MI32.mode.canConnect == 0) return; + MI32.mode.deleteScanTask = 1; MI32StartConnectionTask(); break; default: @@ -1063,25 +1062,37 @@ void MI32ScanTask(void *pvParameters){ if(MI32.mode.didGetConfig){ vTaskDelay(5000/ portTICK_PERIOD_MS); } - if (MI32Scan == nullptr) MI32Scan = NimBLEDevice::getScan(); - MI32Scan->setInterval(70); - MI32Scan->setWindow(50); - MI32Scan->setAdvertisedDeviceCallbacks(&MI32ScanCallbacks,true); + MI32Scan = NimBLEDevice::getScan(); + + MI32Scan->setAdvertisedDeviceCallbacks(&MI32ScanCallbacks,false); if(NimBLEDevice::getWhiteListCount()>0){ MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL); } else { MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_NO_WL); } - MI32Scan->setActiveScan(MI32.option.activeScan); + + MI32Scan->setActiveScan(MI32.option.activeScan == 1); MI32Scan->setMaxResults(0); MI32Scan->start(0, MI32scanEndedCB, false); // never stop scanning, will pause automatically while connecting - MI32.infoMsg = MI32_START_SCANNING; + MI32.infoMsg = MI32.option.activeScan?MI32_START_SCANNING_ACTIVE:MI32_START_SCANNING_PASSIVE; uint32_t timer = 0; for(;;){ - vTaskDelay(10000/ portTICK_PERIOD_MS); + vTaskDelay(1000/ portTICK_PERIOD_MS); + if(MI32.mode.deleteScanTask){ + MI32Scan->stop(); + MI32.mode.runningScan = 0; + break; + } + if(MI32.mode.updateScan){ + MI32Scan->stop(); + MI32Scan->setActiveScan(MI32.option.activeScan == 1); + MI32Scan->start(0,true); + MI32.mode.updateScan = 0; + MI32.infoMsg = MI32.option.activeScan?MI32_START_SCANNING_ACTIVE:MI32_START_SCANNING_PASSIVE; + } } vTaskDelete( NULL ); } @@ -1742,25 +1753,55 @@ void CmndMi32Option(void){ bool onOff = atoi(XdrvMailbox.data); switch(XdrvMailbox.index) { case 0: - MI32.option.allwaysAggregate = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.allwaysAggregate = onOff; + } + else{ + onOff = MI32.option.allwaysAggregate; + } break; case 1: - MI32.option.noSummary = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.noSummary = onOff; + } + else{ + onOff = MI32.option.noSummary; + } break; case 2: - MI32.option.directBridgeMode = onOff; + if(XdrvMailbox.data_len>0){ + MI32.option.directBridgeMode = onOff; + } + else{ + onOff = MI32.option.directBridgeMode; + } break; case 3: - MI32.mode.didGetConfig = onOff; + if(XdrvMailbox.data_len>0){ + MI32.mode.didGetConfig = onOff; + } + else{ + onOff = MI32.mode.didGetConfig; + } break; case 4: - if(MI32.option.activeScan != onOff){ - MI32.option.activeScan = onOff; - MI32StartTask(MI32_TASK_SCAN); + if(XdrvMailbox.data_len>0){ + if(MI32.option.activeScan != onOff){ + MI32.option.activeScan = onOff; + if(MI32.mode.runningScan){ + MI32.mode.updateScan = 1; + } + else{ + MI32StartTask(MI32_TASK_SCAN); + } + } + } + else{ + onOff = MI32.option.activeScan; } break; } - ResponseCmndDone(); + ResponseCmndIdxNumber(onOff?1:0); } /*********************************************************************************************\ @@ -2301,7 +2342,7 @@ int ExtStopBLE(){ if(Settings->flag5.mi32_enable == 0) return 0; if (MI32.ScanTask != nullptr){ MI32Scan->stop(); - vTaskDelete(MI32.ScanTask); + MI32.mode.deleteScanTask = 1; AddLog(LOG_LEVEL_INFO,PSTR("M32: stop BLE")); } #ifdef USE_MI_HOMEKIT From 972a898acf7dd6c45ec785740c97d716eba9975f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 28 May 2022 12:05:26 +0200 Subject: [PATCH 291/376] Add better SPM tab labels --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 1aa76c03a..226b983c4 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -2124,20 +2124,19 @@ void SSPMEnergyShow(bool json) { uint32_t offset = (Sspm->rotate >> 2) * 4; uint32_t count = index - offset; if (count > 4) { count = 4; } + WSContentSend_P(PSTR("
) bool no_label = false; for (uint32_t i = 0; i < count; i++) { WSContentSend_P(PSTR("%s%s

")); if (2 == Sspm->Settings.flag.display) { uint32_t modules = index / 4; if (modules > 1) { - WSContentSend_P(PSTR("
{t}")); + WSContentSend_P(PSTR("{t}")); uint32_t cols_width = 100 / modules; uint32_t current_module = Sspm->rotate >> 2; for (uint32_t idx = 0; idx < modules; idx++) { - WSContentSend_P(PSTR(""), // &k86 is related to WebGetArg("k", tmp, sizeof(tmp)); - cols_width, (current_module == idx) ? WebColor(COL_BACKGROUND) : WebColor(COL_TIMER_TAB_BACKGROUND), idx, idx +1); + WSContentSend_P(PSTR(""), // &k86 is related to WebGetArg("k", tmp, sizeof(tmp)); + cols_width, (current_module == idx) ? WebColor(COL_BACKGROUND) : WebColor(COL_FORM), idx, (idx *4) +1); } WSContentSend_P(PSTR("")); } - } else { - WSContentSend_P(PSTR("
")); } // {s}Head1{e} // {s}Head1Head2{e} From 34c0fc686b40d271e96667b44c3c5f6e8e26c69e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 28 May 2022 12:42:19 +0200 Subject: [PATCH 292/376] Minor refactors --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 226b983c4..a72515466 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -2095,47 +2095,47 @@ void SSPMEnergyShow(bool json) { ResponseAppend_P(PSTR("]}")); #ifdef USE_WEBSERVER } else { - uint8_t relay[SSPM_MAX_MODULES * 4]; + uint8_t relays[SSPM_MAX_MODULES * 4]; uint8_t indirect[SSPM_MAX_MODULES * 4]; - uint32_t index = 0; + uint32_t relay_show = 0; power_t power = TasmotaGlobal.power; for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { if ((0 == Sspm->Settings.flag.display) || ((1 == Sspm->Settings.flag.display) && (power >> i) &1) || (2 == Sspm->Settings.flag.display)) { - relay[index] = i +1; - indirect[index] = i; - index++; + relays[relay_show] = i +1; + indirect[relay_show] = i; + relay_show++; } } - if (index) { + if (relay_show) { if (Sspm->Settings.flag.display != 2) { - if (index > 4) { + if (relay_show > 4) { Sspm->rotate++; } else { Sspm->rotate = 0; } } - if (Sspm->rotate > ((index -1) | 0x3)) { // Always test in case index has changed due to use of SspmDisplay command + if (Sspm->rotate > ((relay_show -1) | 0x3)) { // Always test in case relay has changed due to use of SspmDisplay command Sspm->rotate = 0; } uint32_t offset = (Sspm->rotate >> 2) * 4; - uint32_t count = index - offset; + uint32_t count = relay_show - offset; if (count > 4) { count = 4; } - WSContentSend_P(PSTR("
")); + WSContentSend_P(PSTR("
")); // Close current table as we will use different column count if (2 == Sspm->Settings.flag.display) { - uint32_t modules = index / 4; + uint32_t modules = relay_show / 4; if (modules > 1) { - WSContentSend_P(PSTR("{t}")); + WSContentSend_P(PSTR("{t}")); // {t} = uint32_t cols_width = 100 / modules; uint32_t current_module = Sspm->rotate >> 2; for (uint32_t idx = 0; idx < modules; idx++) { - WSContentSend_P(PSTR(""), // &k86 is related to WebGetArg("k", tmp, sizeof(tmp)); - cols_width, (current_module == idx) ? WebColor(COL_BACKGROUND) : WebColor(COL_FORM), idx, (idx *4) +1); + WSContentSend_P(PSTR(""), // &k86 is related to WebGetArg("k", tmp, sizeof(tmp)); + cols_width, (current_module == idx) ? WebColor(COL_BACKGROUND) : WebColor(COL_FORM), (current_module == idx) ? "bold" : "normal", idx, (idx *4) +1); } - WSContentSend_P(PSTR("
")); + WSContentSend_P(PSTR("")); // Close current table as we will use different column count } } // {s}Head1{e} @@ -2146,7 +2146,7 @@ void SSPMEnergyShow(bool json) { char value_chr[SSPM_SIZE]; bool no_label = false; for (uint32_t i = 0; i < count; i++) { - WSContentSend_P(PSTR("%s%s"), (no_label)?"":"L", (no_label)?"":itoa(relay[offset +i], value_chr, 10)); + WSContentSend_P(PSTR("%s%s"), (no_label)?"":"L", (no_label)?"":itoa(relays[offset +i], value_chr, 10)); } WSContentSend_P(PSTR("{e}")); // Last column is units ({e} = ) WSContentSend_PD(HTTP_SNS_VOLTAGE, SSPMEnergyFormat(value_chr, Sspm->voltage[0], Settings->flag2.voltage_resolution, indirect, offset, count)); From b843994ff8e4300a757824b74fc421a5e9059ca6 Mon Sep 17 00:00:00 2001 From: gemu2015 Date: Sat, 28 May 2022 18:56:01 +0200 Subject: [PATCH 293/376] index array to float, spi array transfer --- tasmota/xdrv_10_scripter.ino | 157 +++++++++++++++++++++++------------ 1 file changed, 106 insertions(+), 51 deletions(-) diff --git a/tasmota/xdrv_10_scripter.ino b/tasmota/xdrv_10_scripter.ino index 832b98436..49b177fe0 100755 --- a/tasmota/xdrv_10_scripter.ino +++ b/tasmota/xdrv_10_scripter.ino @@ -1245,6 +1245,7 @@ char *isvar(char *lp, uint8_t *vtype, struct T_INDEX *tind, float *fp, char *sp, char *get_array_by_name(char *lp, float **fp, uint16_t *alen, uint16_t *ipos) { struct T_INDEX ind; uint8_t vtype; + while (*lp == ' ') lp++; lp = isvar(lp, &vtype, &ind, 0, 0, 0); if (vtype==VAR_NV) return 0; if (vtype&STYPE) return 0; @@ -2320,6 +2321,15 @@ chknext: float *fpd; lp = get_array_by_name(lp + 3, &fpd, &alend, 0); SCRIPT_SKIP_SPACES + if (*lp != ')') { + lp = GetNumericArgument(lp, OPER_EQU, &fvar, 0); + uint16_t offset = 0; + offset = fvar; + if (offset > (alend - 4)) { + offset = alend - 4; + } + fpd += offset; + } if (fpd) { uint8_t fbytes[4]; fbytes[0] = *fpd++; @@ -3984,7 +3994,7 @@ extern char *SML_GetSVal(uint32_t index); if (*lp!=')') { lp = GetNumericArgument(lp, OPER_EQU, &rxbsiz, gv); } - fvar= -1; + fvar = -1; if (glob_script_mem.sp) { fvar == -1; } else { @@ -4161,12 +4171,20 @@ extern char *SML_GetSVal(uint32_t index); fvar = -1; if (glob_script_mem.sp) { uint16_t alen; - float *array; + float *array = 0; lp = get_array_by_name(lp + 4, &array, &alen, 0); + SCRIPT_SKIP_SPACES if (!array) { goto exit; } - uint16_t index; + float opts = -1; + if (*lp != ')') { + lp = GetNumericArgument(lp, OPER_EQU, &opts, 0); + SCRIPT_SKIP_SPACES + // calc modbus checksum + } + + uint16_t index = 0; for (index = 0; index < alen; index++) { if (!glob_script_mem.sp->available()) { break; @@ -4175,14 +4193,29 @@ extern char *SML_GetSVal(uint32_t index); } fvar = index; #ifdef USE_SML_M - if (index == 8) { - uint8_t modbus_response[10]; - for (uint8_t cnt = 0; cnt < 8; cnt++) { - modbus_response[cnt] = array[cnt]; - } - uint16_t crc = MBUS_calculateCRC(modbus_response, 6, 0xFFFF); - if ( (lowByte(crc) != modbus_response[6]) || (highByte(crc) != modbus_response[7]) ) { - fvar = -2; + if (index == 8 || opts >= 0) { + uint8_t *modbus_response = (uint8_t*)special_malloc(alen); + if (modbus_response) { + for (uint8_t cnt = 0; cnt < alen; cnt++) { + modbus_response[cnt] = array[cnt]; + } + uint16_t crc = 0xffff; + uint8_t *mbp = modbus_response; + if (opts == 1) { + mbp++; + crc = 0; + } + crc = MBUS_calculateCRC(mbp, mbp[2] + 3, crc); + if (opts == 1) { + if ((mbp[mbp[2] + 3] != highByte(crc)) || (mbp[mbp[2] + 4] != lowByte(crc))) { + fvar = -2; + } + } else { + if ((mbp[mbp[2] + 3] != lowByte(crc)) || (mbp[mbp[2] + 4] != highByte(crc))) { + fvar = -2; + } + } + free(modbus_response); } } #endif @@ -4362,7 +4395,7 @@ extern char *SML_GetSVal(uint32_t index); case 1: // set cs lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); - index = fvar; + index = fvar - 1; index &= 3; lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); glob_script_mem.spi.cs[index] = fvar; @@ -4376,11 +4409,23 @@ extern char *SML_GetSVal(uint32_t index); case 2: // transfer bytes lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); - uint8_t index = fvar; + int8_t index = fvar - 1; + + float *fpd = 0; + uint16_t alend; + lp = get_array_by_name(lp, &fpd, &alend, 0); + + // len + float len = alend; + lp = GetNumericArgument(lp , OPER_EQU, &len, 0); + if (len > alend) { + len = alend; + } + + // type lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); - uint32_t val = fvar; - lp = GetNumericArgument(lp , OPER_EQU, &fvar, 0); - script_sspi_trans(index & 3, val, fvar); + + script_sspi_trans(index, fpd, len, fvar); break; } len = 0; @@ -6395,49 +6440,59 @@ int16_t Run_script_sub(const char *type, int8_t tlen, struct GVARS *gv) { #ifdef USE_SCRIPT_SPI // transfer 1-3 bytes -uint32_t script_sspi_trans(uint32_t cs_index, uint32_t val, uint32_t size) { +uint32_t script_sspi_trans(int32_t cs_index, float *array, uint32_t len, uint32_t size) { uint32_t out = 0; - - digitalWrite(glob_script_mem.spi.cs[cs_index], 0); + if (cs_index >= 0) { + cs_index &= 3; + digitalWrite(glob_script_mem.spi.cs[cs_index], 0); + } if (glob_script_mem.spi.sclk < 0) { // use existing hardware spi glob_script_mem.spi.spip->beginTransaction(glob_script_mem.spi.settings); - if (size == 1) { - out = glob_script_mem.spi.spip->transfer(val); - } - if (size == 2) { - out = glob_script_mem.spi.spip->transfer16(val); - } - if (size == 3) { - out = glob_script_mem.spi.spip->transfer(val >> 16); - out <<= 16; - out |= glob_script_mem.spi.spip->transfer16(val); - } - //SPI.transferBytes(); - glob_script_mem.spi.spip->endTransaction(); - digitalWrite(glob_script_mem.spi.cs[cs_index], 1); - return out; - } - - if (size < 1 || size > 3) size = 1; - uint32_t bit = 1 << ((size * 8) - 1); - while (bit) { - digitalWrite(glob_script_mem.spi.sclk, 0); - if (glob_script_mem.spi.mosi >= 0) { - if (val & bit) digitalWrite(glob_script_mem.spi.mosi, 1); - else digitalWrite(glob_script_mem.spi.mosi, 0); - } - digitalWrite(glob_script_mem.spi.sclk, 1); - if (glob_script_mem.spi.miso >= 0) { - if (digitalRead(glob_script_mem.spi.miso)) { - out |= bit; + for (uint32_t cnt = 0; cnt < len; cnt++) { + if (size == 1) { + out = glob_script_mem.spi.spip->transfer((uint8_t)*array); } + if (size == 2) { + out = glob_script_mem.spi.spip->transfer16((uint16_t)*array); + } + if (size == 3) { + out = glob_script_mem.spi.spip->transfer((uint32_t)*array >> 16); + out <<= 16; + out |= glob_script_mem.spi.spip->transfer16((uint32_t)*array); + } + *array++ = out; + } + glob_script_mem.spi.spip->endTransaction(); + + } else { + if (size < 1 || size > 3) size = 1; + for (uint32_t cnt = 0; cnt < len; cnt++) { + uint32_t bit = 1 << ((size * 8) - 1); + out = 0; + uint32_t uvar = *array; + while (bit) { + digitalWrite(glob_script_mem.spi.sclk, 0); + if (glob_script_mem.spi.mosi >= 0) { + if (uvar & bit) digitalWrite(glob_script_mem.spi.mosi, 1); + else digitalWrite(glob_script_mem.spi.mosi, 0); + } + digitalWrite(glob_script_mem.spi.sclk, 1); + if (glob_script_mem.spi.miso >= 0) { + if (digitalRead(glob_script_mem.spi.miso)) { + out |= bit; + } + } + bit >>= 1; + } + *array++ = out; } - bit >>= 1; } - digitalWrite(glob_script_mem.spi.cs[cs_index], 1); - return out; + if (cs_index >= 0) { + digitalWrite(glob_script_mem.spi.cs[cs_index], 1); + } + return len; } #endif // USE_SCRIPT_SPI From a9c15ee64e943099feb4ff9cd988b896456dd246 Mon Sep 17 00:00:00 2001 From: Chris Pearson Date: Sat, 28 May 2022 15:24:09 -0700 Subject: [PATCH 294/376] Support for iBeacon scanning for the ESP32-C3 - Adds the ESP32C3 to the ESP32 check when checking to compile iBeacon support --- tasmota/xsns_52_esp32_ibeacon_ble.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xsns_52_esp32_ibeacon_ble.ino b/tasmota/xsns_52_esp32_ibeacon_ble.ino index 2e22b58db..84e6e01b1 100644 --- a/tasmota/xsns_52_esp32_ibeacon_ble.ino +++ b/tasmota/xsns_52_esp32_ibeacon_ble.ino @@ -52,7 +52,7 @@ // for testing of BLE_ESP32, we remove xsns_52_ibeacon.ino completely, and instead add this modified xsns_52_ibeacon_BLE_ESP32.ino // in the future this may be more fine-grained, e.g. to allow hm17 for this, and BLE-ESP32 for other -#if CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32C3 #ifdef USE_BLE_ESP32 #define XSNS_52 52 From 3ba70de2e73e70f59a0e9c88964c7851893c7428 Mon Sep 17 00:00:00 2001 From: Chris Pearson Date: Sat, 28 May 2022 15:26:45 -0700 Subject: [PATCH 295/376] Clarify the use of #define USE_IBEACON_ESP32 A fix to the comment text for `#define USE_IBEACON_ESP32` and `#define USE_IBEACON`: - There was no description for `#define USE_IBEACON_ESP32`, so text was added to clarify it is the define to use for the ESP32 internal Bluetooth radio - Indentation was added to `#define USE_IBEACON_ESP32` and `#define USE_IBEACON` to clarify that the `USE_BLE_ESP32` define is required. --- tasmota/my_user_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index c34edb489..94d3e7eac 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1024,10 +1024,10 @@ //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) -//#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) +#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) //#define BLE_ESP32_ENABLE false // [SetOption115] Default value for SetOption115 //#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) -//#define USE_IBEACON_ESP32 +#define USE_IBEACON_ESP32 //#define USE_WEBCAM // Add support for webcam #define USE_AUTOCONF // Enable Esp32 autoconf feature, requires USE_BERRY and USE_WEBCLIENT_HTTPS (12KB Flash) From b8e12aee1cacec6a87bddf8bc359e6ec3ecb7490 Mon Sep 17 00:00:00 2001 From: Chris Pearson Date: Sat, 28 May 2022 16:19:27 -0700 Subject: [PATCH 296/376] Clarify the use of #define USE_IBEACON_ESP32 A fix to the comment text for `#define USE_IBEACON_ESP32` and `#define USE_IBEACON`: - There was no description for `#define USE_IBEACON_ESP32`, so text was added to clarify it is the define to use for the ESP32 internal Bluetooth radio - Indentation was added to `#define USE_IBEACON_ESP32` and `#define USE_IBEACON` to clarify that the `USE_BLE_ESP32` define is required. --- tasmota/my_user_config.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 94d3e7eac..fe0c9da1a 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1026,8 +1026,8 @@ //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) #define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) //#define BLE_ESP32_ENABLE false // [SetOption115] Default value for SetOption115 -//#define USE_IBEACON // Add support for bluetooth LE passive scan of ibeacon devices (uses HM17 module) -#define USE_IBEACON_ESP32 + //#define USE_IBEACON // Add support for Bluetooth LE passive scan of iBeacon devices (uses HM17 module) + //#define USE_IBEACON_ESP32 // Add support for Bluetooth LE passive scan of iBeacon devices using the internal ESP32 Bluetooth module //#define USE_WEBCAM // Add support for webcam #define USE_AUTOCONF // Enable Esp32 autoconf feature, requires USE_BERRY and USE_WEBCLIENT_HTTPS (12KB Flash) From c478d10cd0b7f0f8841ea2aa65daf661f8cf2c9f Mon Sep 17 00:00:00 2001 From: Chris Pearson Date: Sat, 28 May 2022 16:20:37 -0700 Subject: [PATCH 297/376] Clarify the use of #define USE_IBEACON_ESP32 A fix to the comment text for `#define USE_IBEACON_ESP32` and `#define USE_IBEACON`: - There was no description for `#define USE_IBEACON_ESP32`, so text was added to clarify it is the define to use for the ESP32 internal Bluetooth radio - Indentation was added to `#define USE_IBEACON_ESP32` and `#define USE_IBEACON` to clarify that the `USE_BLE_ESP32` define is required. --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index fe0c9da1a..e513d6595 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -1024,7 +1024,7 @@ //#define USE_SPI // Add support for hardware SPI //#define USE_MI_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2 mem, +292k flash) -#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) +//#define USE_BLE_ESP32 // Add support for ESP32 as a BLE-bridge (+9k2? mem, +292k? flash) //#define BLE_ESP32_ENABLE false // [SetOption115] Default value for SetOption115 //#define USE_IBEACON // Add support for Bluetooth LE passive scan of iBeacon devices (uses HM17 module) //#define USE_IBEACON_ESP32 // Add support for Bluetooth LE passive scan of iBeacon devices using the internal ESP32 Bluetooth module From d9490b3278f69a8dd57b6a0052a8df08b8de187d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 29 May 2022 12:40:46 +0200 Subject: [PATCH 298/376] Add focused updates to SSPM when SspmDisplay 2 --- tasmota/xdrv_86_esp32_sonoff_spm.ino | 77 ++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 15 deletions(-) diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index a72515466..494e72422 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -124,7 +124,7 @@ #define SSPM_MAX_MODULES 8 // Currently supports up to 8 SPM-4RELAY units for a total of 32 relays restricted by 32-bit power_t size #define SSPM_SERIAL_BUFFER_SIZE 548 // Needs to accomodate firmware upload data blocks (546 bytes) -//#define SSPM_SIMULATE 2 // Simulate additional 4Relay modules based on first detected 4Relay module (debugging purposes only!!) +//#define SSPM_SIMULATE // Simulate additional 4Relay modules based on first detected 4Relay module (debugging purposes only!!) // From ESP to ARM #define SSPM_FUNC_FIND 0 // 0x00 @@ -235,6 +235,7 @@ typedef struct { uint16_t module_map[SSPM_TOTAL_MODULES]; // Max possible SPM relay modules float energy_total[SSPM_TOTAL_MODULES][4]; // Total energy in kWh - float allows up to 262143.99 kWh float energy_yesterday[SSPM_TOTAL_MODULES][4]; // Energy yesterday in kWh - float allows up to 262143.99 kWh + uint32_t simulate_count; } tSspmSettings; typedef struct { @@ -277,6 +278,7 @@ typedef struct { #endif uint8_t allow_updates; uint8_t get_energy_relay; + int8_t get_energy_relay_focus; uint8_t get_totals; uint8_t rotate; uint8_t module_max; @@ -411,9 +413,11 @@ uint32_t SSPMGetMappedModuleId(uint32_t module) { module_nr = module; // input module number if not found used as fallback } #ifdef SSPM_SIMULATE - Sspm->simulated_module = module_nr; - if (Sspm->simulate && (module_nr > 0) && (module_nr <= Sspm->simulate)) { - module_nr = 0; // Emulate modules by 0 + if (Sspm->Settings.simulate_count) { + Sspm->simulated_module = module_nr; + if (Sspm->simulate && (module_nr > 0) && (module_nr <= Sspm->simulate)) { + module_nr = 0; // Emulate modules by 0 + } } #endif return (uint32_t)module_nr; // 0, 1, ... @@ -1117,7 +1121,7 @@ void SSPMHandleReceivedData(void) { // SspmBuffer[20] & 0x0F // Relays operational uint32_t module = SSPMGetModuleNumberFromMap(SspmBuffer[3] << 8 | SspmBuffer[4]); #ifdef SSPM_SIMULATE - module = Sspm->simulated_module; + if (Sspm->Settings.simulate_count) { module = Sspm->simulated_module; } #endif power_t current_state = (SspmBuffer[20] >> 4) << (module * 4); // Relays state power_t mask = 0x0000000F << (module * 4); @@ -1214,7 +1218,7 @@ void SSPMHandleReceivedData(void) { uint32_t channel = SspmBuffer[32]; uint32_t module = SSPMGetModuleNumberFromMap(SspmBuffer[20] << 8 | SspmBuffer[21]); #ifdef SSPM_SIMULATE - module = Sspm->simulated_module; + if (Sspm->Settings.simulate_count) { module = Sspm->simulated_module; } #endif if (Sspm->history_relay < 255) { uint32_t history_module = Sspm->history_relay >> 2; @@ -1410,7 +1414,7 @@ void SSPMHandleReceivedData(void) { } uint32_t module = SSPMGetModuleNumberFromMap(SspmBuffer[19] << 8 | SspmBuffer[20]); #ifdef SSPM_SIMULATE - module = Sspm->simulated_module; + if (Sspm->Settings.simulate_count) { module = Sspm->simulated_module; } #endif Sspm->current[module][channel] = SspmBuffer[32] + (float)SspmBuffer[33] / 100; // x.xxA Sspm->voltage[module][channel] = SSPMGetValue(&SspmBuffer[34]); // x.xxV @@ -1436,7 +1440,7 @@ void SSPMHandleReceivedData(void) { if (!Sspm->no_send_key) { uint32_t module = SSPMGetModuleNumberFromMap(SspmBuffer[19] << 8 | SspmBuffer[20]); #ifdef SSPM_SIMULATE -// module = Sspm->simulated_module; // Won't work as this is initiated from device +// if (Sspm->Settings.simulate_count) { module = Sspm->simulated_module; } // Won't work as this is initiated from device #endif power_t relay = (SspmBuffer[31] & 0x0F) << (module * 4); // Relays active power_t relay_state = (SspmBuffer[31] >> 4) << (module * 4); // Relays state @@ -1520,10 +1524,10 @@ void SSPMHandleReceivedData(void) { if (0x24 == expected_bytes) { SSPMAddModule(); #ifdef SSPM_SIMULATE - if (0 == Sspm->simulate) { + if (Sspm->Settings.simulate_count && (0 == Sspm->simulate)) { uint8_t current_idh = SspmBuffer[19]; uint8_t current_idl = SspmBuffer[20]; - for (Sspm->simulate = 0; Sspm->simulate < SSPM_SIMULATE; Sspm->simulate++) { + for (Sspm->simulate = 0; Sspm->simulate < Sspm->Settings.simulate_count; Sspm->simulate++) { SspmBuffer[19] = Sspm->simulate +1; SspmBuffer[20] = Sspm->simulate +1; SSPMAddModule(); @@ -1921,11 +1925,15 @@ void SSPMEvery100ms(void) { break; case SPM_SCAN_COMPLETE: // Scan sequence finished -#ifndef SSPM_SIMULATE - if (Sspm->power_on_state) { - TasmotaGlobal.power = Sspm->power_on_state; - Sspm->power_on_state = 0; // Reset power on state solving re-scan - SetPowerOnState(); // Set power on state now that all relays have been detected +#ifdef SSPM_SIMULATE + if (!Sspm->Settings.simulate_count) { +#endif + if (Sspm->power_on_state) { + TasmotaGlobal.power = Sspm->power_on_state; + Sspm->power_on_state = 0; // Reset power on state solving re-scan + SetPowerOnState(); // Set power on state now that all relays have been detected + } +#ifdef SSPM_SIMULATE } #endif TasmotaGlobal.discovery_counter = 1; // Force TasDiscovery() @@ -1948,6 +1956,7 @@ void SSPMEvery100ms(void) { Sspm->get_energy_relay++; if (Sspm->get_energy_relay >= TasmotaGlobal.devices_present) { Sspm->get_energy_relay = TasmotaGlobal.devices_present; + Sspm->get_energy_relay_focus = -1; Sspm->mstate = SPM_UPDATE_CHANNELS; } } @@ -1970,6 +1979,25 @@ void SSPMEvery100ms(void) { Sspm->get_totals = 0; } } + + // If focused on one module increase focused relay polling + if ((2 == Sspm->Settings.flag.display) && (TasmotaGlobal.devices_present > 8) && (0 == Sspm->get_totals)) { + if ((Sspm->get_energy_relay % 4) == 0) { // Every fourth relay + uint32_t next = Sspm->rotate +4; + if (next >= TasmotaGlobal.devices_present) { next = 0; } + if ((Sspm->get_energy_relay_focus > -1) || !((Sspm->get_energy_relay == Sspm->rotate) || (Sspm->get_energy_relay == next))) { + if (-1 == Sspm->get_energy_relay_focus) { + Sspm->get_energy_relay_focus = Sspm->get_energy_relay; + Sspm->get_energy_relay = Sspm->rotate; + } else { + Sspm->get_energy_relay = Sspm->get_energy_relay_focus; + Sspm->get_energy_relay_focus = -1; + } + } + } + } +// AddLog(LOG_LEVEL_DEBUG, PSTR("SPM: Totals %d, Relay %d"), Sspm->get_totals, Sspm->get_energy_relay); + power_t powered_on = TasmotaGlobal.power >> Sspm->get_energy_relay; if (powered_on &1) { SSPMSetLock(4); @@ -2182,12 +2210,18 @@ void SSPMWebGetArg(void) { const char kSSPMCommands[] PROGMEM = "SSPM|" // Prefix "Display|Dump|" // SetOptions +#ifdef SSPM_SIMULATE + "Simulate|" +#endif "Log|Energy|History|Scan|IamHere|" "Reset|Map|Overload|" D_CMND_ENERGYTOTAL "|" D_CMND_ENERGYYESTERDAY "|Send"; void (* const SSPMCommand[])(void) PROGMEM = { &CmndSSPMDisplay, &CmndSSPMDump, +#ifdef SSPM_SIMULATE + &CmndSSPMSimulate, +#endif &CmndSSPMLog, &CmndSSPMEnergy, &CmndSSPMHistory, &CmndSSPMScan, &CmndSSPMIamHere, &CmndSSPMReset, &CmndSSPMMap, &CmndSSPMOverload, &CmndSpmEnergyTotal, &CmndSpmEnergyYesterday, &CmndSSPMSend }; @@ -2210,6 +2244,19 @@ void CmndSSPMDump(void) { ResponseCmndNumber(Sspm->Settings.flag.dump); } +#ifdef SSPM_SIMULATE +void CmndSSPMSimulate(void) { + // Simulate 4Relay modules based on first detected 4Relay module + // SspmSimulate 0 to turn simulation off + // SspmSimulate 6 to add 6 simulated modules + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < SSPM_MAX_MODULES)) { + Sspm->Settings.simulate_count = XdrvMailbox.payload; + TasmotaGlobal.restart_flag = 2; + } + ResponseCmndNumber(Sspm->Settings.simulate_count); +} +#endif + void CmndSpmEnergyTotal(void) { // Reset Energy Total // SspmEnergyTotal 0 - Set total energy from midnight with sum of last month history From 65a87fd747500565ee8465d799294b620facdc04 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 29 May 2022 15:49:57 +0200 Subject: [PATCH 299/376] Add command ``SetOption141 1`` - Add command ``SetOption141 1`` to disable display of module name in GUI header - Prep SO146-177 --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/settings.h | 43 ++++++++++++++++++++++++++++++-- tasmota/support_command.ino | 35 ++++++++++++++++++-------- tasmota/support_features.ino | 47 +++++++++++++++++++++++++++++++++-- tasmota/xdrv_01_webserver.ino | 2 +- tools/decode-status.py | 29 ++++++++++++++++++--- 7 files changed, 139 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b6b620e8..84c1a26bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Support for Sonoff SPM v1.2.0 - Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701) - Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules (#13447) +- Command ``SetOption141 1`` to disable display of module name in GUI header ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 08de41613..f1e019c8d 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -108,6 +108,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Added - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) +- Command ``SetOption141 1`` to disable display of module name in GUI header - Command ``EnergyExportActive`` to (p)reset energy export active for supported devices. Currently ADE7880 only [#13515](https://github.com/arendst/Tasmota/issues/13515) - Command ``IfxRp ""|`` adds optional InfluxDb Retention Policy [#15513](https://github.com/arendst/Tasmota/issues/15513) - Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules [#13447](https://github.com/arendst/Tasmota/issues/13447) diff --git a/tasmota/settings.h b/tasmota/settings.h index 08c26db60..b39455ddf 100644 --- a/tasmota/settings.h +++ b/tasmota/settings.h @@ -170,7 +170,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t gui_table_align : 1; // bit 24 (v11.0.0.7) - SetOption138 - (GUI) Align (energy) table values left (0) or right (1) uint32_t mm_vs_inch : 1; // bit 25 (v11.1.0.1) - SetOption139 - (Pressure) Switch between mmHg (0) or inHg (1) when SO24 1 uint32_t mqtt_persistent : 1; // bit 26 (v11.1.0.1) - SetOption140 - (MQTT) MQTT clean session (0 = default) or persistent session (1) - uint32_t spare27 : 1; // bit 27 + uint32_t gui_module_name : 1; // bit 27 (v11.1.0.3) - SetOption141 - (GUI) Disable display of GUI module name (1) uint32_t spare28 : 1; // bit 28 uint32_t spare29 : 1; // bit 29 uint32_t spare30 : 1; // bit 30 @@ -178,6 +178,44 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu }; } SOBitfield5; +typedef union { // Restricted by MISRA-C Rule 18.4 but so useful... + uint32_t data; // Allow bit manipulation using SetOption + struct { // SetOption146 .. SetOption177 + uint32_t spare00 : 1; // bit 0 + uint32_t spare01 : 1; // bit 1 + uint32_t spare02 : 1; // bit 2 + uint32_t spare03 : 1; // bit 3 + uint32_t spare04 : 1; // bit 4 + uint32_t spare05 : 1; // bit 5 + uint32_t spare06 : 1; // bit 6 + uint32_t spare07 : 1; // bit 7 + uint32_t spare08 : 1; // bit 8 + uint32_t spare09 : 1; // bit 9 + uint32_t spare10 : 1; // bit 10 + uint32_t spare11 : 1; // bit 11 + uint32_t spare12 : 1; // bit 12 + uint32_t spare13 : 1; // bit 13 + uint32_t spare14 : 1; // bit 14 + uint32_t spare15 : 1; // bit 15 + uint32_t spare16 : 1; // bit 16 + uint32_t spare17 : 1; // bit 17 + uint32_t spare18 : 1; // bit 18 + uint32_t spare19 : 1; // bit 19 + uint32_t spare20 : 1; // bit 20 + uint32_t spare21 : 1; // bit 21 + uint32_t spare22 : 1; // bit 22 + uint32_t spare23 : 1; // bit 23 + uint32_t spare24 : 1; // bit 24 + uint32_t spare25 : 1; // bit 25 + uint32_t spare26 : 1; // bit 26 + uint32_t spare27 : 1; // bit 27 + uint32_t spare28 : 1; // bit 28 + uint32_t spare29 : 1; // bit 29 + uint32_t spare30 : 1; // bit 30 + uint32_t spare31 : 1; // bit 31 + }; +} SOBitfield6; + // Bitfield to be used for persistent multi bit typedef union { uint32_t data; // Allow bit manipulation @@ -798,9 +836,10 @@ typedef struct { uint8_t tcp_config; // F5F uint8_t light_step_pixels; // F60 - uint8_t free_f61[23]; // F61 - Decrement if adding new Setting variables just above and below + uint8_t free_f61[19]; // F61 - Decrement if adding new Setting variables just above and below // Only 32 bit boundary variables below + SOBitfield6 flag6; // F74 uint16_t flowratemeter_calibration[2];// F78 int32_t energy_kWhexport_ph[3]; // F7C uint32_t eth_ipv4_address[5]; // F88 diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino index 0f1bbc082..3df6bd03a 100644 --- a/tasmota/support_command.ino +++ b/tasmota/support_command.ino @@ -605,11 +605,11 @@ void CmndStatus(void) if ((0 == payload) || (3 == payload)) { Response_P(PSTR("{\"" D_CMND_STATUS D_STATUS3_LOGGING "\":{\"" D_CMND_SERIALLOG "\":%d,\"" D_CMND_WEBLOG "\":%d,\"" D_CMND_MQTTLOG "\":%d,\"" D_CMND_SYSLOG "\":%d,\"" D_CMND_LOGHOST "\":\"%s\",\"" D_CMND_LOGPORT "\":%d,\"" D_CMND_SSID "\":[\"%s\",\"%s\"],\"" D_CMND_TELEPERIOD "\":%d,\"" - D_JSON_RESOLUTION "\":\"%08X\",\"" D_CMND_SETOPTION "\":[\"%08X\",\"%s\",\"%08X\",\"%08X\",\"%08X\"]}}"), + D_JSON_RESOLUTION "\":\"%08X\",\"" D_CMND_SETOPTION "\":[\"%08X\",\"%s\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]}}"), Settings->seriallog_level, Settings->weblog_level, Settings->mqttlog_level, Settings->syslog_level, SettingsText(SET_SYSLOG_HOST), Settings->syslog_port, EscapeJSONString(SettingsText(SET_STASSID1)).c_str(), EscapeJSONString(SettingsText(SET_STASSID2)).c_str(), Settings->tele_period, Settings->flag2.data, Settings->flag.data, ToHex_P((unsigned char*)Settings->param, PARAM8_SIZE, stemp2, sizeof(stemp2)), - Settings->flag3.data, Settings->flag4.data, Settings->flag5.data); + Settings->flag3.data, Settings->flag4.data, Settings->flag5.data, Settings->flag6.data); CmndStatusResponse(3); } @@ -1025,28 +1025,32 @@ void CmndSetoption(void) { CmndSetoptionBase(1); } -// Code called by SetOption and by Berrt +// Code called by SetOption and by Berry bool SetoptionDecode(uint32_t index, uint32_t *ptype, uint32_t *pindex) { - if (index < 146) { + if (index < 178) { if (index <= 31) { // SetOption0 .. 31 = Settings->flag *ptype = 2; - *pindex = index; // 0 .. 31 + *pindex = index; // 0 .. 31 } else if (index <= 49) { // SetOption32 .. 49 = Settings->param *ptype = 1; - *pindex = index -32; // 0 .. 17 (= PARAM8_SIZE -1) + *pindex = index -32; // 0 .. 17 (= PARAM8_SIZE -1) } else if (index <= 81) { // SetOption50 .. 81 = Settings->flag3 *ptype = 3; - *pindex = index -50; // 0 .. 31 + *pindex = index -50; // 0 .. 31 } - else if (index <= 113) { // SetOption82 .. 113 = Settings->flag4 + else if (index <= 113) { // SetOption82 .. 113 = Settings->flag4 *ptype = 4; - *pindex = index -82; // 0 .. 31 + *pindex = index -82; // 0 .. 31 } - else { // SetOption114 .. 145 = Settings->flag5 + else if (index <= 145) { // SetOption114 .. 145 = Settings->flag5 *ptype = 5; - *pindex = index -114; // 0 .. 31 + *pindex = index -114; // 0 .. 31 + } + else { // SetOption146 .. 177 = Settings->flag6 + *ptype = 6; + *pindex = index -146; // 0 .. 31 } return true; } @@ -1070,6 +1074,9 @@ uint32_t GetOption(uint32_t index) { else if (5 == ptype) { flag = Settings->flag5.data; } + else if (6 == ptype) { + flag = Settings->flag6.data; + } return bitRead(flag, pindex); } } else { @@ -1208,6 +1215,9 @@ void CmndSetoptionBase(bool indexed) { break; } } + else if (6 == ptype) { // SetOption146 .. 177 + bitWrite(Settings->flag6.data, pindex, XdrvMailbox.payload); + } } else { ptype = 99; // Command Error } @@ -1232,6 +1242,9 @@ void CmndSetoptionBase(bool indexed) { else if (5 == ptype) { flag = Settings->flag5.data; } + else if (6 == ptype) { + flag = Settings->flag6.data; + } if (indexed) { ResponseCmndIdxChar(GetStateText(bitRead(flag, pindex))); } else { diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index bf3b17011..a014d97d1 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -816,8 +816,51 @@ void ResponseAppendFeatures(void) // feature8 |= 0x80000000; } + static uint32_t feature9 = 0x00000000; + if (!feature9) { // Only fill this once +// feature9 |= 0x00000001; +// feature9 |= 0x00000002; +// feature9 |= 0x00000004; +// feature9 |= 0x00000008; + +// feature9 |= 0x00000010; +// feature9 |= 0x00000020; +// feature9 |= 0x00000040; +// feature9 |= 0x00000080; + +// feature9 |= 0x00000100; +// feature9 |= 0x00000200; +// feature9 |= 0x00000400; +// feature9 |= 0x00000800; + +// feature9 |= 0x00001000; +// feature9 |= 0x00002000; +// feature9 |= 0x00004000; +// feature9 |= 0x00008000; + +// feature9 |= 0x00010000; +// feature9 |= 0x00020000; +// feature9 |= 0x00040000; +// feature9 |= 0x00080000; + +// feature9 |= 0x00100000; +// feature9 |= 0x00200000; +// feature9 |= 0x00400000; +// feature9 |= 0x00800000; + +// feature9 |= 0x01000000; +// feature9 |= 0x02000000; +// feature9 |= 0x04000000; +// feature9 |= 0x08000000; + +// feature9 |= 0x10000000; +// feature9 |= 0x20000000; +// feature9 |= 0x40000000; +// feature9 |= 0x80000000; + } + /*********************************************************************************************/ - ResponseAppend_P(PSTR(",\"" D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"), - LANGUAGE_LCID, feature1, feature2, feature3, feature4, feature5, feature6, feature7, feature8); + ResponseAppend_P(PSTR(",\"" D_JSON_FEATURES "\":[\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\",\"%08X\"]"), + LANGUAGE_LCID, feature1, feature2, feature3, feature4, feature5, feature6, feature7, feature8, feature9); } diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 2fdcfa4a0..38fa369a3 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -893,7 +893,7 @@ void WSContentSendStyle_P(const char* formatP, ...) { WebColor(COL_TEXT_WARNING), #endif WebColor(COL_TITLE), - (Web.initial_config) ? "" : ModuleName().c_str(), SettingsText(SET_DEVICENAME)); + (Web.initial_config) ? "" : (Settings->flag5.gui_module_name) ? "" : ModuleName().c_str(), SettingsText(SET_DEVICENAME)); // SetOption53 - Show hostname and IP address in GUI main menu #if (RESTART_AFTER_INITIAL_WIFI_CONFIG) diff --git a/tools/decode-status.py b/tools/decode-status.py index a86e10eeb..f053ec544 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -195,7 +195,16 @@ a_setoption = [[ "(GUI) Align (energy) table values left (0) or right (1)", "(Pressure) Switch between mmHg (0) or inHg (1) when SO24 1", "(MQTT) MQTT clean session (0 = default) or persistent session (1)", - "", + "(GUI) Disable display of GUI module name (1)", + "","","","" + ],[ + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", "","","","" ]] @@ -271,6 +280,15 @@ a_features = [[ "USE_SDM230","USE_CM110x","USE_BL6523","USE_ADE7880", "USE_PCF85363","USE_DS3502","USE_IMPROV","USE_FLOWRATEMETER", "","","","" + ],[ + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", + "","","","", + "","","","" ]] usage = "usage: decode-status {-d | -f} arg" @@ -298,7 +316,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v11.1.0.1 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v11.1.0.3 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) @@ -334,13 +352,18 @@ def StartDecode(): options.append(str("{0:3d} ({1:3d}) {2}".format(i, split_register[opt_idx], option))) i += 1 - if r in (0, 2, 3, 4): #registers 1 and 4 hold binary values + if r in (0, 2, 3, 4, 5): # register 1 holds binary values for opt_idx, option in enumerate(opt_group): + if len(option) == 0: + continue # Skip empty line i_register = int(register,16) state = (i_register >> opt_idx) & 1 options.append(str("{0:3d} ({1}) {2}".format(i, a_on_off[state], option))) i += 1 + if r >= len(obj["StatusLOG"]["SetOption"]) -1: + break # Versions before 11.1.0.3 hold SO until 145 + print("\nOptions") for o in options: print(" {}".format(o)) From 2121ea63cd8192013c2c44a02e0c2fa24f12a800 Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 13:33:27 +0200 Subject: [PATCH 300/376] Add BP5758 light controller support - init sequence working, light responds randomly --- tasmota/language/af_AF.h | 2 + tasmota/language/bg_BG.h | 2 + tasmota/language/cs_CZ.h | 2 + tasmota/language/de_DE.h | 2 + tasmota/language/el_GR.h | 2 + tasmota/language/en_GB.h | 2 + tasmota/language/es_ES.h | 2 + tasmota/language/fr_FR.h | 2 + tasmota/language/fy_NL.h | 2 + tasmota/language/he_HE.h | 2 + tasmota/language/hu_HU.h | 2 + tasmota/language/it_IT.h | 2 + tasmota/language/ko_KO.h | 2 + tasmota/language/nl_NL.h | 2 + tasmota/language/pl_PL.h | 2 + tasmota/language/pt_BR.h | 2 + tasmota/language/pt_PT.h | 2 + tasmota/language/ro_RO.h | 2 + tasmota/language/ru_RU.h | 2 + tasmota/language/sk_SK.h | 2 + tasmota/language/sv_SE.h | 2 + tasmota/language/tr_TR.h | 2 + tasmota/language/uk_UA.h | 2 + tasmota/language/vi_VN.h | 2 + tasmota/language/zh_CN.h | 2 + tasmota/language/zh_TW.h | 2 + tasmota/my_user_config.h | 1 + tasmota/tasmota_configurations.h | 4 + tasmota/tasmota_template.h | 6 + tasmota/xlgt_08_bp5758d.ino | 208 +++++++++++++++++++++++++++++++ 30 files changed, 271 insertions(+) create mode 100644 tasmota/xlgt_08_bp5758d.ino diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index 968c0e1cd..d07ea47f8 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "Diep slaap" #define D_SENSOR_EXS_ENABLE "EXS Inskakel" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index c59f70c66..155da5507 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index b1b1ec1ab..d57e42a24 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 1d7916525..da558a560 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index 45c6f9038..bc9cae4d1 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index ba25d36ae..6f5b040ea 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index acc71ce36..c730b9bdf 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index c27665fe7..2718ed619 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 RX" #define D_SENSOR_SM2135_CLK "SM2135 CLK" #define D_SENSOR_SM2135_DAT "SM2135 DAT" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "Hibernation" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Esclave TX" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index db6150f80..4890eb1fd 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 9ca125c10..7207d6197 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index ee64407b3..b964ef793 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index dd6d4e146..c001a5715 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -771,6 +771,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 - RX" #define D_SENSOR_SM2135_CLK "SM2135 - CLK" #define D_SENSOR_SM2135_DAT "SM2135 - DATI" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D DATi" #define D_SENSOR_DEEPSLEEP "Sleep profondo" #define D_SENSOR_EXS_ENABLE "EXS - Abilita" #define D_SENSOR_CLIENT_TX "Client - TX" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index 40f4cd824..aa4232772 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 0e5cf5a06..4060e3cd7 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index a8b514340..6bf3b66d2 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "Głęboko uśpiony" #define D_SENSOR_EXS_ENABLE "Załącz EXS" #define D_SENSOR_CLIENT_TX "Klient TX" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index 866960151..fc8f54ad7 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 6da2d62cb..d02cfb137 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index 4cfa25cb6..b6fb28845 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index fc83143b0..d69309c34 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index 840edb230..3820d88e8 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 1a3b7c6fd..e5ae351bb 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index a2c341ee6..942936615 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index c93062ef7..a0e5c5eaf 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 44d92507b..8833d1046 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index cde32877e..7db58cadb 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 95639cc38..7f067f023 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -773,6 +773,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 Rx" #define D_SENSOR_SM2135_CLK "SM2135 Clk" #define D_SENSOR_SM2135_DAT "SM2135 Dat" +#define D_SENSOR_BP5758D_CLK "BP5758D Clk" +#define D_SENSOR_BP5758D_DAT "BP5758D Dat" #define D_SENSOR_DEEPSLEEP "DeepSleep" #define D_SENSOR_EXS_ENABLE "EXS Enable" #define D_SENSOR_CLIENT_TX "Client TX" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e513d6595..3ece102f0 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -555,6 +555,7 @@ #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code) #define USE_LIGHT_PALETTE // Add support for color palette (+0k7 code) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index f6b7682c4..97fad2865 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -69,6 +69,7 @@ #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #define USE_LIGHT_PALETTE // Add support for color palette (+0k9 code) @@ -402,6 +403,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) @@ -550,6 +552,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) @@ -694,6 +697,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) diff --git a/tasmota/tasmota_template.h b/tasmota/tasmota_template.h index 5c6fa8237..ca9c2732a 100644 --- a/tasmota/tasmota_template.h +++ b/tasmota/tasmota_template.h @@ -188,6 +188,7 @@ enum UserSelectablePins { GPIO_MS01, // Sonoff MS01 Moisture Sensor 1wire interface GPIO_SDIO_CMD, GPIO_SDIO_CLK, GPIO_SDIO_D0, GPIO_SDIO_D1, GPIO_SDIO_D2, GPIO_SDIO_D3, // SD Card SDIO interface, including 1-bit and 4-bit modes GPIO_FLOWRATEMETER_IN, // Flowrate Meter + GPIO_BP5758D_CLK, GPIO_BP5758D_DAT, // BP5758D PWM controller GPIO_SENSOR_END }; enum ProgramSelectablePins { @@ -420,6 +421,7 @@ const char kSensorNames[] PROGMEM = D_SENSOR_SDIO_D2 "|" D_SENSOR_SDIO_D3 "|" D_SENSOR_FLOWRATEMETER "|" + D_SENSOR_BP5758D_CLK "|" D_SENSOR_BP5758D_DAT "|" ; const char kSensorNamesFixed[] PROGMEM = @@ -661,6 +663,10 @@ const uint16_t kGpioNiceList[] PROGMEM = { AGPIO(GPIO_SM2135_CLK), // SM2135 CLOCK AGPIO(GPIO_SM2135_DAT) + MAX_SM2135_DAT, // SM2135 DATA #endif // USE_SM2135 +#ifdef USE_BP5758D + AGPIO(GPIO_BP5758D_CLK), // BP5758D CLOCK + AGPIO(GPIO_BP5758D_DAT), // BP5758D DATA +#endif // USE_BP5758D #ifdef USE_TUYA_MCU AGPIO(GPIO_TUYA_TX), // Tuya Serial interface AGPIO(GPIO_TUYA_RX), // Tuya Serial interface diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino new file mode 100644 index 000000000..1739779c1 --- /dev/null +++ b/tasmota/xlgt_08_bp5758d.ino @@ -0,0 +1,208 @@ +/* + xlgt_08_bp5758d.ino - bp5758d five channel led support for Tasmota + + Copyright (C) 2022 Theo Arends and oomg + + 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_LIGHT +#ifdef USE_BP5758D +/*********************************************************************************************\ + * BP5758D RGBCW Led bulbs commonly used by Tuya hardware + * + * TODO: Adapt + * Fitop 10W RGBCCT Bulb (BA60H-W0080-RCBW-E7) + * {"NAME":"Fitop 10W RGBCCT","GPIO":[1,1,1,1,1,4032,1,1,4069,1,1,1,1,1],"FLAG":0,"BASE":18,"CMND":"RGBWWTable 167,102,109,255,255"} +\*********************************************************************************************/ + +#define XLGT_08 8 + +// Layout: Bits B[7:8]=10 (address selection identification bits), B[5:6] sleep mode if set to 00, B[0:4] Address selection +#define BP5758D_ADDR_SLEEP 0x86 //10 00 0110: Sleep mode bits set (OUT1 gray-scale level setup selected, ignored by chip) +#define BP5758D_ADDR_SETUP 0x90 //10 01 0000: OUT1-5 enable/disable setup - used during init +#define BP5758D_ADDR_OUT1_CR 0x91 //10 01 0001: OUT1 current range +#define BP5758D_ADDR_OUT2_CR 0x92 //10 01 0010: OUT2 current range +#define BP5758D_ADDR_OUT3_CR 0x93 //10 01 0011: OUT3 current range +#define BP5758D_ADDR_OUT4_CR 0x94 //10 01 0100: OUT4 current range +#define BP5758D_ADDR_OUT5_CR 0x95 //10 01 0101: OUT5 current range +#define BP5758D_ADDR_OUT1_GL 0x96 //10 01 0110: OUT1 gray-scale level +#define BP5758D_ADDR_OUT2_GL 0x98 //10 01 1000: OUT2 gray-scale level +#define BP5758D_ADDR_OUT3_GL 0x9A //10 01 1010: OUT3 gray-scale level +#define BP5758D_ADDR_OUT4_GL 0x9C //10 01 1100: OUT4 gray-scale level +#define BP5758D_ADDR_OUT5_GL 0x9E //10 01 1110: OUT5 gray-scale level + +// Output enabled (OUT1-5, represented by lower 5 bits) +#define BP5758D_ENABLE_OUTPUTS_ALL 0x1F + +// Current values: Bit 6 to 0 represent 30mA, 32mA, 16mA, 8mA, 4mA, 2mA, 1mA respectively +#define BP5758D_10MA 0x0A // 0 0001010 +#define BP5758D_14MA 0x0E // 0 0001110 +#define BP5758D_15MA 0x0F // 0 0001111 +#define BP5758D_65MA 0x63 // 0 1100011 +#define BP5758D_90MA 0x7C // 0 1111100 + +struct BP5758D { + uint8_t clk = 0; + uint8_t data = 0; + uint8_t current; +} Bp5758d; + +/*********************************************************************************************\ + * Bp5758d code - mostly copied over from SM2135 +\*********************************************************************************************/ +const uint8_t BP5758D_DELAY = 2; + +void Bp5758dSetLow(uint8_t pin) { + noInterrupts(); + digitalWrite(pin, LOW); + pinMode(pin, OUTPUT); + interrupts(); +} + +void Bp5758dSetHigh(uint8_t pin) { + noInterrupts(); + pinMode(pin, INPUT_PULLUP); + interrupts(); +} + +bool Bp5758dInit(void) { + digitalWrite(Bp5758d.data, LOW); + digitalWrite(Bp5758d.clk, LOW); + Bp5758dSetHigh(Bp5758d.data); + Bp5758dSetHigh(Bp5758d.clk); + return (!((digitalRead(Bp5758d.data) == LOW || digitalRead(Bp5758d.clk) == LOW))); +} + +bool Bp5758dWrite(uint8_t value) { + AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dWrite %2x"), value); + for (uint8_t curr = 0X80; curr != 0; curr >>= 1) { + if (curr & value) { + Bp5758dSetHigh(Bp5758d.data); + } else { + Bp5758dSetLow(Bp5758d.data); + } + Bp5758dSetHigh(Bp5758d.clk); + delayMicroseconds(BP5758D_DELAY); + Bp5758dSetLow(Bp5758d.clk); + } + // get Ack or Nak + Bp5758dSetHigh(Bp5758d.data); + Bp5758dSetHigh(Bp5758d.clk); + delayMicroseconds(BP5758D_DELAY / 2); + uint8_t ack = digitalRead(Bp5758d.data); + Bp5758dSetLow(Bp5758d.clk); + delayMicroseconds(BP5758D_DELAY / 2); + Bp5758dSetLow(Bp5758d.data); + return (0 == ack); +} + +bool Bp5758dStart(uint8_t addr) { + AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStart")); + Bp5758dSetLow(Bp5758d.data); + delayMicroseconds(BP5758D_DELAY); + Bp5758dSetLow(Bp5758d.clk); + return Bp5758dWrite(addr); +} + +void Bp5758dStop(void) { + AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStop")); + Bp5758dSetLow(Bp5758d.data); + delayMicroseconds(BP5758D_DELAY); + Bp5758dSetHigh(Bp5758d.clk); + delayMicroseconds(BP5758D_DELAY); + Bp5758dSetHigh(Bp5758d.data); + delayMicroseconds(BP5758D_DELAY); +} + +/********************************************************************************************/ + +bool Bp5758dSetChannels(void) { + uint8_t *cur_col = (uint8_t*)XdrvMailbox.data; + // Even though we could address changing channels only, in practice we observed that the lightbulb always sets all channels. + Bp5758dStart(BP5758D_ADDR_OUT1_GL); + // Brigtness values are transmitted as two bytes. The light-bulb accepts a 10-bit integer (0-1023) as an input value. + // The first 5bits of this input are transmitted in first byte, the second 5bits in the second byte. + // Because or tasmota's controls are 8bit (0-255), we need to multiply by 4 (or shift two bits to the left). + // We thus transmit the first 5bits of tasmota's input as byte1, and the remaining 3bits as byte2 (shifted left two bits). + Bp5758dWrite(cur_col[0] >> 3); //Red: Only take first 5bits of tasmota's input + Bp5758dWrite((cur_col[0] & 0x07) << 2); //Only take last 3 bits, multiplied by 4 / shifted to left + Bp5758dWrite(cur_col[1] >> 3); //Green + Bp5758dWrite((cur_col[1] & 0x07) << 2); + Bp5758dWrite(cur_col[2] >> 3); //Blue + Bp5758dWrite((cur_col[2] & 0x07) << 2); + Bp5758dWrite(cur_col[3] >> 3); //Warm + Bp5758dWrite((cur_col[3] & 0x07) << 2); + Bp5758dWrite(cur_col[4] >> 3); //Cold + Bp5758dWrite((cur_col[4] & 0x07) << 2); + Bp5758dStop(); + return true; +} + +void Bp5758dModuleSelected(void) +{ + if (PinUsed(GPIO_BP5758D_CLK) && PinUsed(GPIO_BP5758D_DAT)) { + Bp5758d.clk = Pin(GPIO_BP5758D_CLK); + Bp5758d.data = Pin(GPIO_BP5758D_DAT); + + // For it's init sequence, BP5758D just sets all fields + Bp5758dInit(); + Bp5758dStart(BP5758D_ADDR_SETUP); + // Output enabled: enable all outputs since we're using a RGBCW light + Bp5758dWrite(BP5758D_ENABLE_OUTPUTS_ALL); + // Set currents for OUT1-OUT5 + Bp5758dWrite(BP5758D_14MA); + Bp5758dWrite(BP5758D_14MA); + Bp5758dWrite(BP5758D_14MA); + Bp5758dWrite(BP5758D_14MA); + Bp5758dWrite(BP5758D_14MA); + // Set grayscale levels ouf all outputs to 0 + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + Bp5758dWrite(0x00); + + TasmotaGlobal.light_type = LT_RGBWC; + TasmotaGlobal.light_driver = XLGT_08; + AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: BP5758D Found")); + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xlgt08(uint8_t function) +{ + bool result = false; + + switch (function) { + case FUNC_SET_CHANNELS: + result = Bp5758dSetChannels(); + break; + case FUNC_MODULE_INIT: + Bp5758dModuleSelected(); + break; + } + return result; +} + +#endif // USE_BP5758D +#endif // USE_LIGHT From 6dd20a566fe7e71282f5293870cc622d3bb8a01b Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 14:24:22 +0200 Subject: [PATCH 301/376] Light control fully functional at 8bit resolution --- tasmota/xlgt_08_bp5758d.ino | 92 ++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 48 deletions(-) diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino index 1739779c1..87c612336 100644 --- a/tasmota/xlgt_08_bp5758d.ino +++ b/tasmota/xlgt_08_bp5758d.ino @@ -22,9 +22,8 @@ /*********************************************************************************************\ * BP5758D RGBCW Led bulbs commonly used by Tuya hardware * - * TODO: Adapt - * Fitop 10W RGBCCT Bulb (BA60H-W0080-RCBW-E7) - * {"NAME":"Fitop 10W RGBCCT","GPIO":[1,1,1,1,1,4032,1,1,4069,1,1,1,1,1],"FLAG":0,"BASE":18,"CMND":"RGBWWTable 167,102,109,255,255"} + * Example configuration for a Fitop RGBCCT filament light bulb: + * {"NAME":"Fitop Filament RGBCCT","GPIO":[1,1,0,1,1,0,0,0,8416,0,8384,0,0,0],"FLAG":0,"BASE":18,"CMND":"RGBWWTable 255,109,245,255,255"} \*********************************************************************************************/ #define XLGT_08 8 @@ -60,10 +59,11 @@ struct BP5758D { } Bp5758d; /*********************************************************************************************\ - * Bp5758d code - mostly copied over from SM2135 + * Bp5758d code \*********************************************************************************************/ const uint8_t BP5758D_DELAY = 2; +/* void Bp5758dSetLow(uint8_t pin) { noInterrupts(); digitalWrite(pin, LOW); @@ -76,53 +76,48 @@ void Bp5758dSetHigh(uint8_t pin) { pinMode(pin, INPUT_PULLUP); interrupts(); } +*/ -bool Bp5758dInit(void) { - digitalWrite(Bp5758d.data, LOW); - digitalWrite(Bp5758d.clk, LOW); - Bp5758dSetHigh(Bp5758d.data); - Bp5758dSetHigh(Bp5758d.clk); - return (!((digitalRead(Bp5758d.data) == LOW || digitalRead(Bp5758d.clk) == LOW))); +void Bp5758dInit(void) { + pinMode(Bp5758d.data, OUTPUT); + pinMode(Bp5758d.clk, OUTPUT); + Bp5758dStop(); } -bool Bp5758dWrite(uint8_t value) { +void Bp5758dWrite(uint8_t value) { AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dWrite %2x"), value); - for (uint8_t curr = 0X80; curr != 0; curr >>= 1) { - if (curr & value) { - Bp5758dSetHigh(Bp5758d.data); - } else { - Bp5758dSetLow(Bp5758d.data); - } - Bp5758dSetHigh(Bp5758d.clk); - delayMicroseconds(BP5758D_DELAY); - Bp5758dSetLow(Bp5758d.clk); - } - // get Ack or Nak - Bp5758dSetHigh(Bp5758d.data); - Bp5758dSetHigh(Bp5758d.clk); - delayMicroseconds(BP5758D_DELAY / 2); - uint8_t ack = digitalRead(Bp5758d.data); - Bp5758dSetLow(Bp5758d.clk); - delayMicroseconds(BP5758D_DELAY / 2); - Bp5758dSetLow(Bp5758d.data); - return (0 == ack); + for (int bit_idx = 7; bit_idx >= 0; bit_idx--) { + bool bit = bitRead(value, bit_idx); + digitalWrite(Bp5758d.data, bit); + delayMicroseconds(BP5758D_DELAY); + digitalWrite(Bp5758d.clk, HIGH); + delayMicroseconds(BP5758D_DELAY); + digitalWrite(Bp5758d.clk, LOW); + delayMicroseconds(BP5758D_DELAY); + } + // Wait for ACK + pinMode(Bp5758d.data, INPUT); + digitalWrite(Bp5758d.clk, HIGH); + delayMicroseconds(BP5758D_DELAY); + digitalWrite(Bp5758d.clk, LOW); + delayMicroseconds(BP5758D_DELAY); + pinMode(Bp5758d.data, OUTPUT); } -bool Bp5758dStart(uint8_t addr) { +void Bp5758dStart(uint8_t addr) { AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStart")); - Bp5758dSetLow(Bp5758d.data); + digitalWrite(Bp5758d.data, LOW); delayMicroseconds(BP5758D_DELAY); - Bp5758dSetLow(Bp5758d.clk); - return Bp5758dWrite(addr); + digitalWrite(Bp5758d.clk, LOW); + delayMicroseconds(BP5758D_DELAY); + Bp5758dWrite(addr); } void Bp5758dStop(void) { AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStop")); - Bp5758dSetLow(Bp5758d.data); + digitalWrite(Bp5758d.clk, HIGH); delayMicroseconds(BP5758D_DELAY); - Bp5758dSetHigh(Bp5758d.clk); - delayMicroseconds(BP5758D_DELAY); - Bp5758dSetHigh(Bp5758d.data); + digitalWrite(Bp5758d.data, HIGH); delayMicroseconds(BP5758D_DELAY); } @@ -136,16 +131,16 @@ bool Bp5758dSetChannels(void) { // The first 5bits of this input are transmitted in first byte, the second 5bits in the second byte. // Because or tasmota's controls are 8bit (0-255), we need to multiply by 4 (or shift two bits to the left). // We thus transmit the first 5bits of tasmota's input as byte1, and the remaining 3bits as byte2 (shifted left two bits). - Bp5758dWrite(cur_col[0] >> 3); //Red: Only take first 5bits of tasmota's input - Bp5758dWrite((cur_col[0] & 0x07) << 2); //Only take last 3 bits, multiplied by 4 / shifted to left - Bp5758dWrite(cur_col[1] >> 3); //Green - Bp5758dWrite((cur_col[1] & 0x07) << 2); - Bp5758dWrite(cur_col[2] >> 3); //Blue - Bp5758dWrite((cur_col[2] & 0x07) << 2); - Bp5758dWrite(cur_col[3] >> 3); //Warm - Bp5758dWrite((cur_col[3] & 0x07) << 2); - Bp5758dWrite(cur_col[4] >> 3); //Cold - Bp5758dWrite((cur_col[4] & 0x07) << 2); + Bp5758dWrite((cur_col[0] & 0x07) << 2); //Red: Only take last 3 bits, multiplied by 4 / shifted to left + Bp5758dWrite(cur_col[0] >> 3); //Only take first 5bits of tasmota's input + Bp5758dWrite((cur_col[1] & 0x07) << 2); //Green + Bp5758dWrite(cur_col[1] >> 3); + Bp5758dWrite((cur_col[2] & 0x07) << 2); //Blue + Bp5758dWrite(cur_col[2] >> 3); + Bp5758dWrite((cur_col[4] & 0x07) << 2); //Cold + Bp5758dWrite(cur_col[4] >> 3); + Bp5758dWrite((cur_col[3] & 0x07) << 2); //Warm + Bp5758dWrite(cur_col[3] >> 3); Bp5758dStop(); return true; } @@ -178,6 +173,7 @@ void Bp5758dModuleSelected(void) Bp5758dWrite(0x00); Bp5758dWrite(0x00); Bp5758dWrite(0x00); + Bp5758dStop(); TasmotaGlobal.light_type = LT_RGBWC; TasmotaGlobal.light_driver = XLGT_08; From 4ec98e100ed22d2b4c36e43c4d4e14f1ce5184fe Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 16:34:58 +0200 Subject: [PATCH 302/376] Change driver to user 10bit input (feature parity to original driver) --- tasmota/xdrv_04_light.ino | 3 +++ tasmota/xlgt_08_bp5758d.ino | 30 +++++++++++++++--------------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/tasmota/xdrv_04_light.ino b/tasmota/xdrv_04_light.ino index 4a11cabf6..0067d9563 100644 --- a/tasmota/xdrv_04_light.ino +++ b/tasmota/xdrv_04_light.ino @@ -2193,12 +2193,15 @@ void LightSetOutputs(const uint16_t *cur_col_10) { char *tmp_data = XdrvMailbox.data; char *tmp_topic = XdrvMailbox.topic; + char *tmp_command = XdrvMailbox.command; XdrvMailbox.data = (char*)cur_col; XdrvMailbox.topic = (char*)scale_col; + XdrvMailbox.command = (char*)cur_col_10; if (XlgtCall(FUNC_SET_CHANNELS)) { /* Serviced */ } else if (XdrvCall(FUNC_SET_CHANNELS)) { /* Serviced */ } XdrvMailbox.data = tmp_data; XdrvMailbox.topic = tmp_topic; + XdrvMailbox.command = tmp_command; } // Just apply basic Gamma to each channel diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino index 87c612336..23379875d 100644 --- a/tasmota/xlgt_08_bp5758d.ino +++ b/tasmota/xlgt_08_bp5758d.ino @@ -123,24 +123,24 @@ void Bp5758dStop(void) { /********************************************************************************************/ -bool Bp5758dSetChannels(void) { - uint8_t *cur_col = (uint8_t*)XdrvMailbox.data; +bool Bp5758dSetChannels(void) { + uint16_t *cur_col_10 = (uint16_t*)XdrvMailbox.command; + // Even though we could address changing channels only, in practice we observed that the lightbulb always sets all channels. Bp5758dStart(BP5758D_ADDR_OUT1_GL); // Brigtness values are transmitted as two bytes. The light-bulb accepts a 10-bit integer (0-1023) as an input value. - // The first 5bits of this input are transmitted in first byte, the second 5bits in the second byte. - // Because or tasmota's controls are 8bit (0-255), we need to multiply by 4 (or shift two bits to the left). - // We thus transmit the first 5bits of tasmota's input as byte1, and the remaining 3bits as byte2 (shifted left two bits). - Bp5758dWrite((cur_col[0] & 0x07) << 2); //Red: Only take last 3 bits, multiplied by 4 / shifted to left - Bp5758dWrite(cur_col[0] >> 3); //Only take first 5bits of tasmota's input - Bp5758dWrite((cur_col[1] & 0x07) << 2); //Green - Bp5758dWrite(cur_col[1] >> 3); - Bp5758dWrite((cur_col[2] & 0x07) << 2); //Blue - Bp5758dWrite(cur_col[2] >> 3); - Bp5758dWrite((cur_col[4] & 0x07) << 2); //Cold - Bp5758dWrite(cur_col[4] >> 3); - Bp5758dWrite((cur_col[3] & 0x07) << 2); //Warm - Bp5758dWrite(cur_col[3] >> 3); + // The first 5bits of this input are transmitted in second byte, the second 5bits in the first byte. + Bp5758dWrite((uint8_t)(cur_col_10[0] & 0x1F)); //Red: Only take last 3 bits, multiplied by 4 / shifted to left + Bp5758dWrite((uint8_t)(cur_col_10[0] >> 5)); //Only take first 5bits of tasmota's input + Bp5758dWrite((uint8_t)(cur_col_10[1] & 0x1F)); //Green + Bp5758dWrite((uint8_t)(cur_col_10[1] >> 5)); + Bp5758dWrite((uint8_t)(cur_col_10[2] & 0x1F)); //Blue + Bp5758dWrite((uint8_t)(cur_col_10[2] >> 5)); + Bp5758dWrite((uint8_t)(cur_col_10[4] & 0x1F)); //Cold + Bp5758dWrite((uint8_t)(cur_col_10[4] >> 5)); + Bp5758dWrite((uint8_t)(cur_col_10[3] & 0x1F)); //Warm + Bp5758dWrite((uint8_t)(cur_col_10[3] >> 5)); + Bp5758dStop(); return true; } From cae46e0d015ab6b91a422170204290d87cde0c8f Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 17:41:39 +0200 Subject: [PATCH 303/376] Remove logs and add references --- tasmota/xlgt_08_bp5758d.ino | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino index 23379875d..e2104ddf2 100644 --- a/tasmota/xlgt_08_bp5758d.ino +++ b/tasmota/xlgt_08_bp5758d.ino @@ -59,25 +59,10 @@ struct BP5758D { } Bp5758d; /*********************************************************************************************\ - * Bp5758d code + * Bp5758d code - inspired by SM2135 and github.com/dbuezas/esphome-bp5758 \*********************************************************************************************/ const uint8_t BP5758D_DELAY = 2; -/* -void Bp5758dSetLow(uint8_t pin) { - noInterrupts(); - digitalWrite(pin, LOW); - pinMode(pin, OUTPUT); - interrupts(); -} - -void Bp5758dSetHigh(uint8_t pin) { - noInterrupts(); - pinMode(pin, INPUT_PULLUP); - interrupts(); -} -*/ - void Bp5758dInit(void) { pinMode(Bp5758d.data, OUTPUT); pinMode(Bp5758d.clk, OUTPUT); @@ -85,7 +70,6 @@ void Bp5758dInit(void) { } void Bp5758dWrite(uint8_t value) { - AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dWrite %2x"), value); for (int bit_idx = 7; bit_idx >= 0; bit_idx--) { bool bit = bitRead(value, bit_idx); digitalWrite(Bp5758d.data, bit); @@ -105,7 +89,6 @@ void Bp5758dWrite(uint8_t value) { } void Bp5758dStart(uint8_t addr) { - AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStart")); digitalWrite(Bp5758d.data, LOW); delayMicroseconds(BP5758D_DELAY); digitalWrite(Bp5758d.clk, LOW); @@ -114,7 +97,6 @@ void Bp5758dStart(uint8_t addr) { } void Bp5758dStop(void) { - AddLog(LOG_LEVEL_DEBUG, PSTR("LGT: Bp5758dStop")); digitalWrite(Bp5758d.clk, HIGH); delayMicroseconds(BP5758D_DELAY); digitalWrite(Bp5758d.data, HIGH); From 1aaf186cae27074cf5549961ae3c1f70c17355b7 Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 17:55:48 +0200 Subject: [PATCH 304/376] Add support for BP5758's sleep mode --- tasmota/xlgt_08_bp5758d.ino | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino index e2104ddf2..5bded58d4 100644 --- a/tasmota/xlgt_08_bp5758d.ino +++ b/tasmota/xlgt_08_bp5758d.ino @@ -108,6 +108,13 @@ void Bp5758dStop(void) { bool Bp5758dSetChannels(void) { uint16_t *cur_col_10 = (uint16_t*)XdrvMailbox.command; + // If we receive 0 for all channels, we'll assume that the lightbulb is off, and activate BP5758d's sleep mode. + if (cur_col_10[0]==0 && cur_col_10[1]==0 && cur_col_10[2]==0 && cur_col_10[3]==0 && cur_col_10[4]==0) { + Bp5758dStart(BP5758D_ADDR_SLEEP); + Bp5758dStop(); + return true; + } + // Even though we could address changing channels only, in practice we observed that the lightbulb always sets all channels. Bp5758dStart(BP5758D_ADDR_OUT1_GL); // Brigtness values are transmitted as two bytes. The light-bulb accepts a 10-bit integer (0-1023) as an input value. From 72932b9b027c388742b25f255c724d5efb45bc90 Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 18:01:55 +0200 Subject: [PATCH 305/376] Add feature to changelog --- RELEASENOTES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f1e019c8d..415c63d5f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -119,6 +119,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger [#15701](https://github.com/arendst/Tasmota/issues/15701) - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production +- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs ### Breaking Changed From ca3079296bdafca2401481227743e95e47e189da Mon Sep 17 00:00:00 2001 From: oogm Date: Sun, 29 May 2022 18:08:42 +0200 Subject: [PATCH 306/376] Fix outdated comment --- tasmota/xlgt_08_bp5758d.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xlgt_08_bp5758d.ino b/tasmota/xlgt_08_bp5758d.ino index 5bded58d4..e2e93fe97 100644 --- a/tasmota/xlgt_08_bp5758d.ino +++ b/tasmota/xlgt_08_bp5758d.ino @@ -119,8 +119,8 @@ bool Bp5758dSetChannels(void) { Bp5758dStart(BP5758D_ADDR_OUT1_GL); // Brigtness values are transmitted as two bytes. The light-bulb accepts a 10-bit integer (0-1023) as an input value. // The first 5bits of this input are transmitted in second byte, the second 5bits in the first byte. - Bp5758dWrite((uint8_t)(cur_col_10[0] & 0x1F)); //Red: Only take last 3 bits, multiplied by 4 / shifted to left - Bp5758dWrite((uint8_t)(cur_col_10[0] >> 5)); //Only take first 5bits of tasmota's input + Bp5758dWrite((uint8_t)(cur_col_10[0] & 0x1F)); //Red + Bp5758dWrite((uint8_t)(cur_col_10[0] >> 5)); Bp5758dWrite((uint8_t)(cur_col_10[1] & 0x1F)); //Green Bp5758dWrite((uint8_t)(cur_col_10[1] >> 5)); Bp5758dWrite((uint8_t)(cur_col_10[2] & 0x1F)); //Blue From 82636e41b56e1d61c2119a05feb5a0492ef49598 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Sun, 29 May 2022 18:32:04 +0200 Subject: [PATCH 307/376] Berry LVGL fix memory leak in log reader --- lib/libesp32/berry_tasmota/src/be_tasmota_log_reader_class.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_log_reader_class.cpp b/lib/libesp32/berry_tasmota/src/be_tasmota_log_reader_class.cpp index 0ab880c9f..7f9ac60d8 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_log_reader_class.cpp +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_log_reader_class.cpp @@ -6,7 +6,7 @@ #include "be_mapping.h" extern uint32_t* tlr_init(void); BE_FUNC_CTYPE_DECLARE(tlr_init, "+_p", "") -extern char* tlr_get_log(uint32_t* idx, int32_t log_level); BE_FUNC_CTYPE_DECLARE(tlr_get_log, "s", ".i") +extern char* tlr_get_log(uint32_t* idx, int32_t log_level); BE_FUNC_CTYPE_DECLARE(tlr_get_log, "$", ".i") #include "be_fixed_be_class_tasmota_log_reader.h" From 9399150c1e3eaebe995746647a9d71575446ccc8 Mon Sep 17 00:00:00 2001 From: pkkrusty <79770016+pkkrusty@users.noreply.github.com> Date: Sun, 29 May 2022 17:04:14 +0000 Subject: [PATCH 308/376] Change volume range to match driver, increase default MP3 driver documentation and codebase suggest that 0-100 is the volume range. In this case, 30 seems like an appropriate starting point (Similar to 10/30). --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index e513d6595..5502bfc38 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -750,7 +750,7 @@ #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) //#define USE_TCP_BRIDGE // Add support for Serial to TCP bridge (+1.3k code) //#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, pause, stop, track, volume and reset - #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) + #define MP3_VOLUME 30 // Set the startup volume on init, the range can be 0..100(max) // #define USE_DY_SV17F // Use of DY-SV17F MP3 Player commands: play, stop, track and volume //#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger (+1k6 code) //#define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) From bf67031c409bd0b3d5092333126ba071f8f31053 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 30 May 2022 09:35:08 +0200 Subject: [PATCH 309/376] Default disable --- tasmota/my_user_config.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 3ece102f0..6752e2b09 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -555,7 +555,7 @@ #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs +//#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code) #define USE_LIGHT_PALETTE // Add support for color palette (+0k7 code) From 20e12c2a413b3fc487433abc66e71e235c43ce17 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 30 May 2022 11:34:29 +0200 Subject: [PATCH 310/376] Update changelogs --- CHANGELOG.md | 1 + RELEASENOTES.md | 2 +- tasmota/my_user_config.h | 2 +- tasmota/support_features.ino | 7 ++++--- tasmota/tasmota_configurations.h | 8 ++++---- tools/decode-status.py | 2 +- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 84c1a26bc..c7ed24187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701) - Command ``SspmDisplay 2`` to display Sonoff SPM energy data in GUI for user tab-selected relay modules (#13447) - Command ``SetOption141 1`` to disable display of module name in GUI header +- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs (#15713) ### Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 415c63d5f..e367612a1 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -118,8 +118,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo - Support for Sonoff SPM v1.2.0 - Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger [#15701](https://github.com/arendst/Tasmota/issues/15701) - Support for flowrate meters like YF-DN50 and similary [#15474](https://github.com/arendst/Tasmota/issues/15474) +- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs [#15713](https://github.com/arendst/Tasmota/issues/15713) - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production -- Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs ### Breaking Changed diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 750a718bc..8f632349c 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -555,7 +555,7 @@ #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -//#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs +#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs (+0k8 code) #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller (+0k3 code) #define USE_LIGHT_PALETTE // Add support for color palette (+0k7 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index a014d97d1..262990005 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -798,7 +798,7 @@ void ResponseAppendFeatures(void) feature8 |= 0x00800000; // xnrg_23_ade7880.ino #endif #if defined(USE_I2C) && defined(USE_PCF85363) - feature8 |= 0x01000000; // xsns_96_pcf85393.ino + feature8 |= 0x01000000; // xdrv_56_rtc_chips.ino #endif #if defined(USE_I2C) && defined(USE_DS3502) feature8 |= 0x02000000; // xdrv_61_ds3502.ino @@ -809,8 +809,9 @@ void ResponseAppendFeatures(void) #ifdef USE_FLOWRATEMETER feature8 |= 0x08000000; // xsns_96_flowratemeter.ino #endif - -// feature8 |= 0x10000000; +#if defined(USE_LIGHT) && defined(USE_BP5758D) + feature8 |= 0x10000000; // xlgt_08_bp5758d.ino +#endif // feature8 |= 0x20000000; // feature8 |= 0x40000000; // feature8 |= 0x80000000; diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index 97fad2865..f169a4cf1 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -69,7 +69,7 @@ #define USE_MY92X1 // Add support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #define USE_SM16716 // Add support for SM16716 RGB LED controller (+0k7 code) #define USE_SM2135 // Add support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs +#define USE_BP5758D // Add support for BP5758D RGBCW led control as used in some Tuya lightbulbs (+0k8 code) #define USE_SONOFF_L1 // Add support for Sonoff L1 led control #define USE_ELECTRIQ_MOODL // Add support for ElectriQ iQ-wifiMOODL RGBW LED controller #define USE_LIGHT_PALETTE // Add support for color palette (+0k9 code) @@ -403,7 +403,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -#undef USE_BP5758D // Disable support for BP5758D RGBCW led control +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control as used in some Tuya lightbulbs (+0k8 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) @@ -552,7 +552,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -#undef USE_BP5758D // Disable support for BP5758D RGBCW led control +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control as used in some Tuya lightbulbs (+0k8 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) @@ -697,7 +697,7 @@ #undef USE_MY92X1 // Disable support for MY92X1 RGBCW led controller as used in Sonoff B1, Ailight and Lohas #undef USE_SM16716 // Disable support for SM16716 RGB LED controller (+0k7 code) #undef USE_SM2135 // Disable support for SM2135 RGBCW led control as used in Action LSC (+0k6 code) -#undef USE_BP5758D // Disable support for BP5758D RGBCW led control +#undef USE_BP5758D // Disable support for BP5758D RGBCW led control as used in some Tuya lightbulbs (+0k8 code) #undef USE_SONOFF_L1 // Disable support for Sonoff L1 led control #undef USE_ELECTRIQ_MOODL // Disable support for ElectriQ iQ-wifiMOODL RGBW LED controller #undef USE_LIGHT_PALETTE // Disable support for color palette (+0k9 code) diff --git a/tools/decode-status.py b/tools/decode-status.py index f053ec544..89b879720 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -279,7 +279,7 @@ a_features = [[ "USE_HDC2010","USE_LSC_MCSL","USE_SONOFF_SPM","USE_SHIFT595", "USE_SDM230","USE_CM110x","USE_BL6523","USE_ADE7880", "USE_PCF85363","USE_DS3502","USE_IMPROV","USE_FLOWRATEMETER", - "","","","" + "USE_BP5758D","","","" ],[ "","","","", "","","","", From 1148efc319cc0408ad727e97d6c3ffe4d4100eaa Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 30 May 2022 11:40:59 +0200 Subject: [PATCH 311/376] Update BUILDS.md --- BUILDS.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BUILDS.md b/BUILDS.md index c3d70ad51..ec5a87e2e 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -65,6 +65,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_MY92X1 | - | x / - | x | x | - | x | | USE_SM16716 | - | x / - | x | x | - | x | | USE_SM2135 | - | x / - | x | x | - | x | +| USE_BP5758D | - | x / - | x | x | - | x | | USE_SONOFF_L1 | - | x / - | x | x | - | x | | USE_ELECTRIQ_MOODL | - | x / - | x | x | - | x | | | | | | | | | @@ -241,6 +242,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_MI_ESP32 | | / x | | | | | See SetOption115 | USE_IBEACON_ESP32 | | / - | | | | | | USE_WEBCAM | | / - | | | | | -| USE_ETHERNET | | / - | | | | | +| USE_ETHERNET | | / x | | | | | | USE_I2S_AUDIO | | / - | | | | | | USE_TTGO_WATCH | | / - | | | | | +| USE_SONOFF_SPM | | / x | | | | | From dbfb3fe49c5cf7f3eff5c58a1c98764570c7be9d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 30 May 2022 16:21:20 +0200 Subject: [PATCH 312/376] Fix compile warnings --- tasmota/tasmota_configurations.h | 2 +- tasmota/tasmota_configurations_ESP32.h | 4 ++-- tasmota/xdrv_86_esp32_sonoff_spm.ino | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_configurations.h b/tasmota/tasmota_configurations.h index f169a4cf1..b833b66ee 100644 --- a/tasmota/tasmota_configurations.h +++ b/tasmota/tasmota_configurations.h @@ -175,7 +175,7 @@ //#define USE_DYP // Add support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) #define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop - #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) + #define MP3_VOLUME 30 // Set the startup volume on init, the range can be 0..100(max) //#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger #define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) //#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP diff --git a/tasmota/tasmota_configurations_ESP32.h b/tasmota/tasmota_configurations_ESP32.h index e99cc9fee..c61e03336 100644 --- a/tasmota/tasmota_configurations_ESP32.h +++ b/tasmota/tasmota_configurations_ESP32.h @@ -428,7 +428,7 @@ //#define USE_DYP // Add support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) //#define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop - #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) + #define MP3_VOLUME 30 // Set the startup volume on init, the range can be 0..100(max) //#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger //#define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) //#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP @@ -570,7 +570,7 @@ //#define USE_DYP // Add support for DYP ME-007 ultrasonic distance sensor, serial port version (+0k5 code) #define USE_SERIAL_BRIDGE // Add support for software Serial Bridge (+0k8 code) #define USE_MP3_PLAYER // Use of the DFPlayer Mini MP3 Player RB-DFR-562 commands: play, volume and stop - #define MP3_VOLUME 10 // Set the startup volume on init, the range can be 0..30(max) + #define MP3_VOLUME 30 // Set the startup volume on init, the range can be 0..100(max) //#define USE_AZ7798 // Add support for AZ-Instrument 7798 CO2 datalogger #define USE_PN532_HSU // Add support for PN532 using HSU (Serial) interface (+1k8 code, 140 bytes mem) //#define USE_ZIGBEE // Enable serial communication with Zigbee CC2530 flashed with ZNP diff --git a/tasmota/xdrv_86_esp32_sonoff_spm.ino b/tasmota/xdrv_86_esp32_sonoff_spm.ino index 494e72422..ca25ba979 100644 --- a/tasmota/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/xdrv_86_esp32_sonoff_spm.ino @@ -201,6 +201,8 @@ enum SspmMachineStates { SPM_NONE, // Do nothing SPM_UPDATE_CHANNELS // Update Energy for powered on channels }; +enum SspmDisplayModes { SPM_DISPLAY_ROTATE, SPM_DISPLAY_ROTATE_POWERED_ON, SPM_DISPLAY_TABS, SPM_DISPLAY_MAX_OPTION }; + const char kSSPMTriggers[] PROGMEM = "Tasmota|Device|Overload|Overtemp"; const char kSSPMOverload[] PROGMEM = "Tbd1|Voltage|Current|Power|Tbd2|Tbd3|Tbd4"; @@ -316,6 +318,7 @@ void SSPMSettingsDefault(void) { memset(&Sspm->Settings, 0x00, sizeof(tSspmSettings)); Sspm->Settings.version = SSPM_VERSION; + Sspm->Settings.flag.display = SPM_DISPLAY_TABS; // Init any other parameter in struct SSPMSettings } @@ -1981,7 +1984,7 @@ void SSPMEvery100ms(void) { } // If focused on one module increase focused relay polling - if ((2 == Sspm->Settings.flag.display) && (TasmotaGlobal.devices_present > 8) && (0 == Sspm->get_totals)) { + if ((SPM_DISPLAY_TABS == Sspm->Settings.flag.display) && (TasmotaGlobal.devices_present > 8) && (0 == Sspm->get_totals)) { if ((Sspm->get_energy_relay % 4) == 0) { // Every fourth relay uint32_t next = Sspm->rotate +4; if (next >= TasmotaGlobal.devices_present) { next = 0; } @@ -2129,9 +2132,9 @@ void SSPMEnergyShow(bool json) { uint32_t relay_show = 0; power_t power = TasmotaGlobal.power; for (uint32_t i = 0; i < TasmotaGlobal.devices_present; i++) { - if ((0 == Sspm->Settings.flag.display) || - ((1 == Sspm->Settings.flag.display) && (power >> i) &1) || - (2 == Sspm->Settings.flag.display)) { + if ((SPM_DISPLAY_ROTATE == Sspm->Settings.flag.display) || + ((SPM_DISPLAY_ROTATE_POWERED_ON == Sspm->Settings.flag.display) && (power >> i) &1) || + (SPM_DISPLAY_TABS == Sspm->Settings.flag.display)) { relays[relay_show] = i +1; indirect[relay_show] = i; relay_show++; @@ -2139,7 +2142,7 @@ void SSPMEnergyShow(bool json) { } if (relay_show) { - if (Sspm->Settings.flag.display != 2) { + if (Sspm->Settings.flag.display != SPM_DISPLAY_TABS) { if (relay_show > 4) { Sspm->rotate++; } else { @@ -2153,7 +2156,7 @@ void SSPMEnergyShow(bool json) { uint32_t count = relay_show - offset; if (count > 4) { count = 4; } WSContentSend_P(PSTR("
")); // Close current table as we will use different column count - if (2 == Sspm->Settings.flag.display) { + if (SPM_DISPLAY_TABS == Sspm->Settings.flag.display) { uint32_t modules = relay_show / 4; if (modules > 1) { WSContentSend_P(PSTR("{t}")); // {t} = @@ -2229,7 +2232,7 @@ void (* const SSPMCommand[])(void) PROGMEM = { void CmndSSPMDisplay(void) { // Select either all relays, only powered on relays or user selected relay module // SspmDisplay 0, SspmDisplay 1 or SspmDisplay 2 - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 2)) { + if ((XdrvMailbox.payload >= SPM_DISPLAY_ROTATE) && (XdrvMailbox.payload < SPM_DISPLAY_MAX_OPTION)) { Sspm->Settings.flag.display = XdrvMailbox.payload; } ResponseCmndNumber(Sspm->Settings.flag.display); From c0627ed4e437394a634e3c2046ff43d760a54eff Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Mon, 30 May 2022 17:21:42 +0200 Subject: [PATCH 313/376] Update Italian language --- tasmota/language/it_IT.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index c001a5715..c8d2085bc 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 15.05.2022 + * Updated until v9.4.0.1 - Last update 30.05.2022 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -771,8 +771,8 @@ #define D_SENSOR_DDSU666_RX "DDSU666 - RX" #define D_SENSOR_SM2135_CLK "SM2135 - CLK" #define D_SENSOR_SM2135_DAT "SM2135 - DATI" -#define D_SENSOR_BP5758D_CLK "BP5758D Clk" -#define D_SENSOR_BP5758D_DAT "BP5758D DATi" +#define D_SENSOR_BP5758D_CLK "BP5758D - CLK" +#define D_SENSOR_BP5758D_DAT "BP5758D - DATI" #define D_SENSOR_DEEPSLEEP "Sleep profondo" #define D_SENSOR_EXS_ENABLE "EXS - Abilita" #define D_SENSOR_CLIENT_TX "Client - TX" From cc1ac513b930093fd234523a1466cdfdb59f19ab Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 31 May 2022 14:08:33 +0200 Subject: [PATCH 314/376] Fix future core compile error --- tasmota/xdrv_05_irremote.ino | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tasmota/xdrv_05_irremote.ino b/tasmota/xdrv_05_irremote.ino index 6ba461aac..1ac9e5cbd 100644 --- a/tasmota/xdrv_05_irremote.ino +++ b/tasmota/xdrv_05_irremote.ino @@ -76,7 +76,8 @@ const char kIrRemoteCommands[] PROGMEM = "|" D_CMND_IRSEND ; void (* const IrRemoteCommand[])(void) PROGMEM = { &CmndIrSend }; -char* ulltoa(unsigned long long value, char *str, int radix) +// 20220531 renamed as newer arduino core now also has this function +char* ir_ulltoa(unsigned long long value, char *str, int radix) { char digits[64]; char *dst = str; @@ -98,7 +99,7 @@ char* ulltoa(unsigned long long value, char *str, int radix) char* Uint64toHex(uint64_t value, char *str, uint16_t bits) { - ulltoa(value, str, 16); // Get 64bit value + ir_ulltoa(value, str, 16); // Get 64bit value int fill = 8; if ((bits > 3) && (bits < 65)) { @@ -251,7 +252,7 @@ void IrReceiveCheck(void) char svalue[64]; if (Settings->flag.ir_receive_decimal) { // SetOption29 - IR receive data format - ulltoa(results.value, svalue, 10); + ir_ulltoa(results.value, svalue, 10); } else { snprintf_P(svalue, sizeof(svalue), PSTR("\"0x%s\""), hvalue); } From 19e8f1a2afc70725b3034a435c60da82b260643b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 31 May 2022 14:56:09 +0200 Subject: [PATCH 315/376] Prep HYT271 sensor support --- BUILDS.md | 1 + I2CDEVICES.md | 2 ++ tasmota/my_user_config.h | 1 + tasmota/support_features.ino | 4 +++- tools/decode-status.py | 2 +- 5 files changed, 8 insertions(+), 2 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index ec5a87e2e..89f522bce 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -171,6 +171,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_HDC2010 | - | - / - | - | - | - | - | | USE_PCF85363 | - | - / - | - | - | - | - | | USE_DS3502 | - | - / - | - | - | - | - | +| USE_HYT | - | - / - | - | - | - | - | | | | | | | | | | Feature or Sensor | l | t | k | s | i | d | Remarks | USE_SPI | - | - / - | - | - | - | x | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index cb3d0ab83..f3af8c973 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -101,3 +101,5 @@ Index | Define | Driver | Device | Address(es) | Description 65 | USE_ADE7880 | xnrg_23 | ADE7880 | 0x38 | Energy monitor 66 | USE_PCF85363 | xsns_99 | PCF85363 | 0x51 | Real time clock 67 | USE_DS3502 | xdrv_61 | DS3502 | 0x28 - 0x2B | Digital potentiometer + 68 | USE_HYT | xsns_97 | HYTxxx | 0x28 | Temperature and Humidity sensor + \ No newline at end of file diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 8f632349c..b8c9901a8 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -674,6 +674,7 @@ // #define HM330X_HIDE_OUT_OF_DATE false // Option: change to true to hide data from web GUI and SENSOR while sensor is asleep // #define USE_HDC2010 // [I2cDriver64] Enable HDC2010 temperature/humidity sensor (I2C address 0x40) (+1k5 code) // #define USE_DS3502 // [I2CDriver67] Enable DS3502 digital potentiometer (I2C address 0x28 - 0x2B) (+0k4 code) +// #define USE_HYT // [I2CDriver68] Enable HYTxxx temperature and humidity sensor (I2C address 0x28) (+0k5 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/support_features.ino b/tasmota/support_features.ino index 262990005..aae6e897c 100644 --- a/tasmota/support_features.ino +++ b/tasmota/support_features.ino @@ -812,7 +812,9 @@ void ResponseAppendFeatures(void) #if defined(USE_LIGHT) && defined(USE_BP5758D) feature8 |= 0x10000000; // xlgt_08_bp5758d.ino #endif -// feature8 |= 0x20000000; +#if defined(USE_I2C) && defined(USE_HYT) + feature8 |= 0x20000000; // xsns_97_hyt.ino +#endif // feature8 |= 0x40000000; // feature8 |= 0x80000000; } diff --git a/tools/decode-status.py b/tools/decode-status.py index 89b879720..21b75ed3b 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -279,7 +279,7 @@ a_features = [[ "USE_HDC2010","USE_LSC_MCSL","USE_SONOFF_SPM","USE_SHIFT595", "USE_SDM230","USE_CM110x","USE_BL6523","USE_ADE7880", "USE_PCF85363","USE_DS3502","USE_IMPROV","USE_FLOWRATEMETER", - "USE_BP5758D","","","" + "USE_BP5758D","USE_HYT","","" ],[ "","","","", "","","","", From e8376885ff5eec043a216ca3280074d771578480 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 31 May 2022 15:29:03 +0200 Subject: [PATCH 316/376] Fix another future compile error --- lib/libesp32/berry_tasmota/src/be_udp_lib.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp index 042962952..439771fba 100644 --- a/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp +++ b/lib/libesp32/berry_tasmota/src/be_udp_lib.cpp @@ -1,8 +1,8 @@ /******************************************************************** * UDP lib - * + * * To use: `d = udp()` - * + * *******************************************************************/ #include "be_constobj.h" @@ -19,7 +19,7 @@ #include "be_mapping.h" extern "C" { - + // init() WiFiUDP *be_udp_init_ntv(void) { return new WiFiUDP(); @@ -39,7 +39,7 @@ extern "C" { // udp.begin(address:string, port:int) -> nil int32_t be_udp_begin_ntv(WiFiUDP *udp, const char *host, int32_t port) { - IPAddress addr(INADDR_ANY); + IPAddress addr((uint32_t)0); // if no host or host is "" then we defult to INADDR_ANY (0.0.0.0) if(host && (*host != 0) && !WiFiGenericClass::hostByName(host, addr)){ return 0; From f20fd158b62d571008d4a8ad85d46e0b28f40f29 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 1 Jun 2022 14:43:23 +0200 Subject: [PATCH 317/376] Prep tasmota source subdirs --- pio-tools/pre_source_dir.py | 12 ++++++++++++ platformio.ini | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 pio-tools/pre_source_dir.py diff --git a/pio-tools/pre_source_dir.py b/pio-tools/pre_source_dir.py new file mode 100644 index 000000000..19198f394 --- /dev/null +++ b/pio-tools/pre_source_dir.py @@ -0,0 +1,12 @@ +import glob +import os + +Import("env") + +def FindInoNodes(env): + src_dir = glob.escape(env.subst("$PROJECT_SRC_DIR")) + return env.Glob(os.path.join(src_dir, "*.ino")) + env.Glob( + os.path.join(src_dir, "ino_*", "*.ino") + ) + +env.AddMethod(FindInoNodes) diff --git a/platformio.ini b/platformio.ini index 6b77f47c1..773eb4401 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,7 +64,8 @@ lib_extra_dirs = ;bin_dir = /tmp/bin_files/ [scripts_defaults] -extra_scripts = pio-tools/strip-floats.py +extra_scripts = pre:pio-tools/pre_source_dir.py + pio-tools/strip-floats.py pio-tools/name-firmware.py pio-tools/gzip-firmware.py pio-tools/override_copy.py From 19ff938d09b5f08a188dc617ee37c39ee9084bbf Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Wed, 1 Jun 2022 22:06:57 +0200 Subject: [PATCH 318/376] Berry Zigbee support payload of zcl_frame as bytes() --- lib/libesp32/berry/generate/be_const_strtab.h | 2 + .../berry/generate/be_const_strtab_def.h | 2545 +++++++++-------- .../be_fixed_be_class_zcl_frame_ntv.h | 6 +- lib/libesp32/berry_tasmota/src/be_zigbee.c | 13 + .../berry_tasmota/src/be_zigbee_zcl_frame.c | 218 +- .../src/embedded/zigbee_zcl_frame.be | 18 +- tasmota/xdrv_52_3_berry_zigbee.ino | 23 + 7 files changed, 1423 insertions(+), 1402 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 3b61ccf21..61f3dbc90 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -246,6 +246,7 @@ extern const bcstring be_const_str__energy; extern const bcstring be_const_str__error; extern const bcstring be_const_str__filename; extern const bcstring be_const_str__fl; +extern const bcstring be_const_str__get_bytes; extern const bcstring be_const_str__global_addr; extern const bcstring be_const_str__global_def; extern const bcstring be_const_str__lvgl; @@ -256,6 +257,7 @@ extern const bcstring be_const_str__read; extern const bcstring be_const_str__request_from; extern const bcstring be_const_str__rmt; extern const bcstring be_const_str__rules; +extern const bcstring be_const_str__set_bytes; extern const bcstring be_const_str__settings_def; extern const bcstring be_const_str__settings_ptr; extern const bcstring be_const_str__splash; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index c9217e6c3..e0afafdc0 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,987 +1,989 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_event_cb); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str__X7B); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_tasmota); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_settings); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_EVENT_DRAW_MAIN); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_chars_in_string); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_dac_voltage); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_depower); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_finish); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_gamma10); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_stop_iteration); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_content_send); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_duration); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_begin); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_EBEBFFFFFFFFFFFFFFFFFFFFFFFFFFFF); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, NULL); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str_rule); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str__timers); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str_count); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_WS2812_GRB); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_delay); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_get_image_size); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_data); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_set_rgb); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, NULL); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_AudioOutputI2S); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_BRY_X3A_X20failed_X20to_X20run_X20compiled_X20code_X20_X27_X25s_X27_X20_X2D_X20_X25s); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_AudioGeneratorMP3); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_init); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_nvs); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_coord_arr); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_DIMMER); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_draw_line_dsc_init); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_log10); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_COLOR_BLACK); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_set_style_text_color); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_allocated); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, NULL); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_get_vbus_current); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_return_X20code_X3D_X25i); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_collect); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str_line_dsc); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_WS2812); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_can_show); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str__anonymous_); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str_obj); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str__X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str__global_def); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_time_dump); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str__persist_X2Ejson); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_addr); -be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, &be_const_str_draw_ctx); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_set_channels); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, NULL); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_lv_extra); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_AudioGenerator); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_lv_); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, NULL); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_publish_result); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_super); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_get_string); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_invalidate_spiffs); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_compile); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_instance); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_Auto_X2Dconfiguration); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, NULL); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_Partition_otadata); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str__crons); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_rtc); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_adv_cb); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_has_factory); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_ptr); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_active_otadata); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_area); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_add_cmd); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_int64); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_bus); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_light_to_id); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_RES_OK); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_set_rate); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_lv_clock_icon); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_hue); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_SERIAL_8N2); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__write); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_cb_obj); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_pc); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_EVENT_DELETE); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_SERIAL_8E1); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_SERIAL_7E1); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "
- -#ifdef USE_FLOG -#ifdef DEBUG_TASMOTA_SENSOR - const char HTTP_SNS_FLOGVER[] PROGMEM = "{s}
{m}
{e}{s} FLOG with %u sectors: {m}%u bytes{e}" - "{s} FLOG next sector for REC: {m} %u {e}" - "{s} %u sector(s) with data at sector: {m} %u {e}"; - const char HTTP_SNS_FLOGREC[] PROGMEM = "{s} RECORDING (bytes in buffer) {m}%u{e}"; -#endif // DEBUG_TASMOTA_SENSOR - - const char HTTP_SNS_FLOG[] PROGMEM = "{s}
{m}
{e}{s} Flash-Log {m} %s{e}"; - const char kFLOG_STATE0[] PROGMEM = "ready"; - const char kFLOG_STATE1[] PROGMEM = "recording"; - const char * kFLOG_STATE[] ={kFLOG_STATE0, kFLOG_STATE1}; - - const char HTTP_BTN_FLOG_DL[] PROGMEM = ""; - -#endif //USE_FLOG - const char HTTP_SNS_NTPSERVER[] PROGMEM = "{s} NTP server {m}active{e}"; - - const char HTTP_SNS_GPS[] PROGMEM = "{s} GPS latitude {m}%s{e}" - "{s} GPS longitude {m}%s{e}" - "{s} GPS altitude {m}%s m{e}" - "{s} GPS hor. Accuracy {m}%s m{e}" - "{s} GPS vert. Accuracy {m}%s m{e}" - "{s} GPS sat-fix status {m}%s{e}"; - - const char kGPSFix0[] PROGMEM = "no fix"; - const char kGPSFix1[] PROGMEM = "dead reckoning only"; - const char kGPSFix2[] PROGMEM = "2D-fix"; - const char kGPSFix3[] PROGMEM = "3D-fix"; - const char kGPSFix4[] PROGMEM = "GPS + dead reckoning combined"; - const char kGPSFix5[] PROGMEM = "Time only fix"; - const char * kGPSFix[] PROGMEM ={kGPSFix0, kGPSFix1, kGPSFix2, kGPSFix3, kGPSFix4, kGPSFix5}; - -// const char UBX_GOOGLE_MAPS[] =""; - - -#endif // USE_WEBSERVER - -/********************************************************************************************/ - -void UBXShow(bool json) -{ - char lat[12]; - char lon[12]; - char alt[12]; - char hAcc[12]; - char vAcc[12]; - dtostrfd((double)UBX.rec_buffer.values.lat/10000000.0f,7,lat); - dtostrfd((double)UBX.rec_buffer.values.lon/10000000.0f,7,lon); - dtostrfd((double)UBX.state.last_alt/1000.0f,3,alt); - dtostrfd((double)UBX.state.last_vAcc/1000.0f,3,hAcc); - dtostrfd((double)UBX.state.last_hAcc/1000.0f,3,vAcc); - - if (json) { - ResponseAppend_P(PSTR(",\"GPS\":{")); - if (UBX.mode.send_UI_only) { - uint32_t i = UBX.state.log_interval / 10; - ResponseAppend_P(PSTR("\"fil\":%u,\"int\":%u}"), UBX.mode.filter_noise, i); - } else { - ResponseAppend_P(PSTR("\"lat\":%s,\"lon\":%s,\"alt\":%s,\"hAcc\":%s,\"vAcc\":%s}"), lat, lon, alt, hAcc, vAcc); - } -#ifdef USE_FLOG - ResponseAppend_P(PSTR(",\"FLOG\":{\"rec\":%u,\"mode\":%u,\"sec\":%u}"), Flog->recording, Flog->mode, Flog->sectors_left); -#endif //USE_FLOG - UBX.mode.send_UI_only = false; -#ifdef USE_WEBSERVER - } else { - WSContentSend_PD(HTTP_SNS_GPS, lat, lon, alt, hAcc, vAcc, kGPSFix[UBX.state.gpsFix]); - //WSContentSend_P(UBX_GOOGLE_MAPS, lat, lon); -#ifdef DEBUG_TASMOTA_SENSOR -#ifdef USE_FLOG - WSContentSend_PD(HTTP_SNS_FLOGVER, Flog->num_sectors, Flog->size, Flog->current_sector, Flog->sectors_left, Flog->sector.header.physical_start_sector); - if (Flog->recording) { - WSContentSend_PD(HTTP_SNS_FLOGREC, Flog->sector.header.buf_pointer - 8); - } -#endif //USE_FLOG -#endif // DEBUG_TASMOTA_SENSOR -#ifdef USE_FLOG - if (Flog->ready) { - WSContentSend_P(HTTP_SNS_FLOG,kFLOG_STATE[Flog->recording]); - } - if (!Flog->recording && Flog->found_saved_data) { - WSContentSend_P(HTTP_BTN_FLOG_DL); - } -#endif //USE_FLOG - if (UBX.mode.runningNTP) { - WSContentSend_P(HTTP_SNS_NTPSERVER); - } -#endif // USE_WEBSERVER - } -} - -/*********************************************************************************************\ - * check the UBX commands -\*********************************************************************************************/ - -bool UBXCmd(void) -{ - bool serviced = true; - if (XdrvMailbox.data_len > 0) { - UBXSelectMode(XdrvMailbox.payload); - Response_P(S_JSON_UBX_COMMAND_NVALUE, XdrvMailbox.command, XdrvMailbox.payload); - } - return serviced; -} - -/*********************************************************************************************\ - * Interface -\*********************************************************************************************/ - -bool Xsns60(uint8_t function) -{ - bool result = false; - - if (FUNC_INIT == function) { - UBXDetect(); - } - - if (UBX.mode.init) { - switch (function) { - case FUNC_COMMAND_SENSOR: - if (XSNS_60 == XdrvMailbox.index) { - result = UBXCmd(); - } - break; - case FUNC_EVERY_50_MSECOND: - UBXLoop50msec(); // handles virtual serial port and NTP server - break; - case FUNC_EVERY_100_MSECOND: -#ifdef USE_FLOG - if (!Flog->running_download) -#endif //USE_FLOG - { - UBXLoop(); - } - break; -#ifdef USE_FLOG - case FUNC_WEB_ADD_HANDLER: - WebServer_on(PSTR("/UBX"), UBXsendFile); - break; -#endif //USE_FLOG - case FUNC_JSON_APPEND: - UBXShow(1); - break; -#ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: -#ifdef USE_FLOG - if (!Flog->running_download) -#endif //USE_FLOG - { - UBXShow(0); - } - break; -#endif // USE_WEBSERVER - } - } - return result; -} - +/* + xsns_60_GPS.ino - GPS UBLOX support for Tasmota + + Copyright (C) 2021 Theo Arends, Christian Baars and Adrian Scillato + + 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_GPS +#if defined(ESP32) && defined(USE_FLOG) + #undef USE_FLOG + #warning FLOG deactivated on ESP32 +#endif //ESP32 +/*********************************************************************************************\ + -------------------------------------------------------------------------------------------- + Version Date Action Description + -------------------------------------------------------------------------------------------- + + 0.9.3.0 20200214 integrate - fix set lat/lon via commandd 13, V-Port now works parallel + --- + 0.9.2.0 20200110 integrate - Added UART-over-TCP/IP-bridge (virtual serial port). Minor tweaks. + --- + 0.9.1.0 20191216 integrate - Added pin specifications from Tasmota WEB UI. Minor tweaks. + --- + 0.9.0.0 20190817 started - further development by Christian Baars - https://github.com/Staars/Sonoff-Tasmota + forked - from arendst/tasmota - https://github.com/arendst/Sonoff-Tasmota + base - code base from arendst and - https://www.youtube.com/watch?v=TwhCX0c8Xe0 + +## GPS-driver for the Ublox-series 6-8 +Driver is tested on a NEO-6m and a Beitian-220. Series 7 should work too. This adds only about 6kb to the program size, because the efficient UBX-protocol is used. These modules are quite cheap, starting at about 3.50€ for the NEO-6m. + +## Features: +- get position and time data +- sets system time automatically and Settings->latitude and Settings->longitude via command +- can log postion data with timestamp to flash with a small memory footprint of only 12 Bytes per record +- constructs a GPX-file for download of this data +- Web-UI +- simplified NTP-server and UART-over-TCP/IP-bridge (virtual serial port) +- command interface + +## Usage: +The serial pins are GPS_RX and GPS_TX, no further installation steps needed. To get more debug information compile it with option "DEBUG_TASMOTA_SENSOR". + + +## Commands: + ++ sensor60 0 + write to all available sectors, then restart and overwrite the older ones + ++ sensor60 1 + write to all available sectors, then restart and overwrite the older ones + ++ sensor60 2 + filter out horizontal drift noise + ++ sensor60 3 + turn off noise filter + ++ sensor60 4 + start recording, new data will be appended + ++ sensor60 5 + start new recording, old data will lost + ++ sensor60 6 + stop recording, download link will be visible in Web-UI + ++ sensor60 7 + send mqtt on new postion + TELE -> consider to set TELE to a very high value + ++ sensor60 8 + only TELE message + ++ sensor60 9 + start NTP-server + ++ sensor60 10 + deactivate NTP-server + ++ sensor60 11 + force update of Tasmota-system-UTC with every new GPS-time-message + ++ sensor60 12 + do not update of Tasmota-system-UTC with every new GPS-time-message + ++ sensor60 13 + set latitude and longitude in settings + ++ sensor60 14 + open virtual serial port over TCP, usable for u-center + ++ sensor60 15 + pause virtual serial port over TCP + +## Rules examples for SSD1306 32x128 + + +rule1 on tele-GPS#lat do DisplayText [s1p21c1l01f1]LAT: %value% endon on tele-GPS#lon do DisplayText [s1p21c1l2]LON: %value% endon on switch1#state==3 do sensor60 4 endon on switch1#state==2 do sensor60 6 endon + +rule2 on tele-GPS#int>9 do DisplayText [f0c9l4]I%value% endon on tele-GPS#int<10 do DisplayText [f0c9l4]I0%value% endon on tele-GPS#fil==1 do DisplayText [f0c18l4]F endon on tele-GPS#fil==0 do DisplayText [f0c18l4]N endon + +rule3 on tele-FLOG#sec do DisplayText [f0c1l4]SAV:%value% endon on tele-FLOG#rec==1 do DisplayText [f0c1l4]REC: endon on tele-FLOG#mode do DisplayText [f0c14l4]M%value% endon + +\*********************************************************************************************/ + +#define XSNS_60 60 + +#include "NTPServer.h" +#include "NTPPacket.h" + +/*********************************************************************************************\ + * constants +\*********************************************************************************************/ + +#define D_CMND_UBX "UBX" + +const char S_JSON_UBX_COMMAND_NVALUE[] PROGMEM = "{\"" D_CMND_UBX "%s\":%d}"; + +const char kUBXTypes[] PROGMEM = "UBX"; + +#define UBX_LAT_LON_THRESHOLD 1000 // filter out some noise of local drift + +#define UBX_SERIAL_BUFFER_SIZE 256 +#define UBX_TCP_PORT 1234 +#define NTP_MILLIS_OFFSET 50 // estimated latency in milliseconds + +/********************************************************************************************\ +| *globals +\*********************************************************************************************/ + +const char UBLOX_INIT[] PROGMEM = { + // Disable NMEA + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x24, // GxGGA off + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x2B, // GxGLL off + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x32, // GxGSA off + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x39, // GxGSV off + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x04,0x40, // GxRMC off + 0xB5,0x62,0x06,0x01,0x08,0x00,0xF0,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x05,0x47, // GxVTG off + + // Disable UBX + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0xDC, //NAV-PVT off + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0xB9, //NAV-POSLLH off + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0xC0, //NAV-STATUS off + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x92, //NAV-TIMEUTC off + + // Enable UBX + // 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x07,0x00,0x01,0x00,0x00,0x00,0x00,0x18,0xE1, //NAV-PVT on + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x13,0xBE, //NAV-POSLLH on + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x03,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0xC5, //NAV-STATUS on + 0xB5,0x62,0x06,0x01,0x08,0x00,0x01,0x21,0x00,0x01,0x00,0x00,0x00,0x00,0x32,0x97, //NAV-TIMEUTC on + + // Rate - we will not reset it for the moment after restart + // 0xB5,0x62,0x06,0x08,0x06,0x00,0x64,0x00,0x01,0x00,0x01,0x00,0x7A,0x12, //(10Hz) + // 0xB5,0x62,0x06,0x08,0x06,0x00,0xC8,0x00,0x01,0x00,0x01,0x00,0xDE,0x6A, //(5Hz) + // 0xB5,0x62,0x06,0x08,0x06,0x00,0xE8,0x03,0x01,0x00,0x01,0x00,0x01,0x39 //(1Hz) + // 0xB5,0x62,0x06,0x08,0x06,0x00,0xD0,0x07,0x01,0x00,0x01,0x00,0xED,0xBD //(0.5Hz) +}; + +char UBX_name[4]; + +struct UBX_t { + const char UBX_HEADER[2] = { 0xB5, 0x62 }; // TODO: Check if we really save space here inside the struct + const char NAV_POSLLH_HEADER[2] = { 0x01, 0x02 }; + const char NAV_STATUS_HEADER[2] = { 0x01, 0x03 }; + const char NAV_TIME_HEADER[2] = { 0x01, 0x21 }; + + struct entry_t { + int32_t lat; //raw sensor value + int32_t lon; //raw sensor value + uint32_t time; //local time from system (maybe provided by the sensor) + }; + + union { + entry_t values; + uint8_t bytes[sizeof(entry_t)]; + } rec_buffer; + + struct POLL_MSG { + uint8_t cls; + uint8_t id; + uint16_t zero; + }; + + struct NAV_POSLLH { + uint8_t cls; + uint8_t id; + uint16_t len; + uint32_t iTOW; + int32_t lon; + int32_t lat; + int32_t alt; + int32_t hMSL; + uint32_t hAcc; + uint32_t vAcc; + }; + + struct NAV_STATUS { + uint8_t cls; + uint8_t id; + uint16_t len; + uint32_t iTOW; + uint8_t gpsFix; + uint8_t flags; //bit 0 - gpsfix valid + uint8_t fixStat; + uint8_t flags2; + uint32_t ttff; + uint32_t msss; + }; + + struct NAV_TIME_UTC { + uint8_t cls; + uint8_t id; + uint16_t len; + uint32_t iTOW; + uint32_t tAcc; + int32_t nano; // Nanoseconds of second, range -1e9 .. 1e9 (UTC) + uint16_t year; + uint8_t month; + uint8_t day; + uint8_t hour; + uint8_t min; + uint8_t sec; + struct { + uint8_t UTC:1; + uint8_t WKN:1; // week number + uint8_t TOW:1; // time of week + uint8_t padding:5; + } valid; + }; + + struct CFG_RATE { + uint8_t cls; //0x06 + uint8_t id; //0x08 + uint16_t len; // 6 bytes + uint16_t measRate; // in every ms -> 1 Hz = 1000 ms; 10 Hz = 100 ms -> x = 1000 ms / Hz + uint16_t navRate; // x measurements for 1 navigation event + uint16_t timeRef; // align to time system: 0= UTC, 1 = GPS, 2 = GLONASS, ... + char CK[2]; // checksum + }; + + struct { + uint32_t last_iTOW; + int32_t last_alt; + uint32_t last_hAcc; + uint32_t last_vAcc; + uint8_t gpsFix; + uint8_t non_empty_loops; // in case of an unintended reset of the GPS, the serial interface will get flooded with NMEA + uint16_t log_interval; // in tenth of seconds + int32_t timeOffset; // roughly computed offset millis() - iTOW + } state; + + struct { + uint32_t init:1; + uint32_t filter_noise:1; + uint32_t send_when_new:1; // no teleinterval + uint32_t send_UI_only:1; + uint32_t runningNTP:1; + // uint32_t blockedNTP:1; + uint32_t forceUTCupdate:1; + uint32_t runningVPort:1; + // TODO: more to come + } mode; + + union { + NAV_POSLLH navPosllh; + NAV_STATUS navStatus; + NAV_TIME_UTC navTime; + POLL_MSG pollMsg; + CFG_RATE cfgRate; + } Message; + + uint32_t utc_time; + + uint8_t TCPbuf[UBX_SERIAL_BUFFER_SIZE]; + size_t TCPbufSize; +} UBX; + +enum UBXMsgType { + MT_NONE, + MT_NAV_POSLLH, + MT_NAV_STATUS, + MT_NAV_TIME, + MT_POLL +}; + +#ifdef USE_FLOG +FLOG *Flog = nullptr; +#endif //USE_FLOG +TasmotaSerial *UBXSerial; + +NtpServer timeServer(PortUdp); + +WiFiServer vPortServer(UBX_TCP_PORT); +WiFiClient vPortClient; + +/*********************************************************************************************\ + * helper function +\*********************************************************************************************/ + +void UBXcalcChecksum(char* CK, size_t msgSize) +{ + memset(CK, 0, 2); + for (int i = 0; i < msgSize; i++) { + CK[0] += ((char*)(&UBX.Message))[i]; + CK[1] += CK[0]; + } +} + +bool UBXcompareMsgHeader(const char* msgHeader) +{ + char* ptr = (char*)(&UBX.Message); + return ptr[0] == msgHeader[0] && ptr[1] == msgHeader[1]; +} + +void UBXinitCFG(void) +{ + for (uint32_t i = 0; i < sizeof(UBLOX_INIT); i++) { + UBXSerial->write( pgm_read_byte(UBLOX_INIT+i) ); + } + DEBUG_SENSOR_LOG(PSTR("UBX: turn off NMEA")); +} + +void UBXsendCFGLine(uint8_t _line) +{ + if (_line>sizeof(UBLOX_INIT)/16) return; + for (uint32_t i = 0; i < 16; i++) { + UBXSerial->write( pgm_read_byte(UBLOX_INIT+i+(_line*16)) ); + } + DEBUG_SENSOR_LOG(PSTR("UBX: send line %u of UBLOX_INIT"), _line); +} + +/********************************************************************************************/ + +void UBXDetect(void) +{ + UBX.mode.init = 0; + if (PinUsed(GPIO_GPS_RX) && PinUsed(GPIO_GPS_TX)) { + UBXSerial = new TasmotaSerial(Pin(GPIO_GPS_RX), Pin(GPIO_GPS_TX), 1, 0, UBX_SERIAL_BUFFER_SIZE); // 64 byte buffer is NOT enough + if (UBXSerial->begin(9600)) { + DEBUG_SENSOR_LOG(PSTR("UBX: started serial")); + if (UBXSerial->hardwareSerial()) { + ClaimSerial(); + DEBUG_SENSOR_LOG(PSTR("UBX: claim HW")); + } + } + } + else { + return; + } + + UBXinitCFG(); // turn off NMEA, only use "our" UBX-messages + UBX.mode.init = 1; + +#ifdef USE_FLOG + if (!Flog) { + Flog = new FLOG; // init Flash Log + Flog->init(); + } +#endif // USE_FLOG + + UBX.state.log_interval = 10; // 1 second + UBX.mode.send_UI_only = true; // send UI data ... +// MqttPublishTeleperiodSensor(); // ... once at after start (No MQTT ready yet so do NOT try to send) +} + +uint32_t UBXprocessGPS() +{ + static uint32_t fpos = 0; + static char checksum[2]; + static uint8_t currentMsgType = MT_NONE; + static size_t payloadSize = sizeof(UBX.Message); + + // DEBUG_SENSOR_LOG(PSTR("UBX: check for serial data")); + uint32_t data_bytes = 0; + while ( UBXSerial->available() ) { + data_bytes++; + byte c = UBXSerial->read(); + if (UBX.mode.runningVPort){ + UBX.TCPbuf[data_bytes-1] = c; // immediately copy byte to TCP-buf + UBX.TCPbufSize = data_bytes; + } + if ( fpos < 2 ) { + // For the first two bytes we are simply looking for a match with the UBX header bytes (0xB5,0x62) + if ( c == UBX.UBX_HEADER[fpos] ) { + fpos++; + } else { + fpos = 0; // Reset to beginning state. + } + } else { + // If we come here then fpos >= 2, which means we have found a match with the UBX_HEADER + // and we are now reading in the bytes that make up the payload. + + // Place the incoming byte into the ubxMessage struct. The position is fpos-2 because + // the struct does not include the initial two-byte header (UBX_HEADER). + if ( (fpos-2) < payloadSize ) { + ((char*)(&UBX.Message))[fpos-2] = c; + } + fpos++; + + if ( fpos == 4 ) { + // We have just received the second byte of the message type header, + // so now we can check to see what kind of message it is. + if ( UBXcompareMsgHeader(UBX.NAV_POSLLH_HEADER) ) { + currentMsgType = MT_NAV_POSLLH; + payloadSize = sizeof(UBX_t::NAV_POSLLH); + DEBUG_SENSOR_LOG(PSTR("UBX: got NAV_POSLLH")); + } + else if ( UBXcompareMsgHeader(UBX.NAV_STATUS_HEADER) ) { + currentMsgType = MT_NAV_STATUS; + payloadSize = sizeof(UBX_t::NAV_STATUS); + DEBUG_SENSOR_LOG(PSTR("UBX: got NAV_STATUS")); + } + else if ( UBXcompareMsgHeader(UBX.NAV_TIME_HEADER) ) { + currentMsgType = MT_NAV_TIME; + payloadSize = sizeof(UBX_t::NAV_TIME_UTC); + DEBUG_SENSOR_LOG(PSTR("UBX: got NAV_TIME_UTC")); + } + else { + // unknown message type, bail + fpos = 0; + continue; + } + } + + if ( fpos == (payloadSize+2) ) { + // All payload bytes have now been received, so we can calculate the + // expected checksum value to compare with the next two incoming bytes. + UBXcalcChecksum(checksum, payloadSize); + } + else if ( fpos == (payloadSize+3) ) { + // First byte after the payload, ie. first byte of the checksum. + // Does it match the first byte of the checksum we calculated? + if ( c != checksum[0] ) { + // Checksum doesn't match, reset to beginning state and try again. + fpos = 0; + } + } + else if ( fpos == (payloadSize+4) ) { + // Second byte after the payload, ie. second byte of the checksum. + // Does it match the second byte of the checksum we calculated? + fpos = 0; // We will reset the state regardless of whether the checksum matches. + if ( c == checksum[1] ) { + // Checksum matches, we have a valid message. + return currentMsgType; + } + } + else if ( fpos > (payloadSize+4) ) { + // We have now read more bytes than both the expected payload and checksum + // together, so something went wrong. Reset to beginning state and try again. + fpos = 0; + } + } + } + // DEBUG_SENSOR_LOG(PSTR("UBX: got none or unknown Message")); + if (data_bytes!=0) { + UBX.state.non_empty_loops++; + DEBUG_SENSOR_LOG(PSTR("UBX: got %u bytes, non-empty-loop: %u"), data_bytes, UBX.state.non_empty_loops); + } else { + UBX.state.non_empty_loops = 0; // now a hidden GPS-device reset is unlikely + } + return MT_NONE; +} + +/********************************************************************************************\ +| * callback functions for the download +\*********************************************************************************************/ + +#ifdef USE_FLOG +void UBXsendHeader(void) +{ + Webserver->setContentLength(CONTENT_LENGTH_UNKNOWN); + Webserver->sendHeader(F("Content-Disposition"), F("attachment; filename=TASMOTA.gpx")); + WSSend(200, CT_APP_STREAM, F( + "\r\n" + "\r\n" + "\r\n\r\n")); +} + +void UBXsendRecord(uint8_t *buf) +{ + char record[100]; + char stime[32]; + UBX_t::entry_t *entry = (UBX_t::entry_t*)buf; + snprintf_P(stime, sizeof(stime), GetDT(entry->time).c_str()); + char lat[12]; + char lon[12]; + dtostrfd((double)entry->lat/10000000.0f,7,lat); + dtostrfd((double)entry->lon/10000000.0f,7,lon); + snprintf_P(record, sizeof(record),PSTR("\n\t\n\n"),lat ,lon, stime); + // DEBUG_SENSOR_LOG(PSTR("FLOG: DL %u %u"), Flog->sector.dword_buffer[k+j],Flog->sector.dword_buffer[k+j+1]); + Webserver->sendContent_P(record); +} + +void UBXsendFooter(void) +{ + Webserver->sendContent(F("\n\n")); + Webserver->sendContent(""); + Rtc.user_time_entry = false; // we have blocked the main loop and want a new valid time +} + +/********************************************************************************************/ + +void UBXsendFile(void) +{ + if (!HttpCheckPriviledgedAccess()) { return; } + Flog->startDownload(sizeof(UBX.rec_buffer),UBXsendHeader,UBXsendRecord,UBXsendFooter); +} +#endif //USE_FLOG + +/********************************************************************************************/ + +void UBXSetRate(uint16_t interval) +{ + UBX.Message.cfgRate.cls = 0x06; + UBX.Message.cfgRate.id = 0x08; + UBX.Message.cfgRate.len = 6; + uint32_t measRate = (1000*(uint32_t)interval); //seconds to milliseconds + if (measRate > 0xffff) { + measRate = 0xffff; // max. 65535 ms interval + } + UBX.Message.cfgRate.measRate = (uint16_t)measRate; + UBX.Message.cfgRate.navRate = 1; + UBX.Message.cfgRate.timeRef = 1; + UBXcalcChecksum(UBX.Message.cfgRate.CK, sizeof(UBX.Message.cfgRate)-sizeof(UBX.Message.cfgRate.CK)); + DEBUG_SENSOR_LOG(PSTR("UBX: requested interval: %u seconds measRate: %u ms"), interval, UBX.Message.cfgRate.measRate); + UBXSerial->write(UBX.UBX_HEADER[0]); + UBXSerial->write(UBX.UBX_HEADER[1]); + for (uint32_t i =0; iwrite(((uint8_t*)(&UBX.Message.cfgRate))[i]); + DEBUG_SENSOR_LOG(PSTR("UBX: cfgRate byte %u: %x"), i, ((uint8_t*)(&UBX.Message.cfgRate))[i]); + } + UBX.state.log_interval = 10*interval; +} + +void UBXSelectMode(uint16_t mode) +{ + DEBUG_SENSOR_LOG(PSTR("UBX: set mode to %u"),mode); + switch(mode){ +#ifdef USE_FLOG + case 0: + Flog->mode = 0; // write once to all available sectors, then stop + break; + case 1: + Flog->mode = 1; // write to all available sectors, then restart and overwrite the older ones + break; + case 2: + UBX.mode.filter_noise = true; // filter out horizontal drift noise, TODO: find useful values + break; + case 3: + UBX.mode.filter_noise = false; + break; + case 4: + Flog->startRecording(true); + AddLog(LOG_LEVEL_INFO, PSTR("UBX: start recording - appending")); + break; + case 5: + Flog->startRecording(false); + AddLog(LOG_LEVEL_INFO, PSTR("UBX: start recording - new log")); + break; + case 6: + if(Flog->recording == true){ + Flog->stopRecording(); + } + AddLog(LOG_LEVEL_INFO, PSTR("UBX: stop recording")); + break; +#endif //USE_FLOG + case 7: + UBX.mode.send_when_new = 1; // send mqtt on new postion + TELE -> consider to set TELE to a very high value + break; + case 8: + UBX.mode.send_when_new = 0; // only TELE + break; + case 9: + if (timeServer.beginListening()) { + UBX.mode.runningNTP = true; + } + break; + case 10: + UBX.mode.runningNTP = false; + UBXsendCFGLine(10); //NAV-POSLLH on + UBXsendCFGLine(11); //NAV-STATUS on + break; + case 11: + UBX.mode.forceUTCupdate = true; + break; + case 12: + UBX.mode.forceUTCupdate = false; + break; + case 13: + Settings->latitude = UBX.rec_buffer.values.lat/10; + Settings->longitude = UBX.rec_buffer.values.lon/10; + break; + case 14: + vPortServer.begin(); + UBX.mode.runningVPort = 1; + break; + case 15: + // vPortServer.stop(); // seems not to work reliably + UBX.mode.runningVPort = 0; + break; + default: + if (mode>1000 && mode <1066) { + UBXSetRate(mode-1000); // set interval between measurements in seconds from 1 to 65 + } + break; + } + UBX.mode.send_UI_only = true; + MqttPublishTeleperiodSensor(); +} + +/********************************************************************************************/ + +bool UBXHandlePOSLLH() +{ + DEBUG_SENSOR_LOG(PSTR("UBX: iTOW: %u"),UBX.Message.navPosllh.iTOW); + if (UBX.state.gpsFix>1) { + if (UBX.mode.filter_noise) { + if ((UBX.Message.navPosllh.lat-UBX.rec_buffer.values.lat go to pure NTP-mode + UBXsendCFGLine(7); //NAV-POSLLH off + UBXsendCFGLine(8); //NAV-STATUS off + } + return true; // new position + } else { + DEBUG_SENSOR_LOG(PSTR("UBX: no valid position data")); + } + return false; // no GPS-fix +} + +void UBXHandleSTATUS() +{ + DEBUG_SENSOR_LOG(PSTR("UBX: gpsFix: %u, valid: %u"), UBX.Message.navStatus.gpsFix, (UBX.Message.navStatus.flags)&1); + if ((UBX.Message.navStatus.flags)&1) { + UBX.state.gpsFix = UBX.Message.navStatus.gpsFix; //only store fixed status if flag is valid + } else { + UBX.state.gpsFix = 0; // without valid flag, everything is "no fix" + } +} + +void UBXHandleTIME() +{ + DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time: %u-%u-%u %u:%u:%u"), UBX.Message.navTime.year, UBX.Message.navTime.month ,UBX.Message.navTime.day,UBX.Message.navTime.hour,UBX.Message.navTime.min,UBX.Message.navTime.sec); + if (UBX.Message.navTime.valid.UTC == 1) { + UBX.state.timeOffset = millis(); // iTOW%1000 should be 0 here, when NTP-server is enabled and in "pure mode" + DEBUG_SENSOR_LOG(PSTR("UBX: UTC-Time is valid")); + bool resync = (Rtc.utc_time > UBX.utc_time); // Sync local time every hour + if (Rtc.user_time_entry == false || UBX.mode.forceUTCupdate || UBX.mode.runningNTP || resync) { + TIME_T gpsTime; + gpsTime.year = UBX.Message.navTime.year - 1970; + gpsTime.month = UBX.Message.navTime.month; + gpsTime.day_of_month = UBX.Message.navTime.day; + gpsTime.hour = UBX.Message.navTime.hour; + gpsTime.minute = UBX.Message.navTime.min; + gpsTime.second = UBX.Message.navTime.sec; + UBX.rec_buffer.values.time = MakeTime(gpsTime); + if (UBX.mode.forceUTCupdate || (Rtc.user_time_entry == false) || resync) { +// AddLog(LOG_LEVEL_INFO, PSTR("UBX: UTC-Time is valid, set system time")); + UBX.utc_time = UBX.rec_buffer.values.time + 3600; + Rtc.utc_time = UBX.rec_buffer.values.time; + RtcSync("UBX"); + } + Rtc.user_time_entry = true; + } + } +} + +void UBXHandleOther(void) +{ + if (UBX.state.non_empty_loops>6) { // we expect only 4-5 non-empty loops in a row, could change with other sensor speed (Hz) + if(UBX.mode.runningVPort) return; + UBXinitCFG(); // this should only happen with lots of NMEA-messages, but it is only a guess!! + AddLog(LOG_LEVEL_ERROR, PSTR("UBX: possible device-reset, will re-init")); + UBXSerial->flush(); + UBX.state.non_empty_loops = 0; + } +} + +/********************************************************************************************/ + +void UBXLoop50msec(void) +{ + // handle virtual serial port + if (UBX.mode.runningVPort){ + if(!vPortClient.connected()) { + vPortClient = vPortServer.available(); + } + while(vPortClient.available()) { + byte _newByte = vPortClient.read(); + UBXSerial->write(_newByte); + } + + if (UBX.TCPbufSize!=0){ + vPortClient.write((char*)UBX.TCPbuf, UBX.TCPbufSize); + UBX.TCPbufSize = 0; + } + } + // handle NTP-server + if(UBX.mode.runningNTP){ + timeServer.processOneRequest(UBX.rec_buffer.values.time, UBX.state.timeOffset - NTP_MILLIS_OFFSET); + } +} + +void UBXLoop(void) +{ + static uint16_t counter; //count up every 100 msec + static bool new_position; + + uint32_t msgType = UBXprocessGPS(); + + switch(msgType){ + case MT_NAV_POSLLH: + new_position = UBXHandlePOSLLH(); + break; + case MT_NAV_STATUS: + UBXHandleSTATUS(); + break; + case MT_NAV_TIME: + UBXHandleTIME(); + break; + default: + UBXHandleOther(); + break; + } + +#ifdef USE_FLOG + if (counter>UBX.state.log_interval) { + if (Flog->recording && new_position) { + UBX.rec_buffer.values.time = Rtc.local_time; + Flog->addToBuffer(UBX.rec_buffer.bytes, sizeof(UBX.rec_buffer.bytes)); + counter = 0; + } + } +#endif // USE_FLOG + + counter++; +} + +/********************************************************************************************/ +// normaly in i18n.h + +#ifdef USE_WEBSERVER + // {s} = + +#ifdef USE_FLOG +#ifdef DEBUG_TASMOTA_SENSOR + const char HTTP_SNS_FLOGVER[] PROGMEM = "{s}
{m}
{e}{s} FLOG with %u sectors: {m}%u bytes{e}" + "{s} FLOG next sector for REC: {m} %u {e}" + "{s} %u sector(s) with data at sector: {m} %u {e}"; + const char HTTP_SNS_FLOGREC[] PROGMEM = "{s} RECORDING (bytes in buffer) {m}%u{e}"; +#endif // DEBUG_TASMOTA_SENSOR + + const char HTTP_SNS_FLOG[] PROGMEM = "{s}
{m}
{e}{s} Flash-Log {m} %s{e}"; + const char kFLOG_STATE0[] PROGMEM = "ready"; + const char kFLOG_STATE1[] PROGMEM = "recording"; + const char * kFLOG_STATE[] ={kFLOG_STATE0, kFLOG_STATE1}; + + const char HTTP_BTN_FLOG_DL[] PROGMEM = ""; + +#endif //USE_FLOG + const char HTTP_SNS_NTPSERVER[] PROGMEM = "{s} NTP server {m}active{e}"; + + const char HTTP_SNS_GPS[] PROGMEM = "{s} GPS latitude {m}%s{e}" + "{s} GPS longitude {m}%s{e}" + "{s} GPS altitude {m}%s m{e}" + "{s} GPS hor. Accuracy {m}%s m{e}" + "{s} GPS vert. Accuracy {m}%s m{e}" + "{s} GPS sat-fix status {m}%s{e}"; + + const char kGPSFix0[] PROGMEM = "no fix"; + const char kGPSFix1[] PROGMEM = "dead reckoning only"; + const char kGPSFix2[] PROGMEM = "2D-fix"; + const char kGPSFix3[] PROGMEM = "3D-fix"; + const char kGPSFix4[] PROGMEM = "GPS + dead reckoning combined"; + const char kGPSFix5[] PROGMEM = "Time only fix"; + const char * kGPSFix[] PROGMEM ={kGPSFix0, kGPSFix1, kGPSFix2, kGPSFix3, kGPSFix4, kGPSFix5}; + +// const char UBX_GOOGLE_MAPS[] =""; + + +#endif // USE_WEBSERVER + +/********************************************************************************************/ + +void UBXShow(bool json) +{ + char lat[12]; + char lon[12]; + char alt[12]; + char hAcc[12]; + char vAcc[12]; + dtostrfd((double)UBX.rec_buffer.values.lat/10000000.0f,7,lat); + dtostrfd((double)UBX.rec_buffer.values.lon/10000000.0f,7,lon); + dtostrfd((double)UBX.state.last_alt/1000.0f,3,alt); + dtostrfd((double)UBX.state.last_vAcc/1000.0f,3,hAcc); + dtostrfd((double)UBX.state.last_hAcc/1000.0f,3,vAcc); + + if (json) { + ResponseAppend_P(PSTR(",\"GPS\":{")); + if (UBX.mode.send_UI_only) { + uint32_t i = UBX.state.log_interval / 10; + ResponseAppend_P(PSTR("\"fil\":%u,\"int\":%u}"), UBX.mode.filter_noise, i); + } else { + ResponseAppend_P(PSTR("\"lat\":%s,\"lon\":%s,\"alt\":%s,\"hAcc\":%s,\"vAcc\":%s}"), lat, lon, alt, hAcc, vAcc); + } +#ifdef USE_FLOG + ResponseAppend_P(PSTR(",\"FLOG\":{\"rec\":%u,\"mode\":%u,\"sec\":%u}"), Flog->recording, Flog->mode, Flog->sectors_left); +#endif //USE_FLOG + UBX.mode.send_UI_only = false; +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_GPS, lat, lon, alt, hAcc, vAcc, kGPSFix[UBX.state.gpsFix]); + //WSContentSend_P(UBX_GOOGLE_MAPS, lat, lon); +#ifdef DEBUG_TASMOTA_SENSOR +#ifdef USE_FLOG + WSContentSend_PD(HTTP_SNS_FLOGVER, Flog->num_sectors, Flog->size, Flog->current_sector, Flog->sectors_left, Flog->sector.header.physical_start_sector); + if (Flog->recording) { + WSContentSend_PD(HTTP_SNS_FLOGREC, Flog->sector.header.buf_pointer - 8); + } +#endif //USE_FLOG +#endif // DEBUG_TASMOTA_SENSOR +#ifdef USE_FLOG + if (Flog->ready) { + WSContentSend_P(HTTP_SNS_FLOG,kFLOG_STATE[Flog->recording]); + } + if (!Flog->recording && Flog->found_saved_data) { + WSContentSend_P(HTTP_BTN_FLOG_DL); + } +#endif //USE_FLOG + if (UBX.mode.runningNTP) { + WSContentSend_P(HTTP_SNS_NTPSERVER); + } +#endif // USE_WEBSERVER + } +} + +/*********************************************************************************************\ + * check the UBX commands +\*********************************************************************************************/ + +bool UBXCmd(void) +{ + bool serviced = true; + if (XdrvMailbox.data_len > 0) { + UBXSelectMode(XdrvMailbox.payload); + Response_P(S_JSON_UBX_COMMAND_NVALUE, XdrvMailbox.command, XdrvMailbox.payload); + } + return serviced; +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns60(uint8_t function) +{ + bool result = false; + + if (FUNC_INIT == function) { + UBXDetect(); + } + + if (UBX.mode.init) { + switch (function) { + case FUNC_COMMAND_SENSOR: + if (XSNS_60 == XdrvMailbox.index) { + result = UBXCmd(); + } + break; + case FUNC_EVERY_50_MSECOND: + UBXLoop50msec(); // handles virtual serial port and NTP server + break; + case FUNC_EVERY_100_MSECOND: +#ifdef USE_FLOG + if (!Flog->running_download) +#endif //USE_FLOG + { + UBXLoop(); + } + break; +#ifdef USE_FLOG + case FUNC_WEB_ADD_HANDLER: + WebServer_on(PSTR("/UBX"), UBXsendFile); + break; +#endif //USE_FLOG + case FUNC_JSON_APPEND: + UBXShow(1); + break; +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: +#ifdef USE_FLOG + if (!Flog->running_download) +#endif //USE_FLOG + { + UBXShow(0); + } + break; +#endif // USE_WEBSERVER + } + } + return result; +} + #endif // USE_GPS \ No newline at end of file diff --git a/tasmota/xsns_61_MI_NRF24.ino b/tasmota/tasmota_xsns_sensor/xsns_61_MI_NRF24.ino similarity index 100% rename from tasmota/xsns_61_MI_NRF24.ino rename to tasmota/tasmota_xsns_sensor/xsns_61_MI_NRF24.ino diff --git a/tasmota/xsns_62_MI_HM10.ino b/tasmota/tasmota_xsns_sensor/xsns_62_MI_HM10.ino similarity index 100% rename from tasmota/xsns_62_MI_HM10.ino rename to tasmota/tasmota_xsns_sensor/xsns_62_MI_HM10.ino diff --git a/tasmota/xsns_62_esp32_mi.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino similarity index 99% rename from tasmota/xsns_62_esp32_mi.ino rename to tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino index 1adf5ab08..ef705efa9 100644 --- a/tasmota/xsns_62_esp32_mi.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino @@ -24,15 +24,15 @@ -------------------------------------------------------------------------------------------- 0.9.5.5 20220326 changed - refactored connection task for asynchronous op, add response option, fixed MI32Key command - ------- + ------- 0.9.5.4 20220325 changed - add Berry adv_watch and adv_block to BLE class - ------- + ------- 0.9.5.3 20220315 changed - reworked Berry part, active scanning and holding active connections possible, new format of advertisement buffer - ------- + ------- 0.9.5.1 20220209 changed - rename YEERC to YLYK01, add dimmer YLKG08 (incl. YLKG07), change button report scheme ------- 0.9.5.0 20211016 changed - major rewrite, added mi32cfg (file and command), Homekit-Bridge, - extended GUI, + extended GUI, removed BLOCK, PERIOD, TIME, UNIT, BATTERY and PAGE -> replaced via Berry-Support ------- 0.9.1.7 20201116 changed - small bugfixes, add BLOCK and OPTION command, send BLE scan via MQTT @@ -63,7 +63,7 @@ #include -#include "xsns_62_esp32_mi.h" +#include "include/xsns_62_esp32_mi.h" #ifdef USE_MI_HOMEKIT extern "C" void mi_homekit_main(void); @@ -140,7 +140,7 @@ class MI32AdvCallbacks: public NimBLEAdvertisedDeviceCallbacks { _mutex = false; return; } - + uint16_t UUID = advertisedDevice->getServiceDataUUID(0).getNative()->u16.value; ServiceDataLength = advertisedDevice->getServiceData(0).length(); @@ -517,7 +517,7 @@ void MI32StatusInfo() { #ifdef USE_MI_EXT_GUI /** * @brief Saves a sensor value mapped to the graph range of 0-20 pixel, this function automatically reads the actual hour from system time - * + * * @param history - pointer to uint8_t[23] * @param value - value as float, this * @param type - internal type. for BLE: 0 - temperature, 1 - humidity, 2 - illuminance, for internal sensors: 100 - wattage @@ -550,7 +550,7 @@ void MI32addHistory(uint8_t *history, float value, uint32_t type){ /** * @brief Returns a value betwenn 0-21 for use as a data point in the history graph of the extended web UI - * + * * @param history - pointer to uint8_t[23] * @param hour - hour of datapoint * @return uint8_t - value for the y-axis, should be between 0-21 @@ -566,7 +566,7 @@ uint8_t MI32fetchHistory(uint8_t *history, uint32_t hour){ /** * @brief Invalidates the history data of the following hour by setting MSB to 0, should be called at FUNC_JSON_APPEND - * + * */ void Mi32invalidateOldHistory(){ uint32_t _hour = (LocalTime()%SECS_PER_DAY)/SECS_PER_HOUR; @@ -634,11 +634,11 @@ void MI32Init(void) { MI32getSetupCodeFromMAC(MI32.hk_setup_code); AddLog(LOG_LEVEL_INFO,PSTR("M32: Init HAP core")); mi_homekit_main(); - #else + #else MI32.mode.didStartHAP = 1; #endif //USE_MI_HOMEKIT } - + if (!MI32.mode.init) { NimBLEDevice::setScanFilterMode(CONFIG_BTDM_SCAN_DUPL_TYPE_DATA_DEVICE); NimBLEDevice::setScanDuplicateCacheSize(40); // will not be perfect for every situation (few vs many BLE devices nearby) @@ -820,8 +820,8 @@ extern "C" { /** * @brief Get at least a bit of the status of the HAP core, i.e. to reduce the activy of the driver while doing the pairing - * - * @param event + * + * @param event */ void MI32passHapEvent(uint32_t event){ switch(event){ @@ -852,7 +852,7 @@ extern "C" { /** * @brief Simply store the writeable HAP characteristics as void pointers in the "main" driver for updates of the values - * + * * @param slot - sensor slot in MIBLEsensors * @param type - sensors type, except for the buttons this is equal to the mibeacon types * @param handle - a void ponter to a characteristic @@ -897,7 +897,7 @@ extern "C" { * Example: AABBCC1234f2 * -> 111-11-234 * This is no security feature, only for convenience - * * @param setupcode + * * @param setupcode */ void MI32getSetupCodeFromMAC(char *setupcode){ uint8_t _mac[6]; @@ -1064,10 +1064,10 @@ void MI32ScanTask(void *pvParameters){ } MI32Scan = NimBLEDevice::getScan(); - + MI32Scan->setAdvertisedDeviceCallbacks(&MI32ScanCallbacks,false); if(NimBLEDevice::getWhiteListCount()>0){ - MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL); + MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL); } else { MI32Scan->setFilterPolicy(BLE_HCI_SCAN_FILT_NO_WL); @@ -1077,7 +1077,7 @@ void MI32ScanTask(void *pvParameters){ MI32Scan->setMaxResults(0); MI32Scan->start(0, MI32scanEndedCB, false); // never stop scanning, will pause automatically while connecting MI32.infoMsg = MI32.option.activeScan?MI32_START_SCANNING_ACTIVE:MI32_START_SCANNING_PASSIVE; - + uint32_t timer = 0; for(;;){ vTaskDelay(1000/ portTICK_PERIOD_MS); @@ -1224,7 +1224,7 @@ void MI32ConnectionTask(void *pvParameters){ // AddLog(LOG_LEVEL_DEBUG,PSTR("M32: write op done")); } else{ - MI32.conCtx->error = MI32_CONN_DID_NOT_WRITE; + MI32.conCtx->error = MI32_CONN_DID_NOT_WRITE; } } else{ @@ -1352,7 +1352,7 @@ if(decryptRet!=0){ if((void**)MIBLEsensors[_slot].button_hap_service[0] != nullptr){ mi_homekit_update_value(MIBLEsensors[_slot].button_hap_service[0], (float)2.0f, 0x01); // only one button, long press = 2 } -#endif //USE_MI_HOMEKIT +#endif //USE_MI_HOMEKIT break; } // single, double, long @@ -1661,10 +1661,10 @@ void MI32Every50mSecond(){ else if(MI32.beAdvBuf[_index+1] == 0xff){ _manu = _index + 2; } - _index += MI32.beAdvBuf[_index] + 1; + _index += MI32.beAdvBuf[_index] + 1; } // AddLog(LOG_LEVEL_DEBUG,PSTR("M32: svc:%u , manu:%u"),_svc,_manu); - void (*func_ptr)(int,int) = (void (*)(int,int))MI32.beAdvCB; + void (*func_ptr)(int,int) = (void (*)(int,int))MI32.beAdvCB; func_ptr(_svc,_manu); } MI32.mode.triggerBerryAdvCB = 0; @@ -2344,7 +2344,7 @@ int ExtStopBLE(){ MI32Scan->stop(); MI32.mode.deleteScanTask = 1; AddLog(LOG_LEVEL_INFO,PSTR("M32: stop BLE")); - } + } #ifdef USE_MI_HOMEKIT if(MI32.mode.didStartHAP) { AddLog(LOG_LEVEL_INFO,PSTR("M32: stop Homebridge")); diff --git a/tasmota/xsns_62_esp32_mi_ble.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi_ble.ino similarity index 100% rename from tasmota/xsns_62_esp32_mi_ble.ino rename to tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi_ble.ino diff --git a/tasmota/xsns_62_esp32_mi_homekit.c b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi_homekit.c similarity index 100% rename from tasmota/xsns_62_esp32_mi_homekit.c rename to tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi_homekit.c diff --git a/tasmota/xsns_63_aht1x.ino b/tasmota/tasmota_xsns_sensor/xsns_63_aht1x.ino similarity index 100% rename from tasmota/xsns_63_aht1x.ino rename to tasmota/tasmota_xsns_sensor/xsns_63_aht1x.ino diff --git a/tasmota/xsns_64_hrxl.ino b/tasmota/tasmota_xsns_sensor/xsns_64_hrxl.ino similarity index 100% rename from tasmota/xsns_64_hrxl.ino rename to tasmota/tasmota_xsns_sensor/xsns_64_hrxl.ino diff --git a/tasmota/xsns_65_hdc1080.ino b/tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino similarity index 100% rename from tasmota/xsns_65_hdc1080.ino rename to tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino diff --git a/tasmota/xsns_66_iAQ.ino b/tasmota/tasmota_xsns_sensor/xsns_66_iAQ.ino similarity index 100% rename from tasmota/xsns_66_iAQ.ino rename to tasmota/tasmota_xsns_sensor/xsns_66_iAQ.ino diff --git a/tasmota/xsns_67_as3935.ino b/tasmota/tasmota_xsns_sensor/xsns_67_as3935.ino similarity index 100% rename from tasmota/xsns_67_as3935.ino rename to tasmota/tasmota_xsns_sensor/xsns_67_as3935.ino diff --git a/tasmota/xsns_68_windmeter.ino b/tasmota/tasmota_xsns_sensor/xsns_68_windmeter.ino similarity index 100% rename from tasmota/xsns_68_windmeter.ino rename to tasmota/tasmota_xsns_sensor/xsns_68_windmeter.ino diff --git a/tasmota/xsns_69_opentherm.ino b/tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino similarity index 100% rename from tasmota/xsns_69_opentherm.ino rename to tasmota/tasmota_xsns_sensor/xsns_69_opentherm.ino diff --git a/tasmota/xsns_69_opentherm_protocol.ino b/tasmota/tasmota_xsns_sensor/xsns_69_opentherm_protocol.ino similarity index 100% rename from tasmota/xsns_69_opentherm_protocol.ino rename to tasmota/tasmota_xsns_sensor/xsns_69_opentherm_protocol.ino diff --git a/tasmota/xsns_70_veml6075.ino b/tasmota/tasmota_xsns_sensor/xsns_70_veml6075.ino similarity index 100% rename from tasmota/xsns_70_veml6075.ino rename to tasmota/tasmota_xsns_sensor/xsns_70_veml6075.ino diff --git a/tasmota/xsns_71_veml7700.ino b/tasmota/tasmota_xsns_sensor/xsns_71_veml7700.ino similarity index 100% rename from tasmota/xsns_71_veml7700.ino rename to tasmota/tasmota_xsns_sensor/xsns_71_veml7700.ino diff --git a/tasmota/xsns_72_mcp9808.ino b/tasmota/tasmota_xsns_sensor/xsns_72_mcp9808.ino similarity index 100% rename from tasmota/xsns_72_mcp9808.ino rename to tasmota/tasmota_xsns_sensor/xsns_72_mcp9808.ino diff --git a/tasmota/xsns_73_hp303b.ino b/tasmota/tasmota_xsns_sensor/xsns_73_hp303b.ino similarity index 100% rename from tasmota/xsns_73_hp303b.ino rename to tasmota/tasmota_xsns_sensor/xsns_73_hp303b.ino diff --git a/tasmota/xsns_74_lmt01.ino b/tasmota/tasmota_xsns_sensor/xsns_74_lmt01.ino similarity index 100% rename from tasmota/xsns_74_lmt01.ino rename to tasmota/tasmota_xsns_sensor/xsns_74_lmt01.ino diff --git a/tasmota/xsns_75_prometheus.ino b/tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino similarity index 100% rename from tasmota/xsns_75_prometheus.ino rename to tasmota/tasmota_xsns_sensor/xsns_75_prometheus.ino diff --git a/tasmota/xsns_76_dyp.ino b/tasmota/tasmota_xsns_sensor/xsns_76_dyp.ino similarity index 100% rename from tasmota/xsns_76_dyp.ino rename to tasmota/tasmota_xsns_sensor/xsns_76_dyp.ino diff --git a/tasmota/xsns_77_vl53l1x.ino b/tasmota/tasmota_xsns_sensor/xsns_77_vl53l1x.ino similarity index 100% rename from tasmota/xsns_77_vl53l1x.ino rename to tasmota/tasmota_xsns_sensor/xsns_77_vl53l1x.ino diff --git a/tasmota/xsns_78_ezo.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezo.ino similarity index 100% rename from tasmota/xsns_78_ezo.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezo.ino diff --git a/tasmota/xsns_78_ezoco2.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoco2.ino similarity index 100% rename from tasmota/xsns_78_ezoco2.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoco2.ino diff --git a/tasmota/xsns_78_ezodo.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezodo.ino similarity index 100% rename from tasmota/xsns_78_ezodo.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezodo.ino diff --git a/tasmota/xsns_78_ezoec.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoec.ino similarity index 100% rename from tasmota/xsns_78_ezoec.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoec.ino diff --git a/tasmota/xsns_78_ezoflo.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoflo.ino similarity index 100% rename from tasmota/xsns_78_ezoflo.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoflo.ino diff --git a/tasmota/xsns_78_ezohum.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezohum.ino similarity index 100% rename from tasmota/xsns_78_ezohum.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezohum.ino diff --git a/tasmota/xsns_78_ezoo2.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoo2.ino similarity index 100% rename from tasmota/xsns_78_ezoo2.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoo2.ino diff --git a/tasmota/xsns_78_ezoorp.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoorp.ino similarity index 100% rename from tasmota/xsns_78_ezoorp.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoorp.ino diff --git a/tasmota/xsns_78_ezoph.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoph.ino similarity index 100% rename from tasmota/xsns_78_ezoph.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoph.ino diff --git a/tasmota/xsns_78_ezopmp.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezopmp.ino similarity index 100% rename from tasmota/xsns_78_ezopmp.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezopmp.ino diff --git a/tasmota/xsns_78_ezoprs.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezoprs.ino similarity index 100% rename from tasmota/xsns_78_ezoprs.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezoprs.ino diff --git a/tasmota/xsns_78_ezorgb.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezorgb.ino similarity index 100% rename from tasmota/xsns_78_ezorgb.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezorgb.ino diff --git a/tasmota/xsns_78_ezortd.ino b/tasmota/tasmota_xsns_sensor/xsns_78_ezortd.ino similarity index 100% rename from tasmota/xsns_78_ezortd.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_ezortd.ino diff --git a/tasmota/xsns_78_xezo.ino b/tasmota/tasmota_xsns_sensor/xsns_78_xezo.ino similarity index 100% rename from tasmota/xsns_78_xezo.ino rename to tasmota/tasmota_xsns_sensor/xsns_78_xezo.ino diff --git a/tasmota/xsns_79_as608.ino b/tasmota/tasmota_xsns_sensor/xsns_79_as608.ino similarity index 100% rename from tasmota/xsns_79_as608.ino rename to tasmota/tasmota_xsns_sensor/xsns_79_as608.ino diff --git a/tasmota/xsns_80_mfrc522.ino b/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino similarity index 100% rename from tasmota/xsns_80_mfrc522.ino rename to tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino diff --git a/tasmota/xsns_81_seesaw_soil.ino b/tasmota/tasmota_xsns_sensor/xsns_81_seesaw_soil.ino similarity index 100% rename from tasmota/xsns_81_seesaw_soil.ino rename to tasmota/tasmota_xsns_sensor/xsns_81_seesaw_soil.ino diff --git a/tasmota/xsns_82_wiegand.ino b/tasmota/tasmota_xsns_sensor/xsns_82_wiegand.ino similarity index 100% rename from tasmota/xsns_82_wiegand.ino rename to tasmota/tasmota_xsns_sensor/xsns_82_wiegand.ino diff --git a/tasmota/xsns_83_neopool.ino b/tasmota/tasmota_xsns_sensor/xsns_83_neopool.ino similarity index 100% rename from tasmota/xsns_83_neopool.ino rename to tasmota/tasmota_xsns_sensor/xsns_83_neopool.ino diff --git a/tasmota/xsns_84_tof10120.ino b/tasmota/tasmota_xsns_sensor/xsns_84_tof10120.ino similarity index 100% rename from tasmota/xsns_84_tof10120.ino rename to tasmota/tasmota_xsns_sensor/xsns_84_tof10120.ino diff --git a/tasmota/xsns_85_mpu6886.ino b/tasmota/tasmota_xsns_sensor/xsns_85_mpu6886.ino similarity index 100% rename from tasmota/xsns_85_mpu6886.ino rename to tasmota/tasmota_xsns_sensor/xsns_85_mpu6886.ino diff --git a/tasmota/xsns_86_tfminiplus.ino b/tasmota/tasmota_xsns_sensor/xsns_86_tfminiplus.ino similarity index 100% rename from tasmota/xsns_86_tfminiplus.ino rename to tasmota/tasmota_xsns_sensor/xsns_86_tfminiplus.ino diff --git a/tasmota/xsns_87_mcp2515.ino b/tasmota/tasmota_xsns_sensor/xsns_87_mcp2515.ino similarity index 100% rename from tasmota/xsns_87_mcp2515.ino rename to tasmota/tasmota_xsns_sensor/xsns_87_mcp2515.ino diff --git a/tasmota/xsns_88_am2320.ino b/tasmota/tasmota_xsns_sensor/xsns_88_am2320.ino similarity index 100% rename from tasmota/xsns_88_am2320.ino rename to tasmota/tasmota_xsns_sensor/xsns_88_am2320.ino diff --git a/tasmota/xsns_89_t67xx.ino b/tasmota/tasmota_xsns_sensor/xsns_89_t67xx.ino similarity index 100% rename from tasmota/xsns_89_t67xx.ino rename to tasmota/tasmota_xsns_sensor/xsns_89_t67xx.ino diff --git a/tasmota/xsns_90_hrg15.ino b/tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino similarity index 100% rename from tasmota/xsns_90_hrg15.ino rename to tasmota/tasmota_xsns_sensor/xsns_90_hrg15.ino diff --git a/tasmota/xsns_91_vindriktning.ino b/tasmota/tasmota_xsns_sensor/xsns_91_vindriktning.ino similarity index 100% rename from tasmota/xsns_91_vindriktning.ino rename to tasmota/tasmota_xsns_sensor/xsns_91_vindriktning.ino diff --git a/tasmota/xsns_92_scd40.ino b/tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino similarity index 100% rename from tasmota/xsns_92_scd40.ino rename to tasmota/tasmota_xsns_sensor/xsns_92_scd40.ino diff --git a/tasmota/xsns_93_hm330x.ino b/tasmota/tasmota_xsns_sensor/xsns_93_hm330x.ino similarity index 100% rename from tasmota/xsns_93_hm330x.ino rename to tasmota/tasmota_xsns_sensor/xsns_93_hm330x.ino diff --git a/tasmota/xsns_94_hdc2010.ino b/tasmota/tasmota_xsns_sensor/xsns_94_hdc2010.ino old mode 100755 new mode 100644 similarity index 100% rename from tasmota/xsns_94_hdc2010.ino rename to tasmota/tasmota_xsns_sensor/xsns_94_hdc2010.ino diff --git a/tasmota/xsns_95_cm110x.ino b/tasmota/tasmota_xsns_sensor/xsns_95_cm110x.ino similarity index 100% rename from tasmota/xsns_95_cm110x.ino rename to tasmota/tasmota_xsns_sensor/xsns_95_cm110x.ino diff --git a/tasmota/xsns_96_flowratemeter.ino b/tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino similarity index 100% rename from tasmota/xsns_96_flowratemeter.ino rename to tasmota/tasmota_xsns_sensor/xsns_96_flowratemeter.ino diff --git a/tasmota/xsns_interface.ino b/tasmota/tasmota_xsns_sensor/xsns_interface.ino similarity index 100% rename from tasmota/xsns_interface.ino rename to tasmota/tasmota_xsns_sensor/xsns_interface.ino diff --git a/tasmota/xx2c_interface.ino b/tasmota/tasmota_xx2c_global/xx2c_interface.ino similarity index 100% rename from tasmota/xx2c_interface.ino rename to tasmota/tasmota_xx2c_global/xx2c_interface.ino From 59dbd4df3d04812e47f584052eae1240210bac2a Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 2 Jun 2022 14:19:20 +0200 Subject: [PATCH 320/376] Update changelogs --- CHANGELOG.md | 19 ++++++++++++------- RELEASENOTES.md | 3 ++- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7ed24187..29d17ef91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,18 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [11.1.0.3] +## [11.1.0.4] +### Added + +### Changed +- Restructured tasmota source directories taking benefit from PlatformIO Core v6.0.2 + +### Fixed + +### Removed + + +## [11.1.0.3] 20220602 ### Added - Support for Sonoff SPM v1.2.0 - Support for Sonoff Zigbee Bridge Pro by Stephan Hadinger (#15701) @@ -11,15 +22,9 @@ All notable changes to this project will be documented in this file. - Command ``SetOption141 1`` to disable display of module name in GUI header - Support for 5-channel light dimmer driver BP5758D used in Tuya bulbs (#15713) -### Changed - - ### Fixed - Possible pin output toggle after power on (#15630) -### Removed - - ## [11.1.0.2] 20220514 ### Added - ESP32 Command ``Restart 3`` to switch between SafeBoot and Production diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e367612a1..e02970188 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -104,7 +104,7 @@ 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 v11.1.0.3 +## Changelog v11.1.0.4 ### Added - Command ``SetOption139 0/1`` to switch between pressure unit "mmHg" (0) or "inHg" (1) when ``SO24 1`` [#15350](https://github.com/arendst/Tasmota/issues/15350) - Command ``SetOption140 0/1`` to switch between MQTT Clean Session (0) or Persistent Session (1) [#15530](https://github.com/arendst/Tasmota/issues/15530) @@ -124,6 +124,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmo ### Breaking Changed ### Changed +- Restructured tasmota source directories taking benefit from PlatformIO Core v6.0.2 - Prepare to remove dedicated Home Assistant discovery in favour of Tasmota Discovery and hatasmota - ESP32 Tasmota SafeBoot with changed partition scheme allowing larger binaries From 9afb2c9cb8ca1400ef667eb825117649b3f7d3d8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 2 Jun 2022 14:50:31 +0200 Subject: [PATCH 321/376] Move interface files down allowing for folder insertions --- .../xdrv_interface.ino | 0 .../xdsp_interface.ino | 0 .../xlgt_interface.ino | 0 .../xnrg_interface.ino | 0 .../xsns_interface.ino | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename tasmota/{tasmota_xdrv_driver => tasmota_xx2c_global}/xdrv_interface.ino (100%) rename tasmota/{tasmota_xdsp_display => tasmota_xx2c_global}/xdsp_interface.ino (100%) rename tasmota/{tasmota_xlgt_light => tasmota_xx2c_global}/xlgt_interface.ino (100%) rename tasmota/{tasmota_xnrg_energy => tasmota_xx2c_global}/xnrg_interface.ino (100%) rename tasmota/{tasmota_xsns_sensor => tasmota_xx2c_global}/xsns_interface.ino (100%) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_interface.ino b/tasmota/tasmota_xx2c_global/xdrv_interface.ino similarity index 100% rename from tasmota/tasmota_xdrv_driver/xdrv_interface.ino rename to tasmota/tasmota_xx2c_global/xdrv_interface.ino diff --git a/tasmota/tasmota_xdsp_display/xdsp_interface.ino b/tasmota/tasmota_xx2c_global/xdsp_interface.ino similarity index 100% rename from tasmota/tasmota_xdsp_display/xdsp_interface.ino rename to tasmota/tasmota_xx2c_global/xdsp_interface.ino diff --git a/tasmota/tasmota_xlgt_light/xlgt_interface.ino b/tasmota/tasmota_xx2c_global/xlgt_interface.ino similarity index 100% rename from tasmota/tasmota_xlgt_light/xlgt_interface.ino rename to tasmota/tasmota_xx2c_global/xlgt_interface.ino diff --git a/tasmota/tasmota_xnrg_energy/xnrg_interface.ino b/tasmota/tasmota_xx2c_global/xnrg_interface.ino similarity index 100% rename from tasmota/tasmota_xnrg_energy/xnrg_interface.ino rename to tasmota/tasmota_xx2c_global/xnrg_interface.ino diff --git a/tasmota/tasmota_xsns_sensor/xsns_interface.ino b/tasmota/tasmota_xx2c_global/xsns_interface.ino similarity index 100% rename from tasmota/tasmota_xsns_sensor/xsns_interface.ino rename to tasmota/tasmota_xx2c_global/xsns_interface.ino From 192d09d40a1a52f513b70640a9f28245178a9295 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Thu, 2 Jun 2022 16:02:24 +0200 Subject: [PATCH 322/376] fix building without HomeKit --- tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino index ef705efa9..82bd6b24b 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_62_esp32_mi.ino @@ -65,6 +65,9 @@ #include "include/xsns_62_esp32_mi.h" +#if USE_MI_HOMEKIT==0 + #undef USE_MI_HOMEKIT +#endif #ifdef USE_MI_HOMEKIT extern "C" void mi_homekit_main(void); extern "C" void mi_homekit_update_value(void* handle, float value, uint32_t type); @@ -1154,8 +1157,8 @@ bool MI32StartConnectionTask(){ void MI32ConnectionTask(void *pvParameters){ #if !defined(CONFIG_IDF_TARGET_ESP32C3) //needs more testing ... - NimBLEDevice::setOwnAddrType(BLE_OWN_ADDR_RANDOM,false); //seems to be important for i.e. xbox controller, hopefully not breaking other things - NimBLEDevice::setSecurityAuth(true, true, true); + // NimBLEDevice::setOwnAddrType(BLE_OWN_ADDR_RANDOM,false); //seems to be important for i.e. xbox controller, hopefully not breaking other things + // NimBLEDevice::setSecurityAuth(true, true, true); #endif //CONFIG_IDF_TARGET_ESP32C3 MI32.conCtx->error = MI32_CONN_NO_ERROR; if (MI32ConnectActiveSensor()){ From 793c1fedacdaeac60a583e5a8d7d08649c9170cc Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 2 Jun 2022 16:56:04 +0200 Subject: [PATCH 323/376] add the new build env in override example --- platformio_override_sample.ini | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index e78d20cdb..b0ee95454 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -31,12 +31,14 @@ default_envs = ; tasmota32-webcam ; tasmota32-knx ; tasmota32-sensors -; tasmota32-display +; tasmota32-lvgl ; tasmota32-ir ; tasmota32solo1 ; tasmota32c3 +; tasmota32c3usb ; tasmota32s2 ; tasmota32s3 +; tasmota32s3usb ; tasmota32-odroidgo ; tasmota32-core2 @@ -92,11 +94,11 @@ lib_extra_dirs = ${library.lib_extra_dirs} [env:tasmota32_base] ; *** Uncomment next lines ";" to enable development Tasmota Arduino version ESP32 ;platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-v.2.0.3.zip -;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/837/framework-arduinoespressif32-v4.4_dev-6fa4526c0d.tar.gz +;platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/847/framework-arduinoespressif32-v4.4_dev-d327997163.tar.gz build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} -; Build variant ESP32 4M Flash, Tasmota 1856k Code/OTA, 320k LITTLEFS (default) +; Build variant ESP32 4M Flash, Tasmota 1856k Code/OTA, 1344k LITTLEFS (default) ;board = esp32_4M ; Build variant ESP32 8M Flash, Tasmota 2944k Code/OTA, 2112k LITTLEFS ;board = esp32_8M From 25f86741068a61544fb41bda55ff0e41a517a2ea Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 2 Jun 2022 17:14:05 +0200 Subject: [PATCH 324/376] Fix local ca includes --- tasmota/include/local_ca_data_sample.h | 2 +- tasmota/include/local_ca_descriptor_sample.h | 8 ++++---- tasmota/tasmota_support/tasmota_ca.ino | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/tasmota/include/local_ca_data_sample.h b/tasmota/include/local_ca_data_sample.h index 93e286344..2d874a0c8 100644 --- a/tasmota/include/local_ca_data_sample.h +++ b/tasmota/include/local_ca_data_sample.h @@ -25,7 +25,7 @@ is located. ./brssl ta pki/ca.crt | sed -e '/br_x509/,+999 d' >local_ca_data.h -Then copy local_ca_data.h into the same directory as user_config_override. +Then copy local_ca_data.h into directory include. Add this line to user_config_override.h: diff --git a/tasmota/include/local_ca_descriptor_sample.h b/tasmota/include/local_ca_descriptor_sample.h index 3b9ee2cb3..cafe455f7 100644 --- a/tasmota/include/local_ca_descriptor_sample.h +++ b/tasmota/include/local_ca_descriptor_sample.h @@ -18,14 +18,14 @@ */ /* -To generate a version of this file containing data for your root certificate, -run the following command from a Linux or Cygwin bash shell, assuming that a +To generate a version of this file containing data for your root certificate, +run the following command from a Linux or Cygwin bash shell, assuming that a copy of brssl (or brssl.exe) is in the directory where the EasyRSA shell script -is located. +is located. ./brssl ta pki/ca.crt | sed -e '1,/br_x509/ d' -e '/};/,+999 d' >local_ca_descriptor.h -Then copy local_ca_descriptor.h into the same directory as user_config_override. +Then copy local_ca_descriptor.h into directory include. Add this line to user_config_override.h: diff --git a/tasmota/tasmota_support/tasmota_ca.ino b/tasmota/tasmota_support/tasmota_ca.ino index c34e4ba12..03091aa3e 100644 --- a/tasmota/tasmota_support/tasmota_ca.ino +++ b/tasmota/tasmota_support/tasmota_ca.ino @@ -189,7 +189,7 @@ const br_x509_trust_anchor PROGMEM Tasmota_TA[] = { #if defined(INCLUDE_LOCAL_CERT) -#include +#include #endif }; From e5765a1cd6d6cfab078fe3c23df74fdb86ceabd2 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 2 Jun 2022 18:38:06 +0200 Subject: [PATCH 325/376] Add domoticz idx check Add domoticz idx check while staying backwards compatible (#15677) --- .../tasmota_xdrv_driver/xdrv_07_domoticz.ino | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino index b469ef1d5..83f1bfd79 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino @@ -202,11 +202,28 @@ bool DomoticzMqttData(void) { return false; // Process unchanged data } - // topic is domoticz/out so try to analyse + // topic is domoticz/out so check if valid data could be available if (XdrvMailbox.data_len < 20) { return true; // No valid data } + // Quick check if this is mine using topic domoticz/out/{$idx} + if (strlen(XdrvMailbox.topic) > strlen(DOMOTICZ_OUT_TOPIC)) { + char* topic_index = &XdrvMailbox.topic[strlen(DOMOTICZ_OUT_TOPIC) +1]; + uint32_t idx = atoi(topic_index); + uint8_t maxdev = (TasmotaGlobal.devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : TasmotaGlobal.devices_present; + bool not_found = true; + for (uint32_t i = 0; i < maxdev; i++) { + if (idx == Settings->domoticz_relay_idx[i]) { + not_found = false; + break; + } + } + if (not_found) { + return true; // Idx not mine + } + } + String domoticz_data = XdrvMailbox.data; // Copy the string into a new buffer that will be modified JsonParser parser((char*)domoticz_data.c_str()); JsonParserObject domoticz = parser.getRootObject(); From 8314dc3dc79dab79459fd544a3364361cc0d405d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 2 Jun 2022 20:44:00 +0200 Subject: [PATCH 326/376] add builds zbbrdgpro / NsPanel --- .github/workflows/Tasmota_build_devel.yml | 4 ++ .github/workflows/Tasmota_build_master.yml | 4 ++ .github/workflows/build_all_the_things.yml | 2 + platformio_override_sample.ini | 4 +- platformio_tasmota32.ini | 6 ++ platformio_tasmota_env32.ini | 32 +++++++-- .../include/tasmota_configurations_ESP32.h | 66 +++++++++++++++++++ 7 files changed, 112 insertions(+), 6 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index c81bc4b65..a1f6204b4 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -32,8 +32,10 @@ jobs: - tasmota-zbbridge - tasmota-zigbee - tasmota32 + - tasmota32-zbbrdgpro - tasmota32-webcam - tasmota32-bluetooth + - tasmota32-nspanel - tasmota32-display - tasmota32-ir - tasmota32-lvgl @@ -125,6 +127,8 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32c3*.* ] || mv ./mv_firmware/firmware/tasmota32c3*.* ./firmware/tasmota32/ diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index ab158fc49..8cc057300 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -31,8 +31,10 @@ jobs: - tasmota-zbbridge - tasmota-zigbee - tasmota32 + - tasmota32-zbbrdgpro - tasmota32-webcam - tasmota32-bluetooth + - tasmota32-nspanel - tasmota32-display - tasmota32-ir - tasmota32-lvgl @@ -132,6 +134,8 @@ jobs: [ ! -f ./mv_firmware/firmware/tasmota32-display.* ] || mv ./mv_firmware/firmware/tasmota32-display.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-lvgl.* ] || mv ./mv_firmware/firmware/tasmota32-lvgl.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-web*.* ] || mv ./mv_firmware/firmware/tasmota32-web*.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ] || mv ./mv_firmware/firmware/tasmota32-zbbrdgpro.* ./release-firmware/tasmota32/ + [ ! -f ./mv_firmware/firmware/tasmota32-nspanel.* ] || mv ./mv_firmware/firmware/tasmota32-nspanel.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-odroidgo.* ] || mv ./mv_firmware/firmware/tasmota32-odroidgo.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-core2.* ] || mv ./mv_firmware/firmware/tasmota32-core2.* ./release-firmware/tasmota32/ [ ! -f ./mv_firmware/firmware/tasmota32-bluetooth.* ] || mv ./mv_firmware/firmware/tasmota32-bluetooth.* ./release-firmware/tasmota32/ diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index f82d04b51..c5ba5ae12 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -32,11 +32,13 @@ jobs: - tasmota-minimal - tasmota-sensors - tasmota-zbbridge + - tasmota32-zbbrdgpro - tasmota-zigbee - tasmota32 - tasmota32-webcam - tasmota32-bluetooth - tasmota32-core2 + - tasmota32-nspanel - tasmota32-display - tasmota32-ir - tasmota32-lvgl diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index b0ee95454..f2b696b8a 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -27,6 +27,7 @@ default_envs = ; tasmota-zbbridge ; tasmota-ir ; tasmota32 +; tasmota32-zbbrdgpro ; tasmota32-bluetooth ; tasmota32-webcam ; tasmota32-knx @@ -41,6 +42,7 @@ default_envs = ; tasmota32s3usb ; tasmota32-odroidgo ; tasmota32-core2 +; tasmota32-nspanel [env] @@ -48,7 +50,7 @@ default_envs = ;platform = https://github.com/platformio/platform-espressif8266.git ;platform_packages = framework-arduinoespressif8266 @ https://github.com/esp8266/Arduino.git ; mcspr/toolchain-xtensa @ ~5.100300.211127 -; platformio/tool-esptoolpy @ ~1.30100 +; platformio/tool-esptoolpy @ ~1.30300 ;build_unflags = ${common.build_unflags} ; -Wswitch-unreachable ;build_flags = ${common.build_flags} diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 4a69368c9..d88649ef2 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -49,3 +49,9 @@ platform = https://github.com/tasmota/platform-espressif32/re platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} + +[core32itead] +platform = https://github.com/tasmota/platform-espressif32/releases/download/v.2.0.3/platform-espressif32-solo1-v.2.0.3.zip +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/esp32-arduino-lib-builder/releases/download/v2.0.3/framework-arduinoespressif32-itead.tar.gz +build_unflags = ${esp32_defaults.build_unflags} +build_flags = ${esp32_defaults.build_flags} \ No newline at end of file diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index dfb40107c..a13344c74 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -101,6 +101,13 @@ extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} -DUSE_IR_REMOTE_FULL -DFIRMWARE_IR lib_extra_dirs = lib/libesp32, lib/lib_basic, lib/lib_ssl +[env:tasmota32solo1] +extends = env:tasmota32_base +board = esp32_solo1_4M +platform = ${core32solo1.platform} +platform_packages = ${core32solo1.platform_packages} +build_flags = ${core32solo1.build_flags} -DFIRMWARE_TASMOTA32 + [env:tasmota32solo1-safeboot] extends = env:tasmota32_base board = esp32_solo1_4M @@ -114,12 +121,27 @@ lib_ignore = Micro-RTSP epdiy -[env:tasmota32solo1] +[env:tasmota32-zbbrdgpro] extends = env:tasmota32_base -board = esp32_solo1_4M -platform = ${core32solo1.platform} -platform_packages = ${core32solo1.platform_packages} -build_flags = ${core32solo1.build_flags} -DFIRMWARE_TASMOTA32 +board = esp32_4M_FS +platform = ${core32itead.platform} +platform_packages = ${core32itead.platform_packages} +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_ZBBRDGPRO +custom_files_upload = ${env:tasmota32_base.custom_files_upload} + tools/fw_SonoffZigbeeBridgePro_cc2652/Sonoff_ZBPro.autoconf + tasmota/berry/zigbee/cc2652_flasher.be + tasmota/berry/zigbee/intelhex.be + tasmota/berry/zigbee/sonoff_zb_pro_flasher.be + tools/fw_SonoffZigbeeBridgePro_cc2652/SonoffZBPro_coord_20220219.hex +lib_extra_dirs = lib/lib_basic, lib/lib_ssl, lib/libesp32 + +[env:tasmota32-nspanel] +extends = env:tasmota32_base +platform = ${core32itead.platform} +platform_packages = ${core32itead.platform_packages} +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_NSPANEL [env:tasmota32c3-safeboot] extends = env:tasmota32_base diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index c61e03336..ff9ef4996 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -438,6 +438,72 @@ #endif // FIRMWARE_TASMOTA_LVGL ******************************************************************* +/*********************************************************************************************\ + * [tasmota32-zbbrdgpro] + * Provide an image for Sonoff Zigbee Bridge Pro +\*********************************************************************************************/ + +#ifdef FIRMWARE_ZBBRDGPRO + +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "zbbrdgpro" + +#undef MODULE +#define MODULE WEMOS // [Module] Select default module from tasmota_template.h +#undef FALLBACK_MODULE +#define FALLBACK_MODULE WEMOS // [Module2] Select default module on fast reboot where USER_MODULE is user template + +#undef USE_DOMOTICZ +#undef USE_HOME_ASSISTANT +#define USE_TASMOTA_DISCOVERY // Enable Tasmota Discovery support (+2k code) + +#define USE_WEBCLIENT_HTTPS + +#define USE_ZIGBEE +#define USE_TCP_BRIDGE + +#define USE_ENHANCED_GUI_WIFI_SCAN + +#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code) +#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer (+2k code) +#undef USE_SONOFF_IFAN // Disable support for Sonoff iFan02 and iFan03 (+2k code) +//#define USE_BUZZER // Add support for a buzzer (+0k6 code) +#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller (+0k8 code, 252 iram (non 2.3.0)) +//#define USE_DEEPSLEEP // Add support for deepsleep (+1k code) +#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer +#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code) +#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code) +#undef USE_SHELLY_DIMMER // Disable support for Shelly Dimmer (+3k code) + +#define USE_I2C // I2C using library wire (+10k code, 0k2 mem, 124 iram) +#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_ETHERNET // Add support for ethernet (+20k code) + +//#ifndef USE_KNX +//#define USE_KNX // Enable KNX IP Protocol Support (+23k code, +3k3 mem) +//#endif + +#endif // FIRMWARE_ZBBRDGPRO + +/*********************************************************************************************\ + * [tasmota32-nspanel] + * Provide an image for ths Sonoff NsPanel +\*********************************************************************************************/ + +#ifdef FIRMWARE_NSPANEL + +#undef CODE_IMAGE_STR +#define CODE_IMAGE_STR "nspanel" + +#undef MODULE +#define MODULE WEMOS // [Module] Select default module from tasmota_template.h +#undef FALLBACK_MODULE +#define FALLBACK_MODULE WEMOS // [Module2] Select default module on fast reboot where USER_MODULE is user template + +#define FIRMWARE_TASMOTA32 + +#endif // FIRMWARE_NSPANEL /*********************************************************************************************\ * [tasmota32.bin] From 9e254d851a850b2034b947ca71455fced8a22f41 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:15:25 +0200 Subject: [PATCH 327/376] Fix max blinkcount to 32000 --- tasmota/tasmota_support/support_command.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 3df6bd03a..524434559 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -999,7 +999,7 @@ void CmndBlinktime(void) void CmndBlinkcount(void) { - if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 65536)) { + if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload <= 32000)) { Settings->blinkcount = XdrvMailbox.payload; // 0 - 65535 if (TasmotaGlobal.blink_counter) { TasmotaGlobal.blink_counter = Settings->blinkcount *2; } } From 6ab509576aec565337fc8a4323bce0aef4b7796b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 3 Jun 2022 15:37:43 +0200 Subject: [PATCH 328/376] Refactor domoticz saving some code space --- .../tasmota_xdrv_driver/xdrv_07_domoticz.ino | 222 +++++++++--------- 1 file changed, 108 insertions(+), 114 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino index 83f1bfd79..7687ac644 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_07_domoticz.ino @@ -179,14 +179,25 @@ void DomoticzMqttSubscribe(void) { for (uint32_t i = 0; i < maxdev; i++) { if (Settings->domoticz_relay_idx[i]) { domoticz_subscribe = true; + char stopic[TOPSZ]; + snprintf_P(stopic, sizeof(stopic), PSTR(DOMOTICZ_OUT_TOPIC "/#")); // domoticz topic + MqttSubscribe(stopic); + return; } } +} - if (domoticz_subscribe) { - char stopic[TOPSZ]; - snprintf_P(stopic, sizeof(stopic), PSTR(DOMOTICZ_OUT_TOPIC "/#")); // domoticz topic - MqttSubscribe(stopic); +int32_t DomoticzIdx2Relay(uint32_t idx) { + if (0 == idx) { + return -1; // Idx not mine } + uint32_t maxdev = (TasmotaGlobal.devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : TasmotaGlobal.devices_present; + for (uint32_t i = 0; i < maxdev; i++) { + if (idx == Settings->domoticz_relay_idx[i]) { + return i; + } + } + return -1; // Idx not mine } bool DomoticzMqttData(void) { @@ -207,19 +218,13 @@ bool DomoticzMqttData(void) { return true; // No valid data } + int32_t relay_index = -1; + // Quick check if this is mine using topic domoticz/out/{$idx} if (strlen(XdrvMailbox.topic) > strlen(DOMOTICZ_OUT_TOPIC)) { char* topic_index = &XdrvMailbox.topic[strlen(DOMOTICZ_OUT_TOPIC) +1]; - uint32_t idx = atoi(topic_index); - uint8_t maxdev = (TasmotaGlobal.devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : TasmotaGlobal.devices_present; - bool not_found = true; - for (uint32_t i = 0; i < maxdev; i++) { - if (idx == Settings->domoticz_relay_idx[i]) { - not_found = false; - break; - } - } - if (not_found) { + relay_index = DomoticzIdx2Relay(atoi(topic_index)); + if (relay_index < 0) { return true; // Idx not mine } } @@ -230,112 +235,101 @@ bool DomoticzMqttData(void) { if (!domoticz) { return true; // To much or invalid data } -// if (strcmp_P(domoticz["dtype"],PSTR("Light/Switch"))) { -// return true; -// } - uint32_t idx = domoticz.getUInt(PSTR("idx"), 0); - int16_t nvalue = domoticz.getInt(PSTR("nvalue"), -1); - - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), idx, nvalue); - - bool found = false; - if ((idx > 0) && (nvalue >= 0) && (nvalue <= 15)) { - uint8_t maxdev = (TasmotaGlobal.devices_present > MAX_DOMOTICZ_IDX) ? MAX_DOMOTICZ_IDX : TasmotaGlobal.devices_present; - for (uint32_t i = 0; i < maxdev; i++) { - if (idx == Settings->domoticz_relay_idx[i]) { - bool iscolordimmer = strcmp_P(domoticz.getStr(PSTR("dtype")), PSTR("Color Switch")) == 0; - bool isShutter = strcmp_P(domoticz.getStr(PSTR("dtype")), PSTR("Light/Switch")) == 0 & strncmp_P(domoticz.getStr(PSTR("switchType")),PSTR("Blinds"), 6) == 0; - - char stemp1[10]; - snprintf_P(stemp1, sizeof(stemp1), PSTR("%d"), i +1); -#ifdef USE_SONOFF_IFAN - if (IsModuleIfan() && (1 == i)) { // Idx 2 is fanspeed - JsonParserToken svalue_tok = domoticz[PSTR("svalue1")]; - if (!svalue_tok) { - return true; - } - uint8_t svalue = svalue_tok.getUInt(); - svalue = (2 == nvalue) ? svalue / 10 : 0; - if (GetFanspeed() == svalue) { - return true; // Stop loop as already set - } - if (TimePassedSince(domoticz_fan_debounce) < 1000) { - return true; // Stop loop if device in limbo - } - snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED)); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), svalue); - found = true; - } else -#endif // USE_SONOFF_IFAN -#ifdef USE_SHUTTER - if (isShutter) { - uint8_t position = domoticz.getUInt(PSTR("svalue1"), 0); - if (nvalue != 2) { - position = (0 == nvalue) ? 0 : 100; - } - - snprintf_P(XdrvMailbox.topic, TOPSZ, PSTR("/" D_PRFX_SHUTTER D_CMND_SHUTTER_POSITION)); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), position); - XdrvMailbox.data_len = position > 99 ? 3 : (position > 9 ? 2 : 1); - - found = true; - } else -#endif // USE_SHUTTER -#ifdef USE_LIGHT - if (iscolordimmer && 10 == nvalue) { // Color_SetColor - // https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Set_a_light_to_a_certain_color_or_color_temperature - JsonParserObject color = domoticz[PSTR("Color")].getObject(); - // JsonObject& color = domoticz["Color"]; - uint16_t level = nvalue = domoticz.getUInt(PSTR("svalue1"), 0); - uint16_t r = color.getUInt(PSTR("r"), 0) * level / 100; - uint16_t g = color.getUInt(PSTR("g"), 0) * level / 100; - uint16_t b = color.getUInt(PSTR("b"), 0) * level / 100; - uint16_t cw = color.getUInt(PSTR("cw"), 0) * level / 100; - uint16_t ww = color.getUInt(PSTR("ww"), 0) * level / 100; - uint16_t m = color.getUInt(PSTR("m"), 0); - uint16_t t = color.getUInt(PSTR("t"), 0); - if (2 == m) { // White with color temperature. Valid fields: t - snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_BACKLOG)); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR(D_CMND_COLORTEMPERATURE " %d;" D_CMND_DIMMER " %d"), changeUIntScale(t, 0, 255, CT_MIN, CT_MAX), level); - } else { - snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR)); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww); - } - found = true; - } - else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel - (iscolordimmer && 15 == nvalue)) { // Color_SetBrightnessLevel - if (domoticz[PSTR("svalue1")]) { - nvalue = domoticz.getUInt(PSTR("svalue1"), 0); - } else { - return true; // Invalid data - } - if (TasmotaGlobal.light_type && (Settings->light_dimmer == nvalue) && ((TasmotaGlobal.power >> i) &1)) { - return true; // State already set - } - snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER)); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue); - found = true; - } else -#endif // USE_LIGHT - if (1 == nvalue || 0 == nvalue) { - if (((TasmotaGlobal.power >> i) &1) == (power_t)nvalue) { - return true; // Stop loop - } - snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_POWER "%s"), (TasmotaGlobal.devices_present > 1) ? stemp1 : ""); - snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue); - found = true; - } - break; - } + if (relay_index < 0) { + relay_index = DomoticzIdx2Relay(domoticz.getUInt(PSTR("idx"), 0)); + if (relay_index < 0) { + return true; // Idx not mine } } - if (!found) { return true; } // No command received + int32_t nvalue = domoticz.getInt(PSTR("nvalue"), -1); + if ((nvalue < 0) || (nvalue > 16)) { + return true; // Nvalue out of boundaries + } + + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ "idx %d, nvalue %d"), Settings->domoticz_relay_idx[relay_index], nvalue); + + bool iscolordimmer = (strcmp_P(domoticz.getStr(PSTR("dtype")), PSTR("Color Switch")) == 0); + bool isShutter = (strcmp_P(domoticz.getStr(PSTR("dtype")), PSTR("Light/Switch")) == 0) && (strncmp_P(domoticz.getStr(PSTR("switchType")),PSTR("Blinds"), 6) == 0); + +#ifdef USE_SONOFF_IFAN + if (IsModuleIfan() && (1 == relay_index)) { // Idx 2 is fanspeed + JsonParserToken svalue_tok = domoticz[PSTR("svalue1")]; + if (!svalue_tok) { + return true; + } + uint32_t svalue = svalue_tok.getUInt(); + svalue = (2 == nvalue) ? svalue / 10 : 0; + if (GetFanspeed() == svalue) { + return true; // Stop as already set + } + if (TimePassedSince(domoticz_fan_debounce) < 1000) { + return true; // Stop if device in limbo + } + snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_FANSPEED)); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), svalue); + } else +#endif // USE_SONOFF_IFAN +#ifdef USE_SHUTTER + if (isShutter) { + uint32_t position = domoticz.getUInt(PSTR("svalue1"), 0); + if (nvalue != 2) { + position = (0 == nvalue) ? 0 : 100; + } + snprintf_P(XdrvMailbox.topic, TOPSZ, PSTR("/" D_PRFX_SHUTTER D_CMND_SHUTTER_POSITION)); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), position); + XdrvMailbox.data_len = position > 99 ? 3 : (position > 9 ? 2 : 1); + } else +#endif // USE_SHUTTER +#ifdef USE_LIGHT + if (iscolordimmer && 10 == nvalue) { // Color_SetColor + // https://www.domoticz.com/wiki/Domoticz_API/JSON_URL%27s#Set_a_light_to_a_certain_color_or_color_temperature + JsonParserObject color = domoticz[PSTR("Color")].getObject(); + // JsonObject& color = domoticz["Color"]; + uint32_t level = nvalue = domoticz.getUInt(PSTR("svalue1"), 0); + uint32_t r = color.getUInt(PSTR("r"), 0) * level / 100; + uint32_t g = color.getUInt(PSTR("g"), 0) * level / 100; + uint32_t b = color.getUInt(PSTR("b"), 0) * level / 100; + uint32_t cw = color.getUInt(PSTR("cw"), 0) * level / 100; + uint32_t ww = color.getUInt(PSTR("ww"), 0) * level / 100; + uint32_t m = color.getUInt(PSTR("m"), 0); + uint32_t t = color.getUInt(PSTR("t"), 0); + if (2 == m) { // White with color temperature. Valid fields: t + snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_BACKLOG)); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR(D_CMND_COLORTEMPERATURE " %d;" D_CMND_DIMMER " %d"), changeUIntScale(t, 0, 255, CT_MIN, CT_MAX), level); + } else { + snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_COLOR)); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%02x%02x%02x%02x%02x"), r, g, b, cw, ww); + } + } + else if ((!iscolordimmer && 2 == nvalue) || // gswitch_sSetLevel + (iscolordimmer && 15 == nvalue)) { // Color_SetBrightnessLevel + if (domoticz[PSTR("svalue1")]) { + nvalue = domoticz.getUInt(PSTR("svalue1"), 0); + } else { + return true; // Invalid data + } + if (TasmotaGlobal.light_type && (Settings->light_dimmer == nvalue) && ((TasmotaGlobal.power >> relay_index) &1)) { + return true; // State already set + } + snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_DIMMER)); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue); + } else +#endif // USE_LIGHT + if (1 == nvalue || 0 == nvalue) { + if (((TasmotaGlobal.power >> relay_index) &1) == (power_t)nvalue) { + return true; // Stop loop + } + char stemp1[10]; + snprintf_P(XdrvMailbox.topic, XdrvMailbox.index, PSTR("/" D_CMND_POWER "%s"), (TasmotaGlobal.devices_present > 1) ? itoa(relay_index +1, stemp1, 10) : ""); + snprintf_P(XdrvMailbox.data, XdrvMailbox.data_len, PSTR("%d"), nvalue); + } else { + return true; // No command received + } AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_DOMOTICZ D_RECEIVED_TOPIC " %s, " D_DATA " %s"), XdrvMailbox.topic, XdrvMailbox.data); domoticz_update_flag = false; - return false; // Process new data + return false; // Process new data } /*********************************************************************************************/ From 7232f5865d4ed740e9c5a1a539909c9f34b37e35 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 3 Jun 2022 21:51:20 +0200 Subject: [PATCH 329/376] Berry int() now accepts hex strings --- lib/libesp32/berry/src/be_lexer.c | 16 ++------- lib/libesp32/berry/src/be_strlib.c | 53 ++++++++++++++++++++++-------- lib/libesp32/berry/src/be_strlib.h | 1 + lib/libesp32/berry/tests/int.be | 6 ++++ 4 files changed, 48 insertions(+), 28 deletions(-) diff --git a/lib/libesp32/berry/src/be_lexer.c b/lib/libesp32/berry/src/be_lexer.c index 1803300fe..cd5a0bc2f 100644 --- a/lib/libesp32/berry/src/be_lexer.c +++ b/lib/libesp32/berry/src/be_lexer.c @@ -168,21 +168,9 @@ static int check_next(blexer *lexer, int c) return 0; } -static int char2hex(int c) -{ - if (c >= '0' && c <= '9') { - return c - '0'; - } else if (c >= 'a' && c <= 'f') { - return c - 'a' + 0x0A; - } else if (c >= 'A' && c <= 'F') { - return c - 'A' + 0x0A; - } - return -1; -} - static int check2hex(blexer *lexer, int c) { - c = char2hex(c); + c = be_char2hex(c); if (c < 0) { be_lexerror(lexer, "invalid hexadecimal number"); } @@ -333,7 +321,7 @@ static bint scan_hexadecimal(blexer *lexer) { bint res = 0; int dig, num = 0; - while ((dig = char2hex(lgetc(lexer))) >= 0) { + while ((dig = be_char2hex(lgetc(lexer))) >= 0) { res = ((bint)res << 4) + dig; next(lexer); ++num; diff --git a/lib/libesp32/berry/src/be_strlib.c b/lib/libesp32/berry/src/be_strlib.c index 1196a5aad..44389f3a8 100644 --- a/lib/libesp32/berry/src/be_strlib.c +++ b/lib/libesp32/berry/src/be_strlib.c @@ -231,29 +231,54 @@ const char* be_pushvfstr(bvm *vm, const char *format, va_list arg) return concat2(vm); } +int be_char2hex(int c) +{ + if (c >= '0' && c <= '9') { + return c - '0'; + } else if (c >= 'a' && c <= 'f') { + return c - 'a' + 0x0A; + } else if (c >= 'A' && c <= 'F') { + return c - 'A' + 0x0A; + } + return -1; +} + /******************************************************************* * the function be_str2int(): - * >>-+------------+--+-----+----digits---->< - * '-whitespace-' +- + -+ - * '- - -' + * >>-+------------+--+--+-----+----digits-------+---------------->< + * '-whitespace-' | +- + -+ | + * | '- - -' | + * | | + * +- 0x or 0X ---hex_digits--+ + * *******************************************************************/ BERRY_API bint be_str2int(const char *str, const char **endstr) { int c, sign; bint sum = 0; skip_space(str); - sign = c = *str++; - if (c == '+' || c == '-') { - c = *str++; + if (str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) { + /* hex literal */ + str += 2; /* skip 0x or 0X */ + while ((c = be_char2hex(*str++)) >= 0) { + sum = sum * 16 + c; + } + return sum; + } else { + /* decimal literal */ + sign = c = *str++; + if (c == '+' || c == '-') { + c = *str++; + } + while (is_digit(c)) { + sum = sum * 10 + c - '0'; + c = *str++; + } + if (endstr) { + *endstr = str - 1; + } + return sign == '-' ? -sum : sum; } - while (is_digit(c)) { - sum = sum * 10 + c - '0'; - c = *str++; - } - if (endstr) { - *endstr = str - 1; - } - return sign == '-' ? -sum : sum; } /******************************************************************* diff --git a/lib/libesp32/berry/src/be_strlib.h b/lib/libesp32/berry/src/be_strlib.h index 992257648..703fce054 100644 --- a/lib/libesp32/berry/src/be_strlib.h +++ b/lib/libesp32/berry/src/be_strlib.h @@ -19,6 +19,7 @@ bstring* be_strcat(bvm *vm, bstring *s1, bstring *s2); int be_strcmp(bstring *s1, bstring *s2); bstring* be_num2str(bvm *vm, bvalue *v); void be_val2str(bvm *vm, int index); +int be_char2hex(int c); size_t be_strlcpy(char *dst, const char *src, size_t size); const char* be_splitpath(const char *path); const char* be_splitname(const char *path); diff --git a/lib/libesp32/berry/tests/int.be b/lib/libesp32/berry/tests/int.be index d5a7c79e9..21cfcf720 100644 --- a/lib/libesp32/berry/tests/int.be +++ b/lib/libesp32/berry/tests/int.be @@ -6,3 +6,9 @@ class Test_int end t=Test_int() assert(int(t) == 42) + +#- int can parse hex strings -# +assert(int("0x00") == 0) +assert(int("0X1") == 1) +assert(int("0x000000F") == 15) +assert(int("0x1000") == 0x1000) From 872ea1377a9db2a072b597b812818640fb115781 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Fri, 3 Jun 2022 22:08:48 +0200 Subject: [PATCH 330/376] Berry bytes().tohex() --- lib/libesp32/berry/generate/be_const_strtab.h | 1 + .../berry/generate/be_const_strtab_def.h | 2512 +++++++++-------- .../berry/generate/be_fixed_be_class_bytes.h | 57 +- lib/libesp32/berry/src/be_byteslib.c | 22 + 4 files changed, 1309 insertions(+), 1283 deletions(-) diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 61f3dbc90..7ef8af957 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -947,6 +947,7 @@ extern const bcstring be_const_str_timer_cb; extern const bcstring be_const_str_to_gamma; extern const bcstring be_const_str_tob64; extern const bcstring be_const_str_tobytes; +extern const bcstring be_const_str_tohex; extern const bcstring be_const_str_toint; extern const bcstring be_const_str_tolower; extern const bcstring be_const_str_tomap; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index e0afafdc0..7448f971b 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,836 +1,836 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_function); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_zb_device); be_define_const_str(_X0A, "\n", 252472541u, 0, 1, NULL); -be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_discover); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str__X2Ep); -be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_atan2); -be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_add_driver); -be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_set_tasmota_logo); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_elements_X20must_X20be_X20a_X20lv_point); -be_define_const_str(_X22, "\"", 655135397u, 0, 1, &be_const_str_ctypes_bytes_dyn); -be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str_pc_abs); -be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str__X2Flights_X2F); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str_constructor_cb); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str__available); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_get_factory_slot); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_Too_X20many_X20partiition_X20slots); -be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str__X25s_X2Eautoconf); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_MD5); -be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); -be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_stop_iteration); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_every_100ms); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_seg7_font); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_BRY_X3A_X20argument_X20must_X20be_X20a_X20function); -be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str__X2Ep2); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str__dirty); -be_define_const_str(_X29, ")", 739023492u, 0, 1, &be_const_str_back_forth); -be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_read); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_lv_point); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_pixel_size); -be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str__X2Ep1); -be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str_find_op); -be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, &be_const_str_wifi_arcs); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str__X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str__lvgl); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_collect); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_CFG_X3A_X20loaded_X20_X20); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_set_exten); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_add_cb_event_closure); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_Partition_otadata); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_arg_X20must_X20be_X20a_X20subclass_X20of_X20lv_obj); -be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_0x_X2502X); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_set); +be_define_const_str(_X0A_X29_X3E, "\n)>", 804061574u, 0, 3, &be_const_str_SERIAL_8O2); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_time_str); +be_define_const_str(_X20_X20, " ", 2982523533u, 0, 2, &be_const_str_onsubmit_X3D_X27return_X20confirm_X28_X22This_X20will_X20cause_X20a_X20restart_X2E_X22_X29_X3B_X27_X3E); +be_define_const_str(_X20_X28, " (", 2848302581u, 0, 2, &be_const_str_find_key_i); +be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, &be_const_str_exec_tele); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_add_anim); +be_define_const_str(_X22, "\"", 655135397u, 0, 1, NULL); +be_define_const_str(_X22_X3A, "\":", 399167565u, 0, 2, &be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_gamma8); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str__X25); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_load_templates); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_argument_X20must_X20be_X20a_X20list); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_find); +be_define_const_str(_X25, "%", 537692064u, 0, 1, &be_const_str__X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_web_sensor); +be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, &be_const_str___iterator__); +be_define_const_str(_X2508x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2D_X2504x_X2508x, "%08x-%04x-%04x-%04x-%04x%08x", 1670063141u, 0, 28, &be_const_str_base_class); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_ALIGN_BOTTOM_MID); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_get_warning_level); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_atan2); +be_define_const_str(_X27_X20_X2D_X20, "' - ", 3420378487u, 0, 4, &be_const_str_I2C_X3A); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_clock); +be_define_const_str(_X29, ")", 739023492u, 0, 1, NULL); +be_define_const_str(_X2A, "*", 789356349u, 0, 1, &be_const_str_while); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, NULL); +be_define_const_str(_X2C_X22AXP192_X22_X3A_X7B_X22VBusVoltage_X22_X3A_X25_X2E3f_X2C_X22VBusCurrent_X22_X3A_X25_X2E1f_X2C_X22BattVoltage_X22_X3A_X25_X2E3f_X2C_X22BattCurrent_X22_X3A_X25_X2E1f_X2C_X22Temperature_X22_X3A_X25_X2E1f_X7D, ",\"AXP192\":{\"VBusVoltage\":%.3f,\"VBusCurrent\":%.1f,\"BattVoltage\":%.3f,\"BattCurrent\":%.1f,\"Temperature\":%.1f}", 2598755376u, 0, 106, &be_const_str_lv_wifi_arcs); +be_define_const_str(_X2D, "-", 671913016u, 0, 1, &be_const_str__global_addr); +be_define_const_str(_X2D_X2A, "-*", 499980374u, 0, 2, NULL); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_listdir); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_obj); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, NULL); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_CFG_X3A_X20_X27init_X2Ebat_X27_X20done_X2C_X20restarting); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_set_dc_voltage); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_abort); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_enabled); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_lower); +be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, &be_const_str_autorun); +be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_STATE_DEFAULT); be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, NULL); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_cosh); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str__X2F); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, NULL); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, &be_const_str__ccmd); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, NULL); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_PART_MAIN); -be_define_const_str(_X2Flights_X2F, "/lights/", 2370247908u, 0, 8, &be_const_str_BECDFE); -be_define_const_str(_X2Fstate_X2F, "/state/", 4226179876u, 0, 7, &be_const_str_BRY_X3A_X20failed_X20to_X20load_X20compiled_X20_X27_X25s_X27_X20_X28_X25s_X29); -be_define_const_str(00, "00", 569209421u, 0, 2, &be_const_str_gc); -be_define_const_str(0x_X2502X, "0x%02X", 2626549866u, 0, 6, NULL); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, NULL); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_offseta); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_lv_wifi_arcs_icon); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_ptr); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_active_otadata); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_area); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_add_cmd); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_int64); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_bus); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_light_to_id); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_RES_OK); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_set_rate); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_lv_clock_icon); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_hue); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_SERIAL_8N2); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__write); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_cb_obj); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_pc); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_EVENT_DELETE); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_SERIAL_8E1); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_SERIAL_7E1); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_chars_in_string); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_False); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, NULL); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__rmt); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_INTERNAL_DAC); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str__get_bytes); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_wire2); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_BRY_X3A_X20Exception_X3E_X20_X27); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_Auto_X2Dconfiguration); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_SERIAL_6N1); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_COLOR_WHITE); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_load_freetype_font); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_content_response); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_json_fdump); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_POST); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_get_active); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_chars_in_string); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_False); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, NULL); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__rmt); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_INTERNAL_DAC); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str__get_bytes); -be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_wire2); -be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_BRY_X3A_X20Exception_X3E_X20_X27); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_Auto_X2Dconfiguration); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, NULL); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_SERIAL_6N1); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_COLOR_WHITE); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_load_freetype_font); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_content_response); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, NULL); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_json_fdump); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_POST); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_get_active); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_lv_extra); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_active_otadata); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_True); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str__archive); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_engine); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "", 2342198361u, 0, 61, &be_const_str_widget_event_impl); +be_define_const_str(_X3Cinstance_X3A_X20Partition_otadata_X28ota_active_X3A_X25s_X2C_X20ota_seq_X3D_X5B_X25d_X2C_X25d_X5D_X2C_X20ota_max_X3D_X25d_X29_X3E, "", 179503047u, 0, 73, &be_const_str_light_to_id); +be_define_const_str(_X3Clabel_X3EChoose_X20a_X20device_X20configuration_X3A_X3C_X2Flabel_X3E_X3Cbr_X3E, "
", 1336654704u, 0, 49, &be_const_str_global); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_path); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_lv); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str__timers); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_event); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_leds); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_cb_obj); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_pc); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3EAuto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 2058443583u, 0, 110, &be_const_str_c); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_map); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__X3E_X3D); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "
, {m} = , {e} =
, {m} = , {e} =

VnPUTnHPaXiwc+mUY5{hX$ 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%0DPiOHd1)DUOhn+xFLYNl%d`eepSD1H2d$ zAovvPJ1AjK!oizYP_>0&)a{b}@24))d~+6KM#!CqiR^^7kLuoH>!!N%0;I+XglmOb z8v?YkJ?GDI^|a|3)wJOJ+2?Ac`XI`2@Mr9XFbu3uoZ~1vzu_yQmI;e9NSC2cQ{Q$6 z4UB6fh%D@Z0mo$`I*Gh9m7U=6Vsre}o_UuTuh@@?J@aGa+4o{d>_kwjbO8(R1Cza< zfDD$+l57XFjN{|e&-2}hCb8=XvOo(yq5W_z8~m| zV~A%3-Nq08<2^QjlV8=lp5z{)EP}BiTo0lC4rv_il)K(~I+xhrprBej;tQnV0gMw? z6Tw4+1Nk%bt{e=#Wg75faO`R1M=9FLcQG;;gN6tY(w8n&k%qfX+(O%S?>`V5dxXH)DbRgVWogpTR$IQ6cd=o3G9`nKX$g@X_Zz6 z0sB9}4vZpMTow`>6CTT>bsARbR4w5q8&9E@a5aeYFL zUu=J`lKNf8V_7V}aXT*KRw1G&AkEs71FVN)7h&!K9Yoy@&DnMExdZ2|jyvZ$U6QK- zt#O%K%?*T{OC}l9fAU0l_Uyk4bb%T-1(^{jIS_SGk`d$2iV%J8TCY7ke)aHCkHCQb>+ z*Qt1;#=R+po!lfggkgUl$0D6NvRMDH=CQLT+M7s7As|^c=3F@5EGD#Zg4vNB5fjz> zFI=_!A%Qys3Xy+J!?w3=_5iv6<4HSnASvr14oVO)TWP!C6{+qT*LBYBE%(@0*JWs* z9MEXb4i}3uHR`kRH~qN-@aIM{f!8v`C@bGB$E)7Pmt*m6Z8DkP2*VwiyFszJ_KJJccRGuKR^>rk&(S zgMhwnq6|`$Vw-Dlf^y8_^9Bk{GQr?ssz9vv=L~4>pZQ%QXPqMxSOOmKRnaH?_zhu> zw$c!i>7rpD9*PKY&kdO9-0@)OwgicZR$Wj)t4;zT9li%OunOdIaSv@Z1 zwS8r4-9a*Dd}Y1iQJU*IP&NLNJ+-_hsPbU>?k(+=Q_Iyrg9Rq?K9f06a93BC*|!ZcM2&tz-_q>T4XPN zFQ9Me6ZTKeGY)bzbLQN}J#TU=qz*)|D+jBzgwAOD;STQ8OLl^h0R_=P`3+ecgFVXs z{T+Z~{7u+ONGq>Qb9&k!v549rywjj|{N)vlxz3TiUst8iQzsv1Xk(tnyfAF(mePd; zmB(NF&2t%s$JL-C?nYbA;?7bCI_V{ZixFN!_y)oOgnvQEBm5kpe1G=iHxY&+{1IUc z!hVE_2yY>L2;n`1k0QK}Fc;wvu_bTjqu+H=OX+C;XH)W z1KE#T5QZTvK==T{g$R=nK7;UKgwG<(LiilQ9E5*FI2+-g5EdXTLO=e5a53JOAS^^k z=*2FcO`ueIoFh=M07slj_4VChl(|L`*n88@7@=Lb9ge<xy+=1rg+Q^`zn9-4VP{cZjR&BXW6ZM5O9e6x7wu+{kUyk%{k zX73ruf6;aQ%&5Upn!oU=PcZA4*m@VA9Ck$zRk5ArElLyU^-TN?cwTH%&J1H7Zx){= z8x@!ts)hG+qeYr>9@0Ah&5Tcm4EPQDB3=Jq!*;t*@s^ZngUTDq^mY8~c;*FWN~5U$ z6*#db*-!A6g+?KA4WAl z`9ajjJYT;QQOTrLwoiG>cTz?-yeUGRR-RdoIyWKmkAXz@dWg#QToGf}8`HjkX^m`_l#X}CX!(Vuh@shPp|c@HA?JYsV& z3+Ryc5N|p6F!LZ{4H)N(qnYc7d^8Yg`zPk-At7>VAo3SPW&|RAZM-Eb^~!sWL8ayo zJYXOsF1UUo;;sqZIe_s`Ap@mJ=b5LN__$bPoe;?C{|N2X36ZIMoG`IupzC$R-T9EW zY)KLZIY}7gxGBiX4tHlCZ#kYQL}~(&WMbooXW)I_au43VmD%MV7Bp=W#P;O<{z5t zLztQCuz2rT{NvQJ`fmd@`|6QDRDdY|5P_(;U(h&x{pCQk|L@2@ig^GlBmN7gqE5%1kvL7R)@DW3?bGmbo%{rds{!QhpE$ql*nhVptiaET z-(&c_@UDQbsS8)9mf{>;0_7YaNq>xF=t4`S$5>vd_2g@Y3Z!$)o-0z#zBg!DHl_K2 zS3l%|_$^K8jt1_qs@q|jFHUFBx}zPqNOmV^em+ewT8TbkIu>)M{I`UQM{9bJQ1jzy z)6wB1Gdf@f=>xTwl^`wdxiTe5ZYBq>YBiGvqfk;!`)L!c`8rUjF>&T_S_y>zJ2e!1 zGr)*=YD+zM_1YH$XMIOhSev-vsH2PEWEn@P8x-~Rc{-wdKxb9kQhlf zuR&7PTq&yCPMX*?(uXJeqQbh4HW*3Uz5?T~U#ccIyLuWV@ZM(LUwlXN?Ws!Kv5B~2 zbZ-;yxu-7t2L8|jEwbGqx&ndwI+?>eV%!OQKZzZ?PZO@g8L?Y&A9gpP5d{BQJJ~S| z3*@gjd9+(`YYO`|OUMx>K`z#V%b*D2vQ-mK!<&mcD5|ofxQB-F@XrD2?It ztU%_)BboDtn{k{CqyNv``2yJ{g5ttxJJ(K>=yaKw=} zNS`NEXUK?r=4yRHD&Pb2Ohito_}g1K!kz$xmUA9;W2gG_^t=Bz~8O=vjT2NF+{yRT4|l*lIB8C*?=-wY#ZJ3929M=qGOiP35 zt~|F+ye~O%cBb1TnSIS|lBUA@s*JchkTYl9CIxZE8bpc=s?8WK7Jb!RJLM!yUA^KK zC?AveYqUqiSY3{nPGJRL(At!7P1yYG9o5?R`CP1I3gl$6l(2$)hr~PepCUC@B-t|^ zr%yQ*ZpGjBL4$LF+w`~pSNlID@zGCoFJ&^_1%iGHfui`EI_!`4z!PgH>ⅈ|NWGA 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 {H$x`i1>4C|xc9;gM>?Mem8sjiOc_#NG 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 A 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 U+*5G%bg94b#o*4KXK(fY353MkEdT%j diff --git a/safemode/tasmota32c3-minicustom.bin b/safemode/tasmota32c3-minicustom.bin deleted file mode 100644 index fc5631e42067a2a8391185adaf53c450de8598de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698176 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