From 0d9678eef6f5b645c8507b11d2026ca0909094c3 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 16 Aug 2021 11:11:46 +0200 Subject: [PATCH 01/19] Refactor trim --- tasmota/support.ino | 10 +++++----- tasmota/xdrv_59_influxdb.ino | 13 ++++++------- tasmota/xsns_53_sml.ino | 2 +- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 2e17c7915..097bb1de8 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -316,7 +316,7 @@ float CharToFloat(const char *str) char *pt = strbuf; if (*pt == '\0') { return 0.0; } - while ((*pt != '\0') && isblank(*pt)) { pt++; } // Trim leading spaces + while ((*pt != '\0') && isspace(*pt)) { pt++; } // Trim leading spaces signed char sign = 1; if (*pt == '-') { sign = -1; } @@ -529,12 +529,12 @@ bool IsNumeric(const char* value) { return (*digit == '\0'); } -char* Trim(char* p) -{ +char* Trim(char* p) { + // Remove leading and trailing tab, \n, \v, \f, \r and space if (*p != '\0') { - while ((*p != '\0') && isblank(*p)) { p++; } // Trim leading spaces + while ((*p != '\0') && isspace(*p)) { p++; } // Trim leading spaces char* q = p + strlen(p) -1; - while ((q >= p) && isblank(*q)) { q--; } // Trim trailing spaces + while ((q >= p) && isspace(*q)) { q--; } // Trim trailing spaces q++; *q = '\0'; } diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 9bc7f5510..a591321c8 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -84,7 +84,7 @@ struct { String _serverUrl; // Connection info String _writeUrl; // Cached full write url String _lastErrorResponse; // Server reponse or library error message for last failed request - uint32_t _lastRequestTime = 0; // Last time in ms we made are a request to server + uint32_t _lastRequestTime = 0; // Last time in ms we made a request to server int interval = 0; int _lastStatusCode = 0; // HTTP status code of last request to server int _lastRetryAfter = 0; // Store retry timeout suggested by server after last request @@ -161,7 +161,7 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { IFDB._lastRequestTime = millis(); // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: HTTP status code %d"), IFDB._lastStatusCode); IFDB._lastRetryAfter = 0; - if (IFDB._lastStatusCode >= 429) { //retryable server errors + if (IFDB._lastStatusCode >= 429) { // Retryable server errors if (IFDBhttpClient->hasHeader(RetryAfter)) { IFDB._lastRetryAfter = IFDBhttpClient->header(RetryAfter).toInt(); AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: Reply after %d"), IFDB._lastRetryAfter); @@ -171,12 +171,12 @@ void InfluxDbAfterRequest(int expectedStatusCode, bool modifyLastConnStatus) { IFDB._lastErrorResponse = ""; if (IFDB._lastStatusCode != expectedStatusCode) { if (IFDB._lastStatusCode > 0) { - IFDB._lastErrorResponse = IFDBhttpClient->getString(); - AddLog(LOG_LEVEL_INFO, PSTR("IFX: %s"), IFDB._lastErrorResponse.c_str()); // {"error":"database not found: \"db\""} + IFDB._lastErrorResponse = IFDBhttpClient->getString(); // {"error":"database not found: \"db\""}\n } else { IFDB._lastErrorResponse = IFDBhttpClient->errorToString(IFDB._lastStatusCode); - AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); } + IFDB._lastErrorResponse.trim(); // Remove trailing \n + AddLog(LOG_LEVEL_INFO, PSTR("IFX: Error %s"), IFDB._lastErrorResponse.c_str()); } } @@ -191,8 +191,6 @@ bool InfluxDbValidateConnection(void) { if (1 == Settings->influxdb_version) { url += InfluxDbAuth(); } - // on version 1.8.9 /health works fine -// String url = IFDB._serverUrl + "/health"; AddLog(LOG_LEVEL_INFO, PSTR("IFX: Validating connection to %s"), url.c_str()); if (!IFDBhttpClient->begin(*IFDBwifiClient, url)) { @@ -221,6 +219,7 @@ int InfluxDbPostData(const char *data) { return false; } + Trim((char*)data); // Remove trailing \n AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("IFX: Sending\n%s"), data); IFDBhttpClient->addHeader(F("Content-Type"), F("text/plain")); InfluxDbBeforeRequest(); diff --git a/tasmota/xsns_53_sml.ino b/tasmota/xsns_53_sml.ino index 184261771..5c3644d1f 100755 --- a/tasmota/xsns_53_sml.ino +++ b/tasmota/xsns_53_sml.ino @@ -1198,7 +1198,7 @@ double CharToDouble(const char *str) strlcpy(strbuf, str, sizeof(strbuf)); char *pt = strbuf; - while ((*pt != '\0') && isblank(*pt)) { pt++; } // Trim leading spaces + while ((*pt != '\0') && isspace(*pt)) { pt++; } // Trim leading spaces signed char sign = 1; if (*pt == '-') { sign = -1; } From 1ab2b2c8659f9e6f1086830a7fccf42a85c98052 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 16 Aug 2021 11:44:27 +0200 Subject: [PATCH 02/19] Fix influxdb id regression --- tasmota/support.ino | 1 + tasmota/xdrv_59_influxdb.ino | 46 +++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/tasmota/support.ino b/tasmota/support.ino index 097bb1de8..22ff91854 100644 --- a/tasmota/support.ino +++ b/tasmota/support.ino @@ -524,6 +524,7 @@ bool StrCaseStr_P(const char* source, const char* search) { } bool IsNumeric(const char* value) { + // Test for characters '-.0123456789' char *digit = (char*)value; while (isdigit(*digit) || *digit == '.' || *digit == '-') { digit++; } return (*digit == '\0'); diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index a591321c8..32ea3e076 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -293,36 +293,38 @@ void InfluxDbProcessJson(void) { } else { // Level 2 // { ... "ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":24.88},"HTU21":{"Temperature":25.32,"Humidity":49.2,"DewPoint":13.88},"Global":{"Temperature":24.88,"Humidity":49.2,"DewPoint":13.47}, ... } - bool isarray = value2.isArray(); - const char* value = InfluxDbNumber(number, (isarray) ? (value2.getArray())[0].getStr() : value2.getStr()); + LowerCase(type, key2.getStr()); + bool is_id = (!strcmp_P(type, PSTR("id"))); // Index for DS18B20 + bool is_array = value2.isArray(); + const char* value = nullptr; + if (is_id && !is_array) { + snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value2.getStr()); + } else { + value = InfluxDbNumber(number, (is_array) ? (value2.getArray())[0].getStr() : value2.getStr()); + } if (value != nullptr) { LowerCase(sensor, key1.getStr()); - LowerCase(type, key2.getStr()); // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); - if (strcmp(type, "id") == 0) { // Index for DS18B20 - snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value); - } else { - if (isarray) { - JsonParserArray arr = value2.getArray(); - uint32_t i = 0; - for (auto val : arr) { - i++; - // power1,device=shelly25,sensor=energy value=0.00 - // power2,device=shelly25,sensor=energy value=4.12 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), - type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); - data += linebuf; - } - } else { - // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63 - snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), - type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); + if (is_array) { + JsonParserArray arr = value2.getArray(); + uint32_t i = 0; + for (auto val : arr) { + i++; + // power1,device=shelly25,sensor=energy value=0.00 + // power2,device=shelly25,sensor=energy value=4.12 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s%d,device=%s,sensor=%s%s value=%s\n"), + type, i, TasmotaGlobal.mqtt_topic, sensor, sensor_id, val.getStr()); data += linebuf; } - sensor_id[0] = '\0'; + } else { + // temperature,device=demo,sensor=ds18b20,id=01144A0CB2AA value=22.63 + snprintf_P(linebuf, sizeof(linebuf), PSTR("%s,device=%s,sensor=%s%s value=%s\n"), + type, TasmotaGlobal.mqtt_topic, sensor, sensor_id, value); + data += linebuf; } + sensor_id[0] = '\0'; } } } From 660698dc1003d1eaec4716b6b673aeff044a59db Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 16 Aug 2021 12:11:28 +0200 Subject: [PATCH 03/19] Fix Berry compiler bug #117 --- lib/libesp32/Berry/default/be_tasmotalib.c | 400 ++++++------------ .../Berry/default/embedded/Tasmota.be | 41 ++ lib/libesp32/Berry/src/be_code.c | 77 +++- lib/libesp32/Berry/src/be_code.h | 2 +- lib/libesp32/Berry/src/be_parser.c | 20 +- 5 files changed, 243 insertions(+), 297 deletions(-) diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index f14657f33..ec1aa8739 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -973,115 +973,61 @@ be_local_closure(set_timer, /* name */ ); /*******************************************************************/ - -/******************************************************************** - // run every 50ms tick - "def run_deferred() " - "if self._timers " - "var i=0 " - "while inot, NOT_EXPR) #define notmask(e) isset((e)->not, NOT_MASK) -#define exp2anyreg(f, e) exp2reg(f, e, (f)->freereg) -#define var2anyreg(f, e) var2reg(f, e, (f)->freereg) +#define exp2anyreg(f, e) exp2reg(f, e, -1) /* -1 means allocate a new register if needed */ +#define var2anyreg(f, e) var2reg(f, e, -1) /* -1 means allocate a new register if needed */ #define hasjump(e) ((e)->t != (e)->f || notexpr(e)) #define code_bool(f, r, b, j) codeABC(f, OP_LDBOOL, r, b, j) #define code_call(f, a, b) codeABC(f, OP_CALL, a, b, 0) @@ -321,9 +321,38 @@ static void free_suffix(bfuncinfo *finfo, bexpdesc *e) } } +static int suffix_destreg(bfuncinfo *finfo, bexpdesc *e1, int dst) +{ + int cand_dst = dst; /* candidate for new dst */ + int nlocal = be_list_count(finfo->local); + int reg1 = (e1->v.ss.tt == ETREG) ? e1->v.ss.obj : -1; /* check if obj is ETREG or -1 */ + int reg2 = (!isK(e1->v.ss.idx) && e1->v.ss.idx >= nlocal) ? e1->v.ss.idx : -1; /* check if idx is ETREG or -1 */ + + if (reg1 >= 0 && reg2 >= 0) { + /* both are ETREG, we keep the lowest and discard the other */ + if (reg1 != reg2) { + cand_dst = min(reg1, reg2); + be_code_freeregs(finfo, 1); /* and free the other one */ + } else { + cand_dst = reg1; /* both ETREG are equal, we return its value */ + } + } else if (reg1 >= 0) { + cand_dst = reg1; + } else if (reg2 >= 0) { + cand_dst = reg2; + } else { + // dst unchanged + } + + if (dst >= finfo->freereg) { + dst = cand_dst; /* if dst was allocating a new register, use the more precise candidate */ + } + return dst; +} + static int code_suffix(bfuncinfo *finfo, bopcode op, bexpdesc *e, int dst) { - free_suffix(finfo, e); /* free temporary registers */ + dst = suffix_destreg(finfo, e, dst); if (dst > finfo->freereg) { dst = finfo->freereg; } @@ -351,6 +380,9 @@ static bbool constint(bfuncinfo *finfo, bint i) static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) { + if (dst < 0) { /* if unspecified, allocate a new register if needed */ + dst = finfo->freereg; + } be_assert(e != NULL); switch (e->type) { case ETINT: @@ -376,7 +408,7 @@ static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) codeABx(finfo, OP_GETGBL, dst, e->v.idx); break; case ETNGLOBAL: - codeABC(finfo, OP_GETNGBL, dst, e->v.ss.idx, 0); + codeABC(finfo, OP_GETNGBL, dst, e->v.ss.obj, e->v.ss.idx); break; case ETUPVAL: codeABx(finfo, OP_GETUPV, dst, e->v.idx); @@ -420,28 +452,37 @@ static int exp2reg(bfuncinfo *finfo, bexpdesc *e, int dst) return reg; } -static int codedestreg(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) +static int codedestreg(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, int dst) { - int dst, con1 = e1->type == ETREG, con2 = e2->type == ETREG; + int cand_dst = dst; + int con1 = e1->type == ETREG, con2 = e2->type == ETREG; if (con1 && con2) { - dst = min(e1->v.idx, e2->v.idx); + cand_dst = min(e1->v.idx, e2->v.idx); be_code_freeregs(finfo, 1); } else if (con1) { - dst = e1->v.idx; + cand_dst = e1->v.idx; } else if (con2) { - dst = e2->v.idx; + cand_dst = e2->v.idx; } else { - dst = be_code_allocregs(finfo, 1); + if (dst >= finfo->freereg) { + cand_dst = be_code_allocregs(finfo, 1); + return cand_dst; + } + } + if (dst >= finfo->freereg) { + return cand_dst; + } else { + return dst; } - return dst; } -static void binaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e1, bexpdesc *e2) +static void binaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e1, bexpdesc *e2, int dst) { - int src1 = exp2anyreg(finfo, e1); + if (dst < 0) { dst = finfo->freereg; } + int src1 = exp2reg(finfo, e1, dst); /* potentially force the target for src1 reg */ int src2 = exp2anyreg(finfo, e2); - int dst = codedestreg(finfo, e1, e2); + dst = codedestreg(finfo, e1, e2, dst); codeABC(finfo, op, dst, src1, src2); e1->type = ETREG; e1->v.idx = dst; @@ -462,7 +503,7 @@ void be_code_prebinop(bfuncinfo *finfo, int op, bexpdesc *e) } } -void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2) +void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2, int dst) { switch (op) { case OptAnd: @@ -480,7 +521,7 @@ void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2) case OptNE: case OptGT: case OptGE: case OptConnect: case OptBitAnd: case OptBitOr: case OptBitXor: case OptShiftL: case OptShiftR: - binaryexp(finfo, (bopcode)(op - OptAdd), e1, e2); + binaryexp(finfo, (bopcode)(op - OptAdd), e1, e2, dst); break; default: break; } @@ -560,7 +601,7 @@ static void setbgblvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) code_move(finfo, finfo->freereg, src); src = finfo->freereg; } - codeABC(finfo, op, src, e1->v.idx, 0); + codeABC(finfo, op, src, 0, e1->v.idx); } static void setsupvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) @@ -586,7 +627,7 @@ static void setsfxvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) { int src = exp2reg(finfo, e2, - e1->type == ETLOCAL ? e1->v.idx : finfo->freereg); + e1->type == ETLOCAL ? e1->v.idx : -1); if (e1->type != ETLOCAL || e1->v.idx != src) { free_expreg(finfo, e2); /* free source (only ETREG) */ diff --git a/lib/libesp32/Berry/src/be_code.h b/lib/libesp32/Berry/src/be_code.h index f7fdb2d55..54d0c317c 100644 --- a/lib/libesp32/Berry/src/be_code.h +++ b/lib/libesp32/Berry/src/be_code.h @@ -14,7 +14,7 @@ int be_code_allocregs(bfuncinfo *finfo, int count); void be_code_prebinop(bfuncinfo *finfo, int op, bexpdesc *e); -void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2); +void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2, int dst); int be_code_unop(bfuncinfo *finfo, int op, bexpdesc *e); int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2); int be_code_nextreg(bfuncinfo *finfo, bexpdesc *e); diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index c19f83e9a..3090ca465 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -467,7 +467,6 @@ static int singlevaraux(bvm *vm, bfuncinfo *finfo, bstring *s, bexpdesc *var) static void singlevar(bparser *parser, bexpdesc *var) { - bexpdesc key; bstring *varname = next_token(parser).u.s; int type = singlevaraux(parser->vm, parser->finfo, varname, var); switch (type) { @@ -480,10 +479,13 @@ static void singlevar(bparser *parser, bexpdesc *var) var->v.idx = be_global_find(parser->vm, varname); break; case ETNGLOBAL: - init_exp(&key, ETSTRING, 0); - key.v.s = varname; - init_exp(var, ETNGLOBAL, 0); - var->v.idx = be_code_nglobal(parser->finfo, &key); + { + bexpdesc key; + init_exp(&key, ETSTRING, 0); + key.v.s = varname; + init_exp(var, ETNGLOBAL, 0); + var->v.idx = be_code_nglobal(parser->finfo, &key); + } break; default: break; @@ -610,7 +612,7 @@ static void list_nextmember(bparser *parser, bexpdesc *l) bfuncinfo *finfo = parser->finfo; expr(parser, &e); /* value */ check_var(parser, &e); - be_code_binop(finfo, OptConnect, &v, &e); + be_code_binop(finfo, OptConnect, &v, &e, -1); be_code_freeregs(finfo, 1); } @@ -823,9 +825,11 @@ static void suffix_alloc_reg(bparser *parser, bexpdesc *l) /* compound assignment */ static void compound_assign(bparser *parser, int op, bexpdesc *l, bexpdesc *r) { + int dst = -1; /* destination register in case of compound assignment */ if (op != OptAssign) { /* check left variable */ check_var(parser, l); /* cache the register of the object when continuously assigning */ + dst = parser->finfo->freereg; suffix_alloc_reg(parser, l); } expr(parser, r); /* right expression */ @@ -834,7 +838,7 @@ static void compound_assign(bparser *parser, int op, bexpdesc *l, bexpdesc *r) bexpdesc e = *l; op = op < OptAndAssign ? op - OptAddAssign + OptAdd : op - OptAndAssign + OptBitAnd; - be_code_binop(parser->finfo, op, &e, r); /* coding operation */ + be_code_binop(parser->finfo, op, &e, r, dst); /* coding operation */ *r = e; } } @@ -938,7 +942,7 @@ static void sub_expr(bparser *parser, bexpdesc *e, int prio) init_exp(&e2, ETVOID, 0); sub_expr(parser, &e2, binary_op_prio(op)); check_var(parser, &e2); - be_code_binop(finfo, op, e, &e2); /* encode binary op */ + be_code_binop(finfo, op, e, &e2, -1); /* encode binary op */ op = get_binop(parser); } if (prio == ASSIGN_OP_PRIO) { From b870ca1aa39556b8a452427e781f8c5b68e31060 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 16 Aug 2021 12:22:02 +0200 Subject: [PATCH 04/19] Fix --- lib/libesp32/Berry/src/be_code.c | 4 ++-- lib/libesp32/Berry/src/be_parser.c | 12 +++++------- lib/libesp32/Berry/src/berry.h | 11 +++++++++++ 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lib/libesp32/Berry/src/be_code.c b/lib/libesp32/Berry/src/be_code.c index f6eb792ab..56bd9f530 100644 --- a/lib/libesp32/Berry/src/be_code.c +++ b/lib/libesp32/Berry/src/be_code.c @@ -408,7 +408,7 @@ static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) codeABx(finfo, OP_GETGBL, dst, e->v.idx); break; case ETNGLOBAL: - codeABC(finfo, OP_GETNGBL, dst, e->v.ss.obj, e->v.ss.idx); + codeABC(finfo, OP_GETNGBL, dst, e->v.ss.idx, 0); break; case ETUPVAL: codeABx(finfo, OP_GETUPV, dst, e->v.idx); @@ -601,7 +601,7 @@ static void setbgblvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) code_move(finfo, finfo->freereg, src); src = finfo->freereg; } - codeABC(finfo, op, src, 0, e1->v.idx); + codeABC(finfo, op, src, e1->v.idx, 0); } static void setsupvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 3090ca465..4a32c189d 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -467,6 +467,7 @@ static int singlevaraux(bvm *vm, bfuncinfo *finfo, bstring *s, bexpdesc *var) static void singlevar(bparser *parser, bexpdesc *var) { + bexpdesc key; bstring *varname = next_token(parser).u.s; int type = singlevaraux(parser->vm, parser->finfo, varname, var); switch (type) { @@ -479,13 +480,10 @@ static void singlevar(bparser *parser, bexpdesc *var) var->v.idx = be_global_find(parser->vm, varname); break; case ETNGLOBAL: - { - bexpdesc key; - init_exp(&key, ETSTRING, 0); - key.v.s = varname; - init_exp(var, ETNGLOBAL, 0); - var->v.idx = be_code_nglobal(parser->finfo, &key); - } + init_exp(&key, ETSTRING, 0); + key.v.s = varname; + init_exp(var, ETNGLOBAL, 0); + var->v.idx = be_code_nglobal(parser->finfo, &key); break; default: break; diff --git a/lib/libesp32/Berry/src/berry.h b/lib/libesp32/Berry/src/berry.h index 52a557fd8..1637dc434 100644 --- a/lib/libesp32/Berry/src/berry.h +++ b/lib/libesp32/Berry/src/berry.h @@ -352,6 +352,17 @@ typedef struct bntvmodule { PROTO_VAR_INFO_BLOCK \ } +#define be_define_local_closure(_name) \ + const bclosure _name##_closure = { \ + NULL, /* bgcobject *next */ \ + BE_CLOSURE, /* type BE_CLOSURE */ \ + GC_CONST, /* marked GC_CONST */ \ + 0, /* nupvals */ \ + NULL, /* bgcobject *gray */ \ + (bproto*) &_name##_proto, /* proto */ \ + { NULL } /* upvals */ \ + } + /* new version for more compact literals */ #define be_local_closure(_name, _proto) \ static const bclosure _name##_closure = { \ From 7dd7cf71a0ce3a27824bdcb0af9bf6823e05b26a Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Mon, 16 Aug 2021 20:37:38 +1000 Subject: [PATCH 05/19] Refactor Python PIO tools --- pio-tools/gzip-firmware.py | 58 ++++++++++++++++++++++---------------- pio-tools/name-firmware.py | 57 ++++++++++--------------------------- pio-tools/tasmotapiolib.py | 49 ++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 67 deletions(-) create mode 100644 pio-tools/tasmotapiolib.py diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index fac23cf2d..63394789e 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -1,33 +1,32 @@ -Import('env') +Import("env") import os import shutil import gzip +import pathlib -platform = env.PioPlatform() -board = env.BoardConfig() -mcu = board.get("build.mcu", "esp32") +import tasmotapiolib -OUTPUT_DIR = "build_output{}".format(os.path.sep) def map_gzip(source, target, env): - variant = str(target[0]).split(os.path.sep)[2] - # create string with location and file names based on variant - bin_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) + map_file = tasmotapiolib.get_final_map_path(env) - if os.path.isfile(bin_file): - gzip_file = "{}map{}{}.map.gz".format(OUTPUT_DIR, os.path.sep, variant) + if map_file.is_file(): + gzip_file = map_file.with_suffix(".map.gz") # check if new target map files exist and remove if necessary - if os.path.isfile(gzip_file): os.remove(gzip_file) + if gzip_file.is_file(): + gzip_file.unlink() # write gzip map file - with open(bin_file,"rb") as fp: - with gzip.open(gzip_file, "wb", compresslevel = 9) as f: + with map_file.open("rb") as fp: + with gzip.open(gzip_file, "wb", compresslevel=9) as f: shutil.copyfileobj(fp, f) # remove map file - if os.path.isfile(bin_file): os.remove(bin_file) + if map_file.is_file(): + map_file.unlink() + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) @@ -35,26 +34,35 @@ env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) if env["PIOPLATFORM"] != "espressif32": def bin_gzip(source, target, env): - variant = str(target[0]).split(os.path.sep)[2] - # create string with location and file names based on variant - bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) - gzip_file = "{}firmware{}{}.bin.gz".format(OUTPUT_DIR, os.path.sep, variant) + bin_file = tasmotapiolib.get_final_bin_path(env) + gzip_file = bin_file.with_suffix(".bin.gz") # check if new target files exist and remove if necessary - if os.path.isfile(gzip_file): os.remove(gzip_file) + if os.path.isfile(gzip_file): + os.remove(gzip_file) # write gzip firmware file - with open(bin_file,"rb") as fp: - with gzip.open(gzip_file, "wb", compresslevel = 9) as f: + with open(bin_file, "rb") as fp: + with gzip.open(gzip_file, "wb", compresslevel=9) as f: shutil.copyfileobj(fp, f) - ORG_FIRMWARE_SIZE = os.stat(bin_file).st_size - GZ_FIRMWARE_SIZE = os.stat(gzip_file).st_size + ORG_FIRMWARE_SIZE = bin_file.stat().st_size + GZ_FIRMWARE_SIZE = gzip_file.stat().st_size if ORG_FIRMWARE_SIZE > 995326: - print("\u001b[31;1m!!! Tasmota firmware size is too big with {} bytes. Max size is 995326 bytes !!! \u001b[0m".format(ORG_FIRMWARE_SIZE)) + print( + "\u001b[31;1m!!! Tasmota firmware size is too big with {} bytes. Max size is 995326 bytes !!! \u001b[0m".format( + ORG_FIRMWARE_SIZE + ) + ) else: - print("Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format((GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, ORG_FIRMWARE_SIZE, GZ_FIRMWARE_SIZE)) + print( + "Compression reduced firmware size by {:.0f}% (was {} bytes, now {} bytes)".format( + (GZ_FIRMWARE_SIZE / ORG_FIRMWARE_SIZE) * 100, + ORG_FIRMWARE_SIZE, + GZ_FIRMWARE_SIZE, + ) + ) env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) diff --git a/pio-tools/name-firmware.py b/pio-tools/name-firmware.py index ce6ee0339..b49def236 100644 --- a/pio-tools/name-firmware.py +++ b/pio-tools/name-firmware.py @@ -1,54 +1,27 @@ -Import('env') -Import('projenv') +Import("env") +Import("projenv") import os import shutil +import pathlib + +import tasmotapiolib -OUTPUT_DIR = "build_output{}".format(os.path.sep) def bin_map_copy(source, target, env): - variant = str(target[0]).split(os.path.sep)[2] + firsttarget = pathlib.Path(target[0].path) - # check if output directories exist and create if necessary - if not os.path.isdir(OUTPUT_DIR): - os.mkdir(OUTPUT_DIR) - - for d in ['firmware', 'map']: - if not os.path.isdir("{}{}".format(OUTPUT_DIR, d)): - os.mkdir("{}{}".format(OUTPUT_DIR, d)) - - # create string with location and file names based on variant - map_file = "{}map{}{}.map".format(OUTPUT_DIR, os.path.sep, variant) - bin_file = "{}firmware{}{}.bin".format(OUTPUT_DIR, os.path.sep, variant) + # get locations and file names based on variant + map_file = tasmotapiolib.get_final_map_path(env) + bin_file = tasmotapiolib.get_final_bin_path(env) # check if new target files exist and remove if necessary for f in [map_file, bin_file]: - if os.path.isfile(f): - os.remove(f) + if f.is_file(): + f.unlink() - # copy firmware.bin to firmware/.bin - shutil.copy(str(target[0]), bin_file) + # copy firmware.bin and map to final destination + shutil.copy(firsttarget, bin_file) + shutil.move(tasmotapiolib.get_source_map_path(env), map_file) - # move firmware.map to map/.map - if os.path.isfile("firmware.map"): - shutil.move("firmware.map", map_file) - #map_new_loc = str(target[0]).split(os.path.sep)[0] + os.path.sep + str(target[0]).split(os.path.sep)[1] + os.path.sep + str(target[0]).split(os.path.sep)[2] + os.path.sep + "Tasmota.map" - # PIO env variables see: https://github.com/platformio/platformio-core/blob/develop/platformio/builder/main.py#L108:L128 - proj_build_dir = env["PROJECT_BUILD_DIR"] - #build_dir = env["BUILD_DIR"] - pio_env = env["PIOENV"] - proj_dir = env["PROJECT_DIR"] - map_name = str(proj_dir).split(os.path.sep)[-1] - map_new_loc = proj_build_dir + os.path.sep + pio_env + os.path.sep + map_name + ".map" - #print("proj_build_dir: {}".format(proj_build_dir)) - #print("pioenv: {}".format(pio_env)) - #print("build_dir: {}".format(build_dir)) - #print("map_name: {}".format(map_name)) - #print("proj_dir: {}".format(proj_dir)) - #print("map_new_loc: {}".format(map_new_loc)) - - # move Tasmota.map to map/.map - if os.path.isfile(map_new_loc): - shutil.move(map_new_loc, map_file) - -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_map_copy]) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", bin_map_copy) diff --git a/pio-tools/tasmotapiolib.py b/pio-tools/tasmotapiolib.py new file mode 100644 index 000000000..52ce83c9a --- /dev/null +++ b/pio-tools/tasmotapiolib.py @@ -0,0 +1,49 @@ +"""Supporting library for pio-tools scripts""" +import pathlib + +OUTPUT_DIR = pathlib.Path("build_output") + + +def get_variant(env) -> str: + """Get the current build variant.""" + return env["PIOENV"] + + +def get_final_bin_path(env) -> pathlib.Path: + """Path to the final destination for the .bin + + If the parent directory does not exist, it will be created""" + firmware_dir = OUTPUT_DIR / "firmware" + firmware_dir.mkdir(parents=True, exist_ok=True) + return firmware_dir / "{}.bin".format(get_variant(env)) + + +def get_final_map_path(env) -> pathlib.Path: + """Path to the final destination for the .map file + + If the parent directory does not exist, it will be created""" + map_dir = OUTPUT_DIR / "map" + map_dir.mkdir(parents=True, exist_ok=True) + return map_dir / "{}.map".format(get_variant(env)) + + +def get_source_map_path(env) -> pathlib.Path: + """Path to the built .map file. + + Tests potential locations, returning the first match. + Raises FileNotFoundError if no match found""" + fwmap_path = pathlib.Path("firmware.map") + if fwmap_path.is_file(): + return fwmap_path + + # firmware maybe in project build directory + # PIO env variables see: https://github.com/platformio/platformio-core/blob/develop/platformio/builder/main.py#L108:L128 + proj_build_dir = pathlib.Path(env["PROJECT_BUILD_DIR"]) + proj_dir = pathlib.Path(env["PROJECT_DIR"]) + map_name = proj_dir.parts[-1] + ".map" + fwmap_path = proj_build_dir / get_variant(env) / map_name + + if fwmap_path.is_file(): + return fwmap_path + + raise FileNotFoundError From 4ad8604b7221ec20faf2d2371aea099c4938c165 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 16 Aug 2021 13:10:19 +0200 Subject: [PATCH 06/19] Berry add `tasmota.remove_timer()` --- lib/libesp32/Berry/default/be_modtab.c | 2 + lib/libesp32/Berry/default/be_tasmotalib.c | 124 ++++++++++++------ lib/libesp32/Berry/default/be_timer_class.c | 108 +++++++++++++++ .../Berry/default/embedded/Tasmota.be | 36 ++++- lib/libesp32/Berry/generate/be_const_strtab.h | 1 + .../Berry/generate/be_const_strtab_def.h | 5 +- .../generate/be_fixed_be_class_tasmota.h | 117 +++++++++-------- 7 files changed, 292 insertions(+), 101 deletions(-) create mode 100644 lib/libesp32/Berry/default/be_timer_class.c diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index b84559548..0d3adf04d 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -101,6 +101,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { extern void be_load_tasmota_ntvlib(bvm *vm); extern void be_load_wirelib(bvm *vm); extern void be_load_Driver_class(bvm *vm); +extern void be_load_Timer_class(bvm *vm); extern void be_load_driver_i2c_lib(bvm *vm); extern void be_load_md5_lib(bvm *vm); extern void be_load_aes_gcm_lib(bvm *vm); @@ -131,6 +132,7 @@ BERRY_API void be_load_custom_libs(bvm *vm) #if !BE_USE_PRECOMPILED_OBJECT /* be_load_xxxlib(vm); */ #endif + be_load_Timer_class(vm); be_load_tasmota_ntvlib(vm); be_load_Driver_class(vm); be_load_md5_lib(vm); diff --git a/lib/libesp32/Berry/default/be_tasmotalib.c b/lib/libesp32/Berry/default/be_tasmotalib.c index ec1aa8739..81c6c6016 100644 --- a/lib/libesp32/Berry/default/be_tasmotalib.c +++ b/lib/libesp32/Berry/default/be_tasmotalib.c @@ -925,48 +925,42 @@ const bclosure exec_rules_closure = { /*******************************************************************/ - -/******************************************************************** - "def set_timer(delay,f) " - "if !self._timers self._timers=[] end " - "self._timers.push([self.millis(delay),f]) " - "end " -********************************************************************/ /******************************************************************** ** Solidified function: set_timer ********************************************************************/ be_local_closure(set_timer, /* name */ be_nested_proto( - 9, /* nstack */ - 3, /* argc */ + 10, /* nstack */ + 4, /* argc */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* upvals */ - { { .s=be_nested_const_str("_timers", -1694866380, 7) }, BE_STRING}, - { { .s=be_nested_const_str("push", -2022703139, 4) }, BE_STRING}, - { { .s=be_nested_const_str("millis", 1214679063, 6) }, BE_STRING}, + ( &(const bvalue[ 4]) { /* constants */ + be_nested_string("_timers", -1694866380, 7), /* R256 - K0 */ + be_nested_string("push", -2022703139, 4), /* R257 - K1 */ + be_nested_string("Timer", -346839614, 5), /* R258 - K2 */ + be_nested_string("millis", 1214679063, 6), /* R259 - K3 */ }), (be_nested_const_str("set_timer", 2135414533, 9)), - (be_nested_const_str("string", 398550328, 6)), + (be_nested_const_str("input", -103256197, 5)), ( &(const binstruction[16]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 R256 - 0x740E0002, // 0001 JMPT R3 #0005 - 0x600C000A, // 0002 GETGBL R3 G10 - 0x7C0C0000, // 0003 CALL R3 0 - 0x90020003, // 0004 SETMBR R0 R256 R3 - 0x880C0100, // 0005 GETMBR R3 R0 R256 - 0x8C0C0701, // 0006 GETMET R3 R3 R257 - 0x6014000A, // 0007 GETGBL R5 G10 - 0x7C140000, // 0008 CALL R5 0 - 0x8C180102, // 0009 GETMET R6 R0 R258 - 0x5C200200, // 000A MOVE R8 R1 - 0x7C180400, // 000B CALL R6 2 - 0x40180A06, // 000C CONNECT R6 R5 R6 - 0x40180A02, // 000D CONNECT R6 R5 R2 - 0x7C0C0400, // 000E CALL R3 2 + 0x88100100, // 0000 GETMBR R4 R0 R256 + 0x74120002, // 0001 JMPT R4 #0005 + 0x6010000A, // 0002 GETGBL R4 G10 + 0x7C100000, // 0003 CALL R4 0 + 0x90020004, // 0004 SETMBR R0 R256 R4 + 0x88100100, // 0005 GETMBR R4 R0 R256 + 0x8C100901, // 0006 GETMET R4 R4 R257 + 0xB81A0400, // 0007 GETNGBL R6 R258 + 0x8C1C0103, // 0008 GETMET R7 R0 R259 + 0x5C240200, // 0009 MOVE R9 R1 + 0x7C1C0400, // 000A CALL R7 2 + 0x5C200400, // 000B MOVE R8 R2 + 0x5C240600, // 000C MOVE R9 R3 + 0x7C180600, // 000D CALL R6 3 + 0x7C100400, // 000E CALL R4 2 0x80000000, // 000F RET 0 R0 }) ) @@ -985,16 +979,18 @@ be_local_closure(run_deferred, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ be_nested_string("_timers", -1694866380, 7), /* R256 - K0 */ be_const_int(0), /* R257 - K1 */ be_nested_string("size", 597743964, 4), /* R258 - K2 */ be_nested_string("time_reached", 2075136773, 12), /* R259 - K3 */ - be_const_int(1), /* R260 - K4 */ - be_nested_string("remove", -611183107, 6), /* R261 - K5 */ + be_nested_string("due", -399437003, 3), /* R260 - K4 */ + be_nested_string("f", -485742695, 1), /* R261 - K5 */ + be_nested_string("remove", -611183107, 6), /* R262 - K6 */ + be_const_int(1), /* R263 - K7 */ }), (be_nested_const_str("run_deferred", 371594696, 12)), - (be_nested_const_str("string", 398550328, 6)), + (be_nested_const_str("input", -103256197, 5)), ( &(const binstruction[27]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 R256 0x78060017, // 0001 JMPF R1 #001A @@ -1007,20 +1003,20 @@ be_local_closure(run_deferred, /* name */ 0x8C080103, // 0008 GETMET R2 R0 R259 0x88100100, // 0009 GETMBR R4 R0 R256 0x94100801, // 000A GETIDX R4 R4 R1 - 0x94100901, // 000B GETIDX R4 R4 R257 + 0x88100904, // 000B GETMBR R4 R4 R260 0x7C080400, // 000C CALL R2 2 0x780A0009, // 000D JMPF R2 #0018 0x88080100, // 000E GETMBR R2 R0 R256 0x94080401, // 000F GETIDX R2 R2 R1 - 0x94080504, // 0010 GETIDX R2 R2 R260 + 0x88080505, // 0010 GETMBR R2 R2 R261 0x880C0100, // 0011 GETMBR R3 R0 R256 - 0x8C0C0705, // 0012 GETMET R3 R3 R261 + 0x8C0C0706, // 0012 GETMET R3 R3 R262 0x5C140200, // 0013 MOVE R5 R1 0x7C0C0400, // 0014 CALL R3 2 0x5C0C0400, // 0015 MOVE R3 R2 0x7C0C0000, // 0016 CALL R3 0 0x70020000, // 0017 JMP #0019 - 0x00040304, // 0018 ADD R1 R1 R260 + 0x00040307, // 0018 ADD R1 R1 R263 0x7001FFE8, // 0019 JMP #0003 0x80000000, // 001A RET 0 R0 }) @@ -1028,6 +1024,58 @@ be_local_closure(run_deferred, /* name */ ); /*******************************************************************/ +/******************************************************************** +** Solidified function: remove_timer +********************************************************************/ +be_local_closure(remove_timer, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + be_nested_string("tasmota", 424643812, 7), /* R256 - K0 */ + be_nested_string("_timers", -1694866380, 7), /* R257 - K1 */ + be_const_int(0), /* R258 - K2 */ + be_nested_string("size", 597743964, 4), /* R259 - K3 */ + be_nested_string("id", 926444256, 2), /* R260 - K4 */ + be_nested_string("remove", -611183107, 6), /* R261 - K5 */ + be_const_int(1), /* R262 - K6 */ + }), + (be_nested_const_str("remove_timer", -153495081, 12)), + (be_nested_const_str("input", -103256197, 5)), + ( &(const binstruction[23]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 R256 + 0x88080501, // 0001 GETMBR R2 R2 R257 + 0x780A0012, // 0002 JMPF R2 #0016 + 0x58080002, // 0003 LDCONST R2 K2 + 0xB80E0000, // 0004 GETNGBL R3 R256 + 0x880C0701, // 0005 GETMBR R3 R3 R257 + 0x8C0C0703, // 0006 GETMET R3 R3 R259 + 0x7C0C0200, // 0007 CALL R3 1 + 0x140C0403, // 0008 LT R3 R2 R3 + 0x780E000B, // 0009 JMPF R3 #0016 + 0x880C0101, // 000A GETMBR R3 R0 R257 + 0x940C0602, // 000B GETIDX R3 R3 R2 + 0x880C0704, // 000C GETMBR R3 R3 R260 + 0x1C0C0601, // 000D EQ R3 R3 R1 + 0x780E0004, // 000E JMPF R3 #0014 + 0x880C0101, // 000F GETMBR R3 R0 R257 + 0x8C0C0705, // 0010 GETMET R3 R3 R261 + 0x5C140400, // 0011 MOVE R5 R2 + 0x7C0C0400, // 0012 CALL R3 2 + 0x70020000, // 0013 JMP #0015 + 0x00080506, // 0014 ADD R2 R2 R262 + 0x7001FFED, // 0015 JMP #0004 + 0x80000000, // 0016 RET 0 R0 + }) + ) +); +/*******************************************************************/ + /******************************************************************** // Add command to list "def add_cmd(c,f) " @@ -2106,6 +2154,7 @@ void be_load_tasmota_ntvlib(bvm *vm) { "exec_rules", (bntvfunc) &exec_rules_closure }, { "set_timer", (bntvfunc) &set_timer_closure }, { "run_deferred", (bntvfunc) &run_deferred_closure }, + { "remove_timer", (bntvfunc) &remove_timer_closure }, { "add_cmd", (bntvfunc) &add_cmd_closure }, { "remove_cmd", (bntvfunc) &remove_cmd_closure }, { "exec_cmd", (bntvfunc) &exec_cmd_closure }, @@ -2189,6 +2238,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { exec_rules, closure(exec_rules_closure) set_timer, closure(set_timer_closure) run_deferred, closure(run_deferred_closure) + remove_timer, closure(remove_timer_closure) add_cmd, closure(add_cmd_closure) remove_cmd, closure(remove_cmd_closure) exec_cmd, closure(exec_cmd_closure) diff --git a/lib/libesp32/Berry/default/be_timer_class.c b/lib/libesp32/Berry/default/be_timer_class.c new file mode 100644 index 000000000..84ed2a8ce --- /dev/null +++ b/lib/libesp32/Berry/default/be_timer_class.c @@ -0,0 +1,108 @@ +/******************************************************************** + * Tasmota lib + * + * class Timer + *******************************************************************/ +#include "be_constobj.h" + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(tostring, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + be_nested_string("string", 398550328, 6), /* R256 - K0 */ + be_nested_string("format", -1180859054, 6), /* R257 - K1 */ + be_nested_string(" int`` @@ -127,9 +141,9 @@ class Tasmota return false end - def set_timer(delay,f) + def set_timer(delay,f,id) if !self._timers self._timers=[] end - self._timers.push([self.millis(delay),f]) + self._timers.push(Timer(self.millis(delay),f,id)) end # run every 50ms tick @@ -137,8 +151,8 @@ class Tasmota if self._timers var i=0 while i Date: Mon, 16 Aug 2021 14:20:10 +0200 Subject: [PATCH 07/19] Auto enabled TLS if port is 443 --- tasmota/xdrv_02_9_mqtt.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/xdrv_02_9_mqtt.ino b/tasmota/xdrv_02_9_mqtt.ino index 78f7c88c1..0277bbc46 100644 --- a/tasmota/xdrv_02_9_mqtt.ino +++ b/tasmota/xdrv_02_9_mqtt.ino @@ -197,8 +197,8 @@ void MqttInit(void) { Settings->mqtt_port = 8883; #endif //USE_MQTT_AZURE_IOT #ifdef USE_MQTT_TLS - if ((8883 == Settings->mqtt_port) || (8884 == Settings->mqtt_port)) { - // Turn on TLS for port 8883 (TLS) and 8884 (TLS, client certificate) + if ((8883 == Settings->mqtt_port) || (8884 == Settings->mqtt_port) || (443 == Settings->mqtt_port)) { + // Turn on TLS for port 8883 (TLS), 8884 (TLS, client certificate), 443 (TLS, user/password) Settings->flag4.mqtt_tls = true; } Mqtt.mqtt_tls = Settings->flag4.mqtt_tls; // this flag should not change even if we change the SetOption (until reboot) From 34d0f8302e686279926869ef306d87613426158e Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Mon, 16 Aug 2021 22:41:10 +1000 Subject: [PATCH 08/19] PIO tools environment variable controls --- pio-tools/gzip-firmware.py | 6 ++++-- pio-tools/tasmotapiolib.py | 42 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 44 insertions(+), 4 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index 63394789e..5262f037d 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -28,7 +28,8 @@ def map_gzip(source, target, env): map_file.unlink() -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) +if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_MAP_GZ): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) # gzip only for ESP8266 if env["PIOPLATFORM"] != "espressif32": @@ -65,4 +66,5 @@ if env["PIOPLATFORM"] != "espressif32": ) ) - env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) + if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_BIN_GZ): + env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) diff --git a/pio-tools/tasmotapiolib.py b/pio-tools/tasmotapiolib.py index 52ce83c9a..2d6fe22e9 100644 --- a/pio-tools/tasmotapiolib.py +++ b/pio-tools/tasmotapiolib.py @@ -1,5 +1,18 @@ """Supporting library for pio-tools scripts""" import pathlib +import os + +# Constants for environment variables that can be set to control build output file +# locations and formats + +# if set to 1, will not gzip esp8266 bin files +DISABLE_BIN_GZ = "TASMOTA_DISABLE_BIN_GZ" +# if set, an alternative ptah to put generated .bin files +BIN_DIR = "TASMOTA_BIN_DIR" +# if set to 1, will not gzip generated .map files +DISABLE_MAP_GZ = "TASMOTA_DISABLE_MAP_GZ" +# if set, an alternative path to put generated .map files +MAP_DIR = "TASMOTA_MAP_DIR" OUTPUT_DIR = pathlib.Path("build_output") @@ -13,7 +26,7 @@ def get_final_bin_path(env) -> pathlib.Path: """Path to the final destination for the .bin If the parent directory does not exist, it will be created""" - firmware_dir = OUTPUT_DIR / "firmware" + firmware_dir = get_override_path(BIN_DIR) firmware_dir.mkdir(parents=True, exist_ok=True) return firmware_dir / "{}.bin".format(get_variant(env)) @@ -22,7 +35,7 @@ def get_final_map_path(env) -> pathlib.Path: """Path to the final destination for the .map file If the parent directory does not exist, it will be created""" - map_dir = OUTPUT_DIR / "map" + map_dir = get_override_path(MAP_DIR) map_dir.mkdir(parents=True, exist_ok=True) return map_dir / "{}.map".format(get_variant(env)) @@ -47,3 +60,28 @@ def get_source_map_path(env) -> pathlib.Path: return fwmap_path raise FileNotFoundError + + +def get_override_path(pathtype) -> pathlib.Path: + """ + Returns a path to a givens override path if set, otherwise OUTPUT_DIR is used + + pathtype must be either MAP_DIR or BIN_DIR. + """ + override = os.environ.get(pathtype) + if override: + return pathlib.Path(override) + if pathtype == BIN_DIR: + return OUTPUT_DIR / "firmware" + elif pathtype == MAP_DIR: + return OUTPUT_DIR / "map" + raise ValueError + + +def is_env_set(name: str): + """True if the enviornment variable is set to `1`""" + val = os.environ.get(name.upper()) + if val: + val = val.strip() + return val == "1" + return False From 154928fe584ef8bd5dc94bfbfaadd2f4de4afbf5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 16 Aug 2021 17:31:52 +0200 Subject: [PATCH 09/19] Add influxdb debug logging control --- tasmota/xdrv_59_influxdb.ino | 67 ++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 26 deletions(-) diff --git a/tasmota/xdrv_59_influxdb.ino b/tasmota/xdrv_59_influxdb.ino index 32ea3e076..ecafe8003 100644 --- a/tasmota/xdrv_59_influxdb.ino +++ b/tasmota/xdrv_59_influxdb.ino @@ -88,6 +88,7 @@ struct { int interval = 0; int _lastStatusCode = 0; // HTTP status code of last request to server int _lastRetryAfter = 0; // Store retry timeout suggested by server after last request + uint8_t log_level = LOG_LEVEL_DEBUG_MORE; bool _connectionReuse; // true if HTTP connection should be kept open. Usable for frequent writes. Default false bool init = false; } IFDB; @@ -220,7 +221,7 @@ int InfluxDbPostData(const char *data) { } Trim((char*)data); // Remove trailing \n - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("IFX: Sending\n%s"), data); + AddLog(IFDB.log_level, PSTR("IFX: Sending\n%s"), data); IFDBhttpClient->addHeader(F("Content-Type"), F("text/plain")); InfluxDbBeforeRequest(); IFDB._lastStatusCode = IFDBhttpClient->POST((uint8_t*)data, strlen(data)); @@ -234,19 +235,22 @@ int InfluxDbPostData(const char *data) { * Data preparation \*********************************************************************************************/ -char* InfluxDbNumber(char* alternative, const char* source) { - // Test for valid numeric data ('-.0123456789') or ON, OFF etc. as defined in kOptions - if (source != nullptr) { - char* out = (char*)source; - // Convert special text as found in kOptions to a number - // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2 - int number = GetStateNumber(source); - if (number >= 0) { - itoa(number, alternative, 10); - out = alternative; - } - if (IsNumeric(out)) { - return out; +char* InfluxDbNumber(char* alternative, JsonParserToken value) { + if (value.isValid()) { + char* source = (char*)value.getStr(); + // Test for valid numeric data ('-.0123456789') or ON, OFF etc. as defined in kOptions + if (source != nullptr) { + char* out = source; + // Convert special text as found in kOptions to a number + // Like "OFF" -> 0, "ON" -> 1, "TOGGLE" -> 2 + int number = GetStateNumber(source); + if (number >= 0) { + itoa(number, alternative, 10); + out = alternative; + } + if (IsNumeric(out)) { + return out; + } } } return nullptr; @@ -255,10 +259,12 @@ char* InfluxDbNumber(char* alternative, const char* source) { void InfluxDbProcessJson(void) { if (!IFDB.init) { return; } -// AddLog(LOG_LEVEL_DEBUG, PSTR("IFX: JSON %s"), ResponseData()); + AddLog(IFDB.log_level, PSTR("IFX: Process %s"), ResponseData()); + +// String jsonStr = ResponseData(); // Make a copy before use +// JsonParser parser((char *)jsonStr.c_str()); + JsonParser parser((char *)ResponseData()); // Destroys ResponseData but saves heap space - String jsonStr = ResponseData(); - JsonParser parser((char *)jsonStr.c_str()); JsonParserObject root = parser.getRootObject(); if (root) { char number[12]; // '1' to '255' @@ -279,8 +285,8 @@ void InfluxDbProcessJson(void) { if (value2.isObject()) { JsonParserObject Object3 = value2.getObject(); for (auto key3 : Object3) { - const char* value = InfluxDbNumber(number, key3.getValue().getStr()); - if (value != nullptr) { + char* value = InfluxDbNumber(number, key3.getValue()); + if ((value != nullptr) && key2.isValid() && key3.isValid()) { // Level 3 LowerCase(sensor, key2.getStr()); LowerCase(type, key3.getStr()); @@ -293,16 +299,17 @@ void InfluxDbProcessJson(void) { } else { // Level 2 // { ... "ANALOG":{"Temperature":184.72},"DS18B20":{"Id":"01144A0CB2AA","Temperature":24.88},"HTU21":{"Temperature":25.32,"Humidity":49.2,"DewPoint":13.88},"Global":{"Temperature":24.88,"Humidity":49.2,"DewPoint":13.47}, ... } + if (!key1.isValid() || !value2.isValid()) { continue; } LowerCase(type, key2.getStr()); bool is_id = (!strcmp_P(type, PSTR("id"))); // Index for DS18B20 bool is_array = value2.isArray(); - const char* value = nullptr; + char* value = nullptr; if (is_id && !is_array) { snprintf_P(sensor_id, sizeof(sensor_id), PSTR(",id=%s"), value2.getStr()); } else { - value = InfluxDbNumber(number, (is_array) ? (value2.getArray())[0].getStr() : value2.getStr()); + value = InfluxDbNumber(number, (is_array) ? (value2.getArray())[0] : value2); } - if (value != nullptr) { + if ((value != nullptr) && key2.isValid()) { LowerCase(sensor, key1.getStr()); // AddLog(LOG_LEVEL_DEBUG, PSTR("IFX2: sensor %s (%s), type %s (%s)"), key1.getStr(), sensor, key2.getStr(), type); @@ -331,8 +338,8 @@ void InfluxDbProcessJson(void) { } else { // Level 1 // {"Time":"2021-08-13T14:15:56","Switch1":"ON","Switch2":"OFF", ... "TempUnit":"C"} - const char* value = InfluxDbNumber(number, value1.getStr()); - if (value != nullptr) { + char* value = InfluxDbNumber(number, value1); + if ((value != nullptr) && key1.isValid()) { LowerCase(type, key1.getStr()); // switch1,device=demo,sensor=device value=0 // power1,device=demo,sensor=device value=1 @@ -392,6 +399,7 @@ void InfluxDbLoop(void) { \*********************************************************************************************/ #define D_PRFX_INFLUXDB "Ifx" +#define D_CMND_INFLUXDBLOG "Log" #define D_CMND_INFLUXDBHOST "Host" #define D_CMND_INFLUXDBPORT "Port" #define D_CMND_INFLUXDBUSER "User" @@ -402,14 +410,14 @@ void InfluxDbLoop(void) { #define D_CMND_INFLUXDBBUCKET "Bucket" const char kInfluxDbCommands[] PROGMEM = D_PRFX_INFLUXDB "|" // Prefix - "|" + "|" D_CMND_INFLUXDBLOG "|" D_CMND_INFLUXDBHOST "|" D_CMND_INFLUXDBPORT "|" D_CMND_INFLUXDBUSER "|" D_CMND_INFLUXDBORG "|" D_CMND_INFLUXDBPASSWORD "|" D_CMND_INFLUXDBTOKEN "|" D_CMND_INFLUXDBDATABASE "|" D_CMND_INFLUXDBBUCKET; void (* const InfluxCommand[])(void) PROGMEM = { - &CmndInfluxDbState, + &CmndInfluxDbState, &CmndInfluxDbLog, &CmndInfluxDbHost, &CmndInfluxDbPort, &CmndInfluxDbUser, &CmndInfluxDbUser, &CmndInfluxDbPassword, &CmndInfluxDbPassword, @@ -438,6 +446,13 @@ void CmndInfluxDbState(void) { } } +void CmndInfluxDbLog(void) { + if ((XdrvMailbox.payload >= LOG_LEVEL_NONE) && (XdrvMailbox.payload <= LOG_LEVEL_DEBUG_MORE)) { + IFDB.log_level = XdrvMailbox.payload; + } + ResponseCmndNumber(IFDB.log_level); +} + void CmndInfluxDbHost(void) { if (XdrvMailbox.data_len > 0) { SettingsUpdateText(SET_INFLUXDB_HOST, (SC_CLEAR == Shortcut()) ? "" : (SC_DEFAULT == Shortcut()) ? PSTR(INFLUXDB_HOST) : XdrvMailbox.data); From 63bbf46d7f714009b2fa9a987d737486b7d3f468 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 16 Aug 2021 20:46:09 +0200 Subject: [PATCH 10/19] Berry now compiling in ``strict`` mode to catch more bugs --- CHANGELOG.md | 3 + lib/libesp32/Berry/default/be_modtab.c | 4 + lib/libesp32/Berry/default/berry_conf.h | 11 +- .../Berry/default/embedded/Tasmota.be | 4 +- lib/libesp32/Berry/generate/be_fixed_strict.h | 17 ++ lib/libesp32/Berry/src/be_api.c | 14 +- lib/libesp32/Berry/src/be_class.c | 30 ++- lib/libesp32/Berry/src/be_code.c | 104 +++++++-- lib/libesp32/Berry/src/be_exec.c | 26 ++- lib/libesp32/Berry/src/be_globallib.c | 2 +- lib/libesp32/Berry/src/be_module.c | 15 +- lib/libesp32/Berry/src/be_opcodes.h | 2 +- lib/libesp32/Berry/src/be_parser.c | 213 +++++++++++------ lib/libesp32/Berry/src/be_parser.h | 14 +- lib/libesp32/Berry/src/be_strictlib.c | 40 ++++ lib/libesp32/Berry/src/be_vm.c | 74 +++--- lib/libesp32/Berry/src/be_vm.h | 5 + .../berry/examples/lvgl_demo_M5stack_black.be | 219 ------------------ .../examples/watch_renaissance/autoexec.be | 6 +- tasmota/berry/modules/partition.be | 8 +- tasmota/xdrv_52_9_berry.ino | 3 +- 21 files changed, 427 insertions(+), 387 deletions(-) create mode 100644 lib/libesp32/Berry/generate/be_fixed_strict.h create mode 100644 lib/libesp32/Berry/src/be_strictlib.c delete mode 100644 tasmota/berry/examples/lvgl_demo_M5stack_black.be diff --git a/CHANGELOG.md b/CHANGELOG.md index f4a01c052..7c8a07150 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,9 @@ All notable changes to this project will be documented in this file. ### Added - Version bump to monitor possible HTTP issues releated to ``SetOption128`` +### Changed +- Berry now compiling in ``strict`` mode to catch more bugs + ## [9.5.0.5] 20210815 ### Added - Inital support for Wi-Fi extender (#12784) diff --git a/lib/libesp32/Berry/default/be_modtab.c b/lib/libesp32/Berry/default/be_modtab.c index 0d3adf04d..edde70854 100644 --- a/lib/libesp32/Berry/default/be_modtab.c +++ b/lib/libesp32/Berry/default/be_modtab.c @@ -20,6 +20,7 @@ be_extern_native_module(sys); be_extern_native_module(debug); be_extern_native_module(gc); be_extern_native_module(solidify); +be_extern_native_module(strict); be_extern_native_module(introspect); /* Tasmota specific */ @@ -72,6 +73,9 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #endif #if BE_USE_INTROSPECT_MODULE &be_native_module(introspect), +#endif +#if BE_USE_STRICT_MODULE + &be_native_module(strict), #endif /* user-defined modules register start */ diff --git a/lib/libesp32/Berry/default/berry_conf.h b/lib/libesp32/Berry/default/berry_conf.h index aaa244434..e51ebd1a7 100644 --- a/lib/libesp32/Berry/default/berry_conf.h +++ b/lib/libesp32/Berry/default/berry_conf.h @@ -45,7 +45,7 @@ * Use precompiled objects to avoid creating these objects at * runtime. Enable this macro can greatly optimize RAM usage. * Default: 1 -// **/ + **/ #define BE_USE_PRECOMPILED_OBJECT 1 /* Macro: BE_DEBUG_RUNTIME_INFO @@ -142,6 +142,14 @@ **/ #define BE_USE_DEBUG_HOOK 0 +/* Macro: BE_USE_DEBUG_GC + * Enable GC debug mode. This causes an actual gc after each + * allocation. It's much slower and should not be used + * in production code. + * Default: 0 + **/ +#define BE_USE_DEBUG_GC 0 + /* Macro: BE_USE_XXX_MODULE * These macros control whether the related module is compiled. * When they are true, they will enable related modules. At this @@ -159,6 +167,7 @@ #define BE_USE_GC_MODULE 1 #define BE_USE_SOLIDIFY_MODULE 1 #define BE_USE_INTROSPECT_MODULE 1 +#define BE_USE_STRICT_MODULE 1 /* Macro: BE_EXPLICIT_XXX * If these macros are defined, the corresponding function will diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index 0c6c5d1eb..9266c135c 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -93,7 +93,7 @@ class Tasmota var sub_event = event var rl = string.split(rl_list[0],'#') for it:rl - found=self.find_key_i(sub_event,it) + var found=self.find_key_i(sub_event,it) if found == nil return false end sub_event = sub_event[found] end @@ -152,7 +152,7 @@ class Tasmota var i=0 while itype; + } } return type; } BERRY_API bbool be_getmember(bvm *vm, int index, const char *k) { - return ins_member(vm, index, k) != BE_NIL; + return ins_member(vm, index, k, bfalse) != BE_NIL; } BERRY_API bbool be_getmethod(bvm *vm, int index, const char *k) { - return basetype(ins_member(vm, index, k)) == BE_FUNCTION; + return basetype(ins_member(vm, index, k, btrue)) == BE_FUNCTION; } BERRY_API bbool be_getindex(bvm *vm, int index) diff --git a/lib/libesp32/Berry/src/be_class.c b/lib/libesp32/Berry/src/be_class.c index 720bba05c..4bd264446 100644 --- a/lib/libesp32/Berry/src/be_class.c +++ b/lib/libesp32/Berry/src/be_class.c @@ -178,6 +178,7 @@ void be_class_upvalue_init(bvm *vm, bclass *c) } } +/* (internal) Instanciate an instance for a single class and initialize variables to nil */ static binstance* newobjself(bvm *vm, bclass *c) { size_t size = sizeof(binstance) + sizeof(bvalue) * (c->nvar - 1); @@ -185,15 +186,17 @@ static binstance* newobjself(bvm *vm, bclass *c) binstance *obj = cast_instance(gco); be_assert(obj != NULL); if (obj) { /* initialize members */ - bvalue *v = obj->members, *end = v + c->nvar; - while (v < end) { var_setnil(v); ++v; } - obj->_class = c; - obj->super = NULL; - obj->sub = NULL; + bvalue *v = obj->members, *end = v + c->nvar; /* instance variables is a simple array of pointers at obj->members of size c->nvar */ + while (v < end) { var_setnil(v); ++v; } /* Initialize all instance variables to `nil` */ + obj->_class = c; /* set its class object */ + obj->super = NULL; /* no super class instance for now */ + obj->sub = NULL; /* no subclass instance for now */ } return obj; } +/* (internal) Instanciate the whole chain of instances when there is a class hierarchy */ +/* All variables set to nil, constructors are not called here */ static binstance* newobject(bvm *vm, bclass *c) { binstance *obj, *prev; @@ -201,23 +204,26 @@ static binstance* newobject(bvm *vm, bclass *c) obj = prev = newobjself(vm, c); var_setinstance(vm->top, obj); be_incrtop(vm); /* protect new objects from GC */ - for (c = c->super; c; c = c->super) { + for (c = c->super; c; c = c->super) { /* initialize one instance object per class and per superclass */ prev->super = newobjself(vm, c); - prev->super->sub = prev; + prev->super->sub = prev; /* link the super/sub classes instances */ prev = prev->super; } be_stackpop(vm, 1); return obj; } +/* Instanciate new instance from stack with argc parameters */ +/* Pushes the constructor on the stack to be executed if a construtor is found */ +/* Returns true if a constructor is found */ bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc, int mode) { bvalue init; size_t pos = reg - vm->reg; - binstance *obj = newobject(vm, c); - reg = vm->reg + pos - mode; /* the stack may have changed */ + binstance *obj = newobject(vm, c); /* create empty object hierarchy from class hierarchy */ + reg = vm->reg + pos - mode; /* the stack may have changed, mode=1 when class is instanciated from module #104 */ var_setinstance(reg, obj); - var_setinstance(reg + mode, obj); + var_setinstance(reg + mode, obj); /* copy to reg and reg+1 if mode==1 */ /* find constructor */ obj = instance_member(vm, obj, str_literal(vm, "init"), &init); if (obj && var_type(&init) != MT_VARIABLE) { @@ -231,6 +237,10 @@ bbool be_class_newobj(bvm *vm, bclass *c, bvalue *reg, int argc, int mode) return bfalse; } +/* Find instance member by name and copy value to `dst` */ +/* Input: none of `obj`, `name` and `dst` may not be NULL */ +/* Returns the type of the member or BE_NONE if member not found */ +/* TODO need to support synthetic members */ int be_instance_member(bvm *vm, binstance *obj, bstring *name, bvalue *dst) { int type; diff --git a/lib/libesp32/Berry/src/be_code.c b/lib/libesp32/Berry/src/be_code.c index 56bd9f530..e9d0e4d9f 100644 --- a/lib/libesp32/Berry/src/be_code.c +++ b/lib/libesp32/Berry/src/be_code.c @@ -56,6 +56,7 @@ static void codelineinfo(bfuncinfo *finfo) #define codelineinfo(finfo) #endif +/* Add new instruction in the code vector */ static int codeinst(bfuncinfo *finfo, binstruction ins) { /* put new instruction in code array */ @@ -77,10 +78,13 @@ static int codeABx(bfuncinfo *finfo, bopcode op, int a, int bx) return codeinst(finfo, ISET_OP(op) | ISET_RA(a) | ISET_Bx(bx)); } +/* Move value from register b to register a */ +/* Check the previous instruction to compact both instruction as one if possible */ +/* If b is a constant, add LDCONST or add MOVE otherwise */ static void code_move(bfuncinfo *finfo, int a, int b) { - if (finfo->pc) { - binstruction *i = be_vector_end(&finfo->code); + if (finfo->pc) { /* If not the first instruction of the function */ + binstruction *i = be_vector_end(&finfo->code); /* get the last instruction */ bopcode op = IGET_OP(*i); if (op <= OP_LDNIL) { /* binop or unop */ /* remove redundant MOVE instruction */ @@ -98,6 +102,8 @@ static void code_move(bfuncinfo *finfo, int a, int b) } } +/* Free register at top (checks that it´s a register) */ +/* Warning: the register must be at top of stack */ static void free_expreg(bfuncinfo *finfo, bexpdesc *e) { /* release temporary register */ @@ -106,6 +112,8 @@ static void free_expreg(bfuncinfo *finfo, bexpdesc *e) } } +/* Privat. Allocate `count` new registers on the stack and uptade proto´s max nstack accordingly */ +/* Note: deallocate is simpler and handled by a macro */ static void allocstack(bfuncinfo *finfo, int count) { int nstack = finfo->freereg + count; @@ -117,6 +125,7 @@ static void allocstack(bfuncinfo *finfo, int count) } } +/* Allocate `count` registers at top of stack, update stack accordingly */ int be_code_allocregs(bfuncinfo *finfo, int count) { int base = finfo->freereg; @@ -227,6 +236,8 @@ void be_code_patchjump(bfuncinfo *finfo, int jmp) patchlistaux(finfo, jmp, finfo->pc, finfo->pc); } +/* Allocate new constant for value k */ +/* If k is NULL then push `nil` value */ static int newconst(bfuncinfo *finfo, bvalue *k) { int idx = be_vector_count(&finfo->kvec); @@ -239,6 +250,8 @@ static int newconst(bfuncinfo *finfo, bvalue *k) return idx; } +/* Find constant by value and return constant number, or -1 if constant does not exist */ +/* The search is linear and lilited to 50 elements for performance reasons */ static int findconst(bfuncinfo *finfo, bexpdesc *e) { int i, count = be_vector_count(&finfo->kvec); @@ -273,10 +286,11 @@ static int findconst(bfuncinfo *finfo, bexpdesc *e) return -1; } +/* convert expdesc to constant and return kreg index (either constant kindex or register number) */ static int exp2const(bfuncinfo *finfo, bexpdesc *e) { - int idx = findconst(finfo, e); - if (idx == -1) { + int idx = findconst(finfo, e); /* does the constant already exist? */ + if (idx == -1) { /* if not add it */ bvalue k; switch (e->type) { case ETINT: @@ -291,16 +305,16 @@ static int exp2const(bfuncinfo *finfo, bexpdesc *e) k.type = BE_STRING; k.v.s = e->v.s; break; - default: + default: /* all other values are filled later */ break; } - idx = newconst(finfo, &k); + idx = newconst(finfo, &k); /* create new constant */ } - if (idx < 256) { - e->type = ETCONST; + if (idx < 256) { /* if constant number fits in KB or KC */ + e->type = ETCONST; /* new type is constant by index */ e->v.idx = setK(idx); } else { /* index value is too large */ - e->type = ETREG; + e->type = ETREG; /* does not fit in compact mode, allocate an explicit register and emit LDCONTS */ e->v.idx = be_code_allocregs(finfo, 1); codeABx(finfo, OP_LDCONST, e->v.idx, idx); } @@ -368,6 +382,9 @@ static void code_closure(bfuncinfo *finfo, int idx, int dst) codeABx(finfo, OP_CLOSURE, dst, idx); /* load closure to register */ } +/* Given an integer, check if we should create a constant */ +/* True for values 0..3 and if there is room for kindex */ +/* This optimization makes code more compact for commonly used ints */ static bbool constint(bfuncinfo *finfo, bint i) { /* cache common numbers */ @@ -378,6 +395,9 @@ static bbool constint(bfuncinfo *finfo, bint i) return bfalse; } +/* Compute variable from an expdesc */ +/* Return constant index, or existing register or fallback to dst */ +/* At exit, If dst is `freereg`, the register is allocated */ static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) { if (dst < 0) { /* if unspecified, allocate a new register if needed */ @@ -435,7 +455,7 @@ static int var2reg(bfuncinfo *finfo, bexpdesc *e, int dst) static int exp2reg(bfuncinfo *finfo, bexpdesc *e, int dst) { int reg = var2reg(finfo, e, dst); - if (hasjump(e)) { + if (hasjump(e)) { /* if conditional expression */ int pcf = NO_JUMP; /* position of an eventual LOAD false */ int pct = NO_JUMP; /* position of an eventual LOAD true */ int jpt = appendjump(finfo, jumpboolop(e, 1), e); @@ -452,6 +472,11 @@ static int exp2reg(bfuncinfo *finfo, bexpdesc *e, int dst) return reg; } +/* Select dest registers from both expressions */ +/* If one of them is already a register, keep it */ +/* If e1 or e2 are registers, we keep the lowest and free the highest (that must be at top) */ +/* If none is a register, allocate a new one */ +/* Returns the destination register, guaranteed to be ETREG */ static int codedestreg(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, int dst) { int cand_dst = dst; @@ -477,6 +502,8 @@ static int codedestreg(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, int dst) } } +/* compute binary expression and update e1 as result */ +/* On exit, e1 is guaranteed to be ETREG, which may have been allocated */ static void binaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e1, bexpdesc *e2, int dst) { if (dst < 0) { dst = finfo->freereg; } @@ -485,7 +512,7 @@ static void binaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e1, bexpdesc *e2, dst = codedestreg(finfo, e1, e2, dst); codeABC(finfo, op, dst, src1, src2); e1->type = ETREG; - e1->v.idx = dst; + e1->v.idx = dst; /* update register as output */ } void be_code_prebinop(bfuncinfo *finfo, int op, bexpdesc *e) @@ -503,6 +530,7 @@ void be_code_prebinop(bfuncinfo *finfo, int op, bexpdesc *e) } } +/* Apply binary operator `op` to e1 and e2, result in e1 */ void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2, int dst) { switch (op) { @@ -527,6 +555,8 @@ void be_code_binop(bfuncinfo *finfo, int op, bexpdesc *e1, bexpdesc *e2, int dst } } +/* Apply unary operator and return register number */ +/* If input is register, change in place or allocate new register */ static void unaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e) { int src = exp2anyreg(finfo, e); @@ -536,6 +566,9 @@ static void unaryexp(bfuncinfo *finfo, bopcode op, bexpdesc *e) e->v.idx = dst; } +/* Apply not to conditional expression */ +/* If literal compute the value */ +/* Or invert t/f subexpressions */ static void code_not(bexpdesc *e) { switch (e->type) { @@ -555,6 +588,7 @@ static void code_not(bexpdesc *e) e->type = ETBOOL; } +/* Negative value of literal or emit NEG opcode */ static int code_neg(bfuncinfo *finfo, bexpdesc *e) { switch (e->type) { @@ -568,6 +602,7 @@ static int code_neg(bfuncinfo *finfo, bexpdesc *e) return 0; } +/* Bit flip of literal or emit FLIP opcode */ static int code_flip(bfuncinfo *finfo, bexpdesc *e) { switch (e->type) { @@ -580,6 +615,7 @@ static int code_flip(bfuncinfo *finfo, bexpdesc *e) return 0; } +/* Apply unary operator: not, neg or bitflip */ int be_code_unop(bfuncinfo *finfo, int op, bexpdesc *e) { switch (op) { @@ -624,24 +660,28 @@ static void setsfxvar(bfuncinfo *finfo, bopcode op, bexpdesc *e1, int src) codeABC(finfo, op, obj, e1->v.ss.idx, src); } +/* Assign expr e2 to e1 */ +/* e1 must be in a register and have a valid idx */ +/* return 1 if assignment was possible, 0 if type is not compatible */ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) { int src = exp2reg(finfo, e2, - e1->type == ETLOCAL ? e1->v.idx : -1); + e1->type == ETLOCAL ? e1->v.idx : -1); /* Convert e2 to kreg */ + /* If e1 is a local variable, use the register */ if (e1->type != ETLOCAL || e1->v.idx != src) { - free_expreg(finfo, e2); /* free source (only ETREG) */ + free_expreg(finfo, e2); /* free source (checks only ETREG) */ /* TODO e2 is at top */ } switch (e1->type) { case ETLOCAL: /* It can't be ETREG. */ if (e1->v.idx != src) { - code_move(finfo, e1->v.idx, src); + code_move(finfo, e1->v.idx, src); /* do explicit move only if needed */ } break; - case ETGLOBAL: /* store to grobal R(A) -> G(Bx) */ + case ETGLOBAL: /* store to grobal R(A) -> G(Bx) by global index */ setsupvar(finfo, OP_SETGBL, e1, src); break; - case ETNGLOBAL: /* store to grobal R(A) -> G(Bx) */ + case ETNGLOBAL: /* store to global R(A) -> G(Bx) by name */ setbgblvar(finfo, OP_SETNGBL, e1, src); break; case ETUPVAL: @@ -659,6 +699,9 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) return 0; } +/* Get the expdesc as a register */ +/* if already in a register, use the existing register */ +/* if local or const, allocate a new register and copy value */ int be_code_nextreg(bfuncinfo *finfo, bexpdesc *e) { int dst = finfo->freereg; @@ -682,6 +725,9 @@ int be_code_getmethod(bfuncinfo *finfo, bexpdesc *e) return dst; } +/* Generate a CALL instruction at base register with argc consecutive values */ +/* i.e. arg1 is base+1... */ +/* Important: argc registers are freed upon call, which are supposed to be registers above base */ void be_code_call(bfuncinfo *finfo, int base, int argc) { codeABC(finfo, OP_CALL, base, argc, 0); @@ -758,6 +804,8 @@ void be_code_ret(bfuncinfo *finfo, bexpdesc *e) } } +/* Package a suffix object from `c` with key `k` */ +/* Both expdesc are materialized in kregs */ static void package_suffix(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) { int key = exp2anyreg(finfo, k); @@ -771,12 +819,14 @@ int be_code_nglobal(bfuncinfo *finfo, bexpdesc *k) return exp2anyreg(finfo, k); } +/* Package a MEMBER suffix object from `c` with key `k` */ void be_code_member(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) { package_suffix(finfo, c, k); c->type = ETMEMBER; } +/* Package a INDEX suffix object from `c` with key `k` */ void be_code_index(bfuncinfo *finfo, bexpdesc *c, bexpdesc *k) { package_suffix(finfo, c, k); @@ -787,15 +837,15 @@ void be_code_class(bfuncinfo *finfo, bexpdesc *dst, bclass *c) { int src; bvalue var; - var_setclass(&var, c); - src = newconst(finfo, &var); - if (dst->type == ETLOCAL) { + var_setclass(&var, c); /* new var of CLASS type */ + src = newconst(finfo, &var); /* allocate a new constant and return kreg */ + if (dst->type == ETLOCAL) { /* if target is a local variable, just assign */ codeABx(finfo, OP_LDCONST, dst->v.idx, src); - } else { + } else { /* otherwise set as global with same name as class name */ codeABx(finfo, OP_LDCONST, finfo->freereg, src); codeABx(finfo, OP_SETGBL, finfo->freereg, dst->v.idx); } - codeABx(finfo, OP_CLASS, 0, src); + codeABx(finfo, OP_CLASS, 0, src); /* emit CLASS opcode to register class */ } void be_code_setsuper(bfuncinfo *finfo, bexpdesc *c, bexpdesc *s) @@ -807,6 +857,12 @@ void be_code_setsuper(bfuncinfo *finfo, bexpdesc *c, bexpdesc *s) free_expreg(finfo, s); } +/* Emit IMPORT opcode for import module */ +/* `m` is module name, is copied to register if not already */ +/* `v` is destination where the imported module is stored */ +/* If destination is a local variable, it is the destination of the IMPORT opcode */ +/* otherwise the value is copied to a temporary register and stored to the destination */ +/* TODO is this optilization useful, isn´t it done anyways by be_code_move optim? */ void be_code_import(bfuncinfo *finfo, bexpdesc *m, bexpdesc *v) { int dst, src = exp2anyreg(finfo, m); @@ -840,6 +896,10 @@ void be_code_catch(bfuncinfo *finfo, int base, int ecnt, int vcnt, int *jmp) } } +/* Emit RAISE opcode */ +/* e1 is the exception code */ +/* e2 is the exception description */ +/* both are materialized to a temp register (if not null) */ void be_code_raise(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) { if (e1) { @@ -847,7 +907,7 @@ void be_code_raise(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2) int src2 = e2 ? exp2anyreg(finfo, e2) : 0; codeABC(finfo, OP_RAISE, e2 != NULL, src1, src2); } else { - codeABC(finfo, OP_RAISE, 2, 0, 0); + codeABC(finfo, OP_RAISE, 2, 0, 0); /* rethrow the current exception with parameters already on top of stack */ } /* release the register occupied by the expression */ free_expreg(finfo, e1); diff --git a/lib/libesp32/Berry/src/be_exec.c b/lib/libesp32/Berry/src/be_exec.c index 4bca65877..2d71dab0f 100644 --- a/lib/libesp32/Berry/src/be_exec.c +++ b/lib/libesp32/Berry/src/be_exec.c @@ -82,6 +82,8 @@ void be_throw(bvm *vm, int errorcode) } } +/* Fatal error Exit */ +/* Raise a BE_EXIT exception if within a try/catch block, or exit VM */ BERRY_API void be_exit(bvm *vm, int status) { if (vm->errjmp) { @@ -99,6 +101,8 @@ void be_throw_message(bvm *vm, int errorcode, const char *msg) be_throw(vm, errorcode); } +/* Exec protected: exec function and capture any exception and contain it within call */ +/* Exceptions or fatal errors are not propagated */ int be_execprotected(bvm *vm, bpfunc f, void *data) { struct blongjmp jmp; @@ -292,6 +296,7 @@ static void m_pcall(bvm *vm, void *data) be_dofunc(vm, p->v, p->argc); } +/* Protected call: contain any exception of fatal error and restore context if something went wrong */ int be_protectedcall(bvm *vm, bvalue *v, int argc) { int res; @@ -308,7 +313,8 @@ int be_protectedcall(bvm *vm, bvalue *v, int argc) } #if BE_DEBUG && defined(be_assert) -/* increase top register */ +/* increase top register and return new top */ +/* Does not expand the stack if there is not enough room, but may corrupt memory */ bvalue* be_incrtop(bvm *vm) { bvalue *top = vm->top++; @@ -317,6 +323,7 @@ bvalue* be_incrtop(bvm *vm) } #endif +/* TODO what is the difference with be_stack_push? */ void be_stackpush(bvm *vm) { /* make sure there is enough stack space */ @@ -324,6 +331,7 @@ void be_stackpush(bvm *vm) be_incrtop(vm); } +/* check that the stack is able to store `count` items, and increase stack if needed */ void be_stack_require(bvm *vm, int count) { if (vm->top + count >= vm->stacktop) { @@ -331,6 +339,7 @@ void be_stack_require(bvm *vm, int count) } } +/* Scan the entire callstack and adjust all pointer by `offset` */ static void update_callstack(bvm *vm, intptr_t offset) { bcallframe *cf = be_stack_top(&vm->callstack); @@ -353,20 +362,25 @@ static void update_upvalues(bvm *vm, intptr_t offset) } } +/* Resize the stack to new `size` as number of elements */ +/* Then update all pointers in callstack and upvalues with the new stack address */ static void stack_resize(bvm *vm, size_t size) { intptr_t offset; - bvalue *old = vm->stack; - size_t os = (vm->stacktop - old) * sizeof(bvalue); - vm->stack = be_realloc(vm, old, os, sizeof(bvalue) * size); - vm->stacktop = vm->stack + size; - offset = ptr_offset(vm->stack, old); + 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 */ + vm->stack = be_realloc(vm, old, os, sizeof(bvalue) * size); /* reallocate with the new size */ + 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 */ update_callstack(vm, offset); /* update open upvalues */ update_upvalues(vm, offset); } +/* Stack resize internal API */ +/* Increases the stack by `n` elements, reallocate stack if needed and update all callstacks and upvals */ +/* Check if we are above the max allowed stack */ void be_stack_expansion(bvm *vm, int n) { size_t size = vm->stacktop - vm->stack; diff --git a/lib/libesp32/Berry/src/be_globallib.c b/lib/libesp32/Berry/src/be_globallib.c index 8b5e16abd..1d8267b95 100644 --- a/lib/libesp32/Berry/src/be_globallib.c +++ b/lib/libesp32/Berry/src/be_globallib.c @@ -83,4 +83,4 @@ module global (scope: global, depend: BE_USE_GLOBAL_MODULE) { #include "../generate/be_fixed_global.h" #endif -#endif /* BE_USE_INTROSPECT_MODULE */ +#endif /* BE_USE_GLOBAL_MODULE */ diff --git a/lib/libesp32/Berry/src/be_module.c b/lib/libesp32/Berry/src/be_module.c index fcda03173..096a7c826 100644 --- a/lib/libesp32/Berry/src/be_module.c +++ b/lib/libesp32/Berry/src/be_module.c @@ -252,6 +252,16 @@ static void cache_module(bvm *vm, bstring *name) *v = vm->top[-1]; } +/* Try to run '()' function of module. Module is already loaded. */ +static void module_init(bvm *vm) { + if (be_getmember(vm, -1, "init")) { + /* found, call it with no parameter */ + be_call(vm, 0); + /* we don't care about the result */ + } + be_pop(vm, 1); +} + /* load module to vm->top */ int be_module_load(bvm *vm, bstring *path) { @@ -260,8 +270,11 @@ int be_module_load(bvm *vm, bstring *path) res = load_native(vm, path); if (res == BE_IO_ERROR) res = load_package(vm, path); - if (res == BE_OK) + if (res == BE_OK) { cache_module(vm, path); + /* on first load of the module, try running the '()' function */ + module_init(vm); + } } return res; } diff --git a/lib/libesp32/Berry/src/be_opcodes.h b/lib/libesp32/Berry/src/be_opcodes.h index f72049dbe..2fe9dbcae 100644 --- a/lib/libesp32/Berry/src/be_opcodes.h +++ b/lib/libesp32/Berry/src/be_opcodes.h @@ -51,7 +51,7 @@ OPCODE(CLOSE), /* A | close upvalues */ OPCODE(IMPORT), /* A, B, C | IF (A == C) import module name as RK(B) to RK(A), ELSE from module RK(C) import name as RK(B) to RK(A) */ OPCODE(EXBLK), /* A, Bx | ... */ OPCODE(CATCH), /* A, B, C | ... */ -OPCODE(RAISE), /* A, B, C | ... */ +OPCODE(RAISE), /* A, B, C | RAISE(B,C) B is code, C is description. A==0 only B provided, A==1 B and C are provided, A==2 rethrow with both parameters already on stack */ OPCODE(CLASS), /* Bx | init class in K[Bx] */ OPCODE(GETNGBL), /* A, B | R(A) <- GLOBAL[B] by name */ OPCODE(SETNGBL) /* A, B | R(A) -> GLOBAL[B] by name */ diff --git a/lib/libesp32/Berry/src/be_parser.c b/lib/libesp32/Berry/src/be_parser.c index 4a32c189d..f326d34d0 100644 --- a/lib/libesp32/Berry/src/be_parser.c +++ b/lib/libesp32/Berry/src/be_parser.c @@ -87,6 +87,8 @@ static void match_token(bparser *parser, btokentype type) scan_next_token(parser); /* skip this token */ } +/* Check that the next token is not of type `type` */ +/* or raise an exception */ static void match_notoken(bparser *parser, btokentype type) { if (next_type(parser) == type) { /* error when token is match */ @@ -95,6 +97,7 @@ static void match_notoken(bparser *parser, btokentype type) } } +/* check that if the expdesc is a symbol, it is avalid one or raise an exception */ static void check_symbol(bparser *parser, bexpdesc *e) { if (e->type == ETVOID && e->v.s == NULL) { /* error when token is not a symbol */ @@ -103,6 +106,7 @@ static void check_symbol(bparser *parser, bexpdesc *e) } } +/* check that the value in `e` is valid for a variable, i.e. conatins a value or a valid symbol */ static void check_var(bparser *parser, bexpdesc *e) { check_symbol(parser, e); /* check the token is a symbol */ @@ -172,14 +176,15 @@ void end_varinfo(bparser *parser, int beginpc) #endif +/* Initialize bblockinfo structure */ static void begin_block(bfuncinfo *finfo, bblockinfo *binfo, int type) { - binfo->prev = finfo->binfo; - finfo->binfo = binfo; + binfo->prev = finfo->binfo; /* save previous block */ + finfo->binfo = binfo; /* tell parser this is the current block */ binfo->type = (bbyte)type; binfo->hasupval = 0; - binfo->beginpc = finfo->pc; - binfo->nactlocals = (bbyte)be_list_count(finfo->local); + binfo->beginpc = finfo->pc; /* set starting pc for this block */ + binfo->nactlocals = (bbyte)be_list_count(finfo->local); /* count number of local variables in previous block */ if (type & BLOCK_LOOP) { binfo->breaklist = NO_JUMP; binfo->continuelist = NO_JUMP; @@ -197,9 +202,9 @@ static void end_block_ex(bparser *parser, int beginpc) be_code_patchlist(finfo, binfo->continuelist, binfo->beginpc); } end_varinfo(parser, beginpc); - be_list_resize(parser->vm, finfo->local, binfo->nactlocals); - finfo->freereg = binfo->nactlocals; - finfo->binfo = binfo->prev; + be_list_resize(parser->vm, finfo->local, binfo->nactlocals); /* remove local variables from this block, they are now out of scope */ + finfo->freereg = binfo->nactlocals; /* adjust first free register accordingly */ + finfo->binfo = binfo->prev; /* restore previous block */ } static void end_block(bparser *parser) @@ -207,6 +212,8 @@ static void end_block(bparser *parser) end_block_ex(parser, -1); } +/* Return the name of the source for this parser, could be `string`, + `stdin` or the name of the current function */ static bstring* parser_source(bparser *parser) { if (parser->finfo) { @@ -215,29 +222,30 @@ static bstring* parser_source(bparser *parser) return be_newstr(parser->vm, parser->lexer.fname); } +/* Initialize a function block and create a new `bprotoˋ */ static void begin_func(bparser *parser, bfuncinfo *finfo, bblockinfo *binfo) { bvm *vm = parser->vm; bproto *proto = be_newproto(vm); var_setproto(vm->top, proto); be_stackpush(vm); - be_vector_init(vm, &finfo->code, sizeof(binstruction)); + be_vector_init(vm, &finfo->code, sizeof(binstruction)); /* vector for code, vectors are not gced */ proto->code = be_vector_data(&finfo->code); proto->codesize = be_vector_capacity(&finfo->code); - be_vector_init(vm, &finfo->kvec, sizeof(bvalue)); + be_vector_init(vm, &finfo->kvec, sizeof(bvalue)); /* vector for constants */ proto->ktab = be_vector_data(&finfo->kvec); proto->nconst = be_vector_capacity(&finfo->kvec); - be_vector_init(vm, &finfo->pvec, sizeof(bproto*)); + be_vector_init(vm, &finfo->pvec, sizeof(bproto*)); /* vector for subprotos */ proto->ptab = be_vector_data(&finfo->pvec); proto->nproto = be_vector_capacity(&finfo->pvec); - proto->source = parser_source(parser); - finfo->local = be_list_new(vm); - var_setlist(vm->top, finfo->local); + proto->source = parser_source(parser); /* keep a copy of source for function */ + finfo->local = be_list_new(vm); /* list for local variables */ + var_setlist(vm->top, finfo->local); /* push list of local variables on the stack (avoid gc) */ be_stackpush(vm); - finfo->upval = be_map_new(vm); + finfo->upval = be_map_new(vm); /* push a map for upvals on stack */ var_setmap(vm->top, finfo->upval); be_stackpush(vm); - finfo->prev = parser->finfo; + finfo->prev = parser->finfo; /* init finfo */ finfo->lexer = &parser->lexer; finfo->proto = proto; finfo->freereg = 0; @@ -258,6 +266,7 @@ static void begin_func(bparser *parser, bfuncinfo *finfo, bblockinfo *binfo) begin_block(finfo, binfo, 0); } +/* compute the upval structure */ static void setupvals(bfuncinfo *finfo) { bproto *proto = finfo->proto; @@ -282,6 +291,7 @@ static void setupvals(bfuncinfo *finfo) } } +/* Function is complete, finalize bproto */ static void end_func(bparser *parser) { bvm *vm = parser->vm; @@ -289,9 +299,9 @@ static void end_func(bparser *parser) bproto *proto = finfo->proto; be_code_ret(finfo, NULL); /* append a return to last code */ - end_block(parser); - setupvals(finfo); - proto->code = be_vector_release(vm, &finfo->code); + end_block(parser); /* close block */ + setupvals(finfo); /* close upvals */ + proto->code = be_vector_release(vm, &finfo->code); /* compact all vectors and return NULL if empty */ proto->codesize = finfo->pc; proto->ktab = be_vector_release(vm, &finfo->kvec); proto->nconst = be_vector_count(&finfo->kvec); @@ -305,10 +315,11 @@ static void end_func(bparser *parser) proto->varinfo = be_vector_release(vm, &finfo->varvec); proto->nvarinfo = be_vector_count(&finfo->varvec); #endif - parser->finfo = parser->finfo->prev; + parser->finfo = parser->finfo->prev; /* restore previous `finfo` */ be_stackpop(vm, 2); /* pop upval and local */ } +/* is the next token a binary operator? If yes return the operator or `OP_NOT_BINARY` */ static btokentype get_binop(bparser *parser) { btokentype op = next_type(parser); @@ -318,6 +329,8 @@ static btokentype get_binop(bparser *parser) return OP_NOT_BINARY; } +/* is the next token a unary operator? If yes return the operator or `OP_NOT_BINARY` */ +/* operator 'negative' 'not' and 'flip' */ static btokentype get_unary_op(bparser *parser) { btokentype op = next_type(parser); @@ -327,6 +340,8 @@ static btokentype get_unary_op(bparser *parser) return OP_NOT_UNARY; } +/* is the next token an assignment operator? If yes return the operator or `OP_NOT_BINARY` */ +/* `=`, `+=`, ... `>>=` */ static btokentype get_assign_op(bparser *parser) { btokentype op = next_type(parser); @@ -336,6 +351,7 @@ static btokentype get_assign_op(bparser *parser) return OP_NOT_ASSIGN; } +/* Initialize bexpdesc structure with specific type and value as int */ static void init_exp(bexpdesc *e, exptype_t type, bint i) { e->type = (bbyte)type; @@ -346,6 +362,8 @@ static void init_exp(bexpdesc *e, exptype_t type, bint i) e->v.i = i; } +/* find local variable by name, starting at index `begin` */ +/* linear search, returns -1 if not found */ static int find_localvar(bfuncinfo *finfo, bstring *s, int begin) { int i, count = be_list_count(finfo->local); @@ -358,12 +376,22 @@ static int find_localvar(bfuncinfo *finfo, bstring *s, int begin) return -1; /* not found */ } +/* create a new local variable by name, or return the current register if already exists */ +/* returns the Reg number for the variable */ +/* If STRICT, we don't allow a var to hide a var from outer scope */ +/* We don't allow the same var to be defined twice in same scope */ static int new_localvar(bparser *parser, bstring *name) { bfuncinfo *finfo = parser->finfo; - int reg = find_localvar(finfo, name, finfo->binfo->nactlocals); + int reg = find_localvar(finfo, name, finfo->binfo->nactlocals); /* look if already exists skipping the local variables from upper blocks */ + /* 'strict': raise an exception if the local variable shadows another local variable */ if (reg == -1) { bvalue *var; + if (comp_is_strict(parser->vm)) { + if (find_localvar(finfo, name, 0) >= 0 && str(name)[0] != '.') { /* we do accept nested redifinition of internal variables starting with ':' */ + push_error(parser, "strict: redefinition of '%s' from outer scope", str(name)); + } + } reg = be_list_count(finfo->local); /* new local index */ var = be_list_push(parser->vm, finfo->local, NULL); var_setstr(var, name); @@ -371,10 +399,13 @@ static int new_localvar(bparser *parser, bstring *name) be_code_allocregs(finfo, 1); /* use a register */ } begin_varinfo(parser, name); + } else { + push_error(parser, "redefinition of '%s'", str(name)); } return reg; } +/* Find upval by name, if found return its index number, or -1 */ static int find_upval(bfuncinfo *finfo, bstring *s) { bvm *vm = finfo->lexer->vm; @@ -385,6 +416,8 @@ static int find_upval(bfuncinfo *finfo, bstring *s) return -1; } +/* Recursively search for upper blocks that are referenced in upvals */ +/* and mark them with `hasupval` */ static void mark_upval(bfuncinfo *finfo, int level) { bblockinfo *binfo = finfo->prev->binfo; @@ -413,12 +446,14 @@ static int new_upval(bvm *vm, bfuncinfo *finfo, bstring *name, bexpdesc *var) return index; } +/* create a new variable in currenr context as name, and create expdesc for it */ +/* If within a block, create as local, otherwise as global */ static void new_var(bparser *parser, bstring *name, bexpdesc *var) { bfuncinfo *finfo = parser->finfo; if (finfo->prev || finfo->binfo->prev || parser->islocal) { init_exp(var, ETLOCAL, 0); - var->v.idx = new_localvar(parser, name); + var->v.idx = new_localvar(parser, name); /* if local, contains the index in current local var list */ } else { init_exp(var, ETGLOBAL, 0); var->v.idx = be_global_new(parser->vm, name); @@ -465,6 +500,9 @@ static int singlevaraux(bvm *vm, bfuncinfo *finfo, bstring *s, bexpdesc *var) } } +/* get variable from next toden as name */ +/* and create an expdesc from it */ +/* can be new, global, named global, upval */ static void singlevar(bparser *parser, bexpdesc *var) { bexpdesc key; @@ -490,6 +528,10 @@ static void singlevar(bparser *parser, bexpdesc *var) } } +/* Parse function or method definition variable list */ +/* Create an implicit local variable for each argument starting at R0 */ +/* Update function proto argc to the expected number or arguments */ +/* Raise an exception if multiple arguments have the same name */ static void func_varlist(bparser *parser) { bexpdesc v; @@ -502,36 +544,36 @@ static void func_varlist(bparser *parser) str = next_token(parser).u.s; match_token(parser, TokenId); /* match and skip ID */ /* new local variable */ - if (find_localvar(parser->finfo, str, 0) == -1) { - new_var(parser, str, &v); - } else { - push_error(parser, "redefinition of '%s'", str(str)); - } + new_var(parser, str, &v); } } match_token(parser, OptRBK); /* skip ')' */ parser->finfo->proto->argc = parser->finfo->freereg; } +/* Parse a function includind arg list and body */ +/* Given name and type (function or method) */ +/* Returns `bproto` object */ static bproto* funcbody(bparser *parser, bstring *name, int type) { bfuncinfo finfo; bblockinfo binfo; /* '(' varlist ')' block 'end' */ - begin_func(parser, &finfo, &binfo); + begin_func(parser, &finfo, &binfo); /* init new function context */ finfo.proto->name = name; - if (type & FUNC_METHOD) { + if (type & FUNC_METHOD) { /* If method, add an implicit first argument `self` */ new_localvar(parser, parser_newstr(parser, "self")); } - func_varlist(parser); - stmtlist(parser); - end_func(parser); + func_varlist(parser); /* parse arg list */ + stmtlist(parser); /* parse statement without final `end` */ + end_func(parser); /* close function context */ match_token(parser, KeyEnd); /* skip 'end' */ - return finfo.proto; + return finfo.proto; /* return fully constructed `bproto` */ } -/* anonymous function */ +/* anonymous function, build `bproto` object with name `` */ +/* and build a expdesc for the bproto */ static void anon_func(bparser *parser, bexpdesc *e) { bproto *proto; @@ -559,11 +601,7 @@ static void lambda_varlist(bparser *parser) str = next_token(parser).u.s; match_token(parser, TokenId); /* match and skip ID */ /* new local variable */ - if (find_localvar(parser->finfo, str, 0) == -1) { - new_var(parser, str, &v); - } else { - push_error(parser, "redefinition of '%s'", str(str)); - } + new_var(parser, str, &v); } } match_token(parser, OptArrow); /* skip '->' */ @@ -590,6 +628,9 @@ static void lambda_expr(bparser *parser, bexpdesc *e) be_stackpop(parser->vm, 1); } +/* Instanciate a builtin type by name */ +/* Allocates a new register for the value, and call empty constructor */ +/* Is allocated as LOCAL and must be changed to REG when completed */ static void new_primtype(bparser *parser, const char *type, bexpdesc *e) { int idx; @@ -601,17 +642,19 @@ static void new_primtype(bparser *parser, const char *type, bexpdesc *e) init_exp(e, ETGLOBAL, idx); idx = be_code_nextreg(finfo, e); be_code_call(finfo, idx, 0); - e->type = ETLOCAL; + e->type = ETLOCAL; /* declare as local, will be changed to ETREG when completely initialized */ } +/* Parse next member within a list */ +/* `l` contains the current list. The expr is evaluated and added to the list */ static void list_nextmember(bparser *parser, bexpdesc *l) { bexpdesc e, v = *l; bfuncinfo *finfo = parser->finfo; expr(parser, &e); /* value */ - check_var(parser, &e); - be_code_binop(finfo, OptConnect, &v, &e, -1); - be_code_freeregs(finfo, 1); + check_var(parser, &e); /* check that we don´t have an unknown symbol */ + be_code_binop(finfo, OptConnect, &v, &e, -1); /* add it to list with CONNECT */ + be_code_freeregs(finfo, 1); /* since left arg is LOCAL, an ETREG was allocated. Free it */ } static void map_nextmember(bparser *parser, bexpdesc *l) @@ -619,25 +662,25 @@ static void map_nextmember(bparser *parser, bexpdesc *l) bexpdesc e, v = *l; bfuncinfo *finfo = parser->finfo; expr(parser, &e); /* key */ - check_var(parser, &e); - be_code_index(finfo, &v, &e); + check_var(parser, &e); /* check if value is valid */ + be_code_index(finfo, &v, &e); /* package as `v` as INDEX suffix for value `e` */ match_token(parser, OptColon); /* ':' */ - expr(parser, &e); /* value */ - check_var(parser, &e); - be_code_setvar(finfo, &v, &e); + expr(parser, &e); /* value in `e` */ + check_var(parser, &e); /* check if value is correct */ + be_code_setvar(finfo, &v, &e); /* set suffi INDEX value to e */ } static void list_expr(bparser *parser, bexpdesc *e) { /* '[' {expr ','} [expr] ']' */ - new_primtype(parser, "list", e); /* new list */ + new_primtype(parser, "list", e); /* new list, created as LOCAL first */ while (next_type(parser) != OptRSB) { list_nextmember(parser, e); if (!match_skip(parser, OptComma)) { /* ',' */ break; } } - e->type = ETREG; + e->type = ETREG; /* then turned to REG */ match_token(parser, OptRSB); /* skip ']' */ } @@ -655,14 +698,16 @@ static void map_expr(bparser *parser, bexpdesc *e) match_token(parser, OptRBR); /* skip '}' */ } +/* push each argument as new reg and return number of args */ +/* TODO `e` is ignored by caller */ static int exprlist(bparser *parser, bexpdesc *e) { bfuncinfo *finfo = parser->finfo; int n = 1; /* expr { ',' expr } */ - expr(parser, e); - check_var(parser, e); - be_code_nextreg(finfo, e); + expr(parser, e); /* parse expr */ + check_var(parser, e); /* check if valid */ + be_code_nextreg(finfo, e); /* move result to next reg */ while (match_skip(parser, OptComma)) { /* ',' */ expr(parser, e); check_var(parser, e); @@ -672,6 +717,9 @@ static int exprlist(bparser *parser, bexpdesc *e) return n; } +/* parse call to method or function */ +/* `e` can be a member (method) or a register */ +/* On return, `e` is ETREG to the result of the call */ static void call_expr(bparser *parser, bexpdesc *e) { bexpdesc args; @@ -685,14 +733,15 @@ static void call_expr(bparser *parser, bexpdesc *e) if (ismember) { base = be_code_getmethod(finfo, e); } else { - base = be_code_nextreg(finfo, e); + base = be_code_nextreg(finfo, e); /* allocate a new base reg if not at top already */ } + /* base is always taken at top of freereg and allocates 1 reg for function and 2 regs for method */ scan_next_token(parser); /* skip '(' */ - if (next_type(parser) != OptRBK) { - argc = exprlist(parser, &args); + if (next_type(parser) != OptRBK) { /* if arg list is not empty */ + argc = exprlist(parser, &args); /* push each argument as new reg and return number of args */ } match_token(parser, OptRBK); /* skip ')' */ - argc += ismember; + argc += ismember; /* if method there is an additional implicit arg */ be_code_call(finfo, base, argc); if (e->type != ETREG) { e->type = ETREG; @@ -700,6 +749,8 @@ static void call_expr(bparser *parser, bexpdesc *e) } } +/* Parse member expression */ +/* Generates an ETMEMBER object that is materialized later into GETMBR, GETMET or SETMBR */ static void member_expr(bparser *parser, bexpdesc *e) { bstring *str; @@ -841,15 +892,32 @@ static void compound_assign(bparser *parser, int op, bexpdesc *l, bexpdesc *r) } } +/* check if we need to create a new local variable with this name to be assigned to */ +/* Returns true if it´s a new local variable */ +/* A new implicit local variable is created if no global has the same name (excluding builtins) */ +/* This means that you can override a builtin silently */ +/* This also means that a function cannot create a global, they must preexist or create with `global` module */ +/* TODO add warning in strict mode */ static int check_newvar(bparser *parser, bexpdesc *e) { if (e->type == ETGLOBAL) { if (e->v.idx < be_builtin_count(parser->vm)) { e->v.s = be_builtin_name(parser->vm, e->v.idx); + if (comp_is_strict(parser->vm)) { + push_error(parser, "strict: redefinition of builtin '%s'", + str(e->v.s)); + } return btrue; } return bfalse; } + if (comp_is_strict(parser->vm)) { + bfuncinfo *finfo = parser->finfo; + if ((e->type == ETVOID) && (finfo->prev || finfo->binfo->prev || parser->islocal)) { + push_error(parser, "strict: no global '%s', did you mean 'var %s'?", + str(e->v.s), str(e->v.s)); + } + } return e->type == ETVOID; } @@ -915,39 +983,42 @@ static void cond_expr(bparser *parser, bexpdesc *e) static void sub_expr(bparser *parser, bexpdesc *e, int prio) { bfuncinfo *finfo = parser->finfo; - btokentype op = get_unary_op(parser); - if (op != OP_NOT_UNARY) { + btokentype op = get_unary_op(parser); /* check if first token in unary op */ + if (op != OP_NOT_UNARY) { /* unary op found */ int line, res; - scan_next_token(parser); - line = parser->lexer.linenumber; - sub_expr(parser, e, UNARY_OP_PRIO); - check_var(parser, e); - res = be_code_unop(finfo, op, e); + scan_next_token(parser); /* move to next token */ + line = parser->lexer.linenumber; /* remember line number for error reporting */ + sub_expr(parser, e, UNARY_OP_PRIO); /* parse subexpr with new prio */ + check_var(parser, e); /* check that the value is ok */ + res = be_code_unop(finfo, op, e); /* apply unary op with optimizations if the token is a value */ if (res) { /* encode unary op */ parser->lexer.linenumber = line; push_error(parser, "wrong type argument to unary '%s'", res == 1 ? "negative" : "bit-flip"); } } else { - suffix_expr(parser, e); + suffix_expr(parser, e); /* parse left part of binop */ } - op = get_binop(parser); - while (op != OP_NOT_BINARY && prio > binary_op_prio(op)) { + op = get_binop(parser); /* check if binop */ + while (op != OP_NOT_BINARY && prio > binary_op_prio(op)) { /* is binop applicable */ bexpdesc e2; - check_var(parser, e); - scan_next_token(parser); + check_var(parser, e); /* check that left part is valid */ + scan_next_token(parser); /* move to next token */ be_code_prebinop(finfo, op, e); /* and or */ init_exp(&e2, ETVOID, 0); - sub_expr(parser, &e2, binary_op_prio(op)); - check_var(parser, &e2); + sub_expr(parser, &e2, binary_op_prio(op)); /* parse right side */ + check_var(parser, &e2); /* check if valid */ be_code_binop(finfo, op, e, &e2, -1); /* encode binary op */ - op = get_binop(parser); + op = get_binop(parser); /* is there a following binop? */ } if (prio == ASSIGN_OP_PRIO) { cond_expr(parser, e); } } +/* Parse new expression and return value in `e` (overwritten) */ +/* Initializes an empty expdes and parse subexpr */ +/* Always allocates a new temp register at top of freereg */ static void expr(bparser *parser, bexpdesc *e) { init_exp(e, ETVOID, 0); diff --git a/lib/libesp32/Berry/src/be_parser.h b/lib/libesp32/Berry/src/be_parser.h index 7d06fdc23..5b5510f2c 100644 --- a/lib/libesp32/Berry/src/be_parser.h +++ b/lib/libesp32/Berry/src/be_parser.h @@ -12,7 +12,7 @@ #include "be_string.h" typedef enum { - ETVOID, + ETVOID, /* unknown (new variable or error) */ ETNIL, ETBOOL, ETREAL, @@ -20,13 +20,13 @@ typedef enum { ETSTRING, ETPROTO, ETCONST, - ETLOCAL, - ETGLOBAL, + ETLOCAL, /* local variable, allocated until end of scope */ + ETGLOBAL, /* global by index number */ ETUPVAL, - ETMEMBER, - ETINDEX, - ETREG, - ETNGLOBAL + ETMEMBER, /* member accessor (by name) */ + ETINDEX, /* index accessor (ex array index) */ + ETREG, /* temporary register, can be freed if top of stack */ + ETNGLOBAL /* named global */ } exptype_t; typedef struct { diff --git a/lib/libesp32/Berry/src/be_strictlib.c b/lib/libesp32/Berry/src/be_strictlib.c new file mode 100644 index 000000000..b40329886 --- /dev/null +++ b/lib/libesp32/Berry/src/be_strictlib.c @@ -0,0 +1,40 @@ +/******************************************************************** +** Copyright (c) 2018-2021 Guan Wenliang & Stephan Hadinger +** This file is part of the Berry default interpreter. +** skiars@qq.com, https://github.com/Skiars/berry +** See Copyright Notice in the LICENSE file or at +** https://github.com/Skiars/berry/blob/master/LICENSE +********************************************************************/ +#include "be_object.h" +#include "be_module.h" +#include "be_string.h" +#include "be_vector.h" +#include "be_class.h" +#include "be_debug.h" +#include "be_map.h" +#include "be_vm.h" + +#if BE_USE_STRICT_MODULE + +static int m_init(bvm *vm) +{ + comp_set_strict(vm); /* enable compiler strict mode */ + be_return_nil(vm); +} + +#if !BE_USE_PRECOMPILED_OBJECT +be_native_module_attr_table(strict) { + be_native_module_function("init", m_init), +}; + +be_define_native_module(strict, NULL); +#else +/* @const_object_info_begin +module strict (scope: strict, depend: BE_USE_STRICT_MODULE) { + init, func(m_init) +} +@const_object_info_end */ +#include "../generate/be_fixed_strict.h" +#endif + +#endif /* BE_USE_STRICT_MODULE */ diff --git a/lib/libesp32/Berry/src/be_vm.c b/lib/libesp32/Berry/src/be_vm.c index ec30e8ce4..359aaa2d5 100644 --- a/lib/libesp32/Berry/src/be_vm.c +++ b/lib/libesp32/Berry/src/be_vm.c @@ -28,14 +28,14 @@ #define vm_error(vm, except, ...) \ be_raise(vm, except, be_pushfstring(vm, __VA_ARGS__)) -#define RA() (reg + IGET_RA(ins)) -#define RKB() ((isKB(ins) ? ktab : reg) + KR2idx(IGET_RKB(ins))) -#define RKC() ((isKC(ins) ? ktab : reg) + KR2idx(IGET_RKC(ins))) +#define RA() (reg + IGET_RA(ins)) /* Get value of register A */ +#define RKB() ((isKB(ins) ? ktab : reg) + KR2idx(IGET_RKB(ins))) /* Get value of register or constant B */ +#define RKC() ((isKC(ins) ? ktab : reg) + KR2idx(IGET_RKC(ins))) /* Get value of register or constant C */ -#define var2cl(_v) cast(bclosure*, var_toobj(_v)) -#define var2real(_v) (var_isreal(_v) ? (_v)->v.r : (breal)(_v)->v.i) -#define val2bool(v) ((v) ? btrue : bfalse) -#define ibinop(op, a, b) ((a)->v.i op (b)->v.i) +#define var2cl(_v) cast(bclosure*, var_toobj(_v)) /* cast var to closure */ +#define var2real(_v) (var_isreal(_v) ? (_v)->v.r : (breal)(_v)->v.i) /* get var as real or convert to real if integer */ +#define val2bool(v) ((v) ? btrue : bfalse) /* get var as bool (trur if non zero) */ +#define ibinop(op, a, b) ((a)->v.i op (b)->v.i) /* apply binary operator to both arguments as integers */ #if BE_USE_DEBUG_HOOK #define DEBUG_HOOK() \ @@ -149,6 +149,8 @@ static void call_error(bvm *vm, bvalue *v) "'%s' value is not callable", be_vtype2str(v)); } +/* Check that the return value is bool or raise an exception */ +/* `obj` and `method` are only passed for error reporting */ static void check_bool(bvm *vm, binstance *obj, const char *method) { if (!var_isbool(vm->top)) { @@ -182,25 +184,29 @@ static void do_linehook(bvm *vm) } #endif +/* Prepare the stack for the function/method call */ +/* `func` is a pointer to the function/method on the stack, it contains the closure before call and the result after the call */ +/* `nstackˋ is the stack depth used by the function (determined by compiler), we add BE_STACK_FREE_MIN as a safety margin */ static void precall(bvm *vm, bvalue *func, int nstack, int mode) { bcallframe *cf; - int expan = nstack + BE_STACK_FREE_MIN; - if (vm->stacktop < func + expan) { - size_t fpos = func - vm->stack; - be_stack_expansion(vm, expan); - func = vm->stack + fpos; + int expan = nstack + BE_STACK_FREE_MIN; /* `expan` is the minimum required space on the stack */ + if (vm->stacktop < func + expan) { /* do we have too little space left on the stack? */ + size_t fpos = func - vm->stack; /* compute offset of `func` from base stack, in case stack is reallocated and base address changes */ + be_stack_expansion(vm, expan); /* expand stack (vector object), warning stack address changes */ + func = vm->stack + fpos; /* recompute `func` address with new stack address */ } - be_stack_push(vm, &vm->callstack, NULL); - cf = be_stack_top(&vm->callstack); + be_stack_push(vm, &vm->callstack, NULL); /* push a NULL value on callstack */ + cf = be_stack_top(&vm->callstack); /* get address of new callframe at top of callstack */ cf->func = func - mode; - cf->top = vm->top; - cf->reg = vm->reg; - vm->reg = func + 1; - vm->top = vm->reg + nstack; - vm->cf = cf; + cf->top = vm->top; /* save previous stack top */ + cf->reg = vm->reg; /* save previous stack base */ + vm->reg = func + 1; /* new stack base is right after function */ + vm->top = vm->reg + nstack; /* new stack top is above the registers used by the function, so we don´t mess with them */ + vm->cf = cf; /* set new current callframe */ } +/* Prepare call of closure, setting the instruction pointer (ip) */ static void push_closure(bvm *vm, bvalue *func, int nstack, int mode) { bclosure *cl = var_toobj(func); @@ -469,9 +475,9 @@ static void vm_exec(bvm *vm) vm->cf->status |= BASE_FRAME; newframe: /* a new call frame */ be_assert(var_isclosure(vm->cf->func)); - clos = var_toobj(vm->cf->func); - ktab = clos->proto->ktab; - reg = vm->reg; + clos = var_toobj(vm->cf->func); /* `clos` is the current function/closure */ + ktab = clos->proto->ktab; /* `ktab` is the current constant table */ + reg = vm->reg; /* `reg` is the current stack base for the callframe */ vm_exec_loop() { opcase(LDNIL): { var_setnil(RA()); @@ -1019,7 +1025,7 @@ newframe: /* a new call frame */ dispatch(); } opcase(RAISE): { - if (IGET_RA(ins) < 2) { + if (IGET_RA(ins) < 2) { /* A==2 means no arguments are passed to RAISE, i.e. rethrow with current exception */ bvalue *top = vm->top; top[0] = *RKB(); /* push the exception value to top */ if (IGET_RA(ins)) { /* has exception argument? */ @@ -1046,8 +1052,8 @@ newframe: /* a new call frame */ dispatch(); } opcase(CALL): { - bvalue *var = RA(); - int mode = 0, argc = IGET_RKB(ins); + bvalue *var = RA(); /* `var` is the register for the call followed by arguments */ + int mode = 0, argc = IGET_RKB(ins); /* B contains number of arguments pushed on stack */ recall: /* goto: instantiation class and call constructor */ switch (var_type(var)) { case NOT_METHOD: @@ -1055,8 +1061,8 @@ newframe: /* a new call frame */ ++var, --argc, mode = 1; goto recall; case BE_CLASS: - if (be_class_newobj(vm, var_toobj(var), var, ++argc, mode)) { - reg = vm->reg + mode; + if (be_class_newobj(vm, var_toobj(var), var, ++argc, mode)) { /* instanciate object and find constructor */ + reg = vm->reg + mode; /* constructor found */ mode = 0; var = RA() + 1; /* to next register */ goto recall; /* call constructor */ @@ -1072,15 +1078,15 @@ newframe: /* a new call frame */ } case BE_CLOSURE: { bvalue *v, *end; - bproto *proto = var2cl(var)->proto; - push_closure(vm, var, proto->nstack, mode); - reg = vm->reg; - v = reg + argc; - end = reg + proto->argc; - for (; v < end; ++v) { + bproto *proto = var2cl(var)->proto; /* get proto for closure */ + push_closure(vm, var, proto->nstack, mode); /* prepare stack for closure */ + reg = vm->reg; /* `reg` has changed, now new base register */ + v = reg + argc; /* end of provided arguments */ + end = reg + proto->argc; /* end of expected arguments */ + for (; v < end; ++v) { /* set all not provided arguments to nil */ var_setnil(v); } - goto newframe; + goto newframe; /* continue execution of the closure */ } case BE_NTVCLOS: { bntvclos *f = var_toobj(var); diff --git a/lib/libesp32/Berry/src/be_vm.h b/lib/libesp32/Berry/src/be_vm.h index 86926d421..627c8fcaf 100644 --- a/lib/libesp32/Berry/src/be_vm.h +++ b/lib/libesp32/Berry/src/be_vm.h @@ -14,9 +14,14 @@ #define comp_set_named_gbl(vm) ((vm)->compopt |= (1<compopt &= ~(1<compopt & (1<compopt |= (1<compopt &= ~(1<") - - home_btn = lv_btn(scr) - home_btn.set_pos(120,vres-40) - home_btn.set_size(80, 30) - home_btn.add_style(lv.OBJ_PART_MAIN, tastyle) - home_label = lv_label(home_btn) - home_label.set_text(lv.SYMBOL_OK) - - btn.del() - - - - - - logo.set_src("A:/Sunrise.bin") - logo.align(0,0,0,0) - - - - btn.set_height(120) - label.del() - logo = lv.img_create(btn) - logo.set_tasmota_logo() - - logo.set_zoom(384) - logo.set_angle(400) - - logo.set_style_local_image_recolor_opa(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, 255) - logo.set_style_local_image_recolor(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(lv.BLUE)) - - - #- logo on splash screen -# - btn.del() - logo = lv.img_create(lv.scr_act()) - logo.set_tasmota_logo() - logo.set_style_local_image_recolor_opa(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, 255) - logo.set_style_local_image_recolor(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(lv.WHITE)) - logo.align(0,0,0,0) - logo.set_zoom(400) - - - #- anil -# - logo.set_zoom(384) - - angle = 0 - do_rotate = nil - do_rotate = def () angle += 100 logo.set_angle(angle) tasmota.timer(100, do_rotate) end - - t48 = lv.tasmota_font(48) - label.set_text("A") - if t48 != nil label.set_style_local_text_font(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, t48) end - btn.set_height(120) - - - f10 = lv.montserrat_font(10) - if f10 != nil label.set_style_local_text_font(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, f10) end - - #- try zooming an image -# - img = lv.img_create(btn) - label.del() - img.set_src(lv.SYMBOL_OK) - - - -#- - f8 = lv.montserrat_font(8) - if f8 != nil label.set_style_local_text_font(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, f8) end --# -#- -f14 = lv.montserrat_font(14) -f28 = lv.montserrat_font(28) -btn.set_height(80) -btn.set_style_local_bg_color(0, lv.STATE_DEFAULT, lv_color(0xFFEEFF)) -label.set_style_local_text_font(0, lv.STATE_DEFAULT, f28) - - -scr = lv.scr_act() -scr.set_style_local_bg_color(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0x400000)) -scr.set_style_local_value_font(lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, f28) - -label.set_style_local_value_font(lv.BTN_PART_MAIN, lv.STATE_DEFAULT, f28) --# - - #- lv_obj_set_style_local_bg_color(lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); -# - #- lv.obj_set_style_local_bg_color(lv.scr_act(), lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(0x00FF00)) -# - - #- lv_obj_set_style_local_bg_opa( lv_scr_act(), LV_OBJ_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER); -# - - #- - lv.demo() - -# -else - print('ILI9341 pins are not configured') -end - -#- -lv.obj_set_style_local_bg_color(lv.scr_act(), lv.OBJ_PART_MAIN, lv.STATE_DEFAULT, lv_color(lv.BLACK)) - -gauge = lv.gauge_create(lv.scr_act()) -gauge.set_size(150,150) -co = lv.cpicker_create(lv.scr_act()) -co.set_size(150,150) -co.set_pos(170,20) -k = lv.keyboard_create(lv.scr_act()) - -cal = lv.calendar_create(lv.scr_act()) -cal.del() -c = lv.checkbox_create(lv.scr_act()) -c.del() -c = lv.chart_create(lv.scr_act()) -c.del() - -co.del() - -k = lv.keyboard_create(lv.scr_act()) -k.del() - -led = lv.led_create(lv.scr_act()) -led.del() - -m = lv.msgbox_create(lv.scr_act()) -m.del() - -# menu item -rol = lv.roller_create(lv.scr_act()) -rol.del() -sl = lv.slider_create(lv.scr_act()) -sl.del() - -sp = lv.spinner_create(lv.scr_act()) -sp.del() - -w = lv.win_create(lv.scr_act()) -w.del() - -t = lv.textarea_create(lv.scr_act()) -t.set_text("Tasmota") -t.del() - --# \ No newline at end of file diff --git a/tasmota/berry/examples/watch_renaissance/autoexec.be b/tasmota/berry/examples/watch_renaissance/autoexec.be index 072d5d151..37adda377 100644 --- a/tasmota/berry/examples/watch_renaissance/autoexec.be +++ b/tasmota/berry/examples/watch_renaissance/autoexec.be @@ -38,9 +38,9 @@ ren_sec.set_pos(110,10) prev_day = -1 def set_watch() - now = tasmota.rtc() - time_raw = now['local'] + now['timezone'] * 60 - time = tasmota.time_dump(time_raw) + var now = tasmota.rtc() + var time_raw = now['local'] + now['timezone'] * 60 + var time = tasmota.time_dump(time_raw) # set second ren_sec.set_angle(60 * time['sec']) # set minutes diff --git a/tasmota/berry/modules/partition.be b/tasmota/berry/modules/partition.be index 364ad636d..db9773424 100644 --- a/tasmota/berry/modules/partition.be +++ b/tasmota/berry/modules/partition.be @@ -44,7 +44,7 @@ def crc32_create_table() return a end -crc32_table = crc32_create_table() +var crc32_table = crc32_create_table() def crc32_update(buf, crc) crc ^= 0xffffffff @@ -137,7 +137,6 @@ class Partition_info # print("Segment count", seg_count) var seg_offset = addr + 0x20 # sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) = 24 + 8 - var seg_size = 0 for seg_num:0..seg_count-1 # print(string.format("Reading 0x%08X", seg_offset)) @@ -375,7 +374,6 @@ class Partition #- parse the raw bytes to a structured list of partition items -# def parse() - var i 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) @@ -754,7 +752,7 @@ class Partition_manager : Driver end #- create and register driver in Tasmota -# -partition_manager = Partition_manager() +var partition_manager = Partition_manager() tasmota.add_driver(partition_manager) ## can be removed if put in 'autoexec.bat' partition_manager.web_add_handler() @@ -771,4 +769,4 @@ import partition p = partition.Partition() print(p) --# \ No newline at end of file +-# diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino index 47f31c34a..213645f1f 100644 --- a/tasmota/xdrv_52_9_berry.ino +++ b/tasmota/xdrv_52_9_berry.ino @@ -277,7 +277,8 @@ void BerryInit(void) { do { berry.vm = be_vm_new(); /* create a virtual machine instance */ be_set_obs_hook(berry.vm, &BerryObservability); - comp_set_named_gbl(berry.vm); + comp_set_named_gbl(berry.vm); /* Enable named globals in Berry compiler */ + comp_set_strict(berry.vm); /* Enable strict mode in Berry compiler */ be_load_custom_libs(berry.vm); // Register functions From 00f3c3ecd22b09b8352c226d36e862fd308ce75b Mon Sep 17 00:00:00 2001 From: Sillyfrog Date: Tue, 17 Aug 2021 09:16:30 +1000 Subject: [PATCH 11/19] PIO tools overrides using .ini file settings --- pio-tools/gzip-firmware.py | 4 +-- pio-tools/tasmotapiolib.py | 66 +++++++++++++++++++++++++++++--------- 2 files changed, 52 insertions(+), 18 deletions(-) diff --git a/pio-tools/gzip-firmware.py b/pio-tools/gzip-firmware.py index 5262f037d..080448a30 100644 --- a/pio-tools/gzip-firmware.py +++ b/pio-tools/gzip-firmware.py @@ -28,7 +28,7 @@ def map_gzip(source, target, env): map_file.unlink() -if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_MAP_GZ): +if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_MAP_GZ, env): env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [map_gzip]) # gzip only for ESP8266 @@ -66,5 +66,5 @@ if env["PIOPLATFORM"] != "espressif32": ) ) - if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_BIN_GZ): + if not tasmotapiolib.is_env_set(tasmotapiolib.DISABLE_BIN_GZ, env): env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", [bin_gzip]) diff --git a/pio-tools/tasmotapiolib.py b/pio-tools/tasmotapiolib.py index 2d6fe22e9..866be0336 100644 --- a/pio-tools/tasmotapiolib.py +++ b/pio-tools/tasmotapiolib.py @@ -1,19 +1,43 @@ -"""Supporting library for pio-tools scripts""" +"""Supporting library for pio-tools scripts + +This also provides functions to allow overrides of some settings, see the available +overides below. + +Overrides can be set using environment variables or .ini file settings for controlling +build output file locations and formats. + +To set a value using an environment variable, prefix the value with "TASMOTA_" and +ensure the entire value is UPPER CASE, for example in bash, it would be: + + export TASMOTA_DISABLE_MAP_GZ=1 + +To set a value in your .ini file, such as in platformio_override.ini, create a +[tasmota] section, and put the key ensuring it is all lower case, for example: + +[tasmota] +disable_map_gz = 1 +map_dir = /tmp/map_files/ + +Values in .ini files override environment variables + +""" import pathlib import os -# Constants for environment variables that can be set to control build output file -# locations and formats - +# === AVAILABLE OVERRIDES === # if set to 1, will not gzip esp8266 bin files -DISABLE_BIN_GZ = "TASMOTA_DISABLE_BIN_GZ" -# if set, an alternative ptah to put generated .bin files -BIN_DIR = "TASMOTA_BIN_DIR" +DISABLE_BIN_GZ = "disable_bin_gz" +# if set, an alternative ptah to put generated .bin files, relative to project directory +BIN_DIR = "bin_dir" # if set to 1, will not gzip generated .map files -DISABLE_MAP_GZ = "TASMOTA_DISABLE_MAP_GZ" -# if set, an alternative path to put generated .map files -MAP_DIR = "TASMOTA_MAP_DIR" +DISABLE_MAP_GZ = "disable_map_gz" +# if set, an alternative path to put generated .map files, relative to project directory +MAP_DIR = "map_dir" +# === END AVAILABLE OVERRIDES === + + +# This is the default output directory OUTPUT_DIR = pathlib.Path("build_output") @@ -26,7 +50,7 @@ def get_final_bin_path(env) -> pathlib.Path: """Path to the final destination for the .bin If the parent directory does not exist, it will be created""" - firmware_dir = get_override_path(BIN_DIR) + firmware_dir = get_override_path(BIN_DIR, env) firmware_dir.mkdir(parents=True, exist_ok=True) return firmware_dir / "{}.bin".format(get_variant(env)) @@ -35,7 +59,7 @@ def get_final_map_path(env) -> pathlib.Path: """Path to the final destination for the .map file If the parent directory does not exist, it will be created""" - map_dir = get_override_path(MAP_DIR) + map_dir = get_override_path(MAP_DIR, env) map_dir.mkdir(parents=True, exist_ok=True) return map_dir / "{}.map".format(get_variant(env)) @@ -62,13 +86,23 @@ def get_source_map_path(env) -> pathlib.Path: raise FileNotFoundError -def get_override_path(pathtype) -> pathlib.Path: +def get_tasmota_override_option(name: str, env): + """Gets a set override option from a .ini or env variable, None if no match""" + config = env.GetProjectConfig() + override = config.get("tasmota", name.lower(), None) + if override is not None: + return override + # Return env if available + return os.environ.get("TASMOTA_" + name.upper()) + + +def get_override_path(pathtype: str, env) -> pathlib.Path: """ Returns a path to a givens override path if set, otherwise OUTPUT_DIR is used pathtype must be either MAP_DIR or BIN_DIR. """ - override = os.environ.get(pathtype) + override = get_tasmota_override_option(pathtype, env) if override: return pathlib.Path(override) if pathtype == BIN_DIR: @@ -78,9 +112,9 @@ def get_override_path(pathtype) -> pathlib.Path: raise ValueError -def is_env_set(name: str): +def is_env_set(name: str, env): """True if the enviornment variable is set to `1`""" - val = os.environ.get(name.upper()) + val = get_tasmota_override_option(name, env) if val: val = val.strip() return val == "1" From aa15e658fa1ef8f42dc725c6a27f5d2e0dc2815d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 17 Aug 2021 15:51:45 +0200 Subject: [PATCH 12/19] Options for map and firmware output --- platformio_tasmota_cenv_sample.ini | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 4b47e9383..05f221c56 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -16,6 +16,17 @@ build_flags = ${env.build_flags} -D PIO_FRAMEWORK_ARDUINO_MMU_CACHE16_IRAM48_SECHEAP_SHARED -Wno-switch-unreachable +; Settings in [tasmota] do NOT affect firmware building +[tasmota] +; Uncomment next line if you do NOT want gzipped map file(s) +;disable_map_gz = 1 +; Uncomment and specify a folder where to place the map file(s) (default set to folder build_output) +;map_dir = /tmp/map_files/ +; Uncomment next line if you do NOT want additionally gzipped firmware file(s) +;disable_bin_gz = 1 +; Uncomment and specify a folder where to place the firmware file(s) (default set to folder build_output) +;bin_dir = /tmp/bin_files/ + [env:tasmota-rangeextender] build_flags = ${env.build_flags} -D FIRMWARE_RANGE_EXTENDER From 307f140a81bb377dfb5b9cd8ccc65afa8bf21cde Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 17 Aug 2021 17:10:48 +0200 Subject: [PATCH 13/19] Fixed PWM5 on ESP32C3 --- CHANGELOG.md | 3 +++ .../src/esp8266toEsp32.h | 19 ++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c8a07150..baddf5d75 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ All notable changes to this project will be documented in this file. ### Changed - Berry now compiling in ``strict`` mode to catch more bugs +### Fixed +- Fixed PWM5 on ESP32C3 + ## [9.5.0.5] 20210815 ### Added - Inital support for Wi-Fi extender (#12784) diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index 2555b0808..40abad981 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -32,12 +32,21 @@ * ESP32 analogWrite emulation support \*********************************************************************************************/ -#define PWM_SUPPORTED_CHANNELS 8 -#define PWM_CHANNEL_OFFSET 2 // Webcam uses channel 0, so we offset standard PWM +#if CONFIG_IDF_TARGET_ESP32C3 + #define PWM_SUPPORTED_CHANNELS 6 + #define PWM_CHANNEL_OFFSET 1 // Webcam uses channel 0, so we offset standard PWM -uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99, 99, 99 }; -uint32_t _pwm_frequency = 977; // Default 977Hz -uint8_t _pwm_bit_num = 10; // Default 1023 + uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99 }; + uint32_t _pwm_frequency = 977; // Default 977Hz + uint8_t _pwm_bit_num = 10; // Default 1023 +#else // other ESP32 + #define PWM_SUPPORTED_CHANNELS 8 + #define PWM_CHANNEL_OFFSET 2 // Webcam uses channel 0, so we offset standard PWM + + uint8_t _pwm_channel[PWM_SUPPORTED_CHANNELS] = { 99, 99, 99, 99, 99, 99, 99, 99 }; + uint32_t _pwm_frequency = 977; // Default 977Hz + uint8_t _pwm_bit_num = 10; // Default 1023 +#endif // CONFIG_IDF_TARGET_ESP32C3 vs ESP32 inline uint32_t _analog_pin2chan(uint32_t pin) { for (uint32_t channel = 0; channel < PWM_SUPPORTED_CHANNELS; channel++) { From fbf8ccc8cf9925f1a9d60171d425d70fcb7de12d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 17 Aug 2021 18:09:57 +0200 Subject: [PATCH 14/19] add map.gz --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 53c8da544..2dbf50516 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,7 @@ tasmota/tasmota.ino.cpp tasmota*.bin tasmota*.bin.gz tasmota*.map +tasmota*.map.gz platformio_override.ini platformio_tasmota_cenv.ini From 079cd54088506c8e9a7dd14401d6883f3cc59bff Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:23:49 -0300 Subject: [PATCH 15/19] Moved HTTP Referer Loglevel from 3 to 2 --- tasmota/xdrv_01_webserver.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 04a403b3f..e528f64d6 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -666,7 +666,7 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true) return true; } } - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Referer denied")); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP "Referer denied")); return false; } else { return true; From cbab3bdfb073d0405302cdf65d17cf47c8c2bda6 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:45:30 -0300 Subject: [PATCH 16/19] http referer error message --- tasmota/xdrv_01_webserver.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index e528f64d6..929ccbde0 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -666,7 +666,7 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true) return true; } } - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP "Referer denied")); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP "HTP: Referer denied. Use 'SO128 1' for HTTP API commands. 'Webpassword' is recommended.")); return false; } else { return true; From b50775bcf92df1f13eaee168f080b08fb2e70f39 Mon Sep 17 00:00:00 2001 From: Adrian Scillato <35405447+ascillato@users.noreply.github.com> Date: Tue, 17 Aug 2021 13:48:41 -0300 Subject: [PATCH 17/19] http referer error message --- tasmota/xdrv_01_webserver.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/xdrv_01_webserver.ino b/tasmota/xdrv_01_webserver.ino index 929ccbde0..27f8bd981 100644 --- a/tasmota/xdrv_01_webserver.ino +++ b/tasmota/xdrv_01_webserver.ino @@ -666,7 +666,7 @@ bool HttpCheckPriviledgedAccess(bool autorequestauth = true) return true; } } - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP "HTP: Referer denied. Use 'SO128 1' for HTTP API commands. 'Webpassword' is recommended.")); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_HTTP "Referer denied. Use 'SO128 1' for HTTP API commands. 'Webpassword' is recommended.")); return false; } else { return true; From d4085bb063341f959b4b2e26840938a575a73b30 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Tue, 17 Aug 2021 19:17:58 +0200 Subject: [PATCH 18/19] Berry add base64 to bytes --- lib/libesp32/Berry/generate/be_const_strtab.h | 1286 +++++------ .../Berry/generate/be_const_strtab_def.h | 1885 +++++++++-------- .../Berry/generate/be_fixed_be_class_bytes.h | 46 +- lib/libesp32/Berry/src/be_byteslib.c | 263 ++- 4 files changed, 1873 insertions(+), 1607 deletions(-) diff --git a/lib/libesp32/Berry/generate/be_const_strtab.h b/lib/libesp32/Berry/generate/be_const_strtab.h index c4a915d01..7c3ca35d0 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab.h +++ b/lib/libesp32/Berry/generate/be_const_strtab.h @@ -1,653 +1,655 @@ -extern const bcstring be_const_str_OPTION_A; -extern const bcstring be_const_str_pin; -extern const bcstring be_const_str_BACKLIGHT; -extern const bcstring be_const_str_HIGH; -extern const bcstring be_const_str_SYMBOL_IMAGE; -extern const bcstring be_const_str_content_stop; -extern const bcstring be_const_str_int; -extern const bcstring be_const_str_push; -extern const bcstring be_const_str_SR04_TRIG; -extern const bcstring be_const_str_VL53L0X_XSHUT1; -extern const bcstring be_const_str_millis; -extern const bcstring be_const_str_LE01MR_RX; -extern const bcstring be_const_str_lv_indev; -extern const bcstring be_const_str_RC522_CS; -extern const bcstring be_const_str_SYMBOL_REFRESH; -extern const bcstring be_const_str_redirect; -extern const bcstring be_const_str_response_append; -extern const bcstring be_const_str_else; -extern const bcstring be_const_str_ADE7953_IRQ; -extern const bcstring be_const_str_SWT1; -extern const bcstring be_const_str_SYMBOL_BLUETOOTH; -extern const bcstring be_const_str__get_cb; -extern const bcstring be_const_str_SSPI_MISO; -extern const bcstring be_const_str_SYMBOL_PREV; -extern const bcstring be_const_str_KEY1_TC; -extern const bcstring be_const_str_ADC_BUTTON; -extern const bcstring be_const_str_lv_table; -extern const bcstring be_const_str_SM16716_DAT; -extern const bcstring be_const_str_SYMBOL_BACKSPACE; -extern const bcstring be_const_str_TX2X_TXD_BLACK; -extern const bcstring be_const_str_CSE7761_TX; -extern const bcstring be_const_str_OUTPUT_HI; -extern const bcstring be_const_str_SYMBOL_DRIVE; -extern const bcstring be_const_str_lv_tileview; -extern const bcstring be_const_str_read13; -extern const bcstring be_const_str_EPAPER29_CS; -extern const bcstring be_const_str_write; -extern const bcstring be_const_str_opt_connect; -extern const bcstring be_const_str_; -extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; -extern const bcstring be_const_str_KEY1_INV; -extern const bcstring be_const_str_SSD1331_CS; -extern const bcstring be_const_str_TASMOTACLIENT_RST; -extern const bcstring be_const_str_add_cmd; -extern const bcstring be_const_str_OLED_RESET; -extern const bcstring be_const_str_SBR_TX; -extern const bcstring be_const_str_pin_mode; -extern const bcstring be_const_str_HRE_CLOCK; -extern const bcstring be_const_str_MAX31855CS; -extern const bcstring be_const_str_P9813_CLK; -extern const bcstring be_const_str_SYMBOL_WARNING; -extern const bcstring be_const_str_lv_area; -extern const bcstring be_const_str_split; -extern const bcstring be_const_str_LED1_INV; -extern const bcstring be_const_str_SENSOR_END; -extern const bcstring be_const_str_TFMINIPLUS_TX; -extern const bcstring be_const_str_content_send_style; -extern const bcstring be_const_str_ADC_INPUT; -extern const bcstring be_const_str_GCM; -extern const bcstring be_const_str_INPUT_PULLUP; -extern const bcstring be_const_str_read; -extern const bcstring be_const_str_seg7_font; -extern const bcstring be_const_str_LOW; -extern const bcstring be_const_str_ST7789_DC; -extern const bcstring be_const_str_SYMBOL_SETTINGS; -extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; -extern const bcstring be_const_str_add; -extern const bcstring be_const_str_read32; -extern const bcstring be_const_str_HRXL_RX; -extern const bcstring be_const_str_lv_msgbox; -extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; -extern const bcstring be_const_str_AudioFileSource; -extern const bcstring be_const_str_ILI9488_CS; -extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; -extern const bcstring be_const_str_SYMBOL_TRASH; -extern const bcstring be_const_str_attrdump; -extern const bcstring be_const_str_copy; -extern const bcstring be_const_str_lv_keyboard; -extern const bcstring be_const_str_sqrt; -extern const bcstring be_const_str_I2S_IN_DATA; -extern const bcstring be_const_str_SDM72_RX; -extern const bcstring be_const_str_SYMBOL_DOWN; -extern const bcstring be_const_str_gamma8; -extern const bcstring be_const_str_CSE7766_TX; -extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; -extern const bcstring be_const_str_SYMBOL_AUDIO; -extern const bcstring be_const_str_try; -extern const bcstring be_const_str_SM2135_DAT; -extern const bcstring be_const_str_get_option; -extern const bcstring be_const_str_lv_win; -extern const bcstring be_const_str_WEBCAM_HREF; -extern const bcstring be_const_str_IEM3000_TX; -extern const bcstring be_const_str_OUTPUT; -extern const bcstring be_const_str_SYMBOL_NEW_LINE; -extern const bcstring be_const_str_IRSEND; -extern const bcstring be_const_str_TELEINFO_RX; -extern const bcstring be_const_str_WE517_TX; -extern const bcstring be_const_str_I2C_SCL; -extern const bcstring be_const_str_WEBCAM_PWDN; -extern const bcstring be_const_str_cos; -extern const bcstring be_const_str_NRG_SEL; -extern const bcstring be_const_str_SDS0X1_RX; -extern const bcstring be_const_str_WIEGAND_D1; -extern const bcstring be_const_str_ZIGBEE_RX; -extern const bcstring be_const_str_MD5; -extern const bcstring be_const_str_reverse_gamma10; -extern const bcstring be_const_str_add_rule; -extern const bcstring be_const_str_finish; -extern const bcstring be_const_str_lv_btn; -extern const bcstring be_const_str_resp_cmnd_error; -extern const bcstring be_const_str_WE517_RX; -extern const bcstring be_const_str_WEBCAM_PSRCS; -extern const bcstring be_const_str_digital_write; -extern const bcstring be_const_str_lv_draw_mask_map_param; -extern const bcstring be_const_str_lv_spinbox; -extern const bcstring be_const_str_SYMBOL_CALL; -extern const bcstring be_const_str_SYMBOL_PLUS; -extern const bcstring be_const_str_elif; -extern const bcstring be_const_str_DHT22; -extern const bcstring be_const_str_set_power; -extern const bcstring be_const_str_ST7789_CS; -extern const bcstring be_const_str_content_send; -extern const bcstring be_const_str_iter; -extern const bcstring be_const_str_load; -extern const bcstring be_const_str_LED1; -extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; -extern const bcstring be_const_str_floor; -extern const bcstring be_const_str_lv_checkbox; -extern const bcstring be_const_str_MAX31855CLK; -extern const bcstring be_const_str_SYMBOL_BATTERY_2; -extern const bcstring be_const_str_find; -extern const bcstring be_const_str_lv_point; -extern const bcstring be_const_str_end; -extern const bcstring be_const_str_read24; -extern const bcstring be_const_str_AudioGenerator; -extern const bcstring be_const_str_P9813_DAT; -extern const bcstring be_const_str_TM1637CLK; -extern const bcstring be_const_str__cb; -extern const bcstring be_const_str_ILI9341_DC; -extern const bcstring be_const_str_RXD; -extern const bcstring be_const_str_SSPI_SCLK; -extern const bcstring be_const_str_yield; -extern const bcstring be_const_str_WEBCAM_DATA; -extern const bcstring be_const_str_lv_draw_line_dsc; -extern const bcstring be_const_str_content_button; -extern const bcstring be_const_str_EXS_ENABLE; -extern const bcstring be_const_str_MIEL_HVAC_RX; -extern const bcstring be_const_str_lv_style; -extern const bcstring be_const_str_LMT01; -extern const bcstring be_const_str_read8; -extern const bcstring be_const_str_members; -extern const bcstring be_const_str_ADC_TEMP; -extern const bcstring be_const_str_DCKI; -extern const bcstring be_const_str_HJL_CF; -extern const bcstring be_const_str_MHZ_RXD; -extern const bcstring be_const_str__cmd; -extern const bcstring be_const_str_lv_page; -extern const bcstring be_const_str_resp_cmnd_failed; -extern const bcstring be_const_str_save; -extern const bcstring be_const_str_SAIR_RX; -extern const bcstring be_const_str_allocated; -extern const bcstring be_const_str_has_arg; -extern const bcstring be_const_str_rad; -extern const bcstring be_const_str_HX711_SCK; -extern const bcstring be_const_str_SOLAXX1_RX; -extern const bcstring be_const_str_SDM630_TX; -extern const bcstring be_const_str_resp_cmnd_done; -extern const bcstring be_const_str_A4988_MS1; -extern const bcstring be_const_str_ETH_PHY_MDC; -extern const bcstring be_const_str_KEY1_NP; -extern const bcstring be_const_str_find_op; -extern const bcstring be_const_str_member; -extern const bcstring be_const_str_SR04_ECHO; -extern const bcstring be_const_str_load_freetype_font; -extern const bcstring be_const_str_lv_draw_rect_dsc; -extern const bcstring be_const_str_FALLING; -extern const bcstring be_const_str_KEY1_INV_PD; -extern const bcstring be_const_str_TXD; -extern const bcstring be_const_str_MCP39F5_RX; -extern const bcstring be_const_str_WEBCAM_SIOC; -extern const bcstring be_const_str_while; -extern const bcstring be_const_str_RDM6300_RX; -extern const bcstring be_const_str_ctypes_bytes; -extern const bcstring be_const_str_AZ_RXD; -extern const bcstring be_const_str_SYMBOL_DIRECTORY; -extern const bcstring be_const_str_AS608_RX; -extern const bcstring be_const_str__begin_transmission; -extern const bcstring be_const_str_deg; -extern const bcstring be_const_str_SYMBOL_VOLUME_MID; -extern const bcstring be_const_str_chars_in_string; -extern const bcstring be_const_str_publish_result; -extern const bcstring be_const_str_lv_arc; -extern const bcstring be_const_str_DSB_OUT; -extern const bcstring be_const_str_module; -extern const bcstring be_const_str_state; -extern const bcstring be_const_str_BS814_CLK; -extern const bcstring be_const_str_HM10_TX; -extern const bcstring be_const_str_NRG_CF1; -extern const bcstring be_const_str_SM16716_CLK; -extern const bcstring be_const_str_lv_draw_mask_common_dsc; -extern const bcstring be_const_str_lv_group; -extern const bcstring be_const_str_montserrat_font; -extern const bcstring be_const_str_opt_eq; -extern const bcstring be_const_str_ZEROCROSS; -extern const bcstring be_const_str_INPUT_PULLDOWN; -extern const bcstring be_const_str_REL1; -extern const bcstring be_const_str_set; -extern const bcstring be_const_str_dump; -extern const bcstring be_const_str_MAX7219DIN; -extern const bcstring be_const_str_CC1101_GDO2; -extern const bcstring be_const_str_IBEACON_RX; -extern const bcstring be_const_str__write; -extern const bcstring be_const_str_KEY1_INV_NP; -extern const bcstring be_const_str_SYMBOL_EJECT; -extern const bcstring be_const_str_top; -extern const bcstring be_const_str_SPI_MOSI; -extern const bcstring be_const_str_lv_chart; -extern const bcstring be_const_str_publish; -extern const bcstring be_const_str_BUZZER_INV; -extern const bcstring be_const_str_CNTR1; -extern const bcstring be_const_str_SPI_MISO; -extern const bcstring be_const_str_SYMBOL_DOWNLOAD; -extern const bcstring be_const_str_real; -extern const bcstring be_const_str_I2S_OUT_CLK; -extern const bcstring be_const_str_INPUT; -extern const bcstring be_const_str_lv_draw_img_dsc; -extern const bcstring be_const_str_do; -extern const bcstring be_const_str_SYMBOL_DUMMY; -extern const bcstring be_const_str_type; -extern const bcstring be_const_str__request_from; -extern const bcstring be_const_str___lower__; -extern const bcstring be_const_str_detect; -extern const bcstring be_const_str_AudioGeneratorWAV; -extern const bcstring be_const_str_HPMA_TX; -extern const bcstring be_const_str_input; -extern const bcstring be_const_str_issubclass; -extern const bcstring be_const_str_SYMBOL_PLAY; -extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_CNTR1_NP; extern const bcstring be_const_str_bytes; -extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_lv_draw_mask_common_dsc; +extern const bcstring be_const_str_TELEINFO_ENABLE; +extern const bcstring be_const_str_resolvecmnd; +extern const bcstring be_const_str_screenshot; extern const bcstring be_const_str_tostring; -extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; -extern const bcstring be_const_str_lv_img; -extern const bcstring be_const_str_open; -extern const bcstring be_const_str_ADC_RANGE; -extern const bcstring be_const_str_INTERRUPT; -extern const bcstring be_const_str_MAX7219CS; -extern const bcstring be_const_str_opt_neq; -extern const bcstring be_const_str_I2S_IN_SLCT; -extern const bcstring be_const_str_PULLUP; -extern const bcstring be_const_str_EPD_DATA; -extern const bcstring be_const_str_range; +extern const bcstring be_const_str_MCP39F5_TX; +extern const bcstring be_const_str_SYMBOL_WIFI; +extern const bcstring be_const_str_TCP_RX; +extern const bcstring be_const_str_LED1_INV; +extern const bcstring be_const_str_LEDLNK_INV; +extern const bcstring be_const_str_lv_btnmatrix; +extern const bcstring be_const_str_SPI_CLK; +extern const bcstring be_const_str_content_button; +extern const bcstring be_const_str_content_stop; +extern const bcstring be_const_str_dump; +extern const bcstring be_const_str_HPMA_TX; +extern const bcstring be_const_str_SR04_ECHO; +extern const bcstring be_const_str_WEBCAM_PSCLK; +extern const bcstring be_const_str_web_send; +extern const bcstring be_const_str_MAX31855CS; +extern const bcstring be_const_str_WEBCAM_HSD; +extern const bcstring be_const_str_find_op; +extern const bcstring be_const_str_CHANGE; +extern const bcstring be_const_str__rules; +extern const bcstring be_const_str_SYMBOL_PLUS; +extern const bcstring be_const_str_RFSEND; +extern const bcstring be_const_str_SAIR_TX; +extern const bcstring be_const_str_WE517_RX; +extern const bcstring be_const_str_SHELLY_DIMMER_BOOT0; +extern const bcstring be_const_str_SYMBOL_BACKSPACE; +extern const bcstring be_const_str_lv_area; +extern const bcstring be_const_str_read; +extern const bcstring be_const_str_codedump; +extern const bcstring be_const_str_lv_calendar; +extern const bcstring be_const_str_TFMINIPLUS_RX; +extern const bcstring be_const_str_attrdump; extern const bcstring be_const_str_SWT1_PD; -extern const bcstring be_const_str_lv_roller; -extern const bcstring be_const_str_log; -extern const bcstring be_const_str_HM10_RX; -extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_lv_imgbtn; +extern const bcstring be_const_str_SYMBOL_EDIT; +extern const bcstring be_const_str___lower__; +extern const bcstring be_const_str_lv_tabview; +extern const bcstring be_const_str_OLED_RESET; +extern const bcstring be_const_str_atan; +extern const bcstring be_const_str_I2S_IN_CLK; +extern const bcstring be_const_str_lv_draw_mask_radius_param; +extern const bcstring be_const_str_tolower; +extern const bcstring be_const_str_FTC532; +extern const bcstring be_const_str_if; +extern const bcstring be_const_str_dot_p; +extern const bcstring be_const_str_KEY1; +extern const bcstring be_const_str_millis; +extern const bcstring be_const_str_IRSEND; +extern const bcstring be_const_str_WEBCAM_HREF; +extern const bcstring be_const_str_cosh; +extern const bcstring be_const_str_DSB_OUT; +extern const bcstring be_const_str_MGC3130_RESET; +extern const bcstring be_const_str_detect; +extern const bcstring be_const_str_find_key_i; +extern const bcstring be_const_str_I2S_OUT_CLK; +extern const bcstring be_const_str_SBR_TX; +extern const bcstring be_const_str_SYMBOL_NEXT; +extern const bcstring be_const_str_SPI_CS; +extern const bcstring be_const_str_HIGH; +extern const bcstring be_const_str_MP3_DFR562; +extern const bcstring be_const_str_REL1; +extern const bcstring be_const_str_SHELLY_DIMMER_RST_INV; +extern const bcstring be_const_str_NONE; +extern const bcstring be_const_str_SR04_TRIG; +extern const bcstring be_const_str_members; +extern const bcstring be_const_str_wifi; +extern const bcstring be_const_str_LED1; +extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; +extern const bcstring be_const_str_toint; +extern const bcstring be_const_str_LE01MR_TX; +extern const bcstring be_const_str_SI7021; +extern const bcstring be_const_str__end_transmission; +extern const bcstring be_const_str_INPUT_PULLUP; +extern const bcstring be_const_str_var; +extern const bcstring be_const_str_exec_cmd; +extern const bcstring be_const_str_resp_cmnd_error; +extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; extern const bcstring be_const_str_I2C_Driver; extern const bcstring be_const_str_MIEL_HVAC_TX; -extern const bcstring be_const_str_WEBCAM_PCLK; -extern const bcstring be_const_str_WIEGAND_D0; -extern const bcstring be_const_str_delay; -extern const bcstring be_const_str_imax; -extern const bcstring be_const_str_EPAPER42_CS; -extern const bcstring be_const_str_SYMBOL_EDIT; -extern const bcstring be_const_str_SYMBOL_STOP; -extern const bcstring be_const_str_write_bytes; -extern const bcstring be_const_str_A4988_DIR; -extern const bcstring be_const_str_ADC_CT_POWER; -extern const bcstring be_const_str_cosh; -extern const bcstring be_const_str_RFSEND; -extern const bcstring be_const_str_SYMBOL_PAUSE; -extern const bcstring be_const_str_get_free_heap; -extern const bcstring be_const_str_set_light; -extern const bcstring be_const_str_sinh; -extern const bcstring be_const_str_time_str; -extern const bcstring be_const_str_BOILER_OT_TX; -extern const bcstring be_const_str_ARIRFRCV; -extern const bcstring be_const_str_SYMBOL_KEYBOARD; -extern const bcstring be_const_str_lv_btnmatrix; -extern const bcstring be_const_str_class; -extern const bcstring be_const_str_if; -extern const bcstring be_const_str_TFMINIPLUS_RX; -extern const bcstring be_const_str_lv_draw_mask_radius_param; -extern const bcstring be_const_str_DDSU666_RX; -extern const bcstring be_const_str_SYMBOL_BATTERY_3; -extern const bcstring be_const_str_lv_label; -extern const bcstring be_const_str_print; extern const bcstring be_const_str_lv_draw_label_dsc; -extern const bcstring be_const_str_remove_rule; -extern const bcstring be_const_str_SWT1_NP; -extern const bcstring be_const_str_SYMBOL_SD_CARD; -extern const bcstring be_const_str_WEBCAM_HSD; -extern const bcstring be_const_str_WINDMETER_SPEED; -extern const bcstring be_const_str_lv_bar; -extern const bcstring be_const_str_lv_line; -extern const bcstring be_const_str_tolower; -extern const bcstring be_const_str_lv_draw_mask_line_param_cfg; -extern const bcstring be_const_str_lv_objmask; -extern const bcstring be_const_str_HLW_CF; -extern const bcstring be_const_str_lv_cpicker; -extern const bcstring be_const_str_start; -extern const bcstring be_const_str_classof; -extern const bcstring be_const_str_concat; -extern const bcstring be_const_str_exec_rules; -extern const bcstring be_const_str_write8; -extern const bcstring be_const_str_LE01MR_TX; -extern const bcstring be_const_str_rtc; -extern const bcstring be_const_str__ccmd; -extern const bcstring be_const_str_asstring; -extern const bcstring be_const_str_lv_linemeter; -extern const bcstring be_const_str_lv_switch; -extern const bcstring be_const_str_number; -extern const bcstring be_const_str_read_bytes; -extern const bcstring be_const_str_dot_p; -extern const bcstring be_const_str_bus; -extern const bcstring be_const_str_lv_group_focus_cb; -extern const bcstring be_const_str_SDS0X1_TX; -extern const bcstring be_const_str_SDM72_TX; -extern const bcstring be_const_str_AS3935; -extern const bcstring be_const_str_SYMBOL_NEXT; -extern const bcstring be_const_str_BS814_DAT; -extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; -extern const bcstring be_const_str_upper; -extern const bcstring be_const_str_OUTPUT_LO; -extern const bcstring be_const_str_ROT1B; -extern const bcstring be_const_str_exists; -extern const bcstring be_const_str_lv_draw_mask_fade_param; -extern const bcstring be_const_str_SYMBOL_HOME; -extern const bcstring be_const_str_TUYA_TX; -extern const bcstring be_const_str_begin; -extern const bcstring be_const_str_encrypt; -extern const bcstring be_const_str_resolvecmnd; -extern const bcstring be_const_str_WEBCAM_VSYNC; -extern const bcstring be_const_str_item; -extern const bcstring be_const_str_lv_slider; -extern const bcstring be_const_str_sin; -extern const bcstring be_const_str_HALLEFFECT; -extern const bcstring be_const_str_time_dump; -extern const bcstring be_const_str_OPEN_DRAIN; -extern const bcstring be_const_str_A4988_STP; -extern const bcstring be_const_str_DDS2382_TX; -extern const bcstring be_const_str_lv_gauge_format_cb; -extern const bcstring be_const_str_lv_signal_cb; -extern const bcstring be_const_str_update; -extern const bcstring be_const_str_SYMBOL_SAVE; -extern const bcstring be_const_str_lv_cont; -extern const bcstring be_const_str_ARIRFSEL; -extern const bcstring be_const_str_HPMA_RX; -extern const bcstring be_const_str_I2S_OUT_DATA; -extern const bcstring be_const_str_ETH_PHY_POWER; -extern const bcstring be_const_str_count; -extern const bcstring be_const_str_lv_imgbtn; -extern const bcstring be_const_str_wifi; -extern const bcstring be_const_str_KEY1; -extern const bcstring be_const_str__end_transmission; -extern const bcstring be_const_str_SYMBOL_CHARGE; -extern const bcstring be_const_str_i2c_enabled; -extern const bcstring be_const_str_lv_event_cb; -extern const bcstring be_const_str_SYMBOL_VIDEO; -extern const bcstring be_const_str_acos; -extern const bcstring be_const_str_asin; -extern const bcstring be_const_str_content_flush; -extern const bcstring be_const_str_read12; -extern const bcstring be_const_str_SYMBOL_CLOSE; -extern const bcstring be_const_str_SYMBOL_UP; -extern const bcstring be_const_str_SSPI_MOSI; -extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; -extern const bcstring be_const_str_FTC532; -extern const bcstring be_const_str_MAX31855DO; -extern const bcstring be_const_str_SPI_CLK; -extern const bcstring be_const_str_ceil; -extern const bcstring be_const_str_try_rule; -extern const bcstring be_const_str_IRRECV; -extern const bcstring be_const_str_remove_cmd; -extern const bcstring be_const_str_RA8876_CS; -extern const bcstring be_const_str_lv_cb; -extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; -extern const bcstring be_const_str_TM1638DIO; -extern const bcstring be_const_str_lv_textarea; -extern const bcstring be_const_str_PROJECTOR_CTRL_RX; -extern const bcstring be_const_str_SYMBOL_COPY; -extern const bcstring be_const_str_abs; -extern const bcstring be_const_str_SAIR_TX; -extern const bcstring be_const_str_SBR_RX; -extern const bcstring be_const_str_lv_spinner; -extern const bcstring be_const_str_SYMBOL_MINUS; -extern const bcstring be_const_str_byte; -extern const bcstring be_const_str_web_send; -extern const bcstring be_const_str_clear; -extern const bcstring be_const_str_content_start; -extern const bcstring be_const_str_wire1; -extern const bcstring be_const_str_SYMBOL_FILE; -extern const bcstring be_const_str_nil; -extern const bcstring be_const_str_RFRECV; -extern const bcstring be_const_str__timers; -extern const bcstring be_const_str_call; -extern const bcstring be_const_str_lv_draw_mask_angle_param; -extern const bcstring be_const_str_calldepth; -extern const bcstring be_const_str_SDM120_RX; -extern const bcstring be_const_str_lv_font; -extern const bcstring be_const_str_exec_cmd; -extern const bcstring be_const_str_lv_obj; -extern const bcstring be_const_str_wire; -extern const bcstring be_const_str_as; -extern const bcstring be_const_str_RF_SENSOR; -extern const bcstring be_const_str_exp; -extern const bcstring be_const_str_LEDLNK_INV; -extern const bcstring be_const_str_resp_cmnd; -extern const bcstring be_const_str_dot_p2; -extern const bcstring be_const_str_HRE_DATA; -extern const bcstring be_const_str_ADC_PH; -extern const bcstring be_const_str_PN532_TXD; -extern const bcstring be_const_str_SDM630_RX; -extern const bcstring be_const_str_cmd; -extern const bcstring be_const_str_lv_draw_mask_saved; -extern const bcstring be_const_str_seti; -extern const bcstring be_const_str_SDM120_TX; -extern const bcstring be_const_str_IEM3000_RX; -extern const bcstring be_const_str_ZIGBEE_RST; -extern const bcstring be_const_str_gc; -extern const bcstring be_const_str_var; -extern const bcstring be_const_str_get_power; -extern const bcstring be_const_str_pin_used; -extern const bcstring be_const_str_dot_def; -extern const bcstring be_const_str_SDCARD_CS; -extern const bcstring be_const_str_SSD1351_DC; -extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; -extern const bcstring be_const_str_DHT11; -extern const bcstring be_const_str_DSB; -extern const bcstring be_const_str_getbits; -extern const bcstring be_const_str_PWM1_INV; -extern const bcstring be_const_str_memory; -extern const bcstring be_const_str_raise; -extern const bcstring be_const_str_BUZZER; -extern const bcstring be_const_str_ROT1A; -extern const bcstring be_const_str_TM1637DIO; -extern const bcstring be_const_str_WEBCAM_PSCLK; -extern const bcstring be_const_str_ZIGBEE_TX; -extern const bcstring be_const_str_super; -extern const bcstring be_const_str_WEBCAM_SIOD; -extern const bcstring be_const_str_lv_design_cb; -extern const bcstring be_const_str_name; -extern const bcstring be_const_str_SYMBOL_RIGHT; -extern const bcstring be_const_str_DI; -extern const bcstring be_const_str_SM16716_SEL; -extern const bcstring be_const_str_load_font; -extern const bcstring be_const_str_SYMBOL_GPS; -extern const bcstring be_const_str_TASMOTACLIENT_TXD; -extern const bcstring be_const_str_gen_cb; -extern const bcstring be_const_str_write_bit; -extern const bcstring be_const_str_MAX7219CLK; -extern const bcstring be_const_str_addr; -extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_PULLUP; +extern const bcstring be_const_str_SDM72_RX; +extern const bcstring be_const_str_add_rule; extern const bcstring be_const_str_loop; -extern const bcstring be_const_str_DEEPSLEEP; -extern const bcstring be_const_str_SPI_CS; -extern const bcstring be_const_str_get_light; -extern const bcstring be_const_str_keys; -extern const bcstring be_const_str_run_deferred; -extern const bcstring be_const_str_MCP39F5_RST; -extern const bcstring be_const_str_except; -extern const bcstring be_const_str_ROT1A_NP; -extern const bcstring be_const_str_WS2812; -extern const bcstring be_const_str_PZEM017_RX; -extern const bcstring be_const_str_scale_uint; -extern const bcstring be_const_str_HX711_DAT; -extern const bcstring be_const_str_PROJECTOR_CTRL_TX; -extern const bcstring be_const_str_SSPI_CS; -extern const bcstring be_const_str_list; -extern const bcstring be_const_str_pop; -extern const bcstring be_const_str_MGC3130_XFER; -extern const bcstring be_const_str_GPS_RX; -extern const bcstring be_const_str_SYMBOL_USB; -extern const bcstring be_const_str_XPT2046_CS; -extern const bcstring be_const_str_stop; -extern const bcstring be_const_str_lv_list; -extern const bcstring be_const_str_AudioOutputI2S; -extern const bcstring be_const_str_WEBCAM_RESET; -extern const bcstring be_const_str_TELEINFO_ENABLE; -extern const bcstring be_const_str_map; -extern const bcstring be_const_str_ADC_JOY; -extern const bcstring be_const_str_I2C_SDA; -extern const bcstring be_const_str_SSD1351_CS; -extern const bcstring be_const_str_setbits; -extern const bcstring be_const_str_str; -extern const bcstring be_const_str___upper__; -extern const bcstring be_const_str__buffer; -extern const bcstring be_const_str_AZ_TXD; -extern const bcstring be_const_str_NEOPOOL_TX; -extern const bcstring be_const_str_PMS5003_TX; -extern const bcstring be_const_str__drivers; -extern const bcstring be_const_str_opt_call; -extern const bcstring be_const_str_find_key_i; -extern const bcstring be_const_str_CC1101_GDO0; -extern const bcstring be_const_str_arg_size; -extern const bcstring be_const_str_AudioGeneratorMP3; -extern const bcstring be_const_str_set_timer; -extern const bcstring be_const_str_PZEM004_RX; -extern const bcstring be_const_str_cb_dispatch; -extern const bcstring be_const_str_fromstring; -extern const bcstring be_const_str_lv_color; -extern const bcstring be_const_str_geti; -extern const bcstring be_const_str_log10; -extern const bcstring be_const_str_eth; -extern const bcstring be_const_str___iterator__; -extern const bcstring be_const_str_NONE; -extern const bcstring be_const_str_SYMBOL_CUT; -extern const bcstring be_const_str_erase; -extern const bcstring be_const_str_SOLAXX1_TX; -extern const bcstring be_const_str_hex; -extern const bcstring be_const_str_arg; -extern const bcstring be_const_str_lv_tabview; -extern const bcstring be_const_str_scan; -extern const bcstring be_const_str_toupper; -extern const bcstring be_const_str_tan; -extern const bcstring be_const_str_NRF24_DC; -extern const bcstring be_const_str_decrypt; -extern const bcstring be_const_str_isrunning; -extern const bcstring be_const_str_lv_led; -extern const bcstring be_const_str_time_reached; -extern const bcstring be_const_str_event; -extern const bcstring be_const_str_WEBCAM_XCLK; -extern const bcstring be_const_str_arg_name; -extern const bcstring be_const_str_ADC_BUTTON_INV; -extern const bcstring be_const_str_ILI9341_CS; -extern const bcstring be_const_str_SPI_DC; -extern const bcstring be_const_str_SYMBOL_EYE_OPEN; -extern const bcstring be_const_str_add_driver; -extern const bcstring be_const_str_MCP39F5_TX; -extern const bcstring be_const_str_MP3_DFR562; -extern const bcstring be_const_str_tanh; -extern const bcstring be_const_str_SSPI_MAX31865_CS1; -extern const bcstring be_const_str_lv_calendar; -extern const bcstring be_const_str_on; -extern const bcstring be_const_str_tag; -extern const bcstring be_const_str_for; -extern const bcstring be_const_str__available; -extern const bcstring be_const_str_assert; extern const bcstring be_const_str_return; -extern const bcstring be_const_str_compile; -extern const bcstring be_const_str_NRF24_CS; -extern const bcstring be_const_str_resize; -extern const bcstring be_const_str_SYMBOL_LIST; -extern const bcstring be_const_str_register_button_encoder; -extern const bcstring be_const_str_true; -extern const bcstring be_const_str_A4988_ENA; -extern const bcstring be_const_str_I2S_OUT_SLCT; -extern const bcstring be_const_str_static; -extern const bcstring be_const_str_ETH_PHY_MDIO; -extern const bcstring be_const_str_MHZ_TXD; -extern const bcstring be_const_str_gamma10; -extern const bcstring be_const_str_RISING; -extern const bcstring be_const_str_lv_draw_mask_line_param; -extern const bcstring be_const_str_rand; -extern const bcstring be_const_str_remove_timer; -extern const bcstring be_const_str_Wire; -extern const bcstring be_const_str_lv_dropdown; -extern const bcstring be_const_str_setitem; -extern const bcstring be_const_str_CSE7761_RX; -extern const bcstring be_const_str_isinstance; -extern const bcstring be_const_str_CSE7766_RX; -extern const bcstring be_const_str_NEOPOOL_RX; -extern const bcstring be_const_str_SSD1331_DC; -extern const bcstring be_const_str_PZEM016_RX; -extern const bcstring be_const_str_SYMBOL_LEFT; -extern const bcstring be_const_str_SI7021; -extern const bcstring be_const_str_TM1638CLK; -extern const bcstring be_const_str_setmember; -extern const bcstring be_const_str_SYMBOL_UPLOAD; -extern const bcstring be_const_str_setrange; -extern const bcstring be_const_str_I2S_IN_CLK; -extern const bcstring be_const_str_SYMBOL_OK; -extern const bcstring be_const_str_get; -extern const bcstring be_const_str_OUTPUT_OPEN_DRAIN; -extern const bcstring be_const_str_PULLDOWN; -extern const bcstring be_const_str_SYMBOL_BELL; -extern const bcstring be_const_str_SYMBOL_BATTERY_1; -extern const bcstring be_const_str_SYMBOL_LOOP; -extern const bcstring be_const_str_atan; -extern const bcstring be_const_str_size; -extern const bcstring be_const_str_opt_add; -extern const bcstring be_const_str_lower; -extern const bcstring be_const_str_wire_scan; -extern const bcstring be_const_str_import; -extern const bcstring be_const_str_REL1_INV; -extern const bcstring be_const_str_lv_gauge; -extern const bcstring be_const_str_Tasmota; -extern const bcstring be_const_str_check_privileged_access; -extern const bcstring be_const_str_wire2; -extern const bcstring be_const_str_DDSU666_TX; -extern const bcstring be_const_str_collect; -extern const bcstring be_const_str_init; -extern const bcstring be_const_str_PWM1; -extern const bcstring be_const_str_ROT1B_NP; -extern const bcstring be_const_str_screenshot; -extern const bcstring be_const_str_DDS2382_RX; -extern const bcstring be_const_str_format; -extern const bcstring be_const_str_pi; -extern const bcstring be_const_str_RC522_RST; -extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; -extern const bcstring be_const_str_AS608_TX; -extern const bcstring be_const_str_SSPI_DC; -extern const bcstring be_const_str_traceback; -extern const bcstring be_const_str_dot_p1; -extern const bcstring be_const_str_SYMBOL_PASTE; -extern const bcstring be_const_str_char; -extern const bcstring be_const_str_ADC_LIGHT; -extern const bcstring be_const_str_deinit; -extern const bcstring be_const_str_digital_read; -extern const bcstring be_const_str_srand; -extern const bcstring be_const_str_DHT11_OUT; -extern const bcstring be_const_str_imin; -extern const bcstring be_const_str_toint; -extern const bcstring be_const_str_PMS5003_RX; -extern const bcstring be_const_str_break; -extern const bcstring be_const_str_LEDLNK; -extern const bcstring be_const_str_MGC3130_RESET; -extern const bcstring be_const_str_insert; -extern const bcstring be_const_str_IBEACON_TX; -extern const bcstring be_const_str_SYMBOL_POWER; -extern const bcstring be_const_str_SYMBOL_WIFI; -extern const bcstring be_const_str_PZEM0XX_TX; -extern const bcstring be_const_str_KEY1_PD; -extern const bcstring be_const_str_resp_cmnd_str; -extern const bcstring be_const_str_reverse; -extern const bcstring be_const_str_PN532_RXD; -extern const bcstring be_const_str_SYMBOL_SHUFFLE; -extern const bcstring be_const_str_false; -extern const bcstring be_const_str_TCP_TX; -extern const bcstring be_const_str_DYP_RX; -extern const bcstring be_const_str_continue; -extern const bcstring be_const_str_AudioFileSourceFS; -extern const bcstring be_const_str_AudioOutput; -extern const bcstring be_const_str_SYMBOL_MUTE; -extern const bcstring be_const_str_TM1638STB; -extern const bcstring be_const_str_BL0940_RX; -extern const bcstring be_const_str_BOILER_OT_RX; -extern const bcstring be_const_str_TUYA_RX; -extern const bcstring be_const_str_remove; -extern const bcstring be_const_str_web_send_decimal; -extern const bcstring be_const_str__read; -extern const bcstring be_const_str_CHANGE; -extern const bcstring be_const_str_SM2135_CLK; -extern const bcstring be_const_str_TCP_RX; -extern const bcstring be_const_str_codedump; -extern const bcstring be_const_str_lv_canvas; -extern const bcstring be_const_str_def; -extern const bcstring be_const_str_CNTR1_NP; extern const bcstring be_const_str_GPS_TX; -extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_MIEL_HVAC_RX; +extern const bcstring be_const_str_SYMBOL_EYE_CLOSE; +extern const bcstring be_const_str_BS814_DAT; +extern const bcstring be_const_str_TM1638STB; +extern const bcstring be_const_str_I2C_SDA; +extern const bcstring be_const_str_CC1101_GDO0; +extern const bcstring be_const_str_arg_name; +extern const bcstring be_const_str_cb_dispatch; +extern const bcstring be_const_str_WEBCAM_RESET; +extern const bcstring be_const_str_lv_draw_line_dsc; +extern const bcstring be_const_str_sin; +extern const bcstring be_const_str_SPI_MISO; +extern const bcstring be_const_str_SYMBOL_BATTERY_2; +extern const bcstring be_const_str_lv_draw_mask_saved; +extern const bcstring be_const_str_sinh; +extern const bcstring be_const_str_OUTPUT_LO; +extern const bcstring be_const_str_ADC_PH; +extern const bcstring be_const_str_state; +extern const bcstring be_const_str_abs; +extern const bcstring be_const_str_KEY1_INV_PD; +extern const bcstring be_const_str_SYMBOL_SD_CARD; +extern const bcstring be_const_str_add; +extern const bcstring be_const_str_LOW; +extern const bcstring be_const_str_SYMBOL_REFRESH; +extern const bcstring be_const_str_AudioGenerator; +extern const bcstring be_const_str_iter; +extern const bcstring be_const_str_set; +extern const bcstring be_const_str__begin_transmission; +extern const bcstring be_const_str_def; +extern const bcstring be_const_str_DI; +extern const bcstring be_const_str_HLW_CF; +extern const bcstring be_const_str_imin; +extern const bcstring be_const_str_ETH_PHY_MDC; +extern const bcstring be_const_str_IBEACON_TX; +extern const bcstring be_const_str_SSD1351_DC; +extern const bcstring be_const_str_lv_draw_mask_angle_param; +extern const bcstring be_const_str_lv_style; +extern const bcstring be_const_str_srand; +extern const bcstring be_const_str_IEM3000_TX; +extern const bcstring be_const_str_PMS5003_RX; +extern const bcstring be_const_str_I2S_IN_SLCT; +extern const bcstring be_const_str_RA8876_CS; +extern const bcstring be_const_str_asstring; +extern const bcstring be_const_str_ceil; +extern const bcstring be_const_str_count; +extern const bcstring be_const_str_lv_draw_mask_map_param; +extern const bcstring be_const_str_lv_spinner; +extern const bcstring be_const_str_HPMA_RX; +extern const bcstring be_const_str_KEY1_NP; +extern const bcstring be_const_str_opt_eq; +extern const bcstring be_const_str_resp_cmnd_done; +extern const bcstring be_const_str_rtc; +extern const bcstring be_const_str_write_bytes; +extern const bcstring be_const_str_read24; +extern const bcstring be_const_str_digital_read; +extern const bcstring be_const_str_lv_checkbox; +extern const bcstring be_const_str_ADC_LIGHT; +extern const bcstring be_const_str_ADC_CT_POWER; +extern const bcstring be_const_str_lv_gauge; +extern const bcstring be_const_str_SYMBOL_EYE_OPEN; +extern const bcstring be_const_str_lv_list; +extern const bcstring be_const_str_MHZ_TXD; +extern const bcstring be_const_str_TUYA_TX; +extern const bcstring be_const_str_resize; +extern const bcstring be_const_str_SYMBOL_STOP; +extern const bcstring be_const_str_XPT2046_CS; +extern const bcstring be_const_str_rand; +extern const bcstring be_const_str_PMS5003_TX; +extern const bcstring be_const_str_cos; +extern const bcstring be_const_str_SSPI_MOSI; +extern const bcstring be_const_str_SYMBOL_HOME; +extern const bcstring be_const_str__ccmd; +extern const bcstring be_const_str_try_rule; +extern const bcstring be_const_str_SYMBOL_CHARGE; +extern const bcstring be_const_str_MAX31855CLK; +extern const bcstring be_const_str_ROT1A_NP; +extern const bcstring be_const_str_SYMBOL_IMAGE; +extern const bcstring be_const_str_INTERRUPT; +extern const bcstring be_const_str_SOLAXX1_TX; +extern const bcstring be_const_str_lv_btn; +extern const bcstring be_const_str_lv_signal_cb; +extern const bcstring be_const_str_I2S_OUT_DATA; +extern const bcstring be_const_str_TM1637DIO; +extern const bcstring be_const_str__write; +extern const bcstring be_const_str_floor; +extern const bcstring be_const_str_TM1638CLK; +extern const bcstring be_const_str_HJL_CF; +extern const bcstring be_const_str_WIEGAND_D0; +extern const bcstring be_const_str_NEOPOOL_TX; +extern const bcstring be_const_str_ZIGBEE_TX; +extern const bcstring be_const_str_load_freetype_font; +extern const bcstring be_const_str_lv_arc; +extern const bcstring be_const_str_lv_switch; +extern const bcstring be_const_str_tanh; +extern const bcstring be_const_str_for; +extern const bcstring be_const_str_I2S_OUT_SLCT; +extern const bcstring be_const_str_SENSOR_END; +extern const bcstring be_const_str_EPAPER29_CS; +extern const bcstring be_const_str_SM16716_SEL; +extern const bcstring be_const_str__cb; +extern const bcstring be_const_str_save; +extern const bcstring be_const_str_toupper; +extern const bcstring be_const_str_lv_tileview; +extern const bcstring be_const_str_WEBCAM_VSYNC; +extern const bcstring be_const_str_find; +extern const bcstring be_const_str_remove_cmd; +extern const bcstring be_const_str_PZEM016_RX; +extern const bcstring be_const_str_SYMBOL_EJECT; +extern const bcstring be_const_str_AudioGeneratorWAV; +extern const bcstring be_const_str_on; +extern const bcstring be_const_str_setrange; +extern const bcstring be_const_str_arg_size; +extern const bcstring be_const_str_opt_call; +extern const bcstring be_const_str_SYMBOL_CALL; +extern const bcstring be_const_str_SYMBOL_GPS; +extern const bcstring be_const_str_pin_mode; +extern const bcstring be_const_str_end; +extern const bcstring be_const_str_gc; +extern const bcstring be_const_str__buffer; +extern const bcstring be_const_str_TCP_TX; +extern const bcstring be_const_str_push; +extern const bcstring be_const_str_AS608_TX; +extern const bcstring be_const_str_I2C_SCL; +extern const bcstring be_const_str_ST7789_CS; +extern const bcstring be_const_str_BUZZER_INV; +extern const bcstring be_const_str_SDM120_TX; +extern const bcstring be_const_str_lv_cont; +extern const bcstring be_const_str_time_str; +extern const bcstring be_const_str_log; +extern const bcstring be_const_str_lv_font; +extern const bcstring be_const_str_map; +extern const bcstring be_const_str_OUTPUT_HI; +extern const bcstring be_const_str_memory; +extern const bcstring be_const_str_SDCARD_CS; +extern const bcstring be_const_str_ETH_PHY_MDIO; +extern const bcstring be_const_str_update; +extern const bcstring be_const_str_TASMOTACLIENT_RST; +extern const bcstring be_const_str_lv_draw_mask_fade_param_cfg; +extern const bcstring be_const_str_lv_msgbox; +extern const bcstring be_const_str_try; +extern const bcstring be_const_str_HALLEFFECT; +extern const bcstring be_const_str_INPUT; +extern const bcstring be_const_str_BS814_CLK; +extern const bcstring be_const_str_KEY1_PD; +extern const bcstring be_const_str_AS3935; +extern const bcstring be_const_str_EXS_ENABLE; +extern const bcstring be_const_str_WE517_TX; +extern const bcstring be_const_str_WEBCAM_DATA; +extern const bcstring be_const_str_load; +extern const bcstring be_const_str_opt_add; +extern const bcstring be_const_str_DSB; +extern const bcstring be_const_str_TM1638DIO; +extern const bcstring be_const_str_resp_cmnd_str; +extern const bcstring be_const_str_add_cmd; +extern const bcstring be_const_str_lv_sqrt_res; +extern const bcstring be_const_str_EPD_DATA; +extern const bcstring be_const_str_MD5; +extern const bcstring be_const_str_SDS0X1_TX; +extern const bcstring be_const_str_content_flush; +extern const bcstring be_const_str_fromb64; +extern const bcstring be_const_str_ADC_TEMP; +extern const bcstring be_const_str_pin; +extern const bcstring be_const_str_wire; +extern const bcstring be_const_str_ZIGBEE_RST; +extern const bcstring be_const_str_lv_led; +extern const bcstring be_const_str_redirect; +extern const bcstring be_const_str_PWM1_INV; +extern const bcstring be_const_str_SYMBOL_LEFT; +extern const bcstring be_const_str_SYMBOL_PREV; +extern const bcstring be_const_str_P9813_DAT; +extern const bcstring be_const_str_SYMBOL_PLAY; +extern const bcstring be_const_str_true; +extern const bcstring be_const_str_resp_cmnd; +extern const bcstring be_const_str_MGC3130_XFER; +extern const bcstring be_const_str_gen_cb; +extern const bcstring be_const_str_MCP39F5_RST; +extern const bcstring be_const_str_rad; +extern const bcstring be_const_str_SYMBOL_BULLET; +extern const bcstring be_const_str_KEY1_INV; +extern const bcstring be_const_str_SYMBOL_BATTERY_1; +extern const bcstring be_const_str_FALLING; +extern const bcstring be_const_str_RDM6300_RX; +extern const bcstring be_const_str_SYMBOL_USB; +extern const bcstring be_const_str__timers; +extern const bcstring be_const_str_WEBCAM_PCLK; +extern const bcstring be_const_str_open; +extern const bcstring be_const_str_DDS2382_RX; +extern const bcstring be_const_str_name; +extern const bcstring be_const_str_ILI9341_DC; +extern const bcstring be_const_str_SYMBOL_AUDIO; +extern const bcstring be_const_str_exec_rules; +extern const bcstring be_const_str_SDM630_RX; +extern const bcstring be_const_str_content_send; +extern const bcstring be_const_str_MAX7219CLK; +extern const bcstring be_const_str_NEOPOOL_RX; +extern const bcstring be_const_str_item; +extern const bcstring be_const_str_VL53L0X_XSHUT1; +extern const bcstring be_const_str_ARIRFRCV; +extern const bcstring be_const_str_HX711_SCK; +extern const bcstring be_const_str_OPEN_DRAIN; +extern const bcstring be_const_str_delay; +extern const bcstring be_const_str_lv_draw_mask_line_param; +extern const bcstring be_const_str_lv_draw_rect_dsc; +extern const bcstring be_const_str_super; +extern const bcstring be_const_str_SAIR_RX; +extern const bcstring be_const_str__available; +extern const bcstring be_const_str_ADC_INPUT; +extern const bcstring be_const_str_acos; +extern const bcstring be_const_str_lv_linemeter; +extern const bcstring be_const_str_TFMINIPLUS_TX; +extern const bcstring be_const_str_lv_cb; +extern const bcstring be_const_str_AudioFileSource; +extern const bcstring be_const_str_PULLDOWN; +extern const bcstring be_const_str_allocated; +extern const bcstring be_const_str_read12; +extern const bcstring be_const_str_RC522_RST; +extern const bcstring be_const_str_SM16716_CLK; +extern const bcstring be_const_str_tag; +extern const bcstring be_const_str_AudioOutput; +extern const bcstring be_const_str_PN532_TXD; +extern const bcstring be_const_str_Wire; +extern const bcstring be_const_str_AudioFileSourceFS; +extern const bcstring be_const_str_lv_img; +extern const bcstring be_const_str_time_dump; +extern const bcstring be_const_str_number; +extern const bcstring be_const_str_module; +extern const bcstring be_const_str_time_reached; +extern const bcstring be_const_str_ADE7953_IRQ; +extern const bcstring be_const_str_IRRECV; +extern const bcstring be_const_str_A4988_MS1; +extern const bcstring be_const_str_ELECTRIQ_MOODL_TX; +extern const bcstring be_const_str_PZEM0XX_TX; +extern const bcstring be_const_str_fromstring; +extern const bcstring be_const_str_LEDLNK; +extern const bcstring be_const_str_lv_obj; +extern const bcstring be_const_str_set_power; +extern const bcstring be_const_str_SYMBOL_WARNING; +extern const bcstring be_const_str_input; +extern const bcstring be_const_str_RF_SENSOR; +extern const bcstring be_const_str_pop; +extern const bcstring be_const_str_nil; +extern const bcstring be_const_str_setmember; +extern const bcstring be_const_str_lv_point; +extern const bcstring be_const_str_get; +extern const bcstring be_const_str_static; +extern const bcstring be_const_str_MAX7219CS; +extern const bcstring be_const_str_lv_group_focus_cb; +extern const bcstring be_const_str_else; +extern const bcstring be_const_str_import; +extern const bcstring be_const_str_erase; +extern const bcstring be_const_str_lv_indev; +extern const bcstring be_const_str_ROT1A; +extern const bcstring be_const_str_SWT1; +extern const bcstring be_const_str_TX2X_TXD_BLACK; +extern const bcstring be_const_str_RXD; +extern const bcstring be_const_str_SYMBOL_DIRECTORY; +extern const bcstring be_const_str_ZEROCROSS; +extern const bcstring be_const_str_get_power; +extern const bcstring be_const_str_read13; +extern const bcstring be_const_str_WEBCAM_PWDN; +extern const bcstring be_const_str__get_cb; +extern const bcstring be_const_str_montserrat_font; +extern const bcstring be_const_str_SYMBOL_KEYBOARD; +extern const bcstring be_const_str_SYMBOL_SAVE; +extern const bcstring be_const_str_digital_write; +extern const bcstring be_const_str_HM10_TX; +extern const bcstring be_const_str_WIEGAND_D1; +extern const bcstring be_const_str_exp; +extern const bcstring be_const_str_run_deferred; +extern const bcstring be_const_str_; +extern const bcstring be_const_str_SYMBOL_VOLUME_MID; +extern const bcstring be_const_str_i2c_enabled; +extern const bcstring be_const_str_lv_bar; +extern const bcstring be_const_str_PZEM004_RX; +extern const bcstring be_const_str_TXD; +extern const bcstring be_const_str_event; +extern const bcstring be_const_str_load_font; +extern const bcstring be_const_str_upper; +extern const bcstring be_const_str_CSE7761_RX; +extern const bcstring be_const_str_copy; +extern const bcstring be_const_str_write; +extern const bcstring be_const_str_false; +extern const bcstring be_const_str_traceback; +extern const bcstring be_const_str_PZEM017_RX; +extern const bcstring be_const_str_SYMBOL_DOWNLOAD; +extern const bcstring be_const_str_byte; +extern const bcstring be_const_str_DDSU666_RX; +extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_str; +extern const bcstring be_const_str_BOILER_OT_RX; +extern const bcstring be_const_str_call; +extern const bcstring be_const_str_SM2135_DAT; +extern const bcstring be_const_str_SYMBOL_LIST; +extern const bcstring be_const_str_lv_design_cb; +extern const bcstring be_const_str_BL0940_RX; +extern const bcstring be_const_str_cmd; +extern const bcstring be_const_str__request_from; +extern const bcstring be_const_str_remove_rule; +extern const bcstring be_const_str_tan; +extern const bcstring be_const_str_except; +extern const bcstring be_const_str_SYMBOL_BATTERY_EMPTY; +extern const bcstring be_const_str_lv_slider; +extern const bcstring be_const_str_SYMBOL_MINUS; +extern const bcstring be_const_str_asin; +extern const bcstring be_const_str_decrypt; +extern const bcstring be_const_str_finish; +extern const bcstring be_const_str_SPI_DC; +extern const bcstring be_const_str_TUYA_RX; +extern const bcstring be_const_str_arg; +extern const bcstring be_const_str_OPTION_A; +extern const bcstring be_const_str_SYMBOL_TRASH; +extern const bcstring be_const_str_WEBCAM_PSRCS; +extern const bcstring be_const_str_tob64; +extern const bcstring be_const_str_CC1101_GDO2; +extern const bcstring be_const_str_SYMBOL_VOLUME_MAX; +extern const bcstring be_const_str_keys; +extern const bcstring be_const_str_GPS_RX; +extern const bcstring be_const_str_range; +extern const bcstring be_const_str_BUZZER; +extern const bcstring be_const_str_SWT1_NP; +extern const bcstring be_const_str_lv_draw_mask_fade_param; +extern const bcstring be_const_str_publish; +extern const bcstring be_const_str_setitem; +extern const bcstring be_const_str_collect; +extern const bcstring be_const_str_lv_objmask; +extern const bcstring be_const_str_dot_p1; +extern const bcstring be_const_str_SOLAXX1_RX; +extern const bcstring be_const_str_SYMBOL_DUMMY; +extern const bcstring be_const_str_WEBCAM_SIOD; +extern const bcstring be_const_str_lv_draw_img_dsc; +extern const bcstring be_const_str_raise; +extern const bcstring be_const_str_ROT1B_NP; +extern const bcstring be_const_str_get_option; +extern const bcstring be_const_str_list; +extern const bcstring be_const_str_lv_keyboard; +extern const bcstring be_const_str_pow; +extern const bcstring be_const_str_ADC_BUTTON; +extern const bcstring be_const_str_ZIGBEE_RX; +extern const bcstring be_const_str_classof; +extern const bcstring be_const_str_geti; +extern const bcstring be_const_str_wire2; +extern const bcstring be_const_str_AS608_RX; +extern const bcstring be_const_str_SYMBOL_RIGHT; +extern const bcstring be_const_str_Tasmota; +extern const bcstring be_const_str_CSE7766_TX; +extern const bcstring be_const_str_A4988_ENA; +extern const bcstring be_const_str_KEY1_INV_NP; +extern const bcstring be_const_str_yield; +extern const bcstring be_const_str_while; +extern const bcstring be_const_str_SSPI_CS; +extern const bcstring be_const_str_SYMBOL_BELL; +extern const bcstring be_const_str_SYMBOL_NEW_LINE; +extern const bcstring be_const_str_ADC_JOY; +extern const bcstring be_const_str_PROJECTOR_CTRL_RX; +extern const bcstring be_const_str_TASMOTACLIENT_TXD; +extern const bcstring be_const_str_TELEINFO_RX; +extern const bcstring be_const_str_lv_table; +extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_wire_scan; +extern const bcstring be_const_str_continue; +extern const bcstring be_const_str_NRG_SEL; +extern const bcstring be_const_str_P9813_CLK; +extern const bcstring be_const_str_concat; +extern const bcstring be_const_str_SSD1351_CS; +extern const bcstring be_const_str_calldepth; +extern const bcstring be_const_str_lower; +extern const bcstring be_const_str_lv_line; +extern const bcstring be_const_str_resp_cmnd_failed; +extern const bcstring be_const_str_lv_color; +extern const bcstring be_const_str_WINDMETER_SPEED; +extern const bcstring be_const_str_pin_used; +extern const bcstring be_const_str_do; +extern const bcstring be_const_str_SDM72_TX; +extern const bcstring be_const_str_SSPI_MISO; +extern const bcstring be_const_str_lv_draw_mask_map_param_cfg; +extern const bcstring be_const_str_type; +extern const bcstring be_const_str_DEEPSLEEP; +extern const bcstring be_const_str_int; +extern const bcstring be_const_str_A4988_DIR; +extern const bcstring be_const_str_CSE7766_RX; +extern const bcstring be_const_str_I2S_IN_DATA; +extern const bcstring be_const_str_SYMBOL_LOOP; +extern const bcstring be_const_str_SDM120_RX; +extern const bcstring be_const_str_SYMBOL_PASTE; +extern const bcstring be_const_str_seg7_font; +extern const bcstring be_const_str_GCM; +extern const bcstring be_const_str_WS2812; +extern const bcstring be_const_str_imax; +extern const bcstring be_const_str_content_send_style; +extern const bcstring be_const_str_publish_result; +extern const bcstring be_const_str_write8; +extern const bcstring be_const_str_break; +extern const bcstring be_const_str_as; +extern const bcstring be_const_str_ETH_PHY_POWER; +extern const bcstring be_const_str_lv_label; +extern const bcstring be_const_str_RISING; +extern const bcstring be_const_str_remove_timer; +extern const bcstring be_const_str_MAX31855DO; extern const bcstring be_const_str_classname; +extern const bcstring be_const_str_lv_canvas; +extern const bcstring be_const_str_NRF24_DC; +extern const bcstring be_const_str_HM10_RX; +extern const bcstring be_const_str_lv_win; +extern const bcstring be_const_str_seti; +extern const bcstring be_const_str_HRE_DATA; +extern const bcstring be_const_str_SM2135_CLK; +extern const bcstring be_const_str_SSD1331_DC; +extern const bcstring be_const_str_assert; +extern const bcstring be_const_str_lv_cpicker; +extern const bcstring be_const_str_response_append; +extern const bcstring be_const_str_get_light; +extern const bcstring be_const_str_SBR_RX; +extern const bcstring be_const_str_SM16716_DAT; +extern const bcstring be_const_str_isinstance; +extern const bcstring be_const_str_add_driver; +extern const bcstring be_const_str_AZ_TXD; +extern const bcstring be_const_str_ILI9488_CS; +extern const bcstring be_const_str_ROT1B; +extern const bcstring be_const_str_PN532_RXD; +extern const bcstring be_const_str_scale_uint; +extern const bcstring be_const_str_content_start; +extern const bcstring be_const_str_HRXL_RX; +extern const bcstring be_const_str_SYMBOL_DOWN; +extern const bcstring be_const_str_clear; +extern const bcstring be_const_str_AZ_RXD; +extern const bcstring be_const_str___upper__; +extern const bcstring be_const_str_init; +extern const bcstring be_const_str_SYMBOL_PAUSE; +extern const bcstring be_const_str_lv_roller; +extern const bcstring be_const_str_DYP_RX; +extern const bcstring be_const_str_LE01MR_RX; +extern const bcstring be_const_str_NRG_CF1; +extern const bcstring be_const_str__drivers; +extern const bcstring be_const_str_SYMBOL_DRIVE; +extern const bcstring be_const_str__read; +extern const bcstring be_const_str_DHT22; +extern const bcstring be_const_str_IBEACON_RX; +extern const bcstring be_const_str_SYMBOL_MUTE; +extern const bcstring be_const_str_top; +extern const bcstring be_const_str_opt_connect; +extern const bcstring be_const_str_RFRECV; +extern const bcstring be_const_str_SYMBOL_VIDEO; +extern const bcstring be_const_str_NRF24_CS; +extern const bcstring be_const_str_hex; +extern const bcstring be_const_str_INPUT_PULLDOWN; +extern const bcstring be_const_str_ctypes_bytes; +extern const bcstring be_const_str_read8; +extern const bcstring be_const_str_sqrt; +extern const bcstring be_const_str_SYMBOL_FILE; +extern const bcstring be_const_str_has_arg; +extern const bcstring be_const_str_lv_chart; +extern const bcstring be_const_str_write_bit; +extern const bcstring be_const_str_lv_gauge_format_cb; +extern const bcstring be_const_str_CSE7761_TX; +extern const bcstring be_const_str_HRE_CLOCK; +extern const bcstring be_const_str_REL1_INV; +extern const bcstring be_const_str_SYMBOL_SETTINGS; +extern const bcstring be_const_str_size; extern const bcstring be_const_str_NRG_SEL_INV; +extern const bcstring be_const_str_stop; +extern const bcstring be_const_str_RC522_CS; +extern const bcstring be_const_str_SSPI_DC; +extern const bcstring be_const_str_eth; +extern const bcstring be_const_str_insert; +extern const bcstring be_const_str_print; +extern const bcstring be_const_str_ADC_BUTTON_INV; +extern const bcstring be_const_str_PROJECTOR_CTRL_TX; +extern const bcstring be_const_str_PWM1; +extern const bcstring be_const_str_encrypt; +extern const bcstring be_const_str_ADC_RANGE; +extern const bcstring be_const_str_MHZ_RXD; +extern const bcstring be_const_str_start; +extern const bcstring be_const_str_log10; +extern const bcstring be_const_str_read32; +extern const bcstring be_const_str_web_send_decimal; +extern const bcstring be_const_str_A4988_STP; +extern const bcstring be_const_str_MAX7219DIN; +extern const bcstring be_const_str_SDS0X1_RX; +extern const bcstring be_const_str_SYMBOL_BATTERY_FULL; +extern const bcstring be_const_str_get_free_heap; +extern const bcstring be_const_str_addr; +extern const bcstring be_const_str_reverse_gamma10; +extern const bcstring be_const_str_SYMBOL_UPLOAD; +extern const bcstring be_const_str_gamma10; +extern const bcstring be_const_str_lv_page; +extern const bcstring be_const_str_SYMBOL_BLUETOOTH; +extern const bcstring be_const_str_SYMBOL_OK; +extern const bcstring be_const_str_DHT11; +extern const bcstring be_const_str_read_bytes; +extern const bcstring be_const_str_lv_textarea; +extern const bcstring be_const_str_LMT01; +extern const bcstring be_const_str_MCP39F5_RX; +extern const bcstring be_const_str_SPI_MOSI; +extern const bcstring be_const_str_SYMBOL_CLOSE; +extern const bcstring be_const_str___iterator__; +extern const bcstring be_const_str_elif; +extern const bcstring be_const_str_IEM3000_RX; +extern const bcstring be_const_str_lv_draw_mask_angle_param_cfg; +extern const bcstring be_const_str_DHT11_OUT; +extern const bcstring be_const_str_HX711_DAT; +extern const bcstring be_const_str_register_button_encoder; +extern const bcstring be_const_str_lv_group; +extern const bcstring be_const_str_member; +extern const bcstring be_const_str_split; +extern const bcstring be_const_str_dot_def; +extern const bcstring be_const_str_DDS2382_TX; +extern const bcstring be_const_str_OUTPUT; +extern const bcstring be_const_str_SSD1331_CS; +extern const bcstring be_const_str_check_privileged_access; +extern const bcstring be_const_str_set_light; +extern const bcstring be_const_str_ST7789_DC; +extern const bcstring be_const_str_TM1637CLK; +extern const bcstring be_const_str_char; +extern const bcstring be_const_str_exists; +extern const bcstring be_const_str_real; +extern const bcstring be_const_str_remove; +extern const bcstring be_const_str_EPAPER42_CS; +extern const bcstring be_const_str_AudioGeneratorMP3; +extern const bcstring be_const_str_chars_in_string; +extern const bcstring be_const_str_SYMBOL_BATTERY_3; +extern const bcstring be_const_str_BACKLIGHT; +extern const bcstring be_const_str_format; +extern const bcstring be_const_str_gamma8; +extern const bcstring be_const_str_dot_p2; +extern const bcstring be_const_str_AudioOutputI2S; +extern const bcstring be_const_str_lv_dropdown; +extern const bcstring be_const_str_set_timer; +extern const bcstring be_const_str_SDM630_TX; +extern const bcstring be_const_str_issubclass; +extern const bcstring be_const_str_wire1; +extern const bcstring be_const_str_deinit; +extern const bcstring be_const_str_WEBCAM_XCLK; +extern const bcstring be_const_str_reverse; +extern const bcstring be_const_str_TASMOTACLIENT_RXD; +extern const bcstring be_const_str_compile; +extern const bcstring be_const_str_pi; +extern const bcstring be_const_str_SYMBOL_SHUFFLE; +extern const bcstring be_const_str_deg; +extern const bcstring be_const_str_SSPI_MAX31865_CS1; +extern const bcstring be_const_str_isrunning; +extern const bcstring be_const_str_DDSU666_TX; +extern const bcstring be_const_str_BOILER_OT_TX; +extern const bcstring be_const_str_SYMBOL_UP; +extern const bcstring be_const_str_bus; +extern const bcstring be_const_str_lv_spinbox; +extern const bcstring be_const_str__cmd; +extern const bcstring be_const_str_ILI9341_CS; +extern const bcstring be_const_str_SYMBOL_POWER; +extern const bcstring be_const_str_class; +extern const bcstring be_const_str_DCKI; +extern const bcstring be_const_str_CNTR1; +extern const bcstring be_const_str_SSPI_SCLK; +extern const bcstring be_const_str_SYMBOL_CUT; +extern const bcstring be_const_str_SYMBOL_COPY; +extern const bcstring be_const_str_getbits; +extern const bcstring be_const_str_KEY1_TC; +extern const bcstring be_const_str_TASMOTACLIENT_RST_INV; +extern const bcstring be_const_str_lv_draw_mask_radius_param_cfg; +extern const bcstring be_const_str_begin; +extern const bcstring be_const_str_opt_neq; +extern const bcstring be_const_str_ARIRFSEL; +extern const bcstring be_const_str_WEBCAM_SIOC; +extern const bcstring be_const_str_setbits; diff --git a/lib/libesp32/Berry/generate/be_const_strtab_def.h b/lib/libesp32/Berry/generate/be_const_strtab_def.h index ba4ae05e0..5d12d4165 100644 --- a/lib/libesp32/Berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/Berry/generate/be_const_strtab_def.h @@ -1,977 +1,980 @@ -be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_pin); -be_define_const_str(pin, "pin", 1866532500u, 0, 3, NULL); -be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_HIGH); -be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_SYMBOL_IMAGE); -be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, &be_const_str_content_stop); -be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, NULL); -be_define_const_str(int, "int", 2515107422u, 0, 3, &be_const_str_push); -be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); -be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, &be_const_str_VL53L0X_XSHUT1); -be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, &be_const_str_millis); -be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); -be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_lv_indev); -be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); -be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_SYMBOL_REFRESH); -be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, &be_const_str_redirect); -be_define_const_str(redirect, "redirect", 389758641u, 0, 8, &be_const_str_response_append); -be_define_const_str(response_append, "response_append", 450346371u, 0, 15, &be_const_str_else); -be_define_const_str(else, "else", 3183434736u, 52, 4, NULL); -be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_SWT1); -be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_SYMBOL_BLUETOOTH); -be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str__get_cb); -be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, NULL); -be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_SYMBOL_PREV); -be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, NULL); -be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, NULL); -be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_lv_table); -be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, NULL); -be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_SYMBOL_BACKSPACE); -be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_TX2X_TXD_BLACK); -be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL); -be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, &be_const_str_OUTPUT_HI); -be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_SYMBOL_DRIVE); -be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, NULL); -be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, &be_const_str_read13); -be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); -be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, &be_const_str_write); -be_define_const_str(write, "write", 3190202204u, 0, 5, NULL); -be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, NULL); -be_define_const_str(, "", 2166136261u, 0, 0, NULL); -be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); -be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_SSD1331_CS); -be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_TASMOTACLIENT_RST); -be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, NULL); -be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, NULL); -be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_SBR_TX); -be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_pin_mode); -be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, NULL); -be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_MAX31855CS); -be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, &be_const_str_P9813_CLK); -be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_SYMBOL_WARNING); -be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, &be_const_str_lv_area); -be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_split); -be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); -be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_SENSOR_END); -be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, &be_const_str_TFMINIPLUS_TX); -be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_content_send_style); -be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); -be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, NULL); -be_define_const_str(GCM, "GCM", 3790320054u, 0, 3, &be_const_str_INPUT_PULLUP); -be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_read); -be_define_const_str(read, "read", 3470762949u, 0, 4, &be_const_str_seg7_font); -be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); -be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_ST7789_DC); -be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_SYMBOL_SETTINGS); -be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, &be_const_str_TASMOTACLIENT_RST_INV); -be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_add); -be_define_const_str(add, "add", 993596020u, 0, 3, &be_const_str_read32); -be_define_const_str(read32, "read32", 1741276240u, 0, 6, NULL); -be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_lv_msgbox); -be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, NULL); -be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); -be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_ILI9488_CS); -be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_SHELLY_DIMMER_RST_INV); -be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, &be_const_str_SYMBOL_TRASH); -be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, NULL); -be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, &be_const_str_copy); -be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_lv_keyboard); -be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_sqrt); -be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); -be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_SDM72_RX); -be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_SYMBOL_DOWN); -be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_gamma8); -be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); -be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, &be_const_str_SHELLY_DIMMER_BOOT0); -be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, &be_const_str_SYMBOL_AUDIO); -be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_try); -be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); -be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, NULL); -be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_lv_win); -be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, NULL); -be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, NULL); -be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_OUTPUT); -be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SYMBOL_NEW_LINE); -be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, NULL); -be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_TELEINFO_RX); -be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, NULL); -be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, NULL); -be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, NULL); -be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str_cos); -be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); -be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_SDS0X1_RX); -be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_WIEGAND_D1); -be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_ZIGBEE_RX); -be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, NULL); -be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_reverse_gamma10); -be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); -be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_finish); -be_define_const_str(finish, "finish", 1494643858u, 0, 6, &be_const_str_lv_btn); -be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_resp_cmnd_error); -be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); -be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, &be_const_str_WEBCAM_PSRCS); -be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_digital_write); -be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, &be_const_str_lv_draw_mask_map_param); -be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, &be_const_str_lv_spinbox); -be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); -be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, NULL); -be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, &be_const_str_elif); -be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); -be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_set_power); -be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); -be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, &be_const_str_content_send); -be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, &be_const_str_iter); -be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_load); -be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); -be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_SYMBOL_BATTERY_FULL); -be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, NULL); -be_define_const_str(floor, "floor", 3102149661u, 0, 5, &be_const_str_lv_checkbox); -be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); -be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_SYMBOL_BATTERY_2); -be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, &be_const_str_find); -be_define_const_str(find, "find", 3186656602u, 0, 4, NULL); -be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, &be_const_str_end); -be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); -be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); -be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, &be_const_str_P9813_DAT); -be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_TM1637CLK); -be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str__cb); -be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); -be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_RXD); -be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SSPI_SCLK); -be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_yield); -be_define_const_str(yield, "yield", 1821831854u, 0, 5, NULL); -be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_lv_draw_line_dsc); -be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); -be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, NULL); -be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_MIEL_HVAC_RX); -be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, NULL); -be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, NULL); -be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_read8); -be_define_const_str(read8, "read8", 2802788167u, 0, 5, NULL); -be_define_const_str(members, "members", 937576464u, 0, 7, NULL); -be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_DCKI); -be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, NULL); -be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_MHZ_RXD); -be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str__cmd); -be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, &be_const_str_lv_page); -be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, &be_const_str_resp_cmnd_failed); -be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, &be_const_str_save); -be_define_const_str(save, "save", 3439296072u, 0, 4, NULL); -be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str_allocated); -be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_has_arg); -be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_rad); -be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); -be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_SOLAXX1_RX); -be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, NULL); -be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_resp_cmnd_done); -be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); -be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ETH_PHY_MDC); -be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_KEY1_NP); -be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, &be_const_str_find_op); -be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, &be_const_str_member); -be_define_const_str(member, "member", 719708611u, 0, 6, NULL); -be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_load_freetype_font); -be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, NULL); -be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, NULL); -be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_KEY1_INV_PD); -be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_TXD); -be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, NULL); -be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, &be_const_str_WEBCAM_SIOC); -be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_while); -be_define_const_str(while, "while", 231090382u, 53, 5, NULL); -be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_ctypes_bytes); -be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, NULL); -be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str_SYMBOL_DIRECTORY); -be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, NULL); -be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str__begin_transmission); -be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_deg); -be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); -be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_chars_in_string); -be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, &be_const_str_publish_result); -be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, NULL); -be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, NULL); -be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_module); -be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_state); -be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); -be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, NULL); -be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_NRG_CF1); -be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, NULL); -be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_lv_draw_mask_common_dsc); +be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_bytes); +be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_draw_mask_common_dsc); be_define_const_str(lv_draw_mask_common_dsc, "lv_draw_mask_common_dsc", 1429224708u, 0, 23, NULL); -be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_montserrat_font); -be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); -be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_ZEROCROSS); -be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, NULL); -be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, NULL); -be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, &be_const_str_set); -be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); -be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); -be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, NULL); -be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_IBEACON_RX); -be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str__write); -be_define_const_str(_write, "_write", 2215462825u, 0, 6, NULL); -be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, NULL); -be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, NULL); -be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); -be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_lv_chart); -be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_publish); -be_define_const_str(publish, "publish", 264247304u, 0, 7, NULL); -be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_CNTR1); -be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, &be_const_str_SPI_MISO); -be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_SYMBOL_DOWNLOAD); -be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, NULL); -be_define_const_str(real, "real", 3604983901u, 0, 4, NULL); -be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_INPUT); -be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, &be_const_str_lv_draw_img_dsc); -be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, &be_const_str_do); -be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); -be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_type); -be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); -be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, NULL); -be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_detect); -be_define_const_str(detect, "detect", 8884370u, 0, 6, NULL); -be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, NULL); -be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_input); -be_define_const_str(input, "input", 4191711099u, 0, 5, &be_const_str_issubclass); -be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, NULL); -be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, &be_const_str__rules); -be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, &be_const_str_bytes); -be_define_const_str(bytes, "bytes", 1706151940u, 0, 5, &be_const_str_lv_sqrt_res); -be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, &be_const_str_tostring); +be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_resolvecmnd); +be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, &be_const_str_screenshot); +be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, &be_const_str_tostring); be_define_const_str(tostring, "tostring", 2299708645u, 0, 8, NULL); -be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, &be_const_str_lv_img); -be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_open); -be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); -be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, NULL); -be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str_MAX7219CS); -be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, NULL); -be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_I2S_IN_SLCT); -be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_PULLUP); -be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, NULL); -be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, &be_const_str_range); -be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); -be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, NULL); -be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); -be_define_const_str(log, "log", 1062293841u, 0, 3, NULL); -be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_SYMBOL_BULLET); -be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, NULL); -be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, NULL); -be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_WEBCAM_PCLK); -be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_WIEGAND_D0); -be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, &be_const_str_delay); -be_define_const_str(delay, "delay", 1322381784u, 0, 5, NULL); -be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); -be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, NULL); -be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str_SYMBOL_STOP); -be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_write_bytes); -be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); -be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, NULL); -be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_cosh); -be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); -be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, NULL); -be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_get_free_heap); -be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, &be_const_str_set_light); -be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, &be_const_str_sinh); -be_define_const_str(sinh, "sinh", 282220607u, 0, 4, &be_const_str_time_str); -be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); -be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, NULL); -be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_SYMBOL_KEYBOARD); -be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_lv_btnmatrix); -be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, &be_const_str_class); -be_define_const_str(class, "class", 2872970239u, 57, 5, &be_const_str_if); -be_define_const_str(if, "if", 959999494u, 50, 2, NULL); -be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, &be_const_str_lv_draw_mask_radius_param); -be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); -be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_SYMBOL_BATTERY_3); -be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, &be_const_str_lv_label); -be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, &be_const_str_print); -be_define_const_str(print, "print", 372738696u, 0, 5, NULL); -be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); -be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, NULL); -be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, &be_const_str_SYMBOL_SD_CARD); -be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_WEBCAM_HSD); -be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_WINDMETER_SPEED); -be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_lv_bar); -be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, &be_const_str_lv_line); -be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_tolower); -be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); -be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, &be_const_str_lv_objmask); -be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); -be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, &be_const_str_lv_cpicker); -be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, &be_const_str_start); -be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); -be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_concat); -be_define_const_str(concat, "concat", 4124019837u, 0, 6, &be_const_str_exec_rules); -be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, &be_const_str_write8); -be_define_const_str(write8, "write8", 3133991532u, 0, 6, NULL); -be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, NULL); -be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, NULL); -be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_asstring); -be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_lv_linemeter); -be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, &be_const_str_lv_switch); -be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_number); -be_define_const_str(number, "number", 467038368u, 0, 6, &be_const_str_read_bytes); -be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); -be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, NULL); -be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_group_focus_cb); -be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, NULL); -be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, NULL); -be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, NULL); -be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_SYMBOL_NEXT); -be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); -be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_lv_draw_mask_fade_param_cfg); -be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, &be_const_str_upper); -be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); -be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, &be_const_str_ROT1B); -be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, &be_const_str_exists); -be_define_const_str(exists, "exists", 1002329533u, 0, 6, NULL); -be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, NULL); -be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str_TUYA_TX); -be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_begin); -be_define_const_str(begin, "begin", 1748273790u, 0, 5, &be_const_str_encrypt); -be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, &be_const_str_resolvecmnd); -be_define_const_str(resolvecmnd, "resolvecmnd", 993361485u, 0, 11, NULL); -be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_item); -be_define_const_str(item, "item", 2671260646u, 0, 4, &be_const_str_lv_slider); -be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, &be_const_str_sin); -be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); -be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_time_dump); -be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); -be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, NULL); -be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_DDS2382_TX); -be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_lv_gauge_format_cb); -be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, &be_const_str_lv_signal_cb); -be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, &be_const_str_update); -be_define_const_str(update, "update", 672109684u, 0, 6, NULL); -be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, NULL); -be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, NULL); -be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_HPMA_RX); -be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_I2S_OUT_DATA); -be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, NULL); -be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_count); -be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_imgbtn); -be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, &be_const_str_wifi); -be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); -be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str__end_transmission); -be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); -be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, &be_const_str_i2c_enabled); -be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_lv_event_cb); -be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, NULL); -be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); -be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_asin); -be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_content_flush); -be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_read12); -be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); -be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, &be_const_str_SYMBOL_UP); -be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); -be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_SYMBOL_BATTERY_EMPTY); -be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, NULL); -be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_MAX31855DO); -be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, NULL); +be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_SYMBOL_WIFI); +be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, &be_const_str_TCP_RX); +be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, NULL); +be_define_const_str(LED1_INV, "LED1_INV", 2112045097u, 0, 8, &be_const_str_LEDLNK_INV); +be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_lv_btnmatrix); +be_define_const_str(lv_btnmatrix, "lv_btnmatrix", 626248489u, 0, 12, NULL); be_define_const_str(SPI_CLK, "SPI_CLK", 3943233814u, 0, 7, NULL); -be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_try_rule); -be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); -be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, &be_const_str_remove_cmd); -be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); -be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_lv_cb); -be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, &be_const_str_lv_draw_mask_radius_param_cfg); -be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); -be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_lv_textarea); -be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); -be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_SYMBOL_COPY); -be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_abs); -be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); -be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_SBR_RX); -be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, &be_const_str_lv_spinner); -be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); -be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_byte); -be_define_const_str(byte, "byte", 1683620383u, 0, 4, &be_const_str_web_send); +be_define_const_str(content_button, "content_button", 1956476087u, 0, 14, &be_const_str_content_stop); +be_define_const_str(content_stop, "content_stop", 658554751u, 0, 12, &be_const_str_dump); +be_define_const_str(dump, "dump", 3663001223u, 0, 4, NULL); +be_define_const_str(HPMA_TX, "HPMA_TX", 173233104u, 0, 7, &be_const_str_SR04_ECHO); +be_define_const_str(SR04_ECHO, "SR04_ECHO", 1906909592u, 0, 9, &be_const_str_WEBCAM_PSCLK); +be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_web_send); be_define_const_str(web_send, "web_send", 2989941448u, 0, 8, NULL); -be_define_const_str(clear, "clear", 1550717474u, 0, 5, &be_const_str_content_start); -be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, &be_const_str_wire1); -be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); -be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_nil); -be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); -be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str__timers); -be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, &be_const_str_call); -be_define_const_str(call, "call", 3018949801u, 0, 4, &be_const_str_lv_draw_mask_angle_param); -be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, NULL); -be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, NULL); -be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_lv_font); -be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, NULL); -be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_lv_obj); -be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_wire); -be_define_const_str(wire, "wire", 4082753944u, 0, 4, &be_const_str_as); -be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); -be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_exp); -be_define_const_str(exp, "exp", 1923516200u, 0, 3, NULL); -be_define_const_str(LEDLNK_INV, "LEDLNK_INV", 3559015101u, 0, 10, &be_const_str_resp_cmnd); -be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); -be_define_const_str(dot_p2, ".p2", 232398067u, 0, 3, NULL); -be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, NULL); -be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_PN532_TXD); -be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_SDM630_RX); -be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_cmd); -be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, &be_const_str_lv_draw_mask_saved); -be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, &be_const_str_seti); -be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); -be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); -be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_ZIGBEE_RST); -be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_gc); -be_define_const_str(gc, "gc", 1042313471u, 0, 2, &be_const_str_var); -be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); -be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_pin_used); -be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, NULL); -be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_SDCARD_CS); -be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, &be_const_str_SSD1351_DC); -be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_SYMBOL_VOLUME_MAX); -be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, NULL); -be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_DSB); -be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_getbits); -be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); -be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, &be_const_str_memory); -be_define_const_str(memory, "memory", 2229924270u, 0, 6, &be_const_str_raise); -be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); -be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_ROT1A); -be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_TM1637DIO); -be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str_WEBCAM_PSCLK); -be_define_const_str(WEBCAM_PSCLK, "WEBCAM_PSCLK", 3150007456u, 0, 12, &be_const_str_ZIGBEE_TX); -be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_super); -be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); -be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, &be_const_str_lv_design_cb); -be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, &be_const_str_name); -be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); -be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, NULL); -be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_SM16716_SEL); -be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str_load_font); -be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, NULL); -be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_TASMOTACLIENT_TXD); -be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, NULL); -be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, &be_const_str_write_bit); -be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); -be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_addr); -be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_pow); -be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); -be_define_const_str(loop, "loop", 3723446379u, 0, 4, NULL); -be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_SPI_CS); -be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, &be_const_str_get_light); -be_define_const_str(get_light, "get_light", 381930476u, 0, 9, &be_const_str_keys); -be_define_const_str(keys, "keys", 4182378701u, 0, 4, &be_const_str_run_deferred); -be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); -be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_except); -be_define_const_str(except, "except", 950914032u, 69, 6, NULL); -be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_WS2812); -be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, NULL); -be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_scale_uint); -be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); -be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_PROJECTOR_CTRL_TX); -be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_SSPI_CS); -be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_list); -be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_pop); -be_define_const_str(pop, "pop", 1362321360u, 0, 3, NULL); -be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, NULL); -be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_SYMBOL_USB); -be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str_XPT2046_CS); -be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_stop); -be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); -be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); -be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, NULL); -be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, NULL); -be_define_const_str(TELEINFO_ENABLE, "TELEINFO_ENABLE", 1600974501u, 0, 15, &be_const_str_map); -be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); -be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_I2C_SDA); -be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, &be_const_str_SSD1351_CS); -be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_setbits); -be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, &be_const_str_str); -be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); -be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str__buffer); -be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); -be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_NEOPOOL_TX); -be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_PMS5003_TX); -be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, NULL); -be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); -be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_find_key_i); +be_define_const_str(MAX31855CS, "MAX31855CS", 753620511u, 0, 10, NULL); +be_define_const_str(WEBCAM_HSD, "WEBCAM_HSD", 2648502504u, 0, 10, &be_const_str_find_op); +be_define_const_str(find_op, "find_op", 3766713376u, 0, 7, NULL); +be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str__rules); +be_define_const_str(_rules, "_rules", 4266217105u, 0, 6, NULL); +be_define_const_str(SYMBOL_PLUS, "SYMBOL_PLUS", 2860093262u, 0, 11, NULL); +be_define_const_str(RFSEND, "RFSEND", 1862630731u, 0, 6, &be_const_str_SAIR_TX); +be_define_const_str(SAIR_TX, "SAIR_TX", 268017311u, 0, 7, &be_const_str_WE517_RX); +be_define_const_str(WE517_RX, "WE517_RX", 4096577879u, 0, 8, NULL); +be_define_const_str(SHELLY_DIMMER_BOOT0, "SHELLY_DIMMER_BOOT0", 2948777716u, 0, 19, NULL); +be_define_const_str(SYMBOL_BACKSPACE, "SYMBOL_BACKSPACE", 1997168681u, 0, 16, &be_const_str_lv_area); +be_define_const_str(lv_area, "lv_area", 2521150401u, 0, 7, &be_const_str_read); +be_define_const_str(read, "read", 3470762949u, 0, 4, NULL); +be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, &be_const_str_lv_calendar); +be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, NULL); +be_define_const_str(TFMINIPLUS_RX, "TFMINIPLUS_RX", 1522203935u, 0, 13, NULL); +be_define_const_str(attrdump, "attrdump", 1521571304u, 0, 8, NULL); +be_define_const_str(SWT1_PD, "SWT1_PD", 4166278953u, 0, 7, &be_const_str_lv_imgbtn); +be_define_const_str(lv_imgbtn, "lv_imgbtn", 2402844429u, 0, 9, NULL); +be_define_const_str(SYMBOL_EDIT, "SYMBOL_EDIT", 1396182822u, 0, 11, &be_const_str___lower__); +be_define_const_str(__lower__, "__lower__", 123855590u, 0, 9, &be_const_str_lv_tabview); +be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, NULL); +be_define_const_str(OLED_RESET, "OLED_RESET", 4048987655u, 0, 10, &be_const_str_atan); +be_define_const_str(atan, "atan", 108579519u, 0, 4, NULL); +be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_lv_draw_mask_radius_param); +be_define_const_str(lv_draw_mask_radius_param, "lv_draw_mask_radius_param", 3777679220u, 0, 25, NULL); +be_define_const_str(tolower, "tolower", 1042520049u, 0, 7, NULL); +be_define_const_str(FTC532, "FTC532", 3182343438u, 0, 6, &be_const_str_if); +be_define_const_str(if, "if", 959999494u, 50, 2, NULL); +be_define_const_str(dot_p, ".p", 1171526419u, 0, 2, &be_const_str_KEY1); +be_define_const_str(KEY1, "KEY1", 6715975u, 0, 4, &be_const_str_millis); +be_define_const_str(millis, "millis", 1214679063u, 0, 6, NULL); +be_define_const_str(IRSEND, "IRSEND", 184848336u, 0, 6, &be_const_str_WEBCAM_HREF); +be_define_const_str(WEBCAM_HREF, "WEBCAM_HREF", 3161890024u, 0, 11, &be_const_str_cosh); +be_define_const_str(cosh, "cosh", 4099687964u, 0, 4, NULL); +be_define_const_str(DSB_OUT, "DSB_OUT", 732335085u, 0, 7, &be_const_str_MGC3130_RESET); +be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, NULL); +be_define_const_str(detect, "detect", 8884370u, 0, 6, &be_const_str_find_key_i); be_define_const_str(find_key_i, "find_key_i", 850136726u, 0, 10, NULL); -be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_arg_size); -be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); -be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_set_timer); -be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); -be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, &be_const_str_cb_dispatch); -be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, &be_const_str_fromstring); -be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, &be_const_str_lv_color); -be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); -be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_log10); -be_define_const_str(log10, "log10", 2346846000u, 0, 5, NULL); -be_define_const_str(eth, "eth", 2191266556u, 0, 3, NULL); -be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, NULL); -be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SYMBOL_CUT); -be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, &be_const_str_erase); -be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); -be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_hex); -be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); -be_define_const_str(arg, "arg", 1047474471u, 0, 3, &be_const_str_lv_tabview); -be_define_const_str(lv_tabview, "lv_tabview", 2109024786u, 0, 10, &be_const_str_scan); -be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_toupper); -be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); -be_define_const_str(tan, "tan", 2633446552u, 0, 3, NULL); -be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, &be_const_str_decrypt); -be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_isrunning); -be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, &be_const_str_lv_led); -be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_time_reached); -be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); -be_define_const_str(event, "event", 4264611999u, 0, 5, NULL); -be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_arg_name); -be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, NULL); -be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_ILI9341_CS); -be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_SPI_DC); -be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_SYMBOL_EYE_OPEN); -be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_add_driver); -be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); -be_define_const_str(MCP39F5_TX, "MCP39F5_TX", 1332322047u, 0, 10, &be_const_str_MP3_DFR562); -be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, &be_const_str_tanh); -be_define_const_str(tanh, "tanh", 153638352u, 0, 4, NULL); -be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_lv_calendar); -be_define_const_str(lv_calendar, "lv_calendar", 3284396894u, 0, 11, &be_const_str_on); -be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_tag); -be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL); -be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); -be_define_const_str(_available, "_available", 1306196581u, 0, 10, &be_const_str_assert); -be_define_const_str(assert, "assert", 2774883451u, 0, 6, NULL); -be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); -be_define_const_str(compile, "compile", 1000265118u, 0, 7, NULL); -be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_resize); -be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); -be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_register_button_encoder); -be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); -be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); -be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_I2S_OUT_SLCT); -be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_static); -be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); -be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_MHZ_TXD); -be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_gamma10); -be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, NULL); -be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_lv_draw_mask_line_param); -be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, NULL); -be_define_const_str(rand, "rand", 2711325910u, 0, 4, &be_const_str_remove_timer); -be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); -be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, &be_const_str_lv_dropdown); -be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_setitem); -be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); -be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_isinstance); -be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); -be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, &be_const_str_NEOPOOL_RX); -be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_SSD1331_DC); -be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, NULL); -be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SYMBOL_LEFT); -be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, NULL); -be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, &be_const_str_TM1638CLK); -be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, &be_const_str_setmember); -be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); -be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_setrange); -be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); -be_define_const_str(I2S_IN_CLK, "I2S_IN_CLK", 2996930120u, 0, 10, &be_const_str_SYMBOL_OK); -be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, &be_const_str_get); -be_define_const_str(get, "get", 1410115415u, 0, 3, NULL); -be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, &be_const_str_PULLDOWN); -be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, NULL); -be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, NULL); -be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, &be_const_str_SYMBOL_LOOP); -be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); -be_define_const_str(atan, "atan", 108579519u, 0, 4, &be_const_str_size); -be_define_const_str(size, "size", 597743964u, 0, 4, NULL); -be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_lower); -be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_wire_scan); -be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, &be_const_str_import); -be_define_const_str(import, "import", 288002260u, 66, 6, NULL); -be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_lv_gauge); -be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); -be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, &be_const_str_check_privileged_access); -be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_wire2); -be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); -be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, &be_const_str_collect); -be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_init); -be_define_const_str(init, "init", 380752755u, 0, 4, NULL); -be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_ROT1B_NP); -be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, &be_const_str_screenshot); -be_define_const_str(screenshot, "screenshot", 3894592561u, 0, 10, NULL); -be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_format); -be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_pi); -be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); -be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_lv_draw_mask_angle_param_cfg); -be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); -be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_SSPI_DC); -be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_traceback); -be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); -be_define_const_str(dot_p1, ".p1", 249175686u, 0, 3, &be_const_str_SYMBOL_PASTE); -be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_char); -be_define_const_str(char, "char", 2823553821u, 0, 4, NULL); -be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, &be_const_str_deinit); -be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); -be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, &be_const_str_srand); -be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); -be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_imin); -be_define_const_str(imin, "imin", 2714127864u, 0, 4, &be_const_str_toint); +be_define_const_str(I2S_OUT_CLK, "I2S_OUT_CLK", 2580200387u, 0, 11, &be_const_str_SBR_TX); +be_define_const_str(SBR_TX, "SBR_TX", 3419096015u, 0, 6, &be_const_str_SYMBOL_NEXT); +be_define_const_str(SYMBOL_NEXT, "SYMBOL_NEXT", 1102844455u, 0, 11, NULL); +be_define_const_str(SPI_CS, "SPI_CS", 553701236u, 0, 6, NULL); +be_define_const_str(HIGH, "HIGH", 2066738941u, 0, 4, &be_const_str_MP3_DFR562); +be_define_const_str(MP3_DFR562, "MP3_DFR562", 2859952977u, 0, 10, NULL); +be_define_const_str(REL1, "REL1", 3142397887u, 0, 4, NULL); +be_define_const_str(SHELLY_DIMMER_RST_INV, "SHELLY_DIMMER_RST_INV", 2366759773u, 0, 21, NULL); +be_define_const_str(NONE, "NONE", 1932136219u, 0, 4, &be_const_str_SR04_TRIG); +be_define_const_str(SR04_TRIG, "SR04_TRIG", 68671263u, 0, 9, NULL); +be_define_const_str(members, "members", 937576464u, 0, 7, &be_const_str_wifi); +be_define_const_str(wifi, "wifi", 120087624u, 0, 4, NULL); +be_define_const_str(LED1, "LED1", 21005825u, 0, 4, &be_const_str_lv_draw_mask_line_param_cfg); +be_define_const_str(lv_draw_mask_line_param_cfg, "lv_draw_mask_line_param_cfg", 2154874825u, 0, 27, &be_const_str_toint); be_define_const_str(toint, "toint", 3613182909u, 0, 5, NULL); -be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, &be_const_str_break); -be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); -be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_MGC3130_RESET); -be_define_const_str(MGC3130_RESET, "MGC3130_RESET", 405013121u, 0, 13, &be_const_str_insert); -be_define_const_str(insert, "insert", 3332609576u, 0, 6, NULL); -be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_SYMBOL_POWER); -be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, NULL); -be_define_const_str(SYMBOL_WIFI, "SYMBOL_WIFI", 682141303u, 0, 11, NULL); -be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, NULL); -be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, &be_const_str_resp_cmnd_str); -be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); -be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); -be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_SYMBOL_SHUFFLE); -be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, NULL); -be_define_const_str(false, "false", 184981848u, 62, 5, NULL); -be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, NULL); -be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_continue); -be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); -be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, &be_const_str_AudioOutput); -be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_SYMBOL_MUTE); -be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, &be_const_str_TM1638STB); +be_define_const_str(LE01MR_TX, "LE01MR_TX", 1589687023u, 0, 9, &be_const_str_SI7021); +be_define_const_str(SI7021, "SI7021", 864377911u, 0, 6, NULL); +be_define_const_str(_end_transmission, "_end_transmission", 3237480400u, 0, 17, NULL); +be_define_const_str(INPUT_PULLUP, "INPUT_PULLUP", 2912931654u, 0, 12, &be_const_str_var); +be_define_const_str(var, "var", 2317739966u, 64, 3, NULL); +be_define_const_str(exec_cmd, "exec_cmd", 493567399u, 0, 8, &be_const_str_resp_cmnd_error); +be_define_const_str(resp_cmnd_error, "resp_cmnd_error", 2404088863u, 0, 15, NULL); +be_define_const_str(OUTPUT_OPEN_DRAIN, "OUTPUT_OPEN_DRAIN", 2147249436u, 0, 17, NULL); +be_define_const_str(I2C_Driver, "I2C_Driver", 1714501658u, 0, 10, &be_const_str_MIEL_HVAC_TX); +be_define_const_str(MIEL_HVAC_TX, "MIEL_HVAC_TX", 567403014u, 0, 12, &be_const_str_lv_draw_label_dsc); +be_define_const_str(lv_draw_label_dsc, "lv_draw_label_dsc", 265601842u, 0, 17, NULL); +be_define_const_str(PULLUP, "PULLUP", 3417628531u, 0, 6, &be_const_str_SDM72_RX); +be_define_const_str(SDM72_RX, "SDM72_RX", 766750035u, 0, 8, &be_const_str_add_rule); +be_define_const_str(add_rule, "add_rule", 596540743u, 0, 8, &be_const_str_loop); +be_define_const_str(loop, "loop", 3723446379u, 0, 4, &be_const_str_return); +be_define_const_str(return, "return", 2246981567u, 60, 6, NULL); +be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_MIEL_HVAC_RX); +be_define_const_str(MIEL_HVAC_RX, "MIEL_HVAC_RX", 3720609648u, 0, 12, &be_const_str_SYMBOL_EYE_CLOSE); +be_define_const_str(SYMBOL_EYE_CLOSE, "SYMBOL_EYE_CLOSE", 404721792u, 0, 16, NULL); +be_define_const_str(BS814_DAT, "BS814_DAT", 3620403837u, 0, 9, &be_const_str_TM1638STB); be_define_const_str(TM1638STB, "TM1638STB", 823674593u, 0, 9, NULL); -be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_BOILER_OT_RX); -be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_TUYA_RX); -be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_remove); -be_define_const_str(remove, "remove", 3683784189u, 0, 6, &be_const_str_web_send_decimal); -be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); -be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); -be_define_const_str(CHANGE, "CHANGE", 4280911421u, 0, 6, &be_const_str_SM2135_CLK); -be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_TCP_RX); -be_define_const_str(TCP_RX, "TCP_RX", 3904354751u, 0, 6, &be_const_str_codedump); -be_define_const_str(codedump, "codedump", 1786337906u, 0, 8, NULL); -be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, &be_const_str_def); +be_define_const_str(I2C_SDA, "I2C_SDA", 1052592262u, 0, 7, NULL); +be_define_const_str(CC1101_GDO0, "CC1101_GDO0", 940611027u, 0, 11, &be_const_str_arg_name); +be_define_const_str(arg_name, "arg_name", 1345046155u, 0, 8, &be_const_str_cb_dispatch); +be_define_const_str(cb_dispatch, "cb_dispatch", 1741510499u, 0, 11, NULL); +be_define_const_str(WEBCAM_RESET, "WEBCAM_RESET", 2171221520u, 0, 12, &be_const_str_lv_draw_line_dsc); +be_define_const_str(lv_draw_line_dsc, "lv_draw_line_dsc", 2422805236u, 0, 16, NULL); +be_define_const_str(sin, "sin", 3761252941u, 0, 3, NULL); +be_define_const_str(SPI_MISO, "SPI_MISO", 150818010u, 0, 8, &be_const_str_SYMBOL_BATTERY_2); +be_define_const_str(SYMBOL_BATTERY_2, "SYMBOL_BATTERY_2", 645813682u, 0, 16, NULL); +be_define_const_str(lv_draw_mask_saved, "lv_draw_mask_saved", 2063709159u, 0, 18, &be_const_str_sinh); +be_define_const_str(sinh, "sinh", 282220607u, 0, 4, NULL); +be_define_const_str(OUTPUT_LO, "OUTPUT_LO", 3724620328u, 0, 9, NULL); +be_define_const_str(ADC_PH, "ADC_PH", 3820290594u, 0, 6, &be_const_str_state); +be_define_const_str(state, "state", 2016490230u, 0, 5, NULL); +be_define_const_str(abs, "abs", 709362235u, 0, 3, NULL); +be_define_const_str(KEY1_INV_PD, "KEY1_INV_PD", 3828014584u, 0, 11, &be_const_str_SYMBOL_SD_CARD); +be_define_const_str(SYMBOL_SD_CARD, "SYMBOL_SD_CARD", 2542376484u, 0, 14, &be_const_str_add); +be_define_const_str(add, "add", 993596020u, 0, 3, NULL); +be_define_const_str(LOW, "LOW", 3526092385u, 0, 3, &be_const_str_SYMBOL_REFRESH); +be_define_const_str(SYMBOL_REFRESH, "SYMBOL_REFRESH", 1266229761u, 0, 14, NULL); +be_define_const_str(AudioGenerator, "AudioGenerator", 1839297342u, 0, 14, NULL); +be_define_const_str(iter, "iter", 3124256359u, 0, 4, &be_const_str_set); +be_define_const_str(set, "set", 3324446467u, 0, 3, NULL); +be_define_const_str(_begin_transmission, "_begin_transmission", 2779461176u, 0, 19, &be_const_str_def); be_define_const_str(def, "def", 3310976652u, 55, 3, NULL); -be_define_const_str(CNTR1_NP, "CNTR1_NP", 4288381648u, 0, 8, &be_const_str_GPS_TX); -be_define_const_str(GPS_TX, "GPS_TX", 4228740808u, 0, 6, &be_const_str_TASMOTACLIENT_RXD); -be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_classname); -be_define_const_str(classname, "classname", 1998589948u, 0, 9, NULL); -be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, NULL); +be_define_const_str(DI, "DI", 1070498734u, 0, 2, &be_const_str_HLW_CF); +be_define_const_str(HLW_CF, "HLW_CF", 3982619486u, 0, 6, NULL); +be_define_const_str(imin, "imin", 2714127864u, 0, 4, NULL); +be_define_const_str(ETH_PHY_MDC, "ETH_PHY_MDC", 1519379581u, 0, 11, &be_const_str_IBEACON_TX); +be_define_const_str(IBEACON_TX, "IBEACON_TX", 3471826977u, 0, 10, &be_const_str_SSD1351_DC); +be_define_const_str(SSD1351_DC, "SSD1351_DC", 84950353u, 0, 10, &be_const_str_lv_draw_mask_angle_param); +be_define_const_str(lv_draw_mask_angle_param, "lv_draw_mask_angle_param", 4192166041u, 0, 24, &be_const_str_lv_style); +be_define_const_str(lv_style, "lv_style", 4151611549u, 0, 8, &be_const_str_srand); +be_define_const_str(srand, "srand", 465518633u, 0, 5, NULL); +be_define_const_str(IEM3000_TX, "IEM3000_TX", 1185907310u, 0, 10, &be_const_str_PMS5003_RX); +be_define_const_str(PMS5003_RX, "PMS5003_RX", 3934985650u, 0, 10, NULL); +be_define_const_str(I2S_IN_SLCT, "I2S_IN_SLCT", 706051516u, 0, 11, &be_const_str_RA8876_CS); +be_define_const_str(RA8876_CS, "RA8876_CS", 2529944108u, 0, 9, &be_const_str_asstring); +be_define_const_str(asstring, "asstring", 1298225088u, 0, 8, &be_const_str_ceil); +be_define_const_str(ceil, "ceil", 1659167240u, 0, 4, &be_const_str_count); +be_define_const_str(count, "count", 967958004u, 0, 5, &be_const_str_lv_draw_mask_map_param); +be_define_const_str(lv_draw_mask_map_param, "lv_draw_mask_map_param", 1666886804u, 0, 22, NULL); +be_define_const_str(lv_spinner, "lv_spinner", 3361501901u, 0, 10, NULL); +be_define_const_str(HPMA_RX, "HPMA_RX", 3462528998u, 0, 7, &be_const_str_KEY1_NP); +be_define_const_str(KEY1_NP, "KEY1_NP", 709918726u, 0, 7, NULL); +be_define_const_str(opt_eq, "==", 2431966415u, 0, 2, &be_const_str_resp_cmnd_done); +be_define_const_str(resp_cmnd_done, "resp_cmnd_done", 2601874875u, 0, 14, NULL); +be_define_const_str(rtc, "rtc", 1070575216u, 0, 3, &be_const_str_write_bytes); +be_define_const_str(write_bytes, "write_bytes", 1227543792u, 0, 11, NULL); +be_define_const_str(read24, "read24", 1808533811u, 0, 6, NULL); +be_define_const_str(digital_read, "digital_read", 3585496928u, 0, 12, NULL); +be_define_const_str(lv_checkbox, "lv_checkbox", 7454841u, 0, 11, NULL); +be_define_const_str(ADC_LIGHT, "ADC_LIGHT", 3982461502u, 0, 9, NULL); +be_define_const_str(ADC_CT_POWER, "ADC_CT_POWER", 3382284599u, 0, 12, &be_const_str_lv_gauge); +be_define_const_str(lv_gauge, "lv_gauge", 118613531u, 0, 8, NULL); +be_define_const_str(SYMBOL_EYE_OPEN, "SYMBOL_EYE_OPEN", 3449311676u, 0, 15, &be_const_str_lv_list); +be_define_const_str(lv_list, "lv_list", 2876551248u, 0, 7, NULL); +be_define_const_str(MHZ_TXD, "MHZ_TXD", 3310158233u, 0, 7, &be_const_str_TUYA_TX); +be_define_const_str(TUYA_TX, "TUYA_TX", 1541301465u, 0, 7, &be_const_str_resize); +be_define_const_str(resize, "resize", 3514612129u, 0, 6, NULL); +be_define_const_str(SYMBOL_STOP, "SYMBOL_STOP", 2836505202u, 0, 11, &be_const_str_XPT2046_CS); +be_define_const_str(XPT2046_CS, "XPT2046_CS", 4049231042u, 0, 10, &be_const_str_rand); +be_define_const_str(rand, "rand", 2711325910u, 0, 4, NULL); +be_define_const_str(PMS5003_TX, "PMS5003_TX", 3868169364u, 0, 10, &be_const_str_cos); +be_define_const_str(cos, "cos", 4220379804u, 0, 3, NULL); +be_define_const_str(SSPI_MOSI, "SSPI_MOSI", 3745917497u, 0, 9, &be_const_str_SYMBOL_HOME); +be_define_const_str(SYMBOL_HOME, "SYMBOL_HOME", 730845525u, 0, 11, &be_const_str__ccmd); +be_define_const_str(_ccmd, "_ccmd", 2163421413u, 0, 5, &be_const_str_try_rule); +be_define_const_str(try_rule, "try_rule", 1986449405u, 0, 8, NULL); +be_define_const_str(SYMBOL_CHARGE, "SYMBOL_CHARGE", 2106391946u, 0, 13, NULL); +be_define_const_str(MAX31855CLK, "MAX31855CLK", 715977727u, 0, 11, &be_const_str_ROT1A_NP); +be_define_const_str(ROT1A_NP, "ROT1A_NP", 2322706903u, 0, 8, &be_const_str_SYMBOL_IMAGE); +be_define_const_str(SYMBOL_IMAGE, "SYMBOL_IMAGE", 815601151u, 0, 12, NULL); +be_define_const_str(INTERRUPT, "INTERRUPT", 3809502704u, 0, 9, &be_const_str_SOLAXX1_TX); +be_define_const_str(SOLAXX1_TX, "SOLAXX1_TX", 903770840u, 0, 10, &be_const_str_lv_btn); +be_define_const_str(lv_btn, "lv_btn", 1612829968u, 0, 6, &be_const_str_lv_signal_cb); +be_define_const_str(lv_signal_cb, "lv_signal_cb", 3295792564u, 0, 12, NULL); +be_define_const_str(I2S_OUT_DATA, "I2S_OUT_DATA", 1176288293u, 0, 12, &be_const_str_TM1637DIO); +be_define_const_str(TM1637DIO, "TM1637DIO", 1574659381u, 0, 9, &be_const_str__write); +be_define_const_str(_write, "_write", 2215462825u, 0, 6, &be_const_str_floor); +be_define_const_str(floor, "floor", 3102149661u, 0, 5, NULL); +be_define_const_str(TM1638CLK, "TM1638CLK", 3045182446u, 0, 9, NULL); +be_define_const_str(HJL_CF, "HJL_CF", 786158487u, 0, 6, &be_const_str_WIEGAND_D0); +be_define_const_str(WIEGAND_D0, "WIEGAND_D0", 4192335759u, 0, 10, NULL); +be_define_const_str(NEOPOOL_TX, "NEOPOOL_TX", 2924925804u, 0, 10, &be_const_str_ZIGBEE_TX); +be_define_const_str(ZIGBEE_TX, "ZIGBEE_TX", 25119256u, 0, 9, &be_const_str_load_freetype_font); +be_define_const_str(load_freetype_font, "load_freetype_font", 2368447592u, 0, 18, &be_const_str_lv_arc); +be_define_const_str(lv_arc, "lv_arc", 4170125384u, 0, 6, &be_const_str_lv_switch); +be_define_const_str(lv_switch, "lv_switch", 3407171508u, 0, 9, &be_const_str_tanh); +be_define_const_str(tanh, "tanh", 153638352u, 0, 4, &be_const_str_for); +be_define_const_str(for, "for", 2901640080u, 54, 3, NULL); +be_define_const_str(I2S_OUT_SLCT, "I2S_OUT_SLCT", 4037293837u, 0, 12, &be_const_str_SENSOR_END); +be_define_const_str(SENSOR_END, "SENSOR_END", 3512542657u, 0, 10, NULL); +be_define_const_str(EPAPER29_CS, "EPAPER29_CS", 3916373594u, 0, 11, NULL); +be_define_const_str(SM16716_SEL, "SM16716_SEL", 142377379u, 0, 11, &be_const_str__cb); +be_define_const_str(_cb, "_cb", 4043300367u, 0, 3, NULL); +be_define_const_str(save, "save", 3439296072u, 0, 4, &be_const_str_toupper); +be_define_const_str(toupper, "toupper", 3691983576u, 0, 7, NULL); +be_define_const_str(lv_tileview, "lv_tileview", 2419887973u, 0, 11, NULL); +be_define_const_str(WEBCAM_VSYNC, "WEBCAM_VSYNC", 4032882166u, 0, 12, &be_const_str_find); +be_define_const_str(find, "find", 3186656602u, 0, 4, &be_const_str_remove_cmd); +be_define_const_str(remove_cmd, "remove_cmd", 3832315702u, 0, 10, NULL); +be_define_const_str(PZEM016_RX, "PZEM016_RX", 1004012055u, 0, 10, &be_const_str_SYMBOL_EJECT); +be_define_const_str(SYMBOL_EJECT, "SYMBOL_EJECT", 873760647u, 0, 12, NULL); +be_define_const_str(AudioGeneratorWAV, "AudioGeneratorWAV", 2746509368u, 0, 17, &be_const_str_on); +be_define_const_str(on, "on", 1630810064u, 0, 2, &be_const_str_setrange); +be_define_const_str(setrange, "setrange", 3794019032u, 0, 8, NULL); +be_define_const_str(arg_size, "arg_size", 3310243257u, 0, 8, NULL); +be_define_const_str(opt_call, "()", 685372826u, 0, 2, &be_const_str_SYMBOL_CALL); +be_define_const_str(SYMBOL_CALL, "SYMBOL_CALL", 1444504366u, 0, 11, &be_const_str_SYMBOL_GPS); +be_define_const_str(SYMBOL_GPS, "SYMBOL_GPS", 3044165570u, 0, 10, &be_const_str_pin_mode); +be_define_const_str(pin_mode, "pin_mode", 3258314030u, 0, 8, &be_const_str_end); +be_define_const_str(end, "end", 1787721130u, 56, 3, NULL); +be_define_const_str(gc, "gc", 1042313471u, 0, 2, NULL); +be_define_const_str(_buffer, "_buffer", 2044888568u, 0, 7, NULL); +be_define_const_str(TCP_TX, "TCP_TX", 2762594089u, 0, 6, &be_const_str_push); +be_define_const_str(push, "push", 2272264157u, 0, 4, NULL); +be_define_const_str(AS608_TX, "AS608_TX", 48630934u, 0, 8, &be_const_str_I2C_SCL); +be_define_const_str(I2C_SCL, "I2C_SCL", 164217098u, 0, 7, &be_const_str_ST7789_CS); +be_define_const_str(ST7789_CS, "ST7789_CS", 2937305434u, 0, 9, NULL); +be_define_const_str(BUZZER_INV, "BUZZER_INV", 3274564335u, 0, 10, &be_const_str_SDM120_TX); +be_define_const_str(SDM120_TX, "SDM120_TX", 2509332415u, 0, 9, NULL); +be_define_const_str(lv_cont, "lv_cont", 1391686552u, 0, 7, &be_const_str_time_str); +be_define_const_str(time_str, "time_str", 2613827612u, 0, 8, NULL); +be_define_const_str(log, "log", 1062293841u, 0, 3, &be_const_str_lv_font); +be_define_const_str(lv_font, "lv_font", 1550958453u, 0, 7, &be_const_str_map); +be_define_const_str(map, "map", 3751997361u, 0, 3, NULL); +be_define_const_str(OUTPUT_HI, "OUTPUT_HI", 3153592902u, 0, 9, &be_const_str_memory); +be_define_const_str(memory, "memory", 2229924270u, 0, 6, NULL); +be_define_const_str(SDCARD_CS, "SDCARD_CS", 3348952003u, 0, 9, NULL); +be_define_const_str(ETH_PHY_MDIO, "ETH_PHY_MDIO", 3261871568u, 0, 12, &be_const_str_update); +be_define_const_str(update, "update", 672109684u, 0, 6, NULL); +be_define_const_str(TASMOTACLIENT_RST, "TASMOTACLIENT_RST", 3326196213u, 0, 17, &be_const_str_lv_draw_mask_fade_param_cfg); +be_define_const_str(lv_draw_mask_fade_param_cfg, "lv_draw_mask_fade_param_cfg", 4158595197u, 0, 27, NULL); +be_define_const_str(lv_msgbox, "lv_msgbox", 689085206u, 0, 9, &be_const_str_try); +be_define_const_str(try, "try", 2887626766u, 68, 3, NULL); +be_define_const_str(HALLEFFECT, "HALLEFFECT", 3334305407u, 0, 10, &be_const_str_INPUT); +be_define_const_str(INPUT, "INPUT", 1638025307u, 0, 5, NULL); +be_define_const_str(BS814_CLK, "BS814_CLK", 3002713336u, 0, 9, &be_const_str_KEY1_PD); +be_define_const_str(KEY1_PD, "KEY1_PD", 3934075620u, 0, 7, NULL); +be_define_const_str(AS3935, "AS3935", 603621745u, 0, 6, &be_const_str_EXS_ENABLE); +be_define_const_str(EXS_ENABLE, "EXS_ENABLE", 1896914313u, 0, 10, &be_const_str_WE517_TX); +be_define_const_str(WE517_TX, "WE517_TX", 2954817217u, 0, 8, &be_const_str_WEBCAM_DATA); +be_define_const_str(WEBCAM_DATA, "WEBCAM_DATA", 1476954421u, 0, 11, &be_const_str_load); +be_define_const_str(load, "load", 3859241449u, 0, 4, NULL); +be_define_const_str(opt_add, "+", 772578730u, 0, 1, &be_const_str_DSB); +be_define_const_str(DSB, "DSB", 98073254u, 0, 3, &be_const_str_TM1638DIO); +be_define_const_str(TM1638DIO, "TM1638DIO", 1408212414u, 0, 9, &be_const_str_resp_cmnd_str); +be_define_const_str(resp_cmnd_str, "resp_cmnd_str", 737845590u, 0, 13, NULL); +be_define_const_str(add_cmd, "add_cmd", 3361630879u, 0, 7, &be_const_str_lv_sqrt_res); +be_define_const_str(lv_sqrt_res, "lv_sqrt_res", 2904473995u, 0, 11, NULL); +be_define_const_str(EPD_DATA, "EPD_DATA", 3799141097u, 0, 8, NULL); +be_define_const_str(MD5, "MD5", 1935726387u, 0, 3, &be_const_str_SDS0X1_TX); +be_define_const_str(SDS0X1_TX, "SDS0X1_TX", 165045983u, 0, 9, &be_const_str_content_flush); +be_define_const_str(content_flush, "content_flush", 214922475u, 0, 13, &be_const_str_fromb64); +be_define_const_str(fromb64, "fromb64", 2717019639u, 0, 7, NULL); +be_define_const_str(ADC_TEMP, "ADC_TEMP", 3771053440u, 0, 8, &be_const_str_pin); +be_define_const_str(pin, "pin", 1866532500u, 0, 3, &be_const_str_wire); +be_define_const_str(wire, "wire", 4082753944u, 0, 4, NULL); +be_define_const_str(ZIGBEE_RST, "ZIGBEE_RST", 721588661u, 0, 10, &be_const_str_lv_led); +be_define_const_str(lv_led, "lv_led", 3192184733u, 0, 6, &be_const_str_redirect); +be_define_const_str(redirect, "redirect", 389758641u, 0, 8, NULL); +be_define_const_str(PWM1_INV, "PWM1_INV", 3939021030u, 0, 8, NULL); +be_define_const_str(SYMBOL_LEFT, "SYMBOL_LEFT", 1563517575u, 0, 11, &be_const_str_SYMBOL_PREV); +be_define_const_str(SYMBOL_PREV, "SYMBOL_PREV", 2952615023u, 0, 11, NULL); +be_define_const_str(P9813_DAT, "P9813_DAT", 778577052u, 0, 9, &be_const_str_SYMBOL_PLAY); +be_define_const_str(SYMBOL_PLAY, "SYMBOL_PLAY", 1750902100u, 0, 11, NULL); +be_define_const_str(true, "true", 1303515621u, 61, 4, NULL); +be_define_const_str(resp_cmnd, "resp_cmnd", 2869459626u, 0, 9, NULL); +be_define_const_str(MGC3130_XFER, "MGC3130_XFER", 4178219131u, 0, 12, &be_const_str_gen_cb); +be_define_const_str(gen_cb, "gen_cb", 3245227551u, 0, 6, NULL); +be_define_const_str(MCP39F5_RST, "MCP39F5_RST", 3657125652u, 0, 11, &be_const_str_rad); +be_define_const_str(rad, "rad", 1358899048u, 0, 3, NULL); +be_define_const_str(SYMBOL_BULLET, "SYMBOL_BULLET", 587181862u, 0, 13, NULL); +be_define_const_str(KEY1_INV, "KEY1_INV", 263542563u, 0, 8, &be_const_str_SYMBOL_BATTERY_1); +be_define_const_str(SYMBOL_BATTERY_1, "SYMBOL_BATTERY_1", 629036063u, 0, 16, NULL); +be_define_const_str(FALLING, "FALLING", 2851701064u, 0, 7, &be_const_str_RDM6300_RX); +be_define_const_str(RDM6300_RX, "RDM6300_RX", 1522345628u, 0, 10, &be_const_str_SYMBOL_USB); +be_define_const_str(SYMBOL_USB, "SYMBOL_USB", 1962656552u, 0, 10, &be_const_str__timers); +be_define_const_str(_timers, "_timers", 2600100916u, 0, 7, NULL); +be_define_const_str(WEBCAM_PCLK, "WEBCAM_PCLK", 3813770649u, 0, 11, &be_const_str_open); +be_define_const_str(open, "open", 3546203337u, 0, 4, NULL); +be_define_const_str(DDS2382_RX, "DDS2382_RX", 432446462u, 0, 10, &be_const_str_name); +be_define_const_str(name, "name", 2369371622u, 0, 4, NULL); +be_define_const_str(ILI9341_DC, "ILI9341_DC", 28838624u, 0, 10, &be_const_str_SYMBOL_AUDIO); +be_define_const_str(SYMBOL_AUDIO, "SYMBOL_AUDIO", 3056537956u, 0, 12, &be_const_str_exec_rules); +be_define_const_str(exec_rules, "exec_rules", 1445221092u, 0, 10, NULL); +be_define_const_str(SDM630_RX, "SDM630_RX", 1971606309u, 0, 9, &be_const_str_content_send); +be_define_const_str(content_send, "content_send", 1673733649u, 0, 12, NULL); +be_define_const_str(MAX7219CLK, "MAX7219CLK", 963568838u, 0, 10, &be_const_str_NEOPOOL_RX); +be_define_const_str(NEOPOOL_RX, "NEOPOOL_RX", 1917974474u, 0, 10, &be_const_str_item); +be_define_const_str(item, "item", 2671260646u, 0, 4, NULL); +be_define_const_str(VL53L0X_XSHUT1, "VL53L0X_XSHUT1", 2341134183u, 0, 14, NULL); +be_define_const_str(ARIRFRCV, "ARIRFRCV", 1120816444u, 0, 8, &be_const_str_HX711_SCK); +be_define_const_str(HX711_SCK, "HX711_SCK", 3785979404u, 0, 9, &be_const_str_OPEN_DRAIN); +be_define_const_str(OPEN_DRAIN, "OPEN_DRAIN", 677872608u, 0, 10, &be_const_str_delay); +be_define_const_str(delay, "delay", 1322381784u, 0, 5, &be_const_str_lv_draw_mask_line_param); +be_define_const_str(lv_draw_mask_line_param, "lv_draw_mask_line_param", 2692990704u, 0, 23, &be_const_str_lv_draw_rect_dsc); +be_define_const_str(lv_draw_rect_dsc, "lv_draw_rect_dsc", 3246772488u, 0, 16, &be_const_str_super); +be_define_const_str(super, "super", 4152230356u, 0, 5, NULL); +be_define_const_str(SAIR_RX, "SAIR_RX", 1273688713u, 0, 7, &be_const_str__available); +be_define_const_str(_available, "_available", 1306196581u, 0, 10, NULL); +be_define_const_str(ADC_INPUT, "ADC_INPUT", 2207556878u, 0, 9, NULL); +be_define_const_str(acos, "acos", 1006755615u, 0, 4, &be_const_str_lv_linemeter); +be_define_const_str(lv_linemeter, "lv_linemeter", 1413069363u, 0, 12, NULL); +be_define_const_str(TFMINIPLUS_TX, "TFMINIPLUS_TX", 2527875337u, 0, 13, &be_const_str_lv_cb); +be_define_const_str(lv_cb, "lv_cb", 1389787433u, 0, 5, NULL); +be_define_const_str(AudioFileSource, "AudioFileSource", 2959980058u, 0, 15, &be_const_str_PULLDOWN); +be_define_const_str(PULLDOWN, "PULLDOWN", 1853074086u, 0, 8, &be_const_str_allocated); +be_define_const_str(allocated, "allocated", 429986098u, 0, 9, &be_const_str_read12); +be_define_const_str(read12, "read12", 4291076970u, 0, 6, NULL); +be_define_const_str(RC522_RST, "RC522_RST", 720511443u, 0, 9, &be_const_str_SM16716_CLK); +be_define_const_str(SM16716_CLK, "SM16716_CLK", 3037641483u, 0, 11, &be_const_str_tag); +be_define_const_str(tag, "tag", 2516003219u, 0, 3, NULL); +be_define_const_str(AudioOutput, "AudioOutput", 3257792048u, 0, 11, &be_const_str_PN532_TXD); +be_define_const_str(PN532_TXD, "PN532_TXD", 3093418644u, 0, 9, &be_const_str_Wire); +be_define_const_str(Wire, "Wire", 1938276536u, 0, 4, NULL); +be_define_const_str(AudioFileSourceFS, "AudioFileSourceFS", 1839147653u, 0, 17, NULL); +be_define_const_str(lv_img, "lv_img", 2474052327u, 0, 6, &be_const_str_time_dump); +be_define_const_str(time_dump, "time_dump", 3330410747u, 0, 9, NULL); +be_define_const_str(number, "number", 467038368u, 0, 6, NULL); +be_define_const_str(module, "module", 3617558685u, 0, 6, &be_const_str_time_reached); +be_define_const_str(time_reached, "time_reached", 2075136773u, 0, 12, NULL); +be_define_const_str(ADE7953_IRQ, "ADE7953_IRQ", 2329185922u, 0, 11, &be_const_str_IRRECV); +be_define_const_str(IRRECV, "IRRECV", 1743648982u, 0, 6, NULL); +be_define_const_str(A4988_MS1, "A4988_MS1", 1729976611u, 0, 9, &be_const_str_ELECTRIQ_MOODL_TX); +be_define_const_str(ELECTRIQ_MOODL_TX, "ELECTRIQ_MOODL_TX", 31009247u, 0, 17, NULL); +be_define_const_str(PZEM0XX_TX, "PZEM0XX_TX", 944775704u, 0, 10, &be_const_str_fromstring); +be_define_const_str(fromstring, "fromstring", 610302344u, 0, 10, NULL); +be_define_const_str(LEDLNK, "LEDLNK", 2862810701u, 0, 6, &be_const_str_lv_obj); +be_define_const_str(lv_obj, "lv_obj", 4257833149u, 0, 6, &be_const_str_set_power); +be_define_const_str(set_power, "set_power", 549820893u, 0, 9, NULL); +be_define_const_str(SYMBOL_WARNING, "SYMBOL_WARNING", 4119913686u, 0, 14, NULL); +be_define_const_str(input, "input", 4191711099u, 0, 5, NULL); +be_define_const_str(RF_SENSOR, "RF_SENSOR", 2289628100u, 0, 9, &be_const_str_pop); +be_define_const_str(pop, "pop", 1362321360u, 0, 3, &be_const_str_nil); +be_define_const_str(nil, "nil", 228849900u, 63, 3, NULL); +be_define_const_str(setmember, "setmember", 1432909441u, 0, 9, NULL); +be_define_const_str(lv_point, "lv_point", 4120221790u, 0, 8, NULL); +be_define_const_str(get, "get", 1410115415u, 0, 3, &be_const_str_static); +be_define_const_str(static, "static", 3532702267u, 71, 6, NULL); +be_define_const_str(MAX7219CS, "MAX7219CS", 2593198244u, 0, 9, &be_const_str_lv_group_focus_cb); +be_define_const_str(lv_group_focus_cb, "lv_group_focus_cb", 4288873836u, 0, 17, &be_const_str_else); +be_define_const_str(else, "else", 3183434736u, 52, 4, &be_const_str_import); +be_define_const_str(import, "import", 288002260u, 66, 6, NULL); +be_define_const_str(erase, "erase", 1010949589u, 0, 5, NULL); +be_define_const_str(lv_indev, "lv_indev", 225602374u, 0, 8, NULL); +be_define_const_str(ROT1A, "ROT1A", 759599716u, 0, 5, &be_const_str_SWT1); +be_define_const_str(SWT1, "SWT1", 805224112u, 0, 4, &be_const_str_TX2X_TXD_BLACK); +be_define_const_str(TX2X_TXD_BLACK, "TX2X_TXD_BLACK", 956526176u, 0, 14, NULL); +be_define_const_str(RXD, "RXD", 2311579049u, 0, 3, &be_const_str_SYMBOL_DIRECTORY); +be_define_const_str(SYMBOL_DIRECTORY, "SYMBOL_DIRECTORY", 1886053449u, 0, 16, &be_const_str_ZEROCROSS); +be_define_const_str(ZEROCROSS, "ZEROCROSS", 1747596785u, 0, 9, &be_const_str_get_power); +be_define_const_str(get_power, "get_power", 3009799377u, 0, 9, &be_const_str_read13); +be_define_const_str(read13, "read13", 12887293u, 0, 6, NULL); +be_define_const_str(WEBCAM_PWDN, "WEBCAM_PWDN", 2219597454u, 0, 11, &be_const_str__get_cb); +be_define_const_str(_get_cb, "_get_cb", 1448849122u, 0, 7, &be_const_str_montserrat_font); +be_define_const_str(montserrat_font, "montserrat_font", 1819065874u, 0, 15, NULL); +be_define_const_str(SYMBOL_KEYBOARD, "SYMBOL_KEYBOARD", 1621492879u, 0, 15, &be_const_str_SYMBOL_SAVE); +be_define_const_str(SYMBOL_SAVE, "SYMBOL_SAVE", 2439821015u, 0, 11, &be_const_str_digital_write); +be_define_const_str(digital_write, "digital_write", 3435877979u, 0, 13, NULL); +be_define_const_str(HM10_TX, "HM10_TX", 1522037252u, 0, 7, &be_const_str_WIEGAND_D1); +be_define_const_str(WIEGAND_D1, "WIEGAND_D1", 4175558140u, 0, 10, &be_const_str_exp); +be_define_const_str(exp, "exp", 1923516200u, 0, 3, &be_const_str_run_deferred); +be_define_const_str(run_deferred, "run_deferred", 371594696u, 0, 12, NULL); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_SYMBOL_VOLUME_MID); +be_define_const_str(SYMBOL_VOLUME_MID, "SYMBOL_VOLUME_MID", 158835057u, 0, 17, &be_const_str_i2c_enabled); +be_define_const_str(i2c_enabled, "i2c_enabled", 218388101u, 0, 11, &be_const_str_lv_bar); +be_define_const_str(lv_bar, "lv_bar", 1582673229u, 0, 6, NULL); +be_define_const_str(PZEM004_RX, "PZEM004_RX", 3411153194u, 0, 10, NULL); +be_define_const_str(TXD, "TXD", 3614562079u, 0, 3, &be_const_str_event); +be_define_const_str(event, "event", 4264611999u, 0, 5, &be_const_str_load_font); +be_define_const_str(load_font, "load_font", 1875840019u, 0, 9, &be_const_str_upper); +be_define_const_str(upper, "upper", 176974407u, 0, 5, NULL); +be_define_const_str(CSE7761_RX, "CSE7761_RX", 65423248u, 0, 10, &be_const_str_copy); +be_define_const_str(copy, "copy", 3848464964u, 0, 4, &be_const_str_write); +be_define_const_str(write, "write", 3190202204u, 0, 5, &be_const_str_false); +be_define_const_str(false, "false", 184981848u, 62, 5, NULL); +be_define_const_str(traceback, "traceback", 3385188109u, 0, 9, NULL); +be_define_const_str(PZEM017_RX, "PZEM017_RX", 3227495894u, 0, 10, &be_const_str_SYMBOL_DOWNLOAD); +be_define_const_str(SYMBOL_DOWNLOAD, "SYMBOL_DOWNLOAD", 2607324090u, 0, 15, NULL); +be_define_const_str(byte, "byte", 1683620383u, 0, 4, NULL); +be_define_const_str(DDSU666_RX, "DDSU666_RX", 1812507936u, 0, 10, &be_const_str_lv_event_cb); +be_define_const_str(lv_event_cb, "lv_event_cb", 2480731016u, 0, 11, &be_const_str_str); +be_define_const_str(str, "str", 3259748752u, 0, 3, NULL); +be_define_const_str(BOILER_OT_RX, "BOILER_OT_RX", 603647409u, 0, 12, &be_const_str_call); +be_define_const_str(call, "call", 3018949801u, 0, 4, NULL); +be_define_const_str(SM2135_DAT, "SM2135_DAT", 2882726942u, 0, 10, &be_const_str_SYMBOL_LIST); +be_define_const_str(SYMBOL_LIST, "SYMBOL_LIST", 70793990u, 0, 11, &be_const_str_lv_design_cb); +be_define_const_str(lv_design_cb, "lv_design_cb", 3822640502u, 0, 12, NULL); +be_define_const_str(BL0940_RX, "BL0940_RX", 2908993179u, 0, 9, &be_const_str_cmd); +be_define_const_str(cmd, "cmd", 4136785899u, 0, 3, NULL); +be_define_const_str(_request_from, "_request_from", 3965148604u, 0, 13, &be_const_str_remove_rule); +be_define_const_str(remove_rule, "remove_rule", 3456211328u, 0, 11, &be_const_str_tan); +be_define_const_str(tan, "tan", 2633446552u, 0, 3, &be_const_str_except); +be_define_const_str(except, "except", 950914032u, 69, 6, NULL); +be_define_const_str(SYMBOL_BATTERY_EMPTY, "SYMBOL_BATTERY_EMPTY", 3945064277u, 0, 20, &be_const_str_lv_slider); +be_define_const_str(lv_slider, "lv_slider", 2274180781u, 0, 9, NULL); +be_define_const_str(SYMBOL_MINUS, "SYMBOL_MINUS", 1806749158u, 0, 12, &be_const_str_asin); +be_define_const_str(asin, "asin", 4272848550u, 0, 4, &be_const_str_decrypt); +be_define_const_str(decrypt, "decrypt", 2886974618u, 0, 7, &be_const_str_finish); +be_define_const_str(finish, "finish", 1494643858u, 0, 6, NULL); +be_define_const_str(SPI_DC, "SPI_DC", 553259951u, 0, 6, &be_const_str_TUYA_RX); +be_define_const_str(TUYA_RX, "TUYA_RX", 1609397679u, 0, 7, &be_const_str_arg); +be_define_const_str(arg, "arg", 1047474471u, 0, 3, NULL); +be_define_const_str(OPTION_A, "OPTION_A", 1133299440u, 0, 8, &be_const_str_SYMBOL_TRASH); +be_define_const_str(SYMBOL_TRASH, "SYMBOL_TRASH", 3169100368u, 0, 12, &be_const_str_WEBCAM_PSRCS); +be_define_const_str(WEBCAM_PSRCS, "WEBCAM_PSRCS", 624464864u, 0, 12, &be_const_str_tob64); +be_define_const_str(tob64, "tob64", 373777640u, 0, 5, NULL); +be_define_const_str(CC1101_GDO2, "CC1101_GDO2", 974166265u, 0, 11, &be_const_str_SYMBOL_VOLUME_MAX); +be_define_const_str(SYMBOL_VOLUME_MAX, "SYMBOL_VOLUME_MAX", 3582646093u, 0, 17, &be_const_str_keys); +be_define_const_str(keys, "keys", 4182378701u, 0, 4, NULL); +be_define_const_str(GPS_RX, "GPS_RX", 1075637342u, 0, 6, &be_const_str_range); +be_define_const_str(range, "range", 4208725202u, 0, 5, NULL); +be_define_const_str(BUZZER, "BUZZER", 1550039611u, 0, 6, &be_const_str_SWT1_NP); +be_define_const_str(SWT1_NP, "SWT1_NP", 4033043739u, 0, 7, NULL); +be_define_const_str(lv_draw_mask_fade_param, "lv_draw_mask_fade_param", 2743309964u, 0, 23, &be_const_str_publish); +be_define_const_str(publish, "publish", 264247304u, 0, 7, &be_const_str_setitem); +be_define_const_str(setitem, "setitem", 1554834596u, 0, 7, NULL); +be_define_const_str(collect, "collect", 2399039025u, 0, 7, &be_const_str_lv_objmask); +be_define_const_str(lv_objmask, "lv_objmask", 1311221665u, 0, 10, NULL); +be_define_const_str(dot_p1, ".p1", 249175686u, 0, 3, &be_const_str_SOLAXX1_RX); +be_define_const_str(SOLAXX1_RX, "SOLAXX1_RX", 971867054u, 0, 10, &be_const_str_SYMBOL_DUMMY); +be_define_const_str(SYMBOL_DUMMY, "SYMBOL_DUMMY", 3621732138u, 0, 12, &be_const_str_WEBCAM_SIOD); +be_define_const_str(WEBCAM_SIOD, "WEBCAM_SIOD", 302703242u, 0, 11, NULL); +be_define_const_str(lv_draw_img_dsc, "lv_draw_img_dsc", 999847907u, 0, 15, &be_const_str_raise); +be_define_const_str(raise, "raise", 1593437475u, 70, 5, NULL); +be_define_const_str(ROT1B_NP, "ROT1B_NP", 3710079736u, 0, 8, NULL); +be_define_const_str(get_option, "get_option", 2123730033u, 0, 10, &be_const_str_list); +be_define_const_str(list, "list", 217798785u, 0, 4, &be_const_str_lv_keyboard); +be_define_const_str(lv_keyboard, "lv_keyboard", 197530229u, 0, 11, &be_const_str_pow); +be_define_const_str(pow, "pow", 1479764693u, 0, 3, NULL); +be_define_const_str(ADC_BUTTON, "ADC_BUTTON", 3393454690u, 0, 10, &be_const_str_ZIGBEE_RX); +be_define_const_str(ZIGBEE_RX, "ZIGBEE_RX", 93215470u, 0, 9, &be_const_str_classof); +be_define_const_str(classof, "classof", 1796577762u, 0, 7, &be_const_str_geti); +be_define_const_str(geti, "geti", 2381006490u, 0, 4, &be_const_str_wire2); +be_define_const_str(wire2, "wire2", 3229499038u, 0, 5, NULL); +be_define_const_str(AS608_RX, "AS608_RX", 4275502016u, 0, 8, &be_const_str_SYMBOL_RIGHT); +be_define_const_str(SYMBOL_RIGHT, "SYMBOL_RIGHT", 2984010648u, 0, 12, &be_const_str_Tasmota); +be_define_const_str(Tasmota, "Tasmota", 4047617668u, 0, 7, NULL); +be_define_const_str(CSE7766_TX, "CSE7766_TX", 674624821u, 0, 10, NULL); +be_define_const_str(A4988_ENA, "A4988_ENA", 1517502682u, 0, 9, &be_const_str_KEY1_INV_NP); +be_define_const_str(KEY1_INV_NP, "KEY1_INV_NP", 3160558586u, 0, 11, &be_const_str_yield); +be_define_const_str(yield, "yield", 1821831854u, 0, 5, &be_const_str_while); +be_define_const_str(while, "while", 231090382u, 53, 5, NULL); +be_define_const_str(SSPI_CS, "SSPI_CS", 977784795u, 0, 7, &be_const_str_SYMBOL_BELL); +be_define_const_str(SYMBOL_BELL, "SYMBOL_BELL", 1736196487u, 0, 11, &be_const_str_SYMBOL_NEW_LINE); +be_define_const_str(SYMBOL_NEW_LINE, "SYMBOL_NEW_LINE", 2014334315u, 0, 15, NULL); +be_define_const_str(ADC_JOY, "ADC_JOY", 1116943612u, 0, 7, &be_const_str_PROJECTOR_CTRL_RX); +be_define_const_str(PROJECTOR_CTRL_RX, "PROJECTOR_CTRL_RX", 1542762460u, 0, 17, &be_const_str_TASMOTACLIENT_TXD); +be_define_const_str(TASMOTACLIENT_TXD, "TASMOTACLIENT_TXD", 1386193940u, 0, 17, &be_const_str_TELEINFO_RX); +be_define_const_str(TELEINFO_RX, "TELEINFO_RX", 1195717356u, 0, 11, &be_const_str_lv_table); +be_define_const_str(lv_table, "lv_table", 1675691020u, 0, 8, &be_const_str_scan); +be_define_const_str(scan, "scan", 3974641896u, 0, 4, &be_const_str_wire_scan); +be_define_const_str(wire_scan, "wire_scan", 2671275880u, 0, 9, &be_const_str_continue); +be_define_const_str(continue, "continue", 2977070660u, 59, 8, NULL); +be_define_const_str(NRG_SEL, "NRG_SEL", 1771358125u, 0, 7, &be_const_str_P9813_CLK); +be_define_const_str(P9813_CLK, "P9813_CLK", 2455391001u, 0, 9, &be_const_str_concat); +be_define_const_str(concat, "concat", 4124019837u, 0, 6, NULL); +be_define_const_str(SSD1351_CS, "SSD1351_CS", 488746042u, 0, 10, &be_const_str_calldepth); +be_define_const_str(calldepth, "calldepth", 3122364302u, 0, 9, &be_const_str_lower); +be_define_const_str(lower, "lower", 3038577850u, 0, 5, &be_const_str_lv_line); +be_define_const_str(lv_line, "lv_line", 2692732914u, 0, 7, &be_const_str_resp_cmnd_failed); +be_define_const_str(resp_cmnd_failed, "resp_cmnd_failed", 2136281562u, 0, 16, NULL); +be_define_const_str(lv_color, "lv_color", 1419148319u, 0, 8, NULL); +be_define_const_str(WINDMETER_SPEED, "WINDMETER_SPEED", 1980822204u, 0, 15, &be_const_str_pin_used); +be_define_const_str(pin_used, "pin_used", 4033854612u, 0, 8, &be_const_str_do); +be_define_const_str(do, "do", 1646057492u, 65, 2, NULL); +be_define_const_str(SDM72_TX, "SDM72_TX", 2042143269u, 0, 8, &be_const_str_SSPI_MISO); +be_define_const_str(SSPI_MISO, "SSPI_MISO", 2485347173u, 0, 9, &be_const_str_lv_draw_mask_map_param_cfg); +be_define_const_str(lv_draw_mask_map_param_cfg, "lv_draw_mask_map_param_cfg", 3822900597u, 0, 26, &be_const_str_type); +be_define_const_str(type, "type", 1361572173u, 0, 4, NULL); +be_define_const_str(DEEPSLEEP, "DEEPSLEEP", 189922226u, 0, 9, &be_const_str_int); +be_define_const_str(int, "int", 2515107422u, 0, 3, NULL); +be_define_const_str(A4988_DIR, "A4988_DIR", 2223595843u, 0, 9, &be_const_str_CSE7766_RX); +be_define_const_str(CSE7766_RX, "CSE7766_RX", 1546766819u, 0, 10, NULL); +be_define_const_str(I2S_IN_DATA, "I2S_IN_DATA", 4125971460u, 0, 11, &be_const_str_SYMBOL_LOOP); +be_define_const_str(SYMBOL_LOOP, "SYMBOL_LOOP", 2762053208u, 0, 11, NULL); +be_define_const_str(SDM120_RX, "SDM120_RX", 1367571753u, 0, 9, &be_const_str_SYMBOL_PASTE); +be_define_const_str(SYMBOL_PASTE, "SYMBOL_PASTE", 2281577421u, 0, 12, &be_const_str_seg7_font); +be_define_const_str(seg7_font, "seg7_font", 4099690689u, 0, 9, NULL); +be_define_const_str(GCM, "GCM", 3790320054u, 0, 3, &be_const_str_WS2812); +be_define_const_str(WS2812, "WS2812", 3539741218u, 0, 6, &be_const_str_imax); +be_define_const_str(imax, "imax", 3084515410u, 0, 4, NULL); +be_define_const_str(content_send_style, "content_send_style", 1087907647u, 0, 18, NULL); +be_define_const_str(publish_result, "publish_result", 2013351252u, 0, 14, &be_const_str_write8); +be_define_const_str(write8, "write8", 3133991532u, 0, 6, &be_const_str_break); +be_define_const_str(break, "break", 3378807160u, 58, 5, NULL); +be_define_const_str(as, "as", 1579491469u, 67, 2, NULL); +be_define_const_str(ETH_PHY_POWER, "ETH_PHY_POWER", 487529454u, 0, 13, &be_const_str_lv_label); +be_define_const_str(lv_label, "lv_label", 4199664246u, 0, 8, NULL); +be_define_const_str(RISING, "RISING", 1256404539u, 0, 6, &be_const_str_remove_timer); +be_define_const_str(remove_timer, "remove_timer", 4141472215u, 0, 12, NULL); +be_define_const_str(MAX31855DO, "MAX31855DO", 552730368u, 0, 10, &be_const_str_classname); +be_define_const_str(classname, "classname", 1998589948u, 0, 9, &be_const_str_lv_canvas); +be_define_const_str(lv_canvas, "lv_canvas", 142865412u, 0, 9, NULL); +be_define_const_str(NRF24_DC, "NRF24_DC", 688921313u, 0, 8, NULL); +be_define_const_str(HM10_RX, "HM10_RX", 515085922u, 0, 7, &be_const_str_lv_win); +be_define_const_str(lv_win, "lv_win", 780927558u, 0, 6, &be_const_str_seti); +be_define_const_str(seti, "seti", 1500556254u, 0, 4, NULL); +be_define_const_str(HRE_DATA, "HRE_DATA", 1820377643u, 0, 8, &be_const_str_SM2135_CLK); +be_define_const_str(SM2135_CLK, "SM2135_CLK", 2383410011u, 0, 10, &be_const_str_SSD1331_DC); +be_define_const_str(SSD1331_DC, "SSD1331_DC", 3386560859u, 0, 10, &be_const_str_assert); +be_define_const_str(assert, "assert", 2774883451u, 0, 6, &be_const_str_lv_cpicker); +be_define_const_str(lv_cpicker, "lv_cpicker", 1935129251u, 0, 10, &be_const_str_response_append); +be_define_const_str(response_append, "response_append", 450346371u, 0, 15, NULL); +be_define_const_str(get_light, "get_light", 381930476u, 0, 9, NULL); +be_define_const_str(SBR_RX, "SBR_RX", 3350999801u, 0, 6, NULL); +be_define_const_str(SM16716_DAT, "SM16716_DAT", 1905621806u, 0, 11, &be_const_str_isinstance); +be_define_const_str(isinstance, "isinstance", 3669352738u, 0, 10, NULL); +be_define_const_str(add_driver, "add_driver", 1654458371u, 0, 10, NULL); +be_define_const_str(AZ_TXD, "AZ_TXD", 850268709u, 0, 6, &be_const_str_ILI9488_CS); +be_define_const_str(ILI9488_CS, "ILI9488_CS", 2363112073u, 0, 10, &be_const_str_ROT1B); +be_define_const_str(ROT1B, "ROT1B", 809932573u, 0, 5, NULL); +be_define_const_str(PN532_RXD, "PN532_RXD", 1780093022u, 0, 9, &be_const_str_scale_uint); +be_define_const_str(scale_uint, "scale_uint", 3090811094u, 0, 10, NULL); +be_define_const_str(content_start, "content_start", 2937509069u, 0, 13, NULL); +be_define_const_str(HRXL_RX, "HRXL_RX", 92702006u, 0, 7, &be_const_str_SYMBOL_DOWN); +be_define_const_str(SYMBOL_DOWN, "SYMBOL_DOWN", 1107513570u, 0, 11, &be_const_str_clear); +be_define_const_str(clear, "clear", 1550717474u, 0, 5, NULL); +be_define_const_str(AZ_RXD, "AZ_RXD", 699914019u, 0, 6, &be_const_str___upper__); +be_define_const_str(__upper__, "__upper__", 3612202883u, 0, 9, &be_const_str_init); +be_define_const_str(init, "init", 380752755u, 0, 4, NULL); +be_define_const_str(SYMBOL_PAUSE, "SYMBOL_PAUSE", 641998172u, 0, 12, &be_const_str_lv_roller); +be_define_const_str(lv_roller, "lv_roller", 661902064u, 0, 9, NULL); +be_define_const_str(DYP_RX, "DYP_RX", 2122310285u, 0, 6, &be_const_str_LE01MR_RX); +be_define_const_str(LE01MR_RX, "LE01MR_RX", 1521590809u, 0, 9, &be_const_str_NRG_CF1); +be_define_const_str(NRG_CF1, "NRG_CF1", 3292534757u, 0, 7, &be_const_str__drivers); +be_define_const_str(_drivers, "_drivers", 3260328985u, 0, 8, NULL); +be_define_const_str(SYMBOL_DRIVE, "SYMBOL_DRIVE", 567203502u, 0, 12, &be_const_str__read); +be_define_const_str(_read, "_read", 346717030u, 0, 5, NULL); +be_define_const_str(DHT22, "DHT22", 215937903u, 0, 5, &be_const_str_IBEACON_RX); +be_define_const_str(IBEACON_RX, "IBEACON_RX", 2466155575u, 0, 10, &be_const_str_SYMBOL_MUTE); +be_define_const_str(SYMBOL_MUTE, "SYMBOL_MUTE", 563116043u, 0, 11, NULL); +be_define_const_str(top, "top", 2802900028u, 0, 3, NULL); +be_define_const_str(opt_connect, "..", 2748622605u, 0, 2, &be_const_str_RFRECV); +be_define_const_str(RFRECV, "RFRECV", 354742801u, 0, 6, &be_const_str_SYMBOL_VIDEO); +be_define_const_str(SYMBOL_VIDEO, "SYMBOL_VIDEO", 789726913u, 0, 12, NULL); +be_define_const_str(NRF24_CS, "NRF24_CS", 555833194u, 0, 8, &be_const_str_hex); +be_define_const_str(hex, "hex", 4273249610u, 0, 3, NULL); +be_define_const_str(INPUT_PULLDOWN, "INPUT_PULLDOWN", 1172232591u, 0, 14, &be_const_str_ctypes_bytes); +be_define_const_str(ctypes_bytes, "ctypes_bytes", 3879019703u, 0, 12, &be_const_str_read8); +be_define_const_str(read8, "read8", 2802788167u, 0, 5, &be_const_str_sqrt); +be_define_const_str(sqrt, "sqrt", 2112764879u, 0, 4, NULL); +be_define_const_str(SYMBOL_FILE, "SYMBOL_FILE", 237085260u, 0, 11, &be_const_str_has_arg); +be_define_const_str(has_arg, "has_arg", 424878688u, 0, 7, &be_const_str_lv_chart); +be_define_const_str(lv_chart, "lv_chart", 2652494144u, 0, 8, &be_const_str_write_bit); +be_define_const_str(write_bit, "write_bit", 2660990436u, 0, 9, NULL); +be_define_const_str(lv_gauge_format_cb, "lv_gauge_format_cb", 4073149249u, 0, 18, NULL); +be_define_const_str(CSE7761_TX, "CSE7761_TX", 3354719142u, 0, 10, NULL); +be_define_const_str(HRE_CLOCK, "HRE_CLOCK", 2870559111u, 0, 9, &be_const_str_REL1_INV); +be_define_const_str(REL1_INV, "REL1_INV", 3733155371u, 0, 8, &be_const_str_SYMBOL_SETTINGS); +be_define_const_str(SYMBOL_SETTINGS, "SYMBOL_SETTINGS", 339656335u, 0, 15, NULL); +be_define_const_str(size, "size", 597743964u, 0, 4, NULL); +be_define_const_str(NRG_SEL_INV, "NRG_SEL_INV", 3567431069u, 0, 11, &be_const_str_stop); +be_define_const_str(stop, "stop", 3411225317u, 0, 4, NULL); +be_define_const_str(RC522_CS, "RC522_CS", 2639619996u, 0, 8, &be_const_str_SSPI_DC); +be_define_const_str(SSPI_DC, "SSPI_DC", 1782271864u, 0, 7, &be_const_str_eth); +be_define_const_str(eth, "eth", 2191266556u, 0, 3, &be_const_str_insert); +be_define_const_str(insert, "insert", 3332609576u, 0, 6, &be_const_str_print); +be_define_const_str(print, "print", 372738696u, 0, 5, NULL); +be_define_const_str(ADC_BUTTON_INV, "ADC_BUTTON_INV", 2027625326u, 0, 14, &be_const_str_PROJECTOR_CTRL_TX); +be_define_const_str(PROJECTOR_CTRL_TX, "PROJECTOR_CTRL_TX", 535811130u, 0, 17, &be_const_str_PWM1); +be_define_const_str(PWM1, "PWM1", 1353352426u, 0, 4, &be_const_str_encrypt); +be_define_const_str(encrypt, "encrypt", 2194327650u, 0, 7, NULL); +be_define_const_str(ADC_RANGE, "ADC_RANGE", 3467329543u, 0, 9, &be_const_str_MHZ_RXD); +be_define_const_str(MHZ_RXD, "MHZ_RXD", 328619727u, 0, 7, &be_const_str_start); +be_define_const_str(start, "start", 1697318111u, 0, 5, NULL); +be_define_const_str(log10, "log10", 2346846000u, 0, 5, &be_const_str_read32); +be_define_const_str(read32, "read32", 1741276240u, 0, 6, &be_const_str_web_send_decimal); +be_define_const_str(web_send_decimal, "web_send_decimal", 1407210204u, 0, 16, NULL); +be_define_const_str(A4988_STP, "A4988_STP", 1622172049u, 0, 9, &be_const_str_MAX7219DIN); +be_define_const_str(MAX7219DIN, "MAX7219DIN", 380687049u, 0, 10, &be_const_str_SDS0X1_RX); +be_define_const_str(SDS0X1_RX, "SDS0X1_RX", 1170717385u, 0, 9, &be_const_str_SYMBOL_BATTERY_FULL); +be_define_const_str(SYMBOL_BATTERY_FULL, "SYMBOL_BATTERY_FULL", 2638935545u, 0, 19, &be_const_str_get_free_heap); +be_define_const_str(get_free_heap, "get_free_heap", 625069757u, 0, 13, NULL); +be_define_const_str(addr, "addr", 1087856498u, 0, 4, &be_const_str_reverse_gamma10); +be_define_const_str(reverse_gamma10, "reverse_gamma10", 739112262u, 0, 15, NULL); +be_define_const_str(SYMBOL_UPLOAD, "SYMBOL_UPLOAD", 3293679647u, 0, 13, &be_const_str_gamma10); +be_define_const_str(gamma10, "gamma10", 3472052483u, 0, 7, &be_const_str_lv_page); +be_define_const_str(lv_page, "lv_page", 2373170067u, 0, 7, NULL); +be_define_const_str(SYMBOL_BLUETOOTH, "SYMBOL_BLUETOOTH", 679376572u, 0, 16, &be_const_str_SYMBOL_OK); +be_define_const_str(SYMBOL_OK, "SYMBOL_OK", 4033162940u, 0, 9, NULL); +be_define_const_str(DHT11, "DHT11", 367083569u, 0, 5, &be_const_str_read_bytes); +be_define_const_str(read_bytes, "read_bytes", 3576733173u, 0, 10, NULL); +be_define_const_str(lv_textarea, "lv_textarea", 2864635074u, 0, 11, NULL); +be_define_const_str(LMT01, "LMT01", 2490623797u, 0, 5, &be_const_str_MCP39F5_RX); +be_define_const_str(MCP39F5_RX, "MCP39F5_RX", 190458217u, 0, 10, NULL); +be_define_const_str(SPI_MOSI, "SPI_MOSI", 2494218614u, 0, 8, &be_const_str_SYMBOL_CLOSE); +be_define_const_str(SYMBOL_CLOSE, "SYMBOL_CLOSE", 2654402806u, 0, 12, NULL); +be_define_const_str(__iterator__, "__iterator__", 3884039703u, 0, 12, &be_const_str_elif); +be_define_const_str(elif, "elif", 3232090307u, 51, 4, NULL); +be_define_const_str(IEM3000_RX, "IEM3000_RX", 1117811096u, 0, 10, &be_const_str_lv_draw_mask_angle_param_cfg); +be_define_const_str(lv_draw_mask_angle_param_cfg, "lv_draw_mask_angle_param_cfg", 3599767368u, 0, 28, NULL); +be_define_const_str(DHT11_OUT, "DHT11_OUT", 1645300734u, 0, 9, &be_const_str_HX711_DAT); +be_define_const_str(HX711_DAT, "HX711_DAT", 2935118250u, 0, 9, &be_const_str_register_button_encoder); +be_define_const_str(register_button_encoder, "register_button_encoder", 2811301550u, 0, 23, NULL); +be_define_const_str(lv_group, "lv_group", 3852039019u, 0, 8, &be_const_str_member); +be_define_const_str(member, "member", 719708611u, 0, 6, &be_const_str_split); +be_define_const_str(split, "split", 2276994531u, 0, 5, NULL); +be_define_const_str(dot_def, ".def", 4095748648u, 0, 4, &be_const_str_DDS2382_TX); +be_define_const_str(DDS2382_TX, "DDS2382_TX", 1438117864u, 0, 10, &be_const_str_OUTPUT); +be_define_const_str(OUTPUT, "OUTPUT", 1469629700u, 0, 6, &be_const_str_SSD1331_CS); +be_define_const_str(SSD1331_CS, "SSD1331_CS", 4191047928u, 0, 10, &be_const_str_check_privileged_access); +be_define_const_str(check_privileged_access, "check_privileged_access", 3692933968u, 0, 23, &be_const_str_set_light); +be_define_const_str(set_light, "set_light", 3176076152u, 0, 9, NULL); +be_define_const_str(ST7789_DC, "ST7789_DC", 2533509745u, 0, 9, &be_const_str_TM1637CLK); +be_define_const_str(TM1637CLK, "TM1637CLK", 2797300857u, 0, 9, &be_const_str_char); +be_define_const_str(char, "char", 2823553821u, 0, 4, &be_const_str_exists); +be_define_const_str(exists, "exists", 1002329533u, 0, 6, &be_const_str_real); +be_define_const_str(real, "real", 3604983901u, 0, 4, &be_const_str_remove); +be_define_const_str(remove, "remove", 3683784189u, 0, 6, NULL); +be_define_const_str(EPAPER42_CS, "EPAPER42_CS", 3274717451u, 0, 11, NULL); +be_define_const_str(AudioGeneratorMP3, "AudioGeneratorMP3", 2199818488u, 0, 17, &be_const_str_chars_in_string); +be_define_const_str(chars_in_string, "chars_in_string", 3148785132u, 0, 15, NULL); +be_define_const_str(SYMBOL_BATTERY_3, "SYMBOL_BATTERY_3", 662591301u, 0, 16, NULL); +be_define_const_str(BACKLIGHT, "BACKLIGHT", 3147761926u, 0, 9, &be_const_str_format); +be_define_const_str(format, "format", 3114108242u, 0, 6, &be_const_str_gamma8); +be_define_const_str(gamma8, "gamma8", 3802843830u, 0, 6, NULL); +be_define_const_str(dot_p2, ".p2", 232398067u, 0, 3, NULL); +be_define_const_str(AudioOutputI2S, "AudioOutputI2S", 638031784u, 0, 14, NULL); +be_define_const_str(lv_dropdown, "lv_dropdown", 2797165301u, 0, 11, &be_const_str_set_timer); +be_define_const_str(set_timer, "set_timer", 2135414533u, 0, 9, NULL); +be_define_const_str(SDM630_TX, "SDM630_TX", 696213075u, 0, 9, &be_const_str_issubclass); +be_define_const_str(issubclass, "issubclass", 4078395519u, 0, 10, &be_const_str_wire1); +be_define_const_str(wire1, "wire1", 3212721419u, 0, 5, NULL); +be_define_const_str(deinit, "deinit", 2345559592u, 0, 6, NULL); +be_define_const_str(WEBCAM_XCLK, "WEBCAM_XCLK", 536207425u, 0, 11, &be_const_str_reverse); +be_define_const_str(reverse, "reverse", 558918661u, 0, 7, NULL); +be_define_const_str(TASMOTACLIENT_RXD, "TASMOTACLIENT_RXD", 72868318u, 0, 17, &be_const_str_compile); +be_define_const_str(compile, "compile", 1000265118u, 0, 7, &be_const_str_pi); +be_define_const_str(pi, "pi", 1213090802u, 0, 2, NULL); +be_define_const_str(SYMBOL_SHUFFLE, "SYMBOL_SHUFFLE", 1123310147u, 0, 14, &be_const_str_deg); +be_define_const_str(deg, "deg", 3327754271u, 0, 3, NULL); +be_define_const_str(SSPI_MAX31865_CS1, "SSPI_MAX31865_CS1", 1256578724u, 0, 17, &be_const_str_isrunning); +be_define_const_str(isrunning, "isrunning", 1688182268u, 0, 9, NULL); +be_define_const_str(DDSU666_TX, "DDSU666_TX", 1880604150u, 0, 10, NULL); +be_define_const_str(BOILER_OT_TX, "BOILER_OT_TX", 671743623u, 0, 12, &be_const_str_SYMBOL_UP); +be_define_const_str(SYMBOL_UP, "SYMBOL_UP", 3886401511u, 0, 9, NULL); +be_define_const_str(bus, "bus", 1607822841u, 0, 3, &be_const_str_lv_spinbox); +be_define_const_str(lv_spinbox, "lv_spinbox", 2666096729u, 0, 10, NULL); +be_define_const_str(_cmd, "_cmd", 3419822142u, 0, 4, NULL); +be_define_const_str(ILI9341_CS, "ILI9341_CS", 3519318851u, 0, 10, &be_const_str_SYMBOL_POWER); +be_define_const_str(SYMBOL_POWER, "SYMBOL_POWER", 1125993627u, 0, 12, &be_const_str_class); +be_define_const_str(class, "class", 2872970239u, 57, 5, NULL); +be_define_const_str(DCKI, "DCKI", 3846847480u, 0, 4, NULL); +be_define_const_str(CNTR1, "CNTR1", 510376965u, 0, 5, NULL); +be_define_const_str(SSPI_SCLK, "SSPI_SCLK", 136688954u, 0, 9, &be_const_str_SYMBOL_CUT); +be_define_const_str(SYMBOL_CUT, "SYMBOL_CUT", 3455112394u, 0, 10, NULL); +be_define_const_str(SYMBOL_COPY, "SYMBOL_COPY", 4193681815u, 0, 11, &be_const_str_getbits); +be_define_const_str(getbits, "getbits", 3094168979u, 0, 7, NULL); +be_define_const_str(KEY1_TC, "KEY1_TC", 25685109u, 0, 7, &be_const_str_TASMOTACLIENT_RST_INV); +be_define_const_str(TASMOTACLIENT_RST_INV, "TASMOTACLIENT_RST_INV", 2601785365u, 0, 21, &be_const_str_lv_draw_mask_radius_param_cfg); +be_define_const_str(lv_draw_mask_radius_param_cfg, "lv_draw_mask_radius_param_cfg", 3889386773u, 0, 29, NULL); +be_define_const_str(begin, "begin", 1748273790u, 0, 5, NULL); +be_define_const_str(opt_neq, "!=", 2428715011u, 0, 2, &be_const_str_ARIRFSEL); +be_define_const_str(ARIRFSEL, "ARIRFSEL", 233874443u, 0, 8, &be_const_str_WEBCAM_SIOC); +be_define_const_str(WEBCAM_SIOC, "WEBCAM_SIOC", 218815147u, 0, 11, &be_const_str_setbits); +be_define_const_str(setbits, "setbits", 2762408167u, 0, 7, NULL); static const bstring* const m_string_table[] = { - (const bstring *)&be_const_str_OPTION_A, - (const bstring *)&be_const_str_BACKLIGHT, - (const bstring *)&be_const_str_int, - (const bstring *)&be_const_str_SR04_TRIG, - (const bstring *)&be_const_str_LE01MR_RX, + (const bstring *)&be_const_str_CNTR1_NP, + (const bstring *)&be_const_str_TELEINFO_ENABLE, + NULL, + (const bstring *)&be_const_str_MCP39F5_TX, NULL, - (const bstring *)&be_const_str_RC522_CS, - (const bstring *)&be_const_str_ADE7953_IRQ, - (const bstring *)&be_const_str_SSPI_MISO, - (const bstring *)&be_const_str_KEY1_TC, - (const bstring *)&be_const_str_ADC_BUTTON, - (const bstring *)&be_const_str_SM16716_DAT, - (const bstring *)&be_const_str_CSE7761_TX, - (const bstring *)&be_const_str_lv_tileview, - (const bstring *)&be_const_str_EPAPER29_CS, - (const bstring *)&be_const_str_opt_connect, - (const bstring *)&be_const_str_, - (const bstring *)&be_const_str_ELECTRIQ_MOODL_TX, - (const bstring *)&be_const_str_KEY1_INV, - (const bstring *)&be_const_str_add_cmd, - (const bstring *)&be_const_str_OLED_RESET, - (const bstring *)&be_const_str_HRE_CLOCK, (const bstring *)&be_const_str_LED1_INV, - (const bstring *)&be_const_str_ADC_INPUT, - (const bstring *)&be_const_str_GCM, - (const bstring *)&be_const_str_LOW, - (const bstring *)&be_const_str_HRXL_RX, - (const bstring *)&be_const_str_SYMBOL_EYE_CLOSE, - (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_SPI_CLK, + (const bstring *)&be_const_str_content_button, + (const bstring *)&be_const_str_HPMA_TX, + NULL, + NULL, + (const bstring *)&be_const_str_MAX31855CS, + (const bstring *)&be_const_str_WEBCAM_HSD, + (const bstring *)&be_const_str_CHANGE, + (const bstring *)&be_const_str_SYMBOL_PLUS, + (const bstring *)&be_const_str_RFSEND, + (const bstring *)&be_const_str_SHELLY_DIMMER_BOOT0, + (const bstring *)&be_const_str_SYMBOL_BACKSPACE, + (const bstring *)&be_const_str_codedump, + (const bstring *)&be_const_str_TFMINIPLUS_RX, (const bstring *)&be_const_str_attrdump, - (const bstring *)&be_const_str_I2S_IN_DATA, - (const bstring *)&be_const_str_CSE7766_TX, - (const bstring *)&be_const_str_SM2135_DAT, - (const bstring *)&be_const_str_get_option, - (const bstring *)&be_const_str_WEBCAM_HREF, - (const bstring *)&be_const_str_IEM3000_TX, + (const bstring *)&be_const_str_SWT1_PD, + (const bstring *)&be_const_str_SYMBOL_EDIT, + (const bstring *)&be_const_str_OLED_RESET, + (const bstring *)&be_const_str_I2S_IN_CLK, + (const bstring *)&be_const_str_tolower, + (const bstring *)&be_const_str_FTC532, + (const bstring *)&be_const_str_dot_p, (const bstring *)&be_const_str_IRSEND, - (const bstring *)&be_const_str_WE517_TX, - (const bstring *)&be_const_str_I2C_SCL, - (const bstring *)&be_const_str_WEBCAM_PWDN, - (const bstring *)&be_const_str_NRG_SEL, + (const bstring *)&be_const_str_DSB_OUT, + (const bstring *)&be_const_str_detect, + (const bstring *)&be_const_str_I2S_OUT_CLK, + (const bstring *)&be_const_str_SPI_CS, + (const bstring *)&be_const_str_HIGH, + NULL, + (const bstring *)&be_const_str_REL1, + NULL, + (const bstring *)&be_const_str_SHELLY_DIMMER_RST_INV, + NULL, + (const bstring *)&be_const_str_NONE, + (const bstring *)&be_const_str_members, + (const bstring *)&be_const_str_LED1, + NULL, + (const bstring *)&be_const_str_LE01MR_TX, + (const bstring *)&be_const_str__end_transmission, + NULL, + (const bstring *)&be_const_str_INPUT_PULLUP, + (const bstring *)&be_const_str_exec_cmd, + (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, + NULL, + (const bstring *)&be_const_str_I2C_Driver, + (const bstring *)&be_const_str_PULLUP, + (const bstring *)&be_const_str_GPS_TX, + (const bstring *)&be_const_str_BS814_DAT, + (const bstring *)&be_const_str_I2C_SDA, + (const bstring *)&be_const_str_CC1101_GDO0, + (const bstring *)&be_const_str_WEBCAM_RESET, + (const bstring *)&be_const_str_sin, + (const bstring *)&be_const_str_SPI_MISO, + (const bstring *)&be_const_str_lv_draw_mask_saved, + (const bstring *)&be_const_str_OUTPUT_LO, + NULL, + (const bstring *)&be_const_str_ADC_PH, + (const bstring *)&be_const_str_abs, + (const bstring *)&be_const_str_KEY1_INV_PD, + (const bstring *)&be_const_str_LOW, + (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_iter, + (const bstring *)&be_const_str__begin_transmission, + NULL, + (const bstring *)&be_const_str_DI, + NULL, + (const bstring *)&be_const_str_imin, + (const bstring *)&be_const_str_ETH_PHY_MDC, + (const bstring *)&be_const_str_IEM3000_TX, + NULL, + (const bstring *)&be_const_str_I2S_IN_SLCT, + (const bstring *)&be_const_str_lv_spinner, + (const bstring *)&be_const_str_HPMA_RX, + (const bstring *)&be_const_str_opt_eq, + (const bstring *)&be_const_str_rtc, + NULL, + NULL, + (const bstring *)&be_const_str_read24, + (const bstring *)&be_const_str_digital_read, + (const bstring *)&be_const_str_lv_checkbox, + (const bstring *)&be_const_str_ADC_LIGHT, + (const bstring *)&be_const_str_ADC_CT_POWER, + (const bstring *)&be_const_str_SYMBOL_EYE_OPEN, + (const bstring *)&be_const_str_MHZ_TXD, + (const bstring *)&be_const_str_SYMBOL_STOP, + NULL, + (const bstring *)&be_const_str_PMS5003_TX, + (const bstring *)&be_const_str_SSPI_MOSI, + (const bstring *)&be_const_str_SYMBOL_CHARGE, + (const bstring *)&be_const_str_MAX31855CLK, + (const bstring *)&be_const_str_INTERRUPT, + (const bstring *)&be_const_str_I2S_OUT_DATA, + (const bstring *)&be_const_str_TM1638CLK, + (const bstring *)&be_const_str_HJL_CF, + (const bstring *)&be_const_str_NEOPOOL_TX, + (const bstring *)&be_const_str_I2S_OUT_SLCT, + (const bstring *)&be_const_str_EPAPER29_CS, + (const bstring *)&be_const_str_SM16716_SEL, + (const bstring *)&be_const_str_save, + (const bstring *)&be_const_str_lv_tileview, + (const bstring *)&be_const_str_WEBCAM_VSYNC, + (const bstring *)&be_const_str_PZEM016_RX, + (const bstring *)&be_const_str_AudioGeneratorWAV, + (const bstring *)&be_const_str_arg_size, + (const bstring *)&be_const_str_opt_call, + (const bstring *)&be_const_str_gc, + (const bstring *)&be_const_str__buffer, + (const bstring *)&be_const_str_TCP_TX, + (const bstring *)&be_const_str_AS608_TX, + (const bstring *)&be_const_str_BUZZER_INV, + (const bstring *)&be_const_str_lv_cont, + (const bstring *)&be_const_str_log, + (const bstring *)&be_const_str_OUTPUT_HI, + (const bstring *)&be_const_str_SDCARD_CS, + (const bstring *)&be_const_str_ETH_PHY_MDIO, + (const bstring *)&be_const_str_TASMOTACLIENT_RST, + (const bstring *)&be_const_str_lv_msgbox, + (const bstring *)&be_const_str_HALLEFFECT, + (const bstring *)&be_const_str_BS814_CLK, + (const bstring *)&be_const_str_AS3935, + (const bstring *)&be_const_str_opt_add, + (const bstring *)&be_const_str_add_cmd, + NULL, + (const bstring *)&be_const_str_EPD_DATA, NULL, (const bstring *)&be_const_str_MD5, - (const bstring *)&be_const_str_add_rule, - (const bstring *)&be_const_str_WE517_RX, + (const bstring *)&be_const_str_ADC_TEMP, + (const bstring *)&be_const_str_ZIGBEE_RST, + (const bstring *)&be_const_str_PWM1_INV, + (const bstring *)&be_const_str_SYMBOL_LEFT, + (const bstring *)&be_const_str_P9813_DAT, + (const bstring *)&be_const_str_true, + (const bstring *)&be_const_str_resp_cmnd, + (const bstring *)&be_const_str_MGC3130_XFER, + (const bstring *)&be_const_str_MCP39F5_RST, NULL, - (const bstring *)&be_const_str_SYMBOL_CALL, - (const bstring *)&be_const_str_SYMBOL_PLUS, - (const bstring *)&be_const_str_DHT22, - (const bstring *)&be_const_str_ST7789_CS, - (const bstring *)&be_const_str_LED1, - (const bstring *)&be_const_str_floor, - (const bstring *)&be_const_str_MAX31855CLK, - NULL, - NULL, - (const bstring *)&be_const_str_lv_point, - (const bstring *)&be_const_str_read24, - (const bstring *)&be_const_str_AudioGenerator, + (const bstring *)&be_const_str_SYMBOL_BULLET, + (const bstring *)&be_const_str_KEY1_INV, + (const bstring *)&be_const_str_FALLING, + (const bstring *)&be_const_str_WEBCAM_PCLK, + (const bstring *)&be_const_str_DDS2382_RX, NULL, (const bstring *)&be_const_str_ILI9341_DC, + (const bstring *)&be_const_str_SDM630_RX, + (const bstring *)&be_const_str_MAX7219CLK, + (const bstring *)&be_const_str_VL53L0X_XSHUT1, + (const bstring *)&be_const_str_ARIRFRCV, + (const bstring *)&be_const_str_SAIR_RX, + (const bstring *)&be_const_str_ADC_INPUT, + (const bstring *)&be_const_str_acos, NULL, - (const bstring *)&be_const_str_WEBCAM_DATA, - (const bstring *)&be_const_str_content_button, - (const bstring *)&be_const_str_EXS_ENABLE, - (const bstring *)&be_const_str_lv_style, + (const bstring *)&be_const_str_TFMINIPLUS_TX, + (const bstring *)&be_const_str_AudioFileSource, + (const bstring *)&be_const_str_RC522_RST, + (const bstring *)&be_const_str_AudioOutput, + (const bstring *)&be_const_str_AudioFileSourceFS, + NULL, + (const bstring *)&be_const_str_lv_img, + (const bstring *)&be_const_str_number, + (const bstring *)&be_const_str_module, + (const bstring *)&be_const_str_ADE7953_IRQ, + (const bstring *)&be_const_str_A4988_MS1, + (const bstring *)&be_const_str_PZEM0XX_TX, + (const bstring *)&be_const_str_LEDLNK, + (const bstring *)&be_const_str_SYMBOL_WARNING, + (const bstring *)&be_const_str_input, + (const bstring *)&be_const_str_RF_SENSOR, + (const bstring *)&be_const_str_setmember, + (const bstring *)&be_const_str_lv_point, + (const bstring *)&be_const_str_get, + (const bstring *)&be_const_str_MAX7219CS, + (const bstring *)&be_const_str_erase, + (const bstring *)&be_const_str_lv_indev, + NULL, + (const bstring *)&be_const_str_ROT1A, + (const bstring *)&be_const_str_RXD, + (const bstring *)&be_const_str_WEBCAM_PWDN, + (const bstring *)&be_const_str_SYMBOL_KEYBOARD, + (const bstring *)&be_const_str_HM10_TX, + (const bstring *)&be_const_str_, + (const bstring *)&be_const_str_PZEM004_RX, + (const bstring *)&be_const_str_TXD, + (const bstring *)&be_const_str_CSE7761_RX, + (const bstring *)&be_const_str_traceback, + (const bstring *)&be_const_str_PZEM017_RX, + (const bstring *)&be_const_str_byte, + (const bstring *)&be_const_str_DDSU666_RX, + (const bstring *)&be_const_str_BOILER_OT_RX, + (const bstring *)&be_const_str_SM2135_DAT, + (const bstring *)&be_const_str_BL0940_RX, + (const bstring *)&be_const_str__request_from, + (const bstring *)&be_const_str_SYMBOL_BATTERY_EMPTY, + (const bstring *)&be_const_str_SYMBOL_MINUS, + (const bstring *)&be_const_str_SPI_DC, + (const bstring *)&be_const_str_OPTION_A, + (const bstring *)&be_const_str_CC1101_GDO2, + (const bstring *)&be_const_str_GPS_RX, + (const bstring *)&be_const_str_BUZZER, + (const bstring *)&be_const_str_lv_draw_mask_fade_param, + (const bstring *)&be_const_str_collect, + (const bstring *)&be_const_str_dot_p1, + (const bstring *)&be_const_str_lv_draw_img_dsc, + (const bstring *)&be_const_str_ROT1B_NP, + (const bstring *)&be_const_str_get_option, + (const bstring *)&be_const_str_ADC_BUTTON, + NULL, + (const bstring *)&be_const_str_AS608_RX, + (const bstring *)&be_const_str_CSE7766_TX, + (const bstring *)&be_const_str_A4988_ENA, + (const bstring *)&be_const_str_SSPI_CS, + (const bstring *)&be_const_str_ADC_JOY, + (const bstring *)&be_const_str_NRG_SEL, + (const bstring *)&be_const_str_SSD1351_CS, + (const bstring *)&be_const_str_lv_color, + (const bstring *)&be_const_str_WINDMETER_SPEED, + (const bstring *)&be_const_str_SDM72_TX, + (const bstring *)&be_const_str_DEEPSLEEP, + (const bstring *)&be_const_str_A4988_DIR, + (const bstring *)&be_const_str_I2S_IN_DATA, + (const bstring *)&be_const_str_SDM120_RX, + (const bstring *)&be_const_str_GCM, + (const bstring *)&be_const_str_content_send_style, + (const bstring *)&be_const_str_publish_result, + (const bstring *)&be_const_str_as, + (const bstring *)&be_const_str_ETH_PHY_POWER, + (const bstring *)&be_const_str_RISING, + (const bstring *)&be_const_str_MAX31855DO, + (const bstring *)&be_const_str_NRF24_DC, + (const bstring *)&be_const_str_HM10_RX, + (const bstring *)&be_const_str_HRE_DATA, + (const bstring *)&be_const_str_get_light, + (const bstring *)&be_const_str_SBR_RX, + (const bstring *)&be_const_str_SM16716_DAT, + (const bstring *)&be_const_str_add_driver, + NULL, + (const bstring *)&be_const_str_AZ_TXD, + (const bstring *)&be_const_str_PN532_RXD, + NULL, + NULL, + (const bstring *)&be_const_str_content_start, + (const bstring *)&be_const_str_HRXL_RX, + (const bstring *)&be_const_str_AZ_RXD, + (const bstring *)&be_const_str_SYMBOL_PAUSE, + (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_SYMBOL_DRIVE, + (const bstring *)&be_const_str_DHT22, + (const bstring *)&be_const_str_top, + (const bstring *)&be_const_str_opt_connect, + (const bstring *)&be_const_str_NRF24_CS, + (const bstring *)&be_const_str_INPUT_PULLDOWN, + (const bstring *)&be_const_str_SYMBOL_FILE, + (const bstring *)&be_const_str_lv_gauge_format_cb, + (const bstring *)&be_const_str_CSE7761_TX, + (const bstring *)&be_const_str_HRE_CLOCK, + (const bstring *)&be_const_str_size, + (const bstring *)&be_const_str_NRG_SEL_INV, + NULL, + NULL, + (const bstring *)&be_const_str_RC522_CS, + NULL, + (const bstring *)&be_const_str_ADC_BUTTON_INV, + (const bstring *)&be_const_str_ADC_RANGE, + (const bstring *)&be_const_str_log10, + (const bstring *)&be_const_str_A4988_STP, + (const bstring *)&be_const_str_addr, + (const bstring *)&be_const_str_SYMBOL_UPLOAD, + (const bstring *)&be_const_str_SYMBOL_BLUETOOTH, + (const bstring *)&be_const_str_DHT11, + (const bstring *)&be_const_str_lv_textarea, NULL, NULL, (const bstring *)&be_const_str_LMT01, - NULL, - (const bstring *)&be_const_str_members, - (const bstring *)&be_const_str_ADC_TEMP, - NULL, - (const bstring *)&be_const_str_HJL_CF, - (const bstring *)&be_const_str_SAIR_RX, - (const bstring *)&be_const_str_HX711_SCK, - (const bstring *)&be_const_str_SDM630_TX, - (const bstring *)&be_const_str_A4988_MS1, - (const bstring *)&be_const_str_SR04_ECHO, - (const bstring *)&be_const_str_lv_draw_rect_dsc, - (const bstring *)&be_const_str_FALLING, - NULL, - NULL, - (const bstring *)&be_const_str_MCP39F5_RX, - (const bstring *)&be_const_str_RDM6300_RX, - (const bstring *)&be_const_str_AZ_RXD, - NULL, - (const bstring *)&be_const_str_AS608_RX, - (const bstring *)&be_const_str_SYMBOL_VOLUME_MID, - NULL, - (const bstring *)&be_const_str_lv_arc, - (const bstring *)&be_const_str_DSB_OUT, - (const bstring *)&be_const_str_BS814_CLK, - (const bstring *)&be_const_str_HM10_TX, - (const bstring *)&be_const_str_SM16716_CLK, - (const bstring *)&be_const_str_lv_group, - (const bstring *)&be_const_str_opt_eq, - (const bstring *)&be_const_str_INPUT_PULLDOWN, - (const bstring *)&be_const_str_REL1, - (const bstring *)&be_const_str_dump, - (const bstring *)&be_const_str_MAX7219DIN, - (const bstring *)&be_const_str_CC1101_GDO2, - (const bstring *)&be_const_str_KEY1_INV_NP, - (const bstring *)&be_const_str_SYMBOL_EJECT, - (const bstring *)&be_const_str_top, (const bstring *)&be_const_str_SPI_MOSI, - (const bstring *)&be_const_str_BUZZER_INV, - (const bstring *)&be_const_str_real, - (const bstring *)&be_const_str_I2S_OUT_CLK, - (const bstring *)&be_const_str_SYMBOL_DUMMY, - (const bstring *)&be_const_str__request_from, - (const bstring *)&be_const_str___lower__, - NULL, - NULL, - (const bstring *)&be_const_str_AudioGeneratorWAV, - (const bstring *)&be_const_str_HPMA_TX, - (const bstring *)&be_const_str_SYMBOL_PLAY, - NULL, - (const bstring *)&be_const_str_lv_draw_mask_map_param_cfg, - (const bstring *)&be_const_str_ADC_RANGE, - (const bstring *)&be_const_str_INTERRUPT, - NULL, - (const bstring *)&be_const_str_opt_neq, - (const bstring *)&be_const_str_EPD_DATA, - (const bstring *)&be_const_str_SWT1_PD, - (const bstring *)&be_const_str_lv_roller, - NULL, - (const bstring *)&be_const_str_log, - (const bstring *)&be_const_str_HM10_RX, - (const bstring *)&be_const_str_I2C_Driver, - (const bstring *)&be_const_str_MIEL_HVAC_TX, - (const bstring *)&be_const_str_imax, - (const bstring *)&be_const_str_EPAPER42_CS, - (const bstring *)&be_const_str_SYMBOL_EDIT, - (const bstring *)&be_const_str_A4988_DIR, - (const bstring *)&be_const_str_ADC_CT_POWER, - NULL, - (const bstring *)&be_const_str_RFSEND, - (const bstring *)&be_const_str_SYMBOL_PAUSE, - (const bstring *)&be_const_str_BOILER_OT_TX, - (const bstring *)&be_const_str_ARIRFRCV, - (const bstring *)&be_const_str_TFMINIPLUS_RX, - (const bstring *)&be_const_str_DDSU666_RX, - (const bstring *)&be_const_str_lv_draw_label_dsc, - (const bstring *)&be_const_str_remove_rule, - (const bstring *)&be_const_str_SWT1_NP, - (const bstring *)&be_const_str_lv_draw_mask_line_param_cfg, - (const bstring *)&be_const_str_HLW_CF, - (const bstring *)&be_const_str_classof, - (const bstring *)&be_const_str_LE01MR_TX, - NULL, - NULL, - (const bstring *)&be_const_str_rtc, - NULL, - (const bstring *)&be_const_str__ccmd, - (const bstring *)&be_const_str_dot_p, - NULL, - (const bstring *)&be_const_str_bus, - NULL, - (const bstring *)&be_const_str_SDS0X1_TX, - (const bstring *)&be_const_str_SDM72_TX, - (const bstring *)&be_const_str_AS3935, - NULL, - (const bstring *)&be_const_str_BS814_DAT, - (const bstring *)&be_const_str_OUTPUT_LO, - (const bstring *)&be_const_str_lv_draw_mask_fade_param, - (const bstring *)&be_const_str_SYMBOL_HOME, - (const bstring *)&be_const_str_WEBCAM_VSYNC, - (const bstring *)&be_const_str_HALLEFFECT, - (const bstring *)&be_const_str_OPEN_DRAIN, - (const bstring *)&be_const_str_A4988_STP, - (const bstring *)&be_const_str_SYMBOL_SAVE, - NULL, - (const bstring *)&be_const_str_lv_cont, - (const bstring *)&be_const_str_ARIRFSEL, - (const bstring *)&be_const_str_ETH_PHY_POWER, - (const bstring *)&be_const_str_KEY1, - (const bstring *)&be_const_str_SYMBOL_CHARGE, - NULL, - (const bstring *)&be_const_str_SYMBOL_VIDEO, - NULL, - (const bstring *)&be_const_str_acos, - (const bstring *)&be_const_str_SYMBOL_CLOSE, - (const bstring *)&be_const_str_SSPI_MOSI, - (const bstring *)&be_const_str_FTC532, - (const bstring *)&be_const_str_SPI_CLK, - (const bstring *)&be_const_str_ceil, - NULL, - (const bstring *)&be_const_str_IRRECV, - (const bstring *)&be_const_str_RA8876_CS, - (const bstring *)&be_const_str_TM1638DIO, - (const bstring *)&be_const_str_PROJECTOR_CTRL_RX, - (const bstring *)&be_const_str_SAIR_TX, - NULL, - (const bstring *)&be_const_str_SYMBOL_MINUS, - (const bstring *)&be_const_str_clear, - (const bstring *)&be_const_str_SYMBOL_FILE, - (const bstring *)&be_const_str_RFRECV, - (const bstring *)&be_const_str_calldepth, - (const bstring *)&be_const_str_SDM120_RX, - (const bstring *)&be_const_str_exec_cmd, - (const bstring *)&be_const_str_RF_SENSOR, - (const bstring *)&be_const_str_LEDLNK_INV, - (const bstring *)&be_const_str_dot_p2, - (const bstring *)&be_const_str_HRE_DATA, - (const bstring *)&be_const_str_ADC_PH, - (const bstring *)&be_const_str_SDM120_TX, - (const bstring *)&be_const_str_IEM3000_RX, - (const bstring *)&be_const_str_get_power, - (const bstring *)&be_const_str_dot_def, - (const bstring *)&be_const_str_DHT11, - (const bstring *)&be_const_str_PWM1_INV, - (const bstring *)&be_const_str_BUZZER, - (const bstring *)&be_const_str_WEBCAM_SIOD, - (const bstring *)&be_const_str_SYMBOL_RIGHT, - (const bstring *)&be_const_str_DI, - (const bstring *)&be_const_str_SYMBOL_GPS, - (const bstring *)&be_const_str_gen_cb, - NULL, - (const bstring *)&be_const_str_MAX7219CLK, - (const bstring *)&be_const_str_loop, - NULL, - (const bstring *)&be_const_str_DEEPSLEEP, - (const bstring *)&be_const_str_MCP39F5_RST, - (const bstring *)&be_const_str_ROT1A_NP, - (const bstring *)&be_const_str_PZEM017_RX, - (const bstring *)&be_const_str_HX711_DAT, - (const bstring *)&be_const_str_MGC3130_XFER, - (const bstring *)&be_const_str_GPS_RX, - (const bstring *)&be_const_str_lv_list, - (const bstring *)&be_const_str_AudioOutputI2S, - (const bstring *)&be_const_str_WEBCAM_RESET, - (const bstring *)&be_const_str_TELEINFO_ENABLE, - (const bstring *)&be_const_str_ADC_JOY, - (const bstring *)&be_const_str___upper__, - (const bstring *)&be_const_str_AZ_TXD, - (const bstring *)&be_const_str__drivers, - (const bstring *)&be_const_str_opt_call, - (const bstring *)&be_const_str_CC1101_GDO0, - (const bstring *)&be_const_str_AudioGeneratorMP3, - (const bstring *)&be_const_str_PZEM004_RX, - (const bstring *)&be_const_str_geti, - (const bstring *)&be_const_str_eth, - NULL, (const bstring *)&be_const_str___iterator__, - (const bstring *)&be_const_str_NONE, - (const bstring *)&be_const_str_SOLAXX1_TX, - (const bstring *)&be_const_str_arg, - (const bstring *)&be_const_str_tan, - (const bstring *)&be_const_str_NRF24_DC, - (const bstring *)&be_const_str_event, + (const bstring *)&be_const_str_IEM3000_RX, + NULL, + (const bstring *)&be_const_str_DHT11_OUT, + (const bstring *)&be_const_str_lv_group, + (const bstring *)&be_const_str_dot_def, + (const bstring *)&be_const_str_ST7789_DC, + NULL, + (const bstring *)&be_const_str_EPAPER42_CS, + (const bstring *)&be_const_str_AudioGeneratorMP3, + (const bstring *)&be_const_str_SYMBOL_BATTERY_3, + (const bstring *)&be_const_str_BACKLIGHT, + (const bstring *)&be_const_str_dot_p2, + (const bstring *)&be_const_str_AudioOutputI2S, + (const bstring *)&be_const_str_lv_dropdown, + NULL, + (const bstring *)&be_const_str_SDM630_TX, + (const bstring *)&be_const_str_deinit, (const bstring *)&be_const_str_WEBCAM_XCLK, - (const bstring *)&be_const_str_ADC_BUTTON_INV, - (const bstring *)&be_const_str_MCP39F5_TX, - NULL, + (const bstring *)&be_const_str_TASMOTACLIENT_RXD, + (const bstring *)&be_const_str_SYMBOL_SHUFFLE, (const bstring *)&be_const_str_SSPI_MAX31865_CS1, - (const bstring *)&be_const_str_for, - (const bstring *)&be_const_str__available, - (const bstring *)&be_const_str_return, - (const bstring *)&be_const_str_compile, - (const bstring *)&be_const_str_NRF24_CS, - (const bstring *)&be_const_str_SYMBOL_LIST, - (const bstring *)&be_const_str_true, - (const bstring *)&be_const_str_A4988_ENA, - (const bstring *)&be_const_str_ETH_PHY_MDIO, - (const bstring *)&be_const_str_RISING, - (const bstring *)&be_const_str_rand, - (const bstring *)&be_const_str_Wire, - NULL, - (const bstring *)&be_const_str_CSE7761_RX, - (const bstring *)&be_const_str_CSE7766_RX, - (const bstring *)&be_const_str_PZEM016_RX, - (const bstring *)&be_const_str_SI7021, - (const bstring *)&be_const_str_SYMBOL_UPLOAD, - NULL, - NULL, - (const bstring *)&be_const_str_I2S_IN_CLK, - (const bstring *)&be_const_str_OUTPUT_OPEN_DRAIN, - (const bstring *)&be_const_str_SYMBOL_BELL, - (const bstring *)&be_const_str_SYMBOL_BATTERY_1, - (const bstring *)&be_const_str_atan, - (const bstring *)&be_const_str_opt_add, - (const bstring *)&be_const_str_REL1_INV, - NULL, - (const bstring *)&be_const_str_Tasmota, NULL, (const bstring *)&be_const_str_DDSU666_TX, - (const bstring *)&be_const_str_PWM1, - (const bstring *)&be_const_str_DDS2382_RX, - (const bstring *)&be_const_str_RC522_RST, - (const bstring *)&be_const_str_AS608_TX, + (const bstring *)&be_const_str_BOILER_OT_TX, NULL, - (const bstring *)&be_const_str_dot_p1, - (const bstring *)&be_const_str_ADC_LIGHT, - (const bstring *)&be_const_str_digital_read, - (const bstring *)&be_const_str_DHT11_OUT, - (const bstring *)&be_const_str_PMS5003_RX, - (const bstring *)&be_const_str_LEDLNK, - (const bstring *)&be_const_str_IBEACON_TX, - (const bstring *)&be_const_str_SYMBOL_WIFI, - (const bstring *)&be_const_str_PZEM0XX_TX, - (const bstring *)&be_const_str_KEY1_PD, - (const bstring *)&be_const_str_reverse, - (const bstring *)&be_const_str_PN532_RXD, - (const bstring *)&be_const_str_false, - (const bstring *)&be_const_str_TCP_TX, - (const bstring *)&be_const_str_DYP_RX, + (const bstring *)&be_const_str_bus, + (const bstring *)&be_const_str__cmd, + (const bstring *)&be_const_str_ILI9341_CS, + (const bstring *)&be_const_str_DCKI, + (const bstring *)&be_const_str_CNTR1, + (const bstring *)&be_const_str_SSPI_SCLK, + (const bstring *)&be_const_str_SYMBOL_COPY, NULL, - NULL, - (const bstring *)&be_const_str_AudioFileSourceFS, - (const bstring *)&be_const_str_BL0940_RX, - (const bstring *)&be_const_str__read, - (const bstring *)&be_const_str_CHANGE, - (const bstring *)&be_const_str_lv_canvas, - (const bstring *)&be_const_str_CNTR1_NP, - (const bstring *)&be_const_str_NRG_SEL_INV + (const bstring *)&be_const_str_KEY1_TC, + (const bstring *)&be_const_str_begin, + (const bstring *)&be_const_str_opt_neq }; static const struct bconststrtab m_const_string_table = { - .size = 315, - .count = 631, + .size = 316, + .count = 633, .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 1ce30aa49..86075ac4e 100644 --- a/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h +++ b/lib/libesp32/Berry/generate/be_fixed_be_class_bytes.h @@ -1,34 +1,36 @@ #include "be_constobj.h" static be_define_const_map_slots(be_class_bytes_map) { - { be_const_key(resize, 10), be_const_func(m_resize) }, - { be_const_key(asstring, 11), be_const_func(m_asstring) }, - { be_const_key(init, -1), be_const_func(m_init) }, - { be_const_key(seti, -1), be_const_func(m_set) }, - { be_const_key(setitem, -1), be_const_func(m_setitem) }, - { be_const_key(item, 18), be_const_func(m_item) }, - { be_const_key(dot_p, 3), be_const_index(0) }, - { be_const_key(geti, -1), be_const_func(m_geti) }, - { be_const_key(opt_connect, -1), be_const_func(m_connect) }, - { be_const_key(tostring, -1), be_const_func(m_tostring) }, - { be_const_key(size, -1), be_const_func(m_size) }, + { be_const_key(dot_p, -1), be_const_index(0) }, + { be_const_key(seti, 6), be_const_func(m_set) }, + { be_const_key(get, 7), be_const_func(m_getu) }, + { be_const_key(size, 10), be_const_func(m_size) }, + { be_const_key(resize, 1), be_const_func(m_resize) }, + { be_const_key(opt_add, 22), be_const_func(m_merge) }, { be_const_key(getbits, -1), be_const_closure(getbits_closure) }, - { be_const_key(fromstring, -1), be_const_func(m_fromstring) }, - { be_const_key(opt_add, -1), be_const_func(m_merge) }, - { be_const_key(_buffer, 2), be_const_func(m_buffer) }, - { be_const_key(copy, 8), be_const_func(m_copy) }, - { be_const_key(get, -1), be_const_func(m_getu) }, - { be_const_key(set, -1), be_const_func(m_set) }, - { be_const_key(opt_eq, -1), be_const_func(m_equal) }, - { be_const_key(opt_neq, -1), be_const_func(m_nequal) }, - { be_const_key(clear, 16), be_const_func(m_clear) }, - { be_const_key(setbits, -1), be_const_closure(setbits_closure) }, + { be_const_key(geti, 16), be_const_func(m_geti) }, + { be_const_key(setitem, -1), be_const_func(m_setitem) }, { be_const_key(add, -1), be_const_func(m_add) }, + { be_const_key(fromb64, -1), be_const_func(m_fromb64) }, + { be_const_key(opt_neq, -1), be_const_func(m_nequal) }, + { be_const_key(set, -1), be_const_func(m_set) }, + { be_const_key(asstring, -1), be_const_func(m_asstring) }, + { be_const_key(copy, 3), be_const_func(m_copy) }, + { be_const_key(opt_eq, 2), be_const_func(m_equal) }, + { be_const_key(tob64, -1), be_const_func(m_tob64) }, + { be_const_key(setbits, 12), be_const_closure(setbits_closure) }, + { be_const_key(_buffer, -1), be_const_func(m_buffer) }, + { be_const_key(fromstring, 0), be_const_func(m_fromstring) }, + { be_const_key(tostring, 9), be_const_func(m_tostring) }, + { be_const_key(item, 8), be_const_func(m_item) }, + { be_const_key(init, 23), be_const_func(m_init) }, + { be_const_key(opt_connect, -1), be_const_func(m_connect) }, + { be_const_key(clear, -1), be_const_func(m_clear) }, }; static be_define_const_map( be_class_bytes_map, - 23 + 25 ); 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 c171ccf02..4c35d2113 100644 --- a/lib/libesp32/Berry/src/be_byteslib.c +++ b/lib/libesp32/Berry/src/be_byteslib.c @@ -28,6 +28,198 @@ typedef struct buf_impl { uint8_t buf[]; // the actual data } buf_impl; +/******************************************************************** +** Base64 lib from https://github.com/Densaugeo/base64_arduino +** +********************************************************************/ + +/* binary_to_base64: + * Description: + * Converts a single byte from a binary value to the corresponding base64 character + * Parameters: + * v - Byte to convert + * Returns: + * ascii code of base64 character. If byte is >= 64, then there is not corresponding base64 character + * and 255 is returned + */ +static unsigned char binary_to_base64(unsigned char v); + +/* base64_to_binary: + * Description: + * Converts a single byte from a base64 character to the corresponding binary value + * Parameters: + * c - Base64 character (as ascii code) + * Returns: + * 6-bit binary value + */ +static unsigned char base64_to_binary(unsigned char c); + +/* encode_base64_length: + * Description: + * Calculates length of base64 string needed for a given number of binary bytes + * Parameters: + * input_length - Amount of binary data in bytes + * Returns: + * Number of base64 characters needed to encode input_length bytes of binary data + */ +static unsigned int encode_base64_length(unsigned int input_length); + +/* decode_base64_length: + * Description: + * Calculates number of bytes of binary data in a base64 string + * Parameters: + * input - Base64-encoded null-terminated string + * Returns: + * Number of bytes of binary data in input + */ +static unsigned int decode_base64_length(unsigned char input[]); + +/* encode_base64: + * Description: + * Converts an array of bytes to a base64 null-terminated string + * Parameters: + * input - Pointer to input data + * input_length - Number of bytes to read from input pointer + * output - Pointer to output string. Null terminator will be added automatically + * Returns: + * Length of encoded string in bytes (not including null terminator) + */ +static unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]); + +/* decode_base64: + * Description: + * Converts a base64 null-terminated string to an array of bytes + * Parameters: + * input - Pointer to input string + * output - Pointer to output array + * Returns: + * Number of bytes in the decoded binary + */ +static unsigned int decode_base64(unsigned char input[], unsigned char output[]); + +static unsigned char binary_to_base64(unsigned char v) { + // Capital letters - 'A' is ascii 65 and base64 0 + if(v < 26) return v + 'A'; + + // Lowercase letters - 'a' is ascii 97 and base64 26 + if(v < 52) return v + 71; + + // Digits - '0' is ascii 48 and base64 52 + if(v < 62) return v - 4; + + // '+' is ascii 43 and base64 62 + if(v == 62) return '+'; + + // '/' is ascii 47 and base64 63 + if(v == 63) return '/'; + + return 64; +} + +static unsigned char base64_to_binary(unsigned char c) { + // Capital letters - 'A' is ascii 65 and base64 0 + if('A' <= c && c <= 'Z') return c - 'A'; + + // Lowercase letters - 'a' is ascii 97 and base64 26 + if('a' <= c && c <= 'z') return c - 71; + + // Digits - '0' is ascii 48 and base64 52 + if('0' <= c && c <= '9') return c + 4; + + // '+' is ascii 43 and base64 62 + if(c == '+') return 62; + + // '/' is ascii 47 and base64 63 + if(c == '/') return 63; + + return 255; +} + +static unsigned int encode_base64_length(unsigned int input_length) { + return (input_length + 2)/3*4; +} + +static unsigned int decode_base64_length(unsigned char input[]) { + unsigned char *start = input; + + while(base64_to_binary(input[0]) < 64) { + ++input; + } + + unsigned int input_length = input - start; + + unsigned int output_length = input_length/4*3; + + switch(input_length % 4) { + default: return output_length; + case 2: return output_length + 1; + case 3: return output_length + 2; + } +} + +static unsigned int encode_base64(unsigned char input[], unsigned int input_length, unsigned char output[]) { + unsigned int full_sets = input_length/3; + + // While there are still full sets of 24 bits... + for(unsigned int i = 0; i < full_sets; ++i) { + output[0] = binary_to_base64( input[0] >> 2); + output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4); + output[2] = binary_to_base64((input[1] & 0x0F) << 2 | input[2] >> 6); + output[3] = binary_to_base64( input[2] & 0x3F); + + input += 3; + output += 4; + } + + switch(input_length % 3) { + case 0: + output[0] = '\0'; + break; + case 1: + output[0] = binary_to_base64( input[0] >> 2); + output[1] = binary_to_base64((input[0] & 0x03) << 4); + output[2] = '='; + output[3] = '='; + output[4] = '\0'; + break; + case 2: + output[0] = binary_to_base64( input[0] >> 2); + output[1] = binary_to_base64((input[0] & 0x03) << 4 | input[1] >> 4); + output[2] = binary_to_base64((input[1] & 0x0F) << 2); + output[3] = '='; + output[4] = '\0'; + break; + } + + return encode_base64_length(input_length); +} + +static unsigned int decode_base64(unsigned char input[], unsigned char output[]) { + unsigned int output_length = decode_base64_length(input); + + // While there are still full sets of 24 bits... + for(unsigned int i = 2; i < output_length; i += 3) { + output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4; + output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2; + output[2] = base64_to_binary(input[2]) << 6 | base64_to_binary(input[3]); + + input += 4; + output += 3; + } + + switch(output_length % 3) { + case 1: + output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4; + break; + case 2: + output[0] = base64_to_binary(input[0]) << 2 | base64_to_binary(input[1]) >> 4; + output[1] = base64_to_binary(input[1]) << 4 | base64_to_binary(input[2]) >> 2; + break; + } + + return output_length; +} + /******************************************************************** ** Buffer low-level implementation ** @@ -343,13 +535,26 @@ static size_t tohex(char * out, size_t outsz, const uint8_t * in, size_t insz) { static int m_tostring(bvm *vm) { + int argc = be_top(vm); + int max_len = 32; /* limit to 32 bytes by default */ + int truncated = 0; + if (argc > 1 && be_isint(vm, 2)) { + max_len = be_toint(vm, 2); /* you can specify the len as second argument, or 0 for unlimited */ + } buf_impl * buf = bytes_check_data(vm, 0); size_t len = buf->len; - size_t hex_len = len * 2 + 5 + 2 + 2 + 1; /* reserve size for `bytes("")\0` - 9 chars */ + if (max_len > 0 && len > max_len) { + len = max_len; /* limit output size */ + truncated = 1; + } + size_t hex_len = len * 2 + 5 + 2 + 2 + 1 + truncated * 3; /* reserve size for `bytes("")\0` - 9 chars */ char * hex_out = be_pushbuffer(vm, hex_len); size_t l = be_strlcpy(hex_out, "bytes('", hex_len); - l += tohex(&hex_out[l], hex_len - l, buf_get_buf(buf), buf->len); + l += tohex(&hex_out[l], hex_len - l, buf_get_buf(buf), len); + if (truncated) { + l += be_strlcpy(&hex_out[l], "...", hex_len - l); + } l += be_strlcpy(&hex_out[l], "')", hex_len - l); be_pushnstring(vm, hex_out, l); /* make escape string from buffer */ @@ -699,6 +904,56 @@ static int m_nequal(bvm *vm) return bytes_equal(vm, bfalse); } +/* + * Converts bytes() to a base64 string + * + * Note: there are no line breaks inserted + * + * `b.tob64() -> string` + */ +static int m_tob64(bvm *vm) +{ + buf_impl * buf = bytes_check_data(vm, 0); + size_t len = buf->len; + size_t b64_len = encode_base64_length(len) + 1; /* size of base64 encoded string for this binary length, add NULL terminator */ + + char * b64_out = be_pushbuffer(vm, b64_len); + size_t converted = encode_base64(buf_get_buf(buf), len, b64_out); + + be_pushnstring(vm, b64_out, converted); /* make string from buffer */ + be_remove(vm, -2); /* remove buffer */ + be_return(vm); +} + +/* + * Converts base63 to bytes() + * + * `bytes().fromb64() -> bytes()` + */ +static int m_fromb64(bvm *vm) +{ + int argc = be_top(vm); + if (argc >= 2 && be_isstring(vm, 2)) { + const char *s = be_tostring(vm, 2); + size_t len = be_strlen(vm, 2); + size_t bin_len = decode_base64_length(s); /* do a first pass to calculate the buffer size */ + + buf_impl * buf = bytes_check_data(vm, 0); + buf = bytes_resize(vm, buf, bin_len); /* resize if needed */ + if (bin_len > buf->size) { /* avoid overflow */ + be_raise(vm, "memory_error", "cannot allocate buffer"); + } + + size_t bin_len_final = decode_base64(s, buf_get_buf(buf)); /* decode */ + buf->len = bin_len_final; + be_pop(vm, 1); /* remove arg to leave instance */ + be_return(vm); + } + be_raise(vm, "type_error", "operand must be a string"); + be_return_nil(vm); +} + + /* * Advanced API */ @@ -973,6 +1228,8 @@ void be_load_byteslib(bvm *vm) { "tostring", m_tostring }, { "asstring", m_asstring }, { "fromstring", m_fromstring }, + { "tob64", m_tob64 }, + { "fromb64", m_fromb64 }, { "add", m_add }, { "get", m_getu }, { "geti", m_geti }, @@ -1006,6 +1263,8 @@ class be_class_bytes (scope: global, name: bytes) { tostring, func(m_tostring) asstring, func(m_asstring) fromstring, func(m_fromstring) + tob64, func(m_tob64) + fromb64, func(m_fromb64) add, func(m_add) get, func(m_getu) geti, func(m_geti) From d3ad13c9629ae53665e6339c87d9b99c0e4958e0 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Thu, 19 Aug 2021 12:37:19 +0200 Subject: [PATCH 19/19] Berry system events for rules --- lib/libesp32/Berry/default/embedded/Tasmota.be | 1 + tasmota/xdrv_10_rules.ino | 9 +++++++++ tasmota/xdrv_52_9_berry.ino | 7 ++++--- tasmota/xdrv_interface.ino | 4 ++-- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/libesp32/Berry/default/embedded/Tasmota.be b/lib/libesp32/Berry/default/embedded/Tasmota.be index 9266c135c..b0cffc511 100644 --- a/lib/libesp32/Berry/default/embedded/Tasmota.be +++ b/lib/libesp32/Berry/default/embedded/Tasmota.be @@ -15,6 +15,7 @@ class Timer end end +tasmota = nil class Tasmota # add `chars_in_string(s:string,c:string) -> int`` diff --git a/tasmota/xdrv_10_rules.ino b/tasmota/xdrv_10_rules.ino index d2f323760..a4d454040 100644 --- a/tasmota/xdrv_10_rules.ino +++ b/tasmota/xdrv_10_rules.ino @@ -801,6 +801,11 @@ bool RuleSetProcess(uint8_t rule_set, String &event_saved) bool RulesProcessEvent(const char *json_event) { +#ifdef USE_BERRY + // events are passed to Berry before Rules engine + callBerryRule(json_event); +#endif + if (Rules.busy) { return false; } Rules.busy = true; @@ -858,7 +863,11 @@ void RulesInit(void) void RulesEvery50ms(void) { +#ifdef USE_BERRY + if (!Rules.busy) { // Emitting Rules events is always enabled with Berry +#else if (Settings->rule_enabled && !Rules.busy) { // Any rule enabled +#endif char json_event[120]; if (-1 == Rules.new_power) { Rules.new_power = TasmotaGlobal.power; } diff --git a/tasmota/xdrv_52_9_berry.ino b/tasmota/xdrv_52_9_berry.ino index 213645f1f..6095a7750 100644 --- a/tasmota/xdrv_52_9_berry.ino +++ b/tasmota/xdrv_52_9_berry.ino @@ -93,12 +93,13 @@ extern "C" { \*********************************************************************************************/ // // call a function (if exists) of type void -> void -bool callBerryRule(void) { +// If event == nullptr, then take XdrvMailbox.data +bool callBerryRule(const char *event) { if (berry.rules_busy) { return false; } berry.rules_busy = true; char * json_event = XdrvMailbox.data; bool serviced = false; - serviced = callBerryEventDispatcher(PSTR("rule"), nullptr, 0, XdrvMailbox.data); + serviced = callBerryEventDispatcher(PSTR("rule"), nullptr, 0, event ? event : XdrvMailbox.data); berry.rules_busy = false; return serviced; // TODO event not handled } @@ -732,7 +733,7 @@ bool Xdrv52(uint8_t function) // Berry wide commands and events case FUNC_RULES_PROCESS: - result = callBerryRule(); + result = callBerryRule(nullptr); break; case FUNC_MQTT_DATA: result = callBerryEventDispatcher(PSTR("mqtt_data"), XdrvMailbox.topic, 0, XdrvMailbox.data, XdrvMailbox.data_len); diff --git a/tasmota/xdrv_interface.ino b/tasmota/xdrv_interface.ino index e3c637231..0444ad11d 100644 --- a/tasmota/xdrv_interface.ino +++ b/tasmota/xdrv_interface.ino @@ -1083,8 +1083,8 @@ bool XdrvRulesProcess(bool teleperiod, const char* event) { char* data_save = XdrvMailbox.data; XdrvMailbox.data = (char*)event; bool rule_handled = XdrvCallDriver(10, (teleperiod) ? FUNC_TELEPERIOD_RULES_PROCESS : FUNC_RULES_PROCESS); -#ifdef USE_BERRY - // events are passed to both Rules engine AND Berry engine +#if defined(USE_BERRY) && !defined(USE_RULES) + // events are sent to Berry in Rules driver, or here if USE_RULES is not defined (only on a subset) bool berry_handled = XdrvCallDriver(52, FUNC_RULES_PROCESS); rule_handled |= berry_handled; #endif