From 6ebd447bf2e1ecef9aa5da74e1e3e0216fc607f5 Mon Sep 17 00:00:00 2001 From: p2122 <50148903+p2122@users.noreply.github.com> Date: Mon, 26 Jun 2023 20:22:21 +0200 Subject: [PATCH 001/150] Add files via upload (#18957) --- .../Elecrow_Terminal_ILI9488_p16_display.ini | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 tasmota/displaydesc/Elecrow_Terminal_ILI9488_p16_display.ini diff --git a/tasmota/displaydesc/Elecrow_Terminal_ILI9488_p16_display.ini b/tasmota/displaydesc/Elecrow_Terminal_ILI9488_p16_display.ini new file mode 100644 index 000000000..6cd8fde02 --- /dev/null +++ b/tasmota/displaydesc/Elecrow_Terminal_ILI9488_p16_display.ini @@ -0,0 +1,30 @@ +:H,ILI9488,480,320,16,PAR,16,-1,-1,45,18,48,46,47,21,14,13,12,11,10,9,3,8,16,15,7,6,5,4,20 +:S,2,1,1,0,40,20 +:I +E0,0F,00,03,09,08,16,0A,3F,78,4C,09,0A,08,16,1A,0F +E1,0F,00,16,19,03,0F,05,32,45,46,04,0E,0D,35,37,0F +C0,2,17,15 +C1,1,41 +C5,3,00,12,80 +36,1,48 +3A,1,55 +B0,1,80 +B1,1,A0 +B4,1,02 +B6,2,02,02 +E9,1,00 +F7,4,A9,51,2C,82 +11,80 +29,0 +:o,28 +:O,29 +:A,2A,2B,2C,16 +:R,36 +:0,28,00,00,85 +:1,88,00,00,02 +:2,E8,00,00,84 +:3,48,00,00,00 +:i,20,21 +:TI1,38,39,38 +:B,20,5 +# \ No newline at end of file From 7892a3879589cb7c9aed6409baed1dc6504f273a Mon Sep 17 00:00:00 2001 From: Paul Blacknell Date: Mon, 26 Jun 2023 20:56:07 +0100 Subject: [PATCH 002/150] add HybridControllerPhase to json payload (#18842) --- tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino b/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino index 95041ca47..f8bed9bd4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino @@ -2048,6 +2048,7 @@ const char HTTP_THERMOSTAT_HL[] PROGMEM = "{s}
{m}
{e}"; #endif // USE_WEBSERVER #define D_THERMOSTAT_JSON_NAME_CONTROL_METHOD "ControlMethod" +#define D_THERMOSTAT_JSON_NAME_HYBRID_CONTROLLER_PHASE "HybridControllerPhase" #define D_THERMOSTAT_JSON_NAME_EMERGENCY_STATE "EmergencyState" void ThermostatShow(uint8_t ctr_output, bool json) @@ -2058,7 +2059,8 @@ void ThermostatShow(uint8_t ctr_output, bool json) ResponseAppend_P(PSTR("%s\"%s\":%i"), "", D_CMND_THERMOSTATMODESET, Thermostat[ctr_output].status.thermostat_mode); ResponseAppend_P(PSTR("%s\"%s\":%2_f"), ",", D_CMND_TEMPTARGETSET, &f_target_temp); ResponseAppend_P(PSTR("%s\"%s\":%i"), ",", D_CMND_CTRDUTYCYCLEREAD, ThermostatGetDutyCycle(ctr_output)); - ResponseAppend_P(PSTR("%s\"%s\":%i"), ",", D_THERMOSTAT_JSON_NAME_CONTROL_METHOD, Thermostat[ctr_output].status.controller_mode == CTR_HYBRID ? Thermostat[ctr_output].status.phase_hybrid_ctr : Thermostat[ctr_output].status.controller_mode); + ResponseAppend_P(PSTR("%s\"%s\":%i"), ",", D_THERMOSTAT_JSON_NAME_CONTROL_METHOD, Thermostat[ctr_output].status.controller_mode); + ResponseAppend_P(PSTR("%s\"%s\":%i"), ",", D_THERMOSTAT_JSON_NAME_HYBRID_CONTROLLER_PHASE, Thermostat[ctr_output].status.phase_hybrid_ctr); ResponseAppend_P(PSTR("%s\"%s\":%i"), ",", D_THERMOSTAT_JSON_NAME_EMERGENCY_STATE, Thermostat[ctr_output].diag.state_emergency == EMERGENCY_ON); ResponseJsonEnd(); return; From a51096e400380e9d7f11acab396b5a81d2dbd8db Mon Sep 17 00:00:00 2001 From: jonschz <17198703+jonschz@users.noreply.github.com> Date: Tue, 27 Jun 2023 14:23:44 +0200 Subject: [PATCH 003/150] update light when `VirtualCT` is invoked (#18972) Co-authored-by: jonschz --- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 1 + 1 file changed, 1 insertion(+) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index f5e48f174..e37c1b2de 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -3276,6 +3276,7 @@ void CmndVirtualCT(void) } } checkVirtualCT(); + Light.update = true; Response_P(PSTR("{\"%s\":{"), XdrvMailbox.command); uint32_t pivot_len = CT_PIVOTS; From 9cf3d16065e37c320ac624af14a8f03b07c1497e Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 27 Jun 2023 14:32:08 +0200 Subject: [PATCH 004/150] Berry various fixes for Walrus Operator (#18982) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_code.c | 34 +++++++++++++----------------- lib/libesp32/berry/src/be_lexer.c | 2 +- lib/libesp32/berry/src/be_parser.c | 2 ++ 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a9fcb39c6..8105d5238 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. ### Changed ### Fixed +- Berry various fixes for Walrus Operator ### Removed diff --git a/lib/libesp32/berry/src/be_code.c b/lib/libesp32/berry/src/be_code.c index 7c020524a..27c3b40e8 100644 --- a/lib/libesp32/berry/src/be_code.c +++ b/lib/libesp32/berry/src/be_code.c @@ -78,20 +78,11 @@ 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 */ -static void code_move_nooptim(bfuncinfo *finfo, int a, int b) -{ - if (isK(b)) { - codeABx(finfo, OP_LDCONST, a, b & 0xFF); - } else { - codeABC(finfo, OP_MOVE, a, b, 0); - } -} - /* 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) +/* returns false if the move operation happened, or true if there was a register optimization and `b` should be replaced by `a` */ +static bbool code_move(bfuncinfo *finfo, int a, int b) { if (finfo->pc) { /* If not the first instruction of the function */ binstruction *i = be_vector_end(&finfo->code); /* get the last instruction */ @@ -101,11 +92,16 @@ static void code_move(bfuncinfo *finfo, int a, int b) int x = IGET_RA(*i), y = IGET_RKB(*i), z = IGET_RKC(*i); if (b == x && (a == y || (op < OP_NEG && a == z))) { *i = (*i & ~IRA_MASK) | ISET_RA(a); - return; + return btrue; } } } - code_move_nooptim(finfo, a, b); + if (isK(b)) { + codeABx(finfo, OP_LDCONST, a, b & 0xFF); + } else { + codeABC(finfo, OP_MOVE, a, b, 0); + } + return bfalse; } /* Free register at top (checks that it´s a register) */ @@ -113,7 +109,7 @@ static void code_move(bfuncinfo *finfo, int a, int b) static void free_expreg(bfuncinfo *finfo, bexpdesc *e) { /* release temporary register */ - if (e && e->type == ETREG) { + if (e && e->type == ETREG && e->v.idx == finfo->freereg - 1) { /* free ETREG only if it's top of stack */ be_code_freeregs(finfo, 1); } } @@ -690,10 +686,10 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg) switch (e1->type) { case ETLOCAL: /* It can't be ETREG. */ if (e1->v.idx != src) { - if (keep_reg) { - code_move_nooptim(finfo, e1->v.idx, src); /* always do explicit move */ - } else { - code_move(finfo, e1->v.idx, src); /* do explicit move only if needed */ + bbool reg_optimized = code_move(finfo, e1->v.idx, src); /* do explicit move only if needed */ + if (reg_optimized) { + free_expreg(finfo, e2); /* free source (checks only ETREG) */ + *e2 = *e1; /* now e2 is e1 ETLOCAL */ } } break; @@ -725,7 +721,7 @@ int be_code_nextreg(bfuncinfo *finfo, bexpdesc *e) { int dst = finfo->freereg; int src = exp2anyreg(finfo, e); /* get variable register index */ - if (e->type != ETREG) { /* move local and const to new register */ + if ((e->type != ETREG) || (src < dst - 1)) { /* move local and const to new register, don't move if already top of stack */ code_move(finfo, dst, src); be_code_allocregs(finfo, 1); } else { diff --git a/lib/libesp32/berry/src/be_lexer.c b/lib/libesp32/berry/src/be_lexer.c index 394a84007..8a038a507 100644 --- a/lib/libesp32/berry/src/be_lexer.c +++ b/lib/libesp32/berry/src/be_lexer.c @@ -41,7 +41,7 @@ static const char* const kwords_tab[] = { "for", "def", "end", "class", "break", "continue", "return", "true", "false", "nil", "var", "do", "import", "as", "try", "except", "raise", "static", - // ".f" + ":=", }; void be_lexerror(blexer *lexer, const char *msg) diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index df319318f..73aa831a2 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1131,9 +1131,11 @@ static void walrus_expr(bparser *parser, bexpdesc *e) sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ btokentype op = next_type(parser); if (op == OptWalrus) { + check_symbol(parser, e); bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */ scan_next_token(parser); /* skip ':=' */ expr(parser, e); + check_var(parser, e); if (check_newvar(parser, &e1)) { /* new variable */ new_var(parser, e1.v.s, e); } From b10b42ff343aa0978989baa2a29f120fe802d34b Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Tue, 27 Jun 2023 20:33:38 +0200 Subject: [PATCH 005/150] warn for whitespaces in path (#18985) --- pio-tools/override_copy.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pio-tools/override_copy.py b/pio-tools/override_copy.py index 53a2762a5..7a45512a8 100644 --- a/pio-tools/override_copy.py +++ b/pio-tools/override_copy.py @@ -1,8 +1,13 @@ Import('env') import os +import pathlib +from os.path import join import shutil +if " " in join(pathlib.Path(env["PROJECT_DIR"])): + print ("\u001b[31;1m*** Whitespace(s) in project path, unexpected issues/errors can happen ***\u001b[0m") + # copy tasmota/user_config_override_sample.h to tasmota/user_config_override.h if os.path.isfile("tasmota/user_config_override.h"): print ("*** use provided user_config_override.h as planned ***") From 694bebb5741cbe276a43030e96306990d9faa0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=B6tz=20Gottwald?= Date: Tue, 27 Jun 2023 20:56:40 +0200 Subject: [PATCH 006/150] quote path (#18975) --- pio-tools/metrics-firmware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pio-tools/metrics-firmware.py b/pio-tools/metrics-firmware.py index 0ecdb3f36..623256245 100644 --- a/pio-tools/metrics-firmware.py +++ b/pio-tools/metrics-firmware.py @@ -7,7 +7,7 @@ from os.path import join def firm_metrics(source, target, env): if env["PIOPLATFORM"] == "espressif32": import tasmota_metrics - env.Execute("$PYTHONEXE -m tasmota_metrics " + str(tasmotapiolib.get_source_map_path(env).resolve())) + env.Execute("$PYTHONEXE -m tasmota_metrics \"" + str(tasmotapiolib.get_source_map_path(env).resolve()) + "\"") elif env["PIOPLATFORM"] == "espressif8266": map_file = join(env.subst("$BUILD_DIR")) + os.sep + "firmware.map" with open(map_file,'r') as f: @@ -22,4 +22,4 @@ def firm_metrics(source, target, env): print("Used static IRAM:",used_bytes,"bytes (",remaining_bytes,"remain,",percentage,"% used)") -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin",firm_metrics) \ No newline at end of file +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin",firm_metrics) From b9588e6192a870e6483469c1c102616e3f565b25 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 27 Jun 2023 22:07:13 +0200 Subject: [PATCH 007/150] Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_listlib.c | 10 + lib/libesp32/berry/src/be_maplib.c | 10 + lib/libesp32/berry/tests/bool.be | 8 +- .../src/embedded/tasmota_class.be | 20 +- .../src/solidify/solidified_tasmota_class.h | 200 +++++++++--------- 6 files changed, 146 insertions(+), 103 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8105d5238..65e72fdff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added ### Breaking Changed +- Berry `bool( [] )` and `bool( {} )` now evaluate as `false` ### Changed diff --git a/lib/libesp32/berry/src/be_listlib.c b/lib/libesp32/berry/src/be_listlib.c index a98b679df..9cbfa38b0 100644 --- a/lib/libesp32/berry/src/be_listlib.c +++ b/lib/libesp32/berry/src/be_listlib.c @@ -262,6 +262,14 @@ static int m_size(bvm *vm) be_return(vm); } +static int m_tobool(bvm *vm) +{ + be_getmember(vm, 1, ".p"); + list_check_data(vm, 1); + be_pushbool(vm, be_data_size(vm, -1) > 0); + be_return(vm); +} + static int m_resize(bvm *vm) { be_getmember(vm, 1, ".p"); @@ -507,6 +515,7 @@ void be_load_listlib(bvm *vm) { "reverse", m_reverse }, { "copy", m_copy }, { "keys", m_keys }, + { "tobool", m_tobool } { "..", m_connect }, { "+", m_merge }, { "==", m_equal }, @@ -536,6 +545,7 @@ class be_class_list (scope: global, name: list) { reverse, func(m_reverse) copy, func(m_copy) keys, func(m_keys) + tobool, func(m_tobool) .., func(m_connect) +, func(m_merge) ==, func(m_equal) diff --git a/lib/libesp32/berry/src/be_maplib.c b/lib/libesp32/berry/src/be_maplib.c index fc9f09fe7..bf05f1a29 100644 --- a/lib/libesp32/berry/src/be_maplib.c +++ b/lib/libesp32/berry/src/be_maplib.c @@ -150,6 +150,14 @@ static int m_size(bvm *vm) be_return(vm); } +static int m_tobool(bvm *vm) +{ + be_getmember(vm, 1, ".p"); + map_check_data(vm, 1); + be_pushbool(vm, be_data_size(vm, -1) > 0); + be_return(vm); +} + static int iter_closure(bvm *vm) { /* for better performance, we operate the upvalues @@ -229,6 +237,7 @@ void be_load_maplib(bvm *vm) { "insert", m_insert }, { "iter", m_iter }, { "keys", m_keys }, + { "tobool", m_tobool } { NULL, NULL } }; be_regclass(vm, "map", members); @@ -249,6 +258,7 @@ class be_class_map (scope: global, name: map) { insert, func(m_insert) iter, func(m_iter) keys, func(m_keys) + tobool, func(m_tobool) } @const_object_info_end */ #include "../generate/be_fixed_be_class_map.h" diff --git a/lib/libesp32/berry/tests/bool.be b/lib/libesp32/berry/tests/bool.be index ac5a69ab5..b0323c3df 100644 --- a/lib/libesp32/berry/tests/bool.be +++ b/lib/libesp32/berry/tests/bool.be @@ -36,7 +36,13 @@ assert(bool(3.5) == true) assert(bool('') == false) # changed behavior assert(bool('a') == true) assert(bool(list) == true) -assert(bool(list()) == true) +assert(bool(list()) == false) # changed behavior +assert(bool([]) == false) # changed behavior +assert(bool([0]) == true) +assert(bool(map()) == false) # changed behavior +assert(bool({}) == false) # changed behavior +assert(bool({false:false}) == true) +assert(bool({nil:nil}) == false)# changed behavior - `nil` key is ignored so the map is empty import introspect assert(bool(introspect.toptr(0x1000)) == true) diff --git a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be index a9bad3416..bd06672c2 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be +++ b/lib/libesp32/berry_tasmota/src/embedded/tasmota_class.be @@ -85,8 +85,8 @@ class Tasmota # Rules def add_rule(pat, f, id) self.check_not_method(f) - if !self._rules - self._rules=[] + if self._rules == nil + self._rules = [] end if type(f) == 'function' self._rules.push(Trigger(self.Rule_Matcher.parse(pat), f, id)) @@ -186,7 +186,9 @@ class Tasmota def set_timer(delay,f,id) self.check_not_method(f) - if !self._timers self._timers=[] end + if self._timers == nil + self._timers=[] + end self._timers.push(Trigger(self.millis(delay),f,id)) end @@ -245,7 +247,9 @@ class Tasmota # crontab style recurring events def add_cron(pattern,f,id) self.check_not_method(f) - if !self._crons self._crons=[] end + if self._crons == nil + self._crons=[] + end var cron_obj = ccronexpr(str(pattern)) # can fail, throwing an exception var next_time = cron_obj.next() @@ -285,8 +289,8 @@ class Tasmota # Add command to list def add_cmd(c,f) self.check_not_method(f) - if !self._ccmd - self._ccmd={} + if self._ccmd == nil + self._ccmd = {} end if type(f) == 'function' self._ccmd[c]=f @@ -546,7 +550,9 @@ class Tasmota def add_fast_loop(cl) self.check_not_method(cl) - if !self._fl self._fl = [] end + if self._fl == nil + self._fl = [] + end if type(cl) != 'function' raise "value_error", "argument must be a function" end self.global.fast_loop_enabled = 1 # enable fast_loop at global level: `TasmotaGlobal.fast_loop_enabled = true` self._fl.push(cl) diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h index f40650349..0c7730c97 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_tasmota_class.h @@ -854,26 +854,28 @@ be_local_closure(Tasmota_set_timer, /* name */ }), &be_const_str_set_timer, &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ + ( &(const binstruction[21]) { /* code */ 0x8C100100, // 0000 GETMET R4 R0 K0 0x5C180400, // 0001 MOVE R6 R2 0x7C100400, // 0002 CALL R4 2 0x88100101, // 0003 GETMBR R4 R0 K1 - 0x74120002, // 0004 JMPT R4 #0008 - 0x60100012, // 0005 GETGBL R4 G18 - 0x7C100000, // 0006 CALL R4 0 - 0x90020204, // 0007 SETMBR R0 K1 R4 - 0x88100101, // 0008 GETMBR R4 R0 K1 - 0x8C100902, // 0009 GETMET R4 R4 K2 - 0xB81A0600, // 000A GETNGBL R6 K3 - 0x8C1C0104, // 000B GETMET R7 R0 K4 - 0x5C240200, // 000C MOVE R9 R1 - 0x7C1C0400, // 000D CALL R7 2 - 0x5C200400, // 000E MOVE R8 R2 - 0x5C240600, // 000F MOVE R9 R3 - 0x7C180600, // 0010 CALL R6 3 - 0x7C100400, // 0011 CALL R4 2 - 0x80000000, // 0012 RET 0 + 0x4C140000, // 0004 LDNIL R5 + 0x1C100805, // 0005 EQ R4 R4 R5 + 0x78120002, // 0006 JMPF R4 #000A + 0x60100012, // 0007 GETGBL R4 G18 + 0x7C100000, // 0008 CALL R4 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x88100101, // 000A GETMBR R4 R0 K1 + 0x8C100902, // 000B GETMET R4 R4 K2 + 0xB81A0600, // 000C GETNGBL R6 K3 + 0x8C1C0104, // 000D GETMET R7 R0 K4 + 0x5C240200, // 000E MOVE R9 R1 + 0x7C1C0400, // 000F CALL R7 2 + 0x5C200400, // 0010 MOVE R8 R2 + 0x5C240600, // 0011 MOVE R9 R3 + 0x7C180600, // 0012 CALL R6 3 + 0x7C100400, // 0013 CALL R4 2 + 0x80000000, // 0014 RET 0 }) ) ); @@ -903,32 +905,34 @@ be_local_closure(Tasmota_add_cron, /* name */ }), &be_const_str_add_cron, &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ + ( &(const binstruction[27]) { /* code */ 0x8C100100, // 0000 GETMET R4 R0 K0 0x5C180400, // 0001 MOVE R6 R2 0x7C100400, // 0002 CALL R4 2 0x88100101, // 0003 GETMBR R4 R0 K1 - 0x74120002, // 0004 JMPT R4 #0008 - 0x60100012, // 0005 GETGBL R4 G18 - 0x7C100000, // 0006 CALL R4 0 - 0x90020204, // 0007 SETMBR R0 K1 R4 - 0xB8120400, // 0008 GETNGBL R4 K2 - 0x60140008, // 0009 GETGBL R5 G8 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C140200, // 000B CALL R5 1 - 0x7C100200, // 000C CALL R4 1 - 0x8C140903, // 000D GETMET R5 R4 K3 - 0x7C140200, // 000E CALL R5 1 - 0x88180101, // 000F GETMBR R6 R0 K1 - 0x8C180D04, // 0010 GETMET R6 R6 K4 - 0xB8220A00, // 0011 GETNGBL R8 K5 - 0x5C240A00, // 0012 MOVE R9 R5 - 0x5C280400, // 0013 MOVE R10 R2 - 0x5C2C0600, // 0014 MOVE R11 R3 - 0x5C300800, // 0015 MOVE R12 R4 - 0x7C200800, // 0016 CALL R8 4 - 0x7C180400, // 0017 CALL R6 2 - 0x80000000, // 0018 RET 0 + 0x4C140000, // 0004 LDNIL R5 + 0x1C100805, // 0005 EQ R4 R4 R5 + 0x78120002, // 0006 JMPF R4 #000A + 0x60100012, // 0007 GETGBL R4 G18 + 0x7C100000, // 0008 CALL R4 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0xB8120400, // 000A GETNGBL R4 K2 + 0x60140008, // 000B GETGBL R5 G8 + 0x5C180200, // 000C MOVE R6 R1 + 0x7C140200, // 000D CALL R5 1 + 0x7C100200, // 000E CALL R4 1 + 0x8C140903, // 000F GETMET R5 R4 K3 + 0x7C140200, // 0010 CALL R5 1 + 0x88180101, // 0011 GETMBR R6 R0 K1 + 0x8C180D04, // 0012 GETMET R6 R6 K4 + 0xB8220A00, // 0013 GETNGBL R8 K5 + 0x5C240A00, // 0014 MOVE R9 R5 + 0x5C280400, // 0015 MOVE R10 R2 + 0x5C2C0600, // 0016 MOVE R11 R3 + 0x5C300800, // 0017 MOVE R12 R4 + 0x7C200800, // 0018 CALL R8 4 + 0x7C180400, // 0019 CALL R6 2 + 0x80000000, // 001A RET 0 }) ) ); @@ -2068,25 +2072,27 @@ be_local_closure(Tasmota_add_cmd, /* name */ }), &be_const_str_add_cmd, &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[20]) { /* code */ 0x8C0C0100, // 0000 GETMET R3 R0 K0 0x5C140400, // 0001 MOVE R5 R2 0x7C0C0400, // 0002 CALL R3 2 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x740E0002, // 0004 JMPT R3 #0008 - 0x600C0013, // 0005 GETGBL R3 G19 - 0x7C0C0000, // 0006 CALL R3 0 - 0x90020203, // 0007 SETMBR R0 K1 R3 - 0x600C0004, // 0008 GETGBL R3 G4 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x1C0C0702, // 000B EQ R3 R3 K2 - 0x780E0002, // 000C JMPF R3 #0010 - 0x880C0101, // 000D GETMBR R3 R0 K1 - 0x980C0202, // 000E SETIDX R3 R1 R2 - 0x70020000, // 000F JMP #0011 - 0xB0060704, // 0010 RAISE 1 K3 K4 - 0x80000000, // 0011 RET 0 + 0x4C100000, // 0004 LDNIL R4 + 0x1C0C0604, // 0005 EQ R3 R3 R4 + 0x780E0002, // 0006 JMPF R3 #000A + 0x600C0013, // 0007 GETGBL R3 G19 + 0x7C0C0000, // 0008 CALL R3 0 + 0x90020203, // 0009 SETMBR R0 K1 R3 + 0x600C0004, // 000A GETGBL R3 G4 + 0x5C100400, // 000B MOVE R4 R2 + 0x7C0C0200, // 000C CALL R3 1 + 0x1C0C0702, // 000D EQ R3 R3 K2 + 0x780E0002, // 000E JMPF R3 #0012 + 0x880C0101, // 000F GETMBR R3 R0 K1 + 0x980C0202, // 0010 SETIDX R3 R1 R2 + 0x70020000, // 0011 JMP #0013 + 0xB0060704, // 0012 RAISE 1 K3 K4 + 0x80000000, // 0013 RET 0 }) ) ); @@ -2178,28 +2184,30 @@ be_local_closure(Tasmota_add_fast_loop, /* name */ }), &be_const_str_add_fast_loop, &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0x8C080100, // 0000 GETMET R2 R0 K0 0x5C100200, // 0001 MOVE R4 R1 0x7C080400, // 0002 CALL R2 2 0x88080101, // 0003 GETMBR R2 R0 K1 - 0x740A0002, // 0004 JMPT R2 #0008 - 0x60080012, // 0005 GETGBL R2 G18 - 0x7C080000, // 0006 CALL R2 0 - 0x90020202, // 0007 SETMBR R0 K1 R2 - 0x60080004, // 0008 GETGBL R2 G4 - 0x5C0C0200, // 0009 MOVE R3 R1 - 0x7C080200, // 000A CALL R2 1 - 0x20080502, // 000B NE R2 R2 K2 - 0x780A0000, // 000C JMPF R2 #000E - 0xB0060704, // 000D RAISE 1 K3 K4 - 0x88080105, // 000E GETMBR R2 R0 K5 - 0x900A0D07, // 000F SETMBR R2 K6 K7 - 0x88080101, // 0010 GETMBR R2 R0 K1 - 0x8C080508, // 0011 GETMET R2 R2 K8 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C080400, // 0013 CALL R2 2 - 0x80000000, // 0014 RET 0 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C080403, // 0005 EQ R2 R2 R3 + 0x780A0002, // 0006 JMPF R2 #000A + 0x60080012, // 0007 GETGBL R2 G18 + 0x7C080000, // 0008 CALL R2 0 + 0x90020202, // 0009 SETMBR R0 K1 R2 + 0x60080004, // 000A GETGBL R2 G4 + 0x5C0C0200, // 000B MOVE R3 R1 + 0x7C080200, // 000C CALL R2 1 + 0x20080502, // 000D NE R2 R2 K2 + 0x780A0000, // 000E JMPF R2 #0010 + 0xB0060704, // 000F RAISE 1 K3 K4 + 0x88080105, // 0010 GETMBR R2 R0 K5 + 0x900A0D07, // 0011 SETMBR R2 K6 K7 + 0x88080101, // 0012 GETMBR R2 R0 K1 + 0x8C080508, // 0013 GETMET R2 R2 K8 + 0x5C100200, // 0014 MOVE R4 R1 + 0x7C080400, // 0015 CALL R2 2 + 0x80000000, // 0016 RET 0 }) ) ); @@ -2232,34 +2240,36 @@ be_local_closure(Tasmota_add_rule, /* name */ }), &be_const_str_add_rule, &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[29]) { /* code */ 0x8C100100, // 0000 GETMET R4 R0 K0 0x5C180400, // 0001 MOVE R6 R2 0x7C100400, // 0002 CALL R4 2 0x88100101, // 0003 GETMBR R4 R0 K1 - 0x74120002, // 0004 JMPT R4 #0008 - 0x60100012, // 0005 GETGBL R4 G18 - 0x7C100000, // 0006 CALL R4 0 - 0x90020204, // 0007 SETMBR R0 K1 R4 - 0x60100004, // 0008 GETGBL R4 G4 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C100200, // 000A CALL R4 1 - 0x1C100902, // 000B EQ R4 R4 K2 - 0x7812000B, // 000C JMPF R4 #0019 - 0x88100101, // 000D GETMBR R4 R0 K1 - 0x8C100903, // 000E GETMET R4 R4 K3 - 0xB81A0800, // 000F GETNGBL R6 K4 - 0x881C0105, // 0010 GETMBR R7 R0 K5 - 0x8C1C0F06, // 0011 GETMET R7 R7 K6 - 0x5C240200, // 0012 MOVE R9 R1 - 0x7C1C0400, // 0013 CALL R7 2 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x7C180600, // 0016 CALL R6 3 - 0x7C100400, // 0017 CALL R4 2 - 0x70020000, // 0018 JMP #001A - 0xB0060F08, // 0019 RAISE 1 K7 K8 - 0x80000000, // 001A RET 0 + 0x4C140000, // 0004 LDNIL R5 + 0x1C100805, // 0005 EQ R4 R4 R5 + 0x78120002, // 0006 JMPF R4 #000A + 0x60100012, // 0007 GETGBL R4 G18 + 0x7C100000, // 0008 CALL R4 0 + 0x90020204, // 0009 SETMBR R0 K1 R4 + 0x60100004, // 000A GETGBL R4 G4 + 0x5C140400, // 000B MOVE R5 R2 + 0x7C100200, // 000C CALL R4 1 + 0x1C100902, // 000D EQ R4 R4 K2 + 0x7812000B, // 000E JMPF R4 #001B + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x8C100903, // 0010 GETMET R4 R4 K3 + 0xB81A0800, // 0011 GETNGBL R6 K4 + 0x881C0105, // 0012 GETMBR R7 R0 K5 + 0x8C1C0F06, // 0013 GETMET R7 R7 K6 + 0x5C240200, // 0014 MOVE R9 R1 + 0x7C1C0400, // 0015 CALL R7 2 + 0x5C200400, // 0016 MOVE R8 R2 + 0x5C240600, // 0017 MOVE R9 R3 + 0x7C180600, // 0018 CALL R6 3 + 0x7C100400, // 0019 CALL R4 2 + 0x70020000, // 001A JMP #001C + 0xB0060F08, // 001B RAISE 1 K7 K8 + 0x80000000, // 001C RET 0 }) ) ); From 1e19e13c6f0bec007d41586c80a8b923763b65f8 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:16:40 +0200 Subject: [PATCH 008/150] Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) --- CHANGELOG.md | 1 + .../embedded/Matter_Plugin_Bridge_Sensor.be | 15 + .../Matter_Plugin_Bridge_Sensor_Temp.be | 3 + .../src/embedded/Matter_Plugin_Sensor_Temp.be | 3 + .../solidified_Matter_Plugin_Bridge_Sensor.h | 298 ++++++++++-------- ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 36 ++- .../solidified_Matter_Plugin_Sensor_Temp.h | 43 ++- 7 files changed, 240 insertions(+), 159 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 65e72fdff..2c052e125 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` ### Changed +- Matter support for temperature in Fahrenheit (`SetOption8 1`) ### Fixed - Berry various fixes for Walrus Operator diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index d06b3d482..444a82e68 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -39,6 +39,13 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" var tasmota_sensor_matcher # Actual matcher object var shadow_value # Last known value + var temp_unit # temperature unit, "C" or "F" + static var TEMP_C = "C" + static var TEMP_F = "F" + var pressure_unit # pressure unit, "hPa" or "mmHg" or "inHg" + static var PRESSURE_HPA = "hPa" + static var PRESSURE_MMHG = "mmHg" + static var PRESSURE_INHG = "inHg" ############################################################# # parse_configuration @@ -49,6 +56,8 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP if self.tasmota_sensor_filter self.tasmota_sensor_matcher = tasmota.Rule_Matcher.parse(self.tasmota_sensor_filter) end + self.temp_unit = self.TEMP_C + self.pressure_unit = self.PRESSURE_HPA end ############################################################# @@ -57,6 +66,12 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP # TO BE OVERRIDDEN def parse_update(data, index) if index == 8 # Status 8 + if data.contains("TempUnit") + self.temp_unit = data["TempUnit"] + end + if data.contains("PressureUnit") + self.pressure_unit = data["PressureUnit"] + end if self.tasmota_sensor_matcher var val = self.pre_value(real(self.tasmota_sensor_matcher.match(data))) if val != nil diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index 56e7472af..3dbb0b771 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -50,6 +50,9 @@ class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) + if self.temp_unit == self.TEMP_F # Fahrenheit + val = (val - 32) / 1.8 + end return val != nil ? int(val * 100) : nil end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index 1f6b57553..f68cd62d6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -40,6 +40,9 @@ class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor # This must be overriden. # This allows to convert the raw sensor value to the target one, typically int def pre_value(val) + if tasmota.get_option(8) == 1 # Fahrenheit + val = (val - 32) / 1.8 + end return val != nil ? int(val * 100) : nil end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h index 97d255b37..e3bd32436 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -6,6 +6,82 @@ extern const bclass be_class_Matter_Plugin_Bridge_Sensor; +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_parse_configuration, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota_sensor_filter), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(Rule_Matcher), + /* K6 */ be_nested_str_weak(parse), + /* K7 */ be_nested_str_weak(temp_unit), + /* K8 */ be_nested_str_weak(TEMP_C), + /* K9 */ be_nested_str_weak(pressure_unit), + /* K10 */ be_nested_str_weak(PRESSURE_HPA), + }), + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x8C080301, // 0000 GETMET R2 R1 K1 + 0x88100102, // 0001 GETMBR R4 R0 K2 + 0x7C080400, // 0002 CALL R2 2 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x780A0005, // 0005 JMPF R2 #000C + 0xB80A0800, // 0006 GETNGBL R2 K4 + 0x88080505, // 0007 GETMBR R2 R2 K5 + 0x8C080506, // 0008 GETMET R2 R2 K6 + 0x88100100, // 0009 GETMBR R4 R0 K0 + 0x7C080400, // 000A CALL R2 2 + 0x90020602, // 000B SETMBR R0 K3 R2 + 0x88080108, // 000C GETMBR R2 R0 K8 + 0x90020E02, // 000D SETMBR R0 K7 R2 + 0x8808010A, // 000E GETMBR R2 R0 K10 + 0x90021202, // 000F SETMBR R0 K9 R2 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: value_changed +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_value_changed, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(value_changed), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: web_values_prefix ********************************************************************/ @@ -57,98 +133,6 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_web_values_prefix, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_parse_configuration, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_filter), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(Rule_Matcher), - /* K6 */ be_nested_str_weak(parse), - }), - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C080301, // 0000 GETMET R2 R1 K1 - 0x88100102, // 0001 GETMBR R4 R0 K2 - 0x7C080400, // 0002 CALL R2 2 - 0x90020002, // 0003 SETMBR R0 K0 R2 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x780A0005, // 0005 JMPF R2 #000C - 0xB80A0800, // 0006 GETNGBL R2 K4 - 0x88080505, // 0007 GETMBR R2 R2 K5 - 0x8C080506, // 0008 GETMET R2 R2 K6 - 0x88100100, // 0009 GETMBR R4 R0 K0 - 0x7C080400, // 000A CALL R2 2 - 0x90020602, // 000B SETMBR R0 K3 R2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: value_changed -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_value_changed, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(value_changed), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: pre_value -********************************************************************/ -be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(pre_value), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040200, // 0000 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_update ********************************************************************/ @@ -162,40 +146,57 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_parse_update, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota_sensor_matcher), - /* K1 */ be_nested_str_weak(pre_value), - /* K2 */ be_nested_str_weak(match), - /* K3 */ be_nested_str_weak(shadow_value), - /* K4 */ be_nested_str_weak(value_changed), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(contains), + /* K1 */ be_nested_str_weak(TempUnit), + /* K2 */ be_nested_str_weak(temp_unit), + /* K3 */ be_nested_str_weak(PressureUnit), + /* K4 */ be_nested_str_weak(pressure_unit), + /* K5 */ be_nested_str_weak(tasmota_sensor_matcher), + /* K6 */ be_nested_str_weak(pre_value), + /* K7 */ be_nested_str_weak(match), + /* K8 */ be_nested_str_weak(shadow_value), + /* K9 */ be_nested_str_weak(value_changed), }), be_str_weak(parse_update), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ + ( &(const binstruction[36]) { /* code */ 0x540E0007, // 0000 LDINT R3 8 0x1C0C0403, // 0001 EQ R3 R2 R3 - 0x780E0013, // 0002 JMPF R3 #0017 - 0x880C0100, // 0003 GETMBR R3 R0 K0 - 0x780E0011, // 0004 JMPF R3 #0017 - 0x8C0C0101, // 0005 GETMET R3 R0 K1 - 0x6014000A, // 0006 GETGBL R5 G10 - 0x88180100, // 0007 GETMBR R6 R0 K0 - 0x8C180D02, // 0008 GETMET R6 R6 K2 - 0x5C200200, // 0009 MOVE R8 R1 - 0x7C180400, // 000A CALL R6 2 - 0x7C140200, // 000B CALL R5 1 - 0x7C0C0400, // 000C CALL R3 2 - 0x4C100000, // 000D LDNIL R4 - 0x20100604, // 000E NE R4 R3 R4 - 0x78120006, // 000F JMPF R4 #0017 - 0x88100103, // 0010 GETMBR R4 R0 K3 - 0x20100604, // 0011 NE R4 R3 R4 - 0x78120002, // 0012 JMPF R4 #0016 - 0x8C100104, // 0013 GETMET R4 R0 K4 - 0x5C180600, // 0014 MOVE R6 R3 - 0x7C100400, // 0015 CALL R4 2 - 0x90020603, // 0016 SETMBR R0 K3 R3 - 0x80000000, // 0017 RET 0 + 0x780E001F, // 0002 JMPF R3 #0023 + 0x8C0C0300, // 0003 GETMET R3 R1 K0 + 0x58140001, // 0004 LDCONST R5 K1 + 0x7C0C0400, // 0005 CALL R3 2 + 0x780E0001, // 0006 JMPF R3 #0009 + 0x940C0301, // 0007 GETIDX R3 R1 K1 + 0x90020403, // 0008 SETMBR R0 K2 R3 + 0x8C0C0300, // 0009 GETMET R3 R1 K0 + 0x58140003, // 000A LDCONST R5 K3 + 0x7C0C0400, // 000B CALL R3 2 + 0x780E0001, // 000C JMPF R3 #000F + 0x940C0303, // 000D GETIDX R3 R1 K3 + 0x90020803, // 000E SETMBR R0 K4 R3 + 0x880C0105, // 000F GETMBR R3 R0 K5 + 0x780E0011, // 0010 JMPF R3 #0023 + 0x8C0C0106, // 0011 GETMET R3 R0 K6 + 0x6014000A, // 0012 GETGBL R5 G10 + 0x88180105, // 0013 GETMBR R6 R0 K5 + 0x8C180D07, // 0014 GETMET R6 R6 K7 + 0x5C200200, // 0015 MOVE R8 R1 + 0x7C180400, // 0016 CALL R6 2 + 0x7C140200, // 0017 CALL R5 1 + 0x7C0C0400, // 0018 CALL R3 2 + 0x4C100000, // 0019 LDNIL R4 + 0x20100604, // 001A NE R4 R3 R4 + 0x78120006, // 001B JMPF R4 #0023 + 0x88100108, // 001C GETMBR R4 R0 K8 + 0x20100604, // 001D NE R4 R3 R4 + 0x78120002, // 001E JMPF R4 #0022 + 0x8C100109, // 001F GETMET R4 R0 K9 + 0x5C180600, // 0020 MOVE R6 R3 + 0x7C100400, // 0021 CALL R4 2 + 0x90021003, // 0022 SETMBR R0 K8 R3 + 0x80000000, // 0023 RET 0 }) ) ); @@ -247,30 +248,61 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_filter_name_html, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: pre_value +********************************************************************/ +be_local_closure(Matter_Plugin_Bridge_Sensor_pre_value, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(pre_value), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040200, // 0000 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Plugin_Bridge_Sensor ********************************************************************/ extern const bclass be_class_Matter_Plugin_Bridge_HTTP; be_local_class(Matter_Plugin_Bridge_Sensor, - 3, + 5, &be_class_Matter_Plugin_Bridge_HTTP, - be_nested_map(15, + be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(ARG_HINT, 7), be_nested_str_weak(Enter_X20Filter_X20pattern) }, - { be_const_key_weak(tasmota_sensor_filter, 10), be_const_var(0) }, - { be_const_key_weak(web_values_prefix, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_web_values_prefix_closure) }, + { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Filter_X20pattern) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, - { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_configuration_closure) }, - { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(pre_value, 10), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, { be_const_key_weak(ARG_HTTP, -1), be_nested_str_weak(url) }, + { be_const_key_weak(pressure_unit, -1), be_const_var(4) }, + { be_const_key_weak(tasmota_sensor_matcher, -1), be_const_var(1) }, { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, - { be_const_key_weak(UPDATE_CMD, 8), be_nested_str_weak(Status_X208) }, - { be_const_key_weak(parse_update, 12), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, - { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, + { be_const_key_weak(PRESSURE_MMHG, -1), be_nested_str_weak(mmHg) }, { be_const_key_weak(value_changed, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_value_changed_closure) }, - { be_const_key_weak(PROBE_TIMEOUT, -1), be_const_int(1700) }, + { be_const_key_weak(parse_update, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_update_closure) }, + { be_const_key_weak(TEMP_C, -1), be_nested_str_weak(C) }, + { be_const_key_weak(temp_unit, 4), be_const_var(3) }, + { be_const_key_weak(PRESSURE_INHG, -1), be_nested_str_weak(inHg) }, + { be_const_key_weak(PRESSURE_HPA, 18), be_nested_str_weak(hPa) }, + { be_const_key_weak(PROBE_TIMEOUT, 16), be_const_int(1700) }, + { be_const_key_weak(web_values_prefix, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_web_values_prefix_closure) }, + { be_const_key_weak(UPDATE_CMD, 13), be_nested_str_weak(Status_X208) }, + { be_const_key_weak(TEMP_F, -1), be_nested_str_weak(F) }, { be_const_key_weak(filter_name_html, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_filter_name_html_closure) }, + { be_const_key_weak(UPDATE_TIME, 3), be_const_int(5000) }, + { be_const_key_weak(parse_configuration, 2), be_const_closure(Matter_Plugin_Bridge_Sensor_parse_configuration_closure) }, })), be_str_weak(Matter_Plugin_Bridge_Sensor) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h index e93c299dd..c6bd8b6ff 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -18,21 +18,33 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_pre_value, /* name */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(temp_unit), + /* K1 */ be_nested_str_weak(TEMP_F), + /* K2 */ be_const_real_hex(0x3FE66666), + }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x20080202, // 0001 NE R2 R1 R2 - 0x780A0004, // 0002 JMPF R2 #0008 - 0x60080009, // 0003 GETGBL R2 G9 - 0x540E0063, // 0004 LDINT R3 100 - 0x080C0203, // 0005 MUL R3 R1 R3 - 0x7C080200, // 0006 CALL R2 1 - 0x70020000, // 0007 JMP #0009 + ( &(const binstruction[18]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x1C080403, // 0002 EQ R2 R2 R3 + 0x780A0003, // 0003 JMPF R2 #0008 + 0x540A001F, // 0004 LDINT R2 32 + 0x04080202, // 0005 SUB R2 R1 R2 + 0x0C080502, // 0006 DIV R2 R2 K2 + 0x5C040400, // 0007 MOVE R1 R2 0x4C080000, // 0008 LDNIL R2 - 0x80040400, // 0009 RET 1 R2 + 0x20080202, // 0009 NE R2 R1 R2 + 0x780A0004, // 000A JMPF R2 #0010 + 0x60080009, // 000B GETGBL R2 G9 + 0x540E0063, // 000C LDINT R3 100 + 0x080C0203, // 000D MUL R3 R1 R3 + 0x7C080200, // 000E CALL R2 1 + 0x70020000, // 000F JMP #0011 + 0x4C080000, // 0010 LDNIL R2 + 0x80040400, // 0011 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index 3ad3b033c..a1deb8b75 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -116,28 +116,43 @@ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Temp_pre_value, /* name */ be_nested_proto( - 4, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(get_option), + /* K2 */ be_const_int(1), + /* K3 */ be_const_real_hex(0x3FE66666), + }), be_str_weak(pre_value), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x20080202, // 0001 NE R2 R1 R2 - 0x780A0004, // 0002 JMPF R2 #0008 - 0x60080009, // 0003 GETGBL R2 G9 - 0x540E0063, // 0004 LDINT R3 100 - 0x080C0203, // 0005 MUL R3 R1 R3 - 0x7C080200, // 0006 CALL R2 1 - 0x70020000, // 0007 JMP #0009 - 0x4C080000, // 0008 LDNIL R2 - 0x80040400, // 0009 RET 1 R2 + ( &(const binstruction[20]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x54120007, // 0002 LDINT R4 8 + 0x7C080400, // 0003 CALL R2 2 + 0x1C080502, // 0004 EQ R2 R2 K2 + 0x780A0003, // 0005 JMPF R2 #000A + 0x540A001F, // 0006 LDINT R2 32 + 0x04080202, // 0007 SUB R2 R1 R2 + 0x0C080503, // 0008 DIV R2 R2 K3 + 0x5C040400, // 0009 MOVE R1 R2 + 0x4C080000, // 000A LDNIL R2 + 0x20080202, // 000B NE R2 R1 R2 + 0x780A0004, // 000C JMPF R2 #0012 + 0x60080009, // 000D GETGBL R2 G9 + 0x540E0063, // 000E LDINT R3 100 + 0x080C0203, // 000F MUL R3 R1 R3 + 0x7C080200, // 0010 CALL R2 1 + 0x70020000, // 0011 JMP #0013 + 0x4C080000, // 0012 LDNIL R2 + 0x80040400, // 0013 RET 1 R2 }) ) ); From fb0c14e9ec372eb4f64aab926029994865eac605 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jun 2023 10:48:08 +0200 Subject: [PATCH 009/150] Update RELEASENOTES.md --- RELEASENOTES.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 636e6b47b..de625b717 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -114,7 +114,10 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Added ### Breaking Changed +- Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) ### Changed +- Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) ### Fixed +- Berry various fixes for Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) From a542122eb17ab25aea599b3c41224bc14bbd2ec6 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jun 2023 10:52:45 +0200 Subject: [PATCH 010/150] Update CHANGELOG.md --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c052e125..b703c7412 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,13 @@ All notable changes to this project will be documented in this file. ### Added ### Breaking Changed -- Berry `bool( [] )` and `bool( {} )` now evaluate as `false` +- Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) ### Changed -- Matter support for temperature in Fahrenheit (`SetOption8 1`) +- Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) ### Fixed -- Berry various fixes for Walrus Operator +- Berry various fixes for Walrus Operator (#18982) ### Removed From 504b51a9b4d74a8006bc6da2950770f5647868ee Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 28 Jun 2023 11:53:23 +0200 Subject: [PATCH 011/150] Add command ``Delay -1`` Add command ``Delay -1`` to wait until next second (#18984) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_support/support_command.ino | 12 +++++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b703c7412..589a19636 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.1] ### Added +- Command ``Delay -1`` to wait until next second (#18984) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index de625b717..e3395e77e 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,6 +112,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v13.0.0.1 ### Added +- Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index ca205150d..c775b8aab 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -651,9 +651,15 @@ void CmndJson(void) { } } -void CmndDelay(void) -{ - if ((XdrvMailbox.payload >= (MIN_BACKLOG_DELAY / 100)) && (XdrvMailbox.payload <= 3600)) { +void CmndDelay(void) { + // Delay -1 - Wait until next second + // Delay 1 - Wait default time (200ms) + // Delay 2 - Wait 2 x 100ms + // Delay 10 - Wait 10 x 100ms + if (XdrvMailbox.payload == -1) { + TasmotaGlobal.backlog_timer = millis() + (1000 - RtcMillis()); // Next second (#18984) + } + else if ((XdrvMailbox.payload >= (MIN_BACKLOG_DELAY / 100)) && (XdrvMailbox.payload <= 3600)) { TasmotaGlobal.backlog_timer = millis() + (100 * XdrvMailbox.payload); } uint32_t bl_delay = 0; From 952811b4eba64770aca3e6b935b92cd690ddd1ad Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 28 Jun 2023 14:49:47 +0200 Subject: [PATCH 012/150] Matter add option to disable bridge mode (#18992) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 5 +- .../src/embedded/Matter_Plugin_Device.be | 2 +- .../berry_matter/src/embedded/Matter_UI.be | 3 + .../src/solidify/solidified_Matter_Device.h | 8164 +++++++++-------- .../solidified_Matter_Plugin_Device.h | 315 +- .../src/solidify/solidified_Matter_UI.h | 1400 +-- 7 files changed, 4971 insertions(+), 4919 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 589a19636..d21afa646 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.1] ### Added - Command ``Delay -1`` to wait until next second (#18984) +- Matter add option to disable bridge mode ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index dae8892dc..4cdf5aa87 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -63,6 +63,7 @@ class Matter_Device var root_discriminator # as `int` var root_passcode # as `int` var ipv4only # advertize only IPv4 addresses (no IPv6) + var disable_bridge_mode # default is bridge mode, this flag disables this mode for some non-compliant controllers var next_ep # next endpoint to be allocated for bridge, start at 1 # context for PBKDF var root_iterations # PBKDF number of iterations @@ -92,6 +93,7 @@ class Matter_Device self.next_ep = 1 # start at endpoint 1 for dynamically allocated endpoints self.root_salt = crypto.random(16) self.ipv4only = false + self.disable_bridge_mode = false self.load_param() self.sessions = matter.Session_Store(self) @@ -628,7 +630,7 @@ class Matter_Device import json self.update_remotes_info() # update self.plugins_config_remotes - var j = format('{"distinguish":%i,"passcode":%i,"ipv4only":%s,"nextep":%i', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false', self.next_ep) + var j = format('{"distinguish":%i,"passcode":%i,"ipv4only":%s,"disable_bridge_mode":%s,"nextep":%i', self.root_discriminator, self.root_passcode, self.ipv4only ? 'true':'false', self.disable_bridge_mode ? 'true':'false', self.next_ep) if self.plugins_persist j += ',"config":' j += json.dump(self.plugins_config) @@ -693,6 +695,7 @@ class Matter_Device self.root_discriminator = j.find("distinguish", self.root_discriminator) self.root_passcode = j.find("passcode", self.root_passcode) self.ipv4only = bool(j.find("ipv4only", false)) + self.disable_bridge_mode = bool(j.find("disable_bridge_mode", false)) self.next_ep = j.find("nextep", self.next_ep) self.plugins_config = j.find("config") if self.plugins_config != nil diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index ce9ac7551..cdf807d03 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -104,7 +104,7 @@ class Matter_Plugin_Device : Matter_Plugin d1.add_TLV(1, TLV.U2, types[dt]) # Revision end # if fabric is not Alexa - if self.NON_BRIDGE_VENDOR.find(session.get_admin_vendor()) == nil + if (self.NON_BRIDGE_VENDOR.find(session.get_admin_vendor()) == nil) && (!self.device.disable_bridge_mode) var d1 = dtl.add_struct() d1.add_TLV(0, TLV.U2, 0x0013) # DeviceType d1.add_TLV(1, TLV.U2, 1) # Revision diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index 5f808265d..b9d160a8c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -197,6 +197,8 @@ class Matter_UI webserver.content_send(f"") var ipv4only_checked = self.device.ipv4only ? " checked" : "" webserver.content_send(f"

IPv4 only

") + var disable_bridge_mode_checked = self.device.disable_bridge_mode ? " checked" : "" + webserver.content_send(f"

Disable bridge mode (not recommended)

") webserver.content_send("

" "

") @@ -755,6 +757,7 @@ class Matter_UI self.device.root_discriminator = int(webserver.arg("discriminator")) end self.device.ipv4only = webserver.arg("ipv4") == 'on' + self.device.disable_bridge_mode = webserver.arg("nobridge") == 'on' self.device.save_param() #- and force restart -# diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 490852c6e..ce27f0197 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,86 +7,36 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: msg_received +** Solidified function: register_plugin_class ********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device_register_plugin_class, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 7, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), }), - be_str_weak(msg_received), + be_str_weak(register_plugin_class), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: conf_to_log -********************************************************************/ -be_local_closure(Matter_Device_conf_to_log, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(k2l), - /* K3 */ be_nested_str_weak(type), - /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(conf_to_log), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x5C180000, // 0004 MOVE R6 R0 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA802000B, // 0007 EXBLK 0 #0014 - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x1C140903, // 000A EQ R5 R4 K3 - 0x78160000, // 000B JMPF R5 #000D - 0x7001FFFA, // 000C JMP #0008 - 0x60140018, // 000D GETGBL R5 G24 - 0x58180004, // 000E LDCONST R6 K4 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x94200004, // 0010 GETIDX R8 R0 R4 - 0x7C140600, // 0011 CALL R5 3 - 0x00080405, // 0012 ADD R2 R2 R5 - 0x7001FFF3, // 0013 JMP #0008 - 0x580C0005, // 0014 LDCONST R3 K5 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x80040400, // 0017 RET 1 R2 + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 }) ) ); @@ -125,153 +75,11 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /******************************************************************** -** Solidified function: register_native_classes +** Solidified function: is_commissioning_open ********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(register_native_classes), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x80000000, // 0020 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(add), - /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K3 */ be_nested_str_weak(derive), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(root_w0), - /* K6 */ be_nested_str_weak(EC_P256), - /* K7 */ be_nested_str_weak(mod), - /* K8 */ be_nested_str_weak(root_L), - /* K9 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140015, // 0001 GETGBL R5 G21 - 0x7C140000, // 0002 CALL R5 0 - 0x8C140B01, // 0003 GETMET R5 R5 K1 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x54220003, // 0005 LDINT R8 4 - 0x7C140600, // 0006 CALL R5 3 - 0x8C180902, // 0007 GETMET R6 R4 K2 - 0x7C180200, // 0008 CALL R6 1 - 0x8C180D03, // 0009 GETMET R6 R6 K3 - 0x5C200A00, // 000A MOVE R8 R5 - 0x5C240600, // 000B MOVE R9 R3 - 0x5C280400, // 000C MOVE R10 R2 - 0x542E004F, // 000D LDINT R11 80 - 0x7C180A00, // 000E CALL R6 5 - 0x541E0026, // 000F LDINT R7 39 - 0x401E0807, // 0010 CONNECT R7 K4 R7 - 0x941C0C07, // 0011 GETIDX R7 R6 R7 - 0x54220027, // 0012 LDINT R8 40 - 0x5426004E, // 0013 LDINT R9 79 - 0x40201009, // 0014 CONNECT R8 R8 R9 - 0x94200C08, // 0015 GETIDX R8 R6 R8 - 0x8C240906, // 0016 GETMET R9 R4 K6 - 0x7C240200, // 0017 CALL R9 1 - 0x8C241307, // 0018 GETMET R9 R9 K7 - 0x5C2C0E00, // 0019 MOVE R11 R7 - 0x7C240400, // 001A CALL R9 2 - 0x90020A09, // 001B SETMBR R0 K5 R9 - 0x8C240906, // 001C GETMET R9 R4 K6 - 0x7C240200, // 001D CALL R9 1 - 0x8C241307, // 001E GETMET R9 R9 K7 - 0x5C2C1000, // 001F MOVE R11 R8 - 0x7C240400, // 0020 CALL R9 2 - 0x8C280906, // 0021 GETMET R10 R4 K6 - 0x7C280200, // 0022 CALL R10 1 - 0x8C281509, // 0023 GETMET R10 R10 K9 - 0x5C301200, // 0024 MOVE R12 R9 - 0x7C280400, // 0025 CALL R10 2 - 0x9002100A, // 0026 SETMBR R0 K8 R10 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_Device_every_250ms, /* name */ - be_nested_proto( - 4, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -279,32 +87,16 @@ be_local_closure(Matter_Device_every_250ms, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(every_250ms), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_const_int(1), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), }), - be_str_weak(every_250ms), + be_str_weak(is_commissioning_open), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ + ( &(const binstruction[ 4]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x58040002, // 0003 LDCONST R1 K2 - 0x6008000C, // 0004 GETGBL R2 G12 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x7C080200, // 0006 CALL R2 1 - 0x14080202, // 0007 LT R2 R1 R2 - 0x780A0005, // 0008 JMPF R2 #000F - 0x88080103, // 0009 GETMBR R2 R0 K3 - 0x94080401, // 000A GETIDX R2 R2 R1 - 0x8C080501, // 000B GETMET R2 R2 K1 - 0x7C080200, // 000C CALL R2 1 - 0x00040304, // 000D ADD R1 R1 K4 - 0x7001FFF4, // 000E JMP #0004 - 0x80000000, // 000F RET 0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -437,6 +229,137 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Device_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(every_250ms), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_const_int(1), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x58040002, // 0003 LDCONST R1 K2 + 0x6008000C, // 0004 GETGBL R2 G12 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x7C080200, // 0006 CALL R2 1 + 0x14080202, // 0007 LT R2 R1 R2 + 0x780A0005, // 0008 JMPF R2 #000F + 0x88080103, // 0009 GETMBR R2 R0 K3 + 0x94080401, // 000A GETIDX R2 R2 R1 + 0x8C080501, // 000B GETMET R2 R2 K1 + 0x7C080200, // 000C CALL R2 1 + 0x00040304, // 000D ADD R1 R1 K4 + 0x7001FFF4, // 000E JMP #0004 + 0x80000000, // 000F RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Device_invoke_request, /* name */ + be_nested_proto( + 12, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(plugins), + /* K3 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(1), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(matter), + /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + }), + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58100000, // 0000 LDCONST R4 K0 + 0x88140701, // 0001 GETMBR R5 R3 K1 + 0x6018000C, // 0002 GETGBL R6 G12 + 0x881C0102, // 0003 GETMBR R7 R0 K2 + 0x7C180200, // 0004 CALL R6 1 + 0x14180806, // 0005 LT R6 R4 R6 + 0x781A000C, // 0006 JMPF R6 #0014 + 0x88180102, // 0007 GETMBR R6 R0 K2 + 0x94180C04, // 0008 GETIDX R6 R6 R4 + 0x881C0D01, // 0009 GETMBR R7 R6 K1 + 0x1C1C0E05, // 000A EQ R7 R7 R5 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0D03, // 000C GETMET R7 R6 K3 + 0x5C240200, // 000D MOVE R9 R1 + 0x5C280400, // 000E MOVE R10 R2 + 0x5C2C0600, // 000F MOVE R11 R3 + 0x7C1C0800, // 0010 CALL R7 4 + 0x80040E00, // 0011 RET 1 R7 + 0x00100904, // 0012 ADD R4 R4 K4 + 0x7001FFED, // 0013 JMP #0002 + 0xB81A0C00, // 0014 GETNGBL R6 K6 + 0x88180D07, // 0015 GETMBR R6 R6 K7 + 0x900E0A06, // 0016 SETMBR R3 K5 R6 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: _instantiate_plugins_from_config ********************************************************************/ @@ -643,88 +566,6 @@ be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(PASE_TIMEOUT), - /* K1 */ be_nested_str_weak(compute_manual_pairing_code), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(compute_qrcode_content), - /* K7 */ be_nested_str_weak(publish_result), - /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K9 */ be_nested_str_weak(Matter), - /* K10 */ be_nested_str_weak(_compute_pbkdf), - /* K11 */ be_nested_str_weak(root_passcode), - /* K12 */ be_nested_str_weak(root_iterations), - /* K13 */ be_nested_str_weak(root_salt), - /* K14 */ be_nested_str_weak(start_basic_commissioning), - /* K15 */ be_nested_str_weak(root_discriminator), - /* K16 */ be_nested_str_weak(root_w0), - /* K17 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x8C080101, // 0004 GETMET R2 R0 K1 - 0x7C080200, // 0005 CALL R2 1 - 0xB80E0400, // 0006 GETNGBL R3 K2 - 0x8C0C0703, // 0007 GETMET R3 R3 K3 - 0x60140018, // 0008 GETGBL R5 G24 - 0x58180004, // 0009 LDCONST R6 K4 - 0x5C1C0400, // 000A MOVE R7 R2 - 0x7C140400, // 000B CALL R5 2 - 0x58180005, // 000C LDCONST R6 K5 - 0x7C0C0600, // 000D CALL R3 3 - 0x8C0C0106, // 000E GETMET R3 R0 K6 - 0x7C0C0200, // 000F CALL R3 1 - 0xB8120400, // 0010 GETNGBL R4 K2 - 0x8C100907, // 0011 GETMET R4 R4 K7 - 0x60180018, // 0012 GETGBL R6 G24 - 0x581C0008, // 0013 LDCONST R7 K8 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x7C180600, // 0016 CALL R6 3 - 0x581C0009, // 0017 LDCONST R7 K9 - 0x7C100600, // 0018 CALL R4 3 - 0x8C10010A, // 0019 GETMET R4 R0 K10 - 0x8818010B, // 001A GETMBR R6 R0 K11 - 0x881C010C, // 001B GETMBR R7 R0 K12 - 0x8820010D, // 001C GETMBR R8 R0 K13 - 0x7C100800, // 001D CALL R4 4 - 0x8C10010E, // 001E GETMET R4 R0 K14 - 0x5C180200, // 001F MOVE R6 R1 - 0x881C010C, // 0020 GETMBR R7 R0 K12 - 0x8820010F, // 0021 GETMBR R8 R0 K15 - 0x8824010D, // 0022 GETMBR R9 R0 K13 - 0x88280110, // 0023 GETMBR R10 R0 K16 - 0x882C0111, // 0024 GETMBR R11 R0 K17 - 0x4C300000, // 0025 LDNIL R12 - 0x7C101000, // 0026 CALL R4 8 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: compute_qrcode_content ********************************************************************/ @@ -802,11 +643,11 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ /******************************************************************** -** Solidified function: bridge_remove_endpoint +** Solidified function: find_plugin_by_endpoint ********************************************************************/ -be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ +be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ be_nested_proto( - 11, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -814,89 +655,68 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(plugins_config), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), - /* K6 */ be_const_int(3), - /* K7 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(remove), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(save_param), - /* K12 */ be_nested_str_weak(signal_endpoints_changed), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(plugins), - /* K15 */ be_nested_str_weak(get_endpoint), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(clean_remotes), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_nested_str_weak(get_endpoint), + /* K3 */ be_const_int(1), }), - be_str_weak(bridge_remove_endpoint), + be_str_weak(find_plugin_by_endpoint), &be_const_str_solidified, - ( &(const binstruction[60]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x600C0008, // 0001 GETGBL R3 G8 - 0x5C100200, // 0002 MOVE R4 R1 + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C000C, // 0001 GETGBL R3 G12 + 0x88100101, // 0002 GETMBR R4 R0 K1 0x7C0C0200, // 0003 CALL R3 1 - 0x4C100000, // 0004 LDNIL R4 - 0x4C140000, // 0005 LDNIL R5 - 0x88180101, // 0006 GETMBR R6 R0 K1 - 0x8C180D02, // 0007 GETMET R6 R6 K2 - 0x5C200600, // 0008 MOVE R8 R3 - 0x7C180400, // 0009 CALL R6 2 - 0x741A0005, // 000A JMPT R6 #0011 - 0xB81A0600, // 000B GETNGBL R6 K3 - 0x8C180D04, // 000C GETMET R6 R6 K4 - 0x00220A03, // 000D ADD R8 K5 R3 - 0x58240006, // 000E LDCONST R9 K6 - 0x7C180600, // 000F CALL R6 3 - 0x80000C00, // 0010 RET 0 - 0xB81A0600, // 0011 GETNGBL R6 K3 - 0x8C180D04, // 0012 GETMET R6 R6 K4 - 0x60200018, // 0013 GETGBL R8 G24 - 0x58240007, // 0014 LDCONST R9 K7 - 0x5C280200, // 0015 MOVE R10 R1 - 0x7C200400, // 0016 CALL R8 2 - 0x58240008, // 0017 LDCONST R9 K8 - 0x7C180600, // 0018 CALL R6 3 - 0x88180101, // 0019 GETMBR R6 R0 K1 - 0x8C180D09, // 001A GETMET R6 R6 K9 - 0x5C200600, // 001B MOVE R8 R3 - 0x7C180400, // 001C CALL R6 2 - 0x50180200, // 001D LDBOOL R6 1 0 - 0x90021406, // 001E SETMBR R0 K10 R6 - 0x8C18010B, // 001F GETMET R6 R0 K11 - 0x7C180200, // 0020 CALL R6 1 - 0x8C18010C, // 0021 GETMET R6 R0 K12 - 0x7C180200, // 0022 CALL R6 1 - 0x5818000D, // 0023 LDCONST R6 K13 - 0x601C000C, // 0024 GETGBL R7 G12 - 0x8820010E, // 0025 GETMBR R8 R0 K14 - 0x7C1C0200, // 0026 CALL R7 1 - 0x141C0C07, // 0027 LT R7 R6 R7 - 0x781E000F, // 0028 JMPF R7 #0039 - 0x881C010E, // 0029 GETMBR R7 R0 K14 - 0x941C0E06, // 002A GETIDX R7 R7 R6 - 0x8C1C0F0F, // 002B GETMET R7 R7 K15 - 0x7C1C0200, // 002C CALL R7 1 - 0x1C1C0207, // 002D EQ R7 R1 R7 - 0x781E0007, // 002E JMPF R7 #0037 - 0x881C010E, // 002F GETMBR R7 R0 K14 - 0x8C1C0F09, // 0030 GETMET R7 R7 K9 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C010C, // 0033 GETMET R7 R0 K12 - 0x7C1C0200, // 0034 CALL R7 1 - 0x70020002, // 0035 JMP #0039 - 0x70020000, // 0036 JMP #0038 - 0x00180D10, // 0037 ADD R6 R6 K16 - 0x7001FFEA, // 0038 JMP #0024 - 0x8C1C0111, // 0039 GETMET R7 R0 K17 - 0x7C1C0200, // 003A CALL R7 1 - 0x80000000, // 003B RET 0 + 0x140C0403, // 0004 LT R3 R2 R3 + 0x780E0008, // 0005 JMPF R3 #000F + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0602, // 0007 GETIDX R3 R3 R2 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x7C100200, // 0009 CALL R4 1 + 0x1C100801, // 000A EQ R4 R4 R1 + 0x78120000, // 000B JMPF R4 #000D + 0x80040600, // 000C RET 1 R3 + 0x00080503, // 000D ADD R2 R2 K3 + 0x7001FFF1, // 000E JMP #0001 + 0x4C0C0000, // 000F LDNIL R3 + 0x80040600, // 0010 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -985,1583 +805,6 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: mdns_announce_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[41]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(VP), - /* K3 */ be_nested_str_weak(vendorid), - /* K4 */ be_nested_str_weak(_X2B), - /* K5 */ be_nested_str_weak(productid), - /* K6 */ be_nested_str_weak(D), - /* K7 */ be_nested_str_weak(commissioning_discriminator), - /* K8 */ be_nested_str_weak(CM), - /* K9 */ be_const_int(1), - /* K10 */ be_nested_str_weak(T), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(SII), - /* K13 */ be_nested_str_weak(SAI), - /* K14 */ be_nested_str_weak(commissioning_instance_wifi), - /* K15 */ be_nested_str_weak(random), - /* K16 */ be_nested_str_weak(tohex), - /* K17 */ be_nested_str_weak(commissioning_instance_eth), - /* K18 */ be_nested_str_weak(hostname_eth), - /* K19 */ be_nested_str_weak(add_service), - /* K20 */ be_nested_str_weak(_matterc), - /* K21 */ be_nested_str_weak(_udp), - /* K22 */ be_nested_str_weak(mdns_pase_eth), - /* K23 */ be_nested_str_weak(tasmota), - /* K24 */ be_nested_str_weak(log), - /* K25 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K26 */ be_nested_str_weak(eth), - /* K27 */ be_const_int(2), - /* K28 */ be_nested_str_weak(_L), - /* K29 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K30 */ be_const_int(3), - /* K31 */ be_nested_str_weak(add_subtype), - /* K32 */ be_nested_str_weak(_S), - /* K33 */ be_nested_str_weak(_V), - /* K34 */ be_nested_str_weak(_CM1), - /* K35 */ be_nested_str_weak(hostname_wifi), - /* K36 */ be_nested_str_weak(mdns_pase_wifi), - /* K37 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K38 */ be_nested_str_weak(wifi), - /* K39 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K40 */ be_nested_str_weak(_X7C), - }), - be_str_weak(mdns_announce_PASE), - &be_const_str_solidified, - ( &(const binstruction[236]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA40A0200, // 0001 IMPORT R2 K1 - 0x600C0013, // 0002 GETGBL R3 G19 - 0x7C0C0000, // 0003 CALL R3 0 - 0x60100008, // 0004 GETGBL R4 G8 - 0x88140103, // 0005 GETMBR R5 R0 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x00100904, // 0007 ADD R4 R4 K4 - 0x60140008, // 0008 GETGBL R5 G8 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x7C140200, // 000A CALL R5 1 - 0x00100805, // 000B ADD R4 R4 R5 - 0x980E0404, // 000C SETIDX R3 K2 R4 - 0x88100107, // 000D GETMBR R4 R0 K7 - 0x980E0C04, // 000E SETIDX R3 K6 R4 - 0x980E1109, // 000F SETIDX R3 K8 K9 - 0x980E150B, // 0010 SETIDX R3 K10 K11 - 0x54121387, // 0011 LDINT R4 5000 - 0x980E1804, // 0012 SETIDX R3 K12 R4 - 0x5412012B, // 0013 LDINT R4 300 - 0x980E1A04, // 0014 SETIDX R3 K13 R4 - 0x8C10050F, // 0015 GETMET R4 R2 K15 - 0x541A0007, // 0016 LDINT R6 8 - 0x7C100400, // 0017 CALL R4 2 - 0x8C100910, // 0018 GETMET R4 R4 K16 - 0x7C100200, // 0019 CALL R4 1 - 0x90021C04, // 001A SETMBR R0 K14 R4 - 0x8C10050F, // 001B GETMET R4 R2 K15 - 0x541A0007, // 001C LDINT R6 8 - 0x7C100400, // 001D CALL R4 2 - 0x8C100910, // 001E GETMET R4 R4 K16 - 0x7C100200, // 001F CALL R4 1 - 0x90022204, // 0020 SETMBR R0 K17 R4 - 0xA80200B7, // 0021 EXBLK 0 #00DA - 0x88100112, // 0022 GETMBR R4 R0 K18 - 0x78120058, // 0023 JMPF R4 #007D - 0x8C100313, // 0024 GETMET R4 R1 K19 - 0x58180014, // 0025 LDCONST R6 K20 - 0x581C0015, // 0026 LDCONST R7 K21 - 0x542215A3, // 0027 LDINT R8 5540 - 0x5C240600, // 0028 MOVE R9 R3 - 0x88280111, // 0029 GETMBR R10 R0 K17 - 0x882C0112, // 002A GETMBR R11 R0 K18 - 0x7C100E00, // 002B CALL R4 7 - 0x50100200, // 002C LDBOOL R4 1 0 - 0x90022C04, // 002D SETMBR R0 K22 R4 - 0xB8122E00, // 002E GETNGBL R4 K23 - 0x8C100918, // 002F GETMET R4 R4 K24 - 0x60180018, // 0030 GETGBL R6 G24 - 0x581C0019, // 0031 LDCONST R7 K25 - 0x5820001A, // 0032 LDCONST R8 K26 - 0x88240111, // 0033 GETMBR R9 R0 K17 - 0x88280112, // 0034 GETMBR R10 R0 K18 - 0x7C180800, // 0035 CALL R6 4 - 0x581C001B, // 0036 LDCONST R7 K27 - 0x7C100600, // 0037 CALL R4 3 - 0x60100008, // 0038 GETGBL R4 G8 - 0x88140107, // 0039 GETMBR R5 R0 K7 - 0x541A0FFE, // 003A LDINT R6 4095 - 0x2C140A06, // 003B AND R5 R5 R6 - 0x7C100200, // 003C CALL R4 1 - 0x00123804, // 003D ADD R4 K28 R4 - 0xB8162E00, // 003E GETNGBL R5 K23 - 0x8C140B18, // 003F GETMET R5 R5 K24 - 0x001E3A04, // 0040 ADD R7 K29 R4 - 0x5820001E, // 0041 LDCONST R8 K30 - 0x7C140600, // 0042 CALL R5 3 - 0x8C14031F, // 0043 GETMET R5 R1 K31 - 0x581C0014, // 0044 LDCONST R7 K20 - 0x58200015, // 0045 LDCONST R8 K21 - 0x88240111, // 0046 GETMBR R9 R0 K17 - 0x88280112, // 0047 GETMBR R10 R0 K18 - 0x5C2C0800, // 0048 MOVE R11 R4 - 0x7C140C00, // 0049 CALL R5 6 - 0x60140008, // 004A GETGBL R5 G8 - 0x88180107, // 004B GETMBR R6 R0 K7 - 0x541E0EFF, // 004C LDINT R7 3840 - 0x2C180C07, // 004D AND R6 R6 R7 - 0x541E0007, // 004E LDINT R7 8 - 0x3C180C07, // 004F SHR R6 R6 R7 - 0x7C140200, // 0050 CALL R5 1 - 0x00164005, // 0051 ADD R5 K32 R5 - 0x5C100A00, // 0052 MOVE R4 R5 - 0xB8162E00, // 0053 GETNGBL R5 K23 - 0x8C140B18, // 0054 GETMET R5 R5 K24 - 0x001E3A04, // 0055 ADD R7 K29 R4 - 0x5820001E, // 0056 LDCONST R8 K30 - 0x7C140600, // 0057 CALL R5 3 - 0x8C14031F, // 0058 GETMET R5 R1 K31 - 0x581C0014, // 0059 LDCONST R7 K20 - 0x58200015, // 005A LDCONST R8 K21 - 0x88240111, // 005B GETMBR R9 R0 K17 - 0x88280112, // 005C GETMBR R10 R0 K18 - 0x5C2C0800, // 005D MOVE R11 R4 - 0x7C140C00, // 005E CALL R5 6 - 0x60140008, // 005F GETGBL R5 G8 - 0x88180103, // 0060 GETMBR R6 R0 K3 - 0x7C140200, // 0061 CALL R5 1 - 0x00164205, // 0062 ADD R5 K33 R5 - 0x5C100A00, // 0063 MOVE R4 R5 - 0xB8162E00, // 0064 GETNGBL R5 K23 - 0x8C140B18, // 0065 GETMET R5 R5 K24 - 0x001E3A04, // 0066 ADD R7 K29 R4 - 0x5820001E, // 0067 LDCONST R8 K30 - 0x7C140600, // 0068 CALL R5 3 - 0x8C14031F, // 0069 GETMET R5 R1 K31 - 0x581C0014, // 006A LDCONST R7 K20 - 0x58200015, // 006B LDCONST R8 K21 - 0x88240111, // 006C GETMBR R9 R0 K17 - 0x88280112, // 006D GETMBR R10 R0 K18 - 0x5C2C0800, // 006E MOVE R11 R4 - 0x7C140C00, // 006F CALL R5 6 - 0x58100022, // 0070 LDCONST R4 K34 - 0xB8162E00, // 0071 GETNGBL R5 K23 - 0x8C140B18, // 0072 GETMET R5 R5 K24 - 0x001E3A04, // 0073 ADD R7 K29 R4 - 0x5820001E, // 0074 LDCONST R8 K30 - 0x7C140600, // 0075 CALL R5 3 - 0x8C14031F, // 0076 GETMET R5 R1 K31 - 0x581C0014, // 0077 LDCONST R7 K20 - 0x58200015, // 0078 LDCONST R8 K21 - 0x88240111, // 0079 GETMBR R9 R0 K17 - 0x88280112, // 007A GETMBR R10 R0 K18 - 0x5C2C0800, // 007B MOVE R11 R4 - 0x7C140C00, // 007C CALL R5 6 - 0x88100123, // 007D GETMBR R4 R0 K35 - 0x78120058, // 007E JMPF R4 #00D8 - 0x8C100313, // 007F GETMET R4 R1 K19 - 0x58180014, // 0080 LDCONST R6 K20 - 0x581C0015, // 0081 LDCONST R7 K21 - 0x542215A3, // 0082 LDINT R8 5540 - 0x5C240600, // 0083 MOVE R9 R3 - 0x8828010E, // 0084 GETMBR R10 R0 K14 - 0x882C0123, // 0085 GETMBR R11 R0 K35 - 0x7C100E00, // 0086 CALL R4 7 - 0x50100200, // 0087 LDBOOL R4 1 0 - 0x90024804, // 0088 SETMBR R0 K36 R4 - 0xB8122E00, // 0089 GETNGBL R4 K23 - 0x8C100918, // 008A GETMET R4 R4 K24 - 0x60180018, // 008B GETGBL R6 G24 - 0x581C0025, // 008C LDCONST R7 K37 - 0x58200026, // 008D LDCONST R8 K38 - 0x8824010E, // 008E GETMBR R9 R0 K14 - 0x88280123, // 008F GETMBR R10 R0 K35 - 0x7C180800, // 0090 CALL R6 4 - 0x581C001E, // 0091 LDCONST R7 K30 - 0x7C100600, // 0092 CALL R4 3 - 0x60100008, // 0093 GETGBL R4 G8 - 0x88140107, // 0094 GETMBR R5 R0 K7 - 0x541A0FFE, // 0095 LDINT R6 4095 - 0x2C140A06, // 0096 AND R5 R5 R6 - 0x7C100200, // 0097 CALL R4 1 - 0x00123804, // 0098 ADD R4 K28 R4 - 0xB8162E00, // 0099 GETNGBL R5 K23 - 0x8C140B18, // 009A GETMET R5 R5 K24 - 0x001E3A04, // 009B ADD R7 K29 R4 - 0x5820001E, // 009C LDCONST R8 K30 - 0x7C140600, // 009D CALL R5 3 - 0x8C14031F, // 009E GETMET R5 R1 K31 - 0x581C0014, // 009F LDCONST R7 K20 - 0x58200015, // 00A0 LDCONST R8 K21 - 0x8824010E, // 00A1 GETMBR R9 R0 K14 - 0x88280123, // 00A2 GETMBR R10 R0 K35 - 0x5C2C0800, // 00A3 MOVE R11 R4 - 0x7C140C00, // 00A4 CALL R5 6 - 0x60140008, // 00A5 GETGBL R5 G8 - 0x88180107, // 00A6 GETMBR R6 R0 K7 - 0x541E0EFF, // 00A7 LDINT R7 3840 - 0x2C180C07, // 00A8 AND R6 R6 R7 - 0x541E0007, // 00A9 LDINT R7 8 - 0x3C180C07, // 00AA SHR R6 R6 R7 - 0x7C140200, // 00AB CALL R5 1 - 0x00164005, // 00AC ADD R5 K32 R5 - 0x5C100A00, // 00AD MOVE R4 R5 - 0xB8162E00, // 00AE GETNGBL R5 K23 - 0x8C140B18, // 00AF GETMET R5 R5 K24 - 0x001E3A04, // 00B0 ADD R7 K29 R4 - 0x5820001E, // 00B1 LDCONST R8 K30 - 0x7C140600, // 00B2 CALL R5 3 - 0x8C14031F, // 00B3 GETMET R5 R1 K31 - 0x581C0014, // 00B4 LDCONST R7 K20 - 0x58200015, // 00B5 LDCONST R8 K21 - 0x8824010E, // 00B6 GETMBR R9 R0 K14 - 0x88280123, // 00B7 GETMBR R10 R0 K35 - 0x5C2C0800, // 00B8 MOVE R11 R4 - 0x7C140C00, // 00B9 CALL R5 6 - 0x60140008, // 00BA GETGBL R5 G8 - 0x88180103, // 00BB GETMBR R6 R0 K3 - 0x7C140200, // 00BC CALL R5 1 - 0x00164205, // 00BD ADD R5 K33 R5 - 0x5C100A00, // 00BE MOVE R4 R5 - 0xB8162E00, // 00BF GETNGBL R5 K23 - 0x8C140B18, // 00C0 GETMET R5 R5 K24 - 0x001E3A04, // 00C1 ADD R7 K29 R4 - 0x5820001E, // 00C2 LDCONST R8 K30 - 0x7C140600, // 00C3 CALL R5 3 - 0x8C14031F, // 00C4 GETMET R5 R1 K31 - 0x581C0014, // 00C5 LDCONST R7 K20 - 0x58200015, // 00C6 LDCONST R8 K21 - 0x8824010E, // 00C7 GETMBR R9 R0 K14 - 0x88280123, // 00C8 GETMBR R10 R0 K35 - 0x5C2C0800, // 00C9 MOVE R11 R4 - 0x7C140C00, // 00CA CALL R5 6 - 0x58100022, // 00CB LDCONST R4 K34 - 0xB8162E00, // 00CC GETNGBL R5 K23 - 0x8C140B18, // 00CD GETMET R5 R5 K24 - 0x001E3A04, // 00CE ADD R7 K29 R4 - 0x5820001E, // 00CF LDCONST R8 K30 - 0x7C140600, // 00D0 CALL R5 3 - 0x8C14031F, // 00D1 GETMET R5 R1 K31 - 0x581C0014, // 00D2 LDCONST R7 K20 - 0x58200015, // 00D3 LDCONST R8 K21 - 0x8824010E, // 00D4 GETMBR R9 R0 K14 - 0x88280123, // 00D5 GETMBR R10 R0 K35 - 0x5C2C0800, // 00D6 MOVE R11 R4 - 0x7C140C00, // 00D7 CALL R5 6 - 0xA8040001, // 00D8 EXBLK 1 1 - 0x70020010, // 00D9 JMP #00EB - 0xAC100002, // 00DA CATCH R4 0 2 - 0x7002000D, // 00DB JMP #00EA - 0xB81A2E00, // 00DC GETNGBL R6 K23 - 0x8C180D18, // 00DD GETMET R6 R6 K24 - 0x60200008, // 00DE GETGBL R8 G8 - 0x5C240800, // 00DF MOVE R9 R4 - 0x7C200200, // 00E0 CALL R8 1 - 0x00224E08, // 00E1 ADD R8 K39 R8 - 0x00201128, // 00E2 ADD R8 R8 K40 - 0x60240008, // 00E3 GETGBL R9 G8 - 0x5C280A00, // 00E4 MOVE R10 R5 - 0x7C240200, // 00E5 CALL R9 1 - 0x00201009, // 00E6 ADD R8 R8 R9 - 0x5824001B, // 00E7 LDCONST R9 K27 - 0x7C180600, // 00E8 CALL R6 3 - 0x70020000, // 00E9 JMP #00EB - 0xB0080000, // 00EA RAISE 2 R0 R0 - 0x80000000, // 00EB RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_http_remote -********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - /* K6 */ be_nested_str_weak(plugins_config_remotes), - /* K7 */ be_nested_str_weak(set_info), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020011, // 0016 JMP #0029 - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180000, // 0019 MOVE R6 R0 - 0x5C1C0200, // 001A MOVE R7 R1 - 0x5C200400, // 001B MOVE R8 R2 - 0x7C100800, // 001C CALL R4 4 - 0x5C0C0800, // 001D MOVE R3 R4 - 0x88100106, // 001E GETMBR R4 R0 K6 - 0x8C100901, // 001F GETMET R4 R4 K1 - 0x5C180200, // 0020 MOVE R6 R1 - 0x7C100400, // 0021 CALL R4 2 - 0x78120003, // 0022 JMPF R4 #0027 - 0x8C100707, // 0023 GETMET R4 R3 K7 - 0x88180106, // 0024 GETMBR R6 R0 K6 - 0x94180C01, // 0025 GETIDX R6 R6 R1 - 0x7C100400, // 0026 CALL R4 2 - 0x88100100, // 0027 GETMBR R4 R0 K0 - 0x98100203, // 0028 SETIDX R4 R1 R3 - 0x80040600, // 0029 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_arg -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(get_device_id), - /* K2 */ be_nested_str_weak(copy), - /* K3 */ be_nested_str_weak(reverse), - /* K4 */ be_nested_str_weak(get_fabric_compressed), - /* K5 */ be_nested_str_weak(tohex), - /* K6 */ be_nested_str_weak(_X2D), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(eth), - /* K9 */ be_nested_str_weak(find), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(remove_service), - /* K15 */ be_nested_str_weak(_matter), - /* K16 */ be_nested_str_weak(_tcp), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_nested_str_weak(wifi), - /* K19 */ be_nested_str_weak(hostname_wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), - /* K22 */ be_const_int(2), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[80]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA802003B, // 0001 EXBLK 0 #003E - 0x8C0C0301, // 0002 GETMET R3 R1 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C100304, // 0008 GETMET R4 R1 K4 - 0x7C100200, // 0009 CALL R4 1 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x7C140200, // 000B CALL R5 1 - 0x00140B06, // 000C ADD R5 R5 K6 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x7C180200, // 000E CALL R6 1 - 0x00140A06, // 000F ADD R5 R5 R6 - 0xB81A0E00, // 0010 GETNGBL R6 K7 - 0x8C180D08, // 0011 GETMET R6 R6 K8 - 0x7C180200, // 0012 CALL R6 1 - 0x8C180D09, // 0013 GETMET R6 R6 K9 - 0x5820000A, // 0014 LDCONST R8 K10 - 0x7C180400, // 0015 CALL R6 2 - 0x781A000E, // 0016 JMPF R6 #0026 - 0xB81A0E00, // 0017 GETNGBL R6 K7 - 0x8C180D0B, // 0018 GETMET R6 R6 K11 - 0x60200018, // 0019 GETGBL R8 G24 - 0x5824000C, // 001A LDCONST R9 K12 - 0x58280008, // 001B LDCONST R10 K8 - 0x5C2C0A00, // 001C MOVE R11 R5 - 0x7C200600, // 001D CALL R8 3 - 0x5824000D, // 001E LDCONST R9 K13 - 0x7C180600, // 001F CALL R6 3 - 0x8C18050E, // 0020 GETMET R6 R2 K14 - 0x5820000F, // 0021 LDCONST R8 K15 - 0x58240010, // 0022 LDCONST R9 K16 - 0x5C280A00, // 0023 MOVE R10 R5 - 0x882C0111, // 0024 GETMBR R11 R0 K17 - 0x7C180A00, // 0025 CALL R6 5 - 0xB81A0E00, // 0026 GETNGBL R6 K7 - 0x8C180D12, // 0027 GETMET R6 R6 K18 - 0x7C180200, // 0028 CALL R6 1 - 0x8C180D09, // 0029 GETMET R6 R6 K9 - 0x5820000A, // 002A LDCONST R8 K10 - 0x7C180400, // 002B CALL R6 2 - 0x781A000E, // 002C JMPF R6 #003C - 0xB81A0E00, // 002D GETNGBL R6 K7 - 0x8C180D0B, // 002E GETMET R6 R6 K11 - 0x60200018, // 002F GETGBL R8 G24 - 0x5824000C, // 0030 LDCONST R9 K12 - 0x58280012, // 0031 LDCONST R10 K18 - 0x5C2C0A00, // 0032 MOVE R11 R5 - 0x7C200600, // 0033 CALL R8 3 - 0x5824000D, // 0034 LDCONST R9 K13 - 0x7C180600, // 0035 CALL R6 3 - 0x8C18050E, // 0036 GETMET R6 R2 K14 - 0x5820000F, // 0037 LDCONST R8 K15 - 0x58240010, // 0038 LDCONST R9 K16 - 0x5C280A00, // 0039 MOVE R10 R5 - 0x882C0113, // 003A GETMBR R11 R0 K19 - 0x7C180A00, // 003B CALL R6 5 - 0xA8040001, // 003C EXBLK 1 1 - 0x70020010, // 003D JMP #004F - 0xAC0C0002, // 003E CATCH R3 0 2 - 0x7002000D, // 003F JMP #004E - 0xB8160E00, // 0040 GETNGBL R5 K7 - 0x8C140B0B, // 0041 GETMET R5 R5 K11 - 0x601C0008, // 0042 GETGBL R7 G8 - 0x5C200600, // 0043 MOVE R8 R3 - 0x7C1C0200, // 0044 CALL R7 1 - 0x001E2807, // 0045 ADD R7 K20 R7 - 0x001C0F15, // 0046 ADD R7 R7 K21 - 0x60200008, // 0047 GETGBL R8 G8 - 0x5C240800, // 0048 MOVE R9 R4 - 0x7C200200, // 0049 CALL R8 1 - 0x001C0E08, // 004A ADD R7 R7 R8 - 0x58200016, // 004B LDCONST R8 K22 - 0x7C140600, // 004C CALL R5 3 - 0x70020000, // 004D JMP #004F - 0xB0080000, // 004E RAISE 2 R0 R0 - 0x80000000, // 004F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[43]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(get_option), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(MATTER_OPTION), - /* K5 */ be_nested_str_weak(UI), - /* K6 */ be_nested_str_weak(started), - /* K7 */ be_nested_str_weak(tick), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(plugins), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(plugins_classes), - /* K12 */ be_nested_str_weak(plugins_config_remotes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(next_ep), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(root_salt), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(ipv4only), - /* K25 */ be_nested_str_weak(load_param), - /* K26 */ be_nested_str_weak(sessions), - /* K27 */ be_nested_str_weak(Session_Store), - /* K28 */ be_nested_str_weak(load_fabrics), - /* K29 */ be_nested_str_weak(message_handler), - /* K30 */ be_nested_str_weak(MessageHandler), - /* K31 */ be_nested_str_weak(ui), - /* K32 */ be_nested_str_weak(wifi), - /* K33 */ be_nested_str_weak(up), - /* K34 */ be_nested_str_weak(eth), - /* K35 */ be_nested_str_weak(start), - /* K36 */ be_nested_str_weak(add_rule), - /* K37 */ be_nested_str_weak(Wifi_X23Connected), - /* K38 */ be_nested_str_weak(matter_start), - /* K39 */ be_nested_str_weak(Eth_X23Connected), - /* K40 */ be_nested_str_weak(_init_basic_commissioning), - /* K41 */ be_nested_str_weak(add_driver), - /* K42 */ be_nested_str_weak(register_commands), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0xB8120600, // 0003 GETNGBL R4 K3 - 0x88100904, // 0004 GETMBR R4 R4 K4 - 0x7C080400, // 0005 CALL R2 2 - 0x740A0004, // 0006 JMPT R2 #000C - 0xB80A0600, // 0007 GETNGBL R2 K3 - 0x8C080505, // 0008 GETMET R2 R2 K5 - 0x5C100000, // 0009 MOVE R4 R0 - 0x7C080400, // 000A CALL R2 2 - 0x80000400, // 000B RET 0 - 0x50080000, // 000C LDBOOL R2 0 0 - 0x90020C02, // 000D SETMBR R0 K6 R2 - 0x90020F08, // 000E SETMBR R0 K7 K8 - 0x60080012, // 000F GETGBL R2 G18 - 0x7C080000, // 0010 CALL R2 0 - 0x90021202, // 0011 SETMBR R0 K9 R2 - 0x50080000, // 0012 LDBOOL R2 0 0 - 0x90021402, // 0013 SETMBR R0 K10 R2 - 0x60080013, // 0014 GETGBL R2 G19 - 0x7C080000, // 0015 CALL R2 0 - 0x90021602, // 0016 SETMBR R0 K11 R2 - 0x60080013, // 0017 GETGBL R2 G19 - 0x7C080000, // 0018 CALL R2 0 - 0x90021802, // 0019 SETMBR R0 K12 R2 - 0x8C08010D, // 001A GETMET R2 R0 K13 - 0x7C080200, // 001B CALL R2 1 - 0x8808010F, // 001C GETMBR R2 R0 K15 - 0x90021C02, // 001D SETMBR R0 K14 R2 - 0x88080111, // 001E GETMBR R2 R0 K17 - 0x90022002, // 001F SETMBR R0 K16 R2 - 0x88080113, // 0020 GETMBR R2 R0 K19 - 0x90022402, // 0021 SETMBR R0 K18 R2 - 0x90022915, // 0022 SETMBR R0 K20 K21 - 0x8C080317, // 0023 GETMET R2 R1 K23 - 0x5412000F, // 0024 LDINT R4 16 - 0x7C080400, // 0025 CALL R2 2 - 0x90022C02, // 0026 SETMBR R0 K22 R2 - 0x50080000, // 0027 LDBOOL R2 0 0 - 0x90023002, // 0028 SETMBR R0 K24 R2 - 0x8C080119, // 0029 GETMET R2 R0 K25 - 0x7C080200, // 002A CALL R2 1 - 0xB80A0600, // 002B GETNGBL R2 K3 - 0x8C08051B, // 002C GETMET R2 R2 K27 - 0x5C100000, // 002D MOVE R4 R0 - 0x7C080400, // 002E CALL R2 2 - 0x90023402, // 002F SETMBR R0 K26 R2 - 0x8808011A, // 0030 GETMBR R2 R0 K26 - 0x8C08051C, // 0031 GETMET R2 R2 K28 - 0x7C080200, // 0032 CALL R2 1 - 0xB80A0600, // 0033 GETNGBL R2 K3 - 0x8C08051E, // 0034 GETMET R2 R2 K30 - 0x5C100000, // 0035 MOVE R4 R0 - 0x7C080400, // 0036 CALL R2 2 - 0x90023A02, // 0037 SETMBR R0 K29 R2 - 0xB80A0600, // 0038 GETNGBL R2 K3 - 0x8C080505, // 0039 GETMET R2 R2 K5 - 0x5C100000, // 003A MOVE R4 R0 - 0x7C080400, // 003B CALL R2 2 - 0x90023E02, // 003C SETMBR R0 K31 R2 - 0xB80A0200, // 003D GETNGBL R2 K1 - 0x8C080520, // 003E GETMET R2 R2 K32 - 0x7C080200, // 003F CALL R2 1 - 0x94080521, // 0040 GETIDX R2 R2 K33 - 0x740A0004, // 0041 JMPT R2 #0047 - 0xB80A0200, // 0042 GETNGBL R2 K1 - 0x8C080522, // 0043 GETMET R2 R2 K34 - 0x7C080200, // 0044 CALL R2 1 - 0x94080521, // 0045 GETIDX R2 R2 K33 - 0x780A0001, // 0046 JMPF R2 #0049 - 0x8C080123, // 0047 GETMET R2 R0 K35 - 0x7C080200, // 0048 CALL R2 1 - 0xB80A0200, // 0049 GETNGBL R2 K1 - 0x8C080520, // 004A GETMET R2 R2 K32 - 0x7C080200, // 004B CALL R2 1 - 0x94080521, // 004C GETIDX R2 R2 K33 - 0x740A0005, // 004D JMPT R2 #0054 - 0xB80A0200, // 004E GETNGBL R2 K1 - 0x8C080524, // 004F GETMET R2 R2 K36 - 0x58100025, // 0050 LDCONST R4 K37 - 0x84140000, // 0051 CLOSURE R5 P0 - 0x58180026, // 0052 LDCONST R6 K38 - 0x7C080800, // 0053 CALL R2 4 - 0xB80A0200, // 0054 GETNGBL R2 K1 - 0x8C080522, // 0055 GETMET R2 R2 K34 - 0x7C080200, // 0056 CALL R2 1 - 0x94080521, // 0057 GETIDX R2 R2 K33 - 0x740A0005, // 0058 JMPT R2 #005F - 0xB80A0200, // 0059 GETNGBL R2 K1 - 0x8C080524, // 005A GETMET R2 R2 K36 - 0x58100027, // 005B LDCONST R4 K39 - 0x84140001, // 005C CLOSURE R5 P1 - 0x58180026, // 005D LDCONST R6 K38 - 0x7C080800, // 005E CALL R2 4 - 0x8C080128, // 005F GETMET R2 R0 K40 - 0x7C080200, // 0060 CALL R2 1 - 0xB80A0200, // 0061 GETNGBL R2 K1 - 0x8C080529, // 0062 GETMET R2 R2 K41 - 0x5C100000, // 0063 MOVE R4 R0 - 0x7C080400, // 0064 CALL R2 2 - 0x8C08012A, // 0065 GETMET R2 R0 K42 - 0x7C080200, // 0066 CALL R2 1 - 0xA0000000, // 0067 CLOSE R0 - 0x80000000, // 0068 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: adjust_next_ep -********************************************************************/ -be_local_closure(Matter_Device_adjust_next_ep, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(next_ep), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(adjust_next_ep), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000A, // 0005 EXBLK 0 #0011 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x600C0009, // 0008 GETGBL R3 G9 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x28100604, // 000C GE R4 R3 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x00100703, // 000E ADD R4 R3 K3 - 0x90020404, // 000F SETMBR R0 K2 R4 - 0x7001FFF4, // 0010 JMP #0006 - 0x58040004, // 0011 LDCONST R1 K4 - 0xAC040200, // 0012 CATCH R1 1 0 - 0xB0080000, // 0013 RAISE 2 R0 R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_sensors_list -********************************************************************/ -be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ - be_nested_proto( - 10, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(k2l), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(Temperature), - /* K3 */ be_nested_str_weak(_X23Temperature), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(type), - /* K6 */ be_nested_str_weak(temperature), - /* K7 */ be_nested_str_weak(filter), - /* K8 */ be_nested_str_weak(stop_iteration), - /* K9 */ be_nested_str_weak(Pressure), - /* K10 */ be_nested_str_weak(_X23Pressure), - /* K11 */ be_nested_str_weak(pressure), - /* K12 */ be_nested_str_weak(Illuminance), - /* K13 */ be_nested_str_weak(_X23Illuminance), - /* K14 */ be_nested_str_weak(illuminance), - /* K15 */ be_nested_str_weak(Humidity), - /* K16 */ be_nested_str_weak(_X23Humidity), - /* K17 */ be_nested_str_weak(humidity), - }), - be_str_weak(autoconf_sensors_list), - &be_const_str_solidified, - ( &(const binstruction[119]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100100, // 0003 GETMET R4 R0 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020013, // 0007 EXBLK 0 #001C - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x94140204, // 000A GETIDX R5 R1 R4 - 0x6018000F, // 000B GETGBL R6 G15 - 0x5C1C0A00, // 000C MOVE R7 R5 - 0x60200013, // 000D GETGBL R8 G19 - 0x7C180400, // 000E CALL R6 2 - 0x781A000A, // 000F JMPF R6 #001B - 0x8C180B01, // 0010 GETMET R6 R5 K1 - 0x58200002, // 0011 LDCONST R8 K2 - 0x7C180400, // 0012 CALL R6 2 - 0x781A0006, // 0013 JMPF R6 #001B - 0x00180903, // 0014 ADD R6 R4 K3 - 0x8C1C0504, // 0015 GETMET R7 R2 K4 - 0x60240013, // 0016 GETGBL R9 G19 - 0x7C240000, // 0017 CALL R9 0 - 0x98260B06, // 0018 SETIDX R9 K5 K6 - 0x98260E06, // 0019 SETIDX R9 K7 R6 - 0x7C1C0400, // 001A CALL R7 2 - 0x7001FFEB, // 001B JMP #0008 - 0x580C0008, // 001C LDCONST R3 K8 - 0xAC0C0200, // 001D CATCH R3 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x600C0010, // 001F GETGBL R3 G16 - 0x8C100100, // 0020 GETMET R4 R0 K0 - 0x5C180200, // 0021 MOVE R6 R1 - 0x7C100400, // 0022 CALL R4 2 - 0x7C0C0200, // 0023 CALL R3 1 - 0xA8020013, // 0024 EXBLK 0 #0039 - 0x5C100600, // 0025 MOVE R4 R3 - 0x7C100000, // 0026 CALL R4 0 - 0x94140204, // 0027 GETIDX R5 R1 R4 - 0x6018000F, // 0028 GETGBL R6 G15 - 0x5C1C0A00, // 0029 MOVE R7 R5 - 0x60200013, // 002A GETGBL R8 G19 - 0x7C180400, // 002B CALL R6 2 - 0x781A000A, // 002C JMPF R6 #0038 - 0x8C180B01, // 002D GETMET R6 R5 K1 - 0x58200009, // 002E LDCONST R8 K9 - 0x7C180400, // 002F CALL R6 2 - 0x781A0006, // 0030 JMPF R6 #0038 - 0x0018090A, // 0031 ADD R6 R4 K10 - 0x8C1C0504, // 0032 GETMET R7 R2 K4 - 0x60240013, // 0033 GETGBL R9 G19 - 0x7C240000, // 0034 CALL R9 0 - 0x98260B0B, // 0035 SETIDX R9 K5 K11 - 0x98260E06, // 0036 SETIDX R9 K7 R6 - 0x7C1C0400, // 0037 CALL R7 2 - 0x7001FFEB, // 0038 JMP #0025 - 0x580C0008, // 0039 LDCONST R3 K8 - 0xAC0C0200, // 003A CATCH R3 1 0 - 0xB0080000, // 003B RAISE 2 R0 R0 - 0x600C0010, // 003C GETGBL R3 G16 - 0x8C100100, // 003D GETMET R4 R0 K0 - 0x5C180200, // 003E MOVE R6 R1 - 0x7C100400, // 003F CALL R4 2 - 0x7C0C0200, // 0040 CALL R3 1 - 0xA8020013, // 0041 EXBLK 0 #0056 - 0x5C100600, // 0042 MOVE R4 R3 - 0x7C100000, // 0043 CALL R4 0 - 0x94140204, // 0044 GETIDX R5 R1 R4 - 0x6018000F, // 0045 GETGBL R6 G15 - 0x5C1C0A00, // 0046 MOVE R7 R5 - 0x60200013, // 0047 GETGBL R8 G19 - 0x7C180400, // 0048 CALL R6 2 - 0x781A000A, // 0049 JMPF R6 #0055 - 0x8C180B01, // 004A GETMET R6 R5 K1 - 0x5820000C, // 004B LDCONST R8 K12 - 0x7C180400, // 004C CALL R6 2 - 0x781A0006, // 004D JMPF R6 #0055 - 0x0018090D, // 004E ADD R6 R4 K13 - 0x8C1C0504, // 004F GETMET R7 R2 K4 - 0x60240013, // 0050 GETGBL R9 G19 - 0x7C240000, // 0051 CALL R9 0 - 0x98260B0E, // 0052 SETIDX R9 K5 K14 - 0x98260E06, // 0053 SETIDX R9 K7 R6 - 0x7C1C0400, // 0054 CALL R7 2 - 0x7001FFEB, // 0055 JMP #0042 - 0x580C0008, // 0056 LDCONST R3 K8 - 0xAC0C0200, // 0057 CATCH R3 1 0 - 0xB0080000, // 0058 RAISE 2 R0 R0 - 0x600C0010, // 0059 GETGBL R3 G16 - 0x8C100100, // 005A GETMET R4 R0 K0 - 0x5C180200, // 005B MOVE R6 R1 - 0x7C100400, // 005C CALL R4 2 - 0x7C0C0200, // 005D CALL R3 1 - 0xA8020013, // 005E EXBLK 0 #0073 - 0x5C100600, // 005F MOVE R4 R3 - 0x7C100000, // 0060 CALL R4 0 - 0x94140204, // 0061 GETIDX R5 R1 R4 - 0x6018000F, // 0062 GETGBL R6 G15 - 0x5C1C0A00, // 0063 MOVE R7 R5 - 0x60200013, // 0064 GETGBL R8 G19 - 0x7C180400, // 0065 CALL R6 2 - 0x781A000A, // 0066 JMPF R6 #0072 - 0x8C180B01, // 0067 GETMET R6 R5 K1 - 0x5820000F, // 0068 LDCONST R8 K15 - 0x7C180400, // 0069 CALL R6 2 - 0x781A0006, // 006A JMPF R6 #0072 - 0x00180910, // 006B ADD R6 R4 K16 - 0x8C1C0504, // 006C GETMET R7 R2 K4 - 0x60240013, // 006D GETGBL R9 G19 - 0x7C240000, // 006E CALL R9 0 - 0x98260B11, // 006F SETIDX R9 K5 K17 - 0x98260E06, // 0070 SETIDX R9 K7 R6 - 0x7C1C0400, // 0071 CALL R7 2 - 0x7001FFEB, // 0072 JMP #005F - 0x580C0008, // 0073 LDCONST R3 K8 - 0xAC0C0200, // 0074 CATCH R3 1 0 - 0xB0080000, // 0075 RAISE 2 R0 R0 - 0x80040400, // 0076 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(stop_basic_commissioning), - /* K3 */ be_nested_str_weak(root_w0), - /* K4 */ be_nested_str_weak(root_L), - /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100102, // 0002 GETMET R4 R0 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x4C100000, // 0004 LDNIL R4 - 0x90020604, // 0005 SETMBR R0 K3 R4 - 0x4C100000, // 0006 LDNIL R4 - 0x90020804, // 0007 SETMBR R0 K4 R4 - 0x8C100105, // 0008 GETMET R4 R0 K5 - 0x5C180200, // 0009 MOVE R6 R1 - 0x7C100400, // 000A CALL R4 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: start_commissioning_complete ********************************************************************/ @@ -2621,854 +864,6 @@ be_local_closure(Matter_Device_start_commissioning_complete, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: remove_fabric -********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ - be_nested_proto( - 10, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K7 */ be_nested_str_weak(get_fabric_id), - /* K8 */ be_nested_str_weak(copy), - /* K9 */ be_nested_str_weak(reverse), - /* K10 */ be_nested_str_weak(tohex), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(message_handler), - /* K13 */ be_nested_str_weak(im), - /* K14 */ be_nested_str_weak(subs_shop), - /* K15 */ be_nested_str_weak(remove_by_fabric), - /* K16 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K17 */ be_nested_str_weak(remove_fabric), - /* K18 */ be_nested_str_weak(stop_iteration), - /* K19 */ be_nested_str_weak(save_fabrics), - }), - be_str_weak(remove_fabric), - &be_const_str_solidified, - ( &(const binstruction[56]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020023, // 000C EXBLK 0 #0031 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A0019, // 0015 JMPF R6 #0030 - 0xB81A0800, // 0016 GETNGBL R6 K4 - 0x8C180D05, // 0017 GETMET R6 R6 K5 - 0x8C200B07, // 0018 GETMET R8 R5 K7 - 0x7C200200, // 0019 CALL R8 1 - 0x8C201108, // 001A GETMET R8 R8 K8 - 0x7C200200, // 001B CALL R8 1 - 0x8C201109, // 001C GETMET R8 R8 K9 - 0x7C200200, // 001D CALL R8 1 - 0x8C20110A, // 001E GETMET R8 R8 K10 - 0x7C200200, // 001F CALL R8 1 - 0x00220C08, // 0020 ADD R8 K6 R8 - 0x5824000B, // 0021 LDCONST R9 K11 - 0x7C180600, // 0022 CALL R6 3 - 0x8818010C, // 0023 GETMBR R6 R0 K12 - 0x88180D0D, // 0024 GETMBR R6 R6 K13 - 0x88180D0E, // 0025 GETMBR R6 R6 K14 - 0x8C180D0F, // 0026 GETMET R6 R6 K15 - 0x5C200A00, // 0027 MOVE R8 R5 - 0x7C180400, // 0028 CALL R6 2 - 0x8C180110, // 0029 GETMET R6 R0 K16 - 0x5C200A00, // 002A MOVE R8 R5 - 0x7C180400, // 002B CALL R6 2 - 0x88180100, // 002C GETMBR R6 R0 K0 - 0x8C180D11, // 002D GETMET R6 R6 K17 - 0x5C200A00, // 002E MOVE R8 R5 - 0x7C180400, // 002F CALL R6 2 - 0x7001FFDB, // 0030 JMP #000D - 0x580C0012, // 0031 LDCONST R3 K18 - 0xAC0C0200, // 0032 CATCH R3 1 0 - 0xB0080000, // 0033 RAISE 2 R0 R0 - 0x880C0100, // 0034 GETMBR R3 R0 K0 - 0x8C0C0713, // 0035 GETMET R3 R3 K19 - 0x7C0C0200, // 0036 CALL R3 1 - 0x80000000, // 0037 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_remotes_info -********************************************************************/ -be_local_closure(Matter_Device_update_remotes_info, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(get_info), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_nested_str_weak(plugins_config_remotes), - }), - be_str_weak(update_remotes_info), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x60040013, // 0000 GETGBL R1 G19 - 0x7C040000, // 0001 CALL R1 0 - 0x88080100, // 0002 GETMBR R2 R0 K0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x20080403, // 0004 NE R2 R2 R3 - 0x780A0018, // 0005 JMPF R2 #001F - 0x60080010, // 0006 GETGBL R2 G16 - 0x880C0100, // 0007 GETMBR R3 R0 K0 - 0x8C0C0701, // 0008 GETMET R3 R3 K1 - 0x7C0C0200, // 0009 CALL R3 1 - 0x7C080200, // 000A CALL R2 1 - 0xA802000F, // 000B EXBLK 0 #001C - 0x5C0C0400, // 000C MOVE R3 R2 - 0x7C0C0000, // 000D CALL R3 0 - 0x88100100, // 000E GETMBR R4 R0 K0 - 0x94100803, // 000F GETIDX R4 R4 R3 - 0x8C100902, // 0010 GETMET R4 R4 K2 - 0x7C100200, // 0011 CALL R4 1 - 0x4C140000, // 0012 LDNIL R5 - 0x20140805, // 0013 NE R5 R4 R5 - 0x78160005, // 0014 JMPF R5 #001B - 0x6014000C, // 0015 GETGBL R5 G12 - 0x5C180800, // 0016 MOVE R6 R4 - 0x7C140200, // 0017 CALL R5 1 - 0x24140B03, // 0018 GT R5 R5 K3 - 0x78160000, // 0019 JMPF R5 #001B - 0x98040604, // 001A SETIDX R1 R3 R4 - 0x7001FFEF, // 001B JMP #000C - 0x58080004, // 001C LDCONST R2 K4 - 0xAC080200, // 001D CATCH R2 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x90020A01, // 001F SETMBR R0 K5 R1 - 0x80040200, // 0020 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(plugins_config), - /* K5 */ be_nested_str_weak(autoconf_device_map), - /* K6 */ be_nested_str_weak(plugins_config_remotes), - /* K7 */ be_nested_str_weak(adjust_next_ep), - /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), - /* K11 */ be_const_int(3), - /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), - /* K13 */ be_nested_str_weak(sessions), - /* K14 */ be_nested_str_weak(count_active_fabrics), - /* K15 */ be_nested_str_weak(save_param), - }), - be_str_weak(autoconf_device), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x880C0101, // 0002 GETMBR R3 R0 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x24080502, // 0004 GT R2 R2 K2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x80000400, // 0006 RET 0 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x740A000F, // 0008 JMPT R2 #0019 - 0x8C080105, // 0009 GETMET R2 R0 K5 - 0x7C080200, // 000A CALL R2 1 - 0x90020802, // 000B SETMBR R0 K4 R2 - 0x60080013, // 000C GETGBL R2 G19 - 0x7C080000, // 000D CALL R2 0 - 0x90020C02, // 000E SETMBR R0 K6 R2 - 0x8C080107, // 000F GETMET R2 R0 K7 - 0x7C080200, // 0010 CALL R2 1 - 0xB80A1000, // 0011 GETNGBL R2 K8 - 0x8C080509, // 0012 GETMET R2 R2 K9 - 0x60100008, // 0013 GETGBL R4 G8 - 0x88140104, // 0014 GETMBR R5 R0 K4 - 0x7C100200, // 0015 CALL R4 1 - 0x00121404, // 0016 ADD R4 K10 R4 - 0x5814000B, // 0017 LDCONST R5 K11 - 0x7C080600, // 0018 CALL R2 3 - 0x8C08010C, // 0019 GETMET R2 R0 K12 - 0x88100104, // 001A GETMBR R4 R0 K4 - 0x7C080400, // 001B CALL R2 2 - 0x88080103, // 001C GETMBR R2 R0 K3 - 0x740A0008, // 001D JMPT R2 #0027 - 0x8808010D, // 001E GETMBR R2 R0 K13 - 0x8C08050E, // 001F GETMET R2 R2 K14 - 0x7C080200, // 0020 CALL R2 1 - 0x24080502, // 0021 GT R2 R2 K2 - 0x780A0003, // 0022 JMPF R2 #0027 - 0x50080200, // 0023 LDBOOL R2 1 0 - 0x90020602, // 0024 SETMBR R0 K3 R2 - 0x8C08010F, // 0025 GETMET R2 R0 K15 - 0x7C080200, // 0026 CALL R2 1 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: clean_remotes -********************************************************************/ -be_local_closure(Matter_Device_clean_remotes, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(http_remotes), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get), - /* K6 */ be_nested_str_weak(http_remote), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(keys), - /* K10 */ be_nested_str_weak(tasmota), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), - /* K13 */ be_nested_str_weak(addr), - /* K14 */ be_const_int(3), - /* K15 */ be_nested_str_weak(close), - /* K16 */ be_nested_str_weak(remove), - }), - be_str_weak(clean_remotes), - &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x780A003D, // 0002 JMPF R2 #0041 - 0x60080013, // 0003 GETGBL R2 G19 - 0x7C080000, // 0004 CALL R2 0 - 0x600C0010, // 0005 GETGBL R3 G16 - 0x88100101, // 0006 GETMBR R4 R0 K1 - 0x7C0C0200, // 0007 CALL R3 1 - 0xA8020003, // 0008 EXBLK 0 #000D - 0x5C100600, // 0009 MOVE R4 R3 - 0x7C100000, // 000A CALL R4 0 - 0x98080902, // 000B SETIDX R2 R4 K2 - 0x7001FFFB, // 000C JMP #0009 - 0x580C0003, // 000D LDCONST R3 K3 - 0xAC0C0200, // 000E CATCH R3 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100104, // 0011 GETMBR R4 R0 K4 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA802000F, // 0013 EXBLK 0 #0024 - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x8C140305, // 0016 GETMET R5 R1 K5 - 0x5C1C0800, // 0017 MOVE R7 R4 - 0x58200006, // 0018 LDCONST R8 K6 - 0x7C140600, // 0019 CALL R5 3 - 0x4C180000, // 001A LDNIL R6 - 0x20180A06, // 001B NE R6 R5 R6 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180507, // 001D GETMET R6 R2 K7 - 0x5C200A00, // 001E MOVE R8 R5 - 0x58240002, // 001F LDCONST R9 K2 - 0x7C180600, // 0020 CALL R6 3 - 0x00180D08, // 0021 ADD R6 R6 K8 - 0x98080A06, // 0022 SETIDX R2 R5 R6 - 0x7001FFEF, // 0023 JMP #0014 - 0x580C0003, // 0024 LDCONST R3 K3 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x600C0010, // 0027 GETGBL R3 G16 - 0x8C100509, // 0028 GETMET R4 R2 K9 - 0x7C100200, // 0029 CALL R4 1 - 0x7C0C0200, // 002A CALL R3 1 - 0xA8020011, // 002B EXBLK 0 #003E - 0x5C100600, // 002C MOVE R4 R3 - 0x7C100000, // 002D CALL R4 0 - 0x94140404, // 002E GETIDX R5 R2 R4 - 0x1C140B02, // 002F EQ R5 R5 K2 - 0x7816000B, // 0030 JMPF R5 #003D - 0xB8161400, // 0031 GETNGBL R5 K10 - 0x8C140B0B, // 0032 GETMET R5 R5 K11 - 0x881C090D, // 0033 GETMBR R7 R4 K13 - 0x001E1807, // 0034 ADD R7 K12 R7 - 0x5820000E, // 0035 LDCONST R8 K14 - 0x7C140600, // 0036 CALL R5 3 - 0x8C14090F, // 0037 GETMET R5 R4 K15 - 0x7C140200, // 0038 CALL R5 1 - 0x88140101, // 0039 GETMBR R5 R0 K1 - 0x8C140B10, // 003A GETMET R5 R5 K16 - 0x5C1C0800, // 003B MOVE R7 R4 - 0x7C140400, // 003C CALL R5 2 - 0x7001FFED, // 003D JMP #002C - 0x580C0003, // 003E LDCONST R3 K3 - 0xAC0C0200, // 003F CATCH R3 1 0 - 0xB0080000, // 0040 RAISE 2 R0 R0 - 0x80000000, // 0041 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(is_root_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(root_discriminator), - /* K1 */ be_nested_str_weak(root_passcode), - /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Verhoeff), - /* K5 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x540A0FFE, // 0001 LDINT R2 4095 - 0x2C040202, // 0002 AND R1 R1 R2 - 0x540A0009, // 0003 LDINT R2 10 - 0x3C040202, // 0004 SHR R1 R1 R2 - 0x88080100, // 0005 GETMBR R2 R0 K0 - 0x540E02FF, // 0006 LDINT R3 768 - 0x2C080403, // 0007 AND R2 R2 R3 - 0x540E0005, // 0008 LDINT R3 6 - 0x38080403, // 0009 SHL R2 R2 R3 - 0x880C0101, // 000A GETMBR R3 R0 K1 - 0x54123FFE, // 000B LDINT R4 16383 - 0x2C0C0604, // 000C AND R3 R3 R4 - 0x30080403, // 000D OR R2 R2 R3 - 0x880C0101, // 000E GETMBR R3 R0 K1 - 0x5412000D, // 000F LDINT R4 14 - 0x3C0C0604, // 0010 SHR R3 R3 R4 - 0x60100018, // 0011 GETGBL R4 G24 - 0x58140002, // 0012 LDCONST R5 K2 - 0x5C180200, // 0013 MOVE R6 R1 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x5C200600, // 0015 MOVE R8 R3 - 0x7C100800, // 0016 CALL R4 4 - 0xB8160600, // 0017 GETNGBL R5 K3 - 0x88140B04, // 0018 GETMBR R5 R5 K4 - 0x8C140B05, // 0019 GETMET R5 R5 K5 - 0x5C1C0800, // 001A MOVE R7 R4 - 0x7C140400, // 001B CALL R5 2 - 0x00100805, // 001C ADD R4 R4 R5 - 0x80040800, // 001D RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: bridge_add_endpoint ********************************************************************/ @@ -3585,11 +980,11 @@ be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: generate_random_passcode ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ be_nested_proto( - 4, /* nstack */ + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3597,35 +992,54 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(every_second), + be_str_weak(generate_random_passcode), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 }) ) ); @@ -3633,45 +1047,12 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: get_plugin_remote_info +** Solidified function: register_http_remote ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ +be_local_closure(Matter_Device_register_http_remote, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config_remotes), - /* K1 */ be_nested_str_weak(find), - }), - be_str_weak(get_plugin_remote_info), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x60140013, // 0003 GETGBL R5 G19 - 0x7C140000, // 0004 CALL R5 0 - 0x7C080600, // 0005 CALL R2 3 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Device_invoke_request, /* name */ - be_nested_proto( - 12, /* nstack */ - 4, /* argc */ + 9, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -3679,42 +1060,60 @@ be_local_closure(Matter_Device_invoke_request, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(plugins), - /* K3 */ be_nested_str_weak(invoke_request), - /* K4 */ be_const_int(1), - /* K5 */ be_nested_str_weak(status), - /* K6 */ be_nested_str_weak(matter), - /* K7 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + /* K6 */ be_nested_str_weak(plugins_config_remotes), + /* K7 */ be_nested_str_weak(set_info), }), - be_str_weak(invoke_request), + be_str_weak(register_http_remote), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0x88140701, // 0001 GETMBR R5 R3 K1 - 0x6018000C, // 0002 GETGBL R6 G12 - 0x881C0102, // 0003 GETMBR R7 R0 K2 - 0x7C180200, // 0004 CALL R6 1 - 0x14180806, // 0005 LT R6 R4 R6 - 0x781A000C, // 0006 JMPF R6 #0014 - 0x88180102, // 0007 GETMBR R6 R0 K2 - 0x94180C04, // 0008 GETIDX R6 R6 R4 - 0x881C0D01, // 0009 GETMBR R7 R6 K1 - 0x1C1C0E05, // 000A EQ R7 R7 R5 - 0x781E0005, // 000B JMPF R7 #0012 - 0x8C1C0D03, // 000C GETMET R7 R6 K3 - 0x5C240200, // 000D MOVE R9 R1 - 0x5C280400, // 000E MOVE R10 R2 - 0x5C2C0600, // 000F MOVE R11 R3 - 0x7C1C0800, // 0010 CALL R7 4 - 0x80040E00, // 0011 RET 1 R7 - 0x00100904, // 0012 ADD R4 R4 K4 - 0x7001FFED, // 0013 JMP #0002 - 0xB81A0C00, // 0014 GETNGBL R6 K6 - 0x88180D07, // 0015 GETMBR R6 R6 K7 - 0x900E0A06, // 0016 SETMBR R3 K5 R6 - 0x80000000, // 0017 RET 0 + ( &(const binstruction[42]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020011, // 0016 JMP #0029 + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180000, // 0019 MOVE R6 R0 + 0x5C1C0200, // 001A MOVE R7 R1 + 0x5C200400, // 001B MOVE R8 R2 + 0x7C100800, // 001C CALL R4 4 + 0x5C0C0800, // 001D MOVE R3 R4 + 0x88100106, // 001E GETMBR R4 R0 K6 + 0x8C100901, // 001F GETMET R4 R4 K1 + 0x5C180200, // 0020 MOVE R6 R1 + 0x7C100400, // 0021 CALL R4 2 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100707, // 0023 GETMET R4 R3 K7 + 0x88180106, // 0024 GETMBR R6 R0 K6 + 0x94180C01, // 0025 GETIDX R6 R6 R1 + 0x7C100400, // 0026 CALL R4 2 + 0x88100100, // 0027 GETMBR R4 R0 K0 + 0x98100203, // 0028 SETIDX R4 R1 R3 + 0x80040600, // 0029 RET 1 R3 }) ) ); @@ -3722,50 +1121,32 @@ be_local_closure(Matter_Device_invoke_request, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: msg_received ********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ +be_local_closure(Matter_Device_msg_received, /* name */ be_nested_proto( - 10, /* nstack */ - 5, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), }), - be_str_weak(attribute_updated), + be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 }) ) ); @@ -3773,11 +1154,11 @@ be_local_closure(Matter_Device_attribute_updated, /* name */ /******************************************************************** -** Solidified function: register_plugin_class +** Solidified function: get_plugin_class_arg ********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ be_nested_proto( - 7, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3786,23 +1167,23 @@ be_local_closure(Matter_Device_register_plugin_class, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(register_plugin_class), + be_str_weak(get_plugin_class_arg), &be_const_str_solidified, ( &(const binstruction[ 9]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -3810,130 +1191,131 @@ be_local_closure(Matter_Device_register_plugin_class, /* name */ /******************************************************************** -** Solidified function: save_param +** Solidified function: start_mdns_announce_hostnames ********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ be_nested_proto( - 10, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(update_remotes_info), - /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K3 */ be_nested_str_weak(root_discriminator), - /* K4 */ be_nested_str_weak(root_passcode), - /* K5 */ be_nested_str_weak(ipv4only), - /* K6 */ be_nested_str_weak(true), - /* K7 */ be_nested_str_weak(false), - /* K8 */ be_nested_str_weak(next_ep), - /* K9 */ be_nested_str_weak(plugins_persist), - /* K10 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K11 */ be_nested_str_weak(dump), - /* K12 */ be_nested_str_weak(plugins_config), - /* K13 */ be_nested_str_weak(plugins_config_remotes), - /* K14 */ be_const_int(0), - /* K15 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), - /* K16 */ be_nested_str_weak(_X7D), - /* K17 */ be_nested_str_weak(FILENAME), - /* K18 */ be_nested_str_weak(w), - /* K19 */ be_nested_str_weak(write), - /* K20 */ be_nested_str_weak(close), - /* K21 */ be_nested_str_weak(tasmota), - /* K22 */ be_nested_str_weak(log), - /* K23 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K24 */ be_nested_str_weak(_X20and_X20configuration), - /* K25 */ be_nested_str_weak(), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K28 */ be_nested_str_weak(_X7C), - /* K29 */ be_const_int(2), + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_mdns_host), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 + }) + ), }), - be_str_weak(save_param), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_mdns_announce_hostnames), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x60080018, // 0003 GETGBL R2 G24 - 0x580C0002, // 0004 LDCONST R3 K2 - 0x88100103, // 0005 GETMBR R4 R0 K3 - 0x88140104, // 0006 GETMBR R5 R0 K4 - 0x88180105, // 0007 GETMBR R6 R0 K5 - 0x781A0001, // 0008 JMPF R6 #000B - 0x58180006, // 0009 LDCONST R6 K6 - 0x70020000, // 000A JMP #000C - 0x58180007, // 000B LDCONST R6 K7 - 0x881C0108, // 000C GETMBR R7 R0 K8 - 0x7C080A00, // 000D CALL R2 5 - 0x880C0109, // 000E GETMBR R3 R0 K9 - 0x780E000E, // 000F JMPF R3 #001F - 0x0008050A, // 0010 ADD R2 R2 K10 - 0x8C0C030B, // 0011 GETMET R3 R1 K11 - 0x8814010C, // 0012 GETMBR R5 R0 K12 - 0x7C0C0400, // 0013 CALL R3 2 - 0x00080403, // 0014 ADD R2 R2 R3 - 0x600C000C, // 0015 GETGBL R3 G12 - 0x8810010D, // 0016 GETMBR R4 R0 K13 - 0x7C0C0200, // 0017 CALL R3 1 - 0x240C070E, // 0018 GT R3 R3 K14 - 0x780E0004, // 0019 JMPF R3 #001F - 0x0008050F, // 001A ADD R2 R2 K15 - 0x8C0C030B, // 001B GETMET R3 R1 K11 - 0x8814010D, // 001C GETMBR R5 R0 K13 - 0x7C0C0400, // 001D CALL R3 2 - 0x00080403, // 001E ADD R2 R2 R3 - 0x00080510, // 001F ADD R2 R2 K16 - 0xA8020018, // 0020 EXBLK 0 #003A - 0x600C0011, // 0021 GETGBL R3 G17 - 0x88100111, // 0022 GETMBR R4 R0 K17 - 0x58140012, // 0023 LDCONST R5 K18 - 0x7C0C0400, // 0024 CALL R3 2 - 0x8C100713, // 0025 GETMET R4 R3 K19 - 0x5C180400, // 0026 MOVE R6 R2 - 0x7C100400, // 0027 CALL R4 2 - 0x8C100714, // 0028 GETMET R4 R3 K20 - 0x7C100200, // 0029 CALL R4 1 - 0xB8122A00, // 002A GETNGBL R4 K21 - 0x8C100916, // 002B GETMET R4 R4 K22 - 0x60180018, // 002C GETGBL R6 G24 - 0x581C0017, // 002D LDCONST R7 K23 - 0x88200109, // 002E GETMBR R8 R0 K9 - 0x78220001, // 002F JMPF R8 #0032 - 0x58200018, // 0030 LDCONST R8 K24 - 0x70020000, // 0031 JMP #0033 - 0x58200019, // 0032 LDCONST R8 K25 - 0x7C180400, // 0033 CALL R6 2 - 0x581C001A, // 0034 LDCONST R7 K26 - 0x7C100600, // 0035 CALL R4 3 - 0xA8040001, // 0036 EXBLK 1 1 - 0x80040400, // 0037 RET 1 R2 - 0xA8040001, // 0038 EXBLK 1 1 - 0x70020011, // 0039 JMP #004C - 0xAC0C0002, // 003A CATCH R3 0 2 - 0x7002000E, // 003B JMP #004B - 0xB8162A00, // 003C GETNGBL R5 K21 - 0x8C140B16, // 003D GETMET R5 R5 K22 - 0x601C0008, // 003E GETGBL R7 G8 - 0x5C200600, // 003F MOVE R8 R3 - 0x7C1C0200, // 0040 CALL R7 1 - 0x001E3607, // 0041 ADD R7 K27 R7 - 0x001C0F1C, // 0042 ADD R7 R7 K28 - 0x60200008, // 0043 GETGBL R8 G8 - 0x5C240800, // 0044 MOVE R9 R4 - 0x7C200200, // 0045 CALL R8 1 - 0x001C0E08, // 0046 ADD R7 R7 R8 - 0x5820001D, // 0047 LDCONST R8 K29 - 0x7C140600, // 0048 CALL R5 3 - 0x80040400, // 0049 RET 1 R2 - 0x70020000, // 004A JMP #004C - 0xB0080000, // 004B RAISE 2 R0 R0 - 0x80000000, // 004C RET 0 + ( &(const binstruction[32]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 }) ) ); @@ -3941,9 +1323,9 @@ be_local_closure(Matter_Device_save_param, /* name */ /******************************************************************** -** Solidified function: _mdns_announce_hostname +** Solidified function: mdns_announce_op_discovery ********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ +be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ be_nested_proto( 14, /* nstack */ 2, /* argc */ @@ -3953,177 +1335,231 @@ be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[27]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(add_hostname), - /* K13 */ be_nested_str_weak(ip6local), - /* K14 */ be_nested_str_weak(ip), - /* K15 */ be_nested_str_weak(ip6), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(hostname_wifi), - /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + /* K1 */ be_nested_str_weak(get_device_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(get_fabric_compressed), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(_X2D), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(find), + /* K13 */ be_nested_str_weak(up), + /* K14 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K15 */ be_nested_str_weak(hostname_eth), + /* K16 */ be_nested_str_weak(add_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(_I), + /* K20 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K21 */ be_nested_str_weak(add_subtype), + /* K22 */ be_nested_str_weak(wifi), + /* K23 */ be_nested_str_weak(hostname_wifi), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), }), - be_str_weak(_mdns_announce_hostname), + be_str_weak(mdns_announce_op_discovery), &be_const_str_solidified, - ( &(const binstruction[140]) { /* code */ + ( &(const binstruction[121]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020072, // 0004 EXBLK 0 #0078 - 0x78060030, // 0005 JMPF R1 #0037 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416000F, // 0012 JMPT R5 #0023 - 0x8C14050C, // 0013 GETMET R5 R2 K12 - 0x881C0105, // 0014 GETMBR R7 R0 K5 - 0x8C200907, // 0015 GETMET R8 R4 K7 - 0x5828000D, // 0016 LDCONST R10 K13 - 0x582C000A, // 0017 LDCONST R11 K10 - 0x7C200600, // 0018 CALL R8 3 - 0x8C240907, // 0019 GETMET R9 R4 K7 - 0x582C000E, // 001A LDCONST R11 K14 - 0x5830000A, // 001B LDCONST R12 K10 - 0x7C240600, // 001C CALL R9 3 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x5830000F, // 001E LDCONST R12 K15 - 0x5834000A, // 001F LDCONST R13 K10 - 0x7C280600, // 0020 CALL R10 3 - 0x7C140A00, // 0021 CALL R5 5 - 0x70020012, // 0022 JMP #0036 - 0xB8160600, // 0023 GETNGBL R5 K3 - 0x8C140B10, // 0024 GETMET R5 R5 K16 - 0x601C0018, // 0025 GETGBL R7 G24 - 0x58200011, // 0026 LDCONST R8 K17 - 0x88240105, // 0027 GETMBR R9 R0 K5 - 0x8C280907, // 0028 GETMET R10 R4 K7 - 0x5830000E, // 0029 LDCONST R12 K14 - 0x5834000A, // 002A LDCONST R13 K10 - 0x7C280600, // 002B CALL R10 3 - 0x7C1C0600, // 002C CALL R7 3 - 0x58200012, // 002D LDCONST R8 K18 - 0x7C140600, // 002E CALL R5 3 - 0x8C14050C, // 002F GETMET R5 R2 K12 - 0x881C0105, // 0030 GETMBR R7 R0 K5 - 0x8C200907, // 0031 GETMET R8 R4 K7 - 0x5828000E, // 0032 LDCONST R10 K14 - 0x582C000A, // 0033 LDCONST R11 K10 - 0x7C200600, // 0034 CALL R8 3 - 0x7C140600, // 0035 CALL R5 3 - 0x7002002F, // 0036 JMP #0067 - 0xB8120600, // 0037 GETNGBL R4 K3 - 0x8C100913, // 0038 GETMET R4 R4 K19 - 0x7C100200, // 0039 CALL R4 1 - 0x8C140706, // 003A GETMET R5 R3 K6 - 0x8C1C0907, // 003B GETMET R7 R4 K7 - 0x58240008, // 003C LDCONST R9 K8 - 0x7C1C0400, // 003D CALL R7 2 - 0x58200009, // 003E LDCONST R8 K9 - 0x5824000A, // 003F LDCONST R9 K10 - 0x7C140800, // 0040 CALL R5 4 - 0x90022805, // 0041 SETMBR R0 K20 R5 - 0x8814010B, // 0042 GETMBR R5 R0 K11 - 0x7416000F, // 0043 JMPT R5 #0054 - 0x8C14050C, // 0044 GETMET R5 R2 K12 - 0x881C0114, // 0045 GETMBR R7 R0 K20 - 0x8C200907, // 0046 GETMET R8 R4 K7 - 0x5828000D, // 0047 LDCONST R10 K13 - 0x582C000A, // 0048 LDCONST R11 K10 - 0x7C200600, // 0049 CALL R8 3 - 0x8C240907, // 004A GETMET R9 R4 K7 - 0x582C000E, // 004B LDCONST R11 K14 - 0x5830000A, // 004C LDCONST R12 K10 - 0x7C240600, // 004D CALL R9 3 - 0x8C280907, // 004E GETMET R10 R4 K7 - 0x5830000F, // 004F LDCONST R12 K15 - 0x5834000A, // 0050 LDCONST R13 K10 - 0x7C280600, // 0051 CALL R10 3 - 0x7C140A00, // 0052 CALL R5 5 - 0x70020012, // 0053 JMP #0067 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B10, // 0055 GETMET R5 R5 K16 - 0x601C0018, // 0056 GETGBL R7 G24 - 0x58200011, // 0057 LDCONST R8 K17 - 0x88240105, // 0058 GETMBR R9 R0 K5 - 0x8C280907, // 0059 GETMET R10 R4 K7 - 0x5830000E, // 005A LDCONST R12 K14 - 0x5834000A, // 005B LDCONST R13 K10 - 0x7C280600, // 005C CALL R10 3 + 0xA8020064, // 0001 EXBLK 0 #0067 + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x7C140200, // 000B CALL R5 1 + 0x00140B06, // 000C ADD R5 R5 K6 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x7C180200, // 000E CALL R6 1 + 0x00140A06, // 000F ADD R5 R5 R6 + 0xB81A0E00, // 0010 GETNGBL R6 K7 + 0x8C180D08, // 0011 GETMET R6 R6 K8 + 0x00221205, // 0012 ADD R8 K9 R5 + 0x5824000A, // 0013 LDCONST R9 K10 + 0x7C180600, // 0014 CALL R6 3 + 0xB81A0E00, // 0015 GETNGBL R6 K7 + 0x8C180D0B, // 0016 GETMET R6 R6 K11 + 0x7C180200, // 0017 CALL R6 1 + 0x8C180D0C, // 0018 GETMET R6 R6 K12 + 0x5820000D, // 0019 LDCONST R8 K13 + 0x7C180400, // 001A CALL R6 2 + 0x781A0020, // 001B JMPF R6 #003D + 0xB81A0E00, // 001C GETNGBL R6 K7 + 0x8C180D08, // 001D GETMET R6 R6 K8 + 0x60200018, // 001E GETGBL R8 G24 + 0x5824000E, // 001F LDCONST R9 K14 + 0x5828000B, // 0020 LDCONST R10 K11 + 0x5C2C0A00, // 0021 MOVE R11 R5 + 0x8830010F, // 0022 GETMBR R12 R0 K15 + 0x7C200800, // 0023 CALL R8 4 + 0x5824000A, // 0024 LDCONST R9 K10 + 0x7C180600, // 0025 CALL R6 3 + 0x8C180510, // 0026 GETMET R6 R2 K16 + 0x58200011, // 0027 LDCONST R8 K17 + 0x58240012, // 0028 LDCONST R9 K18 + 0x542A15A3, // 0029 LDINT R10 5540 + 0x4C2C0000, // 002A LDNIL R11 + 0x5C300A00, // 002B MOVE R12 R5 + 0x8834010F, // 002C GETMBR R13 R0 K15 + 0x7C180E00, // 002D CALL R6 7 + 0x8C180905, // 002E GETMET R6 R4 K5 + 0x7C180200, // 002F CALL R6 1 + 0x001A2606, // 0030 ADD R6 K19 R6 + 0xB81E0E00, // 0031 GETNGBL R7 K7 + 0x8C1C0F08, // 0032 GETMET R7 R7 K8 + 0x00262806, // 0033 ADD R9 K20 R6 + 0x5828000A, // 0034 LDCONST R10 K10 + 0x7C1C0600, // 0035 CALL R7 3 + 0x8C1C0515, // 0036 GETMET R7 R2 K21 + 0x58240011, // 0037 LDCONST R9 K17 + 0x58280012, // 0038 LDCONST R10 K18 + 0x5C2C0A00, // 0039 MOVE R11 R5 + 0x8830010F, // 003A GETMBR R12 R0 K15 + 0x5C340C00, // 003B MOVE R13 R6 + 0x7C1C0C00, // 003C CALL R7 6 + 0xB81A0E00, // 003D GETNGBL R6 K7 + 0x8C180D16, // 003E GETMET R6 R6 K22 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0C, // 0040 GETMET R6 R6 K12 + 0x5820000D, // 0041 LDCONST R8 K13 + 0x7C180400, // 0042 CALL R6 2 + 0x781A0020, // 0043 JMPF R6 #0065 + 0xB81A0E00, // 0044 GETNGBL R6 K7 + 0x8C180D08, // 0045 GETMET R6 R6 K8 + 0x60200018, // 0046 GETGBL R8 G24 + 0x5824000E, // 0047 LDCONST R9 K14 + 0x58280016, // 0048 LDCONST R10 K22 + 0x5C2C0A00, // 0049 MOVE R11 R5 + 0x88300117, // 004A GETMBR R12 R0 K23 + 0x7C200800, // 004B CALL R8 4 + 0x5824000A, // 004C LDCONST R9 K10 + 0x7C180600, // 004D CALL R6 3 + 0x8C180510, // 004E GETMET R6 R2 K16 + 0x58200011, // 004F LDCONST R8 K17 + 0x58240012, // 0050 LDCONST R9 K18 + 0x542A15A3, // 0051 LDINT R10 5540 + 0x4C2C0000, // 0052 LDNIL R11 + 0x5C300A00, // 0053 MOVE R12 R5 + 0x88340117, // 0054 GETMBR R13 R0 K23 + 0x7C180E00, // 0055 CALL R6 7 + 0x8C180905, // 0056 GETMET R6 R4 K5 + 0x7C180200, // 0057 CALL R6 1 + 0x001A2606, // 0058 ADD R6 K19 R6 + 0xB81E0E00, // 0059 GETNGBL R7 K7 + 0x8C1C0F08, // 005A GETMET R7 R7 K8 + 0x00262806, // 005B ADD R9 K20 R6 + 0x5828000A, // 005C LDCONST R10 K10 0x7C1C0600, // 005D CALL R7 3 - 0x58200012, // 005E LDCONST R8 K18 - 0x7C140600, // 005F CALL R5 3 - 0x8C14050C, // 0060 GETMET R5 R2 K12 - 0x881C0114, // 0061 GETMBR R7 R0 K20 - 0x8C200907, // 0062 GETMET R8 R4 K7 - 0x5828000E, // 0063 LDCONST R10 K14 - 0x582C000A, // 0064 LDCONST R11 K10 - 0x7C200600, // 0065 CALL R8 3 - 0x7C140600, // 0066 CALL R5 3 - 0xB8120600, // 0067 GETNGBL R4 K3 - 0x8C100910, // 0068 GETMET R4 R4 K16 - 0x60180018, // 0069 GETGBL R6 G24 - 0x581C0015, // 006A LDCONST R7 K21 - 0x78060001, // 006B JMPF R1 #006E - 0x58200004, // 006C LDCONST R8 K4 - 0x70020000, // 006D JMP #006F - 0x58200013, // 006E LDCONST R8 K19 - 0x78060001, // 006F JMPF R1 #0072 - 0x88240105, // 0070 GETMBR R9 R0 K5 - 0x70020000, // 0071 JMP #0073 - 0x88240114, // 0072 GETMBR R9 R0 K20 - 0x7C180600, // 0073 CALL R6 3 - 0x581C0012, // 0074 LDCONST R7 K18 - 0x7C100600, // 0075 CALL R4 3 - 0xA8040001, // 0076 EXBLK 1 1 - 0x70020010, // 0077 JMP #0089 - 0xAC100002, // 0078 CATCH R4 0 2 - 0x7002000D, // 0079 JMP #0088 - 0xB81A0600, // 007A GETNGBL R6 K3 - 0x8C180D10, // 007B GETMET R6 R6 K16 - 0x60200008, // 007C GETGBL R8 G8 - 0x5C240800, // 007D MOVE R9 R4 - 0x7C200200, // 007E CALL R8 1 - 0x00222C08, // 007F ADD R8 K22 R8 - 0x00201117, // 0080 ADD R8 R8 K23 - 0x60240008, // 0081 GETGBL R9 G8 - 0x5C280A00, // 0082 MOVE R10 R5 - 0x7C240200, // 0083 CALL R9 1 - 0x00201009, // 0084 ADD R8 R8 R9 - 0x58240018, // 0085 LDCONST R9 K24 - 0x7C180600, // 0086 CALL R6 3 - 0x70020000, // 0087 JMP #0089 - 0xB0080000, // 0088 RAISE 2 R0 R0 - 0x8C100119, // 0089 GETMET R4 R0 K25 - 0x7C100200, // 008A CALL R4 1 - 0x80000000, // 008B RET 0 + 0x8C1C0515, // 005E GETMET R7 R2 K21 + 0x58240011, // 005F LDCONST R9 K17 + 0x58280012, // 0060 LDCONST R10 K18 + 0x5C2C0A00, // 0061 MOVE R11 R5 + 0x88300117, // 0062 GETMBR R12 R0 K23 + 0x5C340C00, // 0063 MOVE R13 R6 + 0x7C1C0C00, // 0064 CALL R7 6 + 0xA8040001, // 0065 EXBLK 1 1 + 0x70020010, // 0066 JMP #0078 + 0xAC0C0002, // 0067 CATCH R3 0 2 + 0x7002000D, // 0068 JMP #0077 + 0xB8160E00, // 0069 GETNGBL R5 K7 + 0x8C140B08, // 006A GETMET R5 R5 K8 + 0x601C0008, // 006B GETGBL R7 G8 + 0x5C200600, // 006C MOVE R8 R3 + 0x7C1C0200, // 006D CALL R7 1 + 0x001E3007, // 006E ADD R7 K24 R7 + 0x001C0F19, // 006F ADD R7 R7 K25 + 0x60200008, // 0070 GETGBL R8 G8 + 0x5C240800, // 0071 MOVE R9 R4 + 0x7C200200, // 0072 CALL R8 1 + 0x001C0E08, // 0073 ADD R7 R7 R8 + 0x5820001A, // 0074 LDCONST R8 K26 + 0x7C140600, // 0075 CALL R5 3 + 0x70020000, // 0076 JMP #0078 + 0xB0080000, // 0077 RAISE 2 R0 R0 + 0x80000000, // 0078 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 }) ) ); @@ -4442,6 +1878,1610 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: k2l_num +********************************************************************/ +be_local_closure(Matter_Device_k2l_num, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l_num), + &be_const_str_solidified, + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), + }), + be_str_weak(signal_endpoints_changed), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_remotes_info +********************************************************************/ +be_local_closure(Matter_Device_update_remotes_info, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(get_info), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(plugins_config_remotes), + }), + be_str_weak(update_remotes_info), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x60040013, // 0000 GETGBL R1 G19 + 0x7C040000, // 0001 CALL R1 0 + 0x88080100, // 0002 GETMBR R2 R0 K0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x20080403, // 0004 NE R2 R2 R3 + 0x780A0018, // 0005 JMPF R2 #001F + 0x60080010, // 0006 GETGBL R2 G16 + 0x880C0100, // 0007 GETMBR R3 R0 K0 + 0x8C0C0701, // 0008 GETMET R3 R3 K1 + 0x7C0C0200, // 0009 CALL R3 1 + 0x7C080200, // 000A CALL R2 1 + 0xA802000F, // 000B EXBLK 0 #001C + 0x5C0C0400, // 000C MOVE R3 R2 + 0x7C0C0000, // 000D CALL R3 0 + 0x88100100, // 000E GETMBR R4 R0 K0 + 0x94100803, // 000F GETIDX R4 R4 R3 + 0x8C100902, // 0010 GETMET R4 R4 K2 + 0x7C100200, // 0011 CALL R4 1 + 0x4C140000, // 0012 LDNIL R5 + 0x20140805, // 0013 NE R5 R4 R5 + 0x78160005, // 0014 JMPF R5 #001B + 0x6014000C, // 0015 GETGBL R5 G12 + 0x5C180800, // 0016 MOVE R6 R4 + 0x7C140200, // 0017 CALL R5 1 + 0x24140B03, // 0018 GT R5 R5 K3 + 0x78160000, // 0019 JMPF R5 #001B + 0x98040604, // 001A SETIDX R1 R3 R4 + 0x7001FFEF, // 001B JMP #000C + 0x58080004, // 001C LDCONST R2 K4 + 0xAC080200, // 001D CATCH R2 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x90020A01, // 001F SETMBR R0 K5 R1 + 0x80040200, // 0020 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(root_discriminator), + /* K1 */ be_nested_str_weak(root_passcode), + /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Verhoeff), + /* K5 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x540A0FFE, // 0001 LDINT R2 4095 + 0x2C040202, // 0002 AND R1 R1 R2 + 0x540A0009, // 0003 LDINT R2 10 + 0x3C040202, // 0004 SHR R1 R1 R2 + 0x88080100, // 0005 GETMBR R2 R0 K0 + 0x540E02FF, // 0006 LDINT R3 768 + 0x2C080403, // 0007 AND R2 R2 R3 + 0x540E0005, // 0008 LDINT R3 6 + 0x38080403, // 0009 SHL R2 R2 R3 + 0x880C0101, // 000A GETMBR R3 R0 K1 + 0x54123FFE, // 000B LDINT R4 16383 + 0x2C0C0604, // 000C AND R3 R3 R4 + 0x30080403, // 000D OR R2 R2 R3 + 0x880C0101, // 000E GETMBR R3 R0 K1 + 0x5412000D, // 000F LDINT R4 14 + 0x3C0C0604, // 0010 SHR R3 R3 R4 + 0x60100018, // 0011 GETGBL R4 G24 + 0x58140002, // 0012 LDCONST R5 K2 + 0x5C180200, // 0013 MOVE R6 R1 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x5C200600, // 0015 MOVE R8 R3 + 0x7C100800, // 0016 CALL R4 4 + 0xB8160600, // 0017 GETNGBL R5 K3 + 0x88140B04, // 0018 GETMBR R5 R5 K4 + 0x8C140B05, // 0019 GETMET R5 R5 K5 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0x00100805, // 001C ADD R4 R4 R5 + 0x80040800, // 001D RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_remote_info +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config_remotes), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_plugin_remote_info), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x60140013, // 0003 GETGBL R5 G19 + 0x7C140000, // 0004 CALL R5 0 + 0x7C080600, // 0005 CALL R2 3 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[35]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(FILENAME), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_nested_str_weak(close), + /* K4 */ be_nested_str_weak(json), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(root_discriminator), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(distinguish), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(passcode), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(disable_bridge_mode), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(plugins_config_remotes), + /* K24 */ be_nested_str_weak(remotes), + /* K25 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), + /* K26 */ be_nested_str_weak(io_error), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K28 */ be_nested_str_weak(_X7C), + /* K29 */ be_const_int(2), + /* K30 */ be_nested_str_weak(random), + /* K31 */ be_nested_str_weak(get), + /* K32 */ be_const_int(0), + /* K33 */ be_nested_str_weak(generate_random_passcode), + /* K34 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[127]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA802004D, // 0001 EXBLK 0 #0050 + 0x60080011, // 0002 GETGBL R2 G17 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x7C080200, // 0004 CALL R2 1 + 0x8C0C0502, // 0005 GETMET R3 R2 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x8C100503, // 0007 GETMET R4 R2 K3 + 0x7C100200, // 0008 CALL R4 1 + 0xA4120800, // 0009 IMPORT R4 K4 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C140400, // 000C CALL R5 2 + 0x8C180B07, // 000D GETMET R6 R5 K7 + 0x58200008, // 000E LDCONST R8 K8 + 0x88240106, // 000F GETMBR R9 R0 K6 + 0x7C180600, // 0010 CALL R6 3 + 0x90020C06, // 0011 SETMBR R0 K6 R6 + 0x8C180B07, // 0012 GETMET R6 R5 K7 + 0x5820000A, // 0013 LDCONST R8 K10 + 0x88240109, // 0014 GETMBR R9 R0 K9 + 0x7C180600, // 0015 CALL R6 3 + 0x90021206, // 0016 SETMBR R0 K9 R6 + 0x60180017, // 0017 GETGBL R6 G23 + 0x8C1C0B07, // 0018 GETMET R7 R5 K7 + 0x5824000B, // 0019 LDCONST R9 K11 + 0x50280000, // 001A LDBOOL R10 0 0 + 0x7C1C0600, // 001B CALL R7 3 + 0x7C180200, // 001C CALL R6 1 + 0x90021606, // 001D SETMBR R0 K11 R6 + 0x60180017, // 001E GETGBL R6 G23 + 0x8C1C0B07, // 001F GETMET R7 R5 K7 + 0x5824000C, // 0020 LDCONST R9 K12 + 0x50280000, // 0021 LDBOOL R10 0 0 + 0x7C1C0600, // 0022 CALL R7 3 + 0x7C180200, // 0023 CALL R6 1 + 0x90021806, // 0024 SETMBR R0 K12 R6 + 0x8C180B07, // 0025 GETMET R6 R5 K7 + 0x5820000E, // 0026 LDCONST R8 K14 + 0x8824010D, // 0027 GETMBR R9 R0 K13 + 0x7C180600, // 0028 CALL R6 3 + 0x90021A06, // 0029 SETMBR R0 K13 R6 + 0x8C180B07, // 002A GETMET R6 R5 K7 + 0x58200010, // 002B LDCONST R8 K16 + 0x7C180400, // 002C CALL R6 2 + 0x90021E06, // 002D SETMBR R0 K15 R6 + 0x8818010F, // 002E GETMBR R6 R0 K15 + 0x4C1C0000, // 002F LDNIL R7 + 0x20180C07, // 0030 NE R6 R6 R7 + 0x781A000B, // 0031 JMPF R6 #003E + 0xB81A2200, // 0032 GETNGBL R6 K17 + 0x8C180D12, // 0033 GETMET R6 R6 K18 + 0x60200008, // 0034 GETGBL R8 G8 + 0x8824010F, // 0035 GETMBR R9 R0 K15 + 0x7C200200, // 0036 CALL R8 1 + 0x00222608, // 0037 ADD R8 K19 R8 + 0x58240014, // 0038 LDCONST R9 K20 + 0x7C180600, // 0039 CALL R6 3 + 0x8C180115, // 003A GETMET R6 R0 K21 + 0x7C180200, // 003B CALL R6 1 + 0x50180200, // 003C LDBOOL R6 1 0 + 0x90022C06, // 003D SETMBR R0 K22 R6 + 0x8C180B07, // 003E GETMET R6 R5 K7 + 0x58200018, // 003F LDCONST R8 K24 + 0x60240013, // 0040 GETGBL R9 G19 + 0x7C240000, // 0041 CALL R9 0 + 0x7C180600, // 0042 CALL R6 3 + 0x90022E06, // 0043 SETMBR R0 K23 R6 + 0x88180117, // 0044 GETMBR R6 R0 K23 + 0x781A0007, // 0045 JMPF R6 #004E + 0xB81A2200, // 0046 GETNGBL R6 K17 + 0x8C180D12, // 0047 GETMET R6 R6 K18 + 0x60200008, // 0048 GETGBL R8 G8 + 0x88240117, // 0049 GETMBR R9 R0 K23 + 0x7C200200, // 004A CALL R8 1 + 0x00223208, // 004B ADD R8 K25 R8 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C180600, // 004D CALL R6 3 + 0xA8040001, // 004E EXBLK 1 1 + 0x70020012, // 004F JMP #0063 + 0xAC080002, // 0050 CATCH R2 0 2 + 0x7002000F, // 0051 JMP #0062 + 0x2010051A, // 0052 NE R4 R2 K26 + 0x7812000C, // 0053 JMPF R4 #0061 + 0xB8122200, // 0054 GETNGBL R4 K17 + 0x8C100912, // 0055 GETMET R4 R4 K18 + 0x60180008, // 0056 GETGBL R6 G8 + 0x5C1C0400, // 0057 MOVE R7 R2 + 0x7C180200, // 0058 CALL R6 1 + 0x001A3606, // 0059 ADD R6 K27 R6 + 0x00180D1C, // 005A ADD R6 R6 K28 + 0x601C0008, // 005B GETGBL R7 G8 + 0x5C200600, // 005C MOVE R8 R3 + 0x7C1C0200, // 005D CALL R7 1 + 0x00180C07, // 005E ADD R6 R6 R7 + 0x581C001D, // 005F LDCONST R7 K29 + 0x7C100600, // 0060 CALL R4 3 + 0x70020000, // 0061 JMP #0063 + 0xB0080000, // 0062 RAISE 2 R0 R0 + 0x50080000, // 0063 LDBOOL R2 0 0 + 0x880C0106, // 0064 GETMBR R3 R0 K6 + 0x4C100000, // 0065 LDNIL R4 + 0x1C0C0604, // 0066 EQ R3 R3 R4 + 0x780E000A, // 0067 JMPF R3 #0073 + 0x8C0C031E, // 0068 GETMET R3 R1 K30 + 0x5814001D, // 0069 LDCONST R5 K29 + 0x7C0C0400, // 006A CALL R3 2 + 0x8C0C071F, // 006B GETMET R3 R3 K31 + 0x58140020, // 006C LDCONST R5 K32 + 0x5818001D, // 006D LDCONST R6 K29 + 0x7C0C0600, // 006E CALL R3 3 + 0x54120FFE, // 006F LDINT R4 4095 + 0x2C0C0604, // 0070 AND R3 R3 R4 + 0x90020C03, // 0071 SETMBR R0 K6 R3 + 0x50080200, // 0072 LDBOOL R2 1 0 + 0x880C0109, // 0073 GETMBR R3 R0 K9 + 0x4C100000, // 0074 LDNIL R4 + 0x1C0C0604, // 0075 EQ R3 R3 R4 + 0x780E0003, // 0076 JMPF R3 #007B + 0x8C0C0121, // 0077 GETMET R3 R0 K33 + 0x7C0C0200, // 0078 CALL R3 1 + 0x90021203, // 0079 SETMBR R0 K9 R3 + 0x50080200, // 007A LDBOOL R2 1 0 + 0x780A0001, // 007B JMPF R2 #007E + 0x8C0C0122, // 007C GETMET R3 R0 K34 + 0x7C0C0200, // 007D CALL R3 1 + 0x80000000, // 007E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_remove_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(plugins_config), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(remove), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(save_param), + /* K12 */ be_nested_str_weak(signal_endpoints_changed), + /* K13 */ be_const_int(0), + /* K14 */ be_nested_str_weak(plugins), + /* K15 */ be_nested_str_weak(get_endpoint), + /* K16 */ be_const_int(1), + /* K17 */ be_nested_str_weak(clean_remotes), + }), + be_str_weak(bridge_remove_endpoint), + &be_const_str_solidified, + ( &(const binstruction[60]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x600C0008, // 0001 GETGBL R3 G8 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x4C100000, // 0004 LDNIL R4 + 0x4C140000, // 0005 LDNIL R5 + 0x88180101, // 0006 GETMBR R6 R0 K1 + 0x8C180D02, // 0007 GETMET R6 R6 K2 + 0x5C200600, // 0008 MOVE R8 R3 + 0x7C180400, // 0009 CALL R6 2 + 0x741A0005, // 000A JMPT R6 #0011 + 0xB81A0600, // 000B GETNGBL R6 K3 + 0x8C180D04, // 000C GETMET R6 R6 K4 + 0x00220A03, // 000D ADD R8 K5 R3 + 0x58240006, // 000E LDCONST R9 K6 + 0x7C180600, // 000F CALL R6 3 + 0x80000C00, // 0010 RET 0 + 0xB81A0600, // 0011 GETNGBL R6 K3 + 0x8C180D04, // 0012 GETMET R6 R6 K4 + 0x60200018, // 0013 GETGBL R8 G24 + 0x58240007, // 0014 LDCONST R9 K7 + 0x5C280200, // 0015 MOVE R10 R1 + 0x7C200400, // 0016 CALL R8 2 + 0x58240008, // 0017 LDCONST R9 K8 + 0x7C180600, // 0018 CALL R6 3 + 0x88180101, // 0019 GETMBR R6 R0 K1 + 0x8C180D09, // 001A GETMET R6 R6 K9 + 0x5C200600, // 001B MOVE R8 R3 + 0x7C180400, // 001C CALL R6 2 + 0x50180200, // 001D LDBOOL R6 1 0 + 0x90021406, // 001E SETMBR R0 K10 R6 + 0x8C18010B, // 001F GETMET R6 R0 K11 + 0x7C180200, // 0020 CALL R6 1 + 0x8C18010C, // 0021 GETMET R6 R0 K12 + 0x7C180200, // 0022 CALL R6 1 + 0x5818000D, // 0023 LDCONST R6 K13 + 0x601C000C, // 0024 GETGBL R7 G12 + 0x8820010E, // 0025 GETMBR R8 R0 K14 + 0x7C1C0200, // 0026 CALL R7 1 + 0x141C0C07, // 0027 LT R7 R6 R7 + 0x781E000F, // 0028 JMPF R7 #0039 + 0x881C010E, // 0029 GETMBR R7 R0 K14 + 0x941C0E06, // 002A GETIDX R7 R7 R6 + 0x8C1C0F0F, // 002B GETMET R7 R7 K15 + 0x7C1C0200, // 002C CALL R7 1 + 0x1C1C0207, // 002D EQ R7 R1 R7 + 0x781E0007, // 002E JMPF R7 #0037 + 0x881C010E, // 002F GETMBR R7 R0 K14 + 0x8C1C0F09, // 0030 GETMET R7 R7 K9 + 0x5C240C00, // 0031 MOVE R9 R6 + 0x7C1C0400, // 0032 CALL R7 2 + 0x8C1C010C, // 0033 GETMET R7 R0 K12 + 0x7C1C0200, // 0034 CALL R7 1 + 0x70020002, // 0035 JMP #0039 + 0x70020000, // 0036 JMP #0038 + 0x00180D10, // 0037 ADD R6 R6 K16 + 0x7001FFEA, // 0038 JMP #0024 + 0x8C1C0111, // 0039 GETMET R7 R0 K17 + 0x7C1C0200, // 003A CALL R7 1 + 0x80000000, // 003B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(PASE_TIMEOUT), + /* K1 */ be_nested_str_weak(compute_manual_pairing_code), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(compute_qrcode_content), + /* K7 */ be_nested_str_weak(publish_result), + /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K9 */ be_nested_str_weak(Matter), + /* K10 */ be_nested_str_weak(_compute_pbkdf), + /* K11 */ be_nested_str_weak(root_passcode), + /* K12 */ be_nested_str_weak(root_iterations), + /* K13 */ be_nested_str_weak(root_salt), + /* K14 */ be_nested_str_weak(start_basic_commissioning), + /* K15 */ be_nested_str_weak(root_discriminator), + /* K16 */ be_nested_str_weak(root_w0), + /* K17 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x8C080101, // 0004 GETMET R2 R0 K1 + 0x7C080200, // 0005 CALL R2 1 + 0xB80E0400, // 0006 GETNGBL R3 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180004, // 0009 LDCONST R6 K4 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x7C140400, // 000B CALL R5 2 + 0x58180005, // 000C LDCONST R6 K5 + 0x7C0C0600, // 000D CALL R3 3 + 0x8C0C0106, // 000E GETMET R3 R0 K6 + 0x7C0C0200, // 000F CALL R3 1 + 0xB8120400, // 0010 GETNGBL R4 K2 + 0x8C100907, // 0011 GETMET R4 R4 K7 + 0x60180018, // 0012 GETGBL R6 G24 + 0x581C0008, // 0013 LDCONST R7 K8 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x7C180600, // 0016 CALL R6 3 + 0x581C0009, // 0017 LDCONST R7 K9 + 0x7C100600, // 0018 CALL R4 3 + 0x8C10010A, // 0019 GETMET R4 R0 K10 + 0x8818010B, // 001A GETMBR R6 R0 K11 + 0x881C010C, // 001B GETMBR R7 R0 K12 + 0x8820010D, // 001C GETMBR R8 R0 K13 + 0x7C100800, // 001D CALL R4 4 + 0x8C10010E, // 001E GETMET R4 R0 K14 + 0x5C180200, // 001F MOVE R6 R1 + 0x881C010C, // 0020 GETMBR R7 R0 K12 + 0x8820010F, // 0021 GETMBR R8 R0 K15 + 0x8824010D, // 0022 GETMBR R9 R0 K13 + 0x88280110, // 0023 GETMBR R10 R0 K16 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x4C300000, // 0025 LDNIL R12 + 0x7C101000, // 0026 CALL R4 8 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(add_hostname), + /* K13 */ be_nested_str_weak(ip6local), + /* K14 */ be_nested_str_weak(ip), + /* K15 */ be_nested_str_weak(ip6), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(hostname_wifi), + /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[140]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020072, // 0004 EXBLK 0 #0078 + 0x78060030, // 0005 JMPF R1 #0037 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416000F, // 0012 JMPT R5 #0023 + 0x8C14050C, // 0013 GETMET R5 R2 K12 + 0x881C0105, // 0014 GETMBR R7 R0 K5 + 0x8C200907, // 0015 GETMET R8 R4 K7 + 0x5828000D, // 0016 LDCONST R10 K13 + 0x582C000A, // 0017 LDCONST R11 K10 + 0x7C200600, // 0018 CALL R8 3 + 0x8C240907, // 0019 GETMET R9 R4 K7 + 0x582C000E, // 001A LDCONST R11 K14 + 0x5830000A, // 001B LDCONST R12 K10 + 0x7C240600, // 001C CALL R9 3 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x5830000F, // 001E LDCONST R12 K15 + 0x5834000A, // 001F LDCONST R13 K10 + 0x7C280600, // 0020 CALL R10 3 + 0x7C140A00, // 0021 CALL R5 5 + 0x70020012, // 0022 JMP #0036 + 0xB8160600, // 0023 GETNGBL R5 K3 + 0x8C140B10, // 0024 GETMET R5 R5 K16 + 0x601C0018, // 0025 GETGBL R7 G24 + 0x58200011, // 0026 LDCONST R8 K17 + 0x88240105, // 0027 GETMBR R9 R0 K5 + 0x8C280907, // 0028 GETMET R10 R4 K7 + 0x5830000E, // 0029 LDCONST R12 K14 + 0x5834000A, // 002A LDCONST R13 K10 + 0x7C280600, // 002B CALL R10 3 + 0x7C1C0600, // 002C CALL R7 3 + 0x58200012, // 002D LDCONST R8 K18 + 0x7C140600, // 002E CALL R5 3 + 0x8C14050C, // 002F GETMET R5 R2 K12 + 0x881C0105, // 0030 GETMBR R7 R0 K5 + 0x8C200907, // 0031 GETMET R8 R4 K7 + 0x5828000E, // 0032 LDCONST R10 K14 + 0x582C000A, // 0033 LDCONST R11 K10 + 0x7C200600, // 0034 CALL R8 3 + 0x7C140600, // 0035 CALL R5 3 + 0x7002002F, // 0036 JMP #0067 + 0xB8120600, // 0037 GETNGBL R4 K3 + 0x8C100913, // 0038 GETMET R4 R4 K19 + 0x7C100200, // 0039 CALL R4 1 + 0x8C140706, // 003A GETMET R5 R3 K6 + 0x8C1C0907, // 003B GETMET R7 R4 K7 + 0x58240008, // 003C LDCONST R9 K8 + 0x7C1C0400, // 003D CALL R7 2 + 0x58200009, // 003E LDCONST R8 K9 + 0x5824000A, // 003F LDCONST R9 K10 + 0x7C140800, // 0040 CALL R5 4 + 0x90022805, // 0041 SETMBR R0 K20 R5 + 0x8814010B, // 0042 GETMBR R5 R0 K11 + 0x7416000F, // 0043 JMPT R5 #0054 + 0x8C14050C, // 0044 GETMET R5 R2 K12 + 0x881C0114, // 0045 GETMBR R7 R0 K20 + 0x8C200907, // 0046 GETMET R8 R4 K7 + 0x5828000D, // 0047 LDCONST R10 K13 + 0x582C000A, // 0048 LDCONST R11 K10 + 0x7C200600, // 0049 CALL R8 3 + 0x8C240907, // 004A GETMET R9 R4 K7 + 0x582C000E, // 004B LDCONST R11 K14 + 0x5830000A, // 004C LDCONST R12 K10 + 0x7C240600, // 004D CALL R9 3 + 0x8C280907, // 004E GETMET R10 R4 K7 + 0x5830000F, // 004F LDCONST R12 K15 + 0x5834000A, // 0050 LDCONST R13 K10 + 0x7C280600, // 0051 CALL R10 3 + 0x7C140A00, // 0052 CALL R5 5 + 0x70020012, // 0053 JMP #0067 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B10, // 0055 GETMET R5 R5 K16 + 0x601C0018, // 0056 GETGBL R7 G24 + 0x58200011, // 0057 LDCONST R8 K17 + 0x88240105, // 0058 GETMBR R9 R0 K5 + 0x8C280907, // 0059 GETMET R10 R4 K7 + 0x5830000E, // 005A LDCONST R12 K14 + 0x5834000A, // 005B LDCONST R13 K10 + 0x7C280600, // 005C CALL R10 3 + 0x7C1C0600, // 005D CALL R7 3 + 0x58200012, // 005E LDCONST R8 K18 + 0x7C140600, // 005F CALL R5 3 + 0x8C14050C, // 0060 GETMET R5 R2 K12 + 0x881C0114, // 0061 GETMBR R7 R0 K20 + 0x8C200907, // 0062 GETMET R8 R4 K7 + 0x5828000E, // 0063 LDCONST R10 K14 + 0x582C000A, // 0064 LDCONST R11 K10 + 0x7C200600, // 0065 CALL R8 3 + 0x7C140600, // 0066 CALL R5 3 + 0xB8120600, // 0067 GETNGBL R4 K3 + 0x8C100910, // 0068 GETMET R4 R4 K16 + 0x60180018, // 0069 GETGBL R6 G24 + 0x581C0015, // 006A LDCONST R7 K21 + 0x78060001, // 006B JMPF R1 #006E + 0x58200004, // 006C LDCONST R8 K4 + 0x70020000, // 006D JMP #006F + 0x58200013, // 006E LDCONST R8 K19 + 0x78060001, // 006F JMPF R1 #0072 + 0x88240105, // 0070 GETMBR R9 R0 K5 + 0x70020000, // 0071 JMP #0073 + 0x88240114, // 0072 GETMBR R9 R0 K20 + 0x7C180600, // 0073 CALL R6 3 + 0x581C0012, // 0074 LDCONST R7 K18 + 0x7C100600, // 0075 CALL R4 3 + 0xA8040001, // 0076 EXBLK 1 1 + 0x70020010, // 0077 JMP #0089 + 0xAC100002, // 0078 CATCH R4 0 2 + 0x7002000D, // 0079 JMP #0088 + 0xB81A0600, // 007A GETNGBL R6 K3 + 0x8C180D10, // 007B GETMET R6 R6 K16 + 0x60200008, // 007C GETGBL R8 G8 + 0x5C240800, // 007D MOVE R9 R4 + 0x7C200200, // 007E CALL R8 1 + 0x00222C08, // 007F ADD R8 K22 R8 + 0x00201117, // 0080 ADD R8 R8 K23 + 0x60240008, // 0081 GETGBL R9 G8 + 0x5C280A00, // 0082 MOVE R10 R5 + 0x7C240200, // 0083 CALL R9 1 + 0x00201009, // 0084 ADD R8 R8 R9 + 0x58240018, // 0085 LDCONST R9 K24 + 0x7C180600, // 0086 CALL R6 3 + 0x70020000, // 0087 JMP #0089 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0x8C100119, // 0089 GETMET R4 R0 K25 + 0x7C100200, // 008A CALL R4 1 + 0x80000000, // 008B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(is_root_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[27]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x58100007, // 0011 LDCONST R4 K7 + 0x5C140200, // 0012 MOVE R5 R1 + 0x7C080600, // 0013 CALL R2 3 + 0x90020002, // 0014 SETMBR R0 K0 R2 + 0x88080100, // 0015 GETMBR R2 R0 K0 + 0x8C080508, // 0016 GETMET R2 R2 K8 + 0x84100000, // 0017 CLOSURE R4 P0 + 0x7C080400, // 0018 CALL R2 2 + 0xA0000000, // 0019 CLOSE R0 + 0x80000000, // 001A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_Device_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K7 */ be_nested_str_weak(get_fabric_id), + /* K8 */ be_nested_str_weak(copy), + /* K9 */ be_nested_str_weak(reverse), + /* K10 */ be_nested_str_weak(tohex), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(message_handler), + /* K13 */ be_nested_str_weak(im), + /* K14 */ be_nested_str_weak(subs_shop), + /* K15 */ be_nested_str_weak(remove_by_fabric), + /* K16 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K17 */ be_nested_str_weak(remove_fabric), + /* K18 */ be_nested_str_weak(stop_iteration), + /* K19 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[56]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020023, // 000C EXBLK 0 #0031 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A0019, // 0015 JMPF R6 #0030 + 0xB81A0800, // 0016 GETNGBL R6 K4 + 0x8C180D05, // 0017 GETMET R6 R6 K5 + 0x8C200B07, // 0018 GETMET R8 R5 K7 + 0x7C200200, // 0019 CALL R8 1 + 0x8C201108, // 001A GETMET R8 R8 K8 + 0x7C200200, // 001B CALL R8 1 + 0x8C201109, // 001C GETMET R8 R8 K9 + 0x7C200200, // 001D CALL R8 1 + 0x8C20110A, // 001E GETMET R8 R8 K10 + 0x7C200200, // 001F CALL R8 1 + 0x00220C08, // 0020 ADD R8 K6 R8 + 0x5824000B, // 0021 LDCONST R9 K11 + 0x7C180600, // 0022 CALL R6 3 + 0x8818010C, // 0023 GETMBR R6 R0 K12 + 0x88180D0D, // 0024 GETMBR R6 R6 K13 + 0x88180D0E, // 0025 GETMBR R6 R6 K14 + 0x8C180D0F, // 0026 GETMET R6 R6 K15 + 0x5C200A00, // 0027 MOVE R8 R5 + 0x7C180400, // 0028 CALL R6 2 + 0x8C180110, // 0029 GETMET R6 R0 K16 + 0x5C200A00, // 002A MOVE R8 R5 + 0x7C180400, // 002B CALL R6 2 + 0x88180100, // 002C GETMBR R6 R0 K0 + 0x8C180D11, // 002D GETMET R6 R6 K17 + 0x5C200A00, // 002E MOVE R8 R5 + 0x7C180400, // 002F CALL R6 2 + 0x7001FFDB, // 0030 JMP #000D + 0x580C0012, // 0031 LDCONST R3 K18 + 0xAC0C0200, // 0032 CATCH R3 1 0 + 0xB0080000, // 0033 RAISE 2 R0 R0 + 0x880C0100, // 0034 GETMBR R3 R0 K0 + 0x8C0C0713, // 0035 GETMET R3 R3 K19 + 0x7C0C0200, // 0036 CALL R3 1 + 0x80000000, // 0037 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: clean_remotes +********************************************************************/ +be_local_closure(Matter_Device_clean_remotes, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[17]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(http_remotes), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get), + /* K6 */ be_nested_str_weak(http_remote), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(keys), + /* K10 */ be_nested_str_weak(tasmota), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K13 */ be_nested_str_weak(addr), + /* K14 */ be_const_int(3), + /* K15 */ be_nested_str_weak(close), + /* K16 */ be_nested_str_weak(remove), + }), + be_str_weak(clean_remotes), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x780A003D, // 0002 JMPF R2 #0041 + 0x60080013, // 0003 GETGBL R2 G19 + 0x7C080000, // 0004 CALL R2 0 + 0x600C0010, // 0005 GETGBL R3 G16 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x7C0C0200, // 0007 CALL R3 1 + 0xA8020003, // 0008 EXBLK 0 #000D + 0x5C100600, // 0009 MOVE R4 R3 + 0x7C100000, // 000A CALL R4 0 + 0x98080902, // 000B SETIDX R2 R4 K2 + 0x7001FFFB, // 000C JMP #0009 + 0x580C0003, // 000D LDCONST R3 K3 + 0xAC0C0200, // 000E CATCH R3 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100104, // 0011 GETMBR R4 R0 K4 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA802000F, // 0013 EXBLK 0 #0024 + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x8C140305, // 0016 GETMET R5 R1 K5 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x58200006, // 0018 LDCONST R8 K6 + 0x7C140600, // 0019 CALL R5 3 + 0x4C180000, // 001A LDNIL R6 + 0x20180A06, // 001B NE R6 R5 R6 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180507, // 001D GETMET R6 R2 K7 + 0x5C200A00, // 001E MOVE R8 R5 + 0x58240002, // 001F LDCONST R9 K2 + 0x7C180600, // 0020 CALL R6 3 + 0x00180D08, // 0021 ADD R6 R6 K8 + 0x98080A06, // 0022 SETIDX R2 R5 R6 + 0x7001FFEF, // 0023 JMP #0014 + 0x580C0003, // 0024 LDCONST R3 K3 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x600C0010, // 0027 GETGBL R3 G16 + 0x8C100509, // 0028 GETMET R4 R2 K9 + 0x7C100200, // 0029 CALL R4 1 + 0x7C0C0200, // 002A CALL R3 1 + 0xA8020011, // 002B EXBLK 0 #003E + 0x5C100600, // 002C MOVE R4 R3 + 0x7C100000, // 002D CALL R4 0 + 0x94140404, // 002E GETIDX R5 R2 R4 + 0x1C140B02, // 002F EQ R5 R5 K2 + 0x7816000B, // 0030 JMPF R5 #003D + 0xB8161400, // 0031 GETNGBL R5 K10 + 0x8C140B0B, // 0032 GETMET R5 R5 K11 + 0x881C090D, // 0033 GETMBR R7 R4 K13 + 0x001E1807, // 0034 ADD R7 K12 R7 + 0x5820000E, // 0035 LDCONST R8 K14 + 0x7C140600, // 0036 CALL R5 3 + 0x8C14090F, // 0037 GETMET R5 R4 K15 + 0x7C140200, // 0038 CALL R5 1 + 0x88140101, // 0039 GETMBR R5 R0 K1 + 0x8C140B10, // 003A GETMET R5 R5 K16 + 0x5C1C0800, // 003B MOVE R7 R4 + 0x7C140400, // 003C CALL R5 2 + 0x7001FFED, // 003D JMP #002C + 0x580C0003, // 003E LDCONST R3 K3 + 0xAC0C0200, // 003F CATCH R3 1 0 + 0xB0080000, // 0040 RAISE 2 R0 R0 + 0x80000000, // 0041 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: stop_basic_commissioning ********************************************************************/ @@ -4505,11 +3545,11 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ /******************************************************************** -** Solidified function: load_param +** Solidified function: mdns_announce_PASE ********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ +be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ be_nested_proto( - 11, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4517,165 +3557,288 @@ be_local_closure(Matter_Device_load_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(FILENAME), - /* K2 */ be_nested_str_weak(read), - /* K3 */ be_nested_str_weak(close), - /* K4 */ be_nested_str_weak(json), - /* K5 */ be_nested_str_weak(load), - /* K6 */ be_nested_str_weak(root_discriminator), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(distinguish), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(passcode), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(next_ep), - /* K13 */ be_nested_str_weak(nextep), - /* K14 */ be_nested_str_weak(plugins_config), - /* K15 */ be_nested_str_weak(config), - /* K16 */ be_nested_str_weak(tasmota), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K19 */ be_const_int(3), - /* K20 */ be_nested_str_weak(adjust_next_ep), - /* K21 */ be_nested_str_weak(plugins_persist), - /* K22 */ be_nested_str_weak(plugins_config_remotes), - /* K23 */ be_nested_str_weak(remotes), - /* K24 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), - /* K25 */ be_nested_str_weak(io_error), - /* K26 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K27 */ be_nested_str_weak(_X7C), - /* K28 */ be_const_int(2), - /* K29 */ be_nested_str_weak(random), - /* K30 */ be_nested_str_weak(get), - /* K31 */ be_const_int(0), - /* K32 */ be_nested_str_weak(generate_random_passcode), - /* K33 */ be_nested_str_weak(save_param), + ( &(const bvalue[41]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(VP), + /* K3 */ be_nested_str_weak(vendorid), + /* K4 */ be_nested_str_weak(_X2B), + /* K5 */ be_nested_str_weak(productid), + /* K6 */ be_nested_str_weak(D), + /* K7 */ be_nested_str_weak(commissioning_discriminator), + /* K8 */ be_nested_str_weak(CM), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(T), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(SII), + /* K13 */ be_nested_str_weak(SAI), + /* K14 */ be_nested_str_weak(commissioning_instance_wifi), + /* K15 */ be_nested_str_weak(random), + /* K16 */ be_nested_str_weak(tohex), + /* K17 */ be_nested_str_weak(commissioning_instance_eth), + /* K18 */ be_nested_str_weak(hostname_eth), + /* K19 */ be_nested_str_weak(add_service), + /* K20 */ be_nested_str_weak(_matterc), + /* K21 */ be_nested_str_weak(_udp), + /* K22 */ be_nested_str_weak(mdns_pase_eth), + /* K23 */ be_nested_str_weak(tasmota), + /* K24 */ be_nested_str_weak(log), + /* K25 */ be_nested_str_weak(MTR_X3A_X20announce_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K26 */ be_nested_str_weak(eth), + /* K27 */ be_const_int(2), + /* K28 */ be_nested_str_weak(_L), + /* K29 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K30 */ be_const_int(3), + /* K31 */ be_nested_str_weak(add_subtype), + /* K32 */ be_nested_str_weak(_S), + /* K33 */ be_nested_str_weak(_V), + /* K34 */ be_nested_str_weak(_CM1), + /* K35 */ be_nested_str_weak(hostname_wifi), + /* K36 */ be_nested_str_weak(mdns_pase_wifi), + /* K37 */ be_nested_str_weak(MTR_X3A_X20starting_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K38 */ be_nested_str_weak(wifi), + /* K39 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K40 */ be_nested_str_weak(_X7C), }), - be_str_weak(load_param), + be_str_weak(mdns_announce_PASE), &be_const_str_solidified, - ( &(const binstruction[120]) { /* code */ + ( &(const binstruction[236]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA8020046, // 0001 EXBLK 0 #0049 - 0x60080011, // 0002 GETGBL R2 G17 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x7C080200, // 0004 CALL R2 1 - 0x8C0C0502, // 0005 GETMET R3 R2 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0x8C100503, // 0007 GETMET R4 R2 K3 - 0x7C100200, // 0008 CALL R4 1 - 0xA4120800, // 0009 IMPORT R4 K4 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x5C1C0600, // 000B MOVE R7 R3 - 0x7C140400, // 000C CALL R5 2 - 0x8C180B07, // 000D GETMET R6 R5 K7 - 0x58200008, // 000E LDCONST R8 K8 - 0x88240106, // 000F GETMBR R9 R0 K6 - 0x7C180600, // 0010 CALL R6 3 - 0x90020C06, // 0011 SETMBR R0 K6 R6 - 0x8C180B07, // 0012 GETMET R6 R5 K7 - 0x5820000A, // 0013 LDCONST R8 K10 - 0x88240109, // 0014 GETMBR R9 R0 K9 - 0x7C180600, // 0015 CALL R6 3 - 0x90021206, // 0016 SETMBR R0 K9 R6 - 0x60180017, // 0017 GETGBL R6 G23 - 0x8C1C0B07, // 0018 GETMET R7 R5 K7 - 0x5824000B, // 0019 LDCONST R9 K11 - 0x50280000, // 001A LDBOOL R10 0 0 - 0x7C1C0600, // 001B CALL R7 3 - 0x7C180200, // 001C CALL R6 1 - 0x90021606, // 001D SETMBR R0 K11 R6 - 0x8C180B07, // 001E GETMET R6 R5 K7 - 0x5820000D, // 001F LDCONST R8 K13 - 0x8824010C, // 0020 GETMBR R9 R0 K12 - 0x7C180600, // 0021 CALL R6 3 - 0x90021806, // 0022 SETMBR R0 K12 R6 - 0x8C180B07, // 0023 GETMET R6 R5 K7 - 0x5820000F, // 0024 LDCONST R8 K15 - 0x7C180400, // 0025 CALL R6 2 - 0x90021C06, // 0026 SETMBR R0 K14 R6 - 0x8818010E, // 0027 GETMBR R6 R0 K14 - 0x4C1C0000, // 0028 LDNIL R7 - 0x20180C07, // 0029 NE R6 R6 R7 - 0x781A000B, // 002A JMPF R6 #0037 - 0xB81A2000, // 002B GETNGBL R6 K16 - 0x8C180D11, // 002C GETMET R6 R6 K17 - 0x60200008, // 002D GETGBL R8 G8 - 0x8824010E, // 002E GETMBR R9 R0 K14 - 0x7C200200, // 002F CALL R8 1 - 0x00222408, // 0030 ADD R8 K18 R8 - 0x58240013, // 0031 LDCONST R9 K19 - 0x7C180600, // 0032 CALL R6 3 - 0x8C180114, // 0033 GETMET R6 R0 K20 - 0x7C180200, // 0034 CALL R6 1 - 0x50180200, // 0035 LDBOOL R6 1 0 - 0x90022A06, // 0036 SETMBR R0 K21 R6 - 0x8C180B07, // 0037 GETMET R6 R5 K7 - 0x58200017, // 0038 LDCONST R8 K23 - 0x60240013, // 0039 GETGBL R9 G19 - 0x7C240000, // 003A CALL R9 0 - 0x7C180600, // 003B CALL R6 3 - 0x90022C06, // 003C SETMBR R0 K22 R6 - 0x88180116, // 003D GETMBR R6 R0 K22 - 0x781A0007, // 003E JMPF R6 #0047 - 0xB81A2000, // 003F GETNGBL R6 K16 - 0x8C180D11, // 0040 GETMET R6 R6 K17 - 0x60200008, // 0041 GETGBL R8 G8 - 0x88240116, // 0042 GETMBR R9 R0 K22 - 0x7C200200, // 0043 CALL R8 1 - 0x00223008, // 0044 ADD R8 K24 R8 - 0x58240013, // 0045 LDCONST R9 K19 - 0x7C180600, // 0046 CALL R6 3 - 0xA8040001, // 0047 EXBLK 1 1 - 0x70020012, // 0048 JMP #005C - 0xAC080002, // 0049 CATCH R2 0 2 - 0x7002000F, // 004A JMP #005B - 0x20100519, // 004B NE R4 R2 K25 - 0x7812000C, // 004C JMPF R4 #005A - 0xB8122000, // 004D GETNGBL R4 K16 - 0x8C100911, // 004E GETMET R4 R4 K17 - 0x60180008, // 004F GETGBL R6 G8 - 0x5C1C0400, // 0050 MOVE R7 R2 - 0x7C180200, // 0051 CALL R6 1 - 0x001A3406, // 0052 ADD R6 K26 R6 - 0x00180D1B, // 0053 ADD R6 R6 K27 - 0x601C0008, // 0054 GETGBL R7 G8 - 0x5C200600, // 0055 MOVE R8 R3 - 0x7C1C0200, // 0056 CALL R7 1 - 0x00180C07, // 0057 ADD R6 R6 R7 - 0x581C001C, // 0058 LDCONST R7 K28 - 0x7C100600, // 0059 CALL R4 3 - 0x70020000, // 005A JMP #005C - 0xB0080000, // 005B RAISE 2 R0 R0 - 0x50080000, // 005C LDBOOL R2 0 0 - 0x880C0106, // 005D GETMBR R3 R0 K6 - 0x4C100000, // 005E LDNIL R4 - 0x1C0C0604, // 005F EQ R3 R3 R4 - 0x780E000A, // 0060 JMPF R3 #006C - 0x8C0C031D, // 0061 GETMET R3 R1 K29 - 0x5814001C, // 0062 LDCONST R5 K28 - 0x7C0C0400, // 0063 CALL R3 2 - 0x8C0C071E, // 0064 GETMET R3 R3 K30 - 0x5814001F, // 0065 LDCONST R5 K31 - 0x5818001C, // 0066 LDCONST R6 K28 - 0x7C0C0600, // 0067 CALL R3 3 - 0x54120FFE, // 0068 LDINT R4 4095 - 0x2C0C0604, // 0069 AND R3 R3 R4 - 0x90020C03, // 006A SETMBR R0 K6 R3 - 0x50080200, // 006B LDBOOL R2 1 0 - 0x880C0109, // 006C GETMBR R3 R0 K9 - 0x4C100000, // 006D LDNIL R4 - 0x1C0C0604, // 006E EQ R3 R3 R4 - 0x780E0003, // 006F JMPF R3 #0074 - 0x8C0C0120, // 0070 GETMET R3 R0 K32 - 0x7C0C0200, // 0071 CALL R3 1 - 0x90021203, // 0072 SETMBR R0 K9 R3 - 0x50080200, // 0073 LDBOOL R2 1 0 - 0x780A0001, // 0074 JMPF R2 #0077 - 0x8C0C0121, // 0075 GETMET R3 R0 K33 - 0x7C0C0200, // 0076 CALL R3 1 - 0x80000000, // 0077 RET 0 + 0xA40A0200, // 0001 IMPORT R2 K1 + 0x600C0013, // 0002 GETGBL R3 G19 + 0x7C0C0000, // 0003 CALL R3 0 + 0x60100008, // 0004 GETGBL R4 G8 + 0x88140103, // 0005 GETMBR R5 R0 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x00100904, // 0007 ADD R4 R4 K4 + 0x60140008, // 0008 GETGBL R5 G8 + 0x88180105, // 0009 GETMBR R6 R0 K5 + 0x7C140200, // 000A CALL R5 1 + 0x00100805, // 000B ADD R4 R4 R5 + 0x980E0404, // 000C SETIDX R3 K2 R4 + 0x88100107, // 000D GETMBR R4 R0 K7 + 0x980E0C04, // 000E SETIDX R3 K6 R4 + 0x980E1109, // 000F SETIDX R3 K8 K9 + 0x980E150B, // 0010 SETIDX R3 K10 K11 + 0x54121387, // 0011 LDINT R4 5000 + 0x980E1804, // 0012 SETIDX R3 K12 R4 + 0x5412012B, // 0013 LDINT R4 300 + 0x980E1A04, // 0014 SETIDX R3 K13 R4 + 0x8C10050F, // 0015 GETMET R4 R2 K15 + 0x541A0007, // 0016 LDINT R6 8 + 0x7C100400, // 0017 CALL R4 2 + 0x8C100910, // 0018 GETMET R4 R4 K16 + 0x7C100200, // 0019 CALL R4 1 + 0x90021C04, // 001A SETMBR R0 K14 R4 + 0x8C10050F, // 001B GETMET R4 R2 K15 + 0x541A0007, // 001C LDINT R6 8 + 0x7C100400, // 001D CALL R4 2 + 0x8C100910, // 001E GETMET R4 R4 K16 + 0x7C100200, // 001F CALL R4 1 + 0x90022204, // 0020 SETMBR R0 K17 R4 + 0xA80200B7, // 0021 EXBLK 0 #00DA + 0x88100112, // 0022 GETMBR R4 R0 K18 + 0x78120058, // 0023 JMPF R4 #007D + 0x8C100313, // 0024 GETMET R4 R1 K19 + 0x58180014, // 0025 LDCONST R6 K20 + 0x581C0015, // 0026 LDCONST R7 K21 + 0x542215A3, // 0027 LDINT R8 5540 + 0x5C240600, // 0028 MOVE R9 R3 + 0x88280111, // 0029 GETMBR R10 R0 K17 + 0x882C0112, // 002A GETMBR R11 R0 K18 + 0x7C100E00, // 002B CALL R4 7 + 0x50100200, // 002C LDBOOL R4 1 0 + 0x90022C04, // 002D SETMBR R0 K22 R4 + 0xB8122E00, // 002E GETNGBL R4 K23 + 0x8C100918, // 002F GETMET R4 R4 K24 + 0x60180018, // 0030 GETGBL R6 G24 + 0x581C0019, // 0031 LDCONST R7 K25 + 0x5820001A, // 0032 LDCONST R8 K26 + 0x88240111, // 0033 GETMBR R9 R0 K17 + 0x88280112, // 0034 GETMBR R10 R0 K18 + 0x7C180800, // 0035 CALL R6 4 + 0x581C001B, // 0036 LDCONST R7 K27 + 0x7C100600, // 0037 CALL R4 3 + 0x60100008, // 0038 GETGBL R4 G8 + 0x88140107, // 0039 GETMBR R5 R0 K7 + 0x541A0FFE, // 003A LDINT R6 4095 + 0x2C140A06, // 003B AND R5 R5 R6 + 0x7C100200, // 003C CALL R4 1 + 0x00123804, // 003D ADD R4 K28 R4 + 0xB8162E00, // 003E GETNGBL R5 K23 + 0x8C140B18, // 003F GETMET R5 R5 K24 + 0x001E3A04, // 0040 ADD R7 K29 R4 + 0x5820001E, // 0041 LDCONST R8 K30 + 0x7C140600, // 0042 CALL R5 3 + 0x8C14031F, // 0043 GETMET R5 R1 K31 + 0x581C0014, // 0044 LDCONST R7 K20 + 0x58200015, // 0045 LDCONST R8 K21 + 0x88240111, // 0046 GETMBR R9 R0 K17 + 0x88280112, // 0047 GETMBR R10 R0 K18 + 0x5C2C0800, // 0048 MOVE R11 R4 + 0x7C140C00, // 0049 CALL R5 6 + 0x60140008, // 004A GETGBL R5 G8 + 0x88180107, // 004B GETMBR R6 R0 K7 + 0x541E0EFF, // 004C LDINT R7 3840 + 0x2C180C07, // 004D AND R6 R6 R7 + 0x541E0007, // 004E LDINT R7 8 + 0x3C180C07, // 004F SHR R6 R6 R7 + 0x7C140200, // 0050 CALL R5 1 + 0x00164005, // 0051 ADD R5 K32 R5 + 0x5C100A00, // 0052 MOVE R4 R5 + 0xB8162E00, // 0053 GETNGBL R5 K23 + 0x8C140B18, // 0054 GETMET R5 R5 K24 + 0x001E3A04, // 0055 ADD R7 K29 R4 + 0x5820001E, // 0056 LDCONST R8 K30 + 0x7C140600, // 0057 CALL R5 3 + 0x8C14031F, // 0058 GETMET R5 R1 K31 + 0x581C0014, // 0059 LDCONST R7 K20 + 0x58200015, // 005A LDCONST R8 K21 + 0x88240111, // 005B GETMBR R9 R0 K17 + 0x88280112, // 005C GETMBR R10 R0 K18 + 0x5C2C0800, // 005D MOVE R11 R4 + 0x7C140C00, // 005E CALL R5 6 + 0x60140008, // 005F GETGBL R5 G8 + 0x88180103, // 0060 GETMBR R6 R0 K3 + 0x7C140200, // 0061 CALL R5 1 + 0x00164205, // 0062 ADD R5 K33 R5 + 0x5C100A00, // 0063 MOVE R4 R5 + 0xB8162E00, // 0064 GETNGBL R5 K23 + 0x8C140B18, // 0065 GETMET R5 R5 K24 + 0x001E3A04, // 0066 ADD R7 K29 R4 + 0x5820001E, // 0067 LDCONST R8 K30 + 0x7C140600, // 0068 CALL R5 3 + 0x8C14031F, // 0069 GETMET R5 R1 K31 + 0x581C0014, // 006A LDCONST R7 K20 + 0x58200015, // 006B LDCONST R8 K21 + 0x88240111, // 006C GETMBR R9 R0 K17 + 0x88280112, // 006D GETMBR R10 R0 K18 + 0x5C2C0800, // 006E MOVE R11 R4 + 0x7C140C00, // 006F CALL R5 6 + 0x58100022, // 0070 LDCONST R4 K34 + 0xB8162E00, // 0071 GETNGBL R5 K23 + 0x8C140B18, // 0072 GETMET R5 R5 K24 + 0x001E3A04, // 0073 ADD R7 K29 R4 + 0x5820001E, // 0074 LDCONST R8 K30 + 0x7C140600, // 0075 CALL R5 3 + 0x8C14031F, // 0076 GETMET R5 R1 K31 + 0x581C0014, // 0077 LDCONST R7 K20 + 0x58200015, // 0078 LDCONST R8 K21 + 0x88240111, // 0079 GETMBR R9 R0 K17 + 0x88280112, // 007A GETMBR R10 R0 K18 + 0x5C2C0800, // 007B MOVE R11 R4 + 0x7C140C00, // 007C CALL R5 6 + 0x88100123, // 007D GETMBR R4 R0 K35 + 0x78120058, // 007E JMPF R4 #00D8 + 0x8C100313, // 007F GETMET R4 R1 K19 + 0x58180014, // 0080 LDCONST R6 K20 + 0x581C0015, // 0081 LDCONST R7 K21 + 0x542215A3, // 0082 LDINT R8 5540 + 0x5C240600, // 0083 MOVE R9 R3 + 0x8828010E, // 0084 GETMBR R10 R0 K14 + 0x882C0123, // 0085 GETMBR R11 R0 K35 + 0x7C100E00, // 0086 CALL R4 7 + 0x50100200, // 0087 LDBOOL R4 1 0 + 0x90024804, // 0088 SETMBR R0 K36 R4 + 0xB8122E00, // 0089 GETNGBL R4 K23 + 0x8C100918, // 008A GETMET R4 R4 K24 + 0x60180018, // 008B GETGBL R6 G24 + 0x581C0025, // 008C LDCONST R7 K37 + 0x58200026, // 008D LDCONST R8 K38 + 0x8824010E, // 008E GETMBR R9 R0 K14 + 0x88280123, // 008F GETMBR R10 R0 K35 + 0x7C180800, // 0090 CALL R6 4 + 0x581C001E, // 0091 LDCONST R7 K30 + 0x7C100600, // 0092 CALL R4 3 + 0x60100008, // 0093 GETGBL R4 G8 + 0x88140107, // 0094 GETMBR R5 R0 K7 + 0x541A0FFE, // 0095 LDINT R6 4095 + 0x2C140A06, // 0096 AND R5 R5 R6 + 0x7C100200, // 0097 CALL R4 1 + 0x00123804, // 0098 ADD R4 K28 R4 + 0xB8162E00, // 0099 GETNGBL R5 K23 + 0x8C140B18, // 009A GETMET R5 R5 K24 + 0x001E3A04, // 009B ADD R7 K29 R4 + 0x5820001E, // 009C LDCONST R8 K30 + 0x7C140600, // 009D CALL R5 3 + 0x8C14031F, // 009E GETMET R5 R1 K31 + 0x581C0014, // 009F LDCONST R7 K20 + 0x58200015, // 00A0 LDCONST R8 K21 + 0x8824010E, // 00A1 GETMBR R9 R0 K14 + 0x88280123, // 00A2 GETMBR R10 R0 K35 + 0x5C2C0800, // 00A3 MOVE R11 R4 + 0x7C140C00, // 00A4 CALL R5 6 + 0x60140008, // 00A5 GETGBL R5 G8 + 0x88180107, // 00A6 GETMBR R6 R0 K7 + 0x541E0EFF, // 00A7 LDINT R7 3840 + 0x2C180C07, // 00A8 AND R6 R6 R7 + 0x541E0007, // 00A9 LDINT R7 8 + 0x3C180C07, // 00AA SHR R6 R6 R7 + 0x7C140200, // 00AB CALL R5 1 + 0x00164005, // 00AC ADD R5 K32 R5 + 0x5C100A00, // 00AD MOVE R4 R5 + 0xB8162E00, // 00AE GETNGBL R5 K23 + 0x8C140B18, // 00AF GETMET R5 R5 K24 + 0x001E3A04, // 00B0 ADD R7 K29 R4 + 0x5820001E, // 00B1 LDCONST R8 K30 + 0x7C140600, // 00B2 CALL R5 3 + 0x8C14031F, // 00B3 GETMET R5 R1 K31 + 0x581C0014, // 00B4 LDCONST R7 K20 + 0x58200015, // 00B5 LDCONST R8 K21 + 0x8824010E, // 00B6 GETMBR R9 R0 K14 + 0x88280123, // 00B7 GETMBR R10 R0 K35 + 0x5C2C0800, // 00B8 MOVE R11 R4 + 0x7C140C00, // 00B9 CALL R5 6 + 0x60140008, // 00BA GETGBL R5 G8 + 0x88180103, // 00BB GETMBR R6 R0 K3 + 0x7C140200, // 00BC CALL R5 1 + 0x00164205, // 00BD ADD R5 K33 R5 + 0x5C100A00, // 00BE MOVE R4 R5 + 0xB8162E00, // 00BF GETNGBL R5 K23 + 0x8C140B18, // 00C0 GETMET R5 R5 K24 + 0x001E3A04, // 00C1 ADD R7 K29 R4 + 0x5820001E, // 00C2 LDCONST R8 K30 + 0x7C140600, // 00C3 CALL R5 3 + 0x8C14031F, // 00C4 GETMET R5 R1 K31 + 0x581C0014, // 00C5 LDCONST R7 K20 + 0x58200015, // 00C6 LDCONST R8 K21 + 0x8824010E, // 00C7 GETMBR R9 R0 K14 + 0x88280123, // 00C8 GETMBR R10 R0 K35 + 0x5C2C0800, // 00C9 MOVE R11 R4 + 0x7C140C00, // 00CA CALL R5 6 + 0x58100022, // 00CB LDCONST R4 K34 + 0xB8162E00, // 00CC GETNGBL R5 K23 + 0x8C140B18, // 00CD GETMET R5 R5 K24 + 0x001E3A04, // 00CE ADD R7 K29 R4 + 0x5820001E, // 00CF LDCONST R8 K30 + 0x7C140600, // 00D0 CALL R5 3 + 0x8C14031F, // 00D1 GETMET R5 R1 K31 + 0x581C0014, // 00D2 LDCONST R7 K20 + 0x58200015, // 00D3 LDCONST R8 K21 + 0x8824010E, // 00D4 GETMBR R9 R0 K14 + 0x88280123, // 00D5 GETMBR R10 R0 K35 + 0x5C2C0800, // 00D6 MOVE R11 R4 + 0x7C140C00, // 00D7 CALL R5 6 + 0xA8040001, // 00D8 EXBLK 1 1 + 0x70020010, // 00D9 JMP #00EB + 0xAC100002, // 00DA CATCH R4 0 2 + 0x7002000D, // 00DB JMP #00EA + 0xB81A2E00, // 00DC GETNGBL R6 K23 + 0x8C180D18, // 00DD GETMET R6 R6 K24 + 0x60200008, // 00DE GETGBL R8 G8 + 0x5C240800, // 00DF MOVE R9 R4 + 0x7C200200, // 00E0 CALL R8 1 + 0x00224E08, // 00E1 ADD R8 K39 R8 + 0x00201128, // 00E2 ADD R8 R8 K40 + 0x60240008, // 00E3 GETGBL R9 G8 + 0x5C280A00, // 00E4 MOVE R10 R5 + 0x7C240200, // 00E5 CALL R9 1 + 0x00201009, // 00E6 ADD R8 R8 R9 + 0x5824001B, // 00E7 LDCONST R9 K27 + 0x7C180600, // 00E8 CALL R6 3 + 0x70020000, // 00E9 JMP #00EB + 0xB0080000, // 00EA RAISE 2 R0 R0 + 0x80000000, // 00EB RET 0 }) ) ); @@ -4683,11 +3846,65 @@ be_local_closure(Matter_Device_load_param, /* name */ /******************************************************************** -** Solidified function: mdns_announce_op_discovery +** Solidified function: conf_to_log ********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ +be_local_closure(Matter_Device_conf_to_log, /* name */ be_nested_proto( - 14, /* nstack */ + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(k2l), + /* K3 */ be_nested_str_weak(type), + /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(conf_to_log), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x5C180000, // 0004 MOVE R6 R0 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA802000B, // 0007 EXBLK 0 #0014 + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x1C140903, // 000A EQ R5 R4 K3 + 0x78160000, // 000B JMPF R5 #000D + 0x7001FFFA, // 000C JMP #0008 + 0x60140018, // 000D GETGBL R5 G24 + 0x58180004, // 000E LDCONST R6 K4 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x94200004, // 0010 GETIDX R8 R0 R4 + 0x7C140600, // 0011 CALL R5 3 + 0x00080405, // 0012 ADD R2 R2 R5 + 0x7001FFF3, // 0013 JMP #0008 + 0x580C0005, // 0014 LDCONST R3 K5 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x80040400, // 0017 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -4695,7 +3912,521 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(stop_basic_commissioning), + /* K3 */ be_nested_str_weak(root_w0), + /* K4 */ be_nested_str_weak(root_L), + /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x4C100000, // 0004 LDNIL R4 + 0x90020604, // 0005 SETMBR R0 K3 R4 + 0x4C100000, // 0006 LDNIL R4 + 0x90020804, // 0007 SETMBR R0 K4 R4 + 0x8C100105, // 0008 GETMET R4 R0 K5 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C100400, // 000A CALL R4 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), + }), + be_str_weak(event_fabrics_saved), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), + }), + be_str_weak(msg_send), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[31]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(update_remotes_info), + /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K3 */ be_nested_str_weak(root_discriminator), + /* K4 */ be_nested_str_weak(root_passcode), + /* K5 */ be_nested_str_weak(ipv4only), + /* K6 */ be_nested_str_weak(true), + /* K7 */ be_nested_str_weak(false), + /* K8 */ be_nested_str_weak(disable_bridge_mode), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(plugins_config_remotes), + /* K15 */ be_const_int(0), + /* K16 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), + /* K17 */ be_nested_str_weak(_X7D), + /* K18 */ be_nested_str_weak(FILENAME), + /* K19 */ be_nested_str_weak(w), + /* K20 */ be_nested_str_weak(write), + /* K21 */ be_nested_str_weak(close), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K25 */ be_nested_str_weak(_X20and_X20configuration), + /* K26 */ be_nested_str_weak(), + /* K27 */ be_const_int(3), + /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K29 */ be_nested_str_weak(_X7C), + /* K30 */ be_const_int(2), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[82]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x60080018, // 0003 GETGBL R2 G24 + 0x580C0002, // 0004 LDCONST R3 K2 + 0x88100103, // 0005 GETMBR R4 R0 K3 + 0x88140104, // 0006 GETMBR R5 R0 K4 + 0x88180105, // 0007 GETMBR R6 R0 K5 + 0x781A0001, // 0008 JMPF R6 #000B + 0x58180006, // 0009 LDCONST R6 K6 + 0x70020000, // 000A JMP #000C + 0x58180007, // 000B LDCONST R6 K7 + 0x881C0108, // 000C GETMBR R7 R0 K8 + 0x781E0001, // 000D JMPF R7 #0010 + 0x581C0006, // 000E LDCONST R7 K6 + 0x70020000, // 000F JMP #0011 + 0x581C0007, // 0010 LDCONST R7 K7 + 0x88200109, // 0011 GETMBR R8 R0 K9 + 0x7C080C00, // 0012 CALL R2 6 + 0x880C010A, // 0013 GETMBR R3 R0 K10 + 0x780E000E, // 0014 JMPF R3 #0024 + 0x0008050B, // 0015 ADD R2 R2 K11 + 0x8C0C030C, // 0016 GETMET R3 R1 K12 + 0x8814010D, // 0017 GETMBR R5 R0 K13 + 0x7C0C0400, // 0018 CALL R3 2 + 0x00080403, // 0019 ADD R2 R2 R3 + 0x600C000C, // 001A GETGBL R3 G12 + 0x8810010E, // 001B GETMBR R4 R0 K14 + 0x7C0C0200, // 001C CALL R3 1 + 0x240C070F, // 001D GT R3 R3 K15 + 0x780E0004, // 001E JMPF R3 #0024 + 0x00080510, // 001F ADD R2 R2 K16 + 0x8C0C030C, // 0020 GETMET R3 R1 K12 + 0x8814010E, // 0021 GETMBR R5 R0 K14 + 0x7C0C0400, // 0022 CALL R3 2 + 0x00080403, // 0023 ADD R2 R2 R3 + 0x00080511, // 0024 ADD R2 R2 K17 + 0xA8020018, // 0025 EXBLK 0 #003F + 0x600C0011, // 0026 GETGBL R3 G17 + 0x88100112, // 0027 GETMBR R4 R0 K18 + 0x58140013, // 0028 LDCONST R5 K19 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C100714, // 002A GETMET R4 R3 K20 + 0x5C180400, // 002B MOVE R6 R2 + 0x7C100400, // 002C CALL R4 2 + 0x8C100715, // 002D GETMET R4 R3 K21 + 0x7C100200, // 002E CALL R4 1 + 0xB8122C00, // 002F GETNGBL R4 K22 + 0x8C100917, // 0030 GETMET R4 R4 K23 + 0x60180018, // 0031 GETGBL R6 G24 + 0x581C0018, // 0032 LDCONST R7 K24 + 0x8820010A, // 0033 GETMBR R8 R0 K10 + 0x78220001, // 0034 JMPF R8 #0037 + 0x58200019, // 0035 LDCONST R8 K25 + 0x70020000, // 0036 JMP #0038 + 0x5820001A, // 0037 LDCONST R8 K26 + 0x7C180400, // 0038 CALL R6 2 + 0x581C001B, // 0039 LDCONST R7 K27 + 0x7C100600, // 003A CALL R4 3 + 0xA8040001, // 003B EXBLK 1 1 + 0x80040400, // 003C RET 1 R2 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020011, // 003E JMP #0051 + 0xAC0C0002, // 003F CATCH R3 0 2 + 0x7002000E, // 0040 JMP #0050 + 0xB8162C00, // 0041 GETNGBL R5 K22 + 0x8C140B17, // 0042 GETMET R5 R5 K23 + 0x601C0008, // 0043 GETGBL R7 G8 + 0x5C200600, // 0044 MOVE R8 R3 + 0x7C1C0200, // 0045 CALL R7 1 + 0x001E3807, // 0046 ADD R7 K28 R7 + 0x001C0F1D, // 0047 ADD R7 R7 K29 + 0x60200008, // 0048 GETGBL R8 G8 + 0x5C240800, // 0049 MOVE R9 R4 + 0x7C200200, // 004A CALL R8 1 + 0x001C0E08, // 004B ADD R7 R7 R8 + 0x5820001E, // 004C LDCONST R8 K30 + 0x7C140600, // 004D CALL R5 3 + 0x80040400, // 004E RET 1 R2 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(add), + /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K3 */ be_nested_str_weak(derive), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(root_w0), + /* K6 */ be_nested_str_weak(EC_P256), + /* K7 */ be_nested_str_weak(mod), + /* K8 */ be_nested_str_weak(root_L), + /* K9 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140015, // 0001 GETGBL R5 G21 + 0x7C140000, // 0002 CALL R5 0 + 0x8C140B01, // 0003 GETMET R5 R5 K1 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x54220003, // 0005 LDINT R8 4 + 0x7C140600, // 0006 CALL R5 3 + 0x8C180902, // 0007 GETMET R6 R4 K2 + 0x7C180200, // 0008 CALL R6 1 + 0x8C180D03, // 0009 GETMET R6 R6 K3 + 0x5C200A00, // 000A MOVE R8 R5 + 0x5C240600, // 000B MOVE R9 R3 + 0x5C280400, // 000C MOVE R10 R2 + 0x542E004F, // 000D LDINT R11 80 + 0x7C180A00, // 000E CALL R6 5 + 0x541E0026, // 000F LDINT R7 39 + 0x401E0807, // 0010 CONNECT R7 K4 R7 + 0x941C0C07, // 0011 GETIDX R7 R6 R7 + 0x54220027, // 0012 LDINT R8 40 + 0x5426004E, // 0013 LDINT R9 79 + 0x40201009, // 0014 CONNECT R8 R8 R9 + 0x94200C08, // 0015 GETIDX R8 R6 R8 + 0x8C240906, // 0016 GETMET R9 R4 K6 + 0x7C240200, // 0017 CALL R9 1 + 0x8C241307, // 0018 GETMET R9 R9 K7 + 0x5C2C0E00, // 0019 MOVE R11 R7 + 0x7C240400, // 001A CALL R9 2 + 0x90020A09, // 001B SETMBR R0 K5 R9 + 0x8C240906, // 001C GETMET R9 R4 K6 + 0x7C240200, // 001D CALL R9 1 + 0x8C241307, // 001E GETMET R9 R9 K7 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C240400, // 0020 CALL R9 2 + 0x8C280906, // 0021 GETMET R10 R4 K6 + 0x7C280200, // 0022 CALL R10 1 + 0x8C281509, // 0023 GETMET R10 R10 K9 + 0x5C301200, // 0024 MOVE R12 R9 + 0x7C280400, // 0025 CALL R10 2 + 0x9002100A, // 0026 SETMBR R0 K8 R10 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ /* K0 */ be_nested_str_weak(mdns), /* K1 */ be_nested_str_weak(get_device_id), /* K2 */ be_nested_str_weak(copy), @@ -4704,31 +4435,27 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /* K5 */ be_nested_str_weak(tohex), /* K6 */ be_nested_str_weak(_X2D), /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(find), - /* K13 */ be_nested_str_weak(up), - /* K14 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K15 */ be_nested_str_weak(hostname_eth), - /* K16 */ be_nested_str_weak(add_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(_I), - /* K20 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K21 */ be_nested_str_weak(add_subtype), - /* K22 */ be_nested_str_weak(wifi), - /* K23 */ be_nested_str_weak(hostname_wifi), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), + /* K8 */ be_nested_str_weak(eth), + /* K9 */ be_nested_str_weak(find), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(remove_service), + /* K15 */ be_nested_str_weak(_matter), + /* K16 */ be_nested_str_weak(_tcp), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_nested_str_weak(wifi), + /* K19 */ be_nested_str_weak(hostname_wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), }), - be_str_weak(mdns_announce_op_discovery), + be_str_weak(mdns_remove_op_discovery), &be_const_str_solidified, - ( &(const binstruction[121]) { /* code */ + ( &(const binstruction[80]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA8020064, // 0001 EXBLK 0 #0067 + 0xA802003B, // 0001 EXBLK 0 #003E 0x8C0C0301, // 0002 GETMET R3 R1 K1 0x7C0C0200, // 0003 CALL R3 1 0x8C0C0702, // 0004 GETMET R3 R3 K2 @@ -4745,205 +4472,68 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ 0x00140A06, // 000F ADD R5 R5 R6 0xB81A0E00, // 0010 GETNGBL R6 K7 0x8C180D08, // 0011 GETMET R6 R6 K8 - 0x00221205, // 0012 ADD R8 K9 R5 - 0x5824000A, // 0013 LDCONST R9 K10 - 0x7C180600, // 0014 CALL R6 3 - 0xB81A0E00, // 0015 GETNGBL R6 K7 - 0x8C180D0B, // 0016 GETMET R6 R6 K11 - 0x7C180200, // 0017 CALL R6 1 - 0x8C180D0C, // 0018 GETMET R6 R6 K12 - 0x5820000D, // 0019 LDCONST R8 K13 - 0x7C180400, // 001A CALL R6 2 - 0x781A0020, // 001B JMPF R6 #003D - 0xB81A0E00, // 001C GETNGBL R6 K7 - 0x8C180D08, // 001D GETMET R6 R6 K8 - 0x60200018, // 001E GETGBL R8 G24 - 0x5824000E, // 001F LDCONST R9 K14 - 0x5828000B, // 0020 LDCONST R10 K11 - 0x5C2C0A00, // 0021 MOVE R11 R5 - 0x8830010F, // 0022 GETMBR R12 R0 K15 - 0x7C200800, // 0023 CALL R8 4 - 0x5824000A, // 0024 LDCONST R9 K10 - 0x7C180600, // 0025 CALL R6 3 - 0x8C180510, // 0026 GETMET R6 R2 K16 - 0x58200011, // 0027 LDCONST R8 K17 - 0x58240012, // 0028 LDCONST R9 K18 - 0x542A15A3, // 0029 LDINT R10 5540 - 0x4C2C0000, // 002A LDNIL R11 - 0x5C300A00, // 002B MOVE R12 R5 - 0x8834010F, // 002C GETMBR R13 R0 K15 - 0x7C180E00, // 002D CALL R6 7 - 0x8C180905, // 002E GETMET R6 R4 K5 - 0x7C180200, // 002F CALL R6 1 - 0x001A2606, // 0030 ADD R6 K19 R6 - 0xB81E0E00, // 0031 GETNGBL R7 K7 - 0x8C1C0F08, // 0032 GETMET R7 R7 K8 - 0x00262806, // 0033 ADD R9 K20 R6 - 0x5828000A, // 0034 LDCONST R10 K10 - 0x7C1C0600, // 0035 CALL R7 3 - 0x8C1C0515, // 0036 GETMET R7 R2 K21 - 0x58240011, // 0037 LDCONST R9 K17 - 0x58280012, // 0038 LDCONST R10 K18 - 0x5C2C0A00, // 0039 MOVE R11 R5 - 0x8830010F, // 003A GETMBR R12 R0 K15 - 0x5C340C00, // 003B MOVE R13 R6 - 0x7C1C0C00, // 003C CALL R7 6 - 0xB81A0E00, // 003D GETNGBL R6 K7 - 0x8C180D16, // 003E GETMET R6 R6 K22 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0C, // 0040 GETMET R6 R6 K12 - 0x5820000D, // 0041 LDCONST R8 K13 - 0x7C180400, // 0042 CALL R6 2 - 0x781A0020, // 0043 JMPF R6 #0065 - 0xB81A0E00, // 0044 GETNGBL R6 K7 - 0x8C180D08, // 0045 GETMET R6 R6 K8 - 0x60200018, // 0046 GETGBL R8 G24 - 0x5824000E, // 0047 LDCONST R9 K14 - 0x58280016, // 0048 LDCONST R10 K22 - 0x5C2C0A00, // 0049 MOVE R11 R5 - 0x88300117, // 004A GETMBR R12 R0 K23 - 0x7C200800, // 004B CALL R8 4 - 0x5824000A, // 004C LDCONST R9 K10 - 0x7C180600, // 004D CALL R6 3 - 0x8C180510, // 004E GETMET R6 R2 K16 - 0x58200011, // 004F LDCONST R8 K17 - 0x58240012, // 0050 LDCONST R9 K18 - 0x542A15A3, // 0051 LDINT R10 5540 - 0x4C2C0000, // 0052 LDNIL R11 - 0x5C300A00, // 0053 MOVE R12 R5 - 0x88340117, // 0054 GETMBR R13 R0 K23 - 0x7C180E00, // 0055 CALL R6 7 - 0x8C180905, // 0056 GETMET R6 R4 K5 - 0x7C180200, // 0057 CALL R6 1 - 0x001A2606, // 0058 ADD R6 K19 R6 - 0xB81E0E00, // 0059 GETNGBL R7 K7 - 0x8C1C0F08, // 005A GETMET R7 R7 K8 - 0x00262806, // 005B ADD R9 K20 R6 - 0x5828000A, // 005C LDCONST R10 K10 - 0x7C1C0600, // 005D CALL R7 3 - 0x8C1C0515, // 005E GETMET R7 R2 K21 - 0x58240011, // 005F LDCONST R9 K17 - 0x58280012, // 0060 LDCONST R10 K18 - 0x5C2C0A00, // 0061 MOVE R11 R5 - 0x88300117, // 0062 GETMBR R12 R0 K23 - 0x5C340C00, // 0063 MOVE R13 R6 - 0x7C1C0C00, // 0064 CALL R7 6 - 0xA8040001, // 0065 EXBLK 1 1 - 0x70020010, // 0066 JMP #0078 - 0xAC0C0002, // 0067 CATCH R3 0 2 - 0x7002000D, // 0068 JMP #0077 - 0xB8160E00, // 0069 GETNGBL R5 K7 - 0x8C140B08, // 006A GETMET R5 R5 K8 - 0x601C0008, // 006B GETGBL R7 G8 - 0x5C200600, // 006C MOVE R8 R3 - 0x7C1C0200, // 006D CALL R7 1 - 0x001E3007, // 006E ADD R7 K24 R7 - 0x001C0F19, // 006F ADD R7 R7 K25 - 0x60200008, // 0070 GETGBL R8 G8 - 0x5C240800, // 0071 MOVE R9 R4 - 0x7C200200, // 0072 CALL R8 1 - 0x001C0E08, // 0073 ADD R7 R7 R8 - 0x5820001A, // 0074 LDCONST R8 K26 - 0x7C140600, // 0075 CALL R5 3 - 0x70020000, // 0076 JMP #0078 - 0xB0080000, // 0077 RAISE 2 R0 R0 - 0x80000000, // 0078 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_random_passcode -********************************************************************/ -be_local_closure(Matter_Device_generate_random_passcode, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(134217727), - /* K5 */ be_const_int(99999998), - /* K6 */ be_nested_str_weak(PASSCODE_INVALID), - /* K7 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(generate_random_passcode), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x780E001D, // 0003 JMPF R3 #0022 - 0x8C0C0301, // 0004 GETMET R3 R1 K1 - 0x54160003, // 0005 LDINT R5 4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x58140003, // 0008 LDCONST R5 K3 - 0x541A0003, // 0009 LDINT R6 4 - 0x7C0C0600, // 000A CALL R3 3 - 0x2C0C0704, // 000B AND R3 R3 K4 - 0x5C080600, // 000C MOVE R2 R3 - 0x240C0505, // 000D GT R3 R2 K5 - 0x780E0000, // 000E JMPF R3 #0010 - 0x7001FFF1, // 000F JMP #0002 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100106, // 0011 GETMBR R4 R0 K6 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA8020005, // 0013 EXBLK 0 #001A - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x1C140404, // 0016 EQ R5 R2 R4 - 0x78160000, // 0017 JMPF R5 #0019 - 0x4C080000, // 0018 LDNIL R2 - 0x7001FFF9, // 0019 JMP #0014 - 0x580C0007, // 001A LDCONST R3 K7 - 0xAC0C0200, // 001B CATCH R3 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x4C0C0000, // 001D LDNIL R3 - 0x200C0403, // 001E NE R3 R2 R3 - 0x780E0000, // 001F JMPF R3 #0021 - 0x80040400, // 0020 RET 1 R2 - 0x7001FFDF, // 0021 JMP #0002 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + 0x7C180200, // 0012 CALL R6 1 + 0x8C180D09, // 0013 GETMET R6 R6 K9 + 0x5820000A, // 0014 LDCONST R8 K10 + 0x7C180400, // 0015 CALL R6 2 + 0x781A000E, // 0016 JMPF R6 #0026 + 0xB81A0E00, // 0017 GETNGBL R6 K7 + 0x8C180D0B, // 0018 GETMET R6 R6 K11 + 0x60200018, // 0019 GETGBL R8 G24 + 0x5824000C, // 001A LDCONST R9 K12 + 0x58280008, // 001B LDCONST R10 K8 + 0x5C2C0A00, // 001C MOVE R11 R5 + 0x7C200600, // 001D CALL R8 3 + 0x5824000D, // 001E LDCONST R9 K13 + 0x7C180600, // 001F CALL R6 3 + 0x8C18050E, // 0020 GETMET R6 R2 K14 + 0x5820000F, // 0021 LDCONST R8 K15 + 0x58240010, // 0022 LDCONST R9 K16 + 0x5C280A00, // 0023 MOVE R10 R5 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x7C180A00, // 0025 CALL R6 5 + 0xB81A0E00, // 0026 GETNGBL R6 K7 + 0x8C180D12, // 0027 GETMET R6 R6 K18 + 0x7C180200, // 0028 CALL R6 1 + 0x8C180D09, // 0029 GETMET R6 R6 K9 + 0x5820000A, // 002A LDCONST R8 K10 + 0x7C180400, // 002B CALL R6 2 + 0x781A000E, // 002C JMPF R6 #003C + 0xB81A0E00, // 002D GETNGBL R6 K7 + 0x8C180D0B, // 002E GETMET R6 R6 K11 + 0x60200018, // 002F GETGBL R8 G24 + 0x5824000C, // 0030 LDCONST R9 K12 + 0x58280012, // 0031 LDCONST R10 K18 + 0x5C2C0A00, // 0032 MOVE R11 R5 + 0x7C200600, // 0033 CALL R8 3 + 0x5824000D, // 0034 LDCONST R9 K13 + 0x7C180600, // 0035 CALL R6 3 + 0x8C18050E, // 0036 GETMET R6 R2 K14 + 0x5820000F, // 0037 LDCONST R8 K15 + 0x58240010, // 0038 LDCONST R9 K16 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x882C0113, // 003A GETMBR R11 R0 K19 + 0x7C180A00, // 003B CALL R6 5 + 0xA8040001, // 003C EXBLK 1 1 + 0x70020010, // 003D JMP #004F + 0xAC0C0002, // 003E CATCH R3 0 2 + 0x7002000D, // 003F JMP #004E + 0xB8160E00, // 0040 GETNGBL R5 K7 + 0x8C140B0B, // 0041 GETMET R5 R5 K11 + 0x601C0008, // 0042 GETGBL R7 G8 + 0x5C200600, // 0043 MOVE R8 R3 + 0x7C1C0200, // 0044 CALL R7 1 + 0x001E2807, // 0045 ADD R7 K20 R7 + 0x001C0F15, // 0046 ADD R7 R7 K21 + 0x60200008, // 0047 GETGBL R8 G8 + 0x5C240800, // 0048 MOVE R9 R4 + 0x7C200200, // 0049 CALL R8 1 + 0x001C0E08, // 004A ADD R7 R7 R8 + 0x58200016, // 004B LDCONST R8 K22 + 0x7C140600, // 004C CALL R5 3 + 0x70020000, // 004D JMP #004F + 0xB0080000, // 004E RAISE 2 R0 R0 + 0x80000000, // 004F RET 0 }) ) ); @@ -5210,11 +4800,282 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /******************************************************************** -** Solidified function: start_mdns_announce_hostnames +** Solidified function: start_operational_discovery_deferred ********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ be_nested_proto( 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5233,25 +5094,24 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K0 */ be_nested_str_weak(start), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), + /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0x68000000, // 0000 GETUPV R0 U0 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 }) ), be_nested_proto( @@ -5266,75 +5126,235 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), + /* K0 */ be_nested_str_weak(start), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), + /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[ 9]) { /* code */ 0x68000000, // 0000 GETUPV R0 U0 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 }) ), }), 1, /* has constants */ + ( &(const bvalue[44]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(get_option), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(MATTER_OPTION), + /* K5 */ be_nested_str_weak(UI), + /* K6 */ be_nested_str_weak(started), + /* K7 */ be_nested_str_weak(tick), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(plugins), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(plugins_classes), + /* K12 */ be_nested_str_weak(plugins_config_remotes), + /* K13 */ be_nested_str_weak(register_native_classes), + /* K14 */ be_nested_str_weak(vendorid), + /* K15 */ be_nested_str_weak(VENDOR_ID), + /* K16 */ be_nested_str_weak(productid), + /* K17 */ be_nested_str_weak(PRODUCT_ID), + /* K18 */ be_nested_str_weak(root_iterations), + /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K20 */ be_nested_str_weak(next_ep), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str_weak(root_salt), + /* K23 */ be_nested_str_weak(random), + /* K24 */ be_nested_str_weak(ipv4only), + /* K25 */ be_nested_str_weak(disable_bridge_mode), + /* K26 */ be_nested_str_weak(load_param), + /* K27 */ be_nested_str_weak(sessions), + /* K28 */ be_nested_str_weak(Session_Store), + /* K29 */ be_nested_str_weak(load_fabrics), + /* K30 */ be_nested_str_weak(message_handler), + /* K31 */ be_nested_str_weak(MessageHandler), + /* K32 */ be_nested_str_weak(ui), + /* K33 */ be_nested_str_weak(wifi), + /* K34 */ be_nested_str_weak(up), + /* K35 */ be_nested_str_weak(eth), + /* K36 */ be_nested_str_weak(start), + /* K37 */ be_nested_str_weak(add_rule), + /* K38 */ be_nested_str_weak(Wifi_X23Connected), + /* K39 */ be_nested_str_weak(matter_start), + /* K40 */ be_nested_str_weak(Eth_X23Connected), + /* K41 */ be_nested_str_weak(_init_basic_commissioning), + /* K42 */ be_nested_str_weak(add_driver), + /* K43 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[107]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0xB8120600, // 0003 GETNGBL R4 K3 + 0x88100904, // 0004 GETMBR R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x740A0004, // 0006 JMPT R2 #000C + 0xB80A0600, // 0007 GETNGBL R2 K3 + 0x8C080505, // 0008 GETMET R2 R2 K5 + 0x5C100000, // 0009 MOVE R4 R0 + 0x7C080400, // 000A CALL R2 2 + 0x80000400, // 000B RET 0 + 0x50080000, // 000C LDBOOL R2 0 0 + 0x90020C02, // 000D SETMBR R0 K6 R2 + 0x90020F08, // 000E SETMBR R0 K7 K8 + 0x60080012, // 000F GETGBL R2 G18 + 0x7C080000, // 0010 CALL R2 0 + 0x90021202, // 0011 SETMBR R0 K9 R2 + 0x50080000, // 0012 LDBOOL R2 0 0 + 0x90021402, // 0013 SETMBR R0 K10 R2 + 0x60080013, // 0014 GETGBL R2 G19 + 0x7C080000, // 0015 CALL R2 0 + 0x90021602, // 0016 SETMBR R0 K11 R2 + 0x60080013, // 0017 GETGBL R2 G19 + 0x7C080000, // 0018 CALL R2 0 + 0x90021802, // 0019 SETMBR R0 K12 R2 + 0x8C08010D, // 001A GETMET R2 R0 K13 + 0x7C080200, // 001B CALL R2 1 + 0x8808010F, // 001C GETMBR R2 R0 K15 + 0x90021C02, // 001D SETMBR R0 K14 R2 + 0x88080111, // 001E GETMBR R2 R0 K17 + 0x90022002, // 001F SETMBR R0 K16 R2 + 0x88080113, // 0020 GETMBR R2 R0 K19 + 0x90022402, // 0021 SETMBR R0 K18 R2 + 0x90022915, // 0022 SETMBR R0 K20 K21 + 0x8C080317, // 0023 GETMET R2 R1 K23 + 0x5412000F, // 0024 LDINT R4 16 + 0x7C080400, // 0025 CALL R2 2 + 0x90022C02, // 0026 SETMBR R0 K22 R2 + 0x50080000, // 0027 LDBOOL R2 0 0 + 0x90023002, // 0028 SETMBR R0 K24 R2 + 0x50080000, // 0029 LDBOOL R2 0 0 + 0x90023202, // 002A SETMBR R0 K25 R2 + 0x8C08011A, // 002B GETMET R2 R0 K26 + 0x7C080200, // 002C CALL R2 1 + 0xB80A0600, // 002D GETNGBL R2 K3 + 0x8C08051C, // 002E GETMET R2 R2 K28 + 0x5C100000, // 002F MOVE R4 R0 + 0x7C080400, // 0030 CALL R2 2 + 0x90023602, // 0031 SETMBR R0 K27 R2 + 0x8808011B, // 0032 GETMBR R2 R0 K27 + 0x8C08051D, // 0033 GETMET R2 R2 K29 + 0x7C080200, // 0034 CALL R2 1 + 0xB80A0600, // 0035 GETNGBL R2 K3 + 0x8C08051F, // 0036 GETMET R2 R2 K31 + 0x5C100000, // 0037 MOVE R4 R0 + 0x7C080400, // 0038 CALL R2 2 + 0x90023C02, // 0039 SETMBR R0 K30 R2 + 0xB80A0600, // 003A GETNGBL R2 K3 + 0x8C080505, // 003B GETMET R2 R2 K5 + 0x5C100000, // 003C MOVE R4 R0 + 0x7C080400, // 003D CALL R2 2 + 0x90024002, // 003E SETMBR R0 K32 R2 + 0xB80A0200, // 003F GETNGBL R2 K1 + 0x8C080521, // 0040 GETMET R2 R2 K33 + 0x7C080200, // 0041 CALL R2 1 + 0x94080522, // 0042 GETIDX R2 R2 K34 + 0x740A0004, // 0043 JMPT R2 #0049 + 0xB80A0200, // 0044 GETNGBL R2 K1 + 0x8C080523, // 0045 GETMET R2 R2 K35 + 0x7C080200, // 0046 CALL R2 1 + 0x94080522, // 0047 GETIDX R2 R2 K34 + 0x780A0001, // 0048 JMPF R2 #004B + 0x8C080124, // 0049 GETMET R2 R0 K36 + 0x7C080200, // 004A CALL R2 1 + 0xB80A0200, // 004B GETNGBL R2 K1 + 0x8C080521, // 004C GETMET R2 R2 K33 + 0x7C080200, // 004D CALL R2 1 + 0x94080522, // 004E GETIDX R2 R2 K34 + 0x740A0005, // 004F JMPT R2 #0056 + 0xB80A0200, // 0050 GETNGBL R2 K1 + 0x8C080525, // 0051 GETMET R2 R2 K37 + 0x58100026, // 0052 LDCONST R4 K38 + 0x84140000, // 0053 CLOSURE R5 P0 + 0x58180027, // 0054 LDCONST R6 K39 + 0x7C080800, // 0055 CALL R2 4 + 0xB80A0200, // 0056 GETNGBL R2 K1 + 0x8C080523, // 0057 GETMET R2 R2 K35 + 0x7C080200, // 0058 CALL R2 1 + 0x94080522, // 0059 GETIDX R2 R2 K34 + 0x740A0005, // 005A JMPT R2 #0061 + 0xB80A0200, // 005B GETNGBL R2 K1 + 0x8C080525, // 005C GETMET R2 R2 K37 + 0x58100028, // 005D LDCONST R4 K40 + 0x84140001, // 005E CLOSURE R5 P1 + 0x58180027, // 005F LDCONST R6 K39 + 0x7C080800, // 0060 CALL R2 4 + 0x8C080129, // 0061 GETMET R2 R0 K41 + 0x7C080200, // 0062 CALL R2 1 + 0xB80A0200, // 0063 GETNGBL R2 K1 + 0x8C08052A, // 0064 GETMET R2 R2 K42 + 0x5C100000, // 0065 MOVE R4 R0 + 0x7C080400, // 0066 CALL R2 2 + 0x8C08012B, // 0067 GETMET R2 R0 K43 + 0x7C080200, // 0068 CALL R2 1 + 0xA0000000, // 0069 CLOSE R0 + 0x80000000, // 006A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), }), - be_str_weak(start_mdns_announce_hostnames), + be_str_weak(attribute_updated), &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 }) ) ); @@ -5342,199 +5362,20 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics +** Solidified function: register_commands ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device_register_commands, /* name */ be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l_num -********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l_num), - &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: find_plugin_by_endpoint -********************************************************************/ -be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_nested_str_weak(get_endpoint), - /* K3 */ be_const_int(1), - }), - be_str_weak(find_plugin_by_endpoint), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C000C, // 0001 GETGBL R3 G12 - 0x88100101, // 0002 GETMBR R4 R0 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x140C0403, // 0004 LT R3 R2 R3 - 0x780E0008, // 0005 JMPF R3 #000F - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x940C0602, // 0007 GETIDX R3 R3 R2 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x7C100200, // 0009 CALL R4 1 - 0x1C100801, // 000A EQ R4 R4 R1 - 0x78120000, // 000B JMPF R4 #000D - 0x80040600, // 000C RET 1 R3 - 0x00080503, // 000D ADD R2 R2 K3 - 0x7001FFF1, // 000E JMP #0001 - 0x4C0C0000, // 000F LDNIL R3 - 0x80040600, // 0010 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 8, /* nstack */ - 3, /* argc */ + 10, /* nstack */ + 4, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ @@ -5544,63 +5385,38 @@ be_local_closure(Matter_Device__start_udp, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(MtrJoin), }), be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 }) ), }), 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), }), - be_str_weak(_start_udp), + be_str_weak(register_commands), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 }) ) ); @@ -5608,11 +5424,172 @@ be_local_closure(Matter_Device__start_udp, /* name */ /******************************************************************** -** Solidified function: signal_endpoints_changed +** Solidified function: autoconf_sensors_list ********************************************************************/ -be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ +be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ be_nested_proto( - 7, /* nstack */ + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(k2l), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(Temperature), + /* K3 */ be_nested_str_weak(_X23Temperature), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(type), + /* K6 */ be_nested_str_weak(temperature), + /* K7 */ be_nested_str_weak(filter), + /* K8 */ be_nested_str_weak(stop_iteration), + /* K9 */ be_nested_str_weak(Pressure), + /* K10 */ be_nested_str_weak(_X23Pressure), + /* K11 */ be_nested_str_weak(pressure), + /* K12 */ be_nested_str_weak(Illuminance), + /* K13 */ be_nested_str_weak(_X23Illuminance), + /* K14 */ be_nested_str_weak(illuminance), + /* K15 */ be_nested_str_weak(Humidity), + /* K16 */ be_nested_str_weak(_X23Humidity), + /* K17 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_sensors_list), + &be_const_str_solidified, + ( &(const binstruction[119]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100100, // 0003 GETMET R4 R0 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020013, // 0007 EXBLK 0 #001C + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x94140204, // 000A GETIDX R5 R1 R4 + 0x6018000F, // 000B GETGBL R6 G15 + 0x5C1C0A00, // 000C MOVE R7 R5 + 0x60200013, // 000D GETGBL R8 G19 + 0x7C180400, // 000E CALL R6 2 + 0x781A000A, // 000F JMPF R6 #001B + 0x8C180B01, // 0010 GETMET R6 R5 K1 + 0x58200002, // 0011 LDCONST R8 K2 + 0x7C180400, // 0012 CALL R6 2 + 0x781A0006, // 0013 JMPF R6 #001B + 0x00180903, // 0014 ADD R6 R4 K3 + 0x8C1C0504, // 0015 GETMET R7 R2 K4 + 0x60240013, // 0016 GETGBL R9 G19 + 0x7C240000, // 0017 CALL R9 0 + 0x98260B06, // 0018 SETIDX R9 K5 K6 + 0x98260E06, // 0019 SETIDX R9 K7 R6 + 0x7C1C0400, // 001A CALL R7 2 + 0x7001FFEB, // 001B JMP #0008 + 0x580C0008, // 001C LDCONST R3 K8 + 0xAC0C0200, // 001D CATCH R3 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x600C0010, // 001F GETGBL R3 G16 + 0x8C100100, // 0020 GETMET R4 R0 K0 + 0x5C180200, // 0021 MOVE R6 R1 + 0x7C100400, // 0022 CALL R4 2 + 0x7C0C0200, // 0023 CALL R3 1 + 0xA8020013, // 0024 EXBLK 0 #0039 + 0x5C100600, // 0025 MOVE R4 R3 + 0x7C100000, // 0026 CALL R4 0 + 0x94140204, // 0027 GETIDX R5 R1 R4 + 0x6018000F, // 0028 GETGBL R6 G15 + 0x5C1C0A00, // 0029 MOVE R7 R5 + 0x60200013, // 002A GETGBL R8 G19 + 0x7C180400, // 002B CALL R6 2 + 0x781A000A, // 002C JMPF R6 #0038 + 0x8C180B01, // 002D GETMET R6 R5 K1 + 0x58200009, // 002E LDCONST R8 K9 + 0x7C180400, // 002F CALL R6 2 + 0x781A0006, // 0030 JMPF R6 #0038 + 0x0018090A, // 0031 ADD R6 R4 K10 + 0x8C1C0504, // 0032 GETMET R7 R2 K4 + 0x60240013, // 0033 GETGBL R9 G19 + 0x7C240000, // 0034 CALL R9 0 + 0x98260B0B, // 0035 SETIDX R9 K5 K11 + 0x98260E06, // 0036 SETIDX R9 K7 R6 + 0x7C1C0400, // 0037 CALL R7 2 + 0x7001FFEB, // 0038 JMP #0025 + 0x580C0008, // 0039 LDCONST R3 K8 + 0xAC0C0200, // 003A CATCH R3 1 0 + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x600C0010, // 003C GETGBL R3 G16 + 0x8C100100, // 003D GETMET R4 R0 K0 + 0x5C180200, // 003E MOVE R6 R1 + 0x7C100400, // 003F CALL R4 2 + 0x7C0C0200, // 0040 CALL R3 1 + 0xA8020013, // 0041 EXBLK 0 #0056 + 0x5C100600, // 0042 MOVE R4 R3 + 0x7C100000, // 0043 CALL R4 0 + 0x94140204, // 0044 GETIDX R5 R1 R4 + 0x6018000F, // 0045 GETGBL R6 G15 + 0x5C1C0A00, // 0046 MOVE R7 R5 + 0x60200013, // 0047 GETGBL R8 G19 + 0x7C180400, // 0048 CALL R6 2 + 0x781A000A, // 0049 JMPF R6 #0055 + 0x8C180B01, // 004A GETMET R6 R5 K1 + 0x5820000C, // 004B LDCONST R8 K12 + 0x7C180400, // 004C CALL R6 2 + 0x781A0006, // 004D JMPF R6 #0055 + 0x0018090D, // 004E ADD R6 R4 K13 + 0x8C1C0504, // 004F GETMET R7 R2 K4 + 0x60240013, // 0050 GETGBL R9 G19 + 0x7C240000, // 0051 CALL R9 0 + 0x98260B0E, // 0052 SETIDX R9 K5 K14 + 0x98260E06, // 0053 SETIDX R9 K7 R6 + 0x7C1C0400, // 0054 CALL R7 2 + 0x7001FFEB, // 0055 JMP #0042 + 0x580C0008, // 0056 LDCONST R3 K8 + 0xAC0C0200, // 0057 CATCH R3 1 0 + 0xB0080000, // 0058 RAISE 2 R0 R0 + 0x600C0010, // 0059 GETGBL R3 G16 + 0x8C100100, // 005A GETMET R4 R0 K0 + 0x5C180200, // 005B MOVE R6 R1 + 0x7C100400, // 005C CALL R4 2 + 0x7C0C0200, // 005D CALL R3 1 + 0xA8020013, // 005E EXBLK 0 #0073 + 0x5C100600, // 005F MOVE R4 R3 + 0x7C100000, // 0060 CALL R4 0 + 0x94140204, // 0061 GETIDX R5 R1 R4 + 0x6018000F, // 0062 GETGBL R6 G15 + 0x5C1C0A00, // 0063 MOVE R7 R5 + 0x60200013, // 0064 GETGBL R8 G19 + 0x7C180400, // 0065 CALL R6 2 + 0x781A000A, // 0066 JMPF R6 #0072 + 0x8C180B01, // 0067 GETMET R6 R5 K1 + 0x5820000F, // 0068 LDCONST R8 K15 + 0x7C180400, // 0069 CALL R6 2 + 0x781A0006, // 006A JMPF R6 #0072 + 0x00180910, // 006B ADD R6 R4 K16 + 0x8C1C0504, // 006C GETMET R7 R2 K4 + 0x60240013, // 006D GETGBL R9 G19 + 0x7C240000, // 006E CALL R9 0 + 0x98260B11, // 006F SETIDX R9 K5 K17 + 0x98260E06, // 0070 SETIDX R9 K7 R6 + 0x7C1C0400, // 0071 CALL R7 2 + 0x7001FFEB, // 0072 JMP #005F + 0x580C0008, // 0073 LDCONST R3 K8 + 0xAC0C0200, // 0074 CATCH R3 1 0 + 0xB0080000, // 0075 RAISE 2 R0 R0 + 0x80040400, // 0076 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device, /* name */ + be_nested_proto( + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5620,27 +5597,67 @@ be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(3), + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(plugins_config), + /* K5 */ be_nested_str_weak(autoconf_device_map), + /* K6 */ be_nested_str_weak(plugins_config_remotes), + /* K7 */ be_nested_str_weak(adjust_next_ep), + /* K8 */ be_nested_str_weak(tasmota), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20autoconfig_X20_X3D_X20), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(_instantiate_plugins_from_config), + /* K13 */ be_nested_str_weak(sessions), + /* K14 */ be_nested_str_weak(count_active_fabrics), + /* K15 */ be_nested_str_weak(save_param), }), - be_str_weak(signal_endpoints_changed), + be_str_weak(autoconf_device), &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x5412001C, // 0002 LDINT R4 29 - 0x58140002, // 0003 LDCONST R5 K2 - 0x50180000, // 0004 LDBOOL R6 0 0 - 0x7C040A00, // 0005 CALL R1 5 - 0x8C040100, // 0006 GETMET R1 R0 K0 - 0x540EFEFF, // 0007 LDINT R3 65280 - 0x5412001C, // 0008 LDINT R4 29 - 0x58140002, // 0009 LDCONST R5 K2 - 0x50180000, // 000A LDBOOL R6 0 0 - 0x7C040A00, // 000B CALL R1 5 - 0x80000000, // 000C RET 0 + ( &(const binstruction[40]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x24080502, // 0004 GT R2 R2 K2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x80000400, // 0006 RET 0 + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x740A000F, // 0008 JMPT R2 #0019 + 0x8C080105, // 0009 GETMET R2 R0 K5 + 0x7C080200, // 000A CALL R2 1 + 0x90020802, // 000B SETMBR R0 K4 R2 + 0x60080013, // 000C GETGBL R2 G19 + 0x7C080000, // 000D CALL R2 0 + 0x90020C02, // 000E SETMBR R0 K6 R2 + 0x8C080107, // 000F GETMET R2 R0 K7 + 0x7C080200, // 0010 CALL R2 1 + 0xB80A1000, // 0011 GETNGBL R2 K8 + 0x8C080509, // 0012 GETMET R2 R2 K9 + 0x60100008, // 0013 GETGBL R4 G8 + 0x88140104, // 0014 GETMBR R5 R0 K4 + 0x7C100200, // 0015 CALL R4 1 + 0x00121404, // 0016 ADD R4 K10 R4 + 0x5814000B, // 0017 LDCONST R5 K11 + 0x7C080600, // 0018 CALL R2 3 + 0x8C08010C, // 0019 GETMET R2 R0 K12 + 0x88100104, // 001A GETMBR R4 R0 K4 + 0x7C080400, // 001B CALL R2 2 + 0x88080103, // 001C GETMBR R2 R0 K3 + 0x740A0008, // 001D JMPT R2 #0027 + 0x8808010D, // 001E GETMBR R2 R0 K13 + 0x8C08050E, // 001F GETMET R2 R2 K14 + 0x7C080200, // 0020 CALL R2 1 + 0x24080502, // 0021 GT R2 R2 K2 + 0x780A0003, // 0022 JMPF R2 #0027 + 0x50080200, // 0023 LDBOOL R2 1 0 + 0x90020602, // 0024 SETMBR R0 K3 R2 + 0x8C08010F, // 0025 GETMET R2 R0 K15 + 0x7C080200, // 0026 CALL R2 1 + 0x80000000, // 0027 RET 0 }) ) ); @@ -5651,12 +5668,32 @@ be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 35, + 36, NULL, - be_nested_map(107, + be_nested_map(108, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(PASSCODE_INVALID, 91), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(is_commissioning_open, 0), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(root_w0, -1), be_const_var(34) }, + { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(18) }, + { be_const_key_weak(PASE_TIMEOUT, 57), be_const_int(600) }, + { be_const_key_weak(init, 96), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(start_basic_commissioning, 87), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(vendorid, 1), be_const_var(22) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(24) }, + { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, + { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(message_handler, -1), be_const_var(7) }, + { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(FILENAME, 94), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(PASSCODE_INVALID, 36), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5672,111 +5709,92 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(signal_endpoints_changed, 56), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, - { be_const_key_weak(register_native_classes, 65), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(21) }, - { be_const_key_weak(productid, -1), be_const_var(23) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(started, 69), be_const_var(0) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(27) }, - { be_const_key_weak(root_w0, 98), be_const_var(33) }, - { be_const_key_weak(mdns_remove_PASE, 27), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(ui, -1), be_const_var(9) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(15) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(19) }, - { be_const_key_weak(bridge_remove_endpoint, 15), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, - { be_const_key_weak(save_before_restart, 5), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(vendorid, -1), be_const_var(22) }, - { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(register_commands, 16), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(VENDOR_ID, 106), be_const_int(65521) }, - { be_const_key_weak(plugins_config_remotes, -1), be_const_var(5) }, - { be_const_key_weak(commissioning_iterations, -1), be_const_var(12) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(plugins_config, 93), be_const_var(4) }, - { be_const_key_weak(commissioning_admin_fabric, 57), be_const_var(17) }, - { be_const_key_weak(mdns_pase_wifi, 10), be_const_var(25) }, - { be_const_key_weak(root_passcode, -1), be_const_var(28) }, - { be_const_key_weak(register_http_remote, 99), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(compute_qrcode_content, 20), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, - { be_const_key_weak(update_remotes_info, -1), be_const_closure(Matter_Device_update_remotes_info_closure) }, - { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, - { be_const_key_weak(next_ep, -1), be_const_var(30) }, - { be_const_key_weak(message_handler, -1), be_const_var(7) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(hostname_wifi, 36), be_const_var(20) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(stop, 60), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(generate_random_passcode, 52), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(MtrJoin, 39), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(ipv4only, 1), be_const_var(29) }, - { be_const_key_weak(stop_basic_commissioning, 41), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(14) }, - { be_const_key_weak(commissioning_discriminator, 44), be_const_var(13) }, - { be_const_key_weak(sessions, -1), be_const_var(8) }, - { be_const_key_weak(start_commissioning_complete_deferred, 49), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(root_L, 23), be_const_var(34) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(tick, 61), be_const_var(10) }, - { be_const_key_weak(register_plugin_class, 87), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(commissioning_L, 68), be_const_var(16) }, + { be_const_key_weak(invoke_request, 12), be_const_closure(Matter_Device_invoke_request_closure) }, { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(conf_to_log, 74), be_const_static_closure(Matter_Device_conf_to_log_closure) }, - { be_const_key_weak(udp_server, -1), be_const_var(6) }, - { be_const_key_weak(get_plugin_remote_info, -1), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(msg_send, 67), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(every_250ms, 64), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(11) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(PASE_TIMEOUT, 32), be_const_int(600) }, - { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(_instantiate_plugins_from_config, 55), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, - { be_const_key_weak(every_50ms, 53), be_const_closure(Matter_Device_every_50ms_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(24) }, - { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(http_remotes, -1), be_const_var(26) }, - { be_const_key_weak(autoconf_device, 34), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(root_salt, 58), be_const_var(32) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, 22), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, - { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(plugins, 100), be_const_var(1) }, + { be_const_key_weak(msg_received, 56), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(commissioning_open, 19), be_const_var(11) }, + { be_const_key_weak(plugins_config_remotes, 104), be_const_var(5) }, { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(_trigger_read_sensors, 11), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(root_iterations, -1), be_const_var(31) }, - { be_const_key_weak(commissioning_instance_wifi, 8), be_const_var(18) }, - { be_const_key_weak(init, 6), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(start_root_basic_commissioning, 2), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(tick, -1), be_const_var(10) }, + { be_const_key_weak(register_plugin_class, 50), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(root_passcode, 13), be_const_var(28) }, + { be_const_key_weak(compute_qrcode_content, 99), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, + { be_const_key_weak(update_remotes_info, -1), be_const_closure(Matter_Device_update_remotes_info_closure) }, + { be_const_key_weak(compute_manual_pairing_code, 63), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(get_plugin_remote_info, 49), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, + { be_const_key_weak(hostname_wifi, -1), be_const_var(20) }, + { be_const_key_weak(disable_bridge_mode, -1), be_const_var(30) }, + { be_const_key_weak(MtrJoin, 37), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(start, 18), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(commissioning_admin_fabric, 66), be_const_var(17) }, + { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, + { be_const_key_weak(commissioning_iterations, 101), be_const_var(12) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 11), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(productid, -1), be_const_var(23) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(udp_server, -1), be_const_var(6) }, + { be_const_key_weak(sessions, -1), be_const_var(8) }, + { be_const_key_weak(ipv4only, 85), be_const_var(29) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(started, 26), be_const_var(0) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(mdns_pase_wifi, 60), be_const_var(25) }, + { be_const_key_weak(_mdns_announce_hostname, 90), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(stop, 52), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(stop_basic_commissioning, 95), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(remove_fabric, 31), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(19) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(27) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(commissioning_w0, 68), be_const_var(15) }, + { be_const_key_weak(get_plugin_class_arg, 69), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(conf_to_log, -1), be_const_static_closure(Matter_Device_conf_to_log_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, 71), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, + { be_const_key_weak(root_iterations, 72), be_const_var(32) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(16) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(21) }, + { be_const_key_weak(http_remotes, -1), be_const_var(26) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(ui, 64), be_const_var(9) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(next_ep, -1), be_const_var(31) }, + { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(33) }, + { be_const_key_weak(register_http_remote, 55), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(commissioning_salt, -1), be_const_var(14) }, + { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(commissioning_discriminator, 6), be_const_var(13) }, + { be_const_key_weak(every_250ms, 44), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, + { be_const_key_weak(bridge_remove_endpoint, 97), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, 98), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(save_before_restart, 9), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(process_attribute_expansion, 7), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(root_L, -1), be_const_var(35) }, + { be_const_key_weak(register_native_classes, 3), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(plugins_config, -1), be_const_var(4) }, + { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index 2b3f5b858..77716f333 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -210,7 +210,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ + ( &(const bvalue[37]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), @@ -231,25 +231,27 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ /* K17 */ be_nested_str_weak(NON_BRIDGE_VENDOR), /* K18 */ be_nested_str_weak(find), /* K19 */ be_nested_str_weak(get_admin_vendor), - /* K20 */ be_nested_str_weak(read_attribute), - /* K21 */ be_nested_str_weak(string), - /* K22 */ be_nested_str_weak(UTF1), - /* K23 */ be_nested_str_weak(tasmota), - /* K24 */ be_nested_str_weak(cmd), - /* K25 */ be_nested_str_weak(DeviceName), - /* K26 */ be_nested_str_weak(get_name), - /* K27 */ be_nested_str_weak(Status_X202), - /* K28 */ be_nested_str_weak(StatusFWR), - /* K29 */ be_nested_str_weak(Version), - /* K30 */ be_nested_str_weak(_X28), - /* K31 */ be_nested_str_weak(wifi), - /* K32 */ be_nested_str_weak(mac), - /* K33 */ be_nested_str_weak(), - /* K34 */ be_nested_str_weak(BOOL), + /* K20 */ be_nested_str_weak(device), + /* K21 */ be_nested_str_weak(disable_bridge_mode), + /* K22 */ be_nested_str_weak(read_attribute), + /* K23 */ be_nested_str_weak(string), + /* K24 */ be_nested_str_weak(UTF1), + /* K25 */ be_nested_str_weak(tasmota), + /* K26 */ be_nested_str_weak(cmd), + /* K27 */ be_nested_str_weak(DeviceName), + /* K28 */ be_nested_str_weak(get_name), + /* K29 */ be_nested_str_weak(Status_X202), + /* K30 */ be_nested_str_weak(StatusFWR), + /* K31 */ be_nested_str_weak(Version), + /* K32 */ be_nested_str_weak(_X28), + /* K33 */ be_nested_str_weak(wifi), + /* K34 */ be_nested_str_weak(mac), + /* K35 */ be_nested_str_weak(), + /* K36 */ be_nested_str_weak(BOOL), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[258]) { /* code */ + ( &(const binstruction[261]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x88100502, // 0002 GETMBR R4 R2 K2 @@ -289,7 +291,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x54260003, // 0024 LDINT R9 4 0x7C180600, // 0025 CALL R6 3 0x80040C00, // 0026 RET 1 R6 - 0x700200D8, // 0027 JMP #0101 + 0x700200DB, // 0027 JMP #0104 0x541A0003, // 0028 LDINT R6 4 0x1C180806, // 0029 EQ R6 R4 R6 0x781A0016, // 002A JMPF R6 #0042 @@ -315,7 +317,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x54260003, // 003E LDINT R9 4 0x7C180600, // 003F CALL R6 3 0x80040C00, // 0040 RET 1 R6 - 0x700200BE, // 0041 JMP #0101 + 0x700200C1, // 0041 JMP #0104 0x541A0004, // 0042 LDINT R6 5 0x1C180806, // 0043 EQ R6 R4 R6 0x781A0011, // 0044 JMPF R6 #0057 @@ -336,12 +338,12 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x54260003, // 0053 LDINT R9 4 0x7C180600, // 0054 CALL R6 3 0x80040C00, // 0055 RET 1 R6 - 0x700200A9, // 0056 JMP #0101 + 0x700200AC, // 0056 JMP #0104 0x541A001C, // 0057 LDINT R6 29 0x1C180806, // 0058 EQ R6 R4 R6 - 0x781A003A, // 0059 JMPF R6 #0095 + 0x781A003D, // 0059 JMPF R6 #0098 0x1C180B05, // 005A EQ R6 R5 K5 - 0x781A002F, // 005B JMPF R6 #008C + 0x781A0032, // 005B JMPF R6 #008F 0x8C18070B, // 005C GETMET R6 R3 K11 0x7C180200, // 005D CALL R6 1 0x881C010C, // 005E GETMBR R7 R0 K12 @@ -375,139 +377,142 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ 0x7C200400, // 007A CALL R8 2 0x4C240000, // 007B LDNIL R9 0x1C201009, // 007C EQ R8 R8 R9 - 0x7822000B, // 007D JMPF R8 #008A - 0x8C200D0E, // 007E GETMET R8 R6 K14 - 0x7C200200, // 007F CALL R8 1 - 0x8C24110F, // 0080 GETMET R9 R8 K15 - 0x582C0005, // 0081 LDCONST R11 K5 - 0x88300707, // 0082 GETMBR R12 R3 K7 - 0x54360012, // 0083 LDINT R13 19 - 0x7C240800, // 0084 CALL R9 4 - 0x8C24110F, // 0085 GETMET R9 R8 K15 - 0x582C0008, // 0086 LDCONST R11 K8 - 0x88300707, // 0087 GETMBR R12 R3 K7 - 0x58340008, // 0088 LDCONST R13 K8 - 0x7C240800, // 0089 CALL R9 4 - 0x80040C00, // 008A RET 1 R6 - 0x70020007, // 008B JMP #0094 - 0x60180003, // 008C GETGBL R6 G3 - 0x5C1C0000, // 008D MOVE R7 R0 - 0x7C180200, // 008E CALL R6 1 - 0x8C180D14, // 008F GETMET R6 R6 K20 - 0x5C200200, // 0090 MOVE R8 R1 - 0x5C240400, // 0091 MOVE R9 R2 - 0x7C180600, // 0092 CALL R6 3 - 0x80040C00, // 0093 RET 1 R6 - 0x7002006B, // 0094 JMP #0101 - 0x541A0038, // 0095 LDINT R6 57 - 0x1C180806, // 0096 EQ R6 R4 R6 - 0x781A0060, // 0097 JMPF R6 #00F9 - 0xA41A2A00, // 0098 IMPORT R6 K21 - 0x1C1C0B04, // 0099 EQ R7 R5 K4 - 0x781E000A, // 009A JMPF R7 #00A6 - 0x8C1C0706, // 009B GETMET R7 R3 K6 - 0x88240716, // 009C GETMBR R9 R3 K22 - 0xB82A2E00, // 009D GETNGBL R10 K23 - 0x8C281518, // 009E GETMET R10 R10 K24 - 0x58300019, // 009F LDCONST R12 K25 - 0x50340200, // 00A0 LDBOOL R13 1 0 - 0x7C280600, // 00A1 CALL R10 3 - 0x94281519, // 00A2 GETIDX R10 R10 K25 - 0x7C1C0600, // 00A3 CALL R7 3 - 0x80040E00, // 00A4 RET 1 R7 - 0x70020051, // 00A5 JMP #00F8 - 0x541E0004, // 00A6 LDINT R7 5 - 0x1C1C0A07, // 00A7 EQ R7 R5 R7 - 0x781E0006, // 00A8 JMPF R7 #00B0 - 0x8C1C0706, // 00A9 GETMET R7 R3 K6 - 0x88240716, // 00AA GETMBR R9 R3 K22 - 0x8C28011A, // 00AB GETMET R10 R0 K26 - 0x7C280200, // 00AC CALL R10 1 - 0x7C1C0600, // 00AD CALL R7 3 - 0x80040E00, // 00AE RET 1 R7 - 0x70020047, // 00AF JMP #00F8 - 0x541E0009, // 00B0 LDINT R7 10 - 0x1C1C0A07, // 00B1 EQ R7 R5 R7 - 0x781E0015, // 00B2 JMPF R7 #00C9 - 0xB81E2E00, // 00B3 GETNGBL R7 K23 - 0x8C1C0F18, // 00B4 GETMET R7 R7 K24 - 0x5824001B, // 00B5 LDCONST R9 K27 - 0x50280200, // 00B6 LDBOOL R10 1 0 - 0x7C1C0600, // 00B7 CALL R7 3 - 0x941C0F1C, // 00B8 GETIDX R7 R7 K28 - 0x941C0F1D, // 00B9 GETIDX R7 R7 K29 - 0x8C200D12, // 00BA GETMET R8 R6 K18 - 0x5C280E00, // 00BB MOVE R10 R7 - 0x582C001E, // 00BC LDCONST R11 K30 - 0x7C200600, // 00BD CALL R8 3 - 0x24241105, // 00BE GT R9 R8 K5 - 0x78260002, // 00BF JMPF R9 #00C3 - 0x04241108, // 00C0 SUB R9 R8 K8 - 0x40260A09, // 00C1 CONNECT R9 K5 R9 - 0x941C0E09, // 00C2 GETIDX R7 R7 R9 - 0x8C240706, // 00C3 GETMET R9 R3 K6 - 0x882C0716, // 00C4 GETMBR R11 R3 K22 - 0x5C300E00, // 00C5 MOVE R12 R7 - 0x7C240600, // 00C6 CALL R9 3 - 0x80041200, // 00C7 RET 1 R9 - 0x7002002E, // 00C8 JMP #00F8 - 0x541E000E, // 00C9 LDINT R7 15 - 0x1C1C0A07, // 00CA EQ R7 R5 R7 - 0x781E000B, // 00CB JMPF R7 #00D8 - 0x8C1C0706, // 00CC GETMET R7 R3 K6 - 0x88240716, // 00CD GETMBR R9 R3 K22 - 0xB82A2E00, // 00CE GETNGBL R10 K23 - 0x8C28151F, // 00CF GETMET R10 R10 K31 - 0x7C280200, // 00D0 CALL R10 1 - 0x8C281512, // 00D1 GETMET R10 R10 K18 - 0x58300020, // 00D2 LDCONST R12 K32 - 0x58340021, // 00D3 LDCONST R13 K33 - 0x7C280600, // 00D4 CALL R10 3 - 0x7C1C0600, // 00D5 CALL R7 3 - 0x80040E00, // 00D6 RET 1 R7 - 0x7002001F, // 00D7 JMP #00F8 - 0x541E0010, // 00D8 LDINT R7 17 - 0x1C1C0A07, // 00D9 EQ R7 R5 R7 - 0x781E0005, // 00DA JMPF R7 #00E1 - 0x8C1C0706, // 00DB GETMET R7 R3 K6 - 0x88240722, // 00DC GETMBR R9 R3 K34 - 0x58280008, // 00DD LDCONST R10 K8 - 0x7C1C0600, // 00DE CALL R7 3 - 0x80040E00, // 00DF RET 1 R7 - 0x70020016, // 00E0 JMP #00F8 - 0x541E0011, // 00E1 LDINT R7 18 - 0x1C1C0A07, // 00E2 EQ R7 R5 R7 - 0x781E000B, // 00E3 JMPF R7 #00F0 - 0x8C1C0706, // 00E4 GETMET R7 R3 K6 - 0x88240716, // 00E5 GETMBR R9 R3 K22 - 0xB82A2E00, // 00E6 GETNGBL R10 K23 - 0x8C28151F, // 00E7 GETMET R10 R10 K31 - 0x7C280200, // 00E8 CALL R10 1 - 0x8C281512, // 00E9 GETMET R10 R10 K18 - 0x58300020, // 00EA LDCONST R12 K32 - 0x58340021, // 00EB LDCONST R13 K33 - 0x7C280600, // 00EC CALL R10 3 - 0x7C1C0600, // 00ED CALL R7 3 - 0x80040E00, // 00EE RET 1 R7 - 0x70020007, // 00EF JMP #00F8 - 0x601C0003, // 00F0 GETGBL R7 G3 - 0x5C200000, // 00F1 MOVE R8 R0 - 0x7C1C0200, // 00F2 CALL R7 1 - 0x8C1C0F14, // 00F3 GETMET R7 R7 K20 - 0x5C240200, // 00F4 MOVE R9 R1 - 0x5C280400, // 00F5 MOVE R10 R2 - 0x7C1C0600, // 00F6 CALL R7 3 - 0x80040E00, // 00F7 RET 1 R7 - 0x70020007, // 00F8 JMP #0101 - 0x60180003, // 00F9 GETGBL R6 G3 - 0x5C1C0000, // 00FA MOVE R7 R0 - 0x7C180200, // 00FB CALL R6 1 - 0x8C180D14, // 00FC GETMET R6 R6 K20 - 0x5C200200, // 00FD MOVE R8 R1 - 0x5C240400, // 00FE MOVE R9 R2 - 0x7C180600, // 00FF CALL R6 3 - 0x80040C00, // 0100 RET 1 R6 - 0x80000000, // 0101 RET 0 + 0x7822000E, // 007D JMPF R8 #008D + 0x88200114, // 007E GETMBR R8 R0 K20 + 0x88201115, // 007F GETMBR R8 R8 K21 + 0x7422000B, // 0080 JMPT R8 #008D + 0x8C200D0E, // 0081 GETMET R8 R6 K14 + 0x7C200200, // 0082 CALL R8 1 + 0x8C24110F, // 0083 GETMET R9 R8 K15 + 0x582C0005, // 0084 LDCONST R11 K5 + 0x88300707, // 0085 GETMBR R12 R3 K7 + 0x54360012, // 0086 LDINT R13 19 + 0x7C240800, // 0087 CALL R9 4 + 0x8C24110F, // 0088 GETMET R9 R8 K15 + 0x582C0008, // 0089 LDCONST R11 K8 + 0x88300707, // 008A GETMBR R12 R3 K7 + 0x58340008, // 008B LDCONST R13 K8 + 0x7C240800, // 008C CALL R9 4 + 0x80040C00, // 008D RET 1 R6 + 0x70020007, // 008E JMP #0097 + 0x60180003, // 008F GETGBL R6 G3 + 0x5C1C0000, // 0090 MOVE R7 R0 + 0x7C180200, // 0091 CALL R6 1 + 0x8C180D16, // 0092 GETMET R6 R6 K22 + 0x5C200200, // 0093 MOVE R8 R1 + 0x5C240400, // 0094 MOVE R9 R2 + 0x7C180600, // 0095 CALL R6 3 + 0x80040C00, // 0096 RET 1 R6 + 0x7002006B, // 0097 JMP #0104 + 0x541A0038, // 0098 LDINT R6 57 + 0x1C180806, // 0099 EQ R6 R4 R6 + 0x781A0060, // 009A JMPF R6 #00FC + 0xA41A2E00, // 009B IMPORT R6 K23 + 0x1C1C0B04, // 009C EQ R7 R5 K4 + 0x781E000A, // 009D JMPF R7 #00A9 + 0x8C1C0706, // 009E GETMET R7 R3 K6 + 0x88240718, // 009F GETMBR R9 R3 K24 + 0xB82A3200, // 00A0 GETNGBL R10 K25 + 0x8C28151A, // 00A1 GETMET R10 R10 K26 + 0x5830001B, // 00A2 LDCONST R12 K27 + 0x50340200, // 00A3 LDBOOL R13 1 0 + 0x7C280600, // 00A4 CALL R10 3 + 0x9428151B, // 00A5 GETIDX R10 R10 K27 + 0x7C1C0600, // 00A6 CALL R7 3 + 0x80040E00, // 00A7 RET 1 R7 + 0x70020051, // 00A8 JMP #00FB + 0x541E0004, // 00A9 LDINT R7 5 + 0x1C1C0A07, // 00AA EQ R7 R5 R7 + 0x781E0006, // 00AB JMPF R7 #00B3 + 0x8C1C0706, // 00AC GETMET R7 R3 K6 + 0x88240718, // 00AD GETMBR R9 R3 K24 + 0x8C28011C, // 00AE GETMET R10 R0 K28 + 0x7C280200, // 00AF CALL R10 1 + 0x7C1C0600, // 00B0 CALL R7 3 + 0x80040E00, // 00B1 RET 1 R7 + 0x70020047, // 00B2 JMP #00FB + 0x541E0009, // 00B3 LDINT R7 10 + 0x1C1C0A07, // 00B4 EQ R7 R5 R7 + 0x781E0015, // 00B5 JMPF R7 #00CC + 0xB81E3200, // 00B6 GETNGBL R7 K25 + 0x8C1C0F1A, // 00B7 GETMET R7 R7 K26 + 0x5824001D, // 00B8 LDCONST R9 K29 + 0x50280200, // 00B9 LDBOOL R10 1 0 + 0x7C1C0600, // 00BA CALL R7 3 + 0x941C0F1E, // 00BB GETIDX R7 R7 K30 + 0x941C0F1F, // 00BC GETIDX R7 R7 K31 + 0x8C200D12, // 00BD GETMET R8 R6 K18 + 0x5C280E00, // 00BE MOVE R10 R7 + 0x582C0020, // 00BF LDCONST R11 K32 + 0x7C200600, // 00C0 CALL R8 3 + 0x24241105, // 00C1 GT R9 R8 K5 + 0x78260002, // 00C2 JMPF R9 #00C6 + 0x04241108, // 00C3 SUB R9 R8 K8 + 0x40260A09, // 00C4 CONNECT R9 K5 R9 + 0x941C0E09, // 00C5 GETIDX R7 R7 R9 + 0x8C240706, // 00C6 GETMET R9 R3 K6 + 0x882C0718, // 00C7 GETMBR R11 R3 K24 + 0x5C300E00, // 00C8 MOVE R12 R7 + 0x7C240600, // 00C9 CALL R9 3 + 0x80041200, // 00CA RET 1 R9 + 0x7002002E, // 00CB JMP #00FB + 0x541E000E, // 00CC LDINT R7 15 + 0x1C1C0A07, // 00CD EQ R7 R5 R7 + 0x781E000B, // 00CE JMPF R7 #00DB + 0x8C1C0706, // 00CF GETMET R7 R3 K6 + 0x88240718, // 00D0 GETMBR R9 R3 K24 + 0xB82A3200, // 00D1 GETNGBL R10 K25 + 0x8C281521, // 00D2 GETMET R10 R10 K33 + 0x7C280200, // 00D3 CALL R10 1 + 0x8C281512, // 00D4 GETMET R10 R10 K18 + 0x58300022, // 00D5 LDCONST R12 K34 + 0x58340023, // 00D6 LDCONST R13 K35 + 0x7C280600, // 00D7 CALL R10 3 + 0x7C1C0600, // 00D8 CALL R7 3 + 0x80040E00, // 00D9 RET 1 R7 + 0x7002001F, // 00DA JMP #00FB + 0x541E0010, // 00DB LDINT R7 17 + 0x1C1C0A07, // 00DC EQ R7 R5 R7 + 0x781E0005, // 00DD JMPF R7 #00E4 + 0x8C1C0706, // 00DE GETMET R7 R3 K6 + 0x88240724, // 00DF GETMBR R9 R3 K36 + 0x58280008, // 00E0 LDCONST R10 K8 + 0x7C1C0600, // 00E1 CALL R7 3 + 0x80040E00, // 00E2 RET 1 R7 + 0x70020016, // 00E3 JMP #00FB + 0x541E0011, // 00E4 LDINT R7 18 + 0x1C1C0A07, // 00E5 EQ R7 R5 R7 + 0x781E000B, // 00E6 JMPF R7 #00F3 + 0x8C1C0706, // 00E7 GETMET R7 R3 K6 + 0x88240718, // 00E8 GETMBR R9 R3 K24 + 0xB82A3200, // 00E9 GETNGBL R10 K25 + 0x8C281521, // 00EA GETMET R10 R10 K33 + 0x7C280200, // 00EB CALL R10 1 + 0x8C281512, // 00EC GETMET R10 R10 K18 + 0x58300022, // 00ED LDCONST R12 K34 + 0x58340023, // 00EE LDCONST R13 K35 + 0x7C280600, // 00EF CALL R10 3 + 0x7C1C0600, // 00F0 CALL R7 3 + 0x80040E00, // 00F1 RET 1 R7 + 0x70020007, // 00F2 JMP #00FB + 0x601C0003, // 00F3 GETGBL R7 G3 + 0x5C200000, // 00F4 MOVE R8 R0 + 0x7C1C0200, // 00F5 CALL R7 1 + 0x8C1C0F16, // 00F6 GETMET R7 R7 K22 + 0x5C240200, // 00F7 MOVE R9 R1 + 0x5C280400, // 00F8 MOVE R10 R2 + 0x7C1C0600, // 00F9 CALL R7 3 + 0x80040E00, // 00FA RET 1 R7 + 0x70020007, // 00FB JMP #0104 + 0x60180003, // 00FC GETGBL R6 G3 + 0x5C1C0000, // 00FD MOVE R7 R0 + 0x7C180200, // 00FE CALL R6 1 + 0x8C180D16, // 00FF GETMET R6 R6 K22 + 0x5C200200, // 0100 MOVE R8 R1 + 0x5C240400, // 0101 MOVE R9 R2 + 0x7C180600, // 0102 CALL R6 3 + 0x80040C00, // 0103 RET 1 R6 + 0x80000000, // 0104 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index 2dde4ed2b..de3dbd022 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -2095,7 +2095,7 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_passcode_form, /* name */ be_nested_proto( - 8, /* nstack */ + 9, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2103,7 +2103,7 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(content_send), /* K2 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Advanced_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), @@ -2118,11 +2118,13 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ /* K11 */ be_nested_str_weak(_X20checked), /* K12 */ be_nested_str_weak(), /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(disable_bridge_mode), + /* K15 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27nobridge_X27_X25s_X3EDisable_X20bridge_X20mode_X20_X28not_X20recommended_X29_X3C_X2Fp_X3E), + /* K16 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_passcode_form), &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ + ( &(const binstruction[52]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 @@ -2159,10 +2161,22 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ 0x5C1C0400, // 0021 MOVE R7 R2 0x7C140400, // 0022 CALL R5 2 0x7C0C0400, // 0023 CALL R3 2 - 0x8C0C0301, // 0024 GETMET R3 R1 K1 - 0x5814000E, // 0025 LDCONST R5 K14 - 0x7C0C0400, // 0026 CALL R3 2 - 0x80000000, // 0027 RET 0 + 0x880C0105, // 0024 GETMBR R3 R0 K5 + 0x880C070E, // 0025 GETMBR R3 R3 K14 + 0x780E0001, // 0026 JMPF R3 #0029 + 0x580C000B, // 0027 LDCONST R3 K11 + 0x70020000, // 0028 JMP #002A + 0x580C000C, // 0029 LDCONST R3 K12 + 0x8C100301, // 002A GETMET R4 R1 K1 + 0x60180018, // 002B GETGBL R6 G24 + 0x581C000F, // 002C LDCONST R7 K15 + 0x5C200600, // 002D MOVE R8 R3 + 0x7C180400, // 002E CALL R6 2 + 0x7C100400, // 002F CALL R4 2 + 0x8C100301, // 0030 GETMET R4 R1 K1 + 0x58180010, // 0031 LDCONST R6 K16 + 0x7C100400, // 0032 CALL R4 2 + 0x80000000, // 0033 RET 0 }) ) ); @@ -2182,7 +2196,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[99]) { /* constants */ + ( &(const bvalue[101]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), @@ -2208,84 +2222,86 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ /* K22 */ be_nested_str_weak(ipv4only), /* K23 */ be_nested_str_weak(ipv4), /* K24 */ be_nested_str_weak(on), - /* K25 */ be_nested_str_weak(save_param), - /* K26 */ be_nested_str_weak(redirect), - /* K27 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K28 */ be_nested_str_weak(save), - /* K29 */ be_nested_str_weak(menable), - /* K30 */ be_nested_str_weak(comm), - /* K31 */ be_nested_str_weak(matter_enabled), - /* K32 */ be_nested_str_weak(enable), - /* K33 */ be_nested_str_weak(cmd), - /* K34 */ be_nested_str_weak(SetOption), - /* K35 */ be_nested_str_weak(matter), - /* K36 */ be_nested_str_weak(MATTER_OPTION), - /* K37 */ be_nested_str_weak(_X201), - /* K38 */ be_nested_str_weak(disable), - /* K39 */ be_nested_str_weak(_X200), - /* K40 */ be_nested_str_weak(commissioning_open), - /* K41 */ be_nested_str_weak(start_root_basic_commissioning), - /* K42 */ be_nested_str_weak(stop_basic_commissioning), - /* K43 */ be_nested_str_weak(_X2F), - /* K44 */ be_nested_str_weak(del_fabric), - /* K45 */ be_nested_str_weak(sessions), - /* K46 */ be_nested_str_weak(fabrics), - /* K47 */ be_nested_str_weak(get_fabric_index), - /* K48 */ be_nested_str_weak(remove_fabric), - /* K49 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K50 */ be_nested_str_weak(auto), - /* K51 */ be_nested_str_weak(plugins_persist), - /* K52 */ be_nested_str_weak(config), - /* K53 */ be_nested_str_weak(find), - /* K54 */ be_const_int(2147483647), - /* K55 */ be_nested_str_weak(plugins_config), - /* K56 */ be_nested_str_weak(plugins_classes), - /* K57 */ be_nested_str_weak(type), - /* K58 */ be_nested_str_weak(), - /* K59 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), - /* K60 */ be_nested_str_weak(ui_conf_to_string), - /* K61 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), - /* K62 */ be_nested_str_weak(changed), - /* K63 */ be_nested_str_weak(ui_string_to_conf), - /* K64 */ be_nested_str_weak(find_plugin_by_endpoint), - /* K65 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K66 */ be_nested_str_weak(parse_configuration), - /* K67 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), - /* K68 */ be_nested_str_weak(nam), - /* K69 */ be_nested_str_weak(name), - /* K70 */ be_nested_str_weak(set_name), - /* K71 */ be_nested_str_weak(remove), - /* K72 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K73 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K74 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K75 */ be_nested_str_weak(addep), - /* K76 */ be_nested_str_weak(pi), - /* K77 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K78 */ be_nested_str_weak(bridge_add_endpoint), - /* K79 */ be_nested_str_weak(addrem), - /* K80 */ be_nested_str_weak(url), - /* K81 */ be_nested_str_weak(value_error), - /* K82 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), - /* K83 */ be_nested_str_weak(equal_map), - /* K84 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K85 */ be_nested_str_weak(del), - /* K86 */ be_nested_str_weak(bridge_remove_endpoint), - /* K87 */ be_nested_str_weak(content_start), - /* K88 */ be_nested_str_weak(Parameter_X20error), - /* K89 */ be_nested_str_weak(content_send_style), - /* K90 */ be_nested_str_weak(content_send), - /* K91 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K92 */ be_nested_str_weak(html_escape), - /* K93 */ be_nested_str_weak(content_button), - /* K94 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K95 */ be_nested_str_weak(content_stop), - /* K96 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K97 */ be_const_int(2), - /* K98 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K25 */ be_nested_str_weak(disable_bridge_mode), + /* K26 */ be_nested_str_weak(nobridge), + /* K27 */ be_nested_str_weak(save_param), + /* K28 */ be_nested_str_weak(redirect), + /* K29 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K30 */ be_nested_str_weak(save), + /* K31 */ be_nested_str_weak(menable), + /* K32 */ be_nested_str_weak(comm), + /* K33 */ be_nested_str_weak(matter_enabled), + /* K34 */ be_nested_str_weak(enable), + /* K35 */ be_nested_str_weak(cmd), + /* K36 */ be_nested_str_weak(SetOption), + /* K37 */ be_nested_str_weak(matter), + /* K38 */ be_nested_str_weak(MATTER_OPTION), + /* K39 */ be_nested_str_weak(_X201), + /* K40 */ be_nested_str_weak(disable), + /* K41 */ be_nested_str_weak(_X200), + /* K42 */ be_nested_str_weak(commissioning_open), + /* K43 */ be_nested_str_weak(start_root_basic_commissioning), + /* K44 */ be_nested_str_weak(stop_basic_commissioning), + /* K45 */ be_nested_str_weak(_X2F), + /* K46 */ be_nested_str_weak(del_fabric), + /* K47 */ be_nested_str_weak(sessions), + /* K48 */ be_nested_str_weak(fabrics), + /* K49 */ be_nested_str_weak(get_fabric_index), + /* K50 */ be_nested_str_weak(remove_fabric), + /* K51 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K52 */ be_nested_str_weak(auto), + /* K53 */ be_nested_str_weak(plugins_persist), + /* K54 */ be_nested_str_weak(config), + /* K55 */ be_nested_str_weak(find), + /* K56 */ be_const_int(2147483647), + /* K57 */ be_nested_str_weak(plugins_config), + /* K58 */ be_nested_str_weak(plugins_classes), + /* K59 */ be_nested_str_weak(type), + /* K60 */ be_nested_str_weak(), + /* K61 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), + /* K62 */ be_nested_str_weak(ui_conf_to_string), + /* K63 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), + /* K64 */ be_nested_str_weak(changed), + /* K65 */ be_nested_str_weak(ui_string_to_conf), + /* K66 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K67 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K68 */ be_nested_str_weak(parse_configuration), + /* K69 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), + /* K70 */ be_nested_str_weak(nam), + /* K71 */ be_nested_str_weak(name), + /* K72 */ be_nested_str_weak(set_name), + /* K73 */ be_nested_str_weak(remove), + /* K74 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K75 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K76 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K77 */ be_nested_str_weak(addep), + /* K78 */ be_nested_str_weak(pi), + /* K79 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K80 */ be_nested_str_weak(bridge_add_endpoint), + /* K81 */ be_nested_str_weak(addrem), + /* K82 */ be_nested_str_weak(url), + /* K83 */ be_nested_str_weak(value_error), + /* K84 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), + /* K85 */ be_nested_str_weak(equal_map), + /* K86 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K87 */ be_nested_str_weak(del), + /* K88 */ be_nested_str_weak(bridge_remove_endpoint), + /* K89 */ be_nested_str_weak(content_start), + /* K90 */ be_nested_str_weak(Parameter_X20error), + /* K91 */ be_nested_str_weak(content_send_style), + /* K92 */ be_nested_str_weak(content_send), + /* K93 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K94 */ be_nested_str_weak(html_escape), + /* K95 */ be_nested_str_weak(content_button), + /* K96 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K97 */ be_nested_str_weak(content_stop), + /* K98 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K99 */ be_const_int(2), + /* K100 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, - ( &(const binstruction[688]) { /* code */ + ( &(const binstruction[694]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -2296,7 +2312,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA40E0600, // 0007 IMPORT R3 K3 0xA4120800, // 0008 IMPORT R4 K4 0x4C140000, // 0009 LDNIL R5 - 0xA8020285, // 000A EXBLK 0 #0291 + 0xA802028B, // 000A EXBLK 0 #0297 0x60180010, // 000B GETGBL R6 G16 0x8C1C0306, // 000C GETMET R7 R1 K6 0x7C1C0200, // 000D CALL R7 1 @@ -2330,7 +2346,7 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x8C18030E, // 0029 GETMET R6 R1 K14 0x58200010, // 002A LDCONST R8 K16 0x7C180400, // 002B CALL R6 2 - 0x781A002A, // 002C JMPF R6 #0058 + 0x781A0030, // 002C JMPF R6 #005E 0xB81A1000, // 002D GETNGBL R6 K8 0x8C180D09, // 002E GETMET R6 R6 K9 0x60200018, // 002F GETGBL R8 G24 @@ -2368,612 +2384,618 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0x1C1C0F18, // 004F EQ R7 R7 K24 0x901A2C07, // 0050 SETMBR R6 K22 R7 0x88180113, // 0051 GETMBR R6 R0 K19 - 0x8C180D19, // 0052 GETMET R6 R6 K25 - 0x7C180200, // 0053 CALL R6 1 - 0x8C18031A, // 0054 GETMET R6 R1 K26 - 0x5820001B, // 0055 LDCONST R8 K27 - 0x7C180400, // 0056 CALL R6 2 - 0x70020223, // 0057 JMP #027C - 0x8C18030E, // 0058 GETMET R6 R1 K14 - 0x5820001C, // 0059 LDCONST R8 K28 - 0x7C180400, // 005A CALL R6 2 - 0x781A0047, // 005B JMPF R6 #00A4 - 0x8C18030E, // 005C GETMET R6 R1 K14 - 0x5820001D, // 005D LDCONST R8 K29 - 0x7C180400, // 005E CALL R6 2 - 0x8C1C030E, // 005F GETMET R7 R1 K14 - 0x5824001E, // 0060 LDCONST R9 K30 - 0x7C1C0400, // 0061 CALL R7 2 - 0x8C20011F, // 0062 GETMET R8 R0 K31 - 0x7C200200, // 0063 CALL R8 1 - 0x20200C08, // 0064 NE R8 R6 R8 - 0x78220027, // 0065 JMPF R8 #008E - 0x781A0011, // 0066 JMPF R6 #0079 - 0xB8221000, // 0067 GETNGBL R8 K8 - 0x8C201109, // 0068 GETMET R8 R8 K9 - 0x60280018, // 0069 GETGBL R10 G24 - 0x582C0011, // 006A LDCONST R11 K17 - 0x58300020, // 006B LDCONST R12 K32 - 0x7C280400, // 006C CALL R10 2 - 0x582C0012, // 006D LDCONST R11 K18 - 0x7C200600, // 006E CALL R8 3 - 0xB8221000, // 006F GETNGBL R8 K8 - 0x8C201121, // 0070 GETMET R8 R8 K33 - 0x60280008, // 0071 GETGBL R10 G8 - 0xB82E4600, // 0072 GETNGBL R11 K35 - 0x882C1724, // 0073 GETMBR R11 R11 K36 - 0x7C280200, // 0074 CALL R10 1 - 0x002A440A, // 0075 ADD R10 K34 R10 - 0x00281525, // 0076 ADD R10 R10 K37 - 0x7C200400, // 0077 CALL R8 2 - 0x70020010, // 0078 JMP #008A - 0xB8221000, // 0079 GETNGBL R8 K8 - 0x8C201109, // 007A GETMET R8 R8 K9 - 0x60280018, // 007B GETGBL R10 G24 - 0x582C0011, // 007C LDCONST R11 K17 - 0x58300026, // 007D LDCONST R12 K38 - 0x7C280400, // 007E CALL R10 2 - 0x582C0012, // 007F LDCONST R11 K18 - 0x7C200600, // 0080 CALL R8 3 - 0xB8221000, // 0081 GETNGBL R8 K8 - 0x8C201121, // 0082 GETMET R8 R8 K33 - 0x60280008, // 0083 GETGBL R10 G8 - 0xB82E4600, // 0084 GETNGBL R11 K35 - 0x882C1724, // 0085 GETMBR R11 R11 K36 - 0x7C280200, // 0086 CALL R10 1 - 0x002A440A, // 0087 ADD R10 K34 R10 - 0x00281527, // 0088 ADD R10 R10 K39 - 0x7C200400, // 0089 CALL R8 2 - 0x8C20031A, // 008A GETMET R8 R1 K26 - 0x5828001B, // 008B LDCONST R10 K27 - 0x7C200400, // 008C CALL R8 2 - 0x70020014, // 008D JMP #00A3 - 0x88200113, // 008E GETMBR R8 R0 K19 - 0x88201128, // 008F GETMBR R8 R8 K40 - 0x4C240000, // 0090 LDNIL R9 - 0x20201009, // 0091 NE R8 R8 R9 - 0x20200E08, // 0092 NE R8 R7 R8 - 0x7822000B, // 0093 JMPF R8 #00A0 - 0x781E0003, // 0094 JMPF R7 #0099 - 0x88200113, // 0095 GETMBR R8 R0 K19 - 0x8C201129, // 0096 GETMET R8 R8 K41 - 0x7C200200, // 0097 CALL R8 1 - 0x70020002, // 0098 JMP #009C - 0x88200113, // 0099 GETMBR R8 R0 K19 - 0x8C20112A, // 009A GETMET R8 R8 K42 - 0x7C200200, // 009B CALL R8 1 - 0x8C20031A, // 009C GETMET R8 R1 K26 - 0x5828002B, // 009D LDCONST R10 K43 - 0x7C200400, // 009E CALL R8 2 - 0x70020002, // 009F JMP #00A3 - 0x8C20031A, // 00A0 GETMET R8 R1 K26 - 0x5828002B, // 00A1 LDCONST R10 K43 - 0x7C200400, // 00A2 CALL R8 2 - 0x700201D7, // 00A3 JMP #027C - 0x8C18030E, // 00A4 GETMET R6 R1 K14 - 0x5820002C, // 00A5 LDCONST R8 K44 - 0x7C180400, // 00A6 CALL R6 2 - 0x781A0026, // 00A7 JMPF R6 #00CF - 0xB81A1000, // 00A8 GETNGBL R6 K8 - 0x8C180D09, // 00A9 GETMET R6 R6 K9 - 0x60200018, // 00AA GETGBL R8 G24 - 0x58240011, // 00AB LDCONST R9 K17 - 0x5828002C, // 00AC LDCONST R10 K44 - 0x7C200400, // 00AD CALL R8 2 - 0x58240012, // 00AE LDCONST R9 K18 - 0x7C180600, // 00AF CALL R6 3 - 0x60180009, // 00B0 GETGBL R6 G9 - 0x8C1C030C, // 00B1 GETMET R7 R1 K12 - 0x5824002C, // 00B2 LDCONST R9 K44 - 0x7C1C0400, // 00B3 CALL R7 2 - 0x7C180200, // 00B4 CALL R6 1 - 0x581C0005, // 00B5 LDCONST R7 K5 - 0x88200113, // 00B6 GETMBR R8 R0 K19 - 0x8820112D, // 00B7 GETMBR R8 R8 K45 - 0x8820112E, // 00B8 GETMBR R8 R8 K46 - 0x6024000C, // 00B9 GETGBL R9 G12 - 0x5C281000, // 00BA MOVE R10 R8 - 0x7C240200, // 00BB CALL R9 1 - 0x14240E09, // 00BC LT R9 R7 R9 - 0x7826000C, // 00BD JMPF R9 #00CB - 0x94241007, // 00BE GETIDX R9 R8 R7 - 0x8C24132F, // 00BF GETMET R9 R9 K47 - 0x7C240200, // 00C0 CALL R9 1 - 0x1C241206, // 00C1 EQ R9 R9 R6 - 0x78260005, // 00C2 JMPF R9 #00C9 - 0x88240113, // 00C3 GETMBR R9 R0 K19 - 0x8C241330, // 00C4 GETMET R9 R9 K48 - 0x942C1007, // 00C5 GETIDX R11 R8 R7 - 0x7C240400, // 00C6 CALL R9 2 - 0x70020002, // 00C7 JMP #00CB - 0x70020000, // 00C8 JMP #00CA - 0x001C0F07, // 00C9 ADD R7 R7 K7 - 0x7001FFED, // 00CA JMP #00B9 - 0x8C24031A, // 00CB GETMET R9 R1 K26 - 0x582C0031, // 00CC LDCONST R11 K49 - 0x7C240400, // 00CD CALL R9 2 - 0x700201AC, // 00CE JMP #027C - 0x8C18030E, // 00CF GETMET R6 R1 K14 - 0x58200032, // 00D0 LDCONST R8 K50 - 0x7C180400, // 00D1 CALL R6 2 - 0x781A0011, // 00D2 JMPF R6 #00E5 - 0xB81A1000, // 00D3 GETNGBL R6 K8 - 0x8C180D09, // 00D4 GETMET R6 R6 K9 - 0x60200018, // 00D5 GETGBL R8 G24 - 0x58240011, // 00D6 LDCONST R9 K17 - 0x58280032, // 00D7 LDCONST R10 K50 - 0x7C200400, // 00D8 CALL R8 2 - 0x58240012, // 00D9 LDCONST R9 K18 - 0x7C180600, // 00DA CALL R6 3 - 0x88180113, // 00DB GETMBR R6 R0 K19 - 0x501C0000, // 00DC LDBOOL R7 0 0 - 0x901A6607, // 00DD SETMBR R6 K51 R7 - 0x88180113, // 00DE GETMBR R6 R0 K19 - 0x8C180D19, // 00DF GETMET R6 R6 K25 - 0x7C180200, // 00E0 CALL R6 1 - 0x8C18031A, // 00E1 GETMET R6 R1 K26 - 0x5820001B, // 00E2 LDCONST R8 K27 - 0x7C180400, // 00E3 CALL R6 2 - 0x70020196, // 00E4 JMP #027C - 0x8C18030E, // 00E5 GETMET R6 R1 K14 - 0x58200034, // 00E6 LDCONST R8 K52 - 0x7C180400, // 00E7 CALL R6 2 - 0x781A00D6, // 00E8 JMPF R6 #01C0 - 0xB81A1000, // 00E9 GETNGBL R6 K8 - 0x8C180D09, // 00EA GETMET R6 R6 K9 - 0x60200018, // 00EB GETGBL R8 G24 - 0x58240011, // 00EC LDCONST R9 K17 - 0x58280034, // 00ED LDCONST R10 K52 - 0x7C200400, // 00EE CALL R8 2 - 0x58240012, // 00EF LDCONST R9 K18 - 0x7C180600, // 00F0 CALL R6 3 - 0x50180000, // 00F1 LDBOOL R6 0 0 - 0x601C0010, // 00F2 GETGBL R7 G16 - 0x8C200306, // 00F3 GETMET R8 R1 K6 - 0x7C200200, // 00F4 CALL R8 1 - 0x04201107, // 00F5 SUB R8 R8 K7 - 0x40220A08, // 00F6 CONNECT R8 K5 R8 - 0x7C1C0200, // 00F7 CALL R7 1 - 0xA80200A0, // 00F8 EXBLK 0 #019A - 0x5C200E00, // 00F9 MOVE R8 R7 - 0x7C200000, // 00FA CALL R8 0 - 0x8C24030B, // 00FB GETMET R9 R1 K11 - 0x5C2C1000, // 00FC MOVE R11 R8 - 0x7C240400, // 00FD CALL R9 2 - 0x8C280535, // 00FE GETMET R10 R2 K53 - 0x5C301200, // 00FF MOVE R12 R9 - 0x5834000C, // 0100 LDCONST R13 K12 - 0x7C280600, // 0101 CALL R10 3 - 0x1C281505, // 0102 EQ R10 R10 K5 - 0x782A005B, // 0103 JMPF R10 #0160 - 0x60280009, // 0104 GETGBL R10 G9 - 0x402E2536, // 0105 CONNECT R11 K18 K54 - 0x942C120B, // 0106 GETIDX R11 R9 R11 - 0x7C280200, // 0107 CALL R10 1 - 0x8C2C030C, // 0108 GETMET R11 R1 K12 - 0x5C341000, // 0109 MOVE R13 R8 - 0x7C2C0400, // 010A CALL R11 2 - 0x88300113, // 010B GETMBR R12 R0 K19 - 0x88301937, // 010C GETMBR R12 R12 K55 - 0x8C301935, // 010D GETMET R12 R12 K53 - 0x60380008, // 010E GETGBL R14 G8 - 0x5C3C1400, // 010F MOVE R15 R10 - 0x7C380200, // 0110 CALL R14 1 - 0x7C300400, // 0111 CALL R12 2 - 0x4C340000, // 0112 LDNIL R13 - 0x2034180D, // 0113 NE R13 R12 R13 - 0x78360041, // 0114 JMPF R13 #0157 - 0x88340113, // 0115 GETMBR R13 R0 K19 - 0x88341B38, // 0116 GETMBR R13 R13 K56 - 0x8C341B35, // 0117 GETMET R13 R13 K53 - 0x8C3C1935, // 0118 GETMET R15 R12 K53 - 0x58440039, // 0119 LDCONST R17 K57 - 0x5848003A, // 011A LDCONST R18 K58 - 0x7C3C0600, // 011B CALL R15 3 - 0x7C340400, // 011C CALL R13 2 - 0x4C380000, // 011D LDNIL R14 - 0x20381A0E, // 011E NE R14 R13 R14 - 0x783A0035, // 011F JMPF R14 #0156 - 0xB83A1000, // 0120 GETNGBL R14 K8 - 0x8C381D09, // 0121 GETMET R14 R14 K9 - 0x60400018, // 0122 GETGBL R16 G24 - 0x5844003B, // 0123 LDCONST R17 K59 - 0x5C481400, // 0124 MOVE R18 R10 - 0x5C4C1600, // 0125 MOVE R19 R11 - 0x7C400600, // 0126 CALL R16 3 - 0x58440012, // 0127 LDCONST R17 K18 - 0x7C380600, // 0128 CALL R14 3 - 0x8C381B3C, // 0129 GETMET R14 R13 K60 - 0x5C401A00, // 012A MOVE R16 R13 - 0x5C441800, // 012B MOVE R17 R12 - 0x7C380600, // 012C CALL R14 3 - 0x203C1C0B, // 012D NE R15 R14 R11 - 0xB8421000, // 012E GETNGBL R16 K8 - 0x8C402109, // 012F GETMET R16 R16 K9 - 0x60480018, // 0130 GETGBL R18 G24 - 0x584C003D, // 0131 LDCONST R19 K61 - 0x5C501400, // 0132 MOVE R20 R10 - 0x5C541C00, // 0133 MOVE R21 R14 - 0x5C581600, // 0134 MOVE R22 R11 - 0x205C1C0B, // 0135 NE R23 R14 R11 - 0x785E0001, // 0136 JMPF R23 #0139 - 0x585C003E, // 0137 LDCONST R23 K62 - 0x70020000, // 0138 JMP #013A - 0x585C003A, // 0139 LDCONST R23 K58 - 0x7C480A00, // 013A CALL R18 5 - 0x584C0012, // 013B LDCONST R19 K18 - 0x7C400600, // 013C CALL R16 3 - 0x783E0017, // 013D JMPF R15 #0156 - 0x50180200, // 013E LDBOOL R6 1 0 - 0x8C401B3F, // 013F GETMET R16 R13 K63 - 0x5C481A00, // 0140 MOVE R18 R13 - 0x5C4C1800, // 0141 MOVE R19 R12 - 0x5C501600, // 0142 MOVE R20 R11 - 0x7C400800, // 0143 CALL R16 4 - 0x88400113, // 0144 GETMBR R16 R0 K19 - 0x8C402140, // 0145 GETMET R16 R16 K64 - 0x5C481400, // 0146 MOVE R18 R10 - 0x7C400400, // 0147 CALL R16 2 - 0x7842000C, // 0148 JMPF R16 #0156 - 0xB8461000, // 0149 GETNGBL R17 K8 - 0x8C442309, // 014A GETMET R17 R17 K9 - 0x604C0018, // 014B GETGBL R19 G24 - 0x58500041, // 014C LDCONST R20 K65 - 0x5C541800, // 014D MOVE R21 R12 - 0x5C581400, // 014E MOVE R22 R10 - 0x5C5C2000, // 014F MOVE R23 R16 - 0x7C4C0800, // 0150 CALL R19 4 - 0x58500012, // 0151 LDCONST R20 K18 - 0x7C440600, // 0152 CALL R17 3 - 0x8C442142, // 0153 GETMET R17 R16 K66 - 0x5C4C1800, // 0154 MOVE R19 R12 - 0x7C440400, // 0155 CALL R17 2 - 0x70020007, // 0156 JMP #015F - 0xB8361000, // 0157 GETNGBL R13 K8 - 0x8C341B09, // 0158 GETMET R13 R13 K9 - 0x603C0018, // 0159 GETGBL R15 G24 - 0x58400043, // 015A LDCONST R16 K67 - 0x5C441400, // 015B MOVE R17 R10 - 0x7C3C0400, // 015C CALL R15 2 - 0x58400012, // 015D LDCONST R16 K18 - 0x7C340600, // 015E CALL R13 3 - 0x70020038, // 015F JMP #0199 - 0x8C280535, // 0160 GETMET R10 R2 K53 - 0x5C301200, // 0161 MOVE R12 R9 - 0x58340044, // 0162 LDCONST R13 K68 - 0x7C280600, // 0163 CALL R10 3 - 0x1C281505, // 0164 EQ R10 R10 K5 - 0x782A0032, // 0165 JMPF R10 #0199 - 0x60280009, // 0166 GETGBL R10 G9 - 0x402E2536, // 0167 CONNECT R11 K18 K54 - 0x942C120B, // 0168 GETIDX R11 R9 R11 - 0x7C280200, // 0169 CALL R10 1 - 0x8C2C030C, // 016A GETMET R11 R1 K12 - 0x5C341000, // 016B MOVE R13 R8 - 0x7C2C0400, // 016C CALL R11 2 - 0x88300113, // 016D GETMBR R12 R0 K19 - 0x88301937, // 016E GETMBR R12 R12 K55 - 0x8C301935, // 016F GETMET R12 R12 K53 - 0x60380008, // 0170 GETGBL R14 G8 - 0x5C3C1400, // 0171 MOVE R15 R10 - 0x7C380200, // 0172 CALL R14 1 - 0x7C300400, // 0173 CALL R12 2 - 0x4C340000, // 0174 LDNIL R13 - 0x2034180D, // 0175 NE R13 R12 R13 - 0x78360021, // 0176 JMPF R13 #0199 - 0x8C341935, // 0177 GETMET R13 R12 K53 - 0x583C0045, // 0178 LDCONST R15 K69 - 0x5840003A, // 0179 LDCONST R16 K58 - 0x7C340600, // 017A CALL R13 3 - 0x20381A0B, // 017B NE R14 R13 R11 - 0x783A001B, // 017C JMPF R14 #0199 - 0x50180200, // 017D LDBOOL R6 1 0 - 0x883C0113, // 017E GETMBR R15 R0 K19 - 0x8C3C1F40, // 017F GETMET R15 R15 K64 - 0x5C441400, // 0180 MOVE R17 R10 - 0x7C3C0400, // 0181 CALL R15 2 - 0x783E0015, // 0182 JMPF R15 #0199 - 0x8C401F46, // 0183 GETMET R16 R15 K70 - 0x5C481600, // 0184 MOVE R18 R11 - 0x7C400400, // 0185 CALL R16 2 - 0x782E0001, // 0186 JMPF R11 #0189 - 0x98328A0B, // 0187 SETIDX R12 K69 R11 - 0x70020002, // 0188 JMP #018C - 0x8C401947, // 0189 GETMET R16 R12 K71 - 0x58480045, // 018A LDCONST R18 K69 + 0x8C1C030C, // 0052 GETMET R7 R1 K12 + 0x5824001A, // 0053 LDCONST R9 K26 + 0x7C1C0400, // 0054 CALL R7 2 + 0x1C1C0F18, // 0055 EQ R7 R7 K24 + 0x901A3207, // 0056 SETMBR R6 K25 R7 + 0x88180113, // 0057 GETMBR R6 R0 K19 + 0x8C180D1B, // 0058 GETMET R6 R6 K27 + 0x7C180200, // 0059 CALL R6 1 + 0x8C18031C, // 005A GETMET R6 R1 K28 + 0x5820001D, // 005B LDCONST R8 K29 + 0x7C180400, // 005C CALL R6 2 + 0x70020223, // 005D JMP #0282 + 0x8C18030E, // 005E GETMET R6 R1 K14 + 0x5820001E, // 005F LDCONST R8 K30 + 0x7C180400, // 0060 CALL R6 2 + 0x781A0047, // 0061 JMPF R6 #00AA + 0x8C18030E, // 0062 GETMET R6 R1 K14 + 0x5820001F, // 0063 LDCONST R8 K31 + 0x7C180400, // 0064 CALL R6 2 + 0x8C1C030E, // 0065 GETMET R7 R1 K14 + 0x58240020, // 0066 LDCONST R9 K32 + 0x7C1C0400, // 0067 CALL R7 2 + 0x8C200121, // 0068 GETMET R8 R0 K33 + 0x7C200200, // 0069 CALL R8 1 + 0x20200C08, // 006A NE R8 R6 R8 + 0x78220027, // 006B JMPF R8 #0094 + 0x781A0011, // 006C JMPF R6 #007F + 0xB8221000, // 006D GETNGBL R8 K8 + 0x8C201109, // 006E GETMET R8 R8 K9 + 0x60280018, // 006F GETGBL R10 G24 + 0x582C0011, // 0070 LDCONST R11 K17 + 0x58300022, // 0071 LDCONST R12 K34 + 0x7C280400, // 0072 CALL R10 2 + 0x582C0012, // 0073 LDCONST R11 K18 + 0x7C200600, // 0074 CALL R8 3 + 0xB8221000, // 0075 GETNGBL R8 K8 + 0x8C201123, // 0076 GETMET R8 R8 K35 + 0x60280008, // 0077 GETGBL R10 G8 + 0xB82E4A00, // 0078 GETNGBL R11 K37 + 0x882C1726, // 0079 GETMBR R11 R11 K38 + 0x7C280200, // 007A CALL R10 1 + 0x002A480A, // 007B ADD R10 K36 R10 + 0x00281527, // 007C ADD R10 R10 K39 + 0x7C200400, // 007D CALL R8 2 + 0x70020010, // 007E JMP #0090 + 0xB8221000, // 007F GETNGBL R8 K8 + 0x8C201109, // 0080 GETMET R8 R8 K9 + 0x60280018, // 0081 GETGBL R10 G24 + 0x582C0011, // 0082 LDCONST R11 K17 + 0x58300028, // 0083 LDCONST R12 K40 + 0x7C280400, // 0084 CALL R10 2 + 0x582C0012, // 0085 LDCONST R11 K18 + 0x7C200600, // 0086 CALL R8 3 + 0xB8221000, // 0087 GETNGBL R8 K8 + 0x8C201123, // 0088 GETMET R8 R8 K35 + 0x60280008, // 0089 GETGBL R10 G8 + 0xB82E4A00, // 008A GETNGBL R11 K37 + 0x882C1726, // 008B GETMBR R11 R11 K38 + 0x7C280200, // 008C CALL R10 1 + 0x002A480A, // 008D ADD R10 K36 R10 + 0x00281529, // 008E ADD R10 R10 K41 + 0x7C200400, // 008F CALL R8 2 + 0x8C20031C, // 0090 GETMET R8 R1 K28 + 0x5828001D, // 0091 LDCONST R10 K29 + 0x7C200400, // 0092 CALL R8 2 + 0x70020014, // 0093 JMP #00A9 + 0x88200113, // 0094 GETMBR R8 R0 K19 + 0x8820112A, // 0095 GETMBR R8 R8 K42 + 0x4C240000, // 0096 LDNIL R9 + 0x20201009, // 0097 NE R8 R8 R9 + 0x20200E08, // 0098 NE R8 R7 R8 + 0x7822000B, // 0099 JMPF R8 #00A6 + 0x781E0003, // 009A JMPF R7 #009F + 0x88200113, // 009B GETMBR R8 R0 K19 + 0x8C20112B, // 009C GETMET R8 R8 K43 + 0x7C200200, // 009D CALL R8 1 + 0x70020002, // 009E JMP #00A2 + 0x88200113, // 009F GETMBR R8 R0 K19 + 0x8C20112C, // 00A0 GETMET R8 R8 K44 + 0x7C200200, // 00A1 CALL R8 1 + 0x8C20031C, // 00A2 GETMET R8 R1 K28 + 0x5828002D, // 00A3 LDCONST R10 K45 + 0x7C200400, // 00A4 CALL R8 2 + 0x70020002, // 00A5 JMP #00A9 + 0x8C20031C, // 00A6 GETMET R8 R1 K28 + 0x5828002D, // 00A7 LDCONST R10 K45 + 0x7C200400, // 00A8 CALL R8 2 + 0x700201D7, // 00A9 JMP #0282 + 0x8C18030E, // 00AA GETMET R6 R1 K14 + 0x5820002E, // 00AB LDCONST R8 K46 + 0x7C180400, // 00AC CALL R6 2 + 0x781A0026, // 00AD JMPF R6 #00D5 + 0xB81A1000, // 00AE GETNGBL R6 K8 + 0x8C180D09, // 00AF GETMET R6 R6 K9 + 0x60200018, // 00B0 GETGBL R8 G24 + 0x58240011, // 00B1 LDCONST R9 K17 + 0x5828002E, // 00B2 LDCONST R10 K46 + 0x7C200400, // 00B3 CALL R8 2 + 0x58240012, // 00B4 LDCONST R9 K18 + 0x7C180600, // 00B5 CALL R6 3 + 0x60180009, // 00B6 GETGBL R6 G9 + 0x8C1C030C, // 00B7 GETMET R7 R1 K12 + 0x5824002E, // 00B8 LDCONST R9 K46 + 0x7C1C0400, // 00B9 CALL R7 2 + 0x7C180200, // 00BA CALL R6 1 + 0x581C0005, // 00BB LDCONST R7 K5 + 0x88200113, // 00BC GETMBR R8 R0 K19 + 0x8820112F, // 00BD GETMBR R8 R8 K47 + 0x88201130, // 00BE GETMBR R8 R8 K48 + 0x6024000C, // 00BF GETGBL R9 G12 + 0x5C281000, // 00C0 MOVE R10 R8 + 0x7C240200, // 00C1 CALL R9 1 + 0x14240E09, // 00C2 LT R9 R7 R9 + 0x7826000C, // 00C3 JMPF R9 #00D1 + 0x94241007, // 00C4 GETIDX R9 R8 R7 + 0x8C241331, // 00C5 GETMET R9 R9 K49 + 0x7C240200, // 00C6 CALL R9 1 + 0x1C241206, // 00C7 EQ R9 R9 R6 + 0x78260005, // 00C8 JMPF R9 #00CF + 0x88240113, // 00C9 GETMBR R9 R0 K19 + 0x8C241332, // 00CA GETMET R9 R9 K50 + 0x942C1007, // 00CB GETIDX R11 R8 R7 + 0x7C240400, // 00CC CALL R9 2 + 0x70020002, // 00CD JMP #00D1 + 0x70020000, // 00CE JMP #00D0 + 0x001C0F07, // 00CF ADD R7 R7 K7 + 0x7001FFED, // 00D0 JMP #00BF + 0x8C24031C, // 00D1 GETMET R9 R1 K28 + 0x582C0033, // 00D2 LDCONST R11 K51 + 0x7C240400, // 00D3 CALL R9 2 + 0x700201AC, // 00D4 JMP #0282 + 0x8C18030E, // 00D5 GETMET R6 R1 K14 + 0x58200034, // 00D6 LDCONST R8 K52 + 0x7C180400, // 00D7 CALL R6 2 + 0x781A0011, // 00D8 JMPF R6 #00EB + 0xB81A1000, // 00D9 GETNGBL R6 K8 + 0x8C180D09, // 00DA GETMET R6 R6 K9 + 0x60200018, // 00DB GETGBL R8 G24 + 0x58240011, // 00DC LDCONST R9 K17 + 0x58280034, // 00DD LDCONST R10 K52 + 0x7C200400, // 00DE CALL R8 2 + 0x58240012, // 00DF LDCONST R9 K18 + 0x7C180600, // 00E0 CALL R6 3 + 0x88180113, // 00E1 GETMBR R6 R0 K19 + 0x501C0000, // 00E2 LDBOOL R7 0 0 + 0x901A6A07, // 00E3 SETMBR R6 K53 R7 + 0x88180113, // 00E4 GETMBR R6 R0 K19 + 0x8C180D1B, // 00E5 GETMET R6 R6 K27 + 0x7C180200, // 00E6 CALL R6 1 + 0x8C18031C, // 00E7 GETMET R6 R1 K28 + 0x5820001D, // 00E8 LDCONST R8 K29 + 0x7C180400, // 00E9 CALL R6 2 + 0x70020196, // 00EA JMP #0282 + 0x8C18030E, // 00EB GETMET R6 R1 K14 + 0x58200036, // 00EC LDCONST R8 K54 + 0x7C180400, // 00ED CALL R6 2 + 0x781A00D6, // 00EE JMPF R6 #01C6 + 0xB81A1000, // 00EF GETNGBL R6 K8 + 0x8C180D09, // 00F0 GETMET R6 R6 K9 + 0x60200018, // 00F1 GETGBL R8 G24 + 0x58240011, // 00F2 LDCONST R9 K17 + 0x58280036, // 00F3 LDCONST R10 K54 + 0x7C200400, // 00F4 CALL R8 2 + 0x58240012, // 00F5 LDCONST R9 K18 + 0x7C180600, // 00F6 CALL R6 3 + 0x50180000, // 00F7 LDBOOL R6 0 0 + 0x601C0010, // 00F8 GETGBL R7 G16 + 0x8C200306, // 00F9 GETMET R8 R1 K6 + 0x7C200200, // 00FA CALL R8 1 + 0x04201107, // 00FB SUB R8 R8 K7 + 0x40220A08, // 00FC CONNECT R8 K5 R8 + 0x7C1C0200, // 00FD CALL R7 1 + 0xA80200A0, // 00FE EXBLK 0 #01A0 + 0x5C200E00, // 00FF MOVE R8 R7 + 0x7C200000, // 0100 CALL R8 0 + 0x8C24030B, // 0101 GETMET R9 R1 K11 + 0x5C2C1000, // 0102 MOVE R11 R8 + 0x7C240400, // 0103 CALL R9 2 + 0x8C280537, // 0104 GETMET R10 R2 K55 + 0x5C301200, // 0105 MOVE R12 R9 + 0x5834000C, // 0106 LDCONST R13 K12 + 0x7C280600, // 0107 CALL R10 3 + 0x1C281505, // 0108 EQ R10 R10 K5 + 0x782A005B, // 0109 JMPF R10 #0166 + 0x60280009, // 010A GETGBL R10 G9 + 0x402E2538, // 010B CONNECT R11 K18 K56 + 0x942C120B, // 010C GETIDX R11 R9 R11 + 0x7C280200, // 010D CALL R10 1 + 0x8C2C030C, // 010E GETMET R11 R1 K12 + 0x5C341000, // 010F MOVE R13 R8 + 0x7C2C0400, // 0110 CALL R11 2 + 0x88300113, // 0111 GETMBR R12 R0 K19 + 0x88301939, // 0112 GETMBR R12 R12 K57 + 0x8C301937, // 0113 GETMET R12 R12 K55 + 0x60380008, // 0114 GETGBL R14 G8 + 0x5C3C1400, // 0115 MOVE R15 R10 + 0x7C380200, // 0116 CALL R14 1 + 0x7C300400, // 0117 CALL R12 2 + 0x4C340000, // 0118 LDNIL R13 + 0x2034180D, // 0119 NE R13 R12 R13 + 0x78360041, // 011A JMPF R13 #015D + 0x88340113, // 011B GETMBR R13 R0 K19 + 0x88341B3A, // 011C GETMBR R13 R13 K58 + 0x8C341B37, // 011D GETMET R13 R13 K55 + 0x8C3C1937, // 011E GETMET R15 R12 K55 + 0x5844003B, // 011F LDCONST R17 K59 + 0x5848003C, // 0120 LDCONST R18 K60 + 0x7C3C0600, // 0121 CALL R15 3 + 0x7C340400, // 0122 CALL R13 2 + 0x4C380000, // 0123 LDNIL R14 + 0x20381A0E, // 0124 NE R14 R13 R14 + 0x783A0035, // 0125 JMPF R14 #015C + 0xB83A1000, // 0126 GETNGBL R14 K8 + 0x8C381D09, // 0127 GETMET R14 R14 K9 + 0x60400018, // 0128 GETGBL R16 G24 + 0x5844003D, // 0129 LDCONST R17 K61 + 0x5C481400, // 012A MOVE R18 R10 + 0x5C4C1600, // 012B MOVE R19 R11 + 0x7C400600, // 012C CALL R16 3 + 0x58440012, // 012D LDCONST R17 K18 + 0x7C380600, // 012E CALL R14 3 + 0x8C381B3E, // 012F GETMET R14 R13 K62 + 0x5C401A00, // 0130 MOVE R16 R13 + 0x5C441800, // 0131 MOVE R17 R12 + 0x7C380600, // 0132 CALL R14 3 + 0x203C1C0B, // 0133 NE R15 R14 R11 + 0xB8421000, // 0134 GETNGBL R16 K8 + 0x8C402109, // 0135 GETMET R16 R16 K9 + 0x60480018, // 0136 GETGBL R18 G24 + 0x584C003F, // 0137 LDCONST R19 K63 + 0x5C501400, // 0138 MOVE R20 R10 + 0x5C541C00, // 0139 MOVE R21 R14 + 0x5C581600, // 013A MOVE R22 R11 + 0x205C1C0B, // 013B NE R23 R14 R11 + 0x785E0001, // 013C JMPF R23 #013F + 0x585C0040, // 013D LDCONST R23 K64 + 0x70020000, // 013E JMP #0140 + 0x585C003C, // 013F LDCONST R23 K60 + 0x7C480A00, // 0140 CALL R18 5 + 0x584C0012, // 0141 LDCONST R19 K18 + 0x7C400600, // 0142 CALL R16 3 + 0x783E0017, // 0143 JMPF R15 #015C + 0x50180200, // 0144 LDBOOL R6 1 0 + 0x8C401B41, // 0145 GETMET R16 R13 K65 + 0x5C481A00, // 0146 MOVE R18 R13 + 0x5C4C1800, // 0147 MOVE R19 R12 + 0x5C501600, // 0148 MOVE R20 R11 + 0x7C400800, // 0149 CALL R16 4 + 0x88400113, // 014A GETMBR R16 R0 K19 + 0x8C402142, // 014B GETMET R16 R16 K66 + 0x5C481400, // 014C MOVE R18 R10 + 0x7C400400, // 014D CALL R16 2 + 0x7842000C, // 014E JMPF R16 #015C + 0xB8461000, // 014F GETNGBL R17 K8 + 0x8C442309, // 0150 GETMET R17 R17 K9 + 0x604C0018, // 0151 GETGBL R19 G24 + 0x58500043, // 0152 LDCONST R20 K67 + 0x5C541800, // 0153 MOVE R21 R12 + 0x5C581400, // 0154 MOVE R22 R10 + 0x5C5C2000, // 0155 MOVE R23 R16 + 0x7C4C0800, // 0156 CALL R19 4 + 0x58500012, // 0157 LDCONST R20 K18 + 0x7C440600, // 0158 CALL R17 3 + 0x8C442144, // 0159 GETMET R17 R16 K68 + 0x5C4C1800, // 015A MOVE R19 R12 + 0x7C440400, // 015B CALL R17 2 + 0x70020007, // 015C JMP #0165 + 0xB8361000, // 015D GETNGBL R13 K8 + 0x8C341B09, // 015E GETMET R13 R13 K9 + 0x603C0018, // 015F GETGBL R15 G24 + 0x58400045, // 0160 LDCONST R16 K69 + 0x5C441400, // 0161 MOVE R17 R10 + 0x7C3C0400, // 0162 CALL R15 2 + 0x58400012, // 0163 LDCONST R16 K18 + 0x7C340600, // 0164 CALL R13 3 + 0x70020038, // 0165 JMP #019F + 0x8C280537, // 0166 GETMET R10 R2 K55 + 0x5C301200, // 0167 MOVE R12 R9 + 0x58340046, // 0168 LDCONST R13 K70 + 0x7C280600, // 0169 CALL R10 3 + 0x1C281505, // 016A EQ R10 R10 K5 + 0x782A0032, // 016B JMPF R10 #019F + 0x60280009, // 016C GETGBL R10 G9 + 0x402E2538, // 016D CONNECT R11 K18 K56 + 0x942C120B, // 016E GETIDX R11 R9 R11 + 0x7C280200, // 016F CALL R10 1 + 0x8C2C030C, // 0170 GETMET R11 R1 K12 + 0x5C341000, // 0171 MOVE R13 R8 + 0x7C2C0400, // 0172 CALL R11 2 + 0x88300113, // 0173 GETMBR R12 R0 K19 + 0x88301939, // 0174 GETMBR R12 R12 K57 + 0x8C301937, // 0175 GETMET R12 R12 K55 + 0x60380008, // 0176 GETGBL R14 G8 + 0x5C3C1400, // 0177 MOVE R15 R10 + 0x7C380200, // 0178 CALL R14 1 + 0x7C300400, // 0179 CALL R12 2 + 0x4C340000, // 017A LDNIL R13 + 0x2034180D, // 017B NE R13 R12 R13 + 0x78360021, // 017C JMPF R13 #019F + 0x8C341937, // 017D GETMET R13 R12 K55 + 0x583C0047, // 017E LDCONST R15 K71 + 0x5840003C, // 017F LDCONST R16 K60 + 0x7C340600, // 0180 CALL R13 3 + 0x20381A0B, // 0181 NE R14 R13 R11 + 0x783A001B, // 0182 JMPF R14 #019F + 0x50180200, // 0183 LDBOOL R6 1 0 + 0x883C0113, // 0184 GETMBR R15 R0 K19 + 0x8C3C1F42, // 0185 GETMET R15 R15 K66 + 0x5C441400, // 0186 MOVE R17 R10 + 0x7C3C0400, // 0187 CALL R15 2 + 0x783E0015, // 0188 JMPF R15 #019F + 0x8C401F48, // 0189 GETMET R16 R15 K72 + 0x5C481600, // 018A MOVE R18 R11 0x7C400400, // 018B CALL R16 2 - 0xB8421000, // 018C GETNGBL R16 K8 - 0x8C402109, // 018D GETMET R16 R16 K9 - 0x60480018, // 018E GETGBL R18 G24 - 0x584C0048, // 018F LDCONST R19 K72 - 0x5C501800, // 0190 MOVE R20 R12 - 0x5C541400, // 0191 MOVE R21 R10 - 0x5C581E00, // 0192 MOVE R22 R15 - 0x7C480800, // 0193 CALL R18 4 - 0x584C0012, // 0194 LDCONST R19 K18 - 0x7C400600, // 0195 CALL R16 3 - 0x8C401F42, // 0196 GETMET R16 R15 K66 - 0x5C481800, // 0197 MOVE R18 R12 - 0x7C400400, // 0198 CALL R16 2 - 0x7001FF5E, // 0199 JMP #00F9 - 0x581C000D, // 019A LDCONST R7 K13 - 0xAC1C0200, // 019B CATCH R7 1 0 - 0xB0080000, // 019C RAISE 2 R0 R0 - 0xB81E1000, // 019D GETNGBL R7 K8 - 0x8C1C0F09, // 019E GETMET R7 R7 K9 - 0x60240018, // 019F GETGBL R9 G24 - 0x58280049, // 01A0 LDCONST R10 K73 - 0x602C0008, // 01A1 GETGBL R11 G8 - 0x88300113, // 01A2 GETMBR R12 R0 K19 - 0x88301937, // 01A3 GETMBR R12 R12 K55 - 0x7C2C0200, // 01A4 CALL R11 1 - 0x7C240400, // 01A5 CALL R9 2 - 0x58280012, // 01A6 LDCONST R10 K18 - 0x7C1C0600, // 01A7 CALL R7 3 - 0x78160008, // 01A8 JMPF R5 #01B2 - 0xB81E1000, // 01A9 GETNGBL R7 K8 - 0x8C1C0F09, // 01AA GETMET R7 R7 K9 - 0x60240018, // 01AB GETGBL R9 G24 - 0x5828004A, // 01AC LDCONST R10 K74 - 0x5C2C0A00, // 01AD MOVE R11 R5 - 0x7C240400, // 01AE CALL R9 2 - 0x58280012, // 01AF LDCONST R10 K18 - 0x7C1C0600, // 01B0 CALL R7 3 - 0x7002000C, // 01B1 JMP #01BF - 0x741A0002, // 01B2 JMPT R6 #01B6 - 0x881C0113, // 01B3 GETMBR R7 R0 K19 - 0x881C0F33, // 01B4 GETMBR R7 R7 K51 - 0x741E0005, // 01B5 JMPT R7 #01BC - 0x881C0113, // 01B6 GETMBR R7 R0 K19 - 0x50200200, // 01B7 LDBOOL R8 1 0 - 0x901E6608, // 01B8 SETMBR R7 K51 R8 + 0x782E0001, // 018C JMPF R11 #018F + 0x98328E0B, // 018D SETIDX R12 K71 R11 + 0x70020002, // 018E JMP #0192 + 0x8C401949, // 018F GETMET R16 R12 K73 + 0x58480047, // 0190 LDCONST R18 K71 + 0x7C400400, // 0191 CALL R16 2 + 0xB8421000, // 0192 GETNGBL R16 K8 + 0x8C402109, // 0193 GETMET R16 R16 K9 + 0x60480018, // 0194 GETGBL R18 G24 + 0x584C004A, // 0195 LDCONST R19 K74 + 0x5C501800, // 0196 MOVE R20 R12 + 0x5C541400, // 0197 MOVE R21 R10 + 0x5C581E00, // 0198 MOVE R22 R15 + 0x7C480800, // 0199 CALL R18 4 + 0x584C0012, // 019A LDCONST R19 K18 + 0x7C400600, // 019B CALL R16 3 + 0x8C401F44, // 019C GETMET R16 R15 K68 + 0x5C481800, // 019D MOVE R18 R12 + 0x7C400400, // 019E CALL R16 2 + 0x7001FF5E, // 019F JMP #00FF + 0x581C000D, // 01A0 LDCONST R7 K13 + 0xAC1C0200, // 01A1 CATCH R7 1 0 + 0xB0080000, // 01A2 RAISE 2 R0 R0 + 0xB81E1000, // 01A3 GETNGBL R7 K8 + 0x8C1C0F09, // 01A4 GETMET R7 R7 K9 + 0x60240018, // 01A5 GETGBL R9 G24 + 0x5828004B, // 01A6 LDCONST R10 K75 + 0x602C0008, // 01A7 GETGBL R11 G8 + 0x88300113, // 01A8 GETMBR R12 R0 K19 + 0x88301939, // 01A9 GETMBR R12 R12 K57 + 0x7C2C0200, // 01AA CALL R11 1 + 0x7C240400, // 01AB CALL R9 2 + 0x58280012, // 01AC LDCONST R10 K18 + 0x7C1C0600, // 01AD CALL R7 3 + 0x78160008, // 01AE JMPF R5 #01B8 + 0xB81E1000, // 01AF GETNGBL R7 K8 + 0x8C1C0F09, // 01B0 GETMET R7 R7 K9 + 0x60240018, // 01B1 GETGBL R9 G24 + 0x5828004C, // 01B2 LDCONST R10 K76 + 0x5C2C0A00, // 01B3 MOVE R11 R5 + 0x7C240400, // 01B4 CALL R9 2 + 0x58280012, // 01B5 LDCONST R10 K18 + 0x7C1C0600, // 01B6 CALL R7 3 + 0x7002000C, // 01B7 JMP #01C5 + 0x741A0002, // 01B8 JMPT R6 #01BC 0x881C0113, // 01B9 GETMBR R7 R0 K19 - 0x8C1C0F19, // 01BA GETMET R7 R7 K25 - 0x7C1C0200, // 01BB CALL R7 1 - 0x8C1C031A, // 01BC GETMET R7 R1 K26 - 0x58240031, // 01BD LDCONST R9 K49 - 0x7C1C0400, // 01BE CALL R7 2 - 0x700200BB, // 01BF JMP #027C - 0x8C18030E, // 01C0 GETMET R6 R1 K14 - 0x5820004B, // 01C1 LDCONST R8 K75 - 0x7C180400, // 01C2 CALL R6 2 - 0x781A002B, // 01C3 JMPF R6 #01F0 - 0x8C18030C, // 01C4 GETMET R6 R1 K12 - 0x5820004C, // 01C5 LDCONST R8 K76 - 0x7C180400, // 01C6 CALL R6 2 - 0x8C1C030C, // 01C7 GETMET R7 R1 K12 - 0x5824000C, // 01C8 LDCONST R9 K12 - 0x7C1C0400, // 01C9 CALL R7 2 - 0x8C20030C, // 01CA GETMET R8 R1 K12 - 0x58280044, // 01CB LDCONST R10 K68 - 0x7C200400, // 01CC CALL R8 2 - 0xB8261000, // 01CD GETNGBL R9 K8 - 0x8C241309, // 01CE GETMET R9 R9 K9 - 0x602C0018, // 01CF GETGBL R11 G24 - 0x5830004D, // 01D0 LDCONST R12 K77 - 0x5C340C00, // 01D1 MOVE R13 R6 - 0x5C380E00, // 01D2 MOVE R14 R7 - 0x7C2C0600, // 01D3 CALL R11 3 - 0x58300012, // 01D4 LDCONST R12 K18 - 0x7C240600, // 01D5 CALL R9 3 - 0x88240113, // 01D6 GETMBR R9 R0 K19 - 0x88241338, // 01D7 GETMBR R9 R9 K56 - 0x8C241335, // 01D8 GETMET R9 R9 K53 - 0x5C2C0C00, // 01D9 MOVE R11 R6 - 0x7C240400, // 01DA CALL R9 2 - 0x4C280000, // 01DB LDNIL R10 - 0x2028120A, // 01DC NE R10 R9 R10 - 0x782A000D, // 01DD JMPF R10 #01EC - 0x60280013, // 01DE GETGBL R10 G19 - 0x7C280000, // 01DF CALL R10 0 - 0x78220000, // 01E0 JMPF R8 #01E2 - 0x982A8A08, // 01E1 SETIDX R10 K69 R8 - 0x8C2C133F, // 01E2 GETMET R11 R9 K63 - 0x5C341200, // 01E3 MOVE R13 R9 - 0x5C381400, // 01E4 MOVE R14 R10 - 0x5C3C0E00, // 01E5 MOVE R15 R7 - 0x7C2C0800, // 01E6 CALL R11 4 - 0x882C0113, // 01E7 GETMBR R11 R0 K19 - 0x8C2C174E, // 01E8 GETMET R11 R11 K78 - 0x5C340C00, // 01E9 MOVE R13 R6 + 0x881C0F35, // 01BA GETMBR R7 R7 K53 + 0x741E0005, // 01BB JMPT R7 #01C2 + 0x881C0113, // 01BC GETMBR R7 R0 K19 + 0x50200200, // 01BD LDBOOL R8 1 0 + 0x901E6A08, // 01BE SETMBR R7 K53 R8 + 0x881C0113, // 01BF GETMBR R7 R0 K19 + 0x8C1C0F1B, // 01C0 GETMET R7 R7 K27 + 0x7C1C0200, // 01C1 CALL R7 1 + 0x8C1C031C, // 01C2 GETMET R7 R1 K28 + 0x58240033, // 01C3 LDCONST R9 K51 + 0x7C1C0400, // 01C4 CALL R7 2 + 0x700200BB, // 01C5 JMP #0282 + 0x8C18030E, // 01C6 GETMET R6 R1 K14 + 0x5820004D, // 01C7 LDCONST R8 K77 + 0x7C180400, // 01C8 CALL R6 2 + 0x781A002B, // 01C9 JMPF R6 #01F6 + 0x8C18030C, // 01CA GETMET R6 R1 K12 + 0x5820004E, // 01CB LDCONST R8 K78 + 0x7C180400, // 01CC CALL R6 2 + 0x8C1C030C, // 01CD GETMET R7 R1 K12 + 0x5824000C, // 01CE LDCONST R9 K12 + 0x7C1C0400, // 01CF CALL R7 2 + 0x8C20030C, // 01D0 GETMET R8 R1 K12 + 0x58280046, // 01D1 LDCONST R10 K70 + 0x7C200400, // 01D2 CALL R8 2 + 0xB8261000, // 01D3 GETNGBL R9 K8 + 0x8C241309, // 01D4 GETMET R9 R9 K9 + 0x602C0018, // 01D5 GETGBL R11 G24 + 0x5830004F, // 01D6 LDCONST R12 K79 + 0x5C340C00, // 01D7 MOVE R13 R6 + 0x5C380E00, // 01D8 MOVE R14 R7 + 0x7C2C0600, // 01D9 CALL R11 3 + 0x58300012, // 01DA LDCONST R12 K18 + 0x7C240600, // 01DB CALL R9 3 + 0x88240113, // 01DC GETMBR R9 R0 K19 + 0x8824133A, // 01DD GETMBR R9 R9 K58 + 0x8C241337, // 01DE GETMET R9 R9 K55 + 0x5C2C0C00, // 01DF MOVE R11 R6 + 0x7C240400, // 01E0 CALL R9 2 + 0x4C280000, // 01E1 LDNIL R10 + 0x2028120A, // 01E2 NE R10 R9 R10 + 0x782A000D, // 01E3 JMPF R10 #01F2 + 0x60280013, // 01E4 GETGBL R10 G19 + 0x7C280000, // 01E5 CALL R10 0 + 0x78220000, // 01E6 JMPF R8 #01E8 + 0x982A8E08, // 01E7 SETIDX R10 K71 R8 + 0x8C2C1341, // 01E8 GETMET R11 R9 K65 + 0x5C341200, // 01E9 MOVE R13 R9 0x5C381400, // 01EA MOVE R14 R10 - 0x7C2C0600, // 01EB CALL R11 3 - 0x8C28031A, // 01EC GETMET R10 R1 K26 - 0x58300031, // 01ED LDCONST R12 K49 - 0x7C280400, // 01EE CALL R10 2 - 0x7002008B, // 01EF JMP #027C - 0x8C18030E, // 01F0 GETMET R6 R1 K14 - 0x5820004F, // 01F1 LDCONST R8 K79 - 0x7C180400, // 01F2 CALL R6 2 - 0x781A005E, // 01F3 JMPF R6 #0253 - 0x8C18030C, // 01F4 GETMET R6 R1 K12 - 0x58200050, // 01F5 LDCONST R8 K80 - 0x7C180400, // 01F6 CALL R6 2 - 0x4C1C0000, // 01F7 LDNIL R7 - 0x1C1C0C07, // 01F8 EQ R7 R6 R7 - 0x741E0001, // 01F9 JMPT R7 #01FC - 0x1C1C0D3A, // 01FA EQ R7 R6 K58 - 0x781E0000, // 01FB JMPF R7 #01FD - 0xB006A352, // 01FC RAISE 1 K81 K82 - 0x581C0005, // 01FD LDCONST R7 K5 - 0x60200008, // 01FE GETGBL R8 G8 - 0x5C240E00, // 01FF MOVE R9 R7 - 0x7C200200, // 0200 CALL R8 1 - 0x8C24030E, // 0201 GETMET R9 R1 K14 - 0x002E9808, // 0202 ADD R11 K76 R8 - 0x7C240400, // 0203 CALL R9 2 - 0x78260049, // 0204 JMPF R9 #024F - 0x8C24030C, // 0205 GETMET R9 R1 K12 - 0x002E9808, // 0206 ADD R11 K76 R8 - 0x7C240400, // 0207 CALL R9 2 - 0x8C28030C, // 0208 GETMET R10 R1 K12 - 0x00321808, // 0209 ADD R12 K12 R8 - 0x7C280400, // 020A CALL R10 2 - 0x8C2C030C, // 020B GETMET R11 R1 K12 - 0x00368808, // 020C ADD R13 K68 R8 - 0x7C2C0400, // 020D CALL R11 2 - 0x2030133A, // 020E NE R12 R9 K58 - 0x78320038, // 020F JMPF R12 #0249 - 0x88300113, // 0210 GETMBR R12 R0 K19 - 0x88301938, // 0211 GETMBR R12 R12 K56 - 0x8C301935, // 0212 GETMET R12 R12 K53 - 0x5C381200, // 0213 MOVE R14 R9 - 0x7C300400, // 0214 CALL R12 2 - 0x4C340000, // 0215 LDNIL R13 - 0x2034180D, // 0216 NE R13 R12 R13 - 0x78360030, // 0217 JMPF R13 #0249 - 0x60340013, // 0218 GETGBL R13 G19 - 0x7C340000, // 0219 CALL R13 0 - 0x9836A006, // 021A SETIDX R13 K80 R6 - 0x98367209, // 021B SETIDX R13 K57 R9 - 0x782E0000, // 021C JMPF R11 #021E - 0x98368A0B, // 021D SETIDX R13 K69 R11 - 0x8C38193F, // 021E GETMET R14 R12 K63 - 0x5C401800, // 021F MOVE R16 R12 - 0x5C441A00, // 0220 MOVE R17 R13 - 0x5C481400, // 0221 MOVE R18 R10 - 0x7C380800, // 0222 CALL R14 4 - 0x50380000, // 0223 LDBOOL R14 0 0 - 0x603C0010, // 0224 GETGBL R15 G16 - 0x88400113, // 0225 GETMBR R16 R0 K19 - 0x88402137, // 0226 GETMBR R16 R16 K55 - 0x7C3C0200, // 0227 CALL R15 1 - 0xA802000B, // 0228 EXBLK 0 #0235 - 0x5C401E00, // 0229 MOVE R16 R15 - 0x7C400000, // 022A CALL R16 0 - 0x8C440153, // 022B GETMET R17 R0 K83 - 0x5C4C2000, // 022C MOVE R19 R16 - 0x5C501A00, // 022D MOVE R20 R13 - 0x7C440600, // 022E CALL R17 3 - 0x78460001, // 022F JMPF R17 #0232 - 0x50380200, // 0230 LDBOOL R14 1 0 - 0x70020000, // 0231 JMP #0233 - 0x7001FFF5, // 0232 JMP #0229 - 0xA8040001, // 0233 EXBLK 1 1 - 0x70020002, // 0234 JMP #0238 - 0x583C000D, // 0235 LDCONST R15 K13 - 0xAC3C0200, // 0236 CATCH R15 1 0 - 0xB0080000, // 0237 RAISE 2 R0 R0 - 0x5C3C1C00, // 0238 MOVE R15 R14 - 0x743E000E, // 0239 JMPT R15 #0249 - 0xB83E1000, // 023A GETNGBL R15 K8 - 0x8C3C1F09, // 023B GETMET R15 R15 K9 - 0x60440018, // 023C GETGBL R17 G24 - 0x58480054, // 023D LDCONST R18 K84 - 0x5C4C0C00, // 023E MOVE R19 R6 - 0x5C501200, // 023F MOVE R20 R9 - 0x5C541400, // 0240 MOVE R21 R10 - 0x7C440800, // 0241 CALL R17 4 - 0x58480012, // 0242 LDCONST R18 K18 - 0x7C3C0600, // 0243 CALL R15 3 - 0x883C0113, // 0244 GETMBR R15 R0 K19 - 0x8C3C1F4E, // 0245 GETMET R15 R15 K78 - 0x5C441200, // 0246 MOVE R17 R9 - 0x5C481A00, // 0247 MOVE R18 R13 - 0x7C3C0600, // 0248 CALL R15 3 - 0x001C0F07, // 0249 ADD R7 R7 K7 - 0x60300008, // 024A GETGBL R12 G8 - 0x5C340E00, // 024B MOVE R13 R7 - 0x7C300200, // 024C CALL R12 1 - 0x5C201800, // 024D MOVE R8 R12 - 0x7001FFB1, // 024E JMP #0201 - 0x8C24031A, // 024F GETMET R9 R1 K26 - 0x582C0031, // 0250 LDCONST R11 K49 - 0x7C240400, // 0251 CALL R9 2 - 0x70020028, // 0252 JMP #027C - 0x4C180000, // 0253 LDNIL R6 - 0x601C0010, // 0254 GETGBL R7 G16 - 0x8C200306, // 0255 GETMET R8 R1 K6 - 0x7C200200, // 0256 CALL R8 1 - 0x04201107, // 0257 SUB R8 R8 K7 - 0x40220A08, // 0258 CONNECT R8 K5 R8 - 0x7C1C0200, // 0259 CALL R7 1 - 0xA8020013, // 025A EXBLK 0 #026F - 0x5C200E00, // 025B MOVE R8 R7 - 0x7C200000, // 025C CALL R8 0 - 0x8C24030B, // 025D GETMET R9 R1 K11 - 0x5C2C1000, // 025E MOVE R11 R8 - 0x7C240400, // 025F CALL R9 2 - 0x8C280535, // 0260 GETMET R10 R2 K53 - 0x5C301200, // 0261 MOVE R12 R9 - 0x58340055, // 0262 LDCONST R13 K85 - 0x7C280600, // 0263 CALL R10 3 - 0x1C281505, // 0264 EQ R10 R10 K5 - 0x782A0005, // 0265 JMPF R10 #026C - 0x60280009, // 0266 GETGBL R10 G9 - 0x402E2536, // 0267 CONNECT R11 K18 K54 - 0x942C120B, // 0268 GETIDX R11 R9 R11 - 0x7C280200, // 0269 CALL R10 1 - 0x5C181400, // 026A MOVE R6 R10 - 0x70020000, // 026B JMP #026D - 0x7001FFED, // 026C JMP #025B - 0xA8040001, // 026D EXBLK 1 1 - 0x70020002, // 026E JMP #0272 - 0x581C000D, // 026F LDCONST R7 K13 - 0xAC1C0200, // 0270 CATCH R7 1 0 - 0xB0080000, // 0271 RAISE 2 R0 R0 - 0x4C1C0000, // 0272 LDNIL R7 - 0x201C0C07, // 0273 NE R7 R6 R7 - 0x781E0006, // 0274 JMPF R7 #027C - 0x881C0113, // 0275 GETMBR R7 R0 K19 - 0x8C1C0F56, // 0276 GETMET R7 R7 K86 - 0x5C240C00, // 0277 MOVE R9 R6 - 0x7C1C0400, // 0278 CALL R7 2 - 0x8C1C031A, // 0279 GETMET R7 R1 K26 - 0x58240031, // 027A LDCONST R9 K49 - 0x7C1C0400, // 027B CALL R7 2 - 0x78160011, // 027C JMPF R5 #028F - 0x8C180357, // 027D GETMET R6 R1 K87 - 0x58200058, // 027E LDCONST R8 K88 - 0x7C180400, // 027F CALL R6 2 - 0x8C180359, // 0280 GETMET R6 R1 K89 - 0x7C180200, // 0281 CALL R6 1 - 0x8C18035A, // 0282 GETMET R6 R1 K90 - 0x60200018, // 0283 GETGBL R8 G24 - 0x5824005B, // 0284 LDCONST R9 K91 - 0x8C28035C, // 0285 GETMET R10 R1 K92 - 0x5C300A00, // 0286 MOVE R12 R5 - 0x7C280400, // 0287 CALL R10 2 - 0x7C200400, // 0288 CALL R8 2 - 0x7C180400, // 0289 CALL R6 2 - 0x8C18035D, // 028A GETMET R6 R1 K93 - 0x8820035E, // 028B GETMBR R8 R1 K94 - 0x7C180400, // 028C CALL R6 2 - 0x8C18035F, // 028D GETMET R6 R1 K95 - 0x7C180200, // 028E CALL R6 1 - 0xA8040001, // 028F EXBLK 1 1 - 0x7002001D, // 0290 JMP #02AF - 0xAC180002, // 0291 CATCH R6 0 2 - 0x7002001A, // 0292 JMP #02AE - 0xB8221000, // 0293 GETNGBL R8 K8 - 0x8C201109, // 0294 GETMET R8 R8 K9 - 0x60280018, // 0295 GETGBL R10 G24 - 0x582C0060, // 0296 LDCONST R11 K96 - 0x5C300C00, // 0297 MOVE R12 R6 - 0x5C340E00, // 0298 MOVE R13 R7 - 0x7C280600, // 0299 CALL R10 3 - 0x582C0061, // 029A LDCONST R11 K97 - 0x7C200600, // 029B CALL R8 3 - 0x8C200357, // 029C GETMET R8 R1 K87 - 0x58280058, // 029D LDCONST R10 K88 - 0x7C200400, // 029E CALL R8 2 - 0x8C200359, // 029F GETMET R8 R1 K89 - 0x7C200200, // 02A0 CALL R8 1 - 0x8C20035A, // 02A1 GETMET R8 R1 K90 - 0x60280018, // 02A2 GETGBL R10 G24 - 0x582C0062, // 02A3 LDCONST R11 K98 - 0x5C300C00, // 02A4 MOVE R12 R6 - 0x5C340E00, // 02A5 MOVE R13 R7 - 0x7C280600, // 02A6 CALL R10 3 - 0x7C200400, // 02A7 CALL R8 2 - 0x8C20035D, // 02A8 GETMET R8 R1 K93 - 0x8828035E, // 02A9 GETMBR R10 R1 K94 - 0x7C200400, // 02AA CALL R8 2 - 0x8C20035F, // 02AB GETMET R8 R1 K95 - 0x7C200200, // 02AC CALL R8 1 - 0x70020000, // 02AD JMP #02AF - 0xB0080000, // 02AE RAISE 2 R0 R0 - 0x80000000, // 02AF RET 0 + 0x5C3C0E00, // 01EB MOVE R15 R7 + 0x7C2C0800, // 01EC CALL R11 4 + 0x882C0113, // 01ED GETMBR R11 R0 K19 + 0x8C2C1750, // 01EE GETMET R11 R11 K80 + 0x5C340C00, // 01EF MOVE R13 R6 + 0x5C381400, // 01F0 MOVE R14 R10 + 0x7C2C0600, // 01F1 CALL R11 3 + 0x8C28031C, // 01F2 GETMET R10 R1 K28 + 0x58300033, // 01F3 LDCONST R12 K51 + 0x7C280400, // 01F4 CALL R10 2 + 0x7002008B, // 01F5 JMP #0282 + 0x8C18030E, // 01F6 GETMET R6 R1 K14 + 0x58200051, // 01F7 LDCONST R8 K81 + 0x7C180400, // 01F8 CALL R6 2 + 0x781A005E, // 01F9 JMPF R6 #0259 + 0x8C18030C, // 01FA GETMET R6 R1 K12 + 0x58200052, // 01FB LDCONST R8 K82 + 0x7C180400, // 01FC CALL R6 2 + 0x4C1C0000, // 01FD LDNIL R7 + 0x1C1C0C07, // 01FE EQ R7 R6 R7 + 0x741E0001, // 01FF JMPT R7 #0202 + 0x1C1C0D3C, // 0200 EQ R7 R6 K60 + 0x781E0000, // 0201 JMPF R7 #0203 + 0xB006A754, // 0202 RAISE 1 K83 K84 + 0x581C0005, // 0203 LDCONST R7 K5 + 0x60200008, // 0204 GETGBL R8 G8 + 0x5C240E00, // 0205 MOVE R9 R7 + 0x7C200200, // 0206 CALL R8 1 + 0x8C24030E, // 0207 GETMET R9 R1 K14 + 0x002E9C08, // 0208 ADD R11 K78 R8 + 0x7C240400, // 0209 CALL R9 2 + 0x78260049, // 020A JMPF R9 #0255 + 0x8C24030C, // 020B GETMET R9 R1 K12 + 0x002E9C08, // 020C ADD R11 K78 R8 + 0x7C240400, // 020D CALL R9 2 + 0x8C28030C, // 020E GETMET R10 R1 K12 + 0x00321808, // 020F ADD R12 K12 R8 + 0x7C280400, // 0210 CALL R10 2 + 0x8C2C030C, // 0211 GETMET R11 R1 K12 + 0x00368C08, // 0212 ADD R13 K70 R8 + 0x7C2C0400, // 0213 CALL R11 2 + 0x2030133C, // 0214 NE R12 R9 K60 + 0x78320038, // 0215 JMPF R12 #024F + 0x88300113, // 0216 GETMBR R12 R0 K19 + 0x8830193A, // 0217 GETMBR R12 R12 K58 + 0x8C301937, // 0218 GETMET R12 R12 K55 + 0x5C381200, // 0219 MOVE R14 R9 + 0x7C300400, // 021A CALL R12 2 + 0x4C340000, // 021B LDNIL R13 + 0x2034180D, // 021C NE R13 R12 R13 + 0x78360030, // 021D JMPF R13 #024F + 0x60340013, // 021E GETGBL R13 G19 + 0x7C340000, // 021F CALL R13 0 + 0x9836A406, // 0220 SETIDX R13 K82 R6 + 0x98367609, // 0221 SETIDX R13 K59 R9 + 0x782E0000, // 0222 JMPF R11 #0224 + 0x98368E0B, // 0223 SETIDX R13 K71 R11 + 0x8C381941, // 0224 GETMET R14 R12 K65 + 0x5C401800, // 0225 MOVE R16 R12 + 0x5C441A00, // 0226 MOVE R17 R13 + 0x5C481400, // 0227 MOVE R18 R10 + 0x7C380800, // 0228 CALL R14 4 + 0x50380000, // 0229 LDBOOL R14 0 0 + 0x603C0010, // 022A GETGBL R15 G16 + 0x88400113, // 022B GETMBR R16 R0 K19 + 0x88402139, // 022C GETMBR R16 R16 K57 + 0x7C3C0200, // 022D CALL R15 1 + 0xA802000B, // 022E EXBLK 0 #023B + 0x5C401E00, // 022F MOVE R16 R15 + 0x7C400000, // 0230 CALL R16 0 + 0x8C440155, // 0231 GETMET R17 R0 K85 + 0x5C4C2000, // 0232 MOVE R19 R16 + 0x5C501A00, // 0233 MOVE R20 R13 + 0x7C440600, // 0234 CALL R17 3 + 0x78460001, // 0235 JMPF R17 #0238 + 0x50380200, // 0236 LDBOOL R14 1 0 + 0x70020000, // 0237 JMP #0239 + 0x7001FFF5, // 0238 JMP #022F + 0xA8040001, // 0239 EXBLK 1 1 + 0x70020002, // 023A JMP #023E + 0x583C000D, // 023B LDCONST R15 K13 + 0xAC3C0200, // 023C CATCH R15 1 0 + 0xB0080000, // 023D RAISE 2 R0 R0 + 0x5C3C1C00, // 023E MOVE R15 R14 + 0x743E000E, // 023F JMPT R15 #024F + 0xB83E1000, // 0240 GETNGBL R15 K8 + 0x8C3C1F09, // 0241 GETMET R15 R15 K9 + 0x60440018, // 0242 GETGBL R17 G24 + 0x58480056, // 0243 LDCONST R18 K86 + 0x5C4C0C00, // 0244 MOVE R19 R6 + 0x5C501200, // 0245 MOVE R20 R9 + 0x5C541400, // 0246 MOVE R21 R10 + 0x7C440800, // 0247 CALL R17 4 + 0x58480012, // 0248 LDCONST R18 K18 + 0x7C3C0600, // 0249 CALL R15 3 + 0x883C0113, // 024A GETMBR R15 R0 K19 + 0x8C3C1F50, // 024B GETMET R15 R15 K80 + 0x5C441200, // 024C MOVE R17 R9 + 0x5C481A00, // 024D MOVE R18 R13 + 0x7C3C0600, // 024E CALL R15 3 + 0x001C0F07, // 024F ADD R7 R7 K7 + 0x60300008, // 0250 GETGBL R12 G8 + 0x5C340E00, // 0251 MOVE R13 R7 + 0x7C300200, // 0252 CALL R12 1 + 0x5C201800, // 0253 MOVE R8 R12 + 0x7001FFB1, // 0254 JMP #0207 + 0x8C24031C, // 0255 GETMET R9 R1 K28 + 0x582C0033, // 0256 LDCONST R11 K51 + 0x7C240400, // 0257 CALL R9 2 + 0x70020028, // 0258 JMP #0282 + 0x4C180000, // 0259 LDNIL R6 + 0x601C0010, // 025A GETGBL R7 G16 + 0x8C200306, // 025B GETMET R8 R1 K6 + 0x7C200200, // 025C CALL R8 1 + 0x04201107, // 025D SUB R8 R8 K7 + 0x40220A08, // 025E CONNECT R8 K5 R8 + 0x7C1C0200, // 025F CALL R7 1 + 0xA8020013, // 0260 EXBLK 0 #0275 + 0x5C200E00, // 0261 MOVE R8 R7 + 0x7C200000, // 0262 CALL R8 0 + 0x8C24030B, // 0263 GETMET R9 R1 K11 + 0x5C2C1000, // 0264 MOVE R11 R8 + 0x7C240400, // 0265 CALL R9 2 + 0x8C280537, // 0266 GETMET R10 R2 K55 + 0x5C301200, // 0267 MOVE R12 R9 + 0x58340057, // 0268 LDCONST R13 K87 + 0x7C280600, // 0269 CALL R10 3 + 0x1C281505, // 026A EQ R10 R10 K5 + 0x782A0005, // 026B JMPF R10 #0272 + 0x60280009, // 026C GETGBL R10 G9 + 0x402E2538, // 026D CONNECT R11 K18 K56 + 0x942C120B, // 026E GETIDX R11 R9 R11 + 0x7C280200, // 026F CALL R10 1 + 0x5C181400, // 0270 MOVE R6 R10 + 0x70020000, // 0271 JMP #0273 + 0x7001FFED, // 0272 JMP #0261 + 0xA8040001, // 0273 EXBLK 1 1 + 0x70020002, // 0274 JMP #0278 + 0x581C000D, // 0275 LDCONST R7 K13 + 0xAC1C0200, // 0276 CATCH R7 1 0 + 0xB0080000, // 0277 RAISE 2 R0 R0 + 0x4C1C0000, // 0278 LDNIL R7 + 0x201C0C07, // 0279 NE R7 R6 R7 + 0x781E0006, // 027A JMPF R7 #0282 + 0x881C0113, // 027B GETMBR R7 R0 K19 + 0x8C1C0F58, // 027C GETMET R7 R7 K88 + 0x5C240C00, // 027D MOVE R9 R6 + 0x7C1C0400, // 027E CALL R7 2 + 0x8C1C031C, // 027F GETMET R7 R1 K28 + 0x58240033, // 0280 LDCONST R9 K51 + 0x7C1C0400, // 0281 CALL R7 2 + 0x78160011, // 0282 JMPF R5 #0295 + 0x8C180359, // 0283 GETMET R6 R1 K89 + 0x5820005A, // 0284 LDCONST R8 K90 + 0x7C180400, // 0285 CALL R6 2 + 0x8C18035B, // 0286 GETMET R6 R1 K91 + 0x7C180200, // 0287 CALL R6 1 + 0x8C18035C, // 0288 GETMET R6 R1 K92 + 0x60200018, // 0289 GETGBL R8 G24 + 0x5824005D, // 028A LDCONST R9 K93 + 0x8C28035E, // 028B GETMET R10 R1 K94 + 0x5C300A00, // 028C MOVE R12 R5 + 0x7C280400, // 028D CALL R10 2 + 0x7C200400, // 028E CALL R8 2 + 0x7C180400, // 028F CALL R6 2 + 0x8C18035F, // 0290 GETMET R6 R1 K95 + 0x88200360, // 0291 GETMBR R8 R1 K96 + 0x7C180400, // 0292 CALL R6 2 + 0x8C180361, // 0293 GETMET R6 R1 K97 + 0x7C180200, // 0294 CALL R6 1 + 0xA8040001, // 0295 EXBLK 1 1 + 0x7002001D, // 0296 JMP #02B5 + 0xAC180002, // 0297 CATCH R6 0 2 + 0x7002001A, // 0298 JMP #02B4 + 0xB8221000, // 0299 GETNGBL R8 K8 + 0x8C201109, // 029A GETMET R8 R8 K9 + 0x60280018, // 029B GETGBL R10 G24 + 0x582C0062, // 029C LDCONST R11 K98 + 0x5C300C00, // 029D MOVE R12 R6 + 0x5C340E00, // 029E MOVE R13 R7 + 0x7C280600, // 029F CALL R10 3 + 0x582C0063, // 02A0 LDCONST R11 K99 + 0x7C200600, // 02A1 CALL R8 3 + 0x8C200359, // 02A2 GETMET R8 R1 K89 + 0x5828005A, // 02A3 LDCONST R10 K90 + 0x7C200400, // 02A4 CALL R8 2 + 0x8C20035B, // 02A5 GETMET R8 R1 K91 + 0x7C200200, // 02A6 CALL R8 1 + 0x8C20035C, // 02A7 GETMET R8 R1 K92 + 0x60280018, // 02A8 GETGBL R10 G24 + 0x582C0064, // 02A9 LDCONST R11 K100 + 0x5C300C00, // 02AA MOVE R12 R6 + 0x5C340E00, // 02AB MOVE R13 R7 + 0x7C280600, // 02AC CALL R10 3 + 0x7C200400, // 02AD CALL R8 2 + 0x8C20035F, // 02AE GETMET R8 R1 K95 + 0x88280360, // 02AF GETMBR R10 R1 K96 + 0x7C200400, // 02B0 CALL R8 2 + 0x8C200361, // 02B1 GETMET R8 R1 K97 + 0x7C200200, // 02B2 CALL R8 1 + 0x70020000, // 02B3 JMP #02B5 + 0xB0080000, // 02B4 RAISE 2 R0 R0 + 0x80000000, // 02B5 RET 0 }) ) ); From eb655a4a8fee843610804a2f8ab04197046fc94f Mon Sep 17 00:00:00 2001 From: Andrew Klaus Date: Thu, 29 Jun 2023 01:04:08 -0600 Subject: [PATCH 013/150] Add support for SGP41 TVOC/NOx Sensor (#18880) * Initial support for SGP41 * Removing delay() use from SGP4x driver * Using i18n for TVOC/NOx raw values as well --- BUILDS.md | 1 + I2CDEVICES.md | 3 +- lib/lib_i2c/arduino-i2c-sgp41/CHANGELOG.md | 13 + lib/lib_i2c/arduino-i2c-sgp41/LICENSE | 29 + lib/lib_i2c/arduino-i2c-sgp41/README.md | 78 +++ .../examples/exampleUsage/exampleUsage.ino | 124 ++++ .../arduino-i2c-sgp41/images/SGP41.png | Bin 0 -> 424504 bytes lib/lib_i2c/arduino-i2c-sgp41/keywords.txt | 27 + .../arduino-i2c-sgp41/library.properties | 10 + .../src/SensirionI2CSgp4x.cpp | 219 +++++++ .../arduino-i2c-sgp41/src/SensirionI2CSgp4x.h | 145 +++++ .../src/sensirion_gas_index_algorithm.c | 582 ++++++++++++++++++ .../src/sensirion_gas_index_algorithm.h | 290 +++++++++ tasmota/include/tasmota_configurations.h | 1 + .../include/tasmota_configurations_ESP32.h | 2 + tasmota/tasmota_support/support_features.ino | 4 +- .../tasmota_xsns_sensor/xsns_109_sgp4x.ino | 268 ++++++++ tools/decode-status.py | 2 +- 18 files changed, 1795 insertions(+), 3 deletions(-) create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/CHANGELOG.md create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/LICENSE create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/README.md create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/examples/exampleUsage/exampleUsage.ino create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/images/SGP41.png create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/keywords.txt create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/library.properties create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/src/SensirionI2CSgp4x.cpp create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/src/SensirionI2CSgp4x.h create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.c create mode 100644 lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.h create mode 100644 tasmota/tasmota_xsns_sensor/xsns_109_sgp4x.ino diff --git a/BUILDS.md b/BUILDS.md index 9c02cce72..f5767be54 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -119,6 +119,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_MGS | - | - / x | - | x | - | - | | USE_SGP30 | - | - / x | - | x | - | - | | USE_SGP40 | - | - / x | - | x | - | - | +| USE_SGP4X | - | - / x | - | x | - | - | | USE_SEN5X | - | - / x | - | x | - | - | | USE_SI1145 | - | - / - | - | - | - | - | | USE_LM75AD | - | - / x | - | x | - | - | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index b7e806eea..2a51ad36c 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -116,4 +116,5 @@ Index | Define | Driver | Device | Address(es) | Description 78 | USE_PMSA003I | xsns_104 | PMSA003I | 0x12 | PM2.5 Air Quality Sensor with I2C Interface 79 | USE_GDK101 | xsns_106 | GDK101 | 0x18 - 0x1B | Gamma Radiation Sensor 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor - 81 | USE_PCA9557 | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual button/switch/relay \ No newline at end of file + 81 | USE_PCA9557 | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual button/switch/relay + 82 | USE_SGP4X | xsns_109 | SGP4X | 0x59 | Gas (TVOC/NOx index) diff --git a/lib/lib_i2c/arduino-i2c-sgp41/CHANGELOG.md b/lib/lib_i2c/arduino-i2c-sgp41/CHANGELOG.md new file mode 100644 index 000000000..b119c080d --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/CHANGELOG.md @@ -0,0 +1,13 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + + +## [0.1.0] - 2021-11-17 + +Initial release + +[0.1.0]: https://github.com/Sensirion/arduino-i2c-sgp41/releases/tag/0.1.0 + diff --git a/lib/lib_i2c/arduino-i2c-sgp41/LICENSE b/lib/lib_i2c/arduino-i2c-sgp41/LICENSE new file mode 100644 index 000000000..ff20c41df --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/LICENSE @@ -0,0 +1,29 @@ +BSD 3-Clause License + +Copyright (c) 2021, Sensirion AG +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/lib/lib_i2c/arduino-i2c-sgp41/README.md b/lib/lib_i2c/arduino-i2c-sgp41/README.md new file mode 100644 index 000000000..0a3744647 --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/README.md @@ -0,0 +1,78 @@ +# Sensirion I2C SGP41 Arduino Library + +This is the Sensirion SGP41 library for Arduino using the +modules I2C interface. + +[
](https://www.sensirion.com/en/environmental-sensors/gas-sensors/sgp41) + +Click [here](https://www.sensirion.com/en/environmental-sensors/gas-sensors/sgp41) to learn more about the SGP41 sensor. + + +# Installation + +To install, download the latest release as .zip file and add it to your +[Arduino IDE](http://www.arduino.cc/en/main/software) via + + Sketch => Include Library => Add .ZIP Library... + +Don't forget to **install the dependencies** listed below the same way via `Add +.ZIP Library` + +Note: Installation via the Arduino Library Manager is coming soon. + +# Dependencies + +* [Sensirion Core](https://github.com/Sensirion/arduino-core) + + +# Quick Start + +1. Connect the SGP41 Sensor to your Arduino board's standard + I2C bus. Check the pinout of your Arduino board to find the correct pins. + The pinout of the SGP41 Sensor board can be found in the + data sheet. + + * **VDD** of the SEK-SGP41 to the **3.3V** of your Arduino board + * **GND** of the SEK-SGP41 to the **GND** of your Arduino board + * **SCL** of the SEK-SGP41 to the **SCL** of your Arduino board + * **SDA** of the SEK-SGP41 to the **SDA** of your Arduino board + +2. Open the `exampleUsage` sample project within the Arduino IDE + + File => Examples => Sensirion I2C SGP41 => exampleUsage + +3. Click the `Upload` button in the Arduino IDE or + + Sketch => Upload + +4. When the upload process has finished, open the `Serial Monitor` or `Serial + Plotter` via the `Tools` menu to observe the measurement values. Note that + the `Baud Rate` in the corresponding window has to be set to `115200 baud`. + +# Contributing + +**Contributions are welcome!** + +We develop and test this driver using our company internal tools (version +control, continuous integration, code review etc.) and automatically +synchronize the master branch with GitHub. But this doesn't mean that we don't +respond to issues or don't accept pull requests on GitHub. In fact, you're very +welcome to open issues or create pull requests :) + +This Sensirion library uses +[`clang-format`](https://releases.llvm.org/download.html) to standardize the +formatting of all our `.cpp` and `.h` files. Make sure your contributions are +formatted accordingly: + +The `-i` flag will apply the format changes to the files listed. + +```bash +clang-format -i src/*.cpp src/*.h +``` + +Note that differences from this formatting will result in a failed build until +they are fixed. + +# License + +See [LICENSE](LICENSE). diff --git a/lib/lib_i2c/arduino-i2c-sgp41/examples/exampleUsage/exampleUsage.ino b/lib/lib_i2c/arduino-i2c-sgp41/examples/exampleUsage/exampleUsage.ino new file mode 100644 index 000000000..3490dddb2 --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/examples/exampleUsage/exampleUsage.ino @@ -0,0 +1,124 @@ +/* + * I2C-Generator: 0.3.0 + * Yaml Version: 0.1.0 + * Template Version: 0.7.0-62-g3d691f9 + */ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include + +SensirionI2CSgp41 sgp41; + +// time in seconds needed for NOx conditioning +uint16_t conditioning_s = 10; + +void setup() { + + Serial.begin(115200); + while (!Serial) { + delay(100); + } + + Wire.begin(); + + uint16_t error; + char errorMessage[256]; + + sgp41.begin(Wire); + + uint16_t serialNumber[3]; + uint8_t serialNumberSize = 3; + + error = sgp41.getSerialNumber(serialNumber, serialNumberSize); + + if (error) { + Serial.print("Error trying to execute getSerialNumber(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else { + Serial.print("SerialNumber:"); + Serial.print("0x"); + for (size_t i = 0; i < serialNumberSize; i++) { + uint16_t value = serialNumber[i]; + Serial.print(value < 4096 ? "0" : ""); + Serial.print(value < 256 ? "0" : ""); + Serial.print(value < 16 ? "0" : ""); + Serial.print(value, HEX); + } + Serial.println(); + } + + uint16_t testResult; + error = sgp41.executeSelfTest(testResult); + if (error) { + Serial.print("Error trying to execute executeSelfTest(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else if (testResult != 0xD400) { + Serial.print("executeSelfTest failed with error: "); + Serial.println(testResult); + } +} + +void loop() { + uint16_t error; + char errorMessage[256]; + uint16_t defaultRh = 0x8000; + uint16_t defaultT = 0x6666; + uint16_t srawVoc = 0; + uint16_t srawNox = 0; + + delay(1000); + + if (conditioning_s > 0) { + // During NOx conditioning (10s) SRAW NOx will remain 0 + error = sgp41.executeConditioning(defaultRh, defaultT, srawVoc); + conditioning_s--; + } else { + // Read Measurement + error = sgp41.measureRawSignals(defaultRh, defaultT, srawVoc, srawNox); + } + + if (error) { + Serial.print("Error trying to execute measureRawSignals(): "); + errorToString(error, errorMessage, 256); + Serial.println(errorMessage); + } else { + Serial.print("SRAW_VOC:"); + Serial.print(srawVoc); + Serial.print("\t"); + Serial.print("SRAW_NOx:"); + Serial.println(srawNox); + } +} diff --git a/lib/lib_i2c/arduino-i2c-sgp41/images/SGP41.png b/lib/lib_i2c/arduino-i2c-sgp41/images/SGP41.png new file mode 100644 index 0000000000000000000000000000000000000000..a36e2d82e55279fe0137a33f2d7518ac3176d59a GIT binary patch literal 424504 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

usTsB+Dk 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

PrUW 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 z

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 + +#define SGP4X_I2C_ADDRESS 0x59 + +SensirionI2CSgp4x::SensirionI2CSgp4x() { +} + +void SensirionI2CSgp4x::begin(TwoWire& i2cBus) { + _i2cBus = &i2cBus; +} + +uint16_t SensirionI2CSgp4x::sendConditioningCmd(uint16_t defaultRh, + uint16_t defaultT) { + uint16_t error; + uint8_t buffer[8]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x2612, buffer, 8); + + error = txFrame.addUInt16(defaultRh); + error |= txFrame.addUInt16(defaultT); + if (error) { + return error; + } + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + return error; +} + +uint16_t SensirionI2CSgp4x::readConditioningValue(uint16_t& srawVoc){ + // This must run at least 50ms after initiateConditioning + uint16_t error; + uint8_t buffer[8]; + + SensirionI2CRxFrame rxFrame(buffer, 8); + error = SensirionI2CCommunication::receiveFrame(SGP4X_I2C_ADDRESS, 3, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(srawVoc); + return error; +} + +uint16_t SensirionI2CSgp4x::sendRawSignalsCmd(uint16_t relativeHumidity, + uint16_t temperature) { + uint16_t error; + uint8_t buffer[8]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x2619, buffer, 8); + + error = txFrame.addUInt16(relativeHumidity); + error |= txFrame.addUInt16(temperature); + if (error) { + return error; + } + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + return error; +} + +uint16_t SensirionI2CSgp4x::readRawSignalsValue(uint16_t& srawVoc, + uint16_t& srawNox) { + // This must run 50ms after initiateRawSignals + + uint16_t error; + uint8_t buffer[6]; + SensirionI2CRxFrame rxFrame(buffer, 6); + error = SensirionI2CCommunication::receiveFrame(SGP4X_I2C_ADDRESS, 6, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(srawVoc); + error |= rxFrame.getUInt16(srawNox); + return error; +} + +uint16_t SensirionI2CSgp4x::sendRawSignalCmd(uint16_t relativeHumidity, + uint16_t temperature) { + uint16_t error; + uint8_t buffer[8]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x260F, buffer, 8); + + error = txFrame.addUInt16(relativeHumidity); + error |= txFrame.addUInt16(temperature); + + if (error) { + return error; + } + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + return error; + +} + + +uint16_t SensirionI2CSgp4x::readRawSignalValue(uint16_t& srawVoc) { + uint16_t error; + uint8_t buffer[8]; + + SensirionI2CRxFrame rxFrame(buffer, 8); + error = SensirionI2CCommunication::receiveFrame(SGP4X_I2C_ADDRESS, 3, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(srawVoc); + return error; + +} + +uint16_t SensirionI2CSgp4x::sendSelfTestCmd() { + uint16_t error; + uint8_t buffer[3]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x280E, buffer, 3); + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + return error; +} + +uint16_t SensirionI2CSgp4x::readSelfTestValue(uint16_t& testResult) { + // Must run 320ms after initiateSelfTest + uint16_t error; + uint8_t buffer[3]; + + SensirionI2CRxFrame rxFrame(buffer, 3); + error = SensirionI2CCommunication::receiveFrame(SGP4X_I2C_ADDRESS, 3, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(testResult); + return error; +} + +uint16_t SensirionI2CSgp4x::turnHeaterOff() { + uint16_t error; + uint8_t buffer[2]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x3615, buffer, 2); + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + delay(1); + return error; +} + +uint16_t SensirionI2CSgp4x::getSerialNumber(uint16_t serialNumber[], + uint8_t serialNumberSize) { + uint16_t error; + uint8_t buffer[9]; + SensirionI2CTxFrame txFrame = + SensirionI2CTxFrame::createWithUInt16Command(0x3682, buffer, 9); + + error = SensirionI2CCommunication::sendFrame(SGP4X_I2C_ADDRESS, txFrame, + *_i2cBus); + if (error) { + return error; + } + + delay(1); + + SensirionI2CRxFrame rxFrame(buffer, 9); + error = SensirionI2CCommunication::receiveFrame(SGP4X_I2C_ADDRESS, 9, + rxFrame, *_i2cBus); + if (error) { + return error; + } + + error |= rxFrame.getUInt16(serialNumber[0]); + error |= rxFrame.getUInt16(serialNumber[1]); + error |= rxFrame.getUInt16(serialNumber[2]); + return error; +} diff --git a/lib/lib_i2c/arduino-i2c-sgp41/src/SensirionI2CSgp4x.h b/lib/lib_i2c/arduino-i2c-sgp41/src/SensirionI2CSgp4x.h new file mode 100644 index 000000000..b03bed3f4 --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/src/SensirionI2CSgp4x.h @@ -0,0 +1,145 @@ +/* + * THIS FILE IS AUTOMATICALLY GENERATED + * + * I2C-Generator: 0.3.0 + * Yaml Version: 0.1.0 + * Template Version: 0.7.0-62-g3d691f9 + */ +/* + * Copyright (c) 2021, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SENSIRIONI2CSGP4X_H +#define SENSIRIONI2CSGP4X_H + +#include + +#include + +class SensirionI2CSgp4x { + + public: + SensirionI2CSgp4x(); + /** + * begin() - Initializes the SensirionI2CSgp4x class. + * + * @param serial Arduino stream object to be communicated with. + * + */ + void begin(TwoWire& i2cBus); + + /** + * executeConditioning() - This command starts the conditioning, i.e., the + * VOC pixel will be operated at the same temperature as it is by calling + * the sgp41_measure_raw command while the NOx pixel will be operated at a + * different temperature for conditioning. This command returns only the + * measured raw signal of the VOC pixel SRAW_VOC as 2 bytes (+ 1 CRC byte). + * + * @param defaultRh Default conditions for relative humidty. + * + * @param defaultT Default conditions for temperature. + * + * @param srawVoc u16 unsigned integer directly provides the raw signal + * SRAW_VOC in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @return 0 on success, an error code otherwise + */ + uint16_t sendConditioningCmd(uint16_t defaultRh, uint16_t defaultT); + + uint16_t readConditioningValue(uint16_t& srawVoc); + + /** + * measureRawSignals() - This command starts/continues the VOC+NOx + * measurement mode + * + * @param relativeHumidity Leaves humidity compensation disabled by sending + * the default value 0x8000 (50%RH) or enables humidity compensation when + * sending the relative humidity in ticks (ticks = %RH * 65535 / 100) + * + * @param temperature Leaves humidity compensation disabled by sending the + * default value 0x6666 (25 degC) or enables humidity compensation when + * sending the temperature in ticks (ticks = (degC + 45) * 65535 / 175) + * + * @param srawVoc u16 unsigned integer directly provides the raw signal + * SRAW_VOC in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @param srawNox u16 unsigned integer directly provides the raw signal + * SRAW_NOX in ticks which is proportional to the logarithm of the + * resistance of the sensing element. + * + * @return 0 on success, an error code otherwise + */ + uint16_t sendRawSignalsCmd(uint16_t relativeHumidity, uint16_t temperature); + uint16_t readRawSignalsValue(uint16_t& srawVoc, uint16_t& srawNox); + + uint16_t sendRawSignalCmd(uint16_t relativeHumidity, uint16_t temperature); + uint16_t readRawSignalValue(uint16_t& srawVoc); + + /** + * executeSelfTest() - This command triggers the built-in self-test checking + * for integrity of both hotplate and MOX material and returns the result of + * this test as 2 bytes + * + * @param testResult 0xXX 0xYY: ignore most significant byte 0xXX. The four + * least significant bits of the least significant byte 0xYY provide + * information if the self-test has or has not passed for each individual + * pixel. All zero mean all tests passed successfully. Check the datasheet + * for more detailed information. + * + * @return 0 on success, an error code otherwise + */ + uint16_t sendSelfTestCmd(void); + uint16_t readSelfTestValue(uint16_t& testResult); + + /** + * turnHeaterOff() - This command turns the hotplate off and stops the + * measurement. Subsequently, the sensor enters the idle mode. + * + * @return 0 on success, an error code otherwise + */ + uint16_t turnHeaterOff(void); + + /** + * getSerialNumber() - This command provides the decimal serial number of + * the SGP41 chip by returning 3x2 bytes. + * + * @param serialNumber 48-bit unique serial number + * + * @return 0 on success, an error code otherwise + */ + uint16_t getSerialNumber(uint16_t serialNumber[], uint8_t serialNumberSize); + + private: + TwoWire* _i2cBus = nullptr; +}; + +#endif /* SENSIRIONI2CSGP4X_H */ diff --git a/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.c b/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.c new file mode 100644 index 000000000..5ec3edeea --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.c @@ -0,0 +1,582 @@ +/* + * Copyright (c) 2022, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include "sensirion_gas_index_algorithm.h" +#include + +static void GasIndexAlgorithm__init_instances(GasIndexAlgorithmParams* params); +static void GasIndexAlgorithm__mean_variance_estimator__set_parameters( + GasIndexAlgorithmParams* params); +static void GasIndexAlgorithm__mean_variance_estimator__set_states( + GasIndexAlgorithmParams* params, float mean, float std, float uptime_gamma); +static float GasIndexAlgorithm__mean_variance_estimator__get_std( + const GasIndexAlgorithmParams* params); +static float GasIndexAlgorithm__mean_variance_estimator__get_mean( + const GasIndexAlgorithmParams* params); +static bool GasIndexAlgorithm__mean_variance_estimator__is_initialized( + GasIndexAlgorithmParams* params); +static void GasIndexAlgorithm__mean_variance_estimator___calculate_gamma( + GasIndexAlgorithmParams* params); +static void GasIndexAlgorithm__mean_variance_estimator__process( + GasIndexAlgorithmParams* params, float sraw); +static void +GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + GasIndexAlgorithmParams* params, float X0, float K); +static float GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + GasIndexAlgorithmParams* params, float sample); +static void +GasIndexAlgorithm__mox_model__set_parameters(GasIndexAlgorithmParams* params, + float SRAW_STD, float SRAW_MEAN); +static float +GasIndexAlgorithm__mox_model__process(GasIndexAlgorithmParams* params, + float sraw); +static void GasIndexAlgorithm__sigmoid_scaled__set_parameters( + GasIndexAlgorithmParams* params, float X0, float K, float offset_default); +static float +GasIndexAlgorithm__sigmoid_scaled__process(GasIndexAlgorithmParams* params, + float sample); +static void GasIndexAlgorithm__adaptive_lowpass__set_parameters( + GasIndexAlgorithmParams* params); +static float +GasIndexAlgorithm__adaptive_lowpass__process(GasIndexAlgorithmParams* params, + float sample); + +void GasIndexAlgorithm_init_with_sampling_interval( + GasIndexAlgorithmParams* params, int32_t algorithm_type, + float sampling_interval) { + params->mAlgorithm_Type = algorithm_type; + params->mSamplingInterval = sampling_interval; + if ((algorithm_type == GasIndexAlgorithm_ALGORITHM_TYPE_NOX)) { + params->mIndex_Offset = GasIndexAlgorithm_NOX_INDEX_OFFSET_DEFAULT; + params->mSraw_Minimum = GasIndexAlgorithm_NOX_SRAW_MINIMUM; + params->mGating_Max_Duration_Minutes = + GasIndexAlgorithm_GATING_NOX_MAX_DURATION_MINUTES; + params->mInit_Duration_Mean = GasIndexAlgorithm_INIT_DURATION_MEAN_NOX; + params->mInit_Duration_Variance = + GasIndexAlgorithm_INIT_DURATION_VARIANCE_NOX; + params->mGating_Threshold = GasIndexAlgorithm_GATING_THRESHOLD_NOX; + } else { + params->mIndex_Offset = GasIndexAlgorithm_VOC_INDEX_OFFSET_DEFAULT; + params->mSraw_Minimum = GasIndexAlgorithm_VOC_SRAW_MINIMUM; + params->mGating_Max_Duration_Minutes = + GasIndexAlgorithm_GATING_VOC_MAX_DURATION_MINUTES; + params->mInit_Duration_Mean = GasIndexAlgorithm_INIT_DURATION_MEAN_VOC; + params->mInit_Duration_Variance = + GasIndexAlgorithm_INIT_DURATION_VARIANCE_VOC; + params->mGating_Threshold = GasIndexAlgorithm_GATING_THRESHOLD_VOC; + } + params->mIndex_Gain = GasIndexAlgorithm_INDEX_GAIN; + params->mTau_Mean_Hours = GasIndexAlgorithm_TAU_MEAN_HOURS; + params->mTau_Variance_Hours = GasIndexAlgorithm_TAU_VARIANCE_HOURS; + params->mSraw_Std_Initial = GasIndexAlgorithm_SRAW_STD_INITIAL; + GasIndexAlgorithm_reset(params); +} + +void GasIndexAlgorithm_init(GasIndexAlgorithmParams* params, + int32_t algorithm_type) { + GasIndexAlgorithm_init_with_sampling_interval( + params, algorithm_type, GasIndexAlgorithm_DEFAULT_SAMPLING_INTERVAL); +} + +void GasIndexAlgorithm_reset(GasIndexAlgorithmParams* params) { + params->mUptime = 0.f; + params->mSraw = 0.f; + params->mGas_Index = 0; + GasIndexAlgorithm__init_instances(params); +} + +static void GasIndexAlgorithm__init_instances(GasIndexAlgorithmParams* params) { + + GasIndexAlgorithm__mean_variance_estimator__set_parameters(params); + GasIndexAlgorithm__mox_model__set_parameters( + params, GasIndexAlgorithm__mean_variance_estimator__get_std(params), + GasIndexAlgorithm__mean_variance_estimator__get_mean(params)); + if ((params->mAlgorithm_Type == GasIndexAlgorithm_ALGORITHM_TYPE_NOX)) { + GasIndexAlgorithm__sigmoid_scaled__set_parameters( + params, GasIndexAlgorithm_SIGMOID_X0_NOX, + GasIndexAlgorithm_SIGMOID_K_NOX, + GasIndexAlgorithm_NOX_INDEX_OFFSET_DEFAULT); + } else { + GasIndexAlgorithm__sigmoid_scaled__set_parameters( + params, GasIndexAlgorithm_SIGMOID_X0_VOC, + GasIndexAlgorithm_SIGMOID_K_VOC, + GasIndexAlgorithm_VOC_INDEX_OFFSET_DEFAULT); + } + GasIndexAlgorithm__adaptive_lowpass__set_parameters(params); +} + +void GasIndexAlgorithm_get_sampling_interval( + const GasIndexAlgorithmParams* params, float* sampling_interval) { + *sampling_interval = params->mSamplingInterval; +} + +void GasIndexAlgorithm_get_states(const GasIndexAlgorithmParams* params, + float* state0, float* state1) { + + *state0 = GasIndexAlgorithm__mean_variance_estimator__get_mean(params); + *state1 = GasIndexAlgorithm__mean_variance_estimator__get_std(params); + return; +} + +void GasIndexAlgorithm_set_states(GasIndexAlgorithmParams* params, float state0, + float state1) { + + GasIndexAlgorithm__mean_variance_estimator__set_states( + params, state0, state1, GasIndexAlgorithm_PERSISTENCE_UPTIME_GAMMA); + GasIndexAlgorithm__mox_model__set_parameters( + params, GasIndexAlgorithm__mean_variance_estimator__get_std(params), + GasIndexAlgorithm__mean_variance_estimator__get_mean(params)); + params->mSraw = state0; +} + +void GasIndexAlgorithm_set_tuning_parameters( + GasIndexAlgorithmParams* params, int32_t index_offset, + int32_t learning_time_offset_hours, int32_t learning_time_gain_hours, + int32_t gating_max_duration_minutes, int32_t std_initial, + int32_t gain_factor) { + + params->mIndex_Offset = ((float)(index_offset)); + params->mTau_Mean_Hours = ((float)(learning_time_offset_hours)); + params->mTau_Variance_Hours = ((float)(learning_time_gain_hours)); + params->mGating_Max_Duration_Minutes = + ((float)(gating_max_duration_minutes)); + params->mSraw_Std_Initial = ((float)(std_initial)); + params->mIndex_Gain = ((float)(gain_factor)); + GasIndexAlgorithm__init_instances(params); +} + +void GasIndexAlgorithm_get_tuning_parameters( + const GasIndexAlgorithmParams* params, int32_t* index_offset, + int32_t* learning_time_offset_hours, int32_t* learning_time_gain_hours, + int32_t* gating_max_duration_minutes, int32_t* std_initial, + int32_t* gain_factor) { + + *index_offset = ((int32_t)(params->mIndex_Offset)); + *learning_time_offset_hours = ((int32_t)(params->mTau_Mean_Hours)); + *learning_time_gain_hours = ((int32_t)(params->mTau_Variance_Hours)); + *gating_max_duration_minutes = + ((int32_t)(params->mGating_Max_Duration_Minutes)); + *std_initial = ((int32_t)(params->mSraw_Std_Initial)); + *gain_factor = ((int32_t)(params->mIndex_Gain)); + return; +} + +void GasIndexAlgorithm_process(GasIndexAlgorithmParams* params, int32_t sraw, + int32_t* gas_index) { + + if ((params->mUptime <= GasIndexAlgorithm_INITIAL_BLACKOUT)) { + params->mUptime = (params->mUptime + params->mSamplingInterval); + } else { + if (((sraw > 0) && (sraw < 65000))) { + if ((sraw < (params->mSraw_Minimum + 1))) { + sraw = (params->mSraw_Minimum + 1); + } else if ((sraw > (params->mSraw_Minimum + 32767))) { + sraw = (params->mSraw_Minimum + 32767); + } + params->mSraw = ((float)((sraw - params->mSraw_Minimum))); + } + if (((params->mAlgorithm_Type == + GasIndexAlgorithm_ALGORITHM_TYPE_VOC) || + GasIndexAlgorithm__mean_variance_estimator__is_initialized( + params))) { + params->mGas_Index = + GasIndexAlgorithm__mox_model__process(params, params->mSraw); + params->mGas_Index = GasIndexAlgorithm__sigmoid_scaled__process( + params, params->mGas_Index); + } else { + params->mGas_Index = params->mIndex_Offset; + } + params->mGas_Index = GasIndexAlgorithm__adaptive_lowpass__process( + params, params->mGas_Index); + if ((params->mGas_Index < 0.5f)) { + params->mGas_Index = 0.5f; + } + if ((params->mSraw > 0.f)) { + GasIndexAlgorithm__mean_variance_estimator__process(params, + params->mSraw); + GasIndexAlgorithm__mox_model__set_parameters( + params, + GasIndexAlgorithm__mean_variance_estimator__get_std(params), + GasIndexAlgorithm__mean_variance_estimator__get_mean(params)); + } + } + *gas_index = ((int32_t)((params->mGas_Index + 0.5f))); + return; +} + +static void GasIndexAlgorithm__mean_variance_estimator__set_parameters( + GasIndexAlgorithmParams* params) { + + params->m_Mean_Variance_Estimator___Initialized = false; + params->m_Mean_Variance_Estimator___Mean = 0.f; + params->m_Mean_Variance_Estimator___Sraw_Offset = 0.f; + params->m_Mean_Variance_Estimator___Std = params->mSraw_Std_Initial; + params->m_Mean_Variance_Estimator___Gamma_Mean = + (((GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__ADDITIONAL_GAMMA_MEAN_SCALING * + GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING) * + (params->mSamplingInterval / 3600.f)) / + (params->mTau_Mean_Hours + (params->mSamplingInterval / 3600.f))); + params->m_Mean_Variance_Estimator___Gamma_Variance = + ((GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING * + (params->mSamplingInterval / 3600.f)) / + (params->mTau_Variance_Hours + (params->mSamplingInterval / 3600.f))); + if ((params->mAlgorithm_Type == GasIndexAlgorithm_ALGORITHM_TYPE_NOX)) { + params->m_Mean_Variance_Estimator___Gamma_Initial_Mean = + (((GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__ADDITIONAL_GAMMA_MEAN_SCALING * + GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING) * + params->mSamplingInterval) / + (GasIndexAlgorithm_TAU_INITIAL_MEAN_NOX + + params->mSamplingInterval)); + } else { + params->m_Mean_Variance_Estimator___Gamma_Initial_Mean = + (((GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__ADDITIONAL_GAMMA_MEAN_SCALING * + GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING) * + params->mSamplingInterval) / + (GasIndexAlgorithm_TAU_INITIAL_MEAN_VOC + + params->mSamplingInterval)); + } + params->m_Mean_Variance_Estimator___Gamma_Initial_Variance = + ((GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING * + params->mSamplingInterval) / + (GasIndexAlgorithm_TAU_INITIAL_VARIANCE + params->mSamplingInterval)); + params->m_Mean_Variance_Estimator__Gamma_Mean = 0.f; + params->m_Mean_Variance_Estimator__Gamma_Variance = 0.f; + params->m_Mean_Variance_Estimator___Uptime_Gamma = 0.f; + params->m_Mean_Variance_Estimator___Uptime_Gating = 0.f; + params->m_Mean_Variance_Estimator___Gating_Duration_Minutes = 0.f; +} + +static void GasIndexAlgorithm__mean_variance_estimator__set_states( + GasIndexAlgorithmParams* params, float mean, float std, + float uptime_gamma) { + + params->m_Mean_Variance_Estimator___Mean = mean; + params->m_Mean_Variance_Estimator___Std = std; + params->m_Mean_Variance_Estimator___Uptime_Gamma = uptime_gamma; + params->m_Mean_Variance_Estimator___Initialized = true; +} + +static float GasIndexAlgorithm__mean_variance_estimator__get_std( + const GasIndexAlgorithmParams* params) { + + return params->m_Mean_Variance_Estimator___Std; +} + +static float GasIndexAlgorithm__mean_variance_estimator__get_mean( + const GasIndexAlgorithmParams* params) { + + return (params->m_Mean_Variance_Estimator___Mean + + params->m_Mean_Variance_Estimator___Sraw_Offset); +} + +static bool GasIndexAlgorithm__mean_variance_estimator__is_initialized( + GasIndexAlgorithmParams* params) { + + return params->m_Mean_Variance_Estimator___Initialized; +} + +static void GasIndexAlgorithm__mean_variance_estimator___calculate_gamma( + GasIndexAlgorithmParams* params) { + + float uptime_limit; + float sigmoid_gamma_mean; + float gamma_mean; + float gating_threshold_mean; + float sigmoid_gating_mean; + float sigmoid_gamma_variance; + float gamma_variance; + float gating_threshold_variance; + float sigmoid_gating_variance; + + uptime_limit = (GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__FIX16_MAX - + params->mSamplingInterval); + if ((params->m_Mean_Variance_Estimator___Uptime_Gamma < uptime_limit)) { + params->m_Mean_Variance_Estimator___Uptime_Gamma = + (params->m_Mean_Variance_Estimator___Uptime_Gamma + + params->mSamplingInterval); + } + if ((params->m_Mean_Variance_Estimator___Uptime_Gating < uptime_limit)) { + params->m_Mean_Variance_Estimator___Uptime_Gating = + (params->m_Mean_Variance_Estimator___Uptime_Gating + + params->mSamplingInterval); + } + GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + params, params->mInit_Duration_Mean, + GasIndexAlgorithm_INIT_TRANSITION_MEAN); + sigmoid_gamma_mean = + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->m_Mean_Variance_Estimator___Uptime_Gamma); + gamma_mean = (params->m_Mean_Variance_Estimator___Gamma_Mean + + ((params->m_Mean_Variance_Estimator___Gamma_Initial_Mean - + params->m_Mean_Variance_Estimator___Gamma_Mean) * + sigmoid_gamma_mean)); + gating_threshold_mean = + (params->mGating_Threshold + + ((GasIndexAlgorithm_GATING_THRESHOLD_INITIAL - + params->mGating_Threshold) * + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->m_Mean_Variance_Estimator___Uptime_Gating))); + GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + params, gating_threshold_mean, + GasIndexAlgorithm_GATING_THRESHOLD_TRANSITION); + sigmoid_gating_mean = + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->mGas_Index); + params->m_Mean_Variance_Estimator__Gamma_Mean = + (sigmoid_gating_mean * gamma_mean); + GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + params, params->mInit_Duration_Variance, + GasIndexAlgorithm_INIT_TRANSITION_VARIANCE); + sigmoid_gamma_variance = + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->m_Mean_Variance_Estimator___Uptime_Gamma); + gamma_variance = + (params->m_Mean_Variance_Estimator___Gamma_Variance + + ((params->m_Mean_Variance_Estimator___Gamma_Initial_Variance - + params->m_Mean_Variance_Estimator___Gamma_Variance) * + (sigmoid_gamma_variance - sigmoid_gamma_mean))); + gating_threshold_variance = + (params->mGating_Threshold + + ((GasIndexAlgorithm_GATING_THRESHOLD_INITIAL - + params->mGating_Threshold) * + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->m_Mean_Variance_Estimator___Uptime_Gating))); + GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + params, gating_threshold_variance, + GasIndexAlgorithm_GATING_THRESHOLD_TRANSITION); + sigmoid_gating_variance = + GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + params, params->mGas_Index); + params->m_Mean_Variance_Estimator__Gamma_Variance = + (sigmoid_gating_variance * gamma_variance); + params->m_Mean_Variance_Estimator___Gating_Duration_Minutes = + (params->m_Mean_Variance_Estimator___Gating_Duration_Minutes + + ((params->mSamplingInterval / 60.f) * + (((1.f - sigmoid_gating_mean) * + (1.f + GasIndexAlgorithm_GATING_MAX_RATIO)) - + GasIndexAlgorithm_GATING_MAX_RATIO))); + if ((params->m_Mean_Variance_Estimator___Gating_Duration_Minutes < 0.f)) { + params->m_Mean_Variance_Estimator___Gating_Duration_Minutes = 0.f; + } + if ((params->m_Mean_Variance_Estimator___Gating_Duration_Minutes > + params->mGating_Max_Duration_Minutes)) { + params->m_Mean_Variance_Estimator___Uptime_Gating = 0.f; + } +} + +static void GasIndexAlgorithm__mean_variance_estimator__process( + GasIndexAlgorithmParams* params, float sraw) { + + float delta_sgp; + float c; + float additional_scaling; + + if ((params->m_Mean_Variance_Estimator___Initialized == false)) { + params->m_Mean_Variance_Estimator___Initialized = true; + params->m_Mean_Variance_Estimator___Sraw_Offset = sraw; + params->m_Mean_Variance_Estimator___Mean = 0.f; + } else { + if (((params->m_Mean_Variance_Estimator___Mean >= 100.f) || + (params->m_Mean_Variance_Estimator___Mean <= -100.f))) { + params->m_Mean_Variance_Estimator___Sraw_Offset = + (params->m_Mean_Variance_Estimator___Sraw_Offset + + params->m_Mean_Variance_Estimator___Mean); + params->m_Mean_Variance_Estimator___Mean = 0.f; + } + sraw = (sraw - params->m_Mean_Variance_Estimator___Sraw_Offset); + GasIndexAlgorithm__mean_variance_estimator___calculate_gamma(params); + delta_sgp = ((sraw - params->m_Mean_Variance_Estimator___Mean) / + GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING); + if ((delta_sgp < 0.f)) { + c = (params->m_Mean_Variance_Estimator___Std - delta_sgp); + } else { + c = (params->m_Mean_Variance_Estimator___Std + delta_sgp); + } + additional_scaling = 1.f; + if ((c > 1440.f)) { + additional_scaling = ((c / 1440.f) * (c / 1440.f)); + } + params->m_Mean_Variance_Estimator___Std = + (sqrtf((additional_scaling * + (GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING - + params->m_Mean_Variance_Estimator__Gamma_Variance))) * + sqrtf( + ((params->m_Mean_Variance_Estimator___Std * + (params->m_Mean_Variance_Estimator___Std / + (GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING * + additional_scaling))) + + (((params->m_Mean_Variance_Estimator__Gamma_Variance * + delta_sgp) / + additional_scaling) * + delta_sgp)))); + params->m_Mean_Variance_Estimator___Mean = + (params->m_Mean_Variance_Estimator___Mean + + ((params->m_Mean_Variance_Estimator__Gamma_Mean * delta_sgp) / + GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__ADDITIONAL_GAMMA_MEAN_SCALING)); + } +} + +static void +GasIndexAlgorithm__mean_variance_estimator___sigmoid__set_parameters( + GasIndexAlgorithmParams* params, float X0, float K) { + + params->m_Mean_Variance_Estimator___Sigmoid__K = K; + params->m_Mean_Variance_Estimator___Sigmoid__X0 = X0; +} + +static float GasIndexAlgorithm__mean_variance_estimator___sigmoid__process( + GasIndexAlgorithmParams* params, float sample) { + + float x; + + x = (params->m_Mean_Variance_Estimator___Sigmoid__K * + (sample - params->m_Mean_Variance_Estimator___Sigmoid__X0)); + if ((x < -50.f)) { + return 1.f; + } else if ((x > 50.f)) { + return 0.f; + } else { + return (1.f / (1.f + expf(x))); + } +} + +static void +GasIndexAlgorithm__mox_model__set_parameters(GasIndexAlgorithmParams* params, + float SRAW_STD, float SRAW_MEAN) { + + params->m_Mox_Model__Sraw_Std = SRAW_STD; + params->m_Mox_Model__Sraw_Mean = SRAW_MEAN; +} + +static float +GasIndexAlgorithm__mox_model__process(GasIndexAlgorithmParams* params, + float sraw) { + + if ((params->mAlgorithm_Type == GasIndexAlgorithm_ALGORITHM_TYPE_NOX)) { + return (((sraw - params->m_Mox_Model__Sraw_Mean) / + GasIndexAlgorithm_SRAW_STD_NOX) * + params->mIndex_Gain); + } else { + return (((sraw - params->m_Mox_Model__Sraw_Mean) / + (-1.f * (params->m_Mox_Model__Sraw_Std + + GasIndexAlgorithm_SRAW_STD_BONUS_VOC))) * + params->mIndex_Gain); + } +} + +static void GasIndexAlgorithm__sigmoid_scaled__set_parameters( + GasIndexAlgorithmParams* params, float X0, float K, float offset_default) { + + params->m_Sigmoid_Scaled__K = K; + params->m_Sigmoid_Scaled__X0 = X0; + params->m_Sigmoid_Scaled__Offset_Default = offset_default; +} + +static float +GasIndexAlgorithm__sigmoid_scaled__process(GasIndexAlgorithmParams* params, + float sample) { + + float x; + float shift; + + x = (params->m_Sigmoid_Scaled__K * (sample - params->m_Sigmoid_Scaled__X0)); + if ((x < -50.f)) { + return GasIndexAlgorithm_SIGMOID_L; + } else if ((x > 50.f)) { + return 0.f; + } else { + if ((sample >= 0.f)) { + if ((params->m_Sigmoid_Scaled__Offset_Default == 1.f)) { + shift = ((500.f / 499.f) * (1.f - params->mIndex_Offset)); + } else { + shift = ((GasIndexAlgorithm_SIGMOID_L - + (5.f * params->mIndex_Offset)) / + 4.f); + } + return (((GasIndexAlgorithm_SIGMOID_L + shift) / (1.f + expf(x))) - + shift); + } else { + return ((params->mIndex_Offset / + params->m_Sigmoid_Scaled__Offset_Default) * + (GasIndexAlgorithm_SIGMOID_L / (1.f + expf(x)))); + } + } +} + +static void GasIndexAlgorithm__adaptive_lowpass__set_parameters( + GasIndexAlgorithmParams* params) { + + params->m_Adaptive_Lowpass__A1 = + (params->mSamplingInterval / + (GasIndexAlgorithm_LP_TAU_FAST + params->mSamplingInterval)); + params->m_Adaptive_Lowpass__A2 = + (params->mSamplingInterval / + (GasIndexAlgorithm_LP_TAU_SLOW + params->mSamplingInterval)); + params->m_Adaptive_Lowpass___Initialized = false; +} + +static float +GasIndexAlgorithm__adaptive_lowpass__process(GasIndexAlgorithmParams* params, + float sample) { + + float abs_delta; + float F1; + float tau_a; + float a3; + + if ((params->m_Adaptive_Lowpass___Initialized == false)) { + params->m_Adaptive_Lowpass___X1 = sample; + params->m_Adaptive_Lowpass___X2 = sample; + params->m_Adaptive_Lowpass___X3 = sample; + params->m_Adaptive_Lowpass___Initialized = true; + } + params->m_Adaptive_Lowpass___X1 = + (((1.f - params->m_Adaptive_Lowpass__A1) * + params->m_Adaptive_Lowpass___X1) + + (params->m_Adaptive_Lowpass__A1 * sample)); + params->m_Adaptive_Lowpass___X2 = + (((1.f - params->m_Adaptive_Lowpass__A2) * + params->m_Adaptive_Lowpass___X2) + + (params->m_Adaptive_Lowpass__A2 * sample)); + abs_delta = + (params->m_Adaptive_Lowpass___X1 - params->m_Adaptive_Lowpass___X2); + if ((abs_delta < 0.f)) { + abs_delta = (-1.f * abs_delta); + } + F1 = expf((GasIndexAlgorithm_LP_ALPHA * abs_delta)); + tau_a = (((GasIndexAlgorithm_LP_TAU_SLOW - GasIndexAlgorithm_LP_TAU_FAST) * + F1) + + GasIndexAlgorithm_LP_TAU_FAST); + a3 = (params->mSamplingInterval / (params->mSamplingInterval + tau_a)); + params->m_Adaptive_Lowpass___X3 = + (((1.f - a3) * params->m_Adaptive_Lowpass___X3) + (a3 * sample)); + return params->m_Adaptive_Lowpass___X3; +} \ No newline at end of file diff --git a/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.h b/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.h new file mode 100644 index 000000000..0bd584bb9 --- /dev/null +++ b/lib/lib_i2c/arduino-i2c-sgp41/src/sensirion_gas_index_algorithm.h @@ -0,0 +1,290 @@ +/* + * Copyright (c) 2022, Sensirion AG + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * * Neither the name of Sensirion AG nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef GASINDEXALGORITHM_H_ +#define GASINDEXALGORITHM_H_ + +#include + +#ifndef __cplusplus + +#if __STDC_VERSION__ >= 199901L +#include +#else + +#ifndef bool +#define bool int +#define true 1 +#define false 0 +#endif // bool + +#endif // __STDC_VERSION__ + +#endif // __cplusplus + +// Should be set by the building toolchain +#ifndef LIBRARY_VERSION_NAME +#define LIBRARY_VERSION_NAME "3.2.0" +#endif + +#define GasIndexAlgorithm_ALGORITHM_TYPE_VOC (0) +#define GasIndexAlgorithm_ALGORITHM_TYPE_NOX (1) +#define GasIndexAlgorithm_DEFAULT_SAMPLING_INTERVAL (1.f) +#define GasIndexAlgorithm_INITIAL_BLACKOUT (45.f) +#define GasIndexAlgorithm_INDEX_GAIN (230.f) +#define GasIndexAlgorithm_SRAW_STD_INITIAL (50.f) +#define GasIndexAlgorithm_SRAW_STD_BONUS_VOC (220.f) +#define GasIndexAlgorithm_SRAW_STD_NOX (2000.f) +#define GasIndexAlgorithm_TAU_MEAN_HOURS (12.f) +#define GasIndexAlgorithm_TAU_VARIANCE_HOURS (12.f) +#define GasIndexAlgorithm_TAU_INITIAL_MEAN_VOC (20.f) +#define GasIndexAlgorithm_TAU_INITIAL_MEAN_NOX (1200.f) +#define GasIndexAlgorithm_INIT_DURATION_MEAN_VOC ((3600.f * 0.75f)) +#define GasIndexAlgorithm_INIT_DURATION_MEAN_NOX ((3600.f * 4.75f)) +#define GasIndexAlgorithm_INIT_TRANSITION_MEAN (0.01f) +#define GasIndexAlgorithm_TAU_INITIAL_VARIANCE (2500.f) +#define GasIndexAlgorithm_INIT_DURATION_VARIANCE_VOC ((3600.f * 1.45f)) +#define GasIndexAlgorithm_INIT_DURATION_VARIANCE_NOX ((3600.f * 5.70f)) +#define GasIndexAlgorithm_INIT_TRANSITION_VARIANCE (0.01f) +#define GasIndexAlgorithm_GATING_THRESHOLD_VOC (340.f) +#define GasIndexAlgorithm_GATING_THRESHOLD_NOX (30.f) +#define GasIndexAlgorithm_GATING_THRESHOLD_INITIAL (510.f) +#define GasIndexAlgorithm_GATING_THRESHOLD_TRANSITION (0.09f) +#define GasIndexAlgorithm_GATING_VOC_MAX_DURATION_MINUTES ((60.f * 3.f)) +#define GasIndexAlgorithm_GATING_NOX_MAX_DURATION_MINUTES ((60.f * 12.f)) +#define GasIndexAlgorithm_GATING_MAX_RATIO (0.3f) +#define GasIndexAlgorithm_SIGMOID_L (500.f) +#define GasIndexAlgorithm_SIGMOID_K_VOC (-0.0065f) +#define GasIndexAlgorithm_SIGMOID_X0_VOC (213.f) +#define GasIndexAlgorithm_SIGMOID_K_NOX (-0.0101f) +#define GasIndexAlgorithm_SIGMOID_X0_NOX (614.f) +#define GasIndexAlgorithm_VOC_INDEX_OFFSET_DEFAULT (100.f) +#define GasIndexAlgorithm_NOX_INDEX_OFFSET_DEFAULT (1.f) +#define GasIndexAlgorithm_LP_TAU_FAST (20.0f) +#define GasIndexAlgorithm_LP_TAU_SLOW (500.0f) +#define GasIndexAlgorithm_LP_ALPHA (-0.2f) +#define GasIndexAlgorithm_VOC_SRAW_MINIMUM (20000) +#define GasIndexAlgorithm_NOX_SRAW_MINIMUM (10000) +#define GasIndexAlgorithm_PERSISTENCE_UPTIME_GAMMA ((3.f * 3600.f)) +#define GasIndexAlgorithm_TUNING_INDEX_OFFSET_MIN (1) +#define GasIndexAlgorithm_TUNING_INDEX_OFFSET_MAX (250) +#define GasIndexAlgorithm_TUNING_LEARNING_TIME_OFFSET_HOURS_MIN (1) +#define GasIndexAlgorithm_TUNING_LEARNING_TIME_OFFSET_HOURS_MAX (1000) +#define GasIndexAlgorithm_TUNING_LEARNING_TIME_GAIN_HOURS_MIN (1) +#define GasIndexAlgorithm_TUNING_LEARNING_TIME_GAIN_HOURS_MAX (1000) +#define GasIndexAlgorithm_TUNING_GATING_MAX_DURATION_MINUTES_MIN (0) +#define GasIndexAlgorithm_TUNING_GATING_MAX_DURATION_MINUTES_MAX (3000) +#define GasIndexAlgorithm_TUNING_STD_INITIAL_MIN (10) +#define GasIndexAlgorithm_TUNING_STD_INITIAL_MAX (5000) +#define GasIndexAlgorithm_TUNING_GAIN_FACTOR_MIN (1) +#define GasIndexAlgorithm_TUNING_GAIN_FACTOR_MAX (1000) +#define GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__GAMMA_SCALING (64.f) +#define GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__ADDITIONAL_GAMMA_MEAN_SCALING \ + (8.f) +#define GasIndexAlgorithm_MEAN_VARIANCE_ESTIMATOR__FIX16_MAX (32767.f) + +/** + * Struct to hold all parameters and states of the gas algorithm. + */ +typedef struct { + int mAlgorithm_Type; + float mSamplingInterval; + float mIndex_Offset; + int32_t mSraw_Minimum; + float mGating_Max_Duration_Minutes; + float mInit_Duration_Mean; + float mInit_Duration_Variance; + float mGating_Threshold; + float mIndex_Gain; + float mTau_Mean_Hours; + float mTau_Variance_Hours; + float mSraw_Std_Initial; + float mUptime; + float mSraw; + float mGas_Index; + bool m_Mean_Variance_Estimator___Initialized; + float m_Mean_Variance_Estimator___Mean; + float m_Mean_Variance_Estimator___Sraw_Offset; + float m_Mean_Variance_Estimator___Std; + float m_Mean_Variance_Estimator___Gamma_Mean; + float m_Mean_Variance_Estimator___Gamma_Variance; + float m_Mean_Variance_Estimator___Gamma_Initial_Mean; + float m_Mean_Variance_Estimator___Gamma_Initial_Variance; + float m_Mean_Variance_Estimator__Gamma_Mean; + float m_Mean_Variance_Estimator__Gamma_Variance; + float m_Mean_Variance_Estimator___Uptime_Gamma; + float m_Mean_Variance_Estimator___Uptime_Gating; + float m_Mean_Variance_Estimator___Gating_Duration_Minutes; + float m_Mean_Variance_Estimator___Sigmoid__K; + float m_Mean_Variance_Estimator___Sigmoid__X0; + float m_Mox_Model__Sraw_Std; + float m_Mox_Model__Sraw_Mean; + float m_Sigmoid_Scaled__K; + float m_Sigmoid_Scaled__X0; + float m_Sigmoid_Scaled__Offset_Default; + float m_Adaptive_Lowpass__A1; + float m_Adaptive_Lowpass__A2; + bool m_Adaptive_Lowpass___Initialized; + float m_Adaptive_Lowpass___X1; + float m_Adaptive_Lowpass___X2; + float m_Adaptive_Lowpass___X3; +} GasIndexAlgorithmParams; + +/** + * Initialize the gas index algorithm parameters for the specified algorithm + * type and reset its internal states. Call this once at the beginning. + * @param params Pointer to the GasIndexAlgorithmParams struct + * @param algorithm_type 0 (GasIndexAlgorithm_ALGORITHM_TYPE_VOC) for VOC or + * 1 (GasIndexAlgorithm_ALGORITHM_TYPE_NOX) for NOx + */ +void GasIndexAlgorithm_init(GasIndexAlgorithmParams* params, + int32_t algorithm_type); + +/** + * Initialize the gas index algorithm parameters for the specified algorithm + * type and reset its internal states. Call this once at the beginning. + * @param params Pointer to the GasIndexAlgorithmParams struct + * @param algorithm_type 0 (GasIndexAlgorithm_ALGORITHM_TYPE_VOC) for VOC or + * 1 (GasIndexAlgorithm_ALGORITHM_TYPE_NOX) for NOx + * @param sampling_interval The sampling interval in seconds the algorithm is + * called. Tested for 1s and 10s. + */ +void GasIndexAlgorithm_init_with_sampling_interval( + GasIndexAlgorithmParams* params, int32_t algorithm_type, + float sampling_interval); + +/** + * Reset the internal states of the gas index algorithm. Previously set tuning + * parameters are preserved. Call this when resuming operation after a + * measurement interruption. + * @param params Pointer to the GasIndexAlgorithmParams struct + */ +void GasIndexAlgorithm_reset(GasIndexAlgorithmParams* params); + +/** + * Get current algorithm states. Retrieved values can be used in + * GasIndexAlgorithm_set_states() to resume operation after a short + * interruption, skipping initial learning phase. + * NOTE: This feature can only be used for VOC algorithm type and after at least + * 3 hours of continuous operation. + * @param params Pointer to the GasIndexAlgorithmParams struct + * @param state0 State0 to be stored + * @param state1 State1 to be stored + */ +void GasIndexAlgorithm_get_states(const GasIndexAlgorithmParams* params, + float* state0, float* state1); + +/** + * Set previously retrieved algorithm states to resume operation after a short + * interruption, skipping initial learning phase. This feature should not be + * used after interruptions of more than 10 minutes. Call this once after + * GasIndexAlgorithm_init() or GasIndexAlgorithm_reset() and the optional + * GasIndexAlgorithm_set_tuning_parameters(), if desired. Otherwise, the + * algorithm will start with initial learning phase. + * NOTE: This feature can only be used for VOC algorithm type. + * @param params Pointer to the GasIndexAlgorithmParams struct + * @param state0 State0 to be restored + * @param state1 State1 to be restored + */ +void GasIndexAlgorithm_set_states(GasIndexAlgorithmParams* params, float state0, + float state1); + +/** + * Set parameters to customize the gas index algorithm. Call this once after + * GasIndexAlgorithm_init() and before optional GasIndexAlgorithm_set_states(), + * if desired. Otherwise, the default values will be used. + * + * @param params Pointer to the GasIndexAlgorithmParams + * struct + * @param index_offset Gas index representing typical (average) + * conditions. Range 1..250, + * default 100 for VOC and 1 for NOx + * @param learning_time_offset_hours Time constant of long-term estimator for + * offset. Past events will be forgotten + * after about twice the learning time. + * Range 1..1000 [hours], default 12 [hours] + * @param learning_time_gain_hours Time constant of long-term estimator for + * gain. Past events will be forgotten + * after about twice the learning time. + * Range 1..1000 [hours], default 12 [hours] + * NOTE: This value is not relevant for NOx + * algorithm type + * @param gating_max_duration_minutes Maximum duration of gating (freeze of + * estimator during high gas index signal). + * 0 (no gating) or range 1..3000 [minutes], + * default 180 [minutes] for VOC and + * 720 [minutes] for NOx + * @param std_initial Initial estimate for standard deviation. + * Lower value boosts events during initial + * learning period, but may result in larger + * device-to-device variations. + * Range 10..5000, default 50 + * NOTE: This value is not relevant for NOx + * algorithm type + * @param gain_factor Factor used to scale applied gain value + * when calculating gas index. Range 1..1000, + * default 230 + */ +void GasIndexAlgorithm_set_tuning_parameters( + GasIndexAlgorithmParams* params, int32_t index_offset, + int32_t learning_time_offset_hours, int32_t learning_time_gain_hours, + int32_t gating_max_duration_minutes, int32_t std_initial, + int32_t gain_factor); + +/** + * Get current parameters to customize the gas index algorithm. + * Refer to GasIndexAlgorithm_set_tuning_parameters() for description of the + * parameters. + */ +void GasIndexAlgorithm_get_tuning_parameters( + const GasIndexAlgorithmParams* params, int32_t* index_offset, + int32_t* learning_time_offset_hours, int32_t* learning_time_gain_hours, + int32_t* gating_max_duration_minutes, int32_t* std_initial, + int32_t* gain_factor); + +/** + * Get the sampling interval parameter used by the algorithm. + */ +void GasIndexAlgorithm_get_sampling_interval( + const GasIndexAlgorithmParams* params, float* sampling_interval); + +/** + * Calculate the gas index value from the raw sensor value. + * + * @param params Pointer to the GasIndexAlgorithmParams struct + * @param sraw Raw value from the SGP4x sensor + * @param gas_index Calculated gas index value from the raw sensor value. Zero + * during initial blackout period and 1..500 afterwards + */ +void GasIndexAlgorithm_process(GasIndexAlgorithmParams* params, int32_t sraw, + int32_t* gas_index); + +#endif /* GASINDEXALGORITHM_H_ */ \ No newline at end of file diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h index 94acfddd9..b4fabb479 100644 --- a/tasmota/include/tasmota_configurations.h +++ b/tasmota/include/tasmota_configurations.h @@ -99,6 +99,7 @@ #define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) #define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) +#define USE_SGP4X // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) #define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 19aa84a22..0b7289209 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -376,6 +376,7 @@ //#define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) //#define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) //#define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) +//#define USE_SGP4X // [I2cDriver69] Enable SGP4X sensor (I2C address 0x59) (+1k4 code) //#define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) //#define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) @@ -609,6 +610,7 @@ #define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) #define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) +#define USE_SGP4X // [I2cDriver69] Enable SGP4X sensor (I2C address 0x59) (+1k4 code) #define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 690bb2d89..5103f7ac2 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -897,8 +897,10 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_PCA9557) feature9 |= 0x00800000; // xdrv_69_pca9557.ino #endif +#if defined(USE_I2C) && defined(USE_SGP4X) + feature9 |= 0x01000000; // xdrv_109_sgp4x.ino +#endif -// feature9 |= 0x01000000; // feature9 |= 0x02000000; // feature9 |= 0x04000000; // feature9 |= 0x08000000; diff --git a/tasmota/tasmota_xsns_sensor/xsns_109_sgp4x.ino b/tasmota/tasmota_xsns_sensor/xsns_109_sgp4x.ino new file mode 100644 index 000000000..37d73e538 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_109_sgp4x.ino @@ -0,0 +1,268 @@ +/* + xsns_109_sgp4x.ino - SGP4X VOC and NOx sensor support for Tasmota + + Copyright (C) 2023 Andrew Klaus + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_I2C +#ifdef USE_SGP4X +/*********************************************************************************************\ + * SGP4x - Gas (TVOC - Total Volatile Organic Compounds) and NOx + * + * Source: Sensirion Driver, with mods by Andrew Klaus + * Adaption for TASMOTA: Andrew Klaus + * + * I2C Address: 0x59 +\*********************************************************************************************/ + +#define XSNS_109 109 +#define XI2C_82 82 // See I2CDEVICES.md + +#define SGP4X_ADDRESS 0x59 + +#include "SensirionI2CSgp4x.h" + +extern "C" { +#include "sensirion_gas_index_algorithm.h" +}; + +enum SGP4X_State { + STATE_SGP4X_START, + STATE_SGP4X_SELFTEST_SENT, + STATE_SGP4X_SELFTEST_WAIT, + STATE_SGP4X_SELFTEST_DONE, + STATE_SGP4X_COND_SENT, + STATE_SGP4X_COND_DONE, + STATE_SGP4X_NORMAL, + STATE_SGP4X_FAIL, +}; +SensirionI2CSgp4x sgp4x; +SGP4X_State sgp4x_state = STATE_SGP4X_START; + +bool sgp4x_init = false; +bool sgp4x_read_pend = false; + +uint16_t srawVoc; +uint16_t srawNox; +int32_t voc_index_sgp4x; +int32_t nox_index_sgp4x; + +uint16_t conditioning_s = 10; // 10 second delay for startup + +GasIndexAlgorithmParams voc_algorithm_params; +GasIndexAlgorithmParams nox_algorithm_params; + +/********************************************************************************************/ + +void sgp4x_Init(void) +{ + if (!I2cSetDevice(SGP4X_ADDRESS)) { return; } + + uint8_t serialNumberSize = 3; + uint16_t serialNumber[serialNumberSize]; + uint16_t error; + + sgp4x.begin(Wire); + + error = sgp4x.getSerialNumber(serialNumber, serialNumberSize); + + if (error) { + Sgp4xHandleError(error); + return; + } else { + AddLog(LOG_LEVEL_INFO, PSTR("SGP4X serial nr 0x%X 0x%X 0x%X") ,serialNumber[0], serialNumber[1], serialNumber[2]); + } + + I2cSetActiveFound(SGP4X_ADDRESS, "SGP4X"); + + sgp4x_init = true; + error = sgp4x.sendSelfTestCmd(); + + if (error) { + Sgp4xHandleError(error); + sgp4x_state = STATE_SGP4X_FAIL; + return; + } + + sgp4x_state = STATE_SGP4X_SELFTEST_SENT; + + GasIndexAlgorithm_init(&nox_algorithm_params, GasIndexAlgorithm_ALGORITHM_TYPE_NOX); + GasIndexAlgorithm_init(&voc_algorithm_params, GasIndexAlgorithm_ALGORITHM_TYPE_VOC); +} + +void Sgp4xHandleError(uint16_t error) { + char errorMessage[256]; + errorToString(error, errorMessage, 256); + AddLog(LOG_LEVEL_ERROR, PSTR("SGP4X error: %s"), errorMessage); +} + +void Sgp4xSendReadCmd(void) +{ + // Check if we're already waiting for a read + // Or if we need to wait a cycle before initiating a reading + if (sgp4x_read_pend){return;} + + uint16_t error; + uint16_t rhticks = (uint16_t)((TasmotaGlobal.humidity * 65535) / 100 + 0.5); + uint16_t tempticks = (uint16_t)(((TasmotaGlobal.temperature_celsius + 45) * 65535) / 175); + + // Handle self testing + // Wait 1 cycle (at least 320ms to read selftest value) + if (sgp4x_state == STATE_SGP4X_SELFTEST_SENT) { + sgp4x_state = STATE_SGP4X_SELFTEST_WAIT; + return; + } else if (sgp4x_state == STATE_SGP4X_SELFTEST_WAIT) { + if (Sgp4xReadSelfTest()){ + sgp4x_state = STATE_SGP4X_FAIL; + return; + } else { + sgp4x_state = STATE_SGP4X_SELFTEST_DONE; + } + } + + // Initiate conditioning + if (sgp4x_state == STATE_SGP4X_SELFTEST_DONE) { + error = sgp4x.sendConditioningCmd(0x8000, 0x6666); + sgp4x_state = STATE_SGP4X_COND_SENT; + + if (error) { + Sgp4xHandleError(error); + } + return; + } + + if (sgp4x_state == STATE_SGP4X_COND_DONE) { + sgp4x_state = STATE_SGP4X_NORMAL; + } + + // Normal operation + if (sgp4x_state == STATE_SGP4X_NORMAL) { + error = sgp4x.sendRawSignalsCmd(rhticks, tempticks); + if (error) { + Sgp4xHandleError(error); + } else { + sgp4x_read_pend = true; + } + return; + } + + return; +} + +bool Sgp4xReadSelfTest() { + uint16_t testResult; + uint16_t error; + + error = sgp4x.readSelfTestValue(testResult); + if (error) { + Sgp4xHandleError(error); + return true; + } else if (testResult != 0xD400) { + AddLog(LOG_LEVEL_ERROR, PSTR("SGP4X: executeSelfTest failed with error: %s"), testResult); + return true; + } + + return false; +} + +void Sgp4xUpdate(void) +{ + uint16_t error; + + // Conditioning - NOx needs 10s to warmup + if (sgp4x_state == STATE_SGP4X_COND_SENT) { + if (conditioning_s > 0) { + conditioning_s--; + return; + } else { + sgp4x_state = STATE_SGP4X_COND_DONE; + } + } + + if (sgp4x_state == STATE_SGP4X_NORMAL && sgp4x_read_pend) { + error = sgp4x.readRawSignalsValue(srawVoc, srawNox); + sgp4x_read_pend = false; + + if (!error) { + GasIndexAlgorithm_process(&voc_algorithm_params, srawVoc, &voc_index_sgp4x); + GasIndexAlgorithm_process(&nox_algorithm_params, srawNox, &nox_index_sgp4x); + } else { + Sgp4xHandleError(error); + } + } +} + +#ifdef USE_WEBSERVER +const char HTTP_SNS_SGP4X[] PROGMEM = + "{s}SGP4X " D_TVOC "_" D_JSON_RAW "{m}%d " "{e}" // {s} = , {m} = , {e} = + "{s}SGP4X " D_NOX "_" D_JSON_RAW "{m}%d " "{e}" + "{s}SGP4X " D_TVOC "{m}%d " "{e}" + "{s}SGP4X " D_NOX "{m}%d " "{e}"; +#endif + +void Sgp4xShow(bool json) +{ + if (sgp4x_state == STATE_SGP4X_NORMAL) { + if (json) { + ResponseAppend_P(PSTR(",\"SGP4X\":{\"" D_TVOC "_" D_JSON_RAW "\":%d,\"" D_NOX "_" D_JSON_RAW "\":%d,\"" D_TVOC "\":%d,\"" D_NOX "\":%d"), srawVoc, srawNox, voc_index_sgp4x, nox_index_sgp4x); + ResponseJsonEnd(); +#ifdef USE_DOMOTICZ + if (0 == TasmotaGlobal.tele_period) DomoticzSensor(DZ_AIRQUALITY, srawVoc); +#endif // USE_DOMOTICZ +#ifdef USE_WEBSERVER + } else { + WSContentSend_PD(HTTP_SNS_SGP4X, srawVoc, srawNox, voc_index_sgp4x, nox_index_sgp4x); +#endif + } + } +} + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns109(uint32_t function) +{ + if (!I2cEnabled(XI2C_82)) { return false; } + + bool result = false; + + if (FUNC_INIT == function) { + sgp4x_Init(); + } + else if (sgp4x_init) { + switch (function) { + case FUNC_EVERY_250_MSECOND: + Sgp4xSendReadCmd(); + break; + case FUNC_EVERY_SECOND: + Sgp4xUpdate(); + break; + case FUNC_JSON_APPEND: + Sgp4xShow(1); + break; + #ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Sgp4xShow(0); + break; + #endif // USE_WEBSERVER + } + } + return result; +} + +#endif // USE_sgp4x +#endif // USE_I2C diff --git a/tools/decode-status.py b/tools/decode-status.py index abd99ecfe..78bc8feb7 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -296,7 +296,7 @@ a_features = [[ "USE_DISPLAY_TM1650","USE_PCA9632","USE_TUYAMCUBR","USE_SEN5X", "USE_BIOPDU","USE_MCP23XXX_DRV","USE_PMSA003I","USE_LOX_O2", "USE_GDK101","USE_GM861","USE_TC74","USE_PCA9557", - "","","","", + "USE_SGP4X","","","", "","","","" ]] From 34456e61931c2497c76218fa3d01981ba0453aa5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 29 Jun 2023 09:04:16 +0200 Subject: [PATCH 014/150] Berry `import strict` now detects useless expr without side effects (#18997) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_parser.c | 22 +++++++++++++++++-- lib/libesp32/berry/src/be_parser.h | 1 + .../berry_tasmota/src/embedded/persist.be | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d21afa646..00c10481f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) +- Berry `import strict` now detects useless expr without side effects ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 73aa831a2..170ac69b3 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -196,6 +196,7 @@ static void begin_block(bfuncinfo *finfo, bblockinfo *binfo, int type) finfo->binfo = binfo; /* tell parser this is the current block */ binfo->type = (bbyte)type; binfo->hasupval = 0; + binfo->sideeffect = 0; 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) { @@ -796,6 +797,7 @@ static void call_expr(bparser *parser, bexpdesc *e) int argc = 0, base; int ismember = e->type == ETMEMBER; + parser->finfo->binfo->sideeffect = 1; /* has side effect */ /* func '(' [exprlist] ')' */ check_var(parser, e); /* code function index to next register */ @@ -1030,11 +1032,13 @@ static void assign_expr(bparser *parser) bexpdesc e; btokentype op; int line = parser->lexer.linenumber; + parser->finfo->binfo->sideeffect = 0; /* reinit side effect marker */ expr(parser, &e); /* left expression */ check_symbol(parser, &e); op = get_assign_op(parser); if (op != OP_NOT_ASSIGN) { /* assign operator */ bexpdesc e1; + parser->finfo->binfo->sideeffect = 1; scan_next_token(parser); compound_assign(parser, op, &e, &e1); if (check_newvar(parser, &e)) { /* new variable */ @@ -1110,6 +1114,9 @@ static void sub_expr(bparser *parser, bexpdesc *e, int prio) 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 */ + if (op == OptConnect) { + parser->finfo->binfo->sideeffect = 1; + } init_exp(&e2, ETVOID, 0); sub_expr(parser, &e2, binary_op_prio(op)); /* parse right side */ if ((e2.type == ETVOID) && (op == OptConnect)) { @@ -1758,6 +1765,9 @@ static void throw_stmt(bparser *parser) static void statement(bparser *parser) { + /* save value of sideeffect */ + bbyte sideeffect = parser->finfo->binfo->sideeffect; + parser->finfo->binfo->sideeffect = 1; /* by default declare side effect */ switch (next_type(parser)) { case KeyIf: if_stmt(parser); break; case KeyWhile: while_stmt(parser); break; @@ -1772,8 +1782,16 @@ static void statement(bparser *parser) case KeyVar: var_stmt(parser); break; case KeyTry: try_stmt(parser); break; case KeyRaise: throw_stmt(parser); break; - case OptSemic: scan_next_token(parser); break; /* empty statement */ - default: expr_stmt(parser); break; + case OptSemic: + parser->finfo->binfo->sideeffect = sideeffect; /* restore sideeffect */ + scan_next_token(parser); break; /* empty statement */ + default: + parser->finfo->binfo->sideeffect = sideeffect; /* restore sideeffect */ + expr_stmt(parser); + if (comp_is_strict(parser->vm) && parser->finfo->binfo->sideeffect == 0) { + push_error(parser, "strict: expression without side effect detected"); + } + break; } be_assert(parser->finfo->freereg >= be_list_count(parser->finfo->local)); } diff --git a/lib/libesp32/berry/src/be_parser.h b/lib/libesp32/berry/src/be_parser.h index 5b5510f2c..8498bfa99 100644 --- a/lib/libesp32/berry/src/be_parser.h +++ b/lib/libesp32/berry/src/be_parser.h @@ -53,6 +53,7 @@ typedef struct bblockinfo { bbyte nactlocals; /* number of active local variables */ bbyte type; /* block type mask */ bbyte hasupval; /* has upvalue mark */ + bbyte sideeffect; /* did the last expr/statement had a side effect */ int breaklist; /* break list */ int beginpc; /* begin pc */ int continuelist; /* continue list */ diff --git a/lib/libesp32/berry_tasmota/src/embedded/persist.be b/lib/libesp32/berry_tasmota/src/embedded/persist.be index 35436c3e3..901b7e2d5 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/persist.be +++ b/lib/libesp32/berry_tasmota/src/embedded/persist.be @@ -111,7 +111,7 @@ class Persist import json if isinstance(v, map) self.json_fdump_map(f, v) - elif isinstance(v, list)v + elif isinstance(v, list) self.json_fdump_list(f, v) else f.write(json.dump(v)) From c303c80add230258827f64d471a6a8b0e3b3bb97 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 29 Jun 2023 09:07:58 +0200 Subject: [PATCH 015/150] Update CHANGELOG.md Add support for SGP41 TVOC/NOx Sensor --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 00c10481f..3d83db60c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Command ``Delay -1`` to wait until next second (#18984) - Matter add option to disable bridge mode +- Add support for SGP41 TVOC/NOx Sensor ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) From 48e1dd4d7fce82400db90e5c49182e1a03e6ea0f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 29 Jun 2023 12:11:58 +0200 Subject: [PATCH 016/150] Add c3 env for rev. <3 (#18998) * c3 env for rev <3 * no support for c3 rev <3 --- platformio_tasmota_cenv_sample.ini | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 30ac45f39..2f987d809 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -46,6 +46,19 @@ build_flags = ${env:tasmota32_base.build_flags} -DUSE_LVGL_OPENHASP -DOTA_URL='""' +;*** Tasmota ESP32-C3 version before ROM revision 3 +;*** Actual used Arduino/IDF does not support this old revisions +;*** This build env is without any support, unexpected issues can happen +;*** Includes only basic drivers to fit in smaller app partition +[env:tasmota32c3-old] +extends = env:tasmota32c3 +platform_packages = framework-arduinoespressif32 @ https://github.com/tasmota/arduino-esp32/releases/download/2.0.9.20230531/framework-arduinoespressif32.zip +build_flags = ${env:tasmota32_base.build_flags} + -DOTA_URL='""' +; *** Do not use safe boot scheme, since safeboot is build with new core!! +board_build.partitions = partitions/esp32_partition_app1856k_fs320k.csv +; Safeboot not used in this partition scheme -> an empty entry needed to overwrite the default setting +board_upload.arduino.flash_extra_images = [env:tasmota32c3-bluetooth] extends = env:tasmota32c3 From ef304a8ba84bd7900beec5e192305bc03a4b24d2 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 29 Jun 2023 13:01:07 +0200 Subject: [PATCH 017/150] Berry mark walrus operator as side-effect (#18999) --- lib/libesp32/berry/src/be_parser.c | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 170ac69b3..57b2ffa7f 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1140,6 +1140,7 @@ static void walrus_expr(bparser *parser, bexpdesc *e) if (op == OptWalrus) { check_symbol(parser, e); bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */ + parser->finfo->binfo->sideeffect = 1; /* has side effect */ scan_next_token(parser); /* skip ':=' */ expr(parser, e); check_var(parser, e); From 465ae023ab65d45a9878a9088a22ce843424c54e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 29 Jun 2023 14:10:49 +0200 Subject: [PATCH 018/150] Update change logs --- BUILDS.md | 2 +- CHANGELOG.md | 8 ++++---- RELEASENOTES.md | 8 +++++++- tasmota/include/tasmota_configurations.h | 2 +- tasmota/include/tasmota_configurations_ESP32.h | 4 ++-- tasmota/my_user_config.h | 1 + 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index f5767be54..d84374984 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -119,7 +119,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_MGS | - | - / x | - | x | - | - | | USE_SGP30 | - | - / x | - | x | - | - | | USE_SGP40 | - | - / x | - | x | - | - | -| USE_SGP4X | - | - / x | - | x | - | - | +| USE_SGP4X | - | - / x | - | - | - | - | | USE_SEN5X | - | - / x | - | x | - | - | | USE_SI1145 | - | - / - | - | - | - | - | | USE_LM75AD | - | - / x | - | x | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d83db60c..33d9d99b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,12 @@ All notable changes to this project will be documented in this file. ## [13.0.0.1] ### Added - Command ``Delay -1`` to wait until next second (#18984) -- Matter add option to disable bridge mode -- Add support for SGP41 TVOC/NOx Sensor +- Matter add option to disable bridge mode (#18992) +- Support for SGP41 TVOC/NOx Sensor (#18880) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) -- Berry `import strict` now detects useless expr without side effects +- Berry `import strict` now detects useless expr without side effects (#18997) ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) @@ -20,7 +20,7 @@ All notable changes to this project will be documented in this file. - Berry various fixes for Walrus Operator (#18982) ### Removed - +- Support for ESP32-C3 with chip rev below 3 (old development boards) ## [Released] diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e3395e77e..68d7dc0ed 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -113,12 +113,18 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v13.0.0.1 ### Added - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) +- Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) +- Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) +- Berry `import strict` now detects useless expression without side effects [#18997](https://github.com/arendst/Tasmota/issues/18997) ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) ### Fixed -- Berry various fixes for Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) +- Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) + +### Removed +- Support for ESP32-C3 with chip revision below 3 (old development boards) diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h index b4fabb479..d88f8d536 100644 --- a/tasmota/include/tasmota_configurations.h +++ b/tasmota/include/tasmota_configurations.h @@ -99,7 +99,7 @@ #define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) #define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) -#define USE_SGP4X // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) +//#define USE_SGP4X // [I2cDriver82] Enable SGP41 sensor (I2C address 0x59) (+7k2 code) #define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 0b7289209..6b2840ae3 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -376,7 +376,7 @@ //#define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) //#define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) //#define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) -//#define USE_SGP4X // [I2cDriver69] Enable SGP4X sensor (I2C address 0x59) (+1k4 code) +//#define USE_SGP4X // [I2cDriver82] Enable SGP41 sensor (I2C address 0x59) (+7k2 code) //#define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) //#define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) @@ -610,7 +610,7 @@ #define USE_MGS // [I2cDriver17] Enable Xadow and Grove Mutichannel Gas sensor using library Multichannel_Gas_Sensor (+10k code) #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) #define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) -#define USE_SGP4X // [I2cDriver69] Enable SGP4X sensor (I2C address 0x59) (+1k4 code) +#define USE_SGP4X // [I2cDriver82] Enable SGP41 sensor (I2C address 0x59) (+7k2 code) #define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) //#define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 9cc1f0659..495495bd8 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -601,6 +601,7 @@ #define MGS_SENSOR_ADDR 0x04 // Default Mutichannel Gas sensor i2c address // #define USE_SGP30 // [I2cDriver18] Enable SGP30 sensor (I2C address 0x58) (+1k1 code) // #define USE_SGP40 // [I2cDriver69] Enable SGP40 sensor (I2C address 0x59) (+1k4 code) +// #define USE_SGP4X // [I2cDriver82] Enable SGP41 sensor (I2C address 0x59) (+7k2 code) // #define USE_SEN5X // [I2cDriver76] Enable SEN5X sensor (I2C address 0x69) (+3k code) // #define USE_SI1145 // [I2cDriver19] Enable SI1145/46/47 sensor (I2C address 0x60) (+1k code) // #define USE_LM75AD // [I2cDriver20] Enable LM75AD sensor (I2C addresses 0x48 - 0x4F) (+0k5 code) From ff865d8005b287dd7dbc9c75b118a57a82c0a114 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 29 Jun 2023 16:39:59 +0200 Subject: [PATCH 019/150] Update pre-compiled Berry for Windows (#19001) --- lib/libesp32/berry/berry.exe | Bin 362434 -> 368947 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe index 7dfe426b590b8a5793438c367d0e4b03c80cef17..a20999c831e7edbce54a3a259340146176522042 100644 GIT binary patch delta 156976 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 QyY~7gB2?7-_t?MuKcutIPyhe` delta 150375 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

    d~d_ZovGCn~}qHG1Cf2V;2B$>q^4oNkmTx-Q# zyFpG%xvD{8Qp=sa`~M6cKSRhVWvhV@4M`2v0%VohDpaHHAYsXi{XpmorSVIG4}e6a z=6$3mqAMUNT0n}VvHUp@WvN&*di^zEu7e5-i>K2n$00TEHj*)$j7&TLk|>$@8Hmq~ zL-7&e0+3>=rfh$LWJvyKdJjyL+CCM;C6S&WK|J1tjCzlBgT$n+oe$#hnU2lL#k0i_ zk4a8@5<+$<8eRZ#juBOF2JuRcJw+s2l(`5Jm1_S#kl@H-QK()ov>8l@`=d38UkbF& zAQ5S#?FZs~NYpbLL>VuVJdkh^3*C+BdIlZEUwpz^1mcjEe=mVVrRIAZ#ED!qS<(L$ z`;(&DKPRt8bd5@ z;%pGlqoSTgz0u=BW<$`M3N%{XkQ$vK+Z3rD8$hV`@sVR2sjd=LzXy^eM3MsHm3-C%BvC4CAV_>nD%9^J`+7o%k(n`!?{?%=V)c01BqY<4WMECag}Q-+r9kTsLVsL_Z|njS ztJB1ZWCDbO4aCkc8N@S{752gKG8e!7(mC;R5a$D81vZ1Yr7GuRJ1g&#H%>Wx>6wxTnI5qbuvg0WutPMb5V1Uol;?aNk)pEQ6N6& zL@`?q3C$MCbPzeh7l1@OhKyz+*1hSHiO)kOAk7-PKtlOuF1{_0aynUZ>OP(-Sk zG640MCf1`Vh{GJrwO6K~*)4goBVTw(d_6QC19f$*j4@QN2du(NjWYABLab}A?QwPD-31*z> zgKCuL^6AC5giy#7LK#YDkcec^-5`pzJRJezH(R<;d!i7-oMey(GV(=_QV{nfZlc!y zit;#6Bww_81xQc|nYAGPJW*yFh+8r-4B}Odx>7ZcfJCK>Kwl9ts>>%_6NZl0od!fOIEFKpG?N1BpmcF%G1sX&5>?jsD6F$x{VB2sxxU zoe3geHGUF=z9j`K^`?6f#G7LfzEK=nTpCBVK*nu)fp74HT$0Rz`(U4a47)T4p7nzPcF0sqxd!=w?0Sgs{*eWu zm^Gkmr67J>uaA3THpyTi5+C(ffVjcpg>3{0c*Iv-yx!`E5u;sLmIK>SVBtA-IH; zlz}7C_|TPzRKr0a9?7tWK$KKb-y)O=@R(} zq{{RMRpTUxt4gf>Wss0G3;zw$I2aIxnhZslj$n`7j~>$vzjsP;eGiD^Swp^%e+@$M zN(Iwr*8+uxOm<~aNdZo#qM9C~-nk?rO?MR_u>vC(RbZhHsLCeB!737x)DE|IGq`@#mMy6DJt6}hsw9>j0BtvS5{vaW#W)Fh6B@+ul z!jjkLQZD_K2Ob#L|}Z}`4d56(j+krBr5g6$3fga zsrD;?NJ+fSLLgOA&E5lXN&YwvLVxjG7eL%nu3tdH@v7oRWN8_~Q@+huYXs_=FFLjj zNXVSPsSqa-sb&K~0=Z(YhlohU=Ma&)WjV-B744r0r92$w0ePe#`Zq{KD(qztuc-)& z740saU0N-?4H>(18uS53K+^mPNE8F04?fY0zYOFyBet?^y4Q;xkKNJ~Q-37d)l`i| zrFOSgk)pu?nMd8 z%Jl?f=t4o2g(U<75%e?eK+_G%!C8TJEU~Bm)1^B>GS8opXNpUiNv8{c>GVIhz8)z!n zcN3en6%^;QXtAwj(}G!f1>VZ+TrC!`-+X>iWl>q_j$evxcqjkSGFz|OFc}-Dl$YdG k?)aw6_G6ve+1bWxNjpBAZ7XlMW7HDcx3{s3pzZ4a1C^c8EdT%j From 52392a2b48131b209ff082ffd7d3947048236f10 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 29 Jun 2023 22:12:56 +0200 Subject: [PATCH 020/150] Matter improve responsiveness (#19002) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 29 +- .../src/embedded/Matter_HTTP_remote.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 2 +- .../embedded/Matter_Plugin_Bridge_OnOff.be | 2 +- .../embedded/Matter_Plugin_Bridge_Sensor.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Contact.be | 2 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 2 +- .../src/embedded/Matter_Plugin_OnOff.be | 2 +- .../src/embedded/Matter_Plugin_Root.be | 6 +- .../src/embedded/Matter_Plugin_Sensor.be | 2 +- .../embedded/Matter_Plugin_Sensor_Contact.be | 2 +- .../Matter_Plugin_Sensor_Occupancy.be | 2 +- .../embedded/Matter_Plugin_Sensor_OnOff.be | 2 +- .../src/embedded/Matter_Plugin_Shutter.be | 2 +- .../src/embedded/Matter_UDPServer.be | 13 +- .../berry_matter/src/embedded/Matter_UI.be | 12 +- .../src/solidify/solidified_Matter_Device.h | 160 +- .../solidify/solidified_Matter_HTTP_remote.h | 9 +- .../solidified_Matter_Plugin_Bridge_Light0.h | 2 +- .../solidified_Matter_Plugin_Bridge_OnOff.h | 2 +- .../solidified_Matter_Plugin_Bridge_Sensor.h | 2 +- ...fied_Matter_Plugin_Bridge_Sensor_Contact.h | 2 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 2 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 2 +- .../solidify/solidified_Matter_Plugin_Root.h | 114 +- .../solidified_Matter_Plugin_Sensor.h | 2 +- .../solidified_Matter_Plugin_Sensor_Contact.h | 2 +- ...olidified_Matter_Plugin_Sensor_Occupancy.h | 2 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 2 +- .../solidified_Matter_Plugin_Shutter.h | 2 +- .../solidify/solidified_Matter_UDPServer.h | 836 +++++---- .../src/solidify/solidified_Matter_UI.h | 1590 ++++++++--------- 33 files changed, 1447 insertions(+), 1369 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33d9d99b0..1fe6389e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) +- Matter improve responsiveness ### Fixed - Berry various fixes for Walrus Operator (#18982) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 4cdf5aa87..18f4ea142 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -1315,23 +1315,23 @@ class Matter_Device self.plugins_config.remove(ep_str) self.plugins_persist = true - # try saving parameters - self.save_param() - self.signal_endpoints_changed() - # now remove from in-memory configuration var idx = 0 while idx < size(self.plugins) if ep == self.plugins[idx].get_endpoint() self.plugins.remove(idx) - self.signal_endpoints_changed() break else idx += 1 end end + # clean any orphan remote self.clean_remotes() + + # try saving parameters + self.save_param() + self.signal_endpoints_changed() end ############################################################# @@ -1415,13 +1415,15 @@ class Matter_Device def clean_remotes() import introspect + # print("clean_remotes", self.http_remotes) # init all remotes with count 0 - if self.http_remotes + if self.http_remotes # tests if `self.http_remotes` is not `nil` and not empty var remotes_map = {} # key: remote object, value: count of references for http_remote: self.http_remotes remotes_map[http_remote] = 0 end + # print("remotes_map", remotes_map) # scan all endpoints for pi: self.plugins @@ -1431,16 +1433,23 @@ class Matter_Device end end + # print("remotes_map2", remotes_map) + # tasmota.log("MTR: remotes references: " + str(remotes_map), 3) + var remote_to_remove = [] # we first get the list of remotes to remove, to not interfere with map iterator for remote:remotes_map.keys() if remotes_map[remote] == 0 - # remove - tasmota.log("MTR: remove unused remote: " + remote.addr, 3) - remote.close() - self.http_remotes.remove(remote) + remote_to_remove.push(remote) end end + + for remote: remote_to_remove + tasmota.log("MTR: remove unused remote: " + remote.addr, 3) + remote.close() + self.http_remotes.remove(remote.addr) + end + end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index 5170842e7..f56f5528f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -177,7 +177,7 @@ class Matter_HTTP_remote : Matter_HTTP_async end # reduce the update time after a read is succesful - self.change_schedule(self.UPDATE_CMD0, self.UPDATE_TIME2) + self.change_schedule(self.UPDATE_CMD5, self.UPDATE_TIME2) end if changed self.info_changed() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index a1a6d3127..60078c41a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -30,7 +30,7 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP static var TYPE = "http_light0" # name of the plug-in in json static var NAME = "Light 0 On" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Power number" + static var ARG_HINT = "Power number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type # static var UPDATE_TIME = 3000 # update every 3s # static var UPDATE_CMD = "Status 11" # command to send for updates diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be index d3d1e3986..4b8cb0e12 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_OnOff.be @@ -29,7 +29,7 @@ class Matter_Plugin_Bridge_Light0 end class Matter_Plugin_Bridge_OnOff : Matter_Plugin_Bridge_Light0 static var TYPE = "http_relay" # name of the plug-in in json static var NAME = "Relay" # display name of the plug-in - static var ARG_HINT = "Enter Relay number" + static var ARG_HINT = "Relay number" static var TYPES = { 0x010A: 2 } # On/Off Plug-in Unit ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be index 444a82e68..ba8589eae 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor.be @@ -31,7 +31,7 @@ class Matter_Plugin_Bridge_Sensor : Matter_Plugin_Bridge_HTTP # static var NAME = "" # display name of the plug-in static var ARG = "filter" # additional argument name (or empty if none) static var ARG_HTTP = "url" # domain name - static var ARG_HINT = "Enter Filter pattern" + static var ARG_HINT = "Filter pattern" static var UPDATE_TIME = 5000 # update every 5s static var UPDATE_CMD = "Status 8" # command to send for updates static var PROBE_TIMEOUT = 1700 # timeout of 1700 ms for probing, which gives at least 1s for TCP recovery diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be index 52eef023b..c2793b6fb 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be @@ -30,7 +30,7 @@ class Matter_Plugin_Bridge_Sensor_Contact : Matter_Plugin_Bridge_HTTP static var TYPE = "http_contact" # name of the plug-in in json static var NAME = "Contact" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Switch number" + static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 5s static var UPDATE_CMD = "Status 8" # command to send for updates diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index e65b69159..416e0f7d4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -30,7 +30,7 @@ class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP static var TYPE = "http_occupancy" # name of the plug-in in json static var NAME = "Occupancy" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Switch number" + static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 5s static var UPDATE_CMD = "Status 8" # command to send for updates diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index 534996478..b6b4c0bf5 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -31,7 +31,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device static var NAME = "Relay" # display name of the plug-in static var ARG = "relay" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var ARG_HINT = "Enter Relay number" + static var ARG_HINT = "Relay number" static var UPDATE_TIME = 250 # update every 250ms static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index abf540b5f..49b9d7aef 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -306,8 +306,12 @@ class Matter_Plugin_Root : Matter_Plugin if attribute == 0x0003 # ---------- PartsList / list[endpoint-no]---------- var pl = TLV.Matter_TLV_array() var eps = self.device.get_active_endpoints(true) + var disable_bridge_mode = self.device.disable_bridge_mode for ep: eps - pl.add_TLV(nil, TLV.U2, ep) # add each endpoint + # if bridge mode is disabled, don't announce Aggregatore (above 0xFF00) + if !disable_bridge_mode || ep < 0xFF00 + pl.add_TLV(nil, TLV.U2, ep) # add each endpoint + end end return pl else diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be index c335a75ed..91d3a81a8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor.be @@ -28,7 +28,7 @@ class Matter_Plugin_Device end class Matter_Plugin_Sensor : Matter_Plugin_Device static var ARG = "filter" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Filter pattern" + static var ARG_HINT = "Filter pattern" static var UPDATE_TIME = 5000 # update sensor every 5s var tasmota_sensor_filter # Rule-type filter to the value, like "ESP32#Temperature" var tasmota_sensor_matcher # Actual matcher object diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be index aa2c680e2..ca9ae7a88 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be @@ -30,7 +30,7 @@ class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device static var TYPE = "contact" # name of the plug-in in json static var NAME = "Contact" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Switch number" + static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 250ms static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index e7655417a..82b2206c3 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -30,7 +30,7 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device static var TYPE = "occupancy" # name of the plug-in in json static var NAME = "Occupancy" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Switch number" + static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 250ms static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index 8226116e8..738ecfbda 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -28,7 +28,7 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device static var TYPE = "onoff" # name of the plug-in in json static var NAME = "OnOff Sensor" # display name of the plug-in static var ARG = "switch" # additional argument name (or empty if none) - static var ARG_HINT = "Enter Switch number" + static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type static var UPDATE_TIME = 5000 # update every 250ms static var CLUSTERS = { diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index 6b3de484b..8e110c7d1 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -31,7 +31,7 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device static var NAME = "Shutter" # display name of the plug-in static var ARG = "shutter" # additional argument name (or empty if none) static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var ARG_HINT = "Enter Relay number" + static var ARG_HINT = "Relay number" static var CLUSTERS = { # 0x001D: inherited # Descriptor Cluster 9.5 p.453 # 0x0003: inherited # Identify 1.2 p.16 diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be index e673f98f4..d0f3c6e42 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be @@ -70,6 +70,7 @@ class Matter_UDPServer var udp_socket var dispatch_cb # callback to call when a message is received var packets_sent # list map of packets sent to be acknowledged + var loop_cb # closure to pass to fast_loop ############################################################# # Init UDP Server listening to `addr` and `port` (opt). @@ -80,6 +81,7 @@ class Matter_UDPServer self.port = port ? port : 5540 self.listening = false self.packets_sent = [] + self.loop_cb = def () self.loop() end end ############################################################# @@ -95,7 +97,8 @@ class Matter_UDPServer if !ok raise "network_error", "could not open UDP server" end self.listening = true self.dispatch_cb = cb - tasmota.add_driver(self) + # tasmota.add_driver(self) + tasmota.add_fast_loop(self.loop_cb) end end @@ -105,7 +108,8 @@ class Matter_UDPServer if self.listening self.udp_socket.stop() self.listening = false - tasmota.remove_driver(self) + # tasmota.remove_driver(self) + tasmota.remove_fast_loop(self.loop_cb) end end @@ -115,7 +119,7 @@ class Matter_UDPServer # Read at most `MAX_PACKETS_READ (4) packets at each tick to # avoid any starvation. # Then resend queued outgoing packets. - def every_50ms() + def loop() var packet_read = 0 if self.udp_socket == nil return end var packet = self.udp_socket.read() @@ -138,6 +142,9 @@ class Matter_UDPServer self._resend_packets() # resend any packet end + def every_50ms() + self.loop() + end ############################################################# # Send packet now. # diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be index b9d160a8c..77c871203 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UI.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UI.be @@ -105,6 +105,8 @@ class Matter_UI var commissioning_open_checked = self.device.commissioning_open != nil ? "checked" : "" webserver.content_send(f"

    ") webserver.content_send("

    ") + var disable_bridge_mode_checked = self.device.disable_bridge_mode ? " checked" : "" + webserver.content_send(f"

    Force Static endpoints (non-bridge)

    ") end webserver.content_send("

    " @@ -197,8 +199,6 @@ class Matter_UI webserver.content_send(f"") var ipv4only_checked = self.device.ipv4only ? " checked" : "" webserver.content_send(f"

    IPv4 only

    ") - var disable_bridge_mode_checked = self.device.disable_bridge_mode ? " checked" : "" - webserver.content_send(f"

    Disable bridge mode (not recommended)

    ") webserver.content_send("

    " "

    ") @@ -741,9 +741,9 @@ class Matter_UI try # debug information about parameters - for i:0..webserver.arg_size()-1 - tasmota.log(format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) - end + # for i:0..webserver.arg_size()-1 + # tasmota.log(format("MTR: Arg%i '%s' = '%s'", i, webserver.arg_name(i), webserver.arg(i))) + # end #---------------------------------------------------------------------# # Change Passcode and/or Passcode @@ -757,7 +757,6 @@ class Matter_UI self.device.root_discriminator = int(webserver.arg("discriminator")) end self.device.ipv4only = webserver.arg("ipv4") == 'on' - self.device.disable_bridge_mode = webserver.arg("nobridge") == 'on' self.device.save_param() #- and force restart -# @@ -766,6 +765,7 @@ class Matter_UI elif webserver.has_arg("save") var matter_enabled_requested = webserver.has_arg("menable") var matter_commissioning_requested = webserver.has_arg("comm") + self.device.disable_bridge_mode = webserver.arg("nobridge") == 'on' if matter_enabled_requested != self.matter_enabled() if matter_enabled_requested diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index ce27f0197..a0efa7279 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -2597,17 +2597,17 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ /* K8 */ be_const_int(2), /* K9 */ be_nested_str_weak(remove), /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(save_param), - /* K12 */ be_nested_str_weak(signal_endpoints_changed), - /* K13 */ be_const_int(0), - /* K14 */ be_nested_str_weak(plugins), - /* K15 */ be_nested_str_weak(get_endpoint), - /* K16 */ be_const_int(1), - /* K17 */ be_nested_str_weak(clean_remotes), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(plugins), + /* K13 */ be_nested_str_weak(get_endpoint), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(clean_remotes), + /* K16 */ be_nested_str_weak(save_param), + /* K17 */ be_nested_str_weak(signal_endpoints_changed), }), be_str_weak(bridge_remove_endpoint), &be_const_str_solidified, - ( &(const binstruction[60]) { /* code */ + ( &(const binstruction[58]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x600C0008, // 0001 GETGBL R3 G8 0x5C100200, // 0002 MOVE R4 R1 @@ -2639,35 +2639,33 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ 0x7C180400, // 001C CALL R6 2 0x50180200, // 001D LDBOOL R6 1 0 0x90021406, // 001E SETMBR R0 K10 R6 - 0x8C18010B, // 001F GETMET R6 R0 K11 - 0x7C180200, // 0020 CALL R6 1 - 0x8C18010C, // 0021 GETMET R6 R0 K12 - 0x7C180200, // 0022 CALL R6 1 - 0x5818000D, // 0023 LDCONST R6 K13 - 0x601C000C, // 0024 GETGBL R7 G12 - 0x8820010E, // 0025 GETMBR R8 R0 K14 - 0x7C1C0200, // 0026 CALL R7 1 - 0x141C0C07, // 0027 LT R7 R6 R7 - 0x781E000F, // 0028 JMPF R7 #0039 - 0x881C010E, // 0029 GETMBR R7 R0 K14 - 0x941C0E06, // 002A GETIDX R7 R7 R6 - 0x8C1C0F0F, // 002B GETMET R7 R7 K15 - 0x7C1C0200, // 002C CALL R7 1 - 0x1C1C0207, // 002D EQ R7 R1 R7 - 0x781E0007, // 002E JMPF R7 #0037 - 0x881C010E, // 002F GETMBR R7 R0 K14 - 0x8C1C0F09, // 0030 GETMET R7 R7 K9 - 0x5C240C00, // 0031 MOVE R9 R6 - 0x7C1C0400, // 0032 CALL R7 2 - 0x8C1C010C, // 0033 GETMET R7 R0 K12 + 0x5818000B, // 001F LDCONST R6 K11 + 0x601C000C, // 0020 GETGBL R7 G12 + 0x8820010C, // 0021 GETMBR R8 R0 K12 + 0x7C1C0200, // 0022 CALL R7 1 + 0x141C0C07, // 0023 LT R7 R6 R7 + 0x781E000D, // 0024 JMPF R7 #0033 + 0x881C010C, // 0025 GETMBR R7 R0 K12 + 0x941C0E06, // 0026 GETIDX R7 R7 R6 + 0x8C1C0F0D, // 0027 GETMET R7 R7 K13 + 0x7C1C0200, // 0028 CALL R7 1 + 0x1C1C0207, // 0029 EQ R7 R1 R7 + 0x781E0005, // 002A JMPF R7 #0031 + 0x881C010C, // 002B GETMBR R7 R0 K12 + 0x8C1C0F09, // 002C GETMET R7 R7 K9 + 0x5C240C00, // 002D MOVE R9 R6 + 0x7C1C0400, // 002E CALL R7 2 + 0x70020002, // 002F JMP #0033 + 0x70020000, // 0030 JMP #0032 + 0x00180D0E, // 0031 ADD R6 R6 K14 + 0x7001FFEC, // 0032 JMP #0020 + 0x8C1C010F, // 0033 GETMET R7 R0 K15 0x7C1C0200, // 0034 CALL R7 1 - 0x70020002, // 0035 JMP #0039 - 0x70020000, // 0036 JMP #0038 - 0x00180D10, // 0037 ADD R6 R6 K16 - 0x7001FFEA, // 0038 JMP #0024 - 0x8C1C0111, // 0039 GETMET R7 R0 K17 - 0x7C1C0200, // 003A CALL R7 1 - 0x80000000, // 003B RET 0 + 0x8C1C0110, // 0035 GETMET R7 R0 K16 + 0x7C1C0200, // 0036 CALL R7 1 + 0x8C1C0111, // 0037 GETMET R7 R0 K17 + 0x7C1C0200, // 0038 CALL R7 1 + 0x80000000, // 0039 RET 0 }) ) ); @@ -3388,7 +3386,7 @@ be_local_closure(Matter_Device_clean_remotes, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str_weak(introspect), /* K1 */ be_nested_str_weak(http_remotes), /* K2 */ be_const_int(0), @@ -3399,20 +3397,21 @@ be_local_closure(Matter_Device_clean_remotes, /* name */ /* K7 */ be_nested_str_weak(find), /* K8 */ be_const_int(1), /* K9 */ be_nested_str_weak(keys), - /* K10 */ be_nested_str_weak(tasmota), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), - /* K13 */ be_nested_str_weak(addr), - /* K14 */ be_const_int(3), - /* K15 */ be_nested_str_weak(close), - /* K16 */ be_nested_str_weak(remove), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K14 */ be_nested_str_weak(addr), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(close), + /* K17 */ be_nested_str_weak(remove), }), be_str_weak(clean_remotes), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ + ( &(const binstruction[81]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x780A003D, // 0002 JMPF R2 #0041 + 0x780A004C, // 0002 JMPF R2 #0050 0x60080013, // 0003 GETGBL R2 G19 0x7C080000, // 0004 CALL R2 0 0x600C0010, // 0005 GETGBL R3 G16 @@ -3449,33 +3448,48 @@ be_local_closure(Matter_Device_clean_remotes, /* name */ 0x580C0003, // 0024 LDCONST R3 K3 0xAC0C0200, // 0025 CATCH R3 1 0 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x600C0010, // 0027 GETGBL R3 G16 - 0x8C100509, // 0028 GETMET R4 R2 K9 - 0x7C100200, // 0029 CALL R4 1 - 0x7C0C0200, // 002A CALL R3 1 - 0xA8020011, // 002B EXBLK 0 #003E - 0x5C100600, // 002C MOVE R4 R3 - 0x7C100000, // 002D CALL R4 0 - 0x94140404, // 002E GETIDX R5 R2 R4 - 0x1C140B02, // 002F EQ R5 R5 K2 - 0x7816000B, // 0030 JMPF R5 #003D - 0xB8161400, // 0031 GETNGBL R5 K10 - 0x8C140B0B, // 0032 GETMET R5 R5 K11 - 0x881C090D, // 0033 GETMBR R7 R4 K13 - 0x001E1807, // 0034 ADD R7 K12 R7 - 0x5820000E, // 0035 LDCONST R8 K14 - 0x7C140600, // 0036 CALL R5 3 - 0x8C14090F, // 0037 GETMET R5 R4 K15 - 0x7C140200, // 0038 CALL R5 1 - 0x88140101, // 0039 GETMBR R5 R0 K1 - 0x8C140B10, // 003A GETMET R5 R5 K16 - 0x5C1C0800, // 003B MOVE R7 R4 - 0x7C140400, // 003C CALL R5 2 - 0x7001FFED, // 003D JMP #002C - 0x580C0003, // 003E LDCONST R3 K3 - 0xAC0C0200, // 003F CATCH R3 1 0 - 0xB0080000, // 0040 RAISE 2 R0 R0 - 0x80000000, // 0041 RET 0 + 0x600C0012, // 0027 GETGBL R3 G18 + 0x7C0C0000, // 0028 CALL R3 0 + 0x60100010, // 0029 GETGBL R4 G16 + 0x8C140509, // 002A GETMET R5 R2 K9 + 0x7C140200, // 002B CALL R5 1 + 0x7C100200, // 002C CALL R4 1 + 0xA8020008, // 002D EXBLK 0 #0037 + 0x5C140800, // 002E MOVE R5 R4 + 0x7C140000, // 002F CALL R5 0 + 0x94180405, // 0030 GETIDX R6 R2 R5 + 0x1C180D02, // 0031 EQ R6 R6 K2 + 0x781A0002, // 0032 JMPF R6 #0036 + 0x8C18070A, // 0033 GETMET R6 R3 K10 + 0x5C200A00, // 0034 MOVE R8 R5 + 0x7C180400, // 0035 CALL R6 2 + 0x7001FFF6, // 0036 JMP #002E + 0x58100003, // 0037 LDCONST R4 K3 + 0xAC100200, // 0038 CATCH R4 1 0 + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x60100010, // 003A GETGBL R4 G16 + 0x5C140600, // 003B MOVE R5 R3 + 0x7C100200, // 003C CALL R4 1 + 0xA802000E, // 003D EXBLK 0 #004D + 0x5C140800, // 003E MOVE R5 R4 + 0x7C140000, // 003F CALL R5 0 + 0xB81A1600, // 0040 GETNGBL R6 K11 + 0x8C180D0C, // 0041 GETMET R6 R6 K12 + 0x88200B0E, // 0042 GETMBR R8 R5 K14 + 0x00221A08, // 0043 ADD R8 K13 R8 + 0x5824000F, // 0044 LDCONST R9 K15 + 0x7C180600, // 0045 CALL R6 3 + 0x8C180B10, // 0046 GETMET R6 R5 K16 + 0x7C180200, // 0047 CALL R6 1 + 0x88180101, // 0048 GETMBR R6 R0 K1 + 0x8C180D11, // 0049 GETMET R6 R6 K17 + 0x88200B0E, // 004A GETMBR R8 R5 K14 + 0x7C180400, // 004B CALL R6 2 + 0x7001FFF0, // 004C JMP #003E + 0x58100003, // 004D LDCONST R4 K3 + 0xAC100200, // 004E CATCH R4 1 0 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index 3b78d3ab2..9aa8fd572 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -60,7 +60,7 @@ be_local_closure(Matter_HTTP_remote_parse_update, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[28]) { /* constants */ /* K0 */ be_const_int(0), /* K1 */ be_nested_str_weak(find), /* K2 */ be_nested_str_weak(DeviceName), @@ -87,7 +87,8 @@ be_local_closure(Matter_HTTP_remote_parse_update, /* name */ /* K23 */ be_nested_str_weak(Mac), /* K24 */ be_nested_str_weak(mac), /* K25 */ be_nested_str_weak(MTR_X3A_X20update_X20_X27_X25s_X27_X20mac_X3D_X27_X25s_X27), - /* K26 */ be_nested_str_weak(info_changed), + /* K26 */ be_nested_str_weak(UPDATE_CMD5), + /* K27 */ be_nested_str_weak(info_changed), }), be_str_weak(parse_update), &be_const_str_solidified, @@ -230,11 +231,11 @@ be_local_closure(Matter_HTTP_remote_parse_update, /* name */ 0x7C140600, // 0087 CALL R5 3 0x500C0200, // 0088 LDBOOL R3 1 0 0x8C14010C, // 0089 GETMET R5 R0 K12 - 0x881C010D, // 008A GETMBR R7 R0 K13 + 0x881C011A, // 008A GETMBR R7 R0 K26 0x8820010E, // 008B GETMBR R8 R0 K14 0x7C140600, // 008C CALL R5 3 0x780E0001, // 008D JMPF R3 #0090 - 0x8C10011A, // 008E GETMET R4 R0 K26 + 0x8C10011B, // 008E GETMET R4 R0 K27 0x7C100200, // 008F CALL R4 1 0x80000000, // 0090 RET 0 }) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index c27611d23..e3b1ee303 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -484,7 +484,7 @@ be_local_class(Matter_Plugin_Bridge_Light0, })) ) } )) }, { be_const_key_weak(read_attribute, 9), be_const_closure(Matter_Plugin_Bridge_Light0_read_attribute_closure) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Bridge_Light0_invoke_request_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Power_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Power_X3Cx_X3E_X20number) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(http_light0) }, { be_const_key_weak(shadow_onoff, -1), be_const_var(1) }, { be_const_key_weak(TYPES, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h index 2c86b4398..d4100d5c4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_OnOff.h @@ -66,7 +66,7 @@ be_local_class(Matter_Plugin_Bridge_OnOff, })) ) } )) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Relay) }, { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_OnOff_web_values_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Relay_X3Cx_X3E_X20number) }, { be_const_key_weak(TYPE, 1), be_nested_str_weak(http_relay) }, })), be_str_weak(Matter_Plugin_Bridge_OnOff) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h index e3bd32436..5f19a1916 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor.h @@ -282,7 +282,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor, be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(tasmota_sensor_filter, -1), be_const_var(0) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Filter_X20pattern) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Filter_X20pattern) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, { be_const_key_weak(pre_value, 10), be_const_closure(Matter_Plugin_Bridge_Sensor_pre_value_closure) }, { be_const_key_weak(ARG_HTTP, -1), be_nested_str_weak(url) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h index 1b781aebe..7cbc1c9a3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h @@ -338,7 +338,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Contact, be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Contact__X3Clambda_X3E_closure) }, - { be_const_key_weak(ARG_HINT, 4), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, 4), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(shadow_contact, -1), be_const_var(1) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_init_closure) }, { be_const_key_weak(web_values_prefix, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Contact_web_values_prefix_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index 79d895a75..acce61c30 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -356,7 +356,7 @@ be_local_class(Matter_Plugin_Bridge_Sensor_Occupancy, be_nested_map(16, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(ARG_TYPE, 4), be_const_static_closure(Matter_Plugin_Bridge_Sensor_Occupancy__X3Clambda_X3E_closure) }, - { be_const_key_weak(ARG_HINT, 14), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, 14), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(shadow_occupancy, -1), be_const_var(1) }, { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_init_closure) }, { be_const_key_weak(web_values, -1), be_const_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index d18b1dbb7..5a8d6ac96 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -403,7 +403,7 @@ be_local_class(Matter_Plugin_OnOff, { be_const_key_int(266, -1), be_const_int(2) }, })) ) } )) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_OnOff_invoke_request_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Relay_X3Cx_X3E_X20number) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(relay) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_OnOff_read_attribute_closure) }, { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_OnOff_parse_configuration_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index daa3f9012..5d012505d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -879,7 +879,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[87]) { /* constants */ + ( &(const bvalue[88]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -966,11 +966,12 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /* K83 */ be_nested_str_weak(_X28), /* K84 */ be_nested_str_weak(locale), /* K85 */ be_nested_str_weak(get_active_endpoints), - /* K86 */ be_nested_str_weak(read_attribute), + /* K86 */ be_nested_str_weak(disable_bridge_mode), + /* K87 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[897]) { /* code */ + ( &(const binstruction[904]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x88100902, // 0002 GETMBR R4 R4 K2 @@ -1027,11 +1028,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x50280000, // 0035 LDBOOL R10 0 0 0x7C1C0600, // 0036 CALL R7 3 0x80040E00, // 0037 RET 1 R7 - 0x70020346, // 0038 JMP #0380 + 0x7002034D, // 0038 JMP #0387 0x541E0031, // 0039 LDINT R7 50 0x1C1C0A07, // 003A EQ R7 R5 R7 0x781E0000, // 003B JMPF R7 #003D - 0x70020342, // 003C JMP #0380 + 0x70020349, // 003C JMP #0387 0x541E0032, // 003D LDINT R7 51 0x1C1C0A07, // 003E EQ R7 R5 R7 0x781E00DC, // 003F JMPF R7 #011D @@ -1255,11 +1256,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x50280000, // 0119 LDBOOL R10 0 0 0x7C1C0600, // 011A CALL R7 3 0x80040E00, // 011B RET 1 R7 - 0x70020262, // 011C JMP #0380 + 0x70020269, // 011C JMP #0387 0x541E0033, // 011D LDINT R7 52 0x1C1C0A07, // 011E EQ R7 R5 R7 0x781E0000, // 011F JMPF R7 #0121 - 0x7002025E, // 0120 JMP #0380 + 0x70020265, // 0120 JMP #0387 0x541E0037, // 0121 LDINT R7 56 0x1C1C0A07, // 0122 EQ R7 R5 R7 0x781E002C, // 0123 JMPF R7 #0151 @@ -1307,7 +1308,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x5C2C0E00, // 014D MOVE R11 R7 0x7C200600, // 014E CALL R8 3 0x80041000, // 014F RET 1 R8 - 0x7002022E, // 0150 JMP #0380 + 0x70020235, // 0150 JMP #0387 0x541E003D, // 0151 LDINT R7 62 0x1C1C0A07, // 0152 EQ R7 R5 R7 0x781E0090, // 0153 JMPF R7 #01E5 @@ -1455,7 +1456,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x5C2C0E00, // 01E1 MOVE R11 R7 0x7C200600, // 01E2 CALL R8 3 0x80041000, // 01E3 RET 1 R8 - 0x7002019A, // 01E4 JMP #0380 + 0x700201A1, // 01E4 JMP #0387 0x541E003B, // 01E5 LDINT R7 60 0x1C1C0A07, // 01E6 EQ R7 R5 R7 0x781E003C, // 01E7 JMPF R7 #0225 @@ -1519,7 +1520,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x4C2C0000, // 0221 LDNIL R11 0x7C200600, // 0222 CALL R8 3 0x80041000, // 0223 RET 1 R8 - 0x7002015A, // 0224 JMP #0380 + 0x70020161, // 0224 JMP #0387 0x541E0027, // 0225 LDINT R7 40 0x1C1C0A07, // 0226 EQ R7 R5 R7 0x781E00B7, // 0227 JMPF R7 #02E0 @@ -1706,11 +1707,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x5830000F, // 02DC LDCONST R12 K15 0x7C200800, // 02DD CALL R8 4 0x80040E00, // 02DE RET 1 R7 - 0x7002009F, // 02DF JMP #0380 + 0x700200A6, // 02DF JMP #0387 0x541E003E, // 02E0 LDINT R7 63 0x1C1C0A07, // 02E1 EQ R7 R5 R7 0x781E0000, // 02E2 JMPF R7 #02E4 - 0x7002009B, // 02E3 JMP #0380 + 0x700200A2, // 02E3 JMP #0387 0x541E0029, // 02E4 LDINT R7 42 0x1C1C0A07, // 02E5 EQ R7 R5 R7 0x781E001D, // 02E6 JMPF R7 #0305 @@ -1743,7 +1744,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x4C280000, // 0301 LDNIL R10 0x7C1C0600, // 0302 CALL R7 3 0x80040E00, // 0303 RET 1 R7 - 0x7002007A, // 0304 JMP #0380 + 0x70020081, // 0304 JMP #0387 0x541E002A, // 0305 LDINT R7 43 0x1C1C0A07, // 0306 EQ R7 R5 R7 0x781E0016, // 0307 JMPF R7 #031F @@ -1769,7 +1770,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7C300200, // 031B CALL R12 1 0x7C200800, // 031C CALL R8 4 0x80040E00, // 031D RET 1 R7 - 0x70020060, // 031E JMP #0380 + 0x70020067, // 031E JMP #0387 0x541E002B, // 031F LDINT R7 44 0x1C1C0A07, // 0320 EQ R7 R5 R7 0x781E001C, // 0321 JMPF R7 #033F @@ -1801,7 +1802,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7C2C0600, // 033B CALL R11 3 0x7C200600, // 033C CALL R8 3 0x80040E00, // 033D RET 1 R7 - 0x70020040, // 033E JMP #0380 + 0x70020047, // 033E JMP #0387 0x541E0030, // 033F LDINT R7 49 0x1C1C0A07, // 0340 EQ R7 R5 R7 0x781E0010, // 0341 JMPF R7 #0353 @@ -1821,53 +1822,60 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x542A0003, // 034F LDINT R10 4 0x7C1C0600, // 0350 CALL R7 3 0x80040E00, // 0351 RET 1 R7 - 0x7002002C, // 0352 JMP #0380 + 0x70020033, // 0352 JMP #0387 0x541E001C, // 0353 LDINT R7 29 0x1C1C0A07, // 0354 EQ R7 R5 R7 - 0x781E0021, // 0355 JMPF R7 #0378 + 0x781E0028, // 0355 JMPF R7 #037F 0x1C1C0D0F, // 0356 EQ R7 R6 K15 - 0x781E0016, // 0357 JMPF R7 #036F + 0x781E001D, // 0357 JMPF R7 #0376 0x8C1C0911, // 0358 GETMET R7 R4 K17 0x7C1C0200, // 0359 CALL R7 1 0x88200133, // 035A GETMBR R8 R0 K51 0x8C201155, // 035B GETMET R8 R8 K85 0x50280200, // 035C LDBOOL R10 1 0 0x7C200400, // 035D CALL R8 2 - 0x60240010, // 035E GETGBL R9 G16 - 0x5C281000, // 035F MOVE R10 R8 - 0x7C240200, // 0360 CALL R9 1 - 0xA8020007, // 0361 EXBLK 0 #036A - 0x5C281200, // 0362 MOVE R10 R9 - 0x7C280000, // 0363 CALL R10 0 - 0x8C2C0F0B, // 0364 GETMET R11 R7 K11 - 0x4C340000, // 0365 LDNIL R13 - 0x8838090C, // 0366 GETMBR R14 R4 K12 - 0x5C3C1400, // 0367 MOVE R15 R10 - 0x7C2C0800, // 0368 CALL R11 4 - 0x7001FFF7, // 0369 JMP #0362 - 0x5824003A, // 036A LDCONST R9 K58 - 0xAC240200, // 036B CATCH R9 1 0 - 0xB0080000, // 036C RAISE 2 R0 R0 - 0x80040E00, // 036D RET 1 R7 - 0x70020007, // 036E JMP #0377 - 0x601C0003, // 036F GETGBL R7 G3 - 0x5C200000, // 0370 MOVE R8 R0 - 0x7C1C0200, // 0371 CALL R7 1 - 0x8C1C0F56, // 0372 GETMET R7 R7 K86 - 0x5C240200, // 0373 MOVE R9 R1 - 0x5C280400, // 0374 MOVE R10 R2 - 0x7C1C0600, // 0375 CALL R7 3 - 0x80040E00, // 0376 RET 1 R7 - 0x70020007, // 0377 JMP #0380 - 0x601C0003, // 0378 GETGBL R7 G3 - 0x5C200000, // 0379 MOVE R8 R0 - 0x7C1C0200, // 037A CALL R7 1 - 0x8C1C0F56, // 037B GETMET R7 R7 K86 - 0x5C240200, // 037C MOVE R9 R1 - 0x5C280400, // 037D MOVE R10 R2 - 0x7C1C0600, // 037E CALL R7 3 - 0x80040E00, // 037F RET 1 R7 - 0x80000000, // 0380 RET 0 + 0x88240133, // 035E GETMBR R9 R0 K51 + 0x88241356, // 035F GETMBR R9 R9 K86 + 0x60280010, // 0360 GETGBL R10 G16 + 0x5C2C1000, // 0361 MOVE R11 R8 + 0x7C280200, // 0362 CALL R10 1 + 0xA802000C, // 0363 EXBLK 0 #0371 + 0x5C2C1400, // 0364 MOVE R11 R10 + 0x7C2C0000, // 0365 CALL R11 0 + 0x5C301200, // 0366 MOVE R12 R9 + 0x78320002, // 0367 JMPF R12 #036B + 0x5432FEFF, // 0368 LDINT R12 65280 + 0x1430160C, // 0369 LT R12 R11 R12 + 0x78320004, // 036A JMPF R12 #0370 + 0x8C300F0B, // 036B GETMET R12 R7 K11 + 0x4C380000, // 036C LDNIL R14 + 0x883C090C, // 036D GETMBR R15 R4 K12 + 0x5C401600, // 036E MOVE R16 R11 + 0x7C300800, // 036F CALL R12 4 + 0x7001FFF2, // 0370 JMP #0364 + 0x5828003A, // 0371 LDCONST R10 K58 + 0xAC280200, // 0372 CATCH R10 1 0 + 0xB0080000, // 0373 RAISE 2 R0 R0 + 0x80040E00, // 0374 RET 1 R7 + 0x70020007, // 0375 JMP #037E + 0x601C0003, // 0376 GETGBL R7 G3 + 0x5C200000, // 0377 MOVE R8 R0 + 0x7C1C0200, // 0378 CALL R7 1 + 0x8C1C0F57, // 0379 GETMET R7 R7 K87 + 0x5C240200, // 037A MOVE R9 R1 + 0x5C280400, // 037B MOVE R10 R2 + 0x7C1C0600, // 037C CALL R7 3 + 0x80040E00, // 037D RET 1 R7 + 0x70020007, // 037E JMP #0387 + 0x601C0003, // 037F GETGBL R7 G3 + 0x5C200000, // 0380 MOVE R8 R0 + 0x7C1C0200, // 0381 CALL R7 1 + 0x8C1C0F57, // 0382 GETMET R7 R7 K87 + 0x5C240200, // 0383 MOVE R9 R1 + 0x5C280400, // 0384 MOVE R10 R2 + 0x7C1C0600, // 0385 CALL R7 3 + 0x80040E00, // 0386 RET 1 R7 + 0x80000000, // 0387 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h index afd5ed3a8..85a316317 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor.h @@ -162,7 +162,7 @@ be_local_class(Matter_Plugin_Sensor, { be_const_key_weak(ARG, -1), be_nested_str_weak(filter) }, { be_const_key_weak(shadow_value, -1), be_const_var(2) }, { be_const_key_weak(UPDATE_TIME, 7), be_const_int(5000) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Filter_X20pattern) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Filter_X20pattern) }, { be_const_key_weak(parse_sensors, 4), be_const_closure(Matter_Plugin_Sensor_parse_sensors_closure) }, { be_const_key_weak(tasmota_sensor_filter, 8), be_const_var(0) }, { be_const_key_weak(pre_value, -1), be_const_closure(Matter_Plugin_Sensor_pre_value_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h index 7587e80b6..c52c654e9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h @@ -258,7 +258,7 @@ be_local_class(Matter_Plugin_Sensor_Contact, { be_const_key_weak(TYPE, -1), be_nested_str_weak(contact) }, { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin_Sensor_Contact__X3Clambda_X3E_closure) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Contact) }, { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_Sensor_Contact_parse_configuration_closure) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_Contact_update_shadow_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 812d0bde9..82b3c1363 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -270,7 +270,7 @@ be_local_class(Matter_Plugin_Sensor_Occupancy, { be_const_key_weak(ARG, -1), be_nested_str_weak(switch) }, { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E_closure) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(occupancy) }, - { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration_closure) }, { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index b9eb6d333..c5aa42dbb 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -241,7 +241,7 @@ be_local_class(Matter_Plugin_Sensor_OnOff, be_nested_map(13, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(ARG, 8), be_nested_str_weak(switch) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Switch_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(onoff) }, { be_const_key_weak(ARG_TYPE, 1), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 89d2d2552..5a9d6576f 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -661,7 +661,7 @@ be_local_class(Matter_Plugin_Shutter, { be_const_key_weak(shadow_shutter_direction, -1), be_const_var(4) }, { be_const_key_weak(shadow_shutter_target, -1), be_const_var(2) }, { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_Shutter_invoke_request_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Enter_X20Relay_X3Cx_X3E_X20number) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Relay_X3Cx_X3E_X20number) }, { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(1, ( (struct bmapnode*) &(const bmapnode[]) { diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h index 1db6ad008..9cdad0ee0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h @@ -120,86 +120,121 @@ void be_load_Matter_UDPPacket_sent_class(bvm *vm) { extern const bclass be_class_Matter_UDPServer; /******************************************************************** -** Solidified function: _backoff_time +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_UDPServer__backoff_time, /* name */ +be_local_closure(Matter_UDPServer_received_ack, /* name */ be_nested_proto( 10, /* nstack */ - 1, /* argc */ - 4, /* varg */ + 2, /* argc */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_const_int(1), - /* K1 */ be_const_int(0), - }), - be_str_weak(power_int), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x240C0301, // 0001 GT R3 R1 K1 - 0x780E0002, // 0002 JMPF R3 #0006 - 0x08080400, // 0003 MUL R2 R2 R0 - 0x04040300, // 0004 SUB R1 R1 K0 - 0x7001FFFA, // 0005 JMP #0001 - 0x80040400, // 0006 RET 1 R2 - }) - ), - }), + 0, /* has sup protos */ + NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_UDPServer), - /* K1 */ be_nested_str_weak(math), - /* K2 */ be_nested_str_weak(rand), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(1), - /* K5 */ be_const_real_hex(0x3FCCCCCD), - /* K6 */ be_const_real_hex(0x3F800000), - /* K7 */ be_const_real_hex(0x3E800000), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(ack_message_counter), + /* K1 */ be_nested_str_weak(exchange_id), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(packets_sent), + /* K4 */ be_nested_str_weak(msg_id), + /* K5 */ be_nested_str_weak(remove), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), + /* K9 */ be_const_int(1), }), - be_str_weak(_backoff_time), + be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x84080000, // 0001 CLOSURE R2 P0 - 0xA40E0200, // 0002 IMPORT R3 K1 - 0x5412012B, // 0003 LDINT R4 300 - 0x6014000A, // 0004 GETGBL R5 G10 - 0x8C180702, // 0005 GETMET R6 R3 K2 - 0x7C180200, // 0006 CALL R6 1 - 0x541E00FE, // 0007 LDINT R7 255 - 0x2C180C07, // 0008 AND R6 R6 R7 + ( &(const binstruction[36]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0x880C0301, // 0001 GETMBR R3 R1 K1 + 0x4C100000, // 0002 LDNIL R4 + 0x1C100404, // 0003 EQ R4 R2 R4 + 0x78120000, // 0004 JMPF R4 #0006 + 0x80000800, // 0005 RET 0 + 0x58100002, // 0006 LDCONST R4 K2 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x88180103, // 0008 GETMBR R6 R0 K3 0x7C140200, // 0009 CALL R5 1 - 0x541A00FE, // 000A LDINT R6 255 - 0x0C140A06, // 000B DIV R5 R5 R6 - 0x24180103, // 000C GT R6 R0 K3 - 0x781A0001, // 000D JMPF R6 #0010 - 0x04180104, // 000E SUB R6 R0 K4 - 0x70020000, // 000F JMP #0011 - 0x58180003, // 0010 LDCONST R6 K3 - 0x5C1C0400, // 0011 MOVE R7 R2 - 0x58200005, // 0012 LDCONST R8 K5 - 0x5C240C00, // 0013 MOVE R9 R6 - 0x7C1C0400, // 0014 CALL R7 2 - 0x081C0807, // 0015 MUL R7 R4 R7 - 0x08200B07, // 0016 MUL R8 R5 K7 - 0x00220C08, // 0017 ADD R8 K6 R8 - 0x081C0E08, // 0018 MUL R7 R7 R8 - 0x60200009, // 0019 GETGBL R8 G9 - 0x5C240E00, // 001A MOVE R9 R7 - 0x7C200200, // 001B CALL R8 1 - 0x80041000, // 001C RET 1 R8 + 0x14140805, // 000A LT R5 R4 R5 + 0x78160016, // 000B JMPF R5 #0023 + 0x88140103, // 000C GETMBR R5 R0 K3 + 0x94140A04, // 000D GETIDX R5 R5 R4 + 0x88180B04, // 000E GETMBR R6 R5 K4 + 0x1C180C02, // 000F EQ R6 R6 R2 + 0x781A000F, // 0010 JMPF R6 #0021 + 0x88180B01, // 0011 GETMBR R6 R5 K1 + 0x1C180C03, // 0012 EQ R6 R6 R3 + 0x781A000C, // 0013 JMPF R6 #0021 + 0x88180103, // 0014 GETMBR R6 R0 K3 + 0x8C180D05, // 0015 GETMET R6 R6 K5 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C180400, // 0017 CALL R6 2 + 0xB81A0C00, // 0018 GETNGBL R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x60200008, // 001A GETGBL R8 G8 + 0x5C240400, // 001B MOVE R9 R2 + 0x7C200200, // 001C CALL R8 1 + 0x00221008, // 001D ADD R8 K8 R8 + 0x54260003, // 001E LDINT R9 4 + 0x7C180600, // 001F CALL R6 3 + 0x70020000, // 0020 JMP #0022 + 0x00100909, // 0021 ADD R4 R4 K9 + 0x7001FFE3, // 0022 JMP #0007 + 0x80000000, // 0023 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_UDPServer_every_second, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_UDPServer_every_50ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -311,23 +346,216 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: _backoff_time ********************************************************************/ -be_local_closure(Matter_UDPServer_every_second, /* name */ +be_local_closure(Matter_UDPServer__backoff_time, /* name */ be_nested_proto( - 1, /* nstack */ + 10, /* nstack */ 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_const_int(1), + /* K1 */ be_const_int(0), + }), + be_str_weak(power_int), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x240C0301, // 0001 GT R3 R1 K1 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x08080400, // 0003 MUL R2 R2 R0 + 0x04040300, // 0004 SUB R1 R1 K0 + 0x7001FFFA, // 0005 JMP #0001 + 0x80040400, // 0006 RET 1 R2 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_UDPServer), + /* K1 */ be_nested_str_weak(math), + /* K2 */ be_nested_str_weak(rand), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(1), + /* K5 */ be_const_real_hex(0x3FCCCCCD), + /* K6 */ be_const_real_hex(0x3F800000), + /* K7 */ be_const_real_hex(0x3E800000), + }), + be_str_weak(_backoff_time), + &be_const_str_solidified, + ( &(const binstruction[29]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x84080000, // 0001 CLOSURE R2 P0 + 0xA40E0200, // 0002 IMPORT R3 K1 + 0x5412012B, // 0003 LDINT R4 300 + 0x6014000A, // 0004 GETGBL R5 G10 + 0x8C180702, // 0005 GETMET R6 R3 K2 + 0x7C180200, // 0006 CALL R6 1 + 0x541E00FE, // 0007 LDINT R7 255 + 0x2C180C07, // 0008 AND R6 R6 R7 + 0x7C140200, // 0009 CALL R5 1 + 0x541A00FE, // 000A LDINT R6 255 + 0x0C140A06, // 000B DIV R5 R5 R6 + 0x24180103, // 000C GT R6 R0 K3 + 0x781A0001, // 000D JMPF R6 #0010 + 0x04180104, // 000E SUB R6 R0 K4 + 0x70020000, // 000F JMP #0011 + 0x58180003, // 0010 LDCONST R6 K3 + 0x5C1C0400, // 0011 MOVE R7 R2 + 0x58200005, // 0012 LDCONST R8 K5 + 0x5C240C00, // 0013 MOVE R9 R6 + 0x7C1C0400, // 0014 CALL R7 2 + 0x081C0807, // 0015 MUL R7 R4 R7 + 0x08200B07, // 0016 MUL R8 R5 K7 + 0x00220C08, // 0017 ADD R8 K6 R8 + 0x081C0E08, // 0018 MUL R7 R7 R8 + 0x60200009, // 0019 GETGBL R8 G9 + 0x5C240E00, // 001A MOVE R9 R7 + 0x7C200200, // 001B CALL R8 1 + 0x80041000, // 001C RET 1 R8 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_UDPServer_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(every_second), + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(listening), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(udp), + /* K3 */ be_nested_str_weak(begin), + /* K4 */ be_nested_str_weak(addr), + /* K5 */ be_nested_str_weak(port), + /* K6 */ be_nested_str_weak(network_error), + /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), + /* K8 */ be_nested_str_weak(dispatch_cb), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(add_fast_loop), + /* K11 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(start), &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0011, // 0001 JMPT R2 #0014 + 0xB80A0400, // 0002 GETNGBL R2 K2 + 0x7C080000, // 0003 CALL R2 0 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x88100104, // 0007 GETMBR R4 R0 K4 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x7C080600, // 0009 CALL R2 3 + 0x5C0C0400, // 000A MOVE R3 R2 + 0x740E0000, // 000B JMPT R3 #000D + 0xB0060D07, // 000C RAISE 1 K6 K7 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x90020003, // 000E SETMBR R0 K0 R3 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0xB80E1200, // 0010 GETNGBL R3 K9 + 0x8C0C070A, // 0011 GETMET R3 R3 K10 + 0x8814010B, // 0012 GETMBR R5 R0 K11 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UDPServer_init, /* name */ + be_nested_proto( + 4, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(addr), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(port), + /* K3 */ be_nested_str_weak(listening), + /* K4 */ be_nested_str_weak(packets_sent), + /* K5 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x78060001, // 0000 JMPF R1 #0003 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x70020000, // 0002 JMP #0004 + 0x580C0001, // 0003 LDCONST R3 K1 + 0x90020003, // 0004 SETMBR R0 K0 R3 + 0x780A0001, // 0005 JMPF R2 #0008 + 0x5C0C0400, // 0006 MOVE R3 R2 + 0x70020000, // 0007 JMP #0009 + 0x540E15A3, // 0008 LDINT R3 5540 + 0x90020403, // 0009 SETMBR R0 K2 R3 + 0x500C0000, // 000A LDBOOL R3 0 0 + 0x90020603, // 000B SETMBR R0 K3 R3 + 0x600C0012, // 000C GETGBL R3 G18 + 0x7C0C0000, // 000D CALL R3 0 + 0x90020803, // 000E SETMBR R0 K4 R3 + 0x840C0000, // 000F CLOSURE R3 P0 + 0x90020A03, // 0010 SETMBR R0 K5 R3 + 0xA0000000, // 0011 CLOSE R0 + 0x80000000, // 0012 RET 0 }) ) ); @@ -378,300 +606,6 @@ be_local_closure(Matter_UDPServer_send_UDP, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_UDPServer_every_50ms, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(read), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(remote_ip), - /* K5 */ be_nested_str_weak(remote_port), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K9 */ be_nested_str_weak(dispatch_cb), - /* K10 */ be_nested_str_weak(MAX_PACKETS_READ), - /* K11 */ be_nested_str_weak(_resend_packets), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x1C080403, // 0003 EQ R2 R2 R3 - 0x780A0000, // 0004 JMPF R2 #0006 - 0x80000400, // 0005 RET 0 - 0x88080101, // 0006 GETMBR R2 R0 K1 - 0x8C080502, // 0007 GETMET R2 R2 K2 - 0x7C080200, // 0008 CALL R2 1 - 0x4C0C0000, // 0009 LDNIL R3 - 0x200C0403, // 000A NE R3 R2 R3 - 0x780E001E, // 000B JMPF R3 #002B - 0x00040303, // 000C ADD R1 R1 K3 - 0x880C0101, // 000D GETMBR R3 R0 K1 - 0x880C0704, // 000E GETMBR R3 R3 K4 - 0x88100101, // 000F GETMBR R4 R0 K1 - 0x88100905, // 0010 GETMBR R4 R4 K5 - 0xB8160C00, // 0011 GETNGBL R5 K6 - 0x8C140B07, // 0012 GETMET R5 R5 K7 - 0x601C0018, // 0013 GETGBL R7 G24 - 0x58200008, // 0014 LDCONST R8 K8 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C1C0600, // 0017 CALL R7 3 - 0x54220003, // 0018 LDINT R8 4 - 0x7C140600, // 0019 CALL R5 3 - 0x88140109, // 001A GETMBR R5 R0 K9 - 0x78160004, // 001B JMPF R5 #0021 - 0x8C140109, // 001C GETMET R5 R0 K9 - 0x5C1C0400, // 001D MOVE R7 R2 - 0x5C200600, // 001E MOVE R8 R3 - 0x5C240800, // 001F MOVE R9 R4 - 0x7C140800, // 0020 CALL R5 4 - 0x8814010A, // 0021 GETMBR R5 R0 K10 - 0x14140205, // 0022 LT R5 R1 R5 - 0x78160004, // 0023 JMPF R5 #0029 - 0x88140101, // 0024 GETMBR R5 R0 K1 - 0x8C140B02, // 0025 GETMET R5 R5 K2 - 0x7C140200, // 0026 CALL R5 1 - 0x5C080A00, // 0027 MOVE R2 R5 - 0x70020000, // 0028 JMP #002A - 0x4C080000, // 0029 LDNIL R2 - 0x7001FFDD, // 002A JMP #0009 - 0x8C0C010B, // 002B GETMET R3 R0 K11 - 0x7C0C0200, // 002C CALL R3 1 - 0x80000000, // 002D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_UDPServer_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(listening), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(stop), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(remove_driver), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060008, // 0001 JMPF R1 #000B - 0x88040101, // 0002 GETMBR R1 R0 K1 - 0x8C040302, // 0003 GETMET R1 R1 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x50040000, // 0005 LDBOOL R1 0 0 - 0x90020001, // 0006 SETMBR R0 K0 R1 - 0xB8060600, // 0007 GETNGBL R1 K3 - 0x8C040304, // 0008 GETMET R1 R1 K4 - 0x5C0C0000, // 0009 MOVE R3 R0 - 0x7C040400, // 000A CALL R1 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_UDPServer_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(listening), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(udp), - /* K3 */ be_nested_str_weak(begin), - /* K4 */ be_nested_str_weak(addr), - /* K5 */ be_nested_str_weak(port), - /* K6 */ be_nested_str_weak(network_error), - /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), - /* K8 */ be_nested_str_weak(dispatch_cb), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(add_driver), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x740A0011, // 0001 JMPT R2 #0014 - 0xB80A0400, // 0002 GETNGBL R2 K2 - 0x7C080000, // 0003 CALL R2 0 - 0x90020202, // 0004 SETMBR R0 K1 R2 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x8C080503, // 0006 GETMET R2 R2 K3 - 0x88100104, // 0007 GETMBR R4 R0 K4 - 0x88140105, // 0008 GETMBR R5 R0 K5 - 0x7C080600, // 0009 CALL R2 3 - 0x5C0C0400, // 000A MOVE R3 R2 - 0x740E0000, // 000B JMPT R3 #000D - 0xB0060D07, // 000C RAISE 1 K6 K7 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x90020003, // 000E SETMBR R0 K0 R3 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0xB80E1200, // 0010 GETNGBL R3 K9 - 0x8C0C070A, // 0011 GETMET R3 R3 K10 - 0x5C140000, // 0012 MOVE R5 R0 - 0x7C0C0400, // 0013 CALL R3 2 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_UDPServer_received_ack, /* name */ - be_nested_proto( - 10, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(ack_message_counter), - /* K1 */ be_nested_str_weak(exchange_id), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(packets_sent), - /* K4 */ be_nested_str_weak(msg_id), - /* K5 */ be_nested_str_weak(remove), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), - /* K9 */ be_const_int(1), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0x88080300, // 0000 GETMBR R2 R1 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0x4C100000, // 0002 LDNIL R4 - 0x1C100404, // 0003 EQ R4 R2 R4 - 0x78120000, // 0004 JMPF R4 #0006 - 0x80000800, // 0005 RET 0 - 0x58100002, // 0006 LDCONST R4 K2 - 0x6014000C, // 0007 GETGBL R5 G12 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C140200, // 0009 CALL R5 1 - 0x14140805, // 000A LT R5 R4 R5 - 0x78160016, // 000B JMPF R5 #0023 - 0x88140103, // 000C GETMBR R5 R0 K3 - 0x94140A04, // 000D GETIDX R5 R5 R4 - 0x88180B04, // 000E GETMBR R6 R5 K4 - 0x1C180C02, // 000F EQ R6 R6 R2 - 0x781A000F, // 0010 JMPF R6 #0021 - 0x88180B01, // 0011 GETMBR R6 R5 K1 - 0x1C180C03, // 0012 EQ R6 R6 R3 - 0x781A000C, // 0013 JMPF R6 #0021 - 0x88180103, // 0014 GETMBR R6 R0 K3 - 0x8C180D05, // 0015 GETMET R6 R6 K5 - 0x5C200800, // 0016 MOVE R8 R4 - 0x7C180400, // 0017 CALL R6 2 - 0xB81A0C00, // 0018 GETNGBL R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x60200008, // 001A GETGBL R8 G8 - 0x5C240400, // 001B MOVE R9 R2 - 0x7C200200, // 001C CALL R8 1 - 0x00221008, // 001D ADD R8 K8 R8 - 0x54260003, // 001E LDINT R9 4 - 0x7C180600, // 001F CALL R6 3 - 0x70020000, // 0020 JMP #0022 - 0x00100909, // 0021 ADD R4 R4 K9 - 0x7001FFE3, // 0022 JMP #0007 - 0x80000000, // 0023 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_UDPServer_init, /* name */ - be_nested_proto( - 4, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(addr), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(port), - /* K3 */ be_nested_str_weak(listening), - /* K4 */ be_nested_str_weak(packets_sent), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x78060001, // 0000 JMPF R1 #0003 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x70020000, // 0002 JMP #0004 - 0x580C0001, // 0003 LDCONST R3 K1 - 0x90020003, // 0004 SETMBR R0 K0 R3 - 0x780A0001, // 0005 JMPF R2 #0008 - 0x5C0C0400, // 0006 MOVE R3 R2 - 0x70020000, // 0007 JMP #0009 - 0x540E15A3, // 0008 LDINT R3 5540 - 0x90020403, // 0009 SETMBR R0 K2 R3 - 0x500C0000, // 000A LDBOOL R3 0 0 - 0x90020603, // 000B SETMBR R0 K3 R3 - 0x600C0012, // 000C GETGBL R3 G18 - 0x7C0C0000, // 000D CALL R3 0 - 0x90020803, // 000E SETMBR R0 K4 R3 - 0x80000000, // 000F RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: send ********************************************************************/ @@ -745,32 +679,158 @@ be_local_closure(Matter_UDPServer_send, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_UDPServer_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(listening), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(stop), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(remove_fast_loop), + /* K5 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060008, // 0001 JMPF R1 #000B + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x50040000, // 0005 LDBOOL R1 0 0 + 0x90020001, // 0006 SETMBR R0 K0 R1 + 0xB8060600, // 0007 GETNGBL R1 K3 + 0x8C040304, // 0008 GETMET R1 R1 K4 + 0x880C0105, // 0009 GETMBR R3 R0 K5 + 0x7C040400, // 000A CALL R1 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: loop +********************************************************************/ +be_local_closure(Matter_UDPServer_loop, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(remote_ip), + /* K5 */ be_nested_str_weak(remote_port), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K9 */ be_nested_str_weak(dispatch_cb), + /* K10 */ be_nested_str_weak(MAX_PACKETS_READ), + /* K11 */ be_nested_str_weak(_resend_packets), + }), + be_str_weak(loop), + &be_const_str_solidified, + ( &(const binstruction[46]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x1C080403, // 0003 EQ R2 R2 R3 + 0x780A0000, // 0004 JMPF R2 #0006 + 0x80000400, // 0005 RET 0 + 0x88080101, // 0006 GETMBR R2 R0 K1 + 0x8C080502, // 0007 GETMET R2 R2 K2 + 0x7C080200, // 0008 CALL R2 1 + 0x4C0C0000, // 0009 LDNIL R3 + 0x200C0403, // 000A NE R3 R2 R3 + 0x780E001E, // 000B JMPF R3 #002B + 0x00040303, // 000C ADD R1 R1 K3 + 0x880C0101, // 000D GETMBR R3 R0 K1 + 0x880C0704, // 000E GETMBR R3 R3 K4 + 0x88100101, // 000F GETMBR R4 R0 K1 + 0x88100905, // 0010 GETMBR R4 R4 K5 + 0xB8160C00, // 0011 GETNGBL R5 K6 + 0x8C140B07, // 0012 GETMET R5 R5 K7 + 0x601C0018, // 0013 GETGBL R7 G24 + 0x58200008, // 0014 LDCONST R8 K8 + 0x5C240600, // 0015 MOVE R9 R3 + 0x5C280800, // 0016 MOVE R10 R4 + 0x7C1C0600, // 0017 CALL R7 3 + 0x54220003, // 0018 LDINT R8 4 + 0x7C140600, // 0019 CALL R5 3 + 0x88140109, // 001A GETMBR R5 R0 K9 + 0x78160004, // 001B JMPF R5 #0021 + 0x8C140109, // 001C GETMET R5 R0 K9 + 0x5C1C0400, // 001D MOVE R7 R2 + 0x5C200600, // 001E MOVE R8 R3 + 0x5C240800, // 001F MOVE R9 R4 + 0x7C140800, // 0020 CALL R5 4 + 0x8814010A, // 0021 GETMBR R5 R0 K10 + 0x14140205, // 0022 LT R5 R1 R5 + 0x78160004, // 0023 JMPF R5 #0029 + 0x88140101, // 0024 GETMBR R5 R0 K1 + 0x8C140B02, // 0025 GETMET R5 R5 K2 + 0x7C140200, // 0026 CALL R5 1 + 0x5C080A00, // 0027 MOVE R2 R5 + 0x70020000, // 0028 JMP #002A + 0x4C080000, // 0029 LDNIL R2 + 0x7001FFDD, // 002A JMP #0009 + 0x8C0C010B, // 002B GETMET R3 R0 K11 + 0x7C0C0200, // 002C CALL R3 1 + 0x80000000, // 002D RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_UDPServer ********************************************************************/ be_local_class(Matter_UDPServer, - 6, + 7, NULL, - be_nested_map(18, + be_nested_map(20, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(_backoff_time, 17), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, - { be_const_key_weak(packets_sent, -1), be_const_var(5) }, - { be_const_key_weak(addr, -1), be_const_var(0) }, { be_const_key_weak(every_second, -1), be_const_closure(Matter_UDPServer_every_second_closure) }, - { be_const_key_weak(port, -1), be_const_var(1) }, - { be_const_key_weak(dispatch_cb, 1), be_const_var(4) }, - { be_const_key_weak(udp_socket, -1), be_const_var(3) }, - { be_const_key_weak(send_UDP, -1), be_const_closure(Matter_UDPServer_send_UDP_closure) }, - { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_UDPServer_every_50ms_closure) }, - { be_const_key_weak(send, 10), be_const_closure(Matter_UDPServer_send_closure) }, { be_const_key_weak(RETRIES, -1), be_const_int(5) }, - { be_const_key_weak(stop, 16), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(udp_socket, -1), be_const_var(3) }, + { be_const_key_weak(packets_sent, -1), be_const_var(5) }, { be_const_key_weak(received_ack, -1), be_const_closure(Matter_UDPServer_received_ack_closure) }, - { be_const_key_weak(_resend_packets, 9), be_const_closure(Matter_UDPServer__resend_packets_closure) }, - { be_const_key_weak(MAX_PACKETS_READ, -1), be_const_int(4) }, + { be_const_key_weak(dispatch_cb, 0), be_const_var(4) }, + { be_const_key_weak(send, -1), be_const_closure(Matter_UDPServer_send_closure) }, + { be_const_key_weak(send_UDP, 13), be_const_closure(Matter_UDPServer_send_UDP_closure) }, + { be_const_key_weak(every_50ms, 12), be_const_closure(Matter_UDPServer_every_50ms_closure) }, + { be_const_key_weak(loop_cb, 3), be_const_var(6) }, + { be_const_key_weak(port, 16), be_const_var(1) }, + { be_const_key_weak(start, 6), be_const_closure(Matter_UDPServer_start_closure) }, + { be_const_key_weak(MAX_PACKETS_READ, 2), be_const_int(4) }, { be_const_key_weak(init, -1), be_const_closure(Matter_UDPServer_init_closure) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_UDPServer_start_closure) }, { be_const_key_weak(listening, -1), be_const_var(2) }, + { be_const_key_weak(_resend_packets, 7), be_const_closure(Matter_UDPServer__resend_packets_closure) }, + { be_const_key_weak(_backoff_time, -1), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(addr, -1), be_const_var(0) }, + { be_const_key_weak(loop, -1), be_const_closure(Matter_UDPServer_loop_closure) }, })), be_str_weak(Matter_UDPServer) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h index de3dbd022..6a9442079 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UI.h @@ -2095,7 +2095,7 @@ be_local_closure(Matter_UI_web_add_handler, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_passcode_form, /* name */ be_nested_proto( - 9, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2103,7 +2103,7 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(content_send), /* K2 */ be_nested_str_weak(_X3Cfieldset_X3E_X3Clegend_X3E_X3Cb_X3E_X26nbsp_X3BMatter_X20Advanced_X20Configuration_X26nbsp_X3B_X3C_X2Fb_X3E_X3C_X2Flegend_X3E_X3Cp_X3E_X3C_X2Fp_X3E), @@ -2118,13 +2118,11 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ /* K11 */ be_nested_str_weak(_X20checked), /* K12 */ be_nested_str_weak(), /* K13 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27ipv4_X27_X25s_X3EIPv4_X20only_X3C_X2Fp_X3E), - /* K14 */ be_nested_str_weak(disable_bridge_mode), - /* K15 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27nobridge_X27_X25s_X3EDisable_X20bridge_X20mode_X20_X28not_X20recommended_X29_X3C_X2Fp_X3E), - /* K16 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27passcode_X27_X20class_X3D_X27button_X20bgrn_X27_X3EChange_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_passcode_form), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ + ( &(const binstruction[40]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x58100002, // 0002 LDCONST R4 K2 @@ -2161,22 +2159,10 @@ be_local_closure(Matter_UI_show_passcode_form, /* name */ 0x5C1C0400, // 0021 MOVE R7 R2 0x7C140400, // 0022 CALL R5 2 0x7C0C0400, // 0023 CALL R3 2 - 0x880C0105, // 0024 GETMBR R3 R0 K5 - 0x880C070E, // 0025 GETMBR R3 R3 K14 - 0x780E0001, // 0026 JMPF R3 #0029 - 0x580C000B, // 0027 LDCONST R3 K11 - 0x70020000, // 0028 JMP #002A - 0x580C000C, // 0029 LDCONST R3 K12 - 0x8C100301, // 002A GETMET R4 R1 K1 - 0x60180018, // 002B GETGBL R6 G24 - 0x581C000F, // 002C LDCONST R7 K15 - 0x5C200600, // 002D MOVE R8 R3 - 0x7C180400, // 002E CALL R6 2 - 0x7C100400, // 002F CALL R4 2 - 0x8C100301, // 0030 GETMET R4 R1 K1 - 0x58180010, // 0031 LDCONST R6 K16 - 0x7C100400, // 0032 CALL R4 2 - 0x80000000, // 0033 RET 0 + 0x8C0C0301, // 0024 GETMET R3 R1 K1 + 0x5814000E, // 0025 LDCONST R5 K14 + 0x7C0C0400, // 0026 CALL R3 2 + 0x80000000, // 0027 RET 0 }) ) ); @@ -2196,112 +2182,111 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[101]) { /* constants */ + ( &(const bvalue[100]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(check_privileged_access), /* K2 */ be_nested_str_weak(string), /* K3 */ be_nested_str_weak(partition_core), /* K4 */ be_nested_str_weak(persist), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(arg_size), - /* K7 */ be_const_int(1), + /* K5 */ be_nested_str_weak(has_arg), + /* K6 */ be_nested_str_weak(passcode), + /* K7 */ be_nested_str_weak(discriminator), /* K8 */ be_nested_str_weak(tasmota), /* K9 */ be_nested_str_weak(log), - /* K10 */ be_nested_str_weak(MTR_X3A_X20Arg_X25i_X20_X27_X25s_X27_X20_X3D_X20_X27_X25s_X27), - /* K11 */ be_nested_str_weak(arg_name), - /* K12 */ be_nested_str_weak(arg), - /* K13 */ be_nested_str_weak(stop_iteration), - /* K14 */ be_nested_str_weak(has_arg), - /* K15 */ be_nested_str_weak(passcode), - /* K16 */ be_nested_str_weak(discriminator), - /* K17 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(device), - /* K20 */ be_nested_str_weak(root_passcode), - /* K21 */ be_nested_str_weak(root_discriminator), - /* K22 */ be_nested_str_weak(ipv4only), - /* K23 */ be_nested_str_weak(ipv4), - /* K24 */ be_nested_str_weak(on), + /* K10 */ be_nested_str_weak(MTR_X3A_X20_X2Fmatterc_X20received_X20_X27_X25s_X27_X20command), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(device), + /* K13 */ be_nested_str_weak(root_passcode), + /* K14 */ be_nested_str_weak(arg), + /* K15 */ be_nested_str_weak(root_discriminator), + /* K16 */ be_nested_str_weak(ipv4only), + /* K17 */ be_nested_str_weak(ipv4), + /* K18 */ be_nested_str_weak(on), + /* K19 */ be_nested_str_weak(save_param), + /* K20 */ be_nested_str_weak(redirect), + /* K21 */ be_nested_str_weak(_X2F_X3Frst_X3D), + /* K22 */ be_nested_str_weak(save), + /* K23 */ be_nested_str_weak(menable), + /* K24 */ be_nested_str_weak(comm), /* K25 */ be_nested_str_weak(disable_bridge_mode), /* K26 */ be_nested_str_weak(nobridge), - /* K27 */ be_nested_str_weak(save_param), - /* K28 */ be_nested_str_weak(redirect), - /* K29 */ be_nested_str_weak(_X2F_X3Frst_X3D), - /* K30 */ be_nested_str_weak(save), - /* K31 */ be_nested_str_weak(menable), - /* K32 */ be_nested_str_weak(comm), - /* K33 */ be_nested_str_weak(matter_enabled), - /* K34 */ be_nested_str_weak(enable), - /* K35 */ be_nested_str_weak(cmd), - /* K36 */ be_nested_str_weak(SetOption), - /* K37 */ be_nested_str_weak(matter), - /* K38 */ be_nested_str_weak(MATTER_OPTION), - /* K39 */ be_nested_str_weak(_X201), - /* K40 */ be_nested_str_weak(disable), - /* K41 */ be_nested_str_weak(_X200), - /* K42 */ be_nested_str_weak(commissioning_open), - /* K43 */ be_nested_str_weak(start_root_basic_commissioning), - /* K44 */ be_nested_str_weak(stop_basic_commissioning), - /* K45 */ be_nested_str_weak(_X2F), - /* K46 */ be_nested_str_weak(del_fabric), - /* K47 */ be_nested_str_weak(sessions), - /* K48 */ be_nested_str_weak(fabrics), - /* K49 */ be_nested_str_weak(get_fabric_index), - /* K50 */ be_nested_str_weak(remove_fabric), - /* K51 */ be_nested_str_weak(_X2Fmatterc_X3F), - /* K52 */ be_nested_str_weak(auto), - /* K53 */ be_nested_str_weak(plugins_persist), - /* K54 */ be_nested_str_weak(config), - /* K55 */ be_nested_str_weak(find), - /* K56 */ be_const_int(2147483647), - /* K57 */ be_nested_str_weak(plugins_config), - /* K58 */ be_nested_str_weak(plugins_classes), - /* K59 */ be_nested_str_weak(type), - /* K60 */ be_nested_str_weak(), - /* K61 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), - /* K62 */ be_nested_str_weak(ui_conf_to_string), - /* K63 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), - /* K64 */ be_nested_str_weak(changed), - /* K65 */ be_nested_str_weak(ui_string_to_conf), - /* K66 */ be_nested_str_weak(find_plugin_by_endpoint), - /* K67 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K68 */ be_nested_str_weak(parse_configuration), - /* K69 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), - /* K70 */ be_nested_str_weak(nam), - /* K71 */ be_nested_str_weak(name), - /* K72 */ be_nested_str_weak(set_name), - /* K73 */ be_nested_str_weak(remove), - /* K74 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), - /* K75 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), - /* K76 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), - /* K77 */ be_nested_str_weak(addep), - /* K78 */ be_nested_str_weak(pi), - /* K79 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K80 */ be_nested_str_weak(bridge_add_endpoint), - /* K81 */ be_nested_str_weak(addrem), - /* K82 */ be_nested_str_weak(url), - /* K83 */ be_nested_str_weak(value_error), - /* K84 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), - /* K85 */ be_nested_str_weak(equal_map), - /* K86 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), - /* K87 */ be_nested_str_weak(del), - /* K88 */ be_nested_str_weak(bridge_remove_endpoint), - /* K89 */ be_nested_str_weak(content_start), - /* K90 */ be_nested_str_weak(Parameter_X20error), - /* K91 */ be_nested_str_weak(content_send_style), - /* K92 */ be_nested_str_weak(content_send), - /* K93 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), - /* K94 */ be_nested_str_weak(html_escape), - /* K95 */ be_nested_str_weak(content_button), - /* K96 */ be_nested_str_weak(BUTTON_CONFIGURATION), - /* K97 */ be_nested_str_weak(content_stop), - /* K98 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), - /* K99 */ be_const_int(2), - /* K100 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), + /* K27 */ be_nested_str_weak(matter_enabled), + /* K28 */ be_nested_str_weak(enable), + /* K29 */ be_nested_str_weak(cmd), + /* K30 */ be_nested_str_weak(SetOption), + /* K31 */ be_nested_str_weak(matter), + /* K32 */ be_nested_str_weak(MATTER_OPTION), + /* K33 */ be_nested_str_weak(_X201), + /* K34 */ be_nested_str_weak(disable), + /* K35 */ be_nested_str_weak(_X200), + /* K36 */ be_nested_str_weak(commissioning_open), + /* K37 */ be_nested_str_weak(start_root_basic_commissioning), + /* K38 */ be_nested_str_weak(stop_basic_commissioning), + /* K39 */ be_nested_str_weak(_X2F), + /* K40 */ be_nested_str_weak(del_fabric), + /* K41 */ be_const_int(0), + /* K42 */ be_nested_str_weak(sessions), + /* K43 */ be_nested_str_weak(fabrics), + /* K44 */ be_nested_str_weak(get_fabric_index), + /* K45 */ be_nested_str_weak(remove_fabric), + /* K46 */ be_const_int(1), + /* K47 */ be_nested_str_weak(_X2Fmatterc_X3F), + /* K48 */ be_nested_str_weak(auto), + /* K49 */ be_nested_str_weak(plugins_persist), + /* K50 */ be_nested_str_weak(config), + /* K51 */ be_nested_str_weak(arg_size), + /* K52 */ be_nested_str_weak(arg_name), + /* K53 */ be_nested_str_weak(find), + /* K54 */ be_const_int(2147483647), + /* K55 */ be_nested_str_weak(plugins_config), + /* K56 */ be_nested_str_weak(plugins_classes), + /* K57 */ be_nested_str_weak(type), + /* K58 */ be_nested_str_weak(), + /* K59 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20arg_X3D_X25s), + /* K60 */ be_nested_str_weak(ui_conf_to_string), + /* K61 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20prev_arg_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27_X20_X25s), + /* K62 */ be_nested_str_weak(changed), + /* K63 */ be_nested_str_weak(ui_string_to_conf), + /* K64 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K65 */ be_nested_str_weak(MTR_X3A_X20apply_X20conf_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K66 */ be_nested_str_weak(parse_configuration), + /* K67 */ be_nested_str_weak(MTR_X3A_X20ep_X3D_X25i_X20not_X20found), + /* K68 */ be_nested_str_weak(nam), + /* K69 */ be_nested_str_weak(name), + /* K70 */ be_nested_str_weak(set_name), + /* K71 */ be_nested_str_weak(remove), + /* K72 */ be_nested_str_weak(MTR_X3A_X20apply_X20name_X20_X27_X25s_X27_X20_X28_X25i_X29_X20to_X20_X25s), + /* K73 */ be_nested_str_weak(stop_iteration), + /* K74 */ be_nested_str_weak(MTR_X3A_X20config_X20_X3D_X20_X25s), + /* K75 */ be_nested_str_weak(MTR_X3A_X20config_X20error_X20_X3D_X20_X25s), + /* K76 */ be_nested_str_weak(addep), + /* K77 */ be_nested_str_weak(pi), + /* K78 */ be_nested_str_weak(MTR_X3A_X20add_X20endpoint_X20typ_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K79 */ be_nested_str_weak(bridge_add_endpoint), + /* K80 */ be_nested_str_weak(addrem), + /* K81 */ be_nested_str_weak(url), + /* K82 */ be_nested_str_weak(value_error), + /* K83 */ be_nested_str_weak(url_X20shouldn_X27t_X20be_X20null), + /* K84 */ be_nested_str_weak(equal_map), + /* K85 */ be_nested_str_weak(MTR_X3A_X20remote_X20add_X20url_X3D_X27_X25s_X27_X20type_X3D_X27_X25s_X27_X20arg_X3D_X27_X25s_X27), + /* K86 */ be_nested_str_weak(del), + /* K87 */ be_nested_str_weak(bridge_remove_endpoint), + /* K88 */ be_nested_str_weak(content_start), + /* K89 */ be_nested_str_weak(Parameter_X20error), + /* K90 */ be_nested_str_weak(content_send_style), + /* K91 */ be_nested_str_weak(content_send), + /* K92 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EError_X3A_X3C_X2Fb_X3E_X25s_X3C_X2Fp_X3E), + /* K93 */ be_nested_str_weak(html_escape), + /* K94 */ be_nested_str_weak(content_button), + /* K95 */ be_nested_str_weak(BUTTON_CONFIGURATION), + /* K96 */ be_nested_str_weak(content_stop), + /* K97 */ be_nested_str_weak(BRY_X3A_X20Exception_X3E_X20_X27_X25s_X27_X20_X2D_X20_X25s), + /* K98 */ be_const_int(2), + /* K99 */ be_nested_str_weak(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E), }), be_str_weak(page_part_ctl), &be_const_str_solidified, - ( &(const binstruction[694]) { /* code */ + ( &(const binstruction[668]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 0x7C080200, // 0002 CALL R2 1 @@ -2312,690 +2297,664 @@ be_local_closure(Matter_UI_page_part_ctl, /* name */ 0xA40E0600, // 0007 IMPORT R3 K3 0xA4120800, // 0008 IMPORT R4 K4 0x4C140000, // 0009 LDNIL R5 - 0xA802028B, // 000A EXBLK 0 #0297 - 0x60180010, // 000B GETGBL R6 G16 - 0x8C1C0306, // 000C GETMET R7 R1 K6 - 0x7C1C0200, // 000D CALL R7 1 - 0x041C0F07, // 000E SUB R7 R7 K7 - 0x401E0A07, // 000F CONNECT R7 K5 R7 - 0x7C180200, // 0010 CALL R6 1 - 0xA802000F, // 0011 EXBLK 0 #0022 - 0x5C1C0C00, // 0012 MOVE R7 R6 - 0x7C1C0000, // 0013 CALL R7 0 - 0xB8221000, // 0014 GETNGBL R8 K8 - 0x8C201109, // 0015 GETMET R8 R8 K9 - 0x60280018, // 0016 GETGBL R10 G24 - 0x582C000A, // 0017 LDCONST R11 K10 - 0x5C300E00, // 0018 MOVE R12 R7 - 0x8C34030B, // 0019 GETMET R13 R1 K11 - 0x5C3C0E00, // 001A MOVE R15 R7 - 0x7C340400, // 001B CALL R13 2 - 0x8C38030C, // 001C GETMET R14 R1 K12 - 0x5C400E00, // 001D MOVE R16 R7 - 0x7C380400, // 001E CALL R14 2 - 0x7C280800, // 001F CALL R10 4 - 0x7C200400, // 0020 CALL R8 2 - 0x7001FFEF, // 0021 JMP #0012 - 0x5818000D, // 0022 LDCONST R6 K13 - 0xAC180200, // 0023 CATCH R6 1 0 - 0xB0080000, // 0024 RAISE 2 R0 R0 - 0x8C18030E, // 0025 GETMET R6 R1 K14 - 0x5820000F, // 0026 LDCONST R8 K15 - 0x7C180400, // 0027 CALL R6 2 - 0x741A0003, // 0028 JMPT R6 #002D - 0x8C18030E, // 0029 GETMET R6 R1 K14 - 0x58200010, // 002A LDCONST R8 K16 - 0x7C180400, // 002B CALL R6 2 - 0x781A0030, // 002C JMPF R6 #005E - 0xB81A1000, // 002D GETNGBL R6 K8 - 0x8C180D09, // 002E GETMET R6 R6 K9 - 0x60200018, // 002F GETGBL R8 G24 - 0x58240011, // 0030 LDCONST R9 K17 - 0x5828000F, // 0031 LDCONST R10 K15 - 0x7C200400, // 0032 CALL R8 2 - 0x58240012, // 0033 LDCONST R9 K18 - 0x7C180600, // 0034 CALL R6 3 - 0x8C18030E, // 0035 GETMET R6 R1 K14 - 0x5820000F, // 0036 LDCONST R8 K15 - 0x7C180400, // 0037 CALL R6 2 - 0x781A0006, // 0038 JMPF R6 #0040 - 0x88180113, // 0039 GETMBR R6 R0 K19 - 0x601C0009, // 003A GETGBL R7 G9 - 0x8C20030C, // 003B GETMET R8 R1 K12 - 0x5828000F, // 003C LDCONST R10 K15 - 0x7C200400, // 003D CALL R8 2 - 0x7C1C0200, // 003E CALL R7 1 - 0x901A2807, // 003F SETMBR R6 K20 R7 - 0x8C18030E, // 0040 GETMET R6 R1 K14 - 0x58200010, // 0041 LDCONST R8 K16 - 0x7C180400, // 0042 CALL R6 2 - 0x781A0006, // 0043 JMPF R6 #004B - 0x88180113, // 0044 GETMBR R6 R0 K19 - 0x601C0009, // 0045 GETGBL R7 G9 - 0x8C20030C, // 0046 GETMET R8 R1 K12 - 0x58280010, // 0047 LDCONST R10 K16 - 0x7C200400, // 0048 CALL R8 2 - 0x7C1C0200, // 0049 CALL R7 1 - 0x901A2A07, // 004A SETMBR R6 K21 R7 - 0x88180113, // 004B GETMBR R6 R0 K19 - 0x8C1C030C, // 004C GETMET R7 R1 K12 - 0x58240017, // 004D LDCONST R9 K23 - 0x7C1C0400, // 004E CALL R7 2 - 0x1C1C0F18, // 004F EQ R7 R7 K24 - 0x901A2C07, // 0050 SETMBR R6 K22 R7 - 0x88180113, // 0051 GETMBR R6 R0 K19 - 0x8C1C030C, // 0052 GETMET R7 R1 K12 - 0x5824001A, // 0053 LDCONST R9 K26 - 0x7C1C0400, // 0054 CALL R7 2 - 0x1C1C0F18, // 0055 EQ R7 R7 K24 - 0x901A3207, // 0056 SETMBR R6 K25 R7 - 0x88180113, // 0057 GETMBR R6 R0 K19 - 0x8C180D1B, // 0058 GETMET R6 R6 K27 - 0x7C180200, // 0059 CALL R6 1 - 0x8C18031C, // 005A GETMET R6 R1 K28 - 0x5820001D, // 005B LDCONST R8 K29 - 0x7C180400, // 005C CALL R6 2 - 0x70020223, // 005D JMP #0282 - 0x8C18030E, // 005E GETMET R6 R1 K14 - 0x5820001E, // 005F LDCONST R8 K30 - 0x7C180400, // 0060 CALL R6 2 - 0x781A0047, // 0061 JMPF R6 #00AA - 0x8C18030E, // 0062 GETMET R6 R1 K14 - 0x5820001F, // 0063 LDCONST R8 K31 - 0x7C180400, // 0064 CALL R6 2 - 0x8C1C030E, // 0065 GETMET R7 R1 K14 - 0x58240020, // 0066 LDCONST R9 K32 - 0x7C1C0400, // 0067 CALL R7 2 - 0x8C200121, // 0068 GETMET R8 R0 K33 - 0x7C200200, // 0069 CALL R8 1 - 0x20200C08, // 006A NE R8 R6 R8 - 0x78220027, // 006B JMPF R8 #0094 - 0x781A0011, // 006C JMPF R6 #007F + 0xA8020271, // 000A EXBLK 0 #027D + 0x8C180305, // 000B GETMET R6 R1 K5 + 0x58200006, // 000C LDCONST R8 K6 + 0x7C180400, // 000D CALL R6 2 + 0x741A0003, // 000E JMPT R6 #0013 + 0x8C180305, // 000F GETMET R6 R1 K5 + 0x58200007, // 0010 LDCONST R8 K7 + 0x7C180400, // 0011 CALL R6 2 + 0x781A002A, // 0012 JMPF R6 #003E + 0xB81A1000, // 0013 GETNGBL R6 K8 + 0x8C180D09, // 0014 GETMET R6 R6 K9 + 0x60200018, // 0015 GETGBL R8 G24 + 0x5824000A, // 0016 LDCONST R9 K10 + 0x58280006, // 0017 LDCONST R10 K6 + 0x7C200400, // 0018 CALL R8 2 + 0x5824000B, // 0019 LDCONST R9 K11 + 0x7C180600, // 001A CALL R6 3 + 0x8C180305, // 001B GETMET R6 R1 K5 + 0x58200006, // 001C LDCONST R8 K6 + 0x7C180400, // 001D CALL R6 2 + 0x781A0006, // 001E JMPF R6 #0026 + 0x8818010C, // 001F GETMBR R6 R0 K12 + 0x601C0009, // 0020 GETGBL R7 G9 + 0x8C20030E, // 0021 GETMET R8 R1 K14 + 0x58280006, // 0022 LDCONST R10 K6 + 0x7C200400, // 0023 CALL R8 2 + 0x7C1C0200, // 0024 CALL R7 1 + 0x901A1A07, // 0025 SETMBR R6 K13 R7 + 0x8C180305, // 0026 GETMET R6 R1 K5 + 0x58200007, // 0027 LDCONST R8 K7 + 0x7C180400, // 0028 CALL R6 2 + 0x781A0006, // 0029 JMPF R6 #0031 + 0x8818010C, // 002A GETMBR R6 R0 K12 + 0x601C0009, // 002B GETGBL R7 G9 + 0x8C20030E, // 002C GETMET R8 R1 K14 + 0x58280007, // 002D LDCONST R10 K7 + 0x7C200400, // 002E CALL R8 2 + 0x7C1C0200, // 002F CALL R7 1 + 0x901A1E07, // 0030 SETMBR R6 K15 R7 + 0x8818010C, // 0031 GETMBR R6 R0 K12 + 0x8C1C030E, // 0032 GETMET R7 R1 K14 + 0x58240011, // 0033 LDCONST R9 K17 + 0x7C1C0400, // 0034 CALL R7 2 + 0x1C1C0F12, // 0035 EQ R7 R7 K18 + 0x901A2007, // 0036 SETMBR R6 K16 R7 + 0x8818010C, // 0037 GETMBR R6 R0 K12 + 0x8C180D13, // 0038 GETMET R6 R6 K19 + 0x7C180200, // 0039 CALL R6 1 + 0x8C180314, // 003A GETMET R6 R1 K20 + 0x58200015, // 003B LDCONST R8 K21 + 0x7C180400, // 003C CALL R6 2 + 0x70020229, // 003D JMP #0268 + 0x8C180305, // 003E GETMET R6 R1 K5 + 0x58200016, // 003F LDCONST R8 K22 + 0x7C180400, // 0040 CALL R6 2 + 0x781A004D, // 0041 JMPF R6 #0090 + 0x8C180305, // 0042 GETMET R6 R1 K5 + 0x58200017, // 0043 LDCONST R8 K23 + 0x7C180400, // 0044 CALL R6 2 + 0x8C1C0305, // 0045 GETMET R7 R1 K5 + 0x58240018, // 0046 LDCONST R9 K24 + 0x7C1C0400, // 0047 CALL R7 2 + 0x8820010C, // 0048 GETMBR R8 R0 K12 + 0x8C24030E, // 0049 GETMET R9 R1 K14 + 0x582C001A, // 004A LDCONST R11 K26 + 0x7C240400, // 004B CALL R9 2 + 0x1C241312, // 004C EQ R9 R9 K18 + 0x90223209, // 004D SETMBR R8 K25 R9 + 0x8C20011B, // 004E GETMET R8 R0 K27 + 0x7C200200, // 004F CALL R8 1 + 0x20200C08, // 0050 NE R8 R6 R8 + 0x78220027, // 0051 JMPF R8 #007A + 0x781A0011, // 0052 JMPF R6 #0065 + 0xB8221000, // 0053 GETNGBL R8 K8 + 0x8C201109, // 0054 GETMET R8 R8 K9 + 0x60280018, // 0055 GETGBL R10 G24 + 0x582C000A, // 0056 LDCONST R11 K10 + 0x5830001C, // 0057 LDCONST R12 K28 + 0x7C280400, // 0058 CALL R10 2 + 0x582C000B, // 0059 LDCONST R11 K11 + 0x7C200600, // 005A CALL R8 3 + 0xB8221000, // 005B GETNGBL R8 K8 + 0x8C20111D, // 005C GETMET R8 R8 K29 + 0x60280008, // 005D GETGBL R10 G8 + 0xB82E3E00, // 005E GETNGBL R11 K31 + 0x882C1720, // 005F GETMBR R11 R11 K32 + 0x7C280200, // 0060 CALL R10 1 + 0x002A3C0A, // 0061 ADD R10 K30 R10 + 0x00281521, // 0062 ADD R10 R10 K33 + 0x7C200400, // 0063 CALL R8 2 + 0x70020010, // 0064 JMP #0076 + 0xB8221000, // 0065 GETNGBL R8 K8 + 0x8C201109, // 0066 GETMET R8 R8 K9 + 0x60280018, // 0067 GETGBL R10 G24 + 0x582C000A, // 0068 LDCONST R11 K10 + 0x58300022, // 0069 LDCONST R12 K34 + 0x7C280400, // 006A CALL R10 2 + 0x582C000B, // 006B LDCONST R11 K11 + 0x7C200600, // 006C CALL R8 3 0xB8221000, // 006D GETNGBL R8 K8 - 0x8C201109, // 006E GETMET R8 R8 K9 - 0x60280018, // 006F GETGBL R10 G24 - 0x582C0011, // 0070 LDCONST R11 K17 - 0x58300022, // 0071 LDCONST R12 K34 - 0x7C280400, // 0072 CALL R10 2 - 0x582C0012, // 0073 LDCONST R11 K18 - 0x7C200600, // 0074 CALL R8 3 - 0xB8221000, // 0075 GETNGBL R8 K8 - 0x8C201123, // 0076 GETMET R8 R8 K35 - 0x60280008, // 0077 GETGBL R10 G8 - 0xB82E4A00, // 0078 GETNGBL R11 K37 - 0x882C1726, // 0079 GETMBR R11 R11 K38 - 0x7C280200, // 007A CALL R10 1 - 0x002A480A, // 007B ADD R10 K36 R10 - 0x00281527, // 007C ADD R10 R10 K39 - 0x7C200400, // 007D CALL R8 2 - 0x70020010, // 007E JMP #0090 - 0xB8221000, // 007F GETNGBL R8 K8 - 0x8C201109, // 0080 GETMET R8 R8 K9 - 0x60280018, // 0081 GETGBL R10 G24 - 0x582C0011, // 0082 LDCONST R11 K17 - 0x58300028, // 0083 LDCONST R12 K40 - 0x7C280400, // 0084 CALL R10 2 - 0x582C0012, // 0085 LDCONST R11 K18 - 0x7C200600, // 0086 CALL R8 3 - 0xB8221000, // 0087 GETNGBL R8 K8 - 0x8C201123, // 0088 GETMET R8 R8 K35 - 0x60280008, // 0089 GETGBL R10 G8 - 0xB82E4A00, // 008A GETNGBL R11 K37 - 0x882C1726, // 008B GETMBR R11 R11 K38 - 0x7C280200, // 008C CALL R10 1 - 0x002A480A, // 008D ADD R10 K36 R10 - 0x00281529, // 008E ADD R10 R10 K41 - 0x7C200400, // 008F CALL R8 2 - 0x8C20031C, // 0090 GETMET R8 R1 K28 - 0x5828001D, // 0091 LDCONST R10 K29 - 0x7C200400, // 0092 CALL R8 2 - 0x70020014, // 0093 JMP #00A9 - 0x88200113, // 0094 GETMBR R8 R0 K19 - 0x8820112A, // 0095 GETMBR R8 R8 K42 - 0x4C240000, // 0096 LDNIL R9 - 0x20201009, // 0097 NE R8 R8 R9 - 0x20200E08, // 0098 NE R8 R7 R8 - 0x7822000B, // 0099 JMPF R8 #00A6 - 0x781E0003, // 009A JMPF R7 #009F - 0x88200113, // 009B GETMBR R8 R0 K19 - 0x8C20112B, // 009C GETMET R8 R8 K43 - 0x7C200200, // 009D CALL R8 1 - 0x70020002, // 009E JMP #00A2 - 0x88200113, // 009F GETMBR R8 R0 K19 - 0x8C20112C, // 00A0 GETMET R8 R8 K44 - 0x7C200200, // 00A1 CALL R8 1 - 0x8C20031C, // 00A2 GETMET R8 R1 K28 - 0x5828002D, // 00A3 LDCONST R10 K45 - 0x7C200400, // 00A4 CALL R8 2 - 0x70020002, // 00A5 JMP #00A9 - 0x8C20031C, // 00A6 GETMET R8 R1 K28 - 0x5828002D, // 00A7 LDCONST R10 K45 - 0x7C200400, // 00A8 CALL R8 2 - 0x700201D7, // 00A9 JMP #0282 - 0x8C18030E, // 00AA GETMET R6 R1 K14 - 0x5820002E, // 00AB LDCONST R8 K46 - 0x7C180400, // 00AC CALL R6 2 - 0x781A0026, // 00AD JMPF R6 #00D5 - 0xB81A1000, // 00AE GETNGBL R6 K8 - 0x8C180D09, // 00AF GETMET R6 R6 K9 - 0x60200018, // 00B0 GETGBL R8 G24 - 0x58240011, // 00B1 LDCONST R9 K17 - 0x5828002E, // 00B2 LDCONST R10 K46 - 0x7C200400, // 00B3 CALL R8 2 - 0x58240012, // 00B4 LDCONST R9 K18 - 0x7C180600, // 00B5 CALL R6 3 - 0x60180009, // 00B6 GETGBL R6 G9 - 0x8C1C030C, // 00B7 GETMET R7 R1 K12 - 0x5824002E, // 00B8 LDCONST R9 K46 - 0x7C1C0400, // 00B9 CALL R7 2 - 0x7C180200, // 00BA CALL R6 1 - 0x581C0005, // 00BB LDCONST R7 K5 - 0x88200113, // 00BC GETMBR R8 R0 K19 - 0x8820112F, // 00BD GETMBR R8 R8 K47 - 0x88201130, // 00BE GETMBR R8 R8 K48 - 0x6024000C, // 00BF GETGBL R9 G12 - 0x5C281000, // 00C0 MOVE R10 R8 - 0x7C240200, // 00C1 CALL R9 1 - 0x14240E09, // 00C2 LT R9 R7 R9 - 0x7826000C, // 00C3 JMPF R9 #00D1 - 0x94241007, // 00C4 GETIDX R9 R8 R7 - 0x8C241331, // 00C5 GETMET R9 R9 K49 - 0x7C240200, // 00C6 CALL R9 1 - 0x1C241206, // 00C7 EQ R9 R9 R6 - 0x78260005, // 00C8 JMPF R9 #00CF - 0x88240113, // 00C9 GETMBR R9 R0 K19 - 0x8C241332, // 00CA GETMET R9 R9 K50 - 0x942C1007, // 00CB GETIDX R11 R8 R7 - 0x7C240400, // 00CC CALL R9 2 - 0x70020002, // 00CD JMP #00D1 - 0x70020000, // 00CE JMP #00D0 - 0x001C0F07, // 00CF ADD R7 R7 K7 - 0x7001FFED, // 00D0 JMP #00BF - 0x8C24031C, // 00D1 GETMET R9 R1 K28 - 0x582C0033, // 00D2 LDCONST R11 K51 - 0x7C240400, // 00D3 CALL R9 2 - 0x700201AC, // 00D4 JMP #0282 - 0x8C18030E, // 00D5 GETMET R6 R1 K14 - 0x58200034, // 00D6 LDCONST R8 K52 - 0x7C180400, // 00D7 CALL R6 2 - 0x781A0011, // 00D8 JMPF R6 #00EB - 0xB81A1000, // 00D9 GETNGBL R6 K8 - 0x8C180D09, // 00DA GETMET R6 R6 K9 - 0x60200018, // 00DB GETGBL R8 G24 - 0x58240011, // 00DC LDCONST R9 K17 - 0x58280034, // 00DD LDCONST R10 K52 - 0x7C200400, // 00DE CALL R8 2 - 0x58240012, // 00DF LDCONST R9 K18 - 0x7C180600, // 00E0 CALL R6 3 - 0x88180113, // 00E1 GETMBR R6 R0 K19 - 0x501C0000, // 00E2 LDBOOL R7 0 0 - 0x901A6A07, // 00E3 SETMBR R6 K53 R7 - 0x88180113, // 00E4 GETMBR R6 R0 K19 - 0x8C180D1B, // 00E5 GETMET R6 R6 K27 - 0x7C180200, // 00E6 CALL R6 1 - 0x8C18031C, // 00E7 GETMET R6 R1 K28 - 0x5820001D, // 00E8 LDCONST R8 K29 - 0x7C180400, // 00E9 CALL R6 2 - 0x70020196, // 00EA JMP #0282 - 0x8C18030E, // 00EB GETMET R6 R1 K14 - 0x58200036, // 00EC LDCONST R8 K54 - 0x7C180400, // 00ED CALL R6 2 - 0x781A00D6, // 00EE JMPF R6 #01C6 - 0xB81A1000, // 00EF GETNGBL R6 K8 - 0x8C180D09, // 00F0 GETMET R6 R6 K9 - 0x60200018, // 00F1 GETGBL R8 G24 - 0x58240011, // 00F2 LDCONST R9 K17 - 0x58280036, // 00F3 LDCONST R10 K54 - 0x7C200400, // 00F4 CALL R8 2 - 0x58240012, // 00F5 LDCONST R9 K18 - 0x7C180600, // 00F6 CALL R6 3 - 0x50180000, // 00F7 LDBOOL R6 0 0 - 0x601C0010, // 00F8 GETGBL R7 G16 - 0x8C200306, // 00F9 GETMET R8 R1 K6 - 0x7C200200, // 00FA CALL R8 1 - 0x04201107, // 00FB SUB R8 R8 K7 - 0x40220A08, // 00FC CONNECT R8 K5 R8 - 0x7C1C0200, // 00FD CALL R7 1 - 0xA80200A0, // 00FE EXBLK 0 #01A0 - 0x5C200E00, // 00FF MOVE R8 R7 - 0x7C200000, // 0100 CALL R8 0 - 0x8C24030B, // 0101 GETMET R9 R1 K11 - 0x5C2C1000, // 0102 MOVE R11 R8 - 0x7C240400, // 0103 CALL R9 2 - 0x8C280537, // 0104 GETMET R10 R2 K55 - 0x5C301200, // 0105 MOVE R12 R9 - 0x5834000C, // 0106 LDCONST R13 K12 - 0x7C280600, // 0107 CALL R10 3 - 0x1C281505, // 0108 EQ R10 R10 K5 - 0x782A005B, // 0109 JMPF R10 #0166 - 0x60280009, // 010A GETGBL R10 G9 - 0x402E2538, // 010B CONNECT R11 K18 K56 - 0x942C120B, // 010C GETIDX R11 R9 R11 - 0x7C280200, // 010D CALL R10 1 - 0x8C2C030C, // 010E GETMET R11 R1 K12 - 0x5C341000, // 010F MOVE R13 R8 - 0x7C2C0400, // 0110 CALL R11 2 - 0x88300113, // 0111 GETMBR R12 R0 K19 - 0x88301939, // 0112 GETMBR R12 R12 K57 - 0x8C301937, // 0113 GETMET R12 R12 K55 - 0x60380008, // 0114 GETGBL R14 G8 - 0x5C3C1400, // 0115 MOVE R15 R10 - 0x7C380200, // 0116 CALL R14 1 - 0x7C300400, // 0117 CALL R12 2 - 0x4C340000, // 0118 LDNIL R13 - 0x2034180D, // 0119 NE R13 R12 R13 - 0x78360041, // 011A JMPF R13 #015D - 0x88340113, // 011B GETMBR R13 R0 K19 - 0x88341B3A, // 011C GETMBR R13 R13 K58 - 0x8C341B37, // 011D GETMET R13 R13 K55 - 0x8C3C1937, // 011E GETMET R15 R12 K55 - 0x5844003B, // 011F LDCONST R17 K59 - 0x5848003C, // 0120 LDCONST R18 K60 - 0x7C3C0600, // 0121 CALL R15 3 - 0x7C340400, // 0122 CALL R13 2 - 0x4C380000, // 0123 LDNIL R14 - 0x20381A0E, // 0124 NE R14 R13 R14 - 0x783A0035, // 0125 JMPF R14 #015C - 0xB83A1000, // 0126 GETNGBL R14 K8 - 0x8C381D09, // 0127 GETMET R14 R14 K9 - 0x60400018, // 0128 GETGBL R16 G24 - 0x5844003D, // 0129 LDCONST R17 K61 - 0x5C481400, // 012A MOVE R18 R10 - 0x5C4C1600, // 012B MOVE R19 R11 - 0x7C400600, // 012C CALL R16 3 - 0x58440012, // 012D LDCONST R17 K18 - 0x7C380600, // 012E CALL R14 3 - 0x8C381B3E, // 012F GETMET R14 R13 K62 - 0x5C401A00, // 0130 MOVE R16 R13 - 0x5C441800, // 0131 MOVE R17 R12 - 0x7C380600, // 0132 CALL R14 3 - 0x203C1C0B, // 0133 NE R15 R14 R11 - 0xB8421000, // 0134 GETNGBL R16 K8 - 0x8C402109, // 0135 GETMET R16 R16 K9 - 0x60480018, // 0136 GETGBL R18 G24 - 0x584C003F, // 0137 LDCONST R19 K63 - 0x5C501400, // 0138 MOVE R20 R10 - 0x5C541C00, // 0139 MOVE R21 R14 - 0x5C581600, // 013A MOVE R22 R11 - 0x205C1C0B, // 013B NE R23 R14 R11 - 0x785E0001, // 013C JMPF R23 #013F - 0x585C0040, // 013D LDCONST R23 K64 - 0x70020000, // 013E JMP #0140 - 0x585C003C, // 013F LDCONST R23 K60 - 0x7C480A00, // 0140 CALL R18 5 - 0x584C0012, // 0141 LDCONST R19 K18 - 0x7C400600, // 0142 CALL R16 3 - 0x783E0017, // 0143 JMPF R15 #015C - 0x50180200, // 0144 LDBOOL R6 1 0 - 0x8C401B41, // 0145 GETMET R16 R13 K65 - 0x5C481A00, // 0146 MOVE R18 R13 - 0x5C4C1800, // 0147 MOVE R19 R12 - 0x5C501600, // 0148 MOVE R20 R11 - 0x7C400800, // 0149 CALL R16 4 - 0x88400113, // 014A GETMBR R16 R0 K19 - 0x8C402142, // 014B GETMET R16 R16 K66 - 0x5C481400, // 014C MOVE R18 R10 - 0x7C400400, // 014D CALL R16 2 - 0x7842000C, // 014E JMPF R16 #015C - 0xB8461000, // 014F GETNGBL R17 K8 - 0x8C442309, // 0150 GETMET R17 R17 K9 - 0x604C0018, // 0151 GETGBL R19 G24 - 0x58500043, // 0152 LDCONST R20 K67 - 0x5C541800, // 0153 MOVE R21 R12 - 0x5C581400, // 0154 MOVE R22 R10 - 0x5C5C2000, // 0155 MOVE R23 R16 - 0x7C4C0800, // 0156 CALL R19 4 - 0x58500012, // 0157 LDCONST R20 K18 - 0x7C440600, // 0158 CALL R17 3 - 0x8C442144, // 0159 GETMET R17 R16 K68 - 0x5C4C1800, // 015A MOVE R19 R12 - 0x7C440400, // 015B CALL R17 2 - 0x70020007, // 015C JMP #0165 - 0xB8361000, // 015D GETNGBL R13 K8 - 0x8C341B09, // 015E GETMET R13 R13 K9 - 0x603C0018, // 015F GETGBL R15 G24 - 0x58400045, // 0160 LDCONST R16 K69 - 0x5C441400, // 0161 MOVE R17 R10 - 0x7C3C0400, // 0162 CALL R15 2 - 0x58400012, // 0163 LDCONST R16 K18 - 0x7C340600, // 0164 CALL R13 3 - 0x70020038, // 0165 JMP #019F - 0x8C280537, // 0166 GETMET R10 R2 K55 - 0x5C301200, // 0167 MOVE R12 R9 - 0x58340046, // 0168 LDCONST R13 K70 - 0x7C280600, // 0169 CALL R10 3 - 0x1C281505, // 016A EQ R10 R10 K5 - 0x782A0032, // 016B JMPF R10 #019F - 0x60280009, // 016C GETGBL R10 G9 - 0x402E2538, // 016D CONNECT R11 K18 K56 - 0x942C120B, // 016E GETIDX R11 R9 R11 - 0x7C280200, // 016F CALL R10 1 - 0x8C2C030C, // 0170 GETMET R11 R1 K12 - 0x5C341000, // 0171 MOVE R13 R8 - 0x7C2C0400, // 0172 CALL R11 2 - 0x88300113, // 0173 GETMBR R12 R0 K19 - 0x88301939, // 0174 GETMBR R12 R12 K57 - 0x8C301937, // 0175 GETMET R12 R12 K55 - 0x60380008, // 0176 GETGBL R14 G8 - 0x5C3C1400, // 0177 MOVE R15 R10 - 0x7C380200, // 0178 CALL R14 1 - 0x7C300400, // 0179 CALL R12 2 - 0x4C340000, // 017A LDNIL R13 - 0x2034180D, // 017B NE R13 R12 R13 - 0x78360021, // 017C JMPF R13 #019F - 0x8C341937, // 017D GETMET R13 R12 K55 - 0x583C0047, // 017E LDCONST R15 K71 - 0x5840003C, // 017F LDCONST R16 K60 - 0x7C340600, // 0180 CALL R13 3 - 0x20381A0B, // 0181 NE R14 R13 R11 - 0x783A001B, // 0182 JMPF R14 #019F - 0x50180200, // 0183 LDBOOL R6 1 0 - 0x883C0113, // 0184 GETMBR R15 R0 K19 - 0x8C3C1F42, // 0185 GETMET R15 R15 K66 - 0x5C441400, // 0186 MOVE R17 R10 - 0x7C3C0400, // 0187 CALL R15 2 - 0x783E0015, // 0188 JMPF R15 #019F - 0x8C401F48, // 0189 GETMET R16 R15 K72 - 0x5C481600, // 018A MOVE R18 R11 - 0x7C400400, // 018B CALL R16 2 - 0x782E0001, // 018C JMPF R11 #018F - 0x98328E0B, // 018D SETIDX R12 K71 R11 - 0x70020002, // 018E JMP #0192 - 0x8C401949, // 018F GETMET R16 R12 K73 - 0x58480047, // 0190 LDCONST R18 K71 - 0x7C400400, // 0191 CALL R16 2 - 0xB8421000, // 0192 GETNGBL R16 K8 - 0x8C402109, // 0193 GETMET R16 R16 K9 - 0x60480018, // 0194 GETGBL R18 G24 - 0x584C004A, // 0195 LDCONST R19 K74 - 0x5C501800, // 0196 MOVE R20 R12 - 0x5C541400, // 0197 MOVE R21 R10 - 0x5C581E00, // 0198 MOVE R22 R15 - 0x7C480800, // 0199 CALL R18 4 - 0x584C0012, // 019A LDCONST R19 K18 - 0x7C400600, // 019B CALL R16 3 - 0x8C401F44, // 019C GETMET R16 R15 K68 - 0x5C481800, // 019D MOVE R18 R12 - 0x7C400400, // 019E CALL R16 2 - 0x7001FF5E, // 019F JMP #00FF - 0x581C000D, // 01A0 LDCONST R7 K13 - 0xAC1C0200, // 01A1 CATCH R7 1 0 - 0xB0080000, // 01A2 RAISE 2 R0 R0 - 0xB81E1000, // 01A3 GETNGBL R7 K8 - 0x8C1C0F09, // 01A4 GETMET R7 R7 K9 - 0x60240018, // 01A5 GETGBL R9 G24 - 0x5828004B, // 01A6 LDCONST R10 K75 - 0x602C0008, // 01A7 GETGBL R11 G8 - 0x88300113, // 01A8 GETMBR R12 R0 K19 - 0x88301939, // 01A9 GETMBR R12 R12 K57 - 0x7C2C0200, // 01AA CALL R11 1 - 0x7C240400, // 01AB CALL R9 2 - 0x58280012, // 01AC LDCONST R10 K18 - 0x7C1C0600, // 01AD CALL R7 3 - 0x78160008, // 01AE JMPF R5 #01B8 - 0xB81E1000, // 01AF GETNGBL R7 K8 - 0x8C1C0F09, // 01B0 GETMET R7 R7 K9 - 0x60240018, // 01B1 GETGBL R9 G24 - 0x5828004C, // 01B2 LDCONST R10 K76 - 0x5C2C0A00, // 01B3 MOVE R11 R5 - 0x7C240400, // 01B4 CALL R9 2 - 0x58280012, // 01B5 LDCONST R10 K18 - 0x7C1C0600, // 01B6 CALL R7 3 - 0x7002000C, // 01B7 JMP #01C5 - 0x741A0002, // 01B8 JMPT R6 #01BC - 0x881C0113, // 01B9 GETMBR R7 R0 K19 - 0x881C0F35, // 01BA GETMBR R7 R7 K53 - 0x741E0005, // 01BB JMPT R7 #01C2 - 0x881C0113, // 01BC GETMBR R7 R0 K19 - 0x50200200, // 01BD LDBOOL R8 1 0 - 0x901E6A08, // 01BE SETMBR R7 K53 R8 - 0x881C0113, // 01BF GETMBR R7 R0 K19 - 0x8C1C0F1B, // 01C0 GETMET R7 R7 K27 - 0x7C1C0200, // 01C1 CALL R7 1 - 0x8C1C031C, // 01C2 GETMET R7 R1 K28 - 0x58240033, // 01C3 LDCONST R9 K51 - 0x7C1C0400, // 01C4 CALL R7 2 - 0x700200BB, // 01C5 JMP #0282 - 0x8C18030E, // 01C6 GETMET R6 R1 K14 - 0x5820004D, // 01C7 LDCONST R8 K77 - 0x7C180400, // 01C8 CALL R6 2 - 0x781A002B, // 01C9 JMPF R6 #01F6 - 0x8C18030C, // 01CA GETMET R6 R1 K12 - 0x5820004E, // 01CB LDCONST R8 K78 - 0x7C180400, // 01CC CALL R6 2 - 0x8C1C030C, // 01CD GETMET R7 R1 K12 - 0x5824000C, // 01CE LDCONST R9 K12 - 0x7C1C0400, // 01CF CALL R7 2 - 0x8C20030C, // 01D0 GETMET R8 R1 K12 - 0x58280046, // 01D1 LDCONST R10 K70 - 0x7C200400, // 01D2 CALL R8 2 - 0xB8261000, // 01D3 GETNGBL R9 K8 - 0x8C241309, // 01D4 GETMET R9 R9 K9 - 0x602C0018, // 01D5 GETGBL R11 G24 - 0x5830004F, // 01D6 LDCONST R12 K79 - 0x5C340C00, // 01D7 MOVE R13 R6 - 0x5C380E00, // 01D8 MOVE R14 R7 - 0x7C2C0600, // 01D9 CALL R11 3 - 0x58300012, // 01DA LDCONST R12 K18 - 0x7C240600, // 01DB CALL R9 3 - 0x88240113, // 01DC GETMBR R9 R0 K19 - 0x8824133A, // 01DD GETMBR R9 R9 K58 - 0x8C241337, // 01DE GETMET R9 R9 K55 - 0x5C2C0C00, // 01DF MOVE R11 R6 - 0x7C240400, // 01E0 CALL R9 2 - 0x4C280000, // 01E1 LDNIL R10 - 0x2028120A, // 01E2 NE R10 R9 R10 - 0x782A000D, // 01E3 JMPF R10 #01F2 - 0x60280013, // 01E4 GETGBL R10 G19 - 0x7C280000, // 01E5 CALL R10 0 - 0x78220000, // 01E6 JMPF R8 #01E8 - 0x982A8E08, // 01E7 SETIDX R10 K71 R8 - 0x8C2C1341, // 01E8 GETMET R11 R9 K65 - 0x5C341200, // 01E9 MOVE R13 R9 - 0x5C381400, // 01EA MOVE R14 R10 - 0x5C3C0E00, // 01EB MOVE R15 R7 - 0x7C2C0800, // 01EC CALL R11 4 - 0x882C0113, // 01ED GETMBR R11 R0 K19 - 0x8C2C1750, // 01EE GETMET R11 R11 K80 - 0x5C340C00, // 01EF MOVE R13 R6 - 0x5C381400, // 01F0 MOVE R14 R10 - 0x7C2C0600, // 01F1 CALL R11 3 - 0x8C28031C, // 01F2 GETMET R10 R1 K28 - 0x58300033, // 01F3 LDCONST R12 K51 - 0x7C280400, // 01F4 CALL R10 2 - 0x7002008B, // 01F5 JMP #0282 - 0x8C18030E, // 01F6 GETMET R6 R1 K14 - 0x58200051, // 01F7 LDCONST R8 K81 - 0x7C180400, // 01F8 CALL R6 2 - 0x781A005E, // 01F9 JMPF R6 #0259 - 0x8C18030C, // 01FA GETMET R6 R1 K12 - 0x58200052, // 01FB LDCONST R8 K82 - 0x7C180400, // 01FC CALL R6 2 - 0x4C1C0000, // 01FD LDNIL R7 - 0x1C1C0C07, // 01FE EQ R7 R6 R7 - 0x741E0001, // 01FF JMPT R7 #0202 - 0x1C1C0D3C, // 0200 EQ R7 R6 K60 - 0x781E0000, // 0201 JMPF R7 #0203 - 0xB006A754, // 0202 RAISE 1 K83 K84 - 0x581C0005, // 0203 LDCONST R7 K5 - 0x60200008, // 0204 GETGBL R8 G8 - 0x5C240E00, // 0205 MOVE R9 R7 - 0x7C200200, // 0206 CALL R8 1 - 0x8C24030E, // 0207 GETMET R9 R1 K14 - 0x002E9C08, // 0208 ADD R11 K78 R8 - 0x7C240400, // 0209 CALL R9 2 - 0x78260049, // 020A JMPF R9 #0255 - 0x8C24030C, // 020B GETMET R9 R1 K12 - 0x002E9C08, // 020C ADD R11 K78 R8 - 0x7C240400, // 020D CALL R9 2 - 0x8C28030C, // 020E GETMET R10 R1 K12 - 0x00321808, // 020F ADD R12 K12 R8 - 0x7C280400, // 0210 CALL R10 2 - 0x8C2C030C, // 0211 GETMET R11 R1 K12 - 0x00368C08, // 0212 ADD R13 K70 R8 - 0x7C2C0400, // 0213 CALL R11 2 - 0x2030133C, // 0214 NE R12 R9 K60 - 0x78320038, // 0215 JMPF R12 #024F - 0x88300113, // 0216 GETMBR R12 R0 K19 - 0x8830193A, // 0217 GETMBR R12 R12 K58 - 0x8C301937, // 0218 GETMET R12 R12 K55 - 0x5C381200, // 0219 MOVE R14 R9 - 0x7C300400, // 021A CALL R12 2 - 0x4C340000, // 021B LDNIL R13 - 0x2034180D, // 021C NE R13 R12 R13 - 0x78360030, // 021D JMPF R13 #024F - 0x60340013, // 021E GETGBL R13 G19 - 0x7C340000, // 021F CALL R13 0 - 0x9836A406, // 0220 SETIDX R13 K82 R6 - 0x98367609, // 0221 SETIDX R13 K59 R9 - 0x782E0000, // 0222 JMPF R11 #0224 - 0x98368E0B, // 0223 SETIDX R13 K71 R11 - 0x8C381941, // 0224 GETMET R14 R12 K65 - 0x5C401800, // 0225 MOVE R16 R12 - 0x5C441A00, // 0226 MOVE R17 R13 - 0x5C481400, // 0227 MOVE R18 R10 - 0x7C380800, // 0228 CALL R14 4 - 0x50380000, // 0229 LDBOOL R14 0 0 - 0x603C0010, // 022A GETGBL R15 G16 - 0x88400113, // 022B GETMBR R16 R0 K19 - 0x88402139, // 022C GETMBR R16 R16 K57 - 0x7C3C0200, // 022D CALL R15 1 - 0xA802000B, // 022E EXBLK 0 #023B - 0x5C401E00, // 022F MOVE R16 R15 - 0x7C400000, // 0230 CALL R16 0 - 0x8C440155, // 0231 GETMET R17 R0 K85 - 0x5C4C2000, // 0232 MOVE R19 R16 - 0x5C501A00, // 0233 MOVE R20 R13 - 0x7C440600, // 0234 CALL R17 3 - 0x78460001, // 0235 JMPF R17 #0238 - 0x50380200, // 0236 LDBOOL R14 1 0 - 0x70020000, // 0237 JMP #0239 - 0x7001FFF5, // 0238 JMP #022F - 0xA8040001, // 0239 EXBLK 1 1 - 0x70020002, // 023A JMP #023E - 0x583C000D, // 023B LDCONST R15 K13 - 0xAC3C0200, // 023C CATCH R15 1 0 - 0xB0080000, // 023D RAISE 2 R0 R0 - 0x5C3C1C00, // 023E MOVE R15 R14 - 0x743E000E, // 023F JMPT R15 #024F - 0xB83E1000, // 0240 GETNGBL R15 K8 - 0x8C3C1F09, // 0241 GETMET R15 R15 K9 - 0x60440018, // 0242 GETGBL R17 G24 - 0x58480056, // 0243 LDCONST R18 K86 - 0x5C4C0C00, // 0244 MOVE R19 R6 - 0x5C501200, // 0245 MOVE R20 R9 - 0x5C541400, // 0246 MOVE R21 R10 - 0x7C440800, // 0247 CALL R17 4 - 0x58480012, // 0248 LDCONST R18 K18 - 0x7C3C0600, // 0249 CALL R15 3 - 0x883C0113, // 024A GETMBR R15 R0 K19 - 0x8C3C1F50, // 024B GETMET R15 R15 K80 - 0x5C441200, // 024C MOVE R17 R9 - 0x5C481A00, // 024D MOVE R18 R13 - 0x7C3C0600, // 024E CALL R15 3 - 0x001C0F07, // 024F ADD R7 R7 K7 - 0x60300008, // 0250 GETGBL R12 G8 - 0x5C340E00, // 0251 MOVE R13 R7 - 0x7C300200, // 0252 CALL R12 1 - 0x5C201800, // 0253 MOVE R8 R12 - 0x7001FFB1, // 0254 JMP #0207 - 0x8C24031C, // 0255 GETMET R9 R1 K28 - 0x582C0033, // 0256 LDCONST R11 K51 - 0x7C240400, // 0257 CALL R9 2 - 0x70020028, // 0258 JMP #0282 - 0x4C180000, // 0259 LDNIL R6 - 0x601C0010, // 025A GETGBL R7 G16 - 0x8C200306, // 025B GETMET R8 R1 K6 - 0x7C200200, // 025C CALL R8 1 - 0x04201107, // 025D SUB R8 R8 K7 - 0x40220A08, // 025E CONNECT R8 K5 R8 - 0x7C1C0200, // 025F CALL R7 1 - 0xA8020013, // 0260 EXBLK 0 #0275 - 0x5C200E00, // 0261 MOVE R8 R7 - 0x7C200000, // 0262 CALL R8 0 - 0x8C24030B, // 0263 GETMET R9 R1 K11 - 0x5C2C1000, // 0264 MOVE R11 R8 - 0x7C240400, // 0265 CALL R9 2 - 0x8C280537, // 0266 GETMET R10 R2 K55 - 0x5C301200, // 0267 MOVE R12 R9 - 0x58340057, // 0268 LDCONST R13 K87 - 0x7C280600, // 0269 CALL R10 3 - 0x1C281505, // 026A EQ R10 R10 K5 - 0x782A0005, // 026B JMPF R10 #0272 - 0x60280009, // 026C GETGBL R10 G9 - 0x402E2538, // 026D CONNECT R11 K18 K56 - 0x942C120B, // 026E GETIDX R11 R9 R11 - 0x7C280200, // 026F CALL R10 1 - 0x5C181400, // 0270 MOVE R6 R10 - 0x70020000, // 0271 JMP #0273 - 0x7001FFED, // 0272 JMP #0261 - 0xA8040001, // 0273 EXBLK 1 1 - 0x70020002, // 0274 JMP #0278 - 0x581C000D, // 0275 LDCONST R7 K13 - 0xAC1C0200, // 0276 CATCH R7 1 0 - 0xB0080000, // 0277 RAISE 2 R0 R0 - 0x4C1C0000, // 0278 LDNIL R7 - 0x201C0C07, // 0279 NE R7 R6 R7 - 0x781E0006, // 027A JMPF R7 #0282 - 0x881C0113, // 027B GETMBR R7 R0 K19 - 0x8C1C0F58, // 027C GETMET R7 R7 K88 - 0x5C240C00, // 027D MOVE R9 R6 - 0x7C1C0400, // 027E CALL R7 2 - 0x8C1C031C, // 027F GETMET R7 R1 K28 - 0x58240033, // 0280 LDCONST R9 K51 - 0x7C1C0400, // 0281 CALL R7 2 - 0x78160011, // 0282 JMPF R5 #0295 - 0x8C180359, // 0283 GETMET R6 R1 K89 - 0x5820005A, // 0284 LDCONST R8 K90 - 0x7C180400, // 0285 CALL R6 2 - 0x8C18035B, // 0286 GETMET R6 R1 K91 - 0x7C180200, // 0287 CALL R6 1 - 0x8C18035C, // 0288 GETMET R6 R1 K92 - 0x60200018, // 0289 GETGBL R8 G24 - 0x5824005D, // 028A LDCONST R9 K93 - 0x8C28035E, // 028B GETMET R10 R1 K94 - 0x5C300A00, // 028C MOVE R12 R5 - 0x7C280400, // 028D CALL R10 2 - 0x7C200400, // 028E CALL R8 2 - 0x7C180400, // 028F CALL R6 2 - 0x8C18035F, // 0290 GETMET R6 R1 K95 - 0x88200360, // 0291 GETMBR R8 R1 K96 - 0x7C180400, // 0292 CALL R6 2 - 0x8C180361, // 0293 GETMET R6 R1 K97 - 0x7C180200, // 0294 CALL R6 1 - 0xA8040001, // 0295 EXBLK 1 1 - 0x7002001D, // 0296 JMP #02B5 - 0xAC180002, // 0297 CATCH R6 0 2 - 0x7002001A, // 0298 JMP #02B4 - 0xB8221000, // 0299 GETNGBL R8 K8 - 0x8C201109, // 029A GETMET R8 R8 K9 - 0x60280018, // 029B GETGBL R10 G24 - 0x582C0062, // 029C LDCONST R11 K98 - 0x5C300C00, // 029D MOVE R12 R6 - 0x5C340E00, // 029E MOVE R13 R7 - 0x7C280600, // 029F CALL R10 3 - 0x582C0063, // 02A0 LDCONST R11 K99 - 0x7C200600, // 02A1 CALL R8 3 - 0x8C200359, // 02A2 GETMET R8 R1 K89 - 0x5828005A, // 02A3 LDCONST R10 K90 - 0x7C200400, // 02A4 CALL R8 2 - 0x8C20035B, // 02A5 GETMET R8 R1 K91 - 0x7C200200, // 02A6 CALL R8 1 - 0x8C20035C, // 02A7 GETMET R8 R1 K92 - 0x60280018, // 02A8 GETGBL R10 G24 - 0x582C0064, // 02A9 LDCONST R11 K100 - 0x5C300C00, // 02AA MOVE R12 R6 - 0x5C340E00, // 02AB MOVE R13 R7 - 0x7C280600, // 02AC CALL R10 3 - 0x7C200400, // 02AD CALL R8 2 - 0x8C20035F, // 02AE GETMET R8 R1 K95 - 0x88280360, // 02AF GETMBR R10 R1 K96 - 0x7C200400, // 02B0 CALL R8 2 - 0x8C200361, // 02B1 GETMET R8 R1 K97 - 0x7C200200, // 02B2 CALL R8 1 - 0x70020000, // 02B3 JMP #02B5 - 0xB0080000, // 02B4 RAISE 2 R0 R0 - 0x80000000, // 02B5 RET 0 + 0x8C20111D, // 006E GETMET R8 R8 K29 + 0x60280008, // 006F GETGBL R10 G8 + 0xB82E3E00, // 0070 GETNGBL R11 K31 + 0x882C1720, // 0071 GETMBR R11 R11 K32 + 0x7C280200, // 0072 CALL R10 1 + 0x002A3C0A, // 0073 ADD R10 K30 R10 + 0x00281523, // 0074 ADD R10 R10 K35 + 0x7C200400, // 0075 CALL R8 2 + 0x8C200314, // 0076 GETMET R8 R1 K20 + 0x58280015, // 0077 LDCONST R10 K21 + 0x7C200400, // 0078 CALL R8 2 + 0x70020014, // 0079 JMP #008F + 0x8820010C, // 007A GETMBR R8 R0 K12 + 0x88201124, // 007B GETMBR R8 R8 K36 + 0x4C240000, // 007C LDNIL R9 + 0x20201009, // 007D NE R8 R8 R9 + 0x20200E08, // 007E NE R8 R7 R8 + 0x7822000B, // 007F JMPF R8 #008C + 0x781E0003, // 0080 JMPF R7 #0085 + 0x8820010C, // 0081 GETMBR R8 R0 K12 + 0x8C201125, // 0082 GETMET R8 R8 K37 + 0x7C200200, // 0083 CALL R8 1 + 0x70020002, // 0084 JMP #0088 + 0x8820010C, // 0085 GETMBR R8 R0 K12 + 0x8C201126, // 0086 GETMET R8 R8 K38 + 0x7C200200, // 0087 CALL R8 1 + 0x8C200314, // 0088 GETMET R8 R1 K20 + 0x58280027, // 0089 LDCONST R10 K39 + 0x7C200400, // 008A CALL R8 2 + 0x70020002, // 008B JMP #008F + 0x8C200314, // 008C GETMET R8 R1 K20 + 0x58280027, // 008D LDCONST R10 K39 + 0x7C200400, // 008E CALL R8 2 + 0x700201D7, // 008F JMP #0268 + 0x8C180305, // 0090 GETMET R6 R1 K5 + 0x58200028, // 0091 LDCONST R8 K40 + 0x7C180400, // 0092 CALL R6 2 + 0x781A0026, // 0093 JMPF R6 #00BB + 0xB81A1000, // 0094 GETNGBL R6 K8 + 0x8C180D09, // 0095 GETMET R6 R6 K9 + 0x60200018, // 0096 GETGBL R8 G24 + 0x5824000A, // 0097 LDCONST R9 K10 + 0x58280028, // 0098 LDCONST R10 K40 + 0x7C200400, // 0099 CALL R8 2 + 0x5824000B, // 009A LDCONST R9 K11 + 0x7C180600, // 009B CALL R6 3 + 0x60180009, // 009C GETGBL R6 G9 + 0x8C1C030E, // 009D GETMET R7 R1 K14 + 0x58240028, // 009E LDCONST R9 K40 + 0x7C1C0400, // 009F CALL R7 2 + 0x7C180200, // 00A0 CALL R6 1 + 0x581C0029, // 00A1 LDCONST R7 K41 + 0x8820010C, // 00A2 GETMBR R8 R0 K12 + 0x8820112A, // 00A3 GETMBR R8 R8 K42 + 0x8820112B, // 00A4 GETMBR R8 R8 K43 + 0x6024000C, // 00A5 GETGBL R9 G12 + 0x5C281000, // 00A6 MOVE R10 R8 + 0x7C240200, // 00A7 CALL R9 1 + 0x14240E09, // 00A8 LT R9 R7 R9 + 0x7826000C, // 00A9 JMPF R9 #00B7 + 0x94241007, // 00AA GETIDX R9 R8 R7 + 0x8C24132C, // 00AB GETMET R9 R9 K44 + 0x7C240200, // 00AC CALL R9 1 + 0x1C241206, // 00AD EQ R9 R9 R6 + 0x78260005, // 00AE JMPF R9 #00B5 + 0x8824010C, // 00AF GETMBR R9 R0 K12 + 0x8C24132D, // 00B0 GETMET R9 R9 K45 + 0x942C1007, // 00B1 GETIDX R11 R8 R7 + 0x7C240400, // 00B2 CALL R9 2 + 0x70020002, // 00B3 JMP #00B7 + 0x70020000, // 00B4 JMP #00B6 + 0x001C0F2E, // 00B5 ADD R7 R7 K46 + 0x7001FFED, // 00B6 JMP #00A5 + 0x8C240314, // 00B7 GETMET R9 R1 K20 + 0x582C002F, // 00B8 LDCONST R11 K47 + 0x7C240400, // 00B9 CALL R9 2 + 0x700201AC, // 00BA JMP #0268 + 0x8C180305, // 00BB GETMET R6 R1 K5 + 0x58200030, // 00BC LDCONST R8 K48 + 0x7C180400, // 00BD CALL R6 2 + 0x781A0011, // 00BE JMPF R6 #00D1 + 0xB81A1000, // 00BF GETNGBL R6 K8 + 0x8C180D09, // 00C0 GETMET R6 R6 K9 + 0x60200018, // 00C1 GETGBL R8 G24 + 0x5824000A, // 00C2 LDCONST R9 K10 + 0x58280030, // 00C3 LDCONST R10 K48 + 0x7C200400, // 00C4 CALL R8 2 + 0x5824000B, // 00C5 LDCONST R9 K11 + 0x7C180600, // 00C6 CALL R6 3 + 0x8818010C, // 00C7 GETMBR R6 R0 K12 + 0x501C0000, // 00C8 LDBOOL R7 0 0 + 0x901A6207, // 00C9 SETMBR R6 K49 R7 + 0x8818010C, // 00CA GETMBR R6 R0 K12 + 0x8C180D13, // 00CB GETMET R6 R6 K19 + 0x7C180200, // 00CC CALL R6 1 + 0x8C180314, // 00CD GETMET R6 R1 K20 + 0x58200015, // 00CE LDCONST R8 K21 + 0x7C180400, // 00CF CALL R6 2 + 0x70020196, // 00D0 JMP #0268 + 0x8C180305, // 00D1 GETMET R6 R1 K5 + 0x58200032, // 00D2 LDCONST R8 K50 + 0x7C180400, // 00D3 CALL R6 2 + 0x781A00D6, // 00D4 JMPF R6 #01AC + 0xB81A1000, // 00D5 GETNGBL R6 K8 + 0x8C180D09, // 00D6 GETMET R6 R6 K9 + 0x60200018, // 00D7 GETGBL R8 G24 + 0x5824000A, // 00D8 LDCONST R9 K10 + 0x58280032, // 00D9 LDCONST R10 K50 + 0x7C200400, // 00DA CALL R8 2 + 0x5824000B, // 00DB LDCONST R9 K11 + 0x7C180600, // 00DC CALL R6 3 + 0x50180000, // 00DD LDBOOL R6 0 0 + 0x601C0010, // 00DE GETGBL R7 G16 + 0x8C200333, // 00DF GETMET R8 R1 K51 + 0x7C200200, // 00E0 CALL R8 1 + 0x0420112E, // 00E1 SUB R8 R8 K46 + 0x40225208, // 00E2 CONNECT R8 K41 R8 + 0x7C1C0200, // 00E3 CALL R7 1 + 0xA80200A0, // 00E4 EXBLK 0 #0186 + 0x5C200E00, // 00E5 MOVE R8 R7 + 0x7C200000, // 00E6 CALL R8 0 + 0x8C240334, // 00E7 GETMET R9 R1 K52 + 0x5C2C1000, // 00E8 MOVE R11 R8 + 0x7C240400, // 00E9 CALL R9 2 + 0x8C280535, // 00EA GETMET R10 R2 K53 + 0x5C301200, // 00EB MOVE R12 R9 + 0x5834000E, // 00EC LDCONST R13 K14 + 0x7C280600, // 00ED CALL R10 3 + 0x1C281529, // 00EE EQ R10 R10 K41 + 0x782A005B, // 00EF JMPF R10 #014C + 0x60280009, // 00F0 GETGBL R10 G9 + 0x402E1736, // 00F1 CONNECT R11 K11 K54 + 0x942C120B, // 00F2 GETIDX R11 R9 R11 + 0x7C280200, // 00F3 CALL R10 1 + 0x8C2C030E, // 00F4 GETMET R11 R1 K14 + 0x5C341000, // 00F5 MOVE R13 R8 + 0x7C2C0400, // 00F6 CALL R11 2 + 0x8830010C, // 00F7 GETMBR R12 R0 K12 + 0x88301937, // 00F8 GETMBR R12 R12 K55 + 0x8C301935, // 00F9 GETMET R12 R12 K53 + 0x60380008, // 00FA GETGBL R14 G8 + 0x5C3C1400, // 00FB MOVE R15 R10 + 0x7C380200, // 00FC CALL R14 1 + 0x7C300400, // 00FD CALL R12 2 + 0x4C340000, // 00FE LDNIL R13 + 0x2034180D, // 00FF NE R13 R12 R13 + 0x78360041, // 0100 JMPF R13 #0143 + 0x8834010C, // 0101 GETMBR R13 R0 K12 + 0x88341B38, // 0102 GETMBR R13 R13 K56 + 0x8C341B35, // 0103 GETMET R13 R13 K53 + 0x8C3C1935, // 0104 GETMET R15 R12 K53 + 0x58440039, // 0105 LDCONST R17 K57 + 0x5848003A, // 0106 LDCONST R18 K58 + 0x7C3C0600, // 0107 CALL R15 3 + 0x7C340400, // 0108 CALL R13 2 + 0x4C380000, // 0109 LDNIL R14 + 0x20381A0E, // 010A NE R14 R13 R14 + 0x783A0035, // 010B JMPF R14 #0142 + 0xB83A1000, // 010C GETNGBL R14 K8 + 0x8C381D09, // 010D GETMET R14 R14 K9 + 0x60400018, // 010E GETGBL R16 G24 + 0x5844003B, // 010F LDCONST R17 K59 + 0x5C481400, // 0110 MOVE R18 R10 + 0x5C4C1600, // 0111 MOVE R19 R11 + 0x7C400600, // 0112 CALL R16 3 + 0x5844000B, // 0113 LDCONST R17 K11 + 0x7C380600, // 0114 CALL R14 3 + 0x8C381B3C, // 0115 GETMET R14 R13 K60 + 0x5C401A00, // 0116 MOVE R16 R13 + 0x5C441800, // 0117 MOVE R17 R12 + 0x7C380600, // 0118 CALL R14 3 + 0x203C1C0B, // 0119 NE R15 R14 R11 + 0xB8421000, // 011A GETNGBL R16 K8 + 0x8C402109, // 011B GETMET R16 R16 K9 + 0x60480018, // 011C GETGBL R18 G24 + 0x584C003D, // 011D LDCONST R19 K61 + 0x5C501400, // 011E MOVE R20 R10 + 0x5C541C00, // 011F MOVE R21 R14 + 0x5C581600, // 0120 MOVE R22 R11 + 0x205C1C0B, // 0121 NE R23 R14 R11 + 0x785E0001, // 0122 JMPF R23 #0125 + 0x585C003E, // 0123 LDCONST R23 K62 + 0x70020000, // 0124 JMP #0126 + 0x585C003A, // 0125 LDCONST R23 K58 + 0x7C480A00, // 0126 CALL R18 5 + 0x584C000B, // 0127 LDCONST R19 K11 + 0x7C400600, // 0128 CALL R16 3 + 0x783E0017, // 0129 JMPF R15 #0142 + 0x50180200, // 012A LDBOOL R6 1 0 + 0x8C401B3F, // 012B GETMET R16 R13 K63 + 0x5C481A00, // 012C MOVE R18 R13 + 0x5C4C1800, // 012D MOVE R19 R12 + 0x5C501600, // 012E MOVE R20 R11 + 0x7C400800, // 012F CALL R16 4 + 0x8840010C, // 0130 GETMBR R16 R0 K12 + 0x8C402140, // 0131 GETMET R16 R16 K64 + 0x5C481400, // 0132 MOVE R18 R10 + 0x7C400400, // 0133 CALL R16 2 + 0x7842000C, // 0134 JMPF R16 #0142 + 0xB8461000, // 0135 GETNGBL R17 K8 + 0x8C442309, // 0136 GETMET R17 R17 K9 + 0x604C0018, // 0137 GETGBL R19 G24 + 0x58500041, // 0138 LDCONST R20 K65 + 0x5C541800, // 0139 MOVE R21 R12 + 0x5C581400, // 013A MOVE R22 R10 + 0x5C5C2000, // 013B MOVE R23 R16 + 0x7C4C0800, // 013C CALL R19 4 + 0x5850000B, // 013D LDCONST R20 K11 + 0x7C440600, // 013E CALL R17 3 + 0x8C442142, // 013F GETMET R17 R16 K66 + 0x5C4C1800, // 0140 MOVE R19 R12 + 0x7C440400, // 0141 CALL R17 2 + 0x70020007, // 0142 JMP #014B + 0xB8361000, // 0143 GETNGBL R13 K8 + 0x8C341B09, // 0144 GETMET R13 R13 K9 + 0x603C0018, // 0145 GETGBL R15 G24 + 0x58400043, // 0146 LDCONST R16 K67 + 0x5C441400, // 0147 MOVE R17 R10 + 0x7C3C0400, // 0148 CALL R15 2 + 0x5840000B, // 0149 LDCONST R16 K11 + 0x7C340600, // 014A CALL R13 3 + 0x70020038, // 014B JMP #0185 + 0x8C280535, // 014C GETMET R10 R2 K53 + 0x5C301200, // 014D MOVE R12 R9 + 0x58340044, // 014E LDCONST R13 K68 + 0x7C280600, // 014F CALL R10 3 + 0x1C281529, // 0150 EQ R10 R10 K41 + 0x782A0032, // 0151 JMPF R10 #0185 + 0x60280009, // 0152 GETGBL R10 G9 + 0x402E1736, // 0153 CONNECT R11 K11 K54 + 0x942C120B, // 0154 GETIDX R11 R9 R11 + 0x7C280200, // 0155 CALL R10 1 + 0x8C2C030E, // 0156 GETMET R11 R1 K14 + 0x5C341000, // 0157 MOVE R13 R8 + 0x7C2C0400, // 0158 CALL R11 2 + 0x8830010C, // 0159 GETMBR R12 R0 K12 + 0x88301937, // 015A GETMBR R12 R12 K55 + 0x8C301935, // 015B GETMET R12 R12 K53 + 0x60380008, // 015C GETGBL R14 G8 + 0x5C3C1400, // 015D MOVE R15 R10 + 0x7C380200, // 015E CALL R14 1 + 0x7C300400, // 015F CALL R12 2 + 0x4C340000, // 0160 LDNIL R13 + 0x2034180D, // 0161 NE R13 R12 R13 + 0x78360021, // 0162 JMPF R13 #0185 + 0x8C341935, // 0163 GETMET R13 R12 K53 + 0x583C0045, // 0164 LDCONST R15 K69 + 0x5840003A, // 0165 LDCONST R16 K58 + 0x7C340600, // 0166 CALL R13 3 + 0x20381A0B, // 0167 NE R14 R13 R11 + 0x783A001B, // 0168 JMPF R14 #0185 + 0x50180200, // 0169 LDBOOL R6 1 0 + 0x883C010C, // 016A GETMBR R15 R0 K12 + 0x8C3C1F40, // 016B GETMET R15 R15 K64 + 0x5C441400, // 016C MOVE R17 R10 + 0x7C3C0400, // 016D CALL R15 2 + 0x783E0015, // 016E JMPF R15 #0185 + 0x8C401F46, // 016F GETMET R16 R15 K70 + 0x5C481600, // 0170 MOVE R18 R11 + 0x7C400400, // 0171 CALL R16 2 + 0x782E0001, // 0172 JMPF R11 #0175 + 0x98328A0B, // 0173 SETIDX R12 K69 R11 + 0x70020002, // 0174 JMP #0178 + 0x8C401947, // 0175 GETMET R16 R12 K71 + 0x58480045, // 0176 LDCONST R18 K69 + 0x7C400400, // 0177 CALL R16 2 + 0xB8421000, // 0178 GETNGBL R16 K8 + 0x8C402109, // 0179 GETMET R16 R16 K9 + 0x60480018, // 017A GETGBL R18 G24 + 0x584C0048, // 017B LDCONST R19 K72 + 0x5C501800, // 017C MOVE R20 R12 + 0x5C541400, // 017D MOVE R21 R10 + 0x5C581E00, // 017E MOVE R22 R15 + 0x7C480800, // 017F CALL R18 4 + 0x584C000B, // 0180 LDCONST R19 K11 + 0x7C400600, // 0181 CALL R16 3 + 0x8C401F42, // 0182 GETMET R16 R15 K66 + 0x5C481800, // 0183 MOVE R18 R12 + 0x7C400400, // 0184 CALL R16 2 + 0x7001FF5E, // 0185 JMP #00E5 + 0x581C0049, // 0186 LDCONST R7 K73 + 0xAC1C0200, // 0187 CATCH R7 1 0 + 0xB0080000, // 0188 RAISE 2 R0 R0 + 0xB81E1000, // 0189 GETNGBL R7 K8 + 0x8C1C0F09, // 018A GETMET R7 R7 K9 + 0x60240018, // 018B GETGBL R9 G24 + 0x5828004A, // 018C LDCONST R10 K74 + 0x602C0008, // 018D GETGBL R11 G8 + 0x8830010C, // 018E GETMBR R12 R0 K12 + 0x88301937, // 018F GETMBR R12 R12 K55 + 0x7C2C0200, // 0190 CALL R11 1 + 0x7C240400, // 0191 CALL R9 2 + 0x5828000B, // 0192 LDCONST R10 K11 + 0x7C1C0600, // 0193 CALL R7 3 + 0x78160008, // 0194 JMPF R5 #019E + 0xB81E1000, // 0195 GETNGBL R7 K8 + 0x8C1C0F09, // 0196 GETMET R7 R7 K9 + 0x60240018, // 0197 GETGBL R9 G24 + 0x5828004B, // 0198 LDCONST R10 K75 + 0x5C2C0A00, // 0199 MOVE R11 R5 + 0x7C240400, // 019A CALL R9 2 + 0x5828000B, // 019B LDCONST R10 K11 + 0x7C1C0600, // 019C CALL R7 3 + 0x7002000C, // 019D JMP #01AB + 0x741A0002, // 019E JMPT R6 #01A2 + 0x881C010C, // 019F GETMBR R7 R0 K12 + 0x881C0F31, // 01A0 GETMBR R7 R7 K49 + 0x741E0005, // 01A1 JMPT R7 #01A8 + 0x881C010C, // 01A2 GETMBR R7 R0 K12 + 0x50200200, // 01A3 LDBOOL R8 1 0 + 0x901E6208, // 01A4 SETMBR R7 K49 R8 + 0x881C010C, // 01A5 GETMBR R7 R0 K12 + 0x8C1C0F13, // 01A6 GETMET R7 R7 K19 + 0x7C1C0200, // 01A7 CALL R7 1 + 0x8C1C0314, // 01A8 GETMET R7 R1 K20 + 0x5824002F, // 01A9 LDCONST R9 K47 + 0x7C1C0400, // 01AA CALL R7 2 + 0x700200BB, // 01AB JMP #0268 + 0x8C180305, // 01AC GETMET R6 R1 K5 + 0x5820004C, // 01AD LDCONST R8 K76 + 0x7C180400, // 01AE CALL R6 2 + 0x781A002B, // 01AF JMPF R6 #01DC + 0x8C18030E, // 01B0 GETMET R6 R1 K14 + 0x5820004D, // 01B1 LDCONST R8 K77 + 0x7C180400, // 01B2 CALL R6 2 + 0x8C1C030E, // 01B3 GETMET R7 R1 K14 + 0x5824000E, // 01B4 LDCONST R9 K14 + 0x7C1C0400, // 01B5 CALL R7 2 + 0x8C20030E, // 01B6 GETMET R8 R1 K14 + 0x58280044, // 01B7 LDCONST R10 K68 + 0x7C200400, // 01B8 CALL R8 2 + 0xB8261000, // 01B9 GETNGBL R9 K8 + 0x8C241309, // 01BA GETMET R9 R9 K9 + 0x602C0018, // 01BB GETGBL R11 G24 + 0x5830004E, // 01BC LDCONST R12 K78 + 0x5C340C00, // 01BD MOVE R13 R6 + 0x5C380E00, // 01BE MOVE R14 R7 + 0x7C2C0600, // 01BF CALL R11 3 + 0x5830000B, // 01C0 LDCONST R12 K11 + 0x7C240600, // 01C1 CALL R9 3 + 0x8824010C, // 01C2 GETMBR R9 R0 K12 + 0x88241338, // 01C3 GETMBR R9 R9 K56 + 0x8C241335, // 01C4 GETMET R9 R9 K53 + 0x5C2C0C00, // 01C5 MOVE R11 R6 + 0x7C240400, // 01C6 CALL R9 2 + 0x4C280000, // 01C7 LDNIL R10 + 0x2028120A, // 01C8 NE R10 R9 R10 + 0x782A000D, // 01C9 JMPF R10 #01D8 + 0x60280013, // 01CA GETGBL R10 G19 + 0x7C280000, // 01CB CALL R10 0 + 0x78220000, // 01CC JMPF R8 #01CE + 0x982A8A08, // 01CD SETIDX R10 K69 R8 + 0x8C2C133F, // 01CE GETMET R11 R9 K63 + 0x5C341200, // 01CF MOVE R13 R9 + 0x5C381400, // 01D0 MOVE R14 R10 + 0x5C3C0E00, // 01D1 MOVE R15 R7 + 0x7C2C0800, // 01D2 CALL R11 4 + 0x882C010C, // 01D3 GETMBR R11 R0 K12 + 0x8C2C174F, // 01D4 GETMET R11 R11 K79 + 0x5C340C00, // 01D5 MOVE R13 R6 + 0x5C381400, // 01D6 MOVE R14 R10 + 0x7C2C0600, // 01D7 CALL R11 3 + 0x8C280314, // 01D8 GETMET R10 R1 K20 + 0x5830002F, // 01D9 LDCONST R12 K47 + 0x7C280400, // 01DA CALL R10 2 + 0x7002008B, // 01DB JMP #0268 + 0x8C180305, // 01DC GETMET R6 R1 K5 + 0x58200050, // 01DD LDCONST R8 K80 + 0x7C180400, // 01DE CALL R6 2 + 0x781A005E, // 01DF JMPF R6 #023F + 0x8C18030E, // 01E0 GETMET R6 R1 K14 + 0x58200051, // 01E1 LDCONST R8 K81 + 0x7C180400, // 01E2 CALL R6 2 + 0x4C1C0000, // 01E3 LDNIL R7 + 0x1C1C0C07, // 01E4 EQ R7 R6 R7 + 0x741E0001, // 01E5 JMPT R7 #01E8 + 0x1C1C0D3A, // 01E6 EQ R7 R6 K58 + 0x781E0000, // 01E7 JMPF R7 #01E9 + 0xB006A553, // 01E8 RAISE 1 K82 K83 + 0x581C0029, // 01E9 LDCONST R7 K41 + 0x60200008, // 01EA GETGBL R8 G8 + 0x5C240E00, // 01EB MOVE R9 R7 + 0x7C200200, // 01EC CALL R8 1 + 0x8C240305, // 01ED GETMET R9 R1 K5 + 0x002E9A08, // 01EE ADD R11 K77 R8 + 0x7C240400, // 01EF CALL R9 2 + 0x78260049, // 01F0 JMPF R9 #023B + 0x8C24030E, // 01F1 GETMET R9 R1 K14 + 0x002E9A08, // 01F2 ADD R11 K77 R8 + 0x7C240400, // 01F3 CALL R9 2 + 0x8C28030E, // 01F4 GETMET R10 R1 K14 + 0x00321C08, // 01F5 ADD R12 K14 R8 + 0x7C280400, // 01F6 CALL R10 2 + 0x8C2C030E, // 01F7 GETMET R11 R1 K14 + 0x00368808, // 01F8 ADD R13 K68 R8 + 0x7C2C0400, // 01F9 CALL R11 2 + 0x2030133A, // 01FA NE R12 R9 K58 + 0x78320038, // 01FB JMPF R12 #0235 + 0x8830010C, // 01FC GETMBR R12 R0 K12 + 0x88301938, // 01FD GETMBR R12 R12 K56 + 0x8C301935, // 01FE GETMET R12 R12 K53 + 0x5C381200, // 01FF MOVE R14 R9 + 0x7C300400, // 0200 CALL R12 2 + 0x4C340000, // 0201 LDNIL R13 + 0x2034180D, // 0202 NE R13 R12 R13 + 0x78360030, // 0203 JMPF R13 #0235 + 0x60340013, // 0204 GETGBL R13 G19 + 0x7C340000, // 0205 CALL R13 0 + 0x9836A206, // 0206 SETIDX R13 K81 R6 + 0x98367209, // 0207 SETIDX R13 K57 R9 + 0x782E0000, // 0208 JMPF R11 #020A + 0x98368A0B, // 0209 SETIDX R13 K69 R11 + 0x8C38193F, // 020A GETMET R14 R12 K63 + 0x5C401800, // 020B MOVE R16 R12 + 0x5C441A00, // 020C MOVE R17 R13 + 0x5C481400, // 020D MOVE R18 R10 + 0x7C380800, // 020E CALL R14 4 + 0x50380000, // 020F LDBOOL R14 0 0 + 0x603C0010, // 0210 GETGBL R15 G16 + 0x8840010C, // 0211 GETMBR R16 R0 K12 + 0x88402137, // 0212 GETMBR R16 R16 K55 + 0x7C3C0200, // 0213 CALL R15 1 + 0xA802000B, // 0214 EXBLK 0 #0221 + 0x5C401E00, // 0215 MOVE R16 R15 + 0x7C400000, // 0216 CALL R16 0 + 0x8C440154, // 0217 GETMET R17 R0 K84 + 0x5C4C2000, // 0218 MOVE R19 R16 + 0x5C501A00, // 0219 MOVE R20 R13 + 0x7C440600, // 021A CALL R17 3 + 0x78460001, // 021B JMPF R17 #021E + 0x50380200, // 021C LDBOOL R14 1 0 + 0x70020000, // 021D JMP #021F + 0x7001FFF5, // 021E JMP #0215 + 0xA8040001, // 021F EXBLK 1 1 + 0x70020002, // 0220 JMP #0224 + 0x583C0049, // 0221 LDCONST R15 K73 + 0xAC3C0200, // 0222 CATCH R15 1 0 + 0xB0080000, // 0223 RAISE 2 R0 R0 + 0x5C3C1C00, // 0224 MOVE R15 R14 + 0x743E000E, // 0225 JMPT R15 #0235 + 0xB83E1000, // 0226 GETNGBL R15 K8 + 0x8C3C1F09, // 0227 GETMET R15 R15 K9 + 0x60440018, // 0228 GETGBL R17 G24 + 0x58480055, // 0229 LDCONST R18 K85 + 0x5C4C0C00, // 022A MOVE R19 R6 + 0x5C501200, // 022B MOVE R20 R9 + 0x5C541400, // 022C MOVE R21 R10 + 0x7C440800, // 022D CALL R17 4 + 0x5848000B, // 022E LDCONST R18 K11 + 0x7C3C0600, // 022F CALL R15 3 + 0x883C010C, // 0230 GETMBR R15 R0 K12 + 0x8C3C1F4F, // 0231 GETMET R15 R15 K79 + 0x5C441200, // 0232 MOVE R17 R9 + 0x5C481A00, // 0233 MOVE R18 R13 + 0x7C3C0600, // 0234 CALL R15 3 + 0x001C0F2E, // 0235 ADD R7 R7 K46 + 0x60300008, // 0236 GETGBL R12 G8 + 0x5C340E00, // 0237 MOVE R13 R7 + 0x7C300200, // 0238 CALL R12 1 + 0x5C201800, // 0239 MOVE R8 R12 + 0x7001FFB1, // 023A JMP #01ED + 0x8C240314, // 023B GETMET R9 R1 K20 + 0x582C002F, // 023C LDCONST R11 K47 + 0x7C240400, // 023D CALL R9 2 + 0x70020028, // 023E JMP #0268 + 0x4C180000, // 023F LDNIL R6 + 0x601C0010, // 0240 GETGBL R7 G16 + 0x8C200333, // 0241 GETMET R8 R1 K51 + 0x7C200200, // 0242 CALL R8 1 + 0x0420112E, // 0243 SUB R8 R8 K46 + 0x40225208, // 0244 CONNECT R8 K41 R8 + 0x7C1C0200, // 0245 CALL R7 1 + 0xA8020013, // 0246 EXBLK 0 #025B + 0x5C200E00, // 0247 MOVE R8 R7 + 0x7C200000, // 0248 CALL R8 0 + 0x8C240334, // 0249 GETMET R9 R1 K52 + 0x5C2C1000, // 024A MOVE R11 R8 + 0x7C240400, // 024B CALL R9 2 + 0x8C280535, // 024C GETMET R10 R2 K53 + 0x5C301200, // 024D MOVE R12 R9 + 0x58340056, // 024E LDCONST R13 K86 + 0x7C280600, // 024F CALL R10 3 + 0x1C281529, // 0250 EQ R10 R10 K41 + 0x782A0005, // 0251 JMPF R10 #0258 + 0x60280009, // 0252 GETGBL R10 G9 + 0x402E1736, // 0253 CONNECT R11 K11 K54 + 0x942C120B, // 0254 GETIDX R11 R9 R11 + 0x7C280200, // 0255 CALL R10 1 + 0x5C181400, // 0256 MOVE R6 R10 + 0x70020000, // 0257 JMP #0259 + 0x7001FFED, // 0258 JMP #0247 + 0xA8040001, // 0259 EXBLK 1 1 + 0x70020002, // 025A JMP #025E + 0x581C0049, // 025B LDCONST R7 K73 + 0xAC1C0200, // 025C CATCH R7 1 0 + 0xB0080000, // 025D RAISE 2 R0 R0 + 0x4C1C0000, // 025E LDNIL R7 + 0x201C0C07, // 025F NE R7 R6 R7 + 0x781E0006, // 0260 JMPF R7 #0268 + 0x881C010C, // 0261 GETMBR R7 R0 K12 + 0x8C1C0F57, // 0262 GETMET R7 R7 K87 + 0x5C240C00, // 0263 MOVE R9 R6 + 0x7C1C0400, // 0264 CALL R7 2 + 0x8C1C0314, // 0265 GETMET R7 R1 K20 + 0x5824002F, // 0266 LDCONST R9 K47 + 0x7C1C0400, // 0267 CALL R7 2 + 0x78160011, // 0268 JMPF R5 #027B + 0x8C180358, // 0269 GETMET R6 R1 K88 + 0x58200059, // 026A LDCONST R8 K89 + 0x7C180400, // 026B CALL R6 2 + 0x8C18035A, // 026C GETMET R6 R1 K90 + 0x7C180200, // 026D CALL R6 1 + 0x8C18035B, // 026E GETMET R6 R1 K91 + 0x60200018, // 026F GETGBL R8 G24 + 0x5824005C, // 0270 LDCONST R9 K92 + 0x8C28035D, // 0271 GETMET R10 R1 K93 + 0x5C300A00, // 0272 MOVE R12 R5 + 0x7C280400, // 0273 CALL R10 2 + 0x7C200400, // 0274 CALL R8 2 + 0x7C180400, // 0275 CALL R6 2 + 0x8C18035E, // 0276 GETMET R6 R1 K94 + 0x8820035F, // 0277 GETMBR R8 R1 K95 + 0x7C180400, // 0278 CALL R6 2 + 0x8C180360, // 0279 GETMET R6 R1 K96 + 0x7C180200, // 027A CALL R6 1 + 0xA8040001, // 027B EXBLK 1 1 + 0x7002001D, // 027C JMP #029B + 0xAC180002, // 027D CATCH R6 0 2 + 0x7002001A, // 027E JMP #029A + 0xB8221000, // 027F GETNGBL R8 K8 + 0x8C201109, // 0280 GETMET R8 R8 K9 + 0x60280018, // 0281 GETGBL R10 G24 + 0x582C0061, // 0282 LDCONST R11 K97 + 0x5C300C00, // 0283 MOVE R12 R6 + 0x5C340E00, // 0284 MOVE R13 R7 + 0x7C280600, // 0285 CALL R10 3 + 0x582C0062, // 0286 LDCONST R11 K98 + 0x7C200600, // 0287 CALL R8 3 + 0x8C200358, // 0288 GETMET R8 R1 K88 + 0x58280059, // 0289 LDCONST R10 K89 + 0x7C200400, // 028A CALL R8 2 + 0x8C20035A, // 028B GETMET R8 R1 K90 + 0x7C200200, // 028C CALL R8 1 + 0x8C20035B, // 028D GETMET R8 R1 K91 + 0x60280018, // 028E GETGBL R10 G24 + 0x582C0063, // 028F LDCONST R11 K99 + 0x5C300C00, // 0290 MOVE R12 R6 + 0x5C340E00, // 0291 MOVE R13 R7 + 0x7C280600, // 0292 CALL R10 3 + 0x7C200400, // 0293 CALL R8 2 + 0x8C20035E, // 0294 GETMET R8 R1 K94 + 0x8828035F, // 0295 GETMBR R10 R1 K95 + 0x7C200400, // 0296 CALL R8 2 + 0x8C200360, // 0297 GETMET R8 R1 K96 + 0x7C200200, // 0298 CALL R8 1 + 0x70020000, // 0299 JMP #029B + 0xB0080000, // 029A RAISE 2 R0 R0 + 0x80000000, // 029B RET 0 }) ) ); @@ -3173,7 +3132,7 @@ be_local_closure(Matter_UI_show_qrcode, /* name */ ********************************************************************/ be_local_closure(Matter_UI_show_enable, /* name */ be_nested_proto( - 10, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3181,7 +3140,7 @@ be_local_closure(Matter_UI_show_enable, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(matter_enabled), /* K2 */ be_nested_str_weak(content_send), @@ -3194,11 +3153,14 @@ be_local_closure(Matter_UI_show_enable, /* name */ /* K9 */ be_nested_str_weak(commissioning_open), /* K10 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20id_X3D_X27comm_X27_X20type_X3D_X27checkbox_X27_X20name_X3D_X27comm_X27_X20_X25s_X3E), /* K11 */ be_nested_str_weak(_X3Clabel_X20for_X3D_X27comm_X27_X3E_X3Cb_X3ECommissioning_X20open_X3C_X2Fb_X3E_X3C_X2Flabel_X3E_X3C_X2Fp_X3E), - /* K12 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27save_X27_X20class_X3D_X27button_X20bgrn_X27_X3ESave_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), + /* K12 */ be_nested_str_weak(disable_bridge_mode), + /* K13 */ be_nested_str_weak(_X20checked), + /* K14 */ be_nested_str_weak(_X3Cp_X3E_X3Cinput_X20type_X3D_X27checkbox_X27_X20name_X3D_X27nobridge_X27_X25s_X3E_X3Cb_X3EForce_X20Static_X20endpoints_X3C_X2Fb_X3E_X20_X28non_X2Dbridge_X29_X3C_X2Fp_X3E), + /* K15 */ be_nested_str_weak(_X3Cp_X3E_X3C_X2Fp_X3E_X3Cbutton_X20name_X3D_X27save_X27_X20class_X3D_X27button_X20bgrn_X27_X3ESave_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E), }), be_str_weak(show_enable), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ + ( &(const binstruction[56]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x8C0C0302, // 0002 GETMET R3 R1 K2 @@ -3221,7 +3183,7 @@ be_local_closure(Matter_UI_show_enable, /* name */ 0x7C100400, // 0013 CALL R4 2 0x8C100101, // 0014 GETMET R4 R0 K1 0x7C100200, // 0015 CALL R4 1 - 0x78120010, // 0016 JMPF R4 #0028 + 0x7812001C, // 0016 JMPF R4 #0034 0x88100108, // 0017 GETMBR R4 R0 K8 0x88100909, // 0018 GETMBR R4 R4 K9 0x4C140000, // 0019 LDNIL R5 @@ -3239,10 +3201,22 @@ be_local_closure(Matter_UI_show_enable, /* name */ 0x8C140302, // 0025 GETMET R5 R1 K2 0x581C000B, // 0026 LDCONST R7 K11 0x7C140400, // 0027 CALL R5 2 - 0x8C100302, // 0028 GETMET R4 R1 K2 - 0x5818000C, // 0029 LDCONST R6 K12 - 0x7C100400, // 002A CALL R4 2 - 0x80000000, // 002B RET 0 + 0x88140108, // 0028 GETMBR R5 R0 K8 + 0x88140B0C, // 0029 GETMBR R5 R5 K12 + 0x78160001, // 002A JMPF R5 #002D + 0x5814000D, // 002B LDCONST R5 K13 + 0x70020000, // 002C JMP #002E + 0x58140005, // 002D LDCONST R5 K5 + 0x8C180302, // 002E GETMET R6 R1 K2 + 0x60200018, // 002F GETGBL R8 G24 + 0x5824000E, // 0030 LDCONST R9 K14 + 0x5C280A00, // 0031 MOVE R10 R5 + 0x7C200400, // 0032 CALL R8 2 + 0x7C180400, // 0033 CALL R6 2 + 0x8C100302, // 0034 GETMET R4 R1 K2 + 0x5818000F, // 0035 LDCONST R6 K15 + 0x7C100400, // 0036 CALL R4 2 + 0x80000000, // 0037 RET 0 }) ) ); From ca452c5e43865bfeedbb8650090a149bd36a94bd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:14:37 +0200 Subject: [PATCH 021/150] Add Energy->phase_count_virtual --- tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 1 + tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino | 1 + tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index ffe80ba22..66fb190e1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -109,6 +109,7 @@ typedef struct { uint8_t data_valid[ENERGY_MAX_PHASES]; uint8_t phase_count; // Number of phases active + uint8_t phase_count_virtual; // Number of virtual relays bool voltage_common; // Use common voltage bool frequency_common; // Use common frequency bool use_overtemp; // Use global temperature as overtemp trigger on internal energy monitor hardware diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index 71a19d25e..e55da6c26 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -173,6 +173,7 @@ typedef struct { uint8_t data_valid[ENERGY_MAX_PHASES]; uint8_t phase_count; // Number of phases active + uint8_t phase_count_virtual; // Number of virtual relays uint8_t fifth_second; uint8_t command_code; uint8_t power_steady_counter; // Allow for power on stabilization diff --git a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino index 67916a717..3f51b1ce6 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino @@ -148,8 +148,9 @@ bool NrgDummyCommand(void) { } void NrgDummyDrvInit(void) { - if (TasmotaGlobal.gpio_optiona.dummy_energy && TasmotaGlobal.devices_present) { - Energy->phase_count = (TasmotaGlobal.devices_present < ENERGY_MAX_PHASES) ? TasmotaGlobal.devices_present : ENERGY_MAX_PHASES; + uint32_t phase_count = (Energy->phase_count_virtual > 0) ? Energy->phase_count_virtual : TasmotaGlobal.devices_present; + if (TasmotaGlobal.gpio_optiona.dummy_energy && phase_count) { + Energy->phase_count = (phase_count < ENERGY_MAX_PHASES) ? phase_count : ENERGY_MAX_PHASES; if (HLW_PREF_PULSE == EnergyGetCalibration(ENERGY_POWER_CALIBRATION)) { for (uint32_t i = 0; i < Energy->phase_count; i++) { From 58e13edea07b2a6768d1bab20ee396bc926d7f4e Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:31:59 +0200 Subject: [PATCH 022/150] Change loglevel message --- tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino | 2 +- tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index e55da6c26..d37de61b8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -347,7 +347,7 @@ void EnergySettingsLoad(bool erase) { } else { // File system not ready: No flash space reserved for file system - AddLog(LOG_LEVEL_INFO, PSTR("CFG: Energy use defaults as file system not ready or file not found")); + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Energy use defaults as file system not ready or file not found")); } #endif // USE_UFILESYS } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino index 7637e8259..fb6c2eff8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino @@ -127,7 +127,7 @@ void DrvDemoSettingsLoad(bool erase) { } else { // File system not ready: No flash space reserved for file system - AddLog(LOG_LEVEL_INFO, PSTR("CFG: Demo use defaults as file system not ready or file not found")); + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Demo use defaults as file system not ready or file not found")); } #endif // USE_UFILESYS } From 1e3b41dd2dc68891f509c70de36393dfdceb1d64 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:37:20 +0200 Subject: [PATCH 023/150] Fix PCF8574 mode2 init using scripts Fix PCF8574 mode2 init using scripts (#18934) --- .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 43 ++++++++++--------- .../xdrv_28_pcf8574_v2.ino | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 5294b1bfd..66d846114 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -444,7 +444,7 @@ struct SCRIPT_SPI { #include #include -#ifndef MAX_DS_SENSORS +#ifndef MAX_DS_SENSORS #define MAX_DS_SENSORS 20 #endif @@ -722,7 +722,7 @@ char *script; } uint16_t maxvars = maxsvars + maxnvars; //AddLog(LOG_LEVEL_INFO, PSTR("Script: svar = %d, nvars = %d"), maxsvars, maxnvars); - + // scan lines for >DEF uint16_t lines = 0; uint16_t nvars = 0; @@ -867,7 +867,7 @@ char *script; } else { vtypes[vars].bits.is_filter = 0; } - + *vnp_p++ = vnames_p; while (lp < op) { if (*lp == ' ') { @@ -4447,7 +4447,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); goto nfuncexit; } break; -#endif // USE_SCRIPT_ONEWIRE +#endif // USE_SCRIPT_ONEWIRE case 'p': if (!strncmp_XP(lp, XPSTR("pin["), 4)) { @@ -4985,7 +4985,7 @@ extern char *SML_GetSVal(uint32_t index); Settings->serial_config = sconfig; uint8_t uart = 0; -#ifdef ESP32 +#ifdef ESP32 uart = glob_script_mem.sp->getUart(); #endif AddLog(LOG_LEVEL_INFO, PSTR("Serial port set to %s %d bit/s at rx=%d tx=%d rbu=%d uart=%d"), GetSerialConfig().c_str(), (uint32_t)br, (uint32_t)rxpin, (uint32_t)txpin, (uint32_t)rxbsiz, uart); @@ -5554,7 +5554,7 @@ extern char *SML_GetSVal(uint32_t index); uint32_t cycles; uint64_t accu = 0; char sbuffer[32]; - + GT911_Touch_Init(&Wire1, -1, -1, 960, 540); /* @@ -5965,12 +5965,12 @@ char *getop(char *lp, uint8_t *operand) { #ifdef USE_SCRIPT_FATFS_EXT #ifdef USE_UFILESYS int32_t script_logfile_write(char *path, char *payload, uint32_t size) { - + File rfd = ufsp->open(path, FS_FILE_APPEND); if (rfd == 0) { return -1; } - + uint32_t fsize = rfd.size(); // append string rfd.write((uint8_t*)payload, strlen(payload)); @@ -5994,7 +5994,7 @@ int32_t script_logfile_write(char *path, char *payload, uint32_t size) { wfd.close(); ufsp->remove(path); ufsp->rename("/ltmp", path); - + return fsize; } #endif // USE_UFILESYS @@ -7447,7 +7447,7 @@ getnext: default: // error break; - } + } } else { switch (lastop) { case OPER_EQU: @@ -7492,7 +7492,7 @@ getnext: break; } } - + // var was changed if (globvindex >= 0) SetChanged(globvindex); #ifdef USE_SCRIPT_GLOBVARS @@ -7763,7 +7763,7 @@ ScriptOneWire *ow = &glob_script_mem.ow; ow->ts->begin(9600); -#ifdef ESP8266 +#ifdef ESP8266 if (ow->ts->hardwareSerial()) { ClaimSerial(); #ifdef ALLOW_OW_INVERT @@ -7783,7 +7783,7 @@ ScriptOneWire *ow = &glob_script_mem.ow; } #endif #endif // ESP32 - + ow->dsh = new DS2480B(ow->ts); ow->dsh->begin(); } @@ -7878,7 +7878,7 @@ ScriptOneWire *ow = &glob_script_mem.ow; if (val < 1 || val > MAX_DS_SENSORS) { val = 1; } - + if (ow->ds) { uint8_t data[9]; ow->ds->reset(); @@ -8552,7 +8552,7 @@ void SaveScriptEnd(void) { glob_script_mem.script_mem_size = 0; #ifdef USE_SCRIPT_SERIAL Script_Close_Serial(); -#endif +#endif } if (bitRead(Settings->rule_enabled, 0)) { @@ -10605,7 +10605,7 @@ const char *gc_str; } bool dogui = ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt & WSO_FORCEMAIN)); - + if ((dogui && !(specopt & WSO_FORCEGUI)) || (!dogui && (specopt & WSO_FORCEGUI))) { //if ( ((!mc && (*lin != '$')) || (mc == 'w' && (*lin != '$'))) && (!(specopt & WSO_FORCEMAIN)) || (specopt & WSO_FORCEGUI)) { // normal web section @@ -10784,7 +10784,7 @@ const char *gc_str; } else { WSContentSend_P(SCRIPT_MSG_RADIOa, center, tsiz, pulabel); } - + // get pu labels uint8_t index = 1; while (*lp) { @@ -11872,7 +11872,7 @@ int32_t call2pwl(const char *url) { if (*url == 'N') { url++; cookie = ""; - } + } String result = powerwall.GetRequest(String(url), cookie); //AddLog(LOG_LEVEL_INFO, PSTR("PWL: result: %s"), result.c_str()); @@ -12510,7 +12510,8 @@ bool Xdrv10(uint32_t function) switch (function) { //case FUNC_PRE_INIT: - case FUNC_INIT: + //case FUNC_INIT: + case FUNC_SETUP_RING1: // We need to setup SCRIPT before call to ScriptLoadSection() //bitWrite(Settings->rule_enabled, 0, 0); // >>>>>>>>>>> #ifndef NO_SCRIPT_STOP_ON_ERROR @@ -12671,8 +12672,8 @@ bool Xdrv10(uint32_t function) if (bitRead(Settings->rule_enabled, 0)) Init_Scripter(); - // break; - //case FUNC_INIT: + break; + case FUNC_INIT: if (bitRead(Settings->rule_enabled, 0)) { set_callbacks(); Run_Scripter1(">B\n", 3, 0); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino b/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino index 7a04696e4..a8454c713 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_28_pcf8574_v2.ino @@ -65,7 +65,7 @@ * * Prepare a template to be loaded either by: * - a rule like: rule3 on file#pcf8574.dat do {"NAME":"PCF8574 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} endon - * - a script like: -y{"NAME":"PCF8574 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} + * - a script like: >y{"NAME":"PCF8574 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]}# * - file called pcf8574.dat with contents: {"NAME":"PCF8574 A=Ri8-1, B=B1-8","GPIO":[263,262,261,260,259,258,257,256,32,33,34,35,36,37,38,39]} * * Inverted relays and buttons Ri8 Ri7 Ri6 Ri5 Ri4 Ri3 Ri2 Ri1 B1 B2 B3 B4 B5 B6 B7 B8 From ad404dfc0c86d0463ce771ecd730b36ee37d2d02 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:55:48 +0200 Subject: [PATCH 024/150] Allow disable of frequency Allow disable of frequency in dummy driver --- tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino index 3f51b1ce6..1f6735f3e 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino @@ -65,8 +65,10 @@ void NrgDummyEverySecond(void) { float current_calibration = (float)EnergyGetCalibration(ENERGY_CURRENT_CALIBRATION, channel) / 100000; float frequency_calibration = (float)EnergyGetCalibration(ENERGY_FREQUENCY_CALIBRATION, channel) / 100; - Energy->voltage[channel] = voltage_calibration; // V - Energy->frequency[channel] = frequency_calibration; // Hz + if (voltage_calibration > 100) { + Energy->voltage[channel] = voltage_calibration; // V + } + Energy->frequency[channel] = (frequency_calibration > 45) ? frequency_calibration : NAN; // Hz if (bitRead(TasmotaGlobal.power, channel)) { // Emulate power read only if device is powered on Energy->active_power[channel] = (NrgDummy.power[channel]) ? ((float)NrgDummy.power[channel] / 1000) : power_calibration; // W if (0 == Energy->active_power[channel]) { From 2705374160bb0cd6f2c14ea9fa2d9093315caf82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacek=20Zi=C3=B3=C5=82kowski?= Date: Fri, 30 Jun 2023 22:19:59 +0200 Subject: [PATCH 025/150] add Energy.phase_count_virtual to berry energy module (#19004) * add Energy.phase_count_virtual to berry energy module * Update xdrv_52_3_berry_energy.ino * Update xdrv_52_3_berry_energy.ino --- tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino index f9eca21f5..3b3fa33a1 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino @@ -39,9 +39,9 @@ extern "C" { }; extern "C" const be_ctypes_structure_t be_energy_struct = { sizeof(tEnergy), /* size in bytes */ - 88, /* number of elements */ + 89, /* number of elements */ be_ctypes_instance_mappings, - (const be_ctypes_structure_item_t[88]) { + (const be_ctypes_structure_item_t[89]) { { "active_power", offsetof(tEnergy, active_power[0]), 0, 0, ctypes_float, 0 }, { "active_power_2", offsetof(tEnergy, active_power[1]), 0, 0, ctypes_float, 0 }, { "active_power_3", offsetof(tEnergy, active_power[2]), 0, 0, ctypes_float, 0 }, @@ -88,6 +88,7 @@ extern "C" { { "period_2", offsetof(tEnergy, period_kWh[1]), 0, 0, ctypes_float, 0 }, { "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 }, { "phase_count", offsetof(tEnergy, phase_count), 0, 0, ctypes_u8, 0 }, + { "phase_count_virtual", offsetof(tEnergy, phase_count_virtual), 0, 0, ctypes_u8, 0 }, { "power_factor", offsetof(tEnergy, power_factor[0]), 0, 0, ctypes_float, 0 }, { "power_factor_2", offsetof(tEnergy, power_factor[1]), 0, 0, ctypes_float, 0 }, { "power_factor_3", offsetof(tEnergy, power_factor[2]), 0, 0, ctypes_float, 0 }, From 3edb5bb0964e92a9000cafd8be950974b94067bd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 1 Jul 2023 12:48:33 +0200 Subject: [PATCH 026/150] Move SD card init up Move SD card init up (#18934) --- tasmota/tasmota_support/support_tasmota.ino | 6 ++++++ tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino | 3 +++ 2 files changed, 9 insertions(+) diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 0c37a5eb0..113181ce0 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -2261,6 +2261,12 @@ void GpioInit(void) } } +#ifdef USE_UFILESYS +#ifdef USE_SDCARD + UfsCheckSDCardInit(); +#endif // USE_SDCARD +#endif // USE_UFILESYS + XdrvCall(FUNC_SETUP_RING1); // Setup RTC hardware XsnsXdrvCall(FUNC_SETUP_RING2); // Setup hardware supporting virtual switches/buttons/relays diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index e61a22535..d3d0acbd7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -1138,11 +1138,14 @@ bool Xdrv50(uint32_t function) { case FUNC_LOOP: UfsExecuteCommandFileLoop(); break; +/* +// Moved to support_tasmota.ino for earlier init to be used by scripter #ifdef USE_SDCARD case FUNC_PRE_INIT: UfsCheckSDCardInit(); break; #endif // USE_SDCARD +*/ case FUNC_MQTT_INIT: if (!TasmotaGlobal.no_autoexec) { UfsExecuteCommandFile(TASM_FILE_AUTOEXEC); From 6dd8aabeef9bc168f004e4106a987f30e6cdd361 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:04:27 +0200 Subject: [PATCH 027/150] Cleanup scripter logging --- .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 66d846114..ac24a6a9a 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -721,7 +721,7 @@ char *script; maxsvars = 1; } uint16_t maxvars = maxsvars + maxnvars; - //AddLog(LOG_LEVEL_INFO, PSTR("Script: svar = %d, nvars = %d"), maxsvars, maxnvars); + //AddLog(LOG_LEVEL_INFO, PSTR("SCR: svar = %d, nvars = %d"), maxsvars, maxnvars); // scan lines for >DEF uint16_t lines = 0; @@ -1090,7 +1090,7 @@ char *script; } // variables usage info - AddLog(LOG_LEVEL_INFO, PSTR("Script: nv=%d, tv=%d, vns=%d, vmem=%d, smem=%d"), nvars, svars, index, glob_script_mem.script_mem_size, glob_script_mem.script_size); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: nv=%d, tv=%d, vns=%d, vmem=%d, smem=%d"), nvars, svars, index, glob_script_mem.script_mem_size, glob_script_mem.script_size); // copy string variables char *cp1 = glob_script_mem.glob_snp; @@ -1239,12 +1239,12 @@ void Script_Init_UDP() { #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP started")); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCR: UDP started")); #endif glob_script_mem.udp_flags.udp_connected = 1; } else { #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCRIPT UDP failed")); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_UPNP "SCR: UDP failed")); #endif glob_script_mem.udp_flags.udp_connected = 0; } @@ -1287,12 +1287,12 @@ void Script_PollUdp(void) { uint32_t res = match_vars(vnam, &fp, &sp, &index); if (res == NUM_RES) { #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR("num var found - %s - %d - %d"), vnam, res, index); + AddLog(LOG_LEVEL_DEBUG, PSTR("SCR: num var found - %s - %d - %d"), vnam, res, index); #endif *fp=CharToFloat(cp + 1); } else if (res == STR_RES) { #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR("string var found - %s - %d - %d"), vnam, res, index); + AddLog(LOG_LEVEL_DEBUG, PSTR("SCR: string var found - %s - %d - %d"), vnam, res, index); #endif strlcpy(sp, cp + 1, SCRIPT_MAXSSIZE); } else { @@ -1330,12 +1330,12 @@ void script_udp_sendvar(char *vname, TS_FLOAT *fp, char *sp) { dtostrfd(*fp, 8, flstr); strcat(sbuf, flstr); #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR("num var updated - %s"), sbuf); + AddLog(LOG_LEVEL_DEBUG, PSTR("SCR: num var updated - %s"), sbuf); #endif } else { strcat(sbuf, sp); #ifdef SCRIPT_DEBUG_UDP - AddLog(LOG_LEVEL_DEBUG, PSTR("string var updated - %s"), sbuf); + AddLog(LOG_LEVEL_DEBUG, PSTR("SCR: string var updated - %s"), sbuf); #endif } glob_script_mem.Script_PortUdp.beginPacket(IPAddress(239, 255, 255, 250), SCRIPT_UDP_PORT); @@ -2177,7 +2177,7 @@ int32_t fetch_jpg(uint32_t sel, char *url, uint32_t xp, uint32_t yp, uint32_t sc strcpy(jpg_task.boundary,cp + 1); } } else { - AddLog(LOG_LEVEL_INFO,PSTR("HTTP error %d = %s"), httpCode, jpg_task.http.errorToString(httpCode).c_str()); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: HTTP error %d = %s"), httpCode, jpg_task.http.errorToString(httpCode).c_str()); } return httpCode; break; @@ -3243,7 +3243,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); if (!glob_script_mem.file_flags[cnt].is_open) { if (mode == 0) { #ifdef DEBUG_FS - AddLog(LOG_LEVEL_INFO, PSTR("open file for read %d"), cnt); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for read %d"), cnt); #endif glob_script_mem.files[cnt] = ufsp->open(str, FS_FILE_READ); if (glob_script_mem.files[cnt].isDirectory()) { @@ -3257,12 +3257,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); if (mode == 1) { glob_script_mem.files[cnt] = ufsp->open(str,FS_FILE_WRITE); #ifdef DEBUG_FS - AddLog(LOG_LEVEL_INFO, PSTR("open file for write %d"), cnt); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for write %d"), cnt); #endif } else { glob_script_mem.files[cnt] = ufsp->open(str,FS_FILE_APPEND); #ifdef DEBUG_FS - AddLog(LOG_LEVEL_INFO, PSTR("open file for append %d"), cnt); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: open file for append %d"), cnt); #endif } } @@ -3270,7 +3270,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); fvar = cnt; glob_script_mem.file_flags[cnt].is_open = 1; } else { - AddLog(LOG_LEVEL_INFO, PSTR("file open failed")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: file open failed")); } break; } @@ -3283,7 +3283,7 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); uint8_t ind = fvar; if (ind >= SFS_MAX) ind = SFS_MAX - 1; #ifdef DEBUG_FS - AddLog(LOG_LEVEL_INFO, PSTR("closing file %d"), ind); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: closing file %d"), ind); #endif glob_script_mem.files[ind].close(); glob_script_mem.file_flags[ind].is_open = 0; @@ -4973,7 +4973,7 @@ extern char *SML_GetSVal(uint32_t index); fvar == -1; } else { if (Is_gpio_used(rxpin) || Is_gpio_used(txpin)) { - AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: warning, pins already used")); } glob_script_mem.sp = new TasmotaSerial(rxpin, txpin, 1, 0, rxbsiz); @@ -4988,7 +4988,7 @@ extern char *SML_GetSVal(uint32_t index); #ifdef ESP32 uart = glob_script_mem.sp->getUart(); #endif - AddLog(LOG_LEVEL_INFO, PSTR("Serial port set to %s %d bit/s at rx=%d tx=%d rbu=%d uart=%d"), GetSerialConfig().c_str(), (uint32_t)br, (uint32_t)rxpin, (uint32_t)txpin, (uint32_t)rxbsiz, uart); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: Serial port set to %s %d bit/s at rx=%d tx=%d rbu=%d uart=%d"), GetSerialConfig().c_str(), (uint32_t)br, (uint32_t)rxpin, (uint32_t)txpin, (uint32_t)rxbsiz, uart); Settings->serial_config = savc; if (rxpin == 3 and txpin == 1) ClaimSerial(); @@ -5328,7 +5328,7 @@ extern char *SML_GetSVal(uint32_t index); char cbuff[32]; sprintf(cbuff," - %02x%02x",modbus_response[mb_index],modbus_response[mb_index+1]); strcat(hexbuff,cbuff); - AddLog(LOG_LEVEL_INFO,PSTR(">> %s"),hexbuff); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: >> %s"),hexbuff); #endif } lp++; @@ -5382,7 +5382,7 @@ extern char *SML_GetSVal(uint32_t index); #endif // ESP32 } else { - AddLog(LOG_LEVEL_INFO, PSTR("error: spi pins not defined")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: error, spi pins not defined")); } break; } @@ -5404,7 +5404,7 @@ extern char *SML_GetSVal(uint32_t index); if (Is_gpio_used(glob_script_mem.spi.mosi) || Is_gpio_used(glob_script_mem.spi.miso) || Is_gpio_used(glob_script_mem.spi.sclk) ) { - AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: warning, pins already used")); } break; @@ -5418,7 +5418,7 @@ extern char *SML_GetSVal(uint32_t index); pinMode(glob_script_mem.spi.cs[index] , OUTPUT); digitalWrite(glob_script_mem.spi.cs[index] , 1); if (Is_gpio_used(glob_script_mem.spi.cs[index])) { - AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: warning, pins already used")); } break; @@ -7103,7 +7103,7 @@ getnext: lp = GetNumericArgument(lp + 6, OPER_EQU, &fvar, 0); int8_t pinnr = fvar; if (Is_gpio_used(pinnr)) { - AddLog(LOG_LEVEL_INFO, PSTR("warning: pins already used")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: warning, pins already used")); } SCRIPT_SKIP_SPACES uint8_t mode = 0; @@ -7297,7 +7297,7 @@ getnext: } else { if (!sflag) { tasm_cmd_activ = 1; - AddLog(glob_script_mem.script_loglevel&0x7f, PSTR("Script: performs \"%s\""), tmp); + AddLog(glob_script_mem.script_loglevel&0x7f, PSTR("SCR: performs \"%s\""), tmp); } else if (sflag == 2) { // allow recursive call } else { @@ -8329,13 +8329,13 @@ uint8_t DownloadFile(char *file) { WiFiClient download_Client; if (!ufsp->exists(file)) { - AddLog(LOG_LEVEL_INFO,PSTR("file not found")); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: file not found")); return 0; } download_file = ufsp->open(file, FS_FILE_READ); if (!download_file) { - AddLog(LOG_LEVEL_INFO,PSTR("could not open file")); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: could not open file")); return 0; } @@ -8507,14 +8507,14 @@ void ScriptSaveSettings(void) { strlcpy(glob_script_mem.script_ram, str.c_str(), glob_script_mem.script_size); if (glob_script_mem.script_ram[0]!='>' && glob_script_mem.script_ram[1]!='D') { - AddLog(LOG_LEVEL_INFO, PSTR("script error: must start with >D")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: error, must start with >D")); bitWrite(Settings->rule_enabled, 0, 0); } SaveScript(); } else { - AddLog(LOG_LEVEL_INFO, PSTR("script memory error")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: memory error")); } SaveScriptEnd(); @@ -8528,10 +8528,10 @@ uint32_t script_compress(char *dest, uint32_t size) { yield(); if (len_compressed > 0) { dest[len_compressed] = 0; - AddLog(LOG_LEVEL_INFO,PSTR("script compressed to %d bytes = %d %%"),len_compressed,len_compressed * 100 / strlen(glob_script_mem.script_ram)); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: compressed to %d bytes = %d %%"),len_compressed,len_compressed * 100 / strlen(glob_script_mem.script_ram)); return 0; } else { - AddLog(LOG_LEVEL_INFO, PSTR("script compress error: %d"), len_compressed); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: compress error %d"), len_compressed); return 1; } } @@ -8559,7 +8559,7 @@ void SaveScriptEnd(void) { int16_t res = Init_Scripter(); if (res) { - AddLog(LOG_LEVEL_INFO, PSTR("script init error: %d"), res); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: init error %d"), res); return; } @@ -8917,7 +8917,7 @@ void Script_Check_Hue(String *response) { } // append response #ifdef SCRIPT_HUE_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("Hue: %s - %d "),hue_script[hue_devs].name, hue_devs); + AddLog(LOG_LEVEL_INFO, PSTR("HUE: %s - %d "),hue_script[hue_devs].name, hue_devs); #endif if (response) { if (TasmotaGlobal.devices_present) { @@ -8930,7 +8930,7 @@ void Script_Check_Hue(String *response) { *response += String(EncodeLightId(hue_devs + TasmotaGlobal.devices_present + 1))+"\":"; Script_HueStatus(response, hue_devs); #ifdef SCRIPT_HUE_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("Hue: %s - %d "),response->c_str(), hue_devs); + AddLog(LOG_LEVEL_INFO, PSTR("HUE: %s - %d "),response->c_str(), hue_devs); #endif } hue_devs++; @@ -8945,7 +8945,7 @@ void Script_Check_Hue(String *response) { } #ifdef SCRIPT_HUE_DEBUG if (response) { - AddLog(LOG_LEVEL_INFO, PSTR("Hue: %d"), hue_devs); + AddLog(LOG_LEVEL_INFO, PSTR("HUE: %d"), hue_devs); toLog(">>>>"); toLog(response->c_str()); toLog(response->c_str()+700); // Was MAX_LOGSZ @@ -8987,8 +8987,8 @@ void Script_Handle_Hue(String path) { #endif #ifdef SCRIPT_HUE_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("Hue 0: %s - %d "),path.c_str(), device); - AddLog(LOG_LEVEL_INFO, PSTR("Hue 1: %d, %s"), args, json); + AddLog(LOG_LEVEL_INFO, PSTR("HUE: 0 %s - %d "),path.c_str(), device); + AddLog(LOG_LEVEL_INFO, PSTR("HUE: 1 %d, %s"), args, json); #endif if (Webserver->args()) { response = "["; @@ -9424,7 +9424,7 @@ bool ScriptMqttData(void) { String buData = XdrvMailbox.data; #ifdef DEBUG_MQTT_EVENT - AddLog(LOG_LEVEL_INFO, PSTR("Script: MQTT Topic %s, Event %s"), XdrvMailbox.topic, XdrvMailbox.data); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: MQTT Topic %s, Event %s"), XdrvMailbox.topic, XdrvMailbox.data); #endif MQTT_Subscription event_item; @@ -9436,7 +9436,7 @@ bool ScriptMqttData(void) { String sData = buData; #ifdef DEBUG_MQTT_EVENT - AddLog(LOG_LEVEL_INFO, PSTR("Script: Match MQTT message Topic %s with subscription topic %s and key %s"), sTopic.c_str(), event_item.Topic.c_str(),event_item.Key.c_str()); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: Match MQTT message Topic %s with subscription topic %s and key %s"), sTopic.c_str(), event_item.Topic.c_str(),event_item.Key.c_str()); #endif if (sTopic.startsWith(event_item.Topic)) { //This topic is subscribed by us, so serve it @@ -9494,7 +9494,7 @@ bool ScriptMqttData(void) { snprintf_P(sbuffer, sizeof(sbuffer), PSTR(">%s=\"%s\"\n"), event_item.Event.c_str(), value.c_str()); } #ifdef DEBUG_MQTT_EVENT - AddLog(LOG_LEVEL_INFO, PSTR("Script: setting script var %s"), sbuffer); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: setting script var %s"), sbuffer); #endif //toLog(sbuffer); execute_script(sbuffer); @@ -9657,7 +9657,7 @@ void ScriptServeFile82(void) { if (ufsp->exists(cp)) { #endif if (download82_busy == true) { - AddLog(LOG_LEVEL_INFO, PSTR("UFS 82: Download is busy")); + AddLog(LOG_LEVEL_INFO, PSTR("UFS: 82 Download is busy")); return; } download82_busy = true; @@ -9705,9 +9705,9 @@ void WebServer82Init(void) { http82_Server->on("/", HTTP_GET, Handle82Root); http82_Server->onNotFound(Handle82NotFound); http82_Server->begin(); - AddLog(LOG_LEVEL_INFO, PSTR("HTTP DL Server started on port: %d "), SCRIPT_DLPORT); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: HTTP DL Server started on port: %d "), SCRIPT_DLPORT); } else { - AddLog(LOG_LEVEL_INFO, PSTR("HTTP DL Server failed")); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: HTTP DL Server failed")); } } @@ -10573,7 +10573,7 @@ int32_t web_send_file(char mc, char *fname) { free(lbuff); return 0; } else { - AddLog(LOG_LEVEL_INFO, PSTR("WEB file %s not found"), path); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: WEB file %s not found"), path); } free(lbuff); #endif @@ -11767,7 +11767,7 @@ int32_t url2file(uint8_t fref, char *url) { } } if (httpCode < 0) { - AddLog(LOG_LEVEL_INFO,PSTR("HTTP error %d = %s"), httpCode, http.errorToString(httpCode).c_str()); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: HTTP error %d = %s"), httpCode, http.errorToString(httpCode).c_str()); } if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { WiFiClient *stream = http.getStreamPtr(); @@ -11783,7 +11783,7 @@ int32_t url2file(uint8_t fref, char *url) { uint32_t read = stream->readBytes(buff, size); glob_script_mem.files[fref].write(buff, read); len -= read; - AddLog(LOG_LEVEL_DEBUG,PSTR("HTTP read %d"), len); + AddLog(LOG_LEVEL_DEBUG,PSTR("SCR: HTTP read %d"), len); } delayMicroseconds(1); } @@ -11809,7 +11809,7 @@ int32_t http_req(char *host, char *request) { } #ifdef HTTP_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("HTTP heap %d"), ESP_getFreeHeap()); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: HTTP heap %d"), ESP_getFreeHeap()); #endif if (!mode) { @@ -11827,7 +11827,7 @@ int32_t http_req(char *host, char *request) { } #ifdef HTTP_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("HTTP RESULT %s"), http.getString().c_str()); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: HTTP RESULT %s"), http.getString().c_str()); #endif #ifdef USE_WEBSEND_RESPONSE @@ -11838,7 +11838,7 @@ int32_t http_req(char *host, char *request) { #endif #ifdef HTTP_DEBUG - AddLog(LOG_LEVEL_INFO, PSTR("HTTP MQTT BUFFER %s"), ResponseData()); + AddLog(LOG_LEVEL_INFO, PSTR("SCR: HTTP MQTT BUFFER %s"), ResponseData()); #endif // AddLog(LOG_LEVEL_INFO, PSTR("JSON %s"), wd_jstr); @@ -11964,7 +11964,7 @@ uint32_t call2https(const char *host, const char *path) { if (retry == 10) { return 2; } - AddLog(LOG_LEVEL_DEBUG,PSTR("connected")); + AddLog(LOG_LEVEL_DEBUG,PSTR("SCR: connected")); String request; @@ -12530,7 +12530,7 @@ bool Xdrv10(uint32_t function) #ifdef USE_UFILESYS if (ufs_type) { // we have a file system - AddLog(LOG_LEVEL_INFO,PSTR("UFILESYSTEM OK!")); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: ufilesystem found")); char *script; script = (char*)special_malloc(UFSYS_SIZE + 4); if (!script) break; @@ -12550,7 +12550,7 @@ bool Xdrv10(uint32_t function) // indicates scripter use no compression bitWrite(Settings->rule_once, 6, 0); } else { - AddLog(LOG_LEVEL_INFO,PSTR("UFILESYSTEM fail, using compression!")); + AddLog(LOG_LEVEL_INFO,PSTR("SCR: No ufilesystem, using compression")); int32_t len_decompressed; sprt = (char*)calloc(UNISHOXRSIZE + 8,1); if (!sprt) { break; } From 139ac367f07fd900a2891b7201b5f51d5454111f Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:25:05 +0200 Subject: [PATCH 028/150] Add support for energy dummy relays Add support for energy dummy relays using SO48 --- tasmota/include/tasmota.h | 2 +- tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino | 2 +- tools/decode-status.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index e49193ec4..9eae7a409 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -408,7 +408,7 @@ enum SO32_49Index { P_HOLD_TIME, // SetOption32 - (Button/Switch) K P_BISTABLE_PULSE, // SetOption45 - (Bistable) Pulse time for two coil bistable latching relays (default 40) P_POWER_ON_DELAY, // SetOption46 - (PowerOn) Add delay of 10 x value milliseconds at power on P_POWER_ON_DELAY2, // SetOption47 - (PowerOn) Add delay of value seconds at power on before activating relays - P_SO48_FREE, // SetOption48 + P_DUMMY_RELAYS, // SetOption48 - (Energy) Support energy dummy relays P_SO49_FREE // SetOption49 }; // Max is PARAM8_SIZE (18) - SetOption32 until SetOption49 diff --git a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino index 1f6735f3e..7fe78946f 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_30_dummy.ino @@ -150,7 +150,7 @@ bool NrgDummyCommand(void) { } void NrgDummyDrvInit(void) { - uint32_t phase_count = (Energy->phase_count_virtual > 0) ? Energy->phase_count_virtual : TasmotaGlobal.devices_present; + uint32_t phase_count = (Settings->param[P_DUMMY_RELAYS] > 0) ? Settings->param[P_DUMMY_RELAYS] : TasmotaGlobal.devices_present; // SetOption48 - (Energy) Support energy dummy relays if (TasmotaGlobal.gpio_optiona.dummy_energy && phase_count) { Energy->phase_count = (phase_count < ENERGY_MAX_PHASES) ? phase_count : ENERGY_MAX_PHASES; diff --git a/tools/decode-status.py b/tools/decode-status.py index 78bc8feb7..5e68116b5 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -99,7 +99,7 @@ a_setoption = [[ "(Bistable) Pulse time in milliseconds for two coil bistable latching relays (default 40)", "(PowerOn) Add delay of 10 x value milliseconds at power on", "(PowerOn) Add delay of value seconds at power on before activating relays", - "(not used) Energy Tariff2 start hour", + "(Energy) Support energy dummy relays", "", ],[ "(Timers) Enabled", @@ -325,7 +325,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v12.5.0.3 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v13.0.0.1 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 85aed3a17de1cb74d3f147d51a7fa5cfecb713a7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 1 Jul 2023 14:31:03 +0200 Subject: [PATCH 029/150] Remove phase_count_virtual --- tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino | 1 - tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino | 1 - tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino | 9 ++++----- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino index 66fb190e1..ffe80ba22 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_energy.ino @@ -109,7 +109,6 @@ typedef struct { uint8_t data_valid[ENERGY_MAX_PHASES]; uint8_t phase_count; // Number of phases active - uint8_t phase_count_virtual; // Number of virtual relays bool voltage_common; // Use common voltage bool frequency_common; // Use common frequency bool use_overtemp; // Use global temperature as overtemp trigger on internal energy monitor hardware diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index d37de61b8..7662bc5af 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -173,7 +173,6 @@ typedef struct { uint8_t data_valid[ENERGY_MAX_PHASES]; uint8_t phase_count; // Number of phases active - uint8_t phase_count_virtual; // Number of virtual relays uint8_t fifth_second; uint8_t command_code; uint8_t power_steady_counter; // Allow for power on stabilization diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino index 3b3fa33a1..e29037ae0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino @@ -33,15 +33,15 @@ extern "C" { #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winvalid-offsetof" // avoid warnings since we're using offsetof() in a risky way - + static const char * be_ctypes_instance_mappings[] = { NULL - }; + }; extern "C" const be_ctypes_structure_t be_energy_struct = { sizeof(tEnergy), /* size in bytes */ - 89, /* number of elements */ + 88, /* number of elements */ be_ctypes_instance_mappings, - (const be_ctypes_structure_item_t[89]) { + (const be_ctypes_structure_item_t[88]) { { "active_power", offsetof(tEnergy, active_power[0]), 0, 0, ctypes_float, 0 }, { "active_power_2", offsetof(tEnergy, active_power[1]), 0, 0, ctypes_float, 0 }, { "active_power_3", offsetof(tEnergy, active_power[2]), 0, 0, ctypes_float, 0 }, @@ -88,7 +88,6 @@ extern "C" { { "period_2", offsetof(tEnergy, period_kWh[1]), 0, 0, ctypes_float, 0 }, { "period_3", offsetof(tEnergy, period_kWh[2]), 0, 0, ctypes_float, 0 }, { "phase_count", offsetof(tEnergy, phase_count), 0, 0, ctypes_u8, 0 }, - { "phase_count_virtual", offsetof(tEnergy, phase_count_virtual), 0, 0, ctypes_u8, 0 }, { "power_factor", offsetof(tEnergy, power_factor[0]), 0, 0, ctypes_float, 0 }, { "power_factor_2", offsetof(tEnergy, power_factor[1]), 0, 0, ctypes_float, 0 }, { "power_factor_3", offsetof(tEnergy, power_factor[2]), 0, 0, ctypes_float, 0 }, From 7cd2d78b2611e5b03e6f5b43ea3a276995b262a2 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 2 Jul 2023 20:12:40 +0200 Subject: [PATCH 030/150] Matter no Ack for Invoke Request (#19012) --- .../berry_matter/src/embedded/Matter_IM.be | 5 +- .../src/embedded/Matter_MessageHandler.be | 2 +- .../berry_matter/src/embedded/Matter_Path.be | 13 + .../src/embedded/Matter_Plugin.be | 5 + .../src/embedded/Matter_Plugin_Root.be | 2 + .../src/solidify/solidified_Matter_IM.h | 877 +++++----- .../solidified_Matter_MessageHandler.h | 2 +- .../src/solidify/solidified_Matter_Path.h | 58 +- .../src/solidify/solidified_Matter_Plugin.h | 1300 +++++++-------- .../solidify/solidified_Matter_Plugin_Root.h | 1444 +++++++++-------- 10 files changed, 1911 insertions(+), 1797 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index a68dcc902..94232d40a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -66,7 +66,7 @@ class Matter_IM elif opcode == 0x07 # Write Response return self.process_write_response(msg, val) elif opcode == 0x08 # Invoke Request - self.send_ack_now(msg) + # self.send_ack_now(msg) # to improve latency, we don't automatically Ack on invoke request return self.process_invoke_request(msg, val) elif opcode == 0x09 # Invoke Response return self.process_invoke_response(msg, val) @@ -97,6 +97,7 @@ class Matter_IM # # returns `true` if packet could be sent def send_ack_now(msg) + if msg == nil return end msg.session._message_handler.send_encrypted_ack(msg, false #-not reliable-#) end @@ -355,6 +356,7 @@ class Matter_IM # expand a string with all attributes requested var attr_req = [] var ctx = matter.Path() + ctx.msg = msg for q:query.attributes_requests ctx.endpoint = q.endpoint ctx.cluster = q.cluster @@ -381,6 +383,7 @@ class Matter_IM # structure is `ReadRequestMessage` 10.6.2 p.558 # tasmota.log("MTR: IM:invoke_request processing start", 4) var ctx = matter.Path() + ctx.msg = msg var query = matter.InvokeRequestMessage().from_TLV(val) if query.invoke_requests != nil diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be index e611a2f4e..33ae1b95a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be @@ -138,7 +138,7 @@ class Matter_MessageHandler # check if it's a duplicate if !session.counter_rcv_validate(frame.message_counter, true) - tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 4) + tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3) self.send_encrypted_ack(frame, false #-not reliable-#) return false end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be index 982bb3336..e9fe1d130 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be @@ -33,6 +33,19 @@ class Matter_Path var command # command var status # status to be returned (matter.SUCCESS or matter.) var log # any string that needs to be logged (used to show significant parameters for commands) + var msg # reference of the original message + + # clear the context, allows reuse of the same object + def clear() + var n = nil + self.endpoint = n + self.cluster = n + self.attribute = n + self.command = n + self.status = n + self.log = n + self.msh = n + end def tostring() try diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 31348e9f7..4babaaba8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -63,6 +63,11 @@ class Matter_Plugin self.parse_configuration(config) end + # proxy for the same method in IM + def send_ack_now(msg) + self.device.message_handler.im.send_ack_now(msg) + end + ############################################################# # parse_configuration # diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 49b9d7aef..bd9d46a4b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -368,6 +368,7 @@ class Matter_Plugin_Root : Matter_Plugin return srcr elif command == 0x0004 # ---------- CommissioningComplete p.636 ---------- + self.send_ack_now(ctx.msg) # long operation, send Ack first # no data if session._fabric session._breadcrumb = 0 # clear breadcrumb @@ -435,6 +436,7 @@ class Matter_Plugin_Root : Matter_Plugin return ar elif command == 0x0004 # ---------- CSRRequest ---------- + self.send_ack_now(ctx.msg) # long operation, send Ack first var CSRNonce = val.findsubval(0) # octstr 32 if size(CSRNonce) != 32 return nil end # check size on nonce var IsForUpdateNOC = val.findsubval(1, false) # bool diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index c6fed00fd..8133aa511 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -75,329 +75,331 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[43]) { /* constants */ + ( &(const bvalue[44]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(InvokeRequestMessage), - /* K3 */ be_nested_str_weak(from_TLV), - /* K4 */ be_nested_str_weak(invoke_requests), - /* K5 */ be_nested_str_weak(InvokeResponseMessage), - /* K6 */ be_nested_str_weak(suppress_response), - /* K7 */ be_nested_str_weak(invoke_responses), - /* K8 */ be_nested_str_weak(endpoint), - /* K9 */ be_nested_str_weak(command_path), - /* K10 */ be_nested_str_weak(cluster), - /* K11 */ be_nested_str_weak(command), - /* K12 */ be_nested_str_weak(status), - /* K13 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K14 */ be_nested_str_weak(get_command_name), - /* K15 */ be_nested_str_weak(device), - /* K16 */ be_nested_str_weak(invoke_request), - /* K17 */ be_nested_str_weak(session), - /* K18 */ be_nested_str_weak(command_fields), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(_X28), - /* K21 */ be_nested_str_weak(_X29_X20), - /* K22 */ be_nested_str_weak(), - /* K23 */ be_nested_str_weak(tasmota), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), - /* K25 */ be_nested_str_weak(local_session_id), - /* K26 */ be_const_int(0), - /* K27 */ be_const_int(2), - /* K28 */ be_const_int(3), - /* K29 */ be_nested_str_weak(InvokeResponseIB), - /* K30 */ be_nested_str_weak(SUCCESS), - /* K31 */ be_nested_str_weak(CommandStatusIB), - /* K32 */ be_nested_str_weak(CommandPathIB), - /* K33 */ be_nested_str_weak(StatusIB), - /* K34 */ be_nested_str_weak(push), - /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K36 */ be_nested_str_weak(exchange_id), - /* K37 */ be_nested_str_weak(CommandDataIB), - /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K40 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K41 */ be_nested_str_weak(stop_iteration), - /* K42 */ be_nested_str_weak(send_invoke_response), + /* K2 */ be_nested_str_weak(msg), + /* K3 */ be_nested_str_weak(InvokeRequestMessage), + /* K4 */ be_nested_str_weak(from_TLV), + /* K5 */ be_nested_str_weak(invoke_requests), + /* K6 */ be_nested_str_weak(InvokeResponseMessage), + /* K7 */ be_nested_str_weak(suppress_response), + /* K8 */ be_nested_str_weak(invoke_responses), + /* K9 */ be_nested_str_weak(endpoint), + /* K10 */ be_nested_str_weak(command_path), + /* K11 */ be_nested_str_weak(cluster), + /* K12 */ be_nested_str_weak(command), + /* K13 */ be_nested_str_weak(status), + /* K14 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K15 */ be_nested_str_weak(get_command_name), + /* K16 */ be_nested_str_weak(device), + /* K17 */ be_nested_str_weak(invoke_request), + /* K18 */ be_nested_str_weak(session), + /* K19 */ be_nested_str_weak(command_fields), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(_X28), + /* K22 */ be_nested_str_weak(_X29_X20), + /* K23 */ be_nested_str_weak(), + /* K24 */ be_nested_str_weak(tasmota), + /* K25 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), + /* K26 */ be_nested_str_weak(local_session_id), + /* K27 */ be_const_int(0), + /* K28 */ be_const_int(2), + /* K29 */ be_const_int(3), + /* K30 */ be_nested_str_weak(InvokeResponseIB), + /* K31 */ be_nested_str_weak(SUCCESS), + /* K32 */ be_nested_str_weak(CommandStatusIB), + /* K33 */ be_nested_str_weak(CommandPathIB), + /* K34 */ be_nested_str_weak(StatusIB), + /* K35 */ be_nested_str_weak(push), + /* K36 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K37 */ be_nested_str_weak(exchange_id), + /* K38 */ be_nested_str_weak(CommandDataIB), + /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K41 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K42 */ be_nested_str_weak(stop_iteration), + /* K43 */ be_nested_str_weak(send_invoke_response), }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[275]) { /* code */ + ( &(const binstruction[276]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x8C0C0701, // 0001 GETMET R3 R3 K1 0x7C0C0200, // 0002 CALL R3 1 - 0xB8120000, // 0003 GETNGBL R4 K0 - 0x8C100902, // 0004 GETMET R4 R4 K2 - 0x7C100200, // 0005 CALL R4 1 - 0x8C100903, // 0006 GETMET R4 R4 K3 - 0x5C180400, // 0007 MOVE R6 R2 - 0x7C100400, // 0008 CALL R4 2 - 0x88140904, // 0009 GETMBR R5 R4 K4 - 0x4C180000, // 000A LDNIL R6 - 0x20140A06, // 000B NE R5 R5 R6 - 0x78160104, // 000C JMPF R5 #0112 - 0xB8160000, // 000D GETNGBL R5 K0 - 0x8C140B05, // 000E GETMET R5 R5 K5 - 0x7C140200, // 000F CALL R5 1 - 0x50180000, // 0010 LDBOOL R6 0 0 - 0x90160C06, // 0011 SETMBR R5 K6 R6 - 0x60180012, // 0012 GETGBL R6 G18 - 0x7C180000, // 0013 CALL R6 0 - 0x90160E06, // 0014 SETMBR R5 K7 R6 - 0x60180010, // 0015 GETGBL R6 G16 - 0x881C0904, // 0016 GETMBR R7 R4 K4 - 0x7C180200, // 0017 CALL R6 1 - 0xA80200E7, // 0018 EXBLK 0 #0101 - 0x5C1C0C00, // 0019 MOVE R7 R6 - 0x7C1C0000, // 001A CALL R7 0 - 0x88200F09, // 001B GETMBR R8 R7 K9 - 0x88201108, // 001C GETMBR R8 R8 K8 - 0x900E1008, // 001D SETMBR R3 K8 R8 - 0x88200F09, // 001E GETMBR R8 R7 K9 - 0x8820110A, // 001F GETMBR R8 R8 K10 - 0x900E1408, // 0020 SETMBR R3 K10 R8 - 0x88200F09, // 0021 GETMBR R8 R7 K9 - 0x8820110B, // 0022 GETMBR R8 R8 K11 - 0x900E1608, // 0023 SETMBR R3 K11 R8 - 0xB8220000, // 0024 GETNGBL R8 K0 - 0x8820110D, // 0025 GETMBR R8 R8 K13 - 0x900E1808, // 0026 SETMBR R3 K12 R8 - 0xB8220000, // 0027 GETNGBL R8 K0 - 0x8C20110E, // 0028 GETMET R8 R8 K14 - 0x8828070A, // 0029 GETMBR R10 R3 K10 - 0x882C070B, // 002A GETMBR R11 R3 K11 - 0x7C200600, // 002B CALL R8 3 - 0x60240008, // 002C GETGBL R9 G8 - 0x5C280600, // 002D MOVE R10 R3 - 0x7C240200, // 002E CALL R9 1 - 0x8828010F, // 002F GETMBR R10 R0 K15 - 0x8C281510, // 0030 GETMET R10 R10 K16 - 0x88300311, // 0031 GETMBR R12 R1 K17 - 0x88340F12, // 0032 GETMBR R13 R7 K18 - 0x5C380600, // 0033 MOVE R14 R3 - 0x7C280800, // 0034 CALL R10 4 - 0x882C0713, // 0035 GETMBR R11 R3 K19 - 0x4C300000, // 0036 LDNIL R12 - 0x202C160C, // 0037 NE R11 R11 R12 - 0x782E0005, // 0038 JMPF R11 #003F - 0x602C0008, // 0039 GETGBL R11 G8 - 0x88300713, // 003A GETMBR R12 R3 K19 - 0x7C2C0200, // 003B CALL R11 1 - 0x002E280B, // 003C ADD R11 K20 R11 - 0x002C1715, // 003D ADD R11 R11 K21 - 0x70020000, // 003E JMP #0040 - 0x582C0016, // 003F LDCONST R11 K22 - 0xB8322E00, // 0040 GETNGBL R12 K23 - 0x8C301913, // 0041 GETMET R12 R12 K19 - 0x60380018, // 0042 GETGBL R14 G24 - 0x583C0018, // 0043 LDCONST R15 K24 - 0x88400311, // 0044 GETMBR R16 R1 K17 - 0x88402119, // 0045 GETMBR R16 R16 K25 - 0x5C441200, // 0046 MOVE R17 R9 - 0x78220001, // 0047 JMPF R8 #004A - 0x5C481000, // 0048 MOVE R18 R8 - 0x70020000, // 0049 JMP #004B - 0x58480016, // 004A LDCONST R18 K22 - 0x5C4C1600, // 004B MOVE R19 R11 - 0x7C380A00, // 004C CALL R14 5 - 0x883C0708, // 004D GETMBR R15 R3 K8 - 0x203C1F1A, // 004E NE R15 R15 K26 - 0x783E0001, // 004F JMPF R15 #0052 - 0x583C001B, // 0050 LDCONST R15 K27 - 0x70020000, // 0051 JMP #0053 - 0x583C001C, // 0052 LDCONST R15 K28 - 0x7C300600, // 0053 CALL R12 3 - 0x4C300000, // 0054 LDNIL R12 - 0x900E260C, // 0055 SETMBR R3 K19 R12 - 0xB8320000, // 0056 GETNGBL R12 K0 - 0x8C30191D, // 0057 GETMET R12 R12 K29 - 0x7C300200, // 0058 CALL R12 1 - 0x50340200, // 0059 LDBOOL R13 1 0 - 0x1C34140D, // 005A EQ R13 R10 R13 - 0x74360004, // 005B JMPT R13 #0061 - 0x8834070C, // 005C GETMBR R13 R3 K12 - 0xB83A0000, // 005D GETNGBL R14 K0 - 0x88381D1E, // 005E GETMBR R14 R14 K30 - 0x1C341A0E, // 005F EQ R13 R13 R14 - 0x7836002D, // 0060 JMPF R13 #008F - 0xB8360000, // 0061 GETNGBL R13 K0 - 0x8C341B1F, // 0062 GETMET R13 R13 K31 - 0x7C340200, // 0063 CALL R13 1 - 0x9032180D, // 0064 SETMBR R12 K12 R13 - 0x8834190C, // 0065 GETMBR R13 R12 K12 - 0xB83A0000, // 0066 GETNGBL R14 K0 - 0x8C381D20, // 0067 GETMET R14 R14 K32 - 0x7C380200, // 0068 CALL R14 1 - 0x9036120E, // 0069 SETMBR R13 K9 R14 - 0x8834190C, // 006A GETMBR R13 R12 K12 - 0x88341B09, // 006B GETMBR R13 R13 K9 - 0x88380708, // 006C GETMBR R14 R3 K8 - 0x9036100E, // 006D SETMBR R13 K8 R14 - 0x8834190C, // 006E GETMBR R13 R12 K12 - 0x88341B09, // 006F GETMBR R13 R13 K9 - 0x8838070A, // 0070 GETMBR R14 R3 K10 - 0x9036140E, // 0071 SETMBR R13 K10 R14 - 0x8834190C, // 0072 GETMBR R13 R12 K12 - 0x88341B09, // 0073 GETMBR R13 R13 K9 - 0x8838070B, // 0074 GETMBR R14 R3 K11 - 0x9036160E, // 0075 SETMBR R13 K11 R14 - 0x8834190C, // 0076 GETMBR R13 R12 K12 - 0xB83A0000, // 0077 GETNGBL R14 K0 - 0x8C381D21, // 0078 GETMET R14 R14 K33 - 0x7C380200, // 0079 CALL R14 1 - 0x9036180E, // 007A SETMBR R13 K12 R14 - 0x8834190C, // 007B GETMBR R13 R12 K12 - 0x88341B0C, // 007C GETMBR R13 R13 K12 - 0xB83A0000, // 007D GETNGBL R14 K0 - 0x88381D1E, // 007E GETMBR R14 R14 K30 - 0x9036180E, // 007F SETMBR R13 K12 R14 - 0x88340B07, // 0080 GETMBR R13 R5 K7 - 0x8C341B22, // 0081 GETMET R13 R13 K34 - 0x5C3C1800, // 0082 MOVE R15 R12 - 0x7C340400, // 0083 CALL R13 2 - 0xB8362E00, // 0084 GETNGBL R13 K23 - 0x8C341B13, // 0085 GETMET R13 R13 K19 - 0x603C0018, // 0086 GETGBL R15 G24 - 0x58400023, // 0087 LDCONST R16 K35 - 0x88440311, // 0088 GETMBR R17 R1 K17 - 0x88442319, // 0089 GETMBR R17 R17 K25 - 0x88480324, // 008A GETMBR R18 R1 K36 - 0x7C3C0600, // 008B CALL R15 3 - 0x5840001C, // 008C LDCONST R16 K28 - 0x7C340600, // 008D CALL R13 3 - 0x70020070, // 008E JMP #0100 - 0x4C340000, // 008F LDNIL R13 - 0x2034140D, // 0090 NE R13 R10 R13 - 0x78360031, // 0091 JMPF R13 #00C4 - 0xB8360000, // 0092 GETNGBL R13 K0 - 0x8C341B25, // 0093 GETMET R13 R13 K37 - 0x7C340200, // 0094 CALL R13 1 - 0x9032160D, // 0095 SETMBR R12 K11 R13 - 0x8834190B, // 0096 GETMBR R13 R12 K11 - 0xB83A0000, // 0097 GETNGBL R14 K0 - 0x8C381D20, // 0098 GETMET R14 R14 K32 - 0x7C380200, // 0099 CALL R14 1 - 0x9036120E, // 009A SETMBR R13 K9 R14 - 0x8834190B, // 009B GETMBR R13 R12 K11 - 0x88341B09, // 009C GETMBR R13 R13 K9 - 0x88380708, // 009D GETMBR R14 R3 K8 - 0x9036100E, // 009E SETMBR R13 K8 R14 - 0x8834190B, // 009F GETMBR R13 R12 K11 - 0x88341B09, // 00A0 GETMBR R13 R13 K9 - 0x8838070A, // 00A1 GETMBR R14 R3 K10 - 0x9036140E, // 00A2 SETMBR R13 K10 R14 - 0x8834190B, // 00A3 GETMBR R13 R12 K11 - 0x88341B09, // 00A4 GETMBR R13 R13 K9 - 0x8838070B, // 00A5 GETMBR R14 R3 K11 - 0x9036160E, // 00A6 SETMBR R13 K11 R14 - 0x8834190B, // 00A7 GETMBR R13 R12 K11 - 0x9036240A, // 00A8 SETMBR R13 K18 R10 - 0x88340B07, // 00A9 GETMBR R13 R5 K7 - 0x8C341B22, // 00AA GETMET R13 R13 K34 - 0x5C3C1800, // 00AB MOVE R15 R12 - 0x7C340400, // 00AC CALL R13 2 - 0xB8360000, // 00AD GETNGBL R13 K0 - 0x8C341B0E, // 00AE GETMET R13 R13 K14 - 0x883C070A, // 00AF GETMBR R15 R3 K10 - 0x8840070B, // 00B0 GETMBR R16 R3 K11 - 0x7C340600, // 00B1 CALL R13 3 - 0x5C201A00, // 00B2 MOVE R8 R13 - 0xB8362E00, // 00B3 GETNGBL R13 K23 - 0x8C341B13, // 00B4 GETMET R13 R13 K19 - 0x603C0018, // 00B5 GETGBL R15 G24 - 0x58400026, // 00B6 LDCONST R16 K38 - 0x88440311, // 00B7 GETMBR R17 R1 K17 - 0x88442319, // 00B8 GETMBR R17 R17 K25 - 0x60480008, // 00B9 GETGBL R18 G8 - 0x5C4C0600, // 00BA MOVE R19 R3 - 0x7C480200, // 00BB CALL R18 1 - 0x78220001, // 00BC JMPF R8 #00BF - 0x5C4C1000, // 00BD MOVE R19 R8 - 0x70020000, // 00BE JMP #00C0 - 0x584C0016, // 00BF LDCONST R19 K22 - 0x7C3C0800, // 00C0 CALL R15 4 - 0x5840001C, // 00C1 LDCONST R16 K28 - 0x7C340600, // 00C2 CALL R13 3 - 0x7002003B, // 00C3 JMP #0100 - 0x8834070C, // 00C4 GETMBR R13 R3 K12 - 0x4C380000, // 00C5 LDNIL R14 - 0x20341A0E, // 00C6 NE R13 R13 R14 - 0x7836002D, // 00C7 JMPF R13 #00F6 - 0xB8360000, // 00C8 GETNGBL R13 K0 - 0x8C341B1F, // 00C9 GETMET R13 R13 K31 - 0x7C340200, // 00CA CALL R13 1 - 0x9032180D, // 00CB SETMBR R12 K12 R13 - 0x8834190C, // 00CC GETMBR R13 R12 K12 - 0xB83A0000, // 00CD GETNGBL R14 K0 - 0x8C381D20, // 00CE GETMET R14 R14 K32 - 0x7C380200, // 00CF CALL R14 1 - 0x9036120E, // 00D0 SETMBR R13 K9 R14 - 0x8834190C, // 00D1 GETMBR R13 R12 K12 - 0x88341B09, // 00D2 GETMBR R13 R13 K9 - 0x88380708, // 00D3 GETMBR R14 R3 K8 - 0x9036100E, // 00D4 SETMBR R13 K8 R14 - 0x8834190C, // 00D5 GETMBR R13 R12 K12 - 0x88341B09, // 00D6 GETMBR R13 R13 K9 - 0x8838070A, // 00D7 GETMBR R14 R3 K10 - 0x9036140E, // 00D8 SETMBR R13 K10 R14 - 0x8834190C, // 00D9 GETMBR R13 R12 K12 - 0x88341B09, // 00DA GETMBR R13 R13 K9 - 0x8838070B, // 00DB GETMBR R14 R3 K11 - 0x9036160E, // 00DC SETMBR R13 K11 R14 - 0x8834190C, // 00DD GETMBR R13 R12 K12 - 0xB83A0000, // 00DE GETNGBL R14 K0 - 0x8C381D21, // 00DF GETMET R14 R14 K33 - 0x7C380200, // 00E0 CALL R14 1 - 0x9036180E, // 00E1 SETMBR R13 K12 R14 - 0x8834190C, // 00E2 GETMBR R13 R12 K12 - 0x88341B0C, // 00E3 GETMBR R13 R13 K12 - 0x8838070C, // 00E4 GETMBR R14 R3 K12 - 0x9036180E, // 00E5 SETMBR R13 K12 R14 - 0x88340B07, // 00E6 GETMBR R13 R5 K7 - 0x8C341B22, // 00E7 GETMET R13 R13 K34 - 0x5C3C1800, // 00E8 MOVE R15 R12 - 0x7C340400, // 00E9 CALL R13 2 - 0xB8362E00, // 00EA GETNGBL R13 K23 - 0x8C341B13, // 00EB GETMET R13 R13 K19 - 0x603C0018, // 00EC GETGBL R15 G24 - 0x58400027, // 00ED LDCONST R16 K39 - 0x88440311, // 00EE GETMBR R17 R1 K17 - 0x88442319, // 00EF GETMBR R17 R17 K25 - 0x8848070C, // 00F0 GETMBR R18 R3 K12 - 0x884C0324, // 00F1 GETMBR R19 R1 K36 - 0x7C3C0800, // 00F2 CALL R15 4 - 0x5840001C, // 00F3 LDCONST R16 K28 - 0x7C340600, // 00F4 CALL R13 3 - 0x70020009, // 00F5 JMP #0100 - 0xB8362E00, // 00F6 GETNGBL R13 K23 - 0x8C341B13, // 00F7 GETMET R13 R13 K19 - 0x603C0018, // 00F8 GETGBL R15 G24 - 0x58400028, // 00F9 LDCONST R16 K40 - 0x88440311, // 00FA GETMBR R17 R1 K17 - 0x88442319, // 00FB GETMBR R17 R17 K25 - 0x88480324, // 00FC GETMBR R18 R1 K36 - 0x7C3C0600, // 00FD CALL R15 3 - 0x5840001C, // 00FE LDCONST R16 K28 - 0x7C340600, // 00FF CALL R13 3 - 0x7001FF17, // 0100 JMP #0019 - 0x58180029, // 0101 LDCONST R6 K41 - 0xAC180200, // 0102 CATCH R6 1 0 - 0xB0080000, // 0103 RAISE 2 R0 R0 - 0x6018000C, // 0104 GETGBL R6 G12 - 0x881C0B07, // 0105 GETMBR R7 R5 K7 - 0x7C180200, // 0106 CALL R6 1 - 0x24180D1A, // 0107 GT R6 R6 K26 - 0x781A0004, // 0108 JMPF R6 #010E - 0x8C18012A, // 0109 GETMET R6 R0 K42 - 0x5C200200, // 010A MOVE R8 R1 - 0x5C240A00, // 010B MOVE R9 R5 - 0x7C180600, // 010C CALL R6 3 - 0x70020001, // 010D JMP #0110 - 0x50180000, // 010E LDBOOL R6 0 0 - 0x80040C00, // 010F RET 1 R6 - 0x50180200, // 0110 LDBOOL R6 1 0 - 0x80040C00, // 0111 RET 1 R6 - 0x80000000, // 0112 RET 0 + 0x900E0401, // 0003 SETMBR R3 K2 R1 + 0xB8120000, // 0004 GETNGBL R4 K0 + 0x8C100903, // 0005 GETMET R4 R4 K3 + 0x7C100200, // 0006 CALL R4 1 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x5C180400, // 0008 MOVE R6 R2 + 0x7C100400, // 0009 CALL R4 2 + 0x88140905, // 000A GETMBR R5 R4 K5 + 0x4C180000, // 000B LDNIL R6 + 0x20140A06, // 000C NE R5 R5 R6 + 0x78160104, // 000D JMPF R5 #0113 + 0xB8160000, // 000E GETNGBL R5 K0 + 0x8C140B06, // 000F GETMET R5 R5 K6 + 0x7C140200, // 0010 CALL R5 1 + 0x50180000, // 0011 LDBOOL R6 0 0 + 0x90160E06, // 0012 SETMBR R5 K7 R6 + 0x60180012, // 0013 GETGBL R6 G18 + 0x7C180000, // 0014 CALL R6 0 + 0x90161006, // 0015 SETMBR R5 K8 R6 + 0x60180010, // 0016 GETGBL R6 G16 + 0x881C0905, // 0017 GETMBR R7 R4 K5 + 0x7C180200, // 0018 CALL R6 1 + 0xA80200E7, // 0019 EXBLK 0 #0102 + 0x5C1C0C00, // 001A MOVE R7 R6 + 0x7C1C0000, // 001B CALL R7 0 + 0x88200F0A, // 001C GETMBR R8 R7 K10 + 0x88201109, // 001D GETMBR R8 R8 K9 + 0x900E1208, // 001E SETMBR R3 K9 R8 + 0x88200F0A, // 001F GETMBR R8 R7 K10 + 0x8820110B, // 0020 GETMBR R8 R8 K11 + 0x900E1608, // 0021 SETMBR R3 K11 R8 + 0x88200F0A, // 0022 GETMBR R8 R7 K10 + 0x8820110C, // 0023 GETMBR R8 R8 K12 + 0x900E1808, // 0024 SETMBR R3 K12 R8 + 0xB8220000, // 0025 GETNGBL R8 K0 + 0x8820110E, // 0026 GETMBR R8 R8 K14 + 0x900E1A08, // 0027 SETMBR R3 K13 R8 + 0xB8220000, // 0028 GETNGBL R8 K0 + 0x8C20110F, // 0029 GETMET R8 R8 K15 + 0x8828070B, // 002A GETMBR R10 R3 K11 + 0x882C070C, // 002B GETMBR R11 R3 K12 + 0x7C200600, // 002C CALL R8 3 + 0x60240008, // 002D GETGBL R9 G8 + 0x5C280600, // 002E MOVE R10 R3 + 0x7C240200, // 002F CALL R9 1 + 0x88280110, // 0030 GETMBR R10 R0 K16 + 0x8C281511, // 0031 GETMET R10 R10 K17 + 0x88300312, // 0032 GETMBR R12 R1 K18 + 0x88340F13, // 0033 GETMBR R13 R7 K19 + 0x5C380600, // 0034 MOVE R14 R3 + 0x7C280800, // 0035 CALL R10 4 + 0x882C0714, // 0036 GETMBR R11 R3 K20 + 0x4C300000, // 0037 LDNIL R12 + 0x202C160C, // 0038 NE R11 R11 R12 + 0x782E0005, // 0039 JMPF R11 #0040 + 0x602C0008, // 003A GETGBL R11 G8 + 0x88300714, // 003B GETMBR R12 R3 K20 + 0x7C2C0200, // 003C CALL R11 1 + 0x002E2A0B, // 003D ADD R11 K21 R11 + 0x002C1716, // 003E ADD R11 R11 K22 + 0x70020000, // 003F JMP #0041 + 0x582C0017, // 0040 LDCONST R11 K23 + 0xB8323000, // 0041 GETNGBL R12 K24 + 0x8C301914, // 0042 GETMET R12 R12 K20 + 0x60380018, // 0043 GETGBL R14 G24 + 0x583C0019, // 0044 LDCONST R15 K25 + 0x88400312, // 0045 GETMBR R16 R1 K18 + 0x8840211A, // 0046 GETMBR R16 R16 K26 + 0x5C441200, // 0047 MOVE R17 R9 + 0x78220001, // 0048 JMPF R8 #004B + 0x5C481000, // 0049 MOVE R18 R8 + 0x70020000, // 004A JMP #004C + 0x58480017, // 004B LDCONST R18 K23 + 0x5C4C1600, // 004C MOVE R19 R11 + 0x7C380A00, // 004D CALL R14 5 + 0x883C0709, // 004E GETMBR R15 R3 K9 + 0x203C1F1B, // 004F NE R15 R15 K27 + 0x783E0001, // 0050 JMPF R15 #0053 + 0x583C001C, // 0051 LDCONST R15 K28 + 0x70020000, // 0052 JMP #0054 + 0x583C001D, // 0053 LDCONST R15 K29 + 0x7C300600, // 0054 CALL R12 3 + 0x4C300000, // 0055 LDNIL R12 + 0x900E280C, // 0056 SETMBR R3 K20 R12 + 0xB8320000, // 0057 GETNGBL R12 K0 + 0x8C30191E, // 0058 GETMET R12 R12 K30 + 0x7C300200, // 0059 CALL R12 1 + 0x50340200, // 005A LDBOOL R13 1 0 + 0x1C34140D, // 005B EQ R13 R10 R13 + 0x74360004, // 005C JMPT R13 #0062 + 0x8834070D, // 005D GETMBR R13 R3 K13 + 0xB83A0000, // 005E GETNGBL R14 K0 + 0x88381D1F, // 005F GETMBR R14 R14 K31 + 0x1C341A0E, // 0060 EQ R13 R13 R14 + 0x7836002D, // 0061 JMPF R13 #0090 + 0xB8360000, // 0062 GETNGBL R13 K0 + 0x8C341B20, // 0063 GETMET R13 R13 K32 + 0x7C340200, // 0064 CALL R13 1 + 0x90321A0D, // 0065 SETMBR R12 K13 R13 + 0x8834190D, // 0066 GETMBR R13 R12 K13 + 0xB83A0000, // 0067 GETNGBL R14 K0 + 0x8C381D21, // 0068 GETMET R14 R14 K33 + 0x7C380200, // 0069 CALL R14 1 + 0x9036140E, // 006A SETMBR R13 K10 R14 + 0x8834190D, // 006B GETMBR R13 R12 K13 + 0x88341B0A, // 006C GETMBR R13 R13 K10 + 0x88380709, // 006D GETMBR R14 R3 K9 + 0x9036120E, // 006E SETMBR R13 K9 R14 + 0x8834190D, // 006F GETMBR R13 R12 K13 + 0x88341B0A, // 0070 GETMBR R13 R13 K10 + 0x8838070B, // 0071 GETMBR R14 R3 K11 + 0x9036160E, // 0072 SETMBR R13 K11 R14 + 0x8834190D, // 0073 GETMBR R13 R12 K13 + 0x88341B0A, // 0074 GETMBR R13 R13 K10 + 0x8838070C, // 0075 GETMBR R14 R3 K12 + 0x9036180E, // 0076 SETMBR R13 K12 R14 + 0x8834190D, // 0077 GETMBR R13 R12 K13 + 0xB83A0000, // 0078 GETNGBL R14 K0 + 0x8C381D22, // 0079 GETMET R14 R14 K34 + 0x7C380200, // 007A CALL R14 1 + 0x90361A0E, // 007B SETMBR R13 K13 R14 + 0x8834190D, // 007C GETMBR R13 R12 K13 + 0x88341B0D, // 007D GETMBR R13 R13 K13 + 0xB83A0000, // 007E GETNGBL R14 K0 + 0x88381D1F, // 007F GETMBR R14 R14 K31 + 0x90361A0E, // 0080 SETMBR R13 K13 R14 + 0x88340B08, // 0081 GETMBR R13 R5 K8 + 0x8C341B23, // 0082 GETMET R13 R13 K35 + 0x5C3C1800, // 0083 MOVE R15 R12 + 0x7C340400, // 0084 CALL R13 2 + 0xB8363000, // 0085 GETNGBL R13 K24 + 0x8C341B14, // 0086 GETMET R13 R13 K20 + 0x603C0018, // 0087 GETGBL R15 G24 + 0x58400024, // 0088 LDCONST R16 K36 + 0x88440312, // 0089 GETMBR R17 R1 K18 + 0x8844231A, // 008A GETMBR R17 R17 K26 + 0x88480325, // 008B GETMBR R18 R1 K37 + 0x7C3C0600, // 008C CALL R15 3 + 0x5840001D, // 008D LDCONST R16 K29 + 0x7C340600, // 008E CALL R13 3 + 0x70020070, // 008F JMP #0101 + 0x4C340000, // 0090 LDNIL R13 + 0x2034140D, // 0091 NE R13 R10 R13 + 0x78360031, // 0092 JMPF R13 #00C5 + 0xB8360000, // 0093 GETNGBL R13 K0 + 0x8C341B26, // 0094 GETMET R13 R13 K38 + 0x7C340200, // 0095 CALL R13 1 + 0x9032180D, // 0096 SETMBR R12 K12 R13 + 0x8834190C, // 0097 GETMBR R13 R12 K12 + 0xB83A0000, // 0098 GETNGBL R14 K0 + 0x8C381D21, // 0099 GETMET R14 R14 K33 + 0x7C380200, // 009A CALL R14 1 + 0x9036140E, // 009B SETMBR R13 K10 R14 + 0x8834190C, // 009C GETMBR R13 R12 K12 + 0x88341B0A, // 009D GETMBR R13 R13 K10 + 0x88380709, // 009E GETMBR R14 R3 K9 + 0x9036120E, // 009F SETMBR R13 K9 R14 + 0x8834190C, // 00A0 GETMBR R13 R12 K12 + 0x88341B0A, // 00A1 GETMBR R13 R13 K10 + 0x8838070B, // 00A2 GETMBR R14 R3 K11 + 0x9036160E, // 00A3 SETMBR R13 K11 R14 + 0x8834190C, // 00A4 GETMBR R13 R12 K12 + 0x88341B0A, // 00A5 GETMBR R13 R13 K10 + 0x8838070C, // 00A6 GETMBR R14 R3 K12 + 0x9036180E, // 00A7 SETMBR R13 K12 R14 + 0x8834190C, // 00A8 GETMBR R13 R12 K12 + 0x9036260A, // 00A9 SETMBR R13 K19 R10 + 0x88340B08, // 00AA GETMBR R13 R5 K8 + 0x8C341B23, // 00AB GETMET R13 R13 K35 + 0x5C3C1800, // 00AC MOVE R15 R12 + 0x7C340400, // 00AD CALL R13 2 + 0xB8360000, // 00AE GETNGBL R13 K0 + 0x8C341B0F, // 00AF GETMET R13 R13 K15 + 0x883C070B, // 00B0 GETMBR R15 R3 K11 + 0x8840070C, // 00B1 GETMBR R16 R3 K12 + 0x7C340600, // 00B2 CALL R13 3 + 0x5C201A00, // 00B3 MOVE R8 R13 + 0xB8363000, // 00B4 GETNGBL R13 K24 + 0x8C341B14, // 00B5 GETMET R13 R13 K20 + 0x603C0018, // 00B6 GETGBL R15 G24 + 0x58400027, // 00B7 LDCONST R16 K39 + 0x88440312, // 00B8 GETMBR R17 R1 K18 + 0x8844231A, // 00B9 GETMBR R17 R17 K26 + 0x60480008, // 00BA GETGBL R18 G8 + 0x5C4C0600, // 00BB MOVE R19 R3 + 0x7C480200, // 00BC CALL R18 1 + 0x78220001, // 00BD JMPF R8 #00C0 + 0x5C4C1000, // 00BE MOVE R19 R8 + 0x70020000, // 00BF JMP #00C1 + 0x584C0017, // 00C0 LDCONST R19 K23 + 0x7C3C0800, // 00C1 CALL R15 4 + 0x5840001D, // 00C2 LDCONST R16 K29 + 0x7C340600, // 00C3 CALL R13 3 + 0x7002003B, // 00C4 JMP #0101 + 0x8834070D, // 00C5 GETMBR R13 R3 K13 + 0x4C380000, // 00C6 LDNIL R14 + 0x20341A0E, // 00C7 NE R13 R13 R14 + 0x7836002D, // 00C8 JMPF R13 #00F7 + 0xB8360000, // 00C9 GETNGBL R13 K0 + 0x8C341B20, // 00CA GETMET R13 R13 K32 + 0x7C340200, // 00CB CALL R13 1 + 0x90321A0D, // 00CC SETMBR R12 K13 R13 + 0x8834190D, // 00CD GETMBR R13 R12 K13 + 0xB83A0000, // 00CE GETNGBL R14 K0 + 0x8C381D21, // 00CF GETMET R14 R14 K33 + 0x7C380200, // 00D0 CALL R14 1 + 0x9036140E, // 00D1 SETMBR R13 K10 R14 + 0x8834190D, // 00D2 GETMBR R13 R12 K13 + 0x88341B0A, // 00D3 GETMBR R13 R13 K10 + 0x88380709, // 00D4 GETMBR R14 R3 K9 + 0x9036120E, // 00D5 SETMBR R13 K9 R14 + 0x8834190D, // 00D6 GETMBR R13 R12 K13 + 0x88341B0A, // 00D7 GETMBR R13 R13 K10 + 0x8838070B, // 00D8 GETMBR R14 R3 K11 + 0x9036160E, // 00D9 SETMBR R13 K11 R14 + 0x8834190D, // 00DA GETMBR R13 R12 K13 + 0x88341B0A, // 00DB GETMBR R13 R13 K10 + 0x8838070C, // 00DC GETMBR R14 R3 K12 + 0x9036180E, // 00DD SETMBR R13 K12 R14 + 0x8834190D, // 00DE GETMBR R13 R12 K13 + 0xB83A0000, // 00DF GETNGBL R14 K0 + 0x8C381D22, // 00E0 GETMET R14 R14 K34 + 0x7C380200, // 00E1 CALL R14 1 + 0x90361A0E, // 00E2 SETMBR R13 K13 R14 + 0x8834190D, // 00E3 GETMBR R13 R12 K13 + 0x88341B0D, // 00E4 GETMBR R13 R13 K13 + 0x8838070D, // 00E5 GETMBR R14 R3 K13 + 0x90361A0E, // 00E6 SETMBR R13 K13 R14 + 0x88340B08, // 00E7 GETMBR R13 R5 K8 + 0x8C341B23, // 00E8 GETMET R13 R13 K35 + 0x5C3C1800, // 00E9 MOVE R15 R12 + 0x7C340400, // 00EA CALL R13 2 + 0xB8363000, // 00EB GETNGBL R13 K24 + 0x8C341B14, // 00EC GETMET R13 R13 K20 + 0x603C0018, // 00ED GETGBL R15 G24 + 0x58400028, // 00EE LDCONST R16 K40 + 0x88440312, // 00EF GETMBR R17 R1 K18 + 0x8844231A, // 00F0 GETMBR R17 R17 K26 + 0x8848070D, // 00F1 GETMBR R18 R3 K13 + 0x884C0325, // 00F2 GETMBR R19 R1 K37 + 0x7C3C0800, // 00F3 CALL R15 4 + 0x5840001D, // 00F4 LDCONST R16 K29 + 0x7C340600, // 00F5 CALL R13 3 + 0x70020009, // 00F6 JMP #0101 + 0xB8363000, // 00F7 GETNGBL R13 K24 + 0x8C341B14, // 00F8 GETMET R13 R13 K20 + 0x603C0018, // 00F9 GETGBL R15 G24 + 0x58400029, // 00FA LDCONST R16 K41 + 0x88440312, // 00FB GETMBR R17 R1 K18 + 0x8844231A, // 00FC GETMBR R17 R17 K26 + 0x88480325, // 00FD GETMBR R18 R1 K37 + 0x7C3C0600, // 00FE CALL R15 3 + 0x5840001D, // 00FF LDCONST R16 K29 + 0x7C340600, // 0100 CALL R13 3 + 0x7001FF17, // 0101 JMP #001A + 0x5818002A, // 0102 LDCONST R6 K42 + 0xAC180200, // 0103 CATCH R6 1 0 + 0xB0080000, // 0104 RAISE 2 R0 R0 + 0x6018000C, // 0105 GETGBL R6 G12 + 0x881C0B08, // 0106 GETMBR R7 R5 K8 + 0x7C180200, // 0107 CALL R6 1 + 0x24180D1B, // 0108 GT R6 R6 K27 + 0x781A0004, // 0109 JMPF R6 #010F + 0x8C18012B, // 010A GETMET R6 R0 K43 + 0x5C200200, // 010B MOVE R8 R1 + 0x5C240A00, // 010C MOVE R9 R5 + 0x7C180600, // 010D CALL R6 3 + 0x70020001, // 010E JMP #0111 + 0x50180000, // 010F LDBOOL R6 0 0 + 0x80040C00, // 0110 RET 1 R6 + 0x50180200, // 0111 LDBOOL R6 1 0 + 0x80040C00, // 0112 RET 1 R6 + 0x80000000, // 0113 RET 0 }) ) ); @@ -417,7 +419,7 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[29]) { /* constants */ + ( &(const bvalue[30]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(SubscribeRequestMessage), /* K2 */ be_nested_str_weak(from_TLV), @@ -427,30 +429,31 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ /* K6 */ be_nested_str_weak(session), /* K7 */ be_nested_str_weak(new_subscription), /* K8 */ be_nested_str_weak(Path), - /* K9 */ be_nested_str_weak(attributes_requests), - /* K10 */ be_nested_str_weak(endpoint), - /* K11 */ be_nested_str_weak(cluster), - /* K12 */ be_nested_str_weak(attribute), - /* K13 */ be_nested_str_weak(push), - /* K14 */ be_nested_str_weak(stop_iteration), - /* K15 */ be_nested_str_weak(tasmota), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), - /* K18 */ be_nested_str_weak(local_session_id), - /* K19 */ be_nested_str_weak(concat), - /* K20 */ be_nested_str_weak(_X20), - /* K21 */ be_nested_str_weak(min_interval), - /* K22 */ be_nested_str_weak(max_interval), - /* K23 */ be_const_int(1), - /* K24 */ be_const_int(0), - /* K25 */ be_nested_str_weak(subscription_id), - /* K26 */ be_const_int(3), - /* K27 */ be_nested_str_weak(_inner_process_read_request), - /* K28 */ be_nested_str_weak(send_subscribe_response), + /* K9 */ be_nested_str_weak(msg), + /* K10 */ be_nested_str_weak(attributes_requests), + /* K11 */ be_nested_str_weak(endpoint), + /* K12 */ be_nested_str_weak(cluster), + /* K13 */ be_nested_str_weak(attribute), + /* K14 */ be_nested_str_weak(push), + /* K15 */ be_nested_str_weak(stop_iteration), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), + /* K19 */ be_nested_str_weak(local_session_id), + /* K20 */ be_nested_str_weak(concat), + /* K21 */ be_nested_str_weak(_X20), + /* K22 */ be_nested_str_weak(min_interval), + /* K23 */ be_nested_str_weak(max_interval), + /* K24 */ be_const_int(1), + /* K25 */ be_const_int(0), + /* K26 */ be_nested_str_weak(subscription_id), + /* K27 */ be_const_int(3), + /* K28 */ be_nested_str_weak(_inner_process_read_request), + /* K29 */ be_nested_str_weak(send_subscribe_response), }), be_str_weak(subscribe_request), &be_const_str_solidified, - ( &(const binstruction[77]) { /* code */ + ( &(const binstruction[78]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x8C0C0701, // 0001 GETMET R3 R3 K1 0x7C0C0200, // 0002 CALL R3 1 @@ -473,61 +476,62 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0xB81A0000, // 0013 GETNGBL R6 K0 0x8C180D08, // 0014 GETMET R6 R6 K8 0x7C180200, // 0015 CALL R6 1 - 0x601C0010, // 0016 GETGBL R7 G16 - 0x88200709, // 0017 GETMBR R8 R3 K9 - 0x7C1C0200, // 0018 CALL R7 1 - 0xA802000D, // 0019 EXBLK 0 #0028 - 0x5C200E00, // 001A MOVE R8 R7 - 0x7C200000, // 001B CALL R8 0 - 0x8824110A, // 001C GETMBR R9 R8 K10 - 0x901A1409, // 001D SETMBR R6 K10 R9 - 0x8824110B, // 001E GETMBR R9 R8 K11 - 0x901A1609, // 001F SETMBR R6 K11 R9 - 0x8824110C, // 0020 GETMBR R9 R8 K12 - 0x901A1809, // 0021 SETMBR R6 K12 R9 - 0x8C240B0D, // 0022 GETMET R9 R5 K13 - 0x602C0008, // 0023 GETGBL R11 G8 - 0x5C300C00, // 0024 MOVE R12 R6 - 0x7C2C0200, // 0025 CALL R11 1 - 0x7C240400, // 0026 CALL R9 2 - 0x7001FFF1, // 0027 JMP #001A - 0x581C000E, // 0028 LDCONST R7 K14 - 0xAC1C0200, // 0029 CATCH R7 1 0 - 0xB0080000, // 002A RAISE 2 R0 R0 - 0xB81E1E00, // 002B GETNGBL R7 K15 - 0x8C1C0F10, // 002C GETMET R7 R7 K16 - 0x60240018, // 002D GETGBL R9 G24 - 0x58280011, // 002E LDCONST R10 K17 - 0x882C0306, // 002F GETMBR R11 R1 K6 - 0x882C1712, // 0030 GETMBR R11 R11 K18 - 0x8C300B13, // 0031 GETMET R12 R5 K19 - 0x58380014, // 0032 LDCONST R14 K20 - 0x7C300400, // 0033 CALL R12 2 - 0x88340915, // 0034 GETMBR R13 R4 K21 - 0x88380916, // 0035 GETMBR R14 R4 K22 - 0x883C0703, // 0036 GETMBR R15 R3 K3 - 0x783E0001, // 0037 JMPF R15 #003A - 0x583C0017, // 0038 LDCONST R15 K23 - 0x70020000, // 0039 JMP #003B - 0x583C0018, // 003A LDCONST R15 K24 - 0x88400919, // 003B GETMBR R16 R4 K25 - 0x7C240E00, // 003C CALL R9 7 - 0x5828001A, // 003D LDCONST R10 K26 - 0x7C1C0600, // 003E CALL R7 3 - 0x8C1C011B, // 003F GETMET R7 R0 K27 - 0x88240306, // 0040 GETMBR R9 R1 K6 - 0x5C280600, // 0041 MOVE R10 R3 - 0x502C0200, // 0042 LDBOOL R11 1 0 - 0x7C1C0800, // 0043 CALL R7 4 - 0x88200919, // 0044 GETMBR R8 R4 K25 - 0x901E3208, // 0045 SETMBR R7 K25 R8 - 0x8C20011C, // 0046 GETMET R8 R0 K28 - 0x5C280200, // 0047 MOVE R10 R1 - 0x5C2C0E00, // 0048 MOVE R11 R7 - 0x5C300800, // 0049 MOVE R12 R4 - 0x7C200800, // 004A CALL R8 4 - 0x50200200, // 004B LDBOOL R8 1 0 - 0x80041000, // 004C RET 1 R8 + 0x901A1201, // 0016 SETMBR R6 K9 R1 + 0x601C0010, // 0017 GETGBL R7 G16 + 0x8820070A, // 0018 GETMBR R8 R3 K10 + 0x7C1C0200, // 0019 CALL R7 1 + 0xA802000D, // 001A EXBLK 0 #0029 + 0x5C200E00, // 001B MOVE R8 R7 + 0x7C200000, // 001C CALL R8 0 + 0x8824110B, // 001D GETMBR R9 R8 K11 + 0x901A1609, // 001E SETMBR R6 K11 R9 + 0x8824110C, // 001F GETMBR R9 R8 K12 + 0x901A1809, // 0020 SETMBR R6 K12 R9 + 0x8824110D, // 0021 GETMBR R9 R8 K13 + 0x901A1A09, // 0022 SETMBR R6 K13 R9 + 0x8C240B0E, // 0023 GETMET R9 R5 K14 + 0x602C0008, // 0024 GETGBL R11 G8 + 0x5C300C00, // 0025 MOVE R12 R6 + 0x7C2C0200, // 0026 CALL R11 1 + 0x7C240400, // 0027 CALL R9 2 + 0x7001FFF1, // 0028 JMP #001B + 0x581C000F, // 0029 LDCONST R7 K15 + 0xAC1C0200, // 002A CATCH R7 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0xB81E2000, // 002C GETNGBL R7 K16 + 0x8C1C0F11, // 002D GETMET R7 R7 K17 + 0x60240018, // 002E GETGBL R9 G24 + 0x58280012, // 002F LDCONST R10 K18 + 0x882C0306, // 0030 GETMBR R11 R1 K6 + 0x882C1713, // 0031 GETMBR R11 R11 K19 + 0x8C300B14, // 0032 GETMET R12 R5 K20 + 0x58380015, // 0033 LDCONST R14 K21 + 0x7C300400, // 0034 CALL R12 2 + 0x88340916, // 0035 GETMBR R13 R4 K22 + 0x88380917, // 0036 GETMBR R14 R4 K23 + 0x883C0703, // 0037 GETMBR R15 R3 K3 + 0x783E0001, // 0038 JMPF R15 #003B + 0x583C0018, // 0039 LDCONST R15 K24 + 0x70020000, // 003A JMP #003C + 0x583C0019, // 003B LDCONST R15 K25 + 0x8840091A, // 003C GETMBR R16 R4 K26 + 0x7C240E00, // 003D CALL R9 7 + 0x5828001B, // 003E LDCONST R10 K27 + 0x7C1C0600, // 003F CALL R7 3 + 0x8C1C011C, // 0040 GETMET R7 R0 K28 + 0x88240306, // 0041 GETMBR R9 R1 K6 + 0x5C280600, // 0042 MOVE R10 R3 + 0x502C0200, // 0043 LDBOOL R11 1 0 + 0x7C1C0800, // 0044 CALL R7 4 + 0x8820091A, // 0045 GETMBR R8 R4 K26 + 0x901E3408, // 0046 SETMBR R7 K26 R8 + 0x8C20011D, // 0047 GETMET R8 R0 K29 + 0x5C280200, // 0048 MOVE R10 R1 + 0x5C2C0E00, // 0049 MOVE R11 R7 + 0x5C300800, // 004A MOVE R12 R4 + 0x7C200800, // 004B CALL R8 4 + 0x50200200, // 004C LDBOOL R8 1 0 + 0x80041000, // 004D RET 1 R8 }) ) ); @@ -1001,14 +1005,18 @@ be_local_closure(Matter_IM_send_ack_now, /* name */ }), be_str_weak(send_ack_now), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88080300, // 0000 GETMBR R2 R1 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x5C100200, // 0003 MOVE R4 R1 - 0x50140000, // 0004 LDBOOL R5 0 0 - 0x7C080600, // 0005 CALL R2 3 - 0x80000000, // 0006 RET 0 + ( &(const binstruction[11]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x80000400, // 0003 RET 0 + 0x88080300, // 0004 GETMBR R2 R1 K0 + 0x88080501, // 0005 GETMBR R2 R2 K1 + 0x8C080502, // 0006 GETMET R2 R2 K2 + 0x5C100200, // 0007 MOVE R4 R1 + 0x50140000, // 0008 LDBOOL R5 0 0 + 0x7C080600, // 0009 CALL R2 3 + 0x80000000, // 000A RET 0 }) ) ); @@ -1230,7 +1238,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ }), be_str_weak(process_incoming), &be_const_str_solidified, - ( &(const binstruction[110]) { /* code */ + ( &(const binstruction[107]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 0x88080501, // 0001 GETMBR R2 R2 K1 0x8C080502, // 0002 GETMET R2 R2 K2 @@ -1248,7 +1256,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 000E MOVE R8 R2 0x7C140600, // 000F CALL R5 3 0x80040A00, // 0010 RET 1 R5 - 0x70020059, // 0011 JMP #006C + 0x70020056, // 0011 JMP #0069 0x1C140909, // 0012 EQ R5 R4 K9 0x78160008, // 0013 JMPF R5 #001D 0x8C14010A, // 0014 GETMET R5 R0 K10 @@ -1259,7 +1267,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 0019 MOVE R8 R2 0x7C140600, // 001A CALL R5 3 0x80040A00, // 001B RET 1 R5 - 0x7002004E, // 001C JMP #006C + 0x7002004B, // 001C JMP #0069 0x1C14090C, // 001D EQ R5 R4 K12 0x78160008, // 001E JMPF R5 #0028 0x8C14010A, // 001F GETMET R5 R0 K10 @@ -1270,7 +1278,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 0024 MOVE R8 R2 0x7C140600, // 0025 CALL R5 3 0x80040A00, // 0026 RET 1 R5 - 0x70020043, // 0027 JMP #006C + 0x70020040, // 0027 JMP #0069 0x54160003, // 0028 LDINT R5 4 0x1C140805, // 0029 EQ R5 R4 R5 0x78160005, // 002A JMPF R5 #0031 @@ -1279,7 +1287,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 002D MOVE R8 R2 0x7C140600, // 002E CALL R5 3 0x80040A00, // 002F RET 1 R5 - 0x7002003A, // 0030 JMP #006C + 0x70020037, // 0030 JMP #0069 0x54160004, // 0031 LDINT R5 5 0x1C140805, // 0032 EQ R5 R4 R5 0x78160005, // 0033 JMPF R5 #003A @@ -1288,7 +1296,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 0036 MOVE R8 R2 0x7C140600, // 0037 CALL R5 3 0x80040A00, // 0038 RET 1 R5 - 0x70020031, // 0039 JMP #006C + 0x7002002E, // 0039 JMP #0069 0x54160005, // 003A LDINT R5 6 0x1C140805, // 003B EQ R5 R4 R5 0x78160008, // 003C JMPF R5 #0046 @@ -1300,7 +1308,7 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 0042 MOVE R8 R2 0x7C140600, // 0043 CALL R5 3 0x80040A00, // 0044 RET 1 R5 - 0x70020025, // 0045 JMP #006C + 0x70020022, // 0045 JMP #0069 0x54160006, // 0046 LDINT R5 7 0x1C140805, // 0047 EQ R5 R4 R5 0x78160005, // 0048 JMPF R5 #004F @@ -1309,38 +1317,35 @@ be_local_closure(Matter_IM_process_incoming, /* name */ 0x5C200400, // 004B MOVE R8 R2 0x7C140600, // 004C CALL R5 3 0x80040A00, // 004D RET 1 R5 - 0x7002001C, // 004E JMP #006C + 0x70020019, // 004E JMP #0069 0x54160007, // 004F LDINT R5 8 0x1C140805, // 0050 EQ R5 R4 R5 - 0x78160008, // 0051 JMPF R5 #005B - 0x8C14010A, // 0052 GETMET R5 R0 K10 + 0x78160005, // 0051 JMPF R5 #0058 + 0x8C140112, // 0052 GETMET R5 R0 K18 0x5C1C0200, // 0053 MOVE R7 R1 - 0x7C140400, // 0054 CALL R5 2 - 0x8C140112, // 0055 GETMET R5 R0 K18 - 0x5C1C0200, // 0056 MOVE R7 R1 - 0x5C200400, // 0057 MOVE R8 R2 - 0x7C140600, // 0058 CALL R5 3 - 0x80040A00, // 0059 RET 1 R5 - 0x70020010, // 005A JMP #006C - 0x54160008, // 005B LDINT R5 9 - 0x1C140805, // 005C EQ R5 R4 R5 - 0x78160005, // 005D JMPF R5 #0064 - 0x8C140113, // 005E GETMET R5 R0 K19 - 0x5C1C0200, // 005F MOVE R7 R1 - 0x5C200400, // 0060 MOVE R8 R2 - 0x7C140600, // 0061 CALL R5 3 - 0x80040A00, // 0062 RET 1 R5 - 0x70020007, // 0063 JMP #006C - 0x54160009, // 0064 LDINT R5 10 - 0x1C140805, // 0065 EQ R5 R4 R5 - 0x78160004, // 0066 JMPF R5 #006C - 0x8C140114, // 0067 GETMET R5 R0 K20 - 0x5C1C0200, // 0068 MOVE R7 R1 - 0x5C200400, // 0069 MOVE R8 R2 - 0x7C140600, // 006A CALL R5 3 - 0x80040A00, // 006B RET 1 R5 - 0x50140000, // 006C LDBOOL R5 0 0 - 0x80040A00, // 006D RET 1 R5 + 0x5C200400, // 0054 MOVE R8 R2 + 0x7C140600, // 0055 CALL R5 3 + 0x80040A00, // 0056 RET 1 R5 + 0x70020010, // 0057 JMP #0069 + 0x54160008, // 0058 LDINT R5 9 + 0x1C140805, // 0059 EQ R5 R4 R5 + 0x78160005, // 005A JMPF R5 #0061 + 0x8C140113, // 005B GETMET R5 R0 K19 + 0x5C1C0200, // 005C MOVE R7 R1 + 0x5C200400, // 005D MOVE R8 R2 + 0x7C140600, // 005E CALL R5 3 + 0x80040A00, // 005F RET 1 R5 + 0x70020007, // 0060 JMP #0069 + 0x54160009, // 0061 LDINT R5 10 + 0x1C140805, // 0062 EQ R5 R4 R5 + 0x78160004, // 0063 JMPF R5 #0069 + 0x8C140114, // 0064 GETMET R5 R0 K20 + 0x5C1C0200, // 0065 MOVE R7 R1 + 0x5C200400, // 0066 MOVE R8 R2 + 0x7C140600, // 0067 CALL R5 3 + 0x80040A00, // 0068 RET 1 R5 + 0x50140000, // 0069 LDBOOL R5 0 0 + 0x80040A00, // 006A RET 1 R5 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index c420713a7..64c69ae00 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -481,7 +481,7 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0x88300F2E, // 00C2 GETMBR R12 R7 K46 0x7C2C0200, // 00C3 CALL R11 1 0x0028140B, // 00C4 ADD R10 R10 R11 - 0x542E0003, // 00C5 LDINT R11 4 + 0x582C0020, // 00C5 LDCONST R11 K32 0x7C200600, // 00C6 CALL R8 3 0x8C20012F, // 00C7 GETMET R8 R0 K47 0x5C280A00, // 00C8 MOVE R10 R5 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h index b81e7a973..3fa3881cc 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h @@ -6,6 +6,46 @@ extern const bclass be_class_Matter_Path; +/******************************************************************** +** Solidified function: clear +********************************************************************/ +be_local_closure(Matter_Path_clear, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(cluster), + /* K2 */ be_nested_str_weak(attribute), + /* K3 */ be_nested_str_weak(command), + /* K4 */ be_nested_str_weak(status), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(msh), + }), + be_str_weak(clear), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x90020201, // 0002 SETMBR R0 K1 R1 + 0x90020401, // 0003 SETMBR R0 K2 R1 + 0x90020601, // 0004 SETMBR R0 K3 R1 + 0x90020801, // 0005 SETMBR R0 K4 R1 + 0x90020A01, // 0006 SETMBR R0 K5 R1 + 0x90020C01, // 0007 SETMBR R0 K6 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: tostring ********************************************************************/ @@ -121,17 +161,19 @@ be_local_closure(Matter_Path_tostring, /* name */ ** Solidified class: Matter_Path ********************************************************************/ be_local_class(Matter_Path, - 6, + 7, NULL, - be_nested_map(7, + be_nested_map(9, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(log, 4), be_const_var(5) }, - { be_const_key_weak(command, 2), be_const_var(3) }, - { be_const_key_weak(status, -1), be_const_var(4) }, + { be_const_key_weak(log, -1), be_const_var(5) }, + { be_const_key_weak(cluster, -1), be_const_var(1) }, + { be_const_key_weak(command, -1), be_const_var(3) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_Path_tostring_closure) }, - { be_const_key_weak(cluster, 5), be_const_var(1) }, - { be_const_key_weak(endpoint, -1), be_const_var(0) }, - { be_const_key_weak(attribute, -1), be_const_var(2) }, + { be_const_key_weak(status, 1), be_const_var(4) }, + { be_const_key_weak(attribute, 6), be_const_var(2) }, + { be_const_key_weak(clear, -1), be_const_closure(Matter_Path_clear_closure) }, + { be_const_key_weak(endpoint, 3), be_const_var(0) }, + { be_const_key_weak(msg, -1), be_const_var(6) }, })), be_str_weak(Matter_Path) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index e24e49c2e..59b285408 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -7,61 +7,23 @@ extern const bclass be_class_Matter_Plugin; /******************************************************************** -** Solidified function: every_250ms +** Solidified function: parse_sensors ********************************************************************/ -be_local_closure(Matter_Plugin_every_250ms, /* name */ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(update_next), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(jitter), - /* K3 */ be_nested_str_weak(UPDATE_TIME), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - /* K6 */ be_nested_str_weak(tick), - /* K7 */ be_nested_str_weak(device), - /* K8 */ be_nested_str_weak(update_shadow), - /* K9 */ be_nested_str_weak(millis), - }), - be_str_weak(every_250ms), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x78060005, // 0003 JMPF R1 #000A - 0xB8060200, // 0004 GETNGBL R1 K1 - 0x8C040302, // 0005 GETMET R1 R1 K2 - 0x880C0103, // 0006 GETMBR R3 R0 K3 - 0x7C040400, // 0007 CALL R1 2 - 0x90020001, // 0008 SETMBR R0 K0 R1 - 0x70020010, // 0009 JMP #001B - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0100, // 000C GETMBR R3 R0 K0 - 0x7C040400, // 000D CALL R1 2 - 0x7806000B, // 000E JMPF R1 #001B - 0x88040106, // 000F GETMBR R1 R0 K6 - 0x88080107, // 0010 GETMBR R2 R0 K7 - 0x88080506, // 0011 GETMBR R2 R2 K6 - 0x20040202, // 0012 NE R1 R1 R2 - 0x78060001, // 0013 JMPF R1 #0016 - 0x8C040108, // 0014 GETMET R1 R0 K8 - 0x7C040200, // 0015 CALL R1 1 - 0xB8060800, // 0016 GETNGBL R1 K4 - 0x8C040309, // 0017 GETMET R1 R1 K9 - 0x880C0103, // 0018 GETMBR R3 R0 K3 - 0x7C040400, // 0019 CALL R1 2 - 0x90020001, // 001A SETMBR R0 K0 R1 - 0x80000000, // 001B RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -114,58 +76,6 @@ be_local_closure(Matter_Plugin_get_cluster_list, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: -********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_local_device -********************************************************************/ -be_local_closure(Matter_Plugin_is_local_device, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(is_local_device), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x50040200, // 0000 LDBOOL R1 1 0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: write_attribute ********************************************************************/ @@ -191,389 +101,6 @@ be_local_closure(Matter_Plugin_write_attribute, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: invoke_request -********************************************************************/ -be_local_closure(Matter_Plugin_invoke_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(invoke_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: consolidate_clusters -********************************************************************/ -be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ - be_nested_proto( - 12, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(real_super), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040003, // 0000 GETGBL R1 G3 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(CLUSTERS), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(consolidate_clusters), - &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0x84040000, // 0000 CLOSURE R1 P0 - 0x60080013, // 0001 GETGBL R2 G19 - 0x7C080000, // 0002 CALL R2 0 - 0x5C0C0000, // 0003 MOVE R3 R0 - 0x4C100000, // 0004 LDNIL R4 - 0x20100604, // 0005 NE R4 R3 R4 - 0x7812002C, // 0006 JMPF R4 #0034 - 0x88100700, // 0007 GETMBR R4 R3 K0 - 0x60140010, // 0008 GETGBL R5 G16 - 0x8C180901, // 0009 GETMET R6 R4 K1 - 0x7C180200, // 000A CALL R6 1 - 0x7C140200, // 000B CALL R5 1 - 0xA802001E, // 000C EXBLK 0 #002C - 0x5C180A00, // 000D MOVE R6 R5 - 0x7C180000, // 000E CALL R6 0 - 0x8C1C0502, // 000F GETMET R7 R2 K2 - 0x5C240C00, // 0010 MOVE R9 R6 - 0x7C1C0400, // 0011 CALL R7 2 - 0x741E0002, // 0012 JMPT R7 #0016 - 0x601C0012, // 0013 GETGBL R7 G18 - 0x7C1C0000, // 0014 CALL R7 0 - 0x98080C07, // 0015 SETIDX R2 R6 R7 - 0x601C0010, // 0016 GETGBL R7 G16 - 0x94200806, // 0017 GETIDX R8 R4 R6 - 0x7C1C0200, // 0018 CALL R7 1 - 0xA802000D, // 0019 EXBLK 0 #0028 - 0x5C200E00, // 001A MOVE R8 R7 - 0x7C200000, // 001B CALL R8 0 - 0x94240406, // 001C GETIDX R9 R2 R6 - 0x8C241303, // 001D GETMET R9 R9 K3 - 0x5C2C1000, // 001E MOVE R11 R8 - 0x7C240400, // 001F CALL R9 2 - 0x4C280000, // 0020 LDNIL R10 - 0x1C24120A, // 0021 EQ R9 R9 R10 - 0x78260003, // 0022 JMPF R9 #0027 - 0x94240406, // 0023 GETIDX R9 R2 R6 - 0x8C241304, // 0024 GETMET R9 R9 K4 - 0x5C2C1000, // 0025 MOVE R11 R8 - 0x7C240400, // 0026 CALL R9 2 - 0x7001FFF1, // 0027 JMP #001A - 0x581C0005, // 0028 LDCONST R7 K5 - 0xAC1C0200, // 0029 CATCH R7 1 0 - 0xB0080000, // 002A RAISE 2 R0 R0 - 0x7001FFE0, // 002B JMP #000D - 0x58140005, // 002C LDCONST R5 K5 - 0xAC140200, // 002D CATCH R5 1 0 - 0xB0080000, // 002E RAISE 2 R0 R0 - 0x5C140200, // 002F MOVE R5 R1 - 0x5C180600, // 0030 MOVE R6 R3 - 0x7C140200, // 0031 CALL R5 1 - 0x5C0C0A00, // 0032 MOVE R3 R5 - 0x7001FFCF, // 0033 JMP #0004 - 0x80040400, // 0034 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(attribute_updated), - /* K2 */ be_nested_str_weak(endpoint), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x88180102, // 0002 GETMBR R6 R0 K2 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: has -********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow_lazy -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - /* K2 */ be_nested_str_weak(update_shadow), - }), - be_str_weak(update_shadow_lazy), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x88080500, // 0002 GETMBR R2 R2 K0 - 0x20040202, // 0003 NE R1 R1 R2 - 0x78060004, // 0004 JMPF R1 #000A - 0x8C040102, // 0005 GETMET R1 R0 K2 - 0x7C040200, // 0006 CALL R1 1 - 0x88040101, // 0007 GETMBR R1 R0 K1 - 0x88040300, // 0008 GETMBR R1 R1 K0 - 0x90020001, // 0009 SETMBR R0 K0 R1 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_endpoint -********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - }), - be_str_weak(get_endpoint), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Plugin_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(endpoint), - /* K2 */ be_nested_str_weak(clusters), - /* K3 */ be_nested_str_weak(consolidate_clusters), - /* K4 */ be_nested_str_weak(parse_configuration), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x8C100103, // 0002 GETMET R4 R0 K3 - 0x7C100200, // 0003 CALL R4 1 - 0x90020404, // 0004 SETMBR R0 K2 R4 - 0x8C100104, // 0005 GETMET R4 R0 K4 - 0x5C180600, // 0006 MOVE R6 R3 - 0x7C100400, // 0007 CALL R4 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_event -********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(read_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ - be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: parse_configuration ********************************************************************/ @@ -599,112 +126,39 @@ be_local_closure(Matter_Plugin_parse_configuration, /* name */ /******************************************************************** -** Solidified function: subscribe_event +** Solidified function: ui_conf_to_string ********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ +be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ be_nested_proto( - 6, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(subscribe_event), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x80040A00, // 0001 RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_attribute_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(get_attribute_list), + be_str_weak(ui_conf_to_string), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: timed_request -********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x780E0006, // 0002 JMPF R3 #000A + 0x60100008, // 0003 GETGBL R4 G8 + 0x8C140302, // 0004 GETMET R5 R1 K2 + 0x5C1C0600, // 0005 MOVE R7 R3 + 0x58200003, // 0006 LDCONST R8 K3 + 0x7C140600, // 0007 CALL R5 3 + 0x7C100200, // 0008 CALL R4 1 + 0x70020000, // 0009 JMP #000B + 0x58100003, // 000A LDCONST R4 K3 + 0x80040800, // 000B RET 1 R4 }) ) ); @@ -868,6 +322,139 @@ be_local_closure(Matter_Plugin_read_attribute, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Plugin_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(endpoint), + /* K2 */ be_nested_str_weak(clusters), + /* K3 */ be_nested_str_weak(consolidate_clusters), + /* K4 */ be_nested_str_weak(parse_configuration), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x90020202, // 0001 SETMBR R0 K1 R2 + 0x8C100103, // 0002 GETMET R4 R0 K3 + 0x7C100200, // 0003 CALL R4 1 + 0x90020404, // 0004 SETMBR R0 K2 R4 + 0x8C100104, // 0005 GETMET R4 R0 K4 + 0x5C180600, // 0006 MOVE R6 R3 + 0x7C100400, // 0007 CALL R4 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: +********************************************************************/ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: has +********************************************************************/ +be_local_closure(Matter_Plugin_has, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), + }), + be_str_weak(has), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: ui_string_to_conf ********************************************************************/ @@ -906,39 +493,487 @@ be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ /******************************************************************** -** Solidified function: ui_conf_to_string +** Solidified function: update_shadow ********************************************************************/ -be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ +be_local_closure(Matter_Plugin_update_shadow, /* name */ be_nested_proto( - 9, /* nstack */ + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + }), + be_str_weak(update_shadow), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_Plugin_every_250ms, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(update_next), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(jitter), + /* K3 */ be_nested_str_weak(UPDATE_TIME), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + /* K6 */ be_nested_str_weak(tick), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(update_shadow), + /* K9 */ be_nested_str_weak(millis), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x78060005, // 0003 JMPF R1 #000A + 0xB8060200, // 0004 GETNGBL R1 K1 + 0x8C040302, // 0005 GETMET R1 R1 K2 + 0x880C0103, // 0006 GETMBR R3 R0 K3 + 0x7C040400, // 0007 CALL R1 2 + 0x90020001, // 0008 SETMBR R0 K0 R1 + 0x70020010, // 0009 JMP #001B + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0100, // 000C GETMBR R3 R0 K0 + 0x7C040400, // 000D CALL R1 2 + 0x7806000B, // 000E JMPF R1 #001B + 0x88040106, // 000F GETMBR R1 R0 K6 + 0x88080107, // 0010 GETMBR R2 R0 K7 + 0x88080506, // 0011 GETMBR R2 R2 K6 + 0x20040202, // 0012 NE R1 R1 R2 + 0x78060001, // 0013 JMPF R1 #0016 + 0x8C040108, // 0014 GETMET R1 R0 K8 + 0x7C040200, // 0015 CALL R1 1 + 0xB8060800, // 0016 GETNGBL R1 K4 + 0x8C040309, // 0017 GETMET R1 R1 K9 + 0x880C0103, // 0018 GETMBR R3 R0 K3 + 0x7C040400, // 0019 CALL R1 2 + 0x90020001, // 001A SETMBR R0 K0 R1 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(subscribe_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: timed_request +********************************************************************/ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invoke_request +********************************************************************/ +be_local_closure(Matter_Plugin_invoke_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(invoke_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_shadow_lazy +********************************************************************/ +be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), + /* K2 */ be_nested_str_weak(update_shadow), + }), + be_str_weak(update_shadow_lazy), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x88080500, // 0002 GETMBR R2 R2 K0 + 0x20040202, // 0003 NE R1 R1 R2 + 0x78060004, // 0004 JMPF R1 #000A + 0x8C040102, // 0005 GETMET R1 R0 K2 + 0x7C040200, // 0006 CALL R1 1 + 0x88040101, // 0007 GETMBR R1 R0 K1 + 0x88040300, // 0008 GETMBR R1 R1 K0 + 0x90020001, // 0009 SETMBR R0 K0 R1 + 0x80000000, // 000A RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_event +********************************************************************/ +be_local_closure(Matter_Plugin_read_event, /* name */ + be_nested_proto( + 6, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(read_event), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x80040A00, // 0001 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_attribute_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_attribute_list), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140400, // 0002 MOVE R5 R2 + 0x60180012, // 0003 GETGBL R6 G18 + 0x7C180000, // 0004 CALL R6 0 + 0x7C0C0600, // 0005 CALL R3 3 + 0x80040600, // 0006 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: consolidate_clusters +********************************************************************/ +be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ + be_nested_proto( + 12, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(real_super), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x60040003, // 0000 GETGBL R1 G3 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(CLUSTERS), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(consolidate_clusters), + &be_const_str_solidified, + ( &(const binstruction[53]) { /* code */ + 0x84040000, // 0000 CLOSURE R1 P0 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x5C0C0000, // 0003 MOVE R3 R0 + 0x4C100000, // 0004 LDNIL R4 + 0x20100604, // 0005 NE R4 R3 R4 + 0x7812002C, // 0006 JMPF R4 #0034 + 0x88100700, // 0007 GETMBR R4 R3 K0 + 0x60140010, // 0008 GETGBL R5 G16 + 0x8C180901, // 0009 GETMET R6 R4 K1 + 0x7C180200, // 000A CALL R6 1 + 0x7C140200, // 000B CALL R5 1 + 0xA802001E, // 000C EXBLK 0 #002C + 0x5C180A00, // 000D MOVE R6 R5 + 0x7C180000, // 000E CALL R6 0 + 0x8C1C0502, // 000F GETMET R7 R2 K2 + 0x5C240C00, // 0010 MOVE R9 R6 + 0x7C1C0400, // 0011 CALL R7 2 + 0x741E0002, // 0012 JMPT R7 #0016 + 0x601C0012, // 0013 GETGBL R7 G18 + 0x7C1C0000, // 0014 CALL R7 0 + 0x98080C07, // 0015 SETIDX R2 R6 R7 + 0x601C0010, // 0016 GETGBL R7 G16 + 0x94200806, // 0017 GETIDX R8 R4 R6 + 0x7C1C0200, // 0018 CALL R7 1 + 0xA802000D, // 0019 EXBLK 0 #0028 + 0x5C200E00, // 001A MOVE R8 R7 + 0x7C200000, // 001B CALL R8 0 + 0x94240406, // 001C GETIDX R9 R2 R6 + 0x8C241303, // 001D GETMET R9 R9 K3 + 0x5C2C1000, // 001E MOVE R11 R8 + 0x7C240400, // 001F CALL R9 2 + 0x4C280000, // 0020 LDNIL R10 + 0x1C24120A, // 0021 EQ R9 R9 R10 + 0x78260003, // 0022 JMPF R9 #0027 + 0x94240406, // 0023 GETIDX R9 R2 R6 + 0x8C241304, // 0024 GETMET R9 R9 K4 + 0x5C2C1000, // 0025 MOVE R11 R8 + 0x7C240400, // 0026 CALL R9 2 + 0x7001FFF1, // 0027 JMP #001A + 0x581C0005, // 0028 LDCONST R7 K5 + 0xAC1C0200, // 0029 CATCH R7 1 0 + 0xB0080000, // 002A RAISE 2 R0 R0 + 0x7001FFE0, // 002B JMP #000D + 0x58140005, // 002C LDCONST R5 K5 + 0xAC140200, // 002D CATCH R5 1 0 + 0xB0080000, // 002E RAISE 2 R0 R0 + 0x5C140200, // 002F MOVE R5 R1 + 0x5C180600, // 0030 MOVE R6 R3 + 0x7C140200, // 0031 CALL R5 1 + 0x5C0C0A00, // 0032 MOVE R3 R5 + 0x7001FFCF, // 0033 JMP #0004 + 0x80040400, // 0034 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_local_device +********************************************************************/ +be_local_closure(Matter_Plugin_is_local_device, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(is_local_device), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x50040200, // 0000 LDBOOL R1 1 0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_ack_now +********************************************************************/ +be_local_closure(Matter_Plugin_send_ack_now, /* name */ + be_nested_proto( + 5, /* nstack */ 2, /* argc */ - 4, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(), + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(message_handler), + /* K2 */ be_nested_str_weak(im), + /* K3 */ be_nested_str_weak(send_ack_now), }), - be_str_weak(ui_conf_to_string), + be_str_weak(send_ack_now), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x780E0006, // 0002 JMPF R3 #000A - 0x60100008, // 0003 GETGBL R4 G8 - 0x8C140302, // 0004 GETMET R5 R1 K2 - 0x5C1C0600, // 0005 MOVE R7 R3 - 0x58200003, // 0006 LDCONST R8 K3 - 0x7C140600, // 0007 CALL R5 3 - 0x7C100200, // 0008 CALL R4 1 - 0x70020000, // 0009 JMP #000B - 0x58100003, // 000A LDCONST R4 K3 - 0x80040800, // 000B RET 1 R4 + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x88080502, // 0002 GETMBR R2 R2 K2 + 0x8C080503, // 0003 GETMET R2 R2 K3 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x80000000, // 0006 RET 0 }) ) ); @@ -951,35 +986,23 @@ be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(34, + be_nested_map(35, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(every_250ms, 18), be_const_closure(Matter_Plugin_every_250ms_closure) }, - { be_const_key_weak(get_cluster_list, 3), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(send_ack_now, 22), be_const_closure(Matter_Plugin_send_ack_now_closure) }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(NAME, 19), be_nested_str_weak() }, + { be_const_key_weak(parse_configuration, 32), be_const_closure(Matter_Plugin_parse_configuration_closure) }, + { be_const_key_weak(ui_conf_to_string, 34), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, { be_const_key_weak(device, -1), be_const_var(1) }, - { be_const_key_weak(tick, -1), be_const_var(4) }, - { be_const_key_weak(write_attribute, 27), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(invoke_request, 6), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(consolidate_clusters, 29), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(is_local_device, 10), be_const_closure(Matter_Plugin_is_local_device_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(3) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(read_event, 11), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(read_attribute, 24), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(read_attribute, 18), be_const_closure(Matter_Plugin_read_attribute_closure) }, { be_const_key_weak(update_next, -1), be_const_var(0) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(_Not_X20used_) }, { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, - { be_const_key_weak(ARG, -1), be_nested_str_weak() }, - { be_const_key_weak(CLUSTERS, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(CLUSTERS, 33), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -998,13 +1021,26 @@ be_local_class(Matter_Plugin, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_parse_configuration_closure) }, - { be_const_key_weak(ARG_TYPE, 17), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(subscribe_attribute, 33), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(ui_conf_to_string, -1), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, - { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, - { be_const_key_weak(endpoint, 4), be_const_var(2) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, + { be_const_key_weak(every_250ms, 0), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(TYPE, 20), be_nested_str_weak() }, + { be_const_key_weak(write_attribute, 27), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(3) }, + { be_const_key_weak(attribute_updated, 11), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(endpoint, -1), be_const_var(2) }, + { be_const_key_weak(ARG, 3), be_nested_str_weak() }, + { be_const_key_weak(consolidate_clusters, 8), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(is_local_device, -1), be_const_closure(Matter_Plugin_is_local_device_closure) }, + { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 5d012505d..3c5b8c679 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -47,7 +47,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[100]) { /* constants */ + ( &(const bvalue[102]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -65,93 +65,95 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K14 */ be_const_int(2), /* K15 */ be_nested_str_weak(XX), /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(_fabric), - /* K18 */ be_nested_str_weak(fabric_completed), - /* K19 */ be_nested_str_weak(set_no_expiration), - /* K20 */ be_nested_str_weak(save), - /* K21 */ be_nested_str_weak(device), - /* K22 */ be_nested_str_weak(start_commissioning_complete_deferred), - /* K23 */ be_nested_str_weak(context_error), - /* K24 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), - /* K25 */ be_nested_str_weak(status), - /* K26 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K27 */ be_nested_str_weak(B2), - /* K28 */ be_nested_str_weak(DAC_Cert_FFF1_8000), - /* K29 */ be_nested_str_weak(PAI_Cert_FFF1), - /* K30 */ be_nested_str_weak(CD_FFF1_8000), - /* K31 */ be_nested_str_weak(B1), - /* K32 */ be_nested_str_weak(U4), - /* K33 */ be_nested_str_weak(tasmota), - /* K34 */ be_nested_str_weak(rtc), - /* K35 */ be_nested_str_weak(utc), - /* K36 */ be_nested_str_weak(tlv2raw), - /* K37 */ be_nested_str_weak(get_ac), - /* K38 */ be_nested_str_weak(EC_P256), - /* K39 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K40 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K41 */ be_nested_str_weak(gen_CSR), - /* K42 */ be_nested_str_weak(set_temp_ca), - /* K43 */ be_nested_str_weak(SUCCESS), - /* K44 */ be_nested_str_weak(log), - /* K45 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K46 */ be_nested_str_weak(get_temp_ca), - /* K47 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K48 */ be_nested_str_weak(sessions), - /* K49 */ be_nested_str_weak(create_fabric), - /* K50 */ be_nested_str_weak(set_ca), - /* K51 */ be_nested_str_weak(set_noc_icac), - /* K52 */ be_nested_str_weak(set_ipk_epoch_key), - /* K53 */ be_nested_str_weak(set_admin_subject_vendor), - /* K54 */ be_nested_str_weak(set_pk), - /* K55 */ be_nested_str_weak(get_pk), - /* K56 */ be_nested_str_weak(parse), - /* K57 */ be_nested_str_weak(findsub), - /* K58 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K59 */ be_nested_str_weak(int), - /* K60 */ be_nested_str_weak(int64), - /* K61 */ be_nested_str_weak(fromu32), - /* K62 */ be_nested_str_weak(tobytes), - /* K63 */ be_nested_str_weak(get_temp_ca_pub), - /* K64 */ be_const_int(2147483647), - /* K65 */ be_nested_str_weak(fromstring), - /* K66 */ be_nested_str_weak(CompressedFabric), - /* K67 */ be_nested_str_weak(HKDF_SHA256), - /* K68 */ be_nested_str_weak(copy), - /* K69 */ be_nested_str_weak(reverse), - /* K70 */ be_nested_str_weak(derive), - /* K71 */ be_nested_str_weak(commissioning_admin_fabric), - /* K72 */ be_nested_str_weak(set_fabric_device), - /* K73 */ be_nested_str_weak(fabric_candidate), - /* K74 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K75 */ be_nested_str_weak(is_PASE), - /* K76 */ be_nested_str_weak(set_expire_in_seconds), - /* K77 */ be_nested_str_weak(log_new_fabric), - /* K78 */ be_nested_str_weak(set_fabric_label), - /* K79 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K80 */ be_nested_str_weak(get_fabric_id), - /* K81 */ be_nested_str_weak(tohex), - /* K82 */ be_nested_str_weak(fabric_index_X3A), - /* K83 */ be_nested_str_weak(active_fabrics), - /* K84 */ be_nested_str_weak(get_fabric_index), - /* K85 */ be_nested_str_weak(set_timer), - /* K86 */ be_nested_str_weak(stop_iteration), - /* K87 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K88 */ be_nested_str_weak(_X29_X20not_X20found), - /* K89 */ be_nested_str_weak(INVALID_ACTION), - /* K90 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K91 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K92 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K93 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K94 */ be_nested_str_weak(start_basic_commissioning), - /* K95 */ be_nested_str_weak(get_fabric), - /* K96 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K97 */ be_nested_str_weak(start_root_basic_commissioning), - /* K98 */ be_nested_str_weak(stop_basic_commissioning), - /* K99 */ be_nested_str_weak(invoke_request), + /* K17 */ be_nested_str_weak(send_ack_now), + /* K18 */ be_nested_str_weak(msg), + /* K19 */ be_nested_str_weak(_fabric), + /* K20 */ be_nested_str_weak(fabric_completed), + /* K21 */ be_nested_str_weak(set_no_expiration), + /* K22 */ be_nested_str_weak(save), + /* K23 */ be_nested_str_weak(device), + /* K24 */ be_nested_str_weak(start_commissioning_complete_deferred), + /* K25 */ be_nested_str_weak(context_error), + /* K26 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), + /* K27 */ be_nested_str_weak(status), + /* K28 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K29 */ be_nested_str_weak(B2), + /* K30 */ be_nested_str_weak(DAC_Cert_FFF1_8000), + /* K31 */ be_nested_str_weak(PAI_Cert_FFF1), + /* K32 */ be_nested_str_weak(CD_FFF1_8000), + /* K33 */ be_nested_str_weak(B1), + /* K34 */ be_nested_str_weak(U4), + /* K35 */ be_nested_str_weak(tasmota), + /* K36 */ be_nested_str_weak(rtc), + /* K37 */ be_nested_str_weak(utc), + /* K38 */ be_nested_str_weak(tlv2raw), + /* K39 */ be_nested_str_weak(get_ac), + /* K40 */ be_nested_str_weak(EC_P256), + /* K41 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K42 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K43 */ be_nested_str_weak(gen_CSR), + /* K44 */ be_nested_str_weak(set_temp_ca), + /* K45 */ be_nested_str_weak(SUCCESS), + /* K46 */ be_nested_str_weak(log), + /* K47 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K48 */ be_nested_str_weak(get_temp_ca), + /* K49 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K50 */ be_nested_str_weak(sessions), + /* K51 */ be_nested_str_weak(create_fabric), + /* K52 */ be_nested_str_weak(set_ca), + /* K53 */ be_nested_str_weak(set_noc_icac), + /* K54 */ be_nested_str_weak(set_ipk_epoch_key), + /* K55 */ be_nested_str_weak(set_admin_subject_vendor), + /* K56 */ be_nested_str_weak(set_pk), + /* K57 */ be_nested_str_weak(get_pk), + /* K58 */ be_nested_str_weak(parse), + /* K59 */ be_nested_str_weak(findsub), + /* K60 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K61 */ be_nested_str_weak(int), + /* K62 */ be_nested_str_weak(int64), + /* K63 */ be_nested_str_weak(fromu32), + /* K64 */ be_nested_str_weak(tobytes), + /* K65 */ be_nested_str_weak(get_temp_ca_pub), + /* K66 */ be_const_int(2147483647), + /* K67 */ be_nested_str_weak(fromstring), + /* K68 */ be_nested_str_weak(CompressedFabric), + /* K69 */ be_nested_str_weak(HKDF_SHA256), + /* K70 */ be_nested_str_weak(copy), + /* K71 */ be_nested_str_weak(reverse), + /* K72 */ be_nested_str_weak(derive), + /* K73 */ be_nested_str_weak(commissioning_admin_fabric), + /* K74 */ be_nested_str_weak(set_fabric_device), + /* K75 */ be_nested_str_weak(fabric_candidate), + /* K76 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K77 */ be_nested_str_weak(is_PASE), + /* K78 */ be_nested_str_weak(set_expire_in_seconds), + /* K79 */ be_nested_str_weak(log_new_fabric), + /* K80 */ be_nested_str_weak(set_fabric_label), + /* K81 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K82 */ be_nested_str_weak(get_fabric_id), + /* K83 */ be_nested_str_weak(tohex), + /* K84 */ be_nested_str_weak(fabric_index_X3A), + /* K85 */ be_nested_str_weak(active_fabrics), + /* K86 */ be_nested_str_weak(get_fabric_index), + /* K87 */ be_nested_str_weak(set_timer), + /* K88 */ be_nested_str_weak(stop_iteration), + /* K89 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K90 */ be_nested_str_weak(_X29_X20not_X20found), + /* K91 */ be_nested_str_weak(INVALID_ACTION), + /* K92 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K93 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K94 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K95 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K96 */ be_nested_str_weak(start_basic_commissioning), + /* K97 */ be_nested_str_weak(get_fabric), + /* K98 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K99 */ be_nested_str_weak(start_root_basic_commissioning), + /* K100 */ be_nested_str_weak(stop_basic_commissioning), + /* K101 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[708]) { /* code */ + ( &(const binstruction[714]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -159,7 +161,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x881C0704, // 0004 GETMBR R7 R3 K4 0x5422002F, // 0005 LDINT R8 48 0x1C200C08, // 0006 EQ R8 R6 R8 - 0x78220059, // 0007 JMPF R8 #0062 + 0x7822005C, // 0007 JMPF R8 #0065 0x1C200F05, // 0008 EQ R8 R7 K5 0x78220017, // 0009 JMPF R8 #0022 0x8C200506, // 000A GETMET R8 R2 K6 @@ -185,7 +187,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C2C0800, // 001E CALL R11 4 0x900E0907, // 001F SETMBR R3 K4 K7 0x80041400, // 0020 RET 1 R10 - 0x7002003E, // 0021 JMP #0061 + 0x70020041, // 0021 JMP #0064 0x1C200F0E, // 0022 EQ R8 R7 K14 0x7822001A, // 0023 JMPF R8 #003F 0x8C200506, // 0024 GETMET R8 R2 K6 @@ -214,652 +216,658 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C300800, // 003B CALL R12 4 0x900E0910, // 003C SETMBR R3 K4 K16 0x80041600, // 003D RET 1 R11 - 0x70020021, // 003E JMP #0061 + 0x70020024, // 003E JMP #0064 0x54220003, // 003F LDINT R8 4 0x1C200E08, // 0040 EQ R8 R7 R8 - 0x7822001E, // 0041 JMPF R8 #0061 - 0x88200311, // 0042 GETMBR R8 R1 K17 - 0x7822001B, // 0043 JMPF R8 #0060 - 0x90061105, // 0044 SETMBR R1 K8 K5 - 0x88200311, // 0045 GETMBR R8 R1 K17 - 0x8C201112, // 0046 GETMET R8 R8 K18 - 0x7C200200, // 0047 CALL R8 1 - 0x8C200313, // 0048 GETMET R8 R1 K19 - 0x7C200200, // 0049 CALL R8 1 - 0x8C200314, // 004A GETMET R8 R1 K20 - 0x7C200200, // 004B CALL R8 1 - 0x8C200B09, // 004C GETMET R8 R5 K9 - 0x7C200200, // 004D CALL R8 1 - 0x8C24110A, // 004E GETMET R9 R8 K10 - 0x582C0005, // 004F LDCONST R11 K5 - 0x88300B0B, // 0050 GETMBR R12 R5 K11 - 0x58340005, // 0051 LDCONST R13 K5 - 0x7C240800, // 0052 CALL R9 4 - 0x8C24110A, // 0053 GETMET R9 R8 K10 - 0x582C0007, // 0054 LDCONST R11 K7 - 0x88300B0C, // 0055 GETMBR R12 R5 K12 - 0x5834000D, // 0056 LDCONST R13 K13 - 0x7C240800, // 0057 CALL R9 4 - 0x54260004, // 0058 LDINT R9 5 - 0x900E0809, // 0059 SETMBR R3 K4 R9 - 0x88240115, // 005A GETMBR R9 R0 K21 - 0x8C241316, // 005B GETMET R9 R9 K22 - 0x5C2C0200, // 005C MOVE R11 R1 - 0x7C240400, // 005D CALL R9 2 - 0x80041000, // 005E RET 1 R8 - 0x70020000, // 005F JMP #0061 - 0xB0062F18, // 0060 RAISE 1 K23 K24 - 0x7002025F, // 0061 JMP #02C2 - 0x5422003D, // 0062 LDINT R8 62 - 0x1C200C08, // 0063 EQ R8 R6 R8 - 0x782201C0, // 0064 JMPF R8 #0226 - 0x1C200F0E, // 0065 EQ R8 R7 K14 - 0x7822001D, // 0066 JMPF R8 #0085 - 0x8C200506, // 0067 GETMET R8 R2 K6 - 0x58280005, // 0068 LDCONST R10 K5 - 0x7C200400, // 0069 CALL R8 2 - 0x20241107, // 006A NE R9 R8 K7 - 0x78260006, // 006B JMPF R9 #0073 - 0x2024110E, // 006C NE R9 R8 K14 - 0x78260004, // 006D JMPF R9 #0073 - 0xB8260200, // 006E GETNGBL R9 K1 - 0x8824131A, // 006F GETMBR R9 R9 K26 - 0x900E3209, // 0070 SETMBR R3 K25 R9 - 0x4C240000, // 0071 LDNIL R9 - 0x80041200, // 0072 RET 1 R9 - 0x8C240B09, // 0073 GETMET R9 R5 K9 - 0x7C240200, // 0074 CALL R9 1 - 0x8C28130A, // 0075 GETMET R10 R9 K10 - 0x58300005, // 0076 LDCONST R12 K5 - 0x88340B1B, // 0077 GETMBR R13 R5 K27 - 0x1C381107, // 0078 EQ R14 R8 K7 - 0x783A0003, // 0079 JMPF R14 #007E - 0xB83A0200, // 007A GETNGBL R14 K1 - 0x8C381D1C, // 007B GETMET R14 R14 K28 - 0x7C380200, // 007C CALL R14 1 - 0x70020002, // 007D JMP #0081 - 0xB83A0200, // 007E GETNGBL R14 K1 - 0x8C381D1D, // 007F GETMET R14 R14 K29 - 0x7C380200, // 0080 CALL R14 1 - 0x7C280800, // 0081 CALL R10 4 - 0x900E0910, // 0082 SETMBR R3 K4 K16 - 0x80041200, // 0083 RET 1 R9 - 0x7002019F, // 0084 JMP #0225 - 0x1C200F05, // 0085 EQ R8 R7 K5 - 0x7822003D, // 0086 JMPF R8 #00C5 - 0x8C200506, // 0087 GETMET R8 R2 K6 - 0x58280005, // 0088 LDCONST R10 K5 - 0x7C200400, // 0089 CALL R8 2 - 0x6024000C, // 008A GETGBL R9 G12 - 0x5C281000, // 008B MOVE R10 R8 - 0x7C240200, // 008C CALL R9 1 - 0x542A001F, // 008D LDINT R10 32 - 0x2024120A, // 008E NE R9 R9 R10 - 0x78260001, // 008F JMPF R9 #0092 - 0x4C240000, // 0090 LDNIL R9 - 0x80041200, // 0091 RET 1 R9 - 0x900E0907, // 0092 SETMBR R3 K4 K7 - 0x8C240B09, // 0093 GETMET R9 R5 K9 - 0x7C240200, // 0094 CALL R9 1 - 0x8C28130A, // 0095 GETMET R10 R9 K10 - 0x58300007, // 0096 LDCONST R12 K7 - 0x88340B1B, // 0097 GETMBR R13 R5 K27 - 0xB83A0200, // 0098 GETNGBL R14 K1 - 0x8C381D1E, // 0099 GETMET R14 R14 K30 - 0x7C380200, // 009A CALL R14 1 - 0x7C280800, // 009B CALL R10 4 - 0x8C28130A, // 009C GETMET R10 R9 K10 - 0x5830000E, // 009D LDCONST R12 K14 - 0x88340B1F, // 009E GETMBR R13 R5 K31 - 0x5C381000, // 009F MOVE R14 R8 - 0x7C280800, // 00A0 CALL R10 4 - 0x8C28130A, // 00A1 GETMET R10 R9 K10 - 0x58300010, // 00A2 LDCONST R12 K16 - 0x88340B20, // 00A3 GETMBR R13 R5 K32 - 0xB83A4200, // 00A4 GETNGBL R14 K33 - 0x8C381D22, // 00A5 GETMET R14 R14 K34 - 0x7C380200, // 00A6 CALL R14 1 - 0x94381D23, // 00A7 GETIDX R14 R14 K35 - 0x7C280800, // 00A8 CALL R10 4 - 0x8C281324, // 00A9 GETMET R10 R9 K36 - 0x7C280200, // 00AA CALL R10 1 - 0x8C2C0325, // 00AB GETMET R11 R1 K37 - 0x7C2C0200, // 00AC CALL R11 1 - 0x0030140B, // 00AD ADD R12 R10 R11 - 0x8C340926, // 00AE GETMET R13 R4 K38 - 0x7C340200, // 00AF CALL R13 1 - 0x8C341B27, // 00B0 GETMET R13 R13 K39 - 0xB83E0200, // 00B1 GETNGBL R15 K1 - 0x8C3C1F28, // 00B2 GETMET R15 R15 K40 - 0x7C3C0200, // 00B3 CALL R15 1 - 0x5C401800, // 00B4 MOVE R16 R12 - 0x7C340600, // 00B5 CALL R13 3 - 0x8C380B09, // 00B6 GETMET R14 R5 K9 - 0x7C380200, // 00B7 CALL R14 1 - 0x8C3C1D0A, // 00B8 GETMET R15 R14 K10 - 0x58440005, // 00B9 LDCONST R17 K5 - 0x88480B1B, // 00BA GETMBR R18 R5 K27 - 0x5C4C1400, // 00BB MOVE R19 R10 - 0x7C3C0800, // 00BC CALL R15 4 - 0x8C3C1D0A, // 00BD GETMET R15 R14 K10 - 0x58440007, // 00BE LDCONST R17 K7 - 0x88480B1F, // 00BF GETMBR R18 R5 K31 - 0x5C4C1A00, // 00C0 MOVE R19 R13 - 0x7C3C0800, // 00C1 CALL R15 4 - 0x900E0907, // 00C2 SETMBR R3 K4 K7 - 0x80041C00, // 00C3 RET 1 R14 - 0x7002015F, // 00C4 JMP #0225 - 0x54220003, // 00C5 LDINT R8 4 - 0x1C200E08, // 00C6 EQ R8 R7 R8 - 0x78220039, // 00C7 JMPF R8 #0102 - 0x8C200506, // 00C8 GETMET R8 R2 K6 - 0x58280005, // 00C9 LDCONST R10 K5 - 0x7C200400, // 00CA CALL R8 2 - 0x6024000C, // 00CB GETGBL R9 G12 - 0x5C281000, // 00CC MOVE R10 R8 - 0x7C240200, // 00CD CALL R9 1 - 0x542A001F, // 00CE LDINT R10 32 - 0x2024120A, // 00CF NE R9 R9 R10 - 0x78260001, // 00D0 JMPF R9 #00D3 - 0x4C240000, // 00D1 LDNIL R9 - 0x80041200, // 00D2 RET 1 R9 - 0x8C240506, // 00D3 GETMET R9 R2 K6 - 0x582C0007, // 00D4 LDCONST R11 K7 - 0x50300000, // 00D5 LDBOOL R12 0 0 - 0x7C240600, // 00D6 CALL R9 3 - 0x8C280329, // 00D7 GETMET R10 R1 K41 - 0x7C280200, // 00D8 CALL R10 1 - 0x8C2C0B09, // 00D9 GETMET R11 R5 K9 - 0x7C2C0200, // 00DA CALL R11 1 - 0x8C30170A, // 00DB GETMET R12 R11 K10 - 0x58380007, // 00DC LDCONST R14 K7 - 0x883C0B1B, // 00DD GETMBR R15 R5 K27 - 0x5C401400, // 00DE MOVE R16 R10 - 0x7C300800, // 00DF CALL R12 4 - 0x8C30170A, // 00E0 GETMET R12 R11 K10 - 0x5838000E, // 00E1 LDCONST R14 K14 - 0x883C0B1F, // 00E2 GETMBR R15 R5 K31 - 0x5C401000, // 00E3 MOVE R16 R8 - 0x7C300800, // 00E4 CALL R12 4 - 0x8C301724, // 00E5 GETMET R12 R11 K36 - 0x7C300200, // 00E6 CALL R12 1 - 0x8C340325, // 00E7 GETMET R13 R1 K37 - 0x7C340200, // 00E8 CALL R13 1 - 0x0034180D, // 00E9 ADD R13 R12 R13 - 0x8C380926, // 00EA GETMET R14 R4 K38 - 0x7C380200, // 00EB CALL R14 1 - 0x8C381D27, // 00EC GETMET R14 R14 K39 - 0xB8420200, // 00ED GETNGBL R16 K1 - 0x8C402128, // 00EE GETMET R16 R16 K40 - 0x7C400200, // 00EF CALL R16 1 - 0x5C441A00, // 00F0 MOVE R17 R13 - 0x7C380600, // 00F1 CALL R14 3 - 0x8C3C0B09, // 00F2 GETMET R15 R5 K9 - 0x7C3C0200, // 00F3 CALL R15 1 - 0x8C401F0A, // 00F4 GETMET R16 R15 K10 - 0x58480005, // 00F5 LDCONST R18 K5 - 0x884C0B1B, // 00F6 GETMBR R19 R5 K27 - 0x5C501800, // 00F7 MOVE R20 R12 - 0x7C400800, // 00F8 CALL R16 4 - 0x8C401F0A, // 00F9 GETMET R16 R15 K10 - 0x58480007, // 00FA LDCONST R18 K7 - 0x884C0B1F, // 00FB GETMBR R19 R5 K31 - 0x5C501C00, // 00FC MOVE R20 R14 - 0x7C400800, // 00FD CALL R16 4 - 0x54420004, // 00FE LDINT R16 5 - 0x900E0810, // 00FF SETMBR R3 K4 R16 - 0x80041E00, // 0100 RET 1 R15 - 0x70020122, // 0101 JMP #0225 - 0x5422000A, // 0102 LDINT R8 11 - 0x1C200E08, // 0103 EQ R8 R7 R8 - 0x7822000B, // 0104 JMPF R8 #0111 - 0x8C200506, // 0105 GETMET R8 R2 K6 - 0x58280005, // 0106 LDCONST R10 K5 - 0x7C200400, // 0107 CALL R8 2 - 0x8C24032A, // 0108 GETMET R9 R1 K42 - 0x5C2C1000, // 0109 MOVE R11 R8 - 0x7C240400, // 010A CALL R9 2 - 0xB8260200, // 010B GETNGBL R9 K1 - 0x8824132B, // 010C GETMBR R9 R9 K43 - 0x900E3209, // 010D SETMBR R3 K25 R9 - 0x4C240000, // 010E LDNIL R9 - 0x80041200, // 010F RET 1 R9 - 0x70020113, // 0110 JMP #0225 - 0x54220005, // 0111 LDINT R8 6 - 0x1C200E08, // 0112 EQ R8 R7 R8 - 0x782200B9, // 0113 JMPF R8 #01CE - 0xB8224200, // 0114 GETNGBL R8 K33 - 0x8C20112C, // 0115 GETMET R8 R8 K44 - 0x60280008, // 0116 GETGBL R10 G8 - 0x5C2C0400, // 0117 MOVE R11 R2 - 0x7C280200, // 0118 CALL R10 1 - 0x002A5A0A, // 0119 ADD R10 K45 R10 - 0x542E0003, // 011A LDINT R11 4 - 0x7C200600, // 011B CALL R8 3 - 0x8C200506, // 011C GETMET R8 R2 K6 - 0x58280005, // 011D LDCONST R10 K5 - 0x7C200400, // 011E CALL R8 2 - 0x8C240506, // 011F GETMET R9 R2 K6 - 0x582C0007, // 0120 LDCONST R11 K7 - 0x7C240400, // 0121 CALL R9 2 - 0x6028000C, // 0122 GETGBL R10 G12 - 0x5C2C1200, // 0123 MOVE R11 R9 - 0x7C280200, // 0124 CALL R10 1 - 0x1C281505, // 0125 EQ R10 R10 K5 - 0x782A0000, // 0126 JMPF R10 #0128 - 0x4C240000, // 0127 LDNIL R9 - 0x8C280506, // 0128 GETMET R10 R2 K6 - 0x5830000E, // 0129 LDCONST R12 K14 - 0x7C280400, // 012A CALL R10 2 - 0x8C2C0506, // 012B GETMET R11 R2 K6 - 0x58340010, // 012C LDCONST R13 K16 - 0x7C2C0400, // 012D CALL R11 2 - 0x8C300506, // 012E GETMET R12 R2 K6 - 0x543A0003, // 012F LDINT R14 4 - 0x7C300400, // 0130 CALL R12 2 - 0x8C34032E, // 0131 GETMET R13 R1 K46 - 0x7C340200, // 0132 CALL R13 1 - 0x4C380000, // 0133 LDNIL R14 - 0x1C341A0E, // 0134 EQ R13 R13 R14 - 0x78360006, // 0135 JMPF R13 #013D - 0xB8364200, // 0136 GETNGBL R13 K33 - 0x8C341B2C, // 0137 GETMET R13 R13 K44 - 0x583C002F, // 0138 LDCONST R15 K47 - 0x5840000E, // 0139 LDCONST R16 K14 - 0x7C340600, // 013A CALL R13 3 - 0x4C340000, // 013B LDNIL R13 - 0x80041A00, // 013C RET 1 R13 - 0x88340115, // 013D GETMBR R13 R0 K21 - 0x88341B30, // 013E GETMBR R13 R13 K48 - 0x8C341B31, // 013F GETMET R13 R13 K49 - 0x7C340200, // 0140 CALL R13 1 - 0x8C381B32, // 0141 GETMET R14 R13 K50 - 0x8C40032E, // 0142 GETMET R16 R1 K46 - 0x7C400200, // 0143 CALL R16 1 - 0x7C380400, // 0144 CALL R14 2 - 0x8C381B33, // 0145 GETMET R14 R13 K51 - 0x5C401000, // 0146 MOVE R16 R8 - 0x5C441200, // 0147 MOVE R17 R9 - 0x7C380600, // 0148 CALL R14 3 - 0x8C381B34, // 0149 GETMET R14 R13 K52 - 0x5C401400, // 014A MOVE R16 R10 - 0x7C380400, // 014B CALL R14 2 - 0x8C381B35, // 014C GETMET R14 R13 K53 - 0x5C401600, // 014D MOVE R16 R11 - 0x5C441800, // 014E MOVE R17 R12 - 0x7C380600, // 014F CALL R14 3 - 0x8C381B36, // 0150 GETMET R14 R13 K54 - 0x8C400337, // 0151 GETMET R16 R1 K55 - 0x7C400200, // 0152 CALL R16 1 - 0x7C380400, // 0153 CALL R14 2 - 0xB83A0200, // 0154 GETNGBL R14 K1 - 0x88381D02, // 0155 GETMBR R14 R14 K2 - 0x8C381D38, // 0156 GETMET R14 R14 K56 - 0x5C401000, // 0157 MOVE R16 R8 - 0x7C380400, // 0158 CALL R14 2 - 0x8C3C1D39, // 0159 GETMET R15 R14 K57 - 0x54460005, // 015A LDINT R17 6 - 0x7C3C0400, // 015B CALL R15 2 - 0x8C401F06, // 015C GETMET R16 R15 K6 - 0x544A0014, // 015D LDINT R18 21 - 0x7C400400, // 015E CALL R16 2 - 0x8C441F06, // 015F GETMET R17 R15 K6 - 0x544E0010, // 0160 LDINT R19 17 - 0x7C440400, // 0161 CALL R17 2 - 0x5C482000, // 0162 MOVE R18 R16 - 0x784A0001, // 0163 JMPF R18 #0166 - 0x5C482200, // 0164 MOVE R18 R17 - 0x744A0006, // 0165 JMPT R18 #016D - 0xB84A4200, // 0166 GETNGBL R18 K33 - 0x8C48252C, // 0167 GETMET R18 R18 K44 - 0x5850003A, // 0168 LDCONST R20 K58 - 0x5854000E, // 0169 LDCONST R21 K14 - 0x7C480600, // 016A CALL R18 3 - 0x50480000, // 016B LDBOOL R18 0 0 - 0x80042400, // 016C RET 1 R18 - 0x60480004, // 016D GETGBL R18 G4 - 0x5C4C2000, // 016E MOVE R19 R16 - 0x7C480200, // 016F CALL R18 1 - 0x1C48253B, // 0170 EQ R18 R18 K59 - 0x784A0007, // 0171 JMPF R18 #017A - 0xB84A7800, // 0172 GETNGBL R18 K60 - 0x8C48253D, // 0173 GETMET R18 R18 K61 - 0x5C502000, // 0174 MOVE R20 R16 - 0x7C480400, // 0175 CALL R18 2 - 0x8C48253E, // 0176 GETMET R18 R18 K62 - 0x7C480200, // 0177 CALL R18 1 - 0x5C402400, // 0178 MOVE R16 R18 - 0x70020002, // 0179 JMP #017D - 0x8C48213E, // 017A GETMET R18 R16 K62 - 0x7C480200, // 017B CALL R18 1 - 0x5C402400, // 017C MOVE R16 R18 - 0x60480004, // 017D GETGBL R18 G4 - 0x5C4C2200, // 017E MOVE R19 R17 - 0x7C480200, // 017F CALL R18 1 - 0x1C48253B, // 0180 EQ R18 R18 K59 - 0x784A0007, // 0181 JMPF R18 #018A - 0xB84A7800, // 0182 GETNGBL R18 K60 - 0x8C48253D, // 0183 GETMET R18 R18 K61 - 0x5C502200, // 0184 MOVE R20 R17 - 0x7C480400, // 0185 CALL R18 2 - 0x8C48253E, // 0186 GETMET R18 R18 K62 - 0x7C480200, // 0187 CALL R18 1 - 0x5C442400, // 0188 MOVE R17 R18 - 0x70020002, // 0189 JMP #018D - 0x8C48233E, // 018A GETMET R18 R17 K62 - 0x7C480200, // 018B CALL R18 1 - 0x5C442400, // 018C MOVE R17 R18 - 0x8C48033F, // 018D GETMET R18 R1 K63 - 0x7C480200, // 018E CALL R18 1 - 0x404E0F40, // 018F CONNECT R19 K7 K64 - 0x94482413, // 0190 GETIDX R18 R18 R19 - 0x60500015, // 0191 GETGBL R20 G21 - 0x7C500000, // 0192 CALL R20 0 - 0x8C502941, // 0193 GETMET R20 R20 K65 - 0x58580042, // 0194 LDCONST R22 K66 - 0x7C500400, // 0195 CALL R20 2 - 0x5C4C2800, // 0196 MOVE R19 R20 - 0x8C500943, // 0197 GETMET R20 R4 K67 - 0x7C500200, // 0198 CALL R20 1 - 0x8C542144, // 0199 GETMET R21 R16 K68 - 0x7C540200, // 019A CALL R21 1 - 0x8C542B45, // 019B GETMET R21 R21 K69 - 0x7C540200, // 019C CALL R21 1 - 0x8C582946, // 019D GETMET R22 R20 K70 - 0x5C602400, // 019E MOVE R24 R18 - 0x5C642A00, // 019F MOVE R25 R21 - 0x5C682600, // 01A0 MOVE R26 R19 - 0x546E0007, // 01A1 LDINT R27 8 - 0x7C580A00, // 01A2 CALL R22 5 - 0x885C0311, // 01A3 GETMBR R23 R1 K17 - 0x785E0001, // 01A4 JMPF R23 #01A7 - 0x885C0311, // 01A5 GETMBR R23 R1 K17 - 0x70020001, // 01A6 JMP #01A9 - 0x885C0115, // 01A7 GETMBR R23 R0 K21 - 0x885C2F47, // 01A8 GETMBR R23 R23 K71 - 0x8C601B48, // 01A9 GETMET R24 R13 K72 - 0x5C682000, // 01AA MOVE R26 R16 - 0x5C6C2200, // 01AB MOVE R27 R17 - 0x5C702C00, // 01AC MOVE R28 R22 - 0x5C742E00, // 01AD MOVE R29 R23 - 0x7C600A00, // 01AE CALL R24 5 - 0x8C601B49, // 01AF GETMET R24 R13 K73 - 0x7C600200, // 01B0 CALL R24 1 - 0x88600115, // 01B1 GETMBR R24 R0 K21 - 0x8C60314A, // 01B2 GETMET R24 R24 K74 - 0x5C681A00, // 01B3 MOVE R26 R13 - 0x7C600400, // 01B4 CALL R24 2 - 0x8C60034B, // 01B5 GETMET R24 R1 K75 + 0x78220021, // 0041 JMPF R8 #0064 + 0x8C200111, // 0042 GETMET R8 R0 K17 + 0x88280712, // 0043 GETMBR R10 R3 K18 + 0x7C200400, // 0044 CALL R8 2 + 0x88200313, // 0045 GETMBR R8 R1 K19 + 0x7822001B, // 0046 JMPF R8 #0063 + 0x90061105, // 0047 SETMBR R1 K8 K5 + 0x88200313, // 0048 GETMBR R8 R1 K19 + 0x8C201114, // 0049 GETMET R8 R8 K20 + 0x7C200200, // 004A CALL R8 1 + 0x8C200315, // 004B GETMET R8 R1 K21 + 0x7C200200, // 004C CALL R8 1 + 0x8C200316, // 004D GETMET R8 R1 K22 + 0x7C200200, // 004E CALL R8 1 + 0x8C200B09, // 004F GETMET R8 R5 K9 + 0x7C200200, // 0050 CALL R8 1 + 0x8C24110A, // 0051 GETMET R9 R8 K10 + 0x582C0005, // 0052 LDCONST R11 K5 + 0x88300B0B, // 0053 GETMBR R12 R5 K11 + 0x58340005, // 0054 LDCONST R13 K5 + 0x7C240800, // 0055 CALL R9 4 + 0x8C24110A, // 0056 GETMET R9 R8 K10 + 0x582C0007, // 0057 LDCONST R11 K7 + 0x88300B0C, // 0058 GETMBR R12 R5 K12 + 0x5834000D, // 0059 LDCONST R13 K13 + 0x7C240800, // 005A CALL R9 4 + 0x54260004, // 005B LDINT R9 5 + 0x900E0809, // 005C SETMBR R3 K4 R9 + 0x88240117, // 005D GETMBR R9 R0 K23 + 0x8C241318, // 005E GETMET R9 R9 K24 + 0x5C2C0200, // 005F MOVE R11 R1 + 0x7C240400, // 0060 CALL R9 2 + 0x80041000, // 0061 RET 1 R8 + 0x70020000, // 0062 JMP #0064 + 0xB006331A, // 0063 RAISE 1 K25 K26 + 0x70020262, // 0064 JMP #02C8 + 0x5422003D, // 0065 LDINT R8 62 + 0x1C200C08, // 0066 EQ R8 R6 R8 + 0x782201C3, // 0067 JMPF R8 #022C + 0x1C200F0E, // 0068 EQ R8 R7 K14 + 0x7822001D, // 0069 JMPF R8 #0088 + 0x8C200506, // 006A GETMET R8 R2 K6 + 0x58280005, // 006B LDCONST R10 K5 + 0x7C200400, // 006C CALL R8 2 + 0x20241107, // 006D NE R9 R8 K7 + 0x78260006, // 006E JMPF R9 #0076 + 0x2024110E, // 006F NE R9 R8 K14 + 0x78260004, // 0070 JMPF R9 #0076 + 0xB8260200, // 0071 GETNGBL R9 K1 + 0x8824131C, // 0072 GETMBR R9 R9 K28 + 0x900E3609, // 0073 SETMBR R3 K27 R9 + 0x4C240000, // 0074 LDNIL R9 + 0x80041200, // 0075 RET 1 R9 + 0x8C240B09, // 0076 GETMET R9 R5 K9 + 0x7C240200, // 0077 CALL R9 1 + 0x8C28130A, // 0078 GETMET R10 R9 K10 + 0x58300005, // 0079 LDCONST R12 K5 + 0x88340B1D, // 007A GETMBR R13 R5 K29 + 0x1C381107, // 007B EQ R14 R8 K7 + 0x783A0003, // 007C JMPF R14 #0081 + 0xB83A0200, // 007D GETNGBL R14 K1 + 0x8C381D1E, // 007E GETMET R14 R14 K30 + 0x7C380200, // 007F CALL R14 1 + 0x70020002, // 0080 JMP #0084 + 0xB83A0200, // 0081 GETNGBL R14 K1 + 0x8C381D1F, // 0082 GETMET R14 R14 K31 + 0x7C380200, // 0083 CALL R14 1 + 0x7C280800, // 0084 CALL R10 4 + 0x900E0910, // 0085 SETMBR R3 K4 K16 + 0x80041200, // 0086 RET 1 R9 + 0x700201A2, // 0087 JMP #022B + 0x1C200F05, // 0088 EQ R8 R7 K5 + 0x7822003D, // 0089 JMPF R8 #00C8 + 0x8C200506, // 008A GETMET R8 R2 K6 + 0x58280005, // 008B LDCONST R10 K5 + 0x7C200400, // 008C CALL R8 2 + 0x6024000C, // 008D GETGBL R9 G12 + 0x5C281000, // 008E MOVE R10 R8 + 0x7C240200, // 008F CALL R9 1 + 0x542A001F, // 0090 LDINT R10 32 + 0x2024120A, // 0091 NE R9 R9 R10 + 0x78260001, // 0092 JMPF R9 #0095 + 0x4C240000, // 0093 LDNIL R9 + 0x80041200, // 0094 RET 1 R9 + 0x900E0907, // 0095 SETMBR R3 K4 K7 + 0x8C240B09, // 0096 GETMET R9 R5 K9 + 0x7C240200, // 0097 CALL R9 1 + 0x8C28130A, // 0098 GETMET R10 R9 K10 + 0x58300007, // 0099 LDCONST R12 K7 + 0x88340B1D, // 009A GETMBR R13 R5 K29 + 0xB83A0200, // 009B GETNGBL R14 K1 + 0x8C381D20, // 009C GETMET R14 R14 K32 + 0x7C380200, // 009D CALL R14 1 + 0x7C280800, // 009E CALL R10 4 + 0x8C28130A, // 009F GETMET R10 R9 K10 + 0x5830000E, // 00A0 LDCONST R12 K14 + 0x88340B21, // 00A1 GETMBR R13 R5 K33 + 0x5C381000, // 00A2 MOVE R14 R8 + 0x7C280800, // 00A3 CALL R10 4 + 0x8C28130A, // 00A4 GETMET R10 R9 K10 + 0x58300010, // 00A5 LDCONST R12 K16 + 0x88340B22, // 00A6 GETMBR R13 R5 K34 + 0xB83A4600, // 00A7 GETNGBL R14 K35 + 0x8C381D24, // 00A8 GETMET R14 R14 K36 + 0x7C380200, // 00A9 CALL R14 1 + 0x94381D25, // 00AA GETIDX R14 R14 K37 + 0x7C280800, // 00AB CALL R10 4 + 0x8C281326, // 00AC GETMET R10 R9 K38 + 0x7C280200, // 00AD CALL R10 1 + 0x8C2C0327, // 00AE GETMET R11 R1 K39 + 0x7C2C0200, // 00AF CALL R11 1 + 0x0030140B, // 00B0 ADD R12 R10 R11 + 0x8C340928, // 00B1 GETMET R13 R4 K40 + 0x7C340200, // 00B2 CALL R13 1 + 0x8C341B29, // 00B3 GETMET R13 R13 K41 + 0xB83E0200, // 00B4 GETNGBL R15 K1 + 0x8C3C1F2A, // 00B5 GETMET R15 R15 K42 + 0x7C3C0200, // 00B6 CALL R15 1 + 0x5C401800, // 00B7 MOVE R16 R12 + 0x7C340600, // 00B8 CALL R13 3 + 0x8C380B09, // 00B9 GETMET R14 R5 K9 + 0x7C380200, // 00BA CALL R14 1 + 0x8C3C1D0A, // 00BB GETMET R15 R14 K10 + 0x58440005, // 00BC LDCONST R17 K5 + 0x88480B1D, // 00BD GETMBR R18 R5 K29 + 0x5C4C1400, // 00BE MOVE R19 R10 + 0x7C3C0800, // 00BF CALL R15 4 + 0x8C3C1D0A, // 00C0 GETMET R15 R14 K10 + 0x58440007, // 00C1 LDCONST R17 K7 + 0x88480B21, // 00C2 GETMBR R18 R5 K33 + 0x5C4C1A00, // 00C3 MOVE R19 R13 + 0x7C3C0800, // 00C4 CALL R15 4 + 0x900E0907, // 00C5 SETMBR R3 K4 K7 + 0x80041C00, // 00C6 RET 1 R14 + 0x70020162, // 00C7 JMP #022B + 0x54220003, // 00C8 LDINT R8 4 + 0x1C200E08, // 00C9 EQ R8 R7 R8 + 0x7822003C, // 00CA JMPF R8 #0108 + 0x8C200111, // 00CB GETMET R8 R0 K17 + 0x88280712, // 00CC GETMBR R10 R3 K18 + 0x7C200400, // 00CD CALL R8 2 + 0x8C200506, // 00CE GETMET R8 R2 K6 + 0x58280005, // 00CF LDCONST R10 K5 + 0x7C200400, // 00D0 CALL R8 2 + 0x6024000C, // 00D1 GETGBL R9 G12 + 0x5C281000, // 00D2 MOVE R10 R8 + 0x7C240200, // 00D3 CALL R9 1 + 0x542A001F, // 00D4 LDINT R10 32 + 0x2024120A, // 00D5 NE R9 R9 R10 + 0x78260001, // 00D6 JMPF R9 #00D9 + 0x4C240000, // 00D7 LDNIL R9 + 0x80041200, // 00D8 RET 1 R9 + 0x8C240506, // 00D9 GETMET R9 R2 K6 + 0x582C0007, // 00DA LDCONST R11 K7 + 0x50300000, // 00DB LDBOOL R12 0 0 + 0x7C240600, // 00DC CALL R9 3 + 0x8C28032B, // 00DD GETMET R10 R1 K43 + 0x7C280200, // 00DE CALL R10 1 + 0x8C2C0B09, // 00DF GETMET R11 R5 K9 + 0x7C2C0200, // 00E0 CALL R11 1 + 0x8C30170A, // 00E1 GETMET R12 R11 K10 + 0x58380007, // 00E2 LDCONST R14 K7 + 0x883C0B1D, // 00E3 GETMBR R15 R5 K29 + 0x5C401400, // 00E4 MOVE R16 R10 + 0x7C300800, // 00E5 CALL R12 4 + 0x8C30170A, // 00E6 GETMET R12 R11 K10 + 0x5838000E, // 00E7 LDCONST R14 K14 + 0x883C0B21, // 00E8 GETMBR R15 R5 K33 + 0x5C401000, // 00E9 MOVE R16 R8 + 0x7C300800, // 00EA CALL R12 4 + 0x8C301726, // 00EB GETMET R12 R11 K38 + 0x7C300200, // 00EC CALL R12 1 + 0x8C340327, // 00ED GETMET R13 R1 K39 + 0x7C340200, // 00EE CALL R13 1 + 0x0034180D, // 00EF ADD R13 R12 R13 + 0x8C380928, // 00F0 GETMET R14 R4 K40 + 0x7C380200, // 00F1 CALL R14 1 + 0x8C381D29, // 00F2 GETMET R14 R14 K41 + 0xB8420200, // 00F3 GETNGBL R16 K1 + 0x8C40212A, // 00F4 GETMET R16 R16 K42 + 0x7C400200, // 00F5 CALL R16 1 + 0x5C441A00, // 00F6 MOVE R17 R13 + 0x7C380600, // 00F7 CALL R14 3 + 0x8C3C0B09, // 00F8 GETMET R15 R5 K9 + 0x7C3C0200, // 00F9 CALL R15 1 + 0x8C401F0A, // 00FA GETMET R16 R15 K10 + 0x58480005, // 00FB LDCONST R18 K5 + 0x884C0B1D, // 00FC GETMBR R19 R5 K29 + 0x5C501800, // 00FD MOVE R20 R12 + 0x7C400800, // 00FE CALL R16 4 + 0x8C401F0A, // 00FF GETMET R16 R15 K10 + 0x58480007, // 0100 LDCONST R18 K7 + 0x884C0B21, // 0101 GETMBR R19 R5 K33 + 0x5C501C00, // 0102 MOVE R20 R14 + 0x7C400800, // 0103 CALL R16 4 + 0x54420004, // 0104 LDINT R16 5 + 0x900E0810, // 0105 SETMBR R3 K4 R16 + 0x80041E00, // 0106 RET 1 R15 + 0x70020122, // 0107 JMP #022B + 0x5422000A, // 0108 LDINT R8 11 + 0x1C200E08, // 0109 EQ R8 R7 R8 + 0x7822000B, // 010A JMPF R8 #0117 + 0x8C200506, // 010B GETMET R8 R2 K6 + 0x58280005, // 010C LDCONST R10 K5 + 0x7C200400, // 010D CALL R8 2 + 0x8C24032C, // 010E GETMET R9 R1 K44 + 0x5C2C1000, // 010F MOVE R11 R8 + 0x7C240400, // 0110 CALL R9 2 + 0xB8260200, // 0111 GETNGBL R9 K1 + 0x8824132D, // 0112 GETMBR R9 R9 K45 + 0x900E3609, // 0113 SETMBR R3 K27 R9 + 0x4C240000, // 0114 LDNIL R9 + 0x80041200, // 0115 RET 1 R9 + 0x70020113, // 0116 JMP #022B + 0x54220005, // 0117 LDINT R8 6 + 0x1C200E08, // 0118 EQ R8 R7 R8 + 0x782200B9, // 0119 JMPF R8 #01D4 + 0xB8224600, // 011A GETNGBL R8 K35 + 0x8C20112E, // 011B GETMET R8 R8 K46 + 0x60280008, // 011C GETGBL R10 G8 + 0x5C2C0400, // 011D MOVE R11 R2 + 0x7C280200, // 011E CALL R10 1 + 0x002A5E0A, // 011F ADD R10 K47 R10 + 0x542E0003, // 0120 LDINT R11 4 + 0x7C200600, // 0121 CALL R8 3 + 0x8C200506, // 0122 GETMET R8 R2 K6 + 0x58280005, // 0123 LDCONST R10 K5 + 0x7C200400, // 0124 CALL R8 2 + 0x8C240506, // 0125 GETMET R9 R2 K6 + 0x582C0007, // 0126 LDCONST R11 K7 + 0x7C240400, // 0127 CALL R9 2 + 0x6028000C, // 0128 GETGBL R10 G12 + 0x5C2C1200, // 0129 MOVE R11 R9 + 0x7C280200, // 012A CALL R10 1 + 0x1C281505, // 012B EQ R10 R10 K5 + 0x782A0000, // 012C JMPF R10 #012E + 0x4C240000, // 012D LDNIL R9 + 0x8C280506, // 012E GETMET R10 R2 K6 + 0x5830000E, // 012F LDCONST R12 K14 + 0x7C280400, // 0130 CALL R10 2 + 0x8C2C0506, // 0131 GETMET R11 R2 K6 + 0x58340010, // 0132 LDCONST R13 K16 + 0x7C2C0400, // 0133 CALL R11 2 + 0x8C300506, // 0134 GETMET R12 R2 K6 + 0x543A0003, // 0135 LDINT R14 4 + 0x7C300400, // 0136 CALL R12 2 + 0x8C340330, // 0137 GETMET R13 R1 K48 + 0x7C340200, // 0138 CALL R13 1 + 0x4C380000, // 0139 LDNIL R14 + 0x1C341A0E, // 013A EQ R13 R13 R14 + 0x78360006, // 013B JMPF R13 #0143 + 0xB8364600, // 013C GETNGBL R13 K35 + 0x8C341B2E, // 013D GETMET R13 R13 K46 + 0x583C0031, // 013E LDCONST R15 K49 + 0x5840000E, // 013F LDCONST R16 K14 + 0x7C340600, // 0140 CALL R13 3 + 0x4C340000, // 0141 LDNIL R13 + 0x80041A00, // 0142 RET 1 R13 + 0x88340117, // 0143 GETMBR R13 R0 K23 + 0x88341B32, // 0144 GETMBR R13 R13 K50 + 0x8C341B33, // 0145 GETMET R13 R13 K51 + 0x7C340200, // 0146 CALL R13 1 + 0x8C381B34, // 0147 GETMET R14 R13 K52 + 0x8C400330, // 0148 GETMET R16 R1 K48 + 0x7C400200, // 0149 CALL R16 1 + 0x7C380400, // 014A CALL R14 2 + 0x8C381B35, // 014B GETMET R14 R13 K53 + 0x5C401000, // 014C MOVE R16 R8 + 0x5C441200, // 014D MOVE R17 R9 + 0x7C380600, // 014E CALL R14 3 + 0x8C381B36, // 014F GETMET R14 R13 K54 + 0x5C401400, // 0150 MOVE R16 R10 + 0x7C380400, // 0151 CALL R14 2 + 0x8C381B37, // 0152 GETMET R14 R13 K55 + 0x5C401600, // 0153 MOVE R16 R11 + 0x5C441800, // 0154 MOVE R17 R12 + 0x7C380600, // 0155 CALL R14 3 + 0x8C381B38, // 0156 GETMET R14 R13 K56 + 0x8C400339, // 0157 GETMET R16 R1 K57 + 0x7C400200, // 0158 CALL R16 1 + 0x7C380400, // 0159 CALL R14 2 + 0xB83A0200, // 015A GETNGBL R14 K1 + 0x88381D02, // 015B GETMBR R14 R14 K2 + 0x8C381D3A, // 015C GETMET R14 R14 K58 + 0x5C401000, // 015D MOVE R16 R8 + 0x7C380400, // 015E CALL R14 2 + 0x8C3C1D3B, // 015F GETMET R15 R14 K59 + 0x54460005, // 0160 LDINT R17 6 + 0x7C3C0400, // 0161 CALL R15 2 + 0x8C401F06, // 0162 GETMET R16 R15 K6 + 0x544A0014, // 0163 LDINT R18 21 + 0x7C400400, // 0164 CALL R16 2 + 0x8C441F06, // 0165 GETMET R17 R15 K6 + 0x544E0010, // 0166 LDINT R19 17 + 0x7C440400, // 0167 CALL R17 2 + 0x5C482000, // 0168 MOVE R18 R16 + 0x784A0001, // 0169 JMPF R18 #016C + 0x5C482200, // 016A MOVE R18 R17 + 0x744A0006, // 016B JMPT R18 #0173 + 0xB84A4600, // 016C GETNGBL R18 K35 + 0x8C48252E, // 016D GETMET R18 R18 K46 + 0x5850003C, // 016E LDCONST R20 K60 + 0x5854000E, // 016F LDCONST R21 K14 + 0x7C480600, // 0170 CALL R18 3 + 0x50480000, // 0171 LDBOOL R18 0 0 + 0x80042400, // 0172 RET 1 R18 + 0x60480004, // 0173 GETGBL R18 G4 + 0x5C4C2000, // 0174 MOVE R19 R16 + 0x7C480200, // 0175 CALL R18 1 + 0x1C48253D, // 0176 EQ R18 R18 K61 + 0x784A0007, // 0177 JMPF R18 #0180 + 0xB84A7C00, // 0178 GETNGBL R18 K62 + 0x8C48253F, // 0179 GETMET R18 R18 K63 + 0x5C502000, // 017A MOVE R20 R16 + 0x7C480400, // 017B CALL R18 2 + 0x8C482540, // 017C GETMET R18 R18 K64 + 0x7C480200, // 017D CALL R18 1 + 0x5C402400, // 017E MOVE R16 R18 + 0x70020002, // 017F JMP #0183 + 0x8C482140, // 0180 GETMET R18 R16 K64 + 0x7C480200, // 0181 CALL R18 1 + 0x5C402400, // 0182 MOVE R16 R18 + 0x60480004, // 0183 GETGBL R18 G4 + 0x5C4C2200, // 0184 MOVE R19 R17 + 0x7C480200, // 0185 CALL R18 1 + 0x1C48253D, // 0186 EQ R18 R18 K61 + 0x784A0007, // 0187 JMPF R18 #0190 + 0xB84A7C00, // 0188 GETNGBL R18 K62 + 0x8C48253F, // 0189 GETMET R18 R18 K63 + 0x5C502200, // 018A MOVE R20 R17 + 0x7C480400, // 018B CALL R18 2 + 0x8C482540, // 018C GETMET R18 R18 K64 + 0x7C480200, // 018D CALL R18 1 + 0x5C442400, // 018E MOVE R17 R18 + 0x70020002, // 018F JMP #0193 + 0x8C482340, // 0190 GETMET R18 R17 K64 + 0x7C480200, // 0191 CALL R18 1 + 0x5C442400, // 0192 MOVE R17 R18 + 0x8C480341, // 0193 GETMET R18 R1 K65 + 0x7C480200, // 0194 CALL R18 1 + 0x404E0F42, // 0195 CONNECT R19 K7 K66 + 0x94482413, // 0196 GETIDX R18 R18 R19 + 0x60500015, // 0197 GETGBL R20 G21 + 0x7C500000, // 0198 CALL R20 0 + 0x8C502943, // 0199 GETMET R20 R20 K67 + 0x58580044, // 019A LDCONST R22 K68 + 0x7C500400, // 019B CALL R20 2 + 0x5C4C2800, // 019C MOVE R19 R20 + 0x8C500945, // 019D GETMET R20 R4 K69 + 0x7C500200, // 019E CALL R20 1 + 0x8C542146, // 019F GETMET R21 R16 K70 + 0x7C540200, // 01A0 CALL R21 1 + 0x8C542B47, // 01A1 GETMET R21 R21 K71 + 0x7C540200, // 01A2 CALL R21 1 + 0x8C582948, // 01A3 GETMET R22 R20 K72 + 0x5C602400, // 01A4 MOVE R24 R18 + 0x5C642A00, // 01A5 MOVE R25 R21 + 0x5C682600, // 01A6 MOVE R26 R19 + 0x546E0007, // 01A7 LDINT R27 8 + 0x7C580A00, // 01A8 CALL R22 5 + 0x885C0313, // 01A9 GETMBR R23 R1 K19 + 0x785E0001, // 01AA JMPF R23 #01AD + 0x885C0313, // 01AB GETMBR R23 R1 K19 + 0x70020001, // 01AC JMP #01AF + 0x885C0117, // 01AD GETMBR R23 R0 K23 + 0x885C2F49, // 01AE GETMBR R23 R23 K73 + 0x8C601B4A, // 01AF GETMET R24 R13 K74 + 0x5C682000, // 01B0 MOVE R26 R16 + 0x5C6C2200, // 01B1 MOVE R27 R17 + 0x5C702C00, // 01B2 MOVE R28 R22 + 0x5C742E00, // 01B3 MOVE R29 R23 + 0x7C600A00, // 01B4 CALL R24 5 + 0x8C601B4B, // 01B5 GETMET R24 R13 K75 0x7C600200, // 01B6 CALL R24 1 - 0x78620002, // 01B7 JMPF R24 #01BB - 0x8C60034C, // 01B8 GETMET R24 R1 K76 - 0x546A003B, // 01B9 LDINT R26 60 + 0x88600117, // 01B7 GETMBR R24 R0 K23 + 0x8C60314C, // 01B8 GETMET R24 R24 K76 + 0x5C681A00, // 01B9 MOVE R26 R13 0x7C600400, // 01BA CALL R24 2 - 0x8C601B4D, // 01BB GETMET R24 R13 K77 + 0x8C60034D, // 01BB GETMET R24 R1 K77 0x7C600200, // 01BC CALL R24 1 - 0x8C600B09, // 01BD GETMET R24 R5 K9 - 0x7C600200, // 01BE CALL R24 1 - 0x8C64310A, // 01BF GETMET R25 R24 K10 - 0x586C0005, // 01C0 LDCONST R27 K5 - 0x88700B0B, // 01C1 GETMBR R28 R5 K11 - 0xB8760200, // 01C2 GETNGBL R29 K1 - 0x88743B2B, // 01C3 GETMBR R29 R29 K43 - 0x7C640800, // 01C4 CALL R25 4 + 0x78620002, // 01BD JMPF R24 #01C1 + 0x8C60034E, // 01BE GETMET R24 R1 K78 + 0x546A003B, // 01BF LDINT R26 60 + 0x7C600400, // 01C0 CALL R24 2 + 0x8C601B4F, // 01C1 GETMET R24 R13 K79 + 0x7C600200, // 01C2 CALL R24 1 + 0x8C600B09, // 01C3 GETMET R24 R5 K9 + 0x7C600200, // 01C4 CALL R24 1 0x8C64310A, // 01C5 GETMET R25 R24 K10 - 0x586C0007, // 01C6 LDCONST R27 K7 + 0x586C0005, // 01C6 LDCONST R27 K5 0x88700B0B, // 01C7 GETMBR R28 R5 K11 - 0x58740007, // 01C8 LDCONST R29 K7 - 0x7C640800, // 01C9 CALL R25 4 - 0x54660007, // 01CA LDINT R25 8 - 0x900E0819, // 01CB SETMBR R3 K4 R25 - 0x80043000, // 01CC RET 1 R24 - 0x70020056, // 01CD JMP #0225 - 0x54220008, // 01CE LDINT R8 9 - 0x1C200E08, // 01CF EQ R8 R7 R8 - 0x7822001E, // 01D0 JMPF R8 #01F0 - 0x8C200506, // 01D1 GETMET R8 R2 K6 - 0x58280005, // 01D2 LDCONST R10 K5 - 0x7C200400, // 01D3 CALL R8 2 - 0x8C24034E, // 01D4 GETMET R9 R1 K78 - 0x5C2C1000, // 01D5 MOVE R11 R8 - 0x7C240400, // 01D6 CALL R9 2 - 0xB8264200, // 01D7 GETNGBL R9 K33 - 0x8C24132C, // 01D8 GETMET R9 R9 K44 - 0x602C0018, // 01D9 GETGBL R11 G24 - 0x5830004F, // 01DA LDCONST R12 K79 - 0x88340311, // 01DB GETMBR R13 R1 K17 - 0x8C341B50, // 01DC GETMET R13 R13 K80 - 0x7C340200, // 01DD CALL R13 1 - 0x8C341B44, // 01DE GETMET R13 R13 K68 - 0x7C340200, // 01DF CALL R13 1 - 0x8C341B45, // 01E0 GETMET R13 R13 K69 - 0x7C340200, // 01E1 CALL R13 1 - 0x8C341B51, // 01E2 GETMET R13 R13 K81 + 0xB8760200, // 01C8 GETNGBL R29 K1 + 0x88743B2D, // 01C9 GETMBR R29 R29 K45 + 0x7C640800, // 01CA CALL R25 4 + 0x8C64310A, // 01CB GETMET R25 R24 K10 + 0x586C0007, // 01CC LDCONST R27 K7 + 0x88700B0B, // 01CD GETMBR R28 R5 K11 + 0x58740007, // 01CE LDCONST R29 K7 + 0x7C640800, // 01CF CALL R25 4 + 0x54660007, // 01D0 LDINT R25 8 + 0x900E0819, // 01D1 SETMBR R3 K4 R25 + 0x80043000, // 01D2 RET 1 R24 + 0x70020056, // 01D3 JMP #022B + 0x54220008, // 01D4 LDINT R8 9 + 0x1C200E08, // 01D5 EQ R8 R7 R8 + 0x7822001E, // 01D6 JMPF R8 #01F6 + 0x8C200506, // 01D7 GETMET R8 R2 K6 + 0x58280005, // 01D8 LDCONST R10 K5 + 0x7C200400, // 01D9 CALL R8 2 + 0x8C240350, // 01DA GETMET R9 R1 K80 + 0x5C2C1000, // 01DB MOVE R11 R8 + 0x7C240400, // 01DC CALL R9 2 + 0xB8264600, // 01DD GETNGBL R9 K35 + 0x8C24132E, // 01DE GETMET R9 R9 K46 + 0x602C0018, // 01DF GETGBL R11 G24 + 0x58300051, // 01E0 LDCONST R12 K81 + 0x88340313, // 01E1 GETMBR R13 R1 K19 + 0x8C341B52, // 01E2 GETMET R13 R13 K82 0x7C340200, // 01E3 CALL R13 1 - 0x60380008, // 01E4 GETGBL R14 G8 - 0x5C3C1000, // 01E5 MOVE R15 R8 - 0x7C380200, // 01E6 CALL R14 1 - 0x7C2C0600, // 01E7 CALL R11 3 - 0x58300010, // 01E8 LDCONST R12 K16 - 0x7C240600, // 01E9 CALL R9 3 - 0xB8260200, // 01EA GETNGBL R9 K1 - 0x8824132B, // 01EB GETMBR R9 R9 K43 - 0x900E3209, // 01EC SETMBR R3 K25 R9 - 0x4C240000, // 01ED LDNIL R9 - 0x80041200, // 01EE RET 1 R9 - 0x70020034, // 01EF JMP #0225 - 0x54220009, // 01F0 LDINT R8 10 - 0x1C200E08, // 01F1 EQ R8 R7 R8 - 0x78220031, // 01F2 JMPF R8 #0225 - 0x8C200506, // 01F3 GETMET R8 R2 K6 - 0x58280005, // 01F4 LDCONST R10 K5 - 0x7C200400, // 01F5 CALL R8 2 - 0x60240008, // 01F6 GETGBL R9 G8 - 0x5C281000, // 01F7 MOVE R10 R8 - 0x7C240200, // 01F8 CALL R9 1 - 0x0026A409, // 01F9 ADD R9 K82 R9 - 0x900E5809, // 01FA SETMBR R3 K44 R9 - 0x60240010, // 01FB GETGBL R9 G16 - 0x88280115, // 01FC GETMBR R10 R0 K21 - 0x88281530, // 01FD GETMBR R10 R10 K48 - 0x8C281553, // 01FE GETMET R10 R10 K83 - 0x7C280200, // 01FF CALL R10 1 - 0x7C240200, // 0200 CALL R9 1 - 0xA8020010, // 0201 EXBLK 0 #0213 - 0x5C281200, // 0202 MOVE R10 R9 - 0x7C280000, // 0203 CALL R10 0 - 0x8C2C1554, // 0204 GETMET R11 R10 K84 - 0x7C2C0200, // 0205 CALL R11 1 - 0x1C2C1608, // 0206 EQ R11 R11 R8 - 0x782E0008, // 0207 JMPF R11 #0211 - 0xB82E4200, // 0208 GETNGBL R11 K33 - 0x8C2C1755, // 0209 GETMET R11 R11 K85 - 0x543607CF, // 020A LDINT R13 2000 - 0x84380000, // 020B CLOSURE R14 P0 - 0x7C2C0600, // 020C CALL R11 3 - 0x502C0200, // 020D LDBOOL R11 1 0 - 0xA0000000, // 020E CLOSE R0 - 0xA8040001, // 020F EXBLK 1 1 - 0x80041600, // 0210 RET 1 R11 - 0xA0240000, // 0211 CLOSE R9 - 0x7001FFEE, // 0212 JMP #0202 - 0x58240056, // 0213 LDCONST R9 K86 - 0xAC240200, // 0214 CATCH R9 1 0 - 0xB0080000, // 0215 RAISE 2 R0 R0 - 0xB8264200, // 0216 GETNGBL R9 K33 - 0x8C24132C, // 0217 GETMET R9 R9 K44 - 0x602C0008, // 0218 GETGBL R11 G8 - 0x5C301000, // 0219 MOVE R12 R8 - 0x7C2C0200, // 021A CALL R11 1 - 0x002EAE0B, // 021B ADD R11 K87 R11 - 0x002C1758, // 021C ADD R11 R11 K88 - 0x5830000E, // 021D LDCONST R12 K14 - 0x7C240600, // 021E CALL R9 3 - 0xB8260200, // 021F GETNGBL R9 K1 - 0x88241359, // 0220 GETMBR R9 R9 K89 - 0x900E3209, // 0221 SETMBR R3 K25 R9 - 0x4C240000, // 0222 LDNIL R9 - 0xA0000000, // 0223 CLOSE R0 - 0x80041200, // 0224 RET 1 R9 - 0x7002009B, // 0225 JMP #02C2 - 0x5422003B, // 0226 LDINT R8 60 - 0x1C200C08, // 0227 EQ R8 R6 R8 - 0x78220085, // 0228 JMPF R8 #02AF - 0x1C200F05, // 0229 EQ R8 R7 K5 - 0x78220065, // 022A JMPF R8 #0291 - 0x8C200506, // 022B GETMET R8 R2 K6 - 0x58280005, // 022C LDCONST R10 K5 - 0x7C200400, // 022D CALL R8 2 - 0x8C240506, // 022E GETMET R9 R2 K6 - 0x582C0007, // 022F LDCONST R11 K7 - 0x7C240400, // 0230 CALL R9 2 - 0x8C280506, // 0231 GETMET R10 R2 K6 - 0x5830000E, // 0232 LDCONST R12 K14 - 0x7C280400, // 0233 CALL R10 2 - 0x8C2C0506, // 0234 GETMET R11 R2 K6 - 0x58340010, // 0235 LDCONST R13 K16 - 0x7C2C0400, // 0236 CALL R11 2 - 0x8C300506, // 0237 GETMET R12 R2 K6 - 0x543A0003, // 0238 LDINT R14 4 - 0x7C300400, // 0239 CALL R12 2 - 0xB8364200, // 023A GETNGBL R13 K33 - 0x8C341B2C, // 023B GETMET R13 R13 K44 - 0x603C0018, // 023C GETGBL R15 G24 - 0x5840005A, // 023D LDCONST R16 K90 - 0x5C441000, // 023E MOVE R17 R8 - 0x8C481351, // 023F GETMET R18 R9 K81 - 0x7C480200, // 0240 CALL R18 1 - 0x5C4C1400, // 0241 MOVE R19 R10 - 0x5C501600, // 0242 MOVE R20 R11 - 0x8C541951, // 0243 GETMET R21 R12 K81 - 0x7C540200, // 0244 CALL R21 1 - 0x7C3C0C00, // 0245 CALL R15 6 - 0x54420003, // 0246 LDINT R16 4 - 0x7C340600, // 0247 CALL R13 3 - 0x4C340000, // 0248 LDNIL R13 - 0x1C34100D, // 0249 EQ R13 R8 R13 - 0x7436000B, // 024A JMPT R13 #0257 - 0x4C340000, // 024B LDNIL R13 - 0x1C34120D, // 024C EQ R13 R9 R13 - 0x74360008, // 024D JMPT R13 #0257 + 0x8C341B46, // 01E4 GETMET R13 R13 K70 + 0x7C340200, // 01E5 CALL R13 1 + 0x8C341B47, // 01E6 GETMET R13 R13 K71 + 0x7C340200, // 01E7 CALL R13 1 + 0x8C341B53, // 01E8 GETMET R13 R13 K83 + 0x7C340200, // 01E9 CALL R13 1 + 0x60380008, // 01EA GETGBL R14 G8 + 0x5C3C1000, // 01EB MOVE R15 R8 + 0x7C380200, // 01EC CALL R14 1 + 0x7C2C0600, // 01ED CALL R11 3 + 0x58300010, // 01EE LDCONST R12 K16 + 0x7C240600, // 01EF CALL R9 3 + 0xB8260200, // 01F0 GETNGBL R9 K1 + 0x8824132D, // 01F1 GETMBR R9 R9 K45 + 0x900E3609, // 01F2 SETMBR R3 K27 R9 + 0x4C240000, // 01F3 LDNIL R9 + 0x80041200, // 01F4 RET 1 R9 + 0x70020034, // 01F5 JMP #022B + 0x54220009, // 01F6 LDINT R8 10 + 0x1C200E08, // 01F7 EQ R8 R7 R8 + 0x78220031, // 01F8 JMPF R8 #022B + 0x8C200506, // 01F9 GETMET R8 R2 K6 + 0x58280005, // 01FA LDCONST R10 K5 + 0x7C200400, // 01FB CALL R8 2 + 0x60240008, // 01FC GETGBL R9 G8 + 0x5C281000, // 01FD MOVE R10 R8 + 0x7C240200, // 01FE CALL R9 1 + 0x0026A809, // 01FF ADD R9 K84 R9 + 0x900E5C09, // 0200 SETMBR R3 K46 R9 + 0x60240010, // 0201 GETGBL R9 G16 + 0x88280117, // 0202 GETMBR R10 R0 K23 + 0x88281532, // 0203 GETMBR R10 R10 K50 + 0x8C281555, // 0204 GETMET R10 R10 K85 + 0x7C280200, // 0205 CALL R10 1 + 0x7C240200, // 0206 CALL R9 1 + 0xA8020010, // 0207 EXBLK 0 #0219 + 0x5C281200, // 0208 MOVE R10 R9 + 0x7C280000, // 0209 CALL R10 0 + 0x8C2C1556, // 020A GETMET R11 R10 K86 + 0x7C2C0200, // 020B CALL R11 1 + 0x1C2C1608, // 020C EQ R11 R11 R8 + 0x782E0008, // 020D JMPF R11 #0217 + 0xB82E4600, // 020E GETNGBL R11 K35 + 0x8C2C1757, // 020F GETMET R11 R11 K87 + 0x543607CF, // 0210 LDINT R13 2000 + 0x84380000, // 0211 CLOSURE R14 P0 + 0x7C2C0600, // 0212 CALL R11 3 + 0x502C0200, // 0213 LDBOOL R11 1 0 + 0xA0000000, // 0214 CLOSE R0 + 0xA8040001, // 0215 EXBLK 1 1 + 0x80041600, // 0216 RET 1 R11 + 0xA0240000, // 0217 CLOSE R9 + 0x7001FFEE, // 0218 JMP #0208 + 0x58240058, // 0219 LDCONST R9 K88 + 0xAC240200, // 021A CATCH R9 1 0 + 0xB0080000, // 021B RAISE 2 R0 R0 + 0xB8264600, // 021C GETNGBL R9 K35 + 0x8C24132E, // 021D GETMET R9 R9 K46 + 0x602C0008, // 021E GETGBL R11 G8 + 0x5C301000, // 021F MOVE R12 R8 + 0x7C2C0200, // 0220 CALL R11 1 + 0x002EB20B, // 0221 ADD R11 K89 R11 + 0x002C175A, // 0222 ADD R11 R11 K90 + 0x5830000E, // 0223 LDCONST R12 K14 + 0x7C240600, // 0224 CALL R9 3 + 0xB8260200, // 0225 GETNGBL R9 K1 + 0x8824135B, // 0226 GETMBR R9 R9 K91 + 0x900E3609, // 0227 SETMBR R3 K27 R9 + 0x4C240000, // 0228 LDNIL R9 + 0xA0000000, // 0229 CLOSE R0 + 0x80041200, // 022A RET 1 R9 + 0x7002009B, // 022B JMP #02C8 + 0x5422003B, // 022C LDINT R8 60 + 0x1C200C08, // 022D EQ R8 R6 R8 + 0x78220085, // 022E JMPF R8 #02B5 + 0x1C200F05, // 022F EQ R8 R7 K5 + 0x78220065, // 0230 JMPF R8 #0297 + 0x8C200506, // 0231 GETMET R8 R2 K6 + 0x58280005, // 0232 LDCONST R10 K5 + 0x7C200400, // 0233 CALL R8 2 + 0x8C240506, // 0234 GETMET R9 R2 K6 + 0x582C0007, // 0235 LDCONST R11 K7 + 0x7C240400, // 0236 CALL R9 2 + 0x8C280506, // 0237 GETMET R10 R2 K6 + 0x5830000E, // 0238 LDCONST R12 K14 + 0x7C280400, // 0239 CALL R10 2 + 0x8C2C0506, // 023A GETMET R11 R2 K6 + 0x58340010, // 023B LDCONST R13 K16 + 0x7C2C0400, // 023C CALL R11 2 + 0x8C300506, // 023D GETMET R12 R2 K6 + 0x543A0003, // 023E LDINT R14 4 + 0x7C300400, // 023F CALL R12 2 + 0xB8364600, // 0240 GETNGBL R13 K35 + 0x8C341B2E, // 0241 GETMET R13 R13 K46 + 0x603C0018, // 0242 GETGBL R15 G24 + 0x5840005C, // 0243 LDCONST R16 K92 + 0x5C441000, // 0244 MOVE R17 R8 + 0x8C481353, // 0245 GETMET R18 R9 K83 + 0x7C480200, // 0246 CALL R18 1 + 0x5C4C1400, // 0247 MOVE R19 R10 + 0x5C501600, // 0248 MOVE R20 R11 + 0x8C541953, // 0249 GETMET R21 R12 K83 + 0x7C540200, // 024A CALL R21 1 + 0x7C3C0C00, // 024B CALL R15 6 + 0x54420003, // 024C LDINT R16 4 + 0x7C340600, // 024D CALL R13 3 0x4C340000, // 024E LDNIL R13 - 0x1C34140D, // 024F EQ R13 R10 R13 - 0x74360005, // 0250 JMPT R13 #0257 + 0x1C34100D, // 024F EQ R13 R8 R13 + 0x7436000B, // 0250 JMPT R13 #025D 0x4C340000, // 0251 LDNIL R13 - 0x1C34160D, // 0252 EQ R13 R11 R13 - 0x74360002, // 0253 JMPT R13 #0257 + 0x1C34120D, // 0252 EQ R13 R9 R13 + 0x74360008, // 0253 JMPT R13 #025D 0x4C340000, // 0254 LDNIL R13 - 0x1C34180D, // 0255 EQ R13 R12 R13 - 0x78360005, // 0256 JMPF R13 #025D - 0xB8360200, // 0257 GETNGBL R13 K1 - 0x88341B5B, // 0258 GETMBR R13 R13 K91 - 0x900E320D, // 0259 SETMBR R3 K25 R13 + 0x1C34140D, // 0255 EQ R13 R10 R13 + 0x74360005, // 0256 JMPT R13 #025D + 0x4C340000, // 0257 LDNIL R13 + 0x1C34160D, // 0258 EQ R13 R11 R13 + 0x74360002, // 0259 JMPT R13 #025D 0x4C340000, // 025A LDNIL R13 - 0xA0000000, // 025B CLOSE R0 - 0x80041A00, // 025C RET 1 R13 - 0x6034000C, // 025D GETGBL R13 G12 - 0x5C381200, // 025E MOVE R14 R9 - 0x7C340200, // 025F CALL R13 1 - 0x543A001F, // 0260 LDINT R14 32 - 0x543E0040, // 0261 LDINT R15 65 - 0x00381C0F, // 0262 ADD R14 R14 R15 - 0x20341A0E, // 0263 NE R13 R13 R14 - 0x7436000B, // 0264 JMPT R13 #0271 - 0x6034000C, // 0265 GETGBL R13 G12 - 0x5C381800, // 0266 MOVE R14 R12 - 0x7C340200, // 0267 CALL R13 1 - 0x543A000F, // 0268 LDINT R14 16 - 0x14341A0E, // 0269 LT R13 R13 R14 - 0x74360005, // 026A JMPT R13 #0271 + 0x1C34180D, // 025B EQ R13 R12 R13 + 0x78360005, // 025C JMPF R13 #0263 + 0xB8360200, // 025D GETNGBL R13 K1 + 0x88341B5D, // 025E GETMBR R13 R13 K93 + 0x900E360D, // 025F SETMBR R3 K27 R13 + 0x4C340000, // 0260 LDNIL R13 + 0xA0000000, // 0261 CLOSE R0 + 0x80041A00, // 0262 RET 1 R13 + 0x6034000C, // 0263 GETGBL R13 G12 + 0x5C381200, // 0264 MOVE R14 R9 + 0x7C340200, // 0265 CALL R13 1 + 0x543A001F, // 0266 LDINT R14 32 + 0x543E0040, // 0267 LDINT R15 65 + 0x00381C0F, // 0268 ADD R14 R14 R15 + 0x20341A0E, // 0269 NE R13 R13 R14 + 0x7436000B, // 026A JMPT R13 #0277 0x6034000C, // 026B GETGBL R13 G12 0x5C381800, // 026C MOVE R14 R12 0x7C340200, // 026D CALL R13 1 - 0x543A001F, // 026E LDINT R14 32 - 0x24341A0E, // 026F GT R13 R13 R14 - 0x7836000A, // 0270 JMPF R13 #027C - 0xB8364200, // 0271 GETNGBL R13 K33 - 0x8C341B2C, // 0272 GETMET R13 R13 K44 - 0x583C005C, // 0273 LDCONST R15 K92 - 0x5840000E, // 0274 LDCONST R16 K14 - 0x7C340600, // 0275 CALL R13 3 - 0xB8360200, // 0276 GETNGBL R13 K1 - 0x88341B5D, // 0277 GETMBR R13 R13 K93 - 0x900E320D, // 0278 SETMBR R3 K25 R13 - 0x4C340000, // 0279 LDNIL R13 - 0xA0000000, // 027A CLOSE R0 - 0x80041A00, // 027B RET 1 R13 - 0x5436001E, // 027C LDINT R13 31 - 0x40360A0D, // 027D CONNECT R13 K5 R13 - 0x9434120D, // 027E GETIDX R13 R9 R13 - 0x543A001F, // 027F LDINT R14 32 - 0x40381D40, // 0280 CONNECT R14 R14 K64 - 0x9438120E, // 0281 GETIDX R14 R9 R14 - 0x883C0115, // 0282 GETMBR R15 R0 K21 - 0x8C3C1F5E, // 0283 GETMET R15 R15 K94 - 0x5C441000, // 0284 MOVE R17 R8 - 0x5C481600, // 0285 MOVE R18 R11 - 0x5C4C1400, // 0286 MOVE R19 R10 - 0x5C501800, // 0287 MOVE R20 R12 - 0x5C541A00, // 0288 MOVE R21 R13 - 0x5C581C00, // 0289 MOVE R22 R14 - 0x8C5C035F, // 028A GETMET R23 R1 K95 - 0x7C5C0200, // 028B CALL R23 1 - 0x7C3C1000, // 028C CALL R15 8 - 0x503C0200, // 028D LDBOOL R15 1 0 - 0xA0000000, // 028E CLOSE R0 - 0x80041E00, // 028F RET 1 R15 - 0x7002001C, // 0290 JMP #02AE - 0x1C200F07, // 0291 EQ R8 R7 K7 - 0x78220012, // 0292 JMPF R8 #02A6 - 0x8C200506, // 0293 GETMET R8 R2 K6 - 0x58280005, // 0294 LDCONST R10 K5 - 0x7C200400, // 0295 CALL R8 2 - 0xB8264200, // 0296 GETNGBL R9 K33 - 0x8C24132C, // 0297 GETMET R9 R9 K44 - 0x602C0008, // 0298 GETGBL R11 G8 - 0x5C301000, // 0299 MOVE R12 R8 - 0x7C2C0200, // 029A CALL R11 1 - 0x002EC00B, // 029B ADD R11 K96 R11 - 0x58300010, // 029C LDCONST R12 K16 - 0x7C240600, // 029D CALL R9 3 - 0x88240115, // 029E GETMBR R9 R0 K21 - 0x8C241361, // 029F GETMET R9 R9 K97 - 0x5C2C1000, // 02A0 MOVE R11 R8 - 0x7C240400, // 02A1 CALL R9 2 - 0x50240200, // 02A2 LDBOOL R9 1 0 - 0xA0000000, // 02A3 CLOSE R0 - 0x80041200, // 02A4 RET 1 R9 - 0x70020007, // 02A5 JMP #02AE - 0x1C200F0E, // 02A6 EQ R8 R7 K14 - 0x78220005, // 02A7 JMPF R8 #02AE - 0x88200115, // 02A8 GETMBR R8 R0 K21 - 0x8C201162, // 02A9 GETMET R8 R8 K98 - 0x7C200200, // 02AA CALL R8 1 - 0x50200200, // 02AB LDBOOL R8 1 0 - 0xA0000000, // 02AC CLOSE R0 - 0x80041000, // 02AD RET 1 R8 - 0x70020012, // 02AE JMP #02C2 - 0x54220029, // 02AF LDINT R8 42 - 0x1C200C08, // 02B0 EQ R8 R6 R8 - 0x78220005, // 02B1 JMPF R8 #02B8 - 0x1C200F05, // 02B2 EQ R8 R7 K5 - 0x78220002, // 02B3 JMPF R8 #02B7 - 0x50200200, // 02B4 LDBOOL R8 1 0 - 0xA0000000, // 02B5 CLOSE R0 - 0x80041000, // 02B6 RET 1 R8 - 0x70020009, // 02B7 JMP #02C2 - 0x60200003, // 02B8 GETGBL R8 G3 - 0x5C240000, // 02B9 MOVE R9 R0 - 0x7C200200, // 02BA CALL R8 1 - 0x8C201163, // 02BB GETMET R8 R8 K99 - 0x5C280200, // 02BC MOVE R10 R1 - 0x5C2C0400, // 02BD MOVE R11 R2 - 0x5C300600, // 02BE MOVE R12 R3 - 0x7C200800, // 02BF CALL R8 4 - 0xA0000000, // 02C0 CLOSE R0 - 0x80041000, // 02C1 RET 1 R8 - 0xA0000000, // 02C2 CLOSE R0 - 0x80000000, // 02C3 RET 0 + 0x543A000F, // 026E LDINT R14 16 + 0x14341A0E, // 026F LT R13 R13 R14 + 0x74360005, // 0270 JMPT R13 #0277 + 0x6034000C, // 0271 GETGBL R13 G12 + 0x5C381800, // 0272 MOVE R14 R12 + 0x7C340200, // 0273 CALL R13 1 + 0x543A001F, // 0274 LDINT R14 32 + 0x24341A0E, // 0275 GT R13 R13 R14 + 0x7836000A, // 0276 JMPF R13 #0282 + 0xB8364600, // 0277 GETNGBL R13 K35 + 0x8C341B2E, // 0278 GETMET R13 R13 K46 + 0x583C005E, // 0279 LDCONST R15 K94 + 0x5840000E, // 027A LDCONST R16 K14 + 0x7C340600, // 027B CALL R13 3 + 0xB8360200, // 027C GETNGBL R13 K1 + 0x88341B5F, // 027D GETMBR R13 R13 K95 + 0x900E360D, // 027E SETMBR R3 K27 R13 + 0x4C340000, // 027F LDNIL R13 + 0xA0000000, // 0280 CLOSE R0 + 0x80041A00, // 0281 RET 1 R13 + 0x5436001E, // 0282 LDINT R13 31 + 0x40360A0D, // 0283 CONNECT R13 K5 R13 + 0x9434120D, // 0284 GETIDX R13 R9 R13 + 0x543A001F, // 0285 LDINT R14 32 + 0x40381D42, // 0286 CONNECT R14 R14 K66 + 0x9438120E, // 0287 GETIDX R14 R9 R14 + 0x883C0117, // 0288 GETMBR R15 R0 K23 + 0x8C3C1F60, // 0289 GETMET R15 R15 K96 + 0x5C441000, // 028A MOVE R17 R8 + 0x5C481600, // 028B MOVE R18 R11 + 0x5C4C1400, // 028C MOVE R19 R10 + 0x5C501800, // 028D MOVE R20 R12 + 0x5C541A00, // 028E MOVE R21 R13 + 0x5C581C00, // 028F MOVE R22 R14 + 0x8C5C0361, // 0290 GETMET R23 R1 K97 + 0x7C5C0200, // 0291 CALL R23 1 + 0x7C3C1000, // 0292 CALL R15 8 + 0x503C0200, // 0293 LDBOOL R15 1 0 + 0xA0000000, // 0294 CLOSE R0 + 0x80041E00, // 0295 RET 1 R15 + 0x7002001C, // 0296 JMP #02B4 + 0x1C200F07, // 0297 EQ R8 R7 K7 + 0x78220012, // 0298 JMPF R8 #02AC + 0x8C200506, // 0299 GETMET R8 R2 K6 + 0x58280005, // 029A LDCONST R10 K5 + 0x7C200400, // 029B CALL R8 2 + 0xB8264600, // 029C GETNGBL R9 K35 + 0x8C24132E, // 029D GETMET R9 R9 K46 + 0x602C0008, // 029E GETGBL R11 G8 + 0x5C301000, // 029F MOVE R12 R8 + 0x7C2C0200, // 02A0 CALL R11 1 + 0x002EC40B, // 02A1 ADD R11 K98 R11 + 0x58300010, // 02A2 LDCONST R12 K16 + 0x7C240600, // 02A3 CALL R9 3 + 0x88240117, // 02A4 GETMBR R9 R0 K23 + 0x8C241363, // 02A5 GETMET R9 R9 K99 + 0x5C2C1000, // 02A6 MOVE R11 R8 + 0x7C240400, // 02A7 CALL R9 2 + 0x50240200, // 02A8 LDBOOL R9 1 0 + 0xA0000000, // 02A9 CLOSE R0 + 0x80041200, // 02AA RET 1 R9 + 0x70020007, // 02AB JMP #02B4 + 0x1C200F0E, // 02AC EQ R8 R7 K14 + 0x78220005, // 02AD JMPF R8 #02B4 + 0x88200117, // 02AE GETMBR R8 R0 K23 + 0x8C201164, // 02AF GETMET R8 R8 K100 + 0x7C200200, // 02B0 CALL R8 1 + 0x50200200, // 02B1 LDBOOL R8 1 0 + 0xA0000000, // 02B2 CLOSE R0 + 0x80041000, // 02B3 RET 1 R8 + 0x70020012, // 02B4 JMP #02C8 + 0x54220029, // 02B5 LDINT R8 42 + 0x1C200C08, // 02B6 EQ R8 R6 R8 + 0x78220005, // 02B7 JMPF R8 #02BE + 0x1C200F05, // 02B8 EQ R8 R7 K5 + 0x78220002, // 02B9 JMPF R8 #02BD + 0x50200200, // 02BA LDBOOL R8 1 0 + 0xA0000000, // 02BB CLOSE R0 + 0x80041000, // 02BC RET 1 R8 + 0x70020009, // 02BD JMP #02C8 + 0x60200003, // 02BE GETGBL R8 G3 + 0x5C240000, // 02BF MOVE R9 R0 + 0x7C200200, // 02C0 CALL R8 1 + 0x8C201165, // 02C1 GETMET R8 R8 K101 + 0x5C280200, // 02C2 MOVE R10 R1 + 0x5C2C0400, // 02C3 MOVE R11 R2 + 0x5C300600, // 02C4 MOVE R12 R3 + 0x7C200800, // 02C5 CALL R8 4 + 0xA0000000, // 02C6 CLOSE R0 + 0x80041000, // 02C7 RET 1 R8 + 0xA0000000, // 02C8 CLOSE R0 + 0x80000000, // 02C9 RET 0 }) ) ); From d72f3b99782fb926e0fa57c62b914cafea9c2478 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 2 Jul 2023 21:52:01 +0200 Subject: [PATCH 031/150] Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) * Command ``BrRestart`` to restart the Berry VM (experimental) * Add web button for Berry Restart --- CHANGELOG.md | 1 + lib/libesp32/berry_mapping/src/be_cb_module.c | 21 ++++++++++ lib/libesp32/berry_mapping/src/be_mapping.h | 2 + tasmota/include/i18n.h | 1 + .../xdrv_52_3_berry_webserver.ino | 1 - .../tasmota_xdrv_driver/xdrv_52_9_berry.ino | 38 +++++++++++++++---- 6 files changed, 56 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fe6389e4..846e61639 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Command ``Delay -1`` to wait until next second (#18984) - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) +- Command ``BrRestart`` to restart the Berry VM (experimental) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry_mapping/src/be_cb_module.c b/lib/libesp32/berry_mapping/src/be_cb_module.c index 8054398d4..b5e7b1427 100644 --- a/lib/libesp32/berry_mapping/src/be_cb_module.c +++ b/lib/libesp32/berry_mapping/src/be_cb_module.c @@ -250,6 +250,7 @@ static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, in bvm * vm = be_cb_hooks[num].vm; bvalue *f = &be_cb_hooks[num].f; + if (vm == NULL) { return 0; } // function is not alive anymore, don't crash // push function (don't check type) bvalue *top = be_incrtop(vm); @@ -271,6 +272,26 @@ static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, in return ret; } +/*********************************************************************************************\ + * `be_cb_deinit`: + * Clean any callback for this VM, they shouldn't call the registerd function anymore +\*********************************************************************************************/ +void be_cb_deinit(bvm *vm) { + // remove all cb for this vm + for (int32_t slot = 0; slot < BE_MAX_CB; slot++) { + if (be_cb_hooks[slot].vm == vm) { + be_cb_hooks[slot].vm = NULL; + be_cb_hooks[slot].f.type == BE_NIL; + } + } + // remove the vm gen_cb for this vm + for (be_callback_handler_list_t **elt_ptr = &be_callback_handler_list_head; *elt_ptr != NULL; elt_ptr = &(*elt_ptr)->next) { + if (((*elt_ptr)->next != NULL) && ((*elt_ptr)->next->vm == vm)) { + (*elt_ptr)->next = (*elt_ptr)->next->next; + } + } +} + /* @const_object_info_begin module cb (scope: global) { gen_cb, func(be_cb_gen_cb) diff --git a/lib/libesp32/berry_mapping/src/be_mapping.h b/lib/libesp32/berry_mapping/src/be_mapping.h index 9876278f3..f0ab9d22c 100644 --- a/lib/libesp32/berry_mapping/src/be_mapping.h +++ b/lib/libesp32/berry_mapping/src/be_mapping.h @@ -109,6 +109,8 @@ extern int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_ extern int be_call_c_func(bvm *vm, const void * func, const char * return_type, const char * arg_type); extern int be_call_ctype_func(bvm *vm, const void *definition); /* handler for Berry vm */ +extern void be_cb_deinit(bvm *vm); /* remove all callbacks from the VM (just before shutdown of VM) */ + #ifdef __cplusplus } #endif diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 37be387fe..1cbb6ffd4 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -764,6 +764,7 @@ // Commands xdrv_52_berry.ino - Berry scripting language #define D_PRFX_BR "Br" #define D_CMND_BR_RUN "" +#define D_CMND_BR_RESTART "Restart" #define D_BR_NOT_STARTED "Berry not started" // Commands xdrv_60_shift595.ino - 74x595 family shift register driver diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino index f37be12b5..7df813e3f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino @@ -138,7 +138,6 @@ extern "C" { const char * uri = be_tostring(vm, 1); Webserver->sendHeader("Location", uri, true); Webserver->send(302, "text/plain", ""); - // Webserver->sendHeader(F("Location"), String(F("http://")) + Webserver->client().localIP().toString(), true); be_return_nil(vm); } be_raise(vm, kTypeError, nullptr); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index c46606e47..f39a45271 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -37,11 +37,11 @@ extern "C" { } const char kBrCommands[] PROGMEM = D_PRFX_BR "|" // prefix - D_CMND_BR_RUN + D_CMND_BR_RUN "|" D_CMND_BR_RESTART ; void (* const BerryCommand[])(void) PROGMEM = { - CmndBrRun, + CmndBrRun, CmndBrRestart }; int32_t callBerryEventDispatcher(const char *type, const char *cmd, int32_t idx, const char *payload, uint32_t data_len = 0); @@ -307,8 +307,13 @@ void BrShowState(void) { void BerryInit(void) { // clean previous VM if any if (berry.vm != nullptr) { + be_cb_deinit(berry.vm); // deregister any C callback for this VM be_vm_delete(berry.vm); berry.vm = nullptr; + berry.autoexec_done = false; + berry.repl_active = false; + berry.rules_busy = false; + berry.timeout = 0; } int32_t ret_code1, ret_code2; @@ -367,6 +372,17 @@ void BerryInit(void) { } } +/*********************************************************************************************\ + * BrRestart - restart a fresh new Berry vm, unloading everything from previous VM +\*********************************************************************************************/ +void CmndBrRestart(void) { + if (berry.vm == nullptr) { + ResponseCmndChar_P("Berry VM not started"); + } + BerryInit(); + ResponseCmndChar_P("Berry VM restarted"); +} + /*********************************************************************************************\ * Execute a script in Flash file-system * @@ -653,14 +669,16 @@ const char HTTP_BERRY_FORM_CMND[] PROGMEM = "Check the
    documentation." "" "" - // "" - // "

    " "
    " "" - // "
    " - // "" "" - "
    "; + "" +#ifdef USE_BERRY_DEBUG + "

    " + "" + "

    " +#endif // USE_BERRY_DEBUG + ; const char HTTP_BTN_BERRY_CONSOLE[] PROGMEM = "

    "; @@ -706,6 +724,12 @@ void HandleBerryConsole(void) return; } + if (Webserver->hasArg(F("rst"))) { // restart VM + BerryInit(); + Webserver->sendHeader("Location", "/bc", true); + Webserver->send(302, "text/plain", ""); + } + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP "Berry " D_CONSOLE)); WSContentStart_P(PSTR("Berry " D_CONSOLE)); From fc9065d4c8be59c63844fee17a3390c662bb8052 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 3 Jul 2023 11:55:21 +0200 Subject: [PATCH 032/150] Fix miel_hvac Fix miel_hvac (#18923) --- tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino index acdd3fa6a..6c2fd55d4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_44_miel_hvac.ino @@ -1085,8 +1085,8 @@ miel_hvac_pre_init(void) SetSerial(baudrate, TS_SERIAL_8E1); } - UpdateDevicesPresent(1); /* claim a POWER device slot */ sc->sc_device = TasmotaGlobal.devices_present; + UpdateDevicesPresent(1); /* claim a POWER device slot */ miel_hvac_sc = sc; return; From 8f06552eeeedda4e8ac694e327d58b10bfc153a9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 3 Jul 2023 12:28:41 +0200 Subject: [PATCH 033/150] Berry `var` allowed in with walrus operator `:=` (#19018) * Berry `var` allowed in with walrus operator `:=` * fix regression --- CHANGELOG.md | 1 + lib/libesp32/berry/berry.exe | Bin 368947 -> 368947 bytes lib/libesp32/berry/src/be_parser.c | 19 ++++++++++++++++--- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 846e61639..046d51060 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) +- Berry `var` allowed in with walrus operator `:=` ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe index a20999c831e7edbce54a3a259340146176522042..b872029021bcd211718f070592a2a9635fd9c4f7 100644 GIT binary patch delta 53047 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

    Jv-QmkKkZOv9=#$`Lr;FeN3m(+F@Conq~#Q zaIqe1#bEYeB&}uWi;?g?HqT^^tt-Fyy9{86bkp=s;`}o1yfES*jTzyU)}R2;~bxRr&vv-f>FEANQBpPzd# zy&wXElX1k+APRDAcs0$Xv(nm&Z68IytokG77<;q-9Z|~$j;2kfL_!v67`|gCouuN_ zlW35$I3?oYJ@3sy9q%q~uQ%4ZuTQxeR|O9DzT-f=N1Fu%v1tE$b5XW6|IC}d0KuXk zWD~N|iDf^Jrp@|%0dW89qI~N+C(r%(ai%&(NzKJuo|+Yxxw?6L&!_1v+WAw7L**M^ zWwHKa@L8+dSw5i&=;CMXXfIh|662&yTzOp98G;it-rW9j4E64}GnZooDqlB&{$H6g z{kZ_LCV9^6<+FpS@0X_!e^)pTeLPE(=JLCzG=%s#msK818`gIKHl7wpY}d!Qim>_O zZ<#D;EUoE%TOnV<*_SnnH!?upA|OvkoZQP6jHMmv?RV_Qv9yPG99(V%CQt5`nVeOg z$ra3P9BtLKJAh^8);5-zOG69PF_~A>T%wfLxopljI}akx%;PvbO-&Pv2Z%x^qxfG3p$QB?WdgYyF8IK*Pd z)9!{&mwmz=Urt`&0_;EK-4;)?F_5cdHG zaS!lnnoG9QdJe7DsPz!@pFrExJG+z5)){HG)aB*e%@$9f4ZJo%2cXmsBrGHH9K!U& z;2oOh9E#)F@d?z$^)}R)lAW3xq*-$sqq-=g&SK9e&~9T-!1Y=vh%OklqO@wX$kOsd z(l{<{(D*`UEV}YJ*%I;24x6+wI$7E&?6Xirl~L??D6LcbV^HF&;}|zD%aR$wo`+H| zzXc~aJ-&z}RsuCY{-zJ-@@2b$6xPQx_#ocPMHBDsVnJcFiI2U6#WTaovl($1xZq>V z2AH)G&y~VxoyvVVDXgMyY+=s3#?nRu)l_@WT z5^?`__T@y{*{~E4K$2ZuRY33x2NK6`F9$vZ74(Rak~4e`-N~vOcM?)PZiun*tdSRh zISm-hzw%xiey##OreqszpHKhdSgW$`fhHRkPV2Po0Xg~kOgZbHL=|MGN%UkDa%aEX zR8DCIwjrFl>srY$qL*dNa=(&+VF$7M;nda84kK|reqMgAbW&s7VnrqSN2STAhp{aj z@2KSL%NHko&zCY6whBHGP060uU)g<{zqIT=c-k#?l{(|uoJrKf?V|?r zgau=3fw64KmGHgA8B0GVjoGwVs(0L7o8z>b!VbmKAo{d6dml@6^tal~Ee`SX zX4W^3x{)Sq3JUthg)NPvP3Z3~EHjQauG<{A;v}$D*ch{GJ&rk7V$b7n-dfLG<7p%E zHR})$8pGI#ckYhNCdM zOlEF#=x7pa`eY6@*&)r*dI9~CKG2#jE}$g@sqN#7a60K{YP*W#h8WxxMR)-iz&cASJheX8>~mY#s4)*REV z1gcdNFD53@4o)*?tB^C{FR>v<+dLVEkK=4YGIjNCHwzPtpZdU9PUbv)l6_+|I2JvI z!}mEU{hkbdFQwsbwjr5z(N;=^!|YlgZ=$K(QKnQ_;CsXrN=V;EUN`)bocPV~ie>cj8g zmtGpOkxQtz_n)gcZ}|8}pBn7yYIa$(2X*;(aP0HZXZ#3nP&yA|-z}kmek(X|>Hx=n zF!$79TC~bfQ({XmkAV`+Ygz1>=$FSNa0^#g)F>LTs>goBs z8sJ>stpt+M!kQfX}*^qZv8rSy6w zmYGUpVEFFKsDHilyCi|r;!8U=tdUMsi@o&IPx|Q9_LbR;Wk|H$_?&G=i7x{mFM}DK zWc`ga53g<1Urv3!KV88`e`|J`&%cl|HXO?9DR<(U8mpRJevrPJI%9U3!DcOoEMrht z@-#;KYHaIr+H!Phn#6u;XS2(1J2(mZGjfYQwc!!zt|wIW4qXVyl!TLPKt}s5=uf=> z8ygJ+*)5})UA~jZI2%~2G{h$p*?=_UK$6+4G}^jzbpS!-&QNwE+?rkd0Gw<8dO1;X zUsM!nwErFVAZag6gVFvzs`xRYyyfhdG^%TSiC0tYx1vaO*^d8am#pt$PPN71rFa=% zW3*q*+*i=`G|!P8TY zqqQhj?1*ofc&BE>9jub(ti~#wa~iSkt7zjI56zI&Su^5wkt4^rV^*=aRY=FE*o{>* zt$G!7^G&81NC5YJnJHGF5ro*8@>kO$J93tt{*rbgi`K4#cN&bZ){uE<#-^{Mbv;$3 zuu_!==P%8r=#5JCLQ@@SPf>+EplIO>jn@A48@6p7?NQrfj7pV%;`X^;9_F9A{p&C1 ze#yDhvTXF)_4HJ|;@2?v5qAK++A{&9tOPH!U)Iy$daM4?FDV2c>9Jm4(ILdwwDv2U z?daoItnvoh5wGv{+(75!#mA!?FcJ2wcmwT;h0*pK+Dp3-AC!NBPh9ZZEEuz0JX`t= z-GI-Qy))?OYGYpT!4=}&*ykBAr!clNgSOCgLDyuB@7dWM@ZY{Ydzt}VXj#LJ7-%wM z8NpDuViT3vHj-En19D%O1?dox` ztD596)KkuBQb#H6@BUzuHq%ZYANxb4LQIk3jP~SnaaxYES82m1{Hl~Y^Xn%3N_cY? znl&kp(1@8Xyo-{zEDd^=!YK0^PvMc-Ja#az9Pfi5Hr&_5;xWLNiJ!N7@fyHBQr}Am8OQ9Z0g+ zveWc3sc#y6hE^esTrWwpbZL$+-styDT8Iz)G%HFZm5#Dkvrltr2YT%yJDf|Kw9L8) zSiL6d940hJvt)@q*PHXVycP4TS%O8bDx8FW_}MUDR_!cp+-LzhgZX2W7n+q*7}AHI0Vl)xY}lQc-z3Fs@QAO$MS6LG zZ9a#L-7!<{IT}{kuzCphZg{CFzLEY7R&U&GCl5T?D3*a!1;o%X7H#9cbTKkma)uhWJ|Rc^hGoboi2`Ub)&yuRG{7WHXG zdVxmDo%mUj+Y?XV)l*O|>M6H+9GnG~#ldi*@W(fLn&#i4_3W!RJ

    Wos?cXgp;hy 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 diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 57b2ffa7f..dff91b546 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1135,8 +1135,22 @@ static void sub_expr(bparser *parser, bexpdesc *e, int prio) static void walrus_expr(bparser *parser, bexpdesc *e) { int line = parser->lexer.linenumber; - sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ btokentype op = next_type(parser); + if (op == KeyVar) { + /* 'var' ID ':=' expr */ + scan_next_token(parser); /* skip 'var' */ + bstring *name; + name = next_token(parser).u.s; + match_token(parser, TokenId); /* match and skip ID */ + new_var(parser, name, e); /* new variable */ + op = next_type(parser); + if (op != OptWalrus) { + parser_error(parser, "'var' in expr must be followed by ':='"); + } + } else { + sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ + op = next_type(parser); + } if (op == OptWalrus) { check_symbol(parser, e); bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */ @@ -1149,8 +1163,7 @@ static void walrus_expr(bparser *parser, bexpdesc *e) } if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */ )) { parser->lexer.linenumber = line; - parser_error(parser, - "try to assign constant expressions."); + parser_error(parser, "try to assign constant expressions."); } } } From cc55cf0bb18af44f3a5eb184b56d4220b03bfcf6 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 3 Jul 2023 14:10:05 +0200 Subject: [PATCH 034/150] Revert "Berry `var` allowed in with walrus operator `:=` (#19018)" (#19019) This reverts commit 8f06552eeeedda4e8ac694e327d58b10bfc153a9. --- CHANGELOG.md | 1 - lib/libesp32/berry/berry.exe | Bin 368947 -> 368947 bytes lib/libesp32/berry/src/be_parser.c | 19 +++---------------- 3 files changed, 3 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 046d51060..846e61639 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,6 @@ All notable changes to this project will be documented in this file. - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) -- Berry `var` allowed in with walrus operator `:=` ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe index b872029021bcd211718f070592a2a9635fd9c4f7..a20999c831e7edbce54a3a259340146176522042 100644 GIT binary patch delta 52879 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 delta 53047 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

    Jv-QmkKkZOv9=#$`Lr;FeN3m(+F@Conq~#Q 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

    Wos?cXgp;hy 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.linenumber; + sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ btokentype op = next_type(parser); - if (op == KeyVar) { - /* 'var' ID ':=' expr */ - scan_next_token(parser); /* skip 'var' */ - bstring *name; - name = next_token(parser).u.s; - match_token(parser, TokenId); /* match and skip ID */ - new_var(parser, name, e); /* new variable */ - op = next_type(parser); - if (op != OptWalrus) { - parser_error(parser, "'var' in expr must be followed by ':='"); - } - } else { - sub_expr(parser, e, ASSIGN_OP_PRIO); /* left expression */ - op = next_type(parser); - } if (op == OptWalrus) { check_symbol(parser, e); bexpdesc e1 = *e; /* copy var to e1, e will get the result of expression */ @@ -1163,7 +1149,8 @@ static void walrus_expr(bparser *parser, bexpdesc *e) } if (be_code_setvar(parser->finfo, &e1, e, btrue /* do not release register */ )) { parser->lexer.linenumber = line; - parser_error(parser, "try to assign constant expressions."); + parser_error(parser, + "try to assign constant expressions."); } } } From 522e6cf234c84da5650882b0fcb89cc8d1e2ffba Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 3 Jul 2023 21:07:45 +0200 Subject: [PATCH 035/150] Implement deepsleep(0) Implement deepsleep(0) as command ``restart 9`` (#19024) --- tasmota/tasmota.ino | 1 + tasmota/tasmota_support/support_command.ino | 5 +++++ tasmota/tasmota_support/support_tasmota.ino | 2 +- tasmota/tasmota_support/support_wifi.ino | 8 ++++++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 56434faea..67a149347 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -305,6 +305,7 @@ struct TasmotaGlobal_t { bool ntp_force_sync; // Force NTP sync bool skip_light_fade; // Temporarily skip light fading bool restart_halt; // Do not restart but stay in wait loop + bool restart_deepsleep; // Do not restart but do deepsleep bool module_changed; // Indicate module changed since last restart bool wifi_stay_asleep; // Allow sleep only incase of ESP32 BLE bool no_autoexec; // Disable autoexec diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index c775b8aab..e18143040 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -1151,6 +1151,11 @@ void CmndRestart(void) } break; #endif // ESP32 + case 9: + TasmotaGlobal.restart_flag = 2; + TasmotaGlobal.restart_deepsleep = true; + ResponseCmndChar(PSTR("Go to sleep")); + break; case -1: CmndCrash(); // force a crash break; diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 113181ce0..b7f51569f 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1560,7 +1560,7 @@ void Every250mSeconds(void) TasmotaGlobal.restart_flag--; if (TasmotaGlobal.restart_flag <= 0) { - AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "%s"), (TasmotaGlobal.restart_halt) ? PSTR("Halted") : PSTR(D_RESTARTING)); + AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_APPLICATION "%s"), (TasmotaGlobal.restart_halt) ? PSTR("Halted") : (TasmotaGlobal.restart_deepsleep) ? PSTR("Sleeping") : PSTR(D_RESTARTING)); EspRestart(); } } diff --git a/tasmota/tasmota_support/support_wifi.ino b/tasmota/tasmota_support/support_wifi.ino index c5189c344..210a73bcb 100644 --- a/tasmota/tasmota_support/support_wifi.ino +++ b/tasmota/tasmota_support/support_wifi.ino @@ -1161,7 +1161,7 @@ void EspRestart(void) WifiShutdown(true); CrashDumpClear(); // Clear the stack dump in RTC - if (TasmotaGlobal.restart_halt) { + if (TasmotaGlobal.restart_halt) { // Restart 2 while (1) { OsWatchLoop(); // Feed OsWatch timer to prevent restart SetLedLink(1); // Wifi led on @@ -1169,7 +1169,11 @@ void EspRestart(void) SetLedLink(0); // Wifi led off delay(800); // Satisfy SDK } - } else { + } + else if (TasmotaGlobal.restart_deepsleep) { // Restart 9 + ESP.deepSleep(0); // Deep sleep mode with only hardware triggered wake up + } + else { ESP_Restart(); } } From 41de11142906e17a958329edb74975dd1db3f7f4 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 3 Jul 2023 21:27:47 +0200 Subject: [PATCH 036/150] Update change logs --- CHANGELOG.md | 4 +++- RELEASENOTES.md | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 846e61639..5356f8dd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ All notable changes to this project will be documented in this file. - Command ``Delay -1`` to wait until next second (#18984) - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) -- Command ``BrRestart`` to restart the Berry VM (experimental) +- Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) +- Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset (#19024) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) @@ -20,6 +21,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Berry various fixes for Walrus Operator (#18982) +- MiElHVAC power commands regression from v12.4.0.1 (#18923) ### Removed - Support for ESP32-C3 with chip rev below 3 (old development boards) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 68d7dc0ed..7a5da1831 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -112,7 +112,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ## Changelog v13.0.0.1 ### Added +- Command ``BrRestart`` to restart the Berry VM (experimental) [#19003](https://github.com/arendst/Tasmota/issues/19003) - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) +- Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) @@ -125,6 +127,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Fixed - Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) +- MiElHVAC power commands regression from v12.4.0.1 [#18923](https://github.com/arendst/Tasmota/issues/18923) ### Removed - Support for ESP32-C3 with chip revision below 3 (old development boards) From 492759567af95a91b45809395691cad9e61f1608 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 5 Jul 2023 09:55:17 +0200 Subject: [PATCH 037/150] Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) --- CHANGELOG.md | 1 + tasmota/berry/modules/Partition_Wizard.tapp | Bin 16297 -> 15541 bytes .../Partition_Wizard/partition_wizard.bec | Bin 15854 -> 15098 bytes tasmota/berry/modules/partition_wizard.be | 25 +++++++++++++----- 4 files changed, 20 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5356f8dd4..e459976d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset (#19024) +- Partition Wizard is now able to convert to safeboot from Shelly partition layout ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/tasmota/berry/modules/Partition_Wizard.tapp b/tasmota/berry/modules/Partition_Wizard.tapp index 14665731deda39cd505acb1cc0e0454fd4b45fe2..9b19600a23fc3433305003ab8c9379ed8331873a 100644 GIT binary patch delta 5179 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 QPUL5iev0S6?&a410HhIt4FCWD delta 6051 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 B;r9Rl diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec b/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec index f0c39f5afe377ec19d97ee326b52077e55a291a4..b5227ecd65055926674eeb041663a4415a1eb4dc 100644 GIT binary patch delta 5024 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

    Mc?wjj^2zO<5@NwgtfFr!nhIj0OAT$Q) z^Z=xF6G+BY?u4>uF#M$l@OSHQrfFvU9t!Q9_$!4`)vRpL13i-NmAA7A9ok7Kh|(*sN`F&U&m2H<5aUzMg)cqyhEXxBoWy7hHWY~XPN7LXcrlah|FK)M?;p;`uDm5f4yVx_mMaja6eduC&xwOswkjY|N z%q${C7ehPw&2_~^xB{O(q{T2uJaH`X1oN{8&s37OCwl!k=1wpUaDD~Mf_kaa39>#O zCY6r*RDL_F53()pH+)~_e$)3wW}ubI!98FgWpx4H?C{V=yL&Gb-zwl61J%C4l*D(l zkZ>vU-wE6`)6xuNe9O2|!Y>c3VO$x{(EB+147ii)Uerq`6KXq!dFshL_e18|>jC`o znA5k%oQwzYZW`!(P^pWEpaFFmbG_x+tc%PH4|HF#5Oy|HmfO+6v(RyVo}x1#e$G PvvRw_-hcX`8{&TfvY4$| diff --git a/tasmota/berry/modules/partition_wizard.be b/tasmota/berry/modules/partition_wizard.be index 500b15fff..abda19956 100644 --- a/tasmota/berry/modules/partition_wizard.be +++ b/tasmota/berry/modules/partition_wizard.be @@ -313,7 +313,7 @@ class Partition_wizard_UI # `app0` renamed to `safeboot` # `app0` changed subtype to `factory` # `app1` moved to right after `factory` and resized - # `app1` chaned subtype to `app0` and renamed `app0` + # `app1` changed subtype to `app0` and renamed `app0` # # Returns: # - false if READY @@ -413,16 +413,29 @@ class Partition_wizard_UI var step3_state = self.test_step_3(p) if step3_state == true return true end - if type(step3_state) == 'string)' raise "internal_error", step3_state end + if type(step3_state) == 'string' raise "internal_error", step3_state end var app0 = p.get_ota_slot(0) var app1 = p.get_ota_slot(1) if app0 == nil || app1 == nil raise "internal_error", "there are no `app0` or `app1` partitions" end var factory_size = self.app_size_min * 1024 - var firm0_size = app0.get_image_size() - if firm0_size <= 0 raise "internal_error", "invalid size in app0 partition" end - if firm0_size >= factory_size raise "internal_error", "app0 partition is too big for factory" end + do # open new scope + var firm0_size = app0.get_image_size() # get the size of the partition holding safeboot and check values + if firm0_size <= 0 raise "internal_error", "invalid size in app0 partition" end + if firm0_size >= factory_size raise "internal_error", "app0 partition is too big for factory" end + end + + # remove any SPIFFS partition that is not at the end of the partition table + var idx = 1 + while idx < size(p.slots) - 1 # skip explicitly the last partition + if p.slots[idx].is_spiffs() + p.slots.remove(idx) + tasmota.log("UPL: removesd unused SPIFFS partition", 2) + else + idx += 1 + end + end # do the change app0.subtype = 0 # factory subtype @@ -621,7 +634,7 @@ class Partition_wizard_UI # Resize FS to arbitrary size #---------------------------------------------------------------------# elif webserver.has_arg("resize_fs") - if !self.has_factory_layout(p) raise "internal_error", "Device does not avec safeboot layout" end + if !self.has_factory_layout(p) raise "internal_error", "Device does not have safeboot layout" end var fs = p.slots[-1] var last_app = p.slots[-2] From 67a62ef3c8297409d0bc58b511e4958ebae577ed Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 5 Jul 2023 11:00:10 +0200 Subject: [PATCH 038/150] Update changelogs --- CHANGELOG.md | 2 +- RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e459976d7..a818d027d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ All notable changes to this project will be documented in this file. - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset (#19024) -- Partition Wizard is now able to convert to safeboot from Shelly partition layout +- Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7a5da1831..1e3326770 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -117,6 +117,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) +- Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) From c4f899a72107dec564e553f4788aef48d763db61 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Wed, 5 Jul 2023 23:14:16 +0200 Subject: [PATCH 039/150] Hot fix for gitpod and CI (pio core v6.1.8 is faulty) (#19044) * Use pio v6.1.7 --- .github/workflows/Tasmota_build_devel.yml | 8 ++++---- .github/workflows/Tasmota_build_master.yml | 8 ++++---- .github/workflows/build_all_the_things.yml | 8 ++++---- .gitpod.yml | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 1d7d24852..8f4c70d38 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -101,7 +101,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload safeboot firmware artifacts @@ -139,7 +139,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts @@ -182,7 +182,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: @@ -219,7 +219,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 6b6c4eaf0..9387150fd 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -40,7 +40,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload safeboot firmware artifacts @@ -77,7 +77,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts @@ -120,7 +120,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: @@ -157,7 +157,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio + pip install -U platformio==6.1.7 - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 3f89214e3..366577f0f 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -35,7 +35,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio + pip install -U platformio==6.1.7 #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -63,7 +63,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio + pip install -U platformio==6.1.7 #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -122,7 +122,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio + pip install -U platformio==6.1.7 #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -150,7 +150,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio + pip install -U platformio==6.1.7 #platformio upgrade --dev #platformio update - name: Run PlatformIO diff --git a/.gitpod.yml b/.gitpod.yml index 0425a416b..a15a00f9c 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,5 +1,5 @@ tasks: - - command: pip3 install -U platformio && platformio run -e tasmota + - command: pip3 install -U platformio==6.1.7 && platformio run -e tasmota image: file: .gitpod.Dockerfile From 4c0535687f901d4c8dcab5b7022d77dbb0a1a84b Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Thu, 6 Jul 2023 11:10:26 +0200 Subject: [PATCH 040/150] Accelerate path.listdir() (#18927) * Accelerate path.listdir() * restore old behavior, push filename only and not the full path to the list --- lib/libesp32/berry_tasmota/src/be_port.cpp | 26 ++++++++++------------ 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_port.cpp b/lib/libesp32/berry_tasmota/src/be_port.cpp index 0cfac3573..647c94269 100644 --- a/lib/libesp32/berry_tasmota/src/be_port.cpp +++ b/lib/libesp32/berry_tasmota/src/be_port.cpp @@ -140,27 +140,25 @@ extern "C" { returnit = 1; case MPATH_ISDIR: case MPATH_MODIFIED: { - // listdir and isdir both need to open the file. + //isdir needs to open the file, listdir does not // we use be_fopen because it pre-pends with '/'. // without this TAS fails to find stuff at boot... File *dir = (File *)be_fopen(path, "r"); if (dir) { + String fpath; + String fname; switch (action){ case MPATH_LISTDIR: - // fill out the list object - dir->rewindDirectory(); - while (1) { - File entry = dir->openNextFile(); - if (!entry) { - break; - } - const char * fn = entry.name(); - if (strcmp(fn, ".") && strcmp(fn, "..")) { - be_pushstring(vm, fn); - be_data_push(vm, -2); - be_pop(vm, 1); - } + dir->seekDir(0); + fpath = dir->getNextFileName(); + while (fpath.length() != 0) { + fname = fpath.substring(fpath.lastIndexOf("/") + 1); + const char * fn = fname.c_str(); + be_pushstring(vm, fn); + be_data_push(vm, -2); + be_pop(vm, 1); + fpath = dir->getNextFileName(); } break; case MPATH_ISDIR: From dd2dab4609de7061ccc66a823d22a615badde81d Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Thu, 6 Jul 2023 15:02:25 +0200 Subject: [PATCH 041/150] Revert "Hot fix for gitpod and CI (pio core v6.1.8 is faulty) (#19044)" (#19051) This reverts commit c4f899a72107dec564e553f4788aef48d763db61. --- .github/workflows/Tasmota_build_devel.yml | 8 ++++---- .github/workflows/Tasmota_build_master.yml | 8 ++++---- .github/workflows/build_all_the_things.yml | 8 ++++---- .gitpod.yml | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/Tasmota_build_devel.yml b/.github/workflows/Tasmota_build_devel.yml index 8f4c70d38..1d7d24852 100644 --- a/.github/workflows/Tasmota_build_devel.yml +++ b/.github/workflows/Tasmota_build_devel.yml @@ -101,7 +101,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload safeboot firmware artifacts @@ -139,7 +139,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts @@ -182,7 +182,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: @@ -219,7 +219,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/Tasmota_build_master.yml b/.github/workflows/Tasmota_build_master.yml index 9387150fd..6b6c4eaf0 100644 --- a/.github/workflows/Tasmota_build_master.yml +++ b/.github/workflows/Tasmota_build_master.yml @@ -40,7 +40,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload safeboot firmware artifacts @@ -77,7 +77,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Run PlatformIO run: platformio run -e ${{ matrix.variant }} - name: Upload firmware artifacts @@ -120,7 +120,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: @@ -157,7 +157,7 @@ jobs: - name: Install dependencies run: | pip install wheel - pip install -U platformio==6.1.7 + pip install -U platformio - name: Download safeboot firmwares uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/build_all_the_things.yml b/.github/workflows/build_all_the_things.yml index 366577f0f..3f89214e3 100644 --- a/.github/workflows/build_all_the_things.yml +++ b/.github/workflows/build_all_the_things.yml @@ -35,7 +35,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio==6.1.7 + pip install -U platformio #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -63,7 +63,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio==6.1.7 + pip install -U platformio #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -122,7 +122,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio==6.1.7 + pip install -U platformio #platformio upgrade --dev #platformio update - name: Run PlatformIO @@ -150,7 +150,7 @@ jobs: run: | pip install wheel #python -m pip install --upgrade pip - pip install -U platformio==6.1.7 + pip install -U platformio #platformio upgrade --dev #platformio update - name: Run PlatformIO diff --git a/.gitpod.yml b/.gitpod.yml index a15a00f9c..0425a416b 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -1,5 +1,5 @@ tasks: - - command: pip3 install -U platformio==6.1.7 && platformio run -e tasmota + - command: pip3 install -U platformio && platformio run -e tasmota image: file: .gitpod.Dockerfile From f462fa772dedc5dd228e42d3e5f9963163037e9a Mon Sep 17 00:00:00 2001 From: MIzzzzon Date: Thu, 6 Jul 2023 17:05:38 +0300 Subject: [PATCH 042/150] Create GC9A01_display.ini (#19043) --- tasmota/displaydesc/GC9A01_display.ini | 63 ++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 tasmota/displaydesc/GC9A01_display.ini diff --git a/tasmota/displaydesc/GC9A01_display.ini b/tasmota/displaydesc/GC9A01_display.ini new file mode 100644 index 000000000..30bced760 --- /dev/null +++ b/tasmota/displaydesc/GC9A01_display.ini @@ -0,0 +1,63 @@ +:H,GC9A01,240,240,16,SPI,*,*,*,*,*,*,*,*,40 +:S,2,1,0,1,80,80 +:I +EF,0 +EB,1,14 +FE,0 +EF,0 +EB,1,14 +84,1,40 +85,1,FF +86,1,FF +87,1,FF +88,1,0A +89,1,21 +8A,1,00 +8B,1,80 +8C,1,01 +8D,1,01 +8E,1,FF +8F,1,FF +B6,2,00,20 +3A,1,05 +90,4,08,08,08,08 +BD,1,06 +BC,1,00 +FF,3,60,01,04 +C3,1,13 +C4,1,13 +C9,1,22 +BE,1,11 +E1,2,10,0E +DF,3,21,0c,02 +F0,6,45,09,08,08,26,2A +F1,6,43,70,72,36,37,6F +F2,6,45,09,08,08,26,2A +F3,6,43,70,72,36,37,6F +ED,2,1B,0B +AE,1,77 +CD,1,63 +70,9,07,07,04,0E,0F,09,07,08,03 +E8,1,34 +62,0C,18,0D,71,ED,70,70,18,0F,71,EF,70,70 +63,0C,18,11,71,F1,70,70,18,13,71,F3,70,70 +64,7,28,29,F1,01,F1,00,07 +66,0A,3C,00,CD,67,45,45,10,00,00,00 +67,0A,00,3C,00,00,00,01,54,10,32,98 +74,7,10,85,80,00,00,4E,00 +98,2,3e,07 +35,0 +21,0 +11,80 +29,14 +:o,28 +:O,29 +:A,2A,2B,2C,01 +:R,36 +:0,C0,00,00,00 +:1,A0,00,00,01 +:2,00,00,00,02 +:3,60,00,00,03 +:D,51 +:i,20,21 +# From f56307e321183e9cce48b602f15f002de8c7316f Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 6 Jul 2023 20:59:50 +0200 Subject: [PATCH 043/150] Fix to Partition_Wizard for shelly (#19056) --- .../src/embedded/partition_core.be | 4 +- .../src/solidify/solidified_partition_core.h | 101 ++++++----- tasmota/berry/modules/Partition_Wizard.tapp | Bin 15541 -> 17544 bytes .../Partition_Wizard/partition_wizard.bec | Bin 15098 -> 17101 bytes tasmota/berry/modules/partition_wizard.be | 170 +++++++++++++----- 5 files changed, 181 insertions(+), 94 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be index abf48e813..08736292c 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/partition_core.be +++ b/lib/libesp32/berry_tasmota/src/embedded/partition_core.be @@ -300,8 +300,8 @@ class Partition_otadata #- load otadata from SPI Flash -# def load() import flash - var otadata0 = flash.read(0xE000, 32) - var otadata1 = flash.read(0xF000, 32) + var otadata0 = flash.read(self.offset, 32) + var otadata1 = flash.read(self.offset + 0x1000, 32) self.seq0 = otadata0.get(0, 4) #- ota_seq for block 1 -# self.seq1 = otadata1.get(0, 4) #- ota_seq for block 2 -# var valid0 = otadata0.get(28, 4) == self.crc32_ota_seq(self.seq0) #- is CRC32 valid? -# diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h index d523d1331..caadd3a25 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_partition_core.h @@ -248,65 +248,68 @@ be_local_closure(Partition_otadata_load, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str(flash), /* K1 */ be_nested_str(read), - /* K2 */ be_nested_str(seq0), - /* K3 */ be_nested_str(get), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str(seq1), - /* K6 */ be_nested_str(crc32_ota_seq), - /* K7 */ be_nested_str(_validate), + /* K2 */ be_nested_str(offset), + /* K3 */ be_nested_str(seq0), + /* K4 */ be_nested_str(get), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str(seq1), + /* K7 */ be_nested_str(crc32_ota_seq), + /* K8 */ be_nested_str(_validate), }), &be_const_str_load, &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ + ( &(const binstruction[48]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x8C080301, // 0001 GETMET R2 R1 K1 - 0x5412DFFF, // 0002 LDINT R4 57344 + 0x88100102, // 0002 GETMBR R4 R0 K2 0x5416001F, // 0003 LDINT R5 32 0x7C080600, // 0004 CALL R2 3 0x8C0C0301, // 0005 GETMET R3 R1 K1 - 0x5416EFFF, // 0006 LDINT R5 61440 - 0x541A001F, // 0007 LDINT R6 32 - 0x7C0C0600, // 0008 CALL R3 3 - 0x8C100503, // 0009 GETMET R4 R2 K3 - 0x58180004, // 000A LDCONST R6 K4 - 0x541E0003, // 000B LDINT R7 4 - 0x7C100600, // 000C CALL R4 3 - 0x90020404, // 000D SETMBR R0 K2 R4 - 0x8C100703, // 000E GETMET R4 R3 K3 - 0x58180004, // 000F LDCONST R6 K4 - 0x541E0003, // 0010 LDINT R7 4 - 0x7C100600, // 0011 CALL R4 3 - 0x90020A04, // 0012 SETMBR R0 K5 R4 - 0x8C100503, // 0013 GETMET R4 R2 K3 - 0x541A001B, // 0014 LDINT R6 28 - 0x541E0003, // 0015 LDINT R7 4 - 0x7C100600, // 0016 CALL R4 3 - 0x8C140106, // 0017 GETMET R5 R0 K6 - 0x881C0102, // 0018 GETMBR R7 R0 K2 - 0x7C140400, // 0019 CALL R5 2 - 0x1C100805, // 001A EQ R4 R4 R5 - 0x8C140703, // 001B GETMET R5 R3 K3 - 0x541E001B, // 001C LDINT R7 28 - 0x54220003, // 001D LDINT R8 4 - 0x7C140600, // 001E CALL R5 3 - 0x8C180106, // 001F GETMET R6 R0 K6 - 0x88200105, // 0020 GETMBR R8 R0 K5 - 0x7C180400, // 0021 CALL R6 2 - 0x1C140A06, // 0022 EQ R5 R5 R6 - 0x5C180800, // 0023 MOVE R6 R4 - 0x741A0001, // 0024 JMPT R6 #0027 - 0x4C180000, // 0025 LDNIL R6 - 0x90020406, // 0026 SETMBR R0 K2 R6 - 0x5C180A00, // 0027 MOVE R6 R5 - 0x741A0001, // 0028 JMPT R6 #002B - 0x4C180000, // 0029 LDNIL R6 - 0x90020A06, // 002A SETMBR R0 K5 R6 - 0x8C180107, // 002B GETMET R6 R0 K7 - 0x7C180200, // 002C CALL R6 1 - 0x80000000, // 002D RET 0 + 0x88140102, // 0006 GETMBR R5 R0 K2 + 0x541A0FFF, // 0007 LDINT R6 4096 + 0x00140A06, // 0008 ADD R5 R5 R6 + 0x541A001F, // 0009 LDINT R6 32 + 0x7C0C0600, // 000A CALL R3 3 + 0x8C100504, // 000B GETMET R4 R2 K4 + 0x58180005, // 000C LDCONST R6 K5 + 0x541E0003, // 000D LDINT R7 4 + 0x7C100600, // 000E CALL R4 3 + 0x90020604, // 000F SETMBR R0 K3 R4 + 0x8C100704, // 0010 GETMET R4 R3 K4 + 0x58180005, // 0011 LDCONST R6 K5 + 0x541E0003, // 0012 LDINT R7 4 + 0x7C100600, // 0013 CALL R4 3 + 0x90020C04, // 0014 SETMBR R0 K6 R4 + 0x8C100504, // 0015 GETMET R4 R2 K4 + 0x541A001B, // 0016 LDINT R6 28 + 0x541E0003, // 0017 LDINT R7 4 + 0x7C100600, // 0018 CALL R4 3 + 0x8C140107, // 0019 GETMET R5 R0 K7 + 0x881C0103, // 001A GETMBR R7 R0 K3 + 0x7C140400, // 001B CALL R5 2 + 0x1C100805, // 001C EQ R4 R4 R5 + 0x8C140704, // 001D GETMET R5 R3 K4 + 0x541E001B, // 001E LDINT R7 28 + 0x54220003, // 001F LDINT R8 4 + 0x7C140600, // 0020 CALL R5 3 + 0x8C180107, // 0021 GETMET R6 R0 K7 + 0x88200106, // 0022 GETMBR R8 R0 K6 + 0x7C180400, // 0023 CALL R6 2 + 0x1C140A06, // 0024 EQ R5 R5 R6 + 0x5C180800, // 0025 MOVE R6 R4 + 0x741A0001, // 0026 JMPT R6 #0029 + 0x4C180000, // 0027 LDNIL R6 + 0x90020606, // 0028 SETMBR R0 K3 R6 + 0x5C180A00, // 0029 MOVE R6 R5 + 0x741A0001, // 002A JMPT R6 #002D + 0x4C180000, // 002B LDNIL R6 + 0x90020C06, // 002C SETMBR R0 K6 R6 + 0x8C180108, // 002D GETMET R6 R0 K8 + 0x7C180200, // 002E CALL R6 1 + 0x80000000, // 002F RET 0 }) ) ); diff --git a/tasmota/berry/modules/Partition_Wizard.tapp b/tasmota/berry/modules/Partition_Wizard.tapp index 9b19600a23fc3433305003ab8c9379ed8331873a..98bfc21b98ba0a2f175f3df902054f3f209d9854 100644 GIT binary patch delta 7854 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 SW&Wu-dh@!ky!UBH(fm|^r7%=LV8nMN8FTP+Y zcRtyhWYbPqw+iYOEMfAx6%rLx$c0FxlED(cjL-~Y?tzn1>}m;d9BJ}`fBg@}IxibzOG;fY(H zYg?q$D&KjLe_!c2B&i=rL~1}p-+%YMiVKza4}Mg-v%YzkNX$!rFIB|9$Y%{A$&hJ5 zl$2Uu@%JL}l{Ft)R?1KCx=0o!{d-{X6^?4Bp#c|Gj#y@@f| zACvj{$?W+&WQ!-nDt8OwhsvjqA6LI8iMOs_#uDX8nO23eaH+5H^YZAuiW=uXQM`1b%(pGQ>Y9aGBvHL*QM?jk?RGYv zpt*L0u|oB>ogdkpfo>W)gX;YU%1cn@p_~{qybfIsx-(jFex@TV zWD7c?+LGSBbJ8N~wUF?wFfWs~h-RZ_& zNUgOTEv`^-tz+bF9FX2h3?9Qq#bhSc)+pcTkX%dbs7`i8KVoP5;#U`z#eaUPE~1;O z;u}xS$;gj)pZqFczV+;^`07*fsrbXEru!z{+Pe4p>Q;CCp+uy3Dj_TJKs*ih86AURHc)NIzksE zrWNn$at-5)ZR+cBVr2^Q(w8kG&dJFH+-wJGdUZn>W9-K2$?u$RTYl`OSGVdy4osTs zkv=z6Cu1zEwq{dfLUNO;dsa z7r^I9ew)mogRD-{ES8bIPK2!IiQ^^gDkhriJ`GnXZXBtQWytqW&bCcGj`*HL@iNKr zvWZn&eW!+p5%j4>&7+GwB+$SK8leL@q{f;{O>7_W2wLtfy3+Q_Ez@xp2Pew2?TKj7 z#Tafuq7|zhw$H&{f(t!rA)Z_Ttrg!{#2kysq;qZHI5!4lHF$UG{Kfr@Pf z)jWXY{>fBZ12}1Ja4_jam>?dQUPLDf63dHR^1_ayjWT-%iE*M_Y&&klOcTj$nrVq5 zyGi{_gjEH55k)}OAeof{jwO&WNMuaJ_bS;vmd|7|l4TcxCf}mhHomyCvHj}Cws_{! z5016wcjdlCFK(^wbT{s;esWAiI2@TS;wh3$%;IAfGa=bsR#X>w=k-`7UENj5T?00w z7~MoNTx5;clU4mlQCwtYfR(z50!)6u2L`V?NDM0+=yv#pDp9#-YWk5Sg?qLU4{WQ7 zsMk7VhKZwucreCG!UP0?2g8KQ<)N1g_a>nC5j+NE)=ff}&up>m-2(oIzcPaO_Pmd6ZW%5+J5p+4Q06%(~%4pi;Y9cdcM9lHpzGo6DA2;yDvZVl{8%XY<#cDk#S zIrIPkSL~VD4mqVc_=MEd%`ld*Q46~s=}Yyt=0t%+m9CbHz_FDc1^TXTN3~Qg>bpeI zGI{E*E8eJI5&!$dyr?~SM@UA%zYL`d##bVTx*I#)Q3M}c_=gfKDc3w z-Cz*+8MNIdKm*jM*OJp0Ope)EnG6r?=JDr|(%QdT7Awx@kB82WWuf`S>tMBwh=Y}gJral(HS1QXd}Jy&;&Yh zi)d$vg+}Uarw_SgRyw; z6JdYkr>U`7ieoNP$I?!lh_F&%CT|fqiIj^%9($FciL_!`w>hnlKJ4p|;X)t5#luxa z*{bG;W&w2nsjP`fOP^PUj@M@XM=o+IJ@9olNoj175m*bqT6HX1Uf=F+b~m@~irso7 zzFhV4I_-3~H}AfL-tOMU_Ri)`R}898KbEJ@EiYY(H@3I8w&U8loeS}~9e;vuuixr! zZNI*HXY-})_3nnR($4y;8{$XRr^VTG-(l$g=X3v9P-*k-W_R?Ld0M8ax29&Eamel| zin%AJ++`*zWJY#m$(v+*LmdEPq#PD@P{}J~0(^+Rjo)2Myg7Bgq|^4sovl|-=Y80Z zivONEgO1_e`u1y^Us`=)huhUj^znDQn|EK?SY5x}-Pnd2T9Ay53p_TIB*I!u6fa>O zd8lCgwSo;^bl)VMb+ilf@wV5=7O=Yg%F7!7*9Q|q7C$OZvj@KQ>@^*`#uCKuUM+~% zN`;a2+5k8__@! zpKUD~roOA4&i4DQi{e+NL8&C(m@bJwh(q!1IQRwZO+yG_1uPs&ii%CBi9&W;R_z7J0JE9Lq9U55RhJJ8*XS?I7=~vYZGyZgF(;6ecg-EtIYKr zmXSy<+G$ro_XhOUCu7z0;=sp!SBVFPA0OlZXME4fbRLgApaoEyDsw|0V`kYrHTolb z1Geeli}%rHYv=R(dM&?ST*&XEcW;~X#r^4p;(myBIz-E;=c{Bjd0ZRd=&J@!bzrlu zR@^TsRdi~=OtkD}$mkoAne^H~e}met%nu^~z-(rNG^#FBUfr#TwOUL3n^`*kyV`9@ z{9z&OAa$7{?jXgF3qKM6_f#dLkv|)S3g@y%I;o|!lTvMbP4EuYEEj(hkc4v@j;Etu zJ_J=5jLPPSnoTE!o69}BpdUF5f%pQ!ozwl3Qroqnf$oI|=@$sQYUcX6cmOsevs~Wy zGWMIu;^iw5d^%#z+i)jOn$ISE29p-XCIx?Wr!MG6+_buARQbg6;mIsyj$e3C%#BtK+y`SWvPZSS}B}`Enw@6(!}WnUlPrAu;Gf+>W>E3 ziu-JU8nZT3m^)v-kpa;LfGFsb*9AH3 zazCbI2QHRRkCZH*9>iGI$819MWd@EECUVn~IA`HBl=*2tz+Dd?==eFdbuwFb%(kD) zy!%mOFEgGPGxmRq?PO+~AG0ldjBPNs_^FZHPpIJyr$N|n(oNog^ESVCt%3w?zPl6zq^eX*FlfSsvxRs9c)H zfpO;em!c)<_>X7*ReppyHt!z0&xMlr=+|U%`T55#e9YJ5<)71-gGk1|KgIQbuJY*r E0ghrA{Qv*} diff --git a/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec b/tasmota/berry/modules/Partition_Wizard/partition_wizard.bec index b5227ecd65055926674eeb041663a4415a1eb4dc..786b64901bbf01062b5a4d76c16a467b72ff6a90 100644 GIT binary patch literal 17101 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 delta 5630 zcmZ`-eP|=;d4J}6G&35F($z-SGTLZ__mw7y-nyHSEn^ZZ5$A1ySsMk za=UhI-9<^K$PE{wrY7~}HKDYST_wGmUCr~p?=$bm^YQyV?|l2y(tp1heCyj!RKj10fAFW$!_A#XMDNtUD^ z-q(Y+_+vRNv0^?|EI{Uov6;gO@gw<_^B0sqm&Dg!Eb)JAN6yQ%E;0+(dm7In2W_5T zQT^ycRO}M@E1Ky?ud%EaPf0i1x*Z&m8MPIfZ(+^Y$c86G(aKPnZ)NnVV@}jUi59vU ziq<0R(@NVpnrnqc~5uH$6QHaW{} z((5qV(!iOj9|hFh$kOr}`FGkz_U;Mk&Dh{JbW|*6Qf-3@^)|`1*a{cOs_18Ia8GP5 ztcsuBT@Z6GuZusqH765^@89|qKk~&H@uTM*aq_(XtU1*)>HhBCC)Rg6o6jU7#Z~Dx z2NXGLBo|Ie_1iMLUat()T!;-;H#DlP5%DG(?V<8~E2}mgGOMx9{dyS7c37RGO4rDQ zM>&7>T5#qRTMv+`W^AL#Tz|@Y#`Gg@HknglH&Ab!|5xUcciAt;E}hXDSn^h z{v#y6OQzpOAje7I$_Q9HM4DzuiuptLj-*Bjb)583I)45N#TW+~&+V*mPsJz(9h06}w zumWPMSZ%X@7Wxt_=28>xWnU<5vs7 zjwi#(mIg@D9RDP5hgcx$n{G%$1##qt4!J>F(MEwhjW`%8OD)@}n@QZ54Kv9~1T(3x zh1ivU6jBJ_^y3-HXI}!e{8+|9JXT4^Se{K~1j`{DO_URR?)+RHEZ6&~q z5he*@AU<9UVk(yhZZcIpVuFU50s6 zrt9K6g>nz6V)j+-XOE+4NM;-%z_E1pB>;wxz(+N3BrQD>^V7wV5^m7_h|O-M$KwcQ zUlSrxH-kvRF*7*wsK3A#1Am05iK+5_V#67sTS5rAxgOn0P#s$_ucRHI^y!n9Ck( zJ4s;sv1$csR${=aVm`olCaO*&ZJ7`OUey4yqD4n8!@SBV8zDxX$&9K`2aK@+hGvhU z*l7S8Kze#DzL+3Crk6=&Sm3aLpP$K~4_d!{{w?dDKBlpc&Atx;Jw(%AOqDAQe;_1HvS!e64{8*M>fK7WMLf1 zriW!PlYZu9f*uruIG+sz72#@9xIqp)3;Hms6*92EgcJf36C5*v1XVrNOZuG1Npx!! zn#_fXKB<*~l9F~YF>W1%J>tiyQiDjZ#tE5&3IpX{h>$_L!}Xkz!Z$&$C~ZKJ17pJ13*|su^7&B+bN!k`lT63 z7q4Ba^f=g@p9?mw3%Cy8bZ2~E?traV^>Xpp;x;Euf!9g*pDr;uwnPySe}M+-So~oK z^7#OJh@CLtwp$sPhz}-Zi{nENdt7F|8!!y$BN&iKeV6NDnZm~wFYe9{%!v_Oa|x1U zG;bCqs>N*t701N0jgA&6JzE6E9${~p5Hw>v>AB)RWY5Xa>gIlDr?a#BC_(1K%ejJ1 z2c7+$M<4SH+S}Sc*g5Ek&s}~&eDCsPkfZI*`<>nWPpm)O`PlwuXUkLRVDqgl@vl(0 zTKx)x_K&OI@2Rx&Xs0v!W!jZ#66+%iP}`YDazaKI9BhU*SzTqUUxm!jj^KHlEO(#- zLyUy1f;N(MjZEMR(UO8H9yZy*t4 z)Nx&Tj3aP3R83xA6+aB3k_9H^6aF7A6IQ7q{^nYpEv_znLp)Kz*(93UUx^;>fj_wc zZ~_L%#EyTjb;aGAz9t)CUlAX@xm-5&L+w2m+7@5B*%0eRw}|-^nXn4}Qoe;Get-74 zUxAM`cr_W)2a=-VXlksG)sj`~t}L4;C{RKfepb;3>PDY>5|Fu}Ne-5e9KHAkkl_{o*K;<7P?nlC9;uwog-0c2|g zABLfynNk2~ue1y&Ff+I}F_de$D8Q|tYhhe>BUCPPU7KY@n}b@~QBcVNh4p--nr`HK z7!5Ju3(NluXCSi&gOg%*WISLkHaFj$f-d874_9sM4kXRw zVU9eC5>YKnxG$P0v2gRv;3_q(G;n#rw*$2SqOQj;B_AOgD2i`%GQ~z!r5mWi8yhps zE=2%1^qhizmQ)DEhMBdS{cO-sv)N|fDL2(D4qUODy;0*%@t74bKv|~IOcSnd#<}$A zDNR`74i<05)zlIfHza25X;>yoEi;Xa$EBwii*N<>ggU9xoy&%Rk4jhnCHL4hMma&$ zgMt-C8Y|dgq%e=YS{Ymck7+COfJI!l(Y}iIXD0C7h-v`EFlN`(Qr93c_pZU$Ol>oe zfrF3Bc=CG-X}z?_d}x7|xo8EY)kpjo|H6Gtw3JSC9WrNX15f@k^4!n8#GAQ+v74N! zkejJKZy+f`Qogu_U>@f|v3UF5`P;WYE1gf>c~fEt%@^-TlIXo$yNq{rnfR;4djY7% zz%BmqT#H6w8Z!-UBCw7iJ<_RQBkxrY~7*-n+6G39J(>!-@8uAA!S#&o^^ zM>n797RGcZ#&mnhE-5K}h+ro!rE(dQ67CCfdi|Q_2u`nGT*uOK z;k1N`e+K;(PEW3pQ9#OCfVrZLS&kdNdaF?ZW(bmjC=GpCOfN;ah@SuY^oOML$Kj7< OcbsQ-9*M%ezx-c?mG|NR diff --git a/tasmota/berry/modules/partition_wizard.be b/tasmota/berry/modules/partition_wizard.be index abda19956..9db989901 100644 --- a/tasmota/berry/modules/partition_wizard.be +++ b/tasmota/berry/modules/partition_wizard.be @@ -24,25 +24,49 @@ class Partition_wizard_UI if persist.find("factory_migrate") == true # remove marker to avoid bootloop if something goes wrong + tasmota.log("UPL: Resuming after step 1", 2) persist.remove("factory_migrate") persist.save() # continue the migration process 5 seconds after Wifi is connected def continue_after_5s() - tasmota.remove_rule("parwiz_5s") # first remove rule to avoid firing it again at Wifi reconnect + tasmota.remove_rule("parwiz_5s1") # first remove rule to avoid firing it again at Wifi reconnect + tasmota.remove_rule("parwiz_5s2") # first remove rule to avoid firing it again at Wifi reconnect tasmota.set_timer(5000, /-> self.do_safeboot_partitioning()) # delay by 5 s end - tasmota.add_rule("Wifi#Connected=1", continue_after_5s, "parwiz_5s") + tasmota.add_rule("Wifi#Connected=1", continue_after_5s, "parwiz_5s1") + tasmota.add_rule("Wifi#Connected==1", continue_after_5s, "parwiz_5s2") end end + # ---------------------------------------------------------------------- + # Patch partition core since we can't chang the solidified code + # ---------------------------------------------------------------------- + def patch_partition_core(p) + var otadata = p.otadata + + # patch load + import flash + var otadata0 = flash.read(otadata.offset, 32) + var otadata1 = flash.read(otadata.offset + 0x1000, 32) + otadata.seq0 = otadata0.get(0, 4) #- ota_seq for block 1 -# + otadata.seq1 = otadata1.get(0, 4) #- ota_seq for block 2 -# + var valid0 = otadata0.get(28, 4) == otadata.crc32_ota_seq(otadata.seq0) #- is CRC32 valid? -# + var valid1 = otadata1.get(28, 4) == otadata.crc32_ota_seq(otadata.seq1) #- is CRC32 valid? -# + if !valid0 otadata.seq0 = nil end + if !valid1 otadata.seq1 = nil end + + otadata._validate() + end + def default_safeboot_URL() + import string var arch_sub = tasmota.arch() if arch_sub[0..4] == "esp32" arch_sub = arch_sub[5..] # get the esp32 variant end - return format(self._default_safeboot_URL, arch_sub) + return string.format(self._default_safeboot_URL, arch_sub) end # create a method for adding a button to the main menu @@ -53,15 +77,34 @@ class Partition_wizard_UI "

    ") end + # ---------------------------------------------------------------------- + # Get last fs + # + # Get the last fs partition + # Return the actual slot + # ---------------------------------------------------------------------- + def get_last_fs(p) + var sz = size(p.slots) + var idx = 1 + while idx < sz + var slot = p.slots[-idx] + if slot.is_spiffs() + return slot + end + idx += 1 + end + return nil + end + #- ---------------------------------------------------------------------- -# #- Get fs unallocated size #- ---------------------------------------------------------------------- -# def get_unallocated_k(p) - var last_slot = p.slots[-1] - if last_slot.is_spiffs() + var last_fs = self.get_last_fs(p) + if last_fs != nil # verify that last slot is filesystem var flash_size_k = self.get_max_flash_size_k(p) - var partition_end_k = (last_slot.start + last_slot.sz) / 1024 # last kb used for fs + var partition_end_k = (last_fs.start + last_fs.sz) / 1024 # last kb used for fs if partition_end_k < flash_size_k return flash_size_k - partition_end_k end @@ -73,8 +116,8 @@ class Partition_wizard_UI #- Get max fs start address when expanded to maximum #- ---------------------------------------------------------------------- -# def get_max_fs_start_k(p) - var last_slot = p.slots[-1] - if last_slot.is_spiffs() # verify that last slot is filesystem + var last_fs = p.slots[-1] + if last_fs != nil # verify that last slot is filesystem # get end of previous partition slot var last_app = p.slots[-2] # round upper 64kB @@ -85,7 +128,7 @@ class Partition_wizard_UI end #- ---------------------------------------------------------------------- -# - #- Get max falsh size + #- Get max flash size # # Takes into account that the flash size written may not be accurate # and the flash chip may be larger @@ -99,15 +142,40 @@ class Partition_wizard_UI return flash_size_k end + # ---------------------------------------------------------------------- + # Remove any non wanted partion after last FS + # ---------------------------------------------------------------------- + def remove_partition_after_last_fs(p) + # remove any partition after last fs + do + var last_fs = self.get_last_fs(p) + var changed = false + if last_fs != nil + while true + var last_slot = p.slots[-1] + if !last_slot.is_spiffs() && (last_slot.type != 0) + p.slots.remove(size(p.slots) - 1) # remove last slot + changed = true + else + break + end + end + if changed p.save() end + end + end + end + #- ---------------------------------------------------------------------- -# #- Resize flash definition if needed #- ---------------------------------------------------------------------- -# def resize_max_flash_size_k(p) + self.remove_partition_after_last_fs(p) var flash_size_k = tasmota.memory()['flash'] var flash_size_real_k = tasmota.memory().find("flash_real", flash_size_k) var flash_definition_sector = self.get_flash_definition_sector(p) if (flash_size_k != flash_size_real_k) && flash_definition_sector != nil import flash + import string flash_size_k = flash_size_real_k # try to expand the flash size definition @@ -131,7 +199,7 @@ class Partition_wizard_UI var old_def = flash_def[3] flash_def[3] = (flash_def[3] & 0x0F) | flash_size_code flash.write(flash_definition_sector, flash_def) - tasmota.log(format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) + tasmota.log(string.format("UPL: changing flash definition from 0x02X to 0x%02X", old_def, flash_def[3]), 3) else raise "internal_error", "wrong flash size "+str(flash_size_real_m) end @@ -142,9 +210,9 @@ class Partition_wizard_UI #- Get current fs size #- ---------------------------------------------------------------------- -# def get_cur_fs_size_k(p) - var last_slot = p.slots[-1] - if last_slot.is_spiffs() # verify that last slot is filesystem - return (last_slot.sz + 1023) / 1024 + var last_fs = p.slots[-1] + if last_fs != nil + return (last_fs.sz + 1023) / 1024 end return 0 end @@ -171,13 +239,14 @@ class Partition_wizard_UI #- ---------------------------------------------------------------------- -# def show_resize_fs(p) import webserver + import string var unallocated = self.get_unallocated_k(p) # if there is unallocated space, propose only to claim it if unallocated > 0 webserver.content_send("
     Resize FS to max 

    ") - webserver.content_send(format("

    You can expand the file system by %i KB.
    Its content will be lost.

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

    You can expand the file system by %i KB.
    Its content will be lost.

    ", unallocated)) webserver.content_send("
    ") @@ -190,7 +259,7 @@ class Partition_wizard_UI var flash_size_k = self.get_max_flash_size_k() var fs_max_size_k = flash_size_k - max_fs_start_k var current_fs_size_k = self.get_cur_fs_size_k(p) - #print(format(">>> max_fs_start_k=0x%X flash_size_k=0x%X fs_max_size_k=%i current_fs_size_k=%i", max_fs_start_k, flash_size_k, fs_max_size_k, current_fs_size_k)) + #print(string.format(">>> max_fs_start_k=0x%X flash_size_k=0x%X fs_max_size_k=%i current_fs_size_k=%i", max_fs_start_k, flash_size_k, fs_max_size_k, current_fs_size_k)) if max_fs_start_k > 0 && fs_max_size_k > 64 webserver.content_send("
     Resize FS 

    ") @@ -199,7 +268,7 @@ class Partition_wizard_UI webserver.content_send("") - webserver.content_send(format("", fs_max_size_k, current_fs_size_k)) + webserver.content_send(string.format("", fs_max_size_k, current_fs_size_k)) webserver.content_send("

    ") webserver.content_send("

    ") @@ -231,7 +300,7 @@ class Partition_wizard_UI def factory_migrate_eligible(p) if p.ota_max() <= 0 return false end # device does not have 2x OTA if p.get_factory_slot() != nil return false end - if !p.slots[-1].is_spiffs() return false end + if self.get_last_fs(p) == nil return false end return true # device does not have factory partition end @@ -254,11 +323,12 @@ class Partition_wizard_UI # - true if DONE # - string if ERROR, indicating the error def test_step_1(p) + import string if !self.factory_migrate_eligible(p) return "not eligible to migration" end var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... if cur_part == 1 return true end - if cur_part != 0 return format("active_otadata=%i", cur_part) end # unsupported configuration + if cur_part != 0 return string.format("active_otadata=%i", cur_part) end # unsupported configuration # current partition is `app0` # get size of firmware in `app0` and check if it fits on `app1` var app0 = p.get_ota_slot(0) @@ -314,6 +384,7 @@ class Partition_wizard_UI # `app0` changed subtype to `factory` # `app1` moved to right after `factory` and resized # `app1` changed subtype to `app0` and renamed `app0` + # remove any partition past the last fs # # Returns: # - false if READY @@ -345,10 +416,11 @@ class Partition_wizard_UI static def copy_ota(from_addr, to_addr, sz) import flash + import string var size_left = sz var offset = 0 - tasmota.log(format("UPL: Copy flash from 0x%06X to 0x%06X (size: %ikB)", from_addr, to_addr, sz / 1024), 2) + tasmota.log(string.format("UPL: Copy flash from 0x%06X to 0x%06X (size: %ikB)", from_addr, to_addr, sz / 1024), 2) while size_left > 0 var b = flash.read(from_addr + offset, 4096) flash.erase(to_addr + offset, 4096) @@ -356,13 +428,14 @@ class Partition_wizard_UI size_left -= 4096 offset += 4096 if ((offset-4096) / 102400) < (offset / 102400) - tasmota.log(format("UPL: Progress %ikB", offset/1024), 3) + tasmota.log(string.format("UPL: Progress %ikB", offset/1024), 3) end end tasmota.log("UPL: done", 2) end def do_step_1(p) + import persist var step1_state = self.test_step_1(p) if step1_state == true return true end if type(step1_state) == 'string)' raise "internal_error", step1_state end @@ -377,11 +450,15 @@ class Partition_wizard_UI p.set_active(1) p.save() + persist.factory_migrate = true + persist.save() + tasmota.log("UPL: restarting on `app1`", 2) tasmota.cmd("Restart 1") end def do_step_2(p, safeboot_url) + import string if safeboot_url == nil || safeboot_url == "" safeboot_url = self.default_safeboot_URL() tasmota.log("UPL: no `safeboot` URL, defaulting to "+safeboot_url, 2) @@ -399,7 +476,7 @@ class Partition_wizard_UI var safeboot_size = cl.get_size() if safeboot_size <= 500000 raise "internal_error", "wrong safeboot size "+str(safeboot_size) end if safeboot_size > (self.app_size_min * 1024) raise "internal_error", "safeboot is too large "+str(safeboot_size / 1024)+"kB" end - tasmota.log(format("UPL: flashing `safeboot` from %s %ikB", safeboot_url, (safeboot_size / 1024) + 1), 2) + tasmota.log(string.format("UPL: flashing `safeboot` from %s %ikB", safeboot_url, (safeboot_size / 1024) + 1), 2) var app0 = p.get_ota_slot(0) if app0.start != 0x10000 raise "internal_error", "`app0` offset is not 0x10000" end cl.write_flash(app0.start) @@ -415,6 +492,9 @@ class Partition_wizard_UI if step3_state == true return true end if type(step3_state) == 'string' raise "internal_error", step3_state end + # remove any partition after last fs + self.remove_partition_after_last_fs(p) + var app0 = p.get_ota_slot(0) var app1 = p.get_ota_slot(1) if app0 == nil || app1 == nil raise "internal_error", "there are no `app0` or `app1` partitions" end @@ -479,6 +559,7 @@ class Partition_wizard_UI def show_migrate_to_factory(p) # display ota partitions import webserver + import string if !self.factory_migrate_eligible(p) return end @@ -488,20 +569,20 @@ class Partition_wizard_UI webserver.content_send("

    Please see Safeboot layout documentation

    ") webserver.content_send("

     

    ") - webserver.content_send(format("

    Step 1: %s

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

    Step 2: %s

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

    Step 3: %s

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

    Step 4: %s

    ", self.display_step_state(self.test_step_4(p), "flash final firmware"))) + webserver.content_send(string.format("

    Step 1: %s

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

    Step 2: %s

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

    Step 3: %s

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

    Step 4: %s

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

    ", + webserver.content_send(string.format("
    OTA Url

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

    ") @@ -515,6 +596,7 @@ class Partition_wizard_UI def show_current_partitions(p) # display ota partitions import webserver + import string var cur_part = p.otadata.active_otadata # -1=factory 0=ota_0 1=ota_1... webserver.content_send("
     Current partitions 

    ") @@ -531,22 +613,22 @@ class Partition_wizard_UI var usage_str = "unknown" var used = slot.get_image_size() if (used >= 0) && (used <= slot.sz) - usage_str = format("used %i%%", ((used / 1024) * 100) / (slot.sz / 1024)) + usage_str = string.format("used %i%%", ((used / 1024) * 100) / (slot.sz / 1024)) end - var title = format("%ssubtype:%s offset:0x%06X size:0x%06X", current_boot_partition ? "booted " : "", slot.subtype_to_string(), slot.start, slot.sz) + var title = string.format("%ssubtype:%s offset:0x%06X size:0x%06X", current_boot_partition ? "booted " : "", slot.subtype_to_string(), slot.start, slot.sz) var col_before = "" var col_after = "" if current_boot_partition col_before = "[" col_after = "]" end - # webserver.content_send(format("

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

    ", slot.label, slot.subtype_to_string(), slot.size / 1024, usage_str)) - webserver.content_send(format("", + # webserver.content_send(string.format("

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

    ", slot.label, slot.subtype_to_string(), slot.size / 1024, usage_str)) + webserver.content_send(string.format("", title, col_before, slot.label, col_after, slot.sz / 1024, usage_str)) elif slot.is_spiffs() # spiffs partition - var title = format("subtype:%s offset:0x%06X size:0x%06X", slot.subtype_to_string(), slot.start, slot.sz) - webserver.content_send(format("", title, slot.sz / 1024)) + var title = string.format("subtype:%s offset:0x%06X size:0x%06X", slot.subtype_to_string(), slot.start, slot.sz) + webserver.content_send(string.format("", title, slot.sz / 1024)) end end @@ -555,7 +637,7 @@ class Partition_wizard_UI var last_slot = p.slots[-1] # verify that last slot is file-system var partition_end_k = (last_slot.start + last_slot.sz) / 1024 # last kb used for fs - webserver.content_send(format("", + webserver.content_send(string.format("", partition_end_k * 1024, unallocated * 1024, unallocated)) end webserver.content_send("
    %s%s%s %i KB  (%s)
    %s%s%s %i KB  (%s)
    fs %i KB
    fs %i KB
    <free>:  %i KB
    <free>:  %i KB
    ") @@ -577,6 +659,7 @@ class Partition_wizard_UI import partition_core if !webserver.check_privileged_access() return nil end var p = partition_core.Partition() # load partition layout + self.patch_partition_core(p) webserver.content_start("Partition Wizard") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# @@ -601,6 +684,7 @@ class Partition_wizard_UI ####################################################################### def page_part_ctl() import webserver + import string if !webserver.check_privileged_access() return nil end import partition_core @@ -609,6 +693,7 @@ class Partition_wizard_UI #- check that the partition is valid -# var p = partition_core.Partition() + self.patch_partition_core(p) try @@ -647,7 +732,7 @@ class Partition_wizard_UI var current_fs_size_k = self.get_cur_fs_size_k(p) var fs_target = int(webserver.arg("fs_size")) - if (fs_target < 64) || (fs_target > fs_max_size_k) raise "value_error", format("Invalid FS #%d", fs_target) end + if (fs_target < 64) || (fs_target > fs_max_size_k) raise "value_error", string.format("Invalid FS #%d", fs_target) end # apply the change # shrink last OTA App @@ -685,12 +770,12 @@ class Partition_wizard_UI raise "value_error", "Unknown command" end except .. as e, m - tasmota.log(format("BRY: Exception> '%s' - %s", e, m), 2) + tasmota.log(string.format("BRY: Exception> '%s' - %s", e, m), 2) #- display error page -# webserver.content_start("Parameter error") #- title of the web page -# webserver.content_send_style() #- send standard Tasmota styles -# - webserver.content_send(format("

    Exception:
    '%s'
    %s

    ", e, m)) + webserver.content_send(string.format("

    Exception:
    '%s'
    %s

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

    ") webserver.content_button(webserver.BUTTON_MANAGEMENT) #- button back to management page -# @@ -710,24 +795,23 @@ class Partition_wizard_UI def do_safeboot_partitioning() import webserver import partition_core + import string var p = partition_core.Partition() # load partition layout + self.patch_partition_core(p) if !self.factory_migrate_eligible(p) return true end # STEP 1 var step1_state = self.test_step_1(p) if type(step1_state) == 'string' return step1_state end if step1_state == false - import persist tasmota.log("UPL: Starting step 1", 2) try self.do_step_1(p) except .. as e, m - tasmota.log(format("UPL: error (%s) %s", e, m), 2) + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) return m end - persist.factory_migrate = true - persist.save() return false end tasmota.log("UPL: Step 1 Done", 2) @@ -742,7 +826,7 @@ class Partition_wizard_UI try self.do_step_2(p, safeboot_url) except .. as e, m - tasmota.log(format("UPL: error (%s) %s", e, m), 2) + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) return m end end @@ -756,7 +840,7 @@ class Partition_wizard_UI try self.do_step_3(p) except .. as e, m - tasmota.log(format("UPL: error (%s) %s", e, m), 2) + tasmota.log(string.format("UPL: error (%s) %s", e, m), 2) return m end end From 862edddb56f2343a290450e34c8b5d6f612b0e64 Mon Sep 17 00:00:00 2001 From: xsp1989 Date: Fri, 7 Jul 2023 03:10:57 +0800 Subject: [PATCH 044/150] Fix BUG: Zigbee devices cannot be added through routing nodes (#19036) --- .../xdrv_23_zigbee_7_0_statemachine.ino | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino index fd1aa30f6..03c9f0fcb 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_7_0_statemachine.ino @@ -737,7 +737,7 @@ ZBM(ZBS_SET_CONCENTRATOR, EZSP_setConcentrator, 0x00 /*high*/, 0x00 /*false*/, 0 ZBM(ZBR_SET_CONCENTRATOR, EZSP_setConcentrator, 0x00 /*high*/, 0x00 /*ok*/) // 100000 // setInitialSecurityState -#define EZ_SECURITY_MODE EMBER_TRUST_CENTER_GLOBAL_LINK_KEY | EMBER_PRECONFIGURED_NETWORK_KEY_MODE | EMBER_HAVE_NETWORK_KEY | EMBER_HAVE_PRECONFIGURED_KEY +#define EZ_SECURITY_MODE EMBER_TRUST_CENTER_GLOBAL_LINK_KEY | EMBER_HAVE_PRECONFIGURED_KEY | EMBER_HAVE_NETWORK_KEY | EMBER_NO_FRAME_COUNTER_RESET | EMBER_REQUIRE_ENCRYPTED_KEY ZBR(ZBS_SET_SECURITY, EZSP_setInitialSecurityState, 0x00 /*high*/, Z_B0(EZ_SECURITY_MODE), Z_B1(EZ_SECURITY_MODE), // preConfiguredKey @@ -749,6 +749,14 @@ ZBR(ZBS_SET_SECURITY, EZSP_setInitialSecurityState, 0x00 /*high*/, ) ZBM(ZBR_SET_SECURITY, EZSP_setInitialSecurityState, 0x00 /*high*/, 0x00 /*status*/) +#define EMBER_JOINER_GLOBAL_LINK_KEY 0x0010 +#define EMBER_NWK_LEAVE_REQUEST_NOT_ALLOWED 0x0100 + +#define EZ_EXT_SECURITY EMBER_JOINER_GLOBAL_LINK_KEY | EMBER_NWK_LEAVE_REQUEST_NOT_ALLOWED +ZBM(ZBS_SET_VALUE_EXTERNAL, EZSP_setValue, 0x00,/*high*/ EZSP_VALUE_EXTENDED_SECURITY_BITMASK, 2, Z_B0(EZ_EXT_SECURITY), Z_B1(EZ_EXT_SECURITY)) +ZBM(ZBR_SET_VALUE_EXTERNAL, EZSP_setValue, 0x00,/*high*/ 0x00/*status*/) + + // setIndividual policies ZBM(ZBS_SET_POLICY_00, EZSP_setPolicy, 0x00 /*high*/, EZSP_TRUST_CENTER_POLICY, EZSP_DECISION_ALLOW_JOINS | EZSP_DECISION_ALLOW_UNSECURED_REJOINS) // 55000003 @@ -954,6 +962,7 @@ static const Zigbee_Instruction zb_prog[] PROGMEM = { ZI_ON_ERROR_GOTO(ZIGBEE_LABEL_ABORT) // set encryption keys ZI_SEND(ZBS_SET_SECURITY) ZI_WAIT_RECV(2500, ZBR_SET_SECURITY) + ZI_SEND(ZBS_SET_VALUE_EXTERNAL) ZI_WAIT_RECV(2500, ZBR_SET_VALUE_EXTERNAL) // formNetwork ZI_SEND(ZBS_FORM_NETWORK) ZI_WAIT_RECV(2500, ZBR_FORM_NETWORK) ZI_WAIT_RECV(5000, ZBR_NETWORK_UP) // wait for network to start From 57c4825ccd1ef0f34defb4161f4559fc0065f336 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 6 Jul 2023 21:37:46 +0200 Subject: [PATCH 045/150] `BrRestart` now supports web handlers to work after Berry restart (#19057) --- CHANGELOG.md | 1 + lib/libesp32/berry_mapping/src/be_cb_module.c | 1 - .../berry_tasmota/src/be_webserver_lib.c | 104 ++++++++++++++++++ .../xdrv_52_0_berry_struct.ino | 1 + .../xdrv_52_3_berry_webserver.ino | 54 ++++++--- .../tasmota_xdrv_driver/xdrv_52_9_berry.ino | 22 +++- 6 files changed, 164 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a818d027d..8f3fc8ea6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Berry various fixes for Walrus Operator (#18982) - MiElHVAC power commands regression from v12.4.0.1 (#18923) +- `BrRestart` now supports web handlers to work after Berry restart ### Removed - Support for ESP32-C3 with chip rev below 3 (old development boards) diff --git a/lib/libesp32/berry_mapping/src/be_cb_module.c b/lib/libesp32/berry_mapping/src/be_cb_module.c index b5e7b1427..7bf729a0b 100644 --- a/lib/libesp32/berry_mapping/src/be_cb_module.c +++ b/lib/libesp32/berry_mapping/src/be_cb_module.c @@ -250,7 +250,6 @@ static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, in bvm * vm = be_cb_hooks[num].vm; bvalue *f = &be_cb_hooks[num].f; - if (vm == NULL) { return 0; } // function is not alive anymore, don't crash // push function (don't check type) bvalue *top = be_incrtop(vm); diff --git a/lib/libesp32/berry_tasmota/src/be_webserver_lib.c b/lib/libesp32/berry_tasmota/src/be_webserver_lib.c index 0cdf4ede0..541233893 100644 --- a/lib/libesp32/berry_tasmota/src/be_webserver_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_webserver_lib.c @@ -9,6 +9,9 @@ #ifdef USE_WEBSERVER +#include "be_exec.h" +#include "be_vm.h" + extern int w_webserver_member(bvm *vm); extern int w_webserver_on(bvm *vm); extern int w_webserver_state(bvm *vm); @@ -32,6 +35,107 @@ extern int w_webserver_arg_name(bvm *vm); extern int w_webserver_has_arg(bvm *vm); +// To allow a full restart of the Berry VM, we need to supplement the webserver Request Handler +// model from Arduino framework. +// We use our own list of callbacks + +#define WEBSERVER_REQ_HANDLER_HOOK_MAX 16 // max number of callbacks, each callback requires a distinct address +typedef struct be_webserver_callback_hook_t { + bvm *vm; // make sure we are using the same VM + bvalue f; // the Berry function to call +} be_webserver_callback_hook_t; + +static be_webserver_callback_hook_t be_webserver_cb_hooks[WEBSERVER_REQ_HANDLER_HOOK_MAX]; + +static void be_call_webserver_hook_cb(int32_t num); +typedef void (*berry_webserver_cb_t)(void); +#define WEBSERVER_HOOK_CB(n) void berry_webserver_cb_##n(void) { be_call_webserver_hook_cb(n); } +// list the callbacks +WEBSERVER_HOOK_CB(0); +WEBSERVER_HOOK_CB(1); +WEBSERVER_HOOK_CB(2); +WEBSERVER_HOOK_CB(3); +WEBSERVER_HOOK_CB(4); +WEBSERVER_HOOK_CB(5); +WEBSERVER_HOOK_CB(6); +WEBSERVER_HOOK_CB(7); +WEBSERVER_HOOK_CB(8); +WEBSERVER_HOOK_CB(9); +WEBSERVER_HOOK_CB(10); +WEBSERVER_HOOK_CB(11); +WEBSERVER_HOOK_CB(12); +WEBSERVER_HOOK_CB(13); +WEBSERVER_HOOK_CB(14); +WEBSERVER_HOOK_CB(15); + +// array of callbacks +static const berry_webserver_cb_t berry_callback_array[WEBSERVER_REQ_HANDLER_HOOK_MAX] = { + berry_webserver_cb_0, + berry_webserver_cb_1, + berry_webserver_cb_2, + berry_webserver_cb_3, + berry_webserver_cb_4, + berry_webserver_cb_5, + berry_webserver_cb_6, + berry_webserver_cb_7, + berry_webserver_cb_8, + berry_webserver_cb_9, + berry_webserver_cb_10, + berry_webserver_cb_11, + berry_webserver_cb_12, + berry_webserver_cb_13, + berry_webserver_cb_14, + berry_webserver_cb_15, +}; + +// Return slot number +// -1 if no more available +berry_webserver_cb_t be_webserver_allocate_hook(bvm *vm, int32_t slot, bvalue *f) { + if (slot < 0 || slot >= WEBSERVER_REQ_HANDLER_HOOK_MAX) return NULL; // invalid call, avoid a crash + be_webserver_cb_hooks[slot].vm = vm; + be_webserver_cb_hooks[slot].f = *f; + return berry_callback_array[slot]; +} + +/*********************************************************************************************\ + * `be_webserver_cb_deinit`: + * Clean any callback for this VM +\*********************************************************************************************/ +void be_webserver_cb_deinit(bvm *vm) { + for (int32_t i = 0; i < WEBSERVER_REQ_HANDLER_HOOK_MAX; i++) { + if (be_webserver_cb_hooks[i].vm == vm) { + be_webserver_cb_hooks[i].vm = NULL; + } + } +} + +/*********************************************************************************************\ + * Callback structures + * +\*********************************************************************************************/ +void be_call_webserver_hook_cb(int32_t num) { + // call berry cb dispatcher + int32_t ret = 0; + // retrieve vm and function + if (num < 0 || num >= WEBSERVER_REQ_HANDLER_HOOK_MAX || be_webserver_cb_hooks[num].vm == NULL) return; // invalid call, avoid a crash + + bvm * vm = be_webserver_cb_hooks[num].vm; + bvalue *f = &be_webserver_cb_hooks[num].f; + + // push function (don't check type) + bvalue *top = be_incrtop(vm); + *top = *f; + + ret = be_pcall(vm, 0); // 4 arguments + if (ret != 0) { + if (vm->obshook != NULL) (*vm->obshook)(vm, BE_OBS_PCALL_ERROR); + be_pop(vm, be_top(vm)); // clear Berry stack + return; + } + be_pop(vm, 1); // remove result + return; +} + /* @const_object_info_begin module webserver (scope: global) { member, func(w_webserver_member) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino index ac152d9aa..ba32bd06f 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_0_berry_struct.ino @@ -92,6 +92,7 @@ public: bvm *vm = nullptr; // berry vm int32_t timeout = 0; // Berry heartbeat timeout, preventing code to run for too long. `0` means not enabled bool rules_busy = false; // are we already processing rules, avoid infinite loop + bool web_add_handler_done = false; // did we already sent `web_add_handler` event bool autoexec_done = false; // do we still need to load 'autoexec.be' bool repl_active = false; // is REPL running (activates log recording) // output log is stored as a LinkedList of buffers diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino index 7df813e3f..244e594cf 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webserver.ino @@ -70,7 +70,14 @@ extern "C" { * import webserver * \*********************************************************************************************/ + +#define WEBSERVER_REQ_HANDLER_HOOK_MAX 16 // max number of callbacks, each callback requires a distinct address +static String be_webserver_prefix[WEBSERVER_REQ_HANDLER_HOOK_MAX]; +static uint8_t be_webserver_method[WEBSERVER_REQ_HANDLER_HOOK_MAX]; + extern "C" { + typedef void (*berry_webserver_cb_t)(void); + extern berry_webserver_cb_t be_webserver_allocate_hook(bvm *vm, int32_t num, bvalue *f); // Berry: `webserver.on(prefix:string, callback:closure) -> nil` // // WARNING - this should be called only when receiving `web_add_handler` event. @@ -88,27 +95,40 @@ extern "C" { method = be_toint(vm, 3); } - be_getglobal(vm, PSTR("tasmota")); - if (!be_isnil(vm, -1)) { - be_getmethod(vm, -1, PSTR("gen_cb")); - if (!be_isnil(vm, -1)) { - be_pushvalue(vm, -2); // add instance as first arg - be_pushvalue(vm, 2); // push closure as second arg - be_pcall(vm, 2); // 2 arguments - be_pop(vm, 2); + // find if the prefix/method is already defined + int32_t slot; + for (slot = 0; slot < WEBSERVER_REQ_HANDLER_HOOK_MAX; slot++) { + // AddLog(LOG_LEVEL_INFO, ">>>: slot [%i] prefix='%s' method=%i", slot, be_webserver_prefix[slot] ? be_webserver_prefix[slot].c_str() : "", be_webserver_method[slot]); + if (be_webserver_prefix[slot] == prefix && be_webserver_method[slot] == method) { + break; + } + } - if (be_iscomptr(vm, -1)) { // sanity check - const void * cb = be_tocomptr(vm, -1); - // All good, we can proceed - - WebServer_on(prefix, (void (*)()) cb, method); - be_return_nil(vm); // return, all good + if (slot >= WEBSERVER_REQ_HANDLER_HOOK_MAX) { + // we didn't find a duplicate, let's find a free slot + for (slot = 0; slot < WEBSERVER_REQ_HANDLER_HOOK_MAX; slot++) { + // AddLog(LOG_LEVEL_INFO, ">>>2: slot [%i] prefix='%s' method=%i", slot, be_webserver_prefix[slot] ? be_webserver_prefix[slot].c_str() : "", be_webserver_method[slot]); + if (be_webserver_prefix[slot].equals("")) { + break; } } - be_pop(vm, 1); + if (slot >= WEBSERVER_REQ_HANDLER_HOOK_MAX) { + be_raise(vm, "internal_error", "no more slots for webserver hooks"); + } } - // be_pop(vm, 1); // not really useful since we raise an exception anyways - be_raise(vm, kInternalError, nullptr); + // AddLog(LOG_LEVEL_INFO, ">>>: slot found = %i", slot); + + bvalue *v = be_indexof(vm, 2); + if (be_isgcobj(v)) { + be_gc_fix_set(vm, v->v.gc, btrue); // mark the function as non-gc + } + berry_webserver_cb_t cb = be_webserver_allocate_hook(vm, slot, v); + if (cb == NULL) { be_raise(vm, kInternalError, nullptr); } + be_webserver_prefix[slot] = prefix; + be_webserver_method[slot] = method; + + WebServer_on(prefix, cb, method); + be_return_nil(vm); // return, all good } be_raise(vm, kTypeError, nullptr); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index f39a45271..49255b436 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -304,12 +304,17 @@ void BrShowState(void) { /*********************************************************************************************\ * VM Init \*********************************************************************************************/ +extern "C" void be_webserver_cb_deinit(bvm *vm); void BerryInit(void) { // clean previous VM if any if (berry.vm != nullptr) { be_cb_deinit(berry.vm); // deregister any C callback for this VM +#ifdef USE_WEBSERVER + be_webserver_cb_deinit(berry.vm); // deregister C callbacks managed by webserver +#endif // USE_WEBSERVER be_vm_delete(berry.vm); berry.vm = nullptr; + berry.web_add_handler_done = false; berry.autoexec_done = false; berry.repl_active = false; berry.rules_busy = false; @@ -760,6 +765,18 @@ bool Xdrv52(uint32_t function) BrLoad("autoexec.be"); // run autoexec.be at first tick, so we know all modules are initialized berry.autoexec_done = true; + + // check if `web_add_handler` was missed, for example because of Berry VM restart + if (!berry.web_add_handler_done) { + bool network_up = WifiHasIP(); +#ifdef USE_ETHERNET + network_up = network_up || EthernetHasIP(); +#endif + if (network_up) { // if network is already up, send a synthetic event to trigger web handlers + callBerryEventDispatcher(PSTR("web_add_handler"), nullptr, 0, nullptr); + berry.web_add_handler_done = true; + } + } } if (TasmotaGlobal.berry_fast_loop_enabled) { // call only if enabled at global level callBerryFastLoop(); // call `tasmota.fast_loop()` optimized for minimal performance impact @@ -822,7 +839,10 @@ bool Xdrv52(uint32_t function) callBerryEventDispatcher(PSTR("web_add_config_button"), nullptr, 0, nullptr); break; case FUNC_WEB_ADD_HANDLER: - callBerryEventDispatcher(PSTR("web_add_handler"), nullptr, 0, nullptr); + if (!berry.web_add_handler_done) { + callBerryEventDispatcher(PSTR("web_add_handler"), nullptr, 0, nullptr); + berry.web_add_handler_done = true; + } WebServer_on(PSTR("/bc"), HandleBerryConsole); break; #endif // USE_WEBSERVER From d79c4a7cc66d59d98028b8777261206d908e4ec5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 6 Jul 2023 22:03:05 +0200 Subject: [PATCH 046/150] ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) (#19058) * ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) * Update changelog --- CHANGELOG.md | 1 + lib/libesp32_lvgl/lvgl/library.json | 2 +- lib/libesp32_lvgl/lvgl/library.properties | 2 +- lib/libesp32_lvgl/lvgl/lv_conf_template.h | 10 +- lib/libesp32_lvgl/lvgl/lvgl.h | 2 +- lib/libesp32_lvgl/lvgl/src/core/lv_disp.c | 1 + lib/libesp32_lvgl/lvgl/src/core/lv_obj.c | 9 + .../lvgl/src/draw/arm2d/lv_gpu_arm2d.c | 2 +- lib/libesp32_lvgl/lvgl/src/draw/lv_draw_img.c | 10 +- .../lvgl/src/draw/nxp/pxp/lv_draw_pxp.c | 47 +- .../lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c | 84 +- .../lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h | 16 +- .../lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h | 2 +- .../lvgl/src/draw/nxp/vglite/lv_draw_vglite.c | 125 ++- .../src/draw/nxp/vglite/lv_draw_vglite_arc.c | 4 + .../draw/nxp/vglite/lv_draw_vglite_blend.c | 217 ++--- .../draw/nxp/vglite/lv_draw_vglite_blend.h | 62 +- .../src/draw/nxp/vglite/lv_draw_vglite_line.c | 4 + .../src/draw/nxp/vglite/lv_draw_vglite_rect.c | 16 +- .../lvgl/src/draw/nxp/vglite/lv_vglite_buf.c | 36 +- .../lvgl/src/draw/nxp/vglite/lv_vglite_buf.h | 11 + .../src/draw/nxp/vglite/lv_vglite_utils.h | 34 + .../src/draw/renesas/lv_gpu_d2_draw_label.c | 292 +++++++ .../lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c | 742 ++++++++++++++++++ .../lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h | 56 ++ .../lvgl/src/draw/sdl/lv_draw_sdl_arc.c | 9 +- .../lvgl/src/draw/sdl/lv_draw_sdl_composite.c | 24 +- .../lvgl/src/draw/sdl/lv_draw_sdl_composite.h | 13 +- .../lvgl/src/draw/sdl/lv_draw_sdl_img.c | 58 +- .../lvgl/src/draw/sdl/lv_draw_sdl_img.h | 16 +- .../lvgl/src/draw/sdl/lv_draw_sdl_label.c | 17 +- .../lvgl/src/draw/sdl/lv_draw_sdl_layer.c | 8 +- .../lvgl/src/draw/sdl/lv_draw_sdl_layer.h | 1 + .../lvgl/src/draw/sdl/lv_draw_sdl_line.c | 4 +- .../lvgl/src/draw/sdl/lv_draw_sdl_polygon.c | 8 +- .../lvgl/src/draw/sdl/lv_draw_sdl_priv.h | 1 + .../lvgl/src/draw/sdl/lv_draw_sdl_rect.c | 68 +- .../lvgl/src/draw/sdl/lv_draw_sdl_rect.h | 30 +- .../src/draw/sdl/lv_draw_sdl_texture_cache.c | 16 +- .../src/draw/sdl/lv_draw_sdl_texture_cache.h | 10 +- .../src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c | 42 +- .../src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h | 34 - .../lvgl/src/draw/sw/lv_draw_sw_blend.c | 2 +- .../lvgl/src/extra/layouts/flex/lv_flex.c | 1 + .../lvgl/src/extra/libs/png/lv_png.c | 38 +- lib/libesp32_lvgl/lvgl/src/extra/lv_extra.c | 18 +- .../lvgl/src/extra/widgets/chart/lv_chart.c | 8 +- .../lvgl/src/extra/widgets/msgbox/lv_msgbox.c | 3 + .../src/extra/widgets/tabview/lv_tabview.c | 2 +- lib/libesp32_lvgl/lvgl/src/hal/lv_hal_disp.c | 8 +- lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h | 20 + lib/libesp32_lvgl/lvgl/src/misc/lv_bidi.c | 5 +- .../lvgl/src/widgets/lv_btnmatrix.c | 26 +- 53 files changed, 1967 insertions(+), 310 deletions(-) create mode 100644 lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c create mode 100644 lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c create mode 100644 lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h diff --git a/CHANGELOG.md b/CHANGELOG.md index 8f3fc8ea6..e95efbf29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) - Matter improve responsiveness +- ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) ### Fixed - Berry various fixes for Walrus Operator (#18982) diff --git a/lib/libesp32_lvgl/lvgl/library.json b/lib/libesp32_lvgl/lvgl/library.json index 2efd28a17..94d54b71a 100644 --- a/lib/libesp32_lvgl/lvgl/library.json +++ b/lib/libesp32_lvgl/lvgl/library.json @@ -1,6 +1,6 @@ { "name": "lvgl", - "version": "8.3.7", + "version": "8.3.8", "keywords": "graphics, gui, embedded, tft, lvgl", "description": "Graphics library to create embedded GUI with easy-to-use graphical elements, beautiful visual effects and low memory footprint. It offers anti-aliasing, opacity, and animations using only one frame buffer.", "repository": { diff --git a/lib/libesp32_lvgl/lvgl/library.properties b/lib/libesp32_lvgl/lvgl/library.properties index c8f7ae9c1..ddea9b42f 100644 --- a/lib/libesp32_lvgl/lvgl/library.properties +++ b/lib/libesp32_lvgl/lvgl/library.properties @@ -1,5 +1,5 @@ name=lvgl -version=8.3.7 +version=8.3.8 author=kisvegabor maintainer=kisvegabor,embeddedt,pete-pjb sentence=Full-featured Graphics Library for Embedded Systems diff --git a/lib/libesp32_lvgl/lvgl/lv_conf_template.h b/lib/libesp32_lvgl/lvgl/lv_conf_template.h index 86ca20764..cb3887d34 100644 --- a/lib/libesp32_lvgl/lvgl/lv_conf_template.h +++ b/lib/libesp32_lvgl/lvgl/lv_conf_template.h @@ -1,6 +1,6 @@ /** * @file lv_conf.h - * Configuration file for v8.3.7 + * Configuration file for v8.3.8 */ /* @@ -187,6 +187,14 @@ #define LV_GPU_DMA2D_CMSIS_INCLUDE #endif +/*Enable RA6M3 G2D GPU*/ +#define LV_USE_GPU_RA6M3_G2D 0 +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" +#endif + /*Use SWM341's DMA2D GPU*/ #define LV_USE_GPU_SWM341_DMA2D 0 #if LV_USE_GPU_SWM341_DMA2D diff --git a/lib/libesp32_lvgl/lvgl/lvgl.h b/lib/libesp32_lvgl/lvgl/lvgl.h index 985c796c9..85782a066 100644 --- a/lib/libesp32_lvgl/lvgl/lvgl.h +++ b/lib/libesp32_lvgl/lvgl/lvgl.h @@ -15,7 +15,7 @@ extern "C" { ***************************/ #define LVGL_VERSION_MAJOR 8 #define LVGL_VERSION_MINOR 3 -#define LVGL_VERSION_PATCH 7 +#define LVGL_VERSION_PATCH 8 #define LVGL_VERSION_INFO "" /********************* diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_disp.c b/lib/libesp32_lvgl/lvgl/src/core/lv_disp.c index a1022b56c..dd0f7898e 100644 --- a/lib/libesp32_lvgl/lvgl/src/core/lv_disp.c +++ b/lib/libesp32_lvgl/lvgl/src/core/lv_disp.c @@ -262,6 +262,7 @@ void lv_scr_load_anim(lv_obj_t * new_scr, lv_scr_load_anim_t anim_type, uint32_t /*Shortcut for immediate load*/ if(time == 0 && delay == 0) { scr_load_internal(new_scr); + if(auto_del) lv_obj_del(act_scr); return; } diff --git a/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c b/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c index 8890fcbe0..d7bd04545 100644 --- a/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c +++ b/lib/libesp32_lvgl/lvgl/src/core/lv_obj.c @@ -30,6 +30,10 @@ #include "../draw/stm32_dma2d/lv_gpu_stm32_dma2d.h" #endif +#if LV_USE_GPU_RA6M3_G2D + #include "../draw/renesas/lv_gpu_d2_ra6m3.h" +#endif + #if LV_USE_GPU_SWM341_DMA2D #include "../draw/swm341_dma2d/lv_gpu_swm341_dma2d.h" #endif @@ -119,6 +123,11 @@ void lv_init(void) lv_draw_stm32_dma2d_init(); #endif +#if LV_USE_GPU_RA6M3_G2D + /*Initialize G2D GPU*/ + lv_draw_ra6m3_g2d_init(); +#endif + #if LV_USE_GPU_SWM341_DMA2D /*Initialize DMA2D GPU*/ lv_draw_swm341_dma2d_init(); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c b/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c index 83f3e6605..c42f23872 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/arm2d/lv_gpu_arm2d.c @@ -339,7 +339,7 @@ lv_color_t *rgb_tmp_buf = NULL; \ if(draw_dsc->recolor_opa > LV_OPA_MIN) { \ rgb_tmp_buf \ - = lv_malloc(src_w * src_h * sizeof(lv_color_t)); \ + = lv_mem_buf_get(src_w * src_h * sizeof(lv_color_t)); \ if (NULL == rgb_tmp_buf) { \ LV_LOG_WARN( \ "Failed to allocate memory for accelerating recolour, " \ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_img.c b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_img.c index 1deb39e0c..1e83eaf65 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_img.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/lv_draw_img.c @@ -198,11 +198,19 @@ lv_img_src_t lv_img_src_get_type(const void * src) if(src == NULL) return img_src_type; const uint8_t * u8_p = src; - /*The first byte shows the type of the image source*/ + /*The first or fourth byte depending on platform endianess shows the type of the image source*/ +#if LV_BIG_ENDIAN_SYSTEM + if(u8_p[3] >= 0x20 && u8_p[3] <= 0x7F) { +#else if(u8_p[0] >= 0x20 && u8_p[0] <= 0x7F) { +#endif img_src_type = LV_IMG_SRC_FILE; /*If it's an ASCII character then it's file name*/ } +#if LV_BIG_ENDIAN_SYSTEM + else if(u8_p[3] >= 0x80) { +#else else if(u8_p[0] >= 0x80) { +#endif img_src_type = LV_IMG_SRC_SYMBOL; /*Symbols begins after 0x7F*/ } else { diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c index a7084b408..cd70f48b2 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp.c @@ -59,10 +59,14 @@ static void lv_draw_pxp_wait_for_finish(lv_draw_ctx_t * draw_ctx); +static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); -static void lv_draw_pxp_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); /********************** * STATIC VARIABLES @@ -84,6 +88,7 @@ void lv_draw_pxp_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) pxp_draw_ctx->base_draw.draw_img_decoded = lv_draw_pxp_img_decoded; pxp_draw_ctx->blend = lv_draw_pxp_blend; pxp_draw_ctx->base_draw.wait_for_finish = lv_draw_pxp_wait_for_finish; + pxp_draw_ctx->base_draw.buffer_copy = lv_draw_pxp_buffer_copy; } void lv_draw_pxp_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) @@ -184,22 +189,28 @@ static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_ return; } - lv_area_t blend_area; - /*Let's get the blend area which is the intersection of the area to draw and the clip area.*/ - if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - lv_coord_t src_width = lv_area_get_width(coords); - lv_coord_t src_height = lv_area_get_height(coords); - - bool has_mask = lv_draw_mask_is_any(&blend_area); bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); bool has_rotation = (dsc->angle != 0); bool unsup_rotation = false; + lv_area_t blend_area; + if(has_rotation) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ + + bool has_mask = lv_draw_mask_is_any(&blend_area); + lv_coord_t src_width = lv_area_get_width(coords); + lv_coord_t src_height = lv_area_get_height(coords); + if(has_rotation) { /* * PXP can only rotate at 90x angles. @@ -247,4 +258,18 @@ static void lv_draw_pxp_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_ dsc, cf); } +static void lv_draw_pxp_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + LV_UNUSED(draw_ctx); + + if(lv_area_get_size(dest_area) < LV_GPU_NXP_PXP_SIZE_LIMIT) { + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); + return; + } + + lv_gpu_nxp_pxp_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); +} + #endif /*LV_USE_GPU_NXP_PXP*/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c index a32c91710..82925769a 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.c @@ -40,8 +40,6 @@ * DEFINES *********************/ -#define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * LCD_FB_BYTE_PER_PIXEL - #if LV_COLOR_16_SWAP #error Color swap not implemented. Disable LV_COLOR_16_SWAP feature. #endif @@ -50,10 +48,17 @@ #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatRGB565 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatRGB565 #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB565 + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 2U #elif LV_COLOR_DEPTH == 32 #define PXP_OUT_PIXEL_FORMAT kPXP_OutputPixelFormatARGB8888 #define PXP_AS_PIXEL_FORMAT kPXP_AsPixelFormatARGB8888 - #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #if (!(defined(FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT) && FSL_FEATURE_PXP_HAS_NO_EXTEND_PIXEL_FORMAT)) && \ + (!(defined(FSL_FEATURE_PXP_V3) && FSL_FEATURE_PXP_V3)) + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatARGB8888 + #else + #define PXP_PS_PIXEL_FORMAT kPXP_PsPixelFormatRGB888 + #endif + #define PXP_TEMP_BUF_SIZE LCD_WIDTH * LCD_HEIGHT * 4U #elif #error Only 16bit and 32bit color depth are supported. Set LV_COLOR_DEPTH to 16 or 32. #endif @@ -100,7 +105,7 @@ static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, * @param[in] dsc Image descriptor * @param[in] cf Color format */ -static void lv_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); @@ -286,7 +291,7 @@ void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_ lv_gpu_nxp_pxp_run(); } -void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { @@ -308,6 +313,33 @@ void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest lv_pxp_blit_cf(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc, cf); } +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + lv_coord_t src_width = lv_area_get_width(src_area); + lv_coord_t src_height = lv_area_get_height(src_area); + + lv_gpu_nxp_pxp_reset(); + + const pxp_pic_copy_config_t picCopyConfig = { + .srcPicBaseAddr = (uint32_t)src_buf, + .srcPitchBytes = src_stride * sizeof(lv_color_t), + .srcOffsetX = src_area->x1, + .srcOffsetY = src_area->y1, + .destPicBaseAddr = (uint32_t)dest_buf, + .destPitchBytes = dest_stride * sizeof(lv_color_t), + .destOffsetX = dest_area->x1, + .destOffsetY = dest_area->y1, + .width = src_width, + .height = src_height, + .pixelFormat = PXP_AS_PIXEL_FORMAT + }; + + PXP_StartPictureCopy(LV_GPU_NXP_PXP_ID, &picCopyConfig); + + lv_gpu_nxp_pxp_wait(); +} + /********************** * STATIC FUNCTIONS **********************/ @@ -316,22 +348,25 @@ static void lv_pxp_blit_opa(lv_color_t * dest_buf, const lv_area_t * dest_area, const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { - lv_coord_t temp_area_w = lv_area_get_width(dest_area); - lv_coord_t temp_area_h = lv_area_get_height(dest_area); - const lv_area_t temp_area = { - .x1 = 0, - .y1 = 0, - .x2 = temp_area_w - 1, - .y2 = temp_area_h - 1 - }; + lv_area_t temp_area; + lv_area_copy(&temp_area, dest_area); + lv_coord_t temp_stride = dest_stride; + lv_coord_t temp_w = lv_area_get_width(&temp_area); + lv_coord_t temp_h = lv_area_get_height(&temp_area); /*Step 1: Transform with full opacity to temporary buffer*/ - lv_pxp_blit_cover((lv_color_t *)temp_buf, &temp_area, temp_area_w, src_buf, src_area, src_stride, dsc, cf); + lv_pxp_blit_cover((lv_color_t *)temp_buf, &temp_area, temp_stride, src_buf, src_area, src_stride, dsc, cf); + + /*Switch width and height if angle requires it*/ + if(dsc->angle == 900 || dsc->angle == 2700) { + temp_area.x2 = temp_area.x1 + temp_h - 1; + temp_area.y2 = temp_area.y1 + temp_w - 1; + } /*Step 2: Blit temporary result with required opacity to output*/ - lv_pxp_blit_cf(dest_buf, dest_area, dest_stride, (lv_color_t *)temp_buf, &temp_area, temp_area_w, dsc, cf); + lv_pxp_blit_cf(dest_buf, &temp_area, dest_stride, (lv_color_t *)temp_buf, &temp_area, temp_stride, dsc, cf); } -static void lv_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, +static void lv_pxp_blit_cover(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf) { @@ -343,28 +378,43 @@ static void lv_pxp_blit_cover(lv_color_t * dest_buf, const lv_area_t * dest_area bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); bool has_rotation = (dsc->angle != 0); + lv_point_t pivot = dsc->pivot; + lv_coord_t piv_offset_x; + lv_coord_t piv_offset_y; + lv_gpu_nxp_pxp_reset(); if(has_rotation) { - /*Convert rotation angle*/ + /*Convert rotation angle and calculate offsets caused by pivot*/ pxp_rotate_degree_t pxp_angle; switch(dsc->angle) { case 0: pxp_angle = kPXP_Rotate0; + piv_offset_x = 0; + piv_offset_y = 0; break; case 900: + piv_offset_x = pivot.x + pivot.y - dest_h; + piv_offset_y = pivot.y - pivot.x; pxp_angle = kPXP_Rotate90; break; case 1800: + piv_offset_x = 2 * pivot.x - dest_w; + piv_offset_y = 2 * pivot.y - dest_h; pxp_angle = kPXP_Rotate180; break; case 2700: + piv_offset_x = pivot.x - pivot.y; + piv_offset_y = pivot.x + pivot.y - dest_w; pxp_angle = kPXP_Rotate270; break; default: + piv_offset_x = 0; + piv_offset_y = 0; pxp_angle = kPXP_Rotate0; } PXP_SetRotateConfig(LV_GPU_NXP_PXP_ID, kPXP_RotateOutputBuffer, pxp_angle, kPXP_FlipDisable); + lv_area_move(dest_area, piv_offset_x, piv_offset_y); } /*AS buffer - source image*/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h index 9fe9192f7..961566726 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_draw_pxp_blend.h @@ -99,10 +99,24 @@ void lv_gpu_nxp_pxp_blit(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_ * @param[in] dsc Image descriptor * @param[in] cf Color format */ -void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, +void lv_gpu_nxp_pxp_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc, lv_img_cf_t cf); +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf, no transformation or blending. + * + * + * @param[in/out] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + */ +void lv_gpu_nxp_pxp_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); + /********************** * MACROS **********************/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h index 10a67215a..46f4a0ba1 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/pxp/lv_gpu_nxp_pxp.h @@ -149,7 +149,7 @@ void lv_gpu_nxp_pxp_wait(void); #if LV_GPU_NXP_PXP_LOG_TRACES #define PXP_LOG_TRACE(fmt, ...) \ do { \ - LV_LOG_ERROR(fmt, ##__VA_ARGS__); \ + LV_LOG(fmt, ##__VA_ARGS__); \ } while (0) #else #define PXP_LOG_TRACE(fmt, ...) \ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c index eae1b8a58..031f57e4e 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite.c @@ -69,6 +69,10 @@ static void lv_draw_vglite_wait_for_finish(lv_draw_ctx_t * draw_ctx); static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t cf); +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); + static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, @@ -111,6 +115,7 @@ void lv_draw_vglite_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) vglite_draw_ctx->base_draw.draw_img_decoded = lv_draw_vglite_img_decoded; vglite_draw_ctx->blend = lv_draw_vglite_blend; vglite_draw_ctx->base_draw.wait_for_finish = lv_draw_vglite_wait_for_finish; + vglite_draw_ctx->base_draw.buffer_copy = lv_draw_vglite_buffer_copy; } void lv_draw_vglite_ctx_deinit(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) @@ -166,11 +171,9 @@ static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blen } lv_area_t blend_area; - /*Let's get the blend area which is the intersection of the area to draw and the clip area*/ if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; /*Fully clipped, nothing to do*/ - /*Make the blend area relative to the buffer*/ lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); bool done = false; @@ -185,9 +188,6 @@ static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blen VG_LITE_LOG_TRACE("VG-Lite fill failed. Fallback."); } else { - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); - lv_area_t src_area; src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); @@ -195,8 +195,15 @@ static void lv_draw_vglite_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blen src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; lv_coord_t src_stride = lv_area_get_width(dsc->blend_area); - done = (lv_gpu_nxp_vglite_blit(dest_buf, &blend_area, dest_stride, - src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif if(!done) VG_LITE_LOG_TRACE("VG-Lite blit failed. Fallback."); @@ -224,13 +231,21 @@ static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_i return; } - lv_area_t blend_area; - /*Let's get the blend area which is the intersection of the area to draw and the clip area*/ - if(!_lv_area_intersect(&blend_area, coords, draw_ctx->clip_area)) - return; /*Fully clipped, nothing to do*/ + lv_area_t rel_coords; + lv_area_copy(&rel_coords, coords); + lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - /*Make the blend area relative to the buffer*/ - lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_area_t rel_clip_area; + lv_area_copy(&rel_clip_area, draw_ctx->clip_area); + lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + + lv_area_t blend_area; + bool has_transform = dsc->angle != 0 || dsc->zoom != LV_IMG_ZOOM_NONE; + + if(has_transform) + lv_area_copy(&blend_area, &rel_coords); + else if(!_lv_area_intersect(&blend_area, &rel_coords, &rel_clip_area)) + return; /*Fully clipped, nothing to do*/ bool has_mask = lv_draw_mask_is_any(&blend_area); bool has_recolor = (dsc->recolor_opa != LV_OPA_TRANSP); @@ -242,9 +257,6 @@ static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_i && !lv_img_cf_has_alpha(cf) #endif ) { - lv_color_t * dest_buf = draw_ctx->buf; - lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); - lv_area_t src_area; src_area.x1 = blend_area.x1 - (coords->x1 - draw_ctx->buf_area->x1); src_area.y1 = blend_area.y1 - (coords->y1 - draw_ctx->buf_area->y1); @@ -252,17 +264,48 @@ static void lv_draw_vglite_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_i src_area.y2 = src_area.y1 + lv_area_get_height(coords) - 1; lv_coord_t src_stride = lv_area_get_width(coords); - done = (lv_gpu_nxp_vglite_blit_transform(dest_buf, &blend_area, dest_stride, - src_buf, &src_area, src_stride, dsc) == LV_RES_OK); +#if VG_LITE_BLIT_SPLIT_ENABLED + lv_color_t * dest_buf = draw_ctx->buf; + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + if(has_transform) + /* VG-Lite blit split with transformation is not supported! */ + done = false; + else + done = (lv_gpu_nxp_vglite_blit_split(dest_buf, &blend_area, dest_stride, + src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#else + if(has_transform) + done = (lv_gpu_nxp_vglite_blit_transform(&blend_area, &rel_clip_area, + src_buf, &src_area, src_stride, dsc) == LV_RES_OK); + else + done = (lv_gpu_nxp_vglite_blit(&blend_area, src_buf, &src_area, src_stride, dsc->opa) == LV_RES_OK); +#endif if(!done) - VG_LITE_LOG_TRACE("VG-Lite blit transform failed. Fallback."); + VG_LITE_LOG_TRACE("VG-Lite blit %sfailed. Fallback.", has_transform ? "transform " : ""); } if(!done) lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, cf); } +static void lv_draw_vglite_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area) +{ + bool done = false; + + if(lv_area_get_size(dest_area) >= LV_GPU_NXP_VG_LITE_SIZE_LIMIT) { + done = lv_gpu_nxp_vglite_buffer_copy(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite buffer copy failed. Fallback."); + } + + if(!done) + lv_draw_sw_buffer_copy(draw_ctx, dest_buf, dest_stride, dest_area, src_buf, src_stride, src_area); +} + static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, const lv_point_t * point2) { @@ -284,21 +327,19 @@ static void lv_draw_vglite_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc rel_clip_area.y1 = LV_MIN(point1->y, point2->y) - dsc->width / 2; rel_clip_area.y2 = LV_MAX(point1->y, point2->y) + dsc->width / 2; - bool is_common; - is_common = _lv_area_intersect(&rel_clip_area, &rel_clip_area, draw_ctx->clip_area); - if(!is_common) - return; + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_clip_area, draw_ctx->clip_area)) + return; /*Fully clipped, nothing to do*/ - /* Make coordinates relative to the draw buffer */ lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); lv_point_t rel_point1 = { point1->x - draw_ctx->buf_area->x1, point1->y - draw_ctx->buf_area->y1 }; lv_point_t rel_point2 = { point2->x - draw_ctx->buf_area->x1, point2->y - draw_ctx->buf_area->y1 }; bool done = false; - bool mask_any = lv_draw_mask_is_any(&rel_clip_area); + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); - if(!mask_any) { + if(!has_mask) { done = (lv_gpu_nxp_vglite_draw_line(&rel_point1, &rel_point2, &rel_clip_area, dsc) == LV_RES_OK); if(!done) VG_LITE_LOG_TRACE("VG-Lite draw line failed. Fallback."); @@ -369,8 +410,6 @@ static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_d rel_coords.x2 -= (dsc->border_side & LV_BORDER_SIDE_RIGHT) ? 1 : 0; rel_coords.y2 -= (dsc->border_side & LV_BORDER_SIDE_BOTTOM) ? 1 : 0; } - - /* Make coordinates relative to draw buffer */ lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); lv_area_t rel_clip_area; @@ -379,9 +418,9 @@ static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_d lv_area_t clipped_coords; if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) - return LV_RES_INV; + return LV_RES_OK; /*Fully clipped, nothing to do*/ - bool mask_any = lv_draw_mask_is_any(&rel_coords); + bool has_mask = lv_draw_mask_is_any(&rel_coords); lv_grad_dir_t grad_dir = dsc->bg_grad.dir; lv_color_t bg_color = (grad_dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) ? dsc->bg_color : dsc->bg_grad.stops[0].color; @@ -394,7 +433,7 @@ static lv_res_t lv_draw_vglite_bg(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_d * * Complex case: gradient or radius but no mask. */ - if(!mask_any && ((dsc->radius != 0) || (grad_dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE))) { + if(!has_mask && ((dsc->radius != 0) || (grad_dir != (lv_grad_dir_t)LV_GRAD_DIR_NONE))) { lv_res_t res = lv_gpu_nxp_vglite_draw_bg(&rel_coords, &rel_clip_area, dsc); if(res != LV_RES_OK) VG_LITE_LOG_TRACE("VG-Lite draw bg failed. Fallback."); @@ -426,13 +465,16 @@ static lv_res_t lv_draw_vglite_border(lv_draw_ctx_t * draw_ctx, const lv_draw_re rel_coords.y1 = coords->y1 + ceil(border_width / 2.0f); rel_coords.y2 = coords->y2 - floor(border_width / 2.0f); - /* Make coordinates relative to the draw buffer */ lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); lv_area_t rel_clip_area; lv_area_copy(&rel_clip_area, draw_ctx->clip_area); lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, true); if(res != LV_RES_OK) VG_LITE_LOG_TRACE("VG-Lite draw border failed. Fallback."); @@ -456,13 +498,16 @@ static lv_res_t lv_draw_vglite_outline(lv_draw_ctx_t * draw_ctx, const lv_draw_r rel_coords.y1 = coords->y1 - outline_pad - floor(dsc->outline_width / 2.0f); rel_coords.y2 = coords->y2 + outline_pad + ceil(dsc->outline_width / 2.0f); - /* Make coordinates relative to the draw buffer */ lv_area_move(&rel_coords, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); lv_area_t rel_clip_area; lv_area_copy(&rel_clip_area, draw_ctx->clip_area); lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_area_t clipped_coords; + if(!_lv_area_intersect(&clipped_coords, &rel_coords, &rel_clip_area)) + return LV_RES_OK; /*Fully clipped, nothing to do*/ + lv_res_t res = lv_gpu_nxp_vglite_draw_border_generic(&rel_coords, &rel_clip_area, dsc, false); if(res != LV_RES_OK) VG_LITE_LOG_TRACE("VG-Lite draw outline failed. Fallback."); @@ -488,17 +533,21 @@ static void lv_draw_vglite_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t return; } - /* Make coordinates relative to the draw buffer */ lv_point_t rel_center = {center->x - draw_ctx->buf_area->x1, center->y - draw_ctx->buf_area->y1}; lv_area_t rel_clip_area; lv_area_copy(&rel_clip_area, draw_ctx->clip_area); lv_area_move(&rel_clip_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); - done = (lv_gpu_nxp_vglite_draw_arc(&rel_center, (int32_t)radius, (int32_t)start_angle, (int32_t)end_angle, - &rel_clip_area, dsc) == LV_RES_OK); - if(!done) - VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); + bool has_mask = lv_draw_mask_is_any(&rel_clip_area); + + if(!has_mask) { + done = (lv_gpu_nxp_vglite_draw_arc(&rel_center, (int32_t)radius, (int32_t)start_angle, (int32_t)end_angle, + &rel_clip_area, dsc) == LV_RES_OK); + if(!done) + VG_LITE_LOG_TRACE("VG-Lite draw arc failed. Fallback."); + } + #endif/*LV_DRAW_COMPLEX*/ if(!done) diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c index 775bf734b..39470527d 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_arc.c @@ -216,6 +216,8 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, i vg_lite_matrix_t matrix; vg_lite_identity(&matrix); + lv_vglite_set_scissor(clip_area); + /*** Draw arc ***/ err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw arc failed."); @@ -223,6 +225,8 @@ lv_res_t lv_gpu_nxp_vglite_draw_arc(const lv_point_t * center, int32_t radius, i if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); + lv_vglite_disable_scissor(); + err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c index e1408b760..4a15fd55c 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.c @@ -35,6 +35,7 @@ #if LV_USE_GPU_NXP_VG_LITE #include "lv_vglite_buf.h" +#include "lv_vglite_utils.h" /********************* * DEFINES @@ -43,21 +44,6 @@ /** Stride in px required by VG-Lite HW*/ #define LV_GPU_NXP_VG_LITE_STRIDE_ALIGN_PX 16U -/** - * Enable BLIT quality degradation workaround for RT595, - * recommended for screen's dimension > 352 pixels. - */ -#define RT595_BLIT_WRKRND_ENABLED 1 - -/* Internal compound symbol */ -#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ - defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ - RT595_BLIT_WRKRND_ENABLED -#define VG_LITE_BLIT_SPLIT_ENABLED 1 -#else -#define VG_LITE_BLIT_SPLIT_ENABLED 0 -#endif - #if VG_LITE_BLIT_SPLIT_ENABLED /** * BLIT split threshold - BLITs with width or height higher than this value will be done @@ -75,16 +61,15 @@ **********************/ /** - * Blit single image, with optional opacity. + * Blit image, with optional opacity. * - * @param[in] dest_area Area with relative coordinates of destination buffer * @param[in] src_area Source area with relative coordinates of source buffer * @param[in] opa Opacity * * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -static lv_res_t lv_vglite_blit_single(const lv_area_t * dest_area, const lv_area_t * src_area, lv_opa_t opa); +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa); /** * Check source memory and stride alignment. @@ -113,7 +98,6 @@ static inline void lv_vglite_set_translation_matrix(const lv_area_t * dest_area) static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_area, const lv_draw_img_dsc_t * dsc); #if VG_LITE_BLIT_SPLIT_ENABLED - /** * Move buffer pointer as close as possible to area, but with respect to alignment requirements. X-axis only. * @@ -148,7 +132,7 @@ static void align_y(lv_area_t * area, lv_color_t ** buf, lv_coord_t stride); static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, lv_opa_t opa); -#endif +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ /********************** * STATIC VARIABLES @@ -223,17 +207,14 @@ lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, l return LV_RES_OK; } -lv_res_t lv_gpu_nxp_vglite_blit(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, - lv_opa_t opa) +#if VG_LITE_BLIT_SPLIT_ENABLED +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) { - /* Set vgmatrix. */ - lv_vglite_set_translation_matrix(dest_area); - /* Set src_vgbuf structure. */ lv_vglite_set_src_buf(src_buf, src_area, src_stride); -#if VG_LITE_BLIT_SPLIT_ENABLED lv_color_t * orig_dest_buf = dest_buf; lv_res_t rv = lv_vglite_blit_split(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, opa); @@ -242,45 +223,112 @@ lv_res_t lv_gpu_nxp_vglite_blit(lv_color_t * dest_buf, lv_area_t * dest_area, lv lv_vglite_set_dest_buf_ptr(orig_dest_buf); return rv; +} #else - LV_UNUSED(dest_buf); - LV_UNUSED(dest_stride); - +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa) +{ if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) VG_LITE_RETURN_INV("Check src alignment failed."); - return lv_vglite_blit_single(dest_area, src_area, opa); -#endif -} - -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, - const lv_draw_img_dsc_t * dsc) -{ - /* Set vgmatrix. */ - lv_vglite_set_transformation_matrix(dest_area, dsc); - /* Set src_vgbuf structure. */ lv_vglite_set_src_buf(src_buf, src_area, src_stride); -#if VG_LITE_BLIT_SPLIT_ENABLED - lv_color_t * orig_dest_buf = dest_buf; + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); - lv_res_t rv = lv_vglite_blit_split(dest_buf, dest_area, dest_stride, src_buf, src_area, src_stride, dsc->opa); + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); - /* Restore the original dest_vgbuf memory address. */ - lv_vglite_set_dest_buf_ptr(orig_dest_buf); + /* Start blit. */ + lv_res_t rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); return rv; -#else - LV_UNUSED(dest_buf); - LV_UNUSED(dest_stride); +} + +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, + const lv_draw_img_dsc_t * dsc) +{ + lv_res_t rv = LV_RES_INV; if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) VG_LITE_RETURN_INV("Check src alignment failed."); - return lv_vglite_blit_single(dest_area, src_area, dsc->opa); -#endif + /* Set src_vgbuf structure. */ + lv_vglite_set_src_buf(src_buf, src_area, src_stride); + + /* Set scissor */ + lv_vglite_set_scissor(clip_area); + + /* Set vgmatrix. */ + lv_vglite_set_transformation_matrix(dest_area, dsc); + + /* Start blit. */ + rv = lv_vglite_blit(src_area, dsc->opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return rv; +} +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride) +{ + vg_lite_error_t err = VG_LITE_SUCCESS; + + if(check_src_alignment(src_buf, src_stride) != LV_RES_OK) + VG_LITE_RETURN_INV("Check src alignment failed."); + + vg_lite_buffer_t src_vgbuf; + /* Set src_vgbuf structure. */ + lv_vglite_set_buf(&src_vgbuf, src_buf, src_area, src_stride); + + vg_lite_buffer_t dest_vgbuf; + /* Set dest_vgbuf structure. */ + lv_vglite_set_buf(&dest_vgbuf, dest_buf, dest_area, dest_stride); + + uint32_t rect[] = { + (uint32_t)src_area->x1, /* start x */ + (uint32_t)src_area->y1, /* start y */ + (uint32_t)lv_area_get_width(src_area), /* width */ + (uint32_t)lv_area_get_height(src_area) /* height */ + }; + + /* Set scissor. */ + lv_vglite_set_scissor(dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(dest_area); + + err = vg_lite_blit_rect(&dest_vgbuf, &src_vgbuf, rect, &vgmatrix, + VG_LITE_BLEND_NONE, 0xFFFFFFFFU, VG_LITE_FILTER_POINT); + if(err != VG_LITE_SUCCESS) { + LV_LOG_ERROR("Blit rectangle failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; + } + + if(lv_vglite_run() != LV_RES_OK) { + LV_LOG_ERROR("Run failed."); + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_INV; + } + + /* Disable scissor. */ + lv_vglite_disable_scissor(); + + return LV_RES_OK; } /********************** @@ -320,10 +368,17 @@ static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_are lv_vglite_set_dest_buf_ptr(dest_buf); lv_vglite_set_src_buf_ptr(src_buf); + /* Set scissor */ + lv_vglite_set_scissor(dest_area); + /* Set vgmatrix. */ lv_vglite_set_translation_matrix(dest_area); - rv = lv_vglite_blit_single(dest_area, src_area, opa); + /* Start blit. */ + rv = lv_vglite_blit(src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); VG_LITE_LOG_TRACE("Single " "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " @@ -426,14 +481,21 @@ static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_are if(check_src_alignment(tile_src_buf, src_stride) != LV_RES_OK) VG_LITE_RETURN_INV("Check src alignment failed."); - /* Set vgmatrix. */ - lv_vglite_set_translation_matrix(&tile_dest_area); - /* Set new dest_vgbuf and src_vgbuf memory addresses. */ lv_vglite_set_dest_buf_ptr(tile_dest_buf); lv_vglite_set_src_buf_ptr(tile_src_buf); - rv = lv_vglite_blit_single(&tile_dest_area, &tile_src_area, opa); + /* Set scissor */ + lv_vglite_set_scissor(&tile_dest_area); + + /* Set vgmatrix. */ + lv_vglite_set_translation_matrix(&tile_dest_area); + + /* Start blit. */ + rv = lv_vglite_blit(&tile_src_area, opa); + + /* Disable scissor. */ + lv_vglite_disable_scissor(); VG_LITE_LOG_TRACE("Tile [%d, %d] " "Area: ([%d,%d], [%d,%d]) -> ([%d,%d], [%d,%d]) | " @@ -455,9 +517,9 @@ static lv_res_t lv_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_are return rv; } -#endif /* VG_LITE_BLIT_SPLIT_ENABLED */ +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ -static lv_res_t lv_vglite_blit_single(const lv_area_t * dest_area, const lv_area_t * src_area, lv_opa_t opa) +static lv_res_t lv_vglite_blit(const lv_area_t * src_area, lv_opa_t opa) { vg_lite_error_t err = VG_LITE_SUCCESS; vg_lite_buffer_t * dst_vgbuf = lv_vglite_get_dest_buf(); @@ -489,30 +551,11 @@ static lv_res_t lv_vglite_blit_single(const lv_area_t * dest_area, const lv_area src_vgbuf->transparency_mode = VG_LITE_IMAGE_TRANSPARENT; } - bool scissoring = lv_area_get_width(dest_area) < lv_area_get_width(src_area) || - lv_area_get_height(dest_area) < lv_area_get_height(src_area); - if(scissoring) { - vg_lite_enable_scissor(); - vg_lite_set_scissor((int32_t)dest_area->x1, (int32_t)dest_area->y1, - (int32_t)lv_area_get_width(dest_area), - (int32_t)lv_area_get_height(dest_area)); - } - err = vg_lite_blit_rect(dst_vgbuf, src_vgbuf, rect, &vgmatrix, blend, color, VG_LITE_FILTER_POINT); - if(err != VG_LITE_SUCCESS) { - if(scissoring) - vg_lite_disable_scissor(); - VG_LITE_RETURN_INV("Blit rectangle failed."); - } + VG_LITE_ERR_RETURN_INV(err, "Blit rectangle failed."); - if(lv_vglite_run() != LV_RES_OK) { - if(scissoring) - vg_lite_disable_scissor(); + if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); - } - - if(scissoring) - vg_lite_disable_scissor(); return LV_RES_OK; } @@ -546,16 +589,14 @@ static inline void lv_vglite_set_transformation_matrix(const lv_area_t * dest_ar bool has_scale = (dsc->zoom != LV_IMG_ZOOM_NONE); bool has_rotation = (dsc->angle != 0); - if(has_scale || has_rotation) { - vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &vgmatrix); - if(has_rotation) - vg_lite_rotate(dsc->angle / 10.0f, &vgmatrix); /* angle is 1/10 degree */ - if(has_scale) { - vg_lite_float_t scale = 1.0f * dsc->zoom / LV_IMG_ZOOM_NONE; - vg_lite_scale(scale, scale, &vgmatrix); - } - vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &vgmatrix); + vg_lite_translate(dsc->pivot.x, dsc->pivot.y, &vgmatrix); + if(has_rotation) + vg_lite_rotate(dsc->angle / 10.0f, &vgmatrix); /* angle is 1/10 degree */ + if(has_scale) { + vg_lite_float_t scale = 1.0f * dsc->zoom / LV_IMG_ZOOM_NONE; + vg_lite_scale(scale, scale, &vgmatrix); } + vg_lite_translate(0.0f - dsc->pivot.x, 0.0f - dsc->pivot.y, &vgmatrix); } #if VG_LITE_BLIT_SPLIT_ENABLED diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h index 025d2b5cc..1aae34bd9 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_blend.h @@ -47,6 +47,21 @@ extern "C" { * DEFINES *********************/ +/** + * Enable BLIT quality degradation workaround for RT595, + * recommended for screen's dimension > 352 pixels. + */ +#define RT595_BLIT_WRKRND_ENABLED 1 + +/* Internal compound symbol */ +#if (defined(CPU_MIMXRT595SFFOB) || defined(CPU_MIMXRT595SFFOB_cm33) || \ + defined(CPU_MIMXRT595SFFOC) || defined(CPU_MIMXRT595SFFOC_cm33)) && \ + RT595_BLIT_WRKRND_ENABLED +#define VG_LITE_BLIT_SPLIT_ENABLED 1 +#else +#define VG_LITE_BLIT_SPLIT_ENABLED 0 +#endif + /********************** * TYPEDEFS **********************/ @@ -67,6 +82,7 @@ extern "C" { */ lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, lv_opa_t opa); +#if VG_LITE_BLIT_SPLIT_ENABLED /** * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. * By default, image is copied directly, with optional opacity. @@ -82,17 +98,33 @@ lv_res_t lv_gpu_nxp_vglite_fill(const lv_area_t * dest_area, lv_color_t color, l * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_blit(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, +lv_res_t lv_gpu_nxp_vglite_blit_split(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, + lv_opa_t opa); +#else +/** + * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with effects. + * By default, image is copied directly, with optional opacity. + * + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * @param[in] opa Opacity + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_blit(const lv_area_t * dest_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, lv_opa_t opa); /** * BLock Image Transfer - copy rectangular image from src_buf to dst_buf with transformation. * By default, image is copied directly, with optional opacity. * - * @param[in/out] dest_buf Destination buffer * @param[in] dest_area Area with relative coordinates of destination buffer - * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] clip_area Clip area with relative coordinates of destination buffer * @param[in] src_buf Source buffer * @param[in] src_area Source area with relative coordinates of source buffer * @param[in] src_stride Stride of source buffer in pixels @@ -101,10 +133,28 @@ lv_res_t lv_gpu_nxp_vglite_blit(lv_color_t * dest_buf, lv_area_t * dest_area, lv * @retval LV_RES_OK Transfer complete * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) */ -lv_res_t lv_gpu_nxp_vglite_blit_transform(lv_color_t * dest_buf, lv_area_t * dest_area, lv_coord_t dest_stride, - const lv_color_t * src_buf, lv_area_t * src_area, lv_coord_t src_stride, +lv_res_t lv_gpu_nxp_vglite_blit_transform(const lv_area_t * dest_area, const lv_area_t * clip_area, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride, const lv_draw_img_dsc_t * dsc); +#endif /*VG_LITE_BLIT_SPLIT_ENABLED*/ + +/** + * BLock Image Transfer - simple copy of rectangular image from source to destination. + * + * @param[in] dest_buf Destination buffer + * @param[in] dest_area Area with relative coordinates of destination buffer + * @param[in] dest_stride Stride of destination buffer in pixels + * @param[in] src_buf Source buffer + * @param[in] src_area Source area with relative coordinates of source buffer + * @param[in] src_stride Stride of source buffer in pixels + * + * @retval LV_RES_OK Transfer complete + * @retval LV_RES_INV Error occurred (\see LV_GPU_NXP_VG_LITE_LOG_ERRORS) + */ +lv_res_t lv_gpu_nxp_vglite_buffer_copy(lv_color_t * dest_buf, const lv_area_t * dest_area, lv_coord_t dest_stride, + const lv_color_t * src_buf, const lv_area_t * src_area, lv_coord_t src_stride); + /********************** * MACROS **********************/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c index f6e1c4352..bf7bee11a 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_line.c @@ -119,12 +119,16 @@ lv_res_t lv_gpu_nxp_vglite_draw_line(const lv_point_t * point1, const lv_point_t err = vg_lite_update_stroke(&path); VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + lv_vglite_set_scissor(clip_area); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw line failed."); if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); + lv_vglite_disable_scissor(); + err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c index 39ccaa481..e9db57da9 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_draw_vglite_rect.c @@ -166,6 +166,8 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * c if(lv_vglite_premult_and_swizzle(&vgcol, bg_col32, dsc->bg_opa, color_format) != LV_RES_OK) VG_LITE_RETURN_INV("Premultiplication and swizzle failed."); + lv_vglite_set_scissor(clip_area); + /*** Draw rectangle ***/ if(dsc->bg_grad.dir == (lv_grad_dir_t)LV_GRAD_DIR_NONE) { err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_EVEN_ODD, &matrix, VG_LITE_BLEND_SRC_OVER, vgcol); @@ -178,6 +180,8 @@ lv_res_t lv_gpu_nxp_vglite_draw_bg(const lv_area_t * coords, const lv_area_t * c if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); + lv_vglite_disable_scissor(); + err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -263,12 +267,16 @@ lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const l err = vg_lite_update_stroke(&path); VG_LITE_ERR_RETURN_INV(err, "Update stroke failed."); + lv_vglite_set_scissor(clip_area); + err = vg_lite_draw(vgbuf, &path, VG_LITE_FILL_NON_ZERO, &matrix, vglite_blend_mode, vgcol); VG_LITE_ERR_RETURN_INV(err, "Draw border failed."); if(lv_vglite_run() != LV_RES_OK) VG_LITE_RETURN_INV("Run failed."); + lv_vglite_disable_scissor(); + err = vg_lite_clear_path(&path); VG_LITE_ERR_RETURN_INV(err, "Clear path failed."); @@ -276,6 +284,10 @@ lv_res_t lv_gpu_nxp_vglite_draw_border_generic(const lv_area_t * coords, const l } +/********************** + * STATIC FUNCTIONS + **********************/ + static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path_data_size, lv_coord_t radius, const lv_area_t * coords) @@ -444,8 +456,4 @@ static void lv_vglite_create_rect_path_data(int32_t * path_data, uint32_t * path *path_data_size = pidx * sizeof(int32_t); } -/********************** - * STATIC FUNCTIONS - **********************/ - #endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c index f6325ab2a..e1ff6a297 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.c @@ -57,8 +57,6 @@ static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf); -static inline void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, - const lv_area_t * area, lv_coord_t stride); /********************** * STATIC VARIABLES @@ -106,23 +104,8 @@ void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_co lv_vglite_set_buf(&src_vgbuf, buf, area, stride); } -/********************** - * STATIC FUNCTIONS - **********************/ - -static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) -{ - lv_vglite_set_buf(&dest_vgbuf, buf, area, stride); -} - -static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf) -{ - vgbuf->memory = (void *)buf; - vgbuf->address = (uint32_t)vgbuf->memory; -} - -static inline void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, - const lv_area_t * area, lv_coord_t stride) +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride) { vgbuf->format = VG_LITE_PX_FMT; vgbuf->tiled = VG_LITE_LINEAR; @@ -140,4 +123,19 @@ static inline void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t vgbuf->handle = NULL; } +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_dest_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride) +{ + lv_vglite_set_buf(&dest_vgbuf, buf, area, stride); +} + +static inline void lv_vglite_set_buf_ptr(vg_lite_buffer_t * vgbuf, const lv_color_t * buf) +{ + vgbuf->memory = (void *)buf; + vgbuf->address = (uint32_t)vgbuf->memory; +} + #endif /*LV_USE_GPU_NXP_VG_LITE*/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h index 9219dca05..e89af1c87 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_buf.h @@ -100,6 +100,17 @@ void lv_vglite_set_src_buf_ptr(const lv_color_t * buf); */ void lv_vglite_set_src_buf(const lv_color_t * buf, const lv_area_t * area, lv_coord_t stride); +/** + * Set vglite buffer. + * + * @param[in] vgbuf Address of the VGLite buffer object + * @param[in] buf Address of the memory for the VGLite buffer + * @param[in] area buffer area (for width and height) + * @param[in] stride buffer stride + */ +void lv_vglite_set_buf(vg_lite_buffer_t * vgbuf, const lv_color_t * buf, + const lv_area_t * area, lv_coord_t stride); + /********************** * MACROS **********************/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h index 9ff4de02f..219396b10 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/nxp/vglite/lv_vglite_utils.h @@ -71,6 +71,23 @@ extern "C" { * TYPEDEFS **********************/ +/********************** + * STATIC PROTOTYPES + **********************/ + +/** + * Enable scissor and set the clipping box. + * + * @param[in] clip_area Clip area with relative coordinates of destination buffer + */ +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area); + +/** + * Disable scissor. + */ +static inline void lv_vglite_disable_scissor(void); + + /********************** * GLOBAL PROTOTYPES **********************/ @@ -157,6 +174,23 @@ lv_res_t lv_vglite_run(void); }while(0) #endif /*LV_GPU_NXP_VG_LITE_LOG_TRACES*/ +/********************** + * STATIC FUNCTIONS + **********************/ + +static inline void lv_vglite_set_scissor(const lv_area_t * clip_area) +{ + vg_lite_enable_scissor(); + vg_lite_set_scissor((int32_t)clip_area->x1, (int32_t)clip_area->y1, + (int32_t)lv_area_get_width(clip_area), + (int32_t)lv_area_get_height(clip_area)); +} + +static inline void lv_vglite_disable_scissor(void) +{ + vg_lite_disable_scissor(); +} + #endif /*LV_USE_GPU_NXP_VG_LITE*/ #ifdef __cplusplus diff --git a/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c new file mode 100644 index 000000000..b12866de5 --- /dev/null +++ b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_draw_label.c @@ -0,0 +1,292 @@ +/** + * @file lv_gpu_d2_draw_label.c + * + * @description HAL layer for display driver + * + */ + +/********************* + * INCLUDES + *********************/ +#include "../../draw/lv_draw_label.h" +#include "../../misc/lv_assert.h" +#include "../../core/lv_refr.h" +#include "lv_gpu_d2_ra6m3.h" + +#if LV_USE_GPU_RA6M3_G2D +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************** + * STATIC VARIABLES + **********************/ + +/********************** + * GLOBAL VARIABLES + **********************/ +extern const uint8_t _lv_bpp1_opa_table[2]; +extern const uint8_t _lv_bpp2_opa_table[4]; +extern const uint8_t _lv_bpp4_opa_table[16]; +extern const uint8_t _lv_bpp8_opa_table[256]; + +/********************** + * MACROS + **********************/ + +/********************** + * GLOBAL FUNCTIONS + **********************/ + +/********************** + * STATIC FUNCTIONS + **********************/ + +LV_ATTRIBUTE_FAST_MEM static void draw_letter_normal(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, + const lv_point_t * pos, lv_font_glyph_dsc_t * g, const uint8_t * map_p) +{ + + const uint8_t * bpp_opa_table_p; + uint32_t bitmask_init; + uint32_t bitmask; + uint32_t bpp = g->bpp; + lv_opa_t opa = dsc->opa; + uint32_t shades; + if(bpp == 3) bpp = 4; + +#if LV_USE_IMGFONT + if(bpp == LV_IMGFONT_BPP) { //is imgfont + lv_area_t fill_area; + fill_area.x1 = pos->x; + fill_area.y1 = pos->y; + fill_area.x2 = pos->x + g->box_w - 1; + fill_area.y2 = pos->y + g->box_h - 1; + lv_draw_img_dsc_t img_dsc; + lv_draw_img_dsc_init(&img_dsc); + img_dsc.angle = 0; + img_dsc.zoom = LV_IMG_ZOOM_NONE; + img_dsc.opa = dsc->opa; + img_dsc.blend_mode = dsc->blend_mode; + lv_draw_img(draw_ctx, &img_dsc, &fill_area, map_p); + return; + } +#endif + + switch(bpp) { + case 1: + bpp_opa_table_p = _lv_bpp1_opa_table; + bitmask_init = 0x80; + shades = 2; + break; + case 2: + bpp_opa_table_p = _lv_bpp2_opa_table; + bitmask_init = 0xC0; + shades = 4; + break; + case 4: + bpp_opa_table_p = _lv_bpp4_opa_table; + bitmask_init = 0xF0; + shades = 16; + break; + case 8: + bpp_opa_table_p = _lv_bpp8_opa_table; + bitmask_init = 0xFF; + shades = 256; + break; /*No opa table, pixel value will be used directly*/ + default: + LV_LOG_WARN("lv_draw_letter: invalid bpp"); + return; /*Invalid bpp. Can't render the letter*/ + } + + static lv_opa_t opa_table[256]; + static lv_opa_t prev_opa = LV_OPA_TRANSP; + static uint32_t prev_bpp = 0; + if(opa < LV_OPA_MAX) { + if(prev_opa != opa || prev_bpp != bpp) { + uint32_t i; + for(i = 0; i < shades; i++) { + opa_table[i] = bpp_opa_table_p[i] == LV_OPA_COVER ? opa : ((bpp_opa_table_p[i] * opa) >> 8); + } + } + bpp_opa_table_p = opa_table; + prev_opa = opa; + prev_bpp = bpp; + } + + int32_t col, row; + int32_t box_w = g->box_w; + int32_t box_h = g->box_h; + int32_t width_bit = box_w * bpp; /*Letter width in bits*/ + + /*Calculate the col/row start/end on the map*/ + int32_t col_start = pos->x >= draw_ctx->clip_area->x1 ? 0 : draw_ctx->clip_area->x1 - pos->x; + int32_t col_end = pos->x + box_w <= draw_ctx->clip_area->x2 ? box_w : draw_ctx->clip_area->x2 - pos->x + 1; + int32_t row_start = pos->y >= draw_ctx->clip_area->y1 ? 0 : draw_ctx->clip_area->y1 - pos->y; + int32_t row_end = pos->y + box_h <= draw_ctx->clip_area->y2 ? box_h : draw_ctx->clip_area->y2 - pos->y + 1; + + /*Move on the map too*/ + uint32_t bit_ofs = (row_start * width_bit) + (col_start * bpp); + map_p += bit_ofs >> 3; + + uint8_t letter_px; + uint32_t col_bit; + col_bit = bit_ofs & 0x7; /*"& 0x7" equals to "% 8" just faster*/ + + lv_draw_sw_blend_dsc_t blend_dsc; + lv_memset_00(&blend_dsc, sizeof(blend_dsc)); + blend_dsc.color = dsc->color; + blend_dsc.opa = LV_OPA_COVER; + blend_dsc.blend_mode = dsc->blend_mode; + + lv_coord_t hor_res = lv_disp_get_hor_res(_lv_refr_get_disp_refreshing()); + uint32_t mask_buf_size = box_w * box_h > hor_res ? hor_res : box_w * box_h; + lv_opa_t * mask_buf = lv_mem_buf_get(mask_buf_size); + blend_dsc.mask_buf = mask_buf; + int32_t mask_p = 0; + + lv_area_t fill_area; + fill_area.x1 = col_start + pos->x; + fill_area.x2 = col_end + pos->x - 1; + fill_area.y1 = row_start + pos->y; + fill_area.y2 = fill_area.y1; +#if LV_DRAW_COMPLEX + lv_coord_t fill_w = lv_area_get_width(&fill_area); + lv_area_t mask_area; + lv_area_copy(&mask_area, &fill_area); + mask_area.y2 = mask_area.y1 + row_end; + bool mask_any = lv_draw_mask_is_any(&mask_area); +#endif + blend_dsc.blend_area = &fill_area; + blend_dsc.mask_area = &fill_area; + + uint32_t col_bit_max = 8 - bpp; + uint32_t col_bit_row_ofs = (box_w + col_start - col_end) * bpp; + + for(row = row_start ; row < row_end; row++) { +#if LV_DRAW_COMPLEX + int32_t mask_p_start = mask_p; +#endif + bitmask = bitmask_init >> col_bit; + for(col = col_start; col < col_end; col++) { + /*Load the pixel's opacity into the mask*/ + letter_px = (*map_p & bitmask) >> (col_bit_max - col_bit); + if(letter_px) { + mask_buf[mask_p] = bpp_opa_table_p[letter_px]; + } + else { + mask_buf[mask_p] = 0; + } + + /*Go to the next column*/ + if(col_bit < col_bit_max) { + col_bit += bpp; + bitmask = bitmask >> bpp; + } + else { + col_bit = 0; + bitmask = bitmask_init; + map_p++; + } + + /*Next mask byte*/ + mask_p++; + } + +#if LV_DRAW_COMPLEX + /*Apply masks if any*/ + if(mask_any) { + blend_dsc.mask_res = lv_draw_mask_apply(mask_buf + mask_p_start, fill_area.x1, fill_area.y2, + fill_w); + if(blend_dsc.mask_res == LV_DRAW_MASK_RES_TRANSP) { + lv_memset_00(mask_buf + mask_p_start, fill_w); + } + } +#endif + + if((uint32_t) mask_p + (col_end - col_start) < mask_buf_size) { + fill_area.y2 ++; + } + else { + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + + fill_area.y1 = fill_area.y2 + 1; + fill_area.y2 = fill_area.y1; + mask_p = 0; + } + + col_bit += col_bit_row_ofs; + map_p += (col_bit >> 3); + col_bit = col_bit & 0x7; + } + + /*Flush the last part*/ + if(fill_area.y1 != fill_area.y2) { + fill_area.y2--; + blend_dsc.mask_res = LV_DRAW_MASK_RES_CHANGED; + lv_draw_ra6m3_2d_blend(draw_ctx, &blend_dsc); + mask_p = 0; + } + + lv_mem_buf_release(mask_buf); +} + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter) +{ + const lv_font_t * font_p = dsc->font; + + lv_opa_t opa = dsc->opa; + if(opa < LV_OPA_MIN) return; + if(opa > LV_OPA_MAX) opa = LV_OPA_COVER; + + if(font_p == NULL) { + LV_LOG_WARN("lv_draw_letter: font is NULL"); + return; + } + + lv_font_glyph_dsc_t g; + bool g_ret = lv_font_get_glyph_dsc(font_p, &g, letter, '\0'); + if(g_ret == false) { + /*Add warning if the dsc is not found + *but do not print warning for non printable ASCII chars (e.g. '\n')*/ + if(letter >= 0x20 && + letter != 0xf8ff && /*LV_SYMBOL_DUMMY*/ + letter != 0x200c) { /*ZERO WIDTH NON-JOINER*/ + LV_LOG_WARN("lv_draw_letter: glyph dsc. not found for U+%X", letter); + } + return; + } + + /*Don't draw anything if the character is empty. E.g. space*/ + if((g.box_h == 0) || (g.box_w == 0)) return; + + lv_point_t gpos; + gpos.x = pos_p->x + g.ofs_x; + gpos.y = pos_p->y + (dsc->font->line_height - dsc->font->base_line) - g.box_h - g.ofs_y; + + /*If the letter is completely out of mask don't draw it*/ + if(gpos.x + g.box_w < draw_ctx->clip_area->x1 || + gpos.x > draw_ctx->clip_area->x2 || + gpos.y + g.box_h < draw_ctx->clip_area->y1 || + gpos.y > draw_ctx->clip_area->y2) { + return; + } + + const uint8_t * map_p = lv_font_get_glyph_bitmap(font_p, letter); + if(map_p == NULL) { + LV_LOG_WARN("lv_draw_letter: character's bitmap not found"); + return; + } + + if(font_p->subpx) { +#if LV_DRAW_COMPLEX && LV_USE_FONT_SUBPX + draw_letter_subpx(pos_x, pos_y, &g, clip_area, map_p, color, opa, blend_mode); +#else + LV_LOG_WARN("Can't draw sub-pixel rendered letter because LV_USE_FONT_SUBPX == 0 in lv_conf.h"); +#endif + } + else { + draw_letter_normal(draw_ctx, dsc, &gpos, &g, map_p); + } +} + +#endif diff --git a/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c new file mode 100644 index 000000000..ba4c08425 --- /dev/null +++ b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.c @@ -0,0 +1,742 @@ +/** + * @file lv_gpu_d2_ra6m3.c + * + */ + +/********************* + * INCLUDES + *********************/ +#include "lv_gpu_d2_ra6m3.h" +#include "../../core/lv_refr.h" +#include + +#if LV_USE_GPU_RA6M3_G2D + +#include LV_GPU_RA6M3_G2D_INCLUDE + +/********************* + * DEFINES + *********************/ +#define LOG_ERRORS +#ifdef LOG_ERRORS + #define STRINGIFY(x) #x + #define TOSTRING(x) STRINGIFY(x) + + #define ERROR_LIST_SIZE (4) + #define D2_EXEC(a) lv_port_gpu_log_error(a, __func__, __LINE__) +#else + /* here is error logging not enabled */ + #define D2_EXEC(a) a; +#endif + +/********************** + * TYPEDEFS + **********************/ +typedef struct { + d2_s32 error; + const char * func; + int line; +} log_error_entry; + +/********************** + * STATIC PROTOTYPES + **********************/ +#ifdef LOG_ERRORS + static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line); +#endif +static void invalidate_cache(void); + +void lv_draw_gpu_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, + uint32_t letter); + +/********************** + * STATIC VARIABLES + **********************/ +#ifdef LOG_ERRORS + static log_error_entry log_error_list[ERROR_LIST_SIZE]; + static int error_list_index; + static int error_count; +#endif + +static d2_device * _d2_handle; +static d2_renderbuffer * renderbuffer; + +static d2_s32 src_cf_val, dst_cf_val; +static lv_draw_img_dsc_t img_dsc; +static bool color_key_enabled, alpha_enabled, blend_enabled, colorize_enabled; + +/********************** + * STATIC FUNCTIONS + **********************/ +static d2_s32 lv_port_gpu_cf_lv_to_d2(lv_img_cf_t cf) +{ + d2_s32 d2_cf; + +#if (DLG_LVGL_CF == 1) + switch(cf & ~(1 << 5)) { +#else + switch(cf) { +#endif /* (DLG_LVGL_CF == 1) */ + case LV_IMG_CF_TRUE_COLOR: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_ALPHA_1BIT: + d2_cf = d2_mode_alpha1; + break; + case LV_IMG_CF_ALPHA_2BIT: + d2_cf = d2_mode_alpha2; + break; + case LV_IMG_CF_ALPHA_4BIT: + d2_cf = d2_mode_alpha4; + break; + case LV_IMG_CF_ALPHA_8BIT: + d2_cf = d2_mode_alpha8; + break; + case LV_IMG_CF_INDEXED_1BIT: + d2_cf = d2_mode_i1 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_2BIT: + d2_cf = d2_mode_i2 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_4BIT: + d2_cf = d2_mode_i4 | d2_mode_clut; + break; + case LV_IMG_CF_INDEXED_8BIT: + d2_cf = d2_mode_i8 | d2_mode_clut; + break; +#if (DLG_LVGL_CF == 1) + case LV_IMG_CF_RGB565: + d2_cf = d2_mode_rgb565; + break; + case LV_IMG_CF_RGB888: + d2_cf = d2_mode_rgb888; + break; + case LV_IMG_CF_RGBA8888: + d2_cf = d2_mode_rgba8888; + break; +#endif /* DLG_LVGL_CF */ + default: + return -1; + } + +#if (DLG_LVGL_CF == 1) + return d2_cf | (cf & (1 << 5) ? d2_mode_rle : 0); +#else + return d2_cf; +#endif /* (DLG_LVGL_CF == 1) */ +} + +static bool lv_port_gpu_cf_fb_valid(d2_s32 cf) +{ + if((cf & (d2_mode_rle | d2_mode_clut)) || cf < 0) { + return false; + } + + switch(cf) { + case d2_mode_alpha8: + case d2_mode_rgb565: + case d2_mode_argb8888: + case d2_mode_argb4444: + case d2_mode_rgba8888: + case d2_mode_rgba4444: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_has_alpha(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + case d2_mode_rgba8888: + case d2_mode_argb4444: + case d2_mode_rgba4444: + case d2_mode_argb1555: + case d2_mode_rgba5551: + case d2_mode_ai44: + case d2_mode_i8: + case d2_mode_i4: + case d2_mode_i2: + case d2_mode_i1: + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static bool lv_port_gpu_cf_is_alpha(d2_s32 cf) +{ + switch(cf & ~d2_mode_rle) { + case d2_mode_alpha8: + case d2_mode_alpha4: + case d2_mode_alpha2: + case d2_mode_alpha1: + return true; + default: + return false; + } +} + +static d2_color lv_port_gpu_color_lv_to_d2(lv_color_t color) +{ + uint8_t alpha, red, green, blue; + + alpha = 0xFF; + red = color.ch.red << 3 | color.ch.red >> 2; + green = color.ch.green << 2 | color.ch.green >> 4; + blue = color.ch.blue << 3 | color.ch.blue >> 2; + + return (alpha) << 24UL + | (red) << 16UL + | (green) << 8UL + | (blue) << 0UL; +} + +static void lv_port_gpu_get_recolor_consts(d2_color * cl, d2_color * ch) +{ + d2_color c = lv_port_gpu_color_lv_to_d2(img_dsc.recolor); + d2_alpha r, g, b, opa = img_dsc.recolor_opa > LV_OPA_MAX ? LV_OPA_COVER : img_dsc.recolor_opa; + + r = ((uint32_t)((uint8_t)(c >> 16UL)) * opa) / 255; + g = ((uint32_t)((uint8_t)(c >> 8UL)) * opa) / 255; + b = ((uint32_t)((uint8_t)(c >> 0UL)) * opa) / 255; + *cl = r << 16UL | g << 8UL | b << 0UL; + + r += 255 - opa; + g += 255 - opa; + b += 255 - opa; + *ch = r << 16UL | g << 8UL | b << 0UL; +} + +static int lv_port_gpu_handle_indexed_color(const lv_color_t ** src, const d2_color ** clut, d2_s32 cf) +{ + int clut_len = 0; + + if(cf & d2_mode_clut) { + /* Calculate CLUT length in entries */ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_i1: + clut_len = 2; + break; + case d2_mode_i2: + clut_len = 4; + break; + case d2_mode_i4: + clut_len = 16; + break; + case d2_mode_i8: + clut_len = 256; + break; + case d2_mode_ai44: + clut_len = 16; + break; + default: + return 0; + } + + *clut = (const d2_color *)*src; + *src = (const lv_color_t *)((const uint32_t *)*src + clut_len); + } + return clut_len; +} + +static int lv_port_gpu_cf_bpp(d2_s32 cf) +{ + switch(cf & ~(d2_mode_clut | d2_mode_rle)) { + case d2_mode_argb8888: + return 32; + case d2_mode_rgba8888: + return 32; + case d2_mode_rgb888: + return 32; + case d2_mode_argb4444: + return 16; + case d2_mode_rgba4444: + return 16; + case d2_mode_argb1555: + return 16; + case d2_mode_rgba5551: + return 16; + case d2_mode_rgb565: + return 16; + case d2_mode_ai44: + return 8; + case d2_mode_i8: + return 8; + case d2_mode_i4: + return 4; + case d2_mode_i2: + return 2; + case d2_mode_i1: + return 1; + case d2_mode_alpha8: + return 8; + case d2_mode_alpha4: + return 4; + case d2_mode_alpha2: + return 2; + case d2_mode_alpha1: + return 1; + default: + return 0; + } +} + +static d2_s32 lv_port_gpu_cf_get_default(void) +{ + return d2_mode_rgb565; +} + +static void lv_port_gpu_config_blit_clear(void) +{ + alpha_enabled = false; + color_key_enabled = false; + blend_enabled = true; + colorize_enabled = false; + + lv_draw_img_dsc_init(&img_dsc); + + src_cf_val = lv_port_gpu_cf_get_default(); + dst_cf_val = lv_port_gpu_cf_get_default(); +} + +void lv_port_gpu_init(void) +{ + lv_port_gpu_config_blit_clear(); +} + +static void lv_port_gpu_rotate_point(int * x, int * y, float cos_angle, float sin_angle, int pivot_x, int pivot_y) +{ + float fx, fy; + + *x -= pivot_x; + *y -= pivot_y; + + fx = ((float) * x) / 16.0f; + fy = ((float) * y) / 16.0f; + + *x = (int)(((fx * cos_angle) - (fy * sin_angle)) * 16.0f); + *y = (int)(((fx * sin_angle) + (fy * cos_angle)) * 16.0f); + + *x += pivot_x; + *y += pivot_y; +} + +void lv_draw_ra6m3_g2d_init(void) +{ + if(_d2_handle != NULL) { + return; + } + + _d2_handle = d2_opendevice(0); + + if(_d2_handle == NULL) + return; + + /* set blocksize for default displaylist */ + if(d2_setdlistblocksize(_d2_handle, 25) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_setdlistblocksize\n"); + d2_closedevice(_d2_handle); + + return; + } + + /* bind the hardware */ + if(d2_inithw(_d2_handle, 0) != D2_OK) { + LV_LOG_ERROR("Could NOT d2_inithw\n"); + d2_closedevice(_d2_handle); + + return; + } + + renderbuffer = d2_newrenderbuffer(_d2_handle, 20, 20); + if(!renderbuffer) { + LV_LOG_ERROR("NO renderbuffer\n"); + d2_closedevice(_d2_handle); + + return; + } +} + +static void lv_port_gpu_hw_deinit(void) +{ + if(_d2_handle == NULL) + return; + + D2_EXEC(d2_freerenderbuffer(_d2_handle, renderbuffer)); + D2_EXEC(d2_closedevice(_d2_handle)); + + renderbuffer = NULL; + _d2_handle = NULL; +} + +void lv_port_gpu_flush(void) +{ + lv_port_gpu_hw_deinit(); +} + +static void lv_port_gpu_start_render(void) +{ + D2_EXEC(d2_selectrenderbuffer(_d2_handle, renderbuffer)); +} + +static void lv_port_gpu_complete_render(void) +{ + D2_EXEC(d2_flushframe(_d2_handle)); +} + +void lv_port_gpu_wait(lv_draw_ctx_t * draw_ctx) +{ + lv_port_gpu_complete_render(); + + lv_draw_sw_wait_for_finish(draw_ctx); +} + +static void lv_port_gpu_execute_render(void) +{ + if(_d2_handle) { + D2_EXEC(d2_executerenderbuffer(_d2_handle, renderbuffer, 0)); + } +} + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area) +{ + uint32_t ModeSrc; + + ModeSrc = d2_mode_rgb565; + + lv_coord_t dst_width, dst_hight; + dst_width = lv_area_get_width(fill_area); + dst_hight = lv_area_get_height(fill_area); + + d2_selectrenderbuffer(_d2_handle, renderbuffer); + + // Generate render operations + d2_framebuffer(_d2_handle, (uint16_t *)&fb_background[0], LV_HOR_RES_MAX, LV_HOR_RES_MAX, + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default()); + + d2_cliprect(_d2_handle, 0, 0, LV_HOR_RES_MAX - 1, fill_area->y2); + d2_setblitsrc(_d2_handle, (void *) dst, dst_width, dst_width, dst_hight, ModeSrc); + d2_blitcopy(_d2_handle, dst_width, dst_hight, 0, 0, D2_FIX4(dst_width), D2_FIX4(dst_hight), + D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), 0); + + // Execute render operations + d2_executerenderbuffer(_d2_handle, renderbuffer, 0); +} + +void lv_port_gpu_fill(lv_color_t * dest_buf, const lv_area_t * fill_area, lv_coord_t dst_width, + lv_color_t color, lv_opa_t opa) +{ + invalidate_cache(); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dest_buf), MAX(dst_width, 2), MAX(dst_width, 2), + MAX(fill_area->y2 + 1, 2), lv_port_gpu_cf_get_default())); + + D2_EXEC(d2_cliprect(_d2_handle, 0, 0, dst_width - 1, fill_area->y2)); + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? 0xFF : opa)); + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(color))); + D2_EXEC(d2_renderbox(_d2_handle, D2_FIX4(fill_area->x1), D2_FIX4(fill_area->y1), + D2_FIX4(lv_area_get_width(fill_area)), D2_FIX4(lv_area_get_height(fill_area)))); + + lv_port_gpu_execute_render(); +} + +bool lv_port_gpu_config_blit(const lv_draw_img_dsc_t * draw_dsc, lv_img_cf_t dst_cf, + lv_img_cf_t src_cf, bool alpha_en, bool color_key_en, bool blend_en, bool colorize_en) +{ + d2_s32 d2_src_cf, d2_dst_cf; + + if(blend_en && draw_dsc->blend_mode != LV_BLEND_MODE_NORMAL + && draw_dsc->blend_mode != LV_BLEND_MODE_ADDITIVE) { + return false; + } + + d2_src_cf = lv_port_gpu_cf_lv_to_d2(src_cf); + d2_dst_cf = lv_port_gpu_cf_lv_to_d2(dst_cf); + if(d2_src_cf < 0 || !lv_port_gpu_cf_fb_valid(d2_dst_cf)) { + return false; + } + src_cf_val = d2_src_cf; + dst_cf_val = d2_dst_cf; + + img_dsc = *draw_dsc; + + /* Disable alpha if alpha channel does not exist */ + alpha_enabled = lv_port_gpu_cf_has_alpha(src_cf_val) ? alpha_en : 0; + color_key_enabled = color_key_en; + blend_enabled = blend_en; + colorize_enabled = colorize_en | lv_port_gpu_cf_is_alpha(src_cf_val); + + return true; +} + +static void lv_port_gpu_blit_internal(const lv_area_t * dest_area, const lv_color_t * src_buf, + const lv_area_t * src_area, d2_u32 flags) +{ + const lv_area_t * img_area = src_area; + lv_area_t img_area_scaled; + lv_coord_t w, h, img_w, img_h; + d2_s32 pitch; + int bpp = lv_port_gpu_cf_bpp(src_cf_val); + + D2_EXEC(d2_cliprect(_d2_handle, dest_area->x1, dest_area->y1, dest_area->x2, dest_area->y2)); + + pitch = w = lv_area_get_width(src_area); + h = lv_area_get_height(src_area); + + if(img_dsc.zoom != LV_IMG_ZOOM_NONE) { + img_area_scaled.x1 = src_area->x1 + ((((int32_t)0 - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.x2 = src_area->x1 + ((((int32_t)w - img_dsc.pivot.x) * img_dsc.zoom) >> 8) + img_dsc.pivot.x; + img_area_scaled.y1 = src_area->y1 + ((((int32_t)0 - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area_scaled.y2 = src_area->y1 + ((((int32_t)h - img_dsc.pivot.y) * img_dsc.zoom) >> 8) + img_dsc.pivot.y; + img_area = &img_area_scaled; + } + + img_w = lv_area_get_width(img_area); + img_h = lv_area_get_height(img_area); + + if(0 < bpp && bpp < 8) { + pitch = (w + (8 - bpp)) & (~(8 - bpp)); + } + + if(img_dsc.angle == 0) { + D2_EXEC(d2_setblitsrc(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + + D2_EXEC(d2_blitcopy(_d2_handle, w, h, 0, 0, + D2_FIX4(img_w), D2_FIX4(img_h), D2_FIX4(img_area->x1), D2_FIX4(img_area->y1), flags)); + } + else { + int x, y, x1, y1, x2, y2, x3, y3, x4, y4, dxu, dxv, dyu, dyv, xx, xy, yx, yy; + int pivot_scaled_x, pivot_scaled_y; + int tex_offset = (flags & d2_bf_filter) ? -32767 : 0; + d2_u8 amode, cmode = d2_to_copy; + float angle = ((float)img_dsc.angle / 10) * M_PI / 180; + float cos_angle = cosf(angle); + float sin_angle = sinf(angle); + d2_u8 fillmode_backup; + + /* setup texture params */ + fillmode_backup = d2_getfillmode(_d2_handle); + D2_EXEC(d2_setfillmode(_d2_handle, d2_fm_texture)); + D2_EXEC(d2_settexture(_d2_handle, (void *) src_buf, pitch, w, h, src_cf_val)); + D2_EXEC(d2_settexturemode(_d2_handle, flags & (d2_bf_filter | d2_bf_wrap))); + amode = flags & d2_bf_usealpha ? d2_to_copy : d2_to_one; + cmode = flags & d2_bf_colorize2 ? d2_to_blend : d2_to_copy; + D2_EXEC(d2_settextureoperation(_d2_handle, amode, cmode, cmode, cmode)); + if(flags & d2_bf_colorize2) { + d2_color cl = d2_getcolor(_d2_handle, 0), ch = d2_getcolor(_d2_handle, 1); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_red, (uint8_t)(cl >> 16UL), + (uint8_t)(ch >> 16UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_green, (uint8_t)(cl >> 8UL), + (uint8_t)(ch >> 8UL))); + D2_EXEC(d2_settexopparam(_d2_handle, d2_cc_blue, (uint8_t)(cl >> 0UL), + (uint8_t)(ch >> 0UL))); + } + + x = D2_FIX4(img_area->x1); + y = D2_FIX4(img_area->y1); + + /* define quad points */ + x1 = D2_FIX4(0); + y1 = D2_FIX4(0); + x2 = D2_FIX4(img_w); + y2 = D2_FIX4(0); + x3 = D2_FIX4(img_w); + y3 = D2_FIX4(img_h); + x4 = D2_FIX4(0); + y4 = D2_FIX4(img_h); + + /* rotate points for quad */ + pivot_scaled_x = (img_dsc.pivot.x * img_dsc.zoom) >> 4; + pivot_scaled_y = (img_dsc.pivot.y * img_dsc.zoom) >> 4; + + lv_port_gpu_rotate_point(&x1, &y1, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x2, &y2, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x3, &y3, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + lv_port_gpu_rotate_point(&x4, &y4, cos_angle, sin_angle, pivot_scaled_x, pivot_scaled_y); + + /* compute texture increments */ + xx = (int)(cos_angle * 65536.0f); + xy = (int)(sin_angle * 65536.0f); + yx = (int)(-sin_angle * 65536.0f); + yy = (int)(cos_angle * 65536.0f); + dxu = ((D2_FIX16(w) / D2_FIX4(img_w)) * xx) >> 12; + dxv = ((D2_FIX16(w) / D2_FIX4(img_w)) * xy) >> 12; + dyu = ((D2_FIX16(h) / D2_FIX4(img_h)) * yx) >> 12; + dyv = ((D2_FIX16(h) / D2_FIX4(img_h)) * yy) >> 12; + + /* map texture exactly to rotated quad, so texel center is always (0/0) top-left */ + D2_EXEC(d2_settexelcenter(_d2_handle, 0, 0)); + D2_EXEC(d2_settexturemapping(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + tex_offset, tex_offset, dxu, dxv, dyu, dyv)); + + int minx = MAX(dest_area->x1, D2_INT4(x + MIN(x1, MIN(x2, MIN(x3, x4))))); + int maxx = MIN(dest_area->x2, D2_INT4(x + MAX(x1, MAX(x2, MAX(x3, x4))))); + int slice = (flags & d2_bf_filter) ? 6 : 8; + + /* Perform render operation in slices to acheive better performance */ + for(int posx = minx; posx < maxx; posx += slice) { + D2_EXEC(d2_cliprect(_d2_handle, posx, dest_area->y1, MIN(posx + slice - 1, maxx), dest_area->y2)); + D2_EXEC(d2_renderquad(_d2_handle, (d2_point)(x + x1), (d2_point)(y + y1), + (d2_point)(x + x2), (d2_point)(y + y2), + (d2_point)(x + x3), (d2_point)(y + y3), + (d2_point)(x + x4), (d2_point)(y + y4), 0)); + } + D2_EXEC(d2_setfillmode(_d2_handle, fillmode_backup)); + } +} + +void lv_port_ra_gpu_blit(lv_color_t * dst, const lv_area_t * dst_area, lv_coord_t dest_stride, + const lv_color_t * src, const lv_area_t * src_area, lv_opa_t opa) +{ + d2_u32 flags = 0; + const d2_color * clut = NULL; + int clut_len = 0; + + invalidate_cache(); + + clut_len = lv_port_gpu_handle_indexed_color(&src, &clut, src_cf_val); + + lv_port_gpu_start_render(); + + D2_EXEC(d2_framebuffer(_d2_handle, d1_maptovidmem(_d2_handle, dst), MAX(dest_stride, 2), + MAX(dst_area->x2 + 1, 2), MAX(dst_area->y2 + 1, 2), dst_cf_val)); + + flags |= alpha_enabled ? d2_bf_usealpha : 0; + + D2_EXEC(d2_setalpha(_d2_handle, opa > LV_OPA_MAX ? LV_OPA_COVER : opa)); + + if(clut) { + D2_EXEC(d2_writetexclut_direct(_d2_handle, clut, 0, clut_len)); + } + + flags |= color_key_enabled ? d2_bf_usealpha : 0; + flags |= (colorize_enabled || img_dsc.recolor_opa != LV_OPA_TRANSP) ? d2_bf_colorize2 : 0; + if(colorize_enabled) { + D2_EXEC(d2_setcolor(_d2_handle, 0, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + D2_EXEC(d2_setcolor(_d2_handle, 1, lv_port_gpu_color_lv_to_d2(img_dsc.recolor))); + } + else if(img_dsc.recolor_opa != LV_OPA_TRANSP) { + d2_color cl = 0, ch = 0; + lv_port_gpu_get_recolor_consts(&cl, &ch); + D2_EXEC(d2_setcolor(_d2_handle, 0, cl)); + D2_EXEC(d2_setcolor(_d2_handle, 1, ch)); + } + + flags |= ((img_dsc.angle || img_dsc.zoom != LV_IMG_ZOOM_NONE) && img_dsc.antialias) ? d2_bf_filter : 0; + + if(blend_enabled) { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_alpha, + img_dsc.blend_mode != LV_BLEND_MODE_NORMAL ? d2_bm_one : d2_bm_one_minus_alpha)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_one_minus_alpha)); + } + else { + D2_EXEC(d2_setblendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + D2_EXEC(d2_setalphablendmode(_d2_handle, d2_bm_one, d2_bm_zero)); + } + + lv_port_gpu_blit_internal(dst_area, src, src_area, flags); + + lv_port_gpu_execute_render(); +} + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc) +{ + lv_area_t blend_area; + if(!_lv_area_intersect(&blend_area, dsc->blend_area, draw_ctx->clip_area)) return; + + bool done = false; + + if(dsc->mask_buf == NULL && dsc->blend_mode == LV_BLEND_MODE_NORMAL && lv_area_get_size(&blend_area) > 100) { + lv_coord_t dest_stride = lv_area_get_width(draw_ctx->buf_area); + + lv_color_t * dest_buf = draw_ctx->buf; + + const lv_color_t * src_buf = dsc->src_buf; + if(src_buf) { + lv_draw_sw_blend_basic(draw_ctx, dsc); + + lv_area_t src_area; + src_area.x1 = blend_area.x1 - (dsc->blend_area->x1 - draw_ctx->buf_area->x1); + src_area.y1 = blend_area.y1 - (dsc->blend_area->y1 - draw_ctx->buf_area->y1); + src_area.x2 = src_area.x1 + lv_area_get_width(dsc->blend_area) - 1; + src_area.y2 = src_area.y1 + lv_area_get_height(dsc->blend_area) - 1; + + lv_port_ra_gpu_blit(dest_buf, &blend_area, dest_stride, src_buf, &src_area, dsc->opa); + done = true; + } + else if(dsc->opa >= LV_OPA_MAX) { + lv_area_move(&blend_area, -draw_ctx->buf_area->x1, -draw_ctx->buf_area->y1); + lv_port_gpu_fill(dest_buf, &blend_area, dest_stride, dsc->color, dsc->opa); + done = true; + } + } + + if(!done) lv_draw_sw_blend_basic(draw_ctx, dsc); +} + +static void lv_port_gpu_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * dsc, + const lv_area_t * coords, const uint8_t * map_p, lv_img_cf_t color_format) +{ + /*TODO basic ARGB8888 image can be handles here*/ + + lv_draw_sw_img_decoded(draw_ctx, dsc, coords, map_p, color_format); +} + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx) +{ + lv_draw_sw_init_ctx(drv, draw_ctx); + + lv_draw_ra6m3_dma2d_ctx_t * ra_2d_draw_ctx = (lv_draw_sw_ctx_t *)draw_ctx; + + ra_2d_draw_ctx->blend = lv_draw_ra6m3_2d_blend; + ra_2d_draw_ctx->base_draw.draw_img_decoded = lv_port_gpu_img_decoded; + ra_2d_draw_ctx->base_draw.wait_for_finish = lv_port_gpu_wait; + ra_2d_draw_ctx->base_draw.draw_letter = lv_draw_gpu_letter; + //ra_2d_draw_ctx->base_draw.buffer_copy = lv_draw_ra6m3_2d_buffer_copy; +} + +void lv_draw_stm32_dma2d_ctx_deinit(lv_disp_t * disp, lv_draw_ctx_t * draw_ctx) +{ + LV_UNUSED(disp); + LV_UNUSED(draw_ctx); +} + +static void invalidate_cache(void) +{ + lv_disp_t * disp = _lv_refr_get_disp_refreshing(); + if(disp->driver->clean_dcache_cb) disp->driver->clean_dcache_cb(disp->driver); +} + +#ifdef LOG_ERRORS +static void lv_port_gpu_log_error(d2_s32 status, const char * func, int line) +{ + if(status) { + log_error_list[error_list_index].error = status; + log_error_list[error_list_index].func = func; + log_error_list[error_list_index].line = line; + LV_LOG_ERROR("%s\r\n", d2_geterrorstring(_d2_handle)); + LV_LOG_ERROR("%d:\t%d - %s : %d\r\n", error_count, + log_error_list[error_list_index].error, + log_error_list[error_list_index].func, + log_error_list[error_list_index].line); + + error_count++; + error_list_index++; + if(error_list_index >= ERROR_LIST_SIZE) { + error_list_index = 0; + } + } +} +#endif +#endif /* LV_USE_GPU_RA6M3_G2D */ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h new file mode 100644 index 000000000..5d37ce45e --- /dev/null +++ b/lib/libesp32_lvgl/lvgl/src/draw/renesas/lv_gpu_d2_ra6m3.h @@ -0,0 +1,56 @@ +/** + * @file lv_gpu_d2_ra6m3.h + * + */ +#ifndef LV_GPU_D2_RA6M3_H +#define LV_GPU_D2_RA6M3_H + +#ifdef __cplusplus +extern "C" { +#endif + +/********************* + * INCLUDES + *********************/ +#include "../../misc/lv_color.h" + +#if LV_USE_GPU_RA6M3_G2D +#include "../../core/lv_disp.h" +#include "../sw/lv_draw_sw.h" + +/********************** + * DEFINE + **********************/ +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define M_PI 3.1415926 + +/********************** + * TYPEDEFS + **********************/ +typedef lv_draw_sw_ctx_t lv_draw_ra6m3_dma2d_ctx_t; + +/********************** + * GLOBAL PROTOTYPES + **********************/ +void lv_draw_ra6m3_g2d_init(void); + +void lv_port_gpu_init(void); + +void lv_port_gpu_flush(void); + +void lv_port_gpu_blit(int32_t x, int32_t y, lv_color_t * dst, const lv_area_t * fill_area); + +void lv_draw_ra6m3_2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); + +void lv_draw_ra6m3_2d_ctx_init(lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); + +void lv_draw_ra6m3_2d_ctx_deinit(lv_disp_drv_t * disp, lv_draw_ctx_t * draw_ctx); + +#endif /*LV_USE_GPU_GD32_IPA*/ + +#ifdef __cplusplus +} /*extern "C"*/ +#endif + +#endif diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_arc.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_arc.c index 5786eaeb9..f43fef641 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_arc.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_arc.c @@ -104,7 +104,9 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds } lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_cached = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_cached); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area, mask_ids, mask_ids_count, cap_ids[0] != LV_MASK_ID_INV ? cap_ids : NULL); @@ -135,6 +137,11 @@ void lv_draw_sdl_draw_arc(lv_draw_ctx_t * draw_ctx, const lv_draw_arc_dsc_t * ds SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, dsc->opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + + if(!texture_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.c index 4d0603d70..e155570d8 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.c @@ -86,7 +86,8 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor LV_ASSERT(internals->mask == NULL && internals->composition == NULL && internals->target_backup == NULL); lv_coord_t w = lv_area_get_width(apply_area), h = lv_area_get_height(apply_area); - internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h); + internals->composition = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TARGET0, w, h, + &internals->composition_cached); /* Don't need to worry about integral overflow */ lv_coord_t ofs_x = (lv_coord_t) - apply_area->x1, ofs_y = (lv_coord_t) - apply_area->y1; /* Offset draw area to start with (0,0) of coords */ @@ -174,19 +175,23 @@ void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_ break; } SDL_RenderCopy(ctx->renderer, internals->composition, &src_rect, &dst_rect); + if(!internals->composition_cached) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(internals->composition); + } } internals->mask = internals->composition = internals->target_backup = NULL; } SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h) + lv_coord_t w, lv_coord_t h, bool * texture_in_cache) { lv_point_t * tex_size = NULL; composite_key_t mask_key = mask_key_create(id); SDL_Texture * result = lv_draw_sdl_texture_cache_get_with_userdata(ctx, &mask_key, sizeof(composite_key_t), NULL, (void **) &tex_size); - if(!result || tex_size->x < w || tex_size->y < h) { + if(result == NULL || tex_size->x < w || tex_size->y < h) { lv_coord_t size = next_pow_of_2(LV_MAX(w, h)); int access = SDL_TEXTUREACCESS_STREAMING; if(id >= LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0) { @@ -198,8 +203,19 @@ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_d result = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, access, size, size); tex_size = lv_mem_alloc(sizeof(lv_point_t)); tex_size->x = tex_size->y = size; - lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, tex_size, lv_mem_free, 0); + bool in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, &mask_key, sizeof(composite_key_t), result, + tex_size, lv_mem_free, 0); + if(!in_cache) { + lv_mem_free(tex_size); + } + if(texture_in_cache != NULL) { + *texture_in_cache = in_cache; + } } + else if(texture_in_cache != NULL) { + *texture_in_cache = true; + } + return result; } diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.h index 72a2daef7..57191bbce 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_composite.h @@ -45,6 +45,7 @@ typedef enum lv_draw_sdl_composite_texture_id_t { /** * Begin drawing with mask. Render target will be switched to a temporary texture, * and drawing coordinates may get clipped or translated + * @param ctx Drawing context * @param coords_in Original coordinates * @param clip_in Original clip area * @param extension Useful for shadows or outlines, can be NULL @@ -59,8 +60,18 @@ bool lv_draw_sdl_composite_begin(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coor void lv_draw_sdl_composite_end(lv_draw_sdl_ctx_t * ctx, const lv_area_t * apply_area, lv_blend_mode_t blend_mode); +/** + * + * @param ctx Drawing context + * @param id Texture ID + * @param w Maximum width needed + * @param h Maximum height needed + * @param texture_in_cache output to query if the texture is in cache. If it's not in cache, you'll need to destroy it + * by yourself + * @return Obtained texture + */ SDL_Texture * lv_draw_sdl_composite_texture_obtain(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_composite_texture_id_t id, - lv_coord_t w, lv_coord_t h); + lv_coord_t w, lv_coord_t h, bool * texture_in_cache); /********************** * MACROS diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.c index 3c955d840..4dddc8c60 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.c @@ -72,7 +72,8 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con lv_coord_t radius); static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius); + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache); static lv_draw_img_rounded_key_t rounded_key_create(const SDL_Texture * texture, lv_coord_t w, lv_coord_t h, lv_coord_t radius); @@ -106,11 +107,16 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_img_header_t * header = NULL; SDL_Texture * texture = lv_draw_sdl_texture_cache_get_with_userdata(ctx, key, key_size, &texture_found, (void **) &header); + bool texture_in_cache = false; if(!texture_found) { - lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header); + lv_draw_sdl_img_load_texture(ctx, key, key_size, src, draw_dsc->frame_id, &texture, &header, + &texture_in_cache); + } + else { + texture_in_cache = true; } SDL_free(key); - if(!texture) { + if(!texture || !header) { return LV_RES_INV; } @@ -148,6 +154,14 @@ lv_res_t lv_draw_sdl_img_core(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t lv_draw_sdl_composite_end(ctx, &apply_area, draw_dsc->blend_mode); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + if(!header->managed) { + SDL_DestroyTexture(texture); + } + lv_mem_free(header); + } + return LV_RES_OK; } @@ -185,7 +199,7 @@ static void calc_draw_part(SDL_Texture * texture, const lv_draw_sdl_img_header_t bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header) + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache) { _lv_img_cache_entry_t * cdsc = _lv_img_cache_open(src, lv_color_white(), frame_id); lv_draw_sdl_cache_flag_t tex_flags = 0; @@ -210,16 +224,18 @@ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key #endif } if(texture && cdsc) { - *header = SDL_malloc(sizeof(lv_draw_sdl_img_header_t)); + *header = lv_mem_alloc(sizeof(lv_draw_sdl_img_header_t)); SDL_memcpy(&(*header)->base, &cdsc->dec_dsc.header, sizeof(lv_img_header_t)); (*header)->rect = rect; - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, tex_flags); + (*header)->managed = (tex_flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) != 0; + *texture_in_cache = lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_size, *texture, *header, SDL_free, + tex_flags); + return true; } else { - lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); + *texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, key, key_size, NULL); return false; } - return true; } /********************** @@ -320,7 +336,8 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con { const int w = lv_area_get_width(coords), h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(radius, w, h); - SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius); + bool frag_in_cache = false; + SDL_Texture * frag = img_rounded_frag_obtain(ctx, texture, header, w, h, real_radius, &frag_in_cache); apply_recolor_opa(frag, draw_dsc); lv_draw_sdl_rect_bg_frag_draw_corners(ctx, frag, real_radius, coords, clip, true); @@ -360,6 +377,11 @@ static void draw_img_rounded(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, con SDL_RenderCopy(ctx->renderer, texture, &src_rect, &dst_rect); } SDL_RenderSetClipRect(ctx->renderer, NULL); + + if(!frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(frag); + } } static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * draw_dsc) @@ -377,15 +399,18 @@ static void apply_recolor_opa(SDL_Texture * texture, const lv_draw_img_dsc_t * d } static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Texture * texture, - const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius) + const lv_draw_sdl_img_header_t * header, int w, int h, lv_coord_t radius, + bool * in_cache) { lv_draw_img_rounded_key_t key = rounded_key_create(texture, w, h, radius); - SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius); + bool mask_frag_in_cache = false; + SDL_Texture * mask_frag = lv_draw_sdl_rect_bg_frag_obtain(ctx, radius, &mask_frag_in_cache); SDL_Texture * img_frag = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); if(img_frag == NULL) { const lv_coord_t full_frag_size = radius * 2 + 3; img_frag = SDL_CreateTexture(ctx->renderer, LV_DRAW_SDL_TEXTURE_FORMAT, SDL_TEXTUREACCESS_TARGET, full_frag_size, full_frag_size); + SDL_assert(img_frag); SDL_SetTextureBlendMode(img_frag, SDL_BLENDMODE_BLEND); SDL_Texture * old_target = SDL_GetRenderTarget(ctx->renderer); SDL_SetRenderTarget(ctx->renderer, img_frag); @@ -395,7 +420,7 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur SDL_RenderFillRect(ctx->renderer, NULL); SDL_SetRenderDrawBlendMode(ctx->renderer, SDL_BLENDMODE_BLEND); - lv_area_t coords = {0, 0, w - 1, h - 1}, clip; + lv_area_t coords = {0, 0, w - 1, h - 1}; lv_area_t frag_coords = {0, 0, full_frag_size - 1, full_frag_size - 1}; lv_draw_sdl_rect_bg_frag_draw_corners(ctx, mask_frag, radius, &frag_coords, NULL, false); @@ -446,7 +471,14 @@ static SDL_Texture * img_rounded_frag_obtain(lv_draw_sdl_ctx_t * ctx, SDL_Textur SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetRenderTarget(ctx->renderer, old_target); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), img_frag); + } + else { + *in_cache = true; + } + if(!mask_frag_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(mask_frag); } return img_frag; } diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.h index 0e2702772..6233913d8 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_img.h @@ -35,6 +35,7 @@ extern "C" { typedef struct lv_draw_sdl_img_header_t { lv_img_header_t base; SDL_Rect rect; + bool managed; } lv_draw_sdl_img_header_t; /********************** @@ -56,9 +57,22 @@ typedef struct lv_draw_sdl_img_header_t { /*===================== * Other functions *====================*/ +/** + * + * @param ctx Drawing context + * @param key Texture cache key + * @param key_size Size of texture cache key + * @param src Image source pointer + * @param frame_id Frame ID for animated image + * @param texture Texture for render + * @param header Header also holds sdl image info + * @param texture_in_cache Whether the texture has been put in the cache. Please note for managed texture, + * this will be false too. So you'll need to check header.managed too. + * @return Whether the image has been loaded successfully + */ bool lv_draw_sdl_img_load_texture(lv_draw_sdl_ctx_t * ctx, lv_draw_sdl_cache_key_head_img_t * key, size_t key_size, const void * src, int32_t frame_id, SDL_Texture ** texture, - lv_draw_sdl_img_header_t ** header); + lv_draw_sdl_img_header_t ** header, bool * texture_in_cache); /********************** * MACROS **********************/ diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_label.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_label.c index b8c79ae4a..d043c510b 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_label.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_label.c @@ -54,7 +54,7 @@ static lv_font_glyph_key_t font_key_glyph_create(const lv_font_t * font_p, uint3 * GLOBAL FUNCTIONS **********************/ -void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, +void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t * dsc, const lv_point_t * pos_p, uint32_t letter) { const lv_area_t * clip_area = draw_ctx->clip_area; @@ -117,6 +117,7 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t lv_font_glyph_key_t glyph_key = font_key_glyph_create(font_p, letter); bool glyph_found = false; SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &glyph_key, sizeof(glyph_key), &glyph_found); + bool in_cache = false; if(!glyph_found) { if(g.resolved_font) { font_p = g.resolved_font; @@ -128,7 +129,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t texture = SDL_CreateTextureFromSurface(renderer, mask); SDL_FreeSurface(mask); lv_mem_free(buf); - lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + in_cache = lv_draw_sdl_texture_cache_put(ctx, &glyph_key, sizeof(glyph_key), texture); + } + else { + in_cache = true; } if(!texture) { return; @@ -142,6 +146,10 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t /*If the letter is completely out of mask don't draw it*/ if(!_lv_area_intersect(&draw_area, &t_letter, &t_clip)) { + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } return; } SDL_Rect srcrect, dstrect; @@ -156,6 +164,11 @@ void lv_draw_sdl_draw_letter(lv_draw_ctx_t * draw_ctx, const lv_draw_label_dsc_t SDL_RenderCopy(renderer, texture, &srcrect, &dstrect); lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); + + if(!in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.c index ae5c327ac..d517636d9 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.c @@ -58,7 +58,8 @@ lv_draw_layer_ctx_t * lv_draw_sdl_layer_init(lv_draw_ctx_t * draw_ctx, lv_draw_l enum lv_draw_sdl_composite_texture_id_t texture_id = LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_TRANSFORM0 + ctx->internals->transform_count; - transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h); + transform_ctx->target = lv_draw_sdl_composite_texture_obtain(ctx, texture_id, target_w, target_h, + &transform_ctx->target_in_cache); transform_ctx->target_rect.x = 0; transform_ctx->target_rect.y = 0; transform_ctx->target_rect.w = target_w; @@ -117,6 +118,11 @@ void lv_draw_sdl_layer_blend(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * lay void lv_draw_sdl_layer_destroy(lv_draw_ctx_t * draw_ctx, lv_draw_layer_ctx_t * layer_ctx) { lv_draw_sdl_ctx_t * ctx = (lv_draw_sdl_ctx_t *) draw_ctx; + lv_draw_sdl_layer_ctx_t * transform_ctx = (lv_draw_sdl_layer_ctx_t *) layer_ctx; + if(!transform_ctx->target_in_cache && transform_ctx->target != NULL) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(transform_ctx->target); + } ctx->internals->transform_count -= 1; } diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.h index b60303c47..f6aa66867 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_layer.h @@ -28,6 +28,7 @@ typedef struct _lv_draw_sdl_layer_ctx_t { SDL_Texture * orig_target; SDL_Texture * target; SDL_Rect target_rect; + bool target_in_cache; lv_draw_layer_flags_t flags; } lv_draw_sdl_layer_ctx_t; /********************** diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_line.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_line.c index 3a15d6d33..204e1a3d8 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_line.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_line.c @@ -53,7 +53,7 @@ static SDL_Texture * line_texture_create(lv_draw_sdl_ctx_t * sdl_ctx, const lv_d * GLOBAL FUNCTIONS **********************/ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * dsc, const lv_point_t * point1, - const lv_point_t * point2) + const lv_point_t * point2, bool * in_cache) { lv_draw_sdl_ctx_t * sdl_ctx = (lv_draw_sdl_ctx_t *) draw_ctx; SDL_Renderer * renderer = sdl_ctx->renderer; @@ -68,7 +68,7 @@ void lv_draw_sdl_draw_line(lv_draw_ctx_t * draw_ctx, const lv_draw_line_dsc_t * SDL_Texture * texture = lv_draw_sdl_texture_cache_get(sdl_ctx, &key, sizeof(key), NULL); if(!texture) { texture = line_texture_create(sdl_ctx, dsc, (lv_coord_t) length); - lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(sdl_ctx, &key, sizeof(key), texture); } lv_area_t coords = {x1, y1, x2, y2}; diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c index c5df50cb9..68305c7c8 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_polygon.c @@ -77,7 +77,9 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr int16_t mask_id = lv_draw_mask_add(&polygon_param, NULL); lv_coord_t w = lv_area_get_width(&draw_area), h = lv_area_get_height(&draw_area); - SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_composite_texture_obtain(ctx, LV_DRAW_SDL_COMPOSITE_TEXTURE_ID_STREAM1, w, h, + &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); dump_masks(texture, &draw_area); @@ -91,6 +93,10 @@ void lv_draw_sdl_polygon(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * dr SDL_SetTextureColorMod(texture, color.r, color.g, color.b); SDL_SetTextureAlphaMod(texture, draw_dsc->bg_opa); SDL_RenderCopy(ctx->renderer, texture, &srcrect, &dstrect); + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } /********************** diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_priv.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_priv.h index 24a876218..ffc191b0a 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_priv.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_priv.h @@ -35,6 +35,7 @@ typedef struct lv_draw_sdl_context_internals_t { lv_lru_t * texture_cache; SDL_Texture * mask; SDL_Texture * composition; + bool composition_cached; SDL_Texture * target_backup; uint8_t transform_count; } lv_draw_sdl_context_internals_t; diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.c index 6418a0af6..149dcbf67 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.c @@ -175,7 +175,7 @@ void lv_draw_sdl_draw_rect(lv_draw_ctx_t * draw_ctx, const lv_draw_rect_dsc_t * lv_draw_sdl_composite_end(ctx, &apply_area, dsc->blend_mode); } -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius) +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache) { lv_draw_rect_bg_key_t key = rect_bg_key_create(radius, radius); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); @@ -188,13 +188,16 @@ SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_ texture = lv_draw_sdl_mask_dump_texture(ctx->renderer, &coords_frag, &mask_id, 1); SDL_assert(texture != NULL); lv_draw_mask_remove_id(mask_id); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; } return texture; } SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, - lv_coord_t h, lv_coord_t radius) + lv_coord_t h, lv_coord_t radius, bool * in_cache) { lv_draw_rect_grad_frag_key_t key = rect_grad_frag_key_create(grad, w, h, radius); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); @@ -240,12 +243,15 @@ SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const l draw_bg_grad_simple(ctx, &blend_coords, &draw_area, grad, true); SDL_SetRenderTarget(ctx->renderer, target_backup); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; } return texture; } -SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad) +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache) { lv_draw_rect_grad_strip_key_t key = rect_grad_strip_key_create(grad); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); @@ -265,7 +271,10 @@ SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const texture = SDL_CreateTextureFromSurface(ctx->renderer, surface); SDL_assert(texture != NULL); SDL_FreeSurface(surface); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + *in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + *in_cache = true; } return texture; } @@ -388,7 +397,8 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con /*A small texture with a quarter of the rect is enough*/ lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); - SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius); + bool texture_in_cache = false; + SDL_Texture * texture = lv_draw_sdl_rect_bg_frag_obtain(ctx, real_radius, &texture_in_cache); SDL_SetTextureBlendMode(texture, SDL_BLENDMODE_BLEND); SDL_SetTextureAlphaMod(texture, dsc->bg_opa); @@ -396,6 +406,11 @@ static void draw_bg_color(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, con lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, real_radius, coords, draw_area, false); frag_render_borders(ctx->renderer, texture, real_radius, coords, draw_area, false); frag_render_center(ctx->renderer, texture, real_radius, coords, draw_area, false); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, @@ -427,7 +442,8 @@ static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coord } } - SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_strip_obtain(ctx, grad); + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_strip_obtain(ctx, grad, &grad_texture_in_cache); if(blend_mod) { SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_MOD); } @@ -436,6 +452,11 @@ static void draw_bg_grad_simple(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coord } SDL_RenderCopy(ctx->renderer, grad_texture, &srcrect, &dstrect); + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } } static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, @@ -445,7 +466,9 @@ static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coord /*A small texture with a quarter of the rect is enough*/ lv_coord_t bg_w = lv_area_get_width(coords), bg_h = lv_area_get_height(coords); lv_coord_t real_radius = LV_MIN3(bg_w / 2, bg_h / 2, radius); - SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_frag_obtain(ctx, &dsc->bg_grad, bg_w, bg_h, radius); + bool grad_texture_in_cache = false; + SDL_Texture * grad_texture = lv_draw_sdl_rect_grad_frag_obtain(ctx, &dsc->bg_grad, bg_w, bg_h, radius, + &grad_texture_in_cache); SDL_SetTextureBlendMode(grad_texture, SDL_BLENDMODE_BLEND); lv_draw_sdl_rect_bg_frag_draw_corners(ctx, grad_texture, real_radius, coords, draw_area, true); @@ -497,6 +520,11 @@ static void draw_bg_grad_radius(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coord _lv_area_intersect(&part_area, &part_coords, draw_area); draw_bg_grad_simple(ctx, coords, &part_area, &dsc->bg_grad, false); } + + if(!grad_texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(grad_texture); + } } static void draw_bg_img(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_area_t * draw_area, @@ -632,6 +660,7 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_rect_shadow_key_t key = rect_shadow_key_create(radius, frag_size, sw); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache = false; if(texture == NULL) { lv_area_t mask_area = {blur_growth, blur_growth}, mask_area_blurred = {0, 0}; lv_area_set_width(&mask_area, frag_size * 2); @@ -650,7 +679,10 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_mem_buf_release(mask_buf); lv_draw_mask_remove_id(mask_id); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Color shadow_color; @@ -662,6 +694,11 @@ static void draw_shadow(lv_draw_sdl_ctx_t * ctx, const lv_area_t * coords, const lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, blur_frag_size, &shadow_area, clip, false); frag_render_borders(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); frag_render_center(ctx->renderer, texture, blur_frag_size, &shadow_area, clip, false); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } @@ -743,6 +780,7 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_coord_t max_side = LV_MAX4(key.offsets.x1, key.offsets.y1, -key.offsets.x2, -key.offsets.y2); lv_coord_t frag_size = LV_MAX(radius, max_side); SDL_Texture * texture = lv_draw_sdl_texture_cache_get(ctx, &key, sizeof(key), NULL); + bool texture_in_cache; if(texture == NULL) { /* Create a mask texture with size of (frag_size * 2 + FRAG_SPACING) */ const lv_area_t frag_area = {0, 0, frag_size * 2 + FRAG_SPACING - 1, frag_size * 2 + FRAG_SPACING - 1}; @@ -769,7 +807,10 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_mask_remove_id(mask_ids[1]); lv_draw_mask_remove_id(mask_ids[0]); SDL_assert(texture); - lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + texture_in_cache = lv_draw_sdl_texture_cache_put(ctx, &key, sizeof(key), texture); + } + else { + texture_in_cache = true; } SDL_Rect outer_rect; @@ -783,6 +824,11 @@ static void draw_border_generic(lv_draw_sdl_ctx_t * ctx, const lv_area_t * outer lv_draw_sdl_rect_bg_frag_draw_corners(ctx, texture, frag_size, outer_area, clip, true); frag_render_borders(renderer, texture, frag_size, outer_area, clip, true); + + if(!texture_in_cache) { + LV_LOG_WARN("Texture is not cached, this will impact performance."); + SDL_DestroyTexture(texture); + } } static void frag_render_borders(SDL_Renderer * renderer, SDL_Texture * frag, lv_coord_t frag_size, diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.h index 3472af31b..c3262d5f1 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_rect.h @@ -57,12 +57,36 @@ typedef struct lv_draw_sdl_rect_header_t { * Other functions *====================*/ -SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius); +/** + * + * @param ctx Drawing context + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Background fragment texture + */ +SDL_Texture * lv_draw_sdl_rect_bg_frag_obtain(lv_draw_sdl_ctx_t * ctx, lv_coord_t radius, bool * in_cache); +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param w Width of the rectangle + * @param h Height of the rectangle + * @param radius Corner radius of the rectangle + * @param in_cache Whether the texture has been put in the cache + * @return Gradient fragment texture + */ SDL_Texture * lv_draw_sdl_rect_grad_frag_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, lv_coord_t w, - lv_coord_t h, lv_coord_t radius); + lv_coord_t h, lv_coord_t radius, bool * in_cache); -SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad); +/** + * + * @param ctx Drawing context + * @param grad Gradient info + * @param in_cache Whether the texture has been put in the cache + * @return Gradient strip texture + */ +SDL_Texture * lv_draw_sdl_rect_grad_strip_obtain(lv_draw_sdl_ctx_t * ctx, const lv_grad_dsc_t * grad, bool * in_cache); void lv_draw_sdl_rect_bg_frag_draw_corners(lv_draw_sdl_ctx_t * ctx, SDL_Texture * frag, lv_coord_t frag_size, const lv_area_t * coords, const lv_area_t * clip, bool full); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c index 6845addf5..406741783 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.c @@ -81,12 +81,12 @@ SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ct return value->texture; } -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture) { - lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); + return lv_draw_sdl_texture_cache_put_advanced(ctx, key, key_length, texture, NULL, NULL, 0); } -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags) { @@ -97,22 +97,20 @@ void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void value->userdata_free = userdata_free; value->flags = flags; if(!texture) { - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } if(flags & LV_DRAW_SDL_CACHE_FLAG_MANAGED) { /* Managed texture doesn't count into cache size */ LV_LOG_INFO("cache texture %p", texture); - lv_lru_set(lru, key, key_length, value, 1); - return; + return lv_lru_set(lru, key, key_length, value, 1) == LV_LRU_OK; } Uint32 format; int access, width, height; if(SDL_QueryTexture(texture, &format, &access, &width, &height) != 0) { - return; + return false; } LV_LOG_INFO("cache texture %p, %d*%d@%dbpp", texture, width, height, SDL_BITSPERPIXEL(format)); - lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8); + return lv_lru_set(lru, key, key_length, value, width * height * SDL_BITSPERPIXEL(format) / 8) == LV_LRU_OK; } lv_draw_sdl_cache_key_head_img_t * lv_draw_sdl_texture_img_key_create(const void * src, int32_t frame_id, size_t * size) diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h index 1bbf17cd8..3a799f58b 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/sdl/lv_draw_sdl_texture_cache.h @@ -82,9 +82,15 @@ SDL_Texture * lv_draw_sdl_texture_cache_get(lv_draw_sdl_ctx_t * ctx, const void SDL_Texture * lv_draw_sdl_texture_cache_get_with_userdata(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, bool * found, void ** userdata); -void lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture); -void lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, +/** + * @return Whether the texture has been put in the cache + */ +bool lv_draw_sdl_texture_cache_put_advanced(lv_draw_sdl_ctx_t * ctx, const void * key, size_t key_length, SDL_Texture * texture, void * userdata, void userdata_free(void *), lv_draw_sdl_cache_flag_t flags); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c b/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c index 908909df8..715cdd2c0 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.c @@ -34,6 +34,41 @@ #error "Cannot use DMA2D with LV_COLOR_DEPTH other than 16 or 32" #endif +/********************** + * STATIC PROTOTYPES + **********************/ +static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); +static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, + void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, + void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); +static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format); +static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format); +static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2); + +LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); +LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, + dma2d_color_format_t src_color_format, bool ignore_src_alpha); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride, + const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, + lv_color_t color, lv_opa_t opa); +LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, + const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, + lv_coord_t width, lv_coord_t height, uint8_t pixel_size); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, + lv_coord_t height, uint8_t pixel_size); +LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void); +LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void); +LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void); + static bool isDma2dInProgess = false; // indicates whether DMA2D transfer *initiated here* is in progress /** @@ -276,9 +311,8 @@ static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t co } } -static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, - const lv_area_t * src_area, - const void * src) +LV_STM32_DMA2D_STATIC lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, + const lv_area_t * src_area, const void * src) { //if(lv_img_src_get_type(src) != LV_IMG_SRC_VARIABLE) return LV_RES_INV; return LV_RES_INV; @@ -315,7 +349,7 @@ static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_ return LV_RES_OK; } -static void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) +LV_STM32_DMA2D_STATIC void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx) { lv_disp_t * disp = _lv_refr_get_disp_refreshing(); _lv_gpu_stm32_dma2d_await_dma_transfer_finish(disp->driver); diff --git a/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h b/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h index 5ecce6deb..0a970426d 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h +++ b/lib/libesp32_lvgl/lvgl/src/draw/stm32_dma2d/lv_gpu_stm32_dma2d.h @@ -53,40 +53,6 @@ struct _lv_disp_drv_t; void lv_draw_stm32_dma2d_init(void); void lv_draw_stm32_dma2d_ctx_init(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); void lv_draw_stm32_dma2d_ctx_deinit(struct _lv_disp_drv_t * drv, lv_draw_ctx_t * draw_ctx); -static void lv_draw_stm32_dma2d_blend(lv_draw_ctx_t * draw_ctx, const lv_draw_sw_blend_dsc_t * dsc); -static void lv_draw_stm32_dma2d_buffer_copy(lv_draw_ctx_t * draw_ctx, - void * dest_buf, lv_coord_t dest_stride, const lv_area_t * dest_area, - void * src_buf, lv_coord_t src_stride, const lv_area_t * src_area); -static lv_res_t lv_draw_stm32_dma2d_img(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, - const lv_area_t * src_area, const void * src); -static void lv_gpu_stm32_dma2d_wait_cb(lv_draw_ctx_t * draw_ctx); -static void lv_draw_stm32_dma2d_img_decoded(lv_draw_ctx_t * draw_ctx, const lv_draw_img_dsc_t * img_dsc, - const lv_area_t * coords, const uint8_t * src_buf, lv_img_cf_t color_format); -static dma2d_color_format_t lv_color_format_to_dma2d_color_format(lv_img_cf_t color_format); -static lv_point_t lv_area_get_offset(const lv_area_t * area1, const lv_area_t * area2); - -/********************** - * STATIC PROTOTYPES - **********************/ -LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_fill(const lv_color_t * dst_buf, lv_coord_t dst_stride, - const lv_area_t * draw_area, lv_color_t color, lv_opa_t opa); -LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_map(const lv_color_t * dest_buf, lv_coord_t dest_stride, - const lv_area_t * draw_area, const void * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset, lv_opa_t opa, - dma2d_color_format_t src_color_format, bool ignore_src_alpha); -LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_blend_paint(const lv_color_t * dst_buf, lv_coord_t dst_stride, - const lv_area_t * draw_area, const lv_opa_t * mask_buf, lv_coord_t mask_stride, const lv_point_t * mask_offset, - lv_color_t color, lv_opa_t opa); -LV_STM32_DMA2D_STATIC void _lv_draw_stm32_dma2d_copy_buffer(const lv_color_t * dest_buf, lv_coord_t dest_stride, - const lv_area_t * draw_area, const lv_color_t * src_buf, lv_coord_t src_stride, const lv_point_t * src_offset); -LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_await_dma_transfer_finish(lv_disp_drv_t * disp_drv); -LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_start_dma_transfer(void); -LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_invalidate_cache(uint32_t address, lv_coord_t offset, - lv_coord_t width, lv_coord_t height, uint8_t pixel_size); -LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dma2d_clean_cache(uint32_t address, lv_coord_t offset, lv_coord_t width, - lv_coord_t height, uint8_t pixel_size); -LV_STM32_DMA2D_STATIC bool _lv_gpu_stm32_dwt_init(void); -LV_STM32_DMA2D_STATIC void _lv_gpu_stm32_dwt_reset(void); -LV_STM32_DMA2D_STATIC uint32_t _lv_gpu_stm32_dwt_get_us(void); /********************** * MACROS diff --git a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_blend.c b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_blend.c index bff0a8f19..a31d64a88 100644 --- a/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_blend.c +++ b/lib/libesp32_lvgl/lvgl/src/draw/sw/lv_draw_sw_blend.c @@ -430,7 +430,7 @@ static inline void set_px_argb_blend(uint8_t * buf, lv_color_t color, lv_opa_t o /*Set the result color*/ #if LV_COLOR_DEPTH == 8 - buf[0] = res_color.full; + buf[0] = last_res_color.full; #elif LV_COLOR_DEPTH == 16 buf[0] = last_res_color.full & 0xff; buf[1] = last_res_color.full >> 8; diff --git a/lib/libesp32_lvgl/lvgl/src/extra/layouts/flex/lv_flex.c b/lib/libesp32_lvgl/lvgl/src/extra/layouts/flex/lv_flex.c index a53c95e88..8f0b4d290 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/layouts/flex/lv_flex.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/layouts/flex/lv_flex.c @@ -97,6 +97,7 @@ void lv_flex_init(void) LV_STYLE_FLEX_MAIN_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_CROSS_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); LV_STYLE_FLEX_TRACK_PLACE = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); + LV_STYLE_FLEX_GROW = lv_style_register_prop(LV_STYLE_PROP_LAYOUT_REFR); } void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow) diff --git a/lib/libesp32_lvgl/lvgl/src/extra/libs/png/lv_png.c b/lib/libesp32_lvgl/lvgl/src/extra/libs/png/lv_png.c index d067ef508..9228e29c8 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/libs/png/lv_png.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/libs/png/lv_png.c @@ -103,13 +103,33 @@ static lv_res_t decoder_info(struct _lv_img_decoder_t * decoder, const void * sr else if(src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = src; const uint32_t data_size = img_dsc->data_size; + const uint32_t * size = ((uint32_t *)img_dsc->data) + 4; const uint8_t magic[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a}; if(data_size < sizeof(magic)) return LV_RES_INV; if(memcmp(magic, img_dsc->data, sizeof(magic))) return LV_RES_INV; header->always_zero = 0; - header->cf = img_dsc->header.cf; /*Save the color format*/ - header->w = img_dsc->header.w; /*Save the color width*/ - header->h = img_dsc->header.h; /*Save the color height*/ + + if(img_dsc->header.cf) { + header->cf = img_dsc->header.cf; /*Save the color format*/ + } + else { + header->cf = LV_IMG_CF_TRUE_COLOR_ALPHA; + } + + if(img_dsc->header.w) { + header->w = img_dsc->header.w; /*Save the image width*/ + } + else { + header->w = (lv_coord_t)((size[0] & 0xff000000) >> 24) + ((size[0] & 0x00ff0000) >> 8); + } + + if(img_dsc->header.h) { + header->h = img_dsc->header.h; /*Save the color height*/ + } + else { + header->h = (lv_coord_t)((size[1] & 0xff000000) >> 24) + ((size[1] & 0x00ff0000) >> 8); + } + return LV_RES_OK; } @@ -142,13 +162,13 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * error = lodepng_load_file(&png_data, &png_data_size, fn); /*Load the file*/ if(error) { - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } /*Decode the PNG image*/ - uint32_t png_width; /*Will be the width of the decoded image*/ - uint32_t png_height; /*Will be the width of the decoded image*/ + unsigned png_width; /*Will be the width of the decoded image*/ + unsigned png_height; /*Will be the width of the decoded image*/ /*Decode the loaded image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, png_data, png_data_size); @@ -157,7 +177,7 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * if(img_data != NULL) { lv_mem_free(img_data); } - LV_LOG_WARN("error %u: %s\n", error, lodepng_error_text(error)); + LV_LOG_WARN("error %" LV_PRIu32 ": %s\n", error, lodepng_error_text(error)); return LV_RES_INV; } @@ -170,8 +190,8 @@ static lv_res_t decoder_open(lv_img_decoder_t * decoder, lv_img_decoder_dsc_t * /*If it's a PNG file in a C array...*/ else if(dsc->src_type == LV_IMG_SRC_VARIABLE) { const lv_img_dsc_t * img_dsc = dsc->src; - uint32_t png_width; /*No used, just required by he decoder*/ - uint32_t png_height; /*No used, just required by he decoder*/ + unsigned png_width; /*No used, just required by he decoder*/ + unsigned png_height; /*No used, just required by he decoder*/ /*Decode the image in ARGB8888 */ error = lodepng_decode32(&img_data, &png_width, &png_height, img_dsc->data, img_dsc->data_size); diff --git a/lib/libesp32_lvgl/lvgl/src/extra/lv_extra.c b/lib/libesp32_lvgl/lvgl/src/extra/lv_extra.c index e7c604103..0b5000240 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/lv_extra.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/lv_extra.c @@ -78,16 +78,14 @@ void lv_extra_init(void) lv_bmp_init(); #endif -// TASMOTA Specific, the initialization is done in Tasmota code to adjust with PSRAM - -// #if LV_USE_FREETYPE -// /*Init freetype library*/ -// # if LV_FREETYPE_CACHE_SIZE >= 0 -// lv_freetype_init(LV_FREETYPE_CACHE_FT_FACES, LV_FREETYPE_CACHE_FT_SIZES, LV_FREETYPE_CACHE_SIZE); -// # else -// lv_freetype_init(0, 0, 0); -// # endif -// #endif +#if LV_USE_FREETYPE + /*Init freetype library*/ +# if LV_FREETYPE_CACHE_SIZE >= 0 + lv_freetype_init(LV_FREETYPE_CACHE_FT_FACES, LV_FREETYPE_CACHE_FT_SIZES, LV_FREETYPE_CACHE_SIZE); +# else + lv_freetype_init(0, 0, 0); +# endif +#endif } /********************** diff --git a/lib/libesp32_lvgl/lvgl/src/extra/widgets/chart/lv_chart.c b/lib/libesp32_lvgl/lvgl/src/extra/widgets/chart/lv_chart.c index c5afb8b94..2d53adb20 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/widgets/chart/lv_chart.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/widgets/chart/lv_chart.c @@ -1382,8 +1382,10 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); - if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + if(t->major_cnt <= 1) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint8_t sec_axis = axis == LV_CHART_AXIS_PRIMARY_Y ? 0 : 1; @@ -1433,7 +1435,6 @@ static void draw_y_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis part_draw_dsc.line_dsc = &line_dsc; part_draw_dsc.label_dsc = &label_dsc; - uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); for(i = 0; i <= total_tick_num; i++) { /*draw a line at moving y position*/ p2.y = p1.y = y_ofs + (int32_t)((int32_t)(h - line_dsc.width) * i) / total_tick_num; @@ -1514,6 +1515,8 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis lv_chart_tick_dsc_t * t = get_tick_gsc(obj, axis); if(t->major_cnt <= 1) return; if(!t->label_en && !t->major_len && !t->minor_len) return; + uint32_t total_tick_num = (t->major_cnt - 1) * (t->minor_cnt); + if(total_tick_num == 0) return; uint32_t i; lv_point_t p1; @@ -1571,7 +1574,6 @@ static void draw_x_ticks(lv_obj_t * obj, lv_draw_ctx_t * draw_ctx, lv_chart_axis } p1.y = y_ofs; - uint32_t total_tick_num = (t->major_cnt - 1) * t->minor_cnt; for(i = 0; i <= total_tick_num; i++) { /*one extra loop - it may not exist in the list, empty label*/ bool major = false; if(i % t->minor_cnt == 0) major = true; diff --git a/lib/libesp32_lvgl/lvgl/src/extra/widgets/msgbox/lv_msgbox.c b/lib/libesp32_lvgl/lvgl/src/extra/widgets/msgbox/lv_msgbox.c index 8db5df7ee..54d65e353 100644 --- a/lib/libesp32_lvgl/lvgl/src/extra/widgets/msgbox/lv_msgbox.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/widgets/msgbox/lv_msgbox.c @@ -106,6 +106,9 @@ lv_obj_t * lv_msgbox_create(lv_obj_t * parent, const char * title, const char * } mbox->content = lv_obj_class_create_obj(&lv_msgbox_content_class, obj); + LV_ASSERT_MALLOC(mbox->content); + if(mbox->content == NULL) return NULL; + lv_obj_class_init_obj(mbox->content); bool has_txt = txt && strlen(txt) > 0; if(has_txt) { diff --git a/lib/libesp32_lvgl/lvgl/src/extra/widgets/tabview/lv_tabview.c b/lib/libesp32_lvgl/lvgl/src/extra/widgets/tabview/lv_tabview.c index 81addc663..b77e0be3e 100755 --- a/lib/libesp32_lvgl/lvgl/src/extra/widgets/tabview/lv_tabview.c +++ b/lib/libesp32_lvgl/lvgl/src/extra/widgets/tabview/lv_tabview.c @@ -308,7 +308,7 @@ static void btns_value_changed_event_cb(lv_event_t * e) lv_obj_t * tv = lv_obj_get_parent(btns); uint32_t id = lv_btnmatrix_get_selected_btn(btns); - lv_tabview_set_act(tv, id, LV_ANIM_ON); + lv_tabview_set_act(tv, id, LV_ANIM_OFF); } static void cont_scroll_end_event_cb(lv_event_t * e) diff --git a/lib/libesp32_lvgl/lvgl/src/hal/lv_hal_disp.c b/lib/libesp32_lvgl/lvgl/src/hal/lv_hal_disp.c index 10640a28a..0cebc3354 100644 --- a/lib/libesp32_lvgl/lvgl/src/hal/lv_hal_disp.c +++ b/lib/libesp32_lvgl/lvgl/src/hal/lv_hal_disp.c @@ -25,6 +25,7 @@ #include "../draw/arm2d/lv_gpu_arm2d.h" #include "../draw/nxp/vglite/lv_draw_vglite.h" #include "../draw/nxp/pxp/lv_draw_pxp.h" +#include "../draw/renesas/lv_gpu_d2_ra6m3.h" #if LV_USE_THEME_DEFAULT #include "../extra/themes/default/lv_theme_default.h" @@ -95,8 +96,11 @@ void lv_disp_drv_init(lv_disp_drv_t * driver) driver->dpi = LV_DPI_DEF; driver->color_chroma_key = LV_COLOR_CHROMA_KEY; - -#if LV_USE_GPU_STM32_DMA2D +#if LV_USE_GPU_RA6M3_G2D + driver->draw_ctx_init = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_deinit = lv_draw_ra6m3_2d_ctx_init; + driver->draw_ctx_size = sizeof(lv_draw_ra6m3_dma2d_ctx_t); +#elif LV_USE_GPU_STM32_DMA2D driver->draw_ctx_init = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_deinit = lv_draw_stm32_dma2d_ctx_init; driver->draw_ctx_size = sizeof(lv_draw_stm32_dma2d_ctx_t); diff --git a/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h b/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h index 4cd3895f2..a625ba960 100644 --- a/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h +++ b/lib/libesp32_lvgl/lvgl/src/lv_conf_internal.h @@ -445,6 +445,26 @@ #endif #endif +/*Enable RA6M3 G2D GPU*/ +#ifndef LV_USE_GPU_RA6M3_G2D + #ifdef CONFIG_LV_USE_GPU_RA6M3_G2D + #define LV_USE_GPU_RA6M3_G2D CONFIG_LV_USE_GPU_RA6M3_G2D + #else + #define LV_USE_GPU_RA6M3_G2D 0 + #endif +#endif +#if LV_USE_GPU_RA6M3_G2D + /*include path of target processor + e.g. "hal_data.h"*/ + #ifndef LV_GPU_RA6M3_G2D_INCLUDE + #ifdef CONFIG_LV_GPU_RA6M3_G2D_INCLUDE + #define LV_GPU_RA6M3_G2D_INCLUDE CONFIG_LV_GPU_RA6M3_G2D_INCLUDE + #else + #define LV_GPU_RA6M3_G2D_INCLUDE "hal_data.h" + #endif + #endif +#endif + /*Use SWM341's DMA2D GPU*/ #ifndef LV_USE_GPU_SWM341_DMA2D #ifdef CONFIG_LV_USE_GPU_SWM341_DMA2D diff --git a/lib/libesp32_lvgl/lvgl/src/misc/lv_bidi.c b/lib/libesp32_lvgl/lvgl/src/misc/lv_bidi.c index 3dc3ce7f1..70af1c4b4 100644 --- a/lib/libesp32_lvgl/lvgl/src/misc/lv_bidi.c +++ b/lib/libesp32_lvgl/lvgl/src/misc/lv_bidi.c @@ -376,7 +376,6 @@ static bool lv_bidi_letter_is_weak(uint32_t letter) */ static bool lv_bidi_letter_is_rtl(uint32_t letter) { - if(letter >= 0x5d0 && letter <= 0x5ea) return true; if(letter == 0x202E) return true; /*Unicode of LV_BIDI_RLO*/ /*Check for Persian and Arabic characters [https://en.wikipedia.org/wiki/Arabic_script_in_Unicode]*/ @@ -384,6 +383,10 @@ static bool lv_bidi_letter_is_rtl(uint32_t letter) if(letter >= 0xFB50 && letter <= 0xFDFF) return true; if(letter >= 0xFE70 && letter <= 0xFEFF) return true; + /*Check for Hebrew characters [https://en.wikipedia.org/wiki/Unicode_and_HTML_for_the_Hebrew_alphabet]*/ + if(letter >= 0x590 && letter <= 0x5FF) return true; + if(letter >= 0xFB1D && letter <= 0xFB4F) return true; + return false; } diff --git a/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.c b/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.c index 92a4d2fe3..923f19afb 100644 --- a/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.c +++ b/lib/libesp32_lvgl/lvgl/src/widgets/lv_btnmatrix.c @@ -23,7 +23,7 @@ #define MY_CLASS &lv_btnmatrix_class #define BTN_EXTRA_CLICK_AREA_MAX (LV_DPI_DEF / 10) -#define LV_BTNMATRIX_WIDTH_MASK 0x0007 +#define LV_BTNMATRIX_WIDTH_MASK 0x000F /********************** * TYPEDEFS @@ -520,6 +520,8 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; } else if(code == LV_EVENT_FOCUSED) { + if(btnm->btn_cnt == 0) return; + lv_indev_t * indev = lv_event_get_param(e); lv_indev_type_t indev_type = lv_indev_get_type(indev); @@ -563,9 +565,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) else btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_LEFT) { @@ -574,9 +582,15 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) if(btnm->btn_id_sel == 0) btnm->btn_id_sel = btnm->btn_cnt - 1; else if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; + uint16_t btn_id_start = btnm->btn_id_sel; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { if(btnm->btn_id_sel > 0) btnm->btn_id_sel--; else btnm->btn_id_sel = btnm->btn_cnt - 1; + + if(btnm->btn_id_sel == btn_id_start) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else if(c == LV_KEY_DOWN) { @@ -586,7 +600,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { @@ -614,7 +631,10 @@ static void lv_btnmatrix_event(const lv_obj_class_t * class_p, lv_event_t * e) btnm->btn_id_sel = 0; while(button_is_hidden(btnm->ctrl_bits[btnm->btn_id_sel]) || button_is_inactive(btnm->ctrl_bits[btnm->btn_id_sel])) { btnm->btn_id_sel++; - if(btnm->btn_id_sel >= btnm->btn_cnt) btnm->btn_id_sel = 0; + if(btnm->btn_id_sel >= btnm->btn_cnt) { + btnm->btn_id_sel = LV_BTNMATRIX_BTN_NONE; + break; + } } } else { From 5c9c4e6dad2a9156cc27240d331a0e68bf024878 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 6 Jul 2023 22:15:37 +0200 Subject: [PATCH 047/150] Matter increase logs in save_fabrics (#19060) --- .../src/embedded/Matter_Session_Store.be | 22 ++-- .../solidified_Matter_Session_Store.h | 116 +++++++++--------- 2 files changed, 69 insertions(+), 69 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be index 0627eb6fc..0c979bb30 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be @@ -310,18 +310,18 @@ class Matter_Session_Store ############################################################# def save_fabrics() import json - self.remove_expired() # clean before saving - var sessions_saved = 0 - - var fabs = [] - for f : self.fabrics.persistables() - for _ : f._sessions.persistables() sessions_saved += 1 end # count persitable sessions - fabs.push(f.tojson()) - end - var fabs_size = size(fabs) - fabs = "[" + fabs.concat(",") + "]" - try + self.remove_expired() # clean before saving + var sessions_saved = 0 + + var fabs = [] + for f : self.fabrics.persistables() + for _ : f._sessions.persistables() sessions_saved += 1 end # count persitable sessions + fabs.push(f.tojson()) + end + var fabs_size = size(fabs) + fabs = "[" + fabs.concat(",") + "]" + var f = open(self._FABRICS, "w") f.write(fabs) f.close() diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index 13f83bca6..662023413 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -1197,50 +1197,50 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ &be_const_str_solidified, ( &(const binstruction[86]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x58080002, // 0003 LDCONST R2 K2 - 0x600C0012, // 0004 GETGBL R3 G18 - 0x7C0C0000, // 0005 CALL R3 0 - 0x60100010, // 0006 GETGBL R4 G16 - 0x88140103, // 0007 GETMBR R5 R0 K3 - 0x8C140B04, // 0008 GETMET R5 R5 K4 - 0x7C140200, // 0009 CALL R5 1 - 0x7C100200, // 000A CALL R4 1 - 0xA8020013, // 000B EXBLK 0 #0020 - 0x5C140800, // 000C MOVE R5 R4 - 0x7C140000, // 000D CALL R5 0 - 0x60180010, // 000E GETGBL R6 G16 - 0x881C0B05, // 000F GETMBR R7 R5 K5 - 0x8C1C0F04, // 0010 GETMET R7 R7 K4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C180200, // 0012 CALL R6 1 - 0xA8020003, // 0013 EXBLK 0 #0018 - 0x5C1C0C00, // 0014 MOVE R7 R6 - 0x7C1C0000, // 0015 CALL R7 0 - 0x00080506, // 0016 ADD R2 R2 K6 - 0x7001FFFB, // 0017 JMP #0014 - 0x58180007, // 0018 LDCONST R6 K7 - 0xAC180200, // 0019 CATCH R6 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x8C180708, // 001B GETMET R6 R3 K8 - 0x8C200B09, // 001C GETMET R8 R5 K9 - 0x7C200200, // 001D CALL R8 1 - 0x7C180400, // 001E CALL R6 2 - 0x7001FFEB, // 001F JMP #000C - 0x58100007, // 0020 LDCONST R4 K7 - 0xAC100200, // 0021 CATCH R4 1 0 - 0xB0080000, // 0022 RAISE 2 R0 R0 - 0x6010000C, // 0023 GETGBL R4 G12 - 0x5C140600, // 0024 MOVE R5 R3 - 0x7C100200, // 0025 CALL R4 1 - 0x8C14070B, // 0026 GETMET R5 R3 K11 - 0x581C000C, // 0027 LDCONST R7 K12 - 0x7C140400, // 0028 CALL R5 2 - 0x00161405, // 0029 ADD R5 K10 R5 - 0x00140B0D, // 002A ADD R5 R5 K13 - 0x5C0C0A00, // 002B MOVE R3 R5 - 0xA8020016, // 002C EXBLK 0 #0044 + 0xA8020041, // 0001 EXBLK 0 #0044 + 0x8C080101, // 0002 GETMET R2 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x58080002, // 0004 LDCONST R2 K2 + 0x600C0012, // 0005 GETGBL R3 G18 + 0x7C0C0000, // 0006 CALL R3 0 + 0x60100010, // 0007 GETGBL R4 G16 + 0x88140103, // 0008 GETMBR R5 R0 K3 + 0x8C140B04, // 0009 GETMET R5 R5 K4 + 0x7C140200, // 000A CALL R5 1 + 0x7C100200, // 000B CALL R4 1 + 0xA8020013, // 000C EXBLK 0 #0021 + 0x5C140800, // 000D MOVE R5 R4 + 0x7C140000, // 000E CALL R5 0 + 0x60180010, // 000F GETGBL R6 G16 + 0x881C0B05, // 0010 GETMBR R7 R5 K5 + 0x8C1C0F04, // 0011 GETMET R7 R7 K4 + 0x7C1C0200, // 0012 CALL R7 1 + 0x7C180200, // 0013 CALL R6 1 + 0xA8020003, // 0014 EXBLK 0 #0019 + 0x5C1C0C00, // 0015 MOVE R7 R6 + 0x7C1C0000, // 0016 CALL R7 0 + 0x00080506, // 0017 ADD R2 R2 K6 + 0x7001FFFB, // 0018 JMP #0015 + 0x58180007, // 0019 LDCONST R6 K7 + 0xAC180200, // 001A CATCH R6 1 0 + 0xB0080000, // 001B RAISE 2 R0 R0 + 0x8C180708, // 001C GETMET R6 R3 K8 + 0x8C200B09, // 001D GETMET R8 R5 K9 + 0x7C200200, // 001E CALL R8 1 + 0x7C180400, // 001F CALL R6 2 + 0x7001FFEB, // 0020 JMP #000D + 0x58100007, // 0021 LDCONST R4 K7 + 0xAC100200, // 0022 CATCH R4 1 0 + 0xB0080000, // 0023 RAISE 2 R0 R0 + 0x6010000C, // 0024 GETGBL R4 G12 + 0x5C140600, // 0025 MOVE R5 R3 + 0x7C100200, // 0026 CALL R4 1 + 0x8C14070B, // 0027 GETMET R5 R3 K11 + 0x581C000C, // 0028 LDCONST R7 K12 + 0x7C140400, // 0029 CALL R5 2 + 0x00161405, // 002A ADD R5 K10 R5 + 0x00140B0D, // 002B ADD R5 R5 K13 + 0x5C0C0A00, // 002C MOVE R3 R5 0x60140011, // 002D GETGBL R5 G17 0x8818010E, // 002E GETMBR R6 R0 K14 0x581C000F, // 002F LDCONST R7 K15 @@ -1264,21 +1264,21 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0x7C180200, // 0041 CALL R6 1 0xA8040001, // 0042 EXBLK 1 1 0x70020010, // 0043 JMP #0055 - 0xAC140002, // 0044 CATCH R5 0 2 + 0xAC080002, // 0044 CATCH R2 0 2 0x7002000D, // 0045 JMP #0054 - 0xB81E2400, // 0046 GETNGBL R7 K18 - 0x8C1C0F13, // 0047 GETMET R7 R7 K19 - 0x60240008, // 0048 GETGBL R9 G8 - 0x5C280A00, // 0049 MOVE R10 R5 - 0x7C240200, // 004A CALL R9 1 - 0x00263009, // 004B ADD R9 K24 R9 - 0x00241319, // 004C ADD R9 R9 K25 - 0x60280008, // 004D GETGBL R10 G8 - 0x5C2C0C00, // 004E MOVE R11 R6 - 0x7C280200, // 004F CALL R10 1 - 0x0024120A, // 0050 ADD R9 R9 R10 - 0x5828001A, // 0051 LDCONST R10 K26 - 0x7C1C0600, // 0052 CALL R7 3 + 0xB8122400, // 0046 GETNGBL R4 K18 + 0x8C100913, // 0047 GETMET R4 R4 K19 + 0x60180008, // 0048 GETGBL R6 G8 + 0x5C1C0400, // 0049 MOVE R7 R2 + 0x7C180200, // 004A CALL R6 1 + 0x001A3006, // 004B ADD R6 K24 R6 + 0x00180D19, // 004C ADD R6 R6 K25 + 0x601C0008, // 004D GETGBL R7 G8 + 0x5C200600, // 004E MOVE R8 R3 + 0x7C1C0200, // 004F CALL R7 1 + 0x00180C07, // 0050 ADD R6 R6 R7 + 0x581C001A, // 0051 LDCONST R7 K26 + 0x7C100600, // 0052 CALL R4 3 0x70020000, // 0053 JMP #0055 0xB0080000, // 0054 RAISE 2 R0 R0 0x80000000, // 0055 RET 0 From 8ce7cb4ccd699dd82d603b1e67f210d990d83cc7 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 7 Jul 2023 19:50:36 +0200 Subject: [PATCH 048/150] Enhance ZC-Dimmer for falling and leading edge dimmer (#19054) * Update tasmota_types.h * Update xdrv_68_zerocrossDimmer.ino --- tasmota/include/tasmota_types.h | 5 +- .../xdrv_68_zerocrossDimmer.ino | 88 +++++++------------ 2 files changed, 33 insertions(+), 60 deletions(-) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 758da9625..eac333b77 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -188,7 +188,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control uint32_t berry_no_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) uint32_t berry_light_scheme : 1; // bit 8 (v12.5.0.3) - SetOption154 - (Berry) Handle berry led using RMT0 as additional WS2812 scheme - uint32_t spare09 : 1; // bit 9 + uint32_t zcfallingedge : 1; // bit 9 (v12.5.0.4) - SetOption155 - ZC Dimmer enable rare falling Edge dimmer instead of leading edge uint32_t spare10 : 1; // bit 10 uint32_t spare11 : 1; // bit 11 uint32_t spare12 : 1; // bit 12 @@ -778,8 +778,9 @@ typedef struct { int8_t temp_comp; // E9E uint8_t weight_change; // E9F uint8_t web_color2[2][3]; // EA0 Needs to be on integer / 3 distance from web_color + uint16_t zcdimmerset[5]; // EA6 - uint8_t free_ea6[32]; // EA6 + uint8_t free_eb0[22]; // EB0 22 bytes uint8_t shift595_device_count; // EC6 uint8_t sta_config; // EC7 diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 9ec32e59e..1a3f52210 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -24,9 +24,6 @@ #define XDRV_68 68 -static const uint8_t GATE_ENABLE_TIME = 100; -static const uint8_t MIN_PERCENT = 5; -static const uint8_t MAX_PERCENT = 99; static const uint8_t TRIGGER_PERIOD = 75; #define ZCDIMMERSET_SHOW 1 @@ -37,13 +34,11 @@ struct AC_ZERO_CROSS_DIMMER { uint32_t crossed_zero_at; // Time (in micros()) of last ZC signal bool timer_iterrupt_started = false; // verification of the interrupt running bool dimmer_in_use = false; // Check if interrupt has to be run. Is stopped if all lights off + bool fallingEdgeDimmer = false; // Work as a fallwing edge dimmer uint32_t enable_time_us[MAX_PWMS]; // Time since last ZC pulse to enable gate pin. 0 means no disable. - uint32_t disable_time_us[MAX_PWMS]; // Time since last ZC pulse to disable gate pin. 0 means no disable. - uint8_t current_state_in_phase[MAX_PWMS]; // 0=before fire HIGH, 1=HIGH, 2=after setting LOW, 3=before HIGH without setting LOW (POWER ON) uint32_t lastlight[MAX_PWMS]; // Store the light value. Set 1 if controlled through ZCDimmerSet uint16_t detailpower[MAX_PWMS]; // replaces dimmer and light controll 0..10000. required savedata 0. uint32_t accurracy[MAX_PWMS]; // offset of the time to fire the triac and the real time when it fired - uint8_t triggertime = GATE_ENABLE_TIME; // copy of the Time for the gate keep open to start TRIAC uint32_t intr_counter = 0; // counter internally on interrerupt calls uint32_t missed_zero_cross; // count up all missed Zero-cross events. uint8_t actual_tigger_Period = TRIGGER_PERIOD; // copy of tigger period to change during runtime @@ -70,17 +65,8 @@ void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { ac_zero_cross_dimmer.crossed_zero_at = time; for (uint8_t i=0; i < MAX_PWMS; i++) { if (Pin(GPIO_PWM1, i) == -1) continue; + digitalWrite(Pin(GPIO_PWM1, i), LOW ^ ac_zero_cross_dimmer.fallingEdgeDimmer); ac_zero_cross_dimmer.dimmer_in_use |= ac_zero_cross_dimmer.lastlight[i] > 0; - // Dimmer is physically off. Skip swich on - ac_zero_cross_dimmer.current_state_in_phase[i] = 0; - if (100 * ac_zero_cross_dimmer.enable_time_us[i] > MAX_PERCENT * ac_zero_cross_dimmer.cycle_time_us ) { - ac_zero_cross_dimmer.current_state_in_phase[i] = 1; - ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.cycle_time_us / 2; - } - // If full cycle is required keep pin HIGH, skip LOW by skipping phase - if (100 * ac_zero_cross_dimmer.enable_time_us[i] < MIN_PERCENT * ac_zero_cross_dimmer.cycle_time_us) { - ac_zero_cross_dimmer.current_state_in_phase[i] = 3; - } } } @@ -90,6 +76,14 @@ uint32_t IRAM_ATTR ACDimmerTimer_intr_ESP8266() { return ac_zero_cross_dimmer.actual_tigger_Period * 80; } +void ACDimmerInit() +{ + for (uint8_t i = 0 ; i < 5; i++) { + ac_zero_cross_dimmer.detailpower[i] = Settings->zcdimmerset[i]; + ac_zero_cross_dimmer.fallingEdgeDimmer = Settings->flag6.zcfallingedge; + } +} + void ACDimmerInterruptDisable(bool disable) { AddLog(LOG_LEVEL_INFO, PSTR("ZCD: Zero-CrossDimmer enabled: %d"),!disable); @@ -133,7 +127,6 @@ void IRAM_ATTR ACDimmerTimer_intr() { ac_zero_cross_dimmer.intr_counter++; // Check for missed Zero-Cross event. Single failure will correct if (time_since_zc > 10100) { - memset(&ac_zero_cross_dimmer.current_state_in_phase, 0x00, sizeof(ac_zero_cross_dimmer.current_state_in_phase)); ac_zero_cross_dimmer.crossed_zero_at += ac_zero_cross_dimmer.cycle_time_us; ac_zero_cross_dimmer.missed_zero_cross++; time_since_zc += ac_zero_cross_dimmer.cycle_time_us; @@ -142,37 +135,25 @@ void IRAM_ATTR ACDimmerTimer_intr() { ac_zero_cross_dimmer.actual_tigger_Period = TRIGGER_PERIOD; for (uint8_t i = 0 ; i < MAX_PWMS; i++ ) { if (Pin(GPIO_PWM1, i) == -1) continue; - switch (ac_zero_cross_dimmer.current_state_in_phase[i]) { - case 1: - // Switch off does not need high accuracy. Happens at the next 75µs trigger - if (time_since_zc >= ac_zero_cross_dimmer.disable_time_us[i]) { - digitalWrite(Pin(GPIO_PWM1, i), LOW); - ac_zero_cross_dimmer.current_state_in_phase[i]++; - } - break; - case 0: - case 3: - if (time_since_zc + TRIGGER_PERIOD >= ac_zero_cross_dimmer.enable_time_us[i]){ - // Very close to the fire event. Loop the last µseconds to wait. + + if (time_since_zc + TRIGGER_PERIOD >= ac_zero_cross_dimmer.enable_time_us[i]){ + // Very close to the fire event. Loop the last µseconds to wait. #ifdef ESP8266 - // on ESP8266 we can change dynamically the trigger interval - ac_zero_cross_dimmer.actual_tigger_Period = tmin(ac_zero_cross_dimmer.actual_tigger_Period,tmax(5,ac_zero_cross_dimmer.enable_time_us[i] - time_since_zc)); + // on ESP8266 we can change dynamically the trigger interval + ac_zero_cross_dimmer.actual_tigger_Period = tmin(ac_zero_cross_dimmer.actual_tigger_Period,tmax(5,ac_zero_cross_dimmer.enable_time_us[i] - time_since_zc)); #endif #ifdef ESP32 - while (time_since_zc < ac_zero_cross_dimmer.enable_time_us[i]) { - time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; - } + while (time_since_zc < ac_zero_cross_dimmer.enable_time_us[i]) { + time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; + } #endif - } - if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { - digitalWrite(Pin(GPIO_PWM1, i), HIGH); - ac_zero_cross_dimmer.current_state_in_phase[i]++; -#ifdef ZC_DEBUG - ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; -#endif - } - break; - } + if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { + digitalWrite(Pin(GPIO_PWM1, i), HIGH ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); + #ifdef ZC_DEBUG + ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; + #endif + } + } } } @@ -202,8 +183,6 @@ void ACDimmerControllTrigger(void) { ac_zero_cross_dimmer.enable_time_us[i] = (uint32_t)state; } #endif - - ac_zero_cross_dimmer.disable_time_us[i] = ac_zero_cross_dimmer.enable_time_us[i] + ac_zero_cross_dimmer.triggertime; } } @@ -226,9 +205,9 @@ void ACDimmerLogging(void) ); for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, state %d, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), - i+1, ac_zero_cross_dimmer.enable_time_us[i], ac_zero_cross_dimmer.disable_time_us[i], - ac_zero_cross_dimmer.current_state_in_phase[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i], + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), + i+1, ac_zero_cross_dimmer.enable_time_us[i], + Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i], ac_zero_cross_dimmer.accurracy[i] ); } @@ -258,20 +237,12 @@ void CmndZCDimmerSet(void) { if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= MAX_PWMS)) { if (XdrvMailbox.data_len > 0) { - ac_zero_cross_dimmer.detailpower[XdrvMailbox.index-1] = (uint16_t)(100 * CharToFloat(XdrvMailbox.data)); + Settings->zcdimmerset[XdrvMailbox.index-1] = ac_zero_cross_dimmer.detailpower[XdrvMailbox.index-1] = (uint16_t)(100 * CharToFloat(XdrvMailbox.data)); } ResponseCmndIdxFloat((float)(ac_zero_cross_dimmer.detailpower[XdrvMailbox.index-1]) / 100, 2); } } -/* void CmndZCGateEnableTime(void) -{ - if (XdrvMailbox.payload > 0) { - ac_zero_cross_dimmer.triggertime = XdrvMailbox.payload; - } - ResponseCmndNumber(ac_zero_cross_dimmer.triggertime); -} */ - /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -282,6 +253,7 @@ bool Xdrv68(uint32_t function) if (Settings->flag4.zerocross_dimmer) { switch (function) { case FUNC_INIT: + ACDimmerInit(); #ifdef ESP32 //ACDimmerInterruptDisable(false); #endif From d9d9ca2651363ac364f720403657e557e8a0efe8 Mon Sep 17 00:00:00 2001 From: gemu Date: Fri, 7 Jul 2023 19:50:51 +0200 Subject: [PATCH 049/150] fix modbus-tcp, add U32,U64 etc (#19063) --- tasmota/tasmota_xsns_sensor/xsns_53_sml.ino | 55 +++++++++++++++++---- 1 file changed, 45 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino index cec25169f..1eaa924e1 100755 --- a/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_53_sml.ino @@ -1388,6 +1388,7 @@ void sml_shift_in(uint32_t meters, uint32_t shard) { uint8_t tlen = (mp->sbuff[4] << 8) | mp->sbuff[5]; if (mp->spos == 6 + tlen) { mp->spos = 0; + memmove(&mp->sbuff[0], &mp->sbuff[6], mp->sbsiz - 6); SML_Decode(meters); if (mp->client) { mp->client->flush(); @@ -1863,9 +1864,29 @@ void SML_Decode(uint8_t index) { cp += skip; } } + } else if (!strncmp(mp, "U64", 3)) { + uint32_t valh = (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | (cp[3]<<0); + uint32_t vall = (cp[4]<<24) | (cp[5]<<16) | (cp[6]<<8) | (cp[7]<<0); + uint64_t val = ((uint64_t)valh<<32) | vall; + mp += 3; + cp += 8; + ebus_dval = val; + mbus_dval = val; + } else if (!strncmp(mp, "u64", 3)) { + uint64_t valh = (cp[1]<<24) | (cp[0]<<16) | (cp[3]<<8) | (cp[2]<<0); + uint64_t vall = (cp[5]<<24) | (cp[4]<<16) | (cp[7]<<8) | (cp[6]<<0); + uint64_t val = ((uint64_t)valh<<32) | vall; + mp += 3; + cp += 8; + ebus_dval = val; + mbus_dval = val; + } else if (!strncmp(mp, "U32", 3)) { + mp += 3; + goto U32_do; } else if (!strncmp(mp, "UUuuUUuu", 8)) { - uint32_t val = (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | (cp[3]<<0); mp += 8; + U32_do: + uint32_t val = (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | (cp[3]<<0); cp += 4; if (*mp == 's') { mp++; @@ -1874,9 +1895,13 @@ void SML_Decode(uint8_t index) { } ebus_dval = val; mbus_dval = val; + } else if (!strncmp(mp, "u32", 3)) { + mp += 3; + goto u32_do; } else if (!strncmp(mp, "uuUUuuUU", 8)) { - uint32_t val = (cp[1]<<24) | (cp[0]<<16) | (cp[3]<<8) | (cp[2]<<0); mp += 8; + u32_do: + uint32_t val = (cp[1]<<24) | (cp[0]<<16) | (cp[3]<<8) | (cp[2]<<0); cp += 4; if (*mp == 's') { mp++; @@ -1891,9 +1916,13 @@ void SML_Decode(uint8_t index) { ebus_dval = val; mp += 4; cp += 2; + } else if (!strncmp(mp, "S32", 3)) { + mp += 3; + goto S32_do; } else if (!strncmp(mp, "SSssSSss", 8)) { - int32_t val = (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | (cp[3]<<0); mp += 8; + S32_do: + int32_t val = (cp[0]<<24) | (cp[1]<<16) | (cp[2]<<8) | (cp[3]<<0); cp += 4; if (*mp == 's') { mp++; @@ -1902,9 +1931,13 @@ void SML_Decode(uint8_t index) { } ebus_dval = val; mbus_dval = val; + } else if (!strncmp(mp, "s32", 3)) { + mp += 3; + goto s32_do; } else if (!strncmp(mp, "ssSSssSS", 8)) { - int32_t val = (cp[1]<<24) | (cp[0]<<16) | (cp[3]<<8) | (cp[2]<<0); mp += 8; + s32_do: + int32_t val = (cp[1]<<24) | (cp[0]<<16) | (cp[3]<<8) | (cp[2]<<0); cp += 4; if (*mp == 's') { mp++; @@ -2203,11 +2236,13 @@ void SML_Decode(uint8_t index) { dval = mbus_dval; mp++; } else { - uint16_t pos = meter_desc[mindex].sbuff[2] + 3; - if (pos > (meter_desc[mindex].sbsiz - 2)) pos = meter_desc[mindex].sbsiz - 2; - uint16_t crc = MBUS_calculateCRC(&meter_desc[mindex].sbuff[0], pos, 0xFFFF); - if (lowByte(crc) != meter_desc[mindex].sbuff[pos]) goto nextsect; - if (highByte(crc) != meter_desc[mindex].sbuff[pos + 1]) goto nextsect; + if (meter_desc[mindex].srcpin != TCP_MODE_FLG) { + uint16_t pos = meter_desc[mindex].sbuff[2] + 3; + if (pos > (meter_desc[mindex].sbsiz - 2)) pos = meter_desc[mindex].sbsiz - 2; + uint16_t crc = MBUS_calculateCRC(&meter_desc[mindex].sbuff[0], pos, 0xFFFF); + if (lowByte(crc) != meter_desc[mindex].sbuff[pos]) goto nextsect; + if (highByte(crc) != meter_desc[mindex].sbuff[pos + 1]) goto nextsect; + } dval = mbus_dval; //AddLog(LOG_LEVEL_INFO, PSTR(">> %s"),mp); mp++; @@ -3620,7 +3655,7 @@ typedef struct { } MODBUS_TCP_HEADER; uint16_t sml_swap(uint16_t in) { - return (in << 8) || in >> 8; + return (in << 8) | in >> 8; } // send modbus TCP frame with payload From 2ecb697a3fbe556b23bb542ae8444968ed719fcf Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 8 Jul 2023 11:25:25 +0200 Subject: [PATCH 050/150] Berry added `getgbl` performance counter to `debug.counters()` (#19070) * Berry add `getgbl` counter * Berry added `getgbl` performance counter to `debug.counters()` --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_debuglib.c | 1 + lib/libesp32/berry/src/be_vm.c | 4 ++++ lib/libesp32/berry/src/be_vm.h | 1 + 4 files changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e95efbf29..96b2bc5d5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset (#19024) - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) +- Berry added `getgbl` performance counter to `debug.counters()` ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) diff --git a/lib/libesp32/berry/src/be_debuglib.c b/lib/libesp32/berry/src/be_debuglib.c index 153af55fb..49ee027b0 100644 --- a/lib/libesp32/berry/src/be_debuglib.c +++ b/lib/libesp32/berry/src/be_debuglib.c @@ -167,6 +167,7 @@ static int m_counters(bvm *vm) map_insert(vm, "call", vm->counter_call); map_insert(vm, "get", vm->counter_get); map_insert(vm, "set", vm->counter_set); + map_insert(vm, "getgbl", vm->counter_get_global); map_insert(vm, "try", vm->counter_try); map_insert(vm, "raise", vm->counter_exc); map_insert(vm, "objects", vm->counter_gc_kept); diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index eb2b6ef63..4c21866e4 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -507,6 +507,7 @@ BERRY_API bvm* be_vm_new(void) vm->counter_call = 0; vm->counter_get = 0; vm->counter_set = 0; + vm->counter_get_global = 0; vm->counter_try = 0; vm->counter_exc = 0; vm->counter_gc_kept = 0; @@ -579,6 +580,9 @@ newframe: /* a new call frame */ dispatch(); } opcase(GETNGBL): { /* get Global by name */ +#if BE_USE_PERF_COUNTERS + vm->counter_get_global++; +#endif bvalue *v = RA(); bvalue *b = RKB(); if (var_isstr(b)) { diff --git a/lib/libesp32/berry/src/be_vm.h b/lib/libesp32/berry/src/be_vm.h index 1e83c912f..711d96ed1 100644 --- a/lib/libesp32/berry/src/be_vm.h +++ b/lib/libesp32/berry/src/be_vm.h @@ -114,6 +114,7 @@ struct bvm { uint32_t counter_call; /* counter for calls, VM or native */ uint32_t counter_get; /* counter for GETMBR or GETMET */ uint32_t counter_set; /* counter for SETMBR */ + uint32_t counter_get_global; /* counter for GETNBGL */ uint32_t counter_try; /* counter for `try` statement */ uint32_t counter_exc; /* counter for raised exceptions */ uint32_t counter_gc_kept; /* counter for objects scanned by last gc */ From a0c4d914e8c09930d732506ee8e1bb1880c6ade6 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 8 Jul 2023 11:25:33 +0200 Subject: [PATCH 051/150] Matter fix bug when saving Force Static endpoints (#19071) --- .../berry_matter/src/embedded/Matter_IM.be | 2 + .../src/embedded/Matter_IM_Message.be | 2 + .../src/embedded/Matter_UDPServer.be | 2 + .../berry_matter/src/embedded/Matter_UI.be | 6 +- .../src/solidify/solidified_Matter_UI.h | 1207 +++++++++-------- 5 files changed, 618 insertions(+), 601 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index 94232d40a..c30668b6c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -380,6 +380,7 @@ class Matter_IM # returns `true` if processed, `false` if silently ignored, # or raises an exception def process_invoke_request(msg, val) + # import debug # structure is `ReadRequestMessage` 10.6.2 p.558 # tasmota.log("MTR: IM:invoke_request processing start", 4) var ctx = matter.Path() @@ -403,6 +404,7 @@ class Matter_IM var res = self.device.invoke_request(msg.session, q.command_fields, ctx) var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : "" tasmota.log(format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), ctx.endpoint != 0 ? 2 : 3 #- don't log for endpoint 0 -# ) + # tasmota.log("MTR: Perf/Command = " + str(debug.counters()), 4) ctx.log = nil var a1 = matter.InvokeResponseIB() if res == true || ctx.status == matter.SUCCESS # special case, just respond ok diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be index 30583e2f1..fa1edfec3 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM_Message.be @@ -88,10 +88,12 @@ class Matter_IM_Message def send_im(responder) # tasmota.log(format("MTR: IM_Message send_im exch=%i ready=%i", self.resp.exchange_id, self.ready ? 1 : 0), 3) if !self.ready return false end + # import debug var resp = self.resp resp.encode_frame(self.data.to_TLV().tlv2raw()) # payload in cleartext resp.encrypt() tasmota.log(format("MTR: Date: Sat, 8 Jul 2023 12:00:23 +0200 Subject: [PATCH 052/150] Matter improve latency for remote commands (#19072) --- CHANGELOG.md | 1 + .../embedded/Matter_Plugin_Bridge_Light0.be | 2 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 1 - .../embedded/Matter_Plugin_Bridge_Light2.be | 1 - .../embedded/Matter_Plugin_Bridge_Light3.be | 1 - .../solidified_Matter_Plugin_Bridge_Light0.h | 73 +++--- .../solidified_Matter_Plugin_Bridge_Light1.h | 189 +++++++-------- .../solidified_Matter_Plugin_Bridge_Light2.h | 131 +++++----- .../solidified_Matter_Plugin_Bridge_Light3.h | 229 +++++++++--------- 9 files changed, 307 insertions(+), 321 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96b2bc5d5..2bd5e8fd8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) - Matter improve responsiveness - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) +- Matter improve latency for remote commands ### Fixed - Berry various fixes for Walrus Operator (#18982) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index 60078c41a..c65099cb9 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -83,6 +83,7 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP var ret = self.call_remote_sync("Power" + str(self.tasmota_relay_index), v ? "1" : "0") if ret != nil self.parse_update(ret, 11) # update shadow from return value + # self.tick = self.device.tick # prevent an explicit Status11 for as it is not needed if the subscription update is sent in same tick end end @@ -122,7 +123,6 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP # ==================================================================================================== if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== - self.update_shadow_lazy() if command == 0x0000 # ---------- Off ---------- self.set_onoff(false) return true diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index cfb8c4052..bc0b66a99 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -127,7 +127,6 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 # ==================================================================================================== if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== - self.update_shadow_lazy() if command == 0x0000 # ---------- MoveToLevel ---------- var bri_in = val.findsubval(0) # Hue 0..254 self.set_bri(bri_in) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index 5e8ef08ca..adf2f591c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -143,7 +143,6 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== - self.update_shadow_lazy() if command == 0x000A # ---------- MoveToColorTemperature ---------- var ct_in = val.findsubval(0) # CT if ct_in < self.ct_min ct_in = self.ct_min end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index e222049db..6bff511ef 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -153,7 +153,6 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 # ==================================================================================================== if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== - self.update_shadow_lazy() if command == 0x0000 # ---------- MoveToHue ---------- var hue_in = val.findsubval(0) # Hue 0..254 self.set_hue(hue_in) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index e3b1ee303..74131ca6d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -300,57 +300,54 @@ be_local_closure(Matter_Plugin_Bridge_Light0_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(set_onoff), - /* K7 */ be_const_int(1), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(shadow_onoff), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(set_onoff), + /* K6 */ be_const_int(1), + /* K7 */ be_const_int(2), + /* K8 */ be_nested_str_weak(shadow_onoff), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ + ( &(const binstruction[34]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0x88140702, // 0002 GETMBR R5 R3 K2 0x88180703, // 0003 GETMBR R6 R3 K3 0x541E0005, // 0004 LDINT R7 6 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E001B, // 0006 JMPF R7 #0023 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E0005, // 000A JMPF R7 #0011 - 0x8C1C0106, // 000B GETMET R7 R0 K6 - 0x50240000, // 000C LDBOOL R9 0 0 - 0x7C1C0400, // 000D CALL R7 2 - 0x501C0200, // 000E LDBOOL R7 1 0 - 0x80040E00, // 000F RET 1 R7 - 0x70020011, // 0010 JMP #0023 - 0x1C1C0D07, // 0011 EQ R7 R6 K7 - 0x781E0005, // 0012 JMPF R7 #0019 - 0x8C1C0106, // 0013 GETMET R7 R0 K6 - 0x50240200, // 0014 LDBOOL R9 1 0 - 0x7C1C0400, // 0015 CALL R7 2 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x80040E00, // 0017 RET 1 R7 - 0x70020009, // 0018 JMP #0023 - 0x1C1C0D08, // 0019 EQ R7 R6 K8 - 0x781E0007, // 001A JMPF R7 #0023 - 0x8C1C0106, // 001B GETMET R7 R0 K6 - 0x88240109, // 001C GETMBR R9 R0 K9 - 0x78260000, // 001D JMPF R9 #001F - 0x50240001, // 001E LDBOOL R9 0 1 - 0x50240200, // 001F LDBOOL R9 1 0 - 0x7C1C0400, // 0020 CALL R7 2 - 0x501C0200, // 0021 LDBOOL R7 1 0 - 0x80040E00, // 0022 RET 1 R7 - 0x80000000, // 0023 RET 0 + 0x781E0019, // 0006 JMPF R7 #0021 + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0005, // 0008 JMPF R7 #000F + 0x8C1C0105, // 0009 GETMET R7 R0 K5 + 0x50240000, // 000A LDBOOL R9 0 0 + 0x7C1C0400, // 000B CALL R7 2 + 0x501C0200, // 000C LDBOOL R7 1 0 + 0x80040E00, // 000D RET 1 R7 + 0x70020011, // 000E JMP #0021 + 0x1C1C0D06, // 000F EQ R7 R6 K6 + 0x781E0005, // 0010 JMPF R7 #0017 + 0x8C1C0105, // 0011 GETMET R7 R0 K5 + 0x50240200, // 0012 LDBOOL R9 1 0 + 0x7C1C0400, // 0013 CALL R7 2 + 0x501C0200, // 0014 LDBOOL R7 1 0 + 0x80040E00, // 0015 RET 1 R7 + 0x70020009, // 0016 JMP #0021 + 0x1C1C0D07, // 0017 EQ R7 R6 K7 + 0x781E0007, // 0018 JMPF R7 #0021 + 0x8C1C0105, // 0019 GETMET R7 R0 K5 + 0x88240108, // 001A GETMBR R9 R0 K8 + 0x78260000, // 001B JMPF R9 #001D + 0x50240001, // 001C LDBOOL R9 0 1 + 0x50240200, // 001D LDBOOL R9 1 0 + 0x7C1C0400, // 001E CALL R7 2 + 0x501C0200, // 001F LDBOOL R7 1 0 + 0x80040E00, // 0020 RET 1 R7 + 0x80000000, // 0021 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index 79242c156..13635eaba 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -19,115 +19,112 @@ be_local_closure(Matter_Plugin_Bridge_Light1_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[15]) { /* constants */ + ( &(const bvalue[14]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(findsubval), - /* K7 */ be_nested_str_weak(set_bri), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(bri_X3A), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(set_onoff), - /* K14 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(findsubval), + /* K6 */ be_nested_str_weak(set_bri), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(bri_X3A), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(set_onoff), + /* K13 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[89]) { /* code */ + ( &(const binstruction[87]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0x88140702, // 0002 GETMBR R5 R3 K2 0x88180703, // 0003 GETMBR R6 R3 K3 0x541E0007, // 0004 LDINT R7 8 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E0047, // 0006 JMPF R7 #004F - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E000D, // 000A JMPF R7 #0019 - 0x8C1C0506, // 000B GETMET R7 R2 K6 - 0x58240005, // 000C LDCONST R9 K5 - 0x7C1C0400, // 000D CALL R7 2 - 0x8C200107, // 000E GETMET R8 R0 K7 - 0x5C280E00, // 000F MOVE R10 R7 - 0x7C200400, // 0010 CALL R8 2 - 0x60200008, // 0011 GETGBL R8 G8 - 0x5C240E00, // 0012 MOVE R9 R7 - 0x7C200200, // 0013 CALL R8 1 - 0x00221208, // 0014 ADD R8 K9 R8 - 0x900E1008, // 0015 SETMBR R3 K8 R8 - 0x50200200, // 0016 LDBOOL R8 1 0 - 0x80041000, // 0017 RET 1 R8 - 0x70020034, // 0018 JMP #004E - 0x1C1C0D0A, // 0019 EQ R7 R6 K10 - 0x781E0002, // 001A JMPF R7 #001E - 0x501C0200, // 001B LDBOOL R7 1 0 - 0x80040E00, // 001C RET 1 R7 - 0x7002002F, // 001D JMP #004E - 0x1C1C0D0B, // 001E EQ R7 R6 K11 - 0x781E0002, // 001F JMPF R7 #0023 - 0x501C0200, // 0020 LDBOOL R7 1 0 - 0x80040E00, // 0021 RET 1 R7 - 0x7002002A, // 0022 JMP #004E - 0x1C1C0D0C, // 0023 EQ R7 R6 K12 - 0x781E0002, // 0024 JMPF R7 #0028 - 0x501C0200, // 0025 LDBOOL R7 1 0 - 0x80040E00, // 0026 RET 1 R7 - 0x70020025, // 0027 JMP #004E - 0x541E0003, // 0028 LDINT R7 4 - 0x1C1C0C07, // 0029 EQ R7 R6 R7 - 0x781E0011, // 002A JMPF R7 #003D - 0x8C1C0506, // 002B GETMET R7 R2 K6 - 0x58240005, // 002C LDCONST R9 K5 - 0x7C1C0400, // 002D CALL R7 2 - 0x8C200107, // 002E GETMET R8 R0 K7 - 0x5C280E00, // 002F MOVE R10 R7 - 0x7C200400, // 0030 CALL R8 2 - 0x24200F05, // 0031 GT R8 R7 K5 - 0x8C24010D, // 0032 GETMET R9 R0 K13 - 0x5C2C1000, // 0033 MOVE R11 R8 - 0x7C240400, // 0034 CALL R9 2 - 0x60240008, // 0035 GETGBL R9 G8 - 0x5C280E00, // 0036 MOVE R10 R7 - 0x7C240200, // 0037 CALL R9 1 - 0x00261209, // 0038 ADD R9 K9 R9 - 0x900E1009, // 0039 SETMBR R3 K8 R9 - 0x50240200, // 003A LDBOOL R9 1 0 - 0x80041200, // 003B RET 1 R9 - 0x70020010, // 003C JMP #004E - 0x541E0004, // 003D LDINT R7 5 - 0x1C1C0C07, // 003E EQ R7 R6 R7 - 0x781E0002, // 003F JMPF R7 #0043 - 0x501C0200, // 0040 LDBOOL R7 1 0 - 0x80040E00, // 0041 RET 1 R7 - 0x7002000A, // 0042 JMP #004E - 0x541E0005, // 0043 LDINT R7 6 - 0x1C1C0C07, // 0044 EQ R7 R6 R7 - 0x781E0002, // 0045 JMPF R7 #0049 - 0x501C0200, // 0046 LDBOOL R7 1 0 - 0x80040E00, // 0047 RET 1 R7 - 0x70020004, // 0048 JMP #004E - 0x541E0006, // 0049 LDINT R7 7 - 0x1C1C0C07, // 004A EQ R7 R6 R7 - 0x781E0001, // 004B JMPF R7 #004E - 0x501C0200, // 004C LDBOOL R7 1 0 - 0x80040E00, // 004D RET 1 R7 - 0x70020008, // 004E JMP #0058 - 0x601C0003, // 004F GETGBL R7 G3 - 0x5C200000, // 0050 MOVE R8 R0 - 0x7C1C0200, // 0051 CALL R7 1 - 0x8C1C0F0E, // 0052 GETMET R7 R7 K14 - 0x5C240200, // 0053 MOVE R9 R1 - 0x5C280400, // 0054 MOVE R10 R2 - 0x5C2C0600, // 0055 MOVE R11 R3 - 0x7C1C0800, // 0056 CALL R7 4 - 0x80040E00, // 0057 RET 1 R7 - 0x80000000, // 0058 RET 0 + 0x781E0045, // 0006 JMPF R7 #004D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000D, // 0008 JMPF R7 #0017 + 0x8C1C0505, // 0009 GETMET R7 R2 K5 + 0x58240004, // 000A LDCONST R9 K4 + 0x7C1C0400, // 000B CALL R7 2 + 0x8C200106, // 000C GETMET R8 R0 K6 + 0x5C280E00, // 000D MOVE R10 R7 + 0x7C200400, // 000E CALL R8 2 + 0x60200008, // 000F GETGBL R8 G8 + 0x5C240E00, // 0010 MOVE R9 R7 + 0x7C200200, // 0011 CALL R8 1 + 0x00221008, // 0012 ADD R8 K8 R8 + 0x900E0E08, // 0013 SETMBR R3 K7 R8 + 0x50200200, // 0014 LDBOOL R8 1 0 + 0x80041000, // 0015 RET 1 R8 + 0x70020034, // 0016 JMP #004C + 0x1C1C0D09, // 0017 EQ R7 R6 K9 + 0x781E0002, // 0018 JMPF R7 #001C + 0x501C0200, // 0019 LDBOOL R7 1 0 + 0x80040E00, // 001A RET 1 R7 + 0x7002002F, // 001B JMP #004C + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0002, // 001D JMPF R7 #0021 + 0x501C0200, // 001E LDBOOL R7 1 0 + 0x80040E00, // 001F RET 1 R7 + 0x7002002A, // 0020 JMP #004C + 0x1C1C0D0B, // 0021 EQ R7 R6 K11 + 0x781E0002, // 0022 JMPF R7 #0026 + 0x501C0200, // 0023 LDBOOL R7 1 0 + 0x80040E00, // 0024 RET 1 R7 + 0x70020025, // 0025 JMP #004C + 0x541E0003, // 0026 LDINT R7 4 + 0x1C1C0C07, // 0027 EQ R7 R6 R7 + 0x781E0011, // 0028 JMPF R7 #003B + 0x8C1C0505, // 0029 GETMET R7 R2 K5 + 0x58240004, // 002A LDCONST R9 K4 + 0x7C1C0400, // 002B CALL R7 2 + 0x8C200106, // 002C GETMET R8 R0 K6 + 0x5C280E00, // 002D MOVE R10 R7 + 0x7C200400, // 002E CALL R8 2 + 0x24200F04, // 002F GT R8 R7 K4 + 0x8C24010C, // 0030 GETMET R9 R0 K12 + 0x5C2C1000, // 0031 MOVE R11 R8 + 0x7C240400, // 0032 CALL R9 2 + 0x60240008, // 0033 GETGBL R9 G8 + 0x5C280E00, // 0034 MOVE R10 R7 + 0x7C240200, // 0035 CALL R9 1 + 0x00261009, // 0036 ADD R9 K8 R9 + 0x900E0E09, // 0037 SETMBR R3 K7 R9 + 0x50240200, // 0038 LDBOOL R9 1 0 + 0x80041200, // 0039 RET 1 R9 + 0x70020010, // 003A JMP #004C + 0x541E0004, // 003B LDINT R7 5 + 0x1C1C0C07, // 003C EQ R7 R6 R7 + 0x781E0002, // 003D JMPF R7 #0041 + 0x501C0200, // 003E LDBOOL R7 1 0 + 0x80040E00, // 003F RET 1 R7 + 0x7002000A, // 0040 JMP #004C + 0x541E0005, // 0041 LDINT R7 6 + 0x1C1C0C07, // 0042 EQ R7 R6 R7 + 0x781E0002, // 0043 JMPF R7 #0047 + 0x501C0200, // 0044 LDBOOL R7 1 0 + 0x80040E00, // 0045 RET 1 R7 + 0x70020004, // 0046 JMP #004C + 0x541E0006, // 0047 LDINT R7 7 + 0x1C1C0C07, // 0048 EQ R7 R6 R7 + 0x781E0001, // 0049 JMPF R7 #004C + 0x501C0200, // 004A LDBOOL R7 1 0 + 0x80040E00, // 004B RET 1 R7 + 0x70020008, // 004C JMP #0056 + 0x601C0003, // 004D GETGBL R7 G3 + 0x5C200000, // 004E MOVE R8 R0 + 0x7C1C0200, // 004F CALL R7 1 + 0x8C1C0F0D, // 0050 GETMET R7 R7 K13 + 0x5C240200, // 0051 MOVE R9 R1 + 0x5C280400, // 0052 MOVE R10 R2 + 0x5C2C0600, // 0053 MOVE R11 R3 + 0x7C1C0800, // 0054 CALL R7 4 + 0x80040E00, // 0055 RET 1 R7 + 0x80000000, // 0056 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index b38775852..ca2c96879 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -260,86 +260,83 @@ be_local_closure(Matter_Plugin_Bridge_Light2_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_nested_str_weak(findsubval), - /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(ct_min), - /* K8 */ be_nested_str_weak(ct_max), - /* K9 */ be_nested_str_weak(set_ct), - /* K10 */ be_nested_str_weak(log), - /* K11 */ be_nested_str_weak(ct_X3A), - /* K12 */ be_nested_str_weak(invoke_request), + /* K4 */ be_nested_str_weak(findsubval), + /* K5 */ be_const_int(0), + /* K6 */ be_nested_str_weak(ct_min), + /* K7 */ be_nested_str_weak(ct_max), + /* K8 */ be_nested_str_weak(set_ct), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(ct_X3A), + /* K11 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[62]) { /* code */ + ( &(const binstruction[60]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0x88140702, // 0002 GETMBR R5 R3 K2 0x88180703, // 0003 GETMBR R6 R3 K3 0x541E02FF, // 0004 LDINT R7 768 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E002C, // 0006 JMPF R7 #0034 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x541E0009, // 0009 LDINT R7 10 - 0x1C1C0C07, // 000A EQ R7 R6 R7 - 0x781E0015, // 000B JMPF R7 #0022 - 0x8C1C0505, // 000C GETMET R7 R2 K5 - 0x58240006, // 000D LDCONST R9 K6 - 0x7C1C0400, // 000E CALL R7 2 - 0x88200107, // 000F GETMBR R8 R0 K7 - 0x14200E08, // 0010 LT R8 R7 R8 - 0x78220000, // 0011 JMPF R8 #0013 - 0x881C0107, // 0012 GETMBR R7 R0 K7 - 0x88200108, // 0013 GETMBR R8 R0 K8 - 0x24200E08, // 0014 GT R8 R7 R8 - 0x78220000, // 0015 JMPF R8 #0017 - 0x881C0108, // 0016 GETMBR R7 R0 K8 - 0x8C200109, // 0017 GETMET R8 R0 K9 - 0x5C280E00, // 0018 MOVE R10 R7 - 0x7C200400, // 0019 CALL R8 2 - 0x60200008, // 001A GETGBL R8 G8 - 0x5C240E00, // 001B MOVE R9 R7 - 0x7C200200, // 001C CALL R8 1 - 0x00221608, // 001D ADD R8 K11 R8 - 0x900E1408, // 001E SETMBR R3 K10 R8 - 0x50200200, // 001F LDBOOL R8 1 0 - 0x80041000, // 0020 RET 1 R8 - 0x70020010, // 0021 JMP #0033 - 0x541E0046, // 0022 LDINT R7 71 - 0x1C1C0C07, // 0023 EQ R7 R6 R7 - 0x781E0002, // 0024 JMPF R7 #0028 - 0x501C0200, // 0025 LDBOOL R7 1 0 - 0x80040E00, // 0026 RET 1 R7 - 0x7002000A, // 0027 JMP #0033 - 0x541E004A, // 0028 LDINT R7 75 - 0x1C1C0C07, // 0029 EQ R7 R6 R7 - 0x781E0002, // 002A JMPF R7 #002E - 0x501C0200, // 002B LDBOOL R7 1 0 - 0x80040E00, // 002C RET 1 R7 - 0x70020004, // 002D JMP #0033 - 0x541E004B, // 002E LDINT R7 76 - 0x1C1C0C07, // 002F EQ R7 R6 R7 - 0x781E0001, // 0030 JMPF R7 #0033 - 0x501C0200, // 0031 LDBOOL R7 1 0 - 0x80040E00, // 0032 RET 1 R7 - 0x70020008, // 0033 JMP #003D - 0x601C0003, // 0034 GETGBL R7 G3 - 0x5C200000, // 0035 MOVE R8 R0 - 0x7C1C0200, // 0036 CALL R7 1 - 0x8C1C0F0C, // 0037 GETMET R7 R7 K12 - 0x5C240200, // 0038 MOVE R9 R1 - 0x5C280400, // 0039 MOVE R10 R2 - 0x5C2C0600, // 003A MOVE R11 R3 - 0x7C1C0800, // 003B CALL R7 4 - 0x80040E00, // 003C RET 1 R7 - 0x80000000, // 003D RET 0 + 0x781E002A, // 0006 JMPF R7 #0032 + 0x541E0009, // 0007 LDINT R7 10 + 0x1C1C0C07, // 0008 EQ R7 R6 R7 + 0x781E0015, // 0009 JMPF R7 #0020 + 0x8C1C0504, // 000A GETMET R7 R2 K4 + 0x58240005, // 000B LDCONST R9 K5 + 0x7C1C0400, // 000C CALL R7 2 + 0x88200106, // 000D GETMBR R8 R0 K6 + 0x14200E08, // 000E LT R8 R7 R8 + 0x78220000, // 000F JMPF R8 #0011 + 0x881C0106, // 0010 GETMBR R7 R0 K6 + 0x88200107, // 0011 GETMBR R8 R0 K7 + 0x24200E08, // 0012 GT R8 R7 R8 + 0x78220000, // 0013 JMPF R8 #0015 + 0x881C0107, // 0014 GETMBR R7 R0 K7 + 0x8C200108, // 0015 GETMET R8 R0 K8 + 0x5C280E00, // 0016 MOVE R10 R7 + 0x7C200400, // 0017 CALL R8 2 + 0x60200008, // 0018 GETGBL R8 G8 + 0x5C240E00, // 0019 MOVE R9 R7 + 0x7C200200, // 001A CALL R8 1 + 0x00221408, // 001B ADD R8 K10 R8 + 0x900E1208, // 001C SETMBR R3 K9 R8 + 0x50200200, // 001D LDBOOL R8 1 0 + 0x80041000, // 001E RET 1 R8 + 0x70020010, // 001F JMP #0031 + 0x541E0046, // 0020 LDINT R7 71 + 0x1C1C0C07, // 0021 EQ R7 R6 R7 + 0x781E0002, // 0022 JMPF R7 #0026 + 0x501C0200, // 0023 LDBOOL R7 1 0 + 0x80040E00, // 0024 RET 1 R7 + 0x7002000A, // 0025 JMP #0031 + 0x541E004A, // 0026 LDINT R7 75 + 0x1C1C0C07, // 0027 EQ R7 R6 R7 + 0x781E0002, // 0028 JMPF R7 #002C + 0x501C0200, // 0029 LDBOOL R7 1 0 + 0x80040E00, // 002A RET 1 R7 + 0x70020004, // 002B JMP #0031 + 0x541E004B, // 002C LDINT R7 76 + 0x1C1C0C07, // 002D EQ R7 R6 R7 + 0x781E0001, // 002E JMPF R7 #0031 + 0x501C0200, // 002F LDBOOL R7 1 0 + 0x80040E00, // 0030 RET 1 R7 + 0x70020008, // 0031 JMP #003B + 0x601C0003, // 0032 GETGBL R7 G3 + 0x5C200000, // 0033 MOVE R8 R0 + 0x7C1C0200, // 0034 CALL R7 1 + 0x8C1C0F0B, // 0035 GETMET R7 R7 K11 + 0x5C240200, // 0036 MOVE R9 R1 + 0x5C280400, // 0037 MOVE R10 R2 + 0x5C2C0600, // 0038 MOVE R11 R3 + 0x7C1C0800, // 0039 CALL R7 4 + 0x80040E00, // 003A RET 1 R7 + 0x80000000, // 003B RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index c4ce2b977..e73b1bd35 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -308,135 +308,132 @@ be_local_closure(Matter_Plugin_Bridge_Light3_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[16]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(findsubval), - /* K7 */ be_nested_str_weak(set_hue), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(hue_X3A), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(2), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(set_sat), - /* K14 */ be_nested_str_weak(sat_X3A), - /* K15 */ be_nested_str_weak(_X20sat_X3A), - /* K16 */ be_nested_str_weak(invoke_request), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(findsubval), + /* K6 */ be_nested_str_weak(set_hue), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(hue_X3A), + /* K9 */ be_const_int(1), + /* K10 */ be_const_int(2), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(set_sat), + /* K13 */ be_nested_str_weak(sat_X3A), + /* K14 */ be_nested_str_weak(_X20sat_X3A), + /* K15 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ + ( &(const binstruction[105]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0x88140702, // 0002 GETMBR R5 R3 K2 0x88180703, // 0003 GETMBR R6 R3 K3 0x541E02FF, // 0004 LDINT R7 768 0x1C1C0A07, // 0005 EQ R7 R5 R7 - 0x781E0059, // 0006 JMPF R7 #0061 - 0x8C1C0104, // 0007 GETMET R7 R0 K4 - 0x7C1C0200, // 0008 CALL R7 1 - 0x1C1C0D05, // 0009 EQ R7 R6 K5 - 0x781E000D, // 000A JMPF R7 #0019 - 0x8C1C0506, // 000B GETMET R7 R2 K6 - 0x58240005, // 000C LDCONST R9 K5 - 0x7C1C0400, // 000D CALL R7 2 - 0x8C200107, // 000E GETMET R8 R0 K7 - 0x5C280E00, // 000F MOVE R10 R7 - 0x7C200400, // 0010 CALL R8 2 - 0x60200008, // 0011 GETGBL R8 G8 - 0x5C240E00, // 0012 MOVE R9 R7 - 0x7C200200, // 0013 CALL R8 1 - 0x00221208, // 0014 ADD R8 K9 R8 - 0x900E1008, // 0015 SETMBR R3 K8 R8 - 0x50200200, // 0016 LDBOOL R8 1 0 - 0x80041000, // 0017 RET 1 R8 - 0x70020046, // 0018 JMP #0060 - 0x1C1C0D0A, // 0019 EQ R7 R6 K10 - 0x781E0002, // 001A JMPF R7 #001E - 0x501C0200, // 001B LDBOOL R7 1 0 - 0x80040E00, // 001C RET 1 R7 - 0x70020041, // 001D JMP #0060 - 0x1C1C0D0B, // 001E EQ R7 R6 K11 - 0x781E0002, // 001F JMPF R7 #0023 - 0x501C0200, // 0020 LDBOOL R7 1 0 - 0x80040E00, // 0021 RET 1 R7 - 0x7002003C, // 0022 JMP #0060 - 0x1C1C0D0C, // 0023 EQ R7 R6 K12 - 0x781E000D, // 0024 JMPF R7 #0033 - 0x8C1C0506, // 0025 GETMET R7 R2 K6 - 0x58240005, // 0026 LDCONST R9 K5 - 0x7C1C0400, // 0027 CALL R7 2 - 0x8C20010D, // 0028 GETMET R8 R0 K13 - 0x5C280E00, // 0029 MOVE R10 R7 - 0x7C200400, // 002A CALL R8 2 - 0x60200008, // 002B GETGBL R8 G8 - 0x5C240E00, // 002C MOVE R9 R7 - 0x7C200200, // 002D CALL R8 1 - 0x00221C08, // 002E ADD R8 K14 R8 - 0x900E1008, // 002F SETMBR R3 K8 R8 - 0x50200200, // 0030 LDBOOL R8 1 0 - 0x80041000, // 0031 RET 1 R8 - 0x7002002C, // 0032 JMP #0060 - 0x541E0003, // 0033 LDINT R7 4 - 0x1C1C0C07, // 0034 EQ R7 R6 R7 - 0x781E0002, // 0035 JMPF R7 #0039 - 0x501C0200, // 0036 LDBOOL R7 1 0 - 0x80040E00, // 0037 RET 1 R7 - 0x70020026, // 0038 JMP #0060 - 0x541E0004, // 0039 LDINT R7 5 - 0x1C1C0C07, // 003A EQ R7 R6 R7 - 0x781E0002, // 003B JMPF R7 #003F - 0x501C0200, // 003C LDBOOL R7 1 0 - 0x80040E00, // 003D RET 1 R7 - 0x70020020, // 003E JMP #0060 - 0x541E0005, // 003F LDINT R7 6 - 0x1C1C0C07, // 0040 EQ R7 R6 R7 - 0x781E0018, // 0041 JMPF R7 #005B - 0x8C1C0506, // 0042 GETMET R7 R2 K6 - 0x58240005, // 0043 LDCONST R9 K5 - 0x7C1C0400, // 0044 CALL R7 2 - 0x8C200506, // 0045 GETMET R8 R2 K6 - 0x5828000A, // 0046 LDCONST R10 K10 - 0x7C200400, // 0047 CALL R8 2 - 0x8C240107, // 0048 GETMET R9 R0 K7 - 0x5C2C0E00, // 0049 MOVE R11 R7 - 0x7C240400, // 004A CALL R9 2 - 0x8C24010D, // 004B GETMET R9 R0 K13 - 0x5C2C1000, // 004C MOVE R11 R8 - 0x7C240400, // 004D CALL R9 2 - 0x60240008, // 004E GETGBL R9 G8 - 0x5C280E00, // 004F MOVE R10 R7 - 0x7C240200, // 0050 CALL R9 1 - 0x00261209, // 0051 ADD R9 K9 R9 - 0x0024130F, // 0052 ADD R9 R9 K15 - 0x60280008, // 0053 GETGBL R10 G8 - 0x5C2C1000, // 0054 MOVE R11 R8 - 0x7C280200, // 0055 CALL R10 1 - 0x0024120A, // 0056 ADD R9 R9 R10 - 0x900E1009, // 0057 SETMBR R3 K8 R9 - 0x50240200, // 0058 LDBOOL R9 1 0 - 0x80041200, // 0059 RET 1 R9 - 0x70020004, // 005A JMP #0060 - 0x541E0046, // 005B LDINT R7 71 - 0x1C1C0C07, // 005C EQ R7 R6 R7 - 0x781E0001, // 005D JMPF R7 #0060 - 0x501C0200, // 005E LDBOOL R7 1 0 - 0x80040E00, // 005F RET 1 R7 - 0x70020008, // 0060 JMP #006A - 0x601C0003, // 0061 GETGBL R7 G3 - 0x5C200000, // 0062 MOVE R8 R0 - 0x7C1C0200, // 0063 CALL R7 1 - 0x8C1C0F10, // 0064 GETMET R7 R7 K16 - 0x5C240200, // 0065 MOVE R9 R1 - 0x5C280400, // 0066 MOVE R10 R2 - 0x5C2C0600, // 0067 MOVE R11 R3 - 0x7C1C0800, // 0068 CALL R7 4 - 0x80040E00, // 0069 RET 1 R7 - 0x80000000, // 006A RET 0 + 0x781E0057, // 0006 JMPF R7 #005F + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000D, // 0008 JMPF R7 #0017 + 0x8C1C0505, // 0009 GETMET R7 R2 K5 + 0x58240004, // 000A LDCONST R9 K4 + 0x7C1C0400, // 000B CALL R7 2 + 0x8C200106, // 000C GETMET R8 R0 K6 + 0x5C280E00, // 000D MOVE R10 R7 + 0x7C200400, // 000E CALL R8 2 + 0x60200008, // 000F GETGBL R8 G8 + 0x5C240E00, // 0010 MOVE R9 R7 + 0x7C200200, // 0011 CALL R8 1 + 0x00221008, // 0012 ADD R8 K8 R8 + 0x900E0E08, // 0013 SETMBR R3 K7 R8 + 0x50200200, // 0014 LDBOOL R8 1 0 + 0x80041000, // 0015 RET 1 R8 + 0x70020046, // 0016 JMP #005E + 0x1C1C0D09, // 0017 EQ R7 R6 K9 + 0x781E0002, // 0018 JMPF R7 #001C + 0x501C0200, // 0019 LDBOOL R7 1 0 + 0x80040E00, // 001A RET 1 R7 + 0x70020041, // 001B JMP #005E + 0x1C1C0D0A, // 001C EQ R7 R6 K10 + 0x781E0002, // 001D JMPF R7 #0021 + 0x501C0200, // 001E LDBOOL R7 1 0 + 0x80040E00, // 001F RET 1 R7 + 0x7002003C, // 0020 JMP #005E + 0x1C1C0D0B, // 0021 EQ R7 R6 K11 + 0x781E000D, // 0022 JMPF R7 #0031 + 0x8C1C0505, // 0023 GETMET R7 R2 K5 + 0x58240004, // 0024 LDCONST R9 K4 + 0x7C1C0400, // 0025 CALL R7 2 + 0x8C20010C, // 0026 GETMET R8 R0 K12 + 0x5C280E00, // 0027 MOVE R10 R7 + 0x7C200400, // 0028 CALL R8 2 + 0x60200008, // 0029 GETGBL R8 G8 + 0x5C240E00, // 002A MOVE R9 R7 + 0x7C200200, // 002B CALL R8 1 + 0x00221A08, // 002C ADD R8 K13 R8 + 0x900E0E08, // 002D SETMBR R3 K7 R8 + 0x50200200, // 002E LDBOOL R8 1 0 + 0x80041000, // 002F RET 1 R8 + 0x7002002C, // 0030 JMP #005E + 0x541E0003, // 0031 LDINT R7 4 + 0x1C1C0C07, // 0032 EQ R7 R6 R7 + 0x781E0002, // 0033 JMPF R7 #0037 + 0x501C0200, // 0034 LDBOOL R7 1 0 + 0x80040E00, // 0035 RET 1 R7 + 0x70020026, // 0036 JMP #005E + 0x541E0004, // 0037 LDINT R7 5 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E0002, // 0039 JMPF R7 #003D + 0x501C0200, // 003A LDBOOL R7 1 0 + 0x80040E00, // 003B RET 1 R7 + 0x70020020, // 003C JMP #005E + 0x541E0005, // 003D LDINT R7 6 + 0x1C1C0C07, // 003E EQ R7 R6 R7 + 0x781E0018, // 003F JMPF R7 #0059 + 0x8C1C0505, // 0040 GETMET R7 R2 K5 + 0x58240004, // 0041 LDCONST R9 K4 + 0x7C1C0400, // 0042 CALL R7 2 + 0x8C200505, // 0043 GETMET R8 R2 K5 + 0x58280009, // 0044 LDCONST R10 K9 + 0x7C200400, // 0045 CALL R8 2 + 0x8C240106, // 0046 GETMET R9 R0 K6 + 0x5C2C0E00, // 0047 MOVE R11 R7 + 0x7C240400, // 0048 CALL R9 2 + 0x8C24010C, // 0049 GETMET R9 R0 K12 + 0x5C2C1000, // 004A MOVE R11 R8 + 0x7C240400, // 004B CALL R9 2 + 0x60240008, // 004C GETGBL R9 G8 + 0x5C280E00, // 004D MOVE R10 R7 + 0x7C240200, // 004E CALL R9 1 + 0x00261009, // 004F ADD R9 K8 R9 + 0x0024130E, // 0050 ADD R9 R9 K14 + 0x60280008, // 0051 GETGBL R10 G8 + 0x5C2C1000, // 0052 MOVE R11 R8 + 0x7C280200, // 0053 CALL R10 1 + 0x0024120A, // 0054 ADD R9 R9 R10 + 0x900E0E09, // 0055 SETMBR R3 K7 R9 + 0x50240200, // 0056 LDBOOL R9 1 0 + 0x80041200, // 0057 RET 1 R9 + 0x70020004, // 0058 JMP #005E + 0x541E0046, // 0059 LDINT R7 71 + 0x1C1C0C07, // 005A EQ R7 R6 R7 + 0x781E0001, // 005B JMPF R7 #005E + 0x501C0200, // 005C LDBOOL R7 1 0 + 0x80040E00, // 005D RET 1 R7 + 0x70020008, // 005E JMP #0068 + 0x601C0003, // 005F GETGBL R7 G3 + 0x5C200000, // 0060 MOVE R8 R0 + 0x7C1C0200, // 0061 CALL R7 1 + 0x8C1C0F0F, // 0062 GETMET R7 R7 K15 + 0x5C240200, // 0063 MOVE R9 R1 + 0x5C280400, // 0064 MOVE R10 R2 + 0x5C2C0600, // 0065 MOVE R11 R3 + 0x7C1C0800, // 0066 CALL R7 4 + 0x80040E00, // 0067 RET 1 R7 + 0x80000000, // 0068 RET 0 }) ) ); From 0502c15ce34c230d0b80bd178fc2e54be7871ee6 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 8 Jul 2023 15:05:03 +0200 Subject: [PATCH 053/150] Matter increase logs when storing sessions (#19073) --- lib/libesp32/berry_matter/src/embedded/Matter_Device.be | 2 +- .../berry_matter/src/embedded/Matter_Session_Store.be | 2 +- .../berry_matter/src/solidify/solidified_Matter_Device.h | 7 +++---- .../src/solidify/solidified_Matter_Session_Store.h | 7 +++---- 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 18f4ea142..aae3f1d2a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -644,7 +644,7 @@ class Matter_Device var f = open(self.FILENAME, "w") f.write(j) f.close() - tasmota.log(format("MTR: =Saved parameters%s", self.plugins_persist ? " and configuration" : ""), 3) + tasmota.log(format("MTR: =Saved parameters%s", self.plugins_persist ? " and configuration" : ""), 2) return j except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be index 0c979bb30..9acc749e0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be @@ -325,7 +325,7 @@ class Matter_Session_Store var f = open(self._FABRICS, "w") f.write(fabs) f.close() - tasmota.log(format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 3) + tasmota.log(format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 2) self.device.event_fabrics_saved() # signal event except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index a0efa7279..84342fa4a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -4181,7 +4181,7 @@ be_local_closure(Matter_Device_save_param, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[31]) { /* constants */ + ( &(const bvalue[30]) { /* constants */ /* K0 */ be_nested_str_weak(json), /* K1 */ be_nested_str_weak(update_remotes_info), /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), @@ -4209,10 +4209,9 @@ be_local_closure(Matter_Device_save_param, /* name */ /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), /* K25 */ be_nested_str_weak(_X20and_X20configuration), /* K26 */ be_nested_str_weak(), - /* K27 */ be_const_int(3), + /* K27 */ be_const_int(2), /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), /* K29 */ be_nested_str_weak(_X7C), - /* K30 */ be_const_int(2), }), be_str_weak(save_param), &be_const_str_solidified, @@ -4293,7 +4292,7 @@ be_local_closure(Matter_Device_save_param, /* name */ 0x5C240800, // 0049 MOVE R9 R4 0x7C200200, // 004A CALL R8 1 0x001C0E08, // 004B ADD R7 R7 R8 - 0x5820001E, // 004C LDCONST R8 K30 + 0x5820001B, // 004C LDCONST R8 K27 0x7C140600, // 004D CALL R5 3 0x80040400, // 004E RET 1 R2 0x70020000, // 004F JMP #0051 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index 662023413..b462b8ac3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -1164,7 +1164,7 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[26]) { /* constants */ /* K0 */ be_nested_str_weak(json), /* K1 */ be_nested_str_weak(remove_expired), /* K2 */ be_const_int(0), @@ -1186,12 +1186,11 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ /* K18 */ be_nested_str_weak(tasmota), /* K19 */ be_nested_str_weak(log), /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), - /* K21 */ be_const_int(3), + /* K21 */ be_const_int(2), /* K22 */ be_nested_str_weak(device), /* K23 */ be_nested_str_weak(event_fabrics_saved), /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), }), be_str_weak(save_fabrics), &be_const_str_solidified, @@ -1277,7 +1276,7 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0x5C200600, // 004E MOVE R8 R3 0x7C1C0200, // 004F CALL R7 1 0x00180C07, // 0050 ADD R6 R6 R7 - 0x581C001A, // 0051 LDCONST R7 K26 + 0x581C0015, // 0051 LDCONST R7 K21 0x7C100600, // 0052 CALL R4 3 0x70020000, // 0053 JMP #0055 0xB0080000, // 0054 RAISE 2 R0 R0 From f726c904ab0b9c630460b39fed14c887689fb229 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 8 Jul 2023 17:21:06 +0200 Subject: [PATCH 054/150] Enable ESP32 shutter driver Enable ESP32 shutter driver (#18295) --- .../tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino | 7 +------ tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 15 --------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index e056ce629..ca10aa92a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -17,12 +17,7 @@ along with this program. If not, see . */ -// Start temporarly extra tests for overriding USE_SHUTTER_ESP32 **** -// Remove once tests complete -#if defined(ESP32) && defined(USE_SHUTTER_ESP32) -// End ************************************************************** - -//#ifdef ESP32 +#ifdef ESP32 #ifdef USE_SHUTTER /*********************************************************************************************\ * Shutter or Blind support using two consecutive relays diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index 76a03da9b..f6fe28a40 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -17,22 +17,7 @@ along with this program. If not, see . */ -// Start temporarly extra tests for overriding USE_SHUTTER_ESP32 **** -// Remove once tests complete #ifdef ESP8266 -#define USE_SHUTTER_ESP8266 -#endif - -#ifdef ESP32 -#ifndef USE_SHUTTER_ESP32 -#define USE_SHUTTER_ESP8266 -#endif // No USE_SHUTTER_ESP32 -#endif // ESP32 - -#ifdef USE_SHUTTER_ESP8266 -// End ************************************************************** - -//#ifdef ESP8266 #ifdef USE_SHUTTER /*********************************************************************************************\ * Shutter or Blind support using two consecutive relays From ac4c4505a56782c2780118eed755befd73e430de Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 8 Jul 2023 17:37:12 +0200 Subject: [PATCH 055/150] Bump version v13.0.0.2 Update changelogs --- CHANGELOG.md | 22 +++++++++++++++++----- RELEASENOTES.md | 7 ++++++- tasmota/include/tasmota_types.h | 2 +- tasmota/include/tasmota_version.h | 2 +- tools/decode-status.py | 3 ++- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2bd5e8fd8..d30a5273d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,15 +3,27 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [13.0.0.1] +## [13.0.0.2] +### Added +- Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) + +### Breaking Changed + +### Changed +- ESP32 shutter driver support up to 16 shutters (#18295) + +### Fixed + +### Removed + +## [13.0.0.1] 20230708 ### Added - Command ``Delay -1`` to wait until next second (#18984) - Matter add option to disable bridge mode (#18992) - Support for SGP41 TVOC/NOx Sensor (#18880) - Command ``BrRestart`` to restart the Berry VM (experimental) (#19003) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset (#19024) -- Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) -- Berry added `getgbl` performance counter to `debug.counters()` +- Berry added `getgbl` performance counter to `debug.counters()` (#19070) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` (#18986) @@ -19,9 +31,9 @@ All notable changes to this project will be documented in this file. ### Changed - Matter support for temperature in Fahrenheit (`SetOption8 1`) (#18987) -- Matter improve responsiveness +- Matter improve responsiveness (#19002) - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) -- Matter improve latency for remote commands +- Matter improve latency for remote commands (#19072) ### Fixed - Berry various fixes for Walrus Operator (#18982) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 1e3326770..7dae07e29 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,12 +110,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v13.0.0.1 +## Changelog v13.0.0.2 ### Added - Command ``BrRestart`` to restart the Berry VM (experimental) [#19003](https://github.com/arendst/Tasmota/issues/19003) - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) +- Berry added `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) @@ -124,7 +125,11 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Berry `import strict` now detects useless expression without side effects [#18997](https://github.com/arendst/Tasmota/issues/18997) ### Changed +- ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) +- ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) +- Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) +- Matter improve latency for remote commands [#19072](https://github.com/arendst/Tasmota/issues/19072) ### Fixed - Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index eac333b77..71176d653 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -188,7 +188,7 @@ typedef union { // Restricted by MISRA-C Rule 18.4 bu uint32_t bistable_single_pin : 1; // bit 6 (v12.5.0.1) - SetOption152 - (Power) Switch between two (0) or one (1) pin bistable relay control uint32_t berry_no_autoexec : 1; // bit 7 (v12.5.0.3) - SetOption153 - (Berry) Disable autoexec.be on restart (1) uint32_t berry_light_scheme : 1; // bit 8 (v12.5.0.3) - SetOption154 - (Berry) Handle berry led using RMT0 as additional WS2812 scheme - uint32_t zcfallingedge : 1; // bit 9 (v12.5.0.4) - SetOption155 - ZC Dimmer enable rare falling Edge dimmer instead of leading edge + uint32_t zcfallingedge : 1; // bit 9 (v13.0.0.1) - SetOption155 - (ZCDimmer) Enable rare falling Edge dimmer instead of leading edge uint32_t spare10 : 1; // bit 10 uint32_t spare11 : 1; // bit 11 uint32_t spare12 : 1; // bit 12 diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 5e9cb1eb8..6dfd360a2 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0D000001; // 13.0.0.1 +const uint32_t VERSION = 0x0D000002; // 13.0.0.2 #endif // _TASMOTA_VERSION_H_ diff --git a/tools/decode-status.py b/tools/decode-status.py index 5e68116b5..1102360cd 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -209,7 +209,8 @@ a_setoption = [[ "(Matter) Enable Matter protocol over Wifi", "(Power) Switch between two (0) or one (1) pin bistable relay control", "(Berry) Disable autoexec.be on restart (1)", - "","","","", + "(ZCDimmer) Enable rare falling Edge dimmer instead of leading edge", + "","","", "","","","", "","","","", "","","","", From 05d589f2d74256419bb74688f08e721ebdcddaa1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 8 Jul 2023 18:04:13 +0200 Subject: [PATCH 056/150] Set ESP32-C3 max supported ADC channels to 5 --- tasmota/include/tasmota.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index 9eae7a409..60ce13c13 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -138,7 +138,11 @@ const uint8_t MAX_ADCS = 1; // Max number of ESP8266 ADC pins const uint8_t MAX_SWITCHES_TXT = 8; // Max number of switches user text #endif // ESP8266 #ifdef ESP32 +#ifdef CONFIG_IDF_TARGET_ESP32C3 +const uint8_t MAX_ADCS = 5; // Max number of ESP32-C3 ADC pins (ADC2 pins are unusable with Wifi enabled) +#else // ESP32 const uint8_t MAX_ADCS = 8; // Max number of ESP32 ADC pins (ADC2 pins are unusable with Wifi enabled) +#endif // ESP32C3 const uint8_t MAX_SWITCHES_TXT = 28; // Max number of switches user text #endif // ESP32 From 8d161d04f7dbf0b42c570f24a5f3114840d73bc2 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 8 Jul 2023 18:58:44 +0200 Subject: [PATCH 057/150] Matter add mini-profiler (#19075) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Device.be | 4 +- .../berry_matter/src/embedded/Matter_IM.be | 2 + .../src/embedded/Matter_MessageHandler.be | 3 + .../src/embedded/Matter_Profiler.be | 73 + .../src/embedded/Matter_UDPServer.be | 8 +- .../src/solidify/solidified_Matter_Device.h | 7990 +++++++++-------- .../src/solidify/solidified_Matter_IM.h | 718 +- .../solidified_Matter_MessageHandler.h | 811 +- .../src/solidify/solidified_Matter_Profiler.h | 270 + .../solidify/solidified_Matter_UDPServer.h | 711 +- 12 files changed, 5508 insertions(+), 5085 deletions(-) create mode 100644 lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be create mode 100644 lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h diff --git a/CHANGELOG.md b/CHANGELOG.md index d30a5273d..2b1d8d833 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.2] ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) +- Matter add mini-profiler ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 8fa29d934..92374140b 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -204,6 +204,7 @@ extern const bclass be_class_Matter_TLV; // need to declare it upfront because #include "solidify/solidified_Matter_Base38.h" #include "solidify/solidified_Matter_UI.h" #include "solidify/solidified_Matter_Device.h" +#include "solidify/solidified_Matter_Profiler.h" #include "../generate/be_matter_certs.h" @@ -287,6 +288,7 @@ module matter (scope: global, strings: weak) { sort, closure(matter_sort_closure) jitter, closure(matter_jitter_closure) inspect, closure(matter_inspect_closure) + Profiler, class(be_class_Matter_Profiler) // Status codes SUCCESS, int(0x00) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index aae3f1d2a..4a9664c46 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -35,6 +35,7 @@ class Matter_Device var plugins_config # map of JSON configuration for plugins var plugins_config_remotes # map of information on each remote under "remotes" key, '{}' when empty var udp_server # `matter.UDPServer()` object + var profiler var message_handler # `matter.MessageHandler()` object var sessions # `matter.Session_Store()` objet var ui @@ -80,6 +81,7 @@ class Matter_Device return end # abort if SetOption 151 is not set + self.profiler = matter.Profiler() self.started = false self.tick = 0 self.plugins = [] @@ -381,7 +383,7 @@ class Matter_Device if self.udp_server return end # already started if port == nil port = 5540 end tasmota.log("MTR: Starting UDP server on port: " + str(port), 2) - self.udp_server = matter.UDPServer("", port) + self.udp_server = matter.UDPServer(self, "", port) self.udp_server.start(/ raw, addr, port -> self.msg_received(raw, addr, port)) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index c30668b6c..399f77c05 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -330,6 +330,7 @@ class Matter_IM # returns `true` if processed, `false` if silently ignored, # or raises an exception def process_read_request(msg, val) + self.device.profiler.log("read_request_start") var query = matter.ReadRequestMessage().from_TLV(val) if query.attributes_requests != nil var ret = self._inner_process_read_request(msg.session, query) @@ -383,6 +384,7 @@ class Matter_IM # import debug # structure is `ReadRequestMessage` 10.6.2 p.558 # tasmota.log("MTR: IM:invoke_request processing start", 4) + self.device.profiler.log("invoke_request_start") var ctx = matter.Path() ctx.msg = msg diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be index 33ae1b95a..6f64a8671 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be @@ -76,6 +76,7 @@ class Matter_MessageHandler def msg_received(raw, addr, port) var ret = false + self.device.profiler.log("msg_received") try # tasmota.log("MTR: MessageHandler::msg_received raw="+raw.tohex(), 4) var frame = matter.Frame(self, raw, addr, port) @@ -174,6 +175,7 @@ class Matter_MessageHandler elif protocol_id == 0x0001 # PROTOCOL_ID_INTERACTION_MODEL # dispatch to IM Protocol Messages ret = self.im.process_incoming(frame) + self.device.profiler.log("process_IM_end") # if `ret` is true, we have something to send if ret self.im.send_enqueued(self) @@ -220,6 +222,7 @@ class Matter_MessageHandler # msg.exchange_id: exchange id (int) # msg.local_session_id: local session (for logging) def send_response_frame(msg) + self.device.profiler.log("send_response_frame") self.device.msg_send(msg) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be b/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be new file mode 100644 index 000000000..7f6f07231 --- /dev/null +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be @@ -0,0 +1,73 @@ +# +# Matter_Profiler.be - suppport for Matter profiler framework +# +# Copyright (C) 2023 Stephan Hadinger & Theo Arends +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# + +import matter + +#@ solidify:Matter_Profiler,weak + +################################################################################# +# Matter_Profiler +# +# Used to store all the elements of the reponse to an attribute or command +################################################################################# +class Matter_Profiler + static var PREALLOCATED = 50 + var millis + var names + var active + + def init() + self.active = false + self.millis = list() + self.millis.resize(self.PREALLOCATED) + self.names = list() + self.names.resize(self.PREALLOCATED) + end + + def set_active(v) + self.active = bool(v) + end + + def start() + if !self.active return end + self.millis.resize(0) + self.names.resize(0) + self.log("start") + end + + def log(name) + if !self.active return end + self.millis.push(tasmota.millis()) + self.names.push(name) + end + + def dump(loglevel) + if !self.active return end + self.log("<--end-->") + tasmota.log("MTR: Profiler dump:", loglevel) + var origin = self.millis[0] + var idx = 1 + while idx < size(self.millis) + tasmota.log(f"MTR: {self.millis[idx] - origin:4i} '{self.names[idx]}'", loglevel) + idx += 1 + end + end + +end +matter.Profiler = Matter_Profiler diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be index 9b10c899f..5bc75e08a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be @@ -66,6 +66,7 @@ class Matter_UDPServer static var RETRIES = 5 # 6 transmissions max (5 retries) - 1 more than spec `MRP_MAX_TRANSMISSIONS` 4.11.8 p.146 static var MAX_PACKETS_READ = 4 # read at most 4 packets per tick var addr, port # local addr and port + var device var listening # true if active var udp_socket var dispatch_cb # callback to call when a message is received @@ -76,7 +77,8 @@ class Matter_UDPServer # Init UDP Server listening to `addr` and `port` (opt). # # By default, the server listens to `""` (all addresses) and port `5540` - def init(addr, port) + def init(device, addr, port) + self.device = device self.addr = addr ? addr : "" self.port = port ? port : 5540 self.listening = false @@ -121,19 +123,23 @@ class Matter_UDPServer # Then resend queued outgoing packets. def loop() # import debug + var profiler = self.device.profiler var packet_read = 0 if self.udp_socket == nil return end var packet = self.udp_socket.read() while packet != nil # self.packet = packet + profiler.start() packet_read += 1 var from_addr = self.udp_socket.remote_ip var from_port = self.udp_socket.remote_port tasmota.log(format("MTR: UDP received from [%s]:%i", from_addr, from_port), 4) # tasmota.log("MTR: Perf/UDP_received = " + str(debug.counters()), 4) if self.dispatch_cb + profiler.log("udp_loop_dispatch") self.dispatch_cb(packet, from_addr, from_port) end + profiler.dump(2) # are we reading new packets? if packet_read < self.MAX_PACKETS_READ packet = self.udp_socket.read() diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 84342fa4a..161e6a06d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,9 +7,258 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: register_plugin_class +** Solidified function: autoconf_sensors_list ********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ +be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(k2l), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(Temperature), + /* K3 */ be_nested_str_weak(_X23Temperature), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(type), + /* K6 */ be_nested_str_weak(temperature), + /* K7 */ be_nested_str_weak(filter), + /* K8 */ be_nested_str_weak(stop_iteration), + /* K9 */ be_nested_str_weak(Pressure), + /* K10 */ be_nested_str_weak(_X23Pressure), + /* K11 */ be_nested_str_weak(pressure), + /* K12 */ be_nested_str_weak(Illuminance), + /* K13 */ be_nested_str_weak(_X23Illuminance), + /* K14 */ be_nested_str_weak(illuminance), + /* K15 */ be_nested_str_weak(Humidity), + /* K16 */ be_nested_str_weak(_X23Humidity), + /* K17 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_sensors_list), + &be_const_str_solidified, + ( &(const binstruction[119]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100100, // 0003 GETMET R4 R0 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020013, // 0007 EXBLK 0 #001C + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x94140204, // 000A GETIDX R5 R1 R4 + 0x6018000F, // 000B GETGBL R6 G15 + 0x5C1C0A00, // 000C MOVE R7 R5 + 0x60200013, // 000D GETGBL R8 G19 + 0x7C180400, // 000E CALL R6 2 + 0x781A000A, // 000F JMPF R6 #001B + 0x8C180B01, // 0010 GETMET R6 R5 K1 + 0x58200002, // 0011 LDCONST R8 K2 + 0x7C180400, // 0012 CALL R6 2 + 0x781A0006, // 0013 JMPF R6 #001B + 0x00180903, // 0014 ADD R6 R4 K3 + 0x8C1C0504, // 0015 GETMET R7 R2 K4 + 0x60240013, // 0016 GETGBL R9 G19 + 0x7C240000, // 0017 CALL R9 0 + 0x98260B06, // 0018 SETIDX R9 K5 K6 + 0x98260E06, // 0019 SETIDX R9 K7 R6 + 0x7C1C0400, // 001A CALL R7 2 + 0x7001FFEB, // 001B JMP #0008 + 0x580C0008, // 001C LDCONST R3 K8 + 0xAC0C0200, // 001D CATCH R3 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x600C0010, // 001F GETGBL R3 G16 + 0x8C100100, // 0020 GETMET R4 R0 K0 + 0x5C180200, // 0021 MOVE R6 R1 + 0x7C100400, // 0022 CALL R4 2 + 0x7C0C0200, // 0023 CALL R3 1 + 0xA8020013, // 0024 EXBLK 0 #0039 + 0x5C100600, // 0025 MOVE R4 R3 + 0x7C100000, // 0026 CALL R4 0 + 0x94140204, // 0027 GETIDX R5 R1 R4 + 0x6018000F, // 0028 GETGBL R6 G15 + 0x5C1C0A00, // 0029 MOVE R7 R5 + 0x60200013, // 002A GETGBL R8 G19 + 0x7C180400, // 002B CALL R6 2 + 0x781A000A, // 002C JMPF R6 #0038 + 0x8C180B01, // 002D GETMET R6 R5 K1 + 0x58200009, // 002E LDCONST R8 K9 + 0x7C180400, // 002F CALL R6 2 + 0x781A0006, // 0030 JMPF R6 #0038 + 0x0018090A, // 0031 ADD R6 R4 K10 + 0x8C1C0504, // 0032 GETMET R7 R2 K4 + 0x60240013, // 0033 GETGBL R9 G19 + 0x7C240000, // 0034 CALL R9 0 + 0x98260B0B, // 0035 SETIDX R9 K5 K11 + 0x98260E06, // 0036 SETIDX R9 K7 R6 + 0x7C1C0400, // 0037 CALL R7 2 + 0x7001FFEB, // 0038 JMP #0025 + 0x580C0008, // 0039 LDCONST R3 K8 + 0xAC0C0200, // 003A CATCH R3 1 0 + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x600C0010, // 003C GETGBL R3 G16 + 0x8C100100, // 003D GETMET R4 R0 K0 + 0x5C180200, // 003E MOVE R6 R1 + 0x7C100400, // 003F CALL R4 2 + 0x7C0C0200, // 0040 CALL R3 1 + 0xA8020013, // 0041 EXBLK 0 #0056 + 0x5C100600, // 0042 MOVE R4 R3 + 0x7C100000, // 0043 CALL R4 0 + 0x94140204, // 0044 GETIDX R5 R1 R4 + 0x6018000F, // 0045 GETGBL R6 G15 + 0x5C1C0A00, // 0046 MOVE R7 R5 + 0x60200013, // 0047 GETGBL R8 G19 + 0x7C180400, // 0048 CALL R6 2 + 0x781A000A, // 0049 JMPF R6 #0055 + 0x8C180B01, // 004A GETMET R6 R5 K1 + 0x5820000C, // 004B LDCONST R8 K12 + 0x7C180400, // 004C CALL R6 2 + 0x781A0006, // 004D JMPF R6 #0055 + 0x0018090D, // 004E ADD R6 R4 K13 + 0x8C1C0504, // 004F GETMET R7 R2 K4 + 0x60240013, // 0050 GETGBL R9 G19 + 0x7C240000, // 0051 CALL R9 0 + 0x98260B0E, // 0052 SETIDX R9 K5 K14 + 0x98260E06, // 0053 SETIDX R9 K7 R6 + 0x7C1C0400, // 0054 CALL R7 2 + 0x7001FFEB, // 0055 JMP #0042 + 0x580C0008, // 0056 LDCONST R3 K8 + 0xAC0C0200, // 0057 CATCH R3 1 0 + 0xB0080000, // 0058 RAISE 2 R0 R0 + 0x600C0010, // 0059 GETGBL R3 G16 + 0x8C100100, // 005A GETMET R4 R0 K0 + 0x5C180200, // 005B MOVE R6 R1 + 0x7C100400, // 005C CALL R4 2 + 0x7C0C0200, // 005D CALL R3 1 + 0xA8020013, // 005E EXBLK 0 #0073 + 0x5C100600, // 005F MOVE R4 R3 + 0x7C100000, // 0060 CALL R4 0 + 0x94140204, // 0061 GETIDX R5 R1 R4 + 0x6018000F, // 0062 GETGBL R6 G15 + 0x5C1C0A00, // 0063 MOVE R7 R5 + 0x60200013, // 0064 GETGBL R8 G19 + 0x7C180400, // 0065 CALL R6 2 + 0x781A000A, // 0066 JMPF R6 #0072 + 0x8C180B01, // 0067 GETMET R6 R5 K1 + 0x5820000F, // 0068 LDCONST R8 K15 + 0x7C180400, // 0069 CALL R6 2 + 0x781A0006, // 006A JMPF R6 #0072 + 0x00180910, // 006B ADD R6 R4 K16 + 0x8C1C0504, // 006C GETMET R7 R2 K4 + 0x60240013, // 006D GETGBL R9 G19 + 0x7C240000, // 006E CALL R9 0 + 0x98260B11, // 006F SETIDX R9 K5 K17 + 0x98260E06, // 0070 SETIDX R9 K7 R6 + 0x7C1C0400, // 0071 CALL R7 2 + 0x7001FFEB, // 0072 JMP #005F + 0x580C0008, // 0073 LDCONST R3 K8 + 0xAC0C0200, // 0074 CATCH R3 1 0 + 0xB0080000, // 0075 RAISE 2 R0 R0 + 0x80040400, // 0076 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _start_udp +********************************************************************/ +be_local_closure(Matter_Device__start_udp, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(msg_received), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), + }), + be_str_weak(_start_udp), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x5C100000, // 0011 MOVE R4 R0 + 0x58140007, // 0012 LDCONST R5 K7 + 0x5C180200, // 0013 MOVE R6 R1 + 0x7C080800, // 0014 CALL R2 4 + 0x90020002, // 0015 SETMBR R0 K0 R2 + 0x88080100, // 0016 GETMBR R2 R0 K0 + 0x8C080508, // 0017 GETMET R2 R2 K8 + 0x84100000, // 0018 CLOSURE R4 P0 + 0x7C080400, // 0019 CALL R2 2 + 0xA0000000, // 001A CLOSE R0 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ be_nested_proto( 7, /* nstack */ 2, /* argc */ @@ -19,24 +268,244 @@ be_local_closure(Matter_Device_register_plugin_class, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(stop_basic_commissioning), + /* K3 */ be_nested_str_weak(root_w0), + /* K4 */ be_nested_str_weak(root_L), + /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), }), - be_str_weak(register_plugin_class), + be_str_weak(start_operational_discovery), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ + ( &(const binstruction[12]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x4C100000, // 0004 LDNIL R4 + 0x90020604, // 0005 SETMBR R0 K3 R4 + 0x4C100000, // 0006 LDNIL R4 + 0x90020804, // 0007 SETMBR R0 K4 R4 + 0x8C100105, // 0008 GETMET R4 R0 K5 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C100400, // 000A CALL R4 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[35]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(FILENAME), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_nested_str_weak(close), + /* K4 */ be_nested_str_weak(json), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(root_discriminator), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(distinguish), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(passcode), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(disable_bridge_mode), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(plugins_config_remotes), + /* K24 */ be_nested_str_weak(remotes), + /* K25 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), + /* K26 */ be_nested_str_weak(io_error), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K28 */ be_nested_str_weak(_X7C), + /* K29 */ be_const_int(2), + /* K30 */ be_nested_str_weak(random), + /* K31 */ be_nested_str_weak(get), + /* K32 */ be_const_int(0), + /* K33 */ be_nested_str_weak(generate_random_passcode), + /* K34 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[127]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA802004D, // 0001 EXBLK 0 #0050 + 0x60080011, // 0002 GETGBL R2 G17 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x7C080200, // 0004 CALL R2 1 + 0x8C0C0502, // 0005 GETMET R3 R2 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x8C100503, // 0007 GETMET R4 R2 K3 + 0x7C100200, // 0008 CALL R4 1 + 0xA4120800, // 0009 IMPORT R4 K4 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C140400, // 000C CALL R5 2 + 0x8C180B07, // 000D GETMET R6 R5 K7 + 0x58200008, // 000E LDCONST R8 K8 + 0x88240106, // 000F GETMBR R9 R0 K6 + 0x7C180600, // 0010 CALL R6 3 + 0x90020C06, // 0011 SETMBR R0 K6 R6 + 0x8C180B07, // 0012 GETMET R6 R5 K7 + 0x5820000A, // 0013 LDCONST R8 K10 + 0x88240109, // 0014 GETMBR R9 R0 K9 + 0x7C180600, // 0015 CALL R6 3 + 0x90021206, // 0016 SETMBR R0 K9 R6 + 0x60180017, // 0017 GETGBL R6 G23 + 0x8C1C0B07, // 0018 GETMET R7 R5 K7 + 0x5824000B, // 0019 LDCONST R9 K11 + 0x50280000, // 001A LDBOOL R10 0 0 + 0x7C1C0600, // 001B CALL R7 3 + 0x7C180200, // 001C CALL R6 1 + 0x90021606, // 001D SETMBR R0 K11 R6 + 0x60180017, // 001E GETGBL R6 G23 + 0x8C1C0B07, // 001F GETMET R7 R5 K7 + 0x5824000C, // 0020 LDCONST R9 K12 + 0x50280000, // 0021 LDBOOL R10 0 0 + 0x7C1C0600, // 0022 CALL R7 3 + 0x7C180200, // 0023 CALL R6 1 + 0x90021806, // 0024 SETMBR R0 K12 R6 + 0x8C180B07, // 0025 GETMET R6 R5 K7 + 0x5820000E, // 0026 LDCONST R8 K14 + 0x8824010D, // 0027 GETMBR R9 R0 K13 + 0x7C180600, // 0028 CALL R6 3 + 0x90021A06, // 0029 SETMBR R0 K13 R6 + 0x8C180B07, // 002A GETMET R6 R5 K7 + 0x58200010, // 002B LDCONST R8 K16 + 0x7C180400, // 002C CALL R6 2 + 0x90021E06, // 002D SETMBR R0 K15 R6 + 0x8818010F, // 002E GETMBR R6 R0 K15 + 0x4C1C0000, // 002F LDNIL R7 + 0x20180C07, // 0030 NE R6 R6 R7 + 0x781A000B, // 0031 JMPF R6 #003E + 0xB81A2200, // 0032 GETNGBL R6 K17 + 0x8C180D12, // 0033 GETMET R6 R6 K18 + 0x60200008, // 0034 GETGBL R8 G8 + 0x8824010F, // 0035 GETMBR R9 R0 K15 + 0x7C200200, // 0036 CALL R8 1 + 0x00222608, // 0037 ADD R8 K19 R8 + 0x58240014, // 0038 LDCONST R9 K20 + 0x7C180600, // 0039 CALL R6 3 + 0x8C180115, // 003A GETMET R6 R0 K21 + 0x7C180200, // 003B CALL R6 1 + 0x50180200, // 003C LDBOOL R6 1 0 + 0x90022C06, // 003D SETMBR R0 K22 R6 + 0x8C180B07, // 003E GETMET R6 R5 K7 + 0x58200018, // 003F LDCONST R8 K24 + 0x60240013, // 0040 GETGBL R9 G19 + 0x7C240000, // 0041 CALL R9 0 + 0x7C180600, // 0042 CALL R6 3 + 0x90022E06, // 0043 SETMBR R0 K23 R6 + 0x88180117, // 0044 GETMBR R6 R0 K23 + 0x781A0007, // 0045 JMPF R6 #004E + 0xB81A2200, // 0046 GETNGBL R6 K17 + 0x8C180D12, // 0047 GETMET R6 R6 K18 + 0x60200008, // 0048 GETGBL R8 G8 + 0x88240117, // 0049 GETMBR R9 R0 K23 + 0x7C200200, // 004A CALL R8 1 + 0x00223208, // 004B ADD R8 K25 R8 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C180600, // 004D CALL R6 3 + 0xA8040001, // 004E EXBLK 1 1 + 0x70020012, // 004F JMP #0063 + 0xAC080002, // 0050 CATCH R2 0 2 + 0x7002000F, // 0051 JMP #0062 + 0x2010051A, // 0052 NE R4 R2 K26 + 0x7812000C, // 0053 JMPF R4 #0061 + 0xB8122200, // 0054 GETNGBL R4 K17 + 0x8C100912, // 0055 GETMET R4 R4 K18 + 0x60180008, // 0056 GETGBL R6 G8 + 0x5C1C0400, // 0057 MOVE R7 R2 + 0x7C180200, // 0058 CALL R6 1 + 0x001A3606, // 0059 ADD R6 K27 R6 + 0x00180D1C, // 005A ADD R6 R6 K28 + 0x601C0008, // 005B GETGBL R7 G8 + 0x5C200600, // 005C MOVE R8 R3 + 0x7C1C0200, // 005D CALL R7 1 + 0x00180C07, // 005E ADD R6 R6 R7 + 0x581C001D, // 005F LDCONST R7 K29 + 0x7C100600, // 0060 CALL R4 3 + 0x70020000, // 0061 JMP #0063 + 0xB0080000, // 0062 RAISE 2 R0 R0 + 0x50080000, // 0063 LDBOOL R2 0 0 + 0x880C0106, // 0064 GETMBR R3 R0 K6 + 0x4C100000, // 0065 LDNIL R4 + 0x1C0C0604, // 0066 EQ R3 R3 R4 + 0x780E000A, // 0067 JMPF R3 #0073 + 0x8C0C031E, // 0068 GETMET R3 R1 K30 + 0x5814001D, // 0069 LDCONST R5 K29 + 0x7C0C0400, // 006A CALL R3 2 + 0x8C0C071F, // 006B GETMET R3 R3 K31 + 0x58140020, // 006C LDCONST R5 K32 + 0x5818001D, // 006D LDCONST R6 K29 + 0x7C0C0600, // 006E CALL R3 3 + 0x54120FFE, // 006F LDINT R4 4095 + 0x2C0C0604, // 0070 AND R3 R3 R4 + 0x90020C03, // 0071 SETMBR R0 K6 R3 + 0x50080200, // 0072 LDBOOL R2 1 0 + 0x880C0109, // 0073 GETMBR R3 R0 K9 + 0x4C100000, // 0074 LDNIL R4 + 0x1C0C0604, // 0075 EQ R3 R3 R4 + 0x780E0003, // 0076 JMPF R3 #007B + 0x8C0C0121, // 0077 GETMET R3 R0 K33 + 0x7C0C0200, // 0078 CALL R3 1 + 0x90021203, // 0079 SETMBR R0 K9 R3 + 0x50080200, // 007A LDBOOL R2 1 0 + 0x780A0001, // 007B JMPF R2 #007E + 0x8C0C0122, // 007C GETMET R3 R0 K34 + 0x7C0C0200, // 007D CALL R3 1 + 0x80000000, // 007E RET 0 }) ) ); @@ -75,11 +544,11 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /******************************************************************** -** Solidified function: is_commissioning_open +** Solidified function: every_second ********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ +be_local_closure(Matter_Device_every_second, /* name */ be_nested_proto( - 3, /* nstack */ + 4, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -87,16 +556,35 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), }), - be_str_weak(is_commissioning_open), + be_str_weak(every_second), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ + ( &(const binstruction[18]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 }) ) ); @@ -104,11 +592,122 @@ be_local_closure(Matter_Device_is_commissioning_open, /* name */ /******************************************************************** -** Solidified function: mdns_remove_PASE +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ +be_local_closure(Matter_Device_received_ack, /* name */ be_nested_proto( - 10, /* nstack */ + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -116,113 +715,409 @@ be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(mdns_pase_eth), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K5 */ be_nested_str_weak(_matterc), - /* K6 */ be_nested_str_weak(_udp), - /* K7 */ be_nested_str_weak(commissioning_instance_eth), - /* K8 */ be_nested_str_weak(hostname_eth), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(remove_service), - /* K13 */ be_nested_str_weak(mdns_pase_wifi), - /* K14 */ be_nested_str_weak(commissioning_instance_wifi), - /* K15 */ be_nested_str_weak(hostname_wifi), - /* K16 */ be_nested_str_weak(wifi), - /* K17 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K18 */ be_nested_str_weak(_X7C), - /* K19 */ be_const_int(2), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), }), - be_str_weak(mdns_remove_PASE), + be_str_weak(signal_endpoints_changed), &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA802003D, // 0001 EXBLK 0 #0040 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x780A001B, // 0003 JMPF R2 #0020 - 0xB80A0400, // 0004 GETNGBL R2 K2 - 0x8C080503, // 0005 GETMET R2 R2 K3 - 0x60100018, // 0006 GETGBL R4 G24 - 0x58140004, // 0007 LDCONST R5 K4 - 0x58180005, // 0008 LDCONST R6 K5 - 0x581C0006, // 0009 LDCONST R7 K6 - 0x88200107, // 000A GETMBR R8 R0 K7 - 0x88240108, // 000B GETMBR R9 R0 K8 - 0x7C100A00, // 000C CALL R4 5 - 0x58140009, // 000D LDCONST R5 K9 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0400, // 000F GETNGBL R2 K2 - 0x8C080503, // 0010 GETMET R2 R2 K3 - 0x60100018, // 0011 GETGBL R4 G24 - 0x5814000A, // 0012 LDCONST R5 K10 - 0x5818000B, // 0013 LDCONST R6 K11 - 0x881C0107, // 0014 GETMBR R7 R0 K7 - 0x7C100600, // 0015 CALL R4 3 - 0x58140009, // 0016 LDCONST R5 K9 - 0x7C080600, // 0017 CALL R2 3 - 0x50080000, // 0018 LDBOOL R2 0 0 - 0x90020202, // 0019 SETMBR R0 K1 R2 - 0x8C08030C, // 001A GETMET R2 R1 K12 - 0x58100005, // 001B LDCONST R4 K5 - 0x58140006, // 001C LDCONST R5 K6 - 0x88180107, // 001D GETMBR R6 R0 K7 - 0x881C0108, // 001E GETMBR R7 R0 K8 - 0x7C080A00, // 001F CALL R2 5 - 0x8808010D, // 0020 GETMBR R2 R0 K13 - 0x780A001B, // 0021 JMPF R2 #003E - 0xB80A0400, // 0022 GETNGBL R2 K2 - 0x8C080503, // 0023 GETMET R2 R2 K3 - 0x60100018, // 0024 GETGBL R4 G24 - 0x58140004, // 0025 LDCONST R5 K4 - 0x58180005, // 0026 LDCONST R6 K5 - 0x581C0006, // 0027 LDCONST R7 K6 - 0x8820010E, // 0028 GETMBR R8 R0 K14 - 0x8824010F, // 0029 GETMBR R9 R0 K15 - 0x7C100A00, // 002A CALL R4 5 - 0x58140009, // 002B LDCONST R5 K9 - 0x7C080600, // 002C CALL R2 3 - 0xB80A0400, // 002D GETNGBL R2 K2 - 0x8C080503, // 002E GETMET R2 R2 K3 - 0x60100018, // 002F GETGBL R4 G24 - 0x5814000A, // 0030 LDCONST R5 K10 - 0x58180010, // 0031 LDCONST R6 K16 - 0x881C010E, // 0032 GETMBR R7 R0 K14 - 0x7C100600, // 0033 CALL R4 3 - 0x58140009, // 0034 LDCONST R5 K9 - 0x7C080600, // 0035 CALL R2 3 - 0x50080000, // 0036 LDBOOL R2 0 0 - 0x90021A02, // 0037 SETMBR R0 K13 R2 - 0x8C08030C, // 0038 GETMET R2 R1 K12 - 0x58100005, // 0039 LDCONST R4 K5 - 0x58140006, // 003A LDCONST R5 K6 - 0x8818010E, // 003B GETMBR R6 R0 K14 - 0x881C010F, // 003C GETMBR R7 R0 K15 - 0x7C080A00, // 003D CALL R2 5 - 0xA8040001, // 003E EXBLK 1 1 - 0x70020010, // 003F JMP #0051 - 0xAC080002, // 0040 CATCH R2 0 2 - 0x7002000D, // 0041 JMP #0050 - 0xB8120400, // 0042 GETNGBL R4 K2 - 0x8C100903, // 0043 GETMET R4 R4 K3 - 0x60180008, // 0044 GETGBL R6 G8 - 0x5C1C0400, // 0045 MOVE R7 R2 - 0x7C180200, // 0046 CALL R6 1 - 0x001A2206, // 0047 ADD R6 K17 R6 - 0x00180D12, // 0048 ADD R6 R6 K18 - 0x601C0008, // 0049 GETGBL R7 G8 - 0x5C200600, // 004A MOVE R8 R3 - 0x7C1C0200, // 004B CALL R7 1 - 0x00180C07, // 004C ADD R6 R6 R7 - 0x581C0013, // 004D LDCONST R7 K19 - 0x7C100600, // 004E CALL R4 3 - 0x70020000, // 004F JMP #0051 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x80000000, // 0051 RET 0 + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(add_hostname), + /* K13 */ be_nested_str_weak(ip6local), + /* K14 */ be_nested_str_weak(ip), + /* K15 */ be_nested_str_weak(ip6), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(hostname_wifi), + /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[140]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020072, // 0004 EXBLK 0 #0078 + 0x78060030, // 0005 JMPF R1 #0037 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416000F, // 0012 JMPT R5 #0023 + 0x8C14050C, // 0013 GETMET R5 R2 K12 + 0x881C0105, // 0014 GETMBR R7 R0 K5 + 0x8C200907, // 0015 GETMET R8 R4 K7 + 0x5828000D, // 0016 LDCONST R10 K13 + 0x582C000A, // 0017 LDCONST R11 K10 + 0x7C200600, // 0018 CALL R8 3 + 0x8C240907, // 0019 GETMET R9 R4 K7 + 0x582C000E, // 001A LDCONST R11 K14 + 0x5830000A, // 001B LDCONST R12 K10 + 0x7C240600, // 001C CALL R9 3 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x5830000F, // 001E LDCONST R12 K15 + 0x5834000A, // 001F LDCONST R13 K10 + 0x7C280600, // 0020 CALL R10 3 + 0x7C140A00, // 0021 CALL R5 5 + 0x70020012, // 0022 JMP #0036 + 0xB8160600, // 0023 GETNGBL R5 K3 + 0x8C140B10, // 0024 GETMET R5 R5 K16 + 0x601C0018, // 0025 GETGBL R7 G24 + 0x58200011, // 0026 LDCONST R8 K17 + 0x88240105, // 0027 GETMBR R9 R0 K5 + 0x8C280907, // 0028 GETMET R10 R4 K7 + 0x5830000E, // 0029 LDCONST R12 K14 + 0x5834000A, // 002A LDCONST R13 K10 + 0x7C280600, // 002B CALL R10 3 + 0x7C1C0600, // 002C CALL R7 3 + 0x58200012, // 002D LDCONST R8 K18 + 0x7C140600, // 002E CALL R5 3 + 0x8C14050C, // 002F GETMET R5 R2 K12 + 0x881C0105, // 0030 GETMBR R7 R0 K5 + 0x8C200907, // 0031 GETMET R8 R4 K7 + 0x5828000E, // 0032 LDCONST R10 K14 + 0x582C000A, // 0033 LDCONST R11 K10 + 0x7C200600, // 0034 CALL R8 3 + 0x7C140600, // 0035 CALL R5 3 + 0x7002002F, // 0036 JMP #0067 + 0xB8120600, // 0037 GETNGBL R4 K3 + 0x8C100913, // 0038 GETMET R4 R4 K19 + 0x7C100200, // 0039 CALL R4 1 + 0x8C140706, // 003A GETMET R5 R3 K6 + 0x8C1C0907, // 003B GETMET R7 R4 K7 + 0x58240008, // 003C LDCONST R9 K8 + 0x7C1C0400, // 003D CALL R7 2 + 0x58200009, // 003E LDCONST R8 K9 + 0x5824000A, // 003F LDCONST R9 K10 + 0x7C140800, // 0040 CALL R5 4 + 0x90022805, // 0041 SETMBR R0 K20 R5 + 0x8814010B, // 0042 GETMBR R5 R0 K11 + 0x7416000F, // 0043 JMPT R5 #0054 + 0x8C14050C, // 0044 GETMET R5 R2 K12 + 0x881C0114, // 0045 GETMBR R7 R0 K20 + 0x8C200907, // 0046 GETMET R8 R4 K7 + 0x5828000D, // 0047 LDCONST R10 K13 + 0x582C000A, // 0048 LDCONST R11 K10 + 0x7C200600, // 0049 CALL R8 3 + 0x8C240907, // 004A GETMET R9 R4 K7 + 0x582C000E, // 004B LDCONST R11 K14 + 0x5830000A, // 004C LDCONST R12 K10 + 0x7C240600, // 004D CALL R9 3 + 0x8C280907, // 004E GETMET R10 R4 K7 + 0x5830000F, // 004F LDCONST R12 K15 + 0x5834000A, // 0050 LDCONST R13 K10 + 0x7C280600, // 0051 CALL R10 3 + 0x7C140A00, // 0052 CALL R5 5 + 0x70020012, // 0053 JMP #0067 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B10, // 0055 GETMET R5 R5 K16 + 0x601C0018, // 0056 GETGBL R7 G24 + 0x58200011, // 0057 LDCONST R8 K17 + 0x88240105, // 0058 GETMBR R9 R0 K5 + 0x8C280907, // 0059 GETMET R10 R4 K7 + 0x5830000E, // 005A LDCONST R12 K14 + 0x5834000A, // 005B LDCONST R13 K10 + 0x7C280600, // 005C CALL R10 3 + 0x7C1C0600, // 005D CALL R7 3 + 0x58200012, // 005E LDCONST R8 K18 + 0x7C140600, // 005F CALL R5 3 + 0x8C14050C, // 0060 GETMET R5 R2 K12 + 0x881C0114, // 0061 GETMBR R7 R0 K20 + 0x8C200907, // 0062 GETMET R8 R4 K7 + 0x5828000E, // 0063 LDCONST R10 K14 + 0x582C000A, // 0064 LDCONST R11 K10 + 0x7C200600, // 0065 CALL R8 3 + 0x7C140600, // 0066 CALL R5 3 + 0xB8120600, // 0067 GETNGBL R4 K3 + 0x8C100910, // 0068 GETMET R4 R4 K16 + 0x60180018, // 0069 GETGBL R6 G24 + 0x581C0015, // 006A LDCONST R7 K21 + 0x78060001, // 006B JMPF R1 #006E + 0x58200004, // 006C LDCONST R8 K4 + 0x70020000, // 006D JMP #006F + 0x58200013, // 006E LDCONST R8 K19 + 0x78060001, // 006F JMPF R1 #0072 + 0x88240105, // 0070 GETMBR R9 R0 K5 + 0x70020000, // 0071 JMP #0073 + 0x88240114, // 0072 GETMBR R9 R0 K20 + 0x7C180600, // 0073 CALL R6 3 + 0x581C0012, // 0074 LDCONST R7 K18 + 0x7C100600, // 0075 CALL R4 3 + 0xA8040001, // 0076 EXBLK 1 1 + 0x70020010, // 0077 JMP #0089 + 0xAC100002, // 0078 CATCH R4 0 2 + 0x7002000D, // 0079 JMP #0088 + 0xB81A0600, // 007A GETNGBL R6 K3 + 0x8C180D10, // 007B GETMET R6 R6 K16 + 0x60200008, // 007C GETGBL R8 G8 + 0x5C240800, // 007D MOVE R9 R4 + 0x7C200200, // 007E CALL R8 1 + 0x00222C08, // 007F ADD R8 K22 R8 + 0x00201117, // 0080 ADD R8 R8 K23 + 0x60240008, // 0081 GETGBL R9 G8 + 0x5C280A00, // 0082 MOVE R10 R5 + 0x7C240200, // 0083 CALL R9 1 + 0x00201009, // 0084 ADD R8 R8 R9 + 0x58240018, // 0085 LDCONST R9 K24 + 0x7C180600, // 0086 CALL R6 3 + 0x70020000, // 0087 JMP #0089 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0x8C100119, // 0089 GETMET R4 R0 K25 + 0x7C100200, // 008A CALL R4 1 + 0x80000000, // 008B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_http_remote +********************************************************************/ +be_local_closure(Matter_Device_register_http_remote, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + /* K6 */ be_nested_str_weak(plugins_config_remotes), + /* K7 */ be_nested_str_weak(set_info), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020011, // 0016 JMP #0029 + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180000, // 0019 MOVE R6 R0 + 0x5C1C0200, // 001A MOVE R7 R1 + 0x5C200400, // 001B MOVE R8 R2 + 0x7C100800, // 001C CALL R4 4 + 0x5C0C0800, // 001D MOVE R3 R4 + 0x88100106, // 001E GETMBR R4 R0 K6 + 0x8C100901, // 001F GETMET R4 R4 K1 + 0x5C180200, // 0020 MOVE R6 R1 + 0x7C100400, // 0021 CALL R4 2 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100707, // 0023 GETMET R4 R3 K7 + 0x88180106, // 0024 GETMBR R6 R0 K6 + 0x94180C01, // 0025 GETIDX R6 R6 R1 + 0x7C100400, // 0026 CALL R4 2 + 0x88100100, // 0027 GETMBR R4 R0 K0 + 0x98100203, // 0028 SETIDX R4 R1 R3 + 0x80040600, // 0029 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_operational_discovery_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 }) ) ); @@ -331,29 +1226,58 @@ be_local_closure(Matter_Device_invoke_request, /* name */ /******************************************************************** -** Solidified function: every_50ms +** Solidified function: start_commissioning_complete ********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 11, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(get_fabric), + /* K1 */ be_nested_str_weak(get_fabric_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(tohex), + /* K5 */ be_nested_str_weak(get_admin_vendor_name), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(stop_basic_commissioning), }), - be_str_weak(every_50ms), + be_str_weak(start_commissioning_complete), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[24]) { /* code */ + 0x8C080300, // 0000 GETMET R2 R1 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x8C0C0501, // 0002 GETMET R3 R2 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C0C0704, // 0008 GETMET R3 R3 K4 + 0x7C0C0200, // 0009 CALL R3 1 + 0x8C100505, // 000A GETMET R4 R2 K5 + 0x7C100200, // 000B CALL R4 1 + 0xB8160C00, // 000C GETNGBL R5 K6 + 0x8C140B07, // 000D GETMET R5 R5 K7 + 0x601C0018, // 000E GETGBL R7 G24 + 0x58200008, // 000F LDCONST R8 K8 + 0x5C240600, // 0010 MOVE R9 R3 + 0x5C280800, // 0011 MOVE R10 R4 + 0x7C1C0600, // 0012 CALL R7 3 + 0x58200009, // 0013 LDCONST R8 K9 + 0x7C140600, // 0014 CALL R5 3 + 0x8C14010A, // 0015 GETMET R5 R0 K10 + 0x7C140200, // 0016 CALL R5 1 + 0x80000000, // 0017 RET 0 }) ) ); @@ -642,87 +1566,6 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: find_plugin_by_endpoint -********************************************************************/ -be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(plugins), - /* K2 */ be_nested_str_weak(get_endpoint), - /* K3 */ be_const_int(1), - }), - be_str_weak(find_plugin_by_endpoint), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x600C000C, // 0001 GETGBL R3 G12 - 0x88100101, // 0002 GETMBR R4 R0 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x140C0403, // 0004 LT R3 R2 R3 - 0x780E0008, // 0005 JMPF R3 #000F - 0x880C0101, // 0006 GETMBR R3 R0 K1 - 0x940C0602, // 0007 GETIDX R3 R3 R2 - 0x8C100702, // 0008 GETMET R4 R3 K2 - 0x7C100200, // 0009 CALL R4 1 - 0x1C100801, // 000A EQ R4 R4 R1 - 0x78120000, // 000B JMPF R4 #000D - 0x80040600, // 000C RET 1 R3 - 0x00080503, // 000D ADD R2 R2 K3 - 0x7001FFF1, // 000E JMP #0001 - 0x4C0C0000, // 000F LDNIL R3 - 0x80040600, // 0010 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _init_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: sort_distinct ********************************************************************/ @@ -805,767 +1648,6 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start_commissioning_complete -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(get_fabric), - /* K1 */ be_nested_str_weak(get_fabric_id), - /* K2 */ be_nested_str_weak(copy), - /* K3 */ be_nested_str_weak(reverse), - /* K4 */ be_nested_str_weak(tohex), - /* K5 */ be_nested_str_weak(get_admin_vendor_name), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(stop_basic_commissioning), - }), - be_str_weak(start_commissioning_complete), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x8C080300, // 0000 GETMET R2 R1 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x8C0C0501, // 0002 GETMET R3 R2 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C0C0704, // 0008 GETMET R3 R3 K4 - 0x7C0C0200, // 0009 CALL R3 1 - 0x8C100505, // 000A GETMET R4 R2 K5 - 0x7C100200, // 000B CALL R4 1 - 0xB8160C00, // 000C GETNGBL R5 K6 - 0x8C140B07, // 000D GETMET R5 R5 K7 - 0x601C0018, // 000E GETGBL R7 G24 - 0x58200008, // 000F LDCONST R8 K8 - 0x5C240600, // 0010 MOVE R9 R3 - 0x5C280800, // 0011 MOVE R10 R4 - 0x7C1C0600, // 0012 CALL R7 3 - 0x58200009, // 0013 LDCONST R8 K9 - 0x7C140600, // 0014 CALL R5 3 - 0x8C14010A, // 0015 GETMET R5 R0 K10 - 0x7C140200, // 0016 CALL R5 1 - 0x80000000, // 0017 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: bridge_add_endpoint -********************************************************************/ -be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ - be_nested_proto( - 17, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K5 */ be_nested_str_weak(_X27_X20skipping), - /* K6 */ be_const_int(3), - /* K7 */ be_nested_str_weak(next_ep), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(type), - /* K11 */ be_nested_str_weak(keys), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), - /* K14 */ be_nested_str_weak(conf_to_log), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(plugins_config), - /* K17 */ be_nested_str_weak(plugins_persist), - /* K18 */ be_const_int(1), - /* K19 */ be_nested_str_weak(save_param), - /* K20 */ be_nested_str_weak(signal_endpoints_changed), - }), - be_str_weak(bridge_add_endpoint), - &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x4C100000, // 0004 LDNIL R4 - 0x1C100604, // 0005 EQ R4 R3 R4 - 0x78120009, // 0006 JMPF R4 #0011 - 0xB8120400, // 0007 GETNGBL R4 K2 - 0x8C100903, // 0008 GETMET R4 R4 K3 - 0x60180008, // 0009 GETGBL R6 G8 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C180200, // 000B CALL R6 1 - 0x001A0806, // 000C ADD R6 K4 R6 - 0x00180D05, // 000D ADD R6 R6 K5 - 0x581C0006, // 000E LDCONST R7 K6 - 0x7C100600, // 000F CALL R4 3 - 0x80000800, // 0010 RET 0 - 0x88100107, // 0011 GETMBR R4 R0 K7 - 0x60140008, // 0012 GETGBL R5 G8 - 0x5C180800, // 0013 MOVE R6 R4 - 0x7C140200, // 0014 CALL R5 1 - 0x5C180600, // 0015 MOVE R6 R3 - 0x5C1C0000, // 0016 MOVE R7 R0 - 0x5C200800, // 0017 MOVE R8 R4 - 0x5C240400, // 0018 MOVE R9 R2 - 0x7C180600, // 0019 CALL R6 3 - 0x881C0108, // 001A GETMBR R7 R0 K8 - 0x8C1C0F09, // 001B GETMET R7 R7 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x601C0013, // 001E GETGBL R7 G19 - 0x7C1C0000, // 001F CALL R7 0 - 0x981E1401, // 0020 SETIDX R7 K10 R1 - 0x60200010, // 0021 GETGBL R8 G16 - 0x8C24050B, // 0022 GETMET R9 R2 K11 - 0x7C240200, // 0023 CALL R9 1 - 0x7C200200, // 0024 CALL R8 1 - 0xA8020004, // 0025 EXBLK 0 #002B - 0x5C241000, // 0026 MOVE R9 R8 - 0x7C240000, // 0027 CALL R9 0 - 0x94280409, // 0028 GETIDX R10 R2 R9 - 0x981C120A, // 0029 SETIDX R7 R9 R10 - 0x7001FFFA, // 002A JMP #0026 - 0x5820000C, // 002B LDCONST R8 K12 - 0xAC200200, // 002C CATCH R8 1 0 - 0xB0080000, // 002D RAISE 2 R0 R0 - 0xB8220400, // 002E GETNGBL R8 K2 - 0x8C201103, // 002F GETMET R8 R8 K3 - 0x60280018, // 0030 GETGBL R10 G24 - 0x582C000D, // 0031 LDCONST R11 K13 - 0x5C300800, // 0032 MOVE R12 R4 - 0x5C340200, // 0033 MOVE R13 R1 - 0x8C38010E, // 0034 GETMET R14 R0 K14 - 0x5C400400, // 0035 MOVE R16 R2 - 0x7C380400, // 0036 CALL R14 2 - 0x7C280800, // 0037 CALL R10 4 - 0x582C000F, // 0038 LDCONST R11 K15 - 0x7C200600, // 0039 CALL R8 3 - 0x88200110, // 003A GETMBR R8 R0 K16 - 0x98200A07, // 003B SETIDX R8 R5 R7 - 0x50200200, // 003C LDBOOL R8 1 0 - 0x90022208, // 003D SETMBR R0 K17 R8 - 0x88200107, // 003E GETMBR R8 R0 K7 - 0x00201112, // 003F ADD R8 R8 K18 - 0x90020E08, // 0040 SETMBR R0 K7 R8 - 0x8C200113, // 0041 GETMET R8 R0 K19 - 0x7C200200, // 0042 CALL R8 1 - 0x8C200114, // 0043 GETMET R8 R0 K20 - 0x7C200200, // 0044 CALL R8 1 - 0x80040800, // 0045 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_random_passcode -********************************************************************/ -be_local_closure(Matter_Device_generate_random_passcode, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(134217727), - /* K5 */ be_const_int(99999998), - /* K6 */ be_nested_str_weak(PASSCODE_INVALID), - /* K7 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(generate_random_passcode), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x780E001D, // 0003 JMPF R3 #0022 - 0x8C0C0301, // 0004 GETMET R3 R1 K1 - 0x54160003, // 0005 LDINT R5 4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x58140003, // 0008 LDCONST R5 K3 - 0x541A0003, // 0009 LDINT R6 4 - 0x7C0C0600, // 000A CALL R3 3 - 0x2C0C0704, // 000B AND R3 R3 K4 - 0x5C080600, // 000C MOVE R2 R3 - 0x240C0505, // 000D GT R3 R2 K5 - 0x780E0000, // 000E JMPF R3 #0010 - 0x7001FFF1, // 000F JMP #0002 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100106, // 0011 GETMBR R4 R0 K6 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA8020005, // 0013 EXBLK 0 #001A - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x1C140404, // 0016 EQ R5 R2 R4 - 0x78160000, // 0017 JMPF R5 #0019 - 0x4C080000, // 0018 LDNIL R2 - 0x7001FFF9, // 0019 JMP #0014 - 0x580C0007, // 001A LDCONST R3 K7 - 0xAC0C0200, // 001B CATCH R3 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x4C0C0000, // 001D LDNIL R3 - 0x200C0403, // 001E NE R3 R2 R3 - 0x780E0000, // 001F JMPF R3 #0021 - 0x80040400, // 0020 RET 1 R2 - 0x7001FFDF, // 0021 JMP #0002 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_http_remote -********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - /* K6 */ be_nested_str_weak(plugins_config_remotes), - /* K7 */ be_nested_str_weak(set_info), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020011, // 0016 JMP #0029 - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180000, // 0019 MOVE R6 R0 - 0x5C1C0200, // 001A MOVE R7 R1 - 0x5C200400, // 001B MOVE R8 R2 - 0x7C100800, // 001C CALL R4 4 - 0x5C0C0800, // 001D MOVE R3 R4 - 0x88100106, // 001E GETMBR R4 R0 K6 - 0x8C100901, // 001F GETMET R4 R4 K1 - 0x5C180200, // 0020 MOVE R6 R1 - 0x7C100400, // 0021 CALL R4 2 - 0x78120003, // 0022 JMPF R4 #0027 - 0x8C100707, // 0023 GETMET R4 R3 K7 - 0x88180106, // 0024 GETMBR R6 R0 K6 - 0x94180C01, // 0025 GETIDX R6 R6 R1 - 0x7C100400, // 0026 CALL R4 2 - 0x88100100, // 0027 GETMBR R4 R0 K0 - 0x98100203, // 0028 SETIDX R4 R1 R3 - 0x80040600, // 0029 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_arg -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_arg), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_mdns_announce_hostnames -********************************************************************/ -be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_mdns_announce_hostname), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_mdns_host), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x50080200, // 0002 LDBOOL R2 1 0 - 0x7C000400, // 0003 CALL R0 2 - 0xB8020200, // 0004 GETNGBL R0 K1 - 0x8C000102, // 0005 GETMET R0 R0 K2 - 0x58080003, // 0006 LDCONST R2 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x7C000600, // 0008 CALL R0 3 - 0x80000000, // 0009 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(wifi), - /* K2 */ be_nested_str_weak(up), - /* K3 */ be_nested_str_weak(_mdns_announce_hostname), - /* K4 */ be_nested_str_weak(add_rule), - /* K5 */ be_nested_str_weak(Wifi_X23Connected), - /* K6 */ be_nested_str_weak(matter_mdns_host), - /* K7 */ be_nested_str_weak(eth), - /* K8 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_mdns_announce_hostnames), - &be_const_str_solidified, - ( &(const binstruction[32]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x94040302, // 0003 GETIDX R1 R1 K2 - 0x78060003, // 0004 JMPF R1 #0009 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x500C0000, // 0006 LDBOOL R3 0 0 - 0x7C040400, // 0007 CALL R1 2 - 0x70020005, // 0008 JMP #000F - 0xB8060000, // 0009 GETNGBL R1 K0 - 0x8C040304, // 000A GETMET R1 R1 K4 - 0x580C0005, // 000B LDCONST R3 K5 - 0x84100000, // 000C CLOSURE R4 P0 - 0x58140006, // 000D LDCONST R5 K6 - 0x7C040800, // 000E CALL R1 4 - 0xB8060000, // 000F GETNGBL R1 K0 - 0x8C040307, // 0010 GETMET R1 R1 K7 - 0x7C040200, // 0011 CALL R1 1 - 0x94040302, // 0012 GETIDX R1 R1 K2 - 0x78060003, // 0013 JMPF R1 #0018 - 0x8C040103, // 0014 GETMET R1 R0 K3 - 0x500C0200, // 0015 LDBOOL R3 1 0 - 0x7C040400, // 0016 CALL R1 2 - 0x70020005, // 0017 JMP #001E - 0xB8060000, // 0018 GETNGBL R1 K0 - 0x8C040304, // 0019 GETMET R1 R1 K4 - 0x580C0008, // 001A LDCONST R3 K8 - 0x84100001, // 001B CLOSURE R4 P1 - 0x58140006, // 001C LDCONST R5 K6 - 0x7C040800, // 001D CALL R1 4 - 0xA0000000, // 001E CLOSE R0 - 0x80000000, // 001F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(get_device_id), - /* K2 */ be_nested_str_weak(copy), - /* K3 */ be_nested_str_weak(reverse), - /* K4 */ be_nested_str_weak(get_fabric_compressed), - /* K5 */ be_nested_str_weak(tohex), - /* K6 */ be_nested_str_weak(_X2D), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), - /* K10 */ be_const_int(3), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(find), - /* K13 */ be_nested_str_weak(up), - /* K14 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), - /* K15 */ be_nested_str_weak(hostname_eth), - /* K16 */ be_nested_str_weak(add_service), - /* K17 */ be_nested_str_weak(_matter), - /* K18 */ be_nested_str_weak(_tcp), - /* K19 */ be_nested_str_weak(_I), - /* K20 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), - /* K21 */ be_nested_str_weak(add_subtype), - /* K22 */ be_nested_str_weak(wifi), - /* K23 */ be_nested_str_weak(hostname_wifi), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K25 */ be_nested_str_weak(_X7C), - /* K26 */ be_const_int(2), - }), - be_str_weak(mdns_announce_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[121]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA8020064, // 0001 EXBLK 0 #0067 - 0x8C0C0301, // 0002 GETMET R3 R1 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C100304, // 0008 GETMET R4 R1 K4 - 0x7C100200, // 0009 CALL R4 1 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x7C140200, // 000B CALL R5 1 - 0x00140B06, // 000C ADD R5 R5 K6 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x7C180200, // 000E CALL R6 1 - 0x00140A06, // 000F ADD R5 R5 R6 - 0xB81A0E00, // 0010 GETNGBL R6 K7 - 0x8C180D08, // 0011 GETMET R6 R6 K8 - 0x00221205, // 0012 ADD R8 K9 R5 - 0x5824000A, // 0013 LDCONST R9 K10 - 0x7C180600, // 0014 CALL R6 3 - 0xB81A0E00, // 0015 GETNGBL R6 K7 - 0x8C180D0B, // 0016 GETMET R6 R6 K11 - 0x7C180200, // 0017 CALL R6 1 - 0x8C180D0C, // 0018 GETMET R6 R6 K12 - 0x5820000D, // 0019 LDCONST R8 K13 - 0x7C180400, // 001A CALL R6 2 - 0x781A0020, // 001B JMPF R6 #003D - 0xB81A0E00, // 001C GETNGBL R6 K7 - 0x8C180D08, // 001D GETMET R6 R6 K8 - 0x60200018, // 001E GETGBL R8 G24 - 0x5824000E, // 001F LDCONST R9 K14 - 0x5828000B, // 0020 LDCONST R10 K11 - 0x5C2C0A00, // 0021 MOVE R11 R5 - 0x8830010F, // 0022 GETMBR R12 R0 K15 - 0x7C200800, // 0023 CALL R8 4 - 0x5824000A, // 0024 LDCONST R9 K10 - 0x7C180600, // 0025 CALL R6 3 - 0x8C180510, // 0026 GETMET R6 R2 K16 - 0x58200011, // 0027 LDCONST R8 K17 - 0x58240012, // 0028 LDCONST R9 K18 - 0x542A15A3, // 0029 LDINT R10 5540 - 0x4C2C0000, // 002A LDNIL R11 - 0x5C300A00, // 002B MOVE R12 R5 - 0x8834010F, // 002C GETMBR R13 R0 K15 - 0x7C180E00, // 002D CALL R6 7 - 0x8C180905, // 002E GETMET R6 R4 K5 - 0x7C180200, // 002F CALL R6 1 - 0x001A2606, // 0030 ADD R6 K19 R6 - 0xB81E0E00, // 0031 GETNGBL R7 K7 - 0x8C1C0F08, // 0032 GETMET R7 R7 K8 - 0x00262806, // 0033 ADD R9 K20 R6 - 0x5828000A, // 0034 LDCONST R10 K10 - 0x7C1C0600, // 0035 CALL R7 3 - 0x8C1C0515, // 0036 GETMET R7 R2 K21 - 0x58240011, // 0037 LDCONST R9 K17 - 0x58280012, // 0038 LDCONST R10 K18 - 0x5C2C0A00, // 0039 MOVE R11 R5 - 0x8830010F, // 003A GETMBR R12 R0 K15 - 0x5C340C00, // 003B MOVE R13 R6 - 0x7C1C0C00, // 003C CALL R7 6 - 0xB81A0E00, // 003D GETNGBL R6 K7 - 0x8C180D16, // 003E GETMET R6 R6 K22 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0C, // 0040 GETMET R6 R6 K12 - 0x5820000D, // 0041 LDCONST R8 K13 - 0x7C180400, // 0042 CALL R6 2 - 0x781A0020, // 0043 JMPF R6 #0065 - 0xB81A0E00, // 0044 GETNGBL R6 K7 - 0x8C180D08, // 0045 GETMET R6 R6 K8 - 0x60200018, // 0046 GETGBL R8 G24 - 0x5824000E, // 0047 LDCONST R9 K14 - 0x58280016, // 0048 LDCONST R10 K22 - 0x5C2C0A00, // 0049 MOVE R11 R5 - 0x88300117, // 004A GETMBR R12 R0 K23 - 0x7C200800, // 004B CALL R8 4 - 0x5824000A, // 004C LDCONST R9 K10 - 0x7C180600, // 004D CALL R6 3 - 0x8C180510, // 004E GETMET R6 R2 K16 - 0x58200011, // 004F LDCONST R8 K17 - 0x58240012, // 0050 LDCONST R9 K18 - 0x542A15A3, // 0051 LDINT R10 5540 - 0x4C2C0000, // 0052 LDNIL R11 - 0x5C300A00, // 0053 MOVE R12 R5 - 0x88340117, // 0054 GETMBR R13 R0 K23 - 0x7C180E00, // 0055 CALL R6 7 - 0x8C180905, // 0056 GETMET R6 R4 K5 - 0x7C180200, // 0057 CALL R6 1 - 0x001A2606, // 0058 ADD R6 K19 R6 - 0xB81E0E00, // 0059 GETNGBL R7 K7 - 0x8C1C0F08, // 005A GETMET R7 R7 K8 - 0x00262806, // 005B ADD R9 K20 R6 - 0x5828000A, // 005C LDCONST R10 K10 - 0x7C1C0600, // 005D CALL R7 3 - 0x8C1C0515, // 005E GETMET R7 R2 K21 - 0x58240011, // 005F LDCONST R9 K17 - 0x58280012, // 0060 LDCONST R10 K18 - 0x5C2C0A00, // 0061 MOVE R11 R5 - 0x88300117, // 0062 GETMBR R12 R0 K23 - 0x5C340C00, // 0063 MOVE R13 R6 - 0x7C1C0C00, // 0064 CALL R7 6 - 0xA8040001, // 0065 EXBLK 1 1 - 0x70020010, // 0066 JMP #0078 - 0xAC0C0002, // 0067 CATCH R3 0 2 - 0x7002000D, // 0068 JMP #0077 - 0xB8160E00, // 0069 GETNGBL R5 K7 - 0x8C140B08, // 006A GETMET R5 R5 K8 - 0x601C0008, // 006B GETGBL R7 G8 - 0x5C200600, // 006C MOVE R8 R3 - 0x7C1C0200, // 006D CALL R7 1 - 0x001E3007, // 006E ADD R7 K24 R7 - 0x001C0F19, // 006F ADD R7 R7 K25 - 0x60200008, // 0070 GETGBL R8 G8 - 0x5C240800, // 0071 MOVE R9 R4 - 0x7C200200, // 0072 CALL R8 1 - 0x001C0E08, // 0073 ADD R7 R7 R8 - 0x5820001A, // 0074 LDCONST R8 K26 - 0x7C140600, // 0075 CALL R5 3 - 0x70020000, // 0076 JMP #0078 - 0xB0080000, // 0077 RAISE 2 R0 R0 - 0x80000000, // 0078 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: process_attribute_expansion ********************************************************************/ @@ -1878,6 +1960,778 @@ be_local_closure(Matter_Device_process_attribute_expansion, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: _trigger_read_sensors +********************************************************************/ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_root_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(is_root_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060003, // 0003 JMPF R1 #0008 + 0x88040101, // 0004 GETMBR R1 R0 K1 + 0x4C080000, // 0005 LDNIL R2 + 0x1C040202, // 0006 EQ R1 R1 R2 + 0x74060000, // 0007 JMPT R1 #0009 + 0x50040001, // 0008 LDBOOL R1 0 1 + 0x50040200, // 0009 LDBOOL R1 1 0 + 0x80040200, // 000A RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(get_device_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(get_fabric_compressed), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(_X2D), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20Operational_X20Discovery_X20node_X20_X3D_X20), + /* K10 */ be_const_int(3), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(find), + /* K13 */ be_nested_str_weak(up), + /* K14 */ be_nested_str_weak(MTR_X3A_X20adding_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27_X20ptr_X20to_X20_X60_X25s_X2Elocal_X60), + /* K15 */ be_nested_str_weak(hostname_eth), + /* K16 */ be_nested_str_weak(add_service), + /* K17 */ be_nested_str_weak(_matter), + /* K18 */ be_nested_str_weak(_tcp), + /* K19 */ be_nested_str_weak(_I), + /* K20 */ be_nested_str_weak(MTR_X3A_X20adding_X20subtype_X3A_X20), + /* K21 */ be_nested_str_weak(add_subtype), + /* K22 */ be_nested_str_weak(wifi), + /* K23 */ be_nested_str_weak(hostname_wifi), + /* K24 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K25 */ be_nested_str_weak(_X7C), + /* K26 */ be_const_int(2), + }), + be_str_weak(mdns_announce_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[121]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA8020064, // 0001 EXBLK 0 #0067 + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x7C140200, // 000B CALL R5 1 + 0x00140B06, // 000C ADD R5 R5 K6 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x7C180200, // 000E CALL R6 1 + 0x00140A06, // 000F ADD R5 R5 R6 + 0xB81A0E00, // 0010 GETNGBL R6 K7 + 0x8C180D08, // 0011 GETMET R6 R6 K8 + 0x00221205, // 0012 ADD R8 K9 R5 + 0x5824000A, // 0013 LDCONST R9 K10 + 0x7C180600, // 0014 CALL R6 3 + 0xB81A0E00, // 0015 GETNGBL R6 K7 + 0x8C180D0B, // 0016 GETMET R6 R6 K11 + 0x7C180200, // 0017 CALL R6 1 + 0x8C180D0C, // 0018 GETMET R6 R6 K12 + 0x5820000D, // 0019 LDCONST R8 K13 + 0x7C180400, // 001A CALL R6 2 + 0x781A0020, // 001B JMPF R6 #003D + 0xB81A0E00, // 001C GETNGBL R6 K7 + 0x8C180D08, // 001D GETMET R6 R6 K8 + 0x60200018, // 001E GETGBL R8 G24 + 0x5824000E, // 001F LDCONST R9 K14 + 0x5828000B, // 0020 LDCONST R10 K11 + 0x5C2C0A00, // 0021 MOVE R11 R5 + 0x8830010F, // 0022 GETMBR R12 R0 K15 + 0x7C200800, // 0023 CALL R8 4 + 0x5824000A, // 0024 LDCONST R9 K10 + 0x7C180600, // 0025 CALL R6 3 + 0x8C180510, // 0026 GETMET R6 R2 K16 + 0x58200011, // 0027 LDCONST R8 K17 + 0x58240012, // 0028 LDCONST R9 K18 + 0x542A15A3, // 0029 LDINT R10 5540 + 0x4C2C0000, // 002A LDNIL R11 + 0x5C300A00, // 002B MOVE R12 R5 + 0x8834010F, // 002C GETMBR R13 R0 K15 + 0x7C180E00, // 002D CALL R6 7 + 0x8C180905, // 002E GETMET R6 R4 K5 + 0x7C180200, // 002F CALL R6 1 + 0x001A2606, // 0030 ADD R6 K19 R6 + 0xB81E0E00, // 0031 GETNGBL R7 K7 + 0x8C1C0F08, // 0032 GETMET R7 R7 K8 + 0x00262806, // 0033 ADD R9 K20 R6 + 0x5828000A, // 0034 LDCONST R10 K10 + 0x7C1C0600, // 0035 CALL R7 3 + 0x8C1C0515, // 0036 GETMET R7 R2 K21 + 0x58240011, // 0037 LDCONST R9 K17 + 0x58280012, // 0038 LDCONST R10 K18 + 0x5C2C0A00, // 0039 MOVE R11 R5 + 0x8830010F, // 003A GETMBR R12 R0 K15 + 0x5C340C00, // 003B MOVE R13 R6 + 0x7C1C0C00, // 003C CALL R7 6 + 0xB81A0E00, // 003D GETNGBL R6 K7 + 0x8C180D16, // 003E GETMET R6 R6 K22 + 0x7C180200, // 003F CALL R6 1 + 0x8C180D0C, // 0040 GETMET R6 R6 K12 + 0x5820000D, // 0041 LDCONST R8 K13 + 0x7C180400, // 0042 CALL R6 2 + 0x781A0020, // 0043 JMPF R6 #0065 + 0xB81A0E00, // 0044 GETNGBL R6 K7 + 0x8C180D08, // 0045 GETMET R6 R6 K8 + 0x60200018, // 0046 GETGBL R8 G24 + 0x5824000E, // 0047 LDCONST R9 K14 + 0x58280016, // 0048 LDCONST R10 K22 + 0x5C2C0A00, // 0049 MOVE R11 R5 + 0x88300117, // 004A GETMBR R12 R0 K23 + 0x7C200800, // 004B CALL R8 4 + 0x5824000A, // 004C LDCONST R9 K10 + 0x7C180600, // 004D CALL R6 3 + 0x8C180510, // 004E GETMET R6 R2 K16 + 0x58200011, // 004F LDCONST R8 K17 + 0x58240012, // 0050 LDCONST R9 K18 + 0x542A15A3, // 0051 LDINT R10 5540 + 0x4C2C0000, // 0052 LDNIL R11 + 0x5C300A00, // 0053 MOVE R12 R5 + 0x88340117, // 0054 GETMBR R13 R0 K23 + 0x7C180E00, // 0055 CALL R6 7 + 0x8C180905, // 0056 GETMET R6 R4 K5 + 0x7C180200, // 0057 CALL R6 1 + 0x001A2606, // 0058 ADD R6 K19 R6 + 0xB81E0E00, // 0059 GETNGBL R7 K7 + 0x8C1C0F08, // 005A GETMET R7 R7 K8 + 0x00262806, // 005B ADD R9 K20 R6 + 0x5828000A, // 005C LDCONST R10 K10 + 0x7C1C0600, // 005D CALL R7 3 + 0x8C1C0515, // 005E GETMET R7 R2 K21 + 0x58240011, // 005F LDCONST R9 K17 + 0x58280012, // 0060 LDCONST R10 K18 + 0x5C2C0A00, // 0061 MOVE R11 R5 + 0x88300117, // 0062 GETMBR R12 R0 K23 + 0x5C340C00, // 0063 MOVE R13 R6 + 0x7C1C0C00, // 0064 CALL R7 6 + 0xA8040001, // 0065 EXBLK 1 1 + 0x70020010, // 0066 JMP #0078 + 0xAC0C0002, // 0067 CATCH R3 0 2 + 0x7002000D, // 0068 JMP #0077 + 0xB8160E00, // 0069 GETNGBL R5 K7 + 0x8C140B08, // 006A GETMET R5 R5 K8 + 0x601C0008, // 006B GETGBL R7 G8 + 0x5C200600, // 006C MOVE R8 R3 + 0x7C1C0200, // 006D CALL R7 1 + 0x001E3007, // 006E ADD R7 K24 R7 + 0x001C0F19, // 006F ADD R7 R7 K25 + 0x60200008, // 0070 GETGBL R8 G8 + 0x5C240800, // 0071 MOVE R9 R4 + 0x7C200200, // 0072 CALL R8 1 + 0x001C0E08, // 0073 ADD R7 R7 R8 + 0x5820001A, // 0074 LDCONST R8 K26 + 0x7C140600, // 0075 CALL R5 3 + 0x70020000, // 0076 JMP #0078 + 0xB0080000, // 0077 RAISE 2 R0 R0 + 0x80000000, // 0078 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_remote_info +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config_remotes), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_plugin_remote_info), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x60140013, // 0003 GETGBL R5 G19 + 0x7C140000, // 0004 CALL R5 0 + 0x7C080600, // 0005 CALL R2 3 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Device_init, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0004, // 0006 LDCONST R3 K4 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[46]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(get_option), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(MATTER_OPTION), + /* K5 */ be_nested_str_weak(UI), + /* K6 */ be_nested_str_weak(profiler), + /* K7 */ be_nested_str_weak(Profiler), + /* K8 */ be_nested_str_weak(started), + /* K9 */ be_nested_str_weak(tick), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(plugins), + /* K12 */ be_nested_str_weak(plugins_persist), + /* K13 */ be_nested_str_weak(plugins_classes), + /* K14 */ be_nested_str_weak(plugins_config_remotes), + /* K15 */ be_nested_str_weak(register_native_classes), + /* K16 */ be_nested_str_weak(vendorid), + /* K17 */ be_nested_str_weak(VENDOR_ID), + /* K18 */ be_nested_str_weak(productid), + /* K19 */ be_nested_str_weak(PRODUCT_ID), + /* K20 */ be_nested_str_weak(root_iterations), + /* K21 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K22 */ be_nested_str_weak(next_ep), + /* K23 */ be_const_int(1), + /* K24 */ be_nested_str_weak(root_salt), + /* K25 */ be_nested_str_weak(random), + /* K26 */ be_nested_str_weak(ipv4only), + /* K27 */ be_nested_str_weak(disable_bridge_mode), + /* K28 */ be_nested_str_weak(load_param), + /* K29 */ be_nested_str_weak(sessions), + /* K30 */ be_nested_str_weak(Session_Store), + /* K31 */ be_nested_str_weak(load_fabrics), + /* K32 */ be_nested_str_weak(message_handler), + /* K33 */ be_nested_str_weak(MessageHandler), + /* K34 */ be_nested_str_weak(ui), + /* K35 */ be_nested_str_weak(wifi), + /* K36 */ be_nested_str_weak(up), + /* K37 */ be_nested_str_weak(eth), + /* K38 */ be_nested_str_weak(start), + /* K39 */ be_nested_str_weak(add_rule), + /* K40 */ be_nested_str_weak(Wifi_X23Connected), + /* K41 */ be_nested_str_weak(matter_start), + /* K42 */ be_nested_str_weak(Eth_X23Connected), + /* K43 */ be_nested_str_weak(_init_basic_commissioning), + /* K44 */ be_nested_str_weak(add_driver), + /* K45 */ be_nested_str_weak(register_commands), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[111]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0xB8120600, // 0003 GETNGBL R4 K3 + 0x88100904, // 0004 GETMBR R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x740A0004, // 0006 JMPT R2 #000C + 0xB80A0600, // 0007 GETNGBL R2 K3 + 0x8C080505, // 0008 GETMET R2 R2 K5 + 0x5C100000, // 0009 MOVE R4 R0 + 0x7C080400, // 000A CALL R2 2 + 0x80000400, // 000B RET 0 + 0xB80A0600, // 000C GETNGBL R2 K3 + 0x8C080507, // 000D GETMET R2 R2 K7 + 0x7C080200, // 000E CALL R2 1 + 0x90020C02, // 000F SETMBR R0 K6 R2 + 0x50080000, // 0010 LDBOOL R2 0 0 + 0x90021002, // 0011 SETMBR R0 K8 R2 + 0x9002130A, // 0012 SETMBR R0 K9 K10 + 0x60080012, // 0013 GETGBL R2 G18 + 0x7C080000, // 0014 CALL R2 0 + 0x90021602, // 0015 SETMBR R0 K11 R2 + 0x50080000, // 0016 LDBOOL R2 0 0 + 0x90021802, // 0017 SETMBR R0 K12 R2 + 0x60080013, // 0018 GETGBL R2 G19 + 0x7C080000, // 0019 CALL R2 0 + 0x90021A02, // 001A SETMBR R0 K13 R2 + 0x60080013, // 001B GETGBL R2 G19 + 0x7C080000, // 001C CALL R2 0 + 0x90021C02, // 001D SETMBR R0 K14 R2 + 0x8C08010F, // 001E GETMET R2 R0 K15 + 0x7C080200, // 001F CALL R2 1 + 0x88080111, // 0020 GETMBR R2 R0 K17 + 0x90022002, // 0021 SETMBR R0 K16 R2 + 0x88080113, // 0022 GETMBR R2 R0 K19 + 0x90022402, // 0023 SETMBR R0 K18 R2 + 0x88080115, // 0024 GETMBR R2 R0 K21 + 0x90022802, // 0025 SETMBR R0 K20 R2 + 0x90022D17, // 0026 SETMBR R0 K22 K23 + 0x8C080319, // 0027 GETMET R2 R1 K25 + 0x5412000F, // 0028 LDINT R4 16 + 0x7C080400, // 0029 CALL R2 2 + 0x90023002, // 002A SETMBR R0 K24 R2 + 0x50080000, // 002B LDBOOL R2 0 0 + 0x90023402, // 002C SETMBR R0 K26 R2 + 0x50080000, // 002D LDBOOL R2 0 0 + 0x90023602, // 002E SETMBR R0 K27 R2 + 0x8C08011C, // 002F GETMET R2 R0 K28 + 0x7C080200, // 0030 CALL R2 1 + 0xB80A0600, // 0031 GETNGBL R2 K3 + 0x8C08051E, // 0032 GETMET R2 R2 K30 + 0x5C100000, // 0033 MOVE R4 R0 + 0x7C080400, // 0034 CALL R2 2 + 0x90023A02, // 0035 SETMBR R0 K29 R2 + 0x8808011D, // 0036 GETMBR R2 R0 K29 + 0x8C08051F, // 0037 GETMET R2 R2 K31 + 0x7C080200, // 0038 CALL R2 1 + 0xB80A0600, // 0039 GETNGBL R2 K3 + 0x8C080521, // 003A GETMET R2 R2 K33 + 0x5C100000, // 003B MOVE R4 R0 + 0x7C080400, // 003C CALL R2 2 + 0x90024002, // 003D SETMBR R0 K32 R2 + 0xB80A0600, // 003E GETNGBL R2 K3 + 0x8C080505, // 003F GETMET R2 R2 K5 + 0x5C100000, // 0040 MOVE R4 R0 + 0x7C080400, // 0041 CALL R2 2 + 0x90024402, // 0042 SETMBR R0 K34 R2 + 0xB80A0200, // 0043 GETNGBL R2 K1 + 0x8C080523, // 0044 GETMET R2 R2 K35 + 0x7C080200, // 0045 CALL R2 1 + 0x94080524, // 0046 GETIDX R2 R2 K36 + 0x740A0004, // 0047 JMPT R2 #004D + 0xB80A0200, // 0048 GETNGBL R2 K1 + 0x8C080525, // 0049 GETMET R2 R2 K37 + 0x7C080200, // 004A CALL R2 1 + 0x94080524, // 004B GETIDX R2 R2 K36 + 0x780A0001, // 004C JMPF R2 #004F + 0x8C080126, // 004D GETMET R2 R0 K38 + 0x7C080200, // 004E CALL R2 1 + 0xB80A0200, // 004F GETNGBL R2 K1 + 0x8C080523, // 0050 GETMET R2 R2 K35 + 0x7C080200, // 0051 CALL R2 1 + 0x94080524, // 0052 GETIDX R2 R2 K36 + 0x740A0005, // 0053 JMPT R2 #005A + 0xB80A0200, // 0054 GETNGBL R2 K1 + 0x8C080527, // 0055 GETMET R2 R2 K39 + 0x58100028, // 0056 LDCONST R4 K40 + 0x84140000, // 0057 CLOSURE R5 P0 + 0x58180029, // 0058 LDCONST R6 K41 + 0x7C080800, // 0059 CALL R2 4 + 0xB80A0200, // 005A GETNGBL R2 K1 + 0x8C080525, // 005B GETMET R2 R2 K37 + 0x7C080200, // 005C CALL R2 1 + 0x94080524, // 005D GETIDX R2 R2 K36 + 0x740A0005, // 005E JMPT R2 #0065 + 0xB80A0200, // 005F GETNGBL R2 K1 + 0x8C080527, // 0060 GETMET R2 R2 K39 + 0x5810002A, // 0061 LDCONST R4 K42 + 0x84140001, // 0062 CLOSURE R5 P1 + 0x58180029, // 0063 LDCONST R6 K41 + 0x7C080800, // 0064 CALL R2 4 + 0x8C08012B, // 0065 GETMET R2 R0 K43 + 0x7C080200, // 0066 CALL R2 1 + 0xB80A0200, // 0067 GETNGBL R2 K1 + 0x8C08052C, // 0068 GETMET R2 R2 K44 + 0x5C100000, // 0069 MOVE R4 R0 + 0x7C080400, // 006A CALL R2 2 + 0x8C08012D, // 006B GETMET R2 R0 K45 + 0x7C080200, // 006C CALL R2 1 + 0xA0000000, // 006D CLOSE R0 + 0x80000000, // 006E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: find_plugin_by_endpoint +********************************************************************/ +be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(plugins), + /* K2 */ be_nested_str_weak(get_endpoint), + /* K3 */ be_const_int(1), + }), + be_str_weak(find_plugin_by_endpoint), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x600C000C, // 0001 GETGBL R3 G12 + 0x88100101, // 0002 GETMBR R4 R0 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x140C0403, // 0004 LT R3 R2 R3 + 0x780E0008, // 0005 JMPF R3 #000F + 0x880C0101, // 0006 GETMBR R3 R0 K1 + 0x940C0602, // 0007 GETIDX R3 R3 R2 + 0x8C100702, // 0008 GETMET R4 R3 K2 + 0x7C100200, // 0009 CALL R4 1 + 0x1C100801, // 000A EQ R4 R4 R1 + 0x78120000, // 000B JMPF R4 #000D + 0x80040600, // 000C RET 1 R3 + 0x00080503, // 000D ADD R2 R2 K3 + 0x7001FFF1, // 000E JMP #0001 + 0x4C0C0000, // 000F LDNIL R3 + 0x80040600, // 0010 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: k2l_num ********************************************************************/ @@ -1960,618 +2814,6 @@ be_local_closure(Matter_Device_k2l_num, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: signal_endpoints_changed -********************************************************************/ -be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(3), - }), - be_str_weak(signal_endpoints_changed), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x5412001C, // 0002 LDINT R4 29 - 0x58140002, // 0003 LDCONST R5 K2 - 0x50180000, // 0004 LDBOOL R6 0 0 - 0x7C040A00, // 0005 CALL R1 5 - 0x8C040100, // 0006 GETMET R1 R0 K0 - 0x540EFEFF, // 0007 LDINT R3 65280 - 0x5412001C, // 0008 LDINT R4 29 - 0x58140002, // 0009 LDCONST R5 K2 - 0x50180000, // 000A LDBOOL R6 0 0 - 0x7C040A00, // 000B CALL R1 5 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_remotes_info -********************************************************************/ -be_local_closure(Matter_Device_update_remotes_info, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(get_info), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_nested_str_weak(plugins_config_remotes), - }), - be_str_weak(update_remotes_info), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x60040013, // 0000 GETGBL R1 G19 - 0x7C040000, // 0001 CALL R1 0 - 0x88080100, // 0002 GETMBR R2 R0 K0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x20080403, // 0004 NE R2 R2 R3 - 0x780A0018, // 0005 JMPF R2 #001F - 0x60080010, // 0006 GETGBL R2 G16 - 0x880C0100, // 0007 GETMBR R3 R0 K0 - 0x8C0C0701, // 0008 GETMET R3 R3 K1 - 0x7C0C0200, // 0009 CALL R3 1 - 0x7C080200, // 000A CALL R2 1 - 0xA802000F, // 000B EXBLK 0 #001C - 0x5C0C0400, // 000C MOVE R3 R2 - 0x7C0C0000, // 000D CALL R3 0 - 0x88100100, // 000E GETMBR R4 R0 K0 - 0x94100803, // 000F GETIDX R4 R4 R3 - 0x8C100902, // 0010 GETMET R4 R4 K2 - 0x7C100200, // 0011 CALL R4 1 - 0x4C140000, // 0012 LDNIL R5 - 0x20140805, // 0013 NE R5 R4 R5 - 0x78160005, // 0014 JMPF R5 #001B - 0x6014000C, // 0015 GETGBL R5 G12 - 0x5C180800, // 0016 MOVE R6 R4 - 0x7C140200, // 0017 CALL R5 1 - 0x24140B03, // 0018 GT R5 R5 K3 - 0x78160000, // 0019 JMPF R5 #001B - 0x98040604, // 001A SETIDX R1 R3 R4 - 0x7001FFEF, // 001B JMP #000C - 0x58080004, // 001C LDCONST R2 K4 - 0xAC080200, // 001D CATCH R2 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x90020A01, // 001F SETMBR R0 K5 R1 - 0x80040200, // 0020 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(root_discriminator), - /* K1 */ be_nested_str_weak(root_passcode), - /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Verhoeff), - /* K5 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x540A0FFE, // 0001 LDINT R2 4095 - 0x2C040202, // 0002 AND R1 R1 R2 - 0x540A0009, // 0003 LDINT R2 10 - 0x3C040202, // 0004 SHR R1 R1 R2 - 0x88080100, // 0005 GETMBR R2 R0 K0 - 0x540E02FF, // 0006 LDINT R3 768 - 0x2C080403, // 0007 AND R2 R2 R3 - 0x540E0005, // 0008 LDINT R3 6 - 0x38080403, // 0009 SHL R2 R2 R3 - 0x880C0101, // 000A GETMBR R3 R0 K1 - 0x54123FFE, // 000B LDINT R4 16383 - 0x2C0C0604, // 000C AND R3 R3 R4 - 0x30080403, // 000D OR R2 R2 R3 - 0x880C0101, // 000E GETMBR R3 R0 K1 - 0x5412000D, // 000F LDINT R4 14 - 0x3C0C0604, // 0010 SHR R3 R3 R4 - 0x60100018, // 0011 GETGBL R4 G24 - 0x58140002, // 0012 LDCONST R5 K2 - 0x5C180200, // 0013 MOVE R6 R1 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x5C200600, // 0015 MOVE R8 R3 - 0x7C100800, // 0016 CALL R4 4 - 0xB8160600, // 0017 GETNGBL R5 K3 - 0x88140B04, // 0018 GETMBR R5 R5 K4 - 0x8C140B05, // 0019 GETMET R5 R5 K5 - 0x5C1C0800, // 001A MOVE R7 R4 - 0x7C140400, // 001B CALL R5 2 - 0x00100805, // 001C ADD R4 R4 R5 - 0x80040800, // 001D RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_remote_info -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config_remotes), - /* K1 */ be_nested_str_weak(find), - }), - be_str_weak(get_plugin_remote_info), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x60140013, // 0003 GETGBL R5 G19 - 0x7C140000, // 0004 CALL R5 0 - 0x7C080600, // 0005 CALL R2 3 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 2, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 - 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(FILENAME), - /* K2 */ be_nested_str_weak(read), - /* K3 */ be_nested_str_weak(close), - /* K4 */ be_nested_str_weak(json), - /* K5 */ be_nested_str_weak(load), - /* K6 */ be_nested_str_weak(root_discriminator), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(distinguish), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(passcode), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(disable_bridge_mode), - /* K13 */ be_nested_str_weak(next_ep), - /* K14 */ be_nested_str_weak(nextep), - /* K15 */ be_nested_str_weak(plugins_config), - /* K16 */ be_nested_str_weak(config), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(adjust_next_ep), - /* K22 */ be_nested_str_weak(plugins_persist), - /* K23 */ be_nested_str_weak(plugins_config_remotes), - /* K24 */ be_nested_str_weak(remotes), - /* K25 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), - /* K26 */ be_nested_str_weak(io_error), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K28 */ be_nested_str_weak(_X7C), - /* K29 */ be_const_int(2), - /* K30 */ be_nested_str_weak(random), - /* K31 */ be_nested_str_weak(get), - /* K32 */ be_const_int(0), - /* K33 */ be_nested_str_weak(generate_random_passcode), - /* K34 */ be_nested_str_weak(save_param), - }), - be_str_weak(load_param), - &be_const_str_solidified, - ( &(const binstruction[127]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA802004D, // 0001 EXBLK 0 #0050 - 0x60080011, // 0002 GETGBL R2 G17 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x7C080200, // 0004 CALL R2 1 - 0x8C0C0502, // 0005 GETMET R3 R2 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0x8C100503, // 0007 GETMET R4 R2 K3 - 0x7C100200, // 0008 CALL R4 1 - 0xA4120800, // 0009 IMPORT R4 K4 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x5C1C0600, // 000B MOVE R7 R3 - 0x7C140400, // 000C CALL R5 2 - 0x8C180B07, // 000D GETMET R6 R5 K7 - 0x58200008, // 000E LDCONST R8 K8 - 0x88240106, // 000F GETMBR R9 R0 K6 - 0x7C180600, // 0010 CALL R6 3 - 0x90020C06, // 0011 SETMBR R0 K6 R6 - 0x8C180B07, // 0012 GETMET R6 R5 K7 - 0x5820000A, // 0013 LDCONST R8 K10 - 0x88240109, // 0014 GETMBR R9 R0 K9 - 0x7C180600, // 0015 CALL R6 3 - 0x90021206, // 0016 SETMBR R0 K9 R6 - 0x60180017, // 0017 GETGBL R6 G23 - 0x8C1C0B07, // 0018 GETMET R7 R5 K7 - 0x5824000B, // 0019 LDCONST R9 K11 - 0x50280000, // 001A LDBOOL R10 0 0 - 0x7C1C0600, // 001B CALL R7 3 - 0x7C180200, // 001C CALL R6 1 - 0x90021606, // 001D SETMBR R0 K11 R6 - 0x60180017, // 001E GETGBL R6 G23 - 0x8C1C0B07, // 001F GETMET R7 R5 K7 - 0x5824000C, // 0020 LDCONST R9 K12 - 0x50280000, // 0021 LDBOOL R10 0 0 - 0x7C1C0600, // 0022 CALL R7 3 - 0x7C180200, // 0023 CALL R6 1 - 0x90021806, // 0024 SETMBR R0 K12 R6 - 0x8C180B07, // 0025 GETMET R6 R5 K7 - 0x5820000E, // 0026 LDCONST R8 K14 - 0x8824010D, // 0027 GETMBR R9 R0 K13 - 0x7C180600, // 0028 CALL R6 3 - 0x90021A06, // 0029 SETMBR R0 K13 R6 - 0x8C180B07, // 002A GETMET R6 R5 K7 - 0x58200010, // 002B LDCONST R8 K16 - 0x7C180400, // 002C CALL R6 2 - 0x90021E06, // 002D SETMBR R0 K15 R6 - 0x8818010F, // 002E GETMBR R6 R0 K15 - 0x4C1C0000, // 002F LDNIL R7 - 0x20180C07, // 0030 NE R6 R6 R7 - 0x781A000B, // 0031 JMPF R6 #003E - 0xB81A2200, // 0032 GETNGBL R6 K17 - 0x8C180D12, // 0033 GETMET R6 R6 K18 - 0x60200008, // 0034 GETGBL R8 G8 - 0x8824010F, // 0035 GETMBR R9 R0 K15 - 0x7C200200, // 0036 CALL R8 1 - 0x00222608, // 0037 ADD R8 K19 R8 - 0x58240014, // 0038 LDCONST R9 K20 - 0x7C180600, // 0039 CALL R6 3 - 0x8C180115, // 003A GETMET R6 R0 K21 - 0x7C180200, // 003B CALL R6 1 - 0x50180200, // 003C LDBOOL R6 1 0 - 0x90022C06, // 003D SETMBR R0 K22 R6 - 0x8C180B07, // 003E GETMET R6 R5 K7 - 0x58200018, // 003F LDCONST R8 K24 - 0x60240013, // 0040 GETGBL R9 G19 - 0x7C240000, // 0041 CALL R9 0 - 0x7C180600, // 0042 CALL R6 3 - 0x90022E06, // 0043 SETMBR R0 K23 R6 - 0x88180117, // 0044 GETMBR R6 R0 K23 - 0x781A0007, // 0045 JMPF R6 #004E - 0xB81A2200, // 0046 GETNGBL R6 K17 - 0x8C180D12, // 0047 GETMET R6 R6 K18 - 0x60200008, // 0048 GETGBL R8 G8 - 0x88240117, // 0049 GETMBR R9 R0 K23 - 0x7C200200, // 004A CALL R8 1 - 0x00223208, // 004B ADD R8 K25 R8 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C180600, // 004D CALL R6 3 - 0xA8040001, // 004E EXBLK 1 1 - 0x70020012, // 004F JMP #0063 - 0xAC080002, // 0050 CATCH R2 0 2 - 0x7002000F, // 0051 JMP #0062 - 0x2010051A, // 0052 NE R4 R2 K26 - 0x7812000C, // 0053 JMPF R4 #0061 - 0xB8122200, // 0054 GETNGBL R4 K17 - 0x8C100912, // 0055 GETMET R4 R4 K18 - 0x60180008, // 0056 GETGBL R6 G8 - 0x5C1C0400, // 0057 MOVE R7 R2 - 0x7C180200, // 0058 CALL R6 1 - 0x001A3606, // 0059 ADD R6 K27 R6 - 0x00180D1C, // 005A ADD R6 R6 K28 - 0x601C0008, // 005B GETGBL R7 G8 - 0x5C200600, // 005C MOVE R8 R3 - 0x7C1C0200, // 005D CALL R7 1 - 0x00180C07, // 005E ADD R6 R6 R7 - 0x581C001D, // 005F LDCONST R7 K29 - 0x7C100600, // 0060 CALL R4 3 - 0x70020000, // 0061 JMP #0063 - 0xB0080000, // 0062 RAISE 2 R0 R0 - 0x50080000, // 0063 LDBOOL R2 0 0 - 0x880C0106, // 0064 GETMBR R3 R0 K6 - 0x4C100000, // 0065 LDNIL R4 - 0x1C0C0604, // 0066 EQ R3 R3 R4 - 0x780E000A, // 0067 JMPF R3 #0073 - 0x8C0C031E, // 0068 GETMET R3 R1 K30 - 0x5814001D, // 0069 LDCONST R5 K29 - 0x7C0C0400, // 006A CALL R3 2 - 0x8C0C071F, // 006B GETMET R3 R3 K31 - 0x58140020, // 006C LDCONST R5 K32 - 0x5818001D, // 006D LDCONST R6 K29 - 0x7C0C0600, // 006E CALL R3 3 - 0x54120FFE, // 006F LDINT R4 4095 - 0x2C0C0604, // 0070 AND R3 R3 R4 - 0x90020C03, // 0071 SETMBR R0 K6 R3 - 0x50080200, // 0072 LDBOOL R2 1 0 - 0x880C0109, // 0073 GETMBR R3 R0 K9 - 0x4C100000, // 0074 LDNIL R4 - 0x1C0C0604, // 0075 EQ R3 R3 R4 - 0x780E0003, // 0076 JMPF R3 #007B - 0x8C0C0121, // 0077 GETMET R3 R0 K33 - 0x7C0C0200, // 0078 CALL R3 1 - 0x90021203, // 0079 SETMBR R0 K9 R3 - 0x50080200, // 007A LDBOOL R2 1 0 - 0x780A0001, // 007B JMPF R2 #007E - 0x8C0C0122, // 007C GETMET R3 R0 K34 - 0x7C0C0200, // 007D CALL R3 1 - 0x80000000, // 007E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: bridge_remove_endpoint ********************************************************************/ @@ -2672,532 +2914,6 @@ be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(PASE_TIMEOUT), - /* K1 */ be_nested_str_weak(compute_manual_pairing_code), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(compute_qrcode_content), - /* K7 */ be_nested_str_weak(publish_result), - /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K9 */ be_nested_str_weak(Matter), - /* K10 */ be_nested_str_weak(_compute_pbkdf), - /* K11 */ be_nested_str_weak(root_passcode), - /* K12 */ be_nested_str_weak(root_iterations), - /* K13 */ be_nested_str_weak(root_salt), - /* K14 */ be_nested_str_weak(start_basic_commissioning), - /* K15 */ be_nested_str_weak(root_discriminator), - /* K16 */ be_nested_str_weak(root_w0), - /* K17 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x8C080101, // 0004 GETMET R2 R0 K1 - 0x7C080200, // 0005 CALL R2 1 - 0xB80E0400, // 0006 GETNGBL R3 K2 - 0x8C0C0703, // 0007 GETMET R3 R3 K3 - 0x60140018, // 0008 GETGBL R5 G24 - 0x58180004, // 0009 LDCONST R6 K4 - 0x5C1C0400, // 000A MOVE R7 R2 - 0x7C140400, // 000B CALL R5 2 - 0x58180005, // 000C LDCONST R6 K5 - 0x7C0C0600, // 000D CALL R3 3 - 0x8C0C0106, // 000E GETMET R3 R0 K6 - 0x7C0C0200, // 000F CALL R3 1 - 0xB8120400, // 0010 GETNGBL R4 K2 - 0x8C100907, // 0011 GETMET R4 R4 K7 - 0x60180018, // 0012 GETGBL R6 G24 - 0x581C0008, // 0013 LDCONST R7 K8 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x7C180600, // 0016 CALL R6 3 - 0x581C0009, // 0017 LDCONST R7 K9 - 0x7C100600, // 0018 CALL R4 3 - 0x8C10010A, // 0019 GETMET R4 R0 K10 - 0x8818010B, // 001A GETMBR R6 R0 K11 - 0x881C010C, // 001B GETMBR R7 R0 K12 - 0x8820010D, // 001C GETMBR R8 R0 K13 - 0x7C100800, // 001D CALL R4 4 - 0x8C10010E, // 001E GETMET R4 R0 K14 - 0x5C180200, // 001F MOVE R6 R1 - 0x881C010C, // 0020 GETMBR R7 R0 K12 - 0x8820010F, // 0021 GETMBR R8 R0 K15 - 0x8824010D, // 0022 GETMBR R9 R0 K13 - 0x88280110, // 0023 GETMBR R10 R0 K16 - 0x882C0111, // 0024 GETMBR R11 R0 K17 - 0x4C300000, // 0025 LDNIL R12 - 0x7C101000, // 0026 CALL R4 8 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: adjust_next_ep -********************************************************************/ -be_local_closure(Matter_Device_adjust_next_ep, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(next_ep), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(adjust_next_ep), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000A, // 0005 EXBLK 0 #0011 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x600C0009, // 0008 GETGBL R3 G9 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x28100604, // 000C GE R4 R3 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x00100703, // 000E ADD R4 R3 K3 - 0x90020404, // 000F SETMBR R0 K2 R4 - 0x7001FFF4, // 0010 JMP #0006 - 0x58040004, // 0011 LDCONST R1 K4 - 0xAC040200, // 0012 CATCH R1 1 0 - 0xB0080000, // 0013 RAISE 2 R0 R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(add_hostname), - /* K13 */ be_nested_str_weak(ip6local), - /* K14 */ be_nested_str_weak(ip), - /* K15 */ be_nested_str_weak(ip6), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(hostname_wifi), - /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[140]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020072, // 0004 EXBLK 0 #0078 - 0x78060030, // 0005 JMPF R1 #0037 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416000F, // 0012 JMPT R5 #0023 - 0x8C14050C, // 0013 GETMET R5 R2 K12 - 0x881C0105, // 0014 GETMBR R7 R0 K5 - 0x8C200907, // 0015 GETMET R8 R4 K7 - 0x5828000D, // 0016 LDCONST R10 K13 - 0x582C000A, // 0017 LDCONST R11 K10 - 0x7C200600, // 0018 CALL R8 3 - 0x8C240907, // 0019 GETMET R9 R4 K7 - 0x582C000E, // 001A LDCONST R11 K14 - 0x5830000A, // 001B LDCONST R12 K10 - 0x7C240600, // 001C CALL R9 3 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x5830000F, // 001E LDCONST R12 K15 - 0x5834000A, // 001F LDCONST R13 K10 - 0x7C280600, // 0020 CALL R10 3 - 0x7C140A00, // 0021 CALL R5 5 - 0x70020012, // 0022 JMP #0036 - 0xB8160600, // 0023 GETNGBL R5 K3 - 0x8C140B10, // 0024 GETMET R5 R5 K16 - 0x601C0018, // 0025 GETGBL R7 G24 - 0x58200011, // 0026 LDCONST R8 K17 - 0x88240105, // 0027 GETMBR R9 R0 K5 - 0x8C280907, // 0028 GETMET R10 R4 K7 - 0x5830000E, // 0029 LDCONST R12 K14 - 0x5834000A, // 002A LDCONST R13 K10 - 0x7C280600, // 002B CALL R10 3 - 0x7C1C0600, // 002C CALL R7 3 - 0x58200012, // 002D LDCONST R8 K18 - 0x7C140600, // 002E CALL R5 3 - 0x8C14050C, // 002F GETMET R5 R2 K12 - 0x881C0105, // 0030 GETMBR R7 R0 K5 - 0x8C200907, // 0031 GETMET R8 R4 K7 - 0x5828000E, // 0032 LDCONST R10 K14 - 0x582C000A, // 0033 LDCONST R11 K10 - 0x7C200600, // 0034 CALL R8 3 - 0x7C140600, // 0035 CALL R5 3 - 0x7002002F, // 0036 JMP #0067 - 0xB8120600, // 0037 GETNGBL R4 K3 - 0x8C100913, // 0038 GETMET R4 R4 K19 - 0x7C100200, // 0039 CALL R4 1 - 0x8C140706, // 003A GETMET R5 R3 K6 - 0x8C1C0907, // 003B GETMET R7 R4 K7 - 0x58240008, // 003C LDCONST R9 K8 - 0x7C1C0400, // 003D CALL R7 2 - 0x58200009, // 003E LDCONST R8 K9 - 0x5824000A, // 003F LDCONST R9 K10 - 0x7C140800, // 0040 CALL R5 4 - 0x90022805, // 0041 SETMBR R0 K20 R5 - 0x8814010B, // 0042 GETMBR R5 R0 K11 - 0x7416000F, // 0043 JMPT R5 #0054 - 0x8C14050C, // 0044 GETMET R5 R2 K12 - 0x881C0114, // 0045 GETMBR R7 R0 K20 - 0x8C200907, // 0046 GETMET R8 R4 K7 - 0x5828000D, // 0047 LDCONST R10 K13 - 0x582C000A, // 0048 LDCONST R11 K10 - 0x7C200600, // 0049 CALL R8 3 - 0x8C240907, // 004A GETMET R9 R4 K7 - 0x582C000E, // 004B LDCONST R11 K14 - 0x5830000A, // 004C LDCONST R12 K10 - 0x7C240600, // 004D CALL R9 3 - 0x8C280907, // 004E GETMET R10 R4 K7 - 0x5830000F, // 004F LDCONST R12 K15 - 0x5834000A, // 0050 LDCONST R13 K10 - 0x7C280600, // 0051 CALL R10 3 - 0x7C140A00, // 0052 CALL R5 5 - 0x70020012, // 0053 JMP #0067 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B10, // 0055 GETMET R5 R5 K16 - 0x601C0018, // 0056 GETGBL R7 G24 - 0x58200011, // 0057 LDCONST R8 K17 - 0x88240105, // 0058 GETMBR R9 R0 K5 - 0x8C280907, // 0059 GETMET R10 R4 K7 - 0x5830000E, // 005A LDCONST R12 K14 - 0x5834000A, // 005B LDCONST R13 K10 - 0x7C280600, // 005C CALL R10 3 - 0x7C1C0600, // 005D CALL R7 3 - 0x58200012, // 005E LDCONST R8 K18 - 0x7C140600, // 005F CALL R5 3 - 0x8C14050C, // 0060 GETMET R5 R2 K12 - 0x881C0114, // 0061 GETMBR R7 R0 K20 - 0x8C200907, // 0062 GETMET R8 R4 K7 - 0x5828000E, // 0063 LDCONST R10 K14 - 0x582C000A, // 0064 LDCONST R11 K10 - 0x7C200600, // 0065 CALL R8 3 - 0x7C140600, // 0066 CALL R5 3 - 0xB8120600, // 0067 GETNGBL R4 K3 - 0x8C100910, // 0068 GETMET R4 R4 K16 - 0x60180018, // 0069 GETGBL R6 G24 - 0x581C0015, // 006A LDCONST R7 K21 - 0x78060001, // 006B JMPF R1 #006E - 0x58200004, // 006C LDCONST R8 K4 - 0x70020000, // 006D JMP #006F - 0x58200013, // 006E LDCONST R8 K19 - 0x78060001, // 006F JMPF R1 #0072 - 0x88240105, // 0070 GETMBR R9 R0 K5 - 0x70020000, // 0071 JMP #0073 - 0x88240114, // 0072 GETMBR R9 R0 K20 - 0x7C180600, // 0073 CALL R6 3 - 0x581C0012, // 0074 LDCONST R7 K18 - 0x7C100600, // 0075 CALL R4 3 - 0xA8040001, // 0076 EXBLK 1 1 - 0x70020010, // 0077 JMP #0089 - 0xAC100002, // 0078 CATCH R4 0 2 - 0x7002000D, // 0079 JMP #0088 - 0xB81A0600, // 007A GETNGBL R6 K3 - 0x8C180D10, // 007B GETMET R6 R6 K16 - 0x60200008, // 007C GETGBL R8 G8 - 0x5C240800, // 007D MOVE R9 R4 - 0x7C200200, // 007E CALL R8 1 - 0x00222C08, // 007F ADD R8 K22 R8 - 0x00201117, // 0080 ADD R8 R8 K23 - 0x60240008, // 0081 GETGBL R9 G8 - 0x5C280A00, // 0082 MOVE R10 R5 - 0x7C240200, // 0083 CALL R9 1 - 0x00201009, // 0084 ADD R8 R8 R9 - 0x58240018, // 0085 LDCONST R9 K24 - 0x7C180600, // 0086 CALL R6 3 - 0x70020000, // 0087 JMP #0089 - 0xB0080000, // 0088 RAISE 2 R0 R0 - 0x8C100119, // 0089 GETMET R4 R0 K25 - 0x7C100200, // 008A CALL R4 1 - 0x80000000, // 008B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_root_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(is_root_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060003, // 0003 JMPF R1 #0008 - 0x88040101, // 0004 GETMBR R1 R0 K1 - 0x4C080000, // 0005 LDNIL R2 - 0x1C040202, // 0006 EQ R1 R1 R2 - 0x74060000, // 0007 JMPT R1 #0009 - 0x50040001, // 0008 LDBOOL R1 0 1 - 0x50040200, // 0009 LDBOOL R1 1 0 - 0x80040200, // 000A RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x58100007, // 0011 LDCONST R4 K7 - 0x5C140200, // 0012 MOVE R5 R1 - 0x7C080600, // 0013 CALL R2 3 - 0x90020002, // 0014 SETMBR R0 K0 R2 - 0x88080100, // 0015 GETMBR R2 R0 K0 - 0x8C080508, // 0016 GETMET R2 R2 K8 - 0x84100000, // 0017 CLOSURE R4 P0 - 0x7C080400, // 0018 CALL R2 2 - 0xA0000000, // 0019 CLOSE R0 - 0x80000000, // 001A RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: stop ********************************************************************/ @@ -3237,11 +2953,139 @@ be_local_closure(Matter_Device_stop, /* name */ /******************************************************************** -** Solidified function: remove_fabric +** Solidified function: register_native_classes ********************************************************************/ -be_local_closure(Matter_Device_remove_fabric, /* name */ +be_local_closure(Matter_Device_register_native_classes, /* name */ be_nested_proto( - 10, /* nstack */ + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_send +********************************************************************/ +be_local_closure(Matter_Device_msg_send, /* name */ + be_nested_proto( + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3249,87 +3093,197 @@ be_local_closure(Matter_Device_remove_fabric, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(find_children_fabrics), - /* K2 */ be_nested_str_weak(get_fabric_index), - /* K3 */ be_nested_str_weak(find_fabric_by_index), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), - /* K7 */ be_nested_str_weak(get_fabric_id), - /* K8 */ be_nested_str_weak(copy), - /* K9 */ be_nested_str_weak(reverse), - /* K10 */ be_nested_str_weak(tohex), - /* K11 */ be_const_int(2), - /* K12 */ be_nested_str_weak(message_handler), - /* K13 */ be_nested_str_weak(im), - /* K14 */ be_nested_str_weak(subs_shop), - /* K15 */ be_nested_str_weak(remove_by_fabric), - /* K16 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K17 */ be_nested_str_weak(remove_fabric), - /* K18 */ be_nested_str_weak(stop_iteration), - /* K19 */ be_nested_str_weak(save_fabrics), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(remove_fabric), + be_str_weak(msg_send), &be_const_str_solidified, - ( &(const binstruction[56]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x8C100302, // 0002 GETMET R4 R1 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x7C080400, // 0004 CALL R2 2 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C0C0403, // 0006 EQ R3 R2 R3 - 0x780E0000, // 0007 JMPF R3 #0009 - 0x80000600, // 0008 RET 0 - 0x600C0010, // 0009 GETGBL R3 G16 - 0x5C100400, // 000A MOVE R4 R2 - 0x7C0C0200, // 000B CALL R3 1 - 0xA8020023, // 000C EXBLK 0 #0031 - 0x5C100600, // 000D MOVE R4 R3 - 0x7C100000, // 000E CALL R4 0 - 0x88140100, // 000F GETMBR R5 R0 K0 - 0x8C140B03, // 0010 GETMET R5 R5 K3 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x4C180000, // 0013 LDNIL R6 - 0x20180A06, // 0014 NE R6 R5 R6 - 0x781A0019, // 0015 JMPF R6 #0030 - 0xB81A0800, // 0016 GETNGBL R6 K4 - 0x8C180D05, // 0017 GETMET R6 R6 K5 - 0x8C200B07, // 0018 GETMET R8 R5 K7 - 0x7C200200, // 0019 CALL R8 1 - 0x8C201108, // 001A GETMET R8 R8 K8 - 0x7C200200, // 001B CALL R8 1 - 0x8C201109, // 001C GETMET R8 R8 K9 - 0x7C200200, // 001D CALL R8 1 - 0x8C20110A, // 001E GETMET R8 R8 K10 - 0x7C200200, // 001F CALL R8 1 - 0x00220C08, // 0020 ADD R8 K6 R8 - 0x5824000B, // 0021 LDCONST R9 K11 - 0x7C180600, // 0022 CALL R6 3 - 0x8818010C, // 0023 GETMBR R6 R0 K12 - 0x88180D0D, // 0024 GETMBR R6 R6 K13 - 0x88180D0E, // 0025 GETMBR R6 R6 K14 - 0x8C180D0F, // 0026 GETMET R6 R6 K15 - 0x5C200A00, // 0027 MOVE R8 R5 - 0x7C180400, // 0028 CALL R6 2 - 0x8C180110, // 0029 GETMET R6 R0 K16 - 0x5C200A00, // 002A MOVE R8 R5 - 0x7C180400, // 002B CALL R6 2 - 0x88180100, // 002C GETMBR R6 R0 K0 - 0x8C180D11, // 002D GETMET R6 R6 K17 - 0x5C200A00, // 002E MOVE R8 R5 - 0x7C180400, // 002F CALL R6 2 - 0x7001FFDB, // 0030 JMP #000D - 0x580C0012, // 0031 LDCONST R3 K18 - 0xAC0C0200, // 0032 CATCH R3 1 0 - 0xB0080000, // 0033 RAISE 2 R0 R0 - 0x880C0100, // 0034 GETMBR R3 R0 K0 - 0x8C0C0713, // 0035 GETMET R3 R3 K19 - 0x7C0C0200, // 0036 CALL R3 1 - 0x80000000, // 0037 RET 0 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: conf_to_log +********************************************************************/ +be_local_closure(Matter_Device_conf_to_log, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(k2l), + /* K3 */ be_nested_str_weak(type), + /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(conf_to_log), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x5C180000, // 0004 MOVE R6 R0 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA802000B, // 0007 EXBLK 0 #0014 + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x1C140903, // 000A EQ R5 R4 K3 + 0x78160000, // 000B JMPF R5 #000D + 0x7001FFFA, // 000C JMP #0008 + 0x60140018, // 000D GETGBL R5 G24 + 0x58180004, // 000E LDCONST R6 K4 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x94200004, // 0010 GETIDX R8 R0 R4 + 0x7C140600, // 0011 CALL R5 3 + 0x00080405, // 0012 ADD R2 R2 R5 + 0x7001FFF3, // 0013 JMP #0008 + 0x580C0005, // 0014 LDCONST R3 K5 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x80040400, // 0017 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_remotes_info +********************************************************************/ +be_local_closure(Matter_Device_update_remotes_info, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(get_info), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(plugins_config_remotes), + }), + be_str_weak(update_remotes_info), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x60040013, // 0000 GETGBL R1 G19 + 0x7C040000, // 0001 CALL R1 0 + 0x88080100, // 0002 GETMBR R2 R0 K0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x20080403, // 0004 NE R2 R2 R3 + 0x780A0018, // 0005 JMPF R2 #001F + 0x60080010, // 0006 GETGBL R2 G16 + 0x880C0100, // 0007 GETMBR R3 R0 K0 + 0x8C0C0701, // 0008 GETMET R3 R3 K1 + 0x7C0C0200, // 0009 CALL R3 1 + 0x7C080200, // 000A CALL R2 1 + 0xA802000F, // 000B EXBLK 0 #001C + 0x5C0C0400, // 000C MOVE R3 R2 + 0x7C0C0000, // 000D CALL R3 0 + 0x88100100, // 000E GETMBR R4 R0 K0 + 0x94100803, // 000F GETIDX R4 R4 R3 + 0x8C100902, // 0010 GETMET R4 R4 K2 + 0x7C100200, // 0011 CALL R4 1 + 0x4C140000, // 0012 LDNIL R5 + 0x20140805, // 0013 NE R5 R4 R5 + 0x78160005, // 0014 JMPF R5 #001B + 0x6014000C, // 0015 GETGBL R5 G12 + 0x5C180800, // 0016 MOVE R6 R4 + 0x7C140200, // 0017 CALL R5 1 + 0x24140B03, // 0018 GT R5 R5 K3 + 0x78160000, // 0019 JMPF R5 #001B + 0x98040604, // 001A SETIDX R1 R3 R4 + 0x7001FFEF, // 001B JMP #000C + 0x58080004, // 001C LDCONST R2 K4 + 0xAC080200, // 001D CATCH R2 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x90020A01, // 001F SETMBR R0 K5 R1 + 0x80040200, // 0020 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 }) ) ); @@ -3373,6 +3327,200 @@ be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: generate_random_passcode +********************************************************************/ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(generate_random_passcode), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ + be_nested_proto( + 12, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(get_device_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(get_fabric_compressed), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(_X2D), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(eth), + /* K9 */ be_nested_str_weak(find), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(log), + /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(remove_service), + /* K15 */ be_nested_str_weak(_matter), + /* K16 */ be_nested_str_weak(_tcp), + /* K17 */ be_nested_str_weak(hostname_eth), + /* K18 */ be_nested_str_weak(wifi), + /* K19 */ be_nested_str_weak(hostname_wifi), + /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K21 */ be_nested_str_weak(_X7C), + /* K22 */ be_const_int(2), + }), + be_str_weak(mdns_remove_op_discovery), + &be_const_str_solidified, + ( &(const binstruction[80]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA802003B, // 0001 EXBLK 0 #003E + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100304, // 0008 GETMET R4 R1 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x7C140200, // 000B CALL R5 1 + 0x00140B06, // 000C ADD R5 R5 K6 + 0x8C180705, // 000D GETMET R6 R3 K5 + 0x7C180200, // 000E CALL R6 1 + 0x00140A06, // 000F ADD R5 R5 R6 + 0xB81A0E00, // 0010 GETNGBL R6 K7 + 0x8C180D08, // 0011 GETMET R6 R6 K8 + 0x7C180200, // 0012 CALL R6 1 + 0x8C180D09, // 0013 GETMET R6 R6 K9 + 0x5820000A, // 0014 LDCONST R8 K10 + 0x7C180400, // 0015 CALL R6 2 + 0x781A000E, // 0016 JMPF R6 #0026 + 0xB81A0E00, // 0017 GETNGBL R6 K7 + 0x8C180D0B, // 0018 GETMET R6 R6 K11 + 0x60200018, // 0019 GETGBL R8 G24 + 0x5824000C, // 001A LDCONST R9 K12 + 0x58280008, // 001B LDCONST R10 K8 + 0x5C2C0A00, // 001C MOVE R11 R5 + 0x7C200600, // 001D CALL R8 3 + 0x5824000D, // 001E LDCONST R9 K13 + 0x7C180600, // 001F CALL R6 3 + 0x8C18050E, // 0020 GETMET R6 R2 K14 + 0x5820000F, // 0021 LDCONST R8 K15 + 0x58240010, // 0022 LDCONST R9 K16 + 0x5C280A00, // 0023 MOVE R10 R5 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x7C180A00, // 0025 CALL R6 5 + 0xB81A0E00, // 0026 GETNGBL R6 K7 + 0x8C180D12, // 0027 GETMET R6 R6 K18 + 0x7C180200, // 0028 CALL R6 1 + 0x8C180D09, // 0029 GETMET R6 R6 K9 + 0x5820000A, // 002A LDCONST R8 K10 + 0x7C180400, // 002B CALL R6 2 + 0x781A000E, // 002C JMPF R6 #003C + 0xB81A0E00, // 002D GETNGBL R6 K7 + 0x8C180D0B, // 002E GETMET R6 R6 K11 + 0x60200018, // 002F GETGBL R8 G24 + 0x5824000C, // 0030 LDCONST R9 K12 + 0x58280012, // 0031 LDCONST R10 K18 + 0x5C2C0A00, // 0032 MOVE R11 R5 + 0x7C200600, // 0033 CALL R8 3 + 0x5824000D, // 0034 LDCONST R9 K13 + 0x7C180600, // 0035 CALL R6 3 + 0x8C18050E, // 0036 GETMET R6 R2 K14 + 0x5820000F, // 0037 LDCONST R8 K15 + 0x58240010, // 0038 LDCONST R9 K16 + 0x5C280A00, // 0039 MOVE R10 R5 + 0x882C0113, // 003A GETMBR R11 R0 K19 + 0x7C180A00, // 003B CALL R6 5 + 0xA8040001, // 003C EXBLK 1 1 + 0x70020010, // 003D JMP #004F + 0xAC0C0002, // 003E CATCH R3 0 2 + 0x7002000D, // 003F JMP #004E + 0xB8160E00, // 0040 GETNGBL R5 K7 + 0x8C140B0B, // 0041 GETMET R5 R5 K11 + 0x601C0008, // 0042 GETGBL R7 G8 + 0x5C200600, // 0043 MOVE R8 R3 + 0x7C1C0200, // 0044 CALL R7 1 + 0x001E2807, // 0045 ADD R7 K20 R7 + 0x001C0F15, // 0046 ADD R7 R7 K21 + 0x60200008, // 0047 GETGBL R8 G8 + 0x5C240800, // 0048 MOVE R9 R4 + 0x7C200200, // 0049 CALL R8 1 + 0x001C0E08, // 004A ADD R7 R7 R8 + 0x58200016, // 004B LDCONST R8 K22 + 0x7C140600, // 004C CALL R5 3 + 0x70020000, // 004D JMP #004F + 0xB0080000, // 004E RAISE 2 R0 R0 + 0x80000000, // 004F RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: clean_remotes ********************************************************************/ @@ -3497,11 +3645,130 @@ be_local_closure(Matter_Device_clean_remotes, /* name */ /******************************************************************** -** Solidified function: stop_basic_commissioning +** Solidified function: register_plugin_class ********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ +be_local_closure(Matter_Device_register_plugin_class, /* name */ be_nested_proto( - 5, /* nstack */ + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(PASE_TIMEOUT), + /* K1 */ be_nested_str_weak(compute_manual_pairing_code), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(compute_qrcode_content), + /* K7 */ be_nested_str_weak(publish_result), + /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K9 */ be_nested_str_weak(Matter), + /* K10 */ be_nested_str_weak(_compute_pbkdf), + /* K11 */ be_nested_str_weak(root_passcode), + /* K12 */ be_nested_str_weak(root_iterations), + /* K13 */ be_nested_str_weak(root_salt), + /* K14 */ be_nested_str_weak(start_basic_commissioning), + /* K15 */ be_nested_str_weak(root_discriminator), + /* K16 */ be_nested_str_weak(root_w0), + /* K17 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x8C080101, // 0004 GETMET R2 R0 K1 + 0x7C080200, // 0005 CALL R2 1 + 0xB80E0400, // 0006 GETNGBL R3 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180004, // 0009 LDCONST R6 K4 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x7C140400, // 000B CALL R5 2 + 0x58180005, // 000C LDCONST R6 K5 + 0x7C0C0600, // 000D CALL R3 3 + 0x8C0C0106, // 000E GETMET R3 R0 K6 + 0x7C0C0200, // 000F CALL R3 1 + 0xB8120400, // 0010 GETNGBL R4 K2 + 0x8C100907, // 0011 GETMET R4 R4 K7 + 0x60180018, // 0012 GETGBL R6 G24 + 0x581C0008, // 0013 LDCONST R7 K8 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x7C180600, // 0016 CALL R6 3 + 0x581C0009, // 0017 LDCONST R7 K9 + 0x7C100600, // 0018 CALL R4 3 + 0x8C10010A, // 0019 GETMET R4 R0 K10 + 0x8818010B, // 001A GETMBR R6 R0 K11 + 0x881C010C, // 001B GETMBR R7 R0 K12 + 0x8820010D, // 001C GETMBR R8 R0 K13 + 0x7C100800, // 001D CALL R4 4 + 0x8C10010E, // 001E GETMET R4 R0 K14 + 0x5C180200, // 001F MOVE R6 R1 + 0x881C010C, // 0020 GETMBR R7 R0 K12 + 0x8820010F, // 0021 GETMBR R8 R0 K15 + 0x8824010D, // 0022 GETMBR R9 R0 K13 + 0x88280110, // 0023 GETMBR R10 R0 K16 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x4C300000, // 0025 LDNIL R12 + 0x7C101000, // 0026 CALL R4 8 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ + be_nested_proto( + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3509,49 +3776,966 @@ be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), }), - be_str_weak(stop_basic_commissioning), + be_str_weak(event_fabrics_saved), &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_announce_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_announce_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(mdns_pase_eth), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K5 */ be_nested_str_weak(_matterc), + /* K6 */ be_nested_str_weak(_udp), + /* K7 */ be_nested_str_weak(commissioning_instance_eth), + /* K8 */ be_nested_str_weak(hostname_eth), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(remove_service), + /* K13 */ be_nested_str_weak(mdns_pase_wifi), + /* K14 */ be_nested_str_weak(commissioning_instance_wifi), + /* K15 */ be_nested_str_weak(hostname_wifi), + /* K16 */ be_nested_str_weak(wifi), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K18 */ be_nested_str_weak(_X7C), + /* K19 */ be_const_int(2), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[82]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA802003D, // 0001 EXBLK 0 #0040 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x780A001B, // 0003 JMPF R2 #0020 + 0xB80A0400, // 0004 GETNGBL R2 K2 + 0x8C080503, // 0005 GETMET R2 R2 K3 + 0x60100018, // 0006 GETGBL R4 G24 + 0x58140004, // 0007 LDCONST R5 K4 + 0x58180005, // 0008 LDCONST R6 K5 + 0x581C0006, // 0009 LDCONST R7 K6 + 0x88200107, // 000A GETMBR R8 R0 K7 + 0x88240108, // 000B GETMBR R9 R0 K8 + 0x7C100A00, // 000C CALL R4 5 + 0x58140009, // 000D LDCONST R5 K9 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0400, // 000F GETNGBL R2 K2 + 0x8C080503, // 0010 GETMET R2 R2 K3 + 0x60100018, // 0011 GETGBL R4 G24 + 0x5814000A, // 0012 LDCONST R5 K10 + 0x5818000B, // 0013 LDCONST R6 K11 + 0x881C0107, // 0014 GETMBR R7 R0 K7 + 0x7C100600, // 0015 CALL R4 3 + 0x58140009, // 0016 LDCONST R5 K9 + 0x7C080600, // 0017 CALL R2 3 + 0x50080000, // 0018 LDBOOL R2 0 0 + 0x90020202, // 0019 SETMBR R0 K1 R2 + 0x8C08030C, // 001A GETMET R2 R1 K12 + 0x58100005, // 001B LDCONST R4 K5 + 0x58140006, // 001C LDCONST R5 K6 + 0x88180107, // 001D GETMBR R6 R0 K7 + 0x881C0108, // 001E GETMBR R7 R0 K8 + 0x7C080A00, // 001F CALL R2 5 + 0x8808010D, // 0020 GETMBR R2 R0 K13 + 0x780A001B, // 0021 JMPF R2 #003E + 0xB80A0400, // 0022 GETNGBL R2 K2 + 0x8C080503, // 0023 GETMET R2 R2 K3 + 0x60100018, // 0024 GETGBL R4 G24 + 0x58140004, // 0025 LDCONST R5 K4 + 0x58180005, // 0026 LDCONST R6 K5 + 0x581C0006, // 0027 LDCONST R7 K6 + 0x8820010E, // 0028 GETMBR R8 R0 K14 + 0x8824010F, // 0029 GETMBR R9 R0 K15 + 0x7C100A00, // 002A CALL R4 5 + 0x58140009, // 002B LDCONST R5 K9 + 0x7C080600, // 002C CALL R2 3 + 0xB80A0400, // 002D GETNGBL R2 K2 + 0x8C080503, // 002E GETMET R2 R2 K3 + 0x60100018, // 002F GETGBL R4 G24 + 0x5814000A, // 0030 LDCONST R5 K10 + 0x58180010, // 0031 LDCONST R6 K16 + 0x881C010E, // 0032 GETMBR R7 R0 K14 + 0x7C100600, // 0033 CALL R4 3 + 0x58140009, // 0034 LDCONST R5 K9 + 0x7C080600, // 0035 CALL R2 3 + 0x50080000, // 0036 LDBOOL R2 0 0 + 0x90021A02, // 0037 SETMBR R0 K13 R2 + 0x8C08030C, // 0038 GETMET R2 R1 K12 + 0x58100005, // 0039 LDCONST R4 K5 + 0x58140006, // 003A LDCONST R5 K6 + 0x8818010E, // 003B GETMBR R6 R0 K14 + 0x881C010F, // 003C GETMBR R7 R0 K15 + 0x7C080A00, // 003D CALL R2 5 + 0xA8040001, // 003E EXBLK 1 1 + 0x70020010, // 003F JMP #0051 + 0xAC080002, // 0040 CATCH R2 0 2 + 0x7002000D, // 0041 JMP #0050 + 0xB8120400, // 0042 GETNGBL R4 K2 + 0x8C100903, // 0043 GETMET R4 R4 K3 + 0x60180008, // 0044 GETGBL R6 G8 + 0x5C1C0400, // 0045 MOVE R7 R2 + 0x7C180200, // 0046 CALL R6 1 + 0x001A2206, // 0047 ADD R6 K17 R6 + 0x00180D12, // 0048 ADD R6 R6 K18 + 0x601C0008, // 0049 GETGBL R7 G8 + 0x5C200600, // 004A MOVE R8 R3 + 0x7C1C0200, // 004B CALL R7 1 + 0x00180C07, // 004C ADD R6 R6 R7 + 0x581C0013, // 004D LDCONST R7 K19 + 0x7C100600, // 004E CALL R4 3 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(root_discriminator), + /* K1 */ be_nested_str_weak(root_passcode), + /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Verhoeff), + /* K5 */ be_nested_str_weak(checksum), + }), + be_str_weak(compute_manual_pairing_code), + &be_const_str_solidified, + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x540A0FFE, // 0001 LDINT R2 4095 + 0x2C040202, // 0002 AND R1 R1 R2 + 0x540A0009, // 0003 LDINT R2 10 + 0x3C040202, // 0004 SHR R1 R1 R2 + 0x88080100, // 0005 GETMBR R2 R0 K0 + 0x540E02FF, // 0006 LDINT R3 768 + 0x2C080403, // 0007 AND R2 R2 R3 + 0x540E0005, // 0008 LDINT R3 6 + 0x38080403, // 0009 SHL R2 R2 R3 + 0x880C0101, // 000A GETMBR R3 R0 K1 + 0x54123FFE, // 000B LDINT R4 16383 + 0x2C0C0604, // 000C AND R3 R3 R4 + 0x30080403, // 000D OR R2 R2 R3 + 0x880C0101, // 000E GETMBR R3 R0 K1 + 0x5412000D, // 000F LDINT R4 14 + 0x3C0C0604, // 0010 SHR R3 R3 R4 + 0x60100018, // 0011 GETGBL R4 G24 + 0x58140002, // 0012 LDCONST R5 K2 + 0x5C180200, // 0013 MOVE R6 R1 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x5C200600, // 0015 MOVE R8 R3 + 0x7C100800, // 0016 CALL R4 4 + 0xB8160600, // 0017 GETNGBL R5 K3 + 0x88140B04, // 0018 GETMBR R5 R5 K4 + 0x8C140B05, // 0019 GETMET R5 R5 K5 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0x00100805, // 001C ADD R4 R4 R5 + 0x80040800, // 001D RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: save_param +********************************************************************/ +be_local_closure(Matter_Device_save_param, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(update_remotes_info), + /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K3 */ be_nested_str_weak(root_discriminator), + /* K4 */ be_nested_str_weak(root_passcode), + /* K5 */ be_nested_str_weak(ipv4only), + /* K6 */ be_nested_str_weak(true), + /* K7 */ be_nested_str_weak(false), + /* K8 */ be_nested_str_weak(disable_bridge_mode), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(plugins_config_remotes), + /* K15 */ be_const_int(0), + /* K16 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), + /* K17 */ be_nested_str_weak(_X7D), + /* K18 */ be_nested_str_weak(FILENAME), + /* K19 */ be_nested_str_weak(w), + /* K20 */ be_nested_str_weak(write), + /* K21 */ be_nested_str_weak(close), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K25 */ be_nested_str_weak(_X20and_X20configuration), + /* K26 */ be_nested_str_weak(), + /* K27 */ be_const_int(2), + /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K29 */ be_nested_str_weak(_X7C), + }), + be_str_weak(save_param), + &be_const_str_solidified, + ( &(const binstruction[82]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x60080018, // 0003 GETGBL R2 G24 + 0x580C0002, // 0004 LDCONST R3 K2 + 0x88100103, // 0005 GETMBR R4 R0 K3 + 0x88140104, // 0006 GETMBR R5 R0 K4 + 0x88180105, // 0007 GETMBR R6 R0 K5 + 0x781A0001, // 0008 JMPF R6 #000B + 0x58180006, // 0009 LDCONST R6 K6 + 0x70020000, // 000A JMP #000C + 0x58180007, // 000B LDCONST R6 K7 + 0x881C0108, // 000C GETMBR R7 R0 K8 + 0x781E0001, // 000D JMPF R7 #0010 + 0x581C0006, // 000E LDCONST R7 K6 + 0x70020000, // 000F JMP #0011 + 0x581C0007, // 0010 LDCONST R7 K7 + 0x88200109, // 0011 GETMBR R8 R0 K9 + 0x7C080C00, // 0012 CALL R2 6 + 0x880C010A, // 0013 GETMBR R3 R0 K10 + 0x780E000E, // 0014 JMPF R3 #0024 + 0x0008050B, // 0015 ADD R2 R2 K11 + 0x8C0C030C, // 0016 GETMET R3 R1 K12 + 0x8814010D, // 0017 GETMBR R5 R0 K13 + 0x7C0C0400, // 0018 CALL R3 2 + 0x00080403, // 0019 ADD R2 R2 R3 + 0x600C000C, // 001A GETGBL R3 G12 + 0x8810010E, // 001B GETMBR R4 R0 K14 + 0x7C0C0200, // 001C CALL R3 1 + 0x240C070F, // 001D GT R3 R3 K15 + 0x780E0004, // 001E JMPF R3 #0024 + 0x00080510, // 001F ADD R2 R2 K16 + 0x8C0C030C, // 0020 GETMET R3 R1 K12 + 0x8814010E, // 0021 GETMBR R5 R0 K14 + 0x7C0C0400, // 0022 CALL R3 2 + 0x00080403, // 0023 ADD R2 R2 R3 + 0x00080511, // 0024 ADD R2 R2 K17 + 0xA8020018, // 0025 EXBLK 0 #003F + 0x600C0011, // 0026 GETGBL R3 G17 + 0x88100112, // 0027 GETMBR R4 R0 K18 + 0x58140013, // 0028 LDCONST R5 K19 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C100714, // 002A GETMET R4 R3 K20 + 0x5C180400, // 002B MOVE R6 R2 + 0x7C100400, // 002C CALL R4 2 + 0x8C100715, // 002D GETMET R4 R3 K21 + 0x7C100200, // 002E CALL R4 1 + 0xB8122C00, // 002F GETNGBL R4 K22 + 0x8C100917, // 0030 GETMET R4 R4 K23 + 0x60180018, // 0031 GETGBL R6 G24 + 0x581C0018, // 0032 LDCONST R7 K24 + 0x8820010A, // 0033 GETMBR R8 R0 K10 + 0x78220001, // 0034 JMPF R8 #0037 + 0x58200019, // 0035 LDCONST R8 K25 + 0x70020000, // 0036 JMP #0038 + 0x5820001A, // 0037 LDCONST R8 K26 + 0x7C180400, // 0038 CALL R6 2 + 0x581C001B, // 0039 LDCONST R7 K27 + 0x7C100600, // 003A CALL R4 3 + 0xA8040001, // 003B EXBLK 1 1 + 0x80040400, // 003C RET 1 R2 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020011, // 003E JMP #0051 + 0xAC0C0002, // 003F CATCH R3 0 2 + 0x7002000E, // 0040 JMP #0050 + 0xB8162C00, // 0041 GETNGBL R5 K22 + 0x8C140B17, // 0042 GETMET R5 R5 K23 + 0x601C0008, // 0043 GETGBL R7 G8 + 0x5C200600, // 0044 MOVE R8 R3 + 0x7C1C0200, // 0045 CALL R7 1 + 0x001E3807, // 0046 ADD R7 K28 R7 + 0x001C0F1D, // 0047 ADD R7 R7 K29 + 0x60200008, // 0048 GETGBL R8 G8 + 0x5C240800, // 0049 MOVE R9 R4 + 0x7C200200, // 004A CALL R8 1 + 0x001C0E08, // 004B ADD R7 R7 R8 + 0x5820001B, // 004C LDCONST R8 K27 + 0x7C140600, // 004D CALL R5 3 + 0x80040400, // 004E RET 1 R2 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: autoconf_device_map +********************************************************************/ +be_local_closure(Matter_Device_autoconf_device_map, /* name */ + be_nested_proto( + 20, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[36]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(light), + /* K3 */ be_nested_str_weak(get), + /* K4 */ be_nested_str_weak(find), + /* K5 */ be_nested_str_weak(channels), + /* K6 */ be_nested_str_weak(), + /* K7 */ be_const_int(0), + /* K8 */ be_nested_str_weak(type), + /* K9 */ be_nested_str_weak(light1), + /* K10 */ be_const_int(2), + /* K11 */ be_nested_str_weak(light2), + /* K12 */ be_nested_str_weak(light3), + /* K13 */ be_nested_str_weak(tasmota), + /* K14 */ be_nested_str_weak(cmd), + /* K15 */ be_nested_str_weak(Status_X2013), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(contains), + /* K20 */ be_nested_str_weak(StatusSHT), + /* K21 */ be_nested_str_weak(SHT), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), + /* K23 */ be_nested_str_weak(Relay1), + /* K24 */ be_nested_str_weak(Relay2), + /* K25 */ be_nested_str_weak(push), + /* K26 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K27 */ be_nested_str_weak(TiltConfig), + /* K28 */ be_nested_str_weak(shutter_X2Btilt), + /* K29 */ be_nested_str_weak(shutter), + /* K30 */ be_nested_str_weak(get_power), + /* K31 */ be_nested_str_weak(relay), + /* K32 */ be_nested_str_weak(load), + /* K33 */ be_nested_str_weak(read_sensors), + /* K34 */ be_nested_str_weak(autoconf_sensors_list), + /* K35 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(autoconf_device_map), + &be_const_str_solidified, + ( &(const binstruction[199]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x60080013, // 0001 GETGBL R2 G19 + 0x7C080000, // 0002 CALL R2 0 + 0x580C0001, // 0003 LDCONST R3 K1 + 0x50100000, // 0004 LDBOOL R4 0 0 + 0xA4160400, // 0005 IMPORT R5 K2 + 0x8C180B03, // 0006 GETMET R6 R5 K3 + 0x7C180200, // 0007 CALL R6 1 + 0x4C1C0000, // 0008 LDNIL R7 + 0x201C0C07, // 0009 NE R7 R6 R7 + 0x781E0024, // 000A JMPF R7 #0030 + 0x601C000C, // 000B GETGBL R7 G12 + 0x8C200D04, // 000C GETMET R8 R6 K4 + 0x58280005, // 000D LDCONST R10 K5 + 0x582C0006, // 000E LDCONST R11 K6 + 0x7C200600, // 000F CALL R8 3 + 0x7C1C0200, // 0010 CALL R7 1 + 0x24200F07, // 0011 GT R8 R7 K7 + 0x7822001C, // 0012 JMPF R8 #0030 + 0x1C200F01, // 0013 EQ R8 R7 K1 + 0x78220007, // 0014 JMPF R8 #001D + 0x60200008, // 0015 GETGBL R8 G8 + 0x5C240600, // 0016 MOVE R9 R3 + 0x7C200200, // 0017 CALL R8 1 + 0x60240013, // 0018 GETGBL R9 G19 + 0x7C240000, // 0019 CALL R9 0 + 0x98261109, // 001A SETIDX R9 K8 K9 + 0x98081009, // 001B SETIDX R2 R8 R9 + 0x70020010, // 001C JMP #002E + 0x1C200F0A, // 001D EQ R8 R7 K10 + 0x78220007, // 001E JMPF R8 #0027 + 0x60200008, // 001F GETGBL R8 G8 + 0x5C240600, // 0020 MOVE R9 R3 + 0x7C200200, // 0021 CALL R8 1 + 0x60240013, // 0022 GETGBL R9 G19 + 0x7C240000, // 0023 CALL R9 0 + 0x9826110B, // 0024 SETIDX R9 K8 K11 + 0x98081009, // 0025 SETIDX R2 R8 R9 + 0x70020006, // 0026 JMP #002E + 0x60200008, // 0027 GETGBL R8 G8 + 0x5C240600, // 0028 MOVE R9 R3 + 0x7C200200, // 0029 CALL R8 1 + 0x60240013, // 002A GETGBL R9 G19 + 0x7C240000, // 002B CALL R9 0 + 0x9826110C, // 002C SETIDX R9 K8 K12 + 0x98081009, // 002D SETIDX R2 R8 R9 + 0x50100200, // 002E LDBOOL R4 1 0 + 0x000C0701, // 002F ADD R3 R3 K1 + 0xB81E1A00, // 0030 GETNGBL R7 K13 + 0x8C1C0F0E, // 0031 GETMET R7 R7 K14 + 0x5824000F, // 0032 LDCONST R9 K15 + 0x50280200, // 0033 LDBOOL R10 1 0 + 0x7C1C0600, // 0034 CALL R7 3 + 0x60200012, // 0035 GETGBL R8 G18 + 0x7C200000, // 0036 CALL R8 0 + 0xB8261A00, // 0037 GETNGBL R9 K13 + 0x8C241310, // 0038 GETMET R9 R9 K16 + 0x602C0008, // 0039 GETGBL R11 G8 + 0x5C300E00, // 003A MOVE R12 R7 + 0x7C2C0200, // 003B CALL R11 1 + 0x002E220B, // 003C ADD R11 K17 R11 + 0x58300012, // 003D LDCONST R12 K18 + 0x7C240600, // 003E CALL R9 3 + 0x4C240000, // 003F LDNIL R9 + 0x20240E09, // 0040 NE R9 R7 R9 + 0x78260051, // 0041 JMPF R9 #0094 + 0x8C240F13, // 0042 GETMET R9 R7 K19 + 0x582C0014, // 0043 LDCONST R11 K20 + 0x7C240400, // 0044 CALL R9 2 + 0x7826004D, // 0045 JMPF R9 #0094 + 0x941C0F14, // 0046 GETIDX R7 R7 K20 + 0x58240007, // 0047 LDCONST R9 K7 + 0x50280200, // 0048 LDBOOL R10 1 0 + 0x782A0049, // 0049 JMPF R10 #0094 + 0x60280008, // 004A GETGBL R10 G8 + 0x5C2C1200, // 004B MOVE R11 R9 + 0x7C280200, // 004C CALL R10 1 + 0x002A2A0A, // 004D ADD R10 K21 R10 + 0x8C2C0F13, // 004E GETMET R11 R7 K19 + 0x5C341400, // 004F MOVE R13 R10 + 0x7C2C0400, // 0050 CALL R11 2 + 0x742E0000, // 0051 JMPT R11 #0053 + 0x70020040, // 0052 JMP #0094 + 0x942C0E0A, // 0053 GETIDX R11 R7 R10 + 0xB8321A00, // 0054 GETNGBL R12 K13 + 0x8C301910, // 0055 GETMET R12 R12 K16 + 0x60380018, // 0056 GETGBL R14 G24 + 0x583C0016, // 0057 LDCONST R15 K22 + 0x5C401400, // 0058 MOVE R16 R10 + 0x60440008, // 0059 GETGBL R17 G8 + 0x5C481600, // 005A MOVE R18 R11 + 0x7C440200, // 005B CALL R17 1 + 0x7C380600, // 005C CALL R14 3 + 0x583C0012, // 005D LDCONST R15 K18 + 0x7C300600, // 005E CALL R12 3 + 0x8C301704, // 005F GETMET R12 R11 K4 + 0x58380017, // 0060 LDCONST R14 K23 + 0x583C0007, // 0061 LDCONST R15 K7 + 0x7C300600, // 0062 CALL R12 3 + 0x04301901, // 0063 SUB R12 R12 K1 + 0x8C341704, // 0064 GETMET R13 R11 K4 + 0x583C0018, // 0065 LDCONST R15 K24 + 0x58400007, // 0066 LDCONST R16 K7 + 0x7C340600, // 0067 CALL R13 3 + 0x04341B01, // 0068 SUB R13 R13 K1 + 0x28381907, // 0069 GE R14 R12 K7 + 0x783A0002, // 006A JMPF R14 #006E + 0x8C381119, // 006B GETMET R14 R8 K25 + 0x5C401800, // 006C MOVE R16 R12 + 0x7C380400, // 006D CALL R14 2 + 0x28381B07, // 006E GE R14 R13 K7 + 0x783A0002, // 006F JMPF R14 #0073 + 0x8C381119, // 0070 GETMET R14 R8 K25 + 0x5C401A00, // 0071 MOVE R16 R13 + 0x7C380400, // 0072 CALL R14 2 + 0xB83A1A00, // 0073 GETNGBL R14 K13 + 0x8C381D10, // 0074 GETMET R14 R14 K16 + 0x60400018, // 0075 GETGBL R16 G24 + 0x5844001A, // 0076 LDCONST R17 K26 + 0x5C481800, // 0077 MOVE R18 R12 + 0x5C4C1A00, // 0078 MOVE R19 R13 + 0x7C400600, // 0079 CALL R16 3 + 0x58440012, // 007A LDCONST R17 K18 + 0x7C380600, // 007B CALL R14 3 + 0x8C381704, // 007C GETMET R14 R11 K4 + 0x5840001B, // 007D LDCONST R16 K27 + 0x7C380400, // 007E CALL R14 2 + 0x783A0002, // 007F JMPF R14 #0083 + 0x943C1D0A, // 0080 GETIDX R15 R14 K10 + 0x243C1F07, // 0081 GT R15 R15 K7 + 0x743E0000, // 0082 JMPT R15 #0084 + 0x503C0001, // 0083 LDBOOL R15 0 1 + 0x503C0200, // 0084 LDBOOL R15 1 0 + 0x60400008, // 0085 GETGBL R16 G8 + 0x5C440600, // 0086 MOVE R17 R3 + 0x7C400200, // 0087 CALL R16 1 + 0x60440013, // 0088 GETGBL R17 G19 + 0x7C440000, // 0089 CALL R17 0 + 0x783E0001, // 008A JMPF R15 #008D + 0x5848001C, // 008B LDCONST R18 K28 + 0x70020000, // 008C JMP #008E + 0x5848001D, // 008D LDCONST R18 K29 + 0x98461012, // 008E SETIDX R17 K8 R18 + 0x98463A09, // 008F SETIDX R17 K29 R9 + 0x98082011, // 0090 SETIDX R2 R16 R17 + 0x000C0701, // 0091 ADD R3 R3 K1 + 0x00241301, // 0092 ADD R9 R9 K1 + 0x7001FFB3, // 0093 JMP #0048 + 0x6024000C, // 0094 GETGBL R9 G12 + 0xB82A1A00, // 0095 GETNGBL R10 K13 + 0x8C28151E, // 0096 GETMET R10 R10 K30 + 0x7C280200, // 0097 CALL R10 1 + 0x7C240200, // 0098 CALL R9 1 + 0x58280007, // 0099 LDCONST R10 K7 + 0x78120000, // 009A JMPF R4 #009C + 0x04241301, // 009B SUB R9 R9 K1 + 0x142C1409, // 009C LT R11 R10 R9 + 0x782E0010, // 009D JMPF R11 #00AF + 0x8C2C1104, // 009E GETMET R11 R8 K4 + 0x5C341400, // 009F MOVE R13 R10 + 0x7C2C0400, // 00A0 CALL R11 2 + 0x4C300000, // 00A1 LDNIL R12 + 0x1C2C160C, // 00A2 EQ R11 R11 R12 + 0x782E0008, // 00A3 JMPF R11 #00AD + 0x602C0008, // 00A4 GETGBL R11 G8 + 0x5C300600, // 00A5 MOVE R12 R3 + 0x7C2C0200, // 00A6 CALL R11 1 + 0x60300013, // 00A7 GETGBL R12 G19 + 0x7C300000, // 00A8 CALL R12 0 + 0x9832111F, // 00A9 SETIDX R12 K8 K31 + 0x98323E0A, // 00AA SETIDX R12 K31 R10 + 0x9808160C, // 00AB SETIDX R2 R11 R12 + 0x000C0701, // 00AC ADD R3 R3 K1 + 0x00281501, // 00AD ADD R10 R10 K1 + 0x7001FFEC, // 00AE JMP #009C + 0x8C2C0320, // 00AF GETMET R11 R1 K32 + 0xB8361A00, // 00B0 GETNGBL R13 K13 + 0x8C341B21, // 00B1 GETMET R13 R13 K33 + 0x7C340200, // 00B2 CALL R13 1 + 0x7C2C0400, // 00B3 CALL R11 2 + 0x8C300122, // 00B4 GETMET R12 R0 K34 + 0x5C381600, // 00B5 MOVE R14 R11 + 0x7C300400, // 00B6 CALL R12 2 + 0x60340010, // 00B7 GETGBL R13 G16 + 0x5C381800, // 00B8 MOVE R14 R12 + 0x7C340200, // 00B9 CALL R13 1 + 0xA8020007, // 00BA EXBLK 0 #00C3 + 0x5C381A00, // 00BB MOVE R14 R13 + 0x7C380000, // 00BC CALL R14 0 + 0x603C0008, // 00BD GETGBL R15 G8 + 0x5C400600, // 00BE MOVE R16 R3 + 0x7C3C0200, // 00BF CALL R15 1 + 0x98081E0E, // 00C0 SETIDX R2 R15 R14 + 0x000C0701, // 00C1 ADD R3 R3 K1 + 0x7001FFF7, // 00C2 JMP #00BB + 0x58340023, // 00C3 LDCONST R13 K35 + 0xAC340200, // 00C4 CATCH R13 1 0 + 0xB0080000, // 00C5 RAISE 2 R0 R0 + 0x80040400, // 00C6 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 }) ) ); @@ -3860,1167 +5044,11 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: conf_to_log +** Solidified function: bridge_add_endpoint ********************************************************************/ -be_local_closure(Matter_Device_conf_to_log, /* name */ +be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(k2l), - /* K3 */ be_nested_str_weak(type), - /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(conf_to_log), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x5C180000, // 0004 MOVE R6 R0 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA802000B, // 0007 EXBLK 0 #0014 - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x1C140903, // 000A EQ R5 R4 K3 - 0x78160000, // 000B JMPF R5 #000D - 0x7001FFFA, // 000C JMP #0008 - 0x60140018, // 000D GETGBL R5 G24 - 0x58180004, // 000E LDCONST R6 K4 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x94200004, // 0010 GETIDX R8 R0 R4 - 0x7C140600, // 0011 CALL R5 3 - 0x00080405, // 0012 ADD R2 R2 R5 - 0x7001FFF3, // 0013 JMP #0008 - 0x580C0005, // 0014 LDCONST R3 K5 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x80040400, // 0017 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(stop_basic_commissioning), - /* K3 */ be_nested_str_weak(root_w0), - /* K4 */ be_nested_str_weak(root_L), - /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100102, // 0002 GETMET R4 R0 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x4C100000, // 0004 LDNIL R4 - 0x90020604, // 0005 SETMBR R0 K3 R4 - 0x4C100000, // 0006 LDNIL R4 - 0x90020804, // 0007 SETMBR R0 K4 R4 - 0x8C100105, // 0008 GETMET R4 R0 K5 - 0x5C180200, // 0009 MOVE R6 R1 - 0x7C100400, // 000A CALL R4 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_active_endpoints), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: received_ack -********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(update_remotes_info), - /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K3 */ be_nested_str_weak(root_discriminator), - /* K4 */ be_nested_str_weak(root_passcode), - /* K5 */ be_nested_str_weak(ipv4only), - /* K6 */ be_nested_str_weak(true), - /* K7 */ be_nested_str_weak(false), - /* K8 */ be_nested_str_weak(disable_bridge_mode), - /* K9 */ be_nested_str_weak(next_ep), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K12 */ be_nested_str_weak(dump), - /* K13 */ be_nested_str_weak(plugins_config), - /* K14 */ be_nested_str_weak(plugins_config_remotes), - /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), - /* K17 */ be_nested_str_weak(_X7D), - /* K18 */ be_nested_str_weak(FILENAME), - /* K19 */ be_nested_str_weak(w), - /* K20 */ be_nested_str_weak(write), - /* K21 */ be_nested_str_weak(close), - /* K22 */ be_nested_str_weak(tasmota), - /* K23 */ be_nested_str_weak(log), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K25 */ be_nested_str_weak(_X20and_X20configuration), - /* K26 */ be_nested_str_weak(), - /* K27 */ be_const_int(2), - /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K29 */ be_nested_str_weak(_X7C), - }), - be_str_weak(save_param), - &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x60080018, // 0003 GETGBL R2 G24 - 0x580C0002, // 0004 LDCONST R3 K2 - 0x88100103, // 0005 GETMBR R4 R0 K3 - 0x88140104, // 0006 GETMBR R5 R0 K4 - 0x88180105, // 0007 GETMBR R6 R0 K5 - 0x781A0001, // 0008 JMPF R6 #000B - 0x58180006, // 0009 LDCONST R6 K6 - 0x70020000, // 000A JMP #000C - 0x58180007, // 000B LDCONST R6 K7 - 0x881C0108, // 000C GETMBR R7 R0 K8 - 0x781E0001, // 000D JMPF R7 #0010 - 0x581C0006, // 000E LDCONST R7 K6 - 0x70020000, // 000F JMP #0011 - 0x581C0007, // 0010 LDCONST R7 K7 - 0x88200109, // 0011 GETMBR R8 R0 K9 - 0x7C080C00, // 0012 CALL R2 6 - 0x880C010A, // 0013 GETMBR R3 R0 K10 - 0x780E000E, // 0014 JMPF R3 #0024 - 0x0008050B, // 0015 ADD R2 R2 K11 - 0x8C0C030C, // 0016 GETMET R3 R1 K12 - 0x8814010D, // 0017 GETMBR R5 R0 K13 - 0x7C0C0400, // 0018 CALL R3 2 - 0x00080403, // 0019 ADD R2 R2 R3 - 0x600C000C, // 001A GETGBL R3 G12 - 0x8810010E, // 001B GETMBR R4 R0 K14 - 0x7C0C0200, // 001C CALL R3 1 - 0x240C070F, // 001D GT R3 R3 K15 - 0x780E0004, // 001E JMPF R3 #0024 - 0x00080510, // 001F ADD R2 R2 K16 - 0x8C0C030C, // 0020 GETMET R3 R1 K12 - 0x8814010E, // 0021 GETMBR R5 R0 K14 - 0x7C0C0400, // 0022 CALL R3 2 - 0x00080403, // 0023 ADD R2 R2 R3 - 0x00080511, // 0024 ADD R2 R2 K17 - 0xA8020018, // 0025 EXBLK 0 #003F - 0x600C0011, // 0026 GETGBL R3 G17 - 0x88100112, // 0027 GETMBR R4 R0 K18 - 0x58140013, // 0028 LDCONST R5 K19 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C100714, // 002A GETMET R4 R3 K20 - 0x5C180400, // 002B MOVE R6 R2 - 0x7C100400, // 002C CALL R4 2 - 0x8C100715, // 002D GETMET R4 R3 K21 - 0x7C100200, // 002E CALL R4 1 - 0xB8122C00, // 002F GETNGBL R4 K22 - 0x8C100917, // 0030 GETMET R4 R4 K23 - 0x60180018, // 0031 GETGBL R6 G24 - 0x581C0018, // 0032 LDCONST R7 K24 - 0x8820010A, // 0033 GETMBR R8 R0 K10 - 0x78220001, // 0034 JMPF R8 #0037 - 0x58200019, // 0035 LDCONST R8 K25 - 0x70020000, // 0036 JMP #0038 - 0x5820001A, // 0037 LDCONST R8 K26 - 0x7C180400, // 0038 CALL R6 2 - 0x581C001B, // 0039 LDCONST R7 K27 - 0x7C100600, // 003A CALL R4 3 - 0xA8040001, // 003B EXBLK 1 1 - 0x80040400, // 003C RET 1 R2 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020011, // 003E JMP #0051 - 0xAC0C0002, // 003F CATCH R3 0 2 - 0x7002000E, // 0040 JMP #0050 - 0xB8162C00, // 0041 GETNGBL R5 K22 - 0x8C140B17, // 0042 GETMET R5 R5 K23 - 0x601C0008, // 0043 GETGBL R7 G8 - 0x5C200600, // 0044 MOVE R8 R3 - 0x7C1C0200, // 0045 CALL R7 1 - 0x001E3807, // 0046 ADD R7 K28 R7 - 0x001C0F1D, // 0047 ADD R7 R7 K29 - 0x60200008, // 0048 GETGBL R8 G8 - 0x5C240800, // 0049 MOVE R9 R4 - 0x7C200200, // 004A CALL R8 1 - 0x001C0E08, // 004B ADD R7 R7 R8 - 0x5820001B, // 004C LDCONST R8 K27 - 0x7C140600, // 004D CALL R5 3 - 0x80040400, // 004E RET 1 R2 - 0x70020000, // 004F JMP #0051 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x80000000, // 0051 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(add), - /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K3 */ be_nested_str_weak(derive), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(root_w0), - /* K6 */ be_nested_str_weak(EC_P256), - /* K7 */ be_nested_str_weak(mod), - /* K8 */ be_nested_str_weak(root_L), - /* K9 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140015, // 0001 GETGBL R5 G21 - 0x7C140000, // 0002 CALL R5 0 - 0x8C140B01, // 0003 GETMET R5 R5 K1 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x54220003, // 0005 LDINT R8 4 - 0x7C140600, // 0006 CALL R5 3 - 0x8C180902, // 0007 GETMET R6 R4 K2 - 0x7C180200, // 0008 CALL R6 1 - 0x8C180D03, // 0009 GETMET R6 R6 K3 - 0x5C200A00, // 000A MOVE R8 R5 - 0x5C240600, // 000B MOVE R9 R3 - 0x5C280400, // 000C MOVE R10 R2 - 0x542E004F, // 000D LDINT R11 80 - 0x7C180A00, // 000E CALL R6 5 - 0x541E0026, // 000F LDINT R7 39 - 0x401E0807, // 0010 CONNECT R7 K4 R7 - 0x941C0C07, // 0011 GETIDX R7 R6 R7 - 0x54220027, // 0012 LDINT R8 40 - 0x5426004E, // 0013 LDINT R9 79 - 0x40201009, // 0014 CONNECT R8 R8 R9 - 0x94200C08, // 0015 GETIDX R8 R6 R8 - 0x8C240906, // 0016 GETMET R9 R4 K6 - 0x7C240200, // 0017 CALL R9 1 - 0x8C241307, // 0018 GETMET R9 R9 K7 - 0x5C2C0E00, // 0019 MOVE R11 R7 - 0x7C240400, // 001A CALL R9 2 - 0x90020A09, // 001B SETMBR R0 K5 R9 - 0x8C240906, // 001C GETMET R9 R4 K6 - 0x7C240200, // 001D CALL R9 1 - 0x8C241307, // 001E GETMET R9 R9 K7 - 0x5C2C1000, // 001F MOVE R11 R8 - 0x7C240400, // 0020 CALL R9 2 - 0x8C280906, // 0021 GETMET R10 R4 K6 - 0x7C280200, // 0022 CALL R10 1 - 0x8C281509, // 0023 GETMET R10 R10 K9 - 0x5C301200, // 0024 MOVE R12 R9 - 0x7C280400, // 0025 CALL R10 2 - 0x9002100A, // 0026 SETMBR R0 K8 R10 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), - }), - be_str_weak(every_second), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_op_discovery -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ - be_nested_proto( - 12, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(get_device_id), - /* K2 */ be_nested_str_weak(copy), - /* K3 */ be_nested_str_weak(reverse), - /* K4 */ be_nested_str_weak(get_fabric_compressed), - /* K5 */ be_nested_str_weak(tohex), - /* K6 */ be_nested_str_weak(_X2D), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(eth), - /* K9 */ be_nested_str_weak(find), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(log), - /* K12 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(remove_service), - /* K15 */ be_nested_str_weak(_matter), - /* K16 */ be_nested_str_weak(_tcp), - /* K17 */ be_nested_str_weak(hostname_eth), - /* K18 */ be_nested_str_weak(wifi), - /* K19 */ be_nested_str_weak(hostname_wifi), - /* K20 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K21 */ be_nested_str_weak(_X7C), - /* K22 */ be_const_int(2), - }), - be_str_weak(mdns_remove_op_discovery), - &be_const_str_solidified, - ( &(const binstruction[80]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA802003B, // 0001 EXBLK 0 #003E - 0x8C0C0301, // 0002 GETMET R3 R1 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C100304, // 0008 GETMET R4 R1 K4 - 0x7C100200, // 0009 CALL R4 1 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x7C140200, // 000B CALL R5 1 - 0x00140B06, // 000C ADD R5 R5 K6 - 0x8C180705, // 000D GETMET R6 R3 K5 - 0x7C180200, // 000E CALL R6 1 - 0x00140A06, // 000F ADD R5 R5 R6 - 0xB81A0E00, // 0010 GETNGBL R6 K7 - 0x8C180D08, // 0011 GETMET R6 R6 K8 - 0x7C180200, // 0012 CALL R6 1 - 0x8C180D09, // 0013 GETMET R6 R6 K9 - 0x5820000A, // 0014 LDCONST R8 K10 - 0x7C180400, // 0015 CALL R6 2 - 0x781A000E, // 0016 JMPF R6 #0026 - 0xB81A0E00, // 0017 GETNGBL R6 K7 - 0x8C180D0B, // 0018 GETMET R6 R6 K11 - 0x60200018, // 0019 GETGBL R8 G24 - 0x5824000C, // 001A LDCONST R9 K12 - 0x58280008, // 001B LDCONST R10 K8 - 0x5C2C0A00, // 001C MOVE R11 R5 - 0x7C200600, // 001D CALL R8 3 - 0x5824000D, // 001E LDCONST R9 K13 - 0x7C180600, // 001F CALL R6 3 - 0x8C18050E, // 0020 GETMET R6 R2 K14 - 0x5820000F, // 0021 LDCONST R8 K15 - 0x58240010, // 0022 LDCONST R9 K16 - 0x5C280A00, // 0023 MOVE R10 R5 - 0x882C0111, // 0024 GETMBR R11 R0 K17 - 0x7C180A00, // 0025 CALL R6 5 - 0xB81A0E00, // 0026 GETNGBL R6 K7 - 0x8C180D12, // 0027 GETMET R6 R6 K18 - 0x7C180200, // 0028 CALL R6 1 - 0x8C180D09, // 0029 GETMET R6 R6 K9 - 0x5820000A, // 002A LDCONST R8 K10 - 0x7C180400, // 002B CALL R6 2 - 0x781A000E, // 002C JMPF R6 #003C - 0xB81A0E00, // 002D GETNGBL R6 K7 - 0x8C180D0B, // 002E GETMET R6 R6 K11 - 0x60200018, // 002F GETGBL R8 G24 - 0x5824000C, // 0030 LDCONST R9 K12 - 0x58280012, // 0031 LDCONST R10 K18 - 0x5C2C0A00, // 0032 MOVE R11 R5 - 0x7C200600, // 0033 CALL R8 3 - 0x5824000D, // 0034 LDCONST R9 K13 - 0x7C180600, // 0035 CALL R6 3 - 0x8C18050E, // 0036 GETMET R6 R2 K14 - 0x5820000F, // 0037 LDCONST R8 K15 - 0x58240010, // 0038 LDCONST R9 K16 - 0x5C280A00, // 0039 MOVE R10 R5 - 0x882C0113, // 003A GETMBR R11 R0 K19 - 0x7C180A00, // 003B CALL R6 5 - 0xA8040001, // 003C EXBLK 1 1 - 0x70020010, // 003D JMP #004F - 0xAC0C0002, // 003E CATCH R3 0 2 - 0x7002000D, // 003F JMP #004E - 0xB8160E00, // 0040 GETNGBL R5 K7 - 0x8C140B0B, // 0041 GETMET R5 R5 K11 - 0x601C0008, // 0042 GETGBL R7 G8 - 0x5C200600, // 0043 MOVE R8 R3 - 0x7C1C0200, // 0044 CALL R7 1 - 0x001E2807, // 0045 ADD R7 K20 R7 - 0x001C0F15, // 0046 ADD R7 R7 K21 - 0x60200008, // 0047 GETGBL R8 G8 - 0x5C240800, // 0048 MOVE R9 R4 - 0x7C200200, // 0049 CALL R8 1 - 0x001C0E08, // 004A ADD R7 R7 R8 - 0x58200016, // 004B LDCONST R8 K22 - 0x7C140600, // 004C CALL R5 3 - 0x70020000, // 004D JMP #004F - 0xB0080000, // 004E RAISE 2 R0 R0 - 0x80000000, // 004F RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: autoconf_device_map -********************************************************************/ -be_local_closure(Matter_Device_autoconf_device_map, /* name */ - be_nested_proto( - 20, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[36]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(light), - /* K3 */ be_nested_str_weak(get), - /* K4 */ be_nested_str_weak(find), - /* K5 */ be_nested_str_weak(channels), - /* K6 */ be_nested_str_weak(), - /* K7 */ be_const_int(0), - /* K8 */ be_nested_str_weak(type), - /* K9 */ be_nested_str_weak(light1), - /* K10 */ be_const_int(2), - /* K11 */ be_nested_str_weak(light2), - /* K12 */ be_nested_str_weak(light3), - /* K13 */ be_nested_str_weak(tasmota), - /* K14 */ be_nested_str_weak(cmd), - /* K15 */ be_nested_str_weak(Status_X2013), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20Status_X2013_X20_X3D_X20), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(contains), - /* K20 */ be_nested_str_weak(StatusSHT), - /* K21 */ be_nested_str_weak(SHT), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X27_X25s_X27_X20_X3D_X20_X25s), - /* K23 */ be_nested_str_weak(Relay1), - /* K24 */ be_nested_str_weak(Relay2), - /* K25 */ be_nested_str_weak(push), - /* K26 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), - /* K27 */ be_nested_str_weak(TiltConfig), - /* K28 */ be_nested_str_weak(shutter_X2Btilt), - /* K29 */ be_nested_str_weak(shutter), - /* K30 */ be_nested_str_weak(get_power), - /* K31 */ be_nested_str_weak(relay), - /* K32 */ be_nested_str_weak(load), - /* K33 */ be_nested_str_weak(read_sensors), - /* K34 */ be_nested_str_weak(autoconf_sensors_list), - /* K35 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(autoconf_device_map), - &be_const_str_solidified, - ( &(const binstruction[199]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080013, // 0001 GETGBL R2 G19 - 0x7C080000, // 0002 CALL R2 0 - 0x580C0001, // 0003 LDCONST R3 K1 - 0x50100000, // 0004 LDBOOL R4 0 0 - 0xA4160400, // 0005 IMPORT R5 K2 - 0x8C180B03, // 0006 GETMET R6 R5 K3 - 0x7C180200, // 0007 CALL R6 1 - 0x4C1C0000, // 0008 LDNIL R7 - 0x201C0C07, // 0009 NE R7 R6 R7 - 0x781E0024, // 000A JMPF R7 #0030 - 0x601C000C, // 000B GETGBL R7 G12 - 0x8C200D04, // 000C GETMET R8 R6 K4 - 0x58280005, // 000D LDCONST R10 K5 - 0x582C0006, // 000E LDCONST R11 K6 - 0x7C200600, // 000F CALL R8 3 - 0x7C1C0200, // 0010 CALL R7 1 - 0x24200F07, // 0011 GT R8 R7 K7 - 0x7822001C, // 0012 JMPF R8 #0030 - 0x1C200F01, // 0013 EQ R8 R7 K1 - 0x78220007, // 0014 JMPF R8 #001D - 0x60200008, // 0015 GETGBL R8 G8 - 0x5C240600, // 0016 MOVE R9 R3 - 0x7C200200, // 0017 CALL R8 1 - 0x60240013, // 0018 GETGBL R9 G19 - 0x7C240000, // 0019 CALL R9 0 - 0x98261109, // 001A SETIDX R9 K8 K9 - 0x98081009, // 001B SETIDX R2 R8 R9 - 0x70020010, // 001C JMP #002E - 0x1C200F0A, // 001D EQ R8 R7 K10 - 0x78220007, // 001E JMPF R8 #0027 - 0x60200008, // 001F GETGBL R8 G8 - 0x5C240600, // 0020 MOVE R9 R3 - 0x7C200200, // 0021 CALL R8 1 - 0x60240013, // 0022 GETGBL R9 G19 - 0x7C240000, // 0023 CALL R9 0 - 0x9826110B, // 0024 SETIDX R9 K8 K11 - 0x98081009, // 0025 SETIDX R2 R8 R9 - 0x70020006, // 0026 JMP #002E - 0x60200008, // 0027 GETGBL R8 G8 - 0x5C240600, // 0028 MOVE R9 R3 - 0x7C200200, // 0029 CALL R8 1 - 0x60240013, // 002A GETGBL R9 G19 - 0x7C240000, // 002B CALL R9 0 - 0x9826110C, // 002C SETIDX R9 K8 K12 - 0x98081009, // 002D SETIDX R2 R8 R9 - 0x50100200, // 002E LDBOOL R4 1 0 - 0x000C0701, // 002F ADD R3 R3 K1 - 0xB81E1A00, // 0030 GETNGBL R7 K13 - 0x8C1C0F0E, // 0031 GETMET R7 R7 K14 - 0x5824000F, // 0032 LDCONST R9 K15 - 0x50280200, // 0033 LDBOOL R10 1 0 - 0x7C1C0600, // 0034 CALL R7 3 - 0x60200012, // 0035 GETGBL R8 G18 - 0x7C200000, // 0036 CALL R8 0 - 0xB8261A00, // 0037 GETNGBL R9 K13 - 0x8C241310, // 0038 GETMET R9 R9 K16 - 0x602C0008, // 0039 GETGBL R11 G8 - 0x5C300E00, // 003A MOVE R12 R7 - 0x7C2C0200, // 003B CALL R11 1 - 0x002E220B, // 003C ADD R11 K17 R11 - 0x58300012, // 003D LDCONST R12 K18 - 0x7C240600, // 003E CALL R9 3 - 0x4C240000, // 003F LDNIL R9 - 0x20240E09, // 0040 NE R9 R7 R9 - 0x78260051, // 0041 JMPF R9 #0094 - 0x8C240F13, // 0042 GETMET R9 R7 K19 - 0x582C0014, // 0043 LDCONST R11 K20 - 0x7C240400, // 0044 CALL R9 2 - 0x7826004D, // 0045 JMPF R9 #0094 - 0x941C0F14, // 0046 GETIDX R7 R7 K20 - 0x58240007, // 0047 LDCONST R9 K7 - 0x50280200, // 0048 LDBOOL R10 1 0 - 0x782A0049, // 0049 JMPF R10 #0094 - 0x60280008, // 004A GETGBL R10 G8 - 0x5C2C1200, // 004B MOVE R11 R9 - 0x7C280200, // 004C CALL R10 1 - 0x002A2A0A, // 004D ADD R10 K21 R10 - 0x8C2C0F13, // 004E GETMET R11 R7 K19 - 0x5C341400, // 004F MOVE R13 R10 - 0x7C2C0400, // 0050 CALL R11 2 - 0x742E0000, // 0051 JMPT R11 #0053 - 0x70020040, // 0052 JMP #0094 - 0x942C0E0A, // 0053 GETIDX R11 R7 R10 - 0xB8321A00, // 0054 GETNGBL R12 K13 - 0x8C301910, // 0055 GETMET R12 R12 K16 - 0x60380018, // 0056 GETGBL R14 G24 - 0x583C0016, // 0057 LDCONST R15 K22 - 0x5C401400, // 0058 MOVE R16 R10 - 0x60440008, // 0059 GETGBL R17 G8 - 0x5C481600, // 005A MOVE R18 R11 - 0x7C440200, // 005B CALL R17 1 - 0x7C380600, // 005C CALL R14 3 - 0x583C0012, // 005D LDCONST R15 K18 - 0x7C300600, // 005E CALL R12 3 - 0x8C301704, // 005F GETMET R12 R11 K4 - 0x58380017, // 0060 LDCONST R14 K23 - 0x583C0007, // 0061 LDCONST R15 K7 - 0x7C300600, // 0062 CALL R12 3 - 0x04301901, // 0063 SUB R12 R12 K1 - 0x8C341704, // 0064 GETMET R13 R11 K4 - 0x583C0018, // 0065 LDCONST R15 K24 - 0x58400007, // 0066 LDCONST R16 K7 - 0x7C340600, // 0067 CALL R13 3 - 0x04341B01, // 0068 SUB R13 R13 K1 - 0x28381907, // 0069 GE R14 R12 K7 - 0x783A0002, // 006A JMPF R14 #006E - 0x8C381119, // 006B GETMET R14 R8 K25 - 0x5C401800, // 006C MOVE R16 R12 - 0x7C380400, // 006D CALL R14 2 - 0x28381B07, // 006E GE R14 R13 K7 - 0x783A0002, // 006F JMPF R14 #0073 - 0x8C381119, // 0070 GETMET R14 R8 K25 - 0x5C401A00, // 0071 MOVE R16 R13 - 0x7C380400, // 0072 CALL R14 2 - 0xB83A1A00, // 0073 GETNGBL R14 K13 - 0x8C381D10, // 0074 GETMET R14 R14 K16 - 0x60400018, // 0075 GETGBL R16 G24 - 0x5844001A, // 0076 LDCONST R17 K26 - 0x5C481800, // 0077 MOVE R18 R12 - 0x5C4C1A00, // 0078 MOVE R19 R13 - 0x7C400600, // 0079 CALL R16 3 - 0x58440012, // 007A LDCONST R17 K18 - 0x7C380600, // 007B CALL R14 3 - 0x8C381704, // 007C GETMET R14 R11 K4 - 0x5840001B, // 007D LDCONST R16 K27 - 0x7C380400, // 007E CALL R14 2 - 0x783A0002, // 007F JMPF R14 #0083 - 0x943C1D0A, // 0080 GETIDX R15 R14 K10 - 0x243C1F07, // 0081 GT R15 R15 K7 - 0x743E0000, // 0082 JMPT R15 #0084 - 0x503C0001, // 0083 LDBOOL R15 0 1 - 0x503C0200, // 0084 LDBOOL R15 1 0 - 0x60400008, // 0085 GETGBL R16 G8 - 0x5C440600, // 0086 MOVE R17 R3 - 0x7C400200, // 0087 CALL R16 1 - 0x60440013, // 0088 GETGBL R17 G19 - 0x7C440000, // 0089 CALL R17 0 - 0x783E0001, // 008A JMPF R15 #008D - 0x5848001C, // 008B LDCONST R18 K28 - 0x70020000, // 008C JMP #008E - 0x5848001D, // 008D LDCONST R18 K29 - 0x98461012, // 008E SETIDX R17 K8 R18 - 0x98463A09, // 008F SETIDX R17 K29 R9 - 0x98082011, // 0090 SETIDX R2 R16 R17 - 0x000C0701, // 0091 ADD R3 R3 K1 - 0x00241301, // 0092 ADD R9 R9 K1 - 0x7001FFB3, // 0093 JMP #0048 - 0x6024000C, // 0094 GETGBL R9 G12 - 0xB82A1A00, // 0095 GETNGBL R10 K13 - 0x8C28151E, // 0096 GETMET R10 R10 K30 - 0x7C280200, // 0097 CALL R10 1 - 0x7C240200, // 0098 CALL R9 1 - 0x58280007, // 0099 LDCONST R10 K7 - 0x78120000, // 009A JMPF R4 #009C - 0x04241301, // 009B SUB R9 R9 K1 - 0x142C1409, // 009C LT R11 R10 R9 - 0x782E0010, // 009D JMPF R11 #00AF - 0x8C2C1104, // 009E GETMET R11 R8 K4 - 0x5C341400, // 009F MOVE R13 R10 - 0x7C2C0400, // 00A0 CALL R11 2 - 0x4C300000, // 00A1 LDNIL R12 - 0x1C2C160C, // 00A2 EQ R11 R11 R12 - 0x782E0008, // 00A3 JMPF R11 #00AD - 0x602C0008, // 00A4 GETGBL R11 G8 - 0x5C300600, // 00A5 MOVE R12 R3 - 0x7C2C0200, // 00A6 CALL R11 1 - 0x60300013, // 00A7 GETGBL R12 G19 - 0x7C300000, // 00A8 CALL R12 0 - 0x9832111F, // 00A9 SETIDX R12 K8 K31 - 0x98323E0A, // 00AA SETIDX R12 K31 R10 - 0x9808160C, // 00AB SETIDX R2 R11 R12 - 0x000C0701, // 00AC ADD R3 R3 K1 - 0x00281501, // 00AD ADD R10 R10 K1 - 0x7001FFEC, // 00AE JMP #009C - 0x8C2C0320, // 00AF GETMET R11 R1 K32 - 0xB8361A00, // 00B0 GETNGBL R13 K13 - 0x8C341B21, // 00B1 GETMET R13 R13 K33 - 0x7C340200, // 00B2 CALL R13 1 - 0x7C2C0400, // 00B3 CALL R11 2 - 0x8C300122, // 00B4 GETMET R12 R0 K34 - 0x5C381600, // 00B5 MOVE R14 R11 - 0x7C300400, // 00B6 CALL R12 2 - 0x60340010, // 00B7 GETGBL R13 G16 - 0x5C381800, // 00B8 MOVE R14 R12 - 0x7C340200, // 00B9 CALL R13 1 - 0xA8020007, // 00BA EXBLK 0 #00C3 - 0x5C381A00, // 00BB MOVE R14 R13 - 0x7C380000, // 00BC CALL R14 0 - 0x603C0008, // 00BD GETGBL R15 G8 - 0x5C400600, // 00BE MOVE R16 R3 - 0x7C3C0200, // 00BF CALL R15 1 - 0x98081E0E, // 00C0 SETIDX R2 R15 R14 - 0x000C0701, // 00C1 ADD R3 R3 K1 - 0x7001FFF7, // 00C2 JMP #00BB - 0x58340023, // 00C3 LDCONST R13 K35 - 0xAC340200, // 00C4 CATCH R13 1 0 - 0xB0080000, // 00C5 RAISE 2 R0 R0 - 0x80040400, // 00C6 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 12, /* nstack */ + 17, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5028,55 +5056,102 @@ be_local_closure(Matter_Device_register_native_classes, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[21]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K5 */ be_nested_str_weak(_X27_X20skipping), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(next_ep), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(type), + /* K11 */ be_nested_str_weak(keys), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), + /* K14 */ be_nested_str_weak(conf_to_log), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(plugins_config), + /* K17 */ be_nested_str_weak(plugins_persist), + /* K18 */ be_const_int(1), + /* K19 */ be_nested_str_weak(save_param), + /* K20 */ be_nested_str_weak(signal_endpoints_changed), }), - be_str_weak(register_native_classes), + be_str_weak(bridge_add_endpoint), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x80000000, // 0020 RET 0 + ( &(const binstruction[70]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x4C100000, // 0004 LDNIL R4 + 0x1C100604, // 0005 EQ R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0xB8120400, // 0007 GETNGBL R4 K2 + 0x8C100903, // 0008 GETMET R4 R4 K3 + 0x60180008, // 0009 GETGBL R6 G8 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C180200, // 000B CALL R6 1 + 0x001A0806, // 000C ADD R6 K4 R6 + 0x00180D05, // 000D ADD R6 R6 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x7C100600, // 000F CALL R4 3 + 0x80000800, // 0010 RET 0 + 0x88100107, // 0011 GETMBR R4 R0 K7 + 0x60140008, // 0012 GETGBL R5 G8 + 0x5C180800, // 0013 MOVE R6 R4 + 0x7C140200, // 0014 CALL R5 1 + 0x5C180600, // 0015 MOVE R6 R3 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x5C200800, // 0017 MOVE R8 R4 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x881C0108, // 001A GETMBR R7 R0 K8 + 0x8C1C0F09, // 001B GETMET R7 R7 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x601C0013, // 001E GETGBL R7 G19 + 0x7C1C0000, // 001F CALL R7 0 + 0x981E1401, // 0020 SETIDX R7 K10 R1 + 0x60200010, // 0021 GETGBL R8 G16 + 0x8C24050B, // 0022 GETMET R9 R2 K11 + 0x7C240200, // 0023 CALL R9 1 + 0x7C200200, // 0024 CALL R8 1 + 0xA8020004, // 0025 EXBLK 0 #002B + 0x5C241000, // 0026 MOVE R9 R8 + 0x7C240000, // 0027 CALL R9 0 + 0x94280409, // 0028 GETIDX R10 R2 R9 + 0x981C120A, // 0029 SETIDX R7 R9 R10 + 0x7001FFFA, // 002A JMP #0026 + 0x5820000C, // 002B LDCONST R8 K12 + 0xAC200200, // 002C CATCH R8 1 0 + 0xB0080000, // 002D RAISE 2 R0 R0 + 0xB8220400, // 002E GETNGBL R8 K2 + 0x8C201103, // 002F GETMET R8 R8 K3 + 0x60280018, // 0030 GETGBL R10 G24 + 0x582C000D, // 0031 LDCONST R11 K13 + 0x5C300800, // 0032 MOVE R12 R4 + 0x5C340200, // 0033 MOVE R13 R1 + 0x8C38010E, // 0034 GETMET R14 R0 K14 + 0x5C400400, // 0035 MOVE R16 R2 + 0x7C380400, // 0036 CALL R14 2 + 0x7C280800, // 0037 CALL R10 4 + 0x582C000F, // 0038 LDCONST R11 K15 + 0x7C200600, // 0039 CALL R8 3 + 0x88200110, // 003A GETMBR R8 R0 K16 + 0x98200A07, // 003B SETIDX R8 R5 R7 + 0x50200200, // 003C LDBOOL R8 1 0 + 0x90022208, // 003D SETMBR R0 K17 R8 + 0x88200107, // 003E GETMBR R8 R0 K7 + 0x00201112, // 003F ADD R8 R8 K18 + 0x90020E08, // 0040 SETMBR R0 K7 R8 + 0x8C200113, // 0041 GETMET R8 R0 K19 + 0x7C200200, // 0042 CALL R8 1 + 0x8C200114, // 0043 GETMET R8 R0 K20 + 0x7C200200, // 0044 CALL R8 1 + 0x80040800, // 0045 RET 1 R4 }) ) ); @@ -5084,11 +5159,11 @@ be_local_closure(Matter_Device_register_native_classes, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: start_mdns_announce_hostnames ********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ +be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ be_nested_proto( - 7, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5107,24 +5182,25 @@ be_local_closure(Matter_Device_init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), + /* K4 */ be_nested_str_weak(matter_mdns_host), }), be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0x68000000, // 0000 GETUPV R0 U0 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 }) ), be_nested_proto( @@ -5139,297 +5215,75 @@ be_local_closure(Matter_Device_init, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), + /* K0 */ be_nested_str_weak(_mdns_announce_hostname), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), + /* K4 */ be_nested_str_weak(matter_mdns_host), }), be_str_weak(_anonymous_), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0x68000000, // 0000 GETUPV R0 U0 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 + 0x50080200, // 0002 LDBOOL R2 1 0 + 0x7C000400, // 0003 CALL R0 2 + 0xB8020200, // 0004 GETNGBL R0 K1 + 0x8C000102, // 0005 GETMET R0 R0 K2 + 0x58080003, // 0006 LDCONST R2 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x7C000600, // 0008 CALL R0 3 + 0x80000000, // 0009 RET 0 }) ), }), 1, /* has constants */ - ( &(const bvalue[44]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(get_option), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(MATTER_OPTION), - /* K5 */ be_nested_str_weak(UI), - /* K6 */ be_nested_str_weak(started), - /* K7 */ be_nested_str_weak(tick), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(plugins), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(plugins_classes), - /* K12 */ be_nested_str_weak(plugins_config_remotes), - /* K13 */ be_nested_str_weak(register_native_classes), - /* K14 */ be_nested_str_weak(vendorid), - /* K15 */ be_nested_str_weak(VENDOR_ID), - /* K16 */ be_nested_str_weak(productid), - /* K17 */ be_nested_str_weak(PRODUCT_ID), - /* K18 */ be_nested_str_weak(root_iterations), - /* K19 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K20 */ be_nested_str_weak(next_ep), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(root_salt), - /* K23 */ be_nested_str_weak(random), - /* K24 */ be_nested_str_weak(ipv4only), - /* K25 */ be_nested_str_weak(disable_bridge_mode), - /* K26 */ be_nested_str_weak(load_param), - /* K27 */ be_nested_str_weak(sessions), - /* K28 */ be_nested_str_weak(Session_Store), - /* K29 */ be_nested_str_weak(load_fabrics), - /* K30 */ be_nested_str_weak(message_handler), - /* K31 */ be_nested_str_weak(MessageHandler), - /* K32 */ be_nested_str_weak(ui), - /* K33 */ be_nested_str_weak(wifi), - /* K34 */ be_nested_str_weak(up), - /* K35 */ be_nested_str_weak(eth), - /* K36 */ be_nested_str_weak(start), - /* K37 */ be_nested_str_weak(add_rule), - /* K38 */ be_nested_str_weak(Wifi_X23Connected), - /* K39 */ be_nested_str_weak(matter_start), - /* K40 */ be_nested_str_weak(Eth_X23Connected), - /* K41 */ be_nested_str_weak(_init_basic_commissioning), - /* K42 */ be_nested_str_weak(add_driver), - /* K43 */ be_nested_str_weak(register_commands), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0xB8120600, // 0003 GETNGBL R4 K3 - 0x88100904, // 0004 GETMBR R4 R4 K4 - 0x7C080400, // 0005 CALL R2 2 - 0x740A0004, // 0006 JMPT R2 #000C - 0xB80A0600, // 0007 GETNGBL R2 K3 - 0x8C080505, // 0008 GETMET R2 R2 K5 - 0x5C100000, // 0009 MOVE R4 R0 - 0x7C080400, // 000A CALL R2 2 - 0x80000400, // 000B RET 0 - 0x50080000, // 000C LDBOOL R2 0 0 - 0x90020C02, // 000D SETMBR R0 K6 R2 - 0x90020F08, // 000E SETMBR R0 K7 K8 - 0x60080012, // 000F GETGBL R2 G18 - 0x7C080000, // 0010 CALL R2 0 - 0x90021202, // 0011 SETMBR R0 K9 R2 - 0x50080000, // 0012 LDBOOL R2 0 0 - 0x90021402, // 0013 SETMBR R0 K10 R2 - 0x60080013, // 0014 GETGBL R2 G19 - 0x7C080000, // 0015 CALL R2 0 - 0x90021602, // 0016 SETMBR R0 K11 R2 - 0x60080013, // 0017 GETGBL R2 G19 - 0x7C080000, // 0018 CALL R2 0 - 0x90021802, // 0019 SETMBR R0 K12 R2 - 0x8C08010D, // 001A GETMET R2 R0 K13 - 0x7C080200, // 001B CALL R2 1 - 0x8808010F, // 001C GETMBR R2 R0 K15 - 0x90021C02, // 001D SETMBR R0 K14 R2 - 0x88080111, // 001E GETMBR R2 R0 K17 - 0x90022002, // 001F SETMBR R0 K16 R2 - 0x88080113, // 0020 GETMBR R2 R0 K19 - 0x90022402, // 0021 SETMBR R0 K18 R2 - 0x90022915, // 0022 SETMBR R0 K20 K21 - 0x8C080317, // 0023 GETMET R2 R1 K23 - 0x5412000F, // 0024 LDINT R4 16 - 0x7C080400, // 0025 CALL R2 2 - 0x90022C02, // 0026 SETMBR R0 K22 R2 - 0x50080000, // 0027 LDBOOL R2 0 0 - 0x90023002, // 0028 SETMBR R0 K24 R2 - 0x50080000, // 0029 LDBOOL R2 0 0 - 0x90023202, // 002A SETMBR R0 K25 R2 - 0x8C08011A, // 002B GETMET R2 R0 K26 - 0x7C080200, // 002C CALL R2 1 - 0xB80A0600, // 002D GETNGBL R2 K3 - 0x8C08051C, // 002E GETMET R2 R2 K28 - 0x5C100000, // 002F MOVE R4 R0 - 0x7C080400, // 0030 CALL R2 2 - 0x90023602, // 0031 SETMBR R0 K27 R2 - 0x8808011B, // 0032 GETMBR R2 R0 K27 - 0x8C08051D, // 0033 GETMET R2 R2 K29 - 0x7C080200, // 0034 CALL R2 1 - 0xB80A0600, // 0035 GETNGBL R2 K3 - 0x8C08051F, // 0036 GETMET R2 R2 K31 - 0x5C100000, // 0037 MOVE R4 R0 - 0x7C080400, // 0038 CALL R2 2 - 0x90023C02, // 0039 SETMBR R0 K30 R2 - 0xB80A0600, // 003A GETNGBL R2 K3 - 0x8C080505, // 003B GETMET R2 R2 K5 - 0x5C100000, // 003C MOVE R4 R0 - 0x7C080400, // 003D CALL R2 2 - 0x90024002, // 003E SETMBR R0 K32 R2 - 0xB80A0200, // 003F GETNGBL R2 K1 - 0x8C080521, // 0040 GETMET R2 R2 K33 - 0x7C080200, // 0041 CALL R2 1 - 0x94080522, // 0042 GETIDX R2 R2 K34 - 0x740A0004, // 0043 JMPT R2 #0049 - 0xB80A0200, // 0044 GETNGBL R2 K1 - 0x8C080523, // 0045 GETMET R2 R2 K35 - 0x7C080200, // 0046 CALL R2 1 - 0x94080522, // 0047 GETIDX R2 R2 K34 - 0x780A0001, // 0048 JMPF R2 #004B - 0x8C080124, // 0049 GETMET R2 R0 K36 - 0x7C080200, // 004A CALL R2 1 - 0xB80A0200, // 004B GETNGBL R2 K1 - 0x8C080521, // 004C GETMET R2 R2 K33 - 0x7C080200, // 004D CALL R2 1 - 0x94080522, // 004E GETIDX R2 R2 K34 - 0x740A0005, // 004F JMPT R2 #0056 - 0xB80A0200, // 0050 GETNGBL R2 K1 - 0x8C080525, // 0051 GETMET R2 R2 K37 - 0x58100026, // 0052 LDCONST R4 K38 - 0x84140000, // 0053 CLOSURE R5 P0 - 0x58180027, // 0054 LDCONST R6 K39 - 0x7C080800, // 0055 CALL R2 4 - 0xB80A0200, // 0056 GETNGBL R2 K1 - 0x8C080523, // 0057 GETMET R2 R2 K35 - 0x7C080200, // 0058 CALL R2 1 - 0x94080522, // 0059 GETIDX R2 R2 K34 - 0x740A0005, // 005A JMPT R2 #0061 - 0xB80A0200, // 005B GETNGBL R2 K1 - 0x8C080525, // 005C GETMET R2 R2 K37 - 0x58100028, // 005D LDCONST R4 K40 - 0x84140001, // 005E CLOSURE R5 P1 - 0x58180027, // 005F LDCONST R6 K39 - 0x7C080800, // 0060 CALL R2 4 - 0x8C080129, // 0061 GETMET R2 R0 K41 - 0x7C080200, // 0062 CALL R2 1 - 0xB80A0200, // 0063 GETNGBL R2 K1 - 0x8C08052A, // 0064 GETMET R2 R2 K42 - 0x5C100000, // 0065 MOVE R4 R0 - 0x7C080400, // 0066 CALL R2 2 - 0x8C08012B, // 0067 GETMET R2 R0 K43 - 0x7C080200, // 0068 CALL R2 1 - 0xA0000000, // 0069 CLOSE R0 - 0x80000000, // 006A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: attribute_updated -********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), - }), - be_str_weak(attribute_updated), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), + /* K1 */ be_nested_str_weak(wifi), + /* K2 */ be_nested_str_weak(up), + /* K3 */ be_nested_str_weak(_mdns_announce_hostname), + /* K4 */ be_nested_str_weak(add_rule), + /* K5 */ be_nested_str_weak(Wifi_X23Connected), + /* K6 */ be_nested_str_weak(matter_mdns_host), + /* K7 */ be_nested_str_weak(eth), + /* K8 */ be_nested_str_weak(Eth_X23Connected), }), - be_str_weak(register_commands), + be_str_weak(start_mdns_announce_hostnames), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ + ( &(const binstruction[32]) { /* code */ 0xB8060000, // 0000 GETNGBL R1 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 + 0x7C040200, // 0002 CALL R1 1 + 0x94040302, // 0003 GETIDX R1 R1 K2 + 0x78060003, // 0004 JMPF R1 #0009 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x500C0000, // 0006 LDBOOL R3 0 0 + 0x7C040400, // 0007 CALL R1 2 + 0x70020005, // 0008 JMP #000F + 0xB8060000, // 0009 GETNGBL R1 K0 + 0x8C040304, // 000A GETMET R1 R1 K4 + 0x580C0005, // 000B LDCONST R3 K5 + 0x84100000, // 000C CLOSURE R4 P0 + 0x58140006, // 000D LDCONST R5 K6 + 0x7C040800, // 000E CALL R1 4 + 0xB8060000, // 000F GETNGBL R1 K0 + 0x8C040307, // 0010 GETMET R1 R1 K7 + 0x7C040200, // 0011 CALL R1 1 + 0x94040302, // 0012 GETIDX R1 R1 K2 + 0x78060003, // 0013 JMPF R1 #0018 + 0x8C040103, // 0014 GETMET R1 R0 K3 + 0x500C0200, // 0015 LDBOOL R3 1 0 + 0x7C040400, // 0016 CALL R1 2 + 0x70020005, // 0017 JMP #001E + 0xB8060000, // 0018 GETNGBL R1 K0 + 0x8C040304, // 0019 GETMET R1 R1 K4 + 0x580C0008, // 001A LDCONST R3 K8 + 0x84100001, // 001B CLOSURE R4 P1 + 0x58140006, // 001C LDCONST R5 K6 + 0x7C040800, // 001D CALL R1 4 + 0xA0000000, // 001E CLOSE R0 + 0x80000000, // 001F RET 0 }) ) ); @@ -5437,11 +5291,11 @@ be_local_closure(Matter_Device_register_commands, /* name */ /******************************************************************** -** Solidified function: autoconf_sensors_list +** Solidified function: get_plugin_class_arg ********************************************************************/ -be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ be_nested_proto( - 10, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -5449,148 +5303,24 @@ be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(k2l), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(Temperature), - /* K3 */ be_nested_str_weak(_X23Temperature), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(type), - /* K6 */ be_nested_str_weak(temperature), - /* K7 */ be_nested_str_weak(filter), - /* K8 */ be_nested_str_weak(stop_iteration), - /* K9 */ be_nested_str_weak(Pressure), - /* K10 */ be_nested_str_weak(_X23Pressure), - /* K11 */ be_nested_str_weak(pressure), - /* K12 */ be_nested_str_weak(Illuminance), - /* K13 */ be_nested_str_weak(_X23Illuminance), - /* K14 */ be_nested_str_weak(illuminance), - /* K15 */ be_nested_str_weak(Humidity), - /* K16 */ be_nested_str_weak(_X23Humidity), - /* K17 */ be_nested_str_weak(humidity), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), }), - be_str_weak(autoconf_sensors_list), + be_str_weak(get_plugin_class_arg), &be_const_str_solidified, - ( &(const binstruction[119]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100100, // 0003 GETMET R4 R0 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020013, // 0007 EXBLK 0 #001C - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x94140204, // 000A GETIDX R5 R1 R4 - 0x6018000F, // 000B GETGBL R6 G15 - 0x5C1C0A00, // 000C MOVE R7 R5 - 0x60200013, // 000D GETGBL R8 G19 - 0x7C180400, // 000E CALL R6 2 - 0x781A000A, // 000F JMPF R6 #001B - 0x8C180B01, // 0010 GETMET R6 R5 K1 - 0x58200002, // 0011 LDCONST R8 K2 - 0x7C180400, // 0012 CALL R6 2 - 0x781A0006, // 0013 JMPF R6 #001B - 0x00180903, // 0014 ADD R6 R4 K3 - 0x8C1C0504, // 0015 GETMET R7 R2 K4 - 0x60240013, // 0016 GETGBL R9 G19 - 0x7C240000, // 0017 CALL R9 0 - 0x98260B06, // 0018 SETIDX R9 K5 K6 - 0x98260E06, // 0019 SETIDX R9 K7 R6 - 0x7C1C0400, // 001A CALL R7 2 - 0x7001FFEB, // 001B JMP #0008 - 0x580C0008, // 001C LDCONST R3 K8 - 0xAC0C0200, // 001D CATCH R3 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x600C0010, // 001F GETGBL R3 G16 - 0x8C100100, // 0020 GETMET R4 R0 K0 - 0x5C180200, // 0021 MOVE R6 R1 - 0x7C100400, // 0022 CALL R4 2 - 0x7C0C0200, // 0023 CALL R3 1 - 0xA8020013, // 0024 EXBLK 0 #0039 - 0x5C100600, // 0025 MOVE R4 R3 - 0x7C100000, // 0026 CALL R4 0 - 0x94140204, // 0027 GETIDX R5 R1 R4 - 0x6018000F, // 0028 GETGBL R6 G15 - 0x5C1C0A00, // 0029 MOVE R7 R5 - 0x60200013, // 002A GETGBL R8 G19 - 0x7C180400, // 002B CALL R6 2 - 0x781A000A, // 002C JMPF R6 #0038 - 0x8C180B01, // 002D GETMET R6 R5 K1 - 0x58200009, // 002E LDCONST R8 K9 - 0x7C180400, // 002F CALL R6 2 - 0x781A0006, // 0030 JMPF R6 #0038 - 0x0018090A, // 0031 ADD R6 R4 K10 - 0x8C1C0504, // 0032 GETMET R7 R2 K4 - 0x60240013, // 0033 GETGBL R9 G19 - 0x7C240000, // 0034 CALL R9 0 - 0x98260B0B, // 0035 SETIDX R9 K5 K11 - 0x98260E06, // 0036 SETIDX R9 K7 R6 - 0x7C1C0400, // 0037 CALL R7 2 - 0x7001FFEB, // 0038 JMP #0025 - 0x580C0008, // 0039 LDCONST R3 K8 - 0xAC0C0200, // 003A CATCH R3 1 0 - 0xB0080000, // 003B RAISE 2 R0 R0 - 0x600C0010, // 003C GETGBL R3 G16 - 0x8C100100, // 003D GETMET R4 R0 K0 - 0x5C180200, // 003E MOVE R6 R1 - 0x7C100400, // 003F CALL R4 2 - 0x7C0C0200, // 0040 CALL R3 1 - 0xA8020013, // 0041 EXBLK 0 #0056 - 0x5C100600, // 0042 MOVE R4 R3 - 0x7C100000, // 0043 CALL R4 0 - 0x94140204, // 0044 GETIDX R5 R1 R4 - 0x6018000F, // 0045 GETGBL R6 G15 - 0x5C1C0A00, // 0046 MOVE R7 R5 - 0x60200013, // 0047 GETGBL R8 G19 - 0x7C180400, // 0048 CALL R6 2 - 0x781A000A, // 0049 JMPF R6 #0055 - 0x8C180B01, // 004A GETMET R6 R5 K1 - 0x5820000C, // 004B LDCONST R8 K12 - 0x7C180400, // 004C CALL R6 2 - 0x781A0006, // 004D JMPF R6 #0055 - 0x0018090D, // 004E ADD R6 R4 K13 - 0x8C1C0504, // 004F GETMET R7 R2 K4 - 0x60240013, // 0050 GETGBL R9 G19 - 0x7C240000, // 0051 CALL R9 0 - 0x98260B0E, // 0052 SETIDX R9 K5 K14 - 0x98260E06, // 0053 SETIDX R9 K7 R6 - 0x7C1C0400, // 0054 CALL R7 2 - 0x7001FFEB, // 0055 JMP #0042 - 0x580C0008, // 0056 LDCONST R3 K8 - 0xAC0C0200, // 0057 CATCH R3 1 0 - 0xB0080000, // 0058 RAISE 2 R0 R0 - 0x600C0010, // 0059 GETGBL R3 G16 - 0x8C100100, // 005A GETMET R4 R0 K0 - 0x5C180200, // 005B MOVE R6 R1 - 0x7C100400, // 005C CALL R4 2 - 0x7C0C0200, // 005D CALL R3 1 - 0xA8020013, // 005E EXBLK 0 #0073 - 0x5C100600, // 005F MOVE R4 R3 - 0x7C100000, // 0060 CALL R4 0 - 0x94140204, // 0061 GETIDX R5 R1 R4 - 0x6018000F, // 0062 GETGBL R6 G15 - 0x5C1C0A00, // 0063 MOVE R7 R5 - 0x60200013, // 0064 GETGBL R8 G19 - 0x7C180400, // 0065 CALL R6 2 - 0x781A000A, // 0066 JMPF R6 #0072 - 0x8C180B01, // 0067 GETMET R6 R5 K1 - 0x5820000F, // 0068 LDCONST R8 K15 - 0x7C180400, // 0069 CALL R6 2 - 0x781A0006, // 006A JMPF R6 #0072 - 0x00180910, // 006B ADD R6 R4 K16 - 0x8C1C0504, // 006C GETMET R7 R2 K4 - 0x60240013, // 006D GETGBL R9 G19 - 0x7C240000, // 006E CALL R9 0 - 0x98260B11, // 006F SETIDX R9 K5 K17 - 0x98260E06, // 0070 SETIDX R9 K7 R6 - 0x7C1C0400, // 0071 CALL R7 2 - 0x7001FFEB, // 0072 JMP #005F - 0x580C0008, // 0073 LDCONST R3 K8 - 0xAC0C0200, // 0074 CATCH R3 1 0 - 0xB0080000, // 0075 RAISE 2 R0 R0 - 0x80040400, // 0076 RET 1 R2 + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 }) ) ); @@ -5677,36 +5407,298 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(add), + /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K3 */ be_nested_str_weak(derive), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(root_w0), + /* K6 */ be_nested_str_weak(EC_P256), + /* K7 */ be_nested_str_weak(mod), + /* K8 */ be_nested_str_weak(root_L), + /* K9 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140015, // 0001 GETGBL R5 G21 + 0x7C140000, // 0002 CALL R5 0 + 0x8C140B01, // 0003 GETMET R5 R5 K1 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x54220003, // 0005 LDINT R8 4 + 0x7C140600, // 0006 CALL R5 3 + 0x8C180902, // 0007 GETMET R6 R4 K2 + 0x7C180200, // 0008 CALL R6 1 + 0x8C180D03, // 0009 GETMET R6 R6 K3 + 0x5C200A00, // 000A MOVE R8 R5 + 0x5C240600, // 000B MOVE R9 R3 + 0x5C280400, // 000C MOVE R10 R2 + 0x542E004F, // 000D LDINT R11 80 + 0x7C180A00, // 000E CALL R6 5 + 0x541E0026, // 000F LDINT R7 39 + 0x401E0807, // 0010 CONNECT R7 K4 R7 + 0x941C0C07, // 0011 GETIDX R7 R6 R7 + 0x54220027, // 0012 LDINT R8 40 + 0x5426004E, // 0013 LDINT R9 79 + 0x40201009, // 0014 CONNECT R8 R8 R9 + 0x94200C08, // 0015 GETIDX R8 R6 R8 + 0x8C240906, // 0016 GETMET R9 R4 K6 + 0x7C240200, // 0017 CALL R9 1 + 0x8C241307, // 0018 GETMET R9 R9 K7 + 0x5C2C0E00, // 0019 MOVE R11 R7 + 0x7C240400, // 001A CALL R9 2 + 0x90020A09, // 001B SETMBR R0 K5 R9 + 0x8C240906, // 001C GETMET R9 R4 K6 + 0x7C240200, // 001D CALL R9 1 + 0x8C241307, // 001E GETMET R9 R9 K7 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C240400, // 0020 CALL R9 2 + 0x8C280906, // 0021 GETMET R10 R4 K6 + 0x7C280200, // 0022 CALL R10 1 + 0x8C281509, // 0023 GETMET R10 R10 K9 + 0x5C301200, // 0024 MOVE R12 R9 + 0x7C280400, // 0025 CALL R10 2 + 0x9002100A, // 0026 SETMBR R0 K8 R10 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: remove_fabric +********************************************************************/ +be_local_closure(Matter_Device_remove_fabric, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(find_children_fabrics), + /* K2 */ be_nested_str_weak(get_fabric_index), + /* K3 */ be_nested_str_weak(find_fabric_by_index), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20removing_X20fabric_X20), + /* K7 */ be_nested_str_weak(get_fabric_id), + /* K8 */ be_nested_str_weak(copy), + /* K9 */ be_nested_str_weak(reverse), + /* K10 */ be_nested_str_weak(tohex), + /* K11 */ be_const_int(2), + /* K12 */ be_nested_str_weak(message_handler), + /* K13 */ be_nested_str_weak(im), + /* K14 */ be_nested_str_weak(subs_shop), + /* K15 */ be_nested_str_weak(remove_by_fabric), + /* K16 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K17 */ be_nested_str_weak(remove_fabric), + /* K18 */ be_nested_str_weak(stop_iteration), + /* K19 */ be_nested_str_weak(save_fabrics), + }), + be_str_weak(remove_fabric), + &be_const_str_solidified, + ( &(const binstruction[56]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x8C100302, // 0002 GETMET R4 R1 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x7C080400, // 0004 CALL R2 2 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C0C0403, // 0006 EQ R3 R2 R3 + 0x780E0000, // 0007 JMPF R3 #0009 + 0x80000600, // 0008 RET 0 + 0x600C0010, // 0009 GETGBL R3 G16 + 0x5C100400, // 000A MOVE R4 R2 + 0x7C0C0200, // 000B CALL R3 1 + 0xA8020023, // 000C EXBLK 0 #0031 + 0x5C100600, // 000D MOVE R4 R3 + 0x7C100000, // 000E CALL R4 0 + 0x88140100, // 000F GETMBR R5 R0 K0 + 0x8C140B03, // 0010 GETMET R5 R5 K3 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x4C180000, // 0013 LDNIL R6 + 0x20180A06, // 0014 NE R6 R5 R6 + 0x781A0019, // 0015 JMPF R6 #0030 + 0xB81A0800, // 0016 GETNGBL R6 K4 + 0x8C180D05, // 0017 GETMET R6 R6 K5 + 0x8C200B07, // 0018 GETMET R8 R5 K7 + 0x7C200200, // 0019 CALL R8 1 + 0x8C201108, // 001A GETMET R8 R8 K8 + 0x7C200200, // 001B CALL R8 1 + 0x8C201109, // 001C GETMET R8 R8 K9 + 0x7C200200, // 001D CALL R8 1 + 0x8C20110A, // 001E GETMET R8 R8 K10 + 0x7C200200, // 001F CALL R8 1 + 0x00220C08, // 0020 ADD R8 K6 R8 + 0x5824000B, // 0021 LDCONST R9 K11 + 0x7C180600, // 0022 CALL R6 3 + 0x8818010C, // 0023 GETMBR R6 R0 K12 + 0x88180D0D, // 0024 GETMBR R6 R6 K13 + 0x88180D0E, // 0025 GETMBR R6 R6 K14 + 0x8C180D0F, // 0026 GETMET R6 R6 K15 + 0x5C200A00, // 0027 MOVE R8 R5 + 0x7C180400, // 0028 CALL R6 2 + 0x8C180110, // 0029 GETMET R6 R0 K16 + 0x5C200A00, // 002A MOVE R8 R5 + 0x7C180400, // 002B CALL R6 2 + 0x88180100, // 002C GETMBR R6 R0 K0 + 0x8C180D11, // 002D GETMET R6 R6 K17 + 0x5C200A00, // 002E MOVE R8 R5 + 0x7C180400, // 002F CALL R6 2 + 0x7001FFDB, // 0030 JMP #000D + 0x580C0012, // 0031 LDCONST R3 K18 + 0xAC0C0200, // 0032 CATCH R3 1 0 + 0xB0080000, // 0033 RAISE 2 R0 R0 + 0x880C0100, // 0034 GETMBR R3 R0 K0 + 0x8C0C0713, // 0035 GETMET R3 R3 K19 + 0x7C0C0200, // 0036 CALL R3 1 + 0x80000000, // 0037 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, - 36, + 37, NULL, - be_nested_map(108, + be_nested_map(109, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(sort_distinct, -1), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(is_commissioning_open, 0), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(plugins_classes, 34), be_const_var(3) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(17) }, { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(root_w0, -1), be_const_var(34) }, - { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, - { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_Device_every_50ms_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(18) }, - { be_const_key_weak(PASE_TIMEOUT, 57), be_const_int(600) }, - { be_const_key_weak(init, 96), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(start_basic_commissioning, 87), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(vendorid, 1), be_const_var(22) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(24) }, - { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, - { be_const_key_weak(_init_basic_commissioning, -1), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(message_handler, -1), be_const_var(7) }, - { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(FILENAME, 94), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(PASSCODE_INVALID, 36), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { + { be_const_key_weak(_start_udp, 47), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(start_operational_discovery, 46), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(9) }, + { be_const_key_weak(PASSCODE_INVALID, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { be_const_int(0), @@ -5722,92 +5714,108 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(invoke_request, 12), be_const_closure(Matter_Device_invoke_request_closure) }, - { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, - { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(plugins, 100), be_const_var(1) }, - { be_const_key_weak(msg_received, 56), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(commissioning_open, 19), be_const_var(11) }, - { be_const_key_weak(plugins_config_remotes, 104), be_const_var(5) }, - { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(tick, -1), be_const_var(10) }, - { be_const_key_weak(register_plugin_class, 50), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(is_commissioning_open, 41), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(hostname_wifi, -1), be_const_var(21) }, + { be_const_key_weak(plugins_config_remotes, 106), be_const_var(5) }, + { be_const_key_weak(load_param, 92), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(profiler, -1), be_const_var(7) }, + { be_const_key_weak(tick, 36), be_const_var(11) }, + { be_const_key_weak(root_w0, -1), be_const_var(35) }, { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, - { be_const_key_weak(root_passcode, 13), be_const_var(28) }, - { be_const_key_weak(compute_qrcode_content, 99), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, - { be_const_key_weak(update_remotes_info, -1), be_const_closure(Matter_Device_update_remotes_info_closure) }, - { be_const_key_weak(compute_manual_pairing_code, 63), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(get_plugin_remote_info, 49), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, - { be_const_key_weak(hostname_wifi, -1), be_const_var(20) }, - { be_const_key_weak(disable_bridge_mode, -1), be_const_var(30) }, - { be_const_key_weak(MtrJoin, 37), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(start, 18), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(commissioning_admin_fabric, 66), be_const_var(17) }, - { be_const_key_weak(PBKDF_ITERATIONS, -1), be_const_int(1000) }, - { be_const_key_weak(commissioning_iterations, 101), be_const_var(12) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, 11), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(productid, -1), be_const_var(23) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(udp_server, -1), be_const_var(6) }, - { be_const_key_weak(sessions, -1), be_const_var(8) }, - { be_const_key_weak(ipv4only, 85), be_const_var(29) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(started, 26), be_const_var(0) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(mdns_pase_wifi, 60), be_const_var(25) }, - { be_const_key_weak(_mdns_announce_hostname, 90), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(stop, 52), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(stop_basic_commissioning, 95), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(remove_fabric, 31), be_const_closure(Matter_Device_remove_fabric_closure) }, - { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(19) }, - { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(27) }, - { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(commissioning_w0, 68), be_const_var(15) }, - { be_const_key_weak(get_plugin_class_arg, 69), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(conf_to_log, -1), be_const_static_closure(Matter_Device_conf_to_log_closure) }, - { be_const_key_weak(_instantiate_plugins_from_config, 71), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, - { be_const_key_weak(root_iterations, 72), be_const_var(32) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(16) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(21) }, - { be_const_key_weak(http_remotes, -1), be_const_var(26) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(ui, 64), be_const_var(9) }, + { be_const_key_weak(ui, -1), be_const_var(10) }, { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(next_ep, -1), be_const_var(31) }, - { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(root_salt, -1), be_const_var(33) }, - { be_const_key_weak(register_http_remote, 55), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(commissioning_salt, -1), be_const_var(14) }, - { be_const_key_weak(_start_udp, -1), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(commissioning_discriminator, 6), be_const_var(13) }, - { be_const_key_weak(every_250ms, 44), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(register_commands, 61), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(register_http_remote, -1), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(PASE_TIMEOUT, 57), be_const_int(600) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, + { be_const_key_weak(mdns_pase_eth, -1), be_const_var(25) }, + { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(http_remotes, 27), be_const_var(27) }, + { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, + { be_const_key_weak(root_passcode, 73), be_const_var(29) }, + { be_const_key_weak(every_250ms, 104), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(autoconf_device, 54), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, 43), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(sort_distinct, 69), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(productid, -1), be_const_var(24) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(started, 108), be_const_var(0) }, + { be_const_key_weak(get_plugin_remote_info, -1), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, + { be_const_key_weak(commissioning_w0, -1), be_const_var(16) }, + { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(bridge_remove_endpoint, 97), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, 98), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(hostname_eth, -1), be_const_var(22) }, + { be_const_key_weak(mdns_announce_PASE, 19), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, 38), be_const_int(1000) }, + { be_const_key_weak(bridge_remove_endpoint, 20), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(commissioning_salt, 100), be_const_var(15) }, + { be_const_key_weak(find_plugin_by_endpoint, 96), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, + { be_const_key_weak(root_discriminator, -1), be_const_var(28) }, + { be_const_key_weak(every_50ms, 48), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(msg_send, 85), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, + { be_const_key_weak(init, 35), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 75), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, + { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(vendorid, 39), be_const_var(23) }, + { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(save_before_restart, 91), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(_init_basic_commissioning, 88), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(commissioning_iterations, 28), be_const_var(13) }, + { be_const_key_weak(process_attribute_expansion, 60), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(next_ep, -1), be_const_var(32) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(k2l_num, 83), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(udp_server, 33), be_const_var(6) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(compute_qrcode_content, 81), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(26) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(ipv4only, -1), be_const_var(30) }, + { be_const_key_weak(invoke_request, 67), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(root_iterations, -1), be_const_var(33) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(commissioning_open, -1), be_const_var(12) }, + { be_const_key_weak(disable_bridge_mode, 95), be_const_var(31) }, + { be_const_key_weak(adjust_next_ep, 52), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, 101), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(update_remotes_info, -1), be_const_closure(Matter_Device_update_remotes_info_closure) }, + { be_const_key_weak(conf_to_log, 44), be_const_static_closure(Matter_Device_conf_to_log_closure) }, + { be_const_key_weak(message_handler, -1), be_const_var(8) }, + { be_const_key_weak(plugins, -1), be_const_var(1) }, + { be_const_key_weak(root_salt, 99), be_const_var(34) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(18) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(14) }, + { be_const_key_weak(root_L, -1), be_const_var(36) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(attribute_updated, 31), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(20) }, + { be_const_key_weak(plugins_config, 25), be_const_var(4) }, + { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(19) }, + { be_const_key_weak(remove_fabric, 11), be_const_closure(Matter_Device_remove_fabric_closure) }, { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, - { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(save_before_restart, 9), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(process_attribute_expansion, 7), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(root_L, -1), be_const_var(35) }, - { be_const_key_weak(register_native_classes, 3), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(plugins_config, -1), be_const_var(4) }, - { be_const_key_weak(autoconf_device, -1), be_const_closure(Matter_Device_autoconf_device_closure) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 8133aa511..07196c19c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -75,331 +75,338 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[44]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(msg), - /* K3 */ be_nested_str_weak(InvokeRequestMessage), - /* K4 */ be_nested_str_weak(from_TLV), - /* K5 */ be_nested_str_weak(invoke_requests), - /* K6 */ be_nested_str_weak(InvokeResponseMessage), - /* K7 */ be_nested_str_weak(suppress_response), - /* K8 */ be_nested_str_weak(invoke_responses), - /* K9 */ be_nested_str_weak(endpoint), - /* K10 */ be_nested_str_weak(command_path), - /* K11 */ be_nested_str_weak(cluster), - /* K12 */ be_nested_str_weak(command), - /* K13 */ be_nested_str_weak(status), - /* K14 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K15 */ be_nested_str_weak(get_command_name), - /* K16 */ be_nested_str_weak(device), - /* K17 */ be_nested_str_weak(invoke_request), - /* K18 */ be_nested_str_weak(session), - /* K19 */ be_nested_str_weak(command_fields), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(_X28), - /* K22 */ be_nested_str_weak(_X29_X20), - /* K23 */ be_nested_str_weak(), - /* K24 */ be_nested_str_weak(tasmota), - /* K25 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), - /* K26 */ be_nested_str_weak(local_session_id), - /* K27 */ be_const_int(0), - /* K28 */ be_const_int(2), - /* K29 */ be_const_int(3), - /* K30 */ be_nested_str_weak(InvokeResponseIB), - /* K31 */ be_nested_str_weak(SUCCESS), - /* K32 */ be_nested_str_weak(CommandStatusIB), - /* K33 */ be_nested_str_weak(CommandPathIB), - /* K34 */ be_nested_str_weak(StatusIB), - /* K35 */ be_nested_str_weak(push), - /* K36 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K37 */ be_nested_str_weak(exchange_id), - /* K38 */ be_nested_str_weak(CommandDataIB), - /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K41 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K42 */ be_nested_str_weak(stop_iteration), - /* K43 */ be_nested_str_weak(send_invoke_response), + ( &(const bvalue[46]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(invoke_request_start), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(Path), + /* K6 */ be_nested_str_weak(msg), + /* K7 */ be_nested_str_weak(InvokeRequestMessage), + /* K8 */ be_nested_str_weak(from_TLV), + /* K9 */ be_nested_str_weak(invoke_requests), + /* K10 */ be_nested_str_weak(InvokeResponseMessage), + /* K11 */ be_nested_str_weak(suppress_response), + /* K12 */ be_nested_str_weak(invoke_responses), + /* K13 */ be_nested_str_weak(endpoint), + /* K14 */ be_nested_str_weak(command_path), + /* K15 */ be_nested_str_weak(cluster), + /* K16 */ be_nested_str_weak(command), + /* K17 */ be_nested_str_weak(status), + /* K18 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K19 */ be_nested_str_weak(get_command_name), + /* K20 */ be_nested_str_weak(invoke_request), + /* K21 */ be_nested_str_weak(session), + /* K22 */ be_nested_str_weak(command_fields), + /* K23 */ be_nested_str_weak(_X28), + /* K24 */ be_nested_str_weak(_X29_X20), + /* K25 */ be_nested_str_weak(), + /* K26 */ be_nested_str_weak(tasmota), + /* K27 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), + /* K28 */ be_nested_str_weak(local_session_id), + /* K29 */ be_const_int(0), + /* K30 */ be_const_int(2), + /* K31 */ be_const_int(3), + /* K32 */ be_nested_str_weak(InvokeResponseIB), + /* K33 */ be_nested_str_weak(SUCCESS), + /* K34 */ be_nested_str_weak(CommandStatusIB), + /* K35 */ be_nested_str_weak(CommandPathIB), + /* K36 */ be_nested_str_weak(StatusIB), + /* K37 */ be_nested_str_weak(push), + /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K39 */ be_nested_str_weak(exchange_id), + /* K40 */ be_nested_str_weak(CommandDataIB), + /* K41 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K42 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K43 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K44 */ be_nested_str_weak(stop_iteration), + /* K45 */ be_nested_str_weak(send_invoke_response), }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[276]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x900E0401, // 0003 SETMBR R3 K2 R1 - 0xB8120000, // 0004 GETNGBL R4 K0 - 0x8C100903, // 0005 GETMET R4 R4 K3 - 0x7C100200, // 0006 CALL R4 1 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x5C180400, // 0008 MOVE R6 R2 - 0x7C100400, // 0009 CALL R4 2 - 0x88140905, // 000A GETMBR R5 R4 K5 - 0x4C180000, // 000B LDNIL R6 - 0x20140A06, // 000C NE R5 R5 R6 - 0x78160104, // 000D JMPF R5 #0113 - 0xB8160000, // 000E GETNGBL R5 K0 - 0x8C140B06, // 000F GETMET R5 R5 K6 - 0x7C140200, // 0010 CALL R5 1 - 0x50180000, // 0011 LDBOOL R6 0 0 - 0x90160E06, // 0012 SETMBR R5 K7 R6 - 0x60180012, // 0013 GETGBL R6 G18 - 0x7C180000, // 0014 CALL R6 0 - 0x90161006, // 0015 SETMBR R5 K8 R6 - 0x60180010, // 0016 GETGBL R6 G16 - 0x881C0905, // 0017 GETMBR R7 R4 K5 - 0x7C180200, // 0018 CALL R6 1 - 0xA80200E7, // 0019 EXBLK 0 #0102 - 0x5C1C0C00, // 001A MOVE R7 R6 - 0x7C1C0000, // 001B CALL R7 0 - 0x88200F0A, // 001C GETMBR R8 R7 K10 - 0x88201109, // 001D GETMBR R8 R8 K9 - 0x900E1208, // 001E SETMBR R3 K9 R8 - 0x88200F0A, // 001F GETMBR R8 R7 K10 - 0x8820110B, // 0020 GETMBR R8 R8 K11 - 0x900E1608, // 0021 SETMBR R3 K11 R8 - 0x88200F0A, // 0022 GETMBR R8 R7 K10 - 0x8820110C, // 0023 GETMBR R8 R8 K12 - 0x900E1808, // 0024 SETMBR R3 K12 R8 - 0xB8220000, // 0025 GETNGBL R8 K0 - 0x8820110E, // 0026 GETMBR R8 R8 K14 - 0x900E1A08, // 0027 SETMBR R3 K13 R8 - 0xB8220000, // 0028 GETNGBL R8 K0 - 0x8C20110F, // 0029 GETMET R8 R8 K15 - 0x8828070B, // 002A GETMBR R10 R3 K11 - 0x882C070C, // 002B GETMBR R11 R3 K12 - 0x7C200600, // 002C CALL R8 3 - 0x60240008, // 002D GETGBL R9 G8 - 0x5C280600, // 002E MOVE R10 R3 - 0x7C240200, // 002F CALL R9 1 - 0x88280110, // 0030 GETMBR R10 R0 K16 - 0x8C281511, // 0031 GETMET R10 R10 K17 - 0x88300312, // 0032 GETMBR R12 R1 K18 - 0x88340F13, // 0033 GETMBR R13 R7 K19 - 0x5C380600, // 0034 MOVE R14 R3 - 0x7C280800, // 0035 CALL R10 4 - 0x882C0714, // 0036 GETMBR R11 R3 K20 - 0x4C300000, // 0037 LDNIL R12 - 0x202C160C, // 0038 NE R11 R11 R12 - 0x782E0005, // 0039 JMPF R11 #0040 - 0x602C0008, // 003A GETGBL R11 G8 - 0x88300714, // 003B GETMBR R12 R3 K20 - 0x7C2C0200, // 003C CALL R11 1 - 0x002E2A0B, // 003D ADD R11 K21 R11 - 0x002C1716, // 003E ADD R11 R11 K22 - 0x70020000, // 003F JMP #0041 - 0x582C0017, // 0040 LDCONST R11 K23 - 0xB8323000, // 0041 GETNGBL R12 K24 - 0x8C301914, // 0042 GETMET R12 R12 K20 - 0x60380018, // 0043 GETGBL R14 G24 - 0x583C0019, // 0044 LDCONST R15 K25 - 0x88400312, // 0045 GETMBR R16 R1 K18 - 0x8840211A, // 0046 GETMBR R16 R16 K26 - 0x5C441200, // 0047 MOVE R17 R9 - 0x78220001, // 0048 JMPF R8 #004B - 0x5C481000, // 0049 MOVE R18 R8 - 0x70020000, // 004A JMP #004C - 0x58480017, // 004B LDCONST R18 K23 - 0x5C4C1600, // 004C MOVE R19 R11 - 0x7C380A00, // 004D CALL R14 5 - 0x883C0709, // 004E GETMBR R15 R3 K9 - 0x203C1F1B, // 004F NE R15 R15 K27 - 0x783E0001, // 0050 JMPF R15 #0053 - 0x583C001C, // 0051 LDCONST R15 K28 - 0x70020000, // 0052 JMP #0054 - 0x583C001D, // 0053 LDCONST R15 K29 - 0x7C300600, // 0054 CALL R12 3 - 0x4C300000, // 0055 LDNIL R12 - 0x900E280C, // 0056 SETMBR R3 K20 R12 - 0xB8320000, // 0057 GETNGBL R12 K0 - 0x8C30191E, // 0058 GETMET R12 R12 K30 - 0x7C300200, // 0059 CALL R12 1 - 0x50340200, // 005A LDBOOL R13 1 0 - 0x1C34140D, // 005B EQ R13 R10 R13 - 0x74360004, // 005C JMPT R13 #0062 - 0x8834070D, // 005D GETMBR R13 R3 K13 - 0xB83A0000, // 005E GETNGBL R14 K0 - 0x88381D1F, // 005F GETMBR R14 R14 K31 - 0x1C341A0E, // 0060 EQ R13 R13 R14 - 0x7836002D, // 0061 JMPF R13 #0090 - 0xB8360000, // 0062 GETNGBL R13 K0 - 0x8C341B20, // 0063 GETMET R13 R13 K32 - 0x7C340200, // 0064 CALL R13 1 - 0x90321A0D, // 0065 SETMBR R12 K13 R13 - 0x8834190D, // 0066 GETMBR R13 R12 K13 - 0xB83A0000, // 0067 GETNGBL R14 K0 - 0x8C381D21, // 0068 GETMET R14 R14 K33 - 0x7C380200, // 0069 CALL R14 1 - 0x9036140E, // 006A SETMBR R13 K10 R14 - 0x8834190D, // 006B GETMBR R13 R12 K13 - 0x88341B0A, // 006C GETMBR R13 R13 K10 - 0x88380709, // 006D GETMBR R14 R3 K9 - 0x9036120E, // 006E SETMBR R13 K9 R14 - 0x8834190D, // 006F GETMBR R13 R12 K13 - 0x88341B0A, // 0070 GETMBR R13 R13 K10 - 0x8838070B, // 0071 GETMBR R14 R3 K11 - 0x9036160E, // 0072 SETMBR R13 K11 R14 - 0x8834190D, // 0073 GETMBR R13 R12 K13 - 0x88341B0A, // 0074 GETMBR R13 R13 K10 - 0x8838070C, // 0075 GETMBR R14 R3 K12 - 0x9036180E, // 0076 SETMBR R13 K12 R14 - 0x8834190D, // 0077 GETMBR R13 R12 K13 - 0xB83A0000, // 0078 GETNGBL R14 K0 - 0x8C381D22, // 0079 GETMET R14 R14 K34 - 0x7C380200, // 007A CALL R14 1 - 0x90361A0E, // 007B SETMBR R13 K13 R14 - 0x8834190D, // 007C GETMBR R13 R12 K13 - 0x88341B0D, // 007D GETMBR R13 R13 K13 - 0xB83A0000, // 007E GETNGBL R14 K0 - 0x88381D1F, // 007F GETMBR R14 R14 K31 - 0x90361A0E, // 0080 SETMBR R13 K13 R14 - 0x88340B08, // 0081 GETMBR R13 R5 K8 - 0x8C341B23, // 0082 GETMET R13 R13 K35 - 0x5C3C1800, // 0083 MOVE R15 R12 - 0x7C340400, // 0084 CALL R13 2 - 0xB8363000, // 0085 GETNGBL R13 K24 - 0x8C341B14, // 0086 GETMET R13 R13 K20 - 0x603C0018, // 0087 GETGBL R15 G24 - 0x58400024, // 0088 LDCONST R16 K36 - 0x88440312, // 0089 GETMBR R17 R1 K18 - 0x8844231A, // 008A GETMBR R17 R17 K26 - 0x88480325, // 008B GETMBR R18 R1 K37 - 0x7C3C0600, // 008C CALL R15 3 - 0x5840001D, // 008D LDCONST R16 K29 - 0x7C340600, // 008E CALL R13 3 - 0x70020070, // 008F JMP #0101 - 0x4C340000, // 0090 LDNIL R13 - 0x2034140D, // 0091 NE R13 R10 R13 - 0x78360031, // 0092 JMPF R13 #00C5 - 0xB8360000, // 0093 GETNGBL R13 K0 - 0x8C341B26, // 0094 GETMET R13 R13 K38 - 0x7C340200, // 0095 CALL R13 1 - 0x9032180D, // 0096 SETMBR R12 K12 R13 - 0x8834190C, // 0097 GETMBR R13 R12 K12 - 0xB83A0000, // 0098 GETNGBL R14 K0 - 0x8C381D21, // 0099 GETMET R14 R14 K33 - 0x7C380200, // 009A CALL R14 1 - 0x9036140E, // 009B SETMBR R13 K10 R14 - 0x8834190C, // 009C GETMBR R13 R12 K12 - 0x88341B0A, // 009D GETMBR R13 R13 K10 - 0x88380709, // 009E GETMBR R14 R3 K9 - 0x9036120E, // 009F SETMBR R13 K9 R14 - 0x8834190C, // 00A0 GETMBR R13 R12 K12 - 0x88341B0A, // 00A1 GETMBR R13 R13 K10 - 0x8838070B, // 00A2 GETMBR R14 R3 K11 - 0x9036160E, // 00A3 SETMBR R13 K11 R14 - 0x8834190C, // 00A4 GETMBR R13 R12 K12 - 0x88341B0A, // 00A5 GETMBR R13 R13 K10 - 0x8838070C, // 00A6 GETMBR R14 R3 K12 - 0x9036180E, // 00A7 SETMBR R13 K12 R14 - 0x8834190C, // 00A8 GETMBR R13 R12 K12 - 0x9036260A, // 00A9 SETMBR R13 K19 R10 - 0x88340B08, // 00AA GETMBR R13 R5 K8 - 0x8C341B23, // 00AB GETMET R13 R13 K35 - 0x5C3C1800, // 00AC MOVE R15 R12 - 0x7C340400, // 00AD CALL R13 2 - 0xB8360000, // 00AE GETNGBL R13 K0 - 0x8C341B0F, // 00AF GETMET R13 R13 K15 - 0x883C070B, // 00B0 GETMBR R15 R3 K11 - 0x8840070C, // 00B1 GETMBR R16 R3 K12 - 0x7C340600, // 00B2 CALL R13 3 - 0x5C201A00, // 00B3 MOVE R8 R13 - 0xB8363000, // 00B4 GETNGBL R13 K24 - 0x8C341B14, // 00B5 GETMET R13 R13 K20 - 0x603C0018, // 00B6 GETGBL R15 G24 - 0x58400027, // 00B7 LDCONST R16 K39 - 0x88440312, // 00B8 GETMBR R17 R1 K18 - 0x8844231A, // 00B9 GETMBR R17 R17 K26 - 0x60480008, // 00BA GETGBL R18 G8 - 0x5C4C0600, // 00BB MOVE R19 R3 - 0x7C480200, // 00BC CALL R18 1 - 0x78220001, // 00BD JMPF R8 #00C0 - 0x5C4C1000, // 00BE MOVE R19 R8 - 0x70020000, // 00BF JMP #00C1 - 0x584C0017, // 00C0 LDCONST R19 K23 - 0x7C3C0800, // 00C1 CALL R15 4 - 0x5840001D, // 00C2 LDCONST R16 K29 - 0x7C340600, // 00C3 CALL R13 3 - 0x7002003B, // 00C4 JMP #0101 - 0x8834070D, // 00C5 GETMBR R13 R3 K13 - 0x4C380000, // 00C6 LDNIL R14 - 0x20341A0E, // 00C7 NE R13 R13 R14 - 0x7836002D, // 00C8 JMPF R13 #00F7 - 0xB8360000, // 00C9 GETNGBL R13 K0 - 0x8C341B20, // 00CA GETMET R13 R13 K32 - 0x7C340200, // 00CB CALL R13 1 - 0x90321A0D, // 00CC SETMBR R12 K13 R13 - 0x8834190D, // 00CD GETMBR R13 R12 K13 - 0xB83A0000, // 00CE GETNGBL R14 K0 - 0x8C381D21, // 00CF GETMET R14 R14 K33 - 0x7C380200, // 00D0 CALL R14 1 - 0x9036140E, // 00D1 SETMBR R13 K10 R14 - 0x8834190D, // 00D2 GETMBR R13 R12 K13 - 0x88341B0A, // 00D3 GETMBR R13 R13 K10 - 0x88380709, // 00D4 GETMBR R14 R3 K9 - 0x9036120E, // 00D5 SETMBR R13 K9 R14 - 0x8834190D, // 00D6 GETMBR R13 R12 K13 - 0x88341B0A, // 00D7 GETMBR R13 R13 K10 - 0x8838070B, // 00D8 GETMBR R14 R3 K11 - 0x9036160E, // 00D9 SETMBR R13 K11 R14 - 0x8834190D, // 00DA GETMBR R13 R12 K13 - 0x88341B0A, // 00DB GETMBR R13 R13 K10 - 0x8838070C, // 00DC GETMBR R14 R3 K12 - 0x9036180E, // 00DD SETMBR R13 K12 R14 - 0x8834190D, // 00DE GETMBR R13 R12 K13 - 0xB83A0000, // 00DF GETNGBL R14 K0 - 0x8C381D22, // 00E0 GETMET R14 R14 K34 - 0x7C380200, // 00E1 CALL R14 1 - 0x90361A0E, // 00E2 SETMBR R13 K13 R14 - 0x8834190D, // 00E3 GETMBR R13 R12 K13 - 0x88341B0D, // 00E4 GETMBR R13 R13 K13 - 0x8838070D, // 00E5 GETMBR R14 R3 K13 - 0x90361A0E, // 00E6 SETMBR R13 K13 R14 - 0x88340B08, // 00E7 GETMBR R13 R5 K8 - 0x8C341B23, // 00E8 GETMET R13 R13 K35 - 0x5C3C1800, // 00E9 MOVE R15 R12 - 0x7C340400, // 00EA CALL R13 2 - 0xB8363000, // 00EB GETNGBL R13 K24 - 0x8C341B14, // 00EC GETMET R13 R13 K20 - 0x603C0018, // 00ED GETGBL R15 G24 - 0x58400028, // 00EE LDCONST R16 K40 - 0x88440312, // 00EF GETMBR R17 R1 K18 - 0x8844231A, // 00F0 GETMBR R17 R17 K26 - 0x8848070D, // 00F1 GETMBR R18 R3 K13 - 0x884C0325, // 00F2 GETMBR R19 R1 K37 - 0x7C3C0800, // 00F3 CALL R15 4 - 0x5840001D, // 00F4 LDCONST R16 K29 - 0x7C340600, // 00F5 CALL R13 3 - 0x70020009, // 00F6 JMP #0101 - 0xB8363000, // 00F7 GETNGBL R13 K24 - 0x8C341B14, // 00F8 GETMET R13 R13 K20 - 0x603C0018, // 00F9 GETGBL R15 G24 - 0x58400029, // 00FA LDCONST R16 K41 - 0x88440312, // 00FB GETMBR R17 R1 K18 - 0x8844231A, // 00FC GETMBR R17 R17 K26 - 0x88480325, // 00FD GETMBR R18 R1 K37 - 0x7C3C0600, // 00FE CALL R15 3 - 0x5840001D, // 00FF LDCONST R16 K29 - 0x7C340600, // 0100 CALL R13 3 - 0x7001FF17, // 0101 JMP #001A - 0x5818002A, // 0102 LDCONST R6 K42 - 0xAC180200, // 0103 CATCH R6 1 0 - 0xB0080000, // 0104 RAISE 2 R0 R0 - 0x6018000C, // 0105 GETGBL R6 G12 - 0x881C0B08, // 0106 GETMBR R7 R5 K8 - 0x7C180200, // 0107 CALL R6 1 - 0x24180D1B, // 0108 GT R6 R6 K27 - 0x781A0004, // 0109 JMPF R6 #010F - 0x8C18012B, // 010A GETMET R6 R0 K43 - 0x5C200200, // 010B MOVE R8 R1 - 0x5C240A00, // 010C MOVE R9 R5 - 0x7C180600, // 010D CALL R6 3 - 0x70020001, // 010E JMP #0111 - 0x50180000, // 010F LDBOOL R6 0 0 - 0x80040C00, // 0110 RET 1 R6 - 0x50180200, // 0111 LDBOOL R6 1 0 - 0x80040C00, // 0112 RET 1 R6 - 0x80000000, // 0113 RET 0 + ( &(const binstruction[281]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0xB80E0800, // 0005 GETNGBL R3 K4 + 0x8C0C0705, // 0006 GETMET R3 R3 K5 + 0x7C0C0200, // 0007 CALL R3 1 + 0x900E0C01, // 0008 SETMBR R3 K6 R1 + 0xB8120800, // 0009 GETNGBL R4 K4 + 0x8C100907, // 000A GETMET R4 R4 K7 + 0x7C100200, // 000B CALL R4 1 + 0x8C100908, // 000C GETMET R4 R4 K8 + 0x5C180400, // 000D MOVE R6 R2 + 0x7C100400, // 000E CALL R4 2 + 0x88140909, // 000F GETMBR R5 R4 K9 + 0x4C180000, // 0010 LDNIL R6 + 0x20140A06, // 0011 NE R5 R5 R6 + 0x78160104, // 0012 JMPF R5 #0118 + 0xB8160800, // 0013 GETNGBL R5 K4 + 0x8C140B0A, // 0014 GETMET R5 R5 K10 + 0x7C140200, // 0015 CALL R5 1 + 0x50180000, // 0016 LDBOOL R6 0 0 + 0x90161606, // 0017 SETMBR R5 K11 R6 + 0x60180012, // 0018 GETGBL R6 G18 + 0x7C180000, // 0019 CALL R6 0 + 0x90161806, // 001A SETMBR R5 K12 R6 + 0x60180010, // 001B GETGBL R6 G16 + 0x881C0909, // 001C GETMBR R7 R4 K9 + 0x7C180200, // 001D CALL R6 1 + 0xA80200E7, // 001E EXBLK 0 #0107 + 0x5C1C0C00, // 001F MOVE R7 R6 + 0x7C1C0000, // 0020 CALL R7 0 + 0x88200F0E, // 0021 GETMBR R8 R7 K14 + 0x8820110D, // 0022 GETMBR R8 R8 K13 + 0x900E1A08, // 0023 SETMBR R3 K13 R8 + 0x88200F0E, // 0024 GETMBR R8 R7 K14 + 0x8820110F, // 0025 GETMBR R8 R8 K15 + 0x900E1E08, // 0026 SETMBR R3 K15 R8 + 0x88200F0E, // 0027 GETMBR R8 R7 K14 + 0x88201110, // 0028 GETMBR R8 R8 K16 + 0x900E2008, // 0029 SETMBR R3 K16 R8 + 0xB8220800, // 002A GETNGBL R8 K4 + 0x88201112, // 002B GETMBR R8 R8 K18 + 0x900E2208, // 002C SETMBR R3 K17 R8 + 0xB8220800, // 002D GETNGBL R8 K4 + 0x8C201113, // 002E GETMET R8 R8 K19 + 0x8828070F, // 002F GETMBR R10 R3 K15 + 0x882C0710, // 0030 GETMBR R11 R3 K16 + 0x7C200600, // 0031 CALL R8 3 + 0x60240008, // 0032 GETGBL R9 G8 + 0x5C280600, // 0033 MOVE R10 R3 + 0x7C240200, // 0034 CALL R9 1 + 0x88280100, // 0035 GETMBR R10 R0 K0 + 0x8C281514, // 0036 GETMET R10 R10 K20 + 0x88300315, // 0037 GETMBR R12 R1 K21 + 0x88340F16, // 0038 GETMBR R13 R7 K22 + 0x5C380600, // 0039 MOVE R14 R3 + 0x7C280800, // 003A CALL R10 4 + 0x882C0702, // 003B GETMBR R11 R3 K2 + 0x4C300000, // 003C LDNIL R12 + 0x202C160C, // 003D NE R11 R11 R12 + 0x782E0005, // 003E JMPF R11 #0045 + 0x602C0008, // 003F GETGBL R11 G8 + 0x88300702, // 0040 GETMBR R12 R3 K2 + 0x7C2C0200, // 0041 CALL R11 1 + 0x002E2E0B, // 0042 ADD R11 K23 R11 + 0x002C1718, // 0043 ADD R11 R11 K24 + 0x70020000, // 0044 JMP #0046 + 0x582C0019, // 0045 LDCONST R11 K25 + 0xB8323400, // 0046 GETNGBL R12 K26 + 0x8C301902, // 0047 GETMET R12 R12 K2 + 0x60380018, // 0048 GETGBL R14 G24 + 0x583C001B, // 0049 LDCONST R15 K27 + 0x88400315, // 004A GETMBR R16 R1 K21 + 0x8840211C, // 004B GETMBR R16 R16 K28 + 0x5C441200, // 004C MOVE R17 R9 + 0x78220001, // 004D JMPF R8 #0050 + 0x5C481000, // 004E MOVE R18 R8 + 0x70020000, // 004F JMP #0051 + 0x58480019, // 0050 LDCONST R18 K25 + 0x5C4C1600, // 0051 MOVE R19 R11 + 0x7C380A00, // 0052 CALL R14 5 + 0x883C070D, // 0053 GETMBR R15 R3 K13 + 0x203C1F1D, // 0054 NE R15 R15 K29 + 0x783E0001, // 0055 JMPF R15 #0058 + 0x583C001E, // 0056 LDCONST R15 K30 + 0x70020000, // 0057 JMP #0059 + 0x583C001F, // 0058 LDCONST R15 K31 + 0x7C300600, // 0059 CALL R12 3 + 0x4C300000, // 005A LDNIL R12 + 0x900E040C, // 005B SETMBR R3 K2 R12 + 0xB8320800, // 005C GETNGBL R12 K4 + 0x8C301920, // 005D GETMET R12 R12 K32 + 0x7C300200, // 005E CALL R12 1 + 0x50340200, // 005F LDBOOL R13 1 0 + 0x1C34140D, // 0060 EQ R13 R10 R13 + 0x74360004, // 0061 JMPT R13 #0067 + 0x88340711, // 0062 GETMBR R13 R3 K17 + 0xB83A0800, // 0063 GETNGBL R14 K4 + 0x88381D21, // 0064 GETMBR R14 R14 K33 + 0x1C341A0E, // 0065 EQ R13 R13 R14 + 0x7836002D, // 0066 JMPF R13 #0095 + 0xB8360800, // 0067 GETNGBL R13 K4 + 0x8C341B22, // 0068 GETMET R13 R13 K34 + 0x7C340200, // 0069 CALL R13 1 + 0x9032220D, // 006A SETMBR R12 K17 R13 + 0x88341911, // 006B GETMBR R13 R12 K17 + 0xB83A0800, // 006C GETNGBL R14 K4 + 0x8C381D23, // 006D GETMET R14 R14 K35 + 0x7C380200, // 006E CALL R14 1 + 0x90361C0E, // 006F SETMBR R13 K14 R14 + 0x88341911, // 0070 GETMBR R13 R12 K17 + 0x88341B0E, // 0071 GETMBR R13 R13 K14 + 0x8838070D, // 0072 GETMBR R14 R3 K13 + 0x90361A0E, // 0073 SETMBR R13 K13 R14 + 0x88341911, // 0074 GETMBR R13 R12 K17 + 0x88341B0E, // 0075 GETMBR R13 R13 K14 + 0x8838070F, // 0076 GETMBR R14 R3 K15 + 0x90361E0E, // 0077 SETMBR R13 K15 R14 + 0x88341911, // 0078 GETMBR R13 R12 K17 + 0x88341B0E, // 0079 GETMBR R13 R13 K14 + 0x88380710, // 007A GETMBR R14 R3 K16 + 0x9036200E, // 007B SETMBR R13 K16 R14 + 0x88341911, // 007C GETMBR R13 R12 K17 + 0xB83A0800, // 007D GETNGBL R14 K4 + 0x8C381D24, // 007E GETMET R14 R14 K36 + 0x7C380200, // 007F CALL R14 1 + 0x9036220E, // 0080 SETMBR R13 K17 R14 + 0x88341911, // 0081 GETMBR R13 R12 K17 + 0x88341B11, // 0082 GETMBR R13 R13 K17 + 0xB83A0800, // 0083 GETNGBL R14 K4 + 0x88381D21, // 0084 GETMBR R14 R14 K33 + 0x9036220E, // 0085 SETMBR R13 K17 R14 + 0x88340B0C, // 0086 GETMBR R13 R5 K12 + 0x8C341B25, // 0087 GETMET R13 R13 K37 + 0x5C3C1800, // 0088 MOVE R15 R12 + 0x7C340400, // 0089 CALL R13 2 + 0xB8363400, // 008A GETNGBL R13 K26 + 0x8C341B02, // 008B GETMET R13 R13 K2 + 0x603C0018, // 008C GETGBL R15 G24 + 0x58400026, // 008D LDCONST R16 K38 + 0x88440315, // 008E GETMBR R17 R1 K21 + 0x8844231C, // 008F GETMBR R17 R17 K28 + 0x88480327, // 0090 GETMBR R18 R1 K39 + 0x7C3C0600, // 0091 CALL R15 3 + 0x5840001F, // 0092 LDCONST R16 K31 + 0x7C340600, // 0093 CALL R13 3 + 0x70020070, // 0094 JMP #0106 + 0x4C340000, // 0095 LDNIL R13 + 0x2034140D, // 0096 NE R13 R10 R13 + 0x78360031, // 0097 JMPF R13 #00CA + 0xB8360800, // 0098 GETNGBL R13 K4 + 0x8C341B28, // 0099 GETMET R13 R13 K40 + 0x7C340200, // 009A CALL R13 1 + 0x9032200D, // 009B SETMBR R12 K16 R13 + 0x88341910, // 009C GETMBR R13 R12 K16 + 0xB83A0800, // 009D GETNGBL R14 K4 + 0x8C381D23, // 009E GETMET R14 R14 K35 + 0x7C380200, // 009F CALL R14 1 + 0x90361C0E, // 00A0 SETMBR R13 K14 R14 + 0x88341910, // 00A1 GETMBR R13 R12 K16 + 0x88341B0E, // 00A2 GETMBR R13 R13 K14 + 0x8838070D, // 00A3 GETMBR R14 R3 K13 + 0x90361A0E, // 00A4 SETMBR R13 K13 R14 + 0x88341910, // 00A5 GETMBR R13 R12 K16 + 0x88341B0E, // 00A6 GETMBR R13 R13 K14 + 0x8838070F, // 00A7 GETMBR R14 R3 K15 + 0x90361E0E, // 00A8 SETMBR R13 K15 R14 + 0x88341910, // 00A9 GETMBR R13 R12 K16 + 0x88341B0E, // 00AA GETMBR R13 R13 K14 + 0x88380710, // 00AB GETMBR R14 R3 K16 + 0x9036200E, // 00AC SETMBR R13 K16 R14 + 0x88341910, // 00AD GETMBR R13 R12 K16 + 0x90362C0A, // 00AE SETMBR R13 K22 R10 + 0x88340B0C, // 00AF GETMBR R13 R5 K12 + 0x8C341B25, // 00B0 GETMET R13 R13 K37 + 0x5C3C1800, // 00B1 MOVE R15 R12 + 0x7C340400, // 00B2 CALL R13 2 + 0xB8360800, // 00B3 GETNGBL R13 K4 + 0x8C341B13, // 00B4 GETMET R13 R13 K19 + 0x883C070F, // 00B5 GETMBR R15 R3 K15 + 0x88400710, // 00B6 GETMBR R16 R3 K16 + 0x7C340600, // 00B7 CALL R13 3 + 0x5C201A00, // 00B8 MOVE R8 R13 + 0xB8363400, // 00B9 GETNGBL R13 K26 + 0x8C341B02, // 00BA GETMET R13 R13 K2 + 0x603C0018, // 00BB GETGBL R15 G24 + 0x58400029, // 00BC LDCONST R16 K41 + 0x88440315, // 00BD GETMBR R17 R1 K21 + 0x8844231C, // 00BE GETMBR R17 R17 K28 + 0x60480008, // 00BF GETGBL R18 G8 + 0x5C4C0600, // 00C0 MOVE R19 R3 + 0x7C480200, // 00C1 CALL R18 1 + 0x78220001, // 00C2 JMPF R8 #00C5 + 0x5C4C1000, // 00C3 MOVE R19 R8 + 0x70020000, // 00C4 JMP #00C6 + 0x584C0019, // 00C5 LDCONST R19 K25 + 0x7C3C0800, // 00C6 CALL R15 4 + 0x5840001F, // 00C7 LDCONST R16 K31 + 0x7C340600, // 00C8 CALL R13 3 + 0x7002003B, // 00C9 JMP #0106 + 0x88340711, // 00CA GETMBR R13 R3 K17 + 0x4C380000, // 00CB LDNIL R14 + 0x20341A0E, // 00CC NE R13 R13 R14 + 0x7836002D, // 00CD JMPF R13 #00FC + 0xB8360800, // 00CE GETNGBL R13 K4 + 0x8C341B22, // 00CF GETMET R13 R13 K34 + 0x7C340200, // 00D0 CALL R13 1 + 0x9032220D, // 00D1 SETMBR R12 K17 R13 + 0x88341911, // 00D2 GETMBR R13 R12 K17 + 0xB83A0800, // 00D3 GETNGBL R14 K4 + 0x8C381D23, // 00D4 GETMET R14 R14 K35 + 0x7C380200, // 00D5 CALL R14 1 + 0x90361C0E, // 00D6 SETMBR R13 K14 R14 + 0x88341911, // 00D7 GETMBR R13 R12 K17 + 0x88341B0E, // 00D8 GETMBR R13 R13 K14 + 0x8838070D, // 00D9 GETMBR R14 R3 K13 + 0x90361A0E, // 00DA SETMBR R13 K13 R14 + 0x88341911, // 00DB GETMBR R13 R12 K17 + 0x88341B0E, // 00DC GETMBR R13 R13 K14 + 0x8838070F, // 00DD GETMBR R14 R3 K15 + 0x90361E0E, // 00DE SETMBR R13 K15 R14 + 0x88341911, // 00DF GETMBR R13 R12 K17 + 0x88341B0E, // 00E0 GETMBR R13 R13 K14 + 0x88380710, // 00E1 GETMBR R14 R3 K16 + 0x9036200E, // 00E2 SETMBR R13 K16 R14 + 0x88341911, // 00E3 GETMBR R13 R12 K17 + 0xB83A0800, // 00E4 GETNGBL R14 K4 + 0x8C381D24, // 00E5 GETMET R14 R14 K36 + 0x7C380200, // 00E6 CALL R14 1 + 0x9036220E, // 00E7 SETMBR R13 K17 R14 + 0x88341911, // 00E8 GETMBR R13 R12 K17 + 0x88341B11, // 00E9 GETMBR R13 R13 K17 + 0x88380711, // 00EA GETMBR R14 R3 K17 + 0x9036220E, // 00EB SETMBR R13 K17 R14 + 0x88340B0C, // 00EC GETMBR R13 R5 K12 + 0x8C341B25, // 00ED GETMET R13 R13 K37 + 0x5C3C1800, // 00EE MOVE R15 R12 + 0x7C340400, // 00EF CALL R13 2 + 0xB8363400, // 00F0 GETNGBL R13 K26 + 0x8C341B02, // 00F1 GETMET R13 R13 K2 + 0x603C0018, // 00F2 GETGBL R15 G24 + 0x5840002A, // 00F3 LDCONST R16 K42 + 0x88440315, // 00F4 GETMBR R17 R1 K21 + 0x8844231C, // 00F5 GETMBR R17 R17 K28 + 0x88480711, // 00F6 GETMBR R18 R3 K17 + 0x884C0327, // 00F7 GETMBR R19 R1 K39 + 0x7C3C0800, // 00F8 CALL R15 4 + 0x5840001F, // 00F9 LDCONST R16 K31 + 0x7C340600, // 00FA CALL R13 3 + 0x70020009, // 00FB JMP #0106 + 0xB8363400, // 00FC GETNGBL R13 K26 + 0x8C341B02, // 00FD GETMET R13 R13 K2 + 0x603C0018, // 00FE GETGBL R15 G24 + 0x5840002B, // 00FF LDCONST R16 K43 + 0x88440315, // 0100 GETMBR R17 R1 K21 + 0x8844231C, // 0101 GETMBR R17 R17 K28 + 0x88480327, // 0102 GETMBR R18 R1 K39 + 0x7C3C0600, // 0103 CALL R15 3 + 0x5840001F, // 0104 LDCONST R16 K31 + 0x7C340600, // 0105 CALL R13 3 + 0x7001FF17, // 0106 JMP #001F + 0x5818002C, // 0107 LDCONST R6 K44 + 0xAC180200, // 0108 CATCH R6 1 0 + 0xB0080000, // 0109 RAISE 2 R0 R0 + 0x6018000C, // 010A GETGBL R6 G12 + 0x881C0B0C, // 010B GETMBR R7 R5 K12 + 0x7C180200, // 010C CALL R6 1 + 0x24180D1D, // 010D GT R6 R6 K29 + 0x781A0004, // 010E JMPF R6 #0114 + 0x8C18012D, // 010F GETMET R6 R0 K45 + 0x5C200200, // 0110 MOVE R8 R1 + 0x5C240A00, // 0111 MOVE R9 R5 + 0x7C180600, // 0112 CALL R6 3 + 0x70020001, // 0113 JMP #0116 + 0x50180000, // 0114 LDBOOL R6 0 0 + 0x80040C00, // 0115 RET 1 R6 + 0x50180200, // 0116 LDBOOL R6 1 0 + 0x80040C00, // 0117 RET 1 R6 + 0x80000000, // 0118 RET 0 }) ) ); @@ -1880,38 +1887,47 @@ be_local_closure(Matter_IM_process_read_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(ReadRequestMessage), - /* K2 */ be_nested_str_weak(from_TLV), - /* K3 */ be_nested_str_weak(attributes_requests), - /* K4 */ be_nested_str_weak(_inner_process_read_request), - /* K5 */ be_nested_str_weak(session), - /* K6 */ be_nested_str_weak(send_report_data), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(read_request_start), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(ReadRequestMessage), + /* K6 */ be_nested_str_weak(from_TLV), + /* K7 */ be_nested_str_weak(attributes_requests), + /* K8 */ be_nested_str_weak(_inner_process_read_request), + /* K9 */ be_nested_str_weak(session), + /* K10 */ be_nested_str_weak(send_report_data), }), be_str_weak(process_read_request), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x88100703, // 0006 GETMBR R4 R3 K3 - 0x4C140000, // 0007 LDNIL R5 - 0x20100805, // 0008 NE R4 R4 R5 - 0x78120007, // 0009 JMPF R4 #0012 - 0x8C100104, // 000A GETMET R4 R0 K4 - 0x88180305, // 000B GETMBR R6 R1 K5 - 0x5C1C0600, // 000C MOVE R7 R3 - 0x7C100600, // 000D CALL R4 3 - 0x8C140106, // 000E GETMET R5 R0 K6 - 0x5C1C0200, // 000F MOVE R7 R1 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C140600, // 0011 CALL R5 3 - 0x50100200, // 0012 LDBOOL R4 1 0 - 0x80040800, // 0013 RET 1 R4 + ( &(const binstruction[25]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0xB80E0800, // 0005 GETNGBL R3 K4 + 0x8C0C0705, // 0006 GETMET R3 R3 K5 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C0C0706, // 0008 GETMET R3 R3 K6 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x88100707, // 000B GETMBR R4 R3 K7 + 0x4C140000, // 000C LDNIL R5 + 0x20100805, // 000D NE R4 R4 R5 + 0x78120007, // 000E JMPF R4 #0017 + 0x8C100108, // 000F GETMET R4 R0 K8 + 0x88180309, // 0010 GETMBR R6 R1 K9 + 0x5C1C0600, // 0011 MOVE R7 R3 + 0x7C100600, // 0012 CALL R4 3 + 0x8C14010A, // 0013 GETMET R5 R0 K10 + 0x5C1C0200, // 0014 MOVE R7 R1 + 0x5C200800, // 0015 MOVE R8 R4 + 0x7C140600, // 0016 CALL R5 3 + 0x50100200, // 0017 LDBOOL R4 1 0 + 0x80040800, // 0018 RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index 64c69ae00..b339729d5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -19,18 +19,26 @@ be_local_closure(Matter_MessageHandler_send_response_frame, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 5]) { /* constants */ /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(msg_send), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(send_response_frame), + /* K4 */ be_nested_str_weak(msg_send), }), be_str_weak(send_response_frame), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ + ( &(const binstruction[10]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C080400, // 0004 CALL R2 2 + 0x88080100, // 0005 GETMBR R2 R0 K0 + 0x8C080504, // 0006 GETMET R2 R2 K4 + 0x5C100200, // 0007 MOVE R4 R1 + 0x7C080400, // 0008 CALL R2 2 + 0x80000000, // 0009 RET 0 }) ) ); @@ -213,400 +221,413 @@ be_local_closure(Matter_MessageHandler_msg_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[66]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Frame), - /* K2 */ be_nested_str_weak(decode_header), - /* K3 */ be_nested_str_weak(sec_p), - /* K4 */ be_nested_str_weak(device), - /* K5 */ be_nested_str_weak(sessions), - /* K6 */ be_nested_str_weak(find_session_source_id_unsecure), - /* K7 */ be_nested_str_weak(source_node_id), - /* K8 */ be_nested_str_weak(control_message), - /* K9 */ be_nested_str_weak(process_incoming_control_message), - /* K10 */ be_nested_str_weak(local_session_id), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(sec_sesstype), - /* K13 */ be_nested_str_weak(_ip), - /* K14 */ be_nested_str_weak(_port), - /* K15 */ be_nested_str_weak(_message_handler), - /* K16 */ be_nested_str_weak(session), - /* K17 */ be_nested_str_weak(_counter_insecure_rcv), - /* K18 */ be_nested_str_weak(validate), - /* K19 */ be_nested_str_weak(message_counter), - /* K20 */ be_nested_str_weak(tasmota), - /* K21 */ be_nested_str_weak(log), - /* K22 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), - /* K23 */ be_nested_str_weak(val), - /* K24 */ be_nested_str_weak(send_simple_ack), - /* K25 */ be_nested_str_weak(decode_payload), - /* K26 */ be_nested_str_weak(received_ack), - /* K27 */ be_nested_str_weak(opcode), - /* K28 */ be_nested_str_weak(get_opcode_name), - /* K29 */ be_nested_str_weak(0x_X2502X), - /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K31 */ be_nested_str_weak(exchange_id), - /* K32 */ be_const_int(3), - /* K33 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), - /* K34 */ be_nested_str_weak(x_flag_r), - /* K35 */ be_nested_str_weak(_X7Breliable_X7D_X20), - /* K36 */ be_nested_str_weak(), - /* K37 */ be_nested_str_weak(ack_message_counter), - /* K38 */ be_nested_str_weak(commissioning), - /* K39 */ be_nested_str_weak(process_incoming), - /* K40 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), - /* K41 */ be_nested_str_weak(get_session_by_local_session_id), - /* K42 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), - /* K43 */ be_nested_str_weak(counter_rcv_validate), - /* K44 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), - /* K45 */ be_nested_str_weak(_X20counter_X3D), - /* K46 */ be_nested_str_weak(counter_rcv), - /* K47 */ be_nested_str_weak(send_encrypted_ack), - /* K48 */ be_nested_str_weak(decrypt), - /* K49 */ be_nested_str_weak(raw), - /* K50 */ be_nested_str_weak(payload_idx), - /* K51 */ be_const_int(1), - /* K52 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), - /* K53 */ be_nested_str_weak(protocol_id), - /* K54 */ be_nested_str_weak(_X20opcode_X3D), - /* K55 */ be_nested_str_weak(_X20exchange_id_X3D), - /* K56 */ be_nested_str_weak(im), - /* K57 */ be_nested_str_weak(process_incoming_ack), - /* K58 */ be_nested_str_weak(send_enqueued), - /* K59 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), - /* K60 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), - /* K61 */ be_nested_str_weak(_X3B), - /* K62 */ be_const_int(2), - /* K63 */ be_nested_str_weak(_debug_present), - /* K64 */ be_nested_str_weak(debug), - /* K65 */ be_nested_str_weak(traceback), + ( &(const bvalue[69]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(msg_received), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(Frame), + /* K6 */ be_nested_str_weak(decode_header), + /* K7 */ be_nested_str_weak(sec_p), + /* K8 */ be_nested_str_weak(sessions), + /* K9 */ be_nested_str_weak(find_session_source_id_unsecure), + /* K10 */ be_nested_str_weak(source_node_id), + /* K11 */ be_nested_str_weak(control_message), + /* K12 */ be_nested_str_weak(process_incoming_control_message), + /* K13 */ be_nested_str_weak(local_session_id), + /* K14 */ be_const_int(0), + /* K15 */ be_nested_str_weak(sec_sesstype), + /* K16 */ be_nested_str_weak(_ip), + /* K17 */ be_nested_str_weak(_port), + /* K18 */ be_nested_str_weak(_message_handler), + /* K19 */ be_nested_str_weak(session), + /* K20 */ be_nested_str_weak(_counter_insecure_rcv), + /* K21 */ be_nested_str_weak(validate), + /* K22 */ be_nested_str_weak(message_counter), + /* K23 */ be_nested_str_weak(tasmota), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), + /* K25 */ be_nested_str_weak(val), + /* K26 */ be_nested_str_weak(send_simple_ack), + /* K27 */ be_nested_str_weak(decode_payload), + /* K28 */ be_nested_str_weak(received_ack), + /* K29 */ be_nested_str_weak(opcode), + /* K30 */ be_nested_str_weak(get_opcode_name), + /* K31 */ be_nested_str_weak(0x_X2502X), + /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K33 */ be_nested_str_weak(exchange_id), + /* K34 */ be_const_int(3), + /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), + /* K36 */ be_nested_str_weak(x_flag_r), + /* K37 */ be_nested_str_weak(_X7Breliable_X7D_X20), + /* K38 */ be_nested_str_weak(), + /* K39 */ be_nested_str_weak(ack_message_counter), + /* K40 */ be_nested_str_weak(commissioning), + /* K41 */ be_nested_str_weak(process_incoming), + /* K42 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), + /* K43 */ be_nested_str_weak(get_session_by_local_session_id), + /* K44 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), + /* K45 */ be_nested_str_weak(counter_rcv_validate), + /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), + /* K47 */ be_nested_str_weak(_X20counter_X3D), + /* K48 */ be_nested_str_weak(counter_rcv), + /* K49 */ be_nested_str_weak(send_encrypted_ack), + /* K50 */ be_nested_str_weak(decrypt), + /* K51 */ be_nested_str_weak(raw), + /* K52 */ be_nested_str_weak(payload_idx), + /* K53 */ be_const_int(1), + /* K54 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), + /* K55 */ be_nested_str_weak(protocol_id), + /* K56 */ be_nested_str_weak(_X20opcode_X3D), + /* K57 */ be_nested_str_weak(_X20exchange_id_X3D), + /* K58 */ be_nested_str_weak(im), + /* K59 */ be_nested_str_weak(process_incoming_ack), + /* K60 */ be_nested_str_weak(send_enqueued), + /* K61 */ be_nested_str_weak(process_IM_end), + /* K62 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), + /* K63 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), + /* K64 */ be_nested_str_weak(_X3B), + /* K65 */ be_const_int(2), + /* K66 */ be_nested_str_weak(_debug_present), + /* K67 */ be_nested_str_weak(debug), + /* K68 */ be_nested_str_weak(traceback), }), be_str_weak(msg_received), &be_const_str_solidified, - ( &(const binstruction[323]) { /* code */ + ( &(const binstruction[333]) { /* code */ 0x50100000, // 0000 LDBOOL R4 0 0 - 0xA8020126, // 0001 EXBLK 0 #0129 - 0xB8160000, // 0002 GETNGBL R5 K0 - 0x8C140B01, // 0003 GETMET R5 R5 K1 - 0x5C1C0000, // 0004 MOVE R7 R0 - 0x5C200200, // 0005 MOVE R8 R1 - 0x5C240400, // 0006 MOVE R9 R2 - 0x5C280600, // 0007 MOVE R10 R3 - 0x7C140A00, // 0008 CALL R5 5 - 0x8C180B02, // 0009 GETMET R6 R5 K2 - 0x7C180200, // 000A CALL R6 1 - 0x5C1C0C00, // 000B MOVE R7 R6 - 0x741E0002, // 000C JMPT R7 #0010 - 0x501C0000, // 000D LDBOOL R7 0 0 - 0xA8040001, // 000E EXBLK 1 1 - 0x80040E00, // 000F RET 1 R7 - 0x881C0B03, // 0010 GETMBR R7 R5 K3 - 0x781E000C, // 0011 JMPF R7 #001F - 0x881C0104, // 0012 GETMBR R7 R0 K4 - 0x881C0F05, // 0013 GETMBR R7 R7 K5 - 0x8C1C0F06, // 0014 GETMET R7 R7 K6 - 0x88240B07, // 0015 GETMBR R9 R5 K7 - 0x542A0059, // 0016 LDINT R10 90 - 0x7C1C0600, // 0017 CALL R7 3 - 0x88200108, // 0018 GETMBR R8 R0 K8 - 0x8C201109, // 0019 GETMET R8 R8 K9 - 0x5C280A00, // 001A MOVE R10 R5 - 0x7C200400, // 001B CALL R8 2 - 0xA8040001, // 001C EXBLK 1 1 - 0x80041000, // 001D RET 1 R8 - 0x70020105, // 001E JMP #0125 - 0x881C0B0A, // 001F GETMBR R7 R5 K10 - 0x1C1C0F0B, // 0020 EQ R7 R7 K11 - 0x781E0070, // 0021 JMPF R7 #0093 - 0x881C0B0C, // 0022 GETMBR R7 R5 K12 - 0x1C1C0F0B, // 0023 EQ R7 R7 K11 - 0x781E006D, // 0024 JMPF R7 #0093 - 0x881C0104, // 0025 GETMBR R7 R0 K4 - 0x881C0F05, // 0026 GETMBR R7 R7 K5 - 0x8C1C0F06, // 0027 GETMET R7 R7 K6 - 0x88240B07, // 0028 GETMBR R9 R5 K7 - 0x542A0059, // 0029 LDINT R10 90 - 0x7C1C0600, // 002A CALL R7 3 - 0x780A0000, // 002B JMPF R2 #002D - 0x901E1A02, // 002C SETMBR R7 K13 R2 - 0x780E0000, // 002D JMPF R3 #002F - 0x901E1C03, // 002E SETMBR R7 K14 R3 - 0x901E1E00, // 002F SETMBR R7 K15 R0 - 0x90162007, // 0030 SETMBR R5 K16 R7 - 0x88200F11, // 0031 GETMBR R8 R7 K17 - 0x8C201112, // 0032 GETMET R8 R8 K18 - 0x88280B13, // 0033 GETMBR R10 R5 K19 - 0x502C0000, // 0034 LDBOOL R11 0 0 - 0x7C200600, // 0035 CALL R8 3 - 0x74220011, // 0036 JMPT R8 #0049 - 0xB8222800, // 0037 GETNGBL R8 K20 - 0x8C201115, // 0038 GETMET R8 R8 K21 - 0x60280018, // 0039 GETGBL R10 G24 - 0x582C0016, // 003A LDCONST R11 K22 - 0x88300B13, // 003B GETMBR R12 R5 K19 - 0x88340F11, // 003C GETMBR R13 R7 K17 - 0x8C341B17, // 003D GETMET R13 R13 K23 - 0x7C340200, // 003E CALL R13 1 - 0x7C280600, // 003F CALL R10 3 - 0x542E0003, // 0040 LDINT R11 4 - 0x7C200600, // 0041 CALL R8 3 - 0x8C200118, // 0042 GETMET R8 R0 K24 - 0x5C280A00, // 0043 MOVE R10 R5 - 0x502C0000, // 0044 LDBOOL R11 0 0 - 0x7C200600, // 0045 CALL R8 3 - 0x50200000, // 0046 LDBOOL R8 0 0 - 0xA8040001, // 0047 EXBLK 1 1 - 0x80041000, // 0048 RET 1 R8 - 0x8C200B19, // 0049 GETMET R8 R5 K25 - 0x7C200200, // 004A CALL R8 1 - 0x74220002, // 004B JMPT R8 #004F - 0x50200000, // 004C LDBOOL R8 0 0 - 0xA8040001, // 004D EXBLK 1 1 - 0x80041000, // 004E RET 1 R8 - 0x88200104, // 004F GETMBR R8 R0 K4 - 0x8C20111A, // 0050 GETMET R8 R8 K26 - 0x5C280A00, // 0051 MOVE R10 R5 - 0x7C200400, // 0052 CALL R8 2 - 0x88200B1B, // 0053 GETMBR R8 R5 K27 - 0x5426000F, // 0054 LDINT R9 16 - 0x20201009, // 0055 NE R8 R8 R9 - 0x78220018, // 0056 JMPF R8 #0070 - 0xB8220000, // 0057 GETNGBL R8 K0 - 0x8C20111C, // 0058 GETMET R8 R8 K28 - 0x88280B1B, // 0059 GETMBR R10 R5 K27 - 0x7C200400, // 005A CALL R8 2 - 0x5C241000, // 005B MOVE R9 R8 - 0x74260004, // 005C JMPT R9 #0062 - 0x60240018, // 005D GETGBL R9 G24 - 0x5828001D, // 005E LDCONST R10 K29 - 0x882C0B1B, // 005F GETMBR R11 R5 K27 - 0x7C240400, // 0060 CALL R9 2 - 0x5C201200, // 0061 MOVE R8 R9 - 0xB8262800, // 0062 GETNGBL R9 K20 - 0x8C241315, // 0063 GETMET R9 R9 K21 - 0x602C0018, // 0064 GETGBL R11 G24 - 0x5830001E, // 0065 LDCONST R12 K30 - 0x88340F0A, // 0066 GETMBR R13 R7 K10 - 0x5C381000, // 0067 MOVE R14 R8 - 0x883C0B13, // 0068 GETMBR R15 R5 K19 - 0x88400B1F, // 0069 GETMBR R16 R5 K31 - 0x5C440400, // 006A MOVE R17 R2 - 0x5C480600, // 006B MOVE R18 R3 - 0x7C2C0E00, // 006C CALL R11 7 - 0x58300020, // 006D LDCONST R12 K32 - 0x7C240600, // 006E CALL R9 3 - 0x70020013, // 006F JMP #0084 - 0xB8222800, // 0070 GETNGBL R8 K20 - 0x8C201115, // 0071 GETMET R8 R8 K21 - 0x60280018, // 0072 GETGBL R10 G24 - 0x582C0021, // 0073 LDCONST R11 K33 - 0x88300F0A, // 0074 GETMBR R12 R7 K10 - 0x88340B13, // 0075 GETMBR R13 R5 K19 - 0x88380B22, // 0076 GETMBR R14 R5 K34 - 0x783A0001, // 0077 JMPF R14 #007A - 0x58380023, // 0078 LDCONST R14 K35 - 0x70020000, // 0079 JMP #007B - 0x58380024, // 007A LDCONST R14 K36 - 0x883C0B1F, // 007B GETMBR R15 R5 K31 - 0x60400008, // 007C GETGBL R16 G8 - 0x88440B25, // 007D GETMBR R17 R5 K37 - 0x7C400200, // 007E CALL R16 1 - 0x5C440400, // 007F MOVE R17 R2 - 0x5C480600, // 0080 MOVE R18 R3 - 0x7C281000, // 0081 CALL R10 8 - 0x542E0003, // 0082 LDINT R11 4 - 0x7C200600, // 0083 CALL R8 3 - 0x88200126, // 0084 GETMBR R8 R0 K38 - 0x8C201127, // 0085 GETMET R8 R8 K39 - 0x5C280A00, // 0086 MOVE R10 R5 - 0x7C200400, // 0087 CALL R8 2 - 0x5C101000, // 0088 MOVE R4 R8 - 0x5C200800, // 0089 MOVE R8 R4 - 0x74220003, // 008A JMPT R8 #008F - 0x8C200118, // 008B GETMET R8 R0 K24 - 0x5C280A00, // 008C MOVE R10 R5 - 0x502C0000, // 008D LDBOOL R11 0 0 - 0x7C200600, // 008E CALL R8 3 - 0x50200200, // 008F LDBOOL R8 1 0 - 0xA8040001, // 0090 EXBLK 1 1 - 0x80041000, // 0091 RET 1 R8 - 0x70020091, // 0092 JMP #0125 - 0xB81E2800, // 0093 GETNGBL R7 K20 - 0x8C1C0F15, // 0094 GETMET R7 R7 K21 - 0x60240018, // 0095 GETGBL R9 G24 - 0x58280028, // 0096 LDCONST R10 K40 - 0x882C0B0A, // 0097 GETMBR R11 R5 K10 - 0x88300B13, // 0098 GETMBR R12 R5 K19 - 0x7C240600, // 0099 CALL R9 3 - 0x542A0003, // 009A LDINT R10 4 - 0x7C1C0600, // 009B CALL R7 3 - 0x881C0104, // 009C GETMBR R7 R0 K4 - 0x881C0F05, // 009D GETMBR R7 R7 K5 - 0x8C1C0F29, // 009E GETMET R7 R7 K41 - 0x88240B0A, // 009F GETMBR R9 R5 K10 - 0x7C1C0400, // 00A0 CALL R7 2 - 0x4C200000, // 00A1 LDNIL R8 - 0x1C200E08, // 00A2 EQ R8 R7 R8 - 0x7822000A, // 00A3 JMPF R8 #00AF - 0xB8222800, // 00A4 GETNGBL R8 K20 - 0x8C201115, // 00A5 GETMET R8 R8 K21 - 0x60280008, // 00A6 GETGBL R10 G8 - 0x882C0B0A, // 00A7 GETMBR R11 R5 K10 - 0x7C280200, // 00A8 CALL R10 1 - 0x002A540A, // 00A9 ADD R10 K42 R10 - 0x582C0020, // 00AA LDCONST R11 K32 - 0x7C200600, // 00AB CALL R8 3 - 0x50200000, // 00AC LDBOOL R8 0 0 - 0xA8040001, // 00AD EXBLK 1 1 - 0x80041000, // 00AE RET 1 R8 - 0x780A0000, // 00AF JMPF R2 #00B1 - 0x901E1A02, // 00B0 SETMBR R7 K13 R2 - 0x780E0000, // 00B1 JMPF R3 #00B3 - 0x901E1C03, // 00B2 SETMBR R7 K14 R3 - 0x901E1E00, // 00B3 SETMBR R7 K15 R0 - 0x90162007, // 00B4 SETMBR R5 K16 R7 - 0x8C200F2B, // 00B5 GETMET R8 R7 K43 - 0x88280B13, // 00B6 GETMBR R10 R5 K19 - 0x502C0200, // 00B7 LDBOOL R11 1 0 - 0x7C200600, // 00B8 CALL R8 3 - 0x74220013, // 00B9 JMPT R8 #00CE - 0xB8222800, // 00BA GETNGBL R8 K20 - 0x8C201115, // 00BB GETMET R8 R8 K21 - 0x60280008, // 00BC GETGBL R10 G8 - 0x882C0B13, // 00BD GETMBR R11 R5 K19 - 0x7C280200, // 00BE CALL R10 1 - 0x002A580A, // 00BF ADD R10 K44 R10 - 0x0028152D, // 00C0 ADD R10 R10 K45 - 0x602C0008, // 00C1 GETGBL R11 G8 - 0x88300F2E, // 00C2 GETMBR R12 R7 K46 - 0x7C2C0200, // 00C3 CALL R11 1 - 0x0028140B, // 00C4 ADD R10 R10 R11 - 0x582C0020, // 00C5 LDCONST R11 K32 - 0x7C200600, // 00C6 CALL R8 3 - 0x8C20012F, // 00C7 GETMET R8 R0 K47 - 0x5C280A00, // 00C8 MOVE R10 R5 - 0x502C0000, // 00C9 LDBOOL R11 0 0 - 0x7C200600, // 00CA CALL R8 3 - 0x50200000, // 00CB LDBOOL R8 0 0 - 0xA8040001, // 00CC EXBLK 1 1 - 0x80041000, // 00CD RET 1 R8 - 0x8C200B30, // 00CE GETMET R8 R5 K48 - 0x7C200200, // 00CF CALL R8 1 - 0x5C241000, // 00D0 MOVE R9 R8 - 0x74260002, // 00D1 JMPT R9 #00D5 - 0x50240000, // 00D2 LDBOOL R9 0 0 - 0xA8040001, // 00D3 EXBLK 1 1 - 0x80041200, // 00D4 RET 1 R9 - 0x88240B32, // 00D5 GETMBR R9 R5 K50 - 0x04241333, // 00D6 SUB R9 R9 K51 - 0x40261609, // 00D7 CONNECT R9 K11 R9 - 0x88280B31, // 00D8 GETMBR R10 R5 K49 - 0x94241409, // 00D9 GETIDX R9 R10 R9 - 0x90166209, // 00DA SETMBR R5 K49 R9 - 0x88240B31, // 00DB GETMBR R9 R5 K49 - 0x40241208, // 00DC CONNECT R9 R9 R8 - 0x8C240B19, // 00DD GETMET R9 R5 K25 - 0x7C240200, // 00DE CALL R9 1 - 0xB8262800, // 00DF GETNGBL R9 K20 - 0x8C241315, // 00E0 GETMET R9 R9 K21 - 0x602C0008, // 00E1 GETGBL R11 G8 - 0x88300B35, // 00E2 GETMBR R12 R5 K53 - 0x7C2C0200, // 00E3 CALL R11 1 - 0x002E680B, // 00E4 ADD R11 K52 R11 - 0x002C1736, // 00E5 ADD R11 R11 K54 - 0x60300008, // 00E6 GETGBL R12 G8 - 0x88340B1B, // 00E7 GETMBR R13 R5 K27 - 0x7C300200, // 00E8 CALL R12 1 - 0x002C160C, // 00E9 ADD R11 R11 R12 - 0x002C1737, // 00EA ADD R11 R11 K55 + 0x88140100, // 0001 GETMBR R5 R0 K0 + 0x88140B01, // 0002 GETMBR R5 R5 K1 + 0x8C140B02, // 0003 GETMET R5 R5 K2 + 0x581C0003, // 0004 LDCONST R7 K3 + 0x7C140400, // 0005 CALL R5 2 + 0xA802012B, // 0006 EXBLK 0 #0133 + 0xB8160800, // 0007 GETNGBL R5 K4 + 0x8C140B05, // 0008 GETMET R5 R5 K5 + 0x5C1C0000, // 0009 MOVE R7 R0 + 0x5C200200, // 000A MOVE R8 R1 + 0x5C240400, // 000B MOVE R9 R2 + 0x5C280600, // 000C MOVE R10 R3 + 0x7C140A00, // 000D CALL R5 5 + 0x8C180B06, // 000E GETMET R6 R5 K6 + 0x7C180200, // 000F CALL R6 1 + 0x5C1C0C00, // 0010 MOVE R7 R6 + 0x741E0002, // 0011 JMPT R7 #0015 + 0x501C0000, // 0012 LDBOOL R7 0 0 + 0xA8040001, // 0013 EXBLK 1 1 + 0x80040E00, // 0014 RET 1 R7 + 0x881C0B07, // 0015 GETMBR R7 R5 K7 + 0x781E000C, // 0016 JMPF R7 #0024 + 0x881C0100, // 0017 GETMBR R7 R0 K0 + 0x881C0F08, // 0018 GETMBR R7 R7 K8 + 0x8C1C0F09, // 0019 GETMET R7 R7 K9 + 0x88240B0A, // 001A GETMBR R9 R5 K10 + 0x542A0059, // 001B LDINT R10 90 + 0x7C1C0600, // 001C CALL R7 3 + 0x8820010B, // 001D GETMBR R8 R0 K11 + 0x8C20110C, // 001E GETMET R8 R8 K12 + 0x5C280A00, // 001F MOVE R10 R5 + 0x7C200400, // 0020 CALL R8 2 + 0xA8040001, // 0021 EXBLK 1 1 + 0x80041000, // 0022 RET 1 R8 + 0x7002010A, // 0023 JMP #012F + 0x881C0B0D, // 0024 GETMBR R7 R5 K13 + 0x1C1C0F0E, // 0025 EQ R7 R7 K14 + 0x781E0070, // 0026 JMPF R7 #0098 + 0x881C0B0F, // 0027 GETMBR R7 R5 K15 + 0x1C1C0F0E, // 0028 EQ R7 R7 K14 + 0x781E006D, // 0029 JMPF R7 #0098 + 0x881C0100, // 002A GETMBR R7 R0 K0 + 0x881C0F08, // 002B GETMBR R7 R7 K8 + 0x8C1C0F09, // 002C GETMET R7 R7 K9 + 0x88240B0A, // 002D GETMBR R9 R5 K10 + 0x542A0059, // 002E LDINT R10 90 + 0x7C1C0600, // 002F CALL R7 3 + 0x780A0000, // 0030 JMPF R2 #0032 + 0x901E2002, // 0031 SETMBR R7 K16 R2 + 0x780E0000, // 0032 JMPF R3 #0034 + 0x901E2203, // 0033 SETMBR R7 K17 R3 + 0x901E2400, // 0034 SETMBR R7 K18 R0 + 0x90162607, // 0035 SETMBR R5 K19 R7 + 0x88200F14, // 0036 GETMBR R8 R7 K20 + 0x8C201115, // 0037 GETMET R8 R8 K21 + 0x88280B16, // 0038 GETMBR R10 R5 K22 + 0x502C0000, // 0039 LDBOOL R11 0 0 + 0x7C200600, // 003A CALL R8 3 + 0x74220011, // 003B JMPT R8 #004E + 0xB8222E00, // 003C GETNGBL R8 K23 + 0x8C201102, // 003D GETMET R8 R8 K2 + 0x60280018, // 003E GETGBL R10 G24 + 0x582C0018, // 003F LDCONST R11 K24 + 0x88300B16, // 0040 GETMBR R12 R5 K22 + 0x88340F14, // 0041 GETMBR R13 R7 K20 + 0x8C341B19, // 0042 GETMET R13 R13 K25 + 0x7C340200, // 0043 CALL R13 1 + 0x7C280600, // 0044 CALL R10 3 + 0x542E0003, // 0045 LDINT R11 4 + 0x7C200600, // 0046 CALL R8 3 + 0x8C20011A, // 0047 GETMET R8 R0 K26 + 0x5C280A00, // 0048 MOVE R10 R5 + 0x502C0000, // 0049 LDBOOL R11 0 0 + 0x7C200600, // 004A CALL R8 3 + 0x50200000, // 004B LDBOOL R8 0 0 + 0xA8040001, // 004C EXBLK 1 1 + 0x80041000, // 004D RET 1 R8 + 0x8C200B1B, // 004E GETMET R8 R5 K27 + 0x7C200200, // 004F CALL R8 1 + 0x74220002, // 0050 JMPT R8 #0054 + 0x50200000, // 0051 LDBOOL R8 0 0 + 0xA8040001, // 0052 EXBLK 1 1 + 0x80041000, // 0053 RET 1 R8 + 0x88200100, // 0054 GETMBR R8 R0 K0 + 0x8C20111C, // 0055 GETMET R8 R8 K28 + 0x5C280A00, // 0056 MOVE R10 R5 + 0x7C200400, // 0057 CALL R8 2 + 0x88200B1D, // 0058 GETMBR R8 R5 K29 + 0x5426000F, // 0059 LDINT R9 16 + 0x20201009, // 005A NE R8 R8 R9 + 0x78220018, // 005B JMPF R8 #0075 + 0xB8220800, // 005C GETNGBL R8 K4 + 0x8C20111E, // 005D GETMET R8 R8 K30 + 0x88280B1D, // 005E GETMBR R10 R5 K29 + 0x7C200400, // 005F CALL R8 2 + 0x5C241000, // 0060 MOVE R9 R8 + 0x74260004, // 0061 JMPT R9 #0067 + 0x60240018, // 0062 GETGBL R9 G24 + 0x5828001F, // 0063 LDCONST R10 K31 + 0x882C0B1D, // 0064 GETMBR R11 R5 K29 + 0x7C240400, // 0065 CALL R9 2 + 0x5C201200, // 0066 MOVE R8 R9 + 0xB8262E00, // 0067 GETNGBL R9 K23 + 0x8C241302, // 0068 GETMET R9 R9 K2 + 0x602C0018, // 0069 GETGBL R11 G24 + 0x58300020, // 006A LDCONST R12 K32 + 0x88340F0D, // 006B GETMBR R13 R7 K13 + 0x5C381000, // 006C MOVE R14 R8 + 0x883C0B16, // 006D GETMBR R15 R5 K22 + 0x88400B21, // 006E GETMBR R16 R5 K33 + 0x5C440400, // 006F MOVE R17 R2 + 0x5C480600, // 0070 MOVE R18 R3 + 0x7C2C0E00, // 0071 CALL R11 7 + 0x58300022, // 0072 LDCONST R12 K34 + 0x7C240600, // 0073 CALL R9 3 + 0x70020013, // 0074 JMP #0089 + 0xB8222E00, // 0075 GETNGBL R8 K23 + 0x8C201102, // 0076 GETMET R8 R8 K2 + 0x60280018, // 0077 GETGBL R10 G24 + 0x582C0023, // 0078 LDCONST R11 K35 + 0x88300F0D, // 0079 GETMBR R12 R7 K13 + 0x88340B16, // 007A GETMBR R13 R5 K22 + 0x88380B24, // 007B GETMBR R14 R5 K36 + 0x783A0001, // 007C JMPF R14 #007F + 0x58380025, // 007D LDCONST R14 K37 + 0x70020000, // 007E JMP #0080 + 0x58380026, // 007F LDCONST R14 K38 + 0x883C0B21, // 0080 GETMBR R15 R5 K33 + 0x60400008, // 0081 GETGBL R16 G8 + 0x88440B27, // 0082 GETMBR R17 R5 K39 + 0x7C400200, // 0083 CALL R16 1 + 0x5C440400, // 0084 MOVE R17 R2 + 0x5C480600, // 0085 MOVE R18 R3 + 0x7C281000, // 0086 CALL R10 8 + 0x542E0003, // 0087 LDINT R11 4 + 0x7C200600, // 0088 CALL R8 3 + 0x88200128, // 0089 GETMBR R8 R0 K40 + 0x8C201129, // 008A GETMET R8 R8 K41 + 0x5C280A00, // 008B MOVE R10 R5 + 0x7C200400, // 008C CALL R8 2 + 0x5C101000, // 008D MOVE R4 R8 + 0x5C200800, // 008E MOVE R8 R4 + 0x74220003, // 008F JMPT R8 #0094 + 0x8C20011A, // 0090 GETMET R8 R0 K26 + 0x5C280A00, // 0091 MOVE R10 R5 + 0x502C0000, // 0092 LDBOOL R11 0 0 + 0x7C200600, // 0093 CALL R8 3 + 0x50200200, // 0094 LDBOOL R8 1 0 + 0xA8040001, // 0095 EXBLK 1 1 + 0x80041000, // 0096 RET 1 R8 + 0x70020096, // 0097 JMP #012F + 0xB81E2E00, // 0098 GETNGBL R7 K23 + 0x8C1C0F02, // 0099 GETMET R7 R7 K2 + 0x60240018, // 009A GETGBL R9 G24 + 0x5828002A, // 009B LDCONST R10 K42 + 0x882C0B0D, // 009C GETMBR R11 R5 K13 + 0x88300B16, // 009D GETMBR R12 R5 K22 + 0x7C240600, // 009E CALL R9 3 + 0x542A0003, // 009F LDINT R10 4 + 0x7C1C0600, // 00A0 CALL R7 3 + 0x881C0100, // 00A1 GETMBR R7 R0 K0 + 0x881C0F08, // 00A2 GETMBR R7 R7 K8 + 0x8C1C0F2B, // 00A3 GETMET R7 R7 K43 + 0x88240B0D, // 00A4 GETMBR R9 R5 K13 + 0x7C1C0400, // 00A5 CALL R7 2 + 0x4C200000, // 00A6 LDNIL R8 + 0x1C200E08, // 00A7 EQ R8 R7 R8 + 0x7822000A, // 00A8 JMPF R8 #00B4 + 0xB8222E00, // 00A9 GETNGBL R8 K23 + 0x8C201102, // 00AA GETMET R8 R8 K2 + 0x60280008, // 00AB GETGBL R10 G8 + 0x882C0B0D, // 00AC GETMBR R11 R5 K13 + 0x7C280200, // 00AD CALL R10 1 + 0x002A580A, // 00AE ADD R10 K44 R10 + 0x582C0022, // 00AF LDCONST R11 K34 + 0x7C200600, // 00B0 CALL R8 3 + 0x50200000, // 00B1 LDBOOL R8 0 0 + 0xA8040001, // 00B2 EXBLK 1 1 + 0x80041000, // 00B3 RET 1 R8 + 0x780A0000, // 00B4 JMPF R2 #00B6 + 0x901E2002, // 00B5 SETMBR R7 K16 R2 + 0x780E0000, // 00B6 JMPF R3 #00B8 + 0x901E2203, // 00B7 SETMBR R7 K17 R3 + 0x901E2400, // 00B8 SETMBR R7 K18 R0 + 0x90162607, // 00B9 SETMBR R5 K19 R7 + 0x8C200F2D, // 00BA GETMET R8 R7 K45 + 0x88280B16, // 00BB GETMBR R10 R5 K22 + 0x502C0200, // 00BC LDBOOL R11 1 0 + 0x7C200600, // 00BD CALL R8 3 + 0x74220013, // 00BE JMPT R8 #00D3 + 0xB8222E00, // 00BF GETNGBL R8 K23 + 0x8C201102, // 00C0 GETMET R8 R8 K2 + 0x60280008, // 00C1 GETGBL R10 G8 + 0x882C0B16, // 00C2 GETMBR R11 R5 K22 + 0x7C280200, // 00C3 CALL R10 1 + 0x002A5C0A, // 00C4 ADD R10 K46 R10 + 0x0028152F, // 00C5 ADD R10 R10 K47 + 0x602C0008, // 00C6 GETGBL R11 G8 + 0x88300F30, // 00C7 GETMBR R12 R7 K48 + 0x7C2C0200, // 00C8 CALL R11 1 + 0x0028140B, // 00C9 ADD R10 R10 R11 + 0x582C0022, // 00CA LDCONST R11 K34 + 0x7C200600, // 00CB CALL R8 3 + 0x8C200131, // 00CC GETMET R8 R0 K49 + 0x5C280A00, // 00CD MOVE R10 R5 + 0x502C0000, // 00CE LDBOOL R11 0 0 + 0x7C200600, // 00CF CALL R8 3 + 0x50200000, // 00D0 LDBOOL R8 0 0 + 0xA8040001, // 00D1 EXBLK 1 1 + 0x80041000, // 00D2 RET 1 R8 + 0x8C200B32, // 00D3 GETMET R8 R5 K50 + 0x7C200200, // 00D4 CALL R8 1 + 0x5C241000, // 00D5 MOVE R9 R8 + 0x74260002, // 00D6 JMPT R9 #00DA + 0x50240000, // 00D7 LDBOOL R9 0 0 + 0xA8040001, // 00D8 EXBLK 1 1 + 0x80041200, // 00D9 RET 1 R9 + 0x88240B34, // 00DA GETMBR R9 R5 K52 + 0x04241335, // 00DB SUB R9 R9 K53 + 0x40261C09, // 00DC CONNECT R9 K14 R9 + 0x88280B33, // 00DD GETMBR R10 R5 K51 + 0x94241409, // 00DE GETIDX R9 R10 R9 + 0x90166609, // 00DF SETMBR R5 K51 R9 + 0x88240B33, // 00E0 GETMBR R9 R5 K51 + 0x40241208, // 00E1 CONNECT R9 R9 R8 + 0x8C240B1B, // 00E2 GETMET R9 R5 K27 + 0x7C240200, // 00E3 CALL R9 1 + 0xB8262E00, // 00E4 GETNGBL R9 K23 + 0x8C241302, // 00E5 GETMET R9 R9 K2 + 0x602C0008, // 00E6 GETGBL R11 G8 + 0x88300B37, // 00E7 GETMBR R12 R5 K55 + 0x7C2C0200, // 00E8 CALL R11 1 + 0x002E6C0B, // 00E9 ADD R11 K54 R11 + 0x002C1738, // 00EA ADD R11 R11 K56 0x60300008, // 00EB GETGBL R12 G8 - 0x88340B1F, // 00EC GETMBR R13 R5 K31 - 0x543AFFFE, // 00ED LDINT R14 65535 - 0x2C341A0E, // 00EE AND R13 R13 R14 - 0x7C300200, // 00EF CALL R12 1 - 0x002C160C, // 00F0 ADD R11 R11 R12 - 0x54320003, // 00F1 LDINT R12 4 - 0x7C240600, // 00F2 CALL R9 3 - 0x88240104, // 00F3 GETMBR R9 R0 K4 - 0x8C24131A, // 00F4 GETMET R9 R9 K26 - 0x5C2C0A00, // 00F5 MOVE R11 R5 - 0x7C240400, // 00F6 CALL R9 2 - 0x88240B35, // 00F7 GETMBR R9 R5 K53 - 0x1C28130B, // 00F8 EQ R10 R9 K11 - 0x782A000F, // 00F9 JMPF R10 #010A - 0x88280B1B, // 00FA GETMBR R10 R5 K27 - 0x542E000F, // 00FB LDINT R11 16 - 0x1C28140B, // 00FC EQ R10 R10 R11 - 0x782A0009, // 00FD JMPF R10 #0108 - 0x88280138, // 00FE GETMBR R10 R0 K56 - 0x8C281539, // 00FF GETMET R10 R10 K57 - 0x5C300A00, // 0100 MOVE R12 R5 - 0x7C280400, // 0101 CALL R10 2 - 0x5C101400, // 0102 MOVE R4 R10 - 0x78120003, // 0103 JMPF R4 #0108 - 0x88280138, // 0104 GETMBR R10 R0 K56 - 0x8C28153A, // 0105 GETMET R10 R10 K58 - 0x5C300000, // 0106 MOVE R12 R0 - 0x7C280400, // 0107 CALL R10 2 - 0x50100200, // 0108 LDBOOL R4 1 0 - 0x7002001A, // 0109 JMP #0125 - 0x1C281333, // 010A EQ R10 R9 K51 - 0x782A0010, // 010B JMPF R10 #011D - 0x88280138, // 010C GETMBR R10 R0 K56 - 0x8C281527, // 010D GETMET R10 R10 K39 - 0x5C300A00, // 010E MOVE R12 R5 - 0x7C280400, // 010F CALL R10 2 - 0x5C101400, // 0110 MOVE R4 R10 - 0x78120004, // 0111 JMPF R4 #0117 - 0x88280138, // 0112 GETMBR R10 R0 K56 - 0x8C28153A, // 0113 GETMET R10 R10 K58 - 0x5C300000, // 0114 MOVE R12 R0 - 0x7C280400, // 0115 CALL R10 2 - 0x70020003, // 0116 JMP #011B - 0x8C28012F, // 0117 GETMET R10 R0 K47 - 0x5C300A00, // 0118 MOVE R12 R5 - 0x50340200, // 0119 LDBOOL R13 1 0 - 0x7C280600, // 011A CALL R10 3 - 0x50100200, // 011B LDBOOL R4 1 0 - 0x70020007, // 011C JMP #0125 - 0xB82A2800, // 011D GETNGBL R10 K20 - 0x8C281515, // 011E GETMET R10 R10 K21 - 0x60300008, // 011F GETGBL R12 G8 - 0x5C341200, // 0120 MOVE R13 R9 - 0x7C300200, // 0121 CALL R12 1 - 0x0032760C, // 0122 ADD R12 K59 R12 - 0x58340020, // 0123 LDCONST R13 K32 + 0x88340B1D, // 00EC GETMBR R13 R5 K29 + 0x7C300200, // 00ED CALL R12 1 + 0x002C160C, // 00EE ADD R11 R11 R12 + 0x002C1739, // 00EF ADD R11 R11 K57 + 0x60300008, // 00F0 GETGBL R12 G8 + 0x88340B21, // 00F1 GETMBR R13 R5 K33 + 0x543AFFFE, // 00F2 LDINT R14 65535 + 0x2C341A0E, // 00F3 AND R13 R13 R14 + 0x7C300200, // 00F4 CALL R12 1 + 0x002C160C, // 00F5 ADD R11 R11 R12 + 0x54320003, // 00F6 LDINT R12 4 + 0x7C240600, // 00F7 CALL R9 3 + 0x88240100, // 00F8 GETMBR R9 R0 K0 + 0x8C24131C, // 00F9 GETMET R9 R9 K28 + 0x5C2C0A00, // 00FA MOVE R11 R5 + 0x7C240400, // 00FB CALL R9 2 + 0x88240B37, // 00FC GETMBR R9 R5 K55 + 0x1C28130E, // 00FD EQ R10 R9 K14 + 0x782A000F, // 00FE JMPF R10 #010F + 0x88280B1D, // 00FF GETMBR R10 R5 K29 + 0x542E000F, // 0100 LDINT R11 16 + 0x1C28140B, // 0101 EQ R10 R10 R11 + 0x782A0009, // 0102 JMPF R10 #010D + 0x8828013A, // 0103 GETMBR R10 R0 K58 + 0x8C28153B, // 0104 GETMET R10 R10 K59 + 0x5C300A00, // 0105 MOVE R12 R5 + 0x7C280400, // 0106 CALL R10 2 + 0x5C101400, // 0107 MOVE R4 R10 + 0x78120003, // 0108 JMPF R4 #010D + 0x8828013A, // 0109 GETMBR R10 R0 K58 + 0x8C28153C, // 010A GETMET R10 R10 K60 + 0x5C300000, // 010B MOVE R12 R0 + 0x7C280400, // 010C CALL R10 2 + 0x50100200, // 010D LDBOOL R4 1 0 + 0x7002001F, // 010E JMP #012F + 0x1C281335, // 010F EQ R10 R9 K53 + 0x782A0015, // 0110 JMPF R10 #0127 + 0x8828013A, // 0111 GETMBR R10 R0 K58 + 0x8C281529, // 0112 GETMET R10 R10 K41 + 0x5C300A00, // 0113 MOVE R12 R5 + 0x7C280400, // 0114 CALL R10 2 + 0x5C101400, // 0115 MOVE R4 R10 + 0x88280100, // 0116 GETMBR R10 R0 K0 + 0x88281501, // 0117 GETMBR R10 R10 K1 + 0x8C281502, // 0118 GETMET R10 R10 K2 + 0x5830003D, // 0119 LDCONST R12 K61 + 0x7C280400, // 011A CALL R10 2 + 0x78120004, // 011B JMPF R4 #0121 + 0x8828013A, // 011C GETMBR R10 R0 K58 + 0x8C28153C, // 011D GETMET R10 R10 K60 + 0x5C300000, // 011E MOVE R12 R0 + 0x7C280400, // 011F CALL R10 2 + 0x70020003, // 0120 JMP #0125 + 0x8C280131, // 0121 GETMET R10 R0 K49 + 0x5C300A00, // 0122 MOVE R12 R5 + 0x50340200, // 0123 LDBOOL R13 1 0 0x7C280600, // 0124 CALL R10 3 - 0xA8040001, // 0125 EXBLK 1 1 - 0x80040800, // 0126 RET 1 R4 - 0xA8040001, // 0127 EXBLK 1 1 - 0x70020018, // 0128 JMP #0142 - 0xAC140002, // 0129 CATCH R5 0 2 - 0x70020015, // 012A JMP #0141 - 0xB81E2800, // 012B GETNGBL R7 K20 - 0x8C1C0F15, // 012C GETMET R7 R7 K21 - 0x60240008, // 012D GETGBL R9 G8 - 0x5C280A00, // 012E MOVE R10 R5 - 0x7C240200, // 012F CALL R9 1 - 0x00267809, // 0130 ADD R9 K60 R9 - 0x0024133D, // 0131 ADD R9 R9 K61 - 0x60280008, // 0132 GETGBL R10 G8 - 0x5C2C0C00, // 0133 MOVE R11 R6 - 0x7C280200, // 0134 CALL R10 1 - 0x0024120A, // 0135 ADD R9 R9 R10 - 0x5828003E, // 0136 LDCONST R10 K62 - 0x7C1C0600, // 0137 CALL R7 3 - 0xB81E2800, // 0138 GETNGBL R7 K20 - 0x881C0F3F, // 0139 GETMBR R7 R7 K63 - 0x781E0002, // 013A JMPF R7 #013E - 0xA41E8000, // 013B IMPORT R7 K64 - 0x8C200F41, // 013C GETMET R8 R7 K65 - 0x7C200200, // 013D CALL R8 1 - 0x501C0000, // 013E LDBOOL R7 0 0 - 0x80040E00, // 013F RET 1 R7 - 0x70020000, // 0140 JMP #0142 - 0xB0080000, // 0141 RAISE 2 R0 R0 - 0x80000000, // 0142 RET 0 + 0x50100200, // 0125 LDBOOL R4 1 0 + 0x70020007, // 0126 JMP #012F + 0xB82A2E00, // 0127 GETNGBL R10 K23 + 0x8C281502, // 0128 GETMET R10 R10 K2 + 0x60300008, // 0129 GETGBL R12 G8 + 0x5C341200, // 012A MOVE R13 R9 + 0x7C300200, // 012B CALL R12 1 + 0x00327C0C, // 012C ADD R12 K62 R12 + 0x58340022, // 012D LDCONST R13 K34 + 0x7C280600, // 012E CALL R10 3 + 0xA8040001, // 012F EXBLK 1 1 + 0x80040800, // 0130 RET 1 R4 + 0xA8040001, // 0131 EXBLK 1 1 + 0x70020018, // 0132 JMP #014C + 0xAC140002, // 0133 CATCH R5 0 2 + 0x70020015, // 0134 JMP #014B + 0xB81E2E00, // 0135 GETNGBL R7 K23 + 0x8C1C0F02, // 0136 GETMET R7 R7 K2 + 0x60240008, // 0137 GETGBL R9 G8 + 0x5C280A00, // 0138 MOVE R10 R5 + 0x7C240200, // 0139 CALL R9 1 + 0x00267E09, // 013A ADD R9 K63 R9 + 0x00241340, // 013B ADD R9 R9 K64 + 0x60280008, // 013C GETGBL R10 G8 + 0x5C2C0C00, // 013D MOVE R11 R6 + 0x7C280200, // 013E CALL R10 1 + 0x0024120A, // 013F ADD R9 R9 R10 + 0x58280041, // 0140 LDCONST R10 K65 + 0x7C1C0600, // 0141 CALL R7 3 + 0xB81E2E00, // 0142 GETNGBL R7 K23 + 0x881C0F42, // 0143 GETMBR R7 R7 K66 + 0x781E0002, // 0144 JMPF R7 #0148 + 0xA41E8600, // 0145 IMPORT R7 K67 + 0x8C200F44, // 0146 GETMET R8 R7 K68 + 0x7C200200, // 0147 CALL R8 1 + 0x501C0000, // 0148 LDBOOL R7 0 0 + 0x80040E00, // 0149 RET 1 R7 + 0x70020000, // 014A JMP #014C + 0xB0080000, // 014B RAISE 2 R0 R0 + 0x80000000, // 014C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h new file mode 100644 index 000000000..f4d56bf04 --- /dev/null +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h @@ -0,0 +1,270 @@ +/* Solidification of Matter_Profiler.h */ +/********************************************************************\ +* Generated code, don't edit * +\********************************************************************/ +#include "be_constobj.h" + +extern const bclass be_class_Matter_Profiler; + +/******************************************************************** +** Solidified function: set_active +********************************************************************/ +be_local_closure(Matter_Profiler_set_active, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + }), + be_str_weak(set_active), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x60080017, // 0000 GETGBL R2 G23 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x90020002, // 0003 SETMBR R0 K0 R2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Profiler_start, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_nested_str_weak(millis), + /* K2 */ be_nested_str_weak(resize), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(names), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(start), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x74060000, // 0001 JMPT R1 #0003 + 0x80000200, // 0002 RET 0 + 0x88040101, // 0003 GETMBR R1 R0 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x7C040400, // 0006 CALL R1 2 + 0x88040104, // 0007 GETMBR R1 R0 K4 + 0x8C040302, // 0008 GETMET R1 R1 K2 + 0x580C0003, // 0009 LDCONST R3 K3 + 0x7C040400, // 000A CALL R1 2 + 0x8C040105, // 000B GETMET R1 R0 K5 + 0x580C0006, // 000C LDCONST R3 K6 + 0x7C040400, // 000D CALL R1 2 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: log +********************************************************************/ +be_local_closure(Matter_Profiler_log, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_nested_str_weak(millis), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(names), + }), + be_str_weak(log), + &be_const_str_solidified, + ( &(const binstruction[14]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0000, // 0001 JMPT R2 #0003 + 0x80000400, // 0002 RET 0 + 0x88080101, // 0003 GETMBR R2 R0 K1 + 0x8C080502, // 0004 GETMET R2 R2 K2 + 0xB8120600, // 0005 GETNGBL R4 K3 + 0x8C100901, // 0006 GETMET R4 R4 K1 + 0x7C100200, // 0007 CALL R4 1 + 0x7C080400, // 0008 CALL R2 2 + 0x88080104, // 0009 GETMBR R2 R0 K4 + 0x8C080502, // 000A GETMET R2 R2 K2 + 0x5C100200, // 000B MOVE R4 R1 + 0x7C080400, // 000C CALL R2 2 + 0x80000000, // 000D RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Profiler_init, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_nested_str_weak(millis), + /* K2 */ be_nested_str_weak(resize), + /* K3 */ be_nested_str_weak(PREALLOCATED), + /* K4 */ be_nested_str_weak(names), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x50040000, // 0000 LDBOOL R1 0 0 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x60040012, // 0002 GETGBL R1 G18 + 0x7C040000, // 0003 CALL R1 0 + 0x90020201, // 0004 SETMBR R0 K1 R1 + 0x88040101, // 0005 GETMBR R1 R0 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x880C0103, // 0007 GETMBR R3 R0 K3 + 0x7C040400, // 0008 CALL R1 2 + 0x60040012, // 0009 GETGBL R1 G18 + 0x7C040000, // 000A CALL R1 0 + 0x90020801, // 000B SETMBR R0 K4 R1 + 0x88040104, // 000C GETMBR R1 R0 K4 + 0x8C040302, // 000D GETMET R1 R1 K2 + 0x880C0103, // 000E GETMBR R3 R0 K3 + 0x7C040400, // 000F CALL R1 2 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: dump +********************************************************************/ +be_local_closure(Matter_Profiler_dump, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(_X3C_X2D_X2Dend_X2D_X2D_X3E), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Profiler_X20dump_X3A), + /* K5 */ be_nested_str_weak(millis), + /* K6 */ be_const_int(0), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X20_X20_X254i_X20_X27_X25s_X27), + /* K9 */ be_nested_str_weak(names), + }), + be_str_weak(dump), + &be_const_str_solidified, + ( &(const binstruction[34]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0000, // 0001 JMPT R2 #0003 + 0x80000400, // 0002 RET 0 + 0x8C080101, // 0003 GETMET R2 R0 K1 + 0x58100002, // 0004 LDCONST R4 K2 + 0x7C080400, // 0005 CALL R2 2 + 0xB80A0600, // 0006 GETNGBL R2 K3 + 0x8C080501, // 0007 GETMET R2 R2 K1 + 0x58100004, // 0008 LDCONST R4 K4 + 0x5C140200, // 0009 MOVE R5 R1 + 0x7C080600, // 000A CALL R2 3 + 0x88080105, // 000B GETMBR R2 R0 K5 + 0x94080506, // 000C GETIDX R2 R2 K6 + 0x580C0007, // 000D LDCONST R3 K7 + 0x6010000C, // 000E GETGBL R4 G12 + 0x88140105, // 000F GETMBR R5 R0 K5 + 0x7C100200, // 0010 CALL R4 1 + 0x14100604, // 0011 LT R4 R3 R4 + 0x7812000D, // 0012 JMPF R4 #0021 + 0xB8120600, // 0013 GETNGBL R4 K3 + 0x8C100901, // 0014 GETMET R4 R4 K1 + 0x60180018, // 0015 GETGBL R6 G24 + 0x581C0008, // 0016 LDCONST R7 K8 + 0x88200105, // 0017 GETMBR R8 R0 K5 + 0x94201003, // 0018 GETIDX R8 R8 R3 + 0x04201002, // 0019 SUB R8 R8 R2 + 0x88240109, // 001A GETMBR R9 R0 K9 + 0x94241203, // 001B GETIDX R9 R9 R3 + 0x7C180600, // 001C CALL R6 3 + 0x5C1C0200, // 001D MOVE R7 R1 + 0x7C100600, // 001E CALL R4 3 + 0x000C0707, // 001F ADD R3 R3 K7 + 0x7001FFEC, // 0020 JMP #000E + 0x80000000, // 0021 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_Profiler +********************************************************************/ +be_local_class(Matter_Profiler, + 3, + NULL, + be_nested_map(9, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(set_active, 5), be_const_closure(Matter_Profiler_set_active_closure) }, + { be_const_key_weak(millis, -1), be_const_var(0) }, + { be_const_key_weak(start, 4), be_const_closure(Matter_Profiler_start_closure) }, + { be_const_key_weak(active, 1), be_const_var(2) }, + { be_const_key_weak(PREALLOCATED, -1), be_const_int(50) }, + { be_const_key_weak(log, -1), be_const_closure(Matter_Profiler_log_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_Profiler_init_closure) }, + { be_const_key_weak(names, -1), be_const_var(1) }, + { be_const_key_weak(dump, -1), be_const_closure(Matter_Profiler_dump_closure) }, + })), + be_str_weak(Matter_Profiler) +); +/*******************************************************************/ + +void be_load_Matter_Profiler_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_Profiler); + be_setglobal(vm, "Matter_Profiler"); + be_pop(vm, 1); +} +/********************************************************************/ +/* End of solidification */ diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h index 9cdad0ee0..1ae1625fc 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h @@ -120,69 +120,86 @@ void be_load_Matter_UDPPacket_sent_class(bvm *vm) { extern const bclass be_class_Matter_UDPServer; /******************************************************************** -** Solidified function: received_ack +** Solidified function: _backoff_time ********************************************************************/ -be_local_closure(Matter_UDPServer_received_ack, /* name */ +be_local_closure(Matter_UDPServer__backoff_time, /* name */ be_nested_proto( 10, /* nstack */ - 2, /* argc */ - 2, /* varg */ + 1, /* argc */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(ack_message_counter), - /* K1 */ be_nested_str_weak(exchange_id), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(packets_sent), - /* K4 */ be_nested_str_weak(msg_id), - /* K5 */ be_nested_str_weak(remove), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), - /* K9 */ be_const_int(1), + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_const_int(1), + /* K1 */ be_const_int(0), + }), + be_str_weak(power_int), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x240C0301, // 0001 GT R3 R1 K1 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x08080400, // 0003 MUL R2 R2 R0 + 0x04040300, // 0004 SUB R1 R1 K0 + 0x7001FFFA, // 0005 JMP #0001 + 0x80040400, // 0006 RET 1 R2 + }) + ), }), - be_str_weak(received_ack), + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_UDPServer), + /* K1 */ be_nested_str_weak(math), + /* K2 */ be_nested_str_weak(rand), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(1), + /* K5 */ be_const_real_hex(0x3FCCCCCD), + /* K6 */ be_const_real_hex(0x3F800000), + /* K7 */ be_const_real_hex(0x3E800000), + }), + be_str_weak(_backoff_time), &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0x88080300, // 0000 GETMBR R2 R1 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0x4C100000, // 0002 LDNIL R4 - 0x1C100404, // 0003 EQ R4 R2 R4 - 0x78120000, // 0004 JMPF R4 #0006 - 0x80000800, // 0005 RET 0 - 0x58100002, // 0006 LDCONST R4 K2 - 0x6014000C, // 0007 GETGBL R5 G12 - 0x88180103, // 0008 GETMBR R6 R0 K3 + ( &(const binstruction[29]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x84080000, // 0001 CLOSURE R2 P0 + 0xA40E0200, // 0002 IMPORT R3 K1 + 0x5412012B, // 0003 LDINT R4 300 + 0x6014000A, // 0004 GETGBL R5 G10 + 0x8C180702, // 0005 GETMET R6 R3 K2 + 0x7C180200, // 0006 CALL R6 1 + 0x541E00FE, // 0007 LDINT R7 255 + 0x2C180C07, // 0008 AND R6 R6 R7 0x7C140200, // 0009 CALL R5 1 - 0x14140805, // 000A LT R5 R4 R5 - 0x78160016, // 000B JMPF R5 #0023 - 0x88140103, // 000C GETMBR R5 R0 K3 - 0x94140A04, // 000D GETIDX R5 R5 R4 - 0x88180B04, // 000E GETMBR R6 R5 K4 - 0x1C180C02, // 000F EQ R6 R6 R2 - 0x781A000F, // 0010 JMPF R6 #0021 - 0x88180B01, // 0011 GETMBR R6 R5 K1 - 0x1C180C03, // 0012 EQ R6 R6 R3 - 0x781A000C, // 0013 JMPF R6 #0021 - 0x88180103, // 0014 GETMBR R6 R0 K3 - 0x8C180D05, // 0015 GETMET R6 R6 K5 - 0x5C200800, // 0016 MOVE R8 R4 - 0x7C180400, // 0017 CALL R6 2 - 0xB81A0C00, // 0018 GETNGBL R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x60200008, // 001A GETGBL R8 G8 - 0x5C240400, // 001B MOVE R9 R2 - 0x7C200200, // 001C CALL R8 1 - 0x00221008, // 001D ADD R8 K8 R8 - 0x54260003, // 001E LDINT R9 4 - 0x7C180600, // 001F CALL R6 3 - 0x70020000, // 0020 JMP #0022 - 0x00100909, // 0021 ADD R4 R4 K9 - 0x7001FFE3, // 0022 JMP #0007 - 0x80000000, // 0023 RET 0 + 0x541A00FE, // 000A LDINT R6 255 + 0x0C140A06, // 000B DIV R5 R5 R6 + 0x24180103, // 000C GT R6 R0 K3 + 0x781A0001, // 000D JMPF R6 #0010 + 0x04180104, // 000E SUB R6 R0 K4 + 0x70020000, // 000F JMP #0011 + 0x58180003, // 0010 LDCONST R6 K3 + 0x5C1C0400, // 0011 MOVE R7 R2 + 0x58200005, // 0012 LDCONST R8 K5 + 0x5C240C00, // 0013 MOVE R9 R6 + 0x7C1C0400, // 0014 CALL R7 2 + 0x081C0807, // 0015 MUL R7 R4 R7 + 0x08200B07, // 0016 MUL R8 R5 K7 + 0x00220C08, // 0017 ADD R8 K6 R8 + 0x081C0E08, // 0018 MUL R7 R7 R8 + 0x60200009, // 0019 GETGBL R8 G9 + 0x5C240E00, // 001A MOVE R9 R7 + 0x7C200200, // 001B CALL R8 1 + 0x80041000, // 001C RET 1 R8 }) ) ); @@ -214,27 +231,43 @@ be_local_closure(Matter_UDPServer_every_second, /* name */ /******************************************************************** -** Solidified function: every_50ms +** Solidified function: send_UDP ********************************************************************/ -be_local_closure(Matter_UDPServer_every_50ms, /* name */ +be_local_closure(Matter_UDPServer_send_UDP, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 6, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(loop), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(UDPPacket_sent), + /* K2 */ be_nested_str_weak(send), + /* K3 */ be_nested_str_weak(msg_id), + /* K4 */ be_nested_str_weak(packets_sent), + /* K5 */ be_nested_str_weak(push), }), - be_str_weak(every_50ms), + be_str_weak(send_UDP), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 + ( &(const binstruction[14]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x8C0C0102, // 0004 GETMET R3 R0 K2 + 0x5C140400, // 0005 MOVE R5 R2 + 0x7C0C0400, // 0006 CALL R3 2 + 0x880C0503, // 0007 GETMBR R3 R2 K3 + 0x780E0003, // 0008 JMPF R3 #000D + 0x880C0104, // 0009 GETMBR R3 R0 K4 + 0x8C0C0705, // 000A GETMET R3 R3 K5 + 0x5C140400, // 000B MOVE R5 R2 + 0x7C0C0400, // 000C CALL R3 2 + 0x80000000, // 000D RET 0 }) ) ); @@ -346,98 +379,11 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ /******************************************************************** -** Solidified function: _backoff_time +** Solidified function: received_ack ********************************************************************/ -be_local_closure(Matter_UDPServer__backoff_time, /* name */ +be_local_closure(Matter_UDPServer_received_ack, /* name */ be_nested_proto( 10, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_const_int(1), - /* K1 */ be_const_int(0), - }), - be_str_weak(power_int), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x240C0301, // 0001 GT R3 R1 K1 - 0x780E0002, // 0002 JMPF R3 #0006 - 0x08080400, // 0003 MUL R2 R2 R0 - 0x04040300, // 0004 SUB R1 R1 K0 - 0x7001FFFA, // 0005 JMP #0001 - 0x80040400, // 0006 RET 1 R2 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_UDPServer), - /* K1 */ be_nested_str_weak(math), - /* K2 */ be_nested_str_weak(rand), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(1), - /* K5 */ be_const_real_hex(0x3FCCCCCD), - /* K6 */ be_const_real_hex(0x3F800000), - /* K7 */ be_const_real_hex(0x3E800000), - }), - be_str_weak(_backoff_time), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x84080000, // 0001 CLOSURE R2 P0 - 0xA40E0200, // 0002 IMPORT R3 K1 - 0x5412012B, // 0003 LDINT R4 300 - 0x6014000A, // 0004 GETGBL R5 G10 - 0x8C180702, // 0005 GETMET R6 R3 K2 - 0x7C180200, // 0006 CALL R6 1 - 0x541E00FE, // 0007 LDINT R7 255 - 0x2C180C07, // 0008 AND R6 R6 R7 - 0x7C140200, // 0009 CALL R5 1 - 0x541A00FE, // 000A LDINT R6 255 - 0x0C140A06, // 000B DIV R5 R5 R6 - 0x24180103, // 000C GT R6 R0 K3 - 0x781A0001, // 000D JMPF R6 #0010 - 0x04180104, // 000E SUB R6 R0 K4 - 0x70020000, // 000F JMP #0011 - 0x58180003, // 0010 LDCONST R6 K3 - 0x5C1C0400, // 0011 MOVE R7 R2 - 0x58200005, // 0012 LDCONST R8 K5 - 0x5C240C00, // 0013 MOVE R9 R6 - 0x7C1C0400, // 0014 CALL R7 2 - 0x081C0807, // 0015 MUL R7 R4 R7 - 0x08200B07, // 0016 MUL R8 R5 K7 - 0x00220C08, // 0017 ADD R8 K6 R8 - 0x081C0E08, // 0018 MUL R7 R7 R8 - 0x60200009, // 0019 GETGBL R8 G9 - 0x5C240E00, // 001A MOVE R9 R7 - 0x7C200200, // 001B CALL R8 1 - 0x80041000, // 001C RET 1 R8 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_UDPServer_start, /* name */ - be_nested_proto( - 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -445,44 +391,85 @@ be_local_closure(Matter_UDPServer_start, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(listening), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(udp), - /* K3 */ be_nested_str_weak(begin), - /* K4 */ be_nested_str_weak(addr), - /* K5 */ be_nested_str_weak(port), - /* K6 */ be_nested_str_weak(network_error), - /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), - /* K8 */ be_nested_str_weak(dispatch_cb), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(add_fast_loop), - /* K11 */ be_nested_str_weak(loop_cb), + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(ack_message_counter), + /* K1 */ be_nested_str_weak(exchange_id), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(packets_sent), + /* K4 */ be_nested_str_weak(msg_id), + /* K5 */ be_nested_str_weak(remove), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), + /* K9 */ be_const_int(1), }), - be_str_weak(start), + be_str_weak(received_ack), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x740A0011, // 0001 JMPT R2 #0014 - 0xB80A0400, // 0002 GETNGBL R2 K2 - 0x7C080000, // 0003 CALL R2 0 - 0x90020202, // 0004 SETMBR R0 K1 R2 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x8C080503, // 0006 GETMET R2 R2 K3 - 0x88100104, // 0007 GETMBR R4 R0 K4 - 0x88140105, // 0008 GETMBR R5 R0 K5 - 0x7C080600, // 0009 CALL R2 3 - 0x5C0C0400, // 000A MOVE R3 R2 - 0x740E0000, // 000B JMPT R3 #000D - 0xB0060D07, // 000C RAISE 1 K6 K7 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x90020003, // 000E SETMBR R0 K0 R3 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0xB80E1200, // 0010 GETNGBL R3 K9 - 0x8C0C070A, // 0011 GETMET R3 R3 K10 - 0x8814010B, // 0012 GETMBR R5 R0 K11 - 0x7C0C0400, // 0013 CALL R3 2 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[36]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0x880C0301, // 0001 GETMBR R3 R1 K1 + 0x4C100000, // 0002 LDNIL R4 + 0x1C100404, // 0003 EQ R4 R2 R4 + 0x78120000, // 0004 JMPF R4 #0006 + 0x80000800, // 0005 RET 0 + 0x58100002, // 0006 LDCONST R4 K2 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C140200, // 0009 CALL R5 1 + 0x14140805, // 000A LT R5 R4 R5 + 0x78160016, // 000B JMPF R5 #0023 + 0x88140103, // 000C GETMBR R5 R0 K3 + 0x94140A04, // 000D GETIDX R5 R5 R4 + 0x88180B04, // 000E GETMBR R6 R5 K4 + 0x1C180C02, // 000F EQ R6 R6 R2 + 0x781A000F, // 0010 JMPF R6 #0021 + 0x88180B01, // 0011 GETMBR R6 R5 K1 + 0x1C180C03, // 0012 EQ R6 R6 R3 + 0x781A000C, // 0013 JMPF R6 #0021 + 0x88180103, // 0014 GETMBR R6 R0 K3 + 0x8C180D05, // 0015 GETMET R6 R6 K5 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C180400, // 0017 CALL R6 2 + 0xB81A0C00, // 0018 GETNGBL R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x60200008, // 001A GETGBL R8 G8 + 0x5C240400, // 001B MOVE R9 R2 + 0x7C200200, // 001C CALL R8 1 + 0x00221008, // 001D ADD R8 K8 R8 + 0x54260003, // 001E LDINT R9 4 + 0x7C180600, // 001F CALL R6 3 + 0x70020000, // 0020 JMP #0022 + 0x00100909, // 0021 ADD R4 R4 K9 + 0x7001FFE3, // 0022 JMP #0007 + 0x80000000, // 0023 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_UDPServer_every_50ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(every_50ms), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -494,8 +481,8 @@ be_local_closure(Matter_UDPServer_start, /* name */ ********************************************************************/ be_local_closure(Matter_UDPServer_init, /* name */ be_nested_proto( - 4, /* nstack */ - 3, /* argc */ + 5, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -526,80 +513,38 @@ be_local_closure(Matter_UDPServer_init, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(addr), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(port), - /* K3 */ be_nested_str_weak(listening), - /* K4 */ be_nested_str_weak(packets_sent), - /* K5 */ be_nested_str_weak(loop_cb), + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(addr), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(port), + /* K4 */ be_nested_str_weak(listening), + /* K5 */ be_nested_str_weak(packets_sent), + /* K6 */ be_nested_str_weak(loop_cb), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x78060001, // 0000 JMPF R1 #0003 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x70020000, // 0002 JMP #0004 - 0x580C0001, // 0003 LDCONST R3 K1 - 0x90020003, // 0004 SETMBR R0 K0 R3 - 0x780A0001, // 0005 JMPF R2 #0008 - 0x5C0C0400, // 0006 MOVE R3 R2 - 0x70020000, // 0007 JMP #0009 - 0x540E15A3, // 0008 LDINT R3 5540 - 0x90020403, // 0009 SETMBR R0 K2 R3 - 0x500C0000, // 000A LDBOOL R3 0 0 - 0x90020603, // 000B SETMBR R0 K3 R3 - 0x600C0012, // 000C GETGBL R3 G18 - 0x7C0C0000, // 000D CALL R3 0 - 0x90020803, // 000E SETMBR R0 K4 R3 - 0x840C0000, // 000F CLOSURE R3 P0 - 0x90020A03, // 0010 SETMBR R0 K5 R3 - 0xA0000000, // 0011 CLOSE R0 - 0x80000000, // 0012 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_UDP -********************************************************************/ -be_local_closure(Matter_UDPServer_send_UDP, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(UDPPacket_sent), - /* K2 */ be_nested_str_weak(send), - /* K3 */ be_nested_str_weak(msg_id), - /* K4 */ be_nested_str_weak(packets_sent), - /* K5 */ be_nested_str_weak(push), - }), - be_str_weak(send_UDP), - &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x8C0C0102, // 0004 GETMET R3 R0 K2 - 0x5C140400, // 0005 MOVE R5 R2 - 0x7C0C0400, // 0006 CALL R3 2 - 0x880C0503, // 0007 GETMBR R3 R2 K3 - 0x780E0003, // 0008 JMPF R3 #000D - 0x880C0104, // 0009 GETMBR R3 R0 K4 - 0x8C0C0705, // 000A GETMET R3 R3 K5 - 0x5C140400, // 000B MOVE R5 R2 - 0x7C0C0400, // 000C CALL R3 2 - 0x80000000, // 000D RET 0 + ( &(const binstruction[20]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x780A0001, // 0001 JMPF R2 #0004 + 0x5C100400, // 0002 MOVE R4 R2 + 0x70020000, // 0003 JMP #0005 + 0x58100002, // 0004 LDCONST R4 K2 + 0x90020204, // 0005 SETMBR R0 K1 R4 + 0x780E0001, // 0006 JMPF R3 #0009 + 0x5C100600, // 0007 MOVE R4 R3 + 0x70020000, // 0008 JMP #000A + 0x541215A3, // 0009 LDINT R4 5540 + 0x90020604, // 000A SETMBR R0 K3 R4 + 0x50100000, // 000B LDBOOL R4 0 0 + 0x90020804, // 000C SETMBR R0 K4 R4 + 0x60100012, // 000D GETGBL R4 G18 + 0x7C100000, // 000E CALL R4 0 + 0x90020A04, // 000F SETMBR R0 K5 R4 + 0x84100000, // 0010 CLOSURE R4 P0 + 0x90020C04, // 0011 SETMBR R0 K6 R4 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 }) ) ); @@ -726,7 +671,7 @@ be_local_closure(Matter_UDPServer_stop, /* name */ ********************************************************************/ be_local_closure(Matter_UDPServer_loop, /* name */ be_nested_proto( - 11, /* nstack */ + 12, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -734,69 +679,142 @@ be_local_closure(Matter_UDPServer_loop, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(read), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(remote_ip), - /* K5 */ be_nested_str_weak(remote_port), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K9 */ be_nested_str_weak(dispatch_cb), - /* K10 */ be_nested_str_weak(MAX_PACKETS_READ), - /* K11 */ be_nested_str_weak(_resend_packets), + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(udp_socket), + /* K4 */ be_nested_str_weak(read), + /* K5 */ be_nested_str_weak(start), + /* K6 */ be_const_int(1), + /* K7 */ be_nested_str_weak(remote_ip), + /* K8 */ be_nested_str_weak(remote_port), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K12 */ be_nested_str_weak(dispatch_cb), + /* K13 */ be_nested_str_weak(udp_loop_dispatch), + /* K14 */ be_nested_str_weak(dump), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(MAX_PACKETS_READ), + /* K17 */ be_nested_str_weak(_resend_packets), }), be_str_weak(loop), &be_const_str_solidified, - ( &(const binstruction[46]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x1C080403, // 0003 EQ R2 R2 R3 - 0x780A0000, // 0004 JMPF R2 #0006 - 0x80000400, // 0005 RET 0 - 0x88080101, // 0006 GETMBR R2 R0 K1 - 0x8C080502, // 0007 GETMET R2 R2 K2 - 0x7C080200, // 0008 CALL R2 1 - 0x4C0C0000, // 0009 LDNIL R3 - 0x200C0403, // 000A NE R3 R2 R3 - 0x780E001E, // 000B JMPF R3 #002B - 0x00040303, // 000C ADD R1 R1 K3 - 0x880C0101, // 000D GETMBR R3 R0 K1 - 0x880C0704, // 000E GETMBR R3 R3 K4 - 0x88100101, // 000F GETMBR R4 R0 K1 - 0x88100905, // 0010 GETMBR R4 R4 K5 - 0xB8160C00, // 0011 GETNGBL R5 K6 - 0x8C140B07, // 0012 GETMET R5 R5 K7 - 0x601C0018, // 0013 GETGBL R7 G24 - 0x58200008, // 0014 LDCONST R8 K8 - 0x5C240600, // 0015 MOVE R9 R3 - 0x5C280800, // 0016 MOVE R10 R4 - 0x7C1C0600, // 0017 CALL R7 3 - 0x54220003, // 0018 LDINT R8 4 - 0x7C140600, // 0019 CALL R5 3 - 0x88140109, // 001A GETMBR R5 R0 K9 - 0x78160004, // 001B JMPF R5 #0021 - 0x8C140109, // 001C GETMET R5 R0 K9 - 0x5C1C0400, // 001D MOVE R7 R2 - 0x5C200600, // 001E MOVE R8 R3 - 0x5C240800, // 001F MOVE R9 R4 - 0x7C140800, // 0020 CALL R5 4 - 0x8814010A, // 0021 GETMBR R5 R0 K10 - 0x14140205, // 0022 LT R5 R1 R5 - 0x78160004, // 0023 JMPF R5 #0029 - 0x88140101, // 0024 GETMBR R5 R0 K1 - 0x8C140B02, // 0025 GETMET R5 R5 K2 - 0x7C140200, // 0026 CALL R5 1 - 0x5C080A00, // 0027 MOVE R2 R5 - 0x70020000, // 0028 JMP #002A - 0x4C080000, // 0029 LDNIL R2 - 0x7001FFDD, // 002A JMP #0009 - 0x8C0C010B, // 002B GETMET R3 R0 K11 - 0x7C0C0200, // 002C CALL R3 1 - 0x80000000, // 002D RET 0 + ( &(const binstruction[56]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x58080002, // 0002 LDCONST R2 K2 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x4C100000, // 0004 LDNIL R4 + 0x1C0C0604, // 0005 EQ R3 R3 R4 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x880C0103, // 0008 GETMBR R3 R0 K3 + 0x8C0C0704, // 0009 GETMET R3 R3 K4 + 0x7C0C0200, // 000A CALL R3 1 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x78120026, // 000D JMPF R4 #0035 + 0x8C100305, // 000E GETMET R4 R1 K5 + 0x7C100200, // 000F CALL R4 1 + 0x00080506, // 0010 ADD R2 R2 K6 + 0x88100103, // 0011 GETMBR R4 R0 K3 + 0x88100907, // 0012 GETMBR R4 R4 K7 + 0x88140103, // 0013 GETMBR R5 R0 K3 + 0x88140B08, // 0014 GETMBR R5 R5 K8 + 0xB81A1200, // 0015 GETNGBL R6 K9 + 0x8C180D0A, // 0016 GETMET R6 R6 K10 + 0x60200018, // 0017 GETGBL R8 G24 + 0x5824000B, // 0018 LDCONST R9 K11 + 0x5C280800, // 0019 MOVE R10 R4 + 0x5C2C0A00, // 001A MOVE R11 R5 + 0x7C200600, // 001B CALL R8 3 + 0x54260003, // 001C LDINT R9 4 + 0x7C180600, // 001D CALL R6 3 + 0x8818010C, // 001E GETMBR R6 R0 K12 + 0x781A0007, // 001F JMPF R6 #0028 + 0x8C18030A, // 0020 GETMET R6 R1 K10 + 0x5820000D, // 0021 LDCONST R8 K13 + 0x7C180400, // 0022 CALL R6 2 + 0x8C18010C, // 0023 GETMET R6 R0 K12 + 0x5C200600, // 0024 MOVE R8 R3 + 0x5C240800, // 0025 MOVE R9 R4 + 0x5C280A00, // 0026 MOVE R10 R5 + 0x7C180800, // 0027 CALL R6 4 + 0x8C18030E, // 0028 GETMET R6 R1 K14 + 0x5820000F, // 0029 LDCONST R8 K15 + 0x7C180400, // 002A CALL R6 2 + 0x88180110, // 002B GETMBR R6 R0 K16 + 0x14180406, // 002C LT R6 R2 R6 + 0x781A0004, // 002D JMPF R6 #0033 + 0x88180103, // 002E GETMBR R6 R0 K3 + 0x8C180D04, // 002F GETMET R6 R6 K4 + 0x7C180200, // 0030 CALL R6 1 + 0x5C0C0C00, // 0031 MOVE R3 R6 + 0x70020000, // 0032 JMP #0034 + 0x4C0C0000, // 0033 LDNIL R3 + 0x7001FFD5, // 0034 JMP #000B + 0x8C100111, // 0035 GETMET R4 R0 K17 + 0x7C100200, // 0036 CALL R4 1 + 0x80000000, // 0037 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_UDPServer_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(listening), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(udp), + /* K3 */ be_nested_str_weak(begin), + /* K4 */ be_nested_str_weak(addr), + /* K5 */ be_nested_str_weak(port), + /* K6 */ be_nested_str_weak(network_error), + /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), + /* K8 */ be_nested_str_weak(dispatch_cb), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(add_fast_loop), + /* K11 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0011, // 0001 JMPT R2 #0014 + 0xB80A0400, // 0002 GETNGBL R2 K2 + 0x7C080000, // 0003 CALL R2 0 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x88100104, // 0007 GETMBR R4 R0 K4 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x7C080600, // 0009 CALL R2 3 + 0x5C0C0400, // 000A MOVE R3 R2 + 0x740E0000, // 000B JMPT R3 #000D + 0xB0060D07, // 000C RAISE 1 K6 K7 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x90020003, // 000E SETMBR R0 K0 R3 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0xB80E1200, // 0010 GETNGBL R3 K9 + 0x8C0C070A, // 0011 GETMET R3 R3 K10 + 0x8814010B, // 0012 GETMBR R5 R0 K11 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80000000, // 0014 RET 0 }) ) ); @@ -807,30 +825,31 @@ be_local_closure(Matter_UDPServer_loop, /* name */ ** Solidified class: Matter_UDPServer ********************************************************************/ be_local_class(Matter_UDPServer, - 7, + 8, NULL, - be_nested_map(20, + be_nested_map(21, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(every_second, -1), be_const_closure(Matter_UDPServer_every_second_closure) }, - { be_const_key_weak(RETRIES, -1), be_const_int(5) }, - { be_const_key_weak(udp_socket, -1), be_const_var(3) }, - { be_const_key_weak(packets_sent, -1), be_const_var(5) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_UDPServer_received_ack_closure) }, - { be_const_key_weak(dispatch_cb, 0), be_const_var(4) }, - { be_const_key_weak(send, -1), be_const_closure(Matter_UDPServer_send_closure) }, - { be_const_key_weak(send_UDP, 13), be_const_closure(Matter_UDPServer_send_UDP_closure) }, - { be_const_key_weak(every_50ms, 12), be_const_closure(Matter_UDPServer_every_50ms_closure) }, - { be_const_key_weak(loop_cb, 3), be_const_var(6) }, - { be_const_key_weak(port, 16), be_const_var(1) }, - { be_const_key_weak(start, 6), be_const_closure(Matter_UDPServer_start_closure) }, - { be_const_key_weak(MAX_PACKETS_READ, 2), be_const_int(4) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_UDPServer_init_closure) }, - { be_const_key_weak(listening, -1), be_const_var(2) }, - { be_const_key_weak(_resend_packets, 7), be_const_closure(Matter_UDPServer__resend_packets_closure) }, - { be_const_key_weak(_backoff_time, -1), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(loop_cb, -1), be_const_var(7) }, { be_const_key_weak(addr, -1), be_const_var(0) }, - { be_const_key_weak(loop, -1), be_const_closure(Matter_UDPServer_loop_closure) }, + { be_const_key_weak(dispatch_cb, 10), be_const_var(5) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_UDPServer_every_second_closure) }, + { be_const_key_weak(send_UDP, 0), be_const_closure(Matter_UDPServer_send_UDP_closure) }, + { be_const_key_weak(loop, 18), be_const_closure(Matter_UDPServer_loop_closure) }, + { be_const_key_weak(device, 11), be_const_var(2) }, + { be_const_key_weak(_resend_packets, -1), be_const_closure(Matter_UDPServer__resend_packets_closure) }, + { be_const_key_weak(MAX_PACKETS_READ, 14), be_const_int(4) }, + { be_const_key_weak(_backoff_time, 5), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, + { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_UDPServer_every_50ms_closure) }, + { be_const_key_weak(listening, -1), be_const_var(3) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_UDPServer_init_closure) }, + { be_const_key_weak(RETRIES, -1), be_const_int(5) }, + { be_const_key_weak(packets_sent, 1), be_const_var(6) }, + { be_const_key_weak(udp_socket, -1), be_const_var(4) }, + { be_const_key_weak(send, -1), be_const_closure(Matter_UDPServer_send_closure) }, + { be_const_key_weak(stop, -1), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_UDPServer_received_ack_closure) }, + { be_const_key_weak(port, -1), be_const_var(1) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_UDPServer_start_closure) }, })), be_str_weak(Matter_UDPServer) ); From c0160f2b5ba2fd48d80b449d421d5e512fa96418 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sun, 9 Jul 2023 10:43:39 +0200 Subject: [PATCH 058/150] Update changelogs --- CHANGELOG.md | 2 +- RELEASENOTES.md | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2b1d8d833..9dbd0e879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.2] ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) -- Matter add mini-profiler +- Matter mini-profiler (#19075) ### Breaking Changed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7dae07e29..a7cf38b11 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -117,8 +117,9 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Berry added `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) -- Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) +- Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) +- Matter mini-profiler [#19075](https://github.com/arendst/Tasmota/issues/19075) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) From b7c9182c1433a31ff68b4d4efc2ef11ebfa1d78e Mon Sep 17 00:00:00 2001 From: sfromis <47082390+sfromis@users.noreply.github.com> Date: Sun, 9 Jul 2023 14:03:18 +0200 Subject: [PATCH 059/150] Update decode-status.py to synchronize SetOption154/155 (#19078) I noticed that the translation for SetOption154/155 bits did not match tasmota_types.h: https://github.com/arendst/Tasmota/blob/development/tasmota/include/tasmota_types.h#L190-L191 --- tools/decode-status.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/decode-status.py b/tools/decode-status.py index 1102360cd..7a76bde39 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -209,8 +209,9 @@ a_setoption = [[ "(Matter) Enable Matter protocol over Wifi", "(Power) Switch between two (0) or one (1) pin bistable relay control", "(Berry) Disable autoexec.be on restart (1)", + "(Berry) Handle berry led using RMT0 as additional WS2812 scheme", "(ZCDimmer) Enable rare falling Edge dimmer instead of leading edge", - "","","", + "","", "","","","", "","","","", "","","","", From fcfc3ecb3780983fe5106334096849747ccbe290 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 9 Jul 2023 19:36:36 +0200 Subject: [PATCH 060/150] Matter fix session not being removed from memory (#19081) * Matter fix session not being removed from memory * Fix --- .../src/embedded/Matter_Commissioning.be | 6 +-- .../src/embedded/Matter_Fabric.be | 4 +- .../solidified_Matter_Commissioning.h | 4 +- .../src/solidify/solidified_Matter_Fabric.h | 49 +++++++++++-------- 4 files changed, 36 insertions(+), 27 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index df9ca5343..3202ce0e1 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -130,7 +130,7 @@ class Matter_Commisioning_Context # record the initiator_session_id session.__future_initiator_session_id = pbkdfparamreq.initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) + tasmota.log(format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) # prepare response var pbkdfparamresp = matter.PBKDFParamResponse() @@ -370,7 +370,7 @@ class Matter_Commisioning_Context session.set_mode_CASE() session.__future_initiator_session_id = sigma1.initiator_session_id # update initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) + tasmota.log(format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) # Generate and Send Sigma2_Resume session.shared_secret = session_resumption.shared_secret @@ -458,7 +458,7 @@ class Matter_Commisioning_Context session.__future_initiator_session_id = sigma1.initiator_session_id # update initiator_session_id session.__future_local_session_id = self.device.sessions.gen_local_session_id() - tasmota.log(format("MTR: New_Session(%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) + tasmota.log(format("MTR: +Session (%6i) from '[%s]:%i'", session.__future_local_session_id, msg.remote_ip, msg.remote_port), 3) # tasmota.log("MTR: fabric="+matter.inspect(session._fabric), 4) # tasmota.log("MTR: no_private_key="+session.get_pk().tohex(), 4) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index 9e08d6f34..fb149ff45 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -247,7 +247,9 @@ class Matter_Fabric : Matter_Expirable def add_session(s) if self._sessions.find(s) == nil while size(self._sessions) >= self._MAX_CASE - self._sessions.remove(self._sessions.find(self.get_oldest_session())) + var session_deleted = self.get_oldest_session() + self._sessions.remove(self._sessions.find(session_deleted)) + self._store.remove_session(session_deleted) end self._sessions.push(s) end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index da660771d..7c5b07704 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -286,7 +286,7 @@ be_local_closure(Matter_Commisioning_Context_parse_PBKDFParamRequest, /* name /* K27 */ be_nested_str_weak(device), /* K28 */ be_nested_str_weak(sessions), /* K29 */ be_nested_str_weak(gen_local_session_id), - /* K30 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K30 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), /* K31 */ be_nested_str_weak(remote_ip), /* K32 */ be_nested_str_weak(remote_port), /* K33 */ be_nested_str_weak(PBKDFParamResponse), @@ -1436,7 +1436,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K41 */ be_nested_str_weak(initiator_session_id), /* K42 */ be_nested_str_weak(__future_local_session_id), /* K43 */ be_nested_str_weak(gen_local_session_id), - /* K44 */ be_nested_str_weak(MTR_X3A_X20New_Session_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K44 */ be_nested_str_weak(MTR_X3A_X20_X2BSession_X20_X20_X20_X28_X256i_X29_X20from_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), /* K45 */ be_nested_str_weak(remote_ip), /* K46 */ be_nested_str_weak(remote_port), /* K47 */ be_nested_str_weak(resumption_id), diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index af3123804..f8d35d9da 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -151,44 +151,51 @@ be_local_closure(Matter_Fabric_add_session, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ + ( &(const bvalue[ 8]) { /* constants */ /* K0 */ be_nested_str_weak(_sessions), /* K1 */ be_nested_str_weak(find), /* K2 */ be_nested_str_weak(_MAX_CASE), - /* K3 */ be_nested_str_weak(remove), - /* K4 */ be_nested_str_weak(get_oldest_session), - /* K5 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(get_oldest_session), + /* K4 */ be_nested_str_weak(remove), + /* K5 */ be_nested_str_weak(_store), + /* K6 */ be_nested_str_weak(remove_session), + /* K7 */ be_nested_str_weak(push), }), be_str_weak(add_session), &be_const_str_solidified, - ( &(const binstruction[27]) { /* code */ + ( &(const binstruction[32]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x5C100200, // 0002 MOVE R4 R1 0x7C080400, // 0003 CALL R2 2 0x4C0C0000, // 0004 LDNIL R3 0x1C080403, // 0005 EQ R2 R2 R3 - 0x780A0012, // 0006 JMPF R2 #001A + 0x780A0017, // 0006 JMPF R2 #001F 0x6008000C, // 0007 GETGBL R2 G12 0x880C0100, // 0008 GETMBR R3 R0 K0 0x7C080200, // 0009 CALL R2 1 0x880C0102, // 000A GETMBR R3 R0 K2 0x28080403, // 000B GE R2 R2 R3 - 0x780A0008, // 000C JMPF R2 #0016 - 0x88080100, // 000D GETMBR R2 R0 K0 - 0x8C080503, // 000E GETMET R2 R2 K3 - 0x88100100, // 000F GETMBR R4 R0 K0 - 0x8C100901, // 0010 GETMET R4 R4 K1 - 0x8C180104, // 0011 GETMET R6 R0 K4 - 0x7C180200, // 0012 CALL R6 1 - 0x7C100400, // 0013 CALL R4 2 - 0x7C080400, // 0014 CALL R2 2 - 0x7001FFF0, // 0015 JMP #0007 - 0x88080100, // 0016 GETMBR R2 R0 K0 - 0x8C080505, // 0017 GETMET R2 R2 K5 - 0x5C100200, // 0018 MOVE R4 R1 - 0x7C080400, // 0019 CALL R2 2 - 0x80000000, // 001A RET 0 + 0x780A000D, // 000C JMPF R2 #001B + 0x8C080103, // 000D GETMET R2 R0 K3 + 0x7C080200, // 000E CALL R2 1 + 0x880C0100, // 000F GETMBR R3 R0 K0 + 0x8C0C0704, // 0010 GETMET R3 R3 K4 + 0x88140100, // 0011 GETMBR R5 R0 K0 + 0x8C140B01, // 0012 GETMET R5 R5 K1 + 0x5C1C0400, // 0013 MOVE R7 R2 + 0x7C140400, // 0014 CALL R5 2 + 0x7C0C0400, // 0015 CALL R3 2 + 0x880C0105, // 0016 GETMBR R3 R0 K5 + 0x8C0C0706, // 0017 GETMET R3 R3 K6 + 0x5C140400, // 0018 MOVE R5 R2 + 0x7C0C0400, // 0019 CALL R3 2 + 0x7001FFEB, // 001A JMP #0007 + 0x88080100, // 001B GETMBR R2 R0 K0 + 0x8C080507, // 001C GETMET R2 R2 K7 + 0x5C100200, // 001D MOVE R4 R1 + 0x7C080400, // 001E CALL R2 2 + 0x80000000, // 001F RET 0 }) ) ); From b1cc87d24f9eb8f5dfd7836307cc040038d11d12 Mon Sep 17 00:00:00 2001 From: btsimonh Date: Mon, 10 Jul 2023 09:27:20 +0100 Subject: [PATCH 061/150] File UI changes (#19014) * Remove recursion into folders on Manage Files. May be enabled with UFILESYS_RECURSEFOLDERS_GUI. On Edit of a file, Save and Magane btuttons return to the folder containgint the file being edited. On delete file, UI returns to the folder that the deleted file was in. * Make newfile put in in the current folder, and return to current folder on save of manage button. * Add folderOnly and FileOnly functions to reduce code duplication. Enable folder delete. Enable folder listing to be aborted (x in browser) Disbale ESP32 Download Task. Needs attention. Allow folder create from newfile name. --- .../xdrv_50_filesystem.ino | 323 +++++++++++++++--- 1 file changed, 272 insertions(+), 51 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index d3d0acbd7..ee99a4f80 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -18,6 +18,17 @@ */ #ifdef USE_UFILESYS + +// saves 80 bytes of flash, makes the UI cleaner for folders containing lots of files. +// disables recursive folder listing in file UI +//#define UFILESYS_NO_RECURSE_GUI + +// Enables serving of static files on /fs/ +// costs 1844 bytes of flash and 40 bytes of RAM +// probably not useful on esp8266, but useful on esp32 +// You could serve a whole webapp from Tas itself. +//#define UFILESYS_STATIC_SERVING + /*********************************************************************************************\ This driver adds universal file system support for - ESP8266 (sd card or littlefs on > 1 M devices with special linker file e.g. eagle.flash.4m2m.ld) @@ -135,6 +146,36 @@ void UfsInit(void) { } } +// simple put a zero at last '/' +// modifies input string +char *folderOnly(char *fname){ + for (int i = strlen(fname)-1; i >= 0; i--){ + if (fname[i] == '/'){ + fname[i] = 0; + break; + } + fname[i] = 0; + } + if (!fname[0]){ + fname[0] = '/'; + fname[1] = 0; + } + return fname; +} + +// returns everything after last '/' of whiole input if no '/' +char *fileOnly(char *fname){ + char *cp = fname; + for (uint32_t cnt = strlen(fname); cnt >= 0; cnt--) { + if (fname[cnt] == '/') { + cp = &fname[cnt + 1]; + break; + } + } + return cp; +} + + #ifdef USE_SDCARD void UfsCheckSDCardInit(void) { // Try SPI mode first @@ -503,10 +544,18 @@ char* UfsFilename(char* fname, char* fname_in) { } const char kUFSCommands[] PROGMEM = "Ufs|" // Prefix - "|Type|Size|Free|Delete|Rename|Run"; + "|Type|Size|Free|Delete|Rename|Run" +#ifdef UFILESYS_STATIC_SERVING + "|Serve" +#endif + ; void (* const kUFSCommand[])(void) PROGMEM = { - &UFSInfo, &UFSType, &UFSSize, &UFSFree, &UFSDelete, &UFSRename, &UFSRun}; + &UFSInfo, &UFSType, &UFSSize, &UFSFree, &UFSDelete, &UFSRename, &UFSRun +#ifdef UFILESYS_STATIC_SERVING + ,&UFSServe +#endif + }; void UFSInfo(void) { Response_P(PSTR("{\"Ufs\":{\"Type\":%d,\"Size\":%d,\"Free\":%d}"), ufs_type, UfsInfo(0, 0), UfsInfo(1, 0)); @@ -586,6 +635,115 @@ void UFSRename(void) { } } +#ifdef UFILESYS_STATIC_SERVING +/* +* Serves a filesystem folder at a web url. +* NOTE - this is expensive on flash -> +2.5kbytes. +* like "UFSServe ,[,]" +* e.g. "UFSServe /sd/,/mysdcard/,1" - will serve the /sd/ fs folder as https:///mysdcard/ with no auth required +* e.g. "UFSServe /www/,/" - will serve the /www/ fs folder as https:/// with auth required if TAS has a password setup +* defaults to 0 - i.e. the default is to require auth if configured +* it WILL serve on / - so conflicting urls could occur. I beleive native TAS urls will have priority. +* you can serve multiple folders, and they can each be auth or noauth +* +* by default, it also enables cors on the webserver - this allows you to have +* a website external to TAS which can access the files, else the browser refuses. +*/ +#include "detail/RequestHandlersImpl.h" + +// class to allow us to request auth when required. +// StaticRequestHandler is in the above header +class StaticRequestHandlerAuth : public StaticRequestHandler { +public: + StaticRequestHandlerAuth(FS& fs, const char* path, const char* uri, const char* cache_header): + StaticRequestHandler(fs, path, uri, cache_header) + { + } + + // we replace the handle method, + // and look for authentication only if we would serve the file. + // if we check earlier, then we will reject as unauth even though a later + // handler may be public, and so fail to serve public files. + bool handle(WebServer& server, HTTPMethod requestMethod, String requestUri) override { + if (!canHandle(requestMethod, requestUri)) + return false; + + log_v("StaticRequestHandler::handle: request=%s _uri=%s\r\n", requestUri.c_str(), _uri.c_str()); + + String path(_path); + + if (!_isFile) { + // Base URI doesn't point to a file. + // If a directory is requested, look for index file. + if (requestUri.endsWith("/")) + requestUri += "index.htm"; + + // Append whatever follows this URI in request to get the file path. + path += requestUri.substring(_baseUriLength); + } + log_v("StaticRequestHandler::handle: path=%s, isFile=%d\r\n", path.c_str(), _isFile); + + String contentType = getContentType(path); + + // look for gz file, only if the original specified path is not a gz. So part only works to send gzip via content encoding when a non compressed is asked for + // if you point the the path to gzip you will serve the gzip as content type "application/x-gzip", not text or javascript etc... + if (!path.endsWith(FPSTR(mimeTable[gz].endsWith)) && !_fs.exists(path)) { + String pathWithGz = path + FPSTR(mimeTable[gz].endsWith); + if(_fs.exists(pathWithGz)) + path += FPSTR(mimeTable[gz].endsWith); + } + + File f = _fs.open(path, "r"); + if (!f || !f.available()) + return false; + + if (!WebAuthenticate()) { + AddLog(LOG_LEVEL_ERROR, PSTR("UFS: serv of %s denied"), requestUri.c_str()); + server.requestAuthentication(); + return true; + } + + if (_cache_header.length() != 0) + server.sendHeader("Cache-Control", _cache_header); + + server.streamFile(f, contentType); + return true; + } +}; + +void UFSServe(void) { + if (XdrvMailbox.data_len > 0) { + bool result = false; + char *fpath = strtok(XdrvMailbox.data, ","); + char *url = strtok(nullptr, ","); + char *noauth = strtok(nullptr, ","); + if (fpath && url) { + char t[] = ""; + StaticRequestHandlerAuth *staticHandler; + if (noauth && *noauth == '1'){ + staticHandler = (StaticRequestHandlerAuth *) new StaticRequestHandler(*ffsp, fpath, url, (char *)nullptr); + } else { + staticHandler = new StaticRequestHandlerAuth(*ffsp, fpath, url, (char *)nullptr); + } + if (staticHandler) { + //Webserver->serveStatic(url, *ffsp, fpath); + Webserver->addHandler(staticHandler); + Webserver->enableCORS(true); + result = true; + } else { + // could this happen? only lack of memory. + result = false; + } + } + if (!result) { + ResponseCmndFailed(); + } else { + ResponseCmndDone(); + } + } +} +#endif // UFILESYS_STATIC_SERVING + void UFSRun(void) { if (XdrvMailbox.data_len > 0) { char fname[UFS_FILENAME_SIZE]; @@ -601,6 +759,8 @@ void UFSRun(void) { } } + + /*********************************************************************************************\ * Web support \*********************************************************************************************/ @@ -608,7 +768,14 @@ void UFSRun(void) { #ifdef USE_WEBSERVER const char UFS_WEB_DIR[] PROGMEM = - "

    "; + "

    "; + +const char UFS_CURRDIR[] PROGMEM = + "

    %s: %s

    "; + +#ifndef D_CURR_DIR + #define D_CURR_DIR "Folder" +#endif const char UFS_FORM_FILE_UPLOAD[] PROGMEM = "
    " @@ -632,7 +799,7 @@ const char UFS_FORM_SDC_DIRa[] PROGMEM = const char UFS_FORM_SDC_DIRc[] PROGMEM = "
    "; const char UFS_FORM_FILE_UPGb[] PROGMEM = - "
    " + "" "
    "; const char UFS_FORM_FILE_UPGb1[] PROGMEM = "" D_SHOW_HIDDEN_FILES ""; @@ -648,14 +815,14 @@ const char UFS_FORM_SDC_DIR_HIDDABLE[] PROGMEM = const char UFS_FORM_SDC_DIRd[] PROGMEM = "
    %s
    "; const char UFS_FORM_SDC_DIRb[] PROGMEM = - "%s %s %8d %s %s"; + "%s %19s %8d %s %s"; const char UFS_FORM_SDC_HREF[] PROGMEM = "ufsd?download=%s/%s"; #ifdef GUI_TRASH_FILE const char UFS_FORM_SDC_HREFdel[] PROGMEM = //"🗑"; // 🗑️ - "🔥"; // 🔥 + "🔥"; // 🔥 #endif // GUI_TRASH_FILE #ifdef GUI_EDIT_FILE @@ -684,38 +851,50 @@ void UfsDirectory(void) { AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_MANAGE_FILE_SYSTEM)); uint8_t depth = 0; + uint8_t isdir = 0; strcpy(ufs_path, "/"); + if (Webserver->hasArg(F("dir"))) { + String stmp = Webserver->arg(F("dir")); + ufs_dir = atoi(stmp.c_str()); + } + + if (ufs_dir == 1) { + dfsp = ufsp; + } else { + if (ffsp) { + dfsp = ffsp; + } + } + + if (Webserver->hasArg(F("delete"))) { + String stmp = Webserver->arg(F("delete")); + char *cp = (char*)stmp.c_str(); + File download_file = dfsp->open(cp, UFS_FILE_READ); + if (download_file) { + if (download_file.isDirectory()) { + download_file.close(); + dfsp->rmdir(cp); + } else { + download_file.close(); + dfsp->remove(cp); + } + } + } + if (Webserver->hasArg(F("download"))) { String stmp = Webserver->arg(F("download")); char *cp = (char*)stmp.c_str(); if (UfsDownloadFile(cp)) { // is directory strcpy(ufs_path, cp); + isdir = 1; } else { return; } } - if (Webserver->hasArg(F("dir"))) { - String stmp = Webserver->arg(F("dir")); - ufs_dir = atoi(stmp.c_str()); - if (ufs_dir == 1) { - dfsp = ufsp; - } else { - if (ffsp) { - dfsp = ffsp; - } - } - } - - if (Webserver->hasArg(F("delete"))) { - String stmp = Webserver->arg(F("delete")); - char *cp = (char*)stmp.c_str(); - dfsp->remove(cp); - } - WSContentStart_P(PSTR(D_MANAGE_FILE_SYSTEM)); WSContentSendStyle(); WSContentSend_P(UFS_FORM_FILE_UPLOAD); @@ -733,13 +912,20 @@ void UfsDirectory(void) { WSContentSend_P(UFS_FORM_FILE_UPG, PSTR(D_SCRIPT_UPLOAD)); + if (isdir){ + // if a folder, show 'folder: xxx' if not '/' + if (ufs_path[0] != '/' || strlen(ufs_path) != 1){ + WSContentSend_P(UFS_CURRDIR, PSTR(D_CURR_DIR), ufs_path); + } + } + WSContentSend_P(UFS_FORM_SDC_DIRa); if (ufs_type) { UfsListDir(ufs_path, depth); } WSContentSend_P(UFS_FORM_SDC_DIRc); #ifdef GUI_EDIT_FILE - WSContentSend_P(UFS_FORM_FILE_UPGb); + WSContentSend_P(UFS_FORM_FILE_UPGb, ufs_path); #endif if (!isSDC()) { WSContentSend_P(UFS_FORM_FILE_UPGb1); @@ -788,6 +974,13 @@ void UfsListDir(char *path, uint8_t depth) { } char *ep; while (true) { + WiFiClient client = Webserver->client(); + // abort if the client disconnected + // if there is a huge folder, then this gives a way out by refresh of browser + if (!client.connected()){ + break; + } + File entry = dir.openNextFile(); if (!entry) { break; @@ -820,9 +1013,19 @@ void UfsListDir(char *path, uint8_t depth) { const char* ppe = pp_escaped_string.c_str(); // this can't be merged on a single line otherwise the String object can be freed const char* epe = ep_escaped_string.c_str(); sprintf(cp, format, ep); +#ifdef GUI_TRASH_FILE + char delpath[128+UFS_FILENAME_SIZE]; + ext_snprintf_P(delpath, sizeof(delpath), UFS_FORM_SDC_HREFdel, ppe, epe, ppe[0]?ppe:"/"); +#else + char delpath[2] = " "; +#endif // GUI_TRASH_FILE if (entry.isDirectory()) { ext_snprintf_P(npath, sizeof(npath), UFS_FORM_SDC_HREF, ppe, epe); - WSContentSend_P(UFS_FORM_SDC_DIRd, npath, ep, name); + + WSContentSend_P(UFS_FORM_SDC_DIRb, hiddable ? UFS_FORM_SDC_DIR_HIDDABLE : UFS_FORM_SDC_DIR_NORMAL, npath, epe, + HtmlEscape(name).c_str(), "", 0, delpath, " "); + //WSContentSend_P(UFS_FORM_SDC_DIRd, npath, ep, name); +#ifdef UFILESYS_RECURSEFOLDERS_GUI uint8_t plen = strlen(path); if (plen > 1) { strcat(path, "/"); @@ -830,14 +1033,8 @@ void UfsListDir(char *path, uint8_t depth) { strcat(path, ep); UfsListDir(path, depth + 4); path[plen] = 0; +#endif } else { - #ifdef GUI_TRASH_FILE - char delpath[128]; - ext_snprintf_P(delpath, sizeof(delpath), UFS_FORM_SDC_HREFdel, ppe, epe); - #else - char delpath[2]; - delpath[0]=0; - #endif // GUI_TRASH_FILE #ifdef GUI_EDIT_FILE char editpath[128]; ext_snprintf_P(editpath, sizeof(editpath), UFS_FORM_SDC_HREFedit, ppe, epe); @@ -857,12 +1054,16 @@ void UfsListDir(char *path, uint8_t depth) { } #ifdef ESP32 -#define ESP32_DOWNLOAD_TASK +// this actually does not work reliably, as the +// webserver can close the connection before the download task completes +//#define ESP32_DOWNLOAD_TASK #endif // ESP32 uint8_t UfsDownloadFile(char *file) { File download_file; + AddLog(LOG_LEVEL_INFO, PSTR("UFS: File '%s' download"), file); + if (!dfsp->exists(file)) { AddLog(LOG_LEVEL_INFO, PSTR("UFS: File '%s' not found"), file); return 0; @@ -875,6 +1076,7 @@ uint8_t UfsDownloadFile(char *file) { } if (download_file.isDirectory()) { + AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: File '%s' to download is directory"), file); download_file.close(); return 1; } @@ -887,13 +1089,7 @@ uint8_t UfsDownloadFile(char *file) { Webserver->setContentLength(flen); char attachment[100]; - char *cp; - for (uint32_t cnt = strlen(file); cnt >= 0; cnt--) { - if (file[cnt] == '/') { - cp = &file[cnt + 1]; - break; - } - } + char *cp = fileOnly(file); snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=%s"), cp); Webserver->sendHeader(F("Content-Disposition"), attachment); WSSend(200, CT_APP_STREAM, ""); @@ -922,6 +1118,10 @@ uint8_t UfsDownloadFile(char *file) { #endif // ESP32_DOWNLOAD_TASK + +// to make this work I thing you wouold need to duplicate the client +// BEFORE starting the task, so that the webserver does not close it's +// copy of the client. #ifdef ESP32_DOWNLOAD_TASK download_file.close(); @@ -952,20 +1152,18 @@ void download_task(void *path) { WiFiClient download_Client; char *file = (char*) path; + AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: ESP32 File '%s' to download"), file); + download_file = dfsp->open(file, UFS_FILE_READ); uint32_t flen = download_file.size(); + AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: len %d to download"), flen); + download_Client = Webserver->client(); Webserver->setContentLength(flen); char attachment[100]; - char *cp; - for (uint32_t cnt = strlen(file); cnt >= 0; cnt--) { - if (file[cnt] == '/') { - cp = &file[cnt + 1]; - break; - } - } + char *cp = fileOnly(file); //snprintf_P(attachment, sizeof(attachment), PSTR("download file '%s' as '%s'"), file, cp); //Webserver->sendHeader(F("X-Tasmota-Debug"), attachment); snprintf_P(attachment, sizeof(attachment), PSTR("attachment; filename=%s"), cp); @@ -987,6 +1185,7 @@ void download_task(void *path) { UfsData.download_busy = false; vTaskDelete( NULL ); free(path); + AddLog(LOG_LEVEL_DEBUG, PSTR("UFS: esp32 sent file")); } #endif // ESP32_DOWNLOAD_TASK @@ -1065,7 +1264,8 @@ void UfsEditor(void) { } WSContentSend_P(HTTP_EDITOR_FORM_END); - WSContentSend_P(UFS_WEB_DIR, PSTR(D_MANAGE_FILE_SYSTEM)); + folderOnly(fname); + WSContentSend_P(UFS_WEB_DIR, fname, PSTR(D_MANAGE_FILE_SYSTEM)); WSContentStop(); } @@ -1100,6 +1300,23 @@ void UfsEditorUpload(void) { return; } + // recursively create folder(s) + char tmp[UFS_FILENAME_SIZE]; + char folder[UFS_FILENAME_SIZE] = ""; + strcpy(tmp, fname); + // zap file name off the end + folderOnly(tmp); + char *tf = strtok(tmp, "/"); + while(tf){ + if (*tf){ + strcat(folder, "/"); + strcat(folder, tf); + } + // we don;t care if it fails - it may already exist. + dfsp->mkdir(folder); + tf = strtok(nullptr, "/"); + } + File fp = dfsp->open(fname, "w"); if (!fp) { Web.upload_error = 1; @@ -1119,7 +1336,11 @@ void UfsEditorUpload(void) { fp.close(); - Webserver->sendHeader(F("Location"),F("/ufsu")); + // zap file name off the end + folderOnly(fname); + char t[20+UFS_FILENAME_SIZE] = "/ufsu?download="; + strcat(t, fname); + Webserver->sendHeader(F("Location"), t); Webserver->send(303); } @@ -1160,7 +1381,7 @@ bool Xdrv50(uint32_t function) { if (XdrvMailbox.index) { XdrvMailbox.index++; } else { - WSContentSend_PD(UFS_WEB_DIR, PSTR(D_MANAGE_FILE_SYSTEM)); + WSContentSend_PD(UFS_WEB_DIR, "/", PSTR(D_MANAGE_FILE_SYSTEM)); } } break; From 43bc81010fb7a042a402355214981b2879d2bb02 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 10 Jul 2023 16:03:32 +0200 Subject: [PATCH 062/150] Configuration file save and restore .xdrvsetXXX Configuration file save and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + tasmota/tasmota_support/settings.ino | 150 ++++++++++++++---- .../xdrv_01_9_webserver.ino | 27 ++-- .../xdrv_02_1_mqtt_file.ino | 11 +- 5 files changed, 142 insertions(+), 48 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9dbd0e879..b9ca8c07f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Changed - ESP32 shutter driver support up to 16 shutters (#18295) +- Configuration file save and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) ### Fixed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index a7cf38b11..e9daabd4a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -127,6 +127,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) +- Configuration file save and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) - Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index aba5b5cc6..981012033 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -217,6 +217,7 @@ const uint8_t CFG_ROTATES = 7; // Number of flash sectors used (handles upl uint32_t settings_location = EEPROM_LOCATION; uint32_t settings_crc32 = 0; +uint32_t settings_size = 0; uint8_t *settings_buffer = nullptr; uint8_t config_xor_on_set = CONFIG_FILE_XOR; @@ -375,22 +376,6 @@ void SettingsSaveAll(void) { * Settings backup and restore \*********************************************************************************************/ -void SettingsBufferFree(void) { - if (settings_buffer != nullptr) { - free(settings_buffer); - settings_buffer = nullptr; - } -} - -bool SettingsBufferAlloc(void) { - SettingsBufferFree(); - if (!(settings_buffer = (uint8_t *)malloc(sizeof(TSettings)))) { - AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_UPLOAD_ERR_2)); // Not enough (memory) space - return false; - } - return true; -} - String SettingsConfigFilename(void) { char filename[TOPSZ]; char hostname[sizeof(TasmotaGlobal.hostname)]; @@ -398,33 +383,117 @@ String SettingsConfigFilename(void) { return String(filename); } +void SettingsBufferXor(void) { + if (config_xor_on_set) { + uint32_t xor_index = (settings_size > sizeof(TSettings)) ? 18 : 2; + for (uint32_t i = xor_index; i < settings_size; i++) { + settings_buffer[i] ^= (config_xor_on_set +i); + } + } +} + +void SettingsBufferFree(void) { + if (settings_buffer != nullptr) { + free(settings_buffer); + settings_buffer = nullptr; + } + settings_size = 0; +} + +bool SettingsBufferAlloc(uint32_t upload_size = 0); +bool SettingsBufferAlloc(uint32_t upload_size) { + SettingsBufferFree(); + + settings_size = sizeof(TSettings); + if (upload_size >= sizeof(TSettings)) { + uint32_t mem = ESP_getFreeHeap(); + if ((mem - upload_size) < (8 * 1024)) { + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_UPLOAD_ERR_2)); // Not enough (memory) space + return false; + } + settings_size = upload_size; + } else { + +#ifdef USE_UFILESYS + char filename[14]; + for (uint32_t i = 0; i < 129; i++) { + snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), i); + uint32_t fsize = TfsFileSize(filename); + if (fsize) { + if (settings_size == sizeof(TSettings)) { + settings_size += 16; // Add tar header for total file size + } + fsize = ((fsize / 16) * 16) + 16; // Use 16-byte boundary + settings_size += (16 + fsize); // Tar header size is 16 bytes + } + } +#endif // USE_UFILESYS + + } + + if (!(settings_buffer = (uint8_t *)calloc(settings_size, 1))) { + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_APPLICATION D_UPLOAD_ERR_2)); // Not enough (memory) space + return false; + } + return true; +} + uint32_t SettingsConfigBackup(void) { if (!SettingsBufferAlloc()) { return 0; } + uint8_t *filebuf_ptr = settings_buffer; + +#ifdef USE_UFILESYS + if (settings_size > sizeof(TSettings)) { + snprintf_P((char*)filebuf_ptr, 14, PSTR(TASM_FILE_SETTINGS)); // /.settings + filebuf_ptr += 14; + *filebuf_ptr = settings_size; + filebuf_ptr++; + *filebuf_ptr = (settings_size >> 8); + filebuf_ptr++; + } +#endif // USE_UFILESYS + uint32_t cfg_crc32 = Settings->cfg_crc32; Settings->cfg_crc32 = GetSettingsCrc32(); // Calculate crc (again) as it might be wrong when savedata = 0 (#3918) - - uint32_t config_len = sizeof(TSettings); - memcpy(settings_buffer, Settings, config_len); - + memcpy(filebuf_ptr, Settings, sizeof(TSettings)); Settings->cfg_crc32 = cfg_crc32; // Restore crc in case savedata = 0 to make sure settings will be noted as changed - if (config_xor_on_set) { - for (uint32_t i = 2; i < config_len; i++) { - settings_buffer[i] ^= (config_xor_on_set +i); +#ifdef USE_UFILESYS + if (settings_size > sizeof(TSettings)) { + filebuf_ptr += sizeof(TSettings); + char filename[14]; + for (uint32_t i = 0; i < 129; i++) { + snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), i); // /.drvset012 + uint32_t fsize = TfsFileSize(filename); + if (fsize) { + memcpy(filebuf_ptr, filename, 14); + filebuf_ptr += 14; + *filebuf_ptr = fsize; + filebuf_ptr++; + *filebuf_ptr = (fsize >> 8); + filebuf_ptr++; + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup file %s (%d)"), (char*)filebuf_ptr -16, fsize); + TfsLoadFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); + filebuf_ptr += ((fsize / 16) * 16) + 16; + } } } - return config_len; +#endif // USE_UFILESYS + + SettingsBufferXor(); + return settings_size; } bool SettingsConfigRestore(void) { - uint32_t config_len = sizeof(TSettings); + SettingsBufferXor(); - if (config_xor_on_set) { - for (uint32_t i = 2; i < config_len; i++) { - settings_buffer[i] ^= (config_xor_on_set +i); - } +#ifdef USE_UFILESYS + if (settings_size > sizeof(TSettings)) { + settings_size -= 16; + memmove(settings_buffer, settings_buffer +16, settings_size); // Skip tar header } +#endif // USE_UFILESYS bool valid_settings = false; @@ -434,11 +503,11 @@ bool SettingsConfigRestore(void) { // uint16_t cfg_size; // 002 uint32_t buffer_size = settings_buffer[3] << 8 | settings_buffer[2]; if (buffer_version > 0x0606000A) { - // uint32_t cfg_crc32; // FFC + // uint32_t cfg_crc32; // FFC uint32_t buffer_crc32 = settings_buffer[4095] << 24 | settings_buffer[4094] << 16 | settings_buffer[4093] << 8 | settings_buffer[4092]; valid_settings = (GetCfgCrc32(settings_buffer, buffer_size -4) == buffer_crc32); } else { - // uint16_t cfg_crc; // 00E + // uint16_t cfg_crc; // 00E uint16_t buffer_crc16 = settings_buffer[15] << 8 | settings_buffer[14]; valid_settings = (GetCfgCrc16(settings_buffer, buffer_size) == buffer_crc16); } @@ -467,12 +536,27 @@ bool SettingsConfigRestore(void) { if (valid_settings) { SettingsDefaultSet2(); - memcpy((char*)Settings +16, settings_buffer +16, config_len -16); + memcpy((char*)Settings +16, settings_buffer +16, sizeof(TSettings) -16); Settings->version = buffer_version; // Restore version and auto upgrade after restart } - SettingsBufferFree(); +#ifdef USE_UFILESYS + if (settings_size > sizeof(TSettings)) { + uint8_t *filebuf_ptr = settings_buffer + sizeof(TSettings); + while ((filebuf_ptr - settings_buffer) < settings_size) { + filebuf_ptr += 14; + uint32_t fsize = *filebuf_ptr; + filebuf_ptr++; + fsize += *filebuf_ptr << 8; + filebuf_ptr++; + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); + TfsSaveFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); + filebuf_ptr += ((fsize / 16) * 16) + 16; + } + } +#endif // USE_UFILESYS + SettingsBufferFree(); return valid_settings; } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 1b4b130e2..ed9a4e9b7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -2236,7 +2236,7 @@ void HandleBackupConfiguration(void) AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_BACKUP_CONFIGURATION)); uint32_t config_len = SettingsConfigBackup(); - if (!config_len) { return; } + if (!config_len) { return; } // Unable to allocate 4k buffer WiFiClient myClient = Webserver->client(); Webserver->setContentLength(config_len); @@ -2731,14 +2731,8 @@ void HandleUploadLoop(void) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_UPLOAD D_FILE " %s"), upload.filename.c_str()); - if (UPL_SETTINGS == Web.upload_file_type) { - if (!SettingsBufferAlloc()) { - Web.upload_error = 2; // Not enough space - return; - } - } #ifdef USE_UFILESYS - else if (UPL_UFSFILE == Web.upload_file_type) { + if (UPL_UFSFILE == Web.upload_file_type) { if (!UfsUploadFileOpen(upload.filename.c_str())) { Web.upload_error = 2; return; @@ -2751,6 +2745,16 @@ void HandleUploadLoop(void) { else if (UPLOAD_FILE_WRITE == upload.status) { if (0 == upload.totalSize) { // First block received if (UPL_SETTINGS == Web.upload_file_type) { + uint32_t set_size = sizeof(TSettings); +#ifdef USE_UFILESYS + if (('s' == upload.buf[2]) && ('e' == upload.buf[3])) { // /.settings + set_size = upload.buf[14] + (upload.buf[15] << 8); + } +#endif // USE_UFILESYS + if (!SettingsBufferAlloc(set_size)) { + Web.upload_error = 2; // Not enough space + return; + } Web.config_block_count = 0; } #ifdef USE_WEB_FW_UPGRADE @@ -2820,7 +2824,7 @@ void HandleUploadLoop(void) { } // First block received if (UPL_SETTINGS == Web.upload_file_type) { - if (upload.currentSize > (sizeof(TSettings) - (Web.config_block_count * HTTP_UPLOAD_BUFLEN))) { + if (upload.currentSize > (settings_size - (Web.config_block_count * HTTP_UPLOAD_BUFLEN))) { Web.upload_error = 9; // File too large return; } @@ -3368,9 +3372,10 @@ int WebGetConfig(char *buffer) { if (http_code == HTTP_CODE_OK || http_code == HTTP_CODE_MOVED_PERMANENTLY) { WiFiClient *stream = http.getStreamPtr(); int len = http.getSize(); - if ((len <= sizeof(TSettings)) && SettingsBufferAlloc()) { +// if ((len <= sizeof(TSettings)) && SettingsBufferAlloc()) { + if (SettingsBufferAlloc(len)) { uint8_t *buff = settings_buffer; - if (len == -1) { len = sizeof(TSettings); } + if (len == -1) { len = settings_size; } while (http.connected() && (len > 0)) { size_t size = stream->available(); if (size) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino index 9f025caa0..10b0a588a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino @@ -96,9 +96,9 @@ uint32_t MqttFileUploadValidate(uint32_t rcv_id) { // Check buffer size if (UPL_SETTINGS == FMqtt.file_type) { - if (FMqtt.file_size > sizeof(TSettings)) { - return 2; // Settings supports max 4k size - } +// if (FMqtt.file_size > sizeof(TSettings)) { +// return 2; // Settings supports max 4k size +// } } else { // Check enough flash space for intermediate upload uint32_t head_room = (FlashWriteMaxSector() - FlashWriteStartSector()) * SPI_FLASH_SEC_SIZE; uint32_t rounded_size = (FMqtt.file_size + SPI_FLASH_SEC_SIZE -1) & (~(SPI_FLASH_SEC_SIZE - 1)); @@ -109,8 +109,11 @@ uint32_t MqttFileUploadValidate(uint32_t rcv_id) { // Init file_buffer if (UPL_SETTINGS == FMqtt.file_type) { - if (SettingsConfigBackup()) { +// if (SettingsConfigBackup()) { + if (SettingsBufferAlloc(FMqtt.file_size)) { FMqtt.file_buffer = settings_buffer; + } else { + return 2; // Settings supports max size } } else { From 7404b8ddbb8b5c2e863d620a96936a2555f7b947 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 10 Jul 2023 17:50:04 +0200 Subject: [PATCH 063/150] Berry `_class` can be used in `static var` initialization code (#19088) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_code.c | 7 + lib/libesp32/berry/src/be_parser.c | 18 ++ lib/libesp32/berry/tests/class_static.be | 3 +- .../src/embedded/rule_matcher.be | 10 +- .../solidified_crypto_spake2p_matter.h | 227 +++++++++--------- .../src/solidify/solidified_mqtt.h | 7 +- 7 files changed, 151 insertions(+), 122 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b9ca8c07f..cdac9dd9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) - Matter mini-profiler (#19075) +- Berry `_class` can be used in `static var` initialization code ### Breaking Changed diff --git a/lib/libesp32/berry/src/be_code.c b/lib/libesp32/berry/src/be_code.c index 27c3b40e8..ac4208a01 100644 --- a/lib/libesp32/berry/src/be_code.c +++ b/lib/libesp32/berry/src/be_code.c @@ -95,6 +95,13 @@ static bbool code_move(bfuncinfo *finfo, int a, int b) return btrue; } } + if (!isK(b)) { /* OP_MOVE */ + /* check if the previous OP_MOVE is not identical */ + binstruction mov = ISET_OP(OP_MOVE) | ISET_RA(a) | ISET_RKB(b) | ISET_RKC(0); + if (mov == *i) { + return btrue; /* previous instruction is the same move, remove duplicate */ + } + } } if (isK(b)) { codeABx(finfo, OP_LDCONST, a, b & 0xFF); diff --git a/lib/libesp32/berry/src/be_parser.c b/lib/libesp32/berry/src/be_parser.c index 57b2ffa7f..3afedf41c 100644 --- a/lib/libesp32/berry/src/be_parser.c +++ b/lib/libesp32/berry/src/be_parser.c @@ -1566,7 +1566,25 @@ static void class_stmt(bparser *parser) new_var(parser, name, &e); be_code_class(parser->finfo, &e, c); class_inherit(parser, &e); + + bblockinfo binfo; + begin_block(parser->finfo, &binfo, 0); + + bstring *class_str = parser_newstr(parser, "_class"); /* we always define `_class` local variable */ + if (e.type == ETLOCAL) { + bexpdesc e1; /* if inline class, we add a second local variable for _class */ + init_exp(&e1, ETLOCAL, 0); + e1.v.idx = new_localvar(parser, class_str); + be_code_setvar(parser->finfo, &e1, &e, 1); + } else { /* if global class, we just reuse the newly created class in the register */ + init_exp(&e, ETLOCAL, 0); + e.v.idx = new_localvar(parser, class_str); + } + begin_varinfo(parser, class_str); + class_block(parser, c, &e); + end_block(parser); + be_class_compress(parser->vm, c); /* compress class size */ match_token(parser, KeyEnd); /* skip 'end' */ } else { diff --git a/lib/libesp32/berry/tests/class_static.be b/lib/libesp32/berry/tests/class_static.be index 1b3d0f928..d972f5ef3 100644 --- a/lib/libesp32/berry/tests/class_static.be +++ b/lib/libesp32/berry/tests/class_static.be @@ -140,4 +140,5 @@ assert(classname(a) == 'A') assert(classname(b) == 'B') assert(A.B.f() == 1) assert(b.g() == 2) -assert(super(B) == nil) +assert(super(b) == nil) +assert(super(A.B) == nil) diff --git a/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be b/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be index 218cc6f53..79ed625fc 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be +++ b/lib/libesp32/berry_tasmota/src/embedded/rule_matcher.be @@ -1,11 +1,11 @@ #- Native code used for testing and code solidification -# #- Do not use it directly -# -#@ solidify:Rule_Matcher_Key -#@ solidify:Rule_Matcher_Wildcard -#@ solidify:Rule_Matcher_Operator -#@ solidify:Rule_Matcher_Array -#@ solidify:Rule_Matcher_AND_List +#@ solidify:Rule_Matcher.Rule_Matcher_Key +#@ solidify:Rule_Matcher.Rule_Matcher_Wildcard +#@ solidify:Rule_Matcher.Rule_Matcher_Operator +#@ solidify:Rule_Matcher.Rule_Matcher_Array +#@ solidify:Rule_Matcher.Rule_Matcher_AND_List #@ solidify:Rule_Matcher diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_crypto_spake2p_matter.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_crypto_spake2p_matter.h index 5d430efaa..ea49d8ed8 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_crypto_spake2p_matter.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_crypto_spake2p_matter.h @@ -239,121 +239,122 @@ be_local_closure(SPAKE2P_Matter_compute_TT_hash, /* name */ }), be_str_weak(compute_TT_hash), &be_const_str_solidified, - ( &(const binstruction[114]) { /* code */ + ( &(const binstruction[115]) { /* code */ 0x58080000, // 0000 LDCONST R2 K0 0xB4000000, // 0001 CLASS K0 - 0xA40E0200, // 0002 IMPORT R3 K1 - 0x5C100400, // 0003 MOVE R4 R2 - 0x7C100000, // 0004 CALL R4 0 - 0x8C140902, // 0005 GETMET R5 R4 K2 - 0x881C0103, // 0006 GETMBR R7 R0 K3 - 0x7C140400, // 0007 CALL R5 2 - 0x8C140902, // 0008 GETMET R5 R4 K2 - 0x881C0104, // 0009 GETMBR R7 R0 K4 - 0x7C140400, // 000A CALL R5 2 - 0x8C140902, // 000B GETMET R5 R4 K2 - 0x881C0105, // 000C GETMBR R7 R0 K5 - 0x7C140400, // 000D CALL R5 2 - 0x8C140902, // 000E GETMET R5 R4 K2 - 0x881C0106, // 000F GETMBR R7 R0 K6 - 0x7C140400, // 0010 CALL R5 2 - 0x8C140902, // 0011 GETMET R5 R4 K2 - 0x881C0107, // 0012 GETMBR R7 R0 K7 - 0x7C140400, // 0013 CALL R5 2 - 0x8C140902, // 0014 GETMET R5 R4 K2 - 0x881C0108, // 0015 GETMBR R7 R0 K8 - 0x7C140400, // 0016 CALL R5 2 - 0x8C140902, // 0017 GETMET R5 R4 K2 - 0x881C0109, // 0018 GETMBR R7 R0 K9 - 0x7C140400, // 0019 CALL R5 2 - 0x8C140902, // 001A GETMET R5 R4 K2 - 0x881C010A, // 001B GETMBR R7 R0 K10 - 0x7C140400, // 001C CALL R5 2 - 0x8C140902, // 001D GETMET R5 R4 K2 - 0x881C010B, // 001E GETMBR R7 R0 K11 - 0x7C140400, // 001F CALL R5 2 - 0x8C140902, // 0020 GETMET R5 R4 K2 - 0x881C010C, // 0021 GETMBR R7 R0 K12 - 0x7C140400, // 0022 CALL R5 2 - 0x8C14090E, // 0023 GETMET R5 R4 K14 - 0x7C140200, // 0024 CALL R5 1 - 0x90021A05, // 0025 SETMBR R0 K13 R5 - 0x7806000A, // 0026 JMPF R1 #0032 - 0x5416000F, // 0027 LDINT R5 16 - 0x541A001E, // 0028 LDINT R6 31 - 0x40140A06, // 0029 CONNECT R5 R5 R6 - 0x8818010D, // 002A GETMBR R6 R0 K13 - 0x94140C05, // 002B GETIDX R5 R6 R5 - 0x90021E05, // 002C SETMBR R0 K15 R5 - 0x5416000E, // 002D LDINT R5 15 - 0x40162005, // 002E CONNECT R5 K16 R5 - 0x8818010D, // 002F GETMBR R6 R0 K13 - 0x94140C05, // 0030 GETIDX R5 R6 R5 - 0x90021A05, // 0031 SETMBR R0 K13 R5 - 0x8C140711, // 0032 GETMET R5 R3 K17 - 0x7C140200, // 0033 CALL R5 1 - 0x8C180B12, // 0034 GETMET R6 R5 K18 - 0x8820010D, // 0035 GETMBR R8 R0 K13 - 0x60240015, // 0036 GETGBL R9 G21 - 0x7C240000, // 0037 CALL R9 0 - 0x60280015, // 0038 GETGBL R10 G21 - 0x7C280000, // 0039 CALL R10 0 - 0x8C281513, // 003A GETMET R10 R10 K19 - 0x58300014, // 003B LDCONST R12 K20 - 0x7C280400, // 003C CALL R10 2 - 0x542E003F, // 003D LDINT R11 64 - 0x7C180A00, // 003E CALL R6 5 - 0x78060003, // 003F JMPF R1 #0044 - 0x541E000E, // 0040 LDINT R7 15 - 0x401E2007, // 0041 CONNECT R7 K16 R7 - 0x941C0C07, // 0042 GETIDX R7 R6 R7 - 0x70020002, // 0043 JMP #0047 - 0x541E001E, // 0044 LDINT R7 31 - 0x401E2007, // 0045 CONNECT R7 K16 R7 - 0x941C0C07, // 0046 GETIDX R7 R6 R7 - 0x90022A07, // 0047 SETMBR R0 K21 R7 - 0x78060004, // 0048 JMPF R1 #004E - 0x541E000F, // 0049 LDINT R7 16 - 0x5422001E, // 004A LDINT R8 31 - 0x401C0E08, // 004B CONNECT R7 R7 R8 - 0x941C0C07, // 004C GETIDX R7 R6 R7 - 0x70020003, // 004D JMP #0052 - 0x541E001F, // 004E LDINT R7 32 - 0x5422003E, // 004F LDINT R8 63 - 0x401C0E08, // 0050 CONNECT R7 R7 R8 - 0x941C0C07, // 0051 GETIDX R7 R6 R7 - 0x90022C07, // 0052 SETMBR R0 K22 R7 - 0x8C1C0B12, // 0053 GETMET R7 R5 K18 - 0x8824010D, // 0054 GETMBR R9 R0 K13 - 0x60280015, // 0055 GETGBL R10 G21 - 0x7C280000, // 0056 CALL R10 0 - 0x602C0015, // 0057 GETGBL R11 G21 - 0x7C2C0000, // 0058 CALL R11 0 - 0x8C2C1713, // 0059 GETMET R11 R11 K19 - 0x58340018, // 005A LDCONST R13 K24 - 0x7C2C0400, // 005B CALL R11 2 - 0x5432001F, // 005C LDINT R12 32 - 0x7C1C0A00, // 005D CALL R7 5 - 0x90022E07, // 005E SETMBR R0 K23 R7 - 0x8C1C071A, // 005F GETMET R7 R3 K26 - 0x88240115, // 0060 GETMBR R9 R0 K21 - 0x7C1C0400, // 0061 CALL R7 2 - 0x8C1C0F1B, // 0062 GETMET R7 R7 K27 - 0x88240109, // 0063 GETMBR R9 R0 K9 - 0x7C1C0400, // 0064 CALL R7 2 - 0x8C1C0F0E, // 0065 GETMET R7 R7 K14 - 0x7C1C0200, // 0066 CALL R7 1 - 0x90023207, // 0067 SETMBR R0 K25 R7 - 0x8C1C071A, // 0068 GETMET R7 R3 K26 - 0x88240116, // 0069 GETMBR R9 R0 K22 - 0x7C1C0400, // 006A CALL R7 2 - 0x8C1C0F1B, // 006B GETMET R7 R7 K27 - 0x88240108, // 006C GETMBR R9 R0 K8 - 0x7C1C0400, // 006D CALL R7 2 - 0x8C1C0F0E, // 006E GETMET R7 R7 K14 - 0x7C1C0200, // 006F CALL R7 1 - 0x90023807, // 0070 SETMBR R0 K28 R7 - 0x80000000, // 0071 RET 0 + 0x5C0C0400, // 0002 MOVE R3 R2 + 0xA40E0200, // 0003 IMPORT R3 K1 + 0x5C100400, // 0004 MOVE R4 R2 + 0x7C100000, // 0005 CALL R4 0 + 0x8C140902, // 0006 GETMET R5 R4 K2 + 0x881C0103, // 0007 GETMBR R7 R0 K3 + 0x7C140400, // 0008 CALL R5 2 + 0x8C140902, // 0009 GETMET R5 R4 K2 + 0x881C0104, // 000A GETMBR R7 R0 K4 + 0x7C140400, // 000B CALL R5 2 + 0x8C140902, // 000C GETMET R5 R4 K2 + 0x881C0105, // 000D GETMBR R7 R0 K5 + 0x7C140400, // 000E CALL R5 2 + 0x8C140902, // 000F GETMET R5 R4 K2 + 0x881C0106, // 0010 GETMBR R7 R0 K6 + 0x7C140400, // 0011 CALL R5 2 + 0x8C140902, // 0012 GETMET R5 R4 K2 + 0x881C0107, // 0013 GETMBR R7 R0 K7 + 0x7C140400, // 0014 CALL R5 2 + 0x8C140902, // 0015 GETMET R5 R4 K2 + 0x881C0108, // 0016 GETMBR R7 R0 K8 + 0x7C140400, // 0017 CALL R5 2 + 0x8C140902, // 0018 GETMET R5 R4 K2 + 0x881C0109, // 0019 GETMBR R7 R0 K9 + 0x7C140400, // 001A CALL R5 2 + 0x8C140902, // 001B GETMET R5 R4 K2 + 0x881C010A, // 001C GETMBR R7 R0 K10 + 0x7C140400, // 001D CALL R5 2 + 0x8C140902, // 001E GETMET R5 R4 K2 + 0x881C010B, // 001F GETMBR R7 R0 K11 + 0x7C140400, // 0020 CALL R5 2 + 0x8C140902, // 0021 GETMET R5 R4 K2 + 0x881C010C, // 0022 GETMBR R7 R0 K12 + 0x7C140400, // 0023 CALL R5 2 + 0x8C14090E, // 0024 GETMET R5 R4 K14 + 0x7C140200, // 0025 CALL R5 1 + 0x90021A05, // 0026 SETMBR R0 K13 R5 + 0x7806000A, // 0027 JMPF R1 #0033 + 0x5416000F, // 0028 LDINT R5 16 + 0x541A001E, // 0029 LDINT R6 31 + 0x40140A06, // 002A CONNECT R5 R5 R6 + 0x8818010D, // 002B GETMBR R6 R0 K13 + 0x94140C05, // 002C GETIDX R5 R6 R5 + 0x90021E05, // 002D SETMBR R0 K15 R5 + 0x5416000E, // 002E LDINT R5 15 + 0x40162005, // 002F CONNECT R5 K16 R5 + 0x8818010D, // 0030 GETMBR R6 R0 K13 + 0x94140C05, // 0031 GETIDX R5 R6 R5 + 0x90021A05, // 0032 SETMBR R0 K13 R5 + 0x8C140711, // 0033 GETMET R5 R3 K17 + 0x7C140200, // 0034 CALL R5 1 + 0x8C180B12, // 0035 GETMET R6 R5 K18 + 0x8820010D, // 0036 GETMBR R8 R0 K13 + 0x60240015, // 0037 GETGBL R9 G21 + 0x7C240000, // 0038 CALL R9 0 + 0x60280015, // 0039 GETGBL R10 G21 + 0x7C280000, // 003A CALL R10 0 + 0x8C281513, // 003B GETMET R10 R10 K19 + 0x58300014, // 003C LDCONST R12 K20 + 0x7C280400, // 003D CALL R10 2 + 0x542E003F, // 003E LDINT R11 64 + 0x7C180A00, // 003F CALL R6 5 + 0x78060003, // 0040 JMPF R1 #0045 + 0x541E000E, // 0041 LDINT R7 15 + 0x401E2007, // 0042 CONNECT R7 K16 R7 + 0x941C0C07, // 0043 GETIDX R7 R6 R7 + 0x70020002, // 0044 JMP #0048 + 0x541E001E, // 0045 LDINT R7 31 + 0x401E2007, // 0046 CONNECT R7 K16 R7 + 0x941C0C07, // 0047 GETIDX R7 R6 R7 + 0x90022A07, // 0048 SETMBR R0 K21 R7 + 0x78060004, // 0049 JMPF R1 #004F + 0x541E000F, // 004A LDINT R7 16 + 0x5422001E, // 004B LDINT R8 31 + 0x401C0E08, // 004C CONNECT R7 R7 R8 + 0x941C0C07, // 004D GETIDX R7 R6 R7 + 0x70020003, // 004E JMP #0053 + 0x541E001F, // 004F LDINT R7 32 + 0x5422003E, // 0050 LDINT R8 63 + 0x401C0E08, // 0051 CONNECT R7 R7 R8 + 0x941C0C07, // 0052 GETIDX R7 R6 R7 + 0x90022C07, // 0053 SETMBR R0 K22 R7 + 0x8C1C0B12, // 0054 GETMET R7 R5 K18 + 0x8824010D, // 0055 GETMBR R9 R0 K13 + 0x60280015, // 0056 GETGBL R10 G21 + 0x7C280000, // 0057 CALL R10 0 + 0x602C0015, // 0058 GETGBL R11 G21 + 0x7C2C0000, // 0059 CALL R11 0 + 0x8C2C1713, // 005A GETMET R11 R11 K19 + 0x58340018, // 005B LDCONST R13 K24 + 0x7C2C0400, // 005C CALL R11 2 + 0x5432001F, // 005D LDINT R12 32 + 0x7C1C0A00, // 005E CALL R7 5 + 0x90022E07, // 005F SETMBR R0 K23 R7 + 0x8C1C071A, // 0060 GETMET R7 R3 K26 + 0x88240115, // 0061 GETMBR R9 R0 K21 + 0x7C1C0400, // 0062 CALL R7 2 + 0x8C1C0F1B, // 0063 GETMET R7 R7 K27 + 0x88240109, // 0064 GETMBR R9 R0 K9 + 0x7C1C0400, // 0065 CALL R7 2 + 0x8C1C0F0E, // 0066 GETMET R7 R7 K14 + 0x7C1C0200, // 0067 CALL R7 1 + 0x90023207, // 0068 SETMBR R0 K25 R7 + 0x8C1C071A, // 0069 GETMET R7 R3 K26 + 0x88240116, // 006A GETMBR R9 R0 K22 + 0x7C1C0400, // 006B CALL R7 2 + 0x8C1C0F1B, // 006C GETMET R7 R7 K27 + 0x88240108, // 006D GETMBR R9 R0 K8 + 0x7C1C0400, // 006E CALL R7 2 + 0x8C1C0F0E, // 006F GETMET R7 R7 K14 + 0x7C1C0200, // 0070 CALL R7 1 + 0x90023807, // 0071 SETMBR R0 K28 R7 + 0x80000000, // 0072 RET 0 }) ) ); diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h index ee62524d6..33744dd36 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_mqtt.h @@ -445,7 +445,7 @@ be_local_class(mqtt_listener, ********************************************************************/ be_local_closure(MQTT_mqtt_listener_class, /* name */ be_nested_proto( - 2, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -458,10 +458,11 @@ be_local_closure(MQTT_mqtt_listener_class, /* name */ }), &be_const_str_mqtt_listener_class, &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ + ( &(const binstruction[ 4]) { /* code */ 0x58040000, // 0000 LDCONST R1 K0 0xB4000000, // 0001 CLASS K0 - 0x80040200, // 0002 RET 1 R1 + 0x5C080200, // 0002 MOVE R2 R1 + 0x80040200, // 0003 RET 1 R1 }) ) ); From 258976c014ce84e26e9abcb64adcea4d6ea5b7ab Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 10 Jul 2023 18:14:23 +0200 Subject: [PATCH 064/150] Verify correct functionality --- .../tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 7 ++++--- .../tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino | 15 +++++---------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index ed9a4e9b7..0b6db6671 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -2236,7 +2236,7 @@ void HandleBackupConfiguration(void) AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_HTTP D_BACKUP_CONFIGURATION)); uint32_t config_len = SettingsConfigBackup(); - if (!config_len) { return; } // Unable to allocate 4k buffer + if (!config_len) { return; } // Unable to allocate buffer WiFiClient myClient = Webserver->client(); Webserver->setContentLength(config_len); @@ -3372,10 +3372,11 @@ int WebGetConfig(char *buffer) { if (http_code == HTTP_CODE_OK || http_code == HTTP_CODE_MOVED_PERMANENTLY) { WiFiClient *stream = http.getStreamPtr(); int len = http.getSize(); -// if ((len <= sizeof(TSettings)) && SettingsBufferAlloc()) { + if (len <= sizeof(TSettings)) { + len = sizeof(TSettings); + } if (SettingsBufferAlloc(len)) { uint8_t *buff = settings_buffer; - if (len == -1) { len = settings_size; } while (http.connected() && (len > 0)) { size_t size = stream->available(); if (size) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino index 10b0a588a..efa6ff202 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_02_1_mqtt_file.ino @@ -96,9 +96,9 @@ uint32_t MqttFileUploadValidate(uint32_t rcv_id) { // Check buffer size if (UPL_SETTINGS == FMqtt.file_type) { -// if (FMqtt.file_size > sizeof(TSettings)) { -// return 2; // Settings supports max 4k size -// } + if (!SettingsBufferAlloc(FMqtt.file_size)) { + return 2; // Settings supports max size + } } else { // Check enough flash space for intermediate upload uint32_t head_room = (FlashWriteMaxSector() - FlashWriteStartSector()) * SPI_FLASH_SEC_SIZE; uint32_t rounded_size = (FMqtt.file_size + SPI_FLASH_SEC_SIZE -1) & (~(SPI_FLASH_SEC_SIZE - 1)); @@ -109,12 +109,7 @@ uint32_t MqttFileUploadValidate(uint32_t rcv_id) { // Init file_buffer if (UPL_SETTINGS == FMqtt.file_type) { -// if (SettingsConfigBackup()) { - if (SettingsBufferAlloc(FMqtt.file_size)) { - FMqtt.file_buffer = settings_buffer; - } else { - return 2; // Settings supports max size - } + FMqtt.file_buffer = settings_buffer; } else { if (UPL_TASMOTA == FMqtt.file_type) { @@ -347,7 +342,7 @@ uint32_t MqttFileDownloadValidate(void) { // Init file_buffer if (UPL_SETTINGS == FMqtt.file_type) { uint32_t len = SettingsConfigBackup(); - if (!len) { return 2; } + if (!len) { return 2; } // Unable to allocate buffer FMqtt.file_type = UPL_SETTINGS; FMqtt.file_buffer = settings_buffer; From cefd42c820ba54da24dc3443fc85614b42153fc9 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 10 Jul 2023 18:18:42 +0200 Subject: [PATCH 065/150] Update changelogs --- CHANGELOG.md | 4 ++-- RELEASENOTES.md | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdac9dd9f..318665586 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,13 +7,13 @@ All notable changes to this project will be documented in this file. ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) - Matter mini-profiler (#19075) -- Berry `_class` can be used in `static var` initialization code +- Berry `_class` can be used in `static var` initialization code (#19088) ### Breaking Changed ### Changed - ESP32 shutter driver support up to 16 shutters (#18295) -- Configuration file save and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) +- Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) ### Fixed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index e9daabd4a..abaf0b4fd 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,7 +116,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) -- Berry added `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) +- Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) +- Berry `_class` can be used in `static var` initialization code [#19088](https://github.com/arendst/Tasmota/issues/19088) - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Matter mini-profiler [#19075](https://github.com/arendst/Tasmota/issues/19075) @@ -127,7 +128,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) -- Configuration file save and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) +- Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) - Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) From 8c31acd3769766ba8528845c38baeb91ef2b5f65 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Tue, 11 Jul 2023 08:21:09 +0200 Subject: [PATCH 066/150] Berry minor fixes from upstream (#19091) --- lib/libesp32/berry/src/be_vector.h | 1 - lib/libesp32/berry/src/berry.h | 15 +++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/libesp32/berry/src/be_vector.h b/lib/libesp32/berry/src/be_vector.h index 3991986ca..15f399cc6 100644 --- a/lib/libesp32/berry/src/be_vector.h +++ b/lib/libesp32/berry/src/be_vector.h @@ -38,7 +38,6 @@ void be_vector_remove_end(bvector *vector); void be_vector_resize(bvm *vm, bvector *vector, int count); void be_vector_clear(bvector *vector); void* be_vector_release(bvm *vm, bvector *vector); -void* be_vector_release_32(bvm *vm, bvector *vector); /* specialized call for 32 bits aligned accesses */ int be_nextsize(int value); #endif diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index 206d35437..f6c6eddb8 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -478,15 +478,18 @@ typedef bclass_ptr bclass_array[]; #endif /** - * @def PROTO_RUNTIME_BLOCK + * @def BE_DEBUG_SOURCE_FILE * @brief conditional block in bproto depending on compilation options * */ -#if BE_SOURCE_FILE +#if BE_DEBUG_SOURCE_FILE #define PROTO_SOURCE_FILE(n) \ - ((bstring*) _source), /**< source */ + ((bstring*) n), /**< source */ + #define PROTO_SOURCE_FILE_STR(n) \ + be_local_const_str(n##_str_source), /**< source */ #else #define PROTO_SOURCE_FILE(n) + #define PROTO_SOURCE_FILE_STR(n) #endif /** @@ -496,8 +499,8 @@ typedef bclass_ptr bclass_array[]; */ #if BE_DEBUG_RUNTIME_INFO #define PROTO_RUNTIME_BLOCK \ - NULL, /**< varinfo */ \ - 0, /**< nvarinfo */ + NULL, /**< lineinfo */ \ + 0, /**< nlineinfo */ #else #define PROTO_RUNTIME_BLOCK #endif @@ -538,7 +541,7 @@ typedef bclass_ptr bclass_array[]; BE_IIF(_is_subproto)((struct bproto**)&_name##_subproto,NULL), /**< bproto **ptab */ \ (binstruction*) &_name##_code, /**< code */ \ be_local_const_str(_name##_str_name), /**< name */ \ - be_local_const_str(_name##_str_source), /**< source */ \ + PROTO_SOURCE_FILE_STR(_name) /**< source */ \ PROTO_RUNTIME_BLOCK /**< */ \ PROTO_VAR_INFO_BLOCK /**< */ \ } From 889e6ea54d8541ba713eb305d7d15d7695abc5e5 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 11 Jul 2023 16:12:04 +0200 Subject: [PATCH 067/150] Fix driver config restore --- tasmota/include/tasmota.h | 2 +- tasmota/tasmota_support/settings.ino | 24 ++++++++++++------- .../xdrv_03_esp32_energy.ino | 11 +++++++++ .../xdrv_122_file_settings_demo.ino | 16 +++++++++++-- .../xdrv_27_esp32_shutter.ino | 18 +++++++++++--- .../xdrv_86_esp32_sonoff_spm.ino | 11 +++++++++ .../xdrv_87_esp32_sonoff_tm1621.ino | 11 +++++++++ 7 files changed, 79 insertions(+), 14 deletions(-) diff --git a/tasmota/include/tasmota.h b/tasmota/include/tasmota.h index 60ce13c13..b37be129a 100644 --- a/tasmota/include/tasmota.h +++ b/tasmota/include/tasmota.h @@ -428,7 +428,7 @@ enum LightTypes { LT_BASIC, LT_PWM1, LT_PWM2, LT_PWM3, LT_PWM4, LT enum XsnsFunctions { FUNC_SETTINGS_OVERRIDE, FUNC_SETUP_RING1, FUNC_SETUP_RING2, FUNC_PRE_INIT, FUNC_INIT, FUNC_LOOP, FUNC_SLEEP_LOOP, FUNC_EVERY_50_MSECOND, FUNC_EVERY_100_MSECOND, FUNC_EVERY_200_MSECOND, FUNC_EVERY_250_MSECOND, FUNC_EVERY_SECOND, - FUNC_RESET_SETTINGS, FUNC_SAVE_SETTINGS, FUNC_SAVE_AT_MIDNIGHT, FUNC_SAVE_BEFORE_RESTART, FUNC_INTERRUPT_STOP, FUNC_INTERRUPT_START, + FUNC_RESET_SETTINGS, FUNC_RESTORE_SETTINGS, FUNC_SAVE_SETTINGS, FUNC_SAVE_AT_MIDNIGHT, FUNC_SAVE_BEFORE_RESTART, FUNC_INTERRUPT_STOP, FUNC_INTERRUPT_START, FUNC_AFTER_TELEPERIOD, FUNC_JSON_APPEND, FUNC_WEB_SENSOR, FUNC_WEB_COL_SENSOR, FUNC_MQTT_SUBSCRIBE, FUNC_MQTT_INIT, FUNC_SET_POWER, FUNC_SHOW_SENSOR, FUNC_ANY_KEY, FUNC_LED_LINK, diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 981012033..c4e56179c 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -544,14 +544,22 @@ bool SettingsConfigRestore(void) { if (settings_size > sizeof(TSettings)) { uint8_t *filebuf_ptr = settings_buffer + sizeof(TSettings); while ((filebuf_ptr - settings_buffer) < settings_size) { - filebuf_ptr += 14; - uint32_t fsize = *filebuf_ptr; - filebuf_ptr++; - fsize += *filebuf_ptr << 8; - filebuf_ptr++; - AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); - TfsSaveFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); - filebuf_ptr += ((fsize / 16) * 16) + 16; + uint32_t driver = atoi((const char*)filebuf_ptr +8); // /.drvset012 = 12 + uint32_t fsize = filebuf_ptr[15] << 8 | filebuf_ptr[14]; // Tar header settings size + filebuf_ptr += 16; // Start of file settings + uint32_t buffer_crc32 = filebuf_ptr[3] << 24 | filebuf_ptr[2] << 16 | filebuf_ptr[1] << 8 | filebuf_ptr[0]; + bool valid_buffer = (GetCfgCrc32(filebuf_ptr +4, fsize -4) == buffer_crc32); + if (valid_buffer) { + XdrvMailbox.data = (char*)filebuf_ptr; + XdrvMailbox.index = fsize; + if (XdrvCallDriver(driver, FUNC_RESTORE_SETTINGS)) { + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore driver %d"), driver); + } else { + AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); + TfsSaveFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); + } + } + filebuf_ptr += ((fsize / 16) * 16) + 16; // Next tar header or eof } } #endif // USE_UFILESYS diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index 7662bc5af..b539c9350 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -372,6 +372,14 @@ void EnergySettingsSave(void) { #endif // USE_UFILESYS } +bool EnergySettingsRestore(void) { +#ifdef USE_UFILESYS + uint32_t max_size = (XdrvMailbox.index > sizeof(tEnergySettings)) ? sizeof(tEnergySettings) : XdrvMailbox.index; + memcpy((uint8_t*)&Energy->Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + return true; +#endif // USE_UFILESYS +} + /********************************************************************************************/ const uint16_t GUISZ = 600; // Max number of characters in WebEnergyFmt string @@ -1764,6 +1772,9 @@ bool Xdrv03(uint32_t function) case FUNC_RESET_SETTINGS: EnergySettingsLoad(1); break; + case FUNC_RESTORE_SETTINGS: + result = EnergySettingsRestore(); + break; case FUNC_SAVE_SETTINGS: EnergySettingsSave(); EnergyRtcSettingsSave(); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino index fb6c2eff8..e064c6941 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino @@ -34,7 +34,7 @@ #define DRV_DEMO_MAX_DRV_TEXT 16 -const uint32_t DRV_DEMO_VERSION = 0x01010101; // Latest driver version (See settings deltas below) +const uint32_t DRV_DEMO_VERSION = 0x0101; // Latest driver version (See settings deltas below) // Demo command line commands const char kDrvDemoCommands[] PROGMEM = "Drv|" // Prefix @@ -46,7 +46,8 @@ void (* const DrvDemoCommand[])(void) PROGMEM = { // Global structure containing driver saved variables struct { uint32_t crc32; // To detect file changes - uint32_t version; // To detect driver function changes + uint16_t version; // To detect driver function changes + uint16_t spare; char drv_text[DRV_DEMO_MAX_DRV_TEXT -1][10]; } DrvDemoSettings; @@ -155,6 +156,14 @@ void DrvDemoSettingsSave(void) { #endif // USE_UFILESYS } +bool DrvDemoSettingsRestore(void) { +#ifdef USE_UFILESYS + uint32_t max_size = (XdrvMailbox.index > sizeof(DrvDemoSettings)) ? sizeof(DrvDemoSettings) : XdrvMailbox.index; + memcpy((uint8_t*)&DrvDemoSettings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + return true; +#endif // USE_UFILESYS +} + /*********************************************************************************************\ * Interface \*********************************************************************************************/ @@ -166,6 +175,9 @@ bool Xdrv122(uint32_t function) { case FUNC_RESET_SETTINGS: DrvDemoSettingsLoad(1); break; + case FUNC_RESTORE_SETTINGS: + result = DrvDemoSettingsRestore(); + break; case FUNC_SAVE_SETTINGS: DrvDemoSettingsSave(); break; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index ca10aa92a..5e489e29a 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -53,7 +53,7 @@ const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM = "
    %s%s
    " "
    "; -const uint32_t SHUTTER_VERSION = 0x01010100; // Latest driver version (See settings deltas below) +const uint32_t SHUTTER_VERSION = 0x0100; // Latest driver version (See settings deltas below) typedef struct { // depreciated 2023-04-28 int8_t pos; @@ -86,7 +86,8 @@ typedef struct { // Global structure containing shutter saved variables struct SHUTTERSETTINGS { uint32_t crc32; // To detect file changes - uint32_t version; // To detect driver function changes + uint16_t version; // To detect driver function changes + uint16_t spare; uint8_t shutter_accuracy; uint8_t shutter_mode; uint16_t shutter_motorstop; @@ -340,6 +341,14 @@ void ShutterSettingsSave(void) { } } +bool ShutterSettingsRestore(void) { +#ifdef USE_UFILESYS + uint32_t max_size = (XdrvMailbox.index > sizeof(ShutterSettings)) ? sizeof(ShutterSettings) : XdrvMailbox.index; + memcpy((uint8_t*)&ShutterSettings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + return true; +#endif // USE_UFILESYS +} + uint8_t ShutterGetRelayNoFromBitfield(power_t number) { int position = 0; while (number != 0) { @@ -2258,9 +2267,12 @@ bool Xdrv27(uint32_t function) char stemp1[10]; power_t save_powermatrix; switch (function) { + case FUNC_RESTORE_SETTINGS: + result = ShutterSettingsRestore(); + break; case FUNC_SAVE_SETTINGS: ShutterSettingsSave(); - break; + break; case FUNC_PRE_INIT: ShutterSettingsLoad(0); ShutterInit(); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino index 5a3134762..6b1a7a03c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino @@ -373,6 +373,14 @@ void Xdrv86SettingsSave(void) { #endif // USE_UFILESYS } +bool Xdrv86SettingsRestore(void) { +#ifdef USE_UFILESYS + uint32_t max_size = (XdrvMailbox.index > sizeof(tSspmSettings)) ? sizeof(tSspmSettings) : XdrvMailbox.index; + memcpy((uint8_t*)&Sspm->Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + return true; +#endif // USE_UFILESYS +} + /*********************************************************************************************/ uint32_t SSMPGetModuleId(uint32_t module) { @@ -2650,6 +2658,9 @@ bool Xdrv86(uint32_t function) { case FUNC_RESET_SETTINGS: Xdrv86SettingsLoad(1); break; + case FUNC_RESTORE_SETTINGS: + result = Xdrv86SettingsRestore(); + break; case FUNC_SAVE_SETTINGS: Xdrv86SettingsSave(); break; diff --git a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino index 090dfaa90..20cc1f986 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino @@ -162,6 +162,14 @@ void Xdrv87SettingsSave(void) { #endif // USE_UFILESYS } +bool Xdrv87SettingsRestore(void) { +#ifdef USE_UFILESYS + uint32_t max_size = (XdrvMailbox.index > sizeof(tXdrv87Settings)) ? sizeof(tXdrv87Settings) : XdrvMailbox.index; + memcpy((uint8_t*)&Xdrv87Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + return true; +#endif // USE_UFILESYS +} + /*********************************************************************************************/ void TM1621StopSequence(void) { @@ -585,6 +593,9 @@ bool Xdrv87(uint32_t function) { case FUNC_RESET_SETTINGS: Xdrv87SettingsLoad(1); break; + case FUNC_RESTORE_SETTINGS: + result = Xdrv87SettingsRestore(); + break; case FUNC_SAVE_SETTINGS: Xdrv87SettingsSave(); break; From 5b6a25a7a00791986a1a0596f4470b933e4e2697 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 12 Jul 2023 10:52:58 +0200 Subject: [PATCH 068/150] Fix driver config backup and restore Fix driver config backup and restore (#18295) --- tasmota/tasmota_support/settings.ino | 69 +++++++++++-------- .../xdrv_03_esp32_energy.ino | 8 +-- .../xdrv_122_file_settings_demo.ino | 8 +-- .../xdrv_27_esp32_shutter.ino | 18 ++--- .../xdrv_86_esp32_sonoff_spm.ino | 8 +-- .../xdrv_87_esp32_sonoff_tm1621.ino | 8 +-- 6 files changed, 58 insertions(+), 61 deletions(-) diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index c4e56179c..0cf7a044d 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -412,21 +412,21 @@ bool SettingsBufferAlloc(uint32_t upload_size) { return false; } settings_size = upload_size; - } else { #ifdef USE_UFILESYS - char filename[14]; - for (uint32_t i = 0; i < 129; i++) { - snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), i); - uint32_t fsize = TfsFileSize(filename); - if (fsize) { - if (settings_size == sizeof(TSettings)) { - settings_size += 16; // Add tar header for total file size + } else { + char filename[14]; + for (uint32_t i = 0; i < 129; i++) { + snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), i); + uint32_t fsize = TfsFileSize(filename); + if (fsize) { + if (settings_size == sizeof(TSettings)) { + settings_size += 16; // Add tar header for total file size + } + fsize = ((fsize / 16) * 16) + 16; // Use 16-byte boundary + settings_size += (16 + fsize); // Tar header size is 16 bytes } - fsize = ((fsize / 16) * 16) + 16; // Use 16-byte boundary - settings_size += (16 + fsize); // Tar header size is 16 bytes } - } #endif // USE_UFILESYS } @@ -445,12 +445,11 @@ uint32_t SettingsConfigBackup(void) { #ifdef USE_UFILESYS if (settings_size > sizeof(TSettings)) { + // Add tar header with total file size snprintf_P((char*)filebuf_ptr, 14, PSTR(TASM_FILE_SETTINGS)); // /.settings - filebuf_ptr += 14; - *filebuf_ptr = settings_size; - filebuf_ptr++; - *filebuf_ptr = (settings_size >> 8); - filebuf_ptr++; + filebuf_ptr[14] = settings_size; + filebuf_ptr[15] = settings_size >> 8; + filebuf_ptr += 16; } #endif // USE_UFILESYS @@ -467,14 +466,25 @@ uint32_t SettingsConfigBackup(void) { snprintf_P(filename, sizeof(filename), PSTR(TASM_FILE_DRIVER), i); // /.drvset012 uint32_t fsize = TfsFileSize(filename); if (fsize) { + // Add tar header with file size memcpy(filebuf_ptr, filename, 14); - filebuf_ptr += 14; - *filebuf_ptr = fsize; - filebuf_ptr++; - *filebuf_ptr = (fsize >> 8); - filebuf_ptr++; - AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup file %s (%d)"), (char*)filebuf_ptr -16, fsize); - TfsLoadFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); + filebuf_ptr[14] = fsize; + filebuf_ptr[15] = fsize >> 8; + filebuf_ptr += 16; + if (XdrvCallDriver(i, FUNC_RESTORE_SETTINGS)) { // Enabled driver + // Use most relevant config data which might not have been saved to file +// AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup driver %d"), i); + memcpy(filebuf_ptr, (uint8_t*)XdrvMailbox.data, fsize); + cfg_crc32 = GetCfgCrc32(filebuf_ptr +4, fsize -4); // Calculate crc (again) as it might be wrong when savedata = 0 (#3918) + filebuf_ptr[0] = cfg_crc32; + filebuf_ptr[1] = cfg_crc32 >> 8; + filebuf_ptr[2] = cfg_crc32 >> 16; + filebuf_ptr[3] = cfg_crc32 >> 24; + } else { // Disabled driver + // As driver is not active just copy file +// AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup file %s (%d)"), (char*)filebuf_ptr -16, fsize); + TfsLoadFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); + } filebuf_ptr += ((fsize / 16) * 16) + 16; } } @@ -550,12 +560,17 @@ bool SettingsConfigRestore(void) { uint32_t buffer_crc32 = filebuf_ptr[3] << 24 | filebuf_ptr[2] << 16 | filebuf_ptr[1] << 8 | filebuf_ptr[0]; bool valid_buffer = (GetCfgCrc32(filebuf_ptr +4, fsize -4) == buffer_crc32); if (valid_buffer) { - XdrvMailbox.data = (char*)filebuf_ptr; - XdrvMailbox.index = fsize; if (XdrvCallDriver(driver, FUNC_RESTORE_SETTINGS)) { - AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore driver %d"), driver); + // Restore live config data which will be saved to file before restart +// AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore driver %d"), driver); + filebuf_ptr[1]++; // Force invalid crc32 to enable auto upgrade after restart + if (fsize > XdrvMailbox.index) { + fsize = XdrvMailbox.index; + } + memcpy((uint8_t*)XdrvMailbox.data, filebuf_ptr, fsize); // Restore version and auto upgrade after restart } else { - AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); + // As driver is not active just copy file +// AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); TfsSaveFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino index b539c9350..a15b7af82 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_03_esp32_energy.ino @@ -274,7 +274,7 @@ bool EnergyRtcSettingsValid(void) { * Driver Settings load and save using filesystem \*********************************************************************************************/ -const uint32_t XDRV_03_VERSION = 0x0102; // Latest driver version (See settings deltas below) +const uint16_t XDRV_03_VERSION = 0x0102; // Latest driver version (See settings deltas below) void EnergySettingsLoad(bool erase) { // *** Start init default values in case file is not found *** @@ -373,11 +373,9 @@ void EnergySettingsSave(void) { } bool EnergySettingsRestore(void) { -#ifdef USE_UFILESYS - uint32_t max_size = (XdrvMailbox.index > sizeof(tEnergySettings)) ? sizeof(tEnergySettings) : XdrvMailbox.index; - memcpy((uint8_t*)&Energy->Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + XdrvMailbox.data = (char*)&Energy->Settings; + XdrvMailbox.index = sizeof(tEnergySettings); return true; -#endif // USE_UFILESYS } /********************************************************************************************/ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino index e064c6941..cd2cf64c3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_122_file_settings_demo.ino @@ -34,7 +34,7 @@ #define DRV_DEMO_MAX_DRV_TEXT 16 -const uint32_t DRV_DEMO_VERSION = 0x0101; // Latest driver version (See settings deltas below) +const uint16_t DRV_DEMO_VERSION = 0x0101; // Latest driver version (See settings deltas below) // Demo command line commands const char kDrvDemoCommands[] PROGMEM = "Drv|" // Prefix @@ -157,11 +157,9 @@ void DrvDemoSettingsSave(void) { } bool DrvDemoSettingsRestore(void) { -#ifdef USE_UFILESYS - uint32_t max_size = (XdrvMailbox.index > sizeof(DrvDemoSettings)) ? sizeof(DrvDemoSettings) : XdrvMailbox.index; - memcpy((uint8_t*)&DrvDemoSettings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + XdrvMailbox.data = (char*)&DrvDemoSettings; + XdrvMailbox.index = sizeof(DrvDemoSettings); return true; -#endif // USE_UFILESYS } /*********************************************************************************************\ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 5e489e29a..f09370ed6 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -53,7 +53,7 @@ const char HTTP_MSG_SLIDER_SHUTTER[] PROGMEM = "
    %s%s
    " "
    "; -const uint32_t SHUTTER_VERSION = 0x0100; // Latest driver version (See settings deltas below) +const uint16_t SHUTTER_VERSION = 0x0100; // Latest driver version (See settings deltas below) typedef struct { // depreciated 2023-04-28 int8_t pos; @@ -253,9 +253,7 @@ void ShutterSettingsDelta(void) { // Fix possible setting deltas if (ShutterSettings.version != SHUTTER_VERSION) { // Fix version dependent changes - if (ShutterSettings.version < 0x01010100) { - AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update oldest version restore")); - + if (ShutterSettings.version < 0x0100) { for (uint8_t i=0; i < MAX_SHUTTERS_ESP32; i++){ if (ShutterSettings.shutter_startrelay[i] == 0) continue; AddLog(LOG_LEVEL_INFO, PSTR("SHT: %s SHT%d:%d"),D_CMND_SHUTTER_RELAY,i+1,ShutterSettings.shutter_startrelay[i]); @@ -272,14 +270,8 @@ void ShutterSettingsDelta(void) { ShutterSettings.shutter_button[i].position[j].mqtt_broadcast = ShutterSettings.shutter_button_old[i].position[j].mqtt_broadcast; } } - } - // if (ShutterSettings.version < 0x01010101) { - // AddLog(LOG_LEVEL_INFO, PSTR("SHT: Update old version restore")); - - // } - // Set current version and save settings ShutterSettings.version = SHUTTER_VERSION; ShutterSettingsSave(); @@ -342,11 +334,9 @@ void ShutterSettingsSave(void) { } bool ShutterSettingsRestore(void) { -#ifdef USE_UFILESYS - uint32_t max_size = (XdrvMailbox.index > sizeof(ShutterSettings)) ? sizeof(ShutterSettings) : XdrvMailbox.index; - memcpy((uint8_t*)&ShutterSettings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + XdrvMailbox.data = (char*)&ShutterSettings; + XdrvMailbox.index = sizeof(ShutterSettings); return true; -#endif // USE_UFILESYS } uint8_t ShutterGetRelayNoFromBitfield(power_t number) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino index 6b1a7a03c..03cc63bf6 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_86_esp32_sonoff_spm.ino @@ -308,7 +308,7 @@ TSspm *Sspm = nullptr; * Driver Settings load and save using filesystem \*********************************************************************************************/ -const uint32_t XDRV_86_VERSION = 0x0104; // Latest driver version (See settings deltas below) +const uint16_t XDRV_86_VERSION = 0x0104; // Latest driver version (See settings deltas below) void Xdrv86SettingsLoad(bool erase) { // *** Start init default values in case file is not found *** @@ -374,11 +374,9 @@ void Xdrv86SettingsSave(void) { } bool Xdrv86SettingsRestore(void) { -#ifdef USE_UFILESYS - uint32_t max_size = (XdrvMailbox.index > sizeof(tSspmSettings)) ? sizeof(tSspmSettings) : XdrvMailbox.index; - memcpy((uint8_t*)&Sspm->Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + XdrvMailbox.data = (char*)&Sspm->Settings; + XdrvMailbox.index = sizeof(tSspmSettings); return true; -#endif // USE_UFILESYS } /*********************************************************************************************/ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino index 20cc1f986..642f32ce3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_87_esp32_sonoff_tm1621.ino @@ -85,7 +85,7 @@ struct Tm1621 { * Driver Settings load and save using filesystem \*********************************************************************************************/ -const uint32_t XDRV_87_VERSION = 0x0104; // Latest driver version (See settings deltas below) +const uint16_t XDRV_87_VERSION = 0x0104; // Latest driver version (See settings deltas below) typedef struct { uint32_t crc32; // To detect file changes @@ -163,11 +163,9 @@ void Xdrv87SettingsSave(void) { } bool Xdrv87SettingsRestore(void) { -#ifdef USE_UFILESYS - uint32_t max_size = (XdrvMailbox.index > sizeof(tXdrv87Settings)) ? sizeof(tXdrv87Settings) : XdrvMailbox.index; - memcpy((uint8_t*)&Xdrv87Settings, (uint8_t*)XdrvMailbox.data, max_size); // Restore version and auto upgrade after restart + XdrvMailbox.data = (char*)&Xdrv87Settings; + XdrvMailbox.index = sizeof(tXdrv87Settings); return true; -#endif // USE_UFILESYS } /*********************************************************************************************/ From 9638beacec1418b2d18d97a3fe0aaf148f3ebdba Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Wed, 12 Jul 2023 12:45:02 +0200 Subject: [PATCH 069/150] Fix possible buffer overflow --- tasmota/tasmota_support/settings.ino | 35 ++++++++++++++-------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 0cf7a044d..9735c3dbd 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -454,9 +454,9 @@ uint32_t SettingsConfigBackup(void) { #endif // USE_UFILESYS uint32_t cfg_crc32 = Settings->cfg_crc32; - Settings->cfg_crc32 = GetSettingsCrc32(); // Calculate crc (again) as it might be wrong when savedata = 0 (#3918) + Settings->cfg_crc32 = GetSettingsCrc32(); // Calculate crc (again) as it might be wrong when savedata = 0 (#3918) memcpy(filebuf_ptr, Settings, sizeof(TSettings)); - Settings->cfg_crc32 = cfg_crc32; // Restore crc in case savedata = 0 to make sure settings will be noted as changed + Settings->cfg_crc32 = cfg_crc32; // Restore crc in case savedata = 0 to make sure settings will be noted as changed #ifdef USE_UFILESYS if (settings_size > sizeof(TSettings)) { @@ -474,13 +474,15 @@ uint32_t SettingsConfigBackup(void) { if (XdrvCallDriver(i, FUNC_RESTORE_SETTINGS)) { // Enabled driver // Use most relevant config data which might not have been saved to file // AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup driver %d"), i); - memcpy(filebuf_ptr, (uint8_t*)XdrvMailbox.data, fsize); + uint32_t data_size = fsize; // Fix possible buffer overflow + if (data_size > XdrvMailbox.index) { data_size = XdrvMailbox.index; } + memcpy(filebuf_ptr, (uint8_t*)XdrvMailbox.data, data_size); cfg_crc32 = GetCfgCrc32(filebuf_ptr +4, fsize -4); // Calculate crc (again) as it might be wrong when savedata = 0 (#3918) filebuf_ptr[0] = cfg_crc32; filebuf_ptr[1] = cfg_crc32 >> 8; filebuf_ptr[2] = cfg_crc32 >> 16; filebuf_ptr[3] = cfg_crc32 >> 24; - } else { // Disabled driver + } else { // Disabled driver // As driver is not active just copy file // AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Backup file %s (%d)"), (char*)filebuf_ptr -16, fsize); TfsLoadFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); @@ -507,17 +509,17 @@ bool SettingsConfigRestore(void) { bool valid_settings = false; - // unsigned long version; // 008 + // unsigned long version; // 008 unsigned long buffer_version = settings_buffer[11] << 24 | settings_buffer[10] << 16 | settings_buffer[9] << 8 | settings_buffer[8]; if (buffer_version > 0x06000000) { - // uint16_t cfg_size; // 002 + // uint16_t cfg_size; // 002 uint32_t buffer_size = settings_buffer[3] << 8 | settings_buffer[2]; if (buffer_version > 0x0606000A) { - // uint32_t cfg_crc32; // FFC + // uint32_t cfg_crc32; // FFC uint32_t buffer_crc32 = settings_buffer[4095] << 24 | settings_buffer[4094] << 16 | settings_buffer[4093] << 8 | settings_buffer[4092]; valid_settings = (GetCfgCrc32(settings_buffer, buffer_size -4) == buffer_crc32); } else { - // uint16_t cfg_crc; // 00E + // uint16_t cfg_crc; // 00E uint16_t buffer_crc16 = settings_buffer[15] << 8 | settings_buffer[14]; valid_settings = (GetCfgCrc16(settings_buffer, buffer_size) == buffer_crc16); } @@ -526,7 +528,7 @@ bool SettingsConfigRestore(void) { } if (valid_settings) { - // uint8_t config_version; // F36 + // uint8_t config_version; // F36 #ifdef ESP8266 valid_settings = (0 == settings_buffer[0xF36]); // Settings->config_version #endif // ESP8266 @@ -547,7 +549,7 @@ bool SettingsConfigRestore(void) { if (valid_settings) { SettingsDefaultSet2(); memcpy((char*)Settings +16, settings_buffer +16, sizeof(TSettings) -16); - Settings->version = buffer_version; // Restore version and auto upgrade after restart + Settings->version = buffer_version; // Restore version and auto upgrade after restart } #ifdef USE_UFILESYS @@ -556,25 +558,24 @@ bool SettingsConfigRestore(void) { while ((filebuf_ptr - settings_buffer) < settings_size) { uint32_t driver = atoi((const char*)filebuf_ptr +8); // /.drvset012 = 12 uint32_t fsize = filebuf_ptr[15] << 8 | filebuf_ptr[14]; // Tar header settings size - filebuf_ptr += 16; // Start of file settings + filebuf_ptr += 16; // Start of file settings uint32_t buffer_crc32 = filebuf_ptr[3] << 24 | filebuf_ptr[2] << 16 | filebuf_ptr[1] << 8 | filebuf_ptr[0]; bool valid_buffer = (GetCfgCrc32(filebuf_ptr +4, fsize -4) == buffer_crc32); if (valid_buffer) { if (XdrvCallDriver(driver, FUNC_RESTORE_SETTINGS)) { // Restore live config data which will be saved to file before restart // AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore driver %d"), driver); - filebuf_ptr[1]++; // Force invalid crc32 to enable auto upgrade after restart - if (fsize > XdrvMailbox.index) { - fsize = XdrvMailbox.index; - } - memcpy((uint8_t*)XdrvMailbox.data, filebuf_ptr, fsize); // Restore version and auto upgrade after restart + filebuf_ptr[1]++; // Force invalid crc32 to enable auto upgrade after restart + uint32_t data_size = fsize; // Fix possible buffer overflow + if (data_size > XdrvMailbox.index) { data_size = XdrvMailbox.index; } + memcpy((uint8_t*)XdrvMailbox.data, filebuf_ptr, data_size); // Restore version and auto upgrade after restart } else { // As driver is not active just copy file // AddLog(LOG_LEVEL_DEBUG, PSTR("CFG: Restore file %s (%d)"), (char*)filebuf_ptr -16, fsize); TfsSaveFile((const char*)filebuf_ptr -16, (uint8_t*)filebuf_ptr, fsize); } } - filebuf_ptr += ((fsize / 16) * 16) + 16; // Next tar header or eof + filebuf_ptr += ((fsize / 16) * 16) + 16; // Next tar header or eof } } #endif // USE_UFILESYS From ebca2f0a075b9635883572307253bf1f1c60f293 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Fri, 14 Jul 2023 09:10:20 +0200 Subject: [PATCH 070/150] Zero-Cross Dimmer fixes (#19109) * Fix Zero-Cross flickering on Savedata * Fix reboot on DIMMER usage with Zero-Cross * Fix Flickering on dimmer 0 --- tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 6 +++-- .../xdrv_68_zerocrossDimmer.ino | 26 +++++++++++++------ .../tasmota_xsns_sensor/xsns_01_counter.ino | 3 +++ 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index e37c1b2de..f4b27dd10 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -2188,8 +2188,10 @@ void LightSetOutputs(const uint16_t *cur_col_10) { TasmotaGlobal.pwm_value[i] = cur_col; // mark the new expected value // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", i, cur_col); #else // ESP32 - analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); - // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); + if (!Settings->flag4.zerocross_dimmer) { + analogWrite(Pin(GPIO_PWM1, i), bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); + // AddLog(LOG_LEVEL_DEBUG_MORE, "analogWrite-%i 0x%03X", bitRead(TasmotaGlobal.pwm_inverted, i) ? Settings->pwm_range - cur_col : cur_col); + } #endif // ESP32 } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 1a3f52210..f0199b783 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -35,7 +35,9 @@ struct AC_ZERO_CROSS_DIMMER { bool timer_iterrupt_started = false; // verification of the interrupt running bool dimmer_in_use = false; // Check if interrupt has to be run. Is stopped if all lights off bool fallingEdgeDimmer = false; // Work as a fallwing edge dimmer + bool triggered[MAX_PWMS]; uint32_t enable_time_us[MAX_PWMS]; // Time since last ZC pulse to enable gate pin. 0 means no disable. + uint32_t disable_time_us[MAX_PWMS]; // 99% of cycle time uint32_t lastlight[MAX_PWMS]; // Store the light value. Set 1 if controlled through ZCDimmerSet uint16_t detailpower[MAX_PWMS]; // replaces dimmer and light controll 0..10000. required savedata 0. uint32_t accurracy[MAX_PWMS]; // offset of the time to fire the triac and the real time when it fired @@ -67,6 +69,7 @@ void IRAM_ATTR ACDimmerZeroCross(uint32_t time) { if (Pin(GPIO_PWM1, i) == -1) continue; digitalWrite(Pin(GPIO_PWM1, i), LOW ^ ac_zero_cross_dimmer.fallingEdgeDimmer); ac_zero_cross_dimmer.dimmer_in_use |= ac_zero_cross_dimmer.lastlight[i] > 0; + ac_zero_cross_dimmer.triggered[i] = false; } } @@ -147,11 +150,13 @@ void IRAM_ATTR ACDimmerTimer_intr() { time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; } #endif - if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]) { + if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i] && !ac_zero_cross_dimmer.triggered[i] ) { digitalWrite(Pin(GPIO_PWM1, i), HIGH ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); - #ifdef ZC_DEBUG - ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; - #endif + ac_zero_cross_dimmer.triggered[i] = true; + ac_zero_cross_dimmer.accurracy[i] = tmax(ac_zero_cross_dimmer.accurracy[i],time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]); + } + if (time_since_zc >= ac_zero_cross_dimmer.disable_time_us[i]) { + digitalWrite(Pin(GPIO_PWM1, i), LOW ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); } } } @@ -166,14 +171,17 @@ void ACDimmerControllTrigger(void) { #endif for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - + ac_zero_cross_dimmer.disable_time_us[i] = (ac_zero_cross_dimmer.cycle_time_us * 99) / 100; if (ac_zero_cross_dimmer.detailpower[i]){ ac_zero_cross_dimmer.lastlight[i] = changeUIntScale(ac_zero_cross_dimmer.detailpower[i]/10, 0, 1000, 0, 1023); } else { ac_zero_cross_dimmer.lastlight[i] = Light.fade_running ? Light.fade_cur_10[i] : Light.fade_start_10[i]; } ac_zero_cross_dimmer.enable_time_us[i] = (ac_zero_cross_dimmer.cycle_time_us * (1023 - ac_zero_cross_power(ac_zero_cross_dimmer.lastlight[i]))) / 1023; - + if (ac_zero_cross_dimmer.enable_time_us[i] > ac_zero_cross_dimmer.disable_time_us[i]) { + // do not set HIGH near to the zero cross + ac_zero_cross_dimmer.enable_time_us[i] = 99999; + } #ifdef ESP32 if (ac_zero_cross_dimmer.detailpower[i]){ float state = (float)(1 - (ac_zero_cross_dimmer.detailpower[i]/10000.0)); @@ -183,6 +191,7 @@ void ACDimmerControllTrigger(void) { ac_zero_cross_dimmer.enable_time_us[i] = (uint32_t)state; } #endif + } } @@ -205,8 +214,9 @@ void ACDimmerLogging(void) ); for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), - i+1, ac_zero_cross_dimmer.enable_time_us[i], + if (ac_zero_cross_dimmer.accurracy[i]) ac_zero_cross_dimmer.accurracy[i]--; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), + i+1, ac_zero_cross_dimmer.enable_time_us[i], ac_zero_cross_dimmer.disable_time_us[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i], ac_zero_cross_dimmer.accurracy[i] ); diff --git a/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino b/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino index b23870503..ba31983db 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_01_counter.ino @@ -98,6 +98,9 @@ void IRAM_ATTR CounterIsrArg(void *arg) { void CounterInterruptDisable(bool state) { if (state) { // Disable interrupts + if (Settings->flag4.zerocross_dimmer) { + return; + } if (Counter.any_counter) { for (uint32_t i = 0; i < MAX_COUNTERS; i++) { if (PinUsed(GPIO_CNTR1, i)) { From ada754c582ed835798dbc66e023e997e2059e0a9 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 17:06:10 +0200 Subject: [PATCH 071/150] Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver (#19117) --- CHANGELOG.md | 1 + lib/libesp32/berry_tasmota/src/be_energylib.c | 3 +++ tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino | 9 +++++++++ 3 files changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 318665586..fec10d396 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) - Matter mini-profiler (#19075) - Berry `_class` can be used in `static var` initialization code (#19088) +- Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_energylib.c b/lib/libesp32/berry_tasmota/src/be_energylib.c index 3142872be..984af678b 100644 --- a/lib/libesp32/berry_tasmota/src/be_energylib.c +++ b/lib/libesp32/berry_tasmota/src/be_energylib.c @@ -10,6 +10,7 @@ #ifdef USE_ENERGY_SENSOR extern struct ENERGY Energy; +extern int energy_update_total(bvm *vm); #include "solidify/solidified_energy.h" #include "be_fixed_energy.h" @@ -24,6 +25,8 @@ module energy (scope: global) { read, closure(energy_read_closure) member, closure(energy_member_closure) setmember, closure(energy_setmember_closure) + + update_total, func(energy_update_total) } @const_object_info_end */ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino index e29037ae0..dc8060649 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_energy.ino @@ -31,6 +31,15 @@ * \*********************************************************************************************/ extern "C" { + + int32_t energy_update_total(struct bvm *vm); + int32_t energy_update_total(struct bvm *vm) { + EnergyUpdateTotal(); + be_return_nil(vm); + } + + + #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winvalid-offsetof" // avoid warnings since we're using offsetof() in a risky way From af27d65a8a0aa57d5258679928aa2220d94e44e0 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 18:11:04 +0200 Subject: [PATCH 072/150] Sync with Berry upstream (#19119) --- lib/libesp32/berry/src/be_api.c | 2 ++ lib/libesp32/berry/src/berry.h | 2 ++ lib/libesp32/berry/tests/class_static.be | 15 +++++++++- lib/libesp32/berry/tests/string.be | 22 +++++++++++++++ lib/libesp32/berry/tests/walrus.be | 35 ++++++++++++++++++++++++ 5 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 lib/libesp32/berry/tests/walrus.be diff --git a/lib/libesp32/berry/src/be_api.c b/lib/libesp32/berry/src/be_api.c index fb2b8e017..ba5b915d2 100644 --- a/lib/libesp32/berry/src/be_api.c +++ b/lib/libesp32/berry/src/be_api.c @@ -1038,7 +1038,9 @@ BERRY_API int be_pcall(bvm *vm, int argc) return be_protectedcall(vm, f, argc); } +#ifdef __GNUC__ __attribute__((noreturn)) +#endif BERRY_API void be_raise(bvm *vm, const char *except, const char *msg) { be_pushstring(vm, except); diff --git a/lib/libesp32/berry/src/berry.h b/lib/libesp32/berry/src/berry.h index f6c6eddb8..962a01ebb 100644 --- a/lib/libesp32/berry/src/berry.h +++ b/lib/libesp32/berry/src/berry.h @@ -2065,7 +2065,9 @@ BERRY_API void be_exit(bvm *vm, int status); * @param except * @param msg */ +#ifdef __GNUC__ __attribute__((noreturn)) +#endif BERRY_API void be_raise(bvm *vm, const char *except, const char *msg); /** diff --git a/lib/libesp32/berry/tests/class_static.be b/lib/libesp32/berry/tests/class_static.be index d972f5ef3..dbe8c222e 100644 --- a/lib/libesp32/berry/tests/class_static.be +++ b/lib/libesp32/berry/tests/class_static.be @@ -140,5 +140,18 @@ assert(classname(a) == 'A') assert(classname(b) == 'B') assert(A.B.f() == 1) assert(b.g() == 2) -assert(super(b) == nil) assert(super(A.B) == nil) + +#- `_class` initializer can now be used in initializer code -# +class A + static var a = 1 + static var b = _class + static var c = [_class.a, _class.b] + static def f(x) + return _class + end +end +assert(A.a == 1) +assert(A.b == A) +assert(A.c == [1, A]) +assert(A.f(1) == A) diff --git a/lib/libesp32/berry/tests/string.be b/lib/libesp32/berry/tests/string.be index 072e5faa7..82f824451 100644 --- a/lib/libesp32/berry/tests/string.be +++ b/lib/libesp32/berry/tests/string.be @@ -147,3 +147,25 @@ assert(string.format("%s", nil) == 'nil') assert(string.format("%s", true) == 'true') assert(string.format("%s", false) == 'false') +# format is now synonym to string.format +assert(format == string.format) +assert(format("%.1f", 3) == '3.0') + +# f-strings +assert(f"" == '') +assert(f'' == '') +assert(f"abc\n\r\t" == 'abc\n\r\t') +assert(f'{{a}}' == '{a}') +assert(f'\\\\' == '\\\\') + +assert(f"A = {1+1}" == 'A = 2') +assert(f"A = {1+1:s}" == 'A = 2') +assert(f"A = {1+1:i}" == 'A = 2') +assert(f"A = {1+1:04i}" == 'A = 0002') + +assert(f"P = {3.1415:.2f}" == 'P = 3.14') + +var a = 'foobar{0}' +assert(f"S = {a}" == 'S = foobar{0}') +assert(f"S = {a:i}" == 'S = 0') +assert(f"{a=}" == 'a=foobar{0}') diff --git a/lib/libesp32/berry/tests/walrus.be b/lib/libesp32/berry/tests/walrus.be new file mode 100644 index 000000000..faa92fa15 --- /dev/null +++ b/lib/libesp32/berry/tests/walrus.be @@ -0,0 +1,35 @@ +# test for the walrus operator +var a = 1 +assert((a := a + 1) == 2) +assert((a := a + 1) == 3) + +def f() + var defer = 10 + var ret = [] + for i:0..100 + if (defer := defer - 1) == 0 + ret.push(i) + defer = 10 + end + end + return ret +end +assert(f() == [9, 19, 29, 39, 49, 59, 69, 79, 89, 99]) + +# test for expressions with no side effects +def assert_attribute_error(c) + try + compile(c)() + assert(false, 'unexpected execution flow') + except 'syntax_error' as e, m + end +end + +# below the expressions `a` or `a b` have no side effect and do not generate any code, this is an error when in strict mode +import strict +var a, b +assert_attribute_error("var a,b def f() a b end") +assert_attribute_error("var a,b def f() a end") + +# while the following does have side effect +def f() a := b end From 46e17061b211804a5d852104f36e6a90e4636cbf Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 19:09:52 +0200 Subject: [PATCH 073/150] Berry extend `range(lower, upper, incr)` to arbitrary increment (#19120) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_rangelib.c | 92 +++++++++++++++++++++++----- lib/libesp32/berry/tests/range.be | 39 ++++++++++++ 3 files changed, 115 insertions(+), 17 deletions(-) create mode 100644 lib/libesp32/berry/tests/range.be diff --git a/CHANGELOG.md b/CHANGELOG.md index fec10d396..b10c34328 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. ### Changed - ESP32 shutter driver support up to 16 shutters (#18295) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) +- Berry extend `range(lower, upper, incr)` to arbitrary increment ### Fixed diff --git a/lib/libesp32/berry/src/be_rangelib.c b/lib/libesp32/berry/src/be_rangelib.c index 3682ae3ce..0b964baec 100644 --- a/lib/libesp32/berry/src/be_rangelib.c +++ b/lib/libesp32/berry/src/be_rangelib.c @@ -11,31 +11,67 @@ static int m_init(bvm *vm) { + int argc = be_top(vm); be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); be_pushvalue(vm, 3); be_setmember(vm, 1, "__upper__"); + int incr = 1; /* default increment is '1' */ + if (argc >= 4) { + incr = be_toint(vm, 4); + if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } + } + be_pushint(vm, incr); + be_setmember(vm, 1, "__incr__"); be_return_nil(vm); } static int m_tostring(bvm *vm) { - be_pushstring(vm, "("); - be_getmember(vm, 1, "__lower__"); - be_tostring(vm, -1); - be_strconcat(vm, -2); - be_pop(vm, 1); - be_pushstring(vm, ".."); - be_strconcat(vm, -2); - be_pop(vm, 1); - be_getmember(vm, 1, "__upper__"); - be_tostring(vm, -1); - be_strconcat(vm, -2); - be_pop(vm, 1); - be_pushstring(vm, ")"); - be_strconcat(vm, -2); + be_getmember(vm, 1, "__incr__"); + int incr = be_toint(vm, -1); be_pop(vm, 1); + if (incr == 1) { + be_pushstring(vm, "("); + be_getmember(vm, 1, "__lower__"); + be_tostring(vm, -1); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_pushstring(vm, ".."); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_getmember(vm, 1, "__upper__"); + be_tostring(vm, -1); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_pushstring(vm, ")"); + be_strconcat(vm, -2); + be_pop(vm, 1); + } else { + be_pushstring(vm, "range("); + be_getmember(vm, 1, "__lower__"); + be_tostring(vm, -1); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_pushstring(vm, ", "); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_getmember(vm, 1, "__upper__"); + be_tostring(vm, -1); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_pushstring(vm, ", "); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_getmember(vm, 1, "__incr__"); + be_tostring(vm, -1); + be_strconcat(vm, -2); + be_pop(vm, 1); + be_pushstring(vm, ")"); + be_strconcat(vm, -2); + be_pop(vm, 1); + } be_return(vm); } @@ -51,13 +87,27 @@ static int m_lower(bvm *vm) be_return(vm); } +static int m_incr(bvm *vm) +{ + be_getmember(vm, 1, "__incr__"); + be_return(vm); +} + static int m_setrange(bvm *vm) { + int argc = be_top(vm); be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); be_pushvalue(vm, 3); be_setmember(vm, 1, "__upper__"); + int incr = 1; /* default increment is '1' */ + if (argc >= 4) { + incr = be_toint(vm, 4); + if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } + } + be_pushint(vm, incr); + be_setmember(vm, 1, "__incr__"); be_return_nil(vm); } @@ -68,25 +118,30 @@ static int iter_closure(bvm *vm) bntvclos *func = var_toobj(vm->cf->func); bvalue *uv0 = be_ntvclos_upval(func, 0)->value; bvalue *uv1 = be_ntvclos_upval(func, 1)->value; + bvalue *uv2 = be_ntvclos_upval(func, 2)->value; bint lower = var_toint(uv0); /* upvalue[0] => lower */ bint upper = var_toint(uv1); /* upvalue[1] => upper */ - if (lower > upper) { + bint incr = var_toint(uv2); /* upvalue[2] => incr */ + if ((incr > 0 && lower > upper) || (incr < 0 && lower < upper)) { be_stop_iteration(vm); } - var_toint(uv0) = lower + 1; /* set upvale[0] */ + var_toint(uv0) = lower + incr; /* set upvale[0] */ be_pushint(vm, lower); /* push the return value */ be_return(vm); } static int m_iter(bvm *vm) { - be_pushntvclosure(vm, iter_closure, 2); + be_pushntvclosure(vm, iter_closure, 3); be_getmember(vm, 1, "__lower__"); be_setupval(vm, -2, 0); be_pop(vm, 1); be_getmember(vm, 1, "__upper__"); be_setupval(vm, -2, 1); be_pop(vm, 1); + be_getmember(vm, 1, "__incr__"); + be_setupval(vm, -2, 2); + be_pop(vm, 1); be_return(vm); } @@ -96,6 +151,7 @@ void be_load_rangelib(bvm *vm) static const bnfuncinfo members[] = { { "__lower__", NULL }, { "__upper__", NULL }, + { "__incr__", NULL }, { "init", m_init }, { "tostring", m_tostring }, { "lower", m_lower }, @@ -111,10 +167,12 @@ void be_load_rangelib(bvm *vm) class be_class_range (scope: global, name: range) { __lower__, var __upper__, var + __incr__, var init, func(m_init) tostring, func(m_tostring) lower, func(m_lower) upper, func(m_upper) + incr, func(m_incr) setrange, func(m_setrange) iter, func(m_iter) } diff --git a/lib/libesp32/berry/tests/range.be b/lib/libesp32/berry/tests/range.be new file mode 100644 index 000000000..08b5add8d --- /dev/null +++ b/lib/libesp32/berry/tests/range.be @@ -0,0 +1,39 @@ +# test for ranges + +# expand a range object as list +def expand(iter) + var ret = [] + for i: iter + ret.push(i) + end + return ret +end + +assert(expand(0..5) == [0, 1, 2, 3, 4, 5]) +assert(expand(0..0) == [0]) +assert(expand(5..0) == []) +var r = 1..5 +assert(r.lower() == 1) +assert(r.upper() == 5) +assert(r.incr() == 1) + +assert(expand(range(0,5)) == [0, 1, 2, 3, 4, 5]) +assert(expand(range(0,5,2)) == [0, 2, 4]) +assert(expand(range(0,5,12)) == [0]) +assert(expand(range(0,5,-1)) == []) + +assert(expand(range(5,0,-1)) == [5, 4, 3, 2, 1, 0]) +assert(expand(range(5,0,-2)) == [5, 3, 1]) +assert(expand(range(5,5,-2)) == [5]) +assert(expand(range(0,5,-2)) == []) + +def assert_value_error(c) + try + compile(c)() + assert(false, 'unexpected execution flow') + except 'value_error' as e, m + end +end + +# range with increment zero shoud raise an error +assert_value_error("range(1,2,0)") From 0c0ca82198fe7d5fba650d0aaef9b8dc7f6c1cd8 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 19:20:59 +0200 Subject: [PATCH 074/150] Update Berry windows exe to latest (#19121) --- lib/libesp32/berry/berry.exe | Bin 368947 -> 369553 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/libesp32/berry/berry.exe b/lib/libesp32/berry/berry.exe index a20999c831e7edbce54a3a259340146176522042..9d90681671ec8a2f23a51719d1869087d04125e6 100644 GIT binary patch delta 108304 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%0D+O(JnU*KITDjxkrGRr{Irr@Fi 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 z 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 Qc5#POw+~oQd`08`1H{fQtN;K2 From ca8ec6a0066b3475d9d411c380f195c134569743 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 22:43:38 +0200 Subject: [PATCH 075/150] Berry updated syntax highlighting plugin for VSCode (#19123) --- CHANGELOG.md | 1 + .../.vsixmanifest | 0 .../CHANGELOG.md | 3 +- .../README.md | 0 .../berry-configuration.json | 2 +- .../berry-icon.png | Bin .../package.json | 2 +- .../syntaxes/berry.json | 50 ++++++++++++++++-- .../syntaxes/bytecode.json | 0 9 files changed, 52 insertions(+), 6 deletions(-) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/.vsixmanifest (100%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/CHANGELOG.md (73%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/README.md (100%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/berry-configuration.json (93%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/berry-icon.png (100%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/package.json (98%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/syntaxes/berry.json (60%) rename lib/libesp32/berry/tools/plugins/vscode/{skiars.berry-0.1.0 => skiars.berry-1.1.0}/syntaxes/bytecode.json (100%) diff --git a/CHANGELOG.md b/CHANGELOG.md index b10c34328..7523fed7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - ESP32 shutter driver support up to 16 shutters (#18295) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) - Berry extend `range(lower, upper, incr)` to arbitrary increment +- Berry updated syntax highlighting plugin for VSCode ### Fixed diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/.vsixmanifest b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/.vsixmanifest similarity index 100% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/.vsixmanifest rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/.vsixmanifest diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/CHANGELOG.md b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/CHANGELOG.md similarity index 73% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/CHANGELOG.md rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/CHANGELOG.md index 6f51bbcca..2867fd3ab 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/CHANGELOG.md +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/CHANGELOG.md @@ -4,4 +4,5 @@ All notable changes to the "none" extension will be documented in this file. Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file. ## [Unreleased] -- Initial release \ No newline at end of file +- Initial release +- add support for f-strings, `_class` and indent on `do` diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/README.md b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/README.md similarity index 100% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/README.md rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/README.md diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/berry-configuration.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/berry-configuration.json similarity index 93% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/berry-configuration.json rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/berry-configuration.json index 4be01969f..50dde1c39 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/berry-configuration.json +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/berry-configuration.json @@ -26,7 +26,7 @@ ["'", "'"] ], "indentationRules": { - "increaseIndentPattern": "(^((\\s*(class|while|for|if|elif|else|try|except))|(.*\\bdef))\\b((?!\\b(end)\\b).)*)$", + "increaseIndentPattern": "(^((\\s*(class|while|for|if|elif|else|try|except|do))|(.*\\bdef))\\b((?!\\b(end)\\b).)*)$", "decreaseIndentPattern": "^\\s*((\\b(elif|else|except|end)\\b)|(\\)))" } } \ No newline at end of file diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/berry-icon.png b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/berry-icon.png similarity index 100% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/berry-icon.png rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/berry-icon.png diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/package.json similarity index 98% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/package.json index 1f206315b..6837eb54e 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/package.json +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/package.json @@ -2,7 +2,7 @@ "name": "berry", "displayName": "Berry Script Language", "description": "A small embedded script language.", - "version": "0.1.0", + "version": "1.1.0", "publisher": "skiars", "engines": { "vscode": "^1.15.1" diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json similarity index 60% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json index 661d969a5..29e90d5f8 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/berry.json +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json @@ -44,11 +44,55 @@ "patterns": [ { "name": "string.quoted.double.berry", - "match": "\"(\\\\.|[^\"])*\"" + "begin": "(\"|')", + "end": "\\1", + "patterns": [ + { + "name": "constant.character.escape.berry", + "match": "\\\\." + } + ] }, { - "name": "string.quoted.single.berry", - "match": "'(\\\\.|[^'])*'" + "name": "string.quoted.other.berry", + "begin": "f(\"|')", + "end": "\\1", + "patterns": [ + { + "name": "constant.character.escape.berry", + "match": "\\\\." + }, + { + "name": "string.quoted.other.berry", + "match": "\\{\\{[^\\}]*\\}\\}" + }, + { + "name": "keyword.other.unit.berry", + "begin": "\\{", + "end": "\\}", + "patterns": [ + { + "include": "#keywords" + }, + { + "include": "#numbers" + }, + { + "include": "#identifier" + }, + { + "include": "#operator" + }, + { + "include": "#member" + }, + { + "include": "#function" + } + ] + } + + ] } ] }, diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/bytecode.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/bytecode.json similarity index 100% rename from lib/libesp32/berry/tools/plugins/vscode/skiars.berry-0.1.0/syntaxes/bytecode.json rename to lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/bytecode.json From 315fe36727e2089f67d970acdb3cac0c872aef0c Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 15 Jul 2023 23:25:51 +0200 Subject: [PATCH 076/150] Berry check arguments for `range()` (#19124) --- lib/libesp32/berry/src/be_rangelib.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/lib/libesp32/berry/src/be_rangelib.c b/lib/libesp32/berry/src/be_rangelib.c index 0b964baec..704473807 100644 --- a/lib/libesp32/berry/src/be_rangelib.c +++ b/lib/libesp32/berry/src/be_rangelib.c @@ -12,6 +12,8 @@ static int m_init(bvm *vm) { int argc = be_top(vm); + if (argc < 3) { be_raise(vm, "value_error", "missing arguments"); } + if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); @@ -19,6 +21,7 @@ static int m_init(bvm *vm) be_setmember(vm, 1, "__upper__"); int incr = 1; /* default increment is '1' */ if (argc >= 4) { + if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } incr = be_toint(vm, 4); if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } } @@ -96,6 +99,8 @@ static int m_incr(bvm *vm) static int m_setrange(bvm *vm) { int argc = be_top(vm); + if (argc < 3) { be_raise(vm, "value_error", "missing arguments"); } + if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); @@ -103,6 +108,7 @@ static int m_setrange(bvm *vm) be_setmember(vm, 1, "__upper__"); int incr = 1; /* default increment is '1' */ if (argc >= 4) { + if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } incr = be_toint(vm, 4); if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } } From f4ff0010af0a12d13f2745bce303f794ba387094 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 16 Jul 2023 11:15:33 +0200 Subject: [PATCH 077/150] Berry fix syntax highlighting for escaped chars (#19126) --- .../plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json index 29e90d5f8..4087fb10c 100755 --- a/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json +++ b/lib/libesp32/berry/tools/plugins/vscode/skiars.berry-1.1.0/syntaxes/berry.json @@ -49,7 +49,7 @@ "patterns": [ { "name": "constant.character.escape.berry", - "match": "\\\\." + "match": "(\\\\x[\\h]{2})|(\\\\[0-7]{3})|(\\\\\\\\)|(\\\\\")|(\\\\')|(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)" } ] }, @@ -60,7 +60,7 @@ "patterns": [ { "name": "constant.character.escape.berry", - "match": "\\\\." + "match": "(\\\\x[\\h]{2})|(\\\\[0-7]{3})|(\\\\\\\\)|(\\\\\")|(\\\\')|(\\\\a)|(\\\\b)|(\\\\f)|(\\\\n)|(\\\\r)|(\\\\t)|(\\\\v)" }, { "name": "string.quoted.other.berry", @@ -111,7 +111,7 @@ "keywords": { "patterns": [{ "name": "keyword.berry", - "match": "\\b(var|static|def|class|true|false|nil|self|super|import|as)\\b" + "match": "\\b(var|static|def|class|true|false|nil|self|super|import|as|_class)\\b" }] }, "identifier": { From 00249ac3eb94437b6b41fd5681904313414f79d6 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 16 Jul 2023 15:05:41 +0200 Subject: [PATCH 078/150] Fix typo --- lib/libesp32/berry/src/be_rangelib.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/libesp32/berry/src/be_rangelib.c b/lib/libesp32/berry/src/be_rangelib.c index 704473807..187807021 100644 --- a/lib/libesp32/berry/src/be_rangelib.c +++ b/lib/libesp32/berry/src/be_rangelib.c @@ -13,7 +13,7 @@ static int m_init(bvm *vm) { int argc = be_top(vm); if (argc < 3) { be_raise(vm, "value_error", "missing arguments"); } - if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } + if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "arguments must be 'int'"); } be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); @@ -21,7 +21,7 @@ static int m_init(bvm *vm) be_setmember(vm, 1, "__upper__"); int incr = 1; /* default increment is '1' */ if (argc >= 4) { - if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } + if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "arguments must be 'int'"); } incr = be_toint(vm, 4); if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } } @@ -100,7 +100,7 @@ static int m_setrange(bvm *vm) { int argc = be_top(vm); if (argc < 3) { be_raise(vm, "value_error", "missing arguments"); } - if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } + if (!be_isint(vm, 2) || !be_isint(vm, 3)) { be_raise(vm, "value_error", "arguments must be 'int'"); } be_pushvalue(vm, 2); be_setmember(vm, 1, "__lower__"); be_pop(vm, 1); @@ -108,7 +108,7 @@ static int m_setrange(bvm *vm) be_setmember(vm, 1, "__upper__"); int incr = 1; /* default increment is '1' */ if (argc >= 4) { - if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "argmunets must be 'int'"); } + if (!be_isint(vm, 4)) { be_raise(vm, "value_error", "arguments must be 'int'"); } incr = be_toint(vm, 4); if (incr == 0) { be_raise(vm, "value_error", "increment cannot be zero"); } } From 410a6b99d9c7c8155f89cf1cc64fb0335f756105 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 16 Jul 2023 15:32:59 +0200 Subject: [PATCH 079/150] Berry update grammar (#19129) --- lib/libesp32/berry/tools/grammar/berry.ebnf | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lib/libesp32/berry/tools/grammar/berry.ebnf b/lib/libesp32/berry/tools/grammar/berry.ebnf index 1b387ae0d..86eef9b58 100644 --- a/lib/libesp32/berry/tools/grammar/berry.ebnf +++ b/lib/libesp32/berry/tools/grammar/berry.ebnf @@ -5,9 +5,10 @@ block = {statement}; (* statement define *) statement = class_stmt | func_stmt | var_stmt | if_stmt | while_stmt | for_stmt | break_stmt | return_stmt | expr_stmt | import_stmt | - try_stmt | throw_stmt | ';'; + try_stmt | throw_stmt | do_stmt | ';'; if_stmt = 'if' expr block {'elif' expr block} ['else' block] 'end'; while_stmt = 'while' expr block 'end'; +do_stmt = 'do' block 'end'; for_stmt = 'for' ID ':' expr block 'end'; break_stmt = 'break' | 'continue'; return_stmt = 'return' [expr]; @@ -28,7 +29,7 @@ throw_stmt = 'raise' expr [',' expr]; var_stmt = 'var' ID ['=' expr] {',' ID ['=' expr]}; (* expression define *) expr_stmt = expr [assign_op expr]; -expr = suffix_expr | unop expr | expr binop expr | range_expr | cond_expr; +expr = suffix_expr | unop expr | expr binop expr | range_expr | cond_expr | walrus_expr; cond_expr = expr '?' expr ':' expr; (* conditional expression *) assign_op = '=' | '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>='; @@ -36,9 +37,11 @@ binop = '<' | '<=' | '==' | '!=' | '>' | '>=' | '||' | '&&' | '<<' | '>>' | '&' | '|' | '^' | '+' | '-' | '*' | '/' | '%'; range_expr = expr '..' [expr] unop = '-' | '!' | '~'; +walrus_expr = expr ':=' expr suffix_expr = primary_expr {call_expr | ('.' ID) | '[' expr ']'}; primary_expr = '(' expr ')' | simple_expr | list_expr | map_expr | anon_func | lambda_expr; -simple_expr = INTEGER | REAL | STRING | ID | 'true' | 'false' | 'nil'; +simple_expr = INTEGER | REAL | STRING | ID | 'true' | 'false' | 'nil' | f_string; +f_string = 'f' STRING call_expr = '(' [expr {',' expr}] ')'; list_expr = '[' {expr ','} [expr] ']'; map_expr = '{' {expr ':' expr ','} [expr ':' expr] '}'; From 6382c2806cceac90c6068a613545ded9b9ec3728 Mon Sep 17 00:00:00 2001 From: sfromis <47082390+sfromis@users.noreply.github.com> Date: Tue, 18 Jul 2023 08:26:51 +0200 Subject: [PATCH 080/150] More user-friendly defaults for DisplayMode and DisplayDimmer (#19138) Changing default for DisplayMode from 1 to 0. Users are getting confused by the display doing something they did not ask for (and not being aware of DisplayMode). This got worse with LVGL/HASPmota displays becoming common, with users having much less reason to dive into the old DisplayXxxxx commands. And it may even be hard to see that it is even a display of time/date causing the display to flicker. Changing default for DisplayDimmer from 10% to 50%. The low brightness of 10% is not always easy to see, especially in daylight. 50% is generally better, while not going "full blast" with 100%. --- tasmota/tasmota_support/settings.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 9735c3dbd..4e796b400 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -1289,12 +1289,12 @@ void SettingsDefaultSet2(void) { // Display // Settings->display_model = 0; - Settings->display_mode = 1; + Settings->display_mode = 0; Settings->display_refresh = 2; Settings->display_rows = 2; Settings->display_cols[0] = 16; Settings->display_cols[1] = 8; - Settings->display_dimmer_protected = -10; // 10% + Settings->display_dimmer_protected = -50; // 50% Settings->display_size = 1; Settings->display_font = 1; // Settings->display_rotate = 0; From 0b59cda02ad06ed02fa94934d96d04e587535b45 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 19 Jul 2023 20:41:41 +0200 Subject: [PATCH 081/150] Berry add metrics for memory allocation/deallocation/reallocation (#19150) --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_debuglib.c | 34 ++++++++++++++++++++++++++++ lib/libesp32/berry/src/be_mem.c | 9 ++++++++ lib/libesp32/berry/src/be_vm.c | 3 +++ lib/libesp32/berry/src/be_vm.h | 3 +++ 5 files changed, 50 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7523fed7f..b18483b0c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Matter mini-profiler (#19075) - Berry `_class` can be used in `static var` initialization code (#19088) - Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver +- Berry add metrics for memory allocation/deallocation/reallocation ### Breaking Changed diff --git a/lib/libesp32/berry/src/be_debuglib.c b/lib/libesp32/berry/src/be_debuglib.c index 49ee027b0..502935b6c 100644 --- a/lib/libesp32/berry/src/be_debuglib.c +++ b/lib/libesp32/berry/src/be_debuglib.c @@ -171,11 +171,41 @@ static int m_counters(bvm *vm) map_insert(vm, "try", vm->counter_try); map_insert(vm, "raise", vm->counter_exc); map_insert(vm, "objects", vm->counter_gc_kept); + map_insert(vm, "mem_alloc", vm->counter_mem_alloc); + map_insert(vm, "mem_free", vm->counter_mem_free); + map_insert(vm, "mem_realloc", vm->counter_mem_realloc); be_pop(vm, 1); be_return(vm); } #endif +static int m_allocs(bvm *vm) { +#if BE_USE_PERF_COUNTERS + be_pushint(vm, vm->counter_mem_alloc); + be_return(vm); +#else + be_return_nil(vm); +#endif +} + +static int m_frees(bvm *vm) { +#if BE_USE_PERF_COUNTERS + be_pushint(vm, vm->counter_mem_free); + be_return(vm); +#else + be_return_nil(vm); +#endif +} + +static int m_reallocs(bvm *vm) { +#if BE_USE_PERF_COUNTERS + be_pushint(vm, vm->counter_mem_realloc); + be_return(vm); +#else + be_return_nil(vm); +#endif +} + #if !BE_USE_PRECOMPILED_OBJECT be_native_module_attr_table(debug) { be_native_module_function("attrdump", m_attrdump), @@ -208,6 +238,10 @@ module debug (scope: global, depend: BE_USE_DEBUG_MODULE) { top, func(m_top) varname, func(m_varname), BE_DEBUG_VAR_INFO upvname, func(m_upvname), BE_DEBUG_VAR_INFO + // individual counters + allocs, func(m_allocs) + frees, func(m_frees) + reallocs, func(m_reallocs) } @const_object_info_end */ #include "../generate/be_fixed_debug.h" diff --git a/lib/libesp32/berry/src/be_mem.c b/lib/libesp32/berry/src/be_mem.c index 3657fd951..36e30866a 100644 --- a/lib/libesp32/berry/src/be_mem.c +++ b/lib/libesp32/berry/src/be_mem.c @@ -60,12 +60,18 @@ BERRY_API void* be_realloc(bvm *vm, void *ptr, size_t old_size, size_t new_size) while (1) { /* Case 1: new allocation */ +#if BE_USE_PERF_COUNTERS + vm->counter_mem_alloc++; +#endif if (!ptr || (old_size == 0)) { block = malloc_from_pool(vm, new_size); } /* Case 2: deallocate */ else if (new_size == 0) { +#if BE_USE_PERF_COUNTERS + vm->counter_mem_free++; +#endif if (ptr == NULL) { return NULL; } /* safeguard */ #if BE_USE_DEBUG_GC memset(ptr, 0xFF, old_size); /* fill the structure with invalid pointers */ @@ -76,6 +82,9 @@ BERRY_API void* be_realloc(bvm *vm, void *ptr, size_t old_size, size_t new_size) /* Case 3: reallocate with a different size */ else if (new_size && old_size) { // TODO we already know they are not null TODO +#if BE_USE_PERF_COUNTERS + vm->counter_mem_realloc++; +#endif if (new_size <= POOL32_SIZE || old_size <=POOL32_SIZE) { /* complex case with different pools */ if (new_size <= POOL16_SIZE && old_size <= POOL16_SIZE) { diff --git a/lib/libesp32/berry/src/be_vm.c b/lib/libesp32/berry/src/be_vm.c index 4c21866e4..b234308d0 100644 --- a/lib/libesp32/berry/src/be_vm.c +++ b/lib/libesp32/berry/src/be_vm.c @@ -512,6 +512,9 @@ BERRY_API bvm* be_vm_new(void) vm->counter_exc = 0; vm->counter_gc_kept = 0; vm->counter_gc_freed = 0; + vm->counter_mem_alloc = 0; + vm->counter_mem_free = 0; + vm->counter_mem_realloc = 0; #endif return vm; } diff --git a/lib/libesp32/berry/src/be_vm.h b/lib/libesp32/berry/src/be_vm.h index 711d96ed1..ba05579bf 100644 --- a/lib/libesp32/berry/src/be_vm.h +++ b/lib/libesp32/berry/src/be_vm.h @@ -119,6 +119,9 @@ struct bvm { uint32_t counter_exc; /* counter for raised exceptions */ uint32_t counter_gc_kept; /* counter for objects scanned by last gc */ uint32_t counter_gc_freed; /* counter for objects freed by last gc */ + uint32_t counter_mem_alloc; /* counter for memory allocations */ + uint32_t counter_mem_free; /* counter for memory frees */ + uint32_t counter_mem_realloc; /* counter for memory reallocations */ uint32_t micros_gc0; uint32_t micros_gc1; From 91f15d228be994664db3f322cdb18997d8394998 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 19 Jul 2023 20:41:49 +0200 Subject: [PATCH 082/150] Zigbee DIYRuZ_Geiger (#19151) --- tasmota/zigbee/DIYRuZ_Geiger.zb | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 tasmota/zigbee/DIYRuZ_Geiger.zb diff --git a/tasmota/zigbee/DIYRuZ_Geiger.zb b/tasmota/zigbee/DIYRuZ_Geiger.zb new file mode 100644 index 000000000..3c1cc26b0 --- /dev/null +++ b/tasmota/zigbee/DIYRuZ_Geiger.zb @@ -0,0 +1,12 @@ +#Z2Tv1 +# DIYRuZ_Geiger +# https://modkam.ru/2020/06/05/indikator-radioaktivnosti-zigbee/ +:*,modkam.ru +0400/F001%21,GeigerRadiationEventsPerMinute +0400/F002%23,GeigerRadiationLevelPerHour +0401/F000%21,GeigerSensitivity +0401/F001%10,GeigerLedFeedback +0401/F002%10,GeigerBuzzerFeedback +0401/F003%20,GeigerSensorsCount +0401/F004%30,GeigerSensorsType +0401/F005%23,GeigerAlertThreshold From 2a3690b86601833dd2f91dbc3ec0a5e5c054b054 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 19 Jul 2023 20:58:50 +0200 Subject: [PATCH 083/150] Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance (#19152) --- CHANGELOG.md | 1 + .../berry_tasmota/src/be_tasmota_lib.c | 4 +++ tasmota/tasmota_support/support.ino | 7 +++++- .../xdrv_52_3_berry_tasmota.ino | 25 +++++++++++++++++++ 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b18483b0c..26b9d096d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Berry `_class` can be used in `static var` initialization code (#19088) - Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver - Berry add metrics for memory allocation/deallocation/reallocation +- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c index 8b64ce03b..edfd1cd6e 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c @@ -21,6 +21,7 @@ extern int l_getoption(bvm *vm); extern int l_millis(bvm *vm); extern int l_timereached(bvm *vm); extern int l_rtc(bvm *vm); +extern int l_rtc_utc(bvm *vm); extern int l_time_dump(bvm *vm); extern int l_strftime(bvm *vm); extern int l_strptime(bvm *vm); @@ -33,6 +34,7 @@ extern int l_delay(bvm *vm); extern int l_delay_microseconds(bvm *vm); extern int l_scaleuint(bvm *vm); extern int l_logInfo(bvm *vm); +extern int l_loglevel(bvm *vm); extern int l_save(bvm *vm); extern int t_random_byte(bvm *vm); extern int l_locale(bvm *vm); @@ -99,6 +101,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { millis, func(l_millis) time_reached, func(l_timereached) rtc, func(l_rtc) + rtc_utc, func(l_rtc_utc) time_dump, func(l_time_dump) strftime, func(l_strftime) strptime, func(l_strptime) @@ -111,6 +114,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { delay_microseconds, func(l_delay_microseconds) scale_uint, func(l_scaleuint) log, func(l_logInfo) + loglevel, func(l_loglevel) save, func(l_save) locale, func(l_locale) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index a6f426be8..414daddbe 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -2478,13 +2478,18 @@ void AddLogData(uint32_t loglevel, const char* log_data, const char* log_data_pa } } -void AddLog(uint32_t loglevel, PGM_P formatP, ...) { +uint32_t HighestLogLevel() { uint32_t highest_loglevel = TasmotaGlobal.seriallog_level; if (Settings->weblog_level > highest_loglevel) { highest_loglevel = Settings->weblog_level; } if (Settings->mqttlog_level > highest_loglevel) { highest_loglevel = Settings->mqttlog_level; } if (TasmotaGlobal.syslog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.syslog_level; } if (TasmotaGlobal.templog_level > highest_loglevel) { highest_loglevel = TasmotaGlobal.templog_level; } if (TasmotaGlobal.uptime < 3) { highest_loglevel = LOG_LEVEL_DEBUG_MORE; } // Log all before setup correct log level + return highest_loglevel; +} + +void AddLog(uint32_t loglevel, PGM_P formatP, ...) { + uint32_t highest_loglevel = HighestLogLevel(); // If no logging is requested then do not access heap to fight fragmentation if ((loglevel <= highest_loglevel) && (TasmotaGlobal.masterlog_level <= highest_loglevel)) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino index 56588d339..3b7b8110b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino @@ -183,6 +183,14 @@ extern "C" { be_raise(vm, kTypeError, nullptr); } + // Berry: tasmota.rtc_utc() -> int + // + int32_t l_rtc_utc(struct bvm *vm); + int32_t l_rtc_utc(struct bvm *vm) { + be_pushint(vm, Rtc.utc_time); + be_return(vm); + } + // Berry: tasmota.memory() -> map // int32_t l_memory(struct bvm *vm); @@ -790,6 +798,23 @@ extern "C" { * \*********************************************************************************************/ extern "C" { + // Berry: `loglevel() -> int` + // or + // Berry: `loglevel(int) -> bool` + // return the highest log level currently in place + int32_t l_loglevel(struct bvm *vm); + int32_t l_loglevel(struct bvm *vm) { + int32_t top = be_top(vm); // Get the number of arguments + uint32_t highest_loglevel = HighestLogLevel(); + if (top >= 2 && be_isint(vm, 2)) { + int32_t log_level = be_toint(vm, 2); + be_pushbool(vm, log_level <= highest_loglevel); + } else { + be_pushint(vm, HighestLogLevel()); + } + be_return(vm); + } + // Berry: `log(msg:string [,log_level:int]) ->nil` // Logs the string at LOG_LEVEL_INFO (loglevel=2) // We allow this function to be called as a method or a direct function From 3da5124348958d9cc7f4669fc27edb3f15b7d014 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 19 Jul 2023 21:15:08 +0200 Subject: [PATCH 084/150] Berry add AES CCM decrypting in a single call to avoid any object allocation (#19153) --- CHANGELOG.md | 1 + .../berry_tasmota/src/be_crypto_lib.c | 11 +- .../xdrv_52_3_berry_crypto.ino | 107 +++++++++++++++++- 3 files changed, 113 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 26b9d096d..9bed866bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. - Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver - Berry add metrics for memory allocation/deallocation/reallocation - Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance +- Berry add AES CCM decrypting in a single call to avoid any object allocation ### Breaking Changed diff --git a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c index 0162bc369..fd250e236 100644 --- a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c @@ -14,8 +14,9 @@ extern int m_crypto_random(bvm *vm); extern int m_rsa_rsassa_pkcs1_v1_5(bvm *vm); extern int m_aes_ccm_init(bvm *vm); -extern int m_aes_ccm_encryt(bvm *vm); -extern int m_aes_ccm_decryt(bvm *vm); +extern int m_aes_ccm_encrypt(bvm *vm); +extern int m_aes_ccm_decrypt(bvm *vm); +extern int m_aes_ccm_decrypt1(bvm *vm); extern int m_aes_ccm_tag(bvm *vm); extern int m_aes_gcm_init(bvm *vm); @@ -134,9 +135,11 @@ class be_class_aes_ccm (scope: global, name: AES_CCM) { .p2, var init, func(m_aes_ccm_init) - encrypt, func(m_aes_ccm_encryt) - decrypt, func(m_aes_ccm_decryt) + encrypt, func(m_aes_ccm_encrypt) + decrypt, func(m_aes_ccm_decrypt) tag, func(m_aes_ccm_tag) + + decrypt1, static_func(m_aes_ccm_decrypt1) } class be_class_aes_gcm (scope: global, name: AES_GCM) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino index eff06901e..7270bd7ae 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino @@ -296,8 +296,8 @@ extern "C" { // Finish injection of authentication data int32_t m_aes_ccm_encrypt_or_decryt(bvm *vm, int encrypt); - int32_t m_aes_ccm_encryt(bvm *vm) { return m_aes_ccm_encrypt_or_decryt(vm, 1); } - int32_t m_aes_ccm_decryt(bvm *vm) { return m_aes_ccm_encrypt_or_decryt(vm, 0); } + int32_t m_aes_ccm_encrypt(bvm *vm) { return m_aes_ccm_encrypt_or_decryt(vm, 1); } + int32_t m_aes_ccm_decrypt(bvm *vm) { return m_aes_ccm_encrypt_or_decryt(vm, 0); } int32_t m_aes_ccm_encrypt_or_decryt(bvm *vm, int encrypt) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isbytes(vm, 2)) { @@ -346,6 +346,109 @@ extern "C" { } while (0); be_raise(vm, kTypeError, nullptr); } + + // `AES_CCM.decrypt1( + // secret_key:bytes(16 or 32), + // iv:bytes(), iv_start:int, iv_len:int (7..13), + // aad:bytes(), aad_start:int, aad_len:int, + // data:bytes(), data_start:int, data_len:int, + // tag:bytes(), tag_start:int, tag_len:int (4..16)) + // -> bool (true if tag matches) + // + // all-in-one decrypt function + // decryption in place + // + int32_t m_aes_ccm_decrypt1(struct bvm *vm); + int32_t m_aes_ccm_decrypt1(struct bvm *vm) { + int32_t argc = be_top(vm); // Get the number of arguments + if (argc >= 13 && be_isbytes(vm, 1) // secret_key + && be_isbytes(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) // iv, iv_start, iv_len + && be_isbytes(vm, 5) && be_isint(vm, 6) && be_isint(vm, 7) // aad, aad_start, aad_len + && be_isbytes(vm, 8) && be_isint(vm, 9) && be_isint(vm, 10) // data_start, data_len + && be_isbytes(vm, 11) && be_isint(vm, 12) && be_isint(vm, 13)) { // tag, tag_start, tag_len + + size_t key_len = 0; + const void * key = be_tobytes(vm, 1, &key_len); + if (key_len != 32 && key_len != 16) { + be_raise(vm, "value_error", "Key size must be 16 or 32 bytes"); + } + + size_t nonce_len = 0; + const uint8_t * nonce = (const uint8_t *) be_tobytes(vm, 2, &nonce_len); + int32_t n_start = be_toint(vm, 3); + int32_t n_len = be_toint(vm, 4); + if (n_start < 0 || n_len < 0 || n_start > nonce_len || n_start+n_len > nonce_len) { + be_raise(vm, "range_error", "out of range start/end"); + } + nonce += n_start; + nonce_len = n_len; + if (nonce_len < 7 || nonce_len > 13) { + be_raise(vm, "value_error", "Nonce size must be 7..13"); + } + + size_t aad_len = 0; + const uint8_t * aad = (const uint8_t *) be_tobytes(vm, 5, &aad_len); + int32_t a_start = be_toint(vm, 6); + int32_t a_len = be_toint(vm, 7); + if (a_start < 0 || a_len < 0 || a_start > aad_len || a_start+a_len > aad_len) { + be_raise(vm, "range_error", "out of range start/end"); + } + aad += a_start; + aad_len = a_len; + + size_t data_len = 0; + uint8_t * data = (uint8_t *) be_tobytes(vm, 8, &data_len); + int32_t d_start = be_toint(vm, 9); + int32_t d_len = be_toint(vm, 10); + if (d_start < 0 || d_len < 0 || d_start > data_len || d_start+d_len > data_len) { + be_raise(vm, "range_error", "out of range start/end"); + } + data += d_start; + data_len = d_len; + + size_t tag_len = 0; + uint8_t * tag = (uint8_t *) be_tobytes(vm, 11, &tag_len); + int32_t t_start = be_toint(vm, 12); + int32_t t_len = be_toint(vm, 13); + if (t_start < 0 || t_len < 0 || t_start > tag_len || t_start+t_len > tag_len) { + be_raise(vm, "range_error", "out of range start/end"); + } + tag += t_start; + tag_len = t_len; + if (tag_len < 4 || tag_len > 16) { + be_raise(vm, "value_error", "Tag size must be 4..16"); + } + + // Initialize an AES CCM structure with the secret key + br_aes_small_ctrcbc_keys key_ctx; + br_ccm_context ccm_ctx; + br_aes_small_ctrcbc_init(&key_ctx, key, key_len); + br_ccm_init(&ccm_ctx, &key_ctx.vtable); + int ret = br_ccm_reset(&ccm_ctx, nonce, nonce_len, aad_len, data_len, tag_len); + if (ret == 0) { be_raise(vm, "value_error", "br_ccm_reset failed"); } + + if (aad_len > 0) { + br_ccm_aad_inject(&ccm_ctx, aad, aad_len); + } + br_ccm_flip(&ccm_ctx); + + br_ccm_run(&ccm_ctx, 0 /*decrypt*/, data, data_len); // decrypt in place + + // check tag + // create a bytes buffer of 16 bytes + uint8_t tag_computed[16] = {}; + br_ccm_get_tag(&ccm_ctx, tag_computed); + if (memcmp(tag_computed, tag, tag_len) == 0) { + be_pushbool(vm, btrue); + } else { + be_pushbool(vm, bfalse); + } + + // success + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); + } } /*********************************************************************************************\ From d1a4296867fb8d48d06de1f05761fe6db2f2fe20 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 20 Jul 2023 09:51:08 +0200 Subject: [PATCH 085/150] New DEEPSLEEP topic for HA + Battery Level % support (#19134) * New LWT on deepsleep To allow better integration into HA LWT topic will report details of sleep status: 16:54:04.388 MQT: hm/tele/ESP_3284D1/LWT = {"Sleep":{"Time":"2023-07-17T16:55:03","Sleep":1689612844,"Wakeup":1689612903}} * Revert LWT back to non JSON Send DeelSleep on LWT Send Deepsleep parameters on topic DeepSleep * Setting default for batteryLevel * Enable BatteryPercentSet Changing the battery level e.g. by rule * Added Battery % to status message * added battery_level_percent * Added battery % support in STATE message * Enable setting battery level 101 is reserved for power-plug. No battery Level reported * Setting default for battery Level 101 is reserved for power plug 0..100 normal battery values * Revert back LWT to Offline Removed "DeepSleep" LWT status until further decision is made. Current implementation is technical sufficient for HA to detect a battery powered device * Added discovery message after deepsleep change * Added discovery for battery and deepsleep --- tasmota/include/tasmota_types.h | 4 +-- tasmota/tasmota_support/settings.ino | 1 + tasmota/tasmota_support/support_command.ino | 10 ++++++ tasmota/tasmota_support/support_tasmota.ino | 7 +++++ .../tasmota_xdrv_driver/xdrv_12_discovery.ino | 7 ++++- .../tasmota_xdrv_driver/xdrv_29_deepsleep.ino | 31 ++++++++++--------- 6 files changed, 42 insertions(+), 18 deletions(-) diff --git a/tasmota/include/tasmota_types.h b/tasmota/include/tasmota_types.h index 71176d653..ef5fc44f4 100644 --- a/tasmota/include/tasmota_types.h +++ b/tasmota/include/tasmota_types.h @@ -733,8 +733,8 @@ typedef struct { uint16_t artnet_universe; // 734 uint16_t modbus_sbaudrate; // 736 uint16_t shutter_motorstop; // 738 - - uint8_t free_73A[3]; // 73A + uint8_t battery_level_percent; // 73A + uint8_t free_73B[2]; // 73B uint8_t novasds_startingoffset; // 73D uint8_t web_color[18][3]; // 73E diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 4e796b400..d1a75ff7f 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -980,6 +980,7 @@ void SettingsDefaultSet2(void) { if (Settings->sleep < 50) { Settings->sleep = 50; // Default to 50 for sleep, for now } + Settings->battery_level_percent = 101; // Module flag.interlock |= APP_INTERLOCK_MODE; diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index e18143040..523376296 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -34,6 +34,7 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix D_CMND_DEVICENAME "|" D_CMND_FN "|" D_CMND_FRIENDLYNAME "|" D_CMND_SWITCHMODE "|" D_CMND_INTERLOCK "|" D_CMND_TELEPERIOD "|" D_CMND_RESET "|" D_CMND_TIME "|" D_CMND_TIMEZONE "|" D_CMND_TIMESTD "|" D_CMND_TIMEDST "|" D_CMND_ALTITUDE "|" D_CMND_LEDPOWER "|" D_CMND_LEDSTATE "|" D_CMND_LEDMASK "|" D_CMND_LEDPWM_ON "|" D_CMND_LEDPWM_OFF "|" D_CMND_LEDPWM_MODE "|" D_CMND_WIFIPOWER "|" D_CMND_TEMPOFFSET "|" D_CMND_HUMOFFSET "|" D_CMND_SPEEDUNIT "|" D_CMND_GLOBAL_TEMP "|" D_CMND_GLOBAL_HUM"|" D_CMND_GLOBAL_PRESS "|" D_CMND_SWITCHTEXT "|" D_CMND_WIFISCAN "|" D_CMND_WIFITEST "|" + D_CMND_ZIGBEE_BATTPERCENT "|" #ifdef USE_I2C D_CMND_I2CSCAN "|" D_CMND_I2CDRIVER "|" #endif @@ -73,6 +74,7 @@ void (* const TasmotaCommand[])(void) PROGMEM = { &CmndDevicename, &CmndFriendlyname, &CmndFriendlyname, &CmndSwitchMode, &CmndInterlock, &CmndTeleperiod, &CmndReset, &CmndTime, &CmndTimezone, &CmndTimeStd, &CmndTimeDst, &CmndAltitude, &CmndLedPower, &CmndLedState, &CmndLedMask, &CmndLedPwmOn, &CmndLedPwmOff, &CmndLedPwmMode, &CmndWifiPower, &CmndTempOffset, &CmndHumOffset, &CmndSpeedUnit, &CmndGlobalTemp, &CmndGlobalHum, &CmndGlobalPress, &CmndSwitchText, &CmndWifiScan, &CmndWifiTest, + &CmndBatteryPercent, #ifdef USE_I2C &CmndI2cScan, &CmndI2cDriver, #endif @@ -245,6 +247,14 @@ void CmndWifiTest(void) #endif //USE_WEBSERVER } +void CmndBatteryPercent(void) { + if (XdrvMailbox.payload > 101) XdrvMailbox.payload = 100; + if (XdrvMailbox.payload >= 0) { + Settings->battery_level_percent = XdrvMailbox.payload; + } + ResponseCmndNumber(Settings->battery_level_percent); +} + #endif // not defined FIRMWARE_MINIMAL_ONLY void ResponseCmndNumber(int value) { diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index b7f51569f..c035f77ca 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -829,6 +829,13 @@ void MqttShowState(void) ResponseAppendTime(); ResponseAppend_P(PSTR(",\"" D_JSON_UPTIME "\":\"%s\",\"UptimeSec\":%u"), GetUptime().c_str(), UpTime()); + +// Battery Level expliciet for deepsleep devices +if (Settings->battery_level_percent != 101) { + ResponseAppend_P(PSTR(",\"" D_CMND_ZIGBEE_BATTPERCENT "\":%d"), Settings->battery_level_percent); +} + + #ifdef ESP8266 #ifdef USE_ADC_VCC dtostrfd((double)ESP.getVcc()/1000, 3, stemp1); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index 6fb523dc0..f5fa3a3f7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -185,6 +185,8 @@ void TasDiscoverMessage(void) { "\"117\":%d}," "\"lk\":%d," // Light CTRGB linked "\"lt_st\":%d," // Light SubType + "\"bat\":%d," // Battery operates yes/no + "\"dslp\":%d," // Deepsleep configured yes/no "\"sho\":["), // Shutter Options (start) Settings->flag.mqtt_response, Settings->flag.button_swap, @@ -198,7 +200,10 @@ void TasDiscoverMessage(void) { Settings->flag5.mqtt_switches, Settings->flag5.fade_fixed_duration, light_controller_isCTRGBLinked, - light_subtype); + light_subtype, + Settings->battery_level_percent==101?0:1, + Settings->deepsleep==0?0:1 + ); for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { #ifdef USE_SHUTTER diff --git a/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino b/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino index a607fa0e9..244ece57e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino @@ -1,7 +1,7 @@ /* xdrv_29_deepsleep.ino - DeepSleep support for Tasmota - Copyright (C) 2022 Stefan Bode + Copyright (C) 2023 Stefan Bode This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -89,8 +89,9 @@ void DeepSleepReInit(void) RtcSettings.ultradeepsleep = 0; } -void DeepSleepPrepare(void) +void DeepSleepStart(void) { + char stopic[TOPSZ]; // Deepsleep_slip is ideally 10.000 == 100% // Typically the device has up to 4% slip. Anything else is a wrong setting in the deepsleep_slip // Therefore all values >110% or <90% will be resetted to 100% to avoid crazy sleep times. @@ -133,16 +134,17 @@ void DeepSleepPrepare(void) // uint32_t deepsleep_sleeptime = DEEPSLEEP_MAX_CYCLE < (RtcSettings.nextwakeup - LocalTime()) ? (uint32_t)DEEPSLEEP_MAX_CYCLE : RtcSettings.nextwakeup - LocalTime(); deepsleep_sleeptime = tmin((uint32_t)DEEPSLEEP_MAX_CYCLE ,RtcSettings.nextwakeup - LocalTime()); - // stat/tasmota/DEEPSLEEP = {"DeepSleep":{"Time":"2019-11-12T21:33:45","Epoch":1573590825}} - Response_P(PSTR("{\"" D_PRFX_DEEPSLEEP "\":{\"" D_JSON_TIME "\":\"%s\",\"Epoch\":%d}}"), (char*)dt.c_str(), RtcSettings.nextwakeup); - MqttPublishPrefixTopicRulesProcess_P(RESULT_OR_STAT, PSTR(D_PRFX_DEEPSLEEP)); + // Sending Deepsleep parameters to automation for react + Response_P(PSTR("{\"" D_PRFX_DEEPSLEEP "\":{\"" D_JSON_TIME "\":\"%s\",\"" D_PRFX_DEEPSLEEP "\":%d,\"Wakeup\":%d}}"), (char*)dt.c_str(), LocalTime(), RtcSettings.nextwakeup); + MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_PRFX_DEEPSLEEP), true); -// Response_P(S_LWT_OFFLINE); -// MqttPublishPrefixTopicRulesProcess_P(TELE, PSTR(D_LWT), true); // Offline or remove previous retained topic -} + // Change LWT Topic to Sleep to ensure automation see different state + //GetTopic_P(stopic, TELE, TasmotaGlobal.mqtt_topic, S_LWT); + //Response_P(PSTR(D_PRFX_DEEPSLEEP)); + //MqttPublish(stopic, true); -void DeepSleepStart(void) -{ + //MqttClient.disconnect(true); + //EspClient.stop(); WifiShutdown(); RtcSettings.ultradeepsleep = RtcSettings.nextwakeup - LocalTime(); RtcSettingsSave(); @@ -155,8 +157,10 @@ void DeepSleepStart(void) esp_deep_sleep_start(); #endif // ESP32 yield(); + } + void DeepSleepEverySecond(void) { //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("Wifi Info: up %d, wifidown %d, wifistatus %d, flag %d"),TasmotaGlobal.uptime, TasmotaGlobal.global_state.wifi_down, Wifi.status , deepsleep_flag); @@ -168,12 +172,8 @@ void DeepSleepEverySecond(void) if (!deepsleep_flag) { return; } if (DeepSleepEnabled()) { - if (DEEPSLEEP_START_COUNTDOWN == deepsleep_flag) { // Allow 4 seconds to update web console before deepsleep + if (DEEPSLEEP_START_COUNTDOWN == deepsleep_flag) { SettingsSaveAll(); - DeepSleepPrepare(); - } - deepsleep_flag--; - if (deepsleep_flag <= 0) { DeepSleepStart(); } } else { @@ -197,6 +197,7 @@ void CmndDeepsleepTime(void) Settings->tele_period = TELE_PERIOD; // Need teleperiod to go back to sleep } } + TasDiscovery(); } ResponseCmndNumber(Settings->deepsleep); } From 758b0237b4594ac0a3bc7052d37d8383c304c805 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 20 Jul 2023 21:26:55 +0200 Subject: [PATCH 086/150] Matter latency improvement for single attribute reads and single commands (#19158) --- CHANGELOG.md | 1 + .../berry_matter/src/be_matter_module.c | 2 + .../src/embedded/Matter_Commissioning.be | 10 +- .../src/embedded/Matter_Device.be | 53 +- .../src/embedded/Matter_Expirable.be | 4 +- .../src/embedded/Matter_Fabric.be | 2 +- .../src/embedded/Matter_HTTP_remote.be | 4 +- .../berry_matter/src/embedded/Matter_IM.be | 607 +- .../src/embedded/Matter_IM_Data.be | 234 + .../src/embedded/Matter_IM_Message.be | 23 +- .../src/embedded/Matter_Message.be | 91 +- .../src/embedded/Matter_MessageHandler.be | 57 +- .../berry_matter/src/embedded/Matter_Path.be | 10 +- .../src/embedded/Matter_Plugin.be | 33 +- .../src/embedded/Matter_Plugin_Aggregator.be | 6 +- .../src/embedded/Matter_Plugin_Bridge_HTTP.be | 20 +- .../embedded/Matter_Plugin_Bridge_Light0.be | 10 +- .../embedded/Matter_Plugin_Bridge_Light1.be | 22 +- .../embedded/Matter_Plugin_Bridge_Light2.be | 22 +- .../embedded/Matter_Plugin_Bridge_Light3.be | 28 +- .../Matter_Plugin_Bridge_Sensor_Contact.be | 12 +- .../Matter_Plugin_Bridge_Sensor_Humidity.be | 16 +- ...Matter_Plugin_Bridge_Sensor_Illuminance.be | 16 +- .../Matter_Plugin_Bridge_Sensor_Occupancy.be | 16 +- .../Matter_Plugin_Bridge_Sensor_Pressure.be | 16 +- .../Matter_Plugin_Bridge_Sensor_Temp.be | 16 +- .../src/embedded/Matter_Plugin_Device.be | 36 +- .../src/embedded/Matter_Plugin_Light0.be | 10 +- .../src/embedded/Matter_Plugin_Light1.be | 18 +- .../src/embedded/Matter_Plugin_Light2.be | 18 +- .../src/embedded/Matter_Plugin_Light3.be | 24 +- .../src/embedded/Matter_Plugin_OnOff.be | 10 +- .../src/embedded/Matter_Plugin_Root.be | 92 +- .../embedded/Matter_Plugin_Sensor_Contact.be | 12 +- .../embedded/Matter_Plugin_Sensor_Humidity.be | 16 +- .../Matter_Plugin_Sensor_Illuminance.be | 16 +- .../Matter_Plugin_Sensor_Occupancy.be | 16 +- .../embedded/Matter_Plugin_Sensor_OnOff.be | 10 +- .../embedded/Matter_Plugin_Sensor_Pressure.be | 16 +- .../src/embedded/Matter_Plugin_Sensor_Temp.be | 16 +- .../src/embedded/Matter_Plugin_Shutter.be | 24 +- .../src/embedded/Matter_Plugin_ShutterTilt.be | 16 +- .../src/embedded/Matter_Profiler.be | 37 +- .../src/embedded/Matter_Session.be | 2 +- .../berry_matter/src/embedded/Matter_TLV.be | 113 +- .../src/embedded/Matter_UDPServer.be | 24 +- .../solidified_Matter_Commissioning.h | 846 +- .../src/solidify/solidified_Matter_Device.h | 7552 +++++++++-------- .../solidify/solidified_Matter_Expirable.h | 24 +- .../src/solidify/solidified_Matter_Fabric.h | 66 +- .../solidify/solidified_Matter_HTTP_remote.h | 50 +- .../src/solidify/solidified_Matter_IM.h | 4027 +++++---- .../src/solidify/solidified_Matter_IM_Data.h | 463 + .../solidify/solidified_Matter_IM_Message.h | 506 +- .../src/solidify/solidified_Matter_Message.h | 697 +- .../solidified_Matter_MessageHandler.h | 1300 +-- .../src/solidify/solidified_Matter_Path.h | 101 +- .../src/solidify/solidified_Matter_Plugin.h | 1222 +-- .../solidified_Matter_Plugin_Aggregator.h | 108 +- .../solidified_Matter_Plugin_Bridge_HTTP.h | 230 +- .../solidified_Matter_Plugin_Bridge_Light0.h | 93 +- .../solidified_Matter_Plugin_Bridge_Light1.h | 189 +- .../solidified_Matter_Plugin_Bridge_Light2.h | 193 +- .../solidified_Matter_Plugin_Bridge_Light3.h | 239 +- ...fied_Matter_Plugin_Bridge_Sensor_Contact.h | 107 +- ...ied_Matter_Plugin_Bridge_Sensor_Humidity.h | 139 +- ..._Matter_Plugin_Bridge_Sensor_Illuminance.h | 139 +- ...ed_Matter_Plugin_Bridge_Sensor_Occupancy.h | 135 +- ...ied_Matter_Plugin_Bridge_Sensor_Pressure.h | 139 +- ...idified_Matter_Plugin_Bridge_Sensor_Temp.h | 135 +- .../solidified_Matter_Plugin_Device.h | 515 +- .../solidified_Matter_Plugin_Light0.h | 93 +- .../solidified_Matter_Plugin_Light1.h | 153 +- .../solidified_Matter_Plugin_Light2.h | 159 +- .../solidified_Matter_Plugin_Light3.h | 203 +- .../solidify/solidified_Matter_Plugin_OnOff.h | 93 +- .../solidify/solidified_Matter_Plugin_Root.h | 3120 +++---- .../solidified_Matter_Plugin_Sensor_Contact.h | 107 +- ...solidified_Matter_Plugin_Sensor_Humidity.h | 139 +- ...idified_Matter_Plugin_Sensor_Illuminance.h | 139 +- ...olidified_Matter_Plugin_Sensor_Occupancy.h | 135 +- .../solidified_Matter_Plugin_Sensor_OnOff.h | 93 +- ...solidified_Matter_Plugin_Sensor_Pressure.h | 139 +- .../solidified_Matter_Plugin_Sensor_Temp.h | 135 +- .../solidified_Matter_Plugin_Shutter.h | 285 +- .../solidified_Matter_Plugin_ShutterTilt.h | 223 +- .../src/solidify/solidified_Matter_Profiler.h | 355 +- .../src/solidify/solidified_Matter_Session.h | 12 +- .../src/solidify/solidified_Matter_TLV.h | 3207 +++---- .../solidify/solidified_Matter_UDPServer.h | 989 +-- .../berry_tasmota/src/be_crypto_lib.c | 2 + .../xdrv_52_3_berry_crypto.ino | 20 +- 92 files changed, 16965 insertions(+), 13908 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bed866bf..d159e8be4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file. - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) - Berry extend `range(lower, upper, incr)` to arbitrary increment - Berry updated syntax highlighting plugin for VSCode +- Matter latency improvement for single attribute reads and single commands ### Fixed diff --git a/lib/libesp32/berry_matter/src/be_matter_module.c b/lib/libesp32/berry_matter/src/be_matter_module.c index 92374140b..9c28d4014 100644 --- a/lib/libesp32/berry_matter/src/be_matter_module.c +++ b/lib/libesp32/berry_matter/src/be_matter_module.c @@ -338,6 +338,7 @@ module matter (scope: global, strings: weak) { StatusIB, class(be_class_Matter_StatusIB) StatusResponseMessage, class(be_class_Matter_StatusResponseMessage) ReadRequestMessage, class(be_class_Matter_ReadRequestMessage) + ReadRequestMessage_solo, class(be_class_Matter_ReadRequestMessage_solo) ReportDataMessage, class(be_class_Matter_ReportDataMessage) SubscribeRequestMessage, class(be_class_Matter_SubscribeRequestMessage) SubscribeResponseMessage, class(be_class_Matter_SubscribeResponseMessage) @@ -345,6 +346,7 @@ module matter (scope: global, strings: weak) { WriteResponseMessage, class(be_class_Matter_WriteResponseMessage) TimedRequestMessage, class(be_class_Matter_TimedRequestMessage) InvokeRequestMessage, class(be_class_Matter_InvokeRequestMessage) + InvokeRequestMessage_solo, class(be_class_Matter_InvokeRequestMessage_solo) InvokeResponseMessage, class(be_class_Matter_InvokeResponseMessage) // Matter Commisioning messages diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 3202ce0e1..0ccc062c3 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -235,7 +235,7 @@ class Matter_Commisioning_Context var raw = resp.encode_frame(pake2_raw) # log the fact that a new commissioning is starting - tasmota.log(format("MTR: New Commissioning (PASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port)) + tasmota.log(format("MTR: New Commissioning (PASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port), 2) self.responder.send_response_frame(resp) return true @@ -265,7 +265,7 @@ class Matter_Commisioning_Context end # send PakeFinished and compute session key - var created = tasmota.rtc()['utc'] + var created = tasmota.rtc_utc() var session_keys = crypto.HKDF_SHA256().derive(session.__spake_Ke, bytes(), bytes().fromstring(self.SEKeys_Info), 48) var I2RKey = session_keys[0..15] var R2IKey = session_keys[16..31] @@ -406,7 +406,7 @@ class Matter_Commisioning_Context var i2r = session_keys[0..15] var r2i = session_keys[16..31] var ac = session_keys[32..47] - var created = tasmota.rtc()['utc'] + var created = tasmota.rtc_utc() # tasmota.log("MTR: ******************************", 4) # tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) @@ -538,7 +538,7 @@ class Matter_Commisioning_Context var raw = resp.encode_frame(sigma2_raw) # log the fact that a new connection is starting - tasmota.log(format("MTR: New Connection (CASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port)) + tasmota.log(format("MTR: New Connection (CASE id=%i) from [%s]:%i", session.__future_local_session_id, session._ip, session._port), 2) self.responder.send_response_frame(resp) return true @@ -658,7 +658,7 @@ class Matter_Commisioning_Context var i2r = session_keys[0..15] var r2i = session_keys[16..31] var ac = session_keys[32..47] - var created = tasmota.rtc()['utc'] + var created = tasmota.rtc_utc() # tasmota.log("MTR: ******************************", 4) # tasmota.log("MTR: I2RKey =" + i2r.tohex(), 4) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 4a9664c46..1a1575490 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -81,7 +81,7 @@ class Matter_Device return end # abort if SetOption 151 is not set - self.profiler = matter.Profiler() + matter.profiler = matter.Profiler() self.started = false self.tick = 0 self.plugins = [] @@ -514,18 +514,15 @@ class Matter_Device end var endpoint = ctx.endpoint - # var endpoint_mono = [ endpoint ] - var endpoint_found = false # did any endpoint match var cluster = ctx.cluster - # var cluster_mono = [ cluster ] - var cluster_found = false var attribute = ctx.attribute - # var attribute_mono = [ attribute ] + var endpoint_found = false # did any endpoint match + var cluster_found = false var attribute_found = false var direct = (ctx.endpoint != nil) && (ctx.cluster != nil) && (ctx.attribute != nil) # true if the target is a precise attribute, false if it results from an expansion and error are ignored - # tasmota.log(format("MTR: process_attribute_expansion %s", str(ctx)), 4) + # tasmota.log(f"MTR: process_attribute_expansion {str(ctx))}", 4) # build the list of candidates @@ -541,7 +538,7 @@ class Matter_Device endpoint_found = true # now explore the cluster list for 'ep' - var cluster_list = pi.get_cluster_list(ep) # cluster_list is the actual list of candidate cluster for this pluging and endpoint + var cluster_list = pi.get_cluster_list() # cluster_list is the actual list of candidate cluster for this pluging and endpoint # tasmota.log(format("MTR: pi=%s ep=%s cl_list=%s", str(pi), str(ep), str(cluster_list)), 4) for cl: cluster_list if cluster != nil && cl != cluster continue end # skip if specific cluster and no match @@ -550,7 +547,7 @@ class Matter_Device cluster_found = true # now filter on attributes - var attr_list = pi.get_attribute_list(ep, cl) + var attr_list = pi.get_attribute_list(cl) # tasmota.log(format("MTR: pi=%s ep=%s cl=%s at_list=%s", str(pi), str(ep), str(cl), str(attr_list)), 4) for at: attr_list if attribute != nil && at != attribute continue end # skip if specific attribute and no match @@ -595,6 +592,44 @@ class Matter_Device end end + ############################################################# + # Optimized version for a single endpoint/cluster/attribute + # + # Retrieve the plugin for a read + def process_attribute_read_solo(ctx) + var endpoint = ctx.endpoint + # var endpoint_found = false # did any endpoint match + var cluster = ctx.cluster + # var cluster_found = false + var attribute = ctx.attribute + # var attribute_found = false + + # all 3 elements must be non-nil + if endpoint == nil || cluster == nil || attribute == nil return nil end + + # look for plugin + var pi = self.find_plugin_by_endpoint(endpoint) + if pi == nil # endpoint not found + ctx.status = matter.UNSUPPORTED_ENDPOINT + return nil + end + + # check cluster + if !pi.contains_cluster(cluster) + ctx.status = matter.UNSUPPORTED_CLUSTER + return nil + end + + # attribute list + if !pi.contains_attribute(cluster, attribute) + ctx.status = matter.UNSUPPORTED_ATTRIBUTE + return nil + end + + # all good + return pi + end + ############################################################# # Return the list of endpoints from all plugins (distinct), exclud endpoint zero if `exclude_zero` is `true` def get_active_endpoints(exclude_zero) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be b/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be index 391476982..83da9d5d4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Expirable.be @@ -96,7 +96,7 @@ class Matter_Expirable # set relative time in the future for expiration (in seconds) def set_expire_in_seconds(s, now) if s == nil return end - if now == nil now = tasmota.rtc()['utc'] end + if now == nil now = tasmota.rtc_utc() end self.set_expire_time(now + s) end @@ -104,7 +104,7 @@ class Matter_Expirable # set relative time in the future for expiration (in seconds) # returns `true` if expiration date has been reached def has_expired(now) - if now == nil now = tasmota.rtc()['utc'] end + if now == nil now = tasmota.rtc_utc() end if self._expiration != nil return now >= self._expiration end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be index fb149ff45..2681197f2 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Fabric.be @@ -75,7 +75,7 @@ class Matter_Fabric : Matter_Expirable self._store = store self._sessions = matter.Expirable_list() self.fabric_label = "" - self.created = tasmota.rtc()['utc'] + self.created = tasmota.rtc_utc() # init group counters self._counter_group_data_snd_impl = matter.Counter() self._counter_group_ctrl_snd_impl = matter.Counter() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be index f56f5528f..b466dc83d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_HTTP_remote.be @@ -189,7 +189,7 @@ class Matter_HTTP_remote : Matter_HTTP_async if alive # device is known to be reachable self.reachable = true - self.reachable_utc = tasmota.rtc()['utc'] + self.reachable_utc = tasmota.rtc_utc() else self.reachable = false end @@ -344,7 +344,7 @@ class Matter_HTTP_remote : Matter_HTTP_async var seconds = -1 # default if no known value if self.reachable_utc != nil - seconds = tasmota.rtc()['utc'] - self.reachable_utc + seconds = tasmota.rtc_utc() - self.reachable_utc end return matter.seconds_to_dhm(seconds) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index 399f77c05..1f60e6b51 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -28,30 +28,53 @@ class Matter_IM var device var subs_shop # subscriptions shop - var send_queue # list of IM_Message queued for sending as part of exchange-id + var send_queue # list of IM_Message queued for sending as part of exchange-id + var read_request_solo # instance of ReadRequestMessage_solo to optimize single reads + var invoke_request_solo # instance of InvokeRequestMessage_solo to optimize single reads + var tlv_solo # instance of Matter_TLV_item for simple responses + def init(device) self.device = device self.send_queue = [] self.subs_shop = matter.IM_Subscription_Shop(self) + self.read_request_solo = matter.ReadRequestMessage_solo() + self.invoke_request_solo = matter.InvokeRequestMessage_solo() + self.tlv_solo = matter.TLV.Matter_TLV_item() end def process_incoming(msg) - # messages are always TLV, decode payload - # tasmota.log("MTR: received IM message " + matter.inspect(msg), 3) + var opcode = msg.opcode + + # Fast-Track processing + # first pass is optimized for simple frequent messages and avoids complete decoding of TLV + if opcode == 0x02 # Read Request + var read_request_solo = self.read_request_solo.from_raw(msg.raw, msg.app_payload_idx) + if read_request_solo != nil + # tasmota.log(f"MTR: process_incoming {read_request_solo=}") + return self.process_read_request_solo(msg, read_request_solo) + end + elif opcode == 0x08 # Invoke Request + var invoke_request_solo = self.invoke_request_solo.from_raw(msg.raw, msg.app_payload_idx) + # tasmota.log(f"MTR: {invoke_request_solo=} {msg.raw[msg.app_payload_idx .. ].tohex()} {msg.app_payload_idx=} {msg.raw.tohex()}") + if invoke_request_solo != nil + return self.process_invoke_request_solo(msg, invoke_request_solo) + end + end + + # tasmota.log("MTR: received IM message " + matter.inspect(msg), 3) var val = matter.TLV.parse(msg.raw, msg.app_payload_idx) # tasmota.log("MTR: IM TLV: " + str(val), 3) - var InteractionModelRevision = val.findsubval(0xFF) + # var InteractionModelRevision = val.findsubval(0xFF) # tasmota.log("MTR: InteractionModelRevision=" + (InteractionModelRevision != nil ? str(InteractionModelRevision) : "nil"), 4) - var opcode = msg.opcode if opcode == 0x01 # Status Response return self.process_status_response(msg, val) elif opcode == 0x02 # Read Request - self.send_ack_now(msg) + # self.send_ack_now(msg) # to improve latency, we don't automatically Ack on invoke request return self.process_read_request(msg, val) elif opcode == 0x03 # Subscribe Request self.send_ack_now(msg) @@ -216,48 +239,30 @@ class Matter_IM var TLV = matter.TLV var attr_name = matter.get_attribute_name(ctx.cluster, ctx.attribute) attr_name = attr_name ? " (" + attr_name + ")" : "" + # Special case to report unsupported item, if pi==nil - var res = (pi != nil) ? pi.read_attribute(session, ctx) : nil + var res = (pi != nil) ? pi.read_attribute(session, ctx, self.tlv_solo) : nil var found = true # stop expansion since we have a value var a1_raw # this is the bytes() block we need to add to response (or nil) if res != nil - var res_str = str(res) # get the value with anonymous tag before it is tagged, for logging + var res_str = res.to_str_val() # get the value with anonymous tag before it is tagged, for logging - var a1 = matter.AttributeReportIB() - a1.attribute_data = matter.AttributeDataIB() - a1.attribute_data.data_version = 1 - a1.attribute_data.path = matter.AttributePathIB() - a1.attribute_data.path.endpoint = ctx.endpoint - a1.attribute_data.path.cluster = ctx.cluster - a1.attribute_data.path.attribute = ctx.attribute - a1.attribute_data.data = res - - var a1_tlv = a1.to_TLV() - var a1_len = a1_tlv.encode_len() - var a1_bytes = bytes(a1_len) # pre-size bytes() to the actual size - a1_raw = a1_tlv.tlv2raw(a1_bytes) - # tasmota.log(format("MTR: guessed len=%i actual=%i '%s'", a1_len, size(a1_raw), a1_raw.tohex()), 2) + # encode directly raw bytes() + a1_raw = bytes(48) # pre-reserve 48 bytes + self.attributedata2raw(a1_raw, ctx, res) if !no_log tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, res_str), 3) end elif ctx.status != nil if direct # we report an error only if a concrete direct read, not with wildcards - var a1 = matter.AttributeReportIB() - a1.attribute_status = matter.AttributeStatusIB() - a1.attribute_status.path = matter.AttributePathIB() - a1.attribute_status.status = matter.StatusIB() - a1.attribute_status.path.endpoint = ctx.endpoint - a1.attribute_status.path.cluster = ctx.cluster - a1.attribute_status.path.attribute = ctx.attribute - a1.attribute_status.status.status = ctx.status + # encode directly raw bytes() + a1_raw = bytes(48) # pre-reserve 48 bytes + self.attributestatus2raw(a1_raw, ctx, ctx.status) - var a1_tlv = a1.to_TLV() - var a1_len = a1_tlv.encode_len() - var a1_bytes = bytes(a1_len) # pre-size bytes() to the actual size - a1_raw = a1_tlv.tlv2raw(a1_bytes) - - tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 3) + if tasmota.loglevel(3) + tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 3) + end end else tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - IGNORED", session.local_session_id, str(ctx), attr_name), 3) @@ -323,6 +328,280 @@ class Matter_IM return ret end + ############################################################# + # path2raw + # + # Encodes endpoint/cluster/attribute as `AttributePathIB` elements + # Takes sub-tag + # + # 1 = AttributePathIB + # 0 = EnableTagCompression bool opt + # 1 = Node + # 2 = Endpoint + # 3 = Cluste + # 4 = Attribute + # 5 = ListIndex (opt) + # + # 3701 1 = LIST + # 2402 01 2 = 1U (U1) + # 2403 39 3 = 0x39U (U1) + # 2404 11 4 = 0x11U (U1) + # 18 + def path2raw(raw, ctx, sub_tag) + # open struct + raw.add(0x37, 1) # add 37 + raw.add(sub_tag, 1) # add sub_tag + # add endpoint + if ctx.endpoint <= 0xFF # endpoint is 16 bits max + raw.add(0x2402, -2) # add 2402 + raw.add(ctx.endpoint, 1) + else + raw.add(0x2502, -2) # add 2502 + raw.add(ctx.endpoint, 2) + end + # add cluster + if ctx.cluster <= 0xFF # cluster is 32 bits max + raw.add(0x2403, -2) # add 2403 + raw.add(ctx.cluster, 1) + elif ctx.cluster <= 0xFFFF + raw.add(0x2503, -2) # add 2503 + raw.add(ctx.cluster, 2) + else + raw.add(0x2603, -2) # add 2603 + raw.add(ctx.cluster, 4) + end + # add attribute + if ctx.attribute <= 0xFF # cluster is 32 bits max + raw.add(0x2404, -2) # add 2404 + raw.add(ctx.attribute, 1) + elif ctx.attribute <= 0xFFFF + raw.add(0x2504, -2) # add 2504 + raw.add(ctx.attribute, 2) + else + raw.add(0x2604, -2) # add 2604 + raw.add(ctx.attribute, 4) + end + raw.add(0x18, 1) # add 18 + end + + ############################################################# + # attributedata2raw + # + # generate a raw version of AttributeDataIB + # + # Typical answer + # + # AttributeReportIB + # 0 = AttributeStatusIB + # 1 = AttributeDataIB + # 0 = DataVersion U1 + # 1 = AttributePathIB + # 0 = EnableTagCompression bool opt + # 1 = Node + # 2 = Endpoint + # 3 = Cluste + # 4 = Attribute + # 5 = ListIndex (opt) + # 2 = Data + # + # 153601.15350124000137012402012403392404111829021818.1824FF0118 + # 15350124000137012402012403392404111829021818 + # 1535012400013701 + # 240201240339240411 + # 1829021818 + # + # 15 + # 3501 1 = {} + # 2400 01 0 = 1U (U1) + # 3701 1 = LIST + # 2402 01 2 = 1U (U1) + # 2403 39 3 = 0x39U (U1) + # 2404 11 4 = 0x11U (U1) + # 18 + # 2902 2 = True + # 18 + # 18 + def attributedata2raw(raw, ctx, val) + raw.add(0x15350124, -4) # add 15350124 + raw.add(0x0001, -2) # add 0001 + + self.path2raw(raw, ctx, 0x01) + + # add value with tag 2 + val.tag_sub = 2 + val.tlv2raw(raw) + # close 2 structs + raw.add(0x1818, -2) + end + + ############################################################# + # attributedata2raw + # + # generate a raw version of AttributeStatusIB + # + # + # Typical answer + # + # AttributeReportIB + # 0 = AttributeStatusIB + # 0 = AttributePathIB + # 0 = EnableTagCompression bool opt + # 1 = Node + # 2 = Endpoint + # 3 = Cluste + # 4 = Attribute + # 5 = ListIndex (opt) + # 1 = StatusIB + # 0 = Status (u1) + # 1 = ClusterStatus (u1) + # 1 = AttributeDataIB + # + # 15360115350037002402012403022404031835012400041818181824FF0118 + # 153601 1535003700 - 2402012403022404031835012400041818181824FF0118 + # + # 15 + # 3601 + # + # 15 + # 3500 0 = struct + # 3700 0 = list + # 240201 2 = 1U endpoint + # 240302 3 = 2U cluster + # 240403 4 = 3U attribute + # 18 + # 3501 1 = struct + # 240004 0 = 4U status + # 18 + # 18 + # 18 + # + # 18 + # 24FF01 + # 18 + def attributestatus2raw(raw, ctx, status) + raw.add(0x15, 1) # add 15 + raw.add(0x3500, -2) # add 3500 + + self.path2raw(raw, ctx, 0x00) + + raw.add(0x3501, -2) # add 3501 for status + # status + if ctx.status <= 255 + raw.add(0x2400, -2) # add 2400 + raw.add(ctx.status, 1) + else + raw.add(0x2500, -2) # add 2500 + raw.add(ctx.status, 2) + end + # close + raw.add(0x1818, -2) # add 1818 + raw.add(0x18, 1) # add 18 + end + + ############################################################# + # attributedata2raw + # + # generate a raw version of InvokeResponseIB() + # Typical answer + # + # 1535013700240011240122240244183501240000181818 + # + # 0 = CommandDataIB + # 0 = CommandPathIB + # 0 = endpoint u2 + # 1 = cluster u4 + # 2 = command u4 + # 1 = + # 1 = CommandStatusIB + # 0 = CommandPathIB + # 0 = endpoint u2 + # 1 = cluster u4 + # 2 = command u4 + # 1 = StatusIB + # 0 = status u1 + # 1 = ClusterStatus u1 + # + # 1535013700240011240122240244183501240000181818 + # 15 + # 3501 1 = struct + # 3700 0 = list + # 240011 0 = endpoint + # 240122 1 = cluster + # 240244 2 = command + # 18 + # 3501 1 = struct + # 240000 0 = 0 (status) + # 18 + # 18 + # 18 + # + # 1535003700240011240122240244182401031818 + # 15 + # 3500 0 = struct + # 3700 0 = list + # 240011 0 = endpoint + # 240122 1 = cluster + # 240244 2 = command + # 18 + # 240103 1 = + # 18 + # 18 + def invokeresponse2raw(raw, ctx, val) + raw.add(0x15, 1) # add 15 + if val == nil + raw.add(0x3501, -2) # add 3500 + else + raw.add(0x3500, -2) # add 3500 + end + raw.add(0x3700, -2) # add 3700 + # add endpoint + if ctx.endpoint <= 0xFF # endpoint is 16 bits max + raw.add(0x2400, -2) # add 2400 + raw.add(ctx.endpoint, 1) + else + raw.add(0x2500, -2) # add 2500 + raw.add(ctx.endpoint, 2) + end + # add cluster + if ctx.cluster <= 0xFF # cluster is 32 bits max + raw.add(0x2401, -2) # add 2401 + raw.add(ctx.cluster, 1) + elif ctx.cluster <= 0xFFFF + raw.add(0x2501, -2) # add 2501 + raw.add(ctx.cluster, 2) + else + raw.add(0x2601, -2) # add 2601 + raw.add(ctx.cluster, 4) + end + # add attribute + if ctx.command <= 0xFF # cluster is 32 bits max + raw.add(0x2402, -2) # add 2402 + raw.add(ctx.command, 1) + elif ctx.command <= 0xFFFF + raw.add(0x2502, -2) # add 2502 + raw.add(ctx.command, 2) + else + raw.add(0x2602, -2) # add 2602 + raw.add(ctx.command, 4) + end + raw.add(0x18, 1) # add 18 + + # either value or statuc + if val == nil + var status = ctx.status + if status == nil status = matter.SUCCESS end + raw.add(0x3501, -2) # add 3501 + raw.add(0x2400, -2) # add 2400 + raw.add(ctx.status, 1) # add status:1 + raw.add(0x18, 1) # add 18 + else + val.tag_sub = 1 # set sub_tag for reponse + val.tlv2raw(raw) + end + # close + raw.add(0x1818, -2) # add 1818 + end + ############################################################# # process IM 0x02 Read Request # @@ -330,8 +609,10 @@ class Matter_IM # returns `true` if processed, `false` if silently ignored, # or raises an exception def process_read_request(msg, val) - self.device.profiler.log("read_request_start") + matter.profiler.log("read_request_start") + # matter.profiler.log(str(val)) var query = matter.ReadRequestMessage().from_TLV(val) + # matter.profiler.log(str(query)) if query.attributes_requests != nil var ret = self._inner_process_read_request(msg.session, query) self.send_report_data(msg, ret) @@ -340,6 +621,133 @@ class Matter_IM return true end + ############################################################# + # process IM 0x02 Read Request + # + # val is the TLV structure + # returns `true` if processed, `false` if silently ignored, + # or raises an exception + def process_read_request_solo(msg, ctx) + # matter.profiler.log("read_request_solo start") + # matter.profiler.log(str(val)) + # var query = matter.ReadRequestMessage().from_TLV(val) + # matter.profiler.log("read_request_start-TLV") + + # prepare fallback error + ctx.status = matter.INVALID_ACTION + + # TODO + # find pi for this endpoint/cluster/attribute + var pi = self.device.process_attribute_read_solo(ctx) + var res = nil + # matter.profiler.log("read_request_solo pi ok") + # tasmota.log(f"MTR: process_read_request_solo {pi=}") + + var raw # this is the bytes() block we need to add to response (or nil) + if pi != nil + ctx.status = matter.UNSUPPORTED_ATTRIBUTE # new fallback error + res = pi.read_attribute(msg.session, ctx, self.tlv_solo) + end + matter.profiler.log("read_request_solo read done") + + if res != nil + + # encode directly raw bytes() + raw = bytes(48) # pre-reserve 48 bytes + + raw.add(0x15, 1) # add 15 + raw.add(0x3601, -2) # add 3601 + + self.attributedata2raw(raw, ctx, res) + + # add suffix 1824FF0118 + raw.add(0x1824FF01, -4) # add 1824FF01 + raw.add(0x18, 1) # add 18 + + # matter.profiler.log("read_request_solo raw done") + + elif ctx.status != nil + + # encode directly raw bytes() + raw = bytes(48) # pre-reserve 48 bytes + + raw.add(0x15, 1) # add 15 + raw.add(0x3601, -2) # add 3601 + + self.attributestatus2raw(raw, ctx, ctx.status) + + # add suffix 1824FF0118 + raw.add(0x1824FF01, -4) # add 1824FF01 + raw.add(0x18, 1) # add 18 + + else + tasmota.log(f"MTR: >Read_Attr ({msg.session.local_session_id:6i}) {ctx} - IGNORED", 3) + return false + end + + # matter.profiler.log("read_request_solo res ready") + # tasmota.log(f"MTR: process_read_request_solo {raw=}") + + # send packet + # self.send_report_data_solo(msg, ret) + # var report_solo = matter.IM_ReportData_solo(msg, ret) + var resp = msg.build_response(0x05 #-Report Data-#, true) + + # super(self).reset(msg, 0x05 #-Report Data-#, true) + # matter.profiler.log("read_request_solo report_solo") + + # send_im() + # report_solo.send_im(self.device.message_handler) + var responder = self.device.message_handler + # matter.profiler.log("read_request_solo send_im-1") + # if tasmota.loglevel(3) # TODO remove before flight + # tasmota.log(f">>>: data_raw={raw.tohex()}", 3) + # end + # matter.profiler.log("read_request_solo send_im-2") + var msg_raw = msg.raw + msg_raw.clear() + resp.encode_frame(raw, msg_raw) # payload in cleartext + # matter.profiler.log("read_request_solo send_im-3") + resp.encrypt() + # matter.profiler.log("read_request_solo send_im-encrypted") + if tasmota.loglevel(4) + tasmota.log(format("MTR: Read_Attr1({msg.session.local_session_id:6i}) {ctx}{attr_name} - {res_str}", 3) + end + # if matter.profiler.active && tasmota.loglevel(3) + # tasmota.log(f"MTR: {raw=}", 3) # TODO remove before flight + # end + elif ctx.status != nil + var unsupported_attribute = (ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : "") + if tasmota.loglevel(3) + tasmota.log(f"MTR: >Read_Attr1({msg.session.local_session_id:6i}) {ctx}{attr_name} - STATUS: 0x{ctx.status:02X} {unsupported_attribute}", 3) + end + # if matter.profiler.active && tasmota.loglevel(3) + # tasmota.log(f"MTR: {raw=}", 3) # TODO remove before flight + # end + else + if tasmota.loglevel(3) + tasmota.log(f"MTR: >Read_Attr1({msg.session.local_session_id:6i}) {ctx}{attr_name} - IGNORED", 3) + end + end + + # matter.profiler.log("read_request_solo end") + return true + end + ############################################################# # process IM 0x03 Subscribe Request # @@ -384,7 +792,7 @@ class Matter_IM # import debug # structure is `ReadRequestMessage` 10.6.2 p.558 # tasmota.log("MTR: IM:invoke_request processing start", 4) - self.device.profiler.log("invoke_request_start") + matter.profiler.log("invoke_request_start") var ctx = matter.Path() ctx.msg = msg @@ -404,44 +812,39 @@ class Matter_IM var cmd_name = matter.get_command_name(ctx.cluster, ctx.command) var ctx_str = str(ctx) # keep string before invoking, it is modified by response var res = self.device.invoke_request(msg.session, q.command_fields, ctx) + matter.profiler.log("COMMAND DONE") var params_log = (ctx.log != nil) ? "(" + str(ctx.log) + ") " : "" tasmota.log(format("MTR: >Command (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), ctx.endpoint != 0 ? 2 : 3 #- don't log for endpoint 0 -# ) # tasmota.log("MTR: Perf/Command = " + str(debug.counters()), 4) ctx.log = nil - var a1 = matter.InvokeResponseIB() + var raw = bytes(32) + # var a1 = matter.InvokeResponseIB() if res == true || ctx.status == matter.SUCCESS # special case, just respond ok - a1.status = matter.CommandStatusIB() - a1.status.command_path = matter.CommandPathIB() - a1.status.command_path.endpoint = ctx.endpoint - a1.status.command_path.cluster = ctx.cluster - a1.status.command_path.command = ctx.command - a1.status.status = matter.StatusIB() - a1.status.status.status = matter.SUCCESS - ret.invoke_responses.push(a1) - tasmota.log(format("MTR: Command1 (%6i) %s %s %s", msg.session.local_session_id, ctx_str, cmd_name ? cmd_name : "", params_log), cmd_log_level) + end + # tasmota.log("MTR: Perf/Command = " + str(debug.counters()), 4) + ctx.log = nil + var raw = bytes(48) + + # prefix 1528003601 + raw.add(0x15280036, -4) # add 15280036 + raw.add(0x01, 1) # add 01 + if res == true || ctx.status == matter.SUCCESS # special case, just respond ok + ctx.status = matter.SUCCESS + self.invokeresponse2raw(raw, ctx, nil) + + if tasmota.loglevel(3) + tasmota.log(f"MTR: Sub_OK (%6i) sub=%i", msg.session.local_session_id, self.sub.subscription_id), 3) + if tasmota.loglevel(3) + tasmota.log(format("MTR: >Sub_OK (%6i) sub=%i", msg.session.local_session_id, self.sub.subscription_id), 3) + end return super(self).status_ok_received(msg) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be index d0c4e0066..70ff59835 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Message.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Message.be @@ -171,8 +171,12 @@ class Matter_Frame # # Header is built from attributes # `payload` is a bytes() buffer for the app payload - def encode_frame(payload) - var raw = bytes() + # + # you can pass a `raw` bytes() object to be used + def encode_frame(payload, raw) + if raw == nil + raw = bytes(16 + (payload ? size(payload) : 0)) + end # compute flags if self.flags == nil self.flags = 0x00 @@ -220,7 +224,7 @@ class Matter_Frame raw .. payload end - self.debug(raw) + # self.debug(raw) self.raw = raw return raw end @@ -343,11 +347,15 @@ class Matter_Frame ############################################################# # decrypt with I2S key # return cleartext or `nil` if failed + # + # frame.raw is decrypted in-place and the MIC is removed + # returns true if successful def decrypt() import crypto var session = self.session var raw = self.raw - var mic = raw[-16..] # take last 16 bytes as signature + var payload_idx = self.payload_idx + var tag_len = 16 # decrypt the message with `i2r` key var i2r = session.get_i2r() @@ -357,6 +365,7 @@ class Matter_Frame # compute privacy key, p.71 tasmota.log("MTR: >>>>>>>>>>>>>>>>>>>> Compute Privacy TODO", 2) var k = session.get_i2r_privacy() + var mic = raw[-16..] # take last 16 bytes as signature var n = bytes().add(self.local_session_id, -2) + mic[5..15] # session in Big Endian var m = self.raw[4 .. self.payload_idx-1] var m_clear = crypto.AES_CTR(k).decrypt(m, n, 2) @@ -364,11 +373,9 @@ class Matter_Frame self.raw = self.raw[0..3] + m_clear + m[self.payload_idx .. ] end - # use AES_CCM - var a = raw[0 .. self.payload_idx - 1] - var p = raw[self.payload_idx .. -17] # recompute nonce - var n = bytes() + var n = self.message_handler._n_bytes # use cached bytes() object to avoid allocation + n.clear() n.add(self.flags, 1) n.add(self.message_counter, 4) if self.source_node_id @@ -381,28 +388,26 @@ class Matter_Frame end # tasmota.log("MTR: ******************************", 4) + # tasmota.log("MTR: raw =" + raw.tohex(), 4) # tasmota.log("MTR: i2r =" + i2r.tohex(), 4) - # tasmota.log("MTR: p =" + p.tohex(), 4) - # tasmota.log("MTR: a =" + a.tohex(), 4) + # tasmota.log("MTR: p =" + raw[payload_idx .. -17].tohex(), 4) + # tasmota.log("MTR: a =" + raw[0 .. payload_idx - 1].tohex(), 4) # tasmota.log("MTR: n =" + n.tohex(), 4) - # tasmota.log("MTR: mic =" + mic.tohex(), 4) + # tasmota.log("MTR: mic =" + raw[-16..].tohex(), 4) # decrypt - var aes = crypto.AES_CCM(i2r, n, a, size(p), 16) - var cleartext = aes.decrypt(p) - var tag = aes.tag() - - # tasmota.log("MTR: ******************************", 4) - # tasmota.log("MTR: cleartext =" + cleartext.tohex(), 4) - # tasmota.log("MTR: tag =" + tag.tohex(), 4) - # tasmota.log("MTR: ******************************", 4) - - if tag != mic + var ret = crypto.AES_CCM.decrypt1(i2r, # secret key + n, 0, size(n), # nonce / IV + raw, 0, payload_idx, # aad + raw, payload_idx, size(raw) - payload_idx - tag_len, # encrypted - decrypted in-place + raw, size(raw) - tag_len, tag_len) # MIC + if ret + # succcess + raw.resize(size(raw) - tag_len) # remove MIC + else tasmota.log("MTR: rejected packet due to invalid MIC", 3) - return nil end - - return cleartext + return ret end ############################################################# @@ -413,15 +418,15 @@ class Matter_Frame import crypto var raw = self.raw var session = self.session + var payload_idx = self.payload_idx + var tag_len = 16 # encrypt the message with `i2r` key var r2i = session.get_r2i() - # use AES_CCM - var a = raw[0 .. self.payload_idx - 1] - var p = raw[self.payload_idx .. ] # recompute nonce - var n = bytes() + var n = self.message_handler._n_bytes # use cached bytes() object to avoid allocation + n.clear() n.add(self.flags, 1) n.add(self.message_counter, 4) if session.is_CASE() && session.get_device_id() @@ -429,30 +434,14 @@ class Matter_Frame end n.resize(13) # add zeros - # tasmota.log("MTR: cleartext: " + self.raw.tohex(), 4) + # encrypt + raw.resize(size(raw) + tag_len) # make room for MIC + var ret = crypto.AES_CCM.encrypt1(r2i, # secret key + n, 0, size(n), # nonce / IV + raw, 0, payload_idx, # aad + raw, payload_idx, size(raw) - payload_idx - tag_len, # encrypted - decrypted in-place + raw, size(raw) - tag_len, tag_len) # MIC - # tasmota.log("MTR: ******************************", 4) - # tasmota.log("MTR: r2i =" + r2i.tohex(), 4) - # tasmota.log("MTR: p =" + p.tohex(), 4) - # tasmota.log("MTR: a =" + a.tohex(), 4) - # tasmota.log("MTR: n =" + n.tohex(), 4) - - # decrypt - var aes = crypto.AES_CCM(r2i, n, a, size(p), 16) - var ciphertext = aes.encrypt(p) - var tag = aes.tag() - - # tasmota.log("MTR: ******************************", 4) - # tasmota.log("MTR: ciphertext =" + ciphertext.tohex(), 4) - # tasmota.log("MTR: tag =" + tag.tohex(), 4) - # tasmota.log("MTR: ******************************", 4) - - # packet is good, put back content in raw - self.raw.resize(self.payload_idx) # remove cleartext payload - self.raw .. ciphertext # add ciphertext - self.raw .. tag # add MIC - - # tasmota.log("MTR: encrypted: " + self.raw.tohex(), 4) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be index 6f64a8671..63336e4f7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_MessageHandler.be @@ -30,12 +30,16 @@ class Matter_MessageHandler var im # Instance of `matter.IM` handling Interaction Model var control_message # Instance of `matter.Control_Message` for MCSP + # cache for decryption bytes + var _n_bytes # size 16 minimal, used by frame_buffer for decryption + ############################################################# def init(device) self.device = device self.commissioning = matter.Commisioning_Context(self) self.im = matter.IM(device) self.control_message = matter.Control_Message(self) + self._n_bytes = bytes(16) end ############################################################# @@ -47,7 +51,9 @@ class Matter_MessageHandler if frame.x_flag_r # nothing to respond, check if we need a standalone ack var resp = frame.build_standalone_ack(reliable) resp.encode_frame() - tasmota.log(format("MTR: Received (%6i) %s rid=%i exch=%i from [%s]:%i", session.local_session_id, op_name, frame.message_counter, frame.exchange_id, addr, port), 3) + if tasmota.loglevel(3) + tasmota.log(format("MTR: >Received (%6i) %s rid=%i exch=%i from [%s]:%i", session.local_session_id, op_name, frame.message_counter, frame.exchange_id, addr, port), 3) + end else - tasmota.log(format("MTR: >rcv Ack (%6i) rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.message_counter, frame.x_flag_r ? "{reliable} " : "", frame.exchange_id, str(frame.ack_message_counter), addr, port), 4) + if tasmota.loglevel(4) + tasmota.log(format("MTR: >rcv Ack (%6i) rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.message_counter, frame.x_flag_r ? "{reliable} " : "", frame.exchange_id, str(frame.ack_message_counter), addr, port), 4) + end end ret = self.commissioning.process_incoming(frame) # if ret is false, the implicit Ack was not sent @@ -124,14 +139,19 @@ class Matter_MessageHandler else ############################################################# # encrypted message - tasmota.log(format("MTR: decode header: local_session_id=%i message_counter=%i", frame.local_session_id, frame.message_counter), 4) + # matter.profiler.log("msg_received_header_encrypted_message_received") + if tasmota.loglevel(4) + tasmota.log(format("MTR: decode header: local_session_id=%i message_counter=%i", frame.local_session_id, frame.message_counter), 4) + end var session = self.device.sessions.get_session_by_local_session_id(frame.local_session_id) + # matter.profiler.log("msg_received_header_session_retrieved") if session == nil tasmota.log("MTR: unknown local_session_id="+str(frame.local_session_id), 3) # tasmota.log("MTR: frame="+matter.inspect(frame), 3) return false end + # matter.profiler.log("msg_received_session_found") if addr session._ip = addr end if port session._port = port end session._message_handler = self @@ -139,22 +159,26 @@ class Matter_MessageHandler # check if it's a duplicate if !session.counter_rcv_validate(frame.message_counter, true) - tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3) + if tasmota.loglevel(3) + tasmota.log("MTR: . Duplicate encrypted message = " + str(frame.message_counter) + " counter=" + str(session.counter_rcv), 3) + end self.send_encrypted_ack(frame, false #-not reliable-#) return false end - var cleartext = frame.decrypt() - if !cleartext return false end + var decrypt_ok = frame.decrypt() + matter.profiler.log("msg_received_header_frame_decrypted") + if !decrypt_ok return false end - # packet is good, put back content in raw - frame.raw = frame.raw[0 .. frame.payload_idx - 1] # remove encrypted payload - frame.raw .. cleartext # add cleartext + # matter.profiler.log("msg_received_payload_undecoded") # continue decoding # tasmota.log(format("MTR: idx=%i clear=%s", frame.payload_idx, frame.raw.tohex()), 4) frame.decode_payload() - tasmota.log("MTR: > Decrypted message: protocol_id:"+str(frame.protocol_id)+" opcode="+str(frame.opcode)+" exchange_id="+str(frame.exchange_id & 0xFFFF), 4) + # matter.profiler.log("msg_received_payload_decoded") + if tasmota.loglevel(4) + tasmota.log("MTR: > Decrypted message: protocol_id:"+str(frame.protocol_id)+" opcode="+str(frame.opcode)+" exchange_id="+str(frame.exchange_id & 0xFFFF), 4) + end # tasmota.log(format("MTR: >rcv (%6i) [%02X/%02X] rid=%i exch=%i ack=%s %sfrom [%s]:%i", session.local_session_id, frame.protocol_id, frame.opcode, frame.message_counter, frame.exchange_id, str(frame.ack_message_counter), frame.x_flag_r ? "{reliable} " : "", addr, port), 3) @@ -174,8 +198,9 @@ class Matter_MessageHandler ret = true elif protocol_id == 0x0001 # PROTOCOL_ID_INTERACTION_MODEL # dispatch to IM Protocol Messages + matter.profiler.log("process_IM_start") ret = self.im.process_incoming(frame) - self.device.profiler.log("process_IM_end") + matter.profiler.log("process_IM_end") # if `ret` is true, we have something to send if ret self.im.send_enqueued(self) @@ -222,7 +247,7 @@ class Matter_MessageHandler # msg.exchange_id: exchange id (int) # msg.local_session_id: local session (for logging) def send_response_frame(msg) - self.device.profiler.log("send_response_frame") + matter.profiler.log("send_response_frame") self.device.msg_send(msg) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be index e9fe1d130..c22b87276 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be @@ -30,21 +30,23 @@ class Matter_Path var endpoint # endpoint or `nil` if expansion var cluster # cluster or `nil` if expansion var attribute # attribute or `nil` if expansion + var fabric_filtered # bool or nil var command # command var status # status to be returned (matter.SUCCESS or matter.) var log # any string that needs to be logged (used to show significant parameters for commands) var msg # reference of the original message - # clear the context, allows reuse of the same object - def clear() - var n = nil + # reset the object, allows reuse of the same object + def reset() + var n = nil # it's actually more compact code to load `nil` into a register and assign all members self.endpoint = n self.cluster = n self.attribute = n + self.fabric_filtered = n self.command = n self.status = n self.log = n - self.msh = n + self.msg = n end def tostring() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be index 4babaaba8..cdc6076a7 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin.be @@ -147,16 +147,32 @@ class Matter_Plugin def get_endpoint() return self.endpoint end - def get_cluster_list(ep) + def get_cluster_list() var ret = [] for k: self.clusters.keys() ret.push(k) end return ret end - def get_attribute_list(ep, cluster) + def contains_cluster(cluster) + return self.clusters.contains(cluster) + end + def get_attribute_list(cluster) return self.clusters.find(cluster, []) end + def contains_attribute(cluster, attribute) + var attr_list = self.clusters.find(cluster) + if attr_list != nil + var idx = 0 + while idx < size(attr_list) + if attr_list[idx] == attribute + return true + end + idx += 1 + end + end + return false + end ############################################################# # Does it handle this endpoint and this cluster @@ -171,7 +187,10 @@ class Matter_Plugin ############################################################# ############################################################# # read attribute - def read_attribute(session, ctx) + # + # Arg: + # `tlv_solo` contains an instance of `Matter_TLV_item` to avoid allocating a new object with TLV.create_TLV + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -200,18 +219,18 @@ class Matter_Plugin var pl = TLV.Matter_TLV_array() return pl elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # + return tlv_solo.set(TLV.U4, 0) # elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 1) # "Initial Release" + return tlv_solo.set(TLV.U4, 1) # "Initial Release" end # ==================================================================================================== elif cluster == 0x0039 # ========== Bridged Device Basic Information 9.13 p.485 ========== if attribute == 0x0011 # ---------- Reachable / bool ---------- - return TLV.create_TLV(TLV.BOOL, 1) # by default we are reachable + return tlv_solo.set(TLV.BOOL, 1) # by default we are reachable else - return super(self).read_attribute(session, ctx) # rest is handled by 0x0028 + return super(self).read_attribute(session, ctx, tlv_solo) # rest is handled by 0x0028 end else return nil diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be index e1ee424f6..690ea2ed1 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Aggregator.be @@ -37,7 +37,7 @@ class Matter_Plugin_Aggregator : Matter_Plugin ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -55,11 +55,11 @@ class Matter_Plugin_Aggregator : Matter_Plugin end return pl else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end # no match found, return that the attribute is unsupported diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be index 1335a8861..b3df63081 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_HTTP.be @@ -175,7 +175,7 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device ############################################################# # read attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -187,35 +187,35 @@ class Matter_Plugin_Bridge_HTTP : Matter_Plugin_Device if attribute == 0x0003 # ---------- ProductName / string ---------- var name = self.http_remote.get_info().find("name") if name - return TLV.create_TLV(TLV.UTF1, name) + return tlv_solo.set(TLV.UTF1, name) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x000A # ---------- SoftwareVersionString / string ---------- var version_full = self.http_remote.get_info().find("version") if version_full var version_end = string.find(version_full, '(') if version_end > 0 version_full = version_full[0..version_end - 1] end - return TLV.create_TLV(TLV.UTF1, version_full) + return tlv_solo.set(TLV.UTF1, version_full) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x000F || attribute == 0x0012 # ---------- SerialNumber || UniqueID / string ---------- var mac = self.http_remote.get_info().find("mac") if mac - return TLV.create_TLV(TLV.UTF1, mac) + return tlv_solo.set(TLV.UTF1, mac) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0011 # ---------- Reachable / bool ---------- # self.is_reachable_lazy_sync() # Not needed anymore - return TLV.create_TLV(TLV.BOOL, self.http_remote.reachable) # TODO find a way to do a ping + return tlv_solo.set(TLV.BOOL, self.http_remote.reachable) # TODO find a way to do a ping else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be index c65099cb9..c92eff4db 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light0.be @@ -90,7 +90,7 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -99,15 +99,15 @@ class Matter_Plugin_Bridge_Light0 : Matter_Plugin_Bridge_HTTP if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + return tlv_solo.set(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 4) # 0 = no Level Control for Lighting end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be index bc0b66a99..da53e225e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light1.be @@ -78,7 +78,7 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -88,30 +88,30 @@ class Matter_Plugin_Bridge_Light1 : Matter_Plugin_Bridge_Light0 self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentLevel / u1 ---------- if self.shadow_bri != nil - return TLV.create_TLV(TLV.U1, self.shadow_bri) + return tlv_solo.set(TLV.U1, self.shadow_bri) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0002 # ---------- MinLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x0003 # ---------- MaxLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 254) + return tlv_solo.set(TLV.U1, 254) elif attribute == 0x000F # ---------- Options / map8 ---------- - return TLV.create_TLV(TLV.U1, 0) # + return tlv_solo.set(TLV.U1, 0) # elif attribute == 0x0011 # ---------- OnLevel / u1 ---------- if self.shadow_bri != nil - return TLV.create_TLV(TLV.U1, self.shadow_bri) + return tlv_solo.set(TLV.U1, self.shadow_bri) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0X01) # OnOff + return tlv_solo.set(TLV.U4, 0X01) # OnOff elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be index adf2f591c..596790042 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light2.be @@ -95,7 +95,7 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -105,29 +105,29 @@ class Matter_Plugin_Bridge_Light2 : Matter_Plugin_Bridge_Light1 self.update_shadow_lazy() if attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- if self.shadow_ct != nil - return TLV.create_TLV(TLV.U1, self.shadow_ct) + return tlv_solo.set(TLV.U1, self.shadow_ct) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 2)# 2 = ColorTemperatureMireds + return tlv_solo.set(TLV.U1, 2)# 2 = ColorTemperatureMireds elif attribute == 0x000F # ---------- Options / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x400B # ---------- ColorTempPhysicalMinMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, self.ct_min) + return tlv_solo.set(TLV.U1, self.ct_min) elif attribute == 0x400C # ---------- ColorTempPhysicalMaxMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, self.ct_max) + return tlv_solo.set(TLV.U1, self.ct_max) elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x10) # CT + return tlv_solo.set(TLV.U4, 0x10) # CT elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x10) # CT + return tlv_solo.set(TLV.U4, 0x10) # CT elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation, FeatureMap support" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be index 6bff511ef..9898cfbb4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Light3.be @@ -95,7 +95,7 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -105,39 +105,39 @@ class Matter_Plugin_Bridge_Light3 : Matter_Plugin_Bridge_Light1 self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentHue / u1 ---------- if self.shadow_hue != nil - return TLV.create_TLV(TLV.U1, self.shadow_hue) + return tlv_solo.set(TLV.U1, self.shadow_hue) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- CurrentSaturation / u2 ---------- if self.shadow_sat != nil - return TLV.create_TLV(TLV.U1, self.shadow_sat) + return tlv_solo.set(TLV.U1, self.shadow_sat) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 0)# 0 = CurrentHue and CurrentSaturation + return tlv_solo.set(TLV.U1, 0)# 0 = CurrentHue and CurrentSaturation elif attribute == 0x000F # ---------- Options / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x400A # ---------- ColorCapabilities / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x01) # HS + return tlv_solo.set(TLV.U4, 0x01) # HS # Defined Primaries Information Attribute Set elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x01) # HS + return tlv_solo.set(TLV.U4, 0x01) # HS elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation, FeatureMap support" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be index c2793b6fb..09411b809 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Contact.be @@ -71,7 +71,7 @@ class Matter_Plugin_Bridge_Sensor_Contact : Matter_Plugin_Bridge_HTTP ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -80,18 +80,18 @@ class Matter_Plugin_Bridge_Sensor_Contact : Matter_Plugin_Bridge_HTTP if cluster == 0x0045 # ========== Boolean State ========== if attribute == 0x0000 # ---------- StateValue / bool ---------- if self.shadow_contact != nil - return TLV.create_TLV(TLV.BOOL, self.shadow_contact) + return tlv_solo.set(TLV.BOOL, self.shadow_contact) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 1) # 1 = Initial release + return tlv_solo.set(TLV.U4, 1) # 1 = Initial release end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be index 4d636ddcd..ebd83502a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Humidity.be @@ -56,7 +56,7 @@ class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -65,22 +65,22 @@ class Matter_Plugin_Bridge_Sensor_Humidity : Matter_Plugin_Bridge_Sensor if cluster == 0x0405 # ========== Humidity Measurement 2.4 p.98 ========== if attribute == 0x0000 # ---------- Humidity / u16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + return tlv_solo.set(TLV.U2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / u16 ---------- - return TLV.create_TLV(TLV.U2, 500) # 0% + return tlv_solo.set(TLV.U2, 500) # 0% elif attribute == 0x0002 # ---------- MaxMeasuredValue / u16 ---------- - return TLV.create_TLV(TLV.U2, 10000) # 100% + return tlv_solo.set(TLV.U2, 10000) # 100% elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + return tlv_solo.set(TLV.U4, 0) # 0 = no Extended Range elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be index f552f7f9a..b3904bda6 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Illuminance.be @@ -63,7 +63,7 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -72,22 +72,22 @@ class Matter_Plugin_Bridge_Sensor_Illuminance : Matter_Plugin_Bridge_Sensor if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + return tlv_solo.set(TLV.U2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.U2, 1) # 1 lux + return tlv_solo.set(TLV.U2, 1) # 1 lux elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.U2, 0xFFFE) + return tlv_solo.set(TLV.U2, 0xFFFE) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be index 416e0f7d4..3e312259f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Occupancy.be @@ -71,7 +71,7 @@ class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -80,22 +80,22 @@ class Matter_Plugin_Bridge_Sensor_Occupancy : Matter_Plugin_Bridge_HTTP if cluster == 0x0406 # ========== Occupancy Sensing ========== if attribute == 0x0000 # ---------- Occupancy / U8 ---------- if self.shadow_occupancy != nil - return TLV.create_TLV(TLV.U1, self.shadow_occupancy) + return tlv_solo.set(TLV.U1, self.shadow_occupancy) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- OccupancySensorType / enum8 ---------- - return TLV.create_TLV(TLV.U1, 3) # physical contact + return tlv_solo.set(TLV.U1, 3) # physical contact elif attribute == 0x0002 # ---------- OccupancySensorTypeBitmap / u8 ---------- - return TLV.create_TLV(TLV.U1, 0) # unknown + return tlv_solo.set(TLV.U1, 0) # unknown elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 4 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 4 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be index 9fcff1e85..b519fed3d 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Pressure.be @@ -56,7 +56,7 @@ class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -65,22 +65,22 @@ class Matter_Plugin_Bridge_Sensor_Pressure : Matter_Plugin_Bridge_Sensor if cluster == 0x0403 # ========== Pressure Measurement 2.4 p.98 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + return tlv_solo.set(TLV.I2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 500) # 500 hPA + return tlv_solo.set(TLV.I2, 500) # 500 hPA elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 1500) # 1500 hPA + return tlv_solo.set(TLV.I2, 1500) # 1500 hPA elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + return tlv_solo.set(TLV.U4, 0) # 0 = no Extended Range elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be index 3dbb0b771..7980044c3 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Bridge_Sensor_Temp.be @@ -59,7 +59,7 @@ class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -68,22 +68,22 @@ class Matter_Plugin_Bridge_Sensor_Temp : Matter_Plugin_Bridge_Sensor if cluster == 0x0402 # ========== Temperature Measurement 2.3 p.97 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 (*100) ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, self.shadow_value) + return tlv_solo.set(TLV.I2, self.shadow_value) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 (*100) ---------- - return TLV.create_TLV(TLV.I2, -5000) # -50 °C + return tlv_solo.set(TLV.I2, -5000) # -50 °C elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 (*100) ---------- - return TLV.create_TLV(TLV.I2, 15000) # 150 °C + return tlv_solo.set(TLV.I2, 15000) # 150 °C elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 4 = New data model format and notation + return tlv_solo.set(TLV.U4, 4) # 4 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be index cdf807d03..654dbd347 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Device.be @@ -55,7 +55,7 @@ class Matter_Plugin_Device : Matter_Plugin ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -63,13 +63,13 @@ class Matter_Plugin_Device : Matter_Plugin # ==================================================================================================== if cluster == 0x0003 # ========== Identify 1.2 p.16 ========== if attribute == 0x0000 # ---------- IdentifyTime / u2 ---------- - return TLV.create_TLV(TLV.U2, 0) # no identification in progress + return tlv_solo.set(TLV.U2, 0) # no identification in progress elif attribute == 0x0001 # ---------- IdentifyType / enum8 ---------- - return TLV.create_TLV(TLV.U1, 0) # IdentifyType = 0x00 None + return tlv_solo.set(TLV.U1, 0) # IdentifyType = 0x00 None elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # no features + return tlv_solo.set(TLV.U4, 0) # no features elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # "new data model format and notation" + return tlv_solo.set(TLV.U4, 4) # "new data model format and notation" end # ==================================================================================================== @@ -77,17 +77,17 @@ class Matter_Plugin_Device : Matter_Plugin if attribute == 0x0000 # ---------- ---------- return nil # TODO elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0)# + return tlv_solo.set(TLV.U4, 0)# elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4)# "new data model format and notation" + return tlv_solo.set(TLV.U4, 4)# "new data model format and notation" end # ==================================================================================================== elif cluster == 0x0005 # ========== Scenes 1.4 p.30 - no writable ========== if attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 4) # 0 = no Level Control for Lighting end # ==================================================================================================== @@ -111,7 +111,7 @@ class Matter_Plugin_Device : Matter_Plugin end return dtl else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end # ==================================================================================================== @@ -119,26 +119,26 @@ class Matter_Plugin_Device : Matter_Plugin import string if attribute == 0x0003 # ---------- ProductName / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.cmd("DeviceName", true)['DeviceName']) + return tlv_solo.set(TLV.UTF1, tasmota.cmd("DeviceName", true)['DeviceName']) elif attribute == 0x0005 # ---------- NodeLabel / string ---------- - return TLV.create_TLV(TLV.UTF1, self.get_name()) + return tlv_solo.set(TLV.UTF1, self.get_name()) elif attribute == 0x000A # ---------- SoftwareVersionString / string ---------- var version_full = tasmota.cmd("Status 2", true)['StatusFWR']['Version'] var version_end = string.find(version_full, '(') if version_end > 0 version_full = version_full[0..version_end - 1] end - return TLV.create_TLV(TLV.UTF1, version_full) + return tlv_solo.set(TLV.UTF1, version_full) elif attribute == 0x000F # ---------- SerialNumber / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.wifi().find("mac", "")) + return tlv_solo.set(TLV.UTF1, tasmota.wifi().find("mac", "")) elif attribute == 0x0011 # ---------- Reachable / bool ---------- - return TLV.create_TLV(TLV.BOOL, 1) # by default we are reachable + return tlv_solo.set(TLV.BOOL, 1) # by default we are reachable elif attribute == 0x0012 # ---------- UniqueID / string 32 max ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.wifi().find("mac", "")) + return tlv_solo.set(TLV.UTF1, tasmota.wifi().find("mac", "")) else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be index ae78cf0c3..ee6550cf0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light0.be @@ -64,7 +64,7 @@ class Matter_Plugin_Light0 : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -73,15 +73,15 @@ class Matter_Plugin_Light0 : Matter_Plugin_Device if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + return tlv_solo.set(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 4) # 0 = no Level Control for Lighting end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be index e69a84bf4..d488f00fd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light1.be @@ -71,7 +71,7 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -80,23 +80,23 @@ class Matter_Plugin_Light1 : Matter_Plugin_Light0 if cluster == 0x0008 # ========== Level Control 1.6 p.57 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, self.shadow_bri) + return tlv_solo.set(TLV.U1, self.shadow_bri) elif attribute == 0x0002 # ---------- MinLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x0003 # ---------- MaxLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, 254) + return tlv_solo.set(TLV.U1, 254) elif attribute == 0x000F # ---------- Options / map8 ---------- - return TLV.create_TLV(TLV.U1, 0) # + return tlv_solo.set(TLV.U1, 0) # elif attribute == 0x0011 # ---------- OnLevel / u1 ---------- - return TLV.create_TLV(TLV.U1, self.shadow_bri) + return tlv_solo.set(TLV.U1, self.shadow_bri) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0X01) # OnOff + return tlv_solo.set(TLV.U4, 0X01) # OnOff elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be index b40c45bf3..27d9657d4 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light2.be @@ -78,7 +78,7 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -87,24 +87,24 @@ class Matter_Plugin_Light2 : Matter_Plugin_Light1 if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== self.update_shadow_lazy() if attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, self.shadow_ct) + return tlv_solo.set(TLV.U1, self.shadow_ct) elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 2)# 2 = ColorTemperatureMireds + return tlv_solo.set(TLV.U1, 2)# 2 = ColorTemperatureMireds elif attribute == 0x000F # ---------- Options / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x400B # ---------- ColorTempPhysicalMinMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, self.ct_min) + return tlv_solo.set(TLV.U1, self.ct_min) elif attribute == 0x400C # ---------- ColorTempPhysicalMaxMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, self.ct_max) + return tlv_solo.set(TLV.U1, self.ct_max) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x10) # CT + return tlv_solo.set(TLV.U4, 0x10) # CT elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation, FeatureMap support" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be index 3e9871dbb..41981fcbd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Light3.be @@ -70,7 +70,7 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -79,32 +79,32 @@ class Matter_Plugin_Light3 : Matter_Plugin_Light1 if cluster == 0x0300 # ========== Color Control 3.2 p.111 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- CurrentHue / u1 ---------- - return TLV.create_TLV(TLV.U1, self.shadow_hue) + return tlv_solo.set(TLV.U1, self.shadow_hue) elif attribute == 0x0001 # ---------- CurrentSaturation / u2 ---------- - return TLV.create_TLV(TLV.U1, self.shadow_sat) + return tlv_solo.set(TLV.U1, self.shadow_sat) elif attribute == 0x0007 # ---------- ColorTemperatureMireds / u2 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x0008 # ---------- ColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 0)# 0 = CurrentHue and CurrentSaturation + return tlv_solo.set(TLV.U1, 0)# 0 = CurrentHue and CurrentSaturation elif attribute == 0x000F # ---------- Options / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x4001 # ---------- EnhancedColorMode / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0x400A # ---------- ColorCapabilities / map2 ---------- - return TLV.create_TLV(TLV.U1, 0x01) # HS + return tlv_solo.set(TLV.U1, 0x01) # HS # Defined Primaries Information Attribute Set elif attribute == 0x0010 # ---------- NumberOfPrimaries / u1 ---------- - return TLV.create_TLV(TLV.U1, 0) + return tlv_solo.set(TLV.U1, 0) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x01) # HS + return tlv_solo.set(TLV.U4, 0x01) # HS elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # "new data model format and notation, FeatureMap support" + return tlv_solo.set(TLV.U4, 5) # "new data model format and notation, FeatureMap support" end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be index b6b4c0bf5..7fad806ca 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_OnOff.be @@ -86,7 +86,7 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -95,15 +95,15 @@ class Matter_Plugin_OnOff : Matter_Plugin_Device if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + return tlv_solo.set(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 4) # 0 = no Level Control for Lighting end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index bd9d46a4b..6ff7c7d80 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -57,7 +57,7 @@ class Matter_Plugin_Root : Matter_Plugin ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) import string var TLV = matter.TLV var cluster = ctx.cluster @@ -66,18 +66,18 @@ class Matter_Plugin_Root : Matter_Plugin if cluster == 0x0030 # ========== GeneralCommissioning cluster 11.9 p.627 ========== if attribute == 0x0000 # ---------- Breadcrumb ---------- - return TLV.create_TLV(TLV.U8, session._breadcrumb) + return tlv_solo.set(TLV.U8, session._breadcrumb) elif attribute == 0x0001 # ---------- BasicCommissioningInfo / BasicCommissioningInfo---------- var bci = TLV.Matter_TLV_struct() bci.add_TLV(0, TLV.U2, 60) # FailSafeExpiryLengthSeconds bci.add_TLV(1, TLV.U2, 900) # MaxCumulativeFailsafeSeconds return bci elif attribute == 0x0002 # ---------- RegulatoryConfig / RegulatoryLocationType ---------- - return TLV.create_TLV(TLV.U1, 2) # 2 = IndoorOutdoor | esp-matter = 0 + return tlv_solo.set(TLV.U1, 2) # 2 = IndoorOutdoor | esp-matter = 0 elif attribute == 0x0003 # ---------- LocationCapability / RegulatoryLocationType---------- - return TLV.create_TLV(TLV.U1, 2) # 2 = IndoorOutdoor + return tlv_solo.set(TLV.U1, 2) # 2 = IndoorOutdoor elif attribute == 0x0004 # ---------- SupportsConcurrentConnection / bool ---------- - return TLV.create_TLV(TLV.BOOL, false) # false - maybe can set to true + return tlv_solo.set(TLV.BOOL, false) # false - maybe can set to true end # ==================================================================================================== elif cluster == 0x0032 # ========== Diagnostic Logs Cluster 11.10 p.637 ========== @@ -124,12 +124,12 @@ class Matter_Plugin_Root : Matter_Plugin end return nwi elif attribute == 0x0001 # ---------- RebootCount u16 ---------- - return TLV.create_TLV(TLV.U2, tasmota.cmd("Status 1", true)['StatusPRM']['BootCount']) + return tlv_solo.set(TLV.U2, tasmota.cmd("Status 1", true)['StatusPRM']['BootCount']) elif attribute == 0x0002 # ---------- UpTime u16 ---------- - return TLV.create_TLV(TLV.U4, tasmota.cmd("Status 11", true)['StatusSTS']['UptimeSec']) + return tlv_solo.set(TLV.U4, tasmota.cmd("Status 11", true)['StatusSTS']['UptimeSec']) # TODO add later other attributes elif attribute == 0x0008 # ---------- TestEventTriggersEnabled bool ---------- - return TLV.create_TLV(TLV.BOOL, false) # false - maybe can set to true + return tlv_solo.set(TLV.BOOL, false) # false - maybe can set to true end # ==================================================================================================== @@ -139,18 +139,19 @@ class Matter_Plugin_Root : Matter_Plugin # ==================================================================================================== elif cluster == 0x0038 # ========== Time Synchronization 11.16 p.689 ========== if attribute == 0x0000 # ---------- UTCTime / epoch_us ---------- - var epoch_us = int64(tasmota.rtc()['utc']) * int64(1000000) - return TLV.create_TLV(TLV.U8, epoch_us) # TODO test the conversion of int64() + var epoch_us = int64(tasmota.rtc_utc()) * int64(1000000) + return tlv_solo.set(TLV.U8, epoch_us) # TODO test the conversion of int64() elif attribute == 0x0001 # ---------- Granularity / enum ---------- - return TLV.create_TLV(TLV.U1, 3) # MillisecondsGranularity (NTP every hour, i.e. 36ms max drift) + return tlv_solo.set(TLV.U1, 3) # MillisecondsGranularity (NTP every hour, i.e. 36ms max drift) # TODO add some missing args elif attribute == 0x0007 # ---------- LocalTime / epoch_us ---------- var epoch_us = int64(tasmota.rtc()['local']) * int64(1000000) - return TLV.create_TLV(TLV.U8, epoch_us) # TODO test the conversion of int64() + return tlv_solo.set(TLV.U8, epoch_us) # TODO test the conversion of int64() end # ==================================================================================================== elif cluster == 0x003E # ========== Node Operational Credentials Cluster 11.17 p.704 ========== + self.send_ack_now(ctx.msg) # long operation, send Ack first if attribute == 0x0000 # ---------- NOCs / list[NOCStruct] ---------- var nocl = TLV.Matter_TLV_array() # NOCs, p.711 @@ -175,16 +176,16 @@ class Matter_Plugin_Root : Matter_Plugin end return fabrics elif attribute == 0x0002 # ---------- SupportedFabrics / u1 ---------- - return TLV.create_TLV(TLV.U1, matter.Fabric._MAX_CASE) # Max 5 fabrics + return tlv_solo.set(TLV.U1, matter.Fabric._MAX_CASE) # Max 5 fabrics elif attribute == 0x0003 # ---------- CommissionedFabrics / u1 ---------- var fabric_actice = self.device.sessions.count_active_fabrics() - return TLV.create_TLV(TLV.U1, fabric_actice) # number of active fabrics + return tlv_solo.set(TLV.U1, fabric_actice) # number of active fabrics elif attribute == 0x0004 # ---------- TrustedRootCertificates / list[octstr] ---------- # TODO elif attribute == 0x0005 # ---------- Current­ FabricIndex / u1 ---------- var fab_index = session._fabric.get_fabric_index() if fab_index == nil fab_index = 0 end # if PASE session, then the fabric index should be zero - return TLV.create_TLV(TLV.U1, fab_index) # number of active sessions + return tlv_solo.set(TLV.U1, fab_index) # number of active sessions end # ==================================================================================================== @@ -193,57 +194,58 @@ class Matter_Plugin_Root : Matter_Plugin var commissioning_open = self.device.is_commissioning_open() var basic_commissioning = self.device.is_root_commissioning_open() var val = commissioning_open ? (basic_commissioning ? 2 #-BasicWindowOpen-# : 1 #-EnhancedWindowOpen-#) : 0 #-WindowNotOpen-# - return TLV.create_TLV(TLV.U1, val) + return tlv_solo.set(TLV.U1, val) elif attribute == 0x0001 # ---------- AdminFabricIndex / u16 ---------- var admin_fabric = self.device.commissioning_admin_fabric if admin_fabric != nil - return TLV.create_TLV(TLV.U2, admin_fabric.get_fabric_index()) + return tlv_solo.set(TLV.U2, admin_fabric.get_fabric_index()) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0002 # ---------- AdminVendorId / u16 ---------- var admin_fabric = self.device.commissioning_admin_fabric if admin_fabric != nil - return TLV.create_TLV(TLV.U2, admin_fabric.get_admin_vendor()) + return tlv_solo.set(TLV.U2, admin_fabric.get_admin_vendor()) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end end # ==================================================================================================== elif cluster == 0x0028 # ========== Basic Information Cluster cluster 11.1 p.565 ========== + self.send_ack_now(ctx.msg) # long operation, send Ack first if attribute == 0x0000 # ---------- DataModelRevision / CommissioningWindowStatus ---------- - return TLV.create_TLV(TLV.U2, 1) + return tlv_solo.set(TLV.U2, 1) elif attribute == 0x0001 # ---------- VendorName / string ---------- - return TLV.create_TLV(TLV.UTF1, "Tasmota") + return tlv_solo.set(TLV.UTF1, "Tasmota") elif attribute == 0x0002 # ---------- VendorID / vendor-id ---------- - return TLV.create_TLV(TLV.U2, self.device.vendorid) # Vendor ID reserved for development + return tlv_solo.set(TLV.U2, self.device.vendorid) # Vendor ID reserved for development elif attribute == 0x0003 # ---------- ProductName / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.cmd("DeviceName", true)['DeviceName']) + return tlv_solo.set(TLV.UTF1, tasmota.cmd("DeviceName", true)['DeviceName']) elif attribute == 0x0004 # ---------- ProductID / u16 (opt) ---------- - return TLV.create_TLV(TLV.U2, 32768) # taken from esp-matter example + return tlv_solo.set(TLV.U2, 32768) # taken from esp-matter example elif attribute == 0x0005 # ---------- NodeLabel / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.cmd("FriendlyName", true)['FriendlyName1']) + return tlv_solo.set(TLV.UTF1, tasmota.cmd("FriendlyName", true)['FriendlyName1']) elif attribute == 0x0006 # ---------- Location / string ---------- - return TLV.create_TLV(TLV.UTF1, "XX") # no location + return tlv_solo.set(TLV.UTF1, "XX") # no location elif attribute == 0x0007 # ---------- HardwareVersion / u16 ---------- - return TLV.create_TLV(TLV.U2, 0) + return tlv_solo.set(TLV.U2, 0) elif attribute == 0x0008 # ---------- HardwareVersionString / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.cmd("Status 2", true)['StatusFWR']['Hardware']) + return tlv_solo.set(TLV.UTF1, tasmota.cmd("Status 2", true)['StatusFWR']['Hardware']) elif attribute == 0x0009 # ---------- SoftwareVersion / u32 ---------- - return TLV.create_TLV(TLV.U2, 1) + return tlv_solo.set(TLV.U2, 1) elif attribute == 0x000A # ---------- SoftwareVersionString / string ---------- var version_full = tasmota.cmd("Status 2", true)['StatusFWR']['Version'] var version_end = string.find(version_full, '(') if version_end > 0 version_full = version_full[0..version_end - 1] end - return TLV.create_TLV(TLV.UTF1, version_full) + return tlv_solo.set(TLV.UTF1, version_full) elif attribute == 0x000F # ---------- SerialNumber / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.wifi().find("mac", "")) + return tlv_solo.set(TLV.UTF1, tasmota.wifi().find("mac", "")) elif attribute == 0x0011 # ---------- Reachable / bool ---------- - return TLV.create_TLV(TLV.BOOL, 1) # by default we are reachable + return tlv_solo.set(TLV.BOOL, 1) # by default we are reachable elif attribute == 0x0012 # ---------- UniqueID / string 32 max ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.wifi().find("mac", "")) + return tlv_solo.set(TLV.UTF1, tasmota.wifi().find("mac", "")) elif attribute == 0x0013 # ---------- CapabilityMinima / CapabilityMinimaStruct ---------- var cps = TLV.Matter_TLV_struct() cps.add_TLV(0, TLV.U2, 3) # CaseSessionsPerFabric = 3 @@ -261,18 +263,18 @@ class Matter_Plugin_Root : Matter_Plugin if attribute == 0x0000 # ---------- DefaultOTAProviders / list[ProviderLocationStruct] ---------- return TLV.Matter_TLV_array() # empty list for now TODO elif attribute == 0x0001 # ---------- UpdatePossible / bool ---------- - return TLV.create_TLV(TLV.BOOL, 0) # we claim that update is not possible, would require to go to Tasmota UI + return tlv_solo.set(TLV.BOOL, 0) # we claim that update is not possible, would require to go to Tasmota UI elif attribute == 0x0002 # ---------- UpdateState / UpdateStateEnum ---------- - return TLV.create_TLV(TLV.U1, 1) # Idle + return tlv_solo.set(TLV.U1, 1) # Idle elif attribute == 0x0003 # ---------- UpdateStateProgress / uint8 ---------- - return TLV.create_TLV(TLV.NULL, nil) # null, nothing in process + return tlv_solo.set(TLV.NULL, nil) # null, nothing in process end # ==================================================================================================== elif cluster == 0x002B # ========== Localization Configuration Cluster 11.3 p.580 ========== if attribute == 0x0000 # ---------- ActiveLocale / string ---------- - return TLV.create_TLV(TLV.UTF1, tasmota.locale()) + return tlv_solo.set(TLV.UTF1, tasmota.locale()) elif attribute == 0x0001 # ---------- SupportedLocales / list[string] ---------- var locl = TLV.Matter_TLV_array() locl.add_TLV(nil, TLV.UTF1, tasmota.locale()) @@ -283,9 +285,9 @@ class Matter_Plugin_Root : Matter_Plugin elif cluster == 0x002C # ========== Time Format Localization Cluster 11.4 p.581 ========== if attribute == 0x0000 # ---------- HourFormat / HourFormat ---------- - return TLV.create_TLV(TLV.U1, 1) # 1 = 24hr + return tlv_solo.set(TLV.U1, 1) # 1 = 24hr elif attribute == 0x0001 # ---------- ActiveCalendarType / CalendarType ---------- - return TLV.create_TLV(TLV.U1, 4) # 4 = Gregorian + return tlv_solo.set(TLV.U1, 4) # 4 = Gregorian elif attribute == 0x0002 # ---------- SupportedCalendarTypes / list[CalendarType] ---------- var callist = TLV.Matter_TLV_array() callist.add_TLV(nil, TLV.create_TLV(TLV.U1, 4)) @@ -295,9 +297,9 @@ class Matter_Plugin_Root : Matter_Plugin # ==================================================================================================== elif cluster == 0x0031 # ========== Network Commissioning Cluster cluster 11.8 p.606 ========== if attribute == 0x0003 # ---------- ConnectMaxTimeSeconds / uint8 ---------- - return TLV.create_TLV(TLV.U1, 30) # 30 - value taking from example in esp-matter + return tlv_solo.set(TLV.U1, 30) # 30 - value taking from example in esp-matter elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0x04) # Put Eth for now which should work for any on-network + return tlv_solo.set(TLV.U4, 0x04) # Put Eth for now which should work for any on-network end elif cluster == 0x001D # ========== Descriptor Cluster 9.5 p.453 ========== @@ -315,11 +317,11 @@ class Matter_Plugin_Root : Matter_Plugin end return pl else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end # no match found, return that the attribute is unsupported @@ -417,7 +419,7 @@ class Matter_Plugin_Root : Matter_Plugin var att_elts = TLV.Matter_TLV_struct() att_elts.add_TLV(1, TLV.B2, matter.CD_FFF1_8000()) # certification_declaration att_elts.add_TLV(2, TLV.B1, AttestationNonce) # attestation_nonce - att_elts.add_TLV(3, TLV.U4, tasmota.rtc()['utc']) # timestamp in epoch-s + att_elts.add_TLV(3, TLV.U4, tasmota.rtc_utc()) # timestamp in epoch-s var attestation_message = att_elts.tlv2raw() var ac = session.get_ac() diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be index ca9ae7a88..ae9b5097b 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be @@ -75,7 +75,7 @@ class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -84,18 +84,18 @@ class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device if cluster == 0x0045 # ========== Boolean State ========== if attribute == 0x0000 # ---------- StateValue / bool ---------- if self.shadow_contact != nil - return TLV.create_TLV(TLV.BOOL, self.shadow_contact) + return tlv_solo.set(TLV.BOOL, self.shadow_contact) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 1) # 1 = Initial release + return tlv_solo.set(TLV.U4, 1) # 1 = Initial release end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be index c4701a772..3786eaa47 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Humidity.be @@ -55,7 +55,7 @@ class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -64,22 +64,22 @@ class Matter_Plugin_Sensor_Humidity : Matter_Plugin_Sensor if cluster == 0x0405 # ========== Humidity Measurement 2.4 p.98 ========== if attribute == 0x0000 # ---------- Humidity / u16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + return tlv_solo.set(TLV.U2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / u16 ---------- - return TLV.create_TLV(TLV.U2, 500) # 0% + return tlv_solo.set(TLV.U2, 500) # 0% elif attribute == 0x0002 # ---------- MaxMeasuredValue / u16 ---------- - return TLV.create_TLV(TLV.U2, 10000) # 100% + return tlv_solo.set(TLV.U2, 10000) # 100% elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + return tlv_solo.set(TLV.U4, 0) # 0 = no Extended Range elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be index fd213c665..f5602b1ad 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Illuminance.be @@ -62,7 +62,7 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -71,22 +71,22 @@ class Matter_Plugin_Sensor_Illuminance : Matter_Plugin_Sensor if cluster == 0x0400 # ========== Illuminance Measurement 2.2 p.95 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.U2, int(self.shadow_value)) + return tlv_solo.set(TLV.U2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.U2, 1) # 1 lux + return tlv_solo.set(TLV.U2, 1) # 1 lux elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.U2, 0xFFFE) + return tlv_solo.set(TLV.U2, 0xFFFE) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index 82b2206c3..1400c55b0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -72,7 +72,7 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -81,22 +81,22 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device if cluster == 0x0406 # ========== Occupancy Sensing ========== if attribute == 0x0000 # ---------- Occupancy / U8 ---------- if self.shadow_occupancy != nil - return TLV.create_TLV(TLV.U1, self.shadow_occupancy) + return tlv_solo.set(TLV.U1, self.shadow_occupancy) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- OccupancySensorType / enum8 ---------- - return TLV.create_TLV(TLV.U1, 3) # physical contact + return tlv_solo.set(TLV.U1, 3) # physical contact elif attribute == 0x0002 # ---------- OccupancySensorTypeBitmap / u8 ---------- - return TLV.create_TLV(TLV.U1, 0) # unknown + return tlv_solo.set(TLV.U1, 0) # unknown elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 4 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 4 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index 738ecfbda..5f2858d68 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -70,7 +70,7 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -79,15 +79,15 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device if cluster == 0x0006 # ========== On/Off 1.5 p.48 ========== self.update_shadow_lazy() if attribute == 0x0000 # ---------- OnOff / bool ---------- - return TLV.create_TLV(TLV.BOOL, self.shadow_onoff) + return tlv_solo.set(TLV.BOOL, self.shadow_onoff) elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 0) # 0 = no Level Control for Lighting elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 0 = no Level Control for Lighting + return tlv_solo.set(TLV.U4, 4) # 0 = no Level Control for Lighting end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be index ac4889a78..ae4c6ef3c 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Pressure.be @@ -55,7 +55,7 @@ class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -64,22 +64,22 @@ class Matter_Plugin_Sensor_Pressure : Matter_Plugin_Sensor if cluster == 0x0403 # ========== Pressure Measurement 2.4 p.98 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, int(self.shadow_value)) + return tlv_solo.set(TLV.I2, int(self.shadow_value)) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 500) # 500 hPA + return tlv_solo.set(TLV.I2, 500) # 500 hPA elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 ---------- - return TLV.create_TLV(TLV.I2, 1500) # 1500 hPA + return tlv_solo.set(TLV.I2, 1500) # 1500 hPA elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) # 0 = no Extended Range + return tlv_solo.set(TLV.U4, 0) # 0 = no Extended Range elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 3) # 3 = New data model format and notation + return tlv_solo.set(TLV.U4, 3) # 3 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be index f68cd62d6..33dec8d13 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Temp.be @@ -58,7 +58,7 @@ class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -67,22 +67,22 @@ class Matter_Plugin_Sensor_Temp : Matter_Plugin_Sensor if cluster == 0x0402 # ========== Temperature Measurement 2.3 p.97 ========== if attribute == 0x0000 # ---------- MeasuredValue / i16 (*100) ---------- if self.shadow_value != nil - return TLV.create_TLV(TLV.I2, self.shadow_value) + return tlv_solo.set(TLV.I2, self.shadow_value) else - return TLV.create_TLV(TLV.NULL, nil) + return tlv_solo.set(TLV.NULL, nil) end elif attribute == 0x0001 # ---------- MinMeasuredValue / i16 (*100) ---------- - return TLV.create_TLV(TLV.I2, -5000) # -50 °C + return tlv_solo.set(TLV.I2, -5000) # -50 °C elif attribute == 0x0002 # ---------- MaxMeasuredValue / i16 (*100) ---------- - return TLV.create_TLV(TLV.I2, 15000) # 150 °C + return tlv_solo.set(TLV.I2, 15000) # 150 °C elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 0) + return tlv_solo.set(TLV.U4, 0) elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 4) # 4 = New data model format and notation + return tlv_solo.set(TLV.U4, 4) # 4 = New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be index 8e110c7d1..e3285b36f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Shutter.be @@ -93,7 +93,7 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -104,42 +104,42 @@ class Matter_Plugin_Shutter : Matter_Plugin_Device self.update_shadow_lazy() self.update_inverted() if attribute == 0x0000 # ---------- Type / enum8 ---------- - return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter + return tlv_solo.set(TLV.U1, 0xFF) # 0xFF = unknown type of shutter elif attribute == 0x0005 # ---------- NumberOfActuationsLift / u16 ---------- - return TLV.create_TLV(TLV.U2, 0) + return tlv_solo.set(TLV.U2, 0) elif attribute == 0x0007 # ---------- ConfigStatus / u8 ---------- - return TLV.create_TLV(TLV.U1, 1 + 8) # Operational + Lift Position Aware + return tlv_solo.set(TLV.U1, 1 + 8) # Operational + Lift Position Aware elif attribute == 0x000D # ---------- EndProductType / u8 ---------- - return TLV.create_TLV(TLV.U1, 0xFF) # 0xFF = unknown type of shutter + return tlv_solo.set(TLV.U1, 0xFF) # 0xFF = unknown type of shutter elif attribute == 0x000E # ---------- CurrentPositionLiftPercent100ths / u16 ---------- if self.shadow_shutter_inverted == 0 matter_position = (100 - self.shadow_shutter_pos) * 100 else matter_position = self.shadow_shutter_pos * 100 end - return TLV.create_TLV(TLV.U2, matter_position) + return tlv_solo.set(TLV.U2, matter_position) elif attribute == 0x000A # ---------- OperationalStatus / u8 ---------- var op = self.shadow_shutter_direction == 0 ? 0 : (self.shadow_shutter_direction > 0 ? 1 : 2) - return TLV.create_TLV(TLV.U1, op) + return tlv_solo.set(TLV.U1, op) elif attribute == 0x000B # ---------- TargetPositionLiftPercent100ths / u16 ---------- if self.shadow_shutter_inverted == 0 matter_position = (100 - self.shadow_shutter_target) * 100 else matter_position = self.shadow_shutter_target * 100 end - return TLV.create_TLV(TLV.U2, matter_position) + return tlv_solo.set(TLV.U2, matter_position) elif attribute == 0x0017 # ---------- Mode / u8 ---------- - return TLV.create_TLV(TLV.U1, 0) # normal mode + return tlv_solo.set(TLV.U1, 0) # normal mode elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 1 + 4) # Lift + PA_LF + return tlv_solo.set(TLV.U4, 1 + 4) # Lift + PA_LF elif attribute == 0xFFFD # ---------- ClusterRevision / u2 ---------- - return TLV.create_TLV(TLV.U4, 5) # New data model format and notation + return tlv_solo.set(TLV.U4, 5) # New data model format and notation end else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be index dd58f0918..0849f3418 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_ShutterTilt.be @@ -96,7 +96,7 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter ############################################################# # read an attribute # - def read_attribute(session, ctx) + def read_attribute(session, ctx, tlv_solo) var TLV = matter.TLV var cluster = ctx.cluster var attribute = ctx.attribute @@ -105,30 +105,30 @@ class Matter_Plugin_ShutterTilt : Matter_Plugin_Shutter if cluster == 0x0102 # ========== Window Covering 5.3 p.289 ========== self.update_shadow_lazy() if attribute == 0x0007 # ---------- ConfigStatus / u8 ---------- - return TLV.create_TLV(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware + return tlv_solo.set(TLV.U1, 1 + 8 + 16) # Operational + Lift Position Aware + Tilt Position Aware elif attribute == 0x000F # ---------- CurrentPositionTiltPercent100ths / u8 ---------- self.update_tilt_min_max() if self.tilt_min != nil && self.tilt_max != nil var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt - self.tilt_min, 0, self.tilt_max - self.tilt_min, 0, 10000) - return TLV.create_TLV(TLV.U2, tilt_percentage) + return tlv_solo.set(TLV.U2, tilt_percentage) else - return TLV.create_TLV(TLV.NULL, nil) # return invalid + return tlv_solo.set(TLV.NULL, nil) # return invalid end elif attribute == 0x000C # ---------- TargetPositionTiltPercent100ths / u16 ---------- if self.tilt_min != nil && self.tilt_max != nil var tilt_percentage = tasmota.scale_uint(self.shadow_shutter_tilt - self.tilt_min, 0, self.tilt_max - self.tilt_min, 0, 10000) - return TLV.create_TLV(TLV.U2, tilt_percentage) + return tlv_solo.set(TLV.U2, tilt_percentage) else - return TLV.create_TLV(TLV.NULL, nil) # return invalid + return tlv_solo.set(TLV.NULL, nil) # return invalid end elif attribute == 0xFFFC # ---------- FeatureMap / map32 ---------- - return TLV.create_TLV(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL + return tlv_solo.set(TLV.U4, 3 + 4 + 16) # Lift + Tilt + PA_LF + PA_TL end end # else - return super(self).read_attribute(session, ctx) + return super(self).read_attribute(session, ctx, tlv_solo) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be b/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be index 7f6f07231..fb9f1dd56 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Profiler.be @@ -31,13 +31,21 @@ class Matter_Profiler var millis var names var active + var allocs + var reallocs + var len # number of entries def init() self.active = false self.millis = list() - self.millis.resize(self.PREALLOCATED) + self.millis.resize(self.PREALLOCATED) # we force zero allocation when using profiler self.names = list() self.names.resize(self.PREALLOCATED) + self.allocs = list() + self.allocs.resize(self.PREALLOCATED) + self.reallocs = list() + self.reallocs.resize(self.PREALLOCATED) + self.len = 0 end def set_active(v) @@ -46,15 +54,27 @@ class Matter_Profiler def start() if !self.active return end - self.millis.resize(0) - self.names.resize(0) + var idx = 0 + while idx < self.PREALLOCATED + self.millis[idx] = nil + self.names[idx] = nil + idx += 1 + end + self.len = 0 + tasmota.gc() # To get deterministic values, we force a full GC before profiler self.log("start") end def log(name) if !self.active return end - self.millis.push(tasmota.millis()) - self.names.push(name) + import debug + var len = self.len + if len >= self.PREALLOCATED return end # size overflow + self.millis[len] = tasmota.millis() + self.names[len] = name + self.allocs[len] = debug.allocs() + self.reallocs[len] = debug.reallocs() + self.len += 1 end def dump(loglevel) @@ -62,9 +82,12 @@ class Matter_Profiler self.log("<--end-->") tasmota.log("MTR: Profiler dump:", loglevel) var origin = self.millis[0] + var allocs0 = self.allocs[0] + var reallocs0 = self.reallocs[0] var idx = 1 - while idx < size(self.millis) - tasmota.log(f"MTR: {self.millis[idx] - origin:4i} '{self.names[idx]}'", loglevel) + while idx < self.len + # tasmota.log(f"MTR: {self.millis[idx] - origin:4i} [{self.allocs[idx] - allocs0:4i}|{self.reallocs[idx] - reallocs0:4i}]'{self.names[idx]}'", loglevel) + tasmota.log(f"MTR: {self.millis[idx] - origin:4i} [{self.allocs[idx] - allocs0:4i}]'{self.names[idx]}'", loglevel) idx += 1 end end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be index dc63280c3..558da861e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be @@ -165,7 +165,7 @@ class Matter_Session : Matter_Expirable ############################################################# # Update the timestamp or any other information def update() - self.last_used = tasmota.rtc()['utc'] + self.last_used = tasmota.rtc_utc() end def set_mode_PASE() self.set_mode(self._PASE) end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be index a9db4d6ae..13d723b39 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_TLV.be @@ -113,6 +113,32 @@ class Matter_TLV self.parent = parent end + ############################################################# + # reset - allows reuse of the object + def reset(parent) + var n = nil + self.parent = parent + self.next_idx = n + self.tag_vendor = n + self.tag_profile = n + self.tag_number = n + self.tag_sub = n + self.typ = n + self.val = n + end + + ############################################################# + # set value, equivalent to create_TLV() without allocation + # + def set(t, value) + self.reset() + if value != nil || t == 0x14 #-t == matter.TLV.NULL-# # put the actual number for performance + self.typ = t + self.val = value + return self + end + end + ############################################################# # neutral converter def to_TLV() @@ -135,23 +161,24 @@ class Matter_TLV # # We are trying to follow the official Matter way of printing TLV # Ex: '42U' or '1 = 42U' or '0xFFF1::0xDEED:0xAA55FEED = 42U' - def tostring() + def tostring(no_tag) # var s = " 0 s += "= " end end - if size(s) > 0 s += "= " end - # print value if type(self.val) == 'int' s += format("%i", self.val) if self.typ >= self.TLV.U1 && self.typ <= self.TLV.U8 s += "U" end @@ -171,6 +198,30 @@ class Matter_TLV return s end + # simplified version of tostring() for simple values + def to_str_val() + # print value + if type(self.val) == 'int' + if self.typ >= self.TLV.U1 && self.typ <= self.TLV.U8 + return str(self.val) + "U" + else + return str(self.val) + end + elif type(self.val) == 'bool' return self.val ? "true" : "false" + elif self.val == nil return "null" + elif type(self.val) == 'real' return str(self.val) + elif type(self.val) == 'string' return self.val + elif isinstance(self.val, int64) + if self.typ >= self.TLV.U1 && self.typ <= self.TLV.U8 + return self.val.tostring() + "U" + else + return self.val.tostring() + end + elif type(self.val) == 'instance' + return self.tostring(true) + end + end + ############################################################# # parse a bytes() array from `idx` # args: @@ -566,26 +617,27 @@ class Matter_TLV end ################################################################################# - def tostring() - return self.tostring_inner(false, "[[", "]]") + def tostring(no_tag) + return self.tostring_inner(false, "[[", "]]", no_tag) end - def tostring_inner(sorted, pre, post) + def tostring_inner(sorted, pre, post, no_tag) var s = "" try - if self.tag_profile == -1 - s += "Matter::" - if self.tag_number != nil s += format("0x%08X ", self.tag_number) end - else - if self.tag_vendor != nil s += format("0x%04X::", self.tag_vendor) end - if self.tag_profile != nil s += format("0x%04X:", self.tag_profile) end - if self.tag_number != nil s += format("0x%08X ", self.tag_number) end - if self.tag_sub != nil s += format("%i ", self.tag_sub) end + if no_tag != true + if self.tag_profile == -1 + s += "Matter::" + if self.tag_number != nil s += format("0x%08X ", self.tag_number) end + else + if self.tag_vendor != nil s += format("0x%04X::", self.tag_vendor) end + if self.tag_profile != nil s += format("0x%04X:", self.tag_profile) end + if self.tag_number != nil s += format("0x%08X ", self.tag_number) end + if self.tag_sub != nil s += format("%i ", self.tag_sub) end + end + if size(s) > 0 s += "= " end end - if size(s) > 0 s += "= " end - s += pre # sort values @@ -604,6 +656,11 @@ class Matter_TLV return s end + # simplified version of tostring() for simple values + def to_str_val() + return self.tostring(true) + end + ################################################################################# def parse(b, idx) # iterate until end of struct @@ -777,8 +834,8 @@ class Matter_TLV end ############################################################# - def tostring() - return self.tostring_inner(true, "{", "}") + def tostring(no_tag) + return self.tostring_inner(true, "{", "}", no_tag) end end @@ -793,8 +850,8 @@ class Matter_TLV end ############################################################# - def tostring() - return self.tostring_inner(false, "[", "]") + def tostring(no_tag) + return self.tostring_inner(false, "[", "]", no_tag) end ############################################################# diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be index 5bc75e08a..62bc065c8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_UDPServer.be @@ -72,6 +72,7 @@ class Matter_UDPServer var dispatch_cb # callback to call when a message is received var packets_sent # list map of packets sent to be acknowledged var loop_cb # closure to pass to fast_loop + var packet # reuse the packer `bytes()` object at each iteration ############################################################# # Init UDP Server listening to `addr` and `port` (opt). @@ -123,17 +124,19 @@ class Matter_UDPServer # Then resend queued outgoing packets. def loop() # import debug - var profiler = self.device.profiler + var profiler = matter.profiler var packet_read = 0 if self.udp_socket == nil return end - var packet = self.udp_socket.read() + var packet = self.udp_socket.read(self.packet) while packet != nil - # self.packet = packet profiler.start() + self.packet = packet # save packet for next iteration packet_read += 1 var from_addr = self.udp_socket.remote_ip var from_port = self.udp_socket.remote_port - tasmota.log(format("MTR: UDP received from [%s]:%i", from_addr, from_port), 4) + if tasmota.loglevel(4) + tasmota.log(format("MTR: UDP received from [%s]:%i", from_addr, from_port), 4) + end # tasmota.log("MTR: Perf/UDP_received = " + str(debug.counters()), 4) if self.dispatch_cb profiler.log("udp_loop_dispatch") @@ -159,10 +162,15 @@ class Matter_UDPServer # Returns `true` if packet was successfully sent. def send(packet) var ok = self.udp_socket.send(packet.addr ? packet.addr : self.udp_socket.remote_ip, packet.port ? packet.port : self.udp_socket.remote_port, packet.raw) + if ok - tasmota.log(format("MTR: sending packet to '[%s]:%i'", packet.addr, packet.port), 4) + if tasmota.loglevel(4) + tasmota.log(format("MTR: sending packet to '[%s]:%i'", packet.addr, packet.port), 4) + end else - tasmota.log(format("MTR: error sending packet to '[%s]:%i'", packet.addr, packet.port), 3) + if tasmota.loglevel(3) + tasmota.log(format("MTR: error sending packet to '[%s]:%i'", packet.addr, packet.port), 3) + end end return ok end @@ -209,7 +217,9 @@ class Matter_UDPServer var packet = self.packets_sent[idx] if packet.msg_id == id && packet.exchange_id == exch self.packets_sent.remove(idx) - tasmota.log("MTR: . Removed packet from sending list id=" + str(id), 4) + if tasmota.loglevel(4) + tasmota.log("MTR: . Removed packet from sending list id=" + str(id), 4) + end else idx += 1 end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index 7c5b07704..978e5a3aa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -557,7 +557,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ }), be_str_weak(parse_Pake1), &be_const_str_solidified, - ( &(const binstruction[114]) { /* code */ + ( &(const binstruction[115]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x88100302, // 0002 GETMBR R4 R1 K2 @@ -665,13 +665,14 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake1, /* name */ 0x884C0730, // 0068 GETMBR R19 R3 K48 0x88500731, // 0069 GETMBR R20 R3 K49 0x7C400800, // 006A CALL R16 4 - 0x7C380400, // 006B CALL R14 2 - 0x88380132, // 006C GETMBR R14 R0 K50 - 0x8C381D33, // 006D GETMET R14 R14 K51 - 0x5C401800, // 006E MOVE R16 R12 - 0x7C380400, // 006F CALL R14 2 - 0x50380200, // 0070 LDBOOL R14 1 0 - 0x80041C00, // 0071 RET 1 R14 + 0x5844000D, // 006B LDCONST R17 K13 + 0x7C380600, // 006C CALL R14 3 + 0x88380132, // 006D GETMBR R14 R0 K50 + 0x8C381D33, // 006E GETMET R14 R14 K51 + 0x5C401800, // 006F MOVE R16 R12 + 0x7C380400, // 0070 CALL R14 2 + 0x50380200, // 0071 LDBOOL R14 1 0 + 0x80041C00, // 0072 RET 1 R14 }) ) ); @@ -723,7 +724,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[32]) { /* constants */ + ( &(const bvalue[31]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(session), /* K2 */ be_nested_str_weak(opcode), @@ -746,20 +747,19 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ /* K19 */ be_nested_str_weak(cA), /* K20 */ be_nested_str_weak(__spake_cA), /* K21 */ be_nested_str_weak(MTR_X3A_X20invalid_X20cA_X20received), - /* K22 */ be_nested_str_weak(rtc), - /* K23 */ be_nested_str_weak(utc), - /* K24 */ be_nested_str_weak(HKDF_SHA256), - /* K25 */ be_nested_str_weak(derive), - /* K26 */ be_nested_str_weak(__spake_Ke), - /* K27 */ be_nested_str_weak(fromstring), - /* K28 */ be_nested_str_weak(SEKeys_Info), - /* K29 */ be_nested_str_weak(add_session), - /* K30 */ be_nested_str_weak(__future_local_session_id), - /* K31 */ be_nested_str_weak(__future_initiator_session_id), + /* K22 */ be_nested_str_weak(rtc_utc), + /* K23 */ be_nested_str_weak(HKDF_SHA256), + /* K24 */ be_nested_str_weak(derive), + /* K25 */ be_nested_str_weak(__spake_Ke), + /* K26 */ be_nested_str_weak(fromstring), + /* K27 */ be_nested_str_weak(SEKeys_Info), + /* K28 */ be_nested_str_weak(add_session), + /* K29 */ be_nested_str_weak(__future_local_session_id), + /* K30 */ be_nested_str_weak(__future_initiator_session_id), }), be_str_weak(parse_Pake3), &be_const_str_solidified, - ( &(const binstruction[106]) { /* code */ + ( &(const binstruction[105]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x88100302, // 0002 GETMBR R4 R1 K2 @@ -824,48 +824,47 @@ be_local_closure(Matter_Commisioning_Context_parse_Pake3, /* name */ 0xB81A0C00, // 003D GETNGBL R6 K6 0x8C180D16, // 003E GETMET R6 R6 K22 0x7C180200, // 003F CALL R6 1 - 0x94180D17, // 0040 GETIDX R6 R6 K23 - 0x8C1C0518, // 0041 GETMET R7 R2 K24 - 0x7C1C0200, // 0042 CALL R7 1 - 0x8C1C0F19, // 0043 GETMET R7 R7 K25 - 0x8824071A, // 0044 GETMBR R9 R3 K26 - 0x60280015, // 0045 GETGBL R10 G21 - 0x7C280000, // 0046 CALL R10 0 - 0x602C0015, // 0047 GETGBL R11 G21 - 0x7C2C0000, // 0048 CALL R11 0 - 0x8C2C171B, // 0049 GETMET R11 R11 K27 - 0x8834011C, // 004A GETMBR R13 R0 K28 - 0x7C2C0400, // 004B CALL R11 2 - 0x5432002F, // 004C LDINT R12 48 - 0x7C1C0A00, // 004D CALL R7 5 - 0x5422000E, // 004E LDINT R8 15 - 0x40220808, // 004F CONNECT R8 K4 R8 - 0x94200E08, // 0050 GETIDX R8 R7 R8 - 0x5426000F, // 0051 LDINT R9 16 - 0x542A001E, // 0052 LDINT R10 31 - 0x4024120A, // 0053 CONNECT R9 R9 R10 - 0x94240E09, // 0054 GETIDX R9 R7 R9 - 0x542A001F, // 0055 LDINT R10 32 - 0x542E002E, // 0056 LDINT R11 47 - 0x4028140B, // 0057 CONNECT R10 R10 R11 - 0x94280E0A, // 0058 GETIDX R10 R7 R10 - 0x8C2C010B, // 0059 GETMET R11 R0 K11 - 0x5C340200, // 005A MOVE R13 R1 - 0x58380004, // 005B LDCONST R14 K4 - 0x583C0004, // 005C LDCONST R15 K4 - 0x58400004, // 005D LDCONST R16 K4 - 0x50440000, // 005E LDBOOL R17 0 0 - 0x7C2C0C00, // 005F CALL R11 6 - 0x8C2C011D, // 0060 GETMET R11 R0 K29 - 0x8834071E, // 0061 GETMBR R13 R3 K30 - 0x8838071F, // 0062 GETMBR R14 R3 K31 - 0x5C3C1000, // 0063 MOVE R15 R8 - 0x5C401200, // 0064 MOVE R16 R9 - 0x5C441400, // 0065 MOVE R17 R10 - 0x5C480C00, // 0066 MOVE R18 R6 - 0x7C2C0E00, // 0067 CALL R11 7 - 0x502C0200, // 0068 LDBOOL R11 1 0 - 0x80041600, // 0069 RET 1 R11 + 0x8C1C0517, // 0040 GETMET R7 R2 K23 + 0x7C1C0200, // 0041 CALL R7 1 + 0x8C1C0F18, // 0042 GETMET R7 R7 K24 + 0x88240719, // 0043 GETMBR R9 R3 K25 + 0x60280015, // 0044 GETGBL R10 G21 + 0x7C280000, // 0045 CALL R10 0 + 0x602C0015, // 0046 GETGBL R11 G21 + 0x7C2C0000, // 0047 CALL R11 0 + 0x8C2C171A, // 0048 GETMET R11 R11 K26 + 0x8834011B, // 0049 GETMBR R13 R0 K27 + 0x7C2C0400, // 004A CALL R11 2 + 0x5432002F, // 004B LDINT R12 48 + 0x7C1C0A00, // 004C CALL R7 5 + 0x5422000E, // 004D LDINT R8 15 + 0x40220808, // 004E CONNECT R8 K4 R8 + 0x94200E08, // 004F GETIDX R8 R7 R8 + 0x5426000F, // 0050 LDINT R9 16 + 0x542A001E, // 0051 LDINT R10 31 + 0x4024120A, // 0052 CONNECT R9 R9 R10 + 0x94240E09, // 0053 GETIDX R9 R7 R9 + 0x542A001F, // 0054 LDINT R10 32 + 0x542E002E, // 0055 LDINT R11 47 + 0x4028140B, // 0056 CONNECT R10 R10 R11 + 0x94280E0A, // 0057 GETIDX R10 R7 R10 + 0x8C2C010B, // 0058 GETMET R11 R0 K11 + 0x5C340200, // 0059 MOVE R13 R1 + 0x58380004, // 005A LDCONST R14 K4 + 0x583C0004, // 005B LDCONST R15 K4 + 0x58400004, // 005C LDCONST R16 K4 + 0x50440000, // 005D LDBOOL R17 0 0 + 0x7C2C0C00, // 005E CALL R11 6 + 0x8C2C011C, // 005F GETMET R11 R0 K28 + 0x8834071D, // 0060 GETMBR R13 R3 K29 + 0x8838071E, // 0061 GETMBR R14 R3 K30 + 0x5C3C1000, // 0062 MOVE R15 R8 + 0x5C401200, // 0063 MOVE R16 R9 + 0x5C441400, // 0064 MOVE R17 R10 + 0x5C480C00, // 0065 MOVE R18 R6 + 0x7C2C0E00, // 0066 CALL R11 7 + 0x502C0200, // 0067 LDBOOL R11 1 0 + 0x80041600, // 0068 RET 1 R11 }) ) ); @@ -885,7 +884,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[67]) { /* constants */ + ( &(const bvalue[66]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(opcode), /* K2 */ be_nested_str_weak(local_session_id), @@ -943,20 +942,19 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ /* K54 */ be_nested_str_weak(MTR_X3A_X20Sigma3_X20verified_X2C_X20computing_X20new_X20keys), /* K55 */ be_nested_str_weak(Msg3), /* K56 */ be_nested_str_weak(SEKeys_Info), - /* K57 */ be_nested_str_weak(rtc), - /* K58 */ be_nested_str_weak(utc), - /* K59 */ be_nested_str_weak(close), - /* K60 */ be_nested_str_weak(set_keys), - /* K61 */ be_nested_str_weak(_breadcrumb), - /* K62 */ be_nested_str_weak(counter_snd_next), - /* K63 */ be_nested_str_weak(set_persist), - /* K64 */ be_nested_str_weak(set_no_expiration), - /* K65 */ be_nested_str_weak(persist_to_fabric), - /* K66 */ be_nested_str_weak(save), + /* K57 */ be_nested_str_weak(rtc_utc), + /* K58 */ be_nested_str_weak(close), + /* K59 */ be_nested_str_weak(set_keys), + /* K60 */ be_nested_str_weak(_breadcrumb), + /* K61 */ be_nested_str_weak(counter_snd_next), + /* K62 */ be_nested_str_weak(set_persist), + /* K63 */ be_nested_str_weak(set_no_expiration), + /* K64 */ be_nested_str_weak(persist_to_fabric), + /* K65 */ be_nested_str_weak(save), }), be_str_weak(parse_Sigma3), &be_const_str_solidified, - ( &(const binstruction[287]) { /* code */ + ( &(const binstruction[286]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x880C0301, // 0001 GETMBR R3 R1 K1 0x54120031, // 0002 LDINT R4 50 @@ -1214,36 +1212,35 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma3, /* name */ 0xB8720A00, // 00FE GETNGBL R28 K5 0x8C703939, // 00FF GETMET R28 R28 K57 0x7C700200, // 0100 CALL R28 1 - 0x9470393A, // 0101 GETIDX R28 R28 K58 - 0x8C740109, // 0102 GETMET R29 R0 K9 - 0x5C7C0200, // 0103 MOVE R31 R1 - 0x58800003, // 0104 LDCONST R32 K3 - 0x58840003, // 0105 LDCONST R33 K3 - 0x58880003, // 0106 LDCONST R34 K3 - 0x508C0200, // 0107 LDBOOL R35 1 0 - 0x7C740C00, // 0108 CALL R29 6 - 0x8C74073B, // 0109 GETMET R29 R3 K59 - 0x7C740200, // 010A CALL R29 1 - 0x8C74073C, // 010B GETMET R29 R3 K60 - 0x5C7C3200, // 010C MOVE R31 R25 - 0x5C803400, // 010D MOVE R32 R26 - 0x5C843600, // 010E MOVE R33 R27 - 0x5C883800, // 010F MOVE R34 R28 - 0x7C740A00, // 0110 CALL R29 5 - 0x900E7B03, // 0111 SETMBR R3 K61 K3 - 0x8C74073E, // 0112 GETMET R29 R3 K62 - 0x7C740200, // 0113 CALL R29 1 - 0x8C74073F, // 0114 GETMET R29 R3 K63 - 0x507C0200, // 0115 LDBOOL R31 1 0 - 0x7C740400, // 0116 CALL R29 2 - 0x8C740740, // 0117 GETMET R29 R3 K64 - 0x7C740200, // 0118 CALL R29 1 - 0x8C740741, // 0119 GETMET R29 R3 K65 - 0x7C740200, // 011A CALL R29 1 - 0x8C740742, // 011B GETMET R29 R3 K66 - 0x7C740200, // 011C CALL R29 1 - 0x50740200, // 011D LDBOOL R29 1 0 - 0x80043A00, // 011E RET 1 R29 + 0x8C740109, // 0101 GETMET R29 R0 K9 + 0x5C7C0200, // 0102 MOVE R31 R1 + 0x58800003, // 0103 LDCONST R32 K3 + 0x58840003, // 0104 LDCONST R33 K3 + 0x58880003, // 0105 LDCONST R34 K3 + 0x508C0200, // 0106 LDBOOL R35 1 0 + 0x7C740C00, // 0107 CALL R29 6 + 0x8C74073A, // 0108 GETMET R29 R3 K58 + 0x7C740200, // 0109 CALL R29 1 + 0x8C74073B, // 010A GETMET R29 R3 K59 + 0x5C7C3200, // 010B MOVE R31 R25 + 0x5C803400, // 010C MOVE R32 R26 + 0x5C843600, // 010D MOVE R33 R27 + 0x5C883800, // 010E MOVE R34 R28 + 0x7C740A00, // 010F CALL R29 5 + 0x900E7903, // 0110 SETMBR R3 K60 K3 + 0x8C74073D, // 0111 GETMET R29 R3 K61 + 0x7C740200, // 0112 CALL R29 1 + 0x8C74073E, // 0113 GETMET R29 R3 K62 + 0x507C0200, // 0114 LDBOOL R31 1 0 + 0x7C740400, // 0115 CALL R29 2 + 0x8C74073F, // 0116 GETMET R29 R3 K63 + 0x7C740200, // 0117 CALL R29 1 + 0x8C740740, // 0118 GETMET R29 R3 K64 + 0x7C740200, // 0119 CALL R29 1 + 0x8C740741, // 011A GETMET R29 R3 K65 + 0x7C740200, // 011B CALL R29 1 + 0x50740200, // 011C LDBOOL R29 1 0 + 0x80043A00, // 011D RET 1 R29 }) ) ); @@ -1391,7 +1388,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[104]) { /* constants */ + ( &(const bvalue[103]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(session), /* K2 */ be_nested_str_weak(opcode), @@ -1447,55 +1444,54 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ /* K52 */ be_nested_str_weak(responderSessionID), /* K53 */ be_nested_str_weak(sigma2ResumeMIC), /* K54 */ be_nested_str_weak(SessionResumptionKeys), - /* K55 */ be_nested_str_weak(rtc), - /* K56 */ be_nested_str_weak(utc), - /* K57 */ be_nested_str_weak(tlv2raw), - /* K58 */ be_nested_str_weak(__Msg1), - /* K59 */ be_nested_str_weak(build_response), - /* K60 */ be_nested_str_weak(encode_frame), - /* K61 */ be_nested_str_weak(responder), - /* K62 */ be_nested_str_weak(send_response_frame), - /* K63 */ be_nested_str_weak(close), - /* K64 */ be_nested_str_weak(set_keys), - /* K65 */ be_nested_str_weak(_breadcrumb), - /* K66 */ be_nested_str_weak(counter_snd_next), - /* K67 */ be_nested_str_weak(set_persist), - /* K68 */ be_nested_str_weak(set_no_expiration), - /* K69 */ be_nested_str_weak(persist_to_fabric), - /* K70 */ be_nested_str_weak(save), - /* K71 */ be_nested_str_weak(find_fabric_by_destination_id), - /* K72 */ be_nested_str_weak(destinationId), - /* K73 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), - /* K74 */ be_nested_str_weak(__responder_priv), - /* K75 */ be_nested_str_weak(__responder_pub), - /* K76 */ be_nested_str_weak(EC_P256), - /* K77 */ be_nested_str_weak(public_key), - /* K78 */ be_nested_str_weak(shared_key), - /* K79 */ be_nested_str_weak(TLV), - /* K80 */ be_nested_str_weak(Matter_TLV_struct), - /* K81 */ be_nested_str_weak(add_TLV), - /* K82 */ be_nested_str_weak(B2), - /* K83 */ be_nested_str_weak(get_noc), - /* K84 */ be_nested_str_weak(get_icac), - /* K85 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K86 */ be_nested_str_weak(get_pk), - /* K87 */ be_nested_str_weak(Msg1), - /* K88 */ be_nested_str_weak(SHA256), - /* K89 */ be_nested_str_weak(update), - /* K90 */ be_nested_str_weak(out), - /* K91 */ be_nested_str_weak(S2K_Info), - /* K92 */ be_nested_str_weak(get_ipk_group_key), - /* K93 */ be_nested_str_weak(TBEData2_Nonce), - /* K94 */ be_nested_str_weak(encrypt), - /* K95 */ be_nested_str_weak(Sigma2), - /* K96 */ be_nested_str_weak(responderRandom), - /* K97 */ be_nested_str_weak(responderSessionId), - /* K98 */ be_nested_str_weak(responderEphPubKey), - /* K99 */ be_nested_str_weak(encrypted2), - /* K100 */ be_nested_str_weak(__Msg2), - /* K101 */ be_nested_str_weak(MTR_X3A_X20New_X20Connection_X20_X28CASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K102 */ be_nested_str_weak(_ip), - /* K103 */ be_nested_str_weak(_port), + /* K55 */ be_nested_str_weak(rtc_utc), + /* K56 */ be_nested_str_weak(tlv2raw), + /* K57 */ be_nested_str_weak(__Msg1), + /* K58 */ be_nested_str_weak(build_response), + /* K59 */ be_nested_str_weak(encode_frame), + /* K60 */ be_nested_str_weak(responder), + /* K61 */ be_nested_str_weak(send_response_frame), + /* K62 */ be_nested_str_weak(close), + /* K63 */ be_nested_str_weak(set_keys), + /* K64 */ be_nested_str_weak(_breadcrumb), + /* K65 */ be_nested_str_weak(counter_snd_next), + /* K66 */ be_nested_str_weak(set_persist), + /* K67 */ be_nested_str_weak(set_no_expiration), + /* K68 */ be_nested_str_weak(persist_to_fabric), + /* K69 */ be_nested_str_weak(save), + /* K70 */ be_nested_str_weak(find_fabric_by_destination_id), + /* K71 */ be_nested_str_weak(destinationId), + /* K72 */ be_nested_str_weak(MTR_X3A_X20StatusReport_X28GeneralCode_X3A_X20FAILURE_X2C_X20ProtocolId_X3A_X20SECURE_CHANNEL_X2C_X20ProtocolCode_X3A_X20NO_SHARED_TRUST_ROOTS_X29), + /* K73 */ be_nested_str_weak(__responder_priv), + /* K74 */ be_nested_str_weak(__responder_pub), + /* K75 */ be_nested_str_weak(EC_P256), + /* K76 */ be_nested_str_weak(public_key), + /* K77 */ be_nested_str_weak(shared_key), + /* K78 */ be_nested_str_weak(TLV), + /* K79 */ be_nested_str_weak(Matter_TLV_struct), + /* K80 */ be_nested_str_weak(add_TLV), + /* K81 */ be_nested_str_weak(B2), + /* K82 */ be_nested_str_weak(get_noc), + /* K83 */ be_nested_str_weak(get_icac), + /* K84 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K85 */ be_nested_str_weak(get_pk), + /* K86 */ be_nested_str_weak(Msg1), + /* K87 */ be_nested_str_weak(SHA256), + /* K88 */ be_nested_str_weak(update), + /* K89 */ be_nested_str_weak(out), + /* K90 */ be_nested_str_weak(S2K_Info), + /* K91 */ be_nested_str_weak(get_ipk_group_key), + /* K92 */ be_nested_str_weak(TBEData2_Nonce), + /* K93 */ be_nested_str_weak(encrypt), + /* K94 */ be_nested_str_weak(Sigma2), + /* K95 */ be_nested_str_weak(responderRandom), + /* K96 */ be_nested_str_weak(responderSessionId), + /* K97 */ be_nested_str_weak(responderEphPubKey), + /* K98 */ be_nested_str_weak(encrypted2), + /* K99 */ be_nested_str_weak(__Msg2), + /* K100 */ be_nested_str_weak(MTR_X3A_X20New_X20Connection_X20_X28CASE_X20id_X3D_X25i_X29_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K101 */ be_nested_str_weak(_ip), + /* K102 */ be_nested_str_weak(_port), }), be_str_weak(parse_Sigma1), &be_const_str_solidified, @@ -1562,7 +1558,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x1C1C0E08, // 003B EQ R7 R7 R8 0x781E0000, // 003C JMPF R7 #003E 0x50140000, // 003D LDBOOL R5 0 0 - 0x781600B6, // 003E JMPF R5 #00F6 + 0x781600B5, // 003E JMPF R5 #00F5 0x881C091A, // 003F GETMBR R7 R4 K26 0x88200914, // 0040 GETMBR R8 R4 K20 0x001C0E08, // 0041 ADD R7 R7 R8 @@ -1610,7 +1606,7 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0x8C3C1B24, // 006B GETMET R15 R13 K36 0x7C3C0200, // 006C CALL R15 1 0x1C40180F, // 006D EQ R16 R12 R15 - 0x78420085, // 006E JMPF R16 #00F5 + 0x78420084, // 006E JMPF R16 #00F4 0x88400D19, // 006F GETMBR R16 R6 K25 0x900E3210, // 0070 SETMBR R3 K25 R16 0x88400326, // 0071 GETMBR R16 R1 K38 @@ -1706,275 +1702,275 @@ be_local_closure(Matter_Commisioning_Context_parse_Sigma1, /* name */ 0xB86A0C00, // 00CB GETNGBL R26 K6 0x8C683537, // 00CC GETMET R26 R26 K55 0x7C680200, // 00CD CALL R26 1 - 0x94683538, // 00CE GETIDX R26 R26 K56 - 0x8C6C2B39, // 00CF GETMET R27 R21 K57 - 0x7C6C0200, // 00D0 CALL R27 1 - 0x4C700000, // 00D1 LDNIL R28 - 0x900E741C, // 00D2 SETMBR R3 K58 R28 - 0x8C70033B, // 00D3 GETMET R28 R1 K59 - 0x547A0032, // 00D4 LDINT R30 51 - 0x507C0200, // 00D5 LDBOOL R31 1 0 - 0x7C700600, // 00D6 CALL R28 3 - 0x8C74393C, // 00D7 GETMET R29 R28 K60 - 0x5C7C3600, // 00D8 MOVE R31 R27 - 0x7C740400, // 00D9 CALL R29 2 - 0x8878013D, // 00DA GETMBR R30 R0 K61 - 0x8C783D3E, // 00DB GETMET R30 R30 K62 - 0x5C803800, // 00DC MOVE R32 R28 - 0x7C780400, // 00DD CALL R30 2 - 0x8C78073F, // 00DE GETMET R30 R3 K63 - 0x7C780200, // 00DF CALL R30 1 - 0x8C780740, // 00E0 GETMET R30 R3 K64 - 0x5C802E00, // 00E1 MOVE R32 R23 - 0x5C843000, // 00E2 MOVE R33 R24 - 0x5C883200, // 00E3 MOVE R34 R25 - 0x5C8C3400, // 00E4 MOVE R35 R26 - 0x7C780A00, // 00E5 CALL R30 5 - 0x900E8304, // 00E6 SETMBR R3 K65 K4 - 0x8C780742, // 00E7 GETMET R30 R3 K66 - 0x7C780200, // 00E8 CALL R30 1 - 0x8C780743, // 00E9 GETMET R30 R3 K67 - 0x50800200, // 00EA LDBOOL R32 1 0 - 0x7C780400, // 00EB CALL R30 2 - 0x8C780744, // 00EC GETMET R30 R3 K68 - 0x7C780200, // 00ED CALL R30 1 - 0x8C780745, // 00EE GETMET R30 R3 K69 - 0x7C780200, // 00EF CALL R30 1 - 0x8C780746, // 00F0 GETMET R30 R3 K70 - 0x7C780200, // 00F1 CALL R30 1 - 0x50780200, // 00F2 LDBOOL R30 1 0 - 0x80043C00, // 00F3 RET 1 R30 - 0x70020000, // 00F4 JMP #00F6 - 0x50140000, // 00F5 LDBOOL R5 0 0 - 0x5C1C0A00, // 00F6 MOVE R7 R5 - 0x741E00E6, // 00F7 JMPT R7 #01DF - 0x8C1C0147, // 00F8 GETMET R7 R0 K71 - 0x88240948, // 00F9 GETMBR R9 R4 K72 - 0x8828091A, // 00FA GETMBR R10 R4 K26 - 0x7C1C0600, // 00FB CALL R7 3 - 0x900E3207, // 00FC SETMBR R3 K25 R7 - 0x4C200000, // 00FD LDNIL R8 - 0x1C200608, // 00FE EQ R8 R3 R8 - 0x74220003, // 00FF JMPT R8 #0104 - 0x88200719, // 0100 GETMBR R8 R3 K25 - 0x4C240000, // 0101 LDNIL R9 - 0x1C201009, // 0102 EQ R8 R8 R9 - 0x7822000D, // 0103 JMPF R8 #0112 - 0xB8220C00, // 0104 GETNGBL R8 K6 - 0x8C201107, // 0105 GETMET R8 R8 K7 - 0x58280049, // 0106 LDCONST R10 K73 - 0x582C0009, // 0107 LDCONST R11 K9 - 0x7C200600, // 0108 CALL R8 3 - 0x8C20010A, // 0109 GETMET R8 R0 K10 - 0x5C280200, // 010A MOVE R10 R1 - 0x582C000B, // 010B LDCONST R11 K11 - 0x58300004, // 010C LDCONST R12 K4 - 0x5834000B, // 010D LDCONST R13 K11 - 0x50380000, // 010E LDBOOL R14 0 0 - 0x7C200C00, // 010F CALL R8 6 - 0x50200000, // 0110 LDBOOL R8 0 0 - 0x80041000, // 0111 RET 1 R8 - 0x88200326, // 0112 GETMBR R8 R1 K38 - 0x900E4A08, // 0113 SETMBR R3 K37 R8 - 0x8C200727, // 0114 GETMET R8 R3 K39 - 0x7C200200, // 0115 CALL R8 1 - 0x88200929, // 0116 GETMBR R8 R4 K41 - 0x900E5008, // 0117 SETMBR R3 K40 R8 - 0x88200116, // 0118 GETMBR R8 R0 K22 - 0x88201117, // 0119 GETMBR R8 R8 K23 - 0x8C20112B, // 011A GETMET R8 R8 K43 - 0x7C200200, // 011B CALL R8 1 - 0x900E5408, // 011C SETMBR R3 K42 R8 - 0xB8220C00, // 011D GETNGBL R8 K6 - 0x8C201107, // 011E GETMET R8 R8 K7 - 0x60280018, // 011F GETGBL R10 G24 - 0x582C002C, // 0120 LDCONST R11 K44 - 0x8830072A, // 0121 GETMBR R12 R3 K42 - 0x8834032D, // 0122 GETMBR R13 R1 K45 - 0x8838032E, // 0123 GETMBR R14 R1 K46 - 0x7C280800, // 0124 CALL R10 4 - 0x582C0009, // 0125 LDCONST R11 K9 - 0x7C200600, // 0126 CALL R8 3 - 0x8C200530, // 0127 GETMET R8 R2 K48 - 0x542A000F, // 0128 LDINT R10 16 - 0x7C200400, // 0129 CALL R8 2 - 0x900E5E08, // 012A SETMBR R3 K47 R8 - 0x8C200530, // 012B GETMET R8 R2 K48 - 0x542A001F, // 012C LDINT R10 32 - 0x7C200400, // 012D CALL R8 2 - 0x900E9408, // 012E SETMBR R3 K74 R8 - 0x8C20054C, // 012F GETMET R8 R2 K76 - 0x7C200200, // 0130 CALL R8 1 - 0x8C20114D, // 0131 GETMET R8 R8 K77 - 0x8828074A, // 0132 GETMBR R10 R3 K74 - 0x7C200400, // 0133 CALL R8 2 - 0x900E9608, // 0134 SETMBR R3 K75 R8 - 0x8C200530, // 0135 GETMET R8 R2 K48 - 0x542A001F, // 0136 LDINT R10 32 - 0x7C200400, // 0137 CALL R8 2 - 0x8C24054C, // 0138 GETMET R9 R2 K76 - 0x7C240200, // 0139 CALL R9 1 - 0x8C24134E, // 013A GETMET R9 R9 K78 - 0x882C074A, // 013B GETMBR R11 R3 K74 - 0x88300913, // 013C GETMBR R12 R4 K19 - 0x7C240600, // 013D CALL R9 3 - 0x900E3E09, // 013E SETMBR R3 K31 R9 - 0xB8261A00, // 013F GETNGBL R9 K13 - 0x8824134F, // 0140 GETMBR R9 R9 K79 - 0x8C241350, // 0141 GETMET R9 R9 K80 - 0x7C240200, // 0142 CALL R9 1 - 0x8C281351, // 0143 GETMET R10 R9 K81 - 0x5830000B, // 0144 LDCONST R12 K11 - 0xB8361A00, // 0145 GETNGBL R13 K13 - 0x88341B4F, // 0146 GETMBR R13 R13 K79 - 0x88341B52, // 0147 GETMBR R13 R13 K82 - 0x8C380F53, // 0148 GETMET R14 R7 K83 - 0x7C380200, // 0149 CALL R14 1 - 0x7C280800, // 014A CALL R10 4 - 0x8C281351, // 014B GETMET R10 R9 K81 - 0x5830000C, // 014C LDCONST R12 K12 - 0xB8361A00, // 014D GETNGBL R13 K13 - 0x88341B4F, // 014E GETMBR R13 R13 K79 - 0x88341B52, // 014F GETMBR R13 R13 K82 - 0x8C380F54, // 0150 GETMET R14 R7 K84 - 0x7C380200, // 0151 CALL R14 1 - 0x7C280800, // 0152 CALL R10 4 - 0x8C281351, // 0153 GETMET R10 R9 K81 - 0x58300009, // 0154 LDCONST R12 K9 - 0xB8361A00, // 0155 GETNGBL R13 K13 - 0x88341B4F, // 0156 GETMBR R13 R13 K79 - 0x88341B52, // 0157 GETMBR R13 R13 K82 - 0x8838074B, // 0158 GETMBR R14 R3 K75 - 0x7C280800, // 0159 CALL R10 4 - 0x8C281351, // 015A GETMET R10 R9 K81 - 0x54320003, // 015B LDINT R12 4 - 0xB8361A00, // 015C GETNGBL R13 K13 - 0x88341B4F, // 015D GETMBR R13 R13 K79 - 0x88341B52, // 015E GETMBR R13 R13 K82 - 0x88380913, // 015F GETMBR R14 R4 K19 - 0x7C280800, // 0160 CALL R10 4 - 0x8C28054C, // 0161 GETMET R10 R2 K76 - 0x7C280200, // 0162 CALL R10 1 - 0x8C281555, // 0163 GETMET R10 R10 K85 - 0x8C300F56, // 0164 GETMET R12 R7 K86 - 0x7C300200, // 0165 CALL R12 1 - 0x8C341339, // 0166 GETMET R13 R9 K57 - 0x7C340200, // 0167 CALL R13 1 - 0x7C280600, // 0168 CALL R10 3 - 0xB82E1A00, // 0169 GETNGBL R11 K13 - 0x882C174F, // 016A GETMBR R11 R11 K79 - 0x8C2C1750, // 016B GETMET R11 R11 K80 - 0x7C2C0200, // 016C CALL R11 1 - 0x8C301751, // 016D GETMET R12 R11 K81 - 0x5838000B, // 016E LDCONST R14 K11 - 0xB83E1A00, // 016F GETNGBL R15 K13 - 0x883C1F4F, // 0170 GETMBR R15 R15 K79 - 0x883C1F52, // 0171 GETMBR R15 R15 K82 - 0x8C400F53, // 0172 GETMET R16 R7 K83 - 0x7C400200, // 0173 CALL R16 1 - 0x7C300800, // 0174 CALL R12 4 - 0x8C301751, // 0175 GETMET R12 R11 K81 - 0x5838000C, // 0176 LDCONST R14 K12 - 0xB83E1A00, // 0177 GETNGBL R15 K13 - 0x883C1F4F, // 0178 GETMBR R15 R15 K79 - 0x883C1F52, // 0179 GETMBR R15 R15 K82 - 0x8C400F54, // 017A GETMET R16 R7 K84 - 0x7C400200, // 017B CALL R16 1 - 0x7C300800, // 017C CALL R12 4 - 0x8C301751, // 017D GETMET R12 R11 K81 - 0x58380009, // 017E LDCONST R14 K9 - 0xB83E1A00, // 017F GETNGBL R15 K13 - 0x883C1F4F, // 0180 GETMBR R15 R15 K79 - 0x883C1F52, // 0181 GETMBR R15 R15 K82 - 0x5C401400, // 0182 MOVE R16 R10 - 0x7C300800, // 0183 CALL R12 4 - 0x8C301751, // 0184 GETMET R12 R11 K81 - 0x543A0003, // 0185 LDINT R14 4 - 0xB83E1A00, // 0186 GETNGBL R15 K13 - 0x883C1F4F, // 0187 GETMBR R15 R15 K79 - 0x883C1F52, // 0188 GETMBR R15 R15 K82 - 0x8840072F, // 0189 GETMBR R16 R3 K47 - 0x7C300800, // 018A CALL R12 4 - 0x88300957, // 018B GETMBR R12 R4 K87 - 0x900E740C, // 018C SETMBR R3 K58 R12 - 0x8C300558, // 018D GETMET R12 R2 K88 - 0x7C300200, // 018E CALL R12 1 - 0x8C301959, // 018F GETMET R12 R12 K89 - 0x8838073A, // 0190 GETMBR R14 R3 K58 - 0x7C300400, // 0191 CALL R12 2 - 0x8C30195A, // 0192 GETMET R12 R12 K90 - 0x7C300200, // 0193 CALL R12 1 - 0x60340015, // 0194 GETGBL R13 G21 - 0x7C340000, // 0195 CALL R13 0 - 0x8C341B1B, // 0196 GETMET R13 R13 K27 - 0x883C015B, // 0197 GETMBR R15 R0 K91 - 0x7C340400, // 0198 CALL R13 2 - 0x8C380F5C, // 0199 GETMET R14 R7 K92 - 0x7C380200, // 019A CALL R14 1 - 0x00381C08, // 019B ADD R14 R14 R8 - 0x883C074B, // 019C GETMBR R15 R3 K75 - 0x00381C0F, // 019D ADD R14 R14 R15 - 0x00381C0C, // 019E ADD R14 R14 R12 - 0x8C3C051D, // 019F GETMET R15 R2 K29 - 0x7C3C0200, // 01A0 CALL R15 1 - 0x8C3C1F1E, // 01A1 GETMET R15 R15 K30 - 0x8844071F, // 01A2 GETMBR R17 R3 K31 - 0x5C481C00, // 01A3 MOVE R18 R14 - 0x5C4C1A00, // 01A4 MOVE R19 R13 - 0x5452000F, // 01A5 LDINT R20 16 - 0x7C3C0A00, // 01A6 CALL R15 5 - 0x8C401739, // 01A7 GETMET R16 R11 K57 - 0x7C400200, // 01A8 CALL R16 1 - 0x8C440522, // 01A9 GETMET R17 R2 K34 - 0x5C4C1E00, // 01AA MOVE R19 R15 - 0x60500015, // 01AB GETGBL R20 G21 - 0x7C500000, // 01AC CALL R20 0 - 0x8C50291B, // 01AD GETMET R20 R20 K27 - 0x8858015D, // 01AE GETMBR R22 R0 K93 - 0x7C500400, // 01AF CALL R20 2 - 0x60540015, // 01B0 GETGBL R21 G21 - 0x7C540000, // 01B1 CALL R21 0 - 0x6058000C, // 01B2 GETGBL R22 G12 - 0x5C5C2000, // 01B3 MOVE R23 R16 - 0x7C580200, // 01B4 CALL R22 1 - 0x545E000F, // 01B5 LDINT R23 16 - 0x7C440C00, // 01B6 CALL R17 6 - 0x8C48235E, // 01B7 GETMET R18 R17 K94 - 0x5C502000, // 01B8 MOVE R20 R16 - 0x7C480400, // 01B9 CALL R18 2 - 0x8C4C2324, // 01BA GETMET R19 R17 K36 - 0x7C4C0200, // 01BB CALL R19 1 - 0x00482413, // 01BC ADD R18 R18 R19 - 0xB84E1A00, // 01BD GETNGBL R19 K13 - 0x8C4C275F, // 01BE GETMET R19 R19 K95 - 0x7C4C0200, // 01BF CALL R19 1 - 0x904EC008, // 01C0 SETMBR R19 K96 R8 - 0x8850072A, // 01C1 GETMBR R20 R3 K42 - 0x904EC214, // 01C2 SETMBR R19 K97 R20 - 0x8850074B, // 01C3 GETMBR R20 R3 K75 - 0x904EC414, // 01C4 SETMBR R19 K98 R20 - 0x904EC612, // 01C5 SETMBR R19 K99 R18 - 0x8C502739, // 01C6 GETMET R20 R19 K57 - 0x7C500200, // 01C7 CALL R20 1 - 0x900EC814, // 01C8 SETMBR R3 K100 R20 - 0x8C54033B, // 01C9 GETMET R21 R1 K59 - 0x545E0030, // 01CA LDINT R23 49 - 0x50600200, // 01CB LDBOOL R24 1 0 - 0x7C540600, // 01CC CALL R21 3 - 0x8C582B3C, // 01CD GETMET R22 R21 K60 - 0x5C602800, // 01CE MOVE R24 R20 - 0x7C580400, // 01CF CALL R22 2 - 0xB85E0C00, // 01D0 GETNGBL R23 K6 - 0x8C5C2F07, // 01D1 GETMET R23 R23 K7 - 0x60640018, // 01D2 GETGBL R25 G24 - 0x58680065, // 01D3 LDCONST R26 K101 - 0x886C072A, // 01D4 GETMBR R27 R3 K42 - 0x88700766, // 01D5 GETMBR R28 R3 K102 - 0x88740767, // 01D6 GETMBR R29 R3 K103 - 0x7C640800, // 01D7 CALL R25 4 - 0x7C5C0400, // 01D8 CALL R23 2 - 0x885C013D, // 01D9 GETMBR R23 R0 K61 - 0x8C5C2F3E, // 01DA GETMET R23 R23 K62 + 0x8C6C2B38, // 00CE GETMET R27 R21 K56 + 0x7C6C0200, // 00CF CALL R27 1 + 0x4C700000, // 00D0 LDNIL R28 + 0x900E721C, // 00D1 SETMBR R3 K57 R28 + 0x8C70033A, // 00D2 GETMET R28 R1 K58 + 0x547A0032, // 00D3 LDINT R30 51 + 0x507C0200, // 00D4 LDBOOL R31 1 0 + 0x7C700600, // 00D5 CALL R28 3 + 0x8C74393B, // 00D6 GETMET R29 R28 K59 + 0x5C7C3600, // 00D7 MOVE R31 R27 + 0x7C740400, // 00D8 CALL R29 2 + 0x8878013C, // 00D9 GETMBR R30 R0 K60 + 0x8C783D3D, // 00DA GETMET R30 R30 K61 + 0x5C803800, // 00DB MOVE R32 R28 + 0x7C780400, // 00DC CALL R30 2 + 0x8C78073E, // 00DD GETMET R30 R3 K62 + 0x7C780200, // 00DE CALL R30 1 + 0x8C78073F, // 00DF GETMET R30 R3 K63 + 0x5C802E00, // 00E0 MOVE R32 R23 + 0x5C843000, // 00E1 MOVE R33 R24 + 0x5C883200, // 00E2 MOVE R34 R25 + 0x5C8C3400, // 00E3 MOVE R35 R26 + 0x7C780A00, // 00E4 CALL R30 5 + 0x900E8104, // 00E5 SETMBR R3 K64 K4 + 0x8C780741, // 00E6 GETMET R30 R3 K65 + 0x7C780200, // 00E7 CALL R30 1 + 0x8C780742, // 00E8 GETMET R30 R3 K66 + 0x50800200, // 00E9 LDBOOL R32 1 0 + 0x7C780400, // 00EA CALL R30 2 + 0x8C780743, // 00EB GETMET R30 R3 K67 + 0x7C780200, // 00EC CALL R30 1 + 0x8C780744, // 00ED GETMET R30 R3 K68 + 0x7C780200, // 00EE CALL R30 1 + 0x8C780745, // 00EF GETMET R30 R3 K69 + 0x7C780200, // 00F0 CALL R30 1 + 0x50780200, // 00F1 LDBOOL R30 1 0 + 0x80043C00, // 00F2 RET 1 R30 + 0x70020000, // 00F3 JMP #00F5 + 0x50140000, // 00F4 LDBOOL R5 0 0 + 0x5C1C0A00, // 00F5 MOVE R7 R5 + 0x741E00E7, // 00F6 JMPT R7 #01DF + 0x8C1C0146, // 00F7 GETMET R7 R0 K70 + 0x88240947, // 00F8 GETMBR R9 R4 K71 + 0x8828091A, // 00F9 GETMBR R10 R4 K26 + 0x7C1C0600, // 00FA CALL R7 3 + 0x900E3207, // 00FB SETMBR R3 K25 R7 + 0x4C200000, // 00FC LDNIL R8 + 0x1C200608, // 00FD EQ R8 R3 R8 + 0x74220003, // 00FE JMPT R8 #0103 + 0x88200719, // 00FF GETMBR R8 R3 K25 + 0x4C240000, // 0100 LDNIL R9 + 0x1C201009, // 0101 EQ R8 R8 R9 + 0x7822000D, // 0102 JMPF R8 #0111 + 0xB8220C00, // 0103 GETNGBL R8 K6 + 0x8C201107, // 0104 GETMET R8 R8 K7 + 0x58280048, // 0105 LDCONST R10 K72 + 0x582C0009, // 0106 LDCONST R11 K9 + 0x7C200600, // 0107 CALL R8 3 + 0x8C20010A, // 0108 GETMET R8 R0 K10 + 0x5C280200, // 0109 MOVE R10 R1 + 0x582C000B, // 010A LDCONST R11 K11 + 0x58300004, // 010B LDCONST R12 K4 + 0x5834000B, // 010C LDCONST R13 K11 + 0x50380000, // 010D LDBOOL R14 0 0 + 0x7C200C00, // 010E CALL R8 6 + 0x50200000, // 010F LDBOOL R8 0 0 + 0x80041000, // 0110 RET 1 R8 + 0x88200326, // 0111 GETMBR R8 R1 K38 + 0x900E4A08, // 0112 SETMBR R3 K37 R8 + 0x8C200727, // 0113 GETMET R8 R3 K39 + 0x7C200200, // 0114 CALL R8 1 + 0x88200929, // 0115 GETMBR R8 R4 K41 + 0x900E5008, // 0116 SETMBR R3 K40 R8 + 0x88200116, // 0117 GETMBR R8 R0 K22 + 0x88201117, // 0118 GETMBR R8 R8 K23 + 0x8C20112B, // 0119 GETMET R8 R8 K43 + 0x7C200200, // 011A CALL R8 1 + 0x900E5408, // 011B SETMBR R3 K42 R8 + 0xB8220C00, // 011C GETNGBL R8 K6 + 0x8C201107, // 011D GETMET R8 R8 K7 + 0x60280018, // 011E GETGBL R10 G24 + 0x582C002C, // 011F LDCONST R11 K44 + 0x8830072A, // 0120 GETMBR R12 R3 K42 + 0x8834032D, // 0121 GETMBR R13 R1 K45 + 0x8838032E, // 0122 GETMBR R14 R1 K46 + 0x7C280800, // 0123 CALL R10 4 + 0x582C0009, // 0124 LDCONST R11 K9 + 0x7C200600, // 0125 CALL R8 3 + 0x8C200530, // 0126 GETMET R8 R2 K48 + 0x542A000F, // 0127 LDINT R10 16 + 0x7C200400, // 0128 CALL R8 2 + 0x900E5E08, // 0129 SETMBR R3 K47 R8 + 0x8C200530, // 012A GETMET R8 R2 K48 + 0x542A001F, // 012B LDINT R10 32 + 0x7C200400, // 012C CALL R8 2 + 0x900E9208, // 012D SETMBR R3 K73 R8 + 0x8C20054B, // 012E GETMET R8 R2 K75 + 0x7C200200, // 012F CALL R8 1 + 0x8C20114C, // 0130 GETMET R8 R8 K76 + 0x88280749, // 0131 GETMBR R10 R3 K73 + 0x7C200400, // 0132 CALL R8 2 + 0x900E9408, // 0133 SETMBR R3 K74 R8 + 0x8C200530, // 0134 GETMET R8 R2 K48 + 0x542A001F, // 0135 LDINT R10 32 + 0x7C200400, // 0136 CALL R8 2 + 0x8C24054B, // 0137 GETMET R9 R2 K75 + 0x7C240200, // 0138 CALL R9 1 + 0x8C24134D, // 0139 GETMET R9 R9 K77 + 0x882C0749, // 013A GETMBR R11 R3 K73 + 0x88300913, // 013B GETMBR R12 R4 K19 + 0x7C240600, // 013C CALL R9 3 + 0x900E3E09, // 013D SETMBR R3 K31 R9 + 0xB8261A00, // 013E GETNGBL R9 K13 + 0x8824134E, // 013F GETMBR R9 R9 K78 + 0x8C24134F, // 0140 GETMET R9 R9 K79 + 0x7C240200, // 0141 CALL R9 1 + 0x8C281350, // 0142 GETMET R10 R9 K80 + 0x5830000B, // 0143 LDCONST R12 K11 + 0xB8361A00, // 0144 GETNGBL R13 K13 + 0x88341B4E, // 0145 GETMBR R13 R13 K78 + 0x88341B51, // 0146 GETMBR R13 R13 K81 + 0x8C380F52, // 0147 GETMET R14 R7 K82 + 0x7C380200, // 0148 CALL R14 1 + 0x7C280800, // 0149 CALL R10 4 + 0x8C281350, // 014A GETMET R10 R9 K80 + 0x5830000C, // 014B LDCONST R12 K12 + 0xB8361A00, // 014C GETNGBL R13 K13 + 0x88341B4E, // 014D GETMBR R13 R13 K78 + 0x88341B51, // 014E GETMBR R13 R13 K81 + 0x8C380F53, // 014F GETMET R14 R7 K83 + 0x7C380200, // 0150 CALL R14 1 + 0x7C280800, // 0151 CALL R10 4 + 0x8C281350, // 0152 GETMET R10 R9 K80 + 0x58300009, // 0153 LDCONST R12 K9 + 0xB8361A00, // 0154 GETNGBL R13 K13 + 0x88341B4E, // 0155 GETMBR R13 R13 K78 + 0x88341B51, // 0156 GETMBR R13 R13 K81 + 0x8838074A, // 0157 GETMBR R14 R3 K74 + 0x7C280800, // 0158 CALL R10 4 + 0x8C281350, // 0159 GETMET R10 R9 K80 + 0x54320003, // 015A LDINT R12 4 + 0xB8361A00, // 015B GETNGBL R13 K13 + 0x88341B4E, // 015C GETMBR R13 R13 K78 + 0x88341B51, // 015D GETMBR R13 R13 K81 + 0x88380913, // 015E GETMBR R14 R4 K19 + 0x7C280800, // 015F CALL R10 4 + 0x8C28054B, // 0160 GETMET R10 R2 K75 + 0x7C280200, // 0161 CALL R10 1 + 0x8C281554, // 0162 GETMET R10 R10 K84 + 0x8C300F55, // 0163 GETMET R12 R7 K85 + 0x7C300200, // 0164 CALL R12 1 + 0x8C341338, // 0165 GETMET R13 R9 K56 + 0x7C340200, // 0166 CALL R13 1 + 0x7C280600, // 0167 CALL R10 3 + 0xB82E1A00, // 0168 GETNGBL R11 K13 + 0x882C174E, // 0169 GETMBR R11 R11 K78 + 0x8C2C174F, // 016A GETMET R11 R11 K79 + 0x7C2C0200, // 016B CALL R11 1 + 0x8C301750, // 016C GETMET R12 R11 K80 + 0x5838000B, // 016D LDCONST R14 K11 + 0xB83E1A00, // 016E GETNGBL R15 K13 + 0x883C1F4E, // 016F GETMBR R15 R15 K78 + 0x883C1F51, // 0170 GETMBR R15 R15 K81 + 0x8C400F52, // 0171 GETMET R16 R7 K82 + 0x7C400200, // 0172 CALL R16 1 + 0x7C300800, // 0173 CALL R12 4 + 0x8C301750, // 0174 GETMET R12 R11 K80 + 0x5838000C, // 0175 LDCONST R14 K12 + 0xB83E1A00, // 0176 GETNGBL R15 K13 + 0x883C1F4E, // 0177 GETMBR R15 R15 K78 + 0x883C1F51, // 0178 GETMBR R15 R15 K81 + 0x8C400F53, // 0179 GETMET R16 R7 K83 + 0x7C400200, // 017A CALL R16 1 + 0x7C300800, // 017B CALL R12 4 + 0x8C301750, // 017C GETMET R12 R11 K80 + 0x58380009, // 017D LDCONST R14 K9 + 0xB83E1A00, // 017E GETNGBL R15 K13 + 0x883C1F4E, // 017F GETMBR R15 R15 K78 + 0x883C1F51, // 0180 GETMBR R15 R15 K81 + 0x5C401400, // 0181 MOVE R16 R10 + 0x7C300800, // 0182 CALL R12 4 + 0x8C301750, // 0183 GETMET R12 R11 K80 + 0x543A0003, // 0184 LDINT R14 4 + 0xB83E1A00, // 0185 GETNGBL R15 K13 + 0x883C1F4E, // 0186 GETMBR R15 R15 K78 + 0x883C1F51, // 0187 GETMBR R15 R15 K81 + 0x8840072F, // 0188 GETMBR R16 R3 K47 + 0x7C300800, // 0189 CALL R12 4 + 0x88300956, // 018A GETMBR R12 R4 K86 + 0x900E720C, // 018B SETMBR R3 K57 R12 + 0x8C300557, // 018C GETMET R12 R2 K87 + 0x7C300200, // 018D CALL R12 1 + 0x8C301958, // 018E GETMET R12 R12 K88 + 0x88380739, // 018F GETMBR R14 R3 K57 + 0x7C300400, // 0190 CALL R12 2 + 0x8C301959, // 0191 GETMET R12 R12 K89 + 0x7C300200, // 0192 CALL R12 1 + 0x60340015, // 0193 GETGBL R13 G21 + 0x7C340000, // 0194 CALL R13 0 + 0x8C341B1B, // 0195 GETMET R13 R13 K27 + 0x883C015A, // 0196 GETMBR R15 R0 K90 + 0x7C340400, // 0197 CALL R13 2 + 0x8C380F5B, // 0198 GETMET R14 R7 K91 + 0x7C380200, // 0199 CALL R14 1 + 0x00381C08, // 019A ADD R14 R14 R8 + 0x883C074A, // 019B GETMBR R15 R3 K74 + 0x00381C0F, // 019C ADD R14 R14 R15 + 0x00381C0C, // 019D ADD R14 R14 R12 + 0x8C3C051D, // 019E GETMET R15 R2 K29 + 0x7C3C0200, // 019F CALL R15 1 + 0x8C3C1F1E, // 01A0 GETMET R15 R15 K30 + 0x8844071F, // 01A1 GETMBR R17 R3 K31 + 0x5C481C00, // 01A2 MOVE R18 R14 + 0x5C4C1A00, // 01A3 MOVE R19 R13 + 0x5452000F, // 01A4 LDINT R20 16 + 0x7C3C0A00, // 01A5 CALL R15 5 + 0x8C401738, // 01A6 GETMET R16 R11 K56 + 0x7C400200, // 01A7 CALL R16 1 + 0x8C440522, // 01A8 GETMET R17 R2 K34 + 0x5C4C1E00, // 01A9 MOVE R19 R15 + 0x60500015, // 01AA GETGBL R20 G21 + 0x7C500000, // 01AB CALL R20 0 + 0x8C50291B, // 01AC GETMET R20 R20 K27 + 0x8858015C, // 01AD GETMBR R22 R0 K92 + 0x7C500400, // 01AE CALL R20 2 + 0x60540015, // 01AF GETGBL R21 G21 + 0x7C540000, // 01B0 CALL R21 0 + 0x6058000C, // 01B1 GETGBL R22 G12 + 0x5C5C2000, // 01B2 MOVE R23 R16 + 0x7C580200, // 01B3 CALL R22 1 + 0x545E000F, // 01B4 LDINT R23 16 + 0x7C440C00, // 01B5 CALL R17 6 + 0x8C48235D, // 01B6 GETMET R18 R17 K93 + 0x5C502000, // 01B7 MOVE R20 R16 + 0x7C480400, // 01B8 CALL R18 2 + 0x8C4C2324, // 01B9 GETMET R19 R17 K36 + 0x7C4C0200, // 01BA CALL R19 1 + 0x00482413, // 01BB ADD R18 R18 R19 + 0xB84E1A00, // 01BC GETNGBL R19 K13 + 0x8C4C275E, // 01BD GETMET R19 R19 K94 + 0x7C4C0200, // 01BE CALL R19 1 + 0x904EBE08, // 01BF SETMBR R19 K95 R8 + 0x8850072A, // 01C0 GETMBR R20 R3 K42 + 0x904EC014, // 01C1 SETMBR R19 K96 R20 + 0x8850074A, // 01C2 GETMBR R20 R3 K74 + 0x904EC214, // 01C3 SETMBR R19 K97 R20 + 0x904EC412, // 01C4 SETMBR R19 K98 R18 + 0x8C502738, // 01C5 GETMET R20 R19 K56 + 0x7C500200, // 01C6 CALL R20 1 + 0x900EC614, // 01C7 SETMBR R3 K99 R20 + 0x8C54033A, // 01C8 GETMET R21 R1 K58 + 0x545E0030, // 01C9 LDINT R23 49 + 0x50600200, // 01CA LDBOOL R24 1 0 + 0x7C540600, // 01CB CALL R21 3 + 0x8C582B3B, // 01CC GETMET R22 R21 K59 + 0x5C602800, // 01CD MOVE R24 R20 + 0x7C580400, // 01CE CALL R22 2 + 0xB85E0C00, // 01CF GETNGBL R23 K6 + 0x8C5C2F07, // 01D0 GETMET R23 R23 K7 + 0x60640018, // 01D1 GETGBL R25 G24 + 0x58680064, // 01D2 LDCONST R26 K100 + 0x886C072A, // 01D3 GETMBR R27 R3 K42 + 0x88700765, // 01D4 GETMBR R28 R3 K101 + 0x88740766, // 01D5 GETMBR R29 R3 K102 + 0x7C640800, // 01D6 CALL R25 4 + 0x5868000C, // 01D7 LDCONST R26 K12 + 0x7C5C0600, // 01D8 CALL R23 3 + 0x885C013C, // 01D9 GETMBR R23 R0 K60 + 0x8C5C2F3D, // 01DA GETMET R23 R23 K61 0x5C642A00, // 01DB MOVE R25 R21 0x7C5C0400, // 01DC CALL R23 2 0x505C0200, // 01DD LDBOOL R23 1 0 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index 161e6a06d..ce96a7260 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -7,12 +7,12 @@ extern const bclass be_class_Matter_Device; /******************************************************************** -** Solidified function: autoconf_sensors_list +** Solidified function: clean_remotes ********************************************************************/ -be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ +be_local_closure(Matter_Device_clean_remotes, /* name */ be_nested_proto( 10, /* nstack */ - 2, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -20,492 +20,109 @@ be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(k2l), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(Temperature), - /* K3 */ be_nested_str_weak(_X23Temperature), - /* K4 */ be_nested_str_weak(push), - /* K5 */ be_nested_str_weak(type), - /* K6 */ be_nested_str_weak(temperature), - /* K7 */ be_nested_str_weak(filter), - /* K8 */ be_nested_str_weak(stop_iteration), - /* K9 */ be_nested_str_weak(Pressure), - /* K10 */ be_nested_str_weak(_X23Pressure), - /* K11 */ be_nested_str_weak(pressure), - /* K12 */ be_nested_str_weak(Illuminance), - /* K13 */ be_nested_str_weak(_X23Illuminance), - /* K14 */ be_nested_str_weak(illuminance), - /* K15 */ be_nested_str_weak(Humidity), - /* K16 */ be_nested_str_weak(_X23Humidity), - /* K17 */ be_nested_str_weak(humidity), - }), - be_str_weak(autoconf_sensors_list), - &be_const_str_solidified, - ( &(const binstruction[119]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100100, // 0003 GETMET R4 R0 K0 - 0x5C180200, // 0004 MOVE R6 R1 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020013, // 0007 EXBLK 0 #001C - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x94140204, // 000A GETIDX R5 R1 R4 - 0x6018000F, // 000B GETGBL R6 G15 - 0x5C1C0A00, // 000C MOVE R7 R5 - 0x60200013, // 000D GETGBL R8 G19 - 0x7C180400, // 000E CALL R6 2 - 0x781A000A, // 000F JMPF R6 #001B - 0x8C180B01, // 0010 GETMET R6 R5 K1 - 0x58200002, // 0011 LDCONST R8 K2 - 0x7C180400, // 0012 CALL R6 2 - 0x781A0006, // 0013 JMPF R6 #001B - 0x00180903, // 0014 ADD R6 R4 K3 - 0x8C1C0504, // 0015 GETMET R7 R2 K4 - 0x60240013, // 0016 GETGBL R9 G19 - 0x7C240000, // 0017 CALL R9 0 - 0x98260B06, // 0018 SETIDX R9 K5 K6 - 0x98260E06, // 0019 SETIDX R9 K7 R6 - 0x7C1C0400, // 001A CALL R7 2 - 0x7001FFEB, // 001B JMP #0008 - 0x580C0008, // 001C LDCONST R3 K8 - 0xAC0C0200, // 001D CATCH R3 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x600C0010, // 001F GETGBL R3 G16 - 0x8C100100, // 0020 GETMET R4 R0 K0 - 0x5C180200, // 0021 MOVE R6 R1 - 0x7C100400, // 0022 CALL R4 2 - 0x7C0C0200, // 0023 CALL R3 1 - 0xA8020013, // 0024 EXBLK 0 #0039 - 0x5C100600, // 0025 MOVE R4 R3 - 0x7C100000, // 0026 CALL R4 0 - 0x94140204, // 0027 GETIDX R5 R1 R4 - 0x6018000F, // 0028 GETGBL R6 G15 - 0x5C1C0A00, // 0029 MOVE R7 R5 - 0x60200013, // 002A GETGBL R8 G19 - 0x7C180400, // 002B CALL R6 2 - 0x781A000A, // 002C JMPF R6 #0038 - 0x8C180B01, // 002D GETMET R6 R5 K1 - 0x58200009, // 002E LDCONST R8 K9 - 0x7C180400, // 002F CALL R6 2 - 0x781A0006, // 0030 JMPF R6 #0038 - 0x0018090A, // 0031 ADD R6 R4 K10 - 0x8C1C0504, // 0032 GETMET R7 R2 K4 - 0x60240013, // 0033 GETGBL R9 G19 - 0x7C240000, // 0034 CALL R9 0 - 0x98260B0B, // 0035 SETIDX R9 K5 K11 - 0x98260E06, // 0036 SETIDX R9 K7 R6 - 0x7C1C0400, // 0037 CALL R7 2 - 0x7001FFEB, // 0038 JMP #0025 - 0x580C0008, // 0039 LDCONST R3 K8 - 0xAC0C0200, // 003A CATCH R3 1 0 - 0xB0080000, // 003B RAISE 2 R0 R0 - 0x600C0010, // 003C GETGBL R3 G16 - 0x8C100100, // 003D GETMET R4 R0 K0 - 0x5C180200, // 003E MOVE R6 R1 - 0x7C100400, // 003F CALL R4 2 - 0x7C0C0200, // 0040 CALL R3 1 - 0xA8020013, // 0041 EXBLK 0 #0056 - 0x5C100600, // 0042 MOVE R4 R3 - 0x7C100000, // 0043 CALL R4 0 - 0x94140204, // 0044 GETIDX R5 R1 R4 - 0x6018000F, // 0045 GETGBL R6 G15 - 0x5C1C0A00, // 0046 MOVE R7 R5 - 0x60200013, // 0047 GETGBL R8 G19 - 0x7C180400, // 0048 CALL R6 2 - 0x781A000A, // 0049 JMPF R6 #0055 - 0x8C180B01, // 004A GETMET R6 R5 K1 - 0x5820000C, // 004B LDCONST R8 K12 - 0x7C180400, // 004C CALL R6 2 - 0x781A0006, // 004D JMPF R6 #0055 - 0x0018090D, // 004E ADD R6 R4 K13 - 0x8C1C0504, // 004F GETMET R7 R2 K4 - 0x60240013, // 0050 GETGBL R9 G19 - 0x7C240000, // 0051 CALL R9 0 - 0x98260B0E, // 0052 SETIDX R9 K5 K14 - 0x98260E06, // 0053 SETIDX R9 K7 R6 - 0x7C1C0400, // 0054 CALL R7 2 - 0x7001FFEB, // 0055 JMP #0042 - 0x580C0008, // 0056 LDCONST R3 K8 - 0xAC0C0200, // 0057 CATCH R3 1 0 - 0xB0080000, // 0058 RAISE 2 R0 R0 - 0x600C0010, // 0059 GETGBL R3 G16 - 0x8C100100, // 005A GETMET R4 R0 K0 - 0x5C180200, // 005B MOVE R6 R1 - 0x7C100400, // 005C CALL R4 2 - 0x7C0C0200, // 005D CALL R3 1 - 0xA8020013, // 005E EXBLK 0 #0073 - 0x5C100600, // 005F MOVE R4 R3 - 0x7C100000, // 0060 CALL R4 0 - 0x94140204, // 0061 GETIDX R5 R1 R4 - 0x6018000F, // 0062 GETGBL R6 G15 - 0x5C1C0A00, // 0063 MOVE R7 R5 - 0x60200013, // 0064 GETGBL R8 G19 - 0x7C180400, // 0065 CALL R6 2 - 0x781A000A, // 0066 JMPF R6 #0072 - 0x8C180B01, // 0067 GETMET R6 R5 K1 - 0x5820000F, // 0068 LDCONST R8 K15 - 0x7C180400, // 0069 CALL R6 2 - 0x781A0006, // 006A JMPF R6 #0072 - 0x00180910, // 006B ADD R6 R4 K16 - 0x8C1C0504, // 006C GETMET R7 R2 K4 - 0x60240013, // 006D GETGBL R9 G19 - 0x7C240000, // 006E CALL R9 0 - 0x98260B11, // 006F SETIDX R9 K5 K17 - 0x98260E06, // 0070 SETIDX R9 K7 R6 - 0x7C1C0400, // 0071 CALL R7 2 - 0x7001FFEB, // 0072 JMP #005F - 0x580C0008, // 0073 LDCONST R3 K8 - 0xAC0C0200, // 0074 CATCH R3 1 0 - 0xB0080000, // 0075 RAISE 2 R0 R0 - 0x80040400, // 0076 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _start_udp -********************************************************************/ -be_local_closure(Matter_Device__start_udp, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(msg_received), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x680C0000, // 0000 GETUPV R3 U0 - 0x8C0C0700, // 0001 GETMET R3 R3 K0 - 0x5C140000, // 0002 MOVE R5 R0 - 0x5C180200, // 0003 MOVE R6 R1 - 0x5C1C0400, // 0004 MOVE R7 R2 - 0x7C0C0800, // 0005 CALL R3 4 - 0x80040600, // 0006 RET 1 R3 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), - /* K4 */ be_const_int(2), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(UDPServer), - /* K7 */ be_nested_str_weak(), - /* K8 */ be_nested_str_weak(start), - }), - be_str_weak(_start_udp), - &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x780A0000, // 0001 JMPF R2 #0003 - 0x80000400, // 0002 RET 0 - 0x4C080000, // 0003 LDNIL R2 - 0x1C080202, // 0004 EQ R2 R1 R2 - 0x780A0000, // 0005 JMPF R2 #0007 - 0x540615A3, // 0006 LDINT R1 5540 - 0xB80A0200, // 0007 GETNGBL R2 K1 - 0x8C080502, // 0008 GETMET R2 R2 K2 - 0x60100008, // 0009 GETGBL R4 G8 - 0x5C140200, // 000A MOVE R5 R1 - 0x7C100200, // 000B CALL R4 1 - 0x00120604, // 000C ADD R4 K3 R4 - 0x58140004, // 000D LDCONST R5 K4 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0A00, // 000F GETNGBL R2 K5 - 0x8C080506, // 0010 GETMET R2 R2 K6 - 0x5C100000, // 0011 MOVE R4 R0 - 0x58140007, // 0012 LDCONST R5 K7 - 0x5C180200, // 0013 MOVE R6 R1 - 0x7C080800, // 0014 CALL R2 4 - 0x90020002, // 0015 SETMBR R0 K0 R2 - 0x88080100, // 0016 GETMBR R2 R0 K0 - 0x8C080508, // 0017 GETMET R2 R2 K8 - 0x84100000, // 0018 CLOSURE R4 P0 - 0x7C080400, // 0019 CALL R2 2 - 0xA0000000, // 001A CLOSE R0 - 0x80000000, // 001B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(mdns), - /* K2 */ be_nested_str_weak(stop_basic_commissioning), - /* K3 */ be_nested_str_weak(root_w0), - /* K4 */ be_nested_str_weak(root_L), - /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), - }), - be_str_weak(start_operational_discovery), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100102, // 0002 GETMET R4 R0 K2 - 0x7C100200, // 0003 CALL R4 1 - 0x4C100000, // 0004 LDNIL R4 - 0x90020604, // 0005 SETMBR R0 K3 R4 - 0x4C100000, // 0006 LDNIL R4 - 0x90020804, // 0007 SETMBR R0 K4 R4 - 0x8C100105, // 0008 GETMET R4 R0 K5 - 0x5C180200, // 0009 MOVE R6 R1 - 0x7C100400, // 000A CALL R4 2 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_commissioning_open -********************************************************************/ -be_local_closure(Matter_Device_is_commissioning_open, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), - }), - be_str_weak(is_commissioning_open), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: load_param -********************************************************************/ -be_local_closure(Matter_Device_load_param, /* name */ - be_nested_proto( - 11, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[35]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(FILENAME), - /* K2 */ be_nested_str_weak(read), - /* K3 */ be_nested_str_weak(close), - /* K4 */ be_nested_str_weak(json), - /* K5 */ be_nested_str_weak(load), - /* K6 */ be_nested_str_weak(root_discriminator), + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(http_remotes), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_nested_str_weak(plugins), + /* K5 */ be_nested_str_weak(get), + /* K6 */ be_nested_str_weak(http_remote), /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(distinguish), - /* K9 */ be_nested_str_weak(root_passcode), - /* K10 */ be_nested_str_weak(passcode), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(disable_bridge_mode), - /* K13 */ be_nested_str_weak(next_ep), - /* K14 */ be_nested_str_weak(nextep), - /* K15 */ be_nested_str_weak(plugins_config), - /* K16 */ be_nested_str_weak(config), - /* K17 */ be_nested_str_weak(tasmota), - /* K18 */ be_nested_str_weak(log), - /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(adjust_next_ep), - /* K22 */ be_nested_str_weak(plugins_persist), - /* K23 */ be_nested_str_weak(plugins_config_remotes), - /* K24 */ be_nested_str_weak(remotes), - /* K25 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), - /* K26 */ be_nested_str_weak(io_error), - /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), - /* K28 */ be_nested_str_weak(_X7C), - /* K29 */ be_const_int(2), - /* K30 */ be_nested_str_weak(random), - /* K31 */ be_nested_str_weak(get), - /* K32 */ be_const_int(0), - /* K33 */ be_nested_str_weak(generate_random_passcode), - /* K34 */ be_nested_str_weak(save_param), + /* K8 */ be_const_int(1), + /* K9 */ be_nested_str_weak(keys), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(tasmota), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), + /* K14 */ be_nested_str_weak(addr), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(close), + /* K17 */ be_nested_str_weak(remove), }), - be_str_weak(load_param), + be_str_weak(clean_remotes), &be_const_str_solidified, - ( &(const binstruction[127]) { /* code */ + ( &(const binstruction[81]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0xA802004D, // 0001 EXBLK 0 #0050 - 0x60080011, // 0002 GETGBL R2 G17 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x7C080200, // 0004 CALL R2 1 - 0x8C0C0502, // 0005 GETMET R3 R2 K2 - 0x7C0C0200, // 0006 CALL R3 1 - 0x8C100503, // 0007 GETMET R4 R2 K3 - 0x7C100200, // 0008 CALL R4 1 - 0xA4120800, // 0009 IMPORT R4 K4 - 0x8C140905, // 000A GETMET R5 R4 K5 - 0x5C1C0600, // 000B MOVE R7 R3 - 0x7C140400, // 000C CALL R5 2 - 0x8C180B07, // 000D GETMET R6 R5 K7 - 0x58200008, // 000E LDCONST R8 K8 - 0x88240106, // 000F GETMBR R9 R0 K6 - 0x7C180600, // 0010 CALL R6 3 - 0x90020C06, // 0011 SETMBR R0 K6 R6 - 0x8C180B07, // 0012 GETMET R6 R5 K7 - 0x5820000A, // 0013 LDCONST R8 K10 - 0x88240109, // 0014 GETMBR R9 R0 K9 - 0x7C180600, // 0015 CALL R6 3 - 0x90021206, // 0016 SETMBR R0 K9 R6 - 0x60180017, // 0017 GETGBL R6 G23 - 0x8C1C0B07, // 0018 GETMET R7 R5 K7 - 0x5824000B, // 0019 LDCONST R9 K11 - 0x50280000, // 001A LDBOOL R10 0 0 - 0x7C1C0600, // 001B CALL R7 3 - 0x7C180200, // 001C CALL R6 1 - 0x90021606, // 001D SETMBR R0 K11 R6 - 0x60180017, // 001E GETGBL R6 G23 - 0x8C1C0B07, // 001F GETMET R7 R5 K7 - 0x5824000C, // 0020 LDCONST R9 K12 - 0x50280000, // 0021 LDBOOL R10 0 0 - 0x7C1C0600, // 0022 CALL R7 3 - 0x7C180200, // 0023 CALL R6 1 - 0x90021806, // 0024 SETMBR R0 K12 R6 - 0x8C180B07, // 0025 GETMET R6 R5 K7 - 0x5820000E, // 0026 LDCONST R8 K14 - 0x8824010D, // 0027 GETMBR R9 R0 K13 - 0x7C180600, // 0028 CALL R6 3 - 0x90021A06, // 0029 SETMBR R0 K13 R6 - 0x8C180B07, // 002A GETMET R6 R5 K7 - 0x58200010, // 002B LDCONST R8 K16 - 0x7C180400, // 002C CALL R6 2 - 0x90021E06, // 002D SETMBR R0 K15 R6 - 0x8818010F, // 002E GETMBR R6 R0 K15 - 0x4C1C0000, // 002F LDNIL R7 - 0x20180C07, // 0030 NE R6 R6 R7 - 0x781A000B, // 0031 JMPF R6 #003E - 0xB81A2200, // 0032 GETNGBL R6 K17 - 0x8C180D12, // 0033 GETMET R6 R6 K18 - 0x60200008, // 0034 GETGBL R8 G8 - 0x8824010F, // 0035 GETMBR R9 R0 K15 - 0x7C200200, // 0036 CALL R8 1 - 0x00222608, // 0037 ADD R8 K19 R8 - 0x58240014, // 0038 LDCONST R9 K20 - 0x7C180600, // 0039 CALL R6 3 - 0x8C180115, // 003A GETMET R6 R0 K21 - 0x7C180200, // 003B CALL R6 1 - 0x50180200, // 003C LDBOOL R6 1 0 - 0x90022C06, // 003D SETMBR R0 K22 R6 - 0x8C180B07, // 003E GETMET R6 R5 K7 - 0x58200018, // 003F LDCONST R8 K24 - 0x60240013, // 0040 GETGBL R9 G19 - 0x7C240000, // 0041 CALL R9 0 - 0x7C180600, // 0042 CALL R6 3 - 0x90022E06, // 0043 SETMBR R0 K23 R6 - 0x88180117, // 0044 GETMBR R6 R0 K23 - 0x781A0007, // 0045 JMPF R6 #004E - 0xB81A2200, // 0046 GETNGBL R6 K17 - 0x8C180D12, // 0047 GETMET R6 R6 K18 - 0x60200008, // 0048 GETGBL R8 G8 - 0x88240117, // 0049 GETMBR R9 R0 K23 - 0x7C200200, // 004A CALL R8 1 - 0x00223208, // 004B ADD R8 K25 R8 - 0x58240014, // 004C LDCONST R9 K20 - 0x7C180600, // 004D CALL R6 3 - 0xA8040001, // 004E EXBLK 1 1 - 0x70020012, // 004F JMP #0063 - 0xAC080002, // 0050 CATCH R2 0 2 - 0x7002000F, // 0051 JMP #0062 - 0x2010051A, // 0052 NE R4 R2 K26 - 0x7812000C, // 0053 JMPF R4 #0061 - 0xB8122200, // 0054 GETNGBL R4 K17 - 0x8C100912, // 0055 GETMET R4 R4 K18 - 0x60180008, // 0056 GETGBL R6 G8 - 0x5C1C0400, // 0057 MOVE R7 R2 - 0x7C180200, // 0058 CALL R6 1 - 0x001A3606, // 0059 ADD R6 K27 R6 - 0x00180D1C, // 005A ADD R6 R6 K28 - 0x601C0008, // 005B GETGBL R7 G8 - 0x5C200600, // 005C MOVE R8 R3 - 0x7C1C0200, // 005D CALL R7 1 - 0x00180C07, // 005E ADD R6 R6 R7 - 0x581C001D, // 005F LDCONST R7 K29 - 0x7C100600, // 0060 CALL R4 3 - 0x70020000, // 0061 JMP #0063 - 0xB0080000, // 0062 RAISE 2 R0 R0 - 0x50080000, // 0063 LDBOOL R2 0 0 - 0x880C0106, // 0064 GETMBR R3 R0 K6 - 0x4C100000, // 0065 LDNIL R4 - 0x1C0C0604, // 0066 EQ R3 R3 R4 - 0x780E000A, // 0067 JMPF R3 #0073 - 0x8C0C031E, // 0068 GETMET R3 R1 K30 - 0x5814001D, // 0069 LDCONST R5 K29 - 0x7C0C0400, // 006A CALL R3 2 - 0x8C0C071F, // 006B GETMET R3 R3 K31 - 0x58140020, // 006C LDCONST R5 K32 - 0x5818001D, // 006D LDCONST R6 K29 - 0x7C0C0600, // 006E CALL R3 3 - 0x54120FFE, // 006F LDINT R4 4095 - 0x2C0C0604, // 0070 AND R3 R3 R4 - 0x90020C03, // 0071 SETMBR R0 K6 R3 - 0x50080200, // 0072 LDBOOL R2 1 0 - 0x880C0109, // 0073 GETMBR R3 R0 K9 - 0x4C100000, // 0074 LDNIL R4 - 0x1C0C0604, // 0075 EQ R3 R3 R4 - 0x780E0003, // 0076 JMPF R3 #007B - 0x8C0C0121, // 0077 GETMET R3 R0 K33 - 0x7C0C0200, // 0078 CALL R3 1 - 0x90021203, // 0079 SETMBR R0 K9 R3 - 0x50080200, // 007A LDBOOL R2 1 0 - 0x780A0001, // 007B JMPF R2 #007E - 0x8C0C0122, // 007C GETMET R3 R0 K34 - 0x7C0C0200, // 007D CALL R3 1 - 0x80000000, // 007E RET 0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x780A004C, // 0002 JMPF R2 #0050 + 0x60080013, // 0003 GETGBL R2 G19 + 0x7C080000, // 0004 CALL R2 0 + 0x600C0010, // 0005 GETGBL R3 G16 + 0x88100101, // 0006 GETMBR R4 R0 K1 + 0x7C0C0200, // 0007 CALL R3 1 + 0xA8020003, // 0008 EXBLK 0 #000D + 0x5C100600, // 0009 MOVE R4 R3 + 0x7C100000, // 000A CALL R4 0 + 0x98080902, // 000B SETIDX R2 R4 K2 + 0x7001FFFB, // 000C JMP #0009 + 0x580C0003, // 000D LDCONST R3 K3 + 0xAC0C0200, // 000E CATCH R3 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100104, // 0011 GETMBR R4 R0 K4 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA802000F, // 0013 EXBLK 0 #0024 + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x8C140305, // 0016 GETMET R5 R1 K5 + 0x5C1C0800, // 0017 MOVE R7 R4 + 0x58200006, // 0018 LDCONST R8 K6 + 0x7C140600, // 0019 CALL R5 3 + 0x4C180000, // 001A LDNIL R6 + 0x20180A06, // 001B NE R6 R5 R6 + 0x781A0005, // 001C JMPF R6 #0023 + 0x8C180507, // 001D GETMET R6 R2 K7 + 0x5C200A00, // 001E MOVE R8 R5 + 0x58240002, // 001F LDCONST R9 K2 + 0x7C180600, // 0020 CALL R6 3 + 0x00180D08, // 0021 ADD R6 R6 K8 + 0x98080A06, // 0022 SETIDX R2 R5 R6 + 0x7001FFEF, // 0023 JMP #0014 + 0x580C0003, // 0024 LDCONST R3 K3 + 0xAC0C0200, // 0025 CATCH R3 1 0 + 0xB0080000, // 0026 RAISE 2 R0 R0 + 0x600C0012, // 0027 GETGBL R3 G18 + 0x7C0C0000, // 0028 CALL R3 0 + 0x60100010, // 0029 GETGBL R4 G16 + 0x8C140509, // 002A GETMET R5 R2 K9 + 0x7C140200, // 002B CALL R5 1 + 0x7C100200, // 002C CALL R4 1 + 0xA8020008, // 002D EXBLK 0 #0037 + 0x5C140800, // 002E MOVE R5 R4 + 0x7C140000, // 002F CALL R5 0 + 0x94180405, // 0030 GETIDX R6 R2 R5 + 0x1C180D02, // 0031 EQ R6 R6 K2 + 0x781A0002, // 0032 JMPF R6 #0036 + 0x8C18070A, // 0033 GETMET R6 R3 K10 + 0x5C200A00, // 0034 MOVE R8 R5 + 0x7C180400, // 0035 CALL R6 2 + 0x7001FFF6, // 0036 JMP #002E + 0x58100003, // 0037 LDCONST R4 K3 + 0xAC100200, // 0038 CATCH R4 1 0 + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x60100010, // 003A GETGBL R4 G16 + 0x5C140600, // 003B MOVE R5 R3 + 0x7C100200, // 003C CALL R4 1 + 0xA802000E, // 003D EXBLK 0 #004D + 0x5C140800, // 003E MOVE R5 R4 + 0x7C140000, // 003F CALL R5 0 + 0xB81A1600, // 0040 GETNGBL R6 K11 + 0x8C180D0C, // 0041 GETMET R6 R6 K12 + 0x88200B0E, // 0042 GETMBR R8 R5 K14 + 0x00221A08, // 0043 ADD R8 K13 R8 + 0x5824000F, // 0044 LDCONST R9 K15 + 0x7C180600, // 0045 CALL R6 3 + 0x8C180B10, // 0046 GETMET R6 R5 K16 + 0x7C180200, // 0047 CALL R6 1 + 0x88180101, // 0048 GETMBR R6 R0 K1 + 0x8C180D11, // 0049 GETMET R6 R6 K17 + 0x88200B0E, // 004A GETMBR R8 R5 K14 + 0x7C180400, // 004B CALL R6 2 + 0x7001FFF0, // 004C JMP #003E + 0x58100003, // 004D LDCONST R4 K3 + 0xAC100200, // 004E CATCH R4 1 0 + 0xB0080000, // 004F RAISE 2 R0 R0 + 0x80000000, // 0050 RET 0 }) ) ); @@ -544,9 +161,9 @@ be_local_closure(Matter_Device_save_before_restart, /* name */ /******************************************************************** -** Solidified function: every_second +** Solidified function: stop ********************************************************************/ -be_local_closure(Matter_Device_every_second, /* name */ +be_local_closure(Matter_Device_stop, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -556,35 +173,25 @@ be_local_closure(Matter_Device_every_second, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(every_second), - /* K2 */ be_nested_str_weak(message_handler), - /* K3 */ be_nested_str_weak(commissioning_open), - /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(time_reached), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(remove_driver), + /* K2 */ be_nested_str_weak(udp_server), + /* K3 */ be_nested_str_weak(stop), }), - be_str_weak(every_second), + be_str_weak(stop), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 + ( &(const binstruction[10]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x88040102, // 0003 GETMBR R1 R0 K2 - 0x8C040301, // 0004 GETMET R1 R1 K1 - 0x7C040200, // 0005 CALL R1 1 - 0x88040103, // 0006 GETMBR R1 R0 K3 - 0x4C080000, // 0007 LDNIL R2 - 0x20040202, // 0008 NE R1 R1 R2 - 0x78060006, // 0009 JMPF R1 #0011 - 0xB8060800, // 000A GETNGBL R1 K4 - 0x8C040305, // 000B GETMET R1 R1 K5 - 0x880C0103, // 000C GETMBR R3 R0 K3 - 0x7C040400, // 000D CALL R1 2 - 0x78060001, // 000E JMPF R1 #0011 - 0x4C040000, // 000F LDNIL R1 - 0x90020601, // 0010 SETMBR R0 K3 R1 - 0x80000000, // 0011 RET 0 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x88040102, // 0004 GETMBR R1 R0 K2 + 0x78060002, // 0005 JMPF R1 #0009 + 0x88040102, // 0006 GETMBR R1 R0 K2 + 0x8C040303, // 0007 GETMET R1 R1 K3 + 0x7C040200, // 0008 CALL R1 1 + 0x80000000, // 0009 RET 0 }) ) ); @@ -592,11 +199,11 @@ be_local_closure(Matter_Device_every_second, /* name */ /******************************************************************** -** Solidified function: received_ack +** Solidified function: process_attribute_read_solo ********************************************************************/ -be_local_closure(Matter_Device_received_ack, /* name */ +be_local_closure(Matter_Device_process_attribute_read_solo, /* name */ be_nested_proto( - 5, /* nstack */ + 10, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -604,98 +211,67 @@ be_local_closure(Matter_Device_received_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(received_ack), + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(cluster), + /* K2 */ be_nested_str_weak(attribute), + /* K3 */ be_nested_str_weak(find_plugin_by_endpoint), + /* K4 */ be_nested_str_weak(status), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K7 */ be_nested_str_weak(contains_cluster), + /* K8 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K9 */ be_nested_str_weak(contains_attribute), + /* K10 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), }), - be_str_weak(received_ack), + be_str_weak(process_attribute_read_solo), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l -********************************************************************/ -be_local_closure(Matter_Device_k2l, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l), - &be_const_str_solidified, - ( &(const binstruction[50]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020005, // 000B EXBLK 0 #0012 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x5C1C0800, // 000F MOVE R7 R4 + ( &(const binstruction[45]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0x880C0301, // 0001 GETMBR R3 R1 K1 + 0x88100302, // 0002 GETMBR R4 R1 K2 + 0x4C140000, // 0003 LDNIL R5 + 0x1C140405, // 0004 EQ R5 R2 R5 + 0x74160005, // 0005 JMPT R5 #000C + 0x4C140000, // 0006 LDNIL R5 + 0x1C140605, // 0007 EQ R5 R3 R5 + 0x74160002, // 0008 JMPT R5 #000C + 0x4C140000, // 0009 LDNIL R5 + 0x1C140805, // 000A EQ R5 R4 R5 + 0x78160001, // 000B JMPF R5 #000E + 0x4C140000, // 000C LDNIL R5 + 0x80040A00, // 000D RET 1 R5 + 0x8C140103, // 000E GETMET R5 R0 K3 + 0x5C1C0400, // 000F MOVE R7 R2 0x7C140400, // 0010 CALL R5 2 - 0x7001FFF9, // 0011 JMP #000C - 0x580C0003, // 0012 LDCONST R3 K3 - 0xAC0C0200, // 0013 CATCH R3 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x600C0010, // 0015 GETGBL R3 G16 - 0x6010000C, // 0016 GETGBL R4 G12 - 0x5C140400, // 0017 MOVE R5 R2 - 0x7C100200, // 0018 CALL R4 1 - 0x04100904, // 0019 SUB R4 R4 K4 - 0x40120804, // 001A CONNECT R4 K4 R4 - 0x7C0C0200, // 001B CALL R3 1 - 0xA8020010, // 001C EXBLK 0 #002E - 0x5C100600, // 001D MOVE R4 R3 - 0x7C100000, // 001E CALL R4 0 - 0x94140404, // 001F GETIDX R5 R2 R4 - 0x5C180800, // 0020 MOVE R6 R4 - 0x241C0D05, // 0021 GT R7 R6 K5 - 0x781E0008, // 0022 JMPF R7 #002C - 0x041C0D04, // 0023 SUB R7 R6 K4 - 0x941C0407, // 0024 GETIDX R7 R2 R7 - 0x241C0E05, // 0025 GT R7 R7 R5 - 0x781E0004, // 0026 JMPF R7 #002C - 0x041C0D04, // 0027 SUB R7 R6 K4 - 0x941C0407, // 0028 GETIDX R7 R2 R7 - 0x98080C07, // 0029 SETIDX R2 R6 R7 - 0x04180D04, // 002A SUB R6 R6 K4 - 0x7001FFF4, // 002B JMP #0021 - 0x98080C05, // 002C SETIDX R2 R6 R5 - 0x7001FFEE, // 002D JMP #001D - 0x580C0003, // 002E LDCONST R3 K3 - 0xAC0C0200, // 002F CATCH R3 1 0 - 0xB0080000, // 0030 RAISE 2 R0 R0 - 0x80040400, // 0031 RET 1 R2 + 0x4C180000, // 0011 LDNIL R6 + 0x1C180A06, // 0012 EQ R6 R5 R6 + 0x781A0004, // 0013 JMPF R6 #0019 + 0xB81A0A00, // 0014 GETNGBL R6 K5 + 0x88180D06, // 0015 GETMBR R6 R6 K6 + 0x90060806, // 0016 SETMBR R1 K4 R6 + 0x4C180000, // 0017 LDNIL R6 + 0x80040C00, // 0018 RET 1 R6 + 0x8C180B07, // 0019 GETMET R6 R5 K7 + 0x5C200600, // 001A MOVE R8 R3 + 0x7C180400, // 001B CALL R6 2 + 0x741A0004, // 001C JMPT R6 #0022 + 0xB81A0A00, // 001D GETNGBL R6 K5 + 0x88180D08, // 001E GETMBR R6 R6 K8 + 0x90060806, // 001F SETMBR R1 K4 R6 + 0x4C180000, // 0020 LDNIL R6 + 0x80040C00, // 0021 RET 1 R6 + 0x8C180B09, // 0022 GETMET R6 R5 K9 + 0x5C200600, // 0023 MOVE R8 R3 + 0x5C240800, // 0024 MOVE R9 R4 + 0x7C180600, // 0025 CALL R6 3 + 0x741A0004, // 0026 JMPT R6 #002C + 0xB81A0A00, // 0027 GETNGBL R6 K5 + 0x88180D0A, // 0028 GETMBR R6 R6 K10 + 0x90060806, // 0029 SETMBR R1 K4 R6 + 0x4C180000, // 002A LDNIL R6 + 0x80040C00, // 002B RET 1 R6 + 0x80040A00, // 002C RET 1 R5 }) ) ); @@ -703,376 +279,12 @@ be_local_closure(Matter_Device_k2l, /* name */ /******************************************************************** -** Solidified function: signal_endpoints_changed +** Solidified function: mdns_announce_op_discovery_all_fabrics ********************************************************************/ -be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(attribute_updated), - /* K1 */ be_const_int(0), - /* K2 */ be_const_int(3), - }), - be_str_weak(signal_endpoints_changed), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x580C0001, // 0001 LDCONST R3 K1 - 0x5412001C, // 0002 LDINT R4 29 - 0x58140002, // 0003 LDCONST R5 K2 - 0x50180000, // 0004 LDBOOL R6 0 0 - 0x7C040A00, // 0005 CALL R1 5 - 0x8C040100, // 0006 GETMET R1 R0 K0 - 0x540EFEFF, // 0007 LDINT R3 65280 - 0x5412001C, // 0008 LDINT R4 29 - 0x58140002, // 0009 LDCONST R5 K2 - 0x50180000, // 000A LDBOOL R6 0 0 - 0x7C040A00, // 000B CALL R1 5 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _mdns_announce_hostname -********************************************************************/ -be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ - be_nested_proto( - 14, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(start), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(eth), - /* K5 */ be_nested_str_weak(hostname_eth), - /* K6 */ be_nested_str_weak(replace), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_nested_str_weak(mac), - /* K9 */ be_nested_str_weak(_X3A), - /* K10 */ be_nested_str_weak(), - /* K11 */ be_nested_str_weak(ipv4only), - /* K12 */ be_nested_str_weak(add_hostname), - /* K13 */ be_nested_str_weak(ip6local), - /* K14 */ be_nested_str_weak(ip), - /* K15 */ be_nested_str_weak(ip6), - /* K16 */ be_nested_str_weak(log), - /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), - /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(wifi), - /* K20 */ be_nested_str_weak(hostname_wifi), - /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), - /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K23 */ be_nested_str_weak(_X7C), - /* K24 */ be_const_int(2), - /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), - }), - be_str_weak(_mdns_announce_hostname), - &be_const_str_solidified, - ( &(const binstruction[140]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0xA40E0200, // 0001 IMPORT R3 K1 - 0x8C100502, // 0002 GETMET R4 R2 K2 - 0x7C100200, // 0003 CALL R4 1 - 0xA8020072, // 0004 EXBLK 0 #0078 - 0x78060030, // 0005 JMPF R1 #0037 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x7C100200, // 0008 CALL R4 1 - 0x8C140706, // 0009 GETMET R5 R3 K6 - 0x8C1C0907, // 000A GETMET R7 R4 K7 - 0x58240008, // 000B LDCONST R9 K8 - 0x7C1C0400, // 000C CALL R7 2 - 0x58200009, // 000D LDCONST R8 K9 - 0x5824000A, // 000E LDCONST R9 K10 - 0x7C140800, // 000F CALL R5 4 - 0x90020A05, // 0010 SETMBR R0 K5 R5 - 0x8814010B, // 0011 GETMBR R5 R0 K11 - 0x7416000F, // 0012 JMPT R5 #0023 - 0x8C14050C, // 0013 GETMET R5 R2 K12 - 0x881C0105, // 0014 GETMBR R7 R0 K5 - 0x8C200907, // 0015 GETMET R8 R4 K7 - 0x5828000D, // 0016 LDCONST R10 K13 - 0x582C000A, // 0017 LDCONST R11 K10 - 0x7C200600, // 0018 CALL R8 3 - 0x8C240907, // 0019 GETMET R9 R4 K7 - 0x582C000E, // 001A LDCONST R11 K14 - 0x5830000A, // 001B LDCONST R12 K10 - 0x7C240600, // 001C CALL R9 3 - 0x8C280907, // 001D GETMET R10 R4 K7 - 0x5830000F, // 001E LDCONST R12 K15 - 0x5834000A, // 001F LDCONST R13 K10 - 0x7C280600, // 0020 CALL R10 3 - 0x7C140A00, // 0021 CALL R5 5 - 0x70020012, // 0022 JMP #0036 - 0xB8160600, // 0023 GETNGBL R5 K3 - 0x8C140B10, // 0024 GETMET R5 R5 K16 - 0x601C0018, // 0025 GETGBL R7 G24 - 0x58200011, // 0026 LDCONST R8 K17 - 0x88240105, // 0027 GETMBR R9 R0 K5 - 0x8C280907, // 0028 GETMET R10 R4 K7 - 0x5830000E, // 0029 LDCONST R12 K14 - 0x5834000A, // 002A LDCONST R13 K10 - 0x7C280600, // 002B CALL R10 3 - 0x7C1C0600, // 002C CALL R7 3 - 0x58200012, // 002D LDCONST R8 K18 - 0x7C140600, // 002E CALL R5 3 - 0x8C14050C, // 002F GETMET R5 R2 K12 - 0x881C0105, // 0030 GETMBR R7 R0 K5 - 0x8C200907, // 0031 GETMET R8 R4 K7 - 0x5828000E, // 0032 LDCONST R10 K14 - 0x582C000A, // 0033 LDCONST R11 K10 - 0x7C200600, // 0034 CALL R8 3 - 0x7C140600, // 0035 CALL R5 3 - 0x7002002F, // 0036 JMP #0067 - 0xB8120600, // 0037 GETNGBL R4 K3 - 0x8C100913, // 0038 GETMET R4 R4 K19 - 0x7C100200, // 0039 CALL R4 1 - 0x8C140706, // 003A GETMET R5 R3 K6 - 0x8C1C0907, // 003B GETMET R7 R4 K7 - 0x58240008, // 003C LDCONST R9 K8 - 0x7C1C0400, // 003D CALL R7 2 - 0x58200009, // 003E LDCONST R8 K9 - 0x5824000A, // 003F LDCONST R9 K10 - 0x7C140800, // 0040 CALL R5 4 - 0x90022805, // 0041 SETMBR R0 K20 R5 - 0x8814010B, // 0042 GETMBR R5 R0 K11 - 0x7416000F, // 0043 JMPT R5 #0054 - 0x8C14050C, // 0044 GETMET R5 R2 K12 - 0x881C0114, // 0045 GETMBR R7 R0 K20 - 0x8C200907, // 0046 GETMET R8 R4 K7 - 0x5828000D, // 0047 LDCONST R10 K13 - 0x582C000A, // 0048 LDCONST R11 K10 - 0x7C200600, // 0049 CALL R8 3 - 0x8C240907, // 004A GETMET R9 R4 K7 - 0x582C000E, // 004B LDCONST R11 K14 - 0x5830000A, // 004C LDCONST R12 K10 - 0x7C240600, // 004D CALL R9 3 - 0x8C280907, // 004E GETMET R10 R4 K7 - 0x5830000F, // 004F LDCONST R12 K15 - 0x5834000A, // 0050 LDCONST R13 K10 - 0x7C280600, // 0051 CALL R10 3 - 0x7C140A00, // 0052 CALL R5 5 - 0x70020012, // 0053 JMP #0067 - 0xB8160600, // 0054 GETNGBL R5 K3 - 0x8C140B10, // 0055 GETMET R5 R5 K16 - 0x601C0018, // 0056 GETGBL R7 G24 - 0x58200011, // 0057 LDCONST R8 K17 - 0x88240105, // 0058 GETMBR R9 R0 K5 - 0x8C280907, // 0059 GETMET R10 R4 K7 - 0x5830000E, // 005A LDCONST R12 K14 - 0x5834000A, // 005B LDCONST R13 K10 - 0x7C280600, // 005C CALL R10 3 - 0x7C1C0600, // 005D CALL R7 3 - 0x58200012, // 005E LDCONST R8 K18 - 0x7C140600, // 005F CALL R5 3 - 0x8C14050C, // 0060 GETMET R5 R2 K12 - 0x881C0114, // 0061 GETMBR R7 R0 K20 - 0x8C200907, // 0062 GETMET R8 R4 K7 - 0x5828000E, // 0063 LDCONST R10 K14 - 0x582C000A, // 0064 LDCONST R11 K10 - 0x7C200600, // 0065 CALL R8 3 - 0x7C140600, // 0066 CALL R5 3 - 0xB8120600, // 0067 GETNGBL R4 K3 - 0x8C100910, // 0068 GETMET R4 R4 K16 - 0x60180018, // 0069 GETGBL R6 G24 - 0x581C0015, // 006A LDCONST R7 K21 - 0x78060001, // 006B JMPF R1 #006E - 0x58200004, // 006C LDCONST R8 K4 - 0x70020000, // 006D JMP #006F - 0x58200013, // 006E LDCONST R8 K19 - 0x78060001, // 006F JMPF R1 #0072 - 0x88240105, // 0070 GETMBR R9 R0 K5 - 0x70020000, // 0071 JMP #0073 - 0x88240114, // 0072 GETMBR R9 R0 K20 - 0x7C180600, // 0073 CALL R6 3 - 0x581C0012, // 0074 LDCONST R7 K18 - 0x7C100600, // 0075 CALL R4 3 - 0xA8040001, // 0076 EXBLK 1 1 - 0x70020010, // 0077 JMP #0089 - 0xAC100002, // 0078 CATCH R4 0 2 - 0x7002000D, // 0079 JMP #0088 - 0xB81A0600, // 007A GETNGBL R6 K3 - 0x8C180D10, // 007B GETMET R6 R6 K16 - 0x60200008, // 007C GETGBL R8 G8 - 0x5C240800, // 007D MOVE R9 R4 - 0x7C200200, // 007E CALL R8 1 - 0x00222C08, // 007F ADD R8 K22 R8 - 0x00201117, // 0080 ADD R8 R8 K23 - 0x60240008, // 0081 GETGBL R9 G8 - 0x5C280A00, // 0082 MOVE R10 R5 - 0x7C240200, // 0083 CALL R9 1 - 0x00201009, // 0084 ADD R8 R8 R9 - 0x58240018, // 0085 LDCONST R9 K24 - 0x7C180600, // 0086 CALL R6 3 - 0x70020000, // 0087 JMP #0089 - 0xB0080000, // 0088 RAISE 2 R0 R0 - 0x8C100119, // 0089 GETMET R4 R0 K25 - 0x7C100200, // 008A CALL R4 1 - 0x80000000, // 008B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_http_remote -********************************************************************/ -be_local_closure(Matter_Device_register_http_remote, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(get_timeout), - /* K3 */ be_nested_str_weak(set_timeout), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(HTTP_remote), - /* K6 */ be_nested_str_weak(plugins_config_remotes), - /* K7 */ be_nested_str_weak(set_info), - }), - be_str_weak(register_http_remote), - &be_const_str_solidified, - ( &(const binstruction[42]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x4C100000, // 0001 LDNIL R4 - 0x1C0C0604, // 0002 EQ R3 R3 R4 - 0x780E0002, // 0003 JMPF R3 #0007 - 0x600C0013, // 0004 GETGBL R3 G19 - 0x7C0C0000, // 0005 CALL R3 0 - 0x90020003, // 0006 SETMBR R0 K0 R3 - 0x4C0C0000, // 0007 LDNIL R3 - 0x88100100, // 0008 GETMBR R4 R0 K0 - 0x8C100901, // 0009 GETMET R4 R4 K1 - 0x5C180200, // 000A MOVE R6 R1 - 0x7C100400, // 000B CALL R4 2 - 0x78120009, // 000C JMPF R4 #0017 - 0x88100100, // 000D GETMBR R4 R0 K0 - 0x940C0801, // 000E GETIDX R3 R4 R1 - 0x8C140702, // 000F GETMET R5 R3 K2 - 0x7C140200, // 0010 CALL R5 1 - 0x14140405, // 0011 LT R5 R2 R5 - 0x78160002, // 0012 JMPF R5 #0016 - 0x8C140703, // 0013 GETMET R5 R3 K3 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x7C140400, // 0015 CALL R5 2 - 0x70020011, // 0016 JMP #0029 - 0xB8120800, // 0017 GETNGBL R4 K4 - 0x8C100905, // 0018 GETMET R4 R4 K5 - 0x5C180000, // 0019 MOVE R6 R0 - 0x5C1C0200, // 001A MOVE R7 R1 - 0x5C200400, // 001B MOVE R8 R2 - 0x7C100800, // 001C CALL R4 4 - 0x5C0C0800, // 001D MOVE R3 R4 - 0x88100106, // 001E GETMBR R4 R0 K6 - 0x8C100901, // 001F GETMET R4 R4 K1 - 0x5C180200, // 0020 MOVE R6 R1 - 0x7C100400, // 0021 CALL R4 2 - 0x78120003, // 0022 JMPF R4 #0027 - 0x8C100707, // 0023 GETMET R4 R3 K7 - 0x88180106, // 0024 GETMBR R6 R0 K6 - 0x94180C01, // 0025 GETIDX R6 R6 R1 - 0x7C100400, // 0026 CALL R4 2 - 0x88100100, // 0027 GETMBR R4 R0 K0 - 0x98100203, // 0028 SETIDX R4 R1 R3 - 0x80040600, // 0029 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_operational_discovery_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ +be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ be_nested_proto( 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_operational_discovery), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_operational_discovery_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_active_endpoints -********************************************************************/ -be_local_closure(Matter_Device_get_active_endpoints, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1080,44 +292,164 @@ be_local_closure(Matter_Device_get_active_endpoints, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins), - /* K1 */ be_nested_str_weak(get_endpoint), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(find), - /* K4 */ be_nested_str_weak(push), + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), /* K5 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(get_active_endpoints), + be_str_weak(mdns_announce_op_discovery_all_fabrics), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0xA8020011, // 0005 EXBLK 0 #0018 - 0x5C100600, // 0006 MOVE R4 R3 - 0x7C100000, // 0007 CALL R4 0 - 0x8C140901, // 0008 GETMET R5 R4 K1 - 0x7C140200, // 0009 CALL R5 1 - 0x78060002, // 000A JMPF R1 #000E - 0x1C180B02, // 000B EQ R6 R5 K2 - 0x781A0000, // 000C JMPF R6 #000E - 0x7001FFF7, // 000D JMP #0006 - 0x8C180503, // 000E GETMET R6 R2 K3 - 0x5C200A00, // 000F MOVE R8 R5 - 0x7C180400, // 0010 CALL R6 2 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x781A0002, // 0013 JMPF R6 #0017 - 0x8C180504, // 0014 GETMET R6 R2 K4 - 0x5C200A00, // 0015 MOVE R8 R5 - 0x7C180400, // 0016 CALL R6 2 - 0x7001FFED, // 0017 JMP #0006 - 0x580C0005, // 0018 LDCONST R3 K5 - 0xAC0C0200, // 0019 CATCH R3 1 0 - 0xB0080000, // 001A RAISE 2 R0 R0 - 0x80040400, // 001B RET 1 R2 + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_PASE +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ + be_nested_proto( + 10, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(mdns_pase_eth), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), + /* K5 */ be_nested_str_weak(_matterc), + /* K6 */ be_nested_str_weak(_udp), + /* K7 */ be_nested_str_weak(commissioning_instance_eth), + /* K8 */ be_nested_str_weak(hostname_eth), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(remove_service), + /* K13 */ be_nested_str_weak(mdns_pase_wifi), + /* K14 */ be_nested_str_weak(commissioning_instance_wifi), + /* K15 */ be_nested_str_weak(hostname_wifi), + /* K16 */ be_nested_str_weak(wifi), + /* K17 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K18 */ be_nested_str_weak(_X7C), + /* K19 */ be_const_int(2), + }), + be_str_weak(mdns_remove_PASE), + &be_const_str_solidified, + ( &(const binstruction[82]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA802003D, // 0001 EXBLK 0 #0040 + 0x88080101, // 0002 GETMBR R2 R0 K1 + 0x780A001B, // 0003 JMPF R2 #0020 + 0xB80A0400, // 0004 GETNGBL R2 K2 + 0x8C080503, // 0005 GETMET R2 R2 K3 + 0x60100018, // 0006 GETGBL R4 G24 + 0x58140004, // 0007 LDCONST R5 K4 + 0x58180005, // 0008 LDCONST R6 K5 + 0x581C0006, // 0009 LDCONST R7 K6 + 0x88200107, // 000A GETMBR R8 R0 K7 + 0x88240108, // 000B GETMBR R9 R0 K8 + 0x7C100A00, // 000C CALL R4 5 + 0x58140009, // 000D LDCONST R5 K9 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0400, // 000F GETNGBL R2 K2 + 0x8C080503, // 0010 GETMET R2 R2 K3 + 0x60100018, // 0011 GETGBL R4 G24 + 0x5814000A, // 0012 LDCONST R5 K10 + 0x5818000B, // 0013 LDCONST R6 K11 + 0x881C0107, // 0014 GETMBR R7 R0 K7 + 0x7C100600, // 0015 CALL R4 3 + 0x58140009, // 0016 LDCONST R5 K9 + 0x7C080600, // 0017 CALL R2 3 + 0x50080000, // 0018 LDBOOL R2 0 0 + 0x90020202, // 0019 SETMBR R0 K1 R2 + 0x8C08030C, // 001A GETMET R2 R1 K12 + 0x58100005, // 001B LDCONST R4 K5 + 0x58140006, // 001C LDCONST R5 K6 + 0x88180107, // 001D GETMBR R6 R0 K7 + 0x881C0108, // 001E GETMBR R7 R0 K8 + 0x7C080A00, // 001F CALL R2 5 + 0x8808010D, // 0020 GETMBR R2 R0 K13 + 0x780A001B, // 0021 JMPF R2 #003E + 0xB80A0400, // 0022 GETNGBL R2 K2 + 0x8C080503, // 0023 GETMET R2 R2 K3 + 0x60100018, // 0024 GETGBL R4 G24 + 0x58140004, // 0025 LDCONST R5 K4 + 0x58180005, // 0026 LDCONST R6 K5 + 0x581C0006, // 0027 LDCONST R7 K6 + 0x8820010E, // 0028 GETMBR R8 R0 K14 + 0x8824010F, // 0029 GETMBR R9 R0 K15 + 0x7C100A00, // 002A CALL R4 5 + 0x58140009, // 002B LDCONST R5 K9 + 0x7C080600, // 002C CALL R2 3 + 0xB80A0400, // 002D GETNGBL R2 K2 + 0x8C080503, // 002E GETMET R2 R2 K3 + 0x60100018, // 002F GETGBL R4 G24 + 0x5814000A, // 0030 LDCONST R5 K10 + 0x58180010, // 0031 LDCONST R6 K16 + 0x881C010E, // 0032 GETMBR R7 R0 K14 + 0x7C100600, // 0033 CALL R4 3 + 0x58140009, // 0034 LDCONST R5 K9 + 0x7C080600, // 0035 CALL R2 3 + 0x50080000, // 0036 LDBOOL R2 0 0 + 0x90021A02, // 0037 SETMBR R0 K13 R2 + 0x8C08030C, // 0038 GETMET R2 R1 K12 + 0x58100005, // 0039 LDCONST R4 K5 + 0x58140006, // 003A LDCONST R5 K6 + 0x8818010E, // 003B GETMBR R6 R0 K14 + 0x881C010F, // 003C GETMBR R7 R0 K15 + 0x7C080A00, // 003D CALL R2 5 + 0xA8040001, // 003E EXBLK 1 1 + 0x70020010, // 003F JMP #0051 + 0xAC080002, // 0040 CATCH R2 0 2 + 0x7002000D, // 0041 JMP #0050 + 0xB8120400, // 0042 GETNGBL R4 K2 + 0x8C100903, // 0043 GETMET R4 R4 K3 + 0x60180008, // 0044 GETGBL R6 G8 + 0x5C1C0400, // 0045 MOVE R7 R2 + 0x7C180200, // 0046 CALL R6 1 + 0x001A2206, // 0047 ADD R6 K17 R6 + 0x00180D12, // 0048 ADD R6 R6 K18 + 0x601C0008, // 0049 GETGBL R7 G8 + 0x5C200600, // 004A MOVE R8 R3 + 0x7C1C0200, // 004B CALL R7 1 + 0x00180C07, // 004C ADD R6 R6 R7 + 0x581C0013, // 004D LDCONST R7 K19 + 0x7C100600, // 004E CALL R4 3 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 }) ) ); @@ -1169,6 +501,160 @@ be_local_closure(Matter_Device_every_250ms, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: stop_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(is_root_commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(publish_result), + /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), + /* K4 */ be_nested_str_weak(Matter), + /* K5 */ be_nested_str_weak(commissioning_open), + /* K6 */ be_nested_str_weak(mdns_remove_PASE), + /* K7 */ be_nested_str_weak(commissioning_iterations), + /* K8 */ be_nested_str_weak(commissioning_discriminator), + /* K9 */ be_nested_str_weak(commissioning_salt), + /* K10 */ be_nested_str_weak(commissioning_w0), + /* K11 */ be_nested_str_weak(commissioning_L), + /* K12 */ be_nested_str_weak(commissioning_admin_fabric), + }), + be_str_weak(stop_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[25]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x78060004, // 0002 JMPF R1 #0008 + 0xB8060200, // 0003 GETNGBL R1 K1 + 0x8C040302, // 0004 GETMET R1 R1 K2 + 0x580C0003, // 0005 LDCONST R3 K3 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x4C040000, // 0008 LDNIL R1 + 0x90020A01, // 0009 SETMBR R0 K5 R1 + 0x8C040106, // 000A GETMET R1 R0 K6 + 0x7C040200, // 000B CALL R1 1 + 0x4C040000, // 000C LDNIL R1 + 0x90020E01, // 000D SETMBR R0 K7 R1 + 0x4C040000, // 000E LDNIL R1 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0x4C040000, // 0010 LDNIL R1 + 0x90021201, // 0011 SETMBR R0 K9 R1 + 0x4C040000, // 0012 LDNIL R1 + 0x90021401, // 0013 SETMBR R0 K10 R1 + 0x4C040000, // 0014 LDNIL R1 + 0x90021601, // 0015 SETMBR R0 K11 R1 + 0x4C040000, // 0016 LDNIL R1 + 0x90021801, // 0017 SETMBR R0 K12 R1 + 0x80000000, // 0018 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(get_fabric), + /* K1 */ be_nested_str_weak(get_fabric_id), + /* K2 */ be_nested_str_weak(copy), + /* K3 */ be_nested_str_weak(reverse), + /* K4 */ be_nested_str_weak(tohex), + /* K5 */ be_nested_str_weak(get_admin_vendor_name), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(log), + /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), + /* K9 */ be_const_int(2), + /* K10 */ be_nested_str_weak(stop_basic_commissioning), + }), + be_str_weak(start_commissioning_complete), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x8C080300, // 0000 GETMET R2 R1 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x8C0C0501, // 0002 GETMET R3 R2 K1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x8C0C0702, // 0004 GETMET R3 R3 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C0C0704, // 0008 GETMET R3 R3 K4 + 0x7C0C0200, // 0009 CALL R3 1 + 0x8C100505, // 000A GETMET R4 R2 K5 + 0x7C100200, // 000B CALL R4 1 + 0xB8160C00, // 000C GETNGBL R5 K6 + 0x8C140B07, // 000D GETMET R5 R5 K7 + 0x601C0018, // 000E GETGBL R7 G24 + 0x58200008, // 000F LDCONST R8 K8 + 0x5C240600, // 0010 MOVE R9 R3 + 0x5C280800, // 0011 MOVE R10 R4 + 0x7C1C0600, // 0012 CALL R7 3 + 0x58200009, // 0013 LDCONST R8 K9 + 0x7C140600, // 0014 CALL R5 3 + 0x8C14010A, // 0015 GETMET R5 R0 K10 + 0x7C140200, // 0016 CALL R5 1 + 0x80000000, // 0017 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_remote_info +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config_remotes), + /* K1 */ be_nested_str_weak(find), + }), + be_str_weak(get_plugin_remote_info), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x60140013, // 0003 GETGBL R5 G19 + 0x7C140000, // 0004 CALL R5 0 + 0x7C080600, // 0005 CALL R2 3 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: invoke_request ********************************************************************/ @@ -1226,58 +712,309 @@ be_local_closure(Matter_Device_invoke_request, /* name */ /******************************************************************** -** Solidified function: start_commissioning_complete +** Solidified function: process_attribute_expansion ********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete, /* name */ +be_local_closure(Matter_Device_process_attribute_expansion, /* name */ be_nested_proto( - 11, /* nstack */ - 2, /* argc */ + 24, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(get_fabric), - /* K1 */ be_nested_str_weak(get_fabric_id), - /* K2 */ be_nested_str_weak(copy), - /* K3 */ be_nested_str_weak(reverse), - /* K4 */ be_nested_str_weak(tohex), - /* K5 */ be_nested_str_weak(get_admin_vendor_name), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2D_X2D_X2D_X20Commissioning_X20complete_X20for_X20Fabric_X20_X27_X25s_X27_X20_X28Vendor_X20_X25s_X29_X20_X2D_X2D_X2D), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(stop_basic_commissioning), + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(keys), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(stop_iteration), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(0), + }), + be_str_weak(keys_sorted), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x8C0C0100, // 0003 GETMET R3 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x7C080200, // 0005 CALL R2 1 + 0xA8020005, // 0006 EXBLK 0 #000D + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x8C100301, // 0009 GETMET R4 R1 K1 + 0x5C180600, // 000A MOVE R6 R3 + 0x7C100400, // 000B CALL R4 2 + 0x7001FFF9, // 000C JMP #0007 + 0x58080002, // 000D LDCONST R2 K2 + 0xAC080200, // 000E CATCH R2 1 0 + 0xB0080000, // 000F RAISE 2 R0 R0 + 0x60080010, // 0010 GETGBL R2 G16 + 0x600C000C, // 0011 GETGBL R3 G12 + 0x5C100200, // 0012 MOVE R4 R1 + 0x7C0C0200, // 0013 CALL R3 1 + 0x040C0703, // 0014 SUB R3 R3 K3 + 0x400E0603, // 0015 CONNECT R3 K3 R3 + 0x7C080200, // 0016 CALL R2 1 + 0xA8020010, // 0017 EXBLK 0 #0029 + 0x5C0C0400, // 0018 MOVE R3 R2 + 0x7C0C0000, // 0019 CALL R3 0 + 0x94100203, // 001A GETIDX R4 R1 R3 + 0x5C140600, // 001B MOVE R5 R3 + 0x24180B04, // 001C GT R6 R5 K4 + 0x781A0008, // 001D JMPF R6 #0027 + 0x04180B03, // 001E SUB R6 R5 K3 + 0x94180206, // 001F GETIDX R6 R1 R6 + 0x24180C04, // 0020 GT R6 R6 R4 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x04180B03, // 0022 SUB R6 R5 K3 + 0x94180206, // 0023 GETIDX R6 R1 R6 + 0x98040A06, // 0024 SETIDX R1 R5 R6 + 0x04140B03, // 0025 SUB R5 R5 K3 + 0x7001FFF4, // 0026 JMP #001C + 0x98040A04, // 0027 SETIDX R1 R5 R4 + 0x7001FFEE, // 0028 JMP #0018 + 0x58080002, // 0029 LDCONST R2 K2 + 0xAC080200, // 002A CATCH R2 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0x80040200, // 002C RET 1 R1 + }) + ), }), - be_str_weak(start_commissioning_complete), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(cluster), + /* K2 */ be_nested_str_weak(attribute), + /* K3 */ be_nested_str_weak(plugins), + /* K4 */ be_nested_str_weak(get_endpoint), + /* K5 */ be_nested_str_weak(contains), + /* K6 */ be_nested_str_weak(get_cluster_list), + /* K7 */ be_nested_str_weak(get_attribute_list), + /* K8 */ be_nested_str_weak(push), + /* K9 */ be_nested_str_weak(stop_iteration), + /* K10 */ be_nested_str_weak(status), + /* K11 */ be_nested_str_weak(matter), + /* K12 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), + /* K13 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), + /* K14 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K15 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), + }), + be_str_weak(process_attribute_expansion), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x8C080300, // 0000 GETMET R2 R1 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x8C0C0501, // 0002 GETMET R3 R2 K1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x8C0C0702, // 0004 GETMET R3 R3 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C0C0704, // 0008 GETMET R3 R3 K4 - 0x7C0C0200, // 0009 CALL R3 1 - 0x8C100505, // 000A GETMET R4 R2 K5 - 0x7C100200, // 000B CALL R4 1 - 0xB8160C00, // 000C GETNGBL R5 K6 - 0x8C140B07, // 000D GETMET R5 R5 K7 - 0x601C0018, // 000E GETGBL R7 G24 - 0x58200008, // 000F LDCONST R8 K8 - 0x5C240600, // 0010 MOVE R9 R3 - 0x5C280800, // 0011 MOVE R10 R4 - 0x7C1C0600, // 0012 CALL R7 3 - 0x58200009, // 0013 LDCONST R8 K9 - 0x7C140600, // 0014 CALL R5 3 - 0x8C14010A, // 0015 GETMET R5 R0 K10 - 0x7C140200, // 0016 CALL R5 1 - 0x80000000, // 0017 RET 0 + ( &(const binstruction[203]) { /* code */ + 0x840C0000, // 0000 CLOSURE R3 P0 + 0x88100300, // 0001 GETMBR R4 R1 K0 + 0x88140301, // 0002 GETMBR R5 R1 K1 + 0x88180302, // 0003 GETMBR R6 R1 K2 + 0x501C0000, // 0004 LDBOOL R7 0 0 + 0x50200000, // 0005 LDBOOL R8 0 0 + 0x50240000, // 0006 LDBOOL R9 0 0 + 0x88280300, // 0007 GETMBR R10 R1 K0 + 0x4C2C0000, // 0008 LDNIL R11 + 0x2028140B, // 0009 NE R10 R10 R11 + 0x782A0007, // 000A JMPF R10 #0013 + 0x88280301, // 000B GETMBR R10 R1 K1 + 0x4C2C0000, // 000C LDNIL R11 + 0x2028140B, // 000D NE R10 R10 R11 + 0x782A0003, // 000E JMPF R10 #0013 + 0x88280302, // 000F GETMBR R10 R1 K2 + 0x4C2C0000, // 0010 LDNIL R11 + 0x2028140B, // 0011 NE R10 R10 R11 + 0x742A0000, // 0012 JMPT R10 #0014 + 0x50280001, // 0013 LDBOOL R10 0 1 + 0x50280200, // 0014 LDBOOL R10 1 0 + 0x602C0013, // 0015 GETGBL R11 G19 + 0x7C2C0000, // 0016 CALL R11 0 + 0x60300010, // 0017 GETGBL R12 G16 + 0x88340103, // 0018 GETMBR R13 R0 K3 + 0x7C300200, // 0019 CALL R12 1 + 0xA8020053, // 001A EXBLK 0 #006F + 0x5C341800, // 001B MOVE R13 R12 + 0x7C340000, // 001C CALL R13 0 + 0x8C381B04, // 001D GETMET R14 R13 K4 + 0x7C380200, // 001E CALL R14 1 + 0x4C3C0000, // 001F LDNIL R15 + 0x203C080F, // 0020 NE R15 R4 R15 + 0x783E0002, // 0021 JMPF R15 #0025 + 0x203C1C04, // 0022 NE R15 R14 R4 + 0x783E0000, // 0023 JMPF R15 #0025 + 0x7001FFF5, // 0024 JMP #001B + 0x8C3C1705, // 0025 GETMET R15 R11 K5 + 0x5C441C00, // 0026 MOVE R17 R14 + 0x7C3C0400, // 0027 CALL R15 2 + 0x743E0002, // 0028 JMPT R15 #002C + 0x603C0013, // 0029 GETGBL R15 G19 + 0x7C3C0000, // 002A CALL R15 0 + 0x982C1C0F, // 002B SETIDX R11 R14 R15 + 0x501C0200, // 002C LDBOOL R7 1 0 + 0x8C3C1B06, // 002D GETMET R15 R13 K6 + 0x7C3C0200, // 002E CALL R15 1 + 0x60400010, // 002F GETGBL R16 G16 + 0x5C441E00, // 0030 MOVE R17 R15 + 0x7C400200, // 0031 CALL R16 1 + 0xA8020037, // 0032 EXBLK 0 #006B + 0x5C442000, // 0033 MOVE R17 R16 + 0x7C440000, // 0034 CALL R17 0 + 0x4C480000, // 0035 LDNIL R18 + 0x20480A12, // 0036 NE R18 R5 R18 + 0x784A0002, // 0037 JMPF R18 #003B + 0x20482205, // 0038 NE R18 R17 R5 + 0x784A0000, // 0039 JMPF R18 #003B + 0x7001FFF7, // 003A JMP #0033 + 0x9448160E, // 003B GETIDX R18 R11 R14 + 0x8C482505, // 003C GETMET R18 R18 K5 + 0x5C502200, // 003D MOVE R20 R17 + 0x7C480400, // 003E CALL R18 2 + 0x744A0003, // 003F JMPT R18 #0044 + 0x9448160E, // 0040 GETIDX R18 R11 R14 + 0x604C0013, // 0041 GETGBL R19 G19 + 0x7C4C0000, // 0042 CALL R19 0 + 0x98482213, // 0043 SETIDX R18 R17 R19 + 0x50200200, // 0044 LDBOOL R8 1 0 + 0x8C481B07, // 0045 GETMET R18 R13 K7 + 0x5C502200, // 0046 MOVE R20 R17 + 0x7C480400, // 0047 CALL R18 2 + 0x604C0010, // 0048 GETGBL R19 G16 + 0x5C502400, // 0049 MOVE R20 R18 + 0x7C4C0200, // 004A CALL R19 1 + 0xA802001A, // 004B EXBLK 0 #0067 + 0x5C502600, // 004C MOVE R20 R19 + 0x7C500000, // 004D CALL R20 0 + 0x4C540000, // 004E LDNIL R21 + 0x20540C15, // 004F NE R21 R6 R21 + 0x78560002, // 0050 JMPF R21 #0054 + 0x20542806, // 0051 NE R21 R20 R6 + 0x78560000, // 0052 JMPF R21 #0054 + 0x7001FFF7, // 0053 JMP #004C + 0x9454160E, // 0054 GETIDX R21 R11 R14 + 0x94542A11, // 0055 GETIDX R21 R21 R17 + 0x8C542B05, // 0056 GETMET R21 R21 K5 + 0x5C5C2800, // 0057 MOVE R23 R20 + 0x7C540400, // 0058 CALL R21 2 + 0x74560004, // 0059 JMPT R21 #005F + 0x9454160E, // 005A GETIDX R21 R11 R14 + 0x94542A11, // 005B GETIDX R21 R21 R17 + 0x60580012, // 005C GETGBL R22 G18 + 0x7C580000, // 005D CALL R22 0 + 0x98542816, // 005E SETIDX R21 R20 R22 + 0x50240200, // 005F LDBOOL R9 1 0 + 0x9454160E, // 0060 GETIDX R21 R11 R14 + 0x94542A11, // 0061 GETIDX R21 R21 R17 + 0x94542A14, // 0062 GETIDX R21 R21 R20 + 0x8C542B08, // 0063 GETMET R21 R21 K8 + 0x5C5C1A00, // 0064 MOVE R23 R13 + 0x7C540400, // 0065 CALL R21 2 + 0x7001FFE4, // 0066 JMP #004C + 0x584C0009, // 0067 LDCONST R19 K9 + 0xAC4C0200, // 0068 CATCH R19 1 0 + 0xB0080000, // 0069 RAISE 2 R0 R0 + 0x7001FFC7, // 006A JMP #0033 + 0x58400009, // 006B LDCONST R16 K9 + 0xAC400200, // 006C CATCH R16 1 0 + 0xB0080000, // 006D RAISE 2 R0 R0 + 0x7001FFAB, // 006E JMP #001B + 0x58300009, // 006F LDCONST R12 K9 + 0xAC300200, // 0070 CATCH R12 1 0 + 0xB0080000, // 0071 RAISE 2 R0 R0 + 0x60300010, // 0072 GETGBL R12 G16 + 0x5C340600, // 0073 MOVE R13 R3 + 0x5C381600, // 0074 MOVE R14 R11 + 0x7C340200, // 0075 CALL R13 1 + 0x7C300200, // 0076 CALL R12 1 + 0xA8020033, // 0077 EXBLK 0 #00AC + 0x5C341800, // 0078 MOVE R13 R12 + 0x7C340000, // 0079 CALL R13 0 + 0x60380010, // 007A GETGBL R14 G16 + 0x5C3C0600, // 007B MOVE R15 R3 + 0x9440160D, // 007C GETIDX R16 R11 R13 + 0x7C3C0200, // 007D CALL R15 1 + 0x7C380200, // 007E CALL R14 1 + 0xA8020027, // 007F EXBLK 0 #00A8 + 0x5C3C1C00, // 0080 MOVE R15 R14 + 0x7C3C0000, // 0081 CALL R15 0 + 0x60400010, // 0082 GETGBL R16 G16 + 0x5C440600, // 0083 MOVE R17 R3 + 0x9448160D, // 0084 GETIDX R18 R11 R13 + 0x9448240F, // 0085 GETIDX R18 R18 R15 + 0x7C440200, // 0086 CALL R17 1 + 0x7C400200, // 0087 CALL R16 1 + 0xA802001A, // 0088 EXBLK 0 #00A4 + 0x5C442000, // 0089 MOVE R17 R16 + 0x7C440000, // 008A CALL R17 0 + 0x60480010, // 008B GETGBL R18 G16 + 0x944C160D, // 008C GETIDX R19 R11 R13 + 0x944C260F, // 008D GETIDX R19 R19 R15 + 0x944C2611, // 008E GETIDX R19 R19 R17 + 0x7C480200, // 008F CALL R18 1 + 0xA802000E, // 0090 EXBLK 0 #00A0 + 0x5C4C2400, // 0091 MOVE R19 R18 + 0x7C4C0000, // 0092 CALL R19 0 + 0x9006000D, // 0093 SETMBR R1 K0 R13 + 0x9006020F, // 0094 SETMBR R1 K1 R15 + 0x90060411, // 0095 SETMBR R1 K2 R17 + 0x5C500400, // 0096 MOVE R20 R2 + 0x5C542600, // 0097 MOVE R21 R19 + 0x5C580200, // 0098 MOVE R22 R1 + 0x5C5C1400, // 0099 MOVE R23 R10 + 0x7C500600, // 009A CALL R20 3 + 0x782A0002, // 009B JMPF R10 #009F + 0x78520001, // 009C JMPF R20 #009F + 0xA8040004, // 009D EXBLK 1 4 + 0x80002A00, // 009E RET 0 + 0x7001FFF0, // 009F JMP #0091 + 0x58480009, // 00A0 LDCONST R18 K9 + 0xAC480200, // 00A1 CATCH R18 1 0 + 0xB0080000, // 00A2 RAISE 2 R0 R0 + 0x7001FFE4, // 00A3 JMP #0089 + 0x58400009, // 00A4 LDCONST R16 K9 + 0xAC400200, // 00A5 CATCH R16 1 0 + 0xB0080000, // 00A6 RAISE 2 R0 R0 + 0x7001FFD7, // 00A7 JMP #0080 + 0x58380009, // 00A8 LDCONST R14 K9 + 0xAC380200, // 00A9 CATCH R14 1 0 + 0xB0080000, // 00AA RAISE 2 R0 R0 + 0x7001FFCB, // 00AB JMP #0078 + 0x58300009, // 00AC LDCONST R12 K9 + 0xAC300200, // 00AD CATCH R12 1 0 + 0xB0080000, // 00AE RAISE 2 R0 R0 + 0x782A0019, // 00AF JMPF R10 #00CA + 0x5C300E00, // 00B0 MOVE R12 R7 + 0x74320003, // 00B1 JMPT R12 #00B6 + 0xB8321600, // 00B2 GETNGBL R12 K11 + 0x8830190C, // 00B3 GETMBR R12 R12 K12 + 0x9006140C, // 00B4 SETMBR R1 K10 R12 + 0x7002000E, // 00B5 JMP #00C5 + 0x5C301000, // 00B6 MOVE R12 R8 + 0x74320003, // 00B7 JMPT R12 #00BC + 0xB8321600, // 00B8 GETNGBL R12 K11 + 0x8830190D, // 00B9 GETMBR R12 R12 K13 + 0x9006140C, // 00BA SETMBR R1 K10 R12 + 0x70020008, // 00BB JMP #00C5 + 0x5C301200, // 00BC MOVE R12 R9 + 0x74320003, // 00BD JMPT R12 #00C2 + 0xB8321600, // 00BE GETNGBL R12 K11 + 0x8830190E, // 00BF GETMBR R12 R12 K14 + 0x9006140C, // 00C0 SETMBR R1 K10 R12 + 0x70020002, // 00C1 JMP #00C5 + 0xB8321600, // 00C2 GETNGBL R12 K11 + 0x8830190F, // 00C3 GETMBR R12 R12 K15 + 0x9006140C, // 00C4 SETMBR R1 K10 R12 + 0x5C300400, // 00C5 MOVE R12 R2 + 0x4C340000, // 00C6 LDNIL R13 + 0x5C380200, // 00C7 MOVE R14 R1 + 0x503C0200, // 00C8 LDBOOL R15 1 0 + 0x7C300600, // 00C9 CALL R12 3 + 0x80000000, // 00CA RET 0 }) ) ); @@ -1490,6 +1227,307 @@ be_local_closure(Matter_Device__instantiate_plugins_from_config, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: start_operational_discovery +********************************************************************/ +be_local_closure(Matter_Device_start_operational_discovery, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(mdns), + /* K2 */ be_nested_str_weak(stop_basic_commissioning), + /* K3 */ be_nested_str_weak(root_w0), + /* K4 */ be_nested_str_weak(root_L), + /* K5 */ be_nested_str_weak(mdns_announce_op_discovery), + }), + be_str_weak(start_operational_discovery), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100102, // 0002 GETMET R4 R0 K2 + 0x7C100200, // 0003 CALL R4 1 + 0x4C100000, // 0004 LDNIL R4 + 0x90020604, // 0005 SETMBR R0 K3 R4 + 0x4C100000, // 0006 LDNIL R4 + 0x90020804, // 0007 SETMBR R0 K4 R4 + 0x8C100105, // 0008 GETMET R4 R0 K5 + 0x5C180200, // 0009 MOVE R6 R1 + 0x7C100400, // 000A CALL R4 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_Device_msg_received, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(message_handler), + /* K1 */ be_nested_str_weak(msg_received), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x5C180200, // 0002 MOVE R6 R1 + 0x5C1C0400, // 0003 MOVE R7 R2 + 0x5C200600, // 0004 MOVE R8 R3 + 0x7C100800, // 0005 CALL R4 4 + 0x80040800, // 0006 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_http_remote +********************************************************************/ +be_local_closure(Matter_Device_register_http_remote, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(get_timeout), + /* K3 */ be_nested_str_weak(set_timeout), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(HTTP_remote), + /* K6 */ be_nested_str_weak(plugins_config_remotes), + /* K7 */ be_nested_str_weak(set_info), + }), + be_str_weak(register_http_remote), + &be_const_str_solidified, + ( &(const binstruction[42]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x4C100000, // 0001 LDNIL R4 + 0x1C0C0604, // 0002 EQ R3 R3 R4 + 0x780E0002, // 0003 JMPF R3 #0007 + 0x600C0013, // 0004 GETGBL R3 G19 + 0x7C0C0000, // 0005 CALL R3 0 + 0x90020003, // 0006 SETMBR R0 K0 R3 + 0x4C0C0000, // 0007 LDNIL R3 + 0x88100100, // 0008 GETMBR R4 R0 K0 + 0x8C100901, // 0009 GETMET R4 R4 K1 + 0x5C180200, // 000A MOVE R6 R1 + 0x7C100400, // 000B CALL R4 2 + 0x78120009, // 000C JMPF R4 #0017 + 0x88100100, // 000D GETMBR R4 R0 K0 + 0x940C0801, // 000E GETIDX R3 R4 R1 + 0x8C140702, // 000F GETMET R5 R3 K2 + 0x7C140200, // 0010 CALL R5 1 + 0x14140405, // 0011 LT R5 R2 R5 + 0x78160002, // 0012 JMPF R5 #0016 + 0x8C140703, // 0013 GETMET R5 R3 K3 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x7C140400, // 0015 CALL R5 2 + 0x70020011, // 0016 JMP #0029 + 0xB8120800, // 0017 GETNGBL R4 K4 + 0x8C100905, // 0018 GETMET R4 R4 K5 + 0x5C180000, // 0019 MOVE R6 R0 + 0x5C1C0200, // 001A MOVE R7 R1 + 0x5C200400, // 001B MOVE R8 R2 + 0x7C100800, // 001C CALL R4 4 + 0x5C0C0800, // 001D MOVE R3 R4 + 0x88100106, // 001E GETMBR R4 R0 K6 + 0x8C100901, // 001F GETMET R4 R4 K1 + 0x5C180200, // 0020 MOVE R6 R1 + 0x7C100400, // 0021 CALL R4 2 + 0x78120003, // 0022 JMPF R4 #0027 + 0x8C100707, // 0023 GETMET R4 R3 K7 + 0x88180106, // 0024 GETMBR R6 R0 K6 + 0x94180C01, // 0025 GETIDX R6 R6 R1 + 0x7C100400, // 0026 CALL R4 2 + 0x88100100, // 0027 GETMBR R4 R0 K0 + 0x98100203, // 0028 SETIDX R4 R1 R3 + 0x80040600, // 0029 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_add_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[21]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), + /* K5 */ be_nested_str_weak(_X27_X20skipping), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(next_ep), + /* K8 */ be_nested_str_weak(plugins), + /* K9 */ be_nested_str_weak(push), + /* K10 */ be_nested_str_weak(type), + /* K11 */ be_nested_str_weak(keys), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), + /* K14 */ be_nested_str_weak(conf_to_log), + /* K15 */ be_const_int(2), + /* K16 */ be_nested_str_weak(plugins_config), + /* K17 */ be_nested_str_weak(plugins_persist), + /* K18 */ be_const_int(1), + /* K19 */ be_nested_str_weak(save_param), + /* K20 */ be_nested_str_weak(signal_endpoints_changed), + }), + be_str_weak(bridge_add_endpoint), + &be_const_str_solidified, + ( &(const binstruction[70]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x4C100000, // 0004 LDNIL R4 + 0x1C100604, // 0005 EQ R4 R3 R4 + 0x78120009, // 0006 JMPF R4 #0011 + 0xB8120400, // 0007 GETNGBL R4 K2 + 0x8C100903, // 0008 GETMET R4 R4 K3 + 0x60180008, // 0009 GETGBL R6 G8 + 0x5C1C0200, // 000A MOVE R7 R1 + 0x7C180200, // 000B CALL R6 1 + 0x001A0806, // 000C ADD R6 K4 R6 + 0x00180D05, // 000D ADD R6 R6 K5 + 0x581C0006, // 000E LDCONST R7 K6 + 0x7C100600, // 000F CALL R4 3 + 0x80000800, // 0010 RET 0 + 0x88100107, // 0011 GETMBR R4 R0 K7 + 0x60140008, // 0012 GETGBL R5 G8 + 0x5C180800, // 0013 MOVE R6 R4 + 0x7C140200, // 0014 CALL R5 1 + 0x5C180600, // 0015 MOVE R6 R3 + 0x5C1C0000, // 0016 MOVE R7 R0 + 0x5C200800, // 0017 MOVE R8 R4 + 0x5C240400, // 0018 MOVE R9 R2 + 0x7C180600, // 0019 CALL R6 3 + 0x881C0108, // 001A GETMBR R7 R0 K8 + 0x8C1C0F09, // 001B GETMET R7 R7 K9 + 0x5C240C00, // 001C MOVE R9 R6 + 0x7C1C0400, // 001D CALL R7 2 + 0x601C0013, // 001E GETGBL R7 G19 + 0x7C1C0000, // 001F CALL R7 0 + 0x981E1401, // 0020 SETIDX R7 K10 R1 + 0x60200010, // 0021 GETGBL R8 G16 + 0x8C24050B, // 0022 GETMET R9 R2 K11 + 0x7C240200, // 0023 CALL R9 1 + 0x7C200200, // 0024 CALL R8 1 + 0xA8020004, // 0025 EXBLK 0 #002B + 0x5C241000, // 0026 MOVE R9 R8 + 0x7C240000, // 0027 CALL R9 0 + 0x94280409, // 0028 GETIDX R10 R2 R9 + 0x981C120A, // 0029 SETIDX R7 R9 R10 + 0x7001FFFA, // 002A JMP #0026 + 0x5820000C, // 002B LDCONST R8 K12 + 0xAC200200, // 002C CATCH R8 1 0 + 0xB0080000, // 002D RAISE 2 R0 R0 + 0xB8220400, // 002E GETNGBL R8 K2 + 0x8C201103, // 002F GETMET R8 R8 K3 + 0x60280018, // 0030 GETGBL R10 G24 + 0x582C000D, // 0031 LDCONST R11 K13 + 0x5C300800, // 0032 MOVE R12 R4 + 0x5C340200, // 0033 MOVE R13 R1 + 0x8C38010E, // 0034 GETMET R14 R0 K14 + 0x5C400400, // 0035 MOVE R16 R2 + 0x7C380400, // 0036 CALL R14 2 + 0x7C280800, // 0037 CALL R10 4 + 0x582C000F, // 0038 LDCONST R11 K15 + 0x7C200600, // 0039 CALL R8 3 + 0x88200110, // 003A GETMBR R8 R0 K16 + 0x98200A07, // 003B SETIDX R8 R5 R7 + 0x50200200, // 003C LDBOOL R8 1 0 + 0x90022208, // 003D SETMBR R0 K17 R8 + 0x88200107, // 003E GETMBR R8 R0 K7 + 0x00201112, // 003F ADD R8 R8 K18 + 0x90020E08, // 0040 SETMBR R0 K7 R8 + 0x8C200113, // 0041 GETMET R8 R0 K19 + 0x7C200200, // 0042 CALL R8 1 + 0x8C200114, // 0043 GETMET R8 R0 K20 + 0x7C200200, // 0044 CALL R8 1 + 0x80040800, // 0045 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_arg +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(ARG), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_arg), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: compute_qrcode_content ********************************************************************/ @@ -1566,6 +1604,35 @@ be_local_closure(Matter_Device_compute_qrcode_content, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: is_commissioning_open +********************************************************************/ +be_local_closure(Matter_Device_is_commissioning_open, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + }), + be_str_weak(is_commissioning_open), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: sort_distinct ********************************************************************/ @@ -1648,390 +1715,6 @@ be_local_closure(Matter_Device_sort_distinct, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: process_attribute_expansion -********************************************************************/ -be_local_closure(Matter_Device_process_attribute_expansion, /* name */ - be_nested_proto( - 24, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(keys), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(stop_iteration), - /* K3 */ be_const_int(1), - /* K4 */ be_const_int(0), - }), - be_str_weak(keys_sorted), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x60040012, // 0000 GETGBL R1 G18 - 0x7C040000, // 0001 CALL R1 0 - 0x60080010, // 0002 GETGBL R2 G16 - 0x8C0C0100, // 0003 GETMET R3 R0 K0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x7C080200, // 0005 CALL R2 1 - 0xA8020005, // 0006 EXBLK 0 #000D - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x8C100301, // 0009 GETMET R4 R1 K1 - 0x5C180600, // 000A MOVE R6 R3 - 0x7C100400, // 000B CALL R4 2 - 0x7001FFF9, // 000C JMP #0007 - 0x58080002, // 000D LDCONST R2 K2 - 0xAC080200, // 000E CATCH R2 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x60080010, // 0010 GETGBL R2 G16 - 0x600C000C, // 0011 GETGBL R3 G12 - 0x5C100200, // 0012 MOVE R4 R1 - 0x7C0C0200, // 0013 CALL R3 1 - 0x040C0703, // 0014 SUB R3 R3 K3 - 0x400E0603, // 0015 CONNECT R3 K3 R3 - 0x7C080200, // 0016 CALL R2 1 - 0xA8020010, // 0017 EXBLK 0 #0029 - 0x5C0C0400, // 0018 MOVE R3 R2 - 0x7C0C0000, // 0019 CALL R3 0 - 0x94100203, // 001A GETIDX R4 R1 R3 - 0x5C140600, // 001B MOVE R5 R3 - 0x24180B04, // 001C GT R6 R5 K4 - 0x781A0008, // 001D JMPF R6 #0027 - 0x04180B03, // 001E SUB R6 R5 K3 - 0x94180206, // 001F GETIDX R6 R1 R6 - 0x24180C04, // 0020 GT R6 R6 R4 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x04180B03, // 0022 SUB R6 R5 K3 - 0x94180206, // 0023 GETIDX R6 R1 R6 - 0x98040A06, // 0024 SETIDX R1 R5 R6 - 0x04140B03, // 0025 SUB R5 R5 K3 - 0x7001FFF4, // 0026 JMP #001C - 0x98040A04, // 0027 SETIDX R1 R5 R4 - 0x7001FFEE, // 0028 JMP #0018 - 0x58080002, // 0029 LDCONST R2 K2 - 0xAC080200, // 002A CATCH R2 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0x80040200, // 002C RET 1 R1 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - /* K1 */ be_nested_str_weak(cluster), - /* K2 */ be_nested_str_weak(attribute), - /* K3 */ be_nested_str_weak(plugins), - /* K4 */ be_nested_str_weak(get_endpoint), - /* K5 */ be_nested_str_weak(contains), - /* K6 */ be_nested_str_weak(get_cluster_list), - /* K7 */ be_nested_str_weak(get_attribute_list), - /* K8 */ be_nested_str_weak(push), - /* K9 */ be_nested_str_weak(stop_iteration), - /* K10 */ be_nested_str_weak(status), - /* K11 */ be_nested_str_weak(matter), - /* K12 */ be_nested_str_weak(UNSUPPORTED_ENDPOINT), - /* K13 */ be_nested_str_weak(UNSUPPORTED_CLUSTER), - /* K14 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K15 */ be_nested_str_weak(UNREPORTABLE_ATTRIBUTE), - }), - be_str_weak(process_attribute_expansion), - &be_const_str_solidified, - ( &(const binstruction[205]) { /* code */ - 0x840C0000, // 0000 CLOSURE R3 P0 - 0x88100300, // 0001 GETMBR R4 R1 K0 - 0x50140000, // 0002 LDBOOL R5 0 0 - 0x88180301, // 0003 GETMBR R6 R1 K1 - 0x501C0000, // 0004 LDBOOL R7 0 0 - 0x88200302, // 0005 GETMBR R8 R1 K2 - 0x50240000, // 0006 LDBOOL R9 0 0 - 0x88280300, // 0007 GETMBR R10 R1 K0 - 0x4C2C0000, // 0008 LDNIL R11 - 0x2028140B, // 0009 NE R10 R10 R11 - 0x782A0007, // 000A JMPF R10 #0013 - 0x88280301, // 000B GETMBR R10 R1 K1 - 0x4C2C0000, // 000C LDNIL R11 - 0x2028140B, // 000D NE R10 R10 R11 - 0x782A0003, // 000E JMPF R10 #0013 - 0x88280302, // 000F GETMBR R10 R1 K2 - 0x4C2C0000, // 0010 LDNIL R11 - 0x2028140B, // 0011 NE R10 R10 R11 - 0x742A0000, // 0012 JMPT R10 #0014 - 0x50280001, // 0013 LDBOOL R10 0 1 - 0x50280200, // 0014 LDBOOL R10 1 0 - 0x602C0013, // 0015 GETGBL R11 G19 - 0x7C2C0000, // 0016 CALL R11 0 - 0x60300010, // 0017 GETGBL R12 G16 - 0x88340103, // 0018 GETMBR R13 R0 K3 - 0x7C300200, // 0019 CALL R12 1 - 0xA8020055, // 001A EXBLK 0 #0071 - 0x5C341800, // 001B MOVE R13 R12 - 0x7C340000, // 001C CALL R13 0 - 0x8C381B04, // 001D GETMET R14 R13 K4 - 0x7C380200, // 001E CALL R14 1 - 0x4C3C0000, // 001F LDNIL R15 - 0x203C080F, // 0020 NE R15 R4 R15 - 0x783E0002, // 0021 JMPF R15 #0025 - 0x203C1C04, // 0022 NE R15 R14 R4 - 0x783E0000, // 0023 JMPF R15 #0025 - 0x7001FFF5, // 0024 JMP #001B - 0x8C3C1705, // 0025 GETMET R15 R11 K5 - 0x5C441C00, // 0026 MOVE R17 R14 - 0x7C3C0400, // 0027 CALL R15 2 - 0x743E0002, // 0028 JMPT R15 #002C - 0x603C0013, // 0029 GETGBL R15 G19 - 0x7C3C0000, // 002A CALL R15 0 - 0x982C1C0F, // 002B SETIDX R11 R14 R15 - 0x50140200, // 002C LDBOOL R5 1 0 - 0x8C3C1B06, // 002D GETMET R15 R13 K6 - 0x5C441C00, // 002E MOVE R17 R14 - 0x7C3C0400, // 002F CALL R15 2 - 0x60400010, // 0030 GETGBL R16 G16 - 0x5C441E00, // 0031 MOVE R17 R15 - 0x7C400200, // 0032 CALL R16 1 - 0xA8020038, // 0033 EXBLK 0 #006D - 0x5C442000, // 0034 MOVE R17 R16 - 0x7C440000, // 0035 CALL R17 0 - 0x4C480000, // 0036 LDNIL R18 - 0x20480C12, // 0037 NE R18 R6 R18 - 0x784A0002, // 0038 JMPF R18 #003C - 0x20482206, // 0039 NE R18 R17 R6 - 0x784A0000, // 003A JMPF R18 #003C - 0x7001FFF7, // 003B JMP #0034 - 0x9448160E, // 003C GETIDX R18 R11 R14 - 0x8C482505, // 003D GETMET R18 R18 K5 - 0x5C502200, // 003E MOVE R20 R17 - 0x7C480400, // 003F CALL R18 2 - 0x744A0003, // 0040 JMPT R18 #0045 - 0x9448160E, // 0041 GETIDX R18 R11 R14 - 0x604C0013, // 0042 GETGBL R19 G19 - 0x7C4C0000, // 0043 CALL R19 0 - 0x98482213, // 0044 SETIDX R18 R17 R19 - 0x501C0200, // 0045 LDBOOL R7 1 0 - 0x8C481B07, // 0046 GETMET R18 R13 K7 - 0x5C501C00, // 0047 MOVE R20 R14 - 0x5C542200, // 0048 MOVE R21 R17 - 0x7C480600, // 0049 CALL R18 3 - 0x604C0010, // 004A GETGBL R19 G16 - 0x5C502400, // 004B MOVE R20 R18 - 0x7C4C0200, // 004C CALL R19 1 - 0xA802001A, // 004D EXBLK 0 #0069 - 0x5C502600, // 004E MOVE R20 R19 - 0x7C500000, // 004F CALL R20 0 - 0x4C540000, // 0050 LDNIL R21 - 0x20541015, // 0051 NE R21 R8 R21 - 0x78560002, // 0052 JMPF R21 #0056 - 0x20542808, // 0053 NE R21 R20 R8 - 0x78560000, // 0054 JMPF R21 #0056 - 0x7001FFF7, // 0055 JMP #004E - 0x9454160E, // 0056 GETIDX R21 R11 R14 - 0x94542A11, // 0057 GETIDX R21 R21 R17 - 0x8C542B05, // 0058 GETMET R21 R21 K5 - 0x5C5C2800, // 0059 MOVE R23 R20 - 0x7C540400, // 005A CALL R21 2 - 0x74560004, // 005B JMPT R21 #0061 - 0x9454160E, // 005C GETIDX R21 R11 R14 - 0x94542A11, // 005D GETIDX R21 R21 R17 - 0x60580012, // 005E GETGBL R22 G18 - 0x7C580000, // 005F CALL R22 0 - 0x98542816, // 0060 SETIDX R21 R20 R22 - 0x50240200, // 0061 LDBOOL R9 1 0 - 0x9454160E, // 0062 GETIDX R21 R11 R14 - 0x94542A11, // 0063 GETIDX R21 R21 R17 - 0x94542A14, // 0064 GETIDX R21 R21 R20 - 0x8C542B08, // 0065 GETMET R21 R21 K8 - 0x5C5C1A00, // 0066 MOVE R23 R13 - 0x7C540400, // 0067 CALL R21 2 - 0x7001FFE4, // 0068 JMP #004E - 0x584C0009, // 0069 LDCONST R19 K9 - 0xAC4C0200, // 006A CATCH R19 1 0 - 0xB0080000, // 006B RAISE 2 R0 R0 - 0x7001FFC6, // 006C JMP #0034 - 0x58400009, // 006D LDCONST R16 K9 - 0xAC400200, // 006E CATCH R16 1 0 - 0xB0080000, // 006F RAISE 2 R0 R0 - 0x7001FFA9, // 0070 JMP #001B - 0x58300009, // 0071 LDCONST R12 K9 - 0xAC300200, // 0072 CATCH R12 1 0 - 0xB0080000, // 0073 RAISE 2 R0 R0 - 0x60300010, // 0074 GETGBL R12 G16 - 0x5C340600, // 0075 MOVE R13 R3 - 0x5C381600, // 0076 MOVE R14 R11 - 0x7C340200, // 0077 CALL R13 1 - 0x7C300200, // 0078 CALL R12 1 - 0xA8020033, // 0079 EXBLK 0 #00AE - 0x5C341800, // 007A MOVE R13 R12 - 0x7C340000, // 007B CALL R13 0 - 0x60380010, // 007C GETGBL R14 G16 - 0x5C3C0600, // 007D MOVE R15 R3 - 0x9440160D, // 007E GETIDX R16 R11 R13 - 0x7C3C0200, // 007F CALL R15 1 - 0x7C380200, // 0080 CALL R14 1 - 0xA8020027, // 0081 EXBLK 0 #00AA - 0x5C3C1C00, // 0082 MOVE R15 R14 - 0x7C3C0000, // 0083 CALL R15 0 - 0x60400010, // 0084 GETGBL R16 G16 - 0x5C440600, // 0085 MOVE R17 R3 - 0x9448160D, // 0086 GETIDX R18 R11 R13 - 0x9448240F, // 0087 GETIDX R18 R18 R15 - 0x7C440200, // 0088 CALL R17 1 - 0x7C400200, // 0089 CALL R16 1 - 0xA802001A, // 008A EXBLK 0 #00A6 - 0x5C442000, // 008B MOVE R17 R16 - 0x7C440000, // 008C CALL R17 0 - 0x60480010, // 008D GETGBL R18 G16 - 0x944C160D, // 008E GETIDX R19 R11 R13 - 0x944C260F, // 008F GETIDX R19 R19 R15 - 0x944C2611, // 0090 GETIDX R19 R19 R17 - 0x7C480200, // 0091 CALL R18 1 - 0xA802000E, // 0092 EXBLK 0 #00A2 - 0x5C4C2400, // 0093 MOVE R19 R18 - 0x7C4C0000, // 0094 CALL R19 0 - 0x9006000D, // 0095 SETMBR R1 K0 R13 - 0x9006020F, // 0096 SETMBR R1 K1 R15 - 0x90060411, // 0097 SETMBR R1 K2 R17 - 0x5C500400, // 0098 MOVE R20 R2 - 0x5C542600, // 0099 MOVE R21 R19 - 0x5C580200, // 009A MOVE R22 R1 - 0x5C5C1400, // 009B MOVE R23 R10 - 0x7C500600, // 009C CALL R20 3 - 0x782A0002, // 009D JMPF R10 #00A1 - 0x78520001, // 009E JMPF R20 #00A1 - 0xA8040004, // 009F EXBLK 1 4 - 0x80002A00, // 00A0 RET 0 - 0x7001FFF0, // 00A1 JMP #0093 - 0x58480009, // 00A2 LDCONST R18 K9 - 0xAC480200, // 00A3 CATCH R18 1 0 - 0xB0080000, // 00A4 RAISE 2 R0 R0 - 0x7001FFE4, // 00A5 JMP #008B - 0x58400009, // 00A6 LDCONST R16 K9 - 0xAC400200, // 00A7 CATCH R16 1 0 - 0xB0080000, // 00A8 RAISE 2 R0 R0 - 0x7001FFD7, // 00A9 JMP #0082 - 0x58380009, // 00AA LDCONST R14 K9 - 0xAC380200, // 00AB CATCH R14 1 0 - 0xB0080000, // 00AC RAISE 2 R0 R0 - 0x7001FFCB, // 00AD JMP #007A - 0x58300009, // 00AE LDCONST R12 K9 - 0xAC300200, // 00AF CATCH R12 1 0 - 0xB0080000, // 00B0 RAISE 2 R0 R0 - 0x782A0019, // 00B1 JMPF R10 #00CC - 0x5C300A00, // 00B2 MOVE R12 R5 - 0x74320003, // 00B3 JMPT R12 #00B8 - 0xB8321600, // 00B4 GETNGBL R12 K11 - 0x8830190C, // 00B5 GETMBR R12 R12 K12 - 0x9006140C, // 00B6 SETMBR R1 K10 R12 - 0x7002000E, // 00B7 JMP #00C7 - 0x5C300E00, // 00B8 MOVE R12 R7 - 0x74320003, // 00B9 JMPT R12 #00BE - 0xB8321600, // 00BA GETNGBL R12 K11 - 0x8830190D, // 00BB GETMBR R12 R12 K13 - 0x9006140C, // 00BC SETMBR R1 K10 R12 - 0x70020008, // 00BD JMP #00C7 - 0x5C301200, // 00BE MOVE R12 R9 - 0x74320003, // 00BF JMPT R12 #00C4 - 0xB8321600, // 00C0 GETNGBL R12 K11 - 0x8830190E, // 00C1 GETMBR R12 R12 K14 - 0x9006140C, // 00C2 SETMBR R1 K10 R12 - 0x70020002, // 00C3 JMP #00C7 - 0xB8321600, // 00C4 GETNGBL R12 K11 - 0x8830190F, // 00C5 GETMBR R12 R12 K15 - 0x9006140C, // 00C6 SETMBR R1 K10 R12 - 0x5C300400, // 00C7 MOVE R12 R2 - 0x4C340000, // 00C8 LDNIL R13 - 0x5C380200, // 00C9 MOVE R14 R1 - 0x503C0200, // 00CA LDBOOL R15 1 0 - 0x7C300600, // 00CB CALL R12 3 - 0x80000000, // 00CC RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _trigger_read_sensors -********************************************************************/ -be_local_closure(Matter_Device__trigger_read_sensors, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(read_sensors), - /* K3 */ be_nested_str_weak(load), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(plugins), - /* K6 */ be_nested_str_weak(parse_sensors), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), - /* K10 */ be_const_int(3), - }), - be_str_weak(_trigger_read_sensors), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x7C080200, // 0003 CALL R2 1 - 0x4C0C0000, // 0004 LDNIL R3 - 0x1C0C0403, // 0005 EQ R3 R2 R3 - 0x780E0000, // 0006 JMPF R3 #0008 - 0x80000600, // 0007 RET 0 - 0x8C0C0303, // 0008 GETMET R3 R1 K3 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x7812000D, // 000D JMPF R4 #001C - 0x58100004, // 000E LDCONST R4 K4 - 0x6014000C, // 000F GETGBL R5 G12 - 0x88180105, // 0010 GETMBR R6 R0 K5 - 0x7C140200, // 0011 CALL R5 1 - 0x14140805, // 0012 LT R5 R4 R5 - 0x78160006, // 0013 JMPF R5 #001B - 0x88140105, // 0014 GETMBR R5 R0 K5 - 0x94140A04, // 0015 GETIDX R5 R5 R4 - 0x8C140B06, // 0016 GETMET R5 R5 K6 - 0x5C1C0600, // 0017 MOVE R7 R3 - 0x7C140400, // 0018 CALL R5 2 - 0x00100907, // 0019 ADD R4 R4 K7 - 0x7001FFF3, // 001A JMP #000F - 0x70020007, // 001B JMP #0024 - 0xB8120200, // 001C GETNGBL R4 K1 - 0x8C100908, // 001D GETMET R4 R4 K8 - 0x60180008, // 001E GETGBL R6 G8 - 0x5C1C0400, // 001F MOVE R7 R2 - 0x7C180200, // 0020 CALL R6 1 - 0x001A1206, // 0021 ADD R6 K9 R6 - 0x581C000A, // 0022 LDCONST R7 K10 - 0x7C100600, // 0023 CALL R4 3 - 0x80000000, // 0024 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: is_root_commissioning_open ********************************************************************/ @@ -2070,50 +1753,300 @@ be_local_closure(Matter_Device_is_root_commissioning_open, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: start_operational_discovery_deferred ********************************************************************/ -be_local_closure(Matter_Device_attribute_updated, /* name */ +be_local_closure(Matter_Device_start_operational_discovery_deferred, /* name */ be_nested_proto( - 10, /* nstack */ - 5, /* argc */ + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_operational_discovery), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_operational_discovery_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: k2l +********************************************************************/ +be_local_closure(Matter_Device_k2l, /* name */ + be_nested_proto( + 8, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), + }), + be_str_weak(k2l), + &be_const_str_solidified, + ( &(const binstruction[50]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020005, // 000B EXBLK 0 #0012 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x7C140400, // 0010 CALL R5 2 + 0x7001FFF9, // 0011 JMP #000C + 0x580C0003, // 0012 LDCONST R3 K3 + 0xAC0C0200, // 0013 CATCH R3 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x600C0010, // 0015 GETGBL R3 G16 + 0x6010000C, // 0016 GETGBL R4 G12 + 0x5C140400, // 0017 MOVE R5 R2 + 0x7C100200, // 0018 CALL R4 1 + 0x04100904, // 0019 SUB R4 R4 K4 + 0x40120804, // 001A CONNECT R4 K4 R4 + 0x7C0C0200, // 001B CALL R3 1 + 0xA8020010, // 001C EXBLK 0 #002E + 0x5C100600, // 001D MOVE R4 R3 + 0x7C100000, // 001E CALL R4 0 + 0x94140404, // 001F GETIDX R5 R2 R4 + 0x5C180800, // 0020 MOVE R6 R4 + 0x241C0D05, // 0021 GT R7 R6 K5 + 0x781E0008, // 0022 JMPF R7 #002C + 0x041C0D04, // 0023 SUB R7 R6 K4 + 0x941C0407, // 0024 GETIDX R7 R2 R7 + 0x241C0E05, // 0025 GT R7 R7 R5 + 0x781E0004, // 0026 JMPF R7 #002C + 0x041C0D04, // 0027 SUB R7 R6 K4 + 0x941C0407, // 0028 GETIDX R7 R2 R7 + 0x98080C07, // 0029 SETIDX R2 R6 R7 + 0x04180D04, // 002A SUB R6 R6 K4 + 0x7001FFF4, // 002B JMP #0021 + 0x98080C05, // 002C SETIDX R2 R6 R5 + 0x7001FFEE, // 002D JMP #001D + 0x580C0003, // 002E LDCONST R3 K3 + 0xAC0C0200, // 002F CATCH R3 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x80040400, // 0031 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: compute_manual_pairing_code +********************************************************************/ +be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(Path), - /* K2 */ be_nested_str_weak(endpoint), - /* K3 */ be_nested_str_weak(cluster), - /* K4 */ be_nested_str_weak(attribute), - /* K5 */ be_nested_str_weak(message_handler), - /* K6 */ be_nested_str_weak(im), - /* K7 */ be_nested_str_weak(subs_shop), - /* K8 */ be_nested_str_weak(attribute_updated_ctx), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(root_discriminator), + /* K1 */ be_nested_str_weak(root_passcode), + /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(Verhoeff), + /* K5 */ be_nested_str_weak(checksum), }), - be_str_weak(attribute_updated), + be_str_weak(compute_manual_pairing_code), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x4C140000, // 0000 LDNIL R5 - 0x1C140805, // 0001 EQ R5 R4 R5 - 0x78160000, // 0002 JMPF R5 #0004 - 0x50100000, // 0003 LDBOOL R4 0 0 - 0xB8160000, // 0004 GETNGBL R5 K0 - 0x8C140B01, // 0005 GETMET R5 R5 K1 - 0x7C140200, // 0006 CALL R5 1 - 0x90160401, // 0007 SETMBR R5 K2 R1 - 0x90160602, // 0008 SETMBR R5 K3 R2 - 0x90160803, // 0009 SETMBR R5 K4 R3 - 0x88180105, // 000A GETMBR R6 R0 K5 - 0x88180D06, // 000B GETMBR R6 R6 K6 - 0x88180D07, // 000C GETMBR R6 R6 K7 - 0x8C180D08, // 000D GETMET R6 R6 K8 - 0x5C200A00, // 000E MOVE R8 R5 - 0x5C240800, // 000F MOVE R9 R4 - 0x7C180600, // 0010 CALL R6 3 - 0x80000000, // 0011 RET 0 + ( &(const binstruction[30]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x540A0FFE, // 0001 LDINT R2 4095 + 0x2C040202, // 0002 AND R1 R1 R2 + 0x540A0009, // 0003 LDINT R2 10 + 0x3C040202, // 0004 SHR R1 R1 R2 + 0x88080100, // 0005 GETMBR R2 R0 K0 + 0x540E02FF, // 0006 LDINT R3 768 + 0x2C080403, // 0007 AND R2 R2 R3 + 0x540E0005, // 0008 LDINT R3 6 + 0x38080403, // 0009 SHL R2 R2 R3 + 0x880C0101, // 000A GETMBR R3 R0 K1 + 0x54123FFE, // 000B LDINT R4 16383 + 0x2C0C0604, // 000C AND R3 R3 R4 + 0x30080403, // 000D OR R2 R2 R3 + 0x880C0101, // 000E GETMBR R3 R0 K1 + 0x5412000D, // 000F LDINT R4 14 + 0x3C0C0604, // 0010 SHR R3 R3 R4 + 0x60100018, // 0011 GETGBL R4 G24 + 0x58140002, // 0012 LDCONST R5 K2 + 0x5C180200, // 0013 MOVE R6 R1 + 0x5C1C0400, // 0014 MOVE R7 R2 + 0x5C200600, // 0015 MOVE R8 R3 + 0x7C100800, // 0016 CALL R4 4 + 0xB8160600, // 0017 GETNGBL R5 K3 + 0x88140B04, // 0018 GETMBR R5 R5 K4 + 0x8C140B05, // 0019 GETMET R5 R5 K5 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0x00100805, // 001C ADD R4 R4 R5 + 0x80040800, // 001D RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: event_fabrics_saved +********************************************************************/ +be_local_closure(Matter_Device_event_fabrics_saved, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(plugins_persist), + /* K4 */ be_nested_str_weak(save_param), + }), + be_str_weak(event_fabrics_saved), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x24040302, // 0003 GT R1 R1 K2 + 0x78060005, // 0004 JMPF R1 #000B + 0x88040103, // 0005 GETMBR R1 R0 K3 + 0x74060003, // 0006 JMPT R1 #000B + 0x50040200, // 0007 LDBOOL R1 1 0 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x8C040104, // 0009 GETMET R1 R0 K4 + 0x7C040200, // 000A CALL R1 1 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_commissioning_complete_deferred +********************************************************************/ +be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 3, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 2]) { /* upvals */ + be_local_const_upval(1, 0), + be_local_const_upval(1, 1), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(start_commissioning_complete), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x68080001, // 0002 GETUPV R2 U1 + 0x7C000400, // 0003 CALL R0 2 + 0x80040000, // 0004 RET 1 R0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(set_timer), + /* K2 */ be_const_int(0), + }), + be_str_weak(start_commissioning_complete_deferred), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x58100002, // 0002 LDCONST R4 K2 + 0x84140000, // 0003 CLOSURE R5 P0 + 0x7C080600, // 0004 CALL R2 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 }) ) ); @@ -2293,47 +2226,11 @@ be_local_closure(Matter_Device_mdns_announce_op_discovery, /* name */ /******************************************************************** -** Solidified function: _init_basic_commissioning +** Solidified function: msg_send ********************************************************************/ -be_local_closure(Matter_Device__init_basic_commissioning, /* name */ +be_local_closure(Matter_Device_msg_send, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(start_root_basic_commissioning), - }), - be_str_weak(_init_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040302, // 0003 EQ R1 R1 K2 - 0x78060001, // 0004 JMPF R1 #0007 - 0x8C040103, // 0005 GETMET R1 R0 K3 - 0x7C040200, // 0006 CALL R1 1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_remote_info -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ - be_nested_proto( - 6, /* nstack */ + 5, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2342,265 +2239,17 @@ be_local_closure(Matter_Device_get_plugin_remote_info, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config_remotes), - /* K1 */ be_nested_str_weak(find), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(send_UDP), }), - be_str_weak(get_plugin_remote_info), + be_str_weak(msg_send), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x8C080501, // 0001 GETMET R2 R2 K1 0x5C100200, // 0002 MOVE R4 R1 - 0x60140013, // 0003 GETGBL R5 G19 - 0x7C140000, // 0004 CALL R5 0 - 0x7C080600, // 0005 CALL R2 3 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Device_init, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 2]) { - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Wifi_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - be_nested_proto( - 4, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(start), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(remove_rule), - /* K3 */ be_nested_str_weak(Eth_X23Connected), - /* K4 */ be_nested_str_weak(matter_start), - }), - be_str_weak(_anonymous_), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0xB8020200, // 0003 GETNGBL R0 K1 - 0x8C000102, // 0004 GETMET R0 R0 K2 - 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0004, // 0006 LDCONST R3 K4 - 0x7C000600, // 0007 CALL R0 3 - 0x80000000, // 0008 RET 0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[46]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(get_option), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(MATTER_OPTION), - /* K5 */ be_nested_str_weak(UI), - /* K6 */ be_nested_str_weak(profiler), - /* K7 */ be_nested_str_weak(Profiler), - /* K8 */ be_nested_str_weak(started), - /* K9 */ be_nested_str_weak(tick), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(plugins), - /* K12 */ be_nested_str_weak(plugins_persist), - /* K13 */ be_nested_str_weak(plugins_classes), - /* K14 */ be_nested_str_weak(plugins_config_remotes), - /* K15 */ be_nested_str_weak(register_native_classes), - /* K16 */ be_nested_str_weak(vendorid), - /* K17 */ be_nested_str_weak(VENDOR_ID), - /* K18 */ be_nested_str_weak(productid), - /* K19 */ be_nested_str_weak(PRODUCT_ID), - /* K20 */ be_nested_str_weak(root_iterations), - /* K21 */ be_nested_str_weak(PBKDF_ITERATIONS), - /* K22 */ be_nested_str_weak(next_ep), - /* K23 */ be_const_int(1), - /* K24 */ be_nested_str_weak(root_salt), - /* K25 */ be_nested_str_weak(random), - /* K26 */ be_nested_str_weak(ipv4only), - /* K27 */ be_nested_str_weak(disable_bridge_mode), - /* K28 */ be_nested_str_weak(load_param), - /* K29 */ be_nested_str_weak(sessions), - /* K30 */ be_nested_str_weak(Session_Store), - /* K31 */ be_nested_str_weak(load_fabrics), - /* K32 */ be_nested_str_weak(message_handler), - /* K33 */ be_nested_str_weak(MessageHandler), - /* K34 */ be_nested_str_weak(ui), - /* K35 */ be_nested_str_weak(wifi), - /* K36 */ be_nested_str_weak(up), - /* K37 */ be_nested_str_weak(eth), - /* K38 */ be_nested_str_weak(start), - /* K39 */ be_nested_str_weak(add_rule), - /* K40 */ be_nested_str_weak(Wifi_X23Connected), - /* K41 */ be_nested_str_weak(matter_start), - /* K42 */ be_nested_str_weak(Eth_X23Connected), - /* K43 */ be_nested_str_weak(_init_basic_commissioning), - /* K44 */ be_nested_str_weak(add_driver), - /* K45 */ be_nested_str_weak(register_commands), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[111]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xB80A0200, // 0001 GETNGBL R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0xB8120600, // 0003 GETNGBL R4 K3 - 0x88100904, // 0004 GETMBR R4 R4 K4 - 0x7C080400, // 0005 CALL R2 2 - 0x740A0004, // 0006 JMPT R2 #000C - 0xB80A0600, // 0007 GETNGBL R2 K3 - 0x8C080505, // 0008 GETMET R2 R2 K5 - 0x5C100000, // 0009 MOVE R4 R0 - 0x7C080400, // 000A CALL R2 2 - 0x80000400, // 000B RET 0 - 0xB80A0600, // 000C GETNGBL R2 K3 - 0x8C080507, // 000D GETMET R2 R2 K7 - 0x7C080200, // 000E CALL R2 1 - 0x90020C02, // 000F SETMBR R0 K6 R2 - 0x50080000, // 0010 LDBOOL R2 0 0 - 0x90021002, // 0011 SETMBR R0 K8 R2 - 0x9002130A, // 0012 SETMBR R0 K9 K10 - 0x60080012, // 0013 GETGBL R2 G18 - 0x7C080000, // 0014 CALL R2 0 - 0x90021602, // 0015 SETMBR R0 K11 R2 - 0x50080000, // 0016 LDBOOL R2 0 0 - 0x90021802, // 0017 SETMBR R0 K12 R2 - 0x60080013, // 0018 GETGBL R2 G19 - 0x7C080000, // 0019 CALL R2 0 - 0x90021A02, // 001A SETMBR R0 K13 R2 - 0x60080013, // 001B GETGBL R2 G19 - 0x7C080000, // 001C CALL R2 0 - 0x90021C02, // 001D SETMBR R0 K14 R2 - 0x8C08010F, // 001E GETMET R2 R0 K15 - 0x7C080200, // 001F CALL R2 1 - 0x88080111, // 0020 GETMBR R2 R0 K17 - 0x90022002, // 0021 SETMBR R0 K16 R2 - 0x88080113, // 0022 GETMBR R2 R0 K19 - 0x90022402, // 0023 SETMBR R0 K18 R2 - 0x88080115, // 0024 GETMBR R2 R0 K21 - 0x90022802, // 0025 SETMBR R0 K20 R2 - 0x90022D17, // 0026 SETMBR R0 K22 K23 - 0x8C080319, // 0027 GETMET R2 R1 K25 - 0x5412000F, // 0028 LDINT R4 16 - 0x7C080400, // 0029 CALL R2 2 - 0x90023002, // 002A SETMBR R0 K24 R2 - 0x50080000, // 002B LDBOOL R2 0 0 - 0x90023402, // 002C SETMBR R0 K26 R2 - 0x50080000, // 002D LDBOOL R2 0 0 - 0x90023602, // 002E SETMBR R0 K27 R2 - 0x8C08011C, // 002F GETMET R2 R0 K28 - 0x7C080200, // 0030 CALL R2 1 - 0xB80A0600, // 0031 GETNGBL R2 K3 - 0x8C08051E, // 0032 GETMET R2 R2 K30 - 0x5C100000, // 0033 MOVE R4 R0 - 0x7C080400, // 0034 CALL R2 2 - 0x90023A02, // 0035 SETMBR R0 K29 R2 - 0x8808011D, // 0036 GETMBR R2 R0 K29 - 0x8C08051F, // 0037 GETMET R2 R2 K31 - 0x7C080200, // 0038 CALL R2 1 - 0xB80A0600, // 0039 GETNGBL R2 K3 - 0x8C080521, // 003A GETMET R2 R2 K33 - 0x5C100000, // 003B MOVE R4 R0 - 0x7C080400, // 003C CALL R2 2 - 0x90024002, // 003D SETMBR R0 K32 R2 - 0xB80A0600, // 003E GETNGBL R2 K3 - 0x8C080505, // 003F GETMET R2 R2 K5 - 0x5C100000, // 0040 MOVE R4 R0 - 0x7C080400, // 0041 CALL R2 2 - 0x90024402, // 0042 SETMBR R0 K34 R2 - 0xB80A0200, // 0043 GETNGBL R2 K1 - 0x8C080523, // 0044 GETMET R2 R2 K35 - 0x7C080200, // 0045 CALL R2 1 - 0x94080524, // 0046 GETIDX R2 R2 K36 - 0x740A0004, // 0047 JMPT R2 #004D - 0xB80A0200, // 0048 GETNGBL R2 K1 - 0x8C080525, // 0049 GETMET R2 R2 K37 - 0x7C080200, // 004A CALL R2 1 - 0x94080524, // 004B GETIDX R2 R2 K36 - 0x780A0001, // 004C JMPF R2 #004F - 0x8C080126, // 004D GETMET R2 R0 K38 - 0x7C080200, // 004E CALL R2 1 - 0xB80A0200, // 004F GETNGBL R2 K1 - 0x8C080523, // 0050 GETMET R2 R2 K35 - 0x7C080200, // 0051 CALL R2 1 - 0x94080524, // 0052 GETIDX R2 R2 K36 - 0x740A0005, // 0053 JMPT R2 #005A - 0xB80A0200, // 0054 GETNGBL R2 K1 - 0x8C080527, // 0055 GETMET R2 R2 K39 - 0x58100028, // 0056 LDCONST R4 K40 - 0x84140000, // 0057 CLOSURE R5 P0 - 0x58180029, // 0058 LDCONST R6 K41 - 0x7C080800, // 0059 CALL R2 4 - 0xB80A0200, // 005A GETNGBL R2 K1 - 0x8C080525, // 005B GETMET R2 R2 K37 - 0x7C080200, // 005C CALL R2 1 - 0x94080524, // 005D GETIDX R2 R2 K36 - 0x740A0005, // 005E JMPT R2 #0065 - 0xB80A0200, // 005F GETNGBL R2 K1 - 0x8C080527, // 0060 GETMET R2 R2 K39 - 0x5810002A, // 0061 LDCONST R4 K42 - 0x84140001, // 0062 CLOSURE R5 P1 - 0x58180029, // 0063 LDCONST R6 K41 - 0x7C080800, // 0064 CALL R2 4 - 0x8C08012B, // 0065 GETMET R2 R0 K43 - 0x7C080200, // 0066 CALL R2 1 - 0xB80A0200, // 0067 GETNGBL R2 K1 - 0x8C08052C, // 0068 GETMET R2 R2 K44 - 0x5C100000, // 0069 MOVE R4 R0 - 0x7C080400, // 006A CALL R2 2 - 0x8C08012D, // 006B GETMET R2 R0 K45 - 0x7C080200, // 006C CALL R2 1 - 0xA0000000, // 006D CLOSE R0 - 0x80000000, // 006E RET 0 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 }) ) ); @@ -2652,748 +2301,6 @@ be_local_closure(Matter_Device_find_plugin_by_endpoint, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: adjust_next_ep -********************************************************************/ -be_local_closure(Matter_Device_adjust_next_ep, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_config), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(next_ep), - /* K3 */ be_const_int(1), - /* K4 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(adjust_next_ep), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000A, // 0005 EXBLK 0 #0011 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x600C0009, // 0008 GETGBL R3 G9 - 0x5C100400, // 0009 MOVE R4 R2 - 0x7C0C0200, // 000A CALL R3 1 - 0x88100102, // 000B GETMBR R4 R0 K2 - 0x28100604, // 000C GE R4 R3 R4 - 0x78120001, // 000D JMPF R4 #0010 - 0x00100703, // 000E ADD R4 R3 K3 - 0x90020404, // 000F SETMBR R0 K2 R4 - 0x7001FFF4, // 0010 JMP #0006 - 0x58040004, // 0011 LDCONST R1 K4 - 0xAC040200, // 0012 CATCH R1 1 0 - 0xB0080000, // 0013 RAISE 2 R0 R0 - 0x80000000, // 0014 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_Device_every_50ms, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_const_int(1), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x00040301, // 0001 ADD R1 R1 K1 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: k2l_num -********************************************************************/ -be_local_closure(Matter_Device_k2l_num, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_const_int(1), - /* K5 */ be_const_int(0), - }), - be_str_weak(k2l_num), - &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x1C0C0003, // 0004 EQ R3 R0 R3 - 0x780E0000, // 0005 JMPF R3 #0007 - 0x80040400, // 0006 RET 1 R2 - 0x600C0010, // 0007 GETGBL R3 G16 - 0x8C100101, // 0008 GETMET R4 R0 K1 - 0x7C100200, // 0009 CALL R4 1 - 0x7C0C0200, // 000A CALL R3 1 - 0xA8020007, // 000B EXBLK 0 #0014 - 0x5C100600, // 000C MOVE R4 R3 - 0x7C100000, // 000D CALL R4 0 - 0x8C140502, // 000E GETMET R5 R2 K2 - 0x601C0009, // 000F GETGBL R7 G9 - 0x5C200800, // 0010 MOVE R8 R4 - 0x7C1C0200, // 0011 CALL R7 1 - 0x7C140400, // 0012 CALL R5 2 - 0x7001FFF7, // 0013 JMP #000C - 0x580C0003, // 0014 LDCONST R3 K3 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x6010000C, // 0018 GETGBL R4 G12 - 0x5C140400, // 0019 MOVE R5 R2 - 0x7C100200, // 001A CALL R4 1 - 0x04100904, // 001B SUB R4 R4 K4 - 0x40120804, // 001C CONNECT R4 K4 R4 - 0x7C0C0200, // 001D CALL R3 1 - 0xA8020010, // 001E EXBLK 0 #0030 - 0x5C100600, // 001F MOVE R4 R3 - 0x7C100000, // 0020 CALL R4 0 - 0x94140404, // 0021 GETIDX R5 R2 R4 - 0x5C180800, // 0022 MOVE R6 R4 - 0x241C0D05, // 0023 GT R7 R6 K5 - 0x781E0008, // 0024 JMPF R7 #002E - 0x041C0D04, // 0025 SUB R7 R6 K4 - 0x941C0407, // 0026 GETIDX R7 R2 R7 - 0x241C0E05, // 0027 GT R7 R7 R5 - 0x781E0004, // 0028 JMPF R7 #002E - 0x041C0D04, // 0029 SUB R7 R6 K4 - 0x941C0407, // 002A GETIDX R7 R2 R7 - 0x98080C07, // 002B SETIDX R2 R6 R7 - 0x04180D04, // 002C SUB R6 R6 K4 - 0x7001FFF4, // 002D JMP #0023 - 0x98080C05, // 002E SETIDX R2 R6 R5 - 0x7001FFEE, // 002F JMP #001F - 0x580C0003, // 0030 LDCONST R3 K3 - 0xAC0C0200, // 0031 CATCH R3 1 0 - 0xB0080000, // 0032 RAISE 2 R0 R0 - 0x80040400, // 0033 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: bridge_remove_endpoint -********************************************************************/ -be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(plugins_config), - /* K2 */ be_nested_str_weak(contains), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), - /* K6 */ be_const_int(3), - /* K7 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), - /* K8 */ be_const_int(2), - /* K9 */ be_nested_str_weak(remove), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_const_int(0), - /* K12 */ be_nested_str_weak(plugins), - /* K13 */ be_nested_str_weak(get_endpoint), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(clean_remotes), - /* K16 */ be_nested_str_weak(save_param), - /* K17 */ be_nested_str_weak(signal_endpoints_changed), - }), - be_str_weak(bridge_remove_endpoint), - &be_const_str_solidified, - ( &(const binstruction[58]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x600C0008, // 0001 GETGBL R3 G8 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C0C0200, // 0003 CALL R3 1 - 0x4C100000, // 0004 LDNIL R4 - 0x4C140000, // 0005 LDNIL R5 - 0x88180101, // 0006 GETMBR R6 R0 K1 - 0x8C180D02, // 0007 GETMET R6 R6 K2 - 0x5C200600, // 0008 MOVE R8 R3 - 0x7C180400, // 0009 CALL R6 2 - 0x741A0005, // 000A JMPT R6 #0011 - 0xB81A0600, // 000B GETNGBL R6 K3 - 0x8C180D04, // 000C GETMET R6 R6 K4 - 0x00220A03, // 000D ADD R8 K5 R3 - 0x58240006, // 000E LDCONST R9 K6 - 0x7C180600, // 000F CALL R6 3 - 0x80000C00, // 0010 RET 0 - 0xB81A0600, // 0011 GETNGBL R6 K3 - 0x8C180D04, // 0012 GETMET R6 R6 K4 - 0x60200018, // 0013 GETGBL R8 G24 - 0x58240007, // 0014 LDCONST R9 K7 - 0x5C280200, // 0015 MOVE R10 R1 - 0x7C200400, // 0016 CALL R8 2 - 0x58240008, // 0017 LDCONST R9 K8 - 0x7C180600, // 0018 CALL R6 3 - 0x88180101, // 0019 GETMBR R6 R0 K1 - 0x8C180D09, // 001A GETMET R6 R6 K9 - 0x5C200600, // 001B MOVE R8 R3 - 0x7C180400, // 001C CALL R6 2 - 0x50180200, // 001D LDBOOL R6 1 0 - 0x90021406, // 001E SETMBR R0 K10 R6 - 0x5818000B, // 001F LDCONST R6 K11 - 0x601C000C, // 0020 GETGBL R7 G12 - 0x8820010C, // 0021 GETMBR R8 R0 K12 - 0x7C1C0200, // 0022 CALL R7 1 - 0x141C0C07, // 0023 LT R7 R6 R7 - 0x781E000D, // 0024 JMPF R7 #0033 - 0x881C010C, // 0025 GETMBR R7 R0 K12 - 0x941C0E06, // 0026 GETIDX R7 R7 R6 - 0x8C1C0F0D, // 0027 GETMET R7 R7 K13 - 0x7C1C0200, // 0028 CALL R7 1 - 0x1C1C0207, // 0029 EQ R7 R1 R7 - 0x781E0005, // 002A JMPF R7 #0031 - 0x881C010C, // 002B GETMBR R7 R0 K12 - 0x8C1C0F09, // 002C GETMET R7 R7 K9 - 0x5C240C00, // 002D MOVE R9 R6 - 0x7C1C0400, // 002E CALL R7 2 - 0x70020002, // 002F JMP #0033 - 0x70020000, // 0030 JMP #0032 - 0x00180D0E, // 0031 ADD R6 R6 K14 - 0x7001FFEC, // 0032 JMP #0020 - 0x8C1C010F, // 0033 GETMET R7 R0 K15 - 0x7C1C0200, // 0034 CALL R7 1 - 0x8C1C0110, // 0035 GETMET R7 R0 K16 - 0x7C1C0200, // 0036 CALL R7 1 - 0x8C1C0111, // 0037 GETMET R7 R0 K17 - 0x7C1C0200, // 0038 CALL R7 1 - 0x80000000, // 0039 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_Device_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(remove_driver), - /* K2 */ be_nested_str_weak(udp_server), - /* K3 */ be_nested_str_weak(stop), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x88040102, // 0004 GETMBR R1 R0 K2 - 0x78060002, // 0005 JMPF R1 #0009 - 0x88040102, // 0006 GETMBR R1 R0 K2 - 0x8C040303, // 0007 GETMET R1 R1 K3 - 0x7C040200, // 0008 CALL R1 1 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_native_classes -********************************************************************/ -be_local_closure(Matter_Device_register_native_classes, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(string), - /* K2 */ be_nested_str_weak(members), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(get), - /* K5 */ be_nested_str_weak(class), - /* K6 */ be_nested_str_weak(find), - /* K7 */ be_nested_str_weak(Plugin_), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(register_plugin_class), - /* K10 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(register_native_classes), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xA4120200, // 0001 IMPORT R4 K1 - 0x60140010, // 0002 GETGBL R5 G16 - 0x8C180702, // 0003 GETMET R6 R3 K2 - 0xB8220600, // 0004 GETNGBL R8 K3 - 0x7C180400, // 0005 CALL R6 2 - 0x7C140200, // 0006 CALL R5 1 - 0xA8020014, // 0007 EXBLK 0 #001D - 0x5C180A00, // 0008 MOVE R6 R5 - 0x7C180000, // 0009 CALL R6 0 - 0x8C1C0704, // 000A GETMET R7 R3 K4 - 0xB8260600, // 000B GETNGBL R9 K3 - 0x5C280C00, // 000C MOVE R10 R6 - 0x7C1C0600, // 000D CALL R7 3 - 0x60200004, // 000E GETGBL R8 G4 - 0x5C240E00, // 000F MOVE R9 R7 - 0x7C200200, // 0010 CALL R8 1 - 0x1C201105, // 0011 EQ R8 R8 K5 - 0x78220008, // 0012 JMPF R8 #001C - 0x8C200906, // 0013 GETMET R8 R4 K6 - 0x5C280C00, // 0014 MOVE R10 R6 - 0x582C0007, // 0015 LDCONST R11 K7 - 0x7C200600, // 0016 CALL R8 3 - 0x1C201108, // 0017 EQ R8 R8 K8 - 0x78220002, // 0018 JMPF R8 #001C - 0x8C200109, // 0019 GETMET R8 R0 K9 - 0x5C280E00, // 001A MOVE R10 R7 - 0x7C200400, // 001B CALL R8 2 - 0x7001FFEA, // 001C JMP #0008 - 0x5814000A, // 001D LDCONST R5 K10 - 0xAC140200, // 001E CATCH R5 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x80000000, // 0020 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_commissioning_complete_deferred -********************************************************************/ -be_local_closure(Matter_Device_start_commissioning_complete_deferred, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 3, /* nstack */ - 0, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ - be_local_const_upval(1, 0), - be_local_const_upval(1, 1), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(start_commissioning_complete), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x68080001, // 0002 GETUPV R2 U1 - 0x7C000400, // 0003 CALL R0 2 - 0x80040000, // 0004 RET 1 R0 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(set_timer), - /* K2 */ be_const_int(0), - }), - be_str_weak(start_commissioning_complete_deferred), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x58100002, // 0002 LDCONST R4 K2 - 0x84140000, // 0003 CLOSURE R5 P0 - 0x7C080600, // 0004 CALL R2 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_send -********************************************************************/ -be_local_closure(Matter_Device_msg_send, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_server), - /* K1 */ be_nested_str_weak(send_UDP), - }), - be_str_weak(msg_send), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: conf_to_log -********************************************************************/ -be_local_closure(Matter_Device_conf_to_log, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Device), - /* K1 */ be_nested_str_weak(), - /* K2 */ be_nested_str_weak(k2l), - /* K3 */ be_nested_str_weak(type), - /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(conf_to_log), - &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x58080001, // 0001 LDCONST R2 K1 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x8C100302, // 0003 GETMET R4 R1 K2 - 0x5C180000, // 0004 MOVE R6 R0 - 0x7C100400, // 0005 CALL R4 2 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA802000B, // 0007 EXBLK 0 #0014 - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x1C140903, // 000A EQ R5 R4 K3 - 0x78160000, // 000B JMPF R5 #000D - 0x7001FFFA, // 000C JMP #0008 - 0x60140018, // 000D GETGBL R5 G24 - 0x58180004, // 000E LDCONST R6 K4 - 0x5C1C0800, // 000F MOVE R7 R4 - 0x94200004, // 0010 GETIDX R8 R0 R4 - 0x7C140600, // 0011 CALL R5 3 - 0x00080405, // 0012 ADD R2 R2 R5 - 0x7001FFF3, // 0013 JMP #0008 - 0x580C0005, // 0014 LDCONST R3 K5 - 0xAC0C0200, // 0015 CATCH R3 1 0 - 0xB0080000, // 0016 RAISE 2 R0 R0 - 0x80040400, // 0017 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_remotes_info -********************************************************************/ -be_local_closure(Matter_Device_update_remotes_info, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(http_remotes), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(get_info), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(stop_iteration), - /* K5 */ be_nested_str_weak(plugins_config_remotes), - }), - be_str_weak(update_remotes_info), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x60040013, // 0000 GETGBL R1 G19 - 0x7C040000, // 0001 CALL R1 0 - 0x88080100, // 0002 GETMBR R2 R0 K0 - 0x4C0C0000, // 0003 LDNIL R3 - 0x20080403, // 0004 NE R2 R2 R3 - 0x780A0018, // 0005 JMPF R2 #001F - 0x60080010, // 0006 GETGBL R2 G16 - 0x880C0100, // 0007 GETMBR R3 R0 K0 - 0x8C0C0701, // 0008 GETMET R3 R3 K1 - 0x7C0C0200, // 0009 CALL R3 1 - 0x7C080200, // 000A CALL R2 1 - 0xA802000F, // 000B EXBLK 0 #001C - 0x5C0C0400, // 000C MOVE R3 R2 - 0x7C0C0000, // 000D CALL R3 0 - 0x88100100, // 000E GETMBR R4 R0 K0 - 0x94100803, // 000F GETIDX R4 R4 R3 - 0x8C100902, // 0010 GETMET R4 R4 K2 - 0x7C100200, // 0011 CALL R4 1 - 0x4C140000, // 0012 LDNIL R5 - 0x20140805, // 0013 NE R5 R4 R5 - 0x78160005, // 0014 JMPF R5 #001B - 0x6014000C, // 0015 GETGBL R5 G12 - 0x5C180800, // 0016 MOVE R6 R4 - 0x7C140200, // 0017 CALL R5 1 - 0x24140B03, // 0018 GT R5 R5 K3 - 0x78160000, // 0019 JMPF R5 #001B - 0x98040604, // 001A SETIDX R1 R3 R4 - 0x7001FFEF, // 001B JMP #000C - 0x58080004, // 001C LDCONST R2 K4 - 0xAC080200, // 001D CATCH R2 1 0 - 0xB0080000, // 001E RAISE 2 R0 R0 - 0x90020A01, // 001F SETMBR R0 K5 R1 - 0x80040200, // 0020 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_stop_basic_commissioning, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(is_root_commissioning_open), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(publish_result), - /* K3 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A0_X7D_X7D), - /* K4 */ be_nested_str_weak(Matter), - /* K5 */ be_nested_str_weak(commissioning_open), - /* K6 */ be_nested_str_weak(mdns_remove_PASE), - /* K7 */ be_nested_str_weak(commissioning_iterations), - /* K8 */ be_nested_str_weak(commissioning_discriminator), - /* K9 */ be_nested_str_weak(commissioning_salt), - /* K10 */ be_nested_str_weak(commissioning_w0), - /* K11 */ be_nested_str_weak(commissioning_L), - /* K12 */ be_nested_str_weak(commissioning_admin_fabric), - }), - be_str_weak(stop_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x78060004, // 0002 JMPF R1 #0008 - 0xB8060200, // 0003 GETNGBL R1 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x4C040000, // 0008 LDNIL R1 - 0x90020A01, // 0009 SETMBR R0 K5 R1 - 0x8C040106, // 000A GETMET R1 R0 K6 - 0x7C040200, // 000B CALL R1 1 - 0x4C040000, // 000C LDNIL R1 - 0x90020E01, // 000D SETMBR R0 K7 R1 - 0x4C040000, // 000E LDNIL R1 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0x4C040000, // 0010 LDNIL R1 - 0x90021201, // 0011 SETMBR R0 K9 R1 - 0x4C040000, // 0012 LDNIL R1 - 0x90021401, // 0013 SETMBR R0 K10 R1 - 0x4C040000, // 0014 LDNIL R1 - 0x90021601, // 0015 SETMBR R0 K11 R1 - 0x4C040000, // 0016 LDNIL R1 - 0x90021801, // 0017 SETMBR R0 K12 R1 - 0x80000000, // 0018 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_plugin_class_displayname -********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(NAME), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(get_plugin_class_displayname), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: generate_random_passcode -********************************************************************/ -be_local_closure(Matter_Device_generate_random_passcode, /* name */ - be_nested_proto( - 7, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(random), - /* K2 */ be_nested_str_weak(get), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(134217727), - /* K5 */ be_const_int(99999998), - /* K6 */ be_nested_str_weak(PASSCODE_INVALID), - /* K7 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(generate_random_passcode), - &be_const_str_solidified, - ( &(const binstruction[35]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x780E001D, // 0003 JMPF R3 #0022 - 0x8C0C0301, // 0004 GETMET R3 R1 K1 - 0x54160003, // 0005 LDINT R5 4 - 0x7C0C0400, // 0006 CALL R3 2 - 0x8C0C0702, // 0007 GETMET R3 R3 K2 - 0x58140003, // 0008 LDCONST R5 K3 - 0x541A0003, // 0009 LDINT R6 4 - 0x7C0C0600, // 000A CALL R3 3 - 0x2C0C0704, // 000B AND R3 R3 K4 - 0x5C080600, // 000C MOVE R2 R3 - 0x240C0505, // 000D GT R3 R2 K5 - 0x780E0000, // 000E JMPF R3 #0010 - 0x7001FFF1, // 000F JMP #0002 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100106, // 0011 GETMBR R4 R0 K6 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA8020005, // 0013 EXBLK 0 #001A - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x1C140404, // 0016 EQ R5 R2 R4 - 0x78160000, // 0017 JMPF R5 #0019 - 0x4C080000, // 0018 LDNIL R2 - 0x7001FFF9, // 0019 JMP #0014 - 0x580C0007, // 001A LDCONST R3 K7 - 0xAC0C0200, // 001B CATCH R3 1 0 - 0xB0080000, // 001C RAISE 2 R0 R0 - 0x4C0C0000, // 001D LDNIL R3 - 0x200C0403, // 001E NE R3 R2 R3 - 0x780E0000, // 001F JMPF R3 #0021 - 0x80040400, // 0020 RET 1 R2 - 0x7001FFDF, // 0021 JMP #0002 - 0x80000000, // 0022 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: mdns_remove_op_discovery ********************************************************************/ @@ -3522,536 +2429,15 @@ be_local_closure(Matter_Device_mdns_remove_op_discovery, /* name */ /******************************************************************** -** Solidified function: clean_remotes +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Device_clean_remotes, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(http_remotes), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(stop_iteration), - /* K4 */ be_nested_str_weak(plugins), - /* K5 */ be_nested_str_weak(get), - /* K6 */ be_nested_str_weak(http_remote), - /* K7 */ be_nested_str_weak(find), - /* K8 */ be_const_int(1), - /* K9 */ be_nested_str_weak(keys), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20remove_X20unused_X20remote_X3A_X20), - /* K14 */ be_nested_str_weak(addr), - /* K15 */ be_const_int(3), - /* K16 */ be_nested_str_weak(close), - /* K17 */ be_nested_str_weak(remove), - }), - be_str_weak(clean_remotes), - &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x780A004C, // 0002 JMPF R2 #0050 - 0x60080013, // 0003 GETGBL R2 G19 - 0x7C080000, // 0004 CALL R2 0 - 0x600C0010, // 0005 GETGBL R3 G16 - 0x88100101, // 0006 GETMBR R4 R0 K1 - 0x7C0C0200, // 0007 CALL R3 1 - 0xA8020003, // 0008 EXBLK 0 #000D - 0x5C100600, // 0009 MOVE R4 R3 - 0x7C100000, // 000A CALL R4 0 - 0x98080902, // 000B SETIDX R2 R4 K2 - 0x7001FFFB, // 000C JMP #0009 - 0x580C0003, // 000D LDCONST R3 K3 - 0xAC0C0200, // 000E CATCH R3 1 0 - 0xB0080000, // 000F RAISE 2 R0 R0 - 0x600C0010, // 0010 GETGBL R3 G16 - 0x88100104, // 0011 GETMBR R4 R0 K4 - 0x7C0C0200, // 0012 CALL R3 1 - 0xA802000F, // 0013 EXBLK 0 #0024 - 0x5C100600, // 0014 MOVE R4 R3 - 0x7C100000, // 0015 CALL R4 0 - 0x8C140305, // 0016 GETMET R5 R1 K5 - 0x5C1C0800, // 0017 MOVE R7 R4 - 0x58200006, // 0018 LDCONST R8 K6 - 0x7C140600, // 0019 CALL R5 3 - 0x4C180000, // 001A LDNIL R6 - 0x20180A06, // 001B NE R6 R5 R6 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180507, // 001D GETMET R6 R2 K7 - 0x5C200A00, // 001E MOVE R8 R5 - 0x58240002, // 001F LDCONST R9 K2 - 0x7C180600, // 0020 CALL R6 3 - 0x00180D08, // 0021 ADD R6 R6 K8 - 0x98080A06, // 0022 SETIDX R2 R5 R6 - 0x7001FFEF, // 0023 JMP #0014 - 0x580C0003, // 0024 LDCONST R3 K3 - 0xAC0C0200, // 0025 CATCH R3 1 0 - 0xB0080000, // 0026 RAISE 2 R0 R0 - 0x600C0012, // 0027 GETGBL R3 G18 - 0x7C0C0000, // 0028 CALL R3 0 - 0x60100010, // 0029 GETGBL R4 G16 - 0x8C140509, // 002A GETMET R5 R2 K9 - 0x7C140200, // 002B CALL R5 1 - 0x7C100200, // 002C CALL R4 1 - 0xA8020008, // 002D EXBLK 0 #0037 - 0x5C140800, // 002E MOVE R5 R4 - 0x7C140000, // 002F CALL R5 0 - 0x94180405, // 0030 GETIDX R6 R2 R5 - 0x1C180D02, // 0031 EQ R6 R6 K2 - 0x781A0002, // 0032 JMPF R6 #0036 - 0x8C18070A, // 0033 GETMET R6 R3 K10 - 0x5C200A00, // 0034 MOVE R8 R5 - 0x7C180400, // 0035 CALL R6 2 - 0x7001FFF6, // 0036 JMP #002E - 0x58100003, // 0037 LDCONST R4 K3 - 0xAC100200, // 0038 CATCH R4 1 0 - 0xB0080000, // 0039 RAISE 2 R0 R0 - 0x60100010, // 003A GETGBL R4 G16 - 0x5C140600, // 003B MOVE R5 R3 - 0x7C100200, // 003C CALL R4 1 - 0xA802000E, // 003D EXBLK 0 #004D - 0x5C140800, // 003E MOVE R5 R4 - 0x7C140000, // 003F CALL R5 0 - 0xB81A1600, // 0040 GETNGBL R6 K11 - 0x8C180D0C, // 0041 GETMET R6 R6 K12 - 0x88200B0E, // 0042 GETMBR R8 R5 K14 - 0x00221A08, // 0043 ADD R8 K13 R8 - 0x5824000F, // 0044 LDCONST R9 K15 - 0x7C180600, // 0045 CALL R6 3 - 0x8C180B10, // 0046 GETMET R6 R5 K16 - 0x7C180200, // 0047 CALL R6 1 - 0x88180101, // 0048 GETMBR R6 R0 K1 - 0x8C180D11, // 0049 GETMET R6 R6 K17 - 0x88200B0E, // 004A GETMBR R8 R5 K14 - 0x7C180400, // 004B CALL R6 2 - 0x7001FFF0, // 004C JMP #003E - 0x58100003, // 004D LDCONST R4 K3 - 0xAC100200, // 004E CATCH R4 1 0 - 0xB0080000, // 004F RAISE 2 R0 R0 - 0x80000000, // 0050 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_plugin_class -********************************************************************/ -be_local_closure(Matter_Device_register_plugin_class, /* name */ +be_local_closure(Matter_Device_init, /* name */ be_nested_proto( 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(introspect), - /* K1 */ be_nested_str_weak(get), - /* K2 */ be_nested_str_weak(TYPE), - /* K3 */ be_nested_str_weak(plugins_classes), - }), - be_str_weak(register_plugin_class), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xA40A0000, // 0000 IMPORT R2 K0 - 0x8C0C0501, // 0001 GETMET R3 R2 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x88100103, // 0006 GETMBR R4 R0 K3 - 0x98100601, // 0007 SETIDX R4 R3 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_root_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(PASE_TIMEOUT), - /* K1 */ be_nested_str_weak(compute_manual_pairing_code), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), - /* K5 */ be_const_int(2), - /* K6 */ be_nested_str_weak(compute_qrcode_content), - /* K7 */ be_nested_str_weak(publish_result), - /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), - /* K9 */ be_nested_str_weak(Matter), - /* K10 */ be_nested_str_weak(_compute_pbkdf), - /* K11 */ be_nested_str_weak(root_passcode), - /* K12 */ be_nested_str_weak(root_iterations), - /* K13 */ be_nested_str_weak(root_salt), - /* K14 */ be_nested_str_weak(start_basic_commissioning), - /* K15 */ be_nested_str_weak(root_discriminator), - /* K16 */ be_nested_str_weak(root_w0), - /* K17 */ be_nested_str_weak(root_L), - }), - be_str_weak(start_root_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x88040100, // 0003 GETMBR R1 R0 K0 - 0x8C080101, // 0004 GETMET R2 R0 K1 - 0x7C080200, // 0005 CALL R2 1 - 0xB80E0400, // 0006 GETNGBL R3 K2 - 0x8C0C0703, // 0007 GETMET R3 R3 K3 - 0x60140018, // 0008 GETGBL R5 G24 - 0x58180004, // 0009 LDCONST R6 K4 - 0x5C1C0400, // 000A MOVE R7 R2 - 0x7C140400, // 000B CALL R5 2 - 0x58180005, // 000C LDCONST R6 K5 - 0x7C0C0600, // 000D CALL R3 3 - 0x8C0C0106, // 000E GETMET R3 R0 K6 - 0x7C0C0200, // 000F CALL R3 1 - 0xB8120400, // 0010 GETNGBL R4 K2 - 0x8C100907, // 0011 GETMET R4 R4 K7 - 0x60180018, // 0012 GETGBL R6 G24 - 0x581C0008, // 0013 LDCONST R7 K8 - 0x5C200400, // 0014 MOVE R8 R2 - 0x5C240600, // 0015 MOVE R9 R3 - 0x7C180600, // 0016 CALL R6 3 - 0x581C0009, // 0017 LDCONST R7 K9 - 0x7C100600, // 0018 CALL R4 3 - 0x8C10010A, // 0019 GETMET R4 R0 K10 - 0x8818010B, // 001A GETMBR R6 R0 K11 - 0x881C010C, // 001B GETMBR R7 R0 K12 - 0x8820010D, // 001C GETMBR R8 R0 K13 - 0x7C100800, // 001D CALL R4 4 - 0x8C10010E, // 001E GETMET R4 R0 K14 - 0x5C180200, // 001F MOVE R6 R1 - 0x881C010C, // 0020 GETMBR R7 R0 K12 - 0x8820010F, // 0021 GETMBR R8 R0 K15 - 0x8824010D, // 0022 GETMBR R9 R0 K13 - 0x88280110, // 0023 GETMBR R10 R0 K16 - 0x882C0111, // 0024 GETMBR R11 R0 K17 - 0x4C300000, // 0025 LDNIL R12 - 0x7C101000, // 0026 CALL R4 8 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: event_fabrics_saved -********************************************************************/ -be_local_closure(Matter_Device_event_fabrics_saved, /* name */ - be_nested_proto( - 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(count_active_fabrics), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(plugins_persist), - /* K4 */ be_nested_str_weak(save_param), - }), - be_str_weak(event_fabrics_saved), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x24040302, // 0003 GT R1 R1 K2 - 0x78060005, // 0004 JMPF R1 #000B - 0x88040103, // 0005 GETMBR R1 R0 K3 - 0x74060003, // 0006 JMPT R1 #000B - 0x50040200, // 0007 LDBOOL R1 1 0 - 0x90020601, // 0008 SETMBR R0 K3 R1 - 0x8C040104, // 0009 GETMET R1 R0 K4 - 0x7C040200, // 000A CALL R1 1 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_announce_op_discovery_all_fabrics -********************************************************************/ -be_local_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_announce_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_announce_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: mdns_remove_PASE -********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_PASE, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns), - /* K1 */ be_nested_str_weak(mdns_pase_eth), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eremove_service_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), - /* K5 */ be_nested_str_weak(_matterc), - /* K6 */ be_nested_str_weak(_udp), - /* K7 */ be_nested_str_weak(commissioning_instance_eth), - /* K8 */ be_nested_str_weak(hostname_eth), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(MTR_X3A_X20remove_X20mDNS_X20on_X20_X25s_X20_X27_X25s_X27), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(remove_service), - /* K13 */ be_nested_str_weak(mdns_pase_wifi), - /* K14 */ be_nested_str_weak(commissioning_instance_wifi), - /* K15 */ be_nested_str_weak(hostname_wifi), - /* K16 */ be_nested_str_weak(wifi), - /* K17 */ be_nested_str_weak(MTR_X3A_X20Exception), - /* K18 */ be_nested_str_weak(_X7C), - /* K19 */ be_const_int(2), - }), - be_str_weak(mdns_remove_PASE), - &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0xA802003D, // 0001 EXBLK 0 #0040 - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x780A001B, // 0003 JMPF R2 #0020 - 0xB80A0400, // 0004 GETNGBL R2 K2 - 0x8C080503, // 0005 GETMET R2 R2 K3 - 0x60100018, // 0006 GETGBL R4 G24 - 0x58140004, // 0007 LDCONST R5 K4 - 0x58180005, // 0008 LDCONST R6 K5 - 0x581C0006, // 0009 LDCONST R7 K6 - 0x88200107, // 000A GETMBR R8 R0 K7 - 0x88240108, // 000B GETMBR R9 R0 K8 - 0x7C100A00, // 000C CALL R4 5 - 0x58140009, // 000D LDCONST R5 K9 - 0x7C080600, // 000E CALL R2 3 - 0xB80A0400, // 000F GETNGBL R2 K2 - 0x8C080503, // 0010 GETMET R2 R2 K3 - 0x60100018, // 0011 GETGBL R4 G24 - 0x5814000A, // 0012 LDCONST R5 K10 - 0x5818000B, // 0013 LDCONST R6 K11 - 0x881C0107, // 0014 GETMBR R7 R0 K7 - 0x7C100600, // 0015 CALL R4 3 - 0x58140009, // 0016 LDCONST R5 K9 - 0x7C080600, // 0017 CALL R2 3 - 0x50080000, // 0018 LDBOOL R2 0 0 - 0x90020202, // 0019 SETMBR R0 K1 R2 - 0x8C08030C, // 001A GETMET R2 R1 K12 - 0x58100005, // 001B LDCONST R4 K5 - 0x58140006, // 001C LDCONST R5 K6 - 0x88180107, // 001D GETMBR R6 R0 K7 - 0x881C0108, // 001E GETMBR R7 R0 K8 - 0x7C080A00, // 001F CALL R2 5 - 0x8808010D, // 0020 GETMBR R2 R0 K13 - 0x780A001B, // 0021 JMPF R2 #003E - 0xB80A0400, // 0022 GETNGBL R2 K2 - 0x8C080503, // 0023 GETMET R2 R2 K3 - 0x60100018, // 0024 GETGBL R4 G24 - 0x58140004, // 0025 LDCONST R5 K4 - 0x58180005, // 0026 LDCONST R6 K5 - 0x581C0006, // 0027 LDCONST R7 K6 - 0x8820010E, // 0028 GETMBR R8 R0 K14 - 0x8824010F, // 0029 GETMBR R9 R0 K15 - 0x7C100A00, // 002A CALL R4 5 - 0x58140009, // 002B LDCONST R5 K9 - 0x7C080600, // 002C CALL R2 3 - 0xB80A0400, // 002D GETNGBL R2 K2 - 0x8C080503, // 002E GETMET R2 R2 K3 - 0x60100018, // 002F GETGBL R4 G24 - 0x5814000A, // 0030 LDCONST R5 K10 - 0x58180010, // 0031 LDCONST R6 K16 - 0x881C010E, // 0032 GETMBR R7 R0 K14 - 0x7C100600, // 0033 CALL R4 3 - 0x58140009, // 0034 LDCONST R5 K9 - 0x7C080600, // 0035 CALL R2 3 - 0x50080000, // 0036 LDBOOL R2 0 0 - 0x90021A02, // 0037 SETMBR R0 K13 R2 - 0x8C08030C, // 0038 GETMET R2 R1 K12 - 0x58100005, // 0039 LDCONST R4 K5 - 0x58140006, // 003A LDCONST R5 K6 - 0x8818010E, // 003B GETMBR R6 R0 K14 - 0x881C010F, // 003C GETMBR R7 R0 K15 - 0x7C080A00, // 003D CALL R2 5 - 0xA8040001, // 003E EXBLK 1 1 - 0x70020010, // 003F JMP #0051 - 0xAC080002, // 0040 CATCH R2 0 2 - 0x7002000D, // 0041 JMP #0050 - 0xB8120400, // 0042 GETNGBL R4 K2 - 0x8C100903, // 0043 GETMET R4 R4 K3 - 0x60180008, // 0044 GETGBL R6 G8 - 0x5C1C0400, // 0045 MOVE R7 R2 - 0x7C180200, // 0046 CALL R6 1 - 0x001A2206, // 0047 ADD R6 K17 R6 - 0x00180D12, // 0048 ADD R6 R6 K18 - 0x601C0008, // 0049 GETGBL R7 G8 - 0x5C200600, // 004A MOVE R8 R3 - 0x7C1C0200, // 004B CALL R7 1 - 0x00180C07, // 004C ADD R6 R6 R7 - 0x581C0013, // 004D LDCONST R7 K19 - 0x7C100600, // 004E CALL R4 3 - 0x70020000, // 004F JMP #0051 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x80000000, // 0051 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: compute_manual_pairing_code -********************************************************************/ -be_local_closure(Matter_Device_compute_manual_pairing_code, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(root_discriminator), - /* K1 */ be_nested_str_weak(root_passcode), - /* K2 */ be_nested_str_weak(_X251i_X2505i_X2504i), - /* K3 */ be_nested_str_weak(matter), - /* K4 */ be_nested_str_weak(Verhoeff), - /* K5 */ be_nested_str_weak(checksum), - }), - be_str_weak(compute_manual_pairing_code), - &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x540A0FFE, // 0001 LDINT R2 4095 - 0x2C040202, // 0002 AND R1 R1 R2 - 0x540A0009, // 0003 LDINT R2 10 - 0x3C040202, // 0004 SHR R1 R1 R2 - 0x88080100, // 0005 GETMBR R2 R0 K0 - 0x540E02FF, // 0006 LDINT R3 768 - 0x2C080403, // 0007 AND R2 R2 R3 - 0x540E0005, // 0008 LDINT R3 6 - 0x38080403, // 0009 SHL R2 R2 R3 - 0x880C0101, // 000A GETMBR R3 R0 K1 - 0x54123FFE, // 000B LDINT R4 16383 - 0x2C0C0604, // 000C AND R3 R3 R4 - 0x30080403, // 000D OR R2 R2 R3 - 0x880C0101, // 000E GETMBR R3 R0 K1 - 0x5412000D, // 000F LDINT R4 14 - 0x3C0C0604, // 0010 SHR R3 R3 R4 - 0x60100018, // 0011 GETGBL R4 G24 - 0x58140002, // 0012 LDCONST R5 K2 - 0x5C180200, // 0013 MOVE R6 R1 - 0x5C1C0400, // 0014 MOVE R7 R2 - 0x5C200600, // 0015 MOVE R8 R3 - 0x7C100800, // 0016 CALL R4 4 - 0xB8160600, // 0017 GETNGBL R5 K3 - 0x88140B04, // 0018 GETMBR R5 R5 K4 - 0x8C140B05, // 0019 GETMET R5 R5 K5 - 0x5C1C0800, // 001A MOVE R7 R4 - 0x7C140400, // 001B CALL R5 2 - 0x00100805, // 001C ADD R4 R4 R5 - 0x80040800, // 001D RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start_basic_commissioning -********************************************************************/ -be_local_closure(Matter_Device_start_basic_commissioning, /* name */ - be_nested_proto( - 13, /* nstack */ - 8, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 2]) { be_nested_proto( @@ -4065,11 +2451,12 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Wifi_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, @@ -4080,7 +2467,7 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ 0xB8020200, // 0003 GETNGBL R0 K1 0x8C000102, // 0004 GETMET R0 R0 K2 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 + 0x580C0004, // 0006 LDCONST R3 K4 0x7C000600, // 0007 CALL R0 3 0x80000000, // 0008 RET 0 }) @@ -4096,11 +2483,12 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(mdns_announce_PASE), + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(start), /* K1 */ be_nested_str_weak(tasmota), /* K2 */ be_nested_str_weak(remove_rule), /* K3 */ be_nested_str_weak(Eth_X23Connected), + /* K4 */ be_nested_str_weak(matter_start), }), be_str_weak(_anonymous_), &be_const_str_solidified, @@ -4111,210 +2499,176 @@ be_local_closure(Matter_Device_start_basic_commissioning, /* name */ 0xB8020200, // 0003 GETNGBL R0 K1 0x8C000102, // 0004 GETMET R0 R0 K2 0x58080003, // 0005 LDCONST R2 K3 - 0x580C0000, // 0006 LDCONST R3 K0 + 0x580C0004, // 0006 LDCONST R3 K4 0x7C000600, // 0007 CALL R0 3 0x80000000, // 0008 RET 0 }) ), }), 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(commissioning_open), + ( &(const bvalue[46]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(commissioning_iterations), - /* K4 */ be_nested_str_weak(commissioning_discriminator), - /* K5 */ be_nested_str_weak(commissioning_salt), - /* K6 */ be_nested_str_weak(commissioning_w0), - /* K7 */ be_nested_str_weak(commissioning_L), - /* K8 */ be_nested_str_weak(commissioning_admin_fabric), - /* K9 */ be_nested_str_weak(wifi), - /* K10 */ be_nested_str_weak(up), - /* K11 */ be_nested_str_weak(eth), - /* K12 */ be_nested_str_weak(mdns_announce_PASE), - /* K13 */ be_nested_str_weak(add_rule), - /* K14 */ be_nested_str_weak(Wifi_X23Connected), - /* K15 */ be_nested_str_weak(Eth_X23Connected), - }), - be_str_weak(start_basic_commissioning), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xB8220200, // 0000 GETNGBL R8 K1 - 0x8C201102, // 0001 GETMET R8 R8 K2 - 0x7C200200, // 0002 CALL R8 1 - 0x542603E7, // 0003 LDINT R9 1000 - 0x08240209, // 0004 MUL R9 R1 R9 - 0x00201009, // 0005 ADD R8 R8 R9 - 0x90020008, // 0006 SETMBR R0 K0 R8 - 0x90020602, // 0007 SETMBR R0 K3 R2 - 0x90020803, // 0008 SETMBR R0 K4 R3 - 0x90020A04, // 0009 SETMBR R0 K5 R4 - 0x90020C05, // 000A SETMBR R0 K6 R5 - 0x90020E06, // 000B SETMBR R0 K7 R6 - 0x90021007, // 000C SETMBR R0 K8 R7 - 0xB8220200, // 000D GETNGBL R8 K1 - 0x8C201109, // 000E GETMET R8 R8 K9 - 0x7C200200, // 000F CALL R8 1 - 0x9420110A, // 0010 GETIDX R8 R8 K10 - 0x74220004, // 0011 JMPT R8 #0017 - 0xB8220200, // 0012 GETNGBL R8 K1 - 0x8C20110B, // 0013 GETMET R8 R8 K11 - 0x7C200200, // 0014 CALL R8 1 - 0x9420110A, // 0015 GETIDX R8 R8 K10 - 0x78220002, // 0016 JMPF R8 #001A - 0x8C20010C, // 0017 GETMET R8 R0 K12 - 0x7C200200, // 0018 CALL R8 1 - 0x7002000B, // 0019 JMP #0026 - 0xB8220200, // 001A GETNGBL R8 K1 - 0x8C20110D, // 001B GETMET R8 R8 K13 - 0x5828000E, // 001C LDCONST R10 K14 - 0x842C0000, // 001D CLOSURE R11 P0 - 0x5830000C, // 001E LDCONST R12 K12 - 0x7C200800, // 001F CALL R8 4 - 0xB8220200, // 0020 GETNGBL R8 K1 - 0x8C20110D, // 0021 GETMET R8 R8 K13 - 0x5828000F, // 0022 LDCONST R10 K15 - 0x842C0001, // 0023 CLOSURE R11 P1 - 0x5830000C, // 0024 LDCONST R12 K12 - 0x7C200800, // 0025 CALL R8 4 - 0xA0000000, // 0026 CLOSE R0 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: save_param -********************************************************************/ -be_local_closure(Matter_Device_save_param, /* name */ - be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(update_remotes_info), - /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), - /* K3 */ be_nested_str_weak(root_discriminator), - /* K4 */ be_nested_str_weak(root_passcode), - /* K5 */ be_nested_str_weak(ipv4only), - /* K6 */ be_nested_str_weak(true), - /* K7 */ be_nested_str_weak(false), - /* K8 */ be_nested_str_weak(disable_bridge_mode), - /* K9 */ be_nested_str_weak(next_ep), - /* K10 */ be_nested_str_weak(plugins_persist), - /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), - /* K12 */ be_nested_str_weak(dump), - /* K13 */ be_nested_str_weak(plugins_config), + /* K2 */ be_nested_str_weak(get_option), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(MATTER_OPTION), + /* K5 */ be_nested_str_weak(UI), + /* K6 */ be_nested_str_weak(profiler), + /* K7 */ be_nested_str_weak(Profiler), + /* K8 */ be_nested_str_weak(started), + /* K9 */ be_nested_str_weak(tick), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(plugins), + /* K12 */ be_nested_str_weak(plugins_persist), + /* K13 */ be_nested_str_weak(plugins_classes), /* K14 */ be_nested_str_weak(plugins_config_remotes), - /* K15 */ be_const_int(0), - /* K16 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), - /* K17 */ be_nested_str_weak(_X7D), - /* K18 */ be_nested_str_weak(FILENAME), - /* K19 */ be_nested_str_weak(w), - /* K20 */ be_nested_str_weak(write), - /* K21 */ be_nested_str_weak(close), - /* K22 */ be_nested_str_weak(tasmota), - /* K23 */ be_nested_str_weak(log), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), - /* K25 */ be_nested_str_weak(_X20and_X20configuration), - /* K26 */ be_nested_str_weak(), - /* K27 */ be_const_int(2), - /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K29 */ be_nested_str_weak(_X7C), + /* K15 */ be_nested_str_weak(register_native_classes), + /* K16 */ be_nested_str_weak(vendorid), + /* K17 */ be_nested_str_weak(VENDOR_ID), + /* K18 */ be_nested_str_weak(productid), + /* K19 */ be_nested_str_weak(PRODUCT_ID), + /* K20 */ be_nested_str_weak(root_iterations), + /* K21 */ be_nested_str_weak(PBKDF_ITERATIONS), + /* K22 */ be_nested_str_weak(next_ep), + /* K23 */ be_const_int(1), + /* K24 */ be_nested_str_weak(root_salt), + /* K25 */ be_nested_str_weak(random), + /* K26 */ be_nested_str_weak(ipv4only), + /* K27 */ be_nested_str_weak(disable_bridge_mode), + /* K28 */ be_nested_str_weak(load_param), + /* K29 */ be_nested_str_weak(sessions), + /* K30 */ be_nested_str_weak(Session_Store), + /* K31 */ be_nested_str_weak(load_fabrics), + /* K32 */ be_nested_str_weak(message_handler), + /* K33 */ be_nested_str_weak(MessageHandler), + /* K34 */ be_nested_str_weak(ui), + /* K35 */ be_nested_str_weak(wifi), + /* K36 */ be_nested_str_weak(up), + /* K37 */ be_nested_str_weak(eth), + /* K38 */ be_nested_str_weak(start), + /* K39 */ be_nested_str_weak(add_rule), + /* K40 */ be_nested_str_weak(Wifi_X23Connected), + /* K41 */ be_nested_str_weak(matter_start), + /* K42 */ be_nested_str_weak(Eth_X23Connected), + /* K43 */ be_nested_str_weak(_init_basic_commissioning), + /* K44 */ be_nested_str_weak(add_driver), + /* K45 */ be_nested_str_weak(register_commands), }), - be_str_weak(save_param), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ + ( &(const binstruction[112]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 - 0x8C080101, // 0001 GETMET R2 R0 K1 - 0x7C080200, // 0002 CALL R2 1 - 0x60080018, // 0003 GETGBL R2 G24 - 0x580C0002, // 0004 LDCONST R3 K2 - 0x88100103, // 0005 GETMBR R4 R0 K3 - 0x88140104, // 0006 GETMBR R5 R0 K4 - 0x88180105, // 0007 GETMBR R6 R0 K5 - 0x781A0001, // 0008 JMPF R6 #000B - 0x58180006, // 0009 LDCONST R6 K6 - 0x70020000, // 000A JMP #000C - 0x58180007, // 000B LDCONST R6 K7 - 0x881C0108, // 000C GETMBR R7 R0 K8 - 0x781E0001, // 000D JMPF R7 #0010 - 0x581C0006, // 000E LDCONST R7 K6 - 0x70020000, // 000F JMP #0011 - 0x581C0007, // 0010 LDCONST R7 K7 - 0x88200109, // 0011 GETMBR R8 R0 K9 - 0x7C080C00, // 0012 CALL R2 6 - 0x880C010A, // 0013 GETMBR R3 R0 K10 - 0x780E000E, // 0014 JMPF R3 #0024 - 0x0008050B, // 0015 ADD R2 R2 K11 - 0x8C0C030C, // 0016 GETMET R3 R1 K12 - 0x8814010D, // 0017 GETMBR R5 R0 K13 - 0x7C0C0400, // 0018 CALL R3 2 - 0x00080403, // 0019 ADD R2 R2 R3 - 0x600C000C, // 001A GETGBL R3 G12 - 0x8810010E, // 001B GETMBR R4 R0 K14 - 0x7C0C0200, // 001C CALL R3 1 - 0x240C070F, // 001D GT R3 R3 K15 - 0x780E0004, // 001E JMPF R3 #0024 - 0x00080510, // 001F ADD R2 R2 K16 - 0x8C0C030C, // 0020 GETMET R3 R1 K12 - 0x8814010E, // 0021 GETMBR R5 R0 K14 - 0x7C0C0400, // 0022 CALL R3 2 - 0x00080403, // 0023 ADD R2 R2 R3 - 0x00080511, // 0024 ADD R2 R2 K17 - 0xA8020018, // 0025 EXBLK 0 #003F - 0x600C0011, // 0026 GETGBL R3 G17 - 0x88100112, // 0027 GETMBR R4 R0 K18 - 0x58140013, // 0028 LDCONST R5 K19 - 0x7C0C0400, // 0029 CALL R3 2 - 0x8C100714, // 002A GETMET R4 R3 K20 - 0x5C180400, // 002B MOVE R6 R2 - 0x7C100400, // 002C CALL R4 2 - 0x8C100715, // 002D GETMET R4 R3 K21 - 0x7C100200, // 002E CALL R4 1 - 0xB8122C00, // 002F GETNGBL R4 K22 - 0x8C100917, // 0030 GETMET R4 R4 K23 - 0x60180018, // 0031 GETGBL R6 G24 - 0x581C0018, // 0032 LDCONST R7 K24 - 0x8820010A, // 0033 GETMBR R8 R0 K10 - 0x78220001, // 0034 JMPF R8 #0037 - 0x58200019, // 0035 LDCONST R8 K25 - 0x70020000, // 0036 JMP #0038 - 0x5820001A, // 0037 LDCONST R8 K26 - 0x7C180400, // 0038 CALL R6 2 - 0x581C001B, // 0039 LDCONST R7 K27 - 0x7C100600, // 003A CALL R4 3 - 0xA8040001, // 003B EXBLK 1 1 - 0x80040400, // 003C RET 1 R2 - 0xA8040001, // 003D EXBLK 1 1 - 0x70020011, // 003E JMP #0051 - 0xAC0C0002, // 003F CATCH R3 0 2 - 0x7002000E, // 0040 JMP #0050 - 0xB8162C00, // 0041 GETNGBL R5 K22 - 0x8C140B17, // 0042 GETMET R5 R5 K23 - 0x601C0008, // 0043 GETGBL R7 G8 - 0x5C200600, // 0044 MOVE R8 R3 - 0x7C1C0200, // 0045 CALL R7 1 - 0x001E3807, // 0046 ADD R7 K28 R7 - 0x001C0F1D, // 0047 ADD R7 R7 K29 - 0x60200008, // 0048 GETGBL R8 G8 - 0x5C240800, // 0049 MOVE R9 R4 - 0x7C200200, // 004A CALL R8 1 - 0x001C0E08, // 004B ADD R7 R7 R8 - 0x5820001B, // 004C LDCONST R8 K27 - 0x7C140600, // 004D CALL R5 3 - 0x80040400, // 004E RET 1 R2 - 0x70020000, // 004F JMP #0051 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x80000000, // 0051 RET 0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0xB8120600, // 0003 GETNGBL R4 K3 + 0x88100904, // 0004 GETMBR R4 R4 K4 + 0x7C080400, // 0005 CALL R2 2 + 0x740A0004, // 0006 JMPT R2 #000C + 0xB80A0600, // 0007 GETNGBL R2 K3 + 0x8C080505, // 0008 GETMET R2 R2 K5 + 0x5C100000, // 0009 MOVE R4 R0 + 0x7C080400, // 000A CALL R2 2 + 0x80000400, // 000B RET 0 + 0xB80A0600, // 000C GETNGBL R2 K3 + 0xB80E0600, // 000D GETNGBL R3 K3 + 0x8C0C0707, // 000E GETMET R3 R3 K7 + 0x7C0C0200, // 000F CALL R3 1 + 0x900A0C03, // 0010 SETMBR R2 K6 R3 + 0x50080000, // 0011 LDBOOL R2 0 0 + 0x90021002, // 0012 SETMBR R0 K8 R2 + 0x9002130A, // 0013 SETMBR R0 K9 K10 + 0x60080012, // 0014 GETGBL R2 G18 + 0x7C080000, // 0015 CALL R2 0 + 0x90021602, // 0016 SETMBR R0 K11 R2 + 0x50080000, // 0017 LDBOOL R2 0 0 + 0x90021802, // 0018 SETMBR R0 K12 R2 + 0x60080013, // 0019 GETGBL R2 G19 + 0x7C080000, // 001A CALL R2 0 + 0x90021A02, // 001B SETMBR R0 K13 R2 + 0x60080013, // 001C GETGBL R2 G19 + 0x7C080000, // 001D CALL R2 0 + 0x90021C02, // 001E SETMBR R0 K14 R2 + 0x8C08010F, // 001F GETMET R2 R0 K15 + 0x7C080200, // 0020 CALL R2 1 + 0x88080111, // 0021 GETMBR R2 R0 K17 + 0x90022002, // 0022 SETMBR R0 K16 R2 + 0x88080113, // 0023 GETMBR R2 R0 K19 + 0x90022402, // 0024 SETMBR R0 K18 R2 + 0x88080115, // 0025 GETMBR R2 R0 K21 + 0x90022802, // 0026 SETMBR R0 K20 R2 + 0x90022D17, // 0027 SETMBR R0 K22 K23 + 0x8C080319, // 0028 GETMET R2 R1 K25 + 0x5412000F, // 0029 LDINT R4 16 + 0x7C080400, // 002A CALL R2 2 + 0x90023002, // 002B SETMBR R0 K24 R2 + 0x50080000, // 002C LDBOOL R2 0 0 + 0x90023402, // 002D SETMBR R0 K26 R2 + 0x50080000, // 002E LDBOOL R2 0 0 + 0x90023602, // 002F SETMBR R0 K27 R2 + 0x8C08011C, // 0030 GETMET R2 R0 K28 + 0x7C080200, // 0031 CALL R2 1 + 0xB80A0600, // 0032 GETNGBL R2 K3 + 0x8C08051E, // 0033 GETMET R2 R2 K30 + 0x5C100000, // 0034 MOVE R4 R0 + 0x7C080400, // 0035 CALL R2 2 + 0x90023A02, // 0036 SETMBR R0 K29 R2 + 0x8808011D, // 0037 GETMBR R2 R0 K29 + 0x8C08051F, // 0038 GETMET R2 R2 K31 + 0x7C080200, // 0039 CALL R2 1 + 0xB80A0600, // 003A GETNGBL R2 K3 + 0x8C080521, // 003B GETMET R2 R2 K33 + 0x5C100000, // 003C MOVE R4 R0 + 0x7C080400, // 003D CALL R2 2 + 0x90024002, // 003E SETMBR R0 K32 R2 + 0xB80A0600, // 003F GETNGBL R2 K3 + 0x8C080505, // 0040 GETMET R2 R2 K5 + 0x5C100000, // 0041 MOVE R4 R0 + 0x7C080400, // 0042 CALL R2 2 + 0x90024402, // 0043 SETMBR R0 K34 R2 + 0xB80A0200, // 0044 GETNGBL R2 K1 + 0x8C080523, // 0045 GETMET R2 R2 K35 + 0x7C080200, // 0046 CALL R2 1 + 0x94080524, // 0047 GETIDX R2 R2 K36 + 0x740A0004, // 0048 JMPT R2 #004E + 0xB80A0200, // 0049 GETNGBL R2 K1 + 0x8C080525, // 004A GETMET R2 R2 K37 + 0x7C080200, // 004B CALL R2 1 + 0x94080524, // 004C GETIDX R2 R2 K36 + 0x780A0001, // 004D JMPF R2 #0050 + 0x8C080126, // 004E GETMET R2 R0 K38 + 0x7C080200, // 004F CALL R2 1 + 0xB80A0200, // 0050 GETNGBL R2 K1 + 0x8C080523, // 0051 GETMET R2 R2 K35 + 0x7C080200, // 0052 CALL R2 1 + 0x94080524, // 0053 GETIDX R2 R2 K36 + 0x740A0005, // 0054 JMPT R2 #005B + 0xB80A0200, // 0055 GETNGBL R2 K1 + 0x8C080527, // 0056 GETMET R2 R2 K39 + 0x58100028, // 0057 LDCONST R4 K40 + 0x84140000, // 0058 CLOSURE R5 P0 + 0x58180029, // 0059 LDCONST R6 K41 + 0x7C080800, // 005A CALL R2 4 + 0xB80A0200, // 005B GETNGBL R2 K1 + 0x8C080525, // 005C GETMET R2 R2 K37 + 0x7C080200, // 005D CALL R2 1 + 0x94080524, // 005E GETIDX R2 R2 K36 + 0x740A0005, // 005F JMPT R2 #0066 + 0xB80A0200, // 0060 GETNGBL R2 K1 + 0x8C080527, // 0061 GETMET R2 R2 K39 + 0x5810002A, // 0062 LDCONST R4 K42 + 0x84140001, // 0063 CLOSURE R5 P1 + 0x58180029, // 0064 LDCONST R6 K41 + 0x7C080800, // 0065 CALL R2 4 + 0x8C08012B, // 0066 GETMET R2 R0 K43 + 0x7C080200, // 0067 CALL R2 1 + 0xB80A0200, // 0068 GETNGBL R2 K1 + 0x8C08052C, // 0069 GETMET R2 R2 K44 + 0x5C100000, // 006A MOVE R4 R0 + 0x7C080400, // 006B CALL R2 2 + 0x8C08012D, // 006C GETMET R2 R0 K45 + 0x7C080200, // 006D CALL R2 1 + 0xA0000000, // 006E CLOSE R0 + 0x80000000, // 006F RET 0 }) ) ); @@ -4322,72 +2676,20 @@ be_local_closure(Matter_Device_save_param, /* name */ /******************************************************************** -** Solidified function: mdns_remove_op_discovery_all_fabrics +** Solidified function: _start_udp ********************************************************************/ -be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ +be_local_closure(Matter_Device__start_udp, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(sessions), - /* K1 */ be_nested_str_weak(active_fabrics), - /* K2 */ be_nested_str_weak(get_device_id), - /* K3 */ be_nested_str_weak(get_fabric_id), - /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), - /* K5 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(mdns_remove_op_discovery_all_fabrics), - &be_const_str_solidified, - ( &(const binstruction[22]) { /* code */ - 0x60040010, // 0000 GETGBL R1 G16 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x8C080501, // 0002 GETMET R2 R2 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x7C040200, // 0004 CALL R1 1 - 0xA802000B, // 0005 EXBLK 0 #0012 - 0x5C080200, // 0006 MOVE R2 R1 - 0x7C080000, // 0007 CALL R2 0 - 0x8C0C0502, // 0008 GETMET R3 R2 K2 - 0x7C0C0200, // 0009 CALL R3 1 - 0x780E0005, // 000A JMPF R3 #0011 - 0x8C0C0503, // 000B GETMET R3 R2 K3 - 0x7C0C0200, // 000C CALL R3 1 - 0x780E0002, // 000D JMPF R3 #0011 - 0x8C0C0104, // 000E GETMET R3 R0 K4 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x7001FFF3, // 0011 JMP #0006 - 0x58040005, // 0012 LDCONST R1 K5 - 0xAC040200, // 0013 CATCH R1 1 0 - 0xB0080000, // 0014 RAISE 2 R0 R0 - 0x80000000, // 0015 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Device_start, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 2, /* nstack */ - 0, /* argc */ + 8, /* nstack */ + 3, /* argc */ 0, /* varg */ 1, /* has upvals */ ( &(const bupvaldesc[ 1]) { /* upvals */ @@ -4397,53 +2699,362 @@ be_local_closure(Matter_Device_start, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_trigger_read_sensors), + /* K0 */ be_nested_str_weak(msg_received), }), - be_str_weak(_anonymous_), + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x680C0000, // 0000 GETUPV R3 U0 + 0x8C0C0700, // 0001 GETMET R3 R3 K0 + 0x5C140000, // 0002 MOVE R5 R0 + 0x5C180200, // 0003 MOVE R6 R1 + 0x5C1C0400, // 0004 MOVE R7 R2 + 0x7C0C0800, // 0005 CALL R3 4 + 0x80040600, // 0006 RET 1 R3 }) ), }), 1, /* has constants */ ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(started), - /* K1 */ be_nested_str_weak(autoconf_device), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(add_cron), - /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), - /* K5 */ be_nested_str_weak(matter_sensors_30s), - /* K6 */ be_nested_str_weak(_start_udp), - /* K7 */ be_nested_str_weak(UDP_PORT), - /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(MTR_X3A_X20Starting_X20UDP_X20server_X20on_X20port_X3A_X20), + /* K4 */ be_const_int(2), + /* K5 */ be_nested_str_weak(matter), + /* K6 */ be_nested_str_weak(UDPServer), + /* K7 */ be_nested_str_weak(), + /* K8 */ be_nested_str_weak(start), }), - be_str_weak(start), + be_str_weak(_start_udp), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060000, // 0001 JMPF R1 #0003 - 0x80000200, // 0002 RET 0 - 0x8C040101, // 0003 GETMET R1 R0 K1 + ( &(const binstruction[28]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x780A0000, // 0001 JMPF R2 #0003 + 0x80000400, // 0002 RET 0 + 0x4C080000, // 0003 LDNIL R2 + 0x1C080202, // 0004 EQ R2 R1 R2 + 0x780A0000, // 0005 JMPF R2 #0007 + 0x540615A3, // 0006 LDINT R1 5540 + 0xB80A0200, // 0007 GETNGBL R2 K1 + 0x8C080502, // 0008 GETMET R2 R2 K2 + 0x60100008, // 0009 GETGBL R4 G8 + 0x5C140200, // 000A MOVE R5 R1 + 0x7C100200, // 000B CALL R4 1 + 0x00120604, // 000C ADD R4 K3 R4 + 0x58140004, // 000D LDCONST R5 K4 + 0x7C080600, // 000E CALL R2 3 + 0xB80A0A00, // 000F GETNGBL R2 K5 + 0x8C080506, // 0010 GETMET R2 R2 K6 + 0x5C100000, // 0011 MOVE R4 R0 + 0x58140007, // 0012 LDCONST R5 K7 + 0x5C180200, // 0013 MOVE R6 R1 + 0x7C080800, // 0014 CALL R2 4 + 0x90020002, // 0015 SETMBR R0 K0 R2 + 0x88080100, // 0016 GETMBR R2 R0 K0 + 0x8C080508, // 0017 GETMET R2 R2 K8 + 0x84100000, // 0018 CLOSURE R4 P0 + 0x7C080400, // 0019 CALL R2 2 + 0xA0000000, // 001A CLOSE R0 + 0x80000000, // 001B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: load_param +********************************************************************/ +be_local_closure(Matter_Device_load_param, /* name */ + be_nested_proto( + 11, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[35]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(FILENAME), + /* K2 */ be_nested_str_weak(read), + /* K3 */ be_nested_str_weak(close), + /* K4 */ be_nested_str_weak(json), + /* K5 */ be_nested_str_weak(load), + /* K6 */ be_nested_str_weak(root_discriminator), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(distinguish), + /* K9 */ be_nested_str_weak(root_passcode), + /* K10 */ be_nested_str_weak(passcode), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(disable_bridge_mode), + /* K13 */ be_nested_str_weak(next_ep), + /* K14 */ be_nested_str_weak(nextep), + /* K15 */ be_nested_str_weak(plugins_config), + /* K16 */ be_nested_str_weak(config), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(log), + /* K19 */ be_nested_str_weak(MTR_X3A_X20load_config_X20_X3D_X20), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(adjust_next_ep), + /* K22 */ be_nested_str_weak(plugins_persist), + /* K23 */ be_nested_str_weak(plugins_config_remotes), + /* K24 */ be_nested_str_weak(remotes), + /* K25 */ be_nested_str_weak(MTR_X3A_X20load_remotes_X20_X3D_X20), + /* K26 */ be_nested_str_weak(io_error), + /* K27 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Aload_X20Exception_X3A), + /* K28 */ be_nested_str_weak(_X7C), + /* K29 */ be_const_int(2), + /* K30 */ be_nested_str_weak(random), + /* K31 */ be_nested_str_weak(get), + /* K32 */ be_const_int(0), + /* K33 */ be_nested_str_weak(generate_random_passcode), + /* K34 */ be_nested_str_weak(save_param), + }), + be_str_weak(load_param), + &be_const_str_solidified, + ( &(const binstruction[127]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xA802004D, // 0001 EXBLK 0 #0050 + 0x60080011, // 0002 GETGBL R2 G17 + 0x880C0101, // 0003 GETMBR R3 R0 K1 + 0x7C080200, // 0004 CALL R2 1 + 0x8C0C0502, // 0005 GETMET R3 R2 K2 + 0x7C0C0200, // 0006 CALL R3 1 + 0x8C100503, // 0007 GETMET R4 R2 K3 + 0x7C100200, // 0008 CALL R4 1 + 0xA4120800, // 0009 IMPORT R4 K4 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C140400, // 000C CALL R5 2 + 0x8C180B07, // 000D GETMET R6 R5 K7 + 0x58200008, // 000E LDCONST R8 K8 + 0x88240106, // 000F GETMBR R9 R0 K6 + 0x7C180600, // 0010 CALL R6 3 + 0x90020C06, // 0011 SETMBR R0 K6 R6 + 0x8C180B07, // 0012 GETMET R6 R5 K7 + 0x5820000A, // 0013 LDCONST R8 K10 + 0x88240109, // 0014 GETMBR R9 R0 K9 + 0x7C180600, // 0015 CALL R6 3 + 0x90021206, // 0016 SETMBR R0 K9 R6 + 0x60180017, // 0017 GETGBL R6 G23 + 0x8C1C0B07, // 0018 GETMET R7 R5 K7 + 0x5824000B, // 0019 LDCONST R9 K11 + 0x50280000, // 001A LDBOOL R10 0 0 + 0x7C1C0600, // 001B CALL R7 3 + 0x7C180200, // 001C CALL R6 1 + 0x90021606, // 001D SETMBR R0 K11 R6 + 0x60180017, // 001E GETGBL R6 G23 + 0x8C1C0B07, // 001F GETMET R7 R5 K7 + 0x5824000C, // 0020 LDCONST R9 K12 + 0x50280000, // 0021 LDBOOL R10 0 0 + 0x7C1C0600, // 0022 CALL R7 3 + 0x7C180200, // 0023 CALL R6 1 + 0x90021806, // 0024 SETMBR R0 K12 R6 + 0x8C180B07, // 0025 GETMET R6 R5 K7 + 0x5820000E, // 0026 LDCONST R8 K14 + 0x8824010D, // 0027 GETMBR R9 R0 K13 + 0x7C180600, // 0028 CALL R6 3 + 0x90021A06, // 0029 SETMBR R0 K13 R6 + 0x8C180B07, // 002A GETMET R6 R5 K7 + 0x58200010, // 002B LDCONST R8 K16 + 0x7C180400, // 002C CALL R6 2 + 0x90021E06, // 002D SETMBR R0 K15 R6 + 0x8818010F, // 002E GETMBR R6 R0 K15 + 0x4C1C0000, // 002F LDNIL R7 + 0x20180C07, // 0030 NE R6 R6 R7 + 0x781A000B, // 0031 JMPF R6 #003E + 0xB81A2200, // 0032 GETNGBL R6 K17 + 0x8C180D12, // 0033 GETMET R6 R6 K18 + 0x60200008, // 0034 GETGBL R8 G8 + 0x8824010F, // 0035 GETMBR R9 R0 K15 + 0x7C200200, // 0036 CALL R8 1 + 0x00222608, // 0037 ADD R8 K19 R8 + 0x58240014, // 0038 LDCONST R9 K20 + 0x7C180600, // 0039 CALL R6 3 + 0x8C180115, // 003A GETMET R6 R0 K21 + 0x7C180200, // 003B CALL R6 1 + 0x50180200, // 003C LDBOOL R6 1 0 + 0x90022C06, // 003D SETMBR R0 K22 R6 + 0x8C180B07, // 003E GETMET R6 R5 K7 + 0x58200018, // 003F LDCONST R8 K24 + 0x60240013, // 0040 GETGBL R9 G19 + 0x7C240000, // 0041 CALL R9 0 + 0x7C180600, // 0042 CALL R6 3 + 0x90022E06, // 0043 SETMBR R0 K23 R6 + 0x88180117, // 0044 GETMBR R6 R0 K23 + 0x781A0007, // 0045 JMPF R6 #004E + 0xB81A2200, // 0046 GETNGBL R6 K17 + 0x8C180D12, // 0047 GETMET R6 R6 K18 + 0x60200008, // 0048 GETGBL R8 G8 + 0x88240117, // 0049 GETMBR R9 R0 K23 + 0x7C200200, // 004A CALL R8 1 + 0x00223208, // 004B ADD R8 K25 R8 + 0x58240014, // 004C LDCONST R9 K20 + 0x7C180600, // 004D CALL R6 3 + 0xA8040001, // 004E EXBLK 1 1 + 0x70020012, // 004F JMP #0063 + 0xAC080002, // 0050 CATCH R2 0 2 + 0x7002000F, // 0051 JMP #0062 + 0x2010051A, // 0052 NE R4 R2 K26 + 0x7812000C, // 0053 JMPF R4 #0061 + 0xB8122200, // 0054 GETNGBL R4 K17 + 0x8C100912, // 0055 GETMET R4 R4 K18 + 0x60180008, // 0056 GETGBL R6 G8 + 0x5C1C0400, // 0057 MOVE R7 R2 + 0x7C180200, // 0058 CALL R6 1 + 0x001A3606, // 0059 ADD R6 K27 R6 + 0x00180D1C, // 005A ADD R6 R6 K28 + 0x601C0008, // 005B GETGBL R7 G8 + 0x5C200600, // 005C MOVE R8 R3 + 0x7C1C0200, // 005D CALL R7 1 + 0x00180C07, // 005E ADD R6 R6 R7 + 0x581C001D, // 005F LDCONST R7 K29 + 0x7C100600, // 0060 CALL R4 3 + 0x70020000, // 0061 JMP #0063 + 0xB0080000, // 0062 RAISE 2 R0 R0 + 0x50080000, // 0063 LDBOOL R2 0 0 + 0x880C0106, // 0064 GETMBR R3 R0 K6 + 0x4C100000, // 0065 LDNIL R4 + 0x1C0C0604, // 0066 EQ R3 R3 R4 + 0x780E000A, // 0067 JMPF R3 #0073 + 0x8C0C031E, // 0068 GETMET R3 R1 K30 + 0x5814001D, // 0069 LDCONST R5 K29 + 0x7C0C0400, // 006A CALL R3 2 + 0x8C0C071F, // 006B GETMET R3 R3 K31 + 0x58140020, // 006C LDCONST R5 K32 + 0x5818001D, // 006D LDCONST R6 K29 + 0x7C0C0600, // 006E CALL R3 3 + 0x54120FFE, // 006F LDINT R4 4095 + 0x2C0C0604, // 0070 AND R3 R3 R4 + 0x90020C03, // 0071 SETMBR R0 K6 R3 + 0x50080200, // 0072 LDBOOL R2 1 0 + 0x880C0109, // 0073 GETMBR R3 R0 K9 + 0x4C100000, // 0074 LDNIL R4 + 0x1C0C0604, // 0075 EQ R3 R3 R4 + 0x780E0003, // 0076 JMPF R3 #007B + 0x8C0C0121, // 0077 GETMET R3 R0 K33 + 0x7C0C0200, // 0078 CALL R3 1 + 0x90021203, // 0079 SETMBR R0 K9 R3 + 0x50080200, // 007A LDBOOL R2 1 0 + 0x780A0001, // 007B JMPF R2 #007E + 0x8C0C0122, // 007C GETMET R3 R0 K34 + 0x7C0C0200, // 007D CALL R3 1 + 0x80000000, // 007E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: adjust_next_ep +********************************************************************/ +be_local_closure(Matter_Device_adjust_next_ep, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_config), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(next_ep), + /* K3 */ be_const_int(1), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(adjust_next_ep), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 0x7C040200, // 0004 CALL R1 1 - 0xB8060400, // 0005 GETNGBL R1 K2 - 0x8C040303, // 0006 GETMET R1 R1 K3 - 0x580C0004, // 0007 LDCONST R3 K4 - 0x84100000, // 0008 CLOSURE R4 P0 - 0x58140005, // 0009 LDCONST R5 K5 - 0x7C040800, // 000A CALL R1 4 - 0x8C040106, // 000B GETMET R1 R0 K6 - 0x880C0107, // 000C GETMBR R3 R0 K7 - 0x7C040400, // 000D CALL R1 2 - 0x8C040108, // 000E GETMET R1 R0 K8 - 0x7C040200, // 000F CALL R1 1 - 0x50040200, // 0010 LDBOOL R1 1 0 - 0x90020001, // 0011 SETMBR R0 K0 R1 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 + 0xA802000A, // 0005 EXBLK 0 #0011 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x600C0009, // 0008 GETGBL R3 G9 + 0x5C100400, // 0009 MOVE R4 R2 + 0x7C0C0200, // 000A CALL R3 1 + 0x88100102, // 000B GETMBR R4 R0 K2 + 0x28100604, // 000C GE R4 R3 R4 + 0x78120001, // 000D JMPF R4 #0010 + 0x00100703, // 000E ADD R4 R3 K3 + 0x90020404, // 000F SETMBR R0 K2 R4 + 0x7001FFF4, // 0010 JMP #0006 + 0x58040004, // 0011 LDCONST R1 K4 + 0xAC040200, // 0012 CATCH R1 1 0 + 0xB0080000, // 0013 RAISE 2 R0 R0 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_commands +********************************************************************/ +be_local_closure(Matter_Device_register_commands, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(_X3Clambda_X3E), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x68100000, // 0000 GETUPV R4 U0 + 0x8C100900, // 0001 GETMET R4 R4 K0 + 0x5C180000, // 0002 MOVE R6 R0 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80040800, // 0007 RET 1 R4 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(add_cmd), + /* K2 */ be_nested_str_weak(MtrJoin), + }), + be_str_weak(register_commands), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x580C0002, // 0002 LDCONST R3 K2 + 0x84100000, // 0003 CLOSURE R4 P0 + 0x7C040600, // 0004 CALL R1 3 + 0xA0000000, // 0005 CLOSE R0 + 0x80000000, // 0006 RET 0 }) ) ); @@ -4710,12 +3321,84 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /******************************************************************** -** Solidified function: msg_received +** Solidified function: _trigger_read_sensors ********************************************************************/ -be_local_closure(Matter_Device_msg_received, /* name */ +be_local_closure(Matter_Device__trigger_read_sensors, /* name */ be_nested_proto( - 9, /* nstack */ - 4, /* argc */ + 8, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(read_sensors), + /* K3 */ be_nested_str_weak(load), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(plugins), + /* K6 */ be_nested_str_weak(parse_sensors), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20unable_X20to_X20parse_X20read_sensors_X3A_X20), + /* K10 */ be_const_int(3), + }), + be_str_weak(_trigger_read_sensors), + &be_const_str_solidified, + ( &(const binstruction[37]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0xB80A0200, // 0001 GETNGBL R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x7C080200, // 0003 CALL R2 1 + 0x4C0C0000, // 0004 LDNIL R3 + 0x1C0C0403, // 0005 EQ R3 R2 R3 + 0x780E0000, // 0006 JMPF R3 #0008 + 0x80000600, // 0007 RET 0 + 0x8C0C0303, // 0008 GETMET R3 R1 K3 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0x4C100000, // 000B LDNIL R4 + 0x20100604, // 000C NE R4 R3 R4 + 0x7812000D, // 000D JMPF R4 #001C + 0x58100004, // 000E LDCONST R4 K4 + 0x6014000C, // 000F GETGBL R5 G12 + 0x88180105, // 0010 GETMBR R6 R0 K5 + 0x7C140200, // 0011 CALL R5 1 + 0x14140805, // 0012 LT R5 R4 R5 + 0x78160006, // 0013 JMPF R5 #001B + 0x88140105, // 0014 GETMBR R5 R0 K5 + 0x94140A04, // 0015 GETIDX R5 R5 R4 + 0x8C140B06, // 0016 GETMET R5 R5 K6 + 0x5C1C0600, // 0017 MOVE R7 R3 + 0x7C140400, // 0018 CALL R5 2 + 0x00100907, // 0019 ADD R4 R4 K7 + 0x7001FFF3, // 001A JMP #000F + 0x70020007, // 001B JMP #0024 + 0xB8120200, // 001C GETNGBL R4 K1 + 0x8C100908, // 001D GETMET R4 R4 K8 + 0x60180008, // 001E GETGBL R6 G8 + 0x5C1C0400, // 001F MOVE R7 R2 + 0x7C180200, // 0020 CALL R6 1 + 0x001A1206, // 0021 ADD R6 K9 R6 + 0x581C000A, // 0022 LDCONST R7 K10 + 0x7C100600, // 0023 CALL R4 3 + 0x80000000, // 0024 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_50ms +********************************************************************/ +be_local_closure(Matter_Device_every_50ms, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -4723,19 +3406,1365 @@ be_local_closure(Matter_Device_msg_received, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(message_handler), - /* K1 */ be_nested_str_weak(msg_received), + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_const_int(1), }), - be_str_weak(msg_received), + be_str_weak(every_50ms), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x5C180200, // 0002 MOVE R6 R1 - 0x5C1C0400, // 0003 MOVE R7 R2 - 0x5C200600, // 0004 MOVE R8 R3 - 0x7C100800, // 0005 CALL R4 4 - 0x80040800, // 0006 RET 1 R4 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x00040301, // 0001 ADD R1 R1 K1 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_second +********************************************************************/ +be_local_closure(Matter_Device_every_second, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(every_second), + /* K2 */ be_nested_str_weak(message_handler), + /* K3 */ be_nested_str_weak(commissioning_open), + /* K4 */ be_nested_str_weak(tasmota), + /* K5 */ be_nested_str_weak(time_reached), + }), + be_str_weak(every_second), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x88040102, // 0003 GETMBR R1 R0 K2 + 0x8C040301, // 0004 GETMET R1 R1 K1 + 0x7C040200, // 0005 CALL R1 1 + 0x88040103, // 0006 GETMBR R1 R0 K3 + 0x4C080000, // 0007 LDNIL R2 + 0x20040202, // 0008 NE R1 R1 R2 + 0x78060006, // 0009 JMPF R1 #0011 + 0xB8060800, // 000A GETNGBL R1 K4 + 0x8C040305, // 000B GETMET R1 R1 K5 + 0x880C0103, // 000C GETMBR R3 R0 K3 + 0x7C040400, // 000D CALL R1 2 + 0x78060001, // 000E JMPF R1 #0011 + 0x4C040000, // 000F LDNIL R1 + 0x90020601, // 0010 SETMBR R0 K3 R1 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_active_endpoints +********************************************************************/ +be_local_closure(Matter_Device_get_active_endpoints, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins), + /* K1 */ be_nested_str_weak(get_endpoint), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(find), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_active_endpoints), + &be_const_str_solidified, + ( &(const binstruction[28]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x88100100, // 0003 GETMBR R4 R0 K0 + 0x7C0C0200, // 0004 CALL R3 1 + 0xA8020011, // 0005 EXBLK 0 #0018 + 0x5C100600, // 0006 MOVE R4 R3 + 0x7C100000, // 0007 CALL R4 0 + 0x8C140901, // 0008 GETMET R5 R4 K1 + 0x7C140200, // 0009 CALL R5 1 + 0x78060002, // 000A JMPF R1 #000E + 0x1C180B02, // 000B EQ R6 R5 K2 + 0x781A0000, // 000C JMPF R6 #000E + 0x7001FFF7, // 000D JMP #0006 + 0x8C180503, // 000E GETMET R6 R2 K3 + 0x5C200A00, // 000F MOVE R8 R5 + 0x7C180400, // 0010 CALL R6 2 + 0x4C1C0000, // 0011 LDNIL R7 + 0x1C180C07, // 0012 EQ R6 R6 R7 + 0x781A0002, // 0013 JMPF R6 #0017 + 0x8C180504, // 0014 GETMET R6 R2 K4 + 0x5C200A00, // 0015 MOVE R8 R5 + 0x7C180400, // 0016 CALL R6 2 + 0x7001FFED, // 0017 JMP #0006 + 0x580C0005, // 0018 LDCONST R3 K5 + 0xAC0C0200, // 0019 CATCH R3 1 0 + 0xB0080000, // 001A RAISE 2 R0 R0 + 0x80040400, // 001B RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _mdns_announce_hostname +********************************************************************/ +be_local_closure(Matter_Device__mdns_announce_hostname, /* name */ + be_nested_proto( + 14, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[26]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(start), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(eth), + /* K5 */ be_nested_str_weak(hostname_eth), + /* K6 */ be_nested_str_weak(replace), + /* K7 */ be_nested_str_weak(find), + /* K8 */ be_nested_str_weak(mac), + /* K9 */ be_nested_str_weak(_X3A), + /* K10 */ be_nested_str_weak(), + /* K11 */ be_nested_str_weak(ipv4only), + /* K12 */ be_nested_str_weak(add_hostname), + /* K13 */ be_nested_str_weak(ip6local), + /* K14 */ be_nested_str_weak(ip), + /* K15 */ be_nested_str_weak(ip6), + /* K16 */ be_nested_str_weak(log), + /* K17 */ be_nested_str_weak(MTR_X3A_X20calling_X20mdns_X2Eadd_hostname_X28_X25s_X2C_X20_X25s_X29), + /* K18 */ be_const_int(3), + /* K19 */ be_nested_str_weak(wifi), + /* K20 */ be_nested_str_weak(hostname_wifi), + /* K21 */ be_nested_str_weak(MTR_X3A_X20start_X20mDNS_X20on_X20_X25s_X20host_X20_X27_X25s_X2Elocal_X27), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Exception), + /* K23 */ be_nested_str_weak(_X7C), + /* K24 */ be_const_int(2), + /* K25 */ be_nested_str_weak(mdns_announce_op_discovery_all_fabrics), + }), + be_str_weak(_mdns_announce_hostname), + &be_const_str_solidified, + ( &(const binstruction[140]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0xA40E0200, // 0001 IMPORT R3 K1 + 0x8C100502, // 0002 GETMET R4 R2 K2 + 0x7C100200, // 0003 CALL R4 1 + 0xA8020072, // 0004 EXBLK 0 #0078 + 0x78060030, // 0005 JMPF R1 #0037 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x7C100200, // 0008 CALL R4 1 + 0x8C140706, // 0009 GETMET R5 R3 K6 + 0x8C1C0907, // 000A GETMET R7 R4 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x7C1C0400, // 000C CALL R7 2 + 0x58200009, // 000D LDCONST R8 K9 + 0x5824000A, // 000E LDCONST R9 K10 + 0x7C140800, // 000F CALL R5 4 + 0x90020A05, // 0010 SETMBR R0 K5 R5 + 0x8814010B, // 0011 GETMBR R5 R0 K11 + 0x7416000F, // 0012 JMPT R5 #0023 + 0x8C14050C, // 0013 GETMET R5 R2 K12 + 0x881C0105, // 0014 GETMBR R7 R0 K5 + 0x8C200907, // 0015 GETMET R8 R4 K7 + 0x5828000D, // 0016 LDCONST R10 K13 + 0x582C000A, // 0017 LDCONST R11 K10 + 0x7C200600, // 0018 CALL R8 3 + 0x8C240907, // 0019 GETMET R9 R4 K7 + 0x582C000E, // 001A LDCONST R11 K14 + 0x5830000A, // 001B LDCONST R12 K10 + 0x7C240600, // 001C CALL R9 3 + 0x8C280907, // 001D GETMET R10 R4 K7 + 0x5830000F, // 001E LDCONST R12 K15 + 0x5834000A, // 001F LDCONST R13 K10 + 0x7C280600, // 0020 CALL R10 3 + 0x7C140A00, // 0021 CALL R5 5 + 0x70020012, // 0022 JMP #0036 + 0xB8160600, // 0023 GETNGBL R5 K3 + 0x8C140B10, // 0024 GETMET R5 R5 K16 + 0x601C0018, // 0025 GETGBL R7 G24 + 0x58200011, // 0026 LDCONST R8 K17 + 0x88240105, // 0027 GETMBR R9 R0 K5 + 0x8C280907, // 0028 GETMET R10 R4 K7 + 0x5830000E, // 0029 LDCONST R12 K14 + 0x5834000A, // 002A LDCONST R13 K10 + 0x7C280600, // 002B CALL R10 3 + 0x7C1C0600, // 002C CALL R7 3 + 0x58200012, // 002D LDCONST R8 K18 + 0x7C140600, // 002E CALL R5 3 + 0x8C14050C, // 002F GETMET R5 R2 K12 + 0x881C0105, // 0030 GETMBR R7 R0 K5 + 0x8C200907, // 0031 GETMET R8 R4 K7 + 0x5828000E, // 0032 LDCONST R10 K14 + 0x582C000A, // 0033 LDCONST R11 K10 + 0x7C200600, // 0034 CALL R8 3 + 0x7C140600, // 0035 CALL R5 3 + 0x7002002F, // 0036 JMP #0067 + 0xB8120600, // 0037 GETNGBL R4 K3 + 0x8C100913, // 0038 GETMET R4 R4 K19 + 0x7C100200, // 0039 CALL R4 1 + 0x8C140706, // 003A GETMET R5 R3 K6 + 0x8C1C0907, // 003B GETMET R7 R4 K7 + 0x58240008, // 003C LDCONST R9 K8 + 0x7C1C0400, // 003D CALL R7 2 + 0x58200009, // 003E LDCONST R8 K9 + 0x5824000A, // 003F LDCONST R9 K10 + 0x7C140800, // 0040 CALL R5 4 + 0x90022805, // 0041 SETMBR R0 K20 R5 + 0x8814010B, // 0042 GETMBR R5 R0 K11 + 0x7416000F, // 0043 JMPT R5 #0054 + 0x8C14050C, // 0044 GETMET R5 R2 K12 + 0x881C0114, // 0045 GETMBR R7 R0 K20 + 0x8C200907, // 0046 GETMET R8 R4 K7 + 0x5828000D, // 0047 LDCONST R10 K13 + 0x582C000A, // 0048 LDCONST R11 K10 + 0x7C200600, // 0049 CALL R8 3 + 0x8C240907, // 004A GETMET R9 R4 K7 + 0x582C000E, // 004B LDCONST R11 K14 + 0x5830000A, // 004C LDCONST R12 K10 + 0x7C240600, // 004D CALL R9 3 + 0x8C280907, // 004E GETMET R10 R4 K7 + 0x5830000F, // 004F LDCONST R12 K15 + 0x5834000A, // 0050 LDCONST R13 K10 + 0x7C280600, // 0051 CALL R10 3 + 0x7C140A00, // 0052 CALL R5 5 + 0x70020012, // 0053 JMP #0067 + 0xB8160600, // 0054 GETNGBL R5 K3 + 0x8C140B10, // 0055 GETMET R5 R5 K16 + 0x601C0018, // 0056 GETGBL R7 G24 + 0x58200011, // 0057 LDCONST R8 K17 + 0x88240105, // 0058 GETMBR R9 R0 K5 + 0x8C280907, // 0059 GETMET R10 R4 K7 + 0x5830000E, // 005A LDCONST R12 K14 + 0x5834000A, // 005B LDCONST R13 K10 + 0x7C280600, // 005C CALL R10 3 + 0x7C1C0600, // 005D CALL R7 3 + 0x58200012, // 005E LDCONST R8 K18 + 0x7C140600, // 005F CALL R5 3 + 0x8C14050C, // 0060 GETMET R5 R2 K12 + 0x881C0114, // 0061 GETMBR R7 R0 K20 + 0x8C200907, // 0062 GETMET R8 R4 K7 + 0x5828000E, // 0063 LDCONST R10 K14 + 0x582C000A, // 0064 LDCONST R11 K10 + 0x7C200600, // 0065 CALL R8 3 + 0x7C140600, // 0066 CALL R5 3 + 0xB8120600, // 0067 GETNGBL R4 K3 + 0x8C100910, // 0068 GETMET R4 R4 K16 + 0x60180018, // 0069 GETGBL R6 G24 + 0x581C0015, // 006A LDCONST R7 K21 + 0x78060001, // 006B JMPF R1 #006E + 0x58200004, // 006C LDCONST R8 K4 + 0x70020000, // 006D JMP #006F + 0x58200013, // 006E LDCONST R8 K19 + 0x78060001, // 006F JMPF R1 #0072 + 0x88240105, // 0070 GETMBR R9 R0 K5 + 0x70020000, // 0071 JMP #0073 + 0x88240114, // 0072 GETMBR R9 R0 K20 + 0x7C180600, // 0073 CALL R6 3 + 0x581C0012, // 0074 LDCONST R7 K18 + 0x7C100600, // 0075 CALL R4 3 + 0xA8040001, // 0076 EXBLK 1 1 + 0x70020010, // 0077 JMP #0089 + 0xAC100002, // 0078 CATCH R4 0 2 + 0x7002000D, // 0079 JMP #0088 + 0xB81A0600, // 007A GETNGBL R6 K3 + 0x8C180D10, // 007B GETMET R6 R6 K16 + 0x60200008, // 007C GETGBL R8 G8 + 0x5C240800, // 007D MOVE R9 R4 + 0x7C200200, // 007E CALL R8 1 + 0x00222C08, // 007F ADD R8 K22 R8 + 0x00201117, // 0080 ADD R8 R8 K23 + 0x60240008, // 0081 GETGBL R9 G8 + 0x5C280A00, // 0082 MOVE R10 R5 + 0x7C240200, // 0083 CALL R9 1 + 0x00201009, // 0084 ADD R8 R8 R9 + 0x58240018, // 0085 LDCONST R9 K24 + 0x7C180600, // 0086 CALL R6 3 + 0x70020000, // 0087 JMP #0089 + 0xB0080000, // 0088 RAISE 2 R0 R0 + 0x8C100119, // 0089 GETMET R4 R0 K25 + 0x7C100200, // 008A CALL R4 1 + 0x80000000, // 008B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_plugin_class_displayname +********************************************************************/ +be_local_closure(Matter_Device_get_plugin_class_displayname, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(plugins_classes), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_nested_str_weak(NAME), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(get_plugin_class_displayname), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x880C0502, // 0005 GETMBR R3 R2 K2 + 0x70020000, // 0006 JMP #0008 + 0x580C0003, // 0007 LDCONST R3 K3 + 0x80040600, // 0008 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: generate_random_passcode +********************************************************************/ +be_local_closure(Matter_Device_generate_random_passcode, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(random), + /* K2 */ be_nested_str_weak(get), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(134217727), + /* K5 */ be_const_int(99999998), + /* K6 */ be_nested_str_weak(PASSCODE_INVALID), + /* K7 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(generate_random_passcode), + &be_const_str_solidified, + ( &(const binstruction[35]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x780E001D, // 0003 JMPF R3 #0022 + 0x8C0C0301, // 0004 GETMET R3 R1 K1 + 0x54160003, // 0005 LDINT R5 4 + 0x7C0C0400, // 0006 CALL R3 2 + 0x8C0C0702, // 0007 GETMET R3 R3 K2 + 0x58140003, // 0008 LDCONST R5 K3 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C0C0600, // 000A CALL R3 3 + 0x2C0C0704, // 000B AND R3 R3 K4 + 0x5C080600, // 000C MOVE R2 R3 + 0x240C0505, // 000D GT R3 R2 K5 + 0x780E0000, // 000E JMPF R3 #0010 + 0x7001FFF1, // 000F JMP #0002 + 0x600C0010, // 0010 GETGBL R3 G16 + 0x88100106, // 0011 GETMBR R4 R0 K6 + 0x7C0C0200, // 0012 CALL R3 1 + 0xA8020005, // 0013 EXBLK 0 #001A + 0x5C100600, // 0014 MOVE R4 R3 + 0x7C100000, // 0015 CALL R4 0 + 0x1C140404, // 0016 EQ R5 R2 R4 + 0x78160000, // 0017 JMPF R5 #0019 + 0x4C080000, // 0018 LDNIL R2 + 0x7001FFF9, // 0019 JMP #0014 + 0x580C0007, // 001A LDCONST R3 K7 + 0xAC0C0200, // 001B CATCH R3 1 0 + 0xB0080000, // 001C RAISE 2 R0 R0 + 0x4C0C0000, // 001D LDNIL R3 + 0x200C0403, // 001E NE R3 R2 R3 + 0x780E0000, // 001F JMPF R3 #0021 + 0x80040400, // 0020 RET 1 R2 + 0x7001FFDF, // 0021 JMP #0002 + 0x80000000, // 0022 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: update_remotes_info +********************************************************************/ +be_local_closure(Matter_Device_update_remotes_info, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(http_remotes), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(get_info), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(stop_iteration), + /* K5 */ be_nested_str_weak(plugins_config_remotes), + }), + be_str_weak(update_remotes_info), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x60040013, // 0000 GETGBL R1 G19 + 0x7C040000, // 0001 CALL R1 0 + 0x88080100, // 0002 GETMBR R2 R0 K0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x20080403, // 0004 NE R2 R2 R3 + 0x780A0018, // 0005 JMPF R2 #001F + 0x60080010, // 0006 GETGBL R2 G16 + 0x880C0100, // 0007 GETMBR R3 R0 K0 + 0x8C0C0701, // 0008 GETMET R3 R3 K1 + 0x7C0C0200, // 0009 CALL R3 1 + 0x7C080200, // 000A CALL R2 1 + 0xA802000F, // 000B EXBLK 0 #001C + 0x5C0C0400, // 000C MOVE R3 R2 + 0x7C0C0000, // 000D CALL R3 0 + 0x88100100, // 000E GETMBR R4 R0 K0 + 0x94100803, // 000F GETIDX R4 R4 R3 + 0x8C100902, // 0010 GETMET R4 R4 K2 + 0x7C100200, // 0011 CALL R4 1 + 0x4C140000, // 0012 LDNIL R5 + 0x20140805, // 0013 NE R5 R4 R5 + 0x78160005, // 0014 JMPF R5 #001B + 0x6014000C, // 0015 GETGBL R5 G12 + 0x5C180800, // 0016 MOVE R6 R4 + 0x7C140200, // 0017 CALL R5 1 + 0x24140B03, // 0018 GT R5 R5 K3 + 0x78160000, // 0019 JMPF R5 #001B + 0x98040604, // 001A SETIDX R1 R3 R4 + 0x7001FFEF, // 001B JMP #000C + 0x58080004, // 001C LDCONST R2 K4 + 0xAC080200, // 001D CATCH R2 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x90020A01, // 001F SETMBR R0 K5 R1 + 0x80040200, // 0020 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: MtrJoin +********************************************************************/ +be_local_closure(Matter_Device_MtrJoin, /* name */ + be_nested_proto( + 8, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(start_root_basic_commissioning), + /* K1 */ be_nested_str_weak(stop_basic_commissioning), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(resp_cmnd_done), + }), + be_str_weak(MtrJoin), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60140009, // 0000 GETGBL R5 G9 + 0x5C180600, // 0001 MOVE R6 R3 + 0x7C140200, // 0002 CALL R5 1 + 0x78160002, // 0003 JMPF R5 #0007 + 0x8C180100, // 0004 GETMET R6 R0 K0 + 0x7C180200, // 0005 CALL R6 1 + 0x70020001, // 0006 JMP #0009 + 0x8C180101, // 0007 GETMET R6 R0 K1 + 0x7C180200, // 0008 CALL R6 1 + 0xB81A0400, // 0009 GETNGBL R6 K2 + 0x8C180D03, // 000A GETMET R6 R6 K3 + 0x7C180200, // 000B CALL R6 1 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_root_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_root_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(PASE_TIMEOUT), + /* K1 */ be_nested_str_weak(compute_manual_pairing_code), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20Manual_X20pairing_X20code_X3A_X20_X25s), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(compute_qrcode_content), + /* K7 */ be_nested_str_weak(publish_result), + /* K8 */ be_nested_str_weak(_X7B_X22Matter_X22_X3A_X7B_X22Commissioning_X22_X3A1_X2C_X22PairingCode_X22_X3A_X22_X25s_X22_X2C_X22QRCode_X22_X3A_X22_X25s_X22_X7D_X7D), + /* K9 */ be_nested_str_weak(Matter), + /* K10 */ be_nested_str_weak(_compute_pbkdf), + /* K11 */ be_nested_str_weak(root_passcode), + /* K12 */ be_nested_str_weak(root_iterations), + /* K13 */ be_nested_str_weak(root_salt), + /* K14 */ be_nested_str_weak(start_basic_commissioning), + /* K15 */ be_nested_str_weak(root_discriminator), + /* K16 */ be_nested_str_weak(root_w0), + /* K17 */ be_nested_str_weak(root_L), + }), + be_str_weak(start_root_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x88040100, // 0003 GETMBR R1 R0 K0 + 0x8C080101, // 0004 GETMET R2 R0 K1 + 0x7C080200, // 0005 CALL R2 1 + 0xB80E0400, // 0006 GETNGBL R3 K2 + 0x8C0C0703, // 0007 GETMET R3 R3 K3 + 0x60140018, // 0008 GETGBL R5 G24 + 0x58180004, // 0009 LDCONST R6 K4 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x7C140400, // 000B CALL R5 2 + 0x58180005, // 000C LDCONST R6 K5 + 0x7C0C0600, // 000D CALL R3 3 + 0x8C0C0106, // 000E GETMET R3 R0 K6 + 0x7C0C0200, // 000F CALL R3 1 + 0xB8120400, // 0010 GETNGBL R4 K2 + 0x8C100907, // 0011 GETMET R4 R4 K7 + 0x60180018, // 0012 GETGBL R6 G24 + 0x581C0008, // 0013 LDCONST R7 K8 + 0x5C200400, // 0014 MOVE R8 R2 + 0x5C240600, // 0015 MOVE R9 R3 + 0x7C180600, // 0016 CALL R6 3 + 0x581C0009, // 0017 LDCONST R7 K9 + 0x7C100600, // 0018 CALL R4 3 + 0x8C10010A, // 0019 GETMET R4 R0 K10 + 0x8818010B, // 001A GETMBR R6 R0 K11 + 0x881C010C, // 001B GETMBR R7 R0 K12 + 0x8820010D, // 001C GETMBR R8 R0 K13 + 0x7C100800, // 001D CALL R4 4 + 0x8C10010E, // 001E GETMET R4 R0 K14 + 0x5C180200, // 001F MOVE R6 R1 + 0x881C010C, // 0020 GETMBR R7 R0 K12 + 0x8820010F, // 0021 GETMBR R8 R0 K15 + 0x8824010D, // 0022 GETMBR R9 R0 K13 + 0x88280110, // 0023 GETMBR R10 R0 K16 + 0x882C0111, // 0024 GETMBR R11 R0 K17 + 0x4C300000, // 0025 LDNIL R12 + 0x7C101000, // 0026 CALL R4 8 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: bridge_remove_endpoint +********************************************************************/ +be_local_closure(Matter_Device_bridge_remove_endpoint, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(plugins_config), + /* K2 */ be_nested_str_weak(contains), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20Cannot_X20remove_X20an_X20enpoint_X20not_X20configured_X3A_X20), + /* K6 */ be_const_int(3), + /* K7 */ be_nested_str_weak(MTR_X3A_X20deleting_X20endpoint_X20_X3D_X20_X25i), + /* K8 */ be_const_int(2), + /* K9 */ be_nested_str_weak(remove), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_const_int(0), + /* K12 */ be_nested_str_weak(plugins), + /* K13 */ be_nested_str_weak(get_endpoint), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(clean_remotes), + /* K16 */ be_nested_str_weak(save_param), + /* K17 */ be_nested_str_weak(signal_endpoints_changed), + }), + be_str_weak(bridge_remove_endpoint), + &be_const_str_solidified, + ( &(const binstruction[58]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x600C0008, // 0001 GETGBL R3 G8 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C0C0200, // 0003 CALL R3 1 + 0x4C100000, // 0004 LDNIL R4 + 0x4C140000, // 0005 LDNIL R5 + 0x88180101, // 0006 GETMBR R6 R0 K1 + 0x8C180D02, // 0007 GETMET R6 R6 K2 + 0x5C200600, // 0008 MOVE R8 R3 + 0x7C180400, // 0009 CALL R6 2 + 0x741A0005, // 000A JMPT R6 #0011 + 0xB81A0600, // 000B GETNGBL R6 K3 + 0x8C180D04, // 000C GETMET R6 R6 K4 + 0x00220A03, // 000D ADD R8 K5 R3 + 0x58240006, // 000E LDCONST R9 K6 + 0x7C180600, // 000F CALL R6 3 + 0x80000C00, // 0010 RET 0 + 0xB81A0600, // 0011 GETNGBL R6 K3 + 0x8C180D04, // 0012 GETMET R6 R6 K4 + 0x60200018, // 0013 GETGBL R8 G24 + 0x58240007, // 0014 LDCONST R9 K7 + 0x5C280200, // 0015 MOVE R10 R1 + 0x7C200400, // 0016 CALL R8 2 + 0x58240008, // 0017 LDCONST R9 K8 + 0x7C180600, // 0018 CALL R6 3 + 0x88180101, // 0019 GETMBR R6 R0 K1 + 0x8C180D09, // 001A GETMET R6 R6 K9 + 0x5C200600, // 001B MOVE R8 R3 + 0x7C180400, // 001C CALL R6 2 + 0x50180200, // 001D LDBOOL R6 1 0 + 0x90021406, // 001E SETMBR R0 K10 R6 + 0x5818000B, // 001F LDCONST R6 K11 + 0x601C000C, // 0020 GETGBL R7 G12 + 0x8820010C, // 0021 GETMBR R8 R0 K12 + 0x7C1C0200, // 0022 CALL R7 1 + 0x141C0C07, // 0023 LT R7 R6 R7 + 0x781E000D, // 0024 JMPF R7 #0033 + 0x881C010C, // 0025 GETMBR R7 R0 K12 + 0x941C0E06, // 0026 GETIDX R7 R7 R6 + 0x8C1C0F0D, // 0027 GETMET R7 R7 K13 + 0x7C1C0200, // 0028 CALL R7 1 + 0x1C1C0207, // 0029 EQ R7 R1 R7 + 0x781E0005, // 002A JMPF R7 #0031 + 0x881C010C, // 002B GETMBR R7 R0 K12 + 0x8C1C0F09, // 002C GETMET R7 R7 K9 + 0x5C240C00, // 002D MOVE R9 R6 + 0x7C1C0400, // 002E CALL R7 2 + 0x70020002, // 002F JMP #0033 + 0x70020000, // 0030 JMP #0032 + 0x00180D0E, // 0031 ADD R6 R6 K14 + 0x7001FFEC, // 0032 JMP #0020 + 0x8C1C010F, // 0033 GETMET R7 R0 K15 + 0x7C1C0200, // 0034 CALL R7 1 + 0x8C1C0110, // 0035 GETMET R7 R0 K16 + 0x7C1C0200, // 0036 CALL R7 1 + 0x8C1C0111, // 0037 GETMET R7 R0 K17 + 0x7C1C0200, // 0038 CALL R7 1 + 0x80000000, // 0039 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: conf_to_log +********************************************************************/ +be_local_closure(Matter_Device_conf_to_log, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(), + /* K2 */ be_nested_str_weak(k2l), + /* K3 */ be_nested_str_weak(type), + /* K4 */ be_nested_str_weak(_X20_X25s_X3A_X25s), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(conf_to_log), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x58080001, // 0001 LDCONST R2 K1 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100302, // 0003 GETMET R4 R1 K2 + 0x5C180000, // 0004 MOVE R6 R0 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA802000B, // 0007 EXBLK 0 #0014 + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x1C140903, // 000A EQ R5 R4 K3 + 0x78160000, // 000B JMPF R5 #000D + 0x7001FFFA, // 000C JMP #0008 + 0x60140018, // 000D GETGBL R5 G24 + 0x58180004, // 000E LDCONST R6 K4 + 0x5C1C0800, // 000F MOVE R7 R4 + 0x94200004, // 0010 GETIDX R8 R0 R4 + 0x7C140600, // 0011 CALL R5 3 + 0x00080405, // 0012 ADD R2 R2 R5 + 0x7001FFF3, // 0013 JMP #0008 + 0x580C0005, // 0014 LDCONST R3 K5 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x80040400, // 0017 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: mdns_remove_op_discovery_all_fabrics +********************************************************************/ +be_local_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(active_fabrics), + /* K2 */ be_nested_str_weak(get_device_id), + /* K3 */ be_nested_str_weak(get_fabric_id), + /* K4 */ be_nested_str_weak(mdns_remove_op_discovery), + /* K5 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(mdns_remove_op_discovery_all_fabrics), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x60040010, // 0000 GETGBL R1 G16 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x8C080501, // 0002 GETMET R2 R2 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x7C040200, // 0004 CALL R1 1 + 0xA802000B, // 0005 EXBLK 0 #0012 + 0x5C080200, // 0006 MOVE R2 R1 + 0x7C080000, // 0007 CALL R2 0 + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x7C0C0200, // 0009 CALL R3 1 + 0x780E0005, // 000A JMPF R3 #0011 + 0x8C0C0503, // 000B GETMET R3 R2 K3 + 0x7C0C0200, // 000C CALL R3 1 + 0x780E0002, // 000D JMPF R3 #0011 + 0x8C0C0104, // 000E GETMET R3 R0 K4 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C0C0400, // 0010 CALL R3 2 + 0x7001FFF3, // 0011 JMP #0006 + 0x58040005, // 0012 LDCONST R1 K5 + 0xAC040200, // 0013 CATCH R1 1 0 + 0xB0080000, // 0014 RAISE 2 R0 R0 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _init_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device__init_basic_commissioning, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(sessions), + /* K1 */ be_nested_str_weak(count_active_fabrics), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(start_root_basic_commissioning), + }), + be_str_weak(_init_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040302, // 0003 EQ R1 R1 K2 + 0x78060001, // 0004 JMPF R1 #0007 + 0x8C040103, // 0005 GETMET R1 R0 K3 + 0x7C040200, // 0006 CALL R1 1 + 0x80000000, // 0007 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Device_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(Path), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_nested_str_weak(cluster), + /* K4 */ be_nested_str_weak(attribute), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(im), + /* K7 */ be_nested_str_weak(subs_shop), + /* K8 */ be_nested_str_weak(attribute_updated_ctx), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x4C140000, // 0000 LDNIL R5 + 0x1C140805, // 0001 EQ R5 R4 R5 + 0x78160000, // 0002 JMPF R5 #0004 + 0x50100000, // 0003 LDBOOL R4 0 0 + 0xB8160000, // 0004 GETNGBL R5 K0 + 0x8C140B01, // 0005 GETMET R5 R5 K1 + 0x7C140200, // 0006 CALL R5 1 + 0x90160401, // 0007 SETMBR R5 K2 R1 + 0x90160602, // 0008 SETMBR R5 K3 R2 + 0x90160803, // 0009 SETMBR R5 K4 R3 + 0x88180105, // 000A GETMBR R6 R0 K5 + 0x88180D06, // 000B GETMBR R6 R6 K6 + 0x88180D07, // 000C GETMBR R6 R6 K7 + 0x8C180D08, // 000D GETMET R6 R6 K8 + 0x5C200A00, // 000E MOVE R8 R5 + 0x5C240800, // 000F MOVE R9 R4 + 0x7C180600, // 0010 CALL R6 3 + 0x80000000, // 0011 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_plugin_class +********************************************************************/ +be_local_closure(Matter_Device_register_plugin_class, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_nested_str_weak(TYPE), + /* K3 */ be_nested_str_weak(plugins_classes), + }), + be_str_weak(register_plugin_class), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xA40A0000, // 0000 IMPORT R2 K0 + 0x8C0C0501, // 0001 GETMET R3 R2 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x88100103, // 0006 GETMBR R4 R0 K3 + 0x98100601, // 0007 SETIDX R4 R3 R1 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_Device_received_ack, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_server), + /* K1 */ be_nested_str_weak(received_ack), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: register_native_classes +********************************************************************/ +be_local_closure(Matter_Device_register_native_classes, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(introspect), + /* K1 */ be_nested_str_weak(string), + /* K2 */ be_nested_str_weak(members), + /* K3 */ be_nested_str_weak(matter), + /* K4 */ be_nested_str_weak(get), + /* K5 */ be_nested_str_weak(class), + /* K6 */ be_nested_str_weak(find), + /* K7 */ be_nested_str_weak(Plugin_), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(register_plugin_class), + /* K10 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(register_native_classes), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xA40E0000, // 0000 IMPORT R3 K0 + 0xA4120200, // 0001 IMPORT R4 K1 + 0x60140010, // 0002 GETGBL R5 G16 + 0x8C180702, // 0003 GETMET R6 R3 K2 + 0xB8220600, // 0004 GETNGBL R8 K3 + 0x7C180400, // 0005 CALL R6 2 + 0x7C140200, // 0006 CALL R5 1 + 0xA8020014, // 0007 EXBLK 0 #001D + 0x5C180A00, // 0008 MOVE R6 R5 + 0x7C180000, // 0009 CALL R6 0 + 0x8C1C0704, // 000A GETMET R7 R3 K4 + 0xB8260600, // 000B GETNGBL R9 K3 + 0x5C280C00, // 000C MOVE R10 R6 + 0x7C1C0600, // 000D CALL R7 3 + 0x60200004, // 000E GETGBL R8 G4 + 0x5C240E00, // 000F MOVE R9 R7 + 0x7C200200, // 0010 CALL R8 1 + 0x1C201105, // 0011 EQ R8 R8 K5 + 0x78220008, // 0012 JMPF R8 #001C + 0x8C200906, // 0013 GETMET R8 R4 K6 + 0x5C280C00, // 0014 MOVE R10 R6 + 0x582C0007, // 0015 LDCONST R11 K7 + 0x7C200600, // 0016 CALL R8 3 + 0x1C201108, // 0017 EQ R8 R8 K8 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C200109, // 0019 GETMET R8 R0 K9 + 0x5C280E00, // 001A MOVE R10 R7 + 0x7C200400, // 001B CALL R8 2 + 0x7001FFEA, // 001C JMP #0008 + 0x5814000A, // 001D LDCONST R5 K10 + 0xAC140200, // 001E CATCH R5 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Device_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_trigger_read_sensors), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(started), + /* K1 */ be_nested_str_weak(autoconf_device), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(add_cron), + /* K4 */ be_nested_str_weak(_X2A_X2F30_X20_X2A_X20_X2A_X20_X2A_X20_X2A_X20_X2A), + /* K5 */ be_nested_str_weak(matter_sensors_30s), + /* K6 */ be_nested_str_weak(_start_udp), + /* K7 */ be_nested_str_weak(UDP_PORT), + /* K8 */ be_nested_str_weak(start_mdns_announce_hostnames), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060000, // 0001 JMPF R1 #0003 + 0x80000200, // 0002 RET 0 + 0x8C040101, // 0003 GETMET R1 R0 K1 + 0x7C040200, // 0004 CALL R1 1 + 0xB8060400, // 0005 GETNGBL R1 K2 + 0x8C040303, // 0006 GETMET R1 R1 K3 + 0x580C0004, // 0007 LDCONST R3 K4 + 0x84100000, // 0008 CLOSURE R4 P0 + 0x58140005, // 0009 LDCONST R5 K5 + 0x7C040800, // 000A CALL R1 4 + 0x8C040106, // 000B GETMET R1 R0 K6 + 0x880C0107, // 000C GETMBR R3 R0 K7 + 0x7C040400, // 000D CALL R1 2 + 0x8C040108, // 000E GETMET R1 R0 K8 + 0x7C040200, // 000F CALL R1 1 + 0x50040200, // 0010 LDBOOL R1 1 0 + 0x90020001, // 0011 SETMBR R0 K0 R1 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start_basic_commissioning +********************************************************************/ +be_local_closure(Matter_Device_start_basic_commissioning, /* name */ + be_nested_proto( + 13, /* nstack */ + 8, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 2]) { + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Wifi_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + be_nested_proto( + 4, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(mdns_announce_PASE), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(remove_rule), + /* K3 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0xB8020200, // 0003 GETNGBL R0 K1 + 0x8C000102, // 0004 GETMET R0 R0 K2 + 0x58080003, // 0005 LDCONST R2 K3 + 0x580C0000, // 0006 LDCONST R3 K0 + 0x7C000600, // 0007 CALL R0 3 + 0x80000000, // 0008 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(commissioning_open), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(commissioning_iterations), + /* K4 */ be_nested_str_weak(commissioning_discriminator), + /* K5 */ be_nested_str_weak(commissioning_salt), + /* K6 */ be_nested_str_weak(commissioning_w0), + /* K7 */ be_nested_str_weak(commissioning_L), + /* K8 */ be_nested_str_weak(commissioning_admin_fabric), + /* K9 */ be_nested_str_weak(wifi), + /* K10 */ be_nested_str_weak(up), + /* K11 */ be_nested_str_weak(eth), + /* K12 */ be_nested_str_weak(mdns_announce_PASE), + /* K13 */ be_nested_str_weak(add_rule), + /* K14 */ be_nested_str_weak(Wifi_X23Connected), + /* K15 */ be_nested_str_weak(Eth_X23Connected), + }), + be_str_weak(start_basic_commissioning), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xB8220200, // 0000 GETNGBL R8 K1 + 0x8C201102, // 0001 GETMET R8 R8 K2 + 0x7C200200, // 0002 CALL R8 1 + 0x542603E7, // 0003 LDINT R9 1000 + 0x08240209, // 0004 MUL R9 R1 R9 + 0x00201009, // 0005 ADD R8 R8 R9 + 0x90020008, // 0006 SETMBR R0 K0 R8 + 0x90020602, // 0007 SETMBR R0 K3 R2 + 0x90020803, // 0008 SETMBR R0 K4 R3 + 0x90020A04, // 0009 SETMBR R0 K5 R4 + 0x90020C05, // 000A SETMBR R0 K6 R5 + 0x90020E06, // 000B SETMBR R0 K7 R6 + 0x90021007, // 000C SETMBR R0 K8 R7 + 0xB8220200, // 000D GETNGBL R8 K1 + 0x8C201109, // 000E GETMET R8 R8 K9 + 0x7C200200, // 000F CALL R8 1 + 0x9420110A, // 0010 GETIDX R8 R8 K10 + 0x74220004, // 0011 JMPT R8 #0017 + 0xB8220200, // 0012 GETNGBL R8 K1 + 0x8C20110B, // 0013 GETMET R8 R8 K11 + 0x7C200200, // 0014 CALL R8 1 + 0x9420110A, // 0015 GETIDX R8 R8 K10 + 0x78220002, // 0016 JMPF R8 #001A + 0x8C20010C, // 0017 GETMET R8 R0 K12 + 0x7C200200, // 0018 CALL R8 1 + 0x7002000B, // 0019 JMP #0026 + 0xB8220200, // 001A GETNGBL R8 K1 + 0x8C20110D, // 001B GETMET R8 R8 K13 + 0x5828000E, // 001C LDCONST R10 K14 + 0x842C0000, // 001D CLOSURE R11 P0 + 0x5830000C, // 001E LDCONST R12 K12 + 0x7C200800, // 001F CALL R8 4 + 0xB8220200, // 0020 GETNGBL R8 K1 + 0x8C20110D, // 0021 GETMET R8 R8 K13 + 0x5828000F, // 0022 LDCONST R10 K15 + 0x842C0001, // 0023 CLOSURE R11 P1 + 0x5830000C, // 0024 LDCONST R12 K12 + 0x7C200800, // 0025 CALL R8 4 + 0xA0000000, // 0026 CLOSE R0 + 0x80000000, // 0027 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: signal_endpoints_changed +********************************************************************/ +be_local_closure(Matter_Device_signal_endpoints_changed, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(attribute_updated), + /* K1 */ be_const_int(0), + /* K2 */ be_const_int(3), + }), + be_str_weak(signal_endpoints_changed), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x580C0001, // 0001 LDCONST R3 K1 + 0x5412001C, // 0002 LDINT R4 29 + 0x58140002, // 0003 LDCONST R5 K2 + 0x50180000, // 0004 LDBOOL R6 0 0 + 0x7C040A00, // 0005 CALL R1 5 + 0x8C040100, // 0006 GETMET R1 R0 K0 + 0x540EFEFF, // 0007 LDINT R3 65280 + 0x5412001C, // 0008 LDINT R4 29 + 0x58140002, // 0009 LDCONST R5 K2 + 0x50180000, // 000A LDBOOL R6 0 0 + 0x7C040A00, // 000B CALL R1 5 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _compute_pbkdf +********************************************************************/ +be_local_closure(Matter_Device__compute_pbkdf, /* name */ + be_nested_proto( + 13, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(add), + /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), + /* K3 */ be_nested_str_weak(derive), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(root_w0), + /* K6 */ be_nested_str_weak(EC_P256), + /* K7 */ be_nested_str_weak(mod), + /* K8 */ be_nested_str_weak(root_L), + /* K9 */ be_nested_str_weak(public_key), + }), + be_str_weak(_compute_pbkdf), + &be_const_str_solidified, + ( &(const binstruction[40]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0x60140015, // 0001 GETGBL R5 G21 + 0x7C140000, // 0002 CALL R5 0 + 0x8C140B01, // 0003 GETMET R5 R5 K1 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x54220003, // 0005 LDINT R8 4 + 0x7C140600, // 0006 CALL R5 3 + 0x8C180902, // 0007 GETMET R6 R4 K2 + 0x7C180200, // 0008 CALL R6 1 + 0x8C180D03, // 0009 GETMET R6 R6 K3 + 0x5C200A00, // 000A MOVE R8 R5 + 0x5C240600, // 000B MOVE R9 R3 + 0x5C280400, // 000C MOVE R10 R2 + 0x542E004F, // 000D LDINT R11 80 + 0x7C180A00, // 000E CALL R6 5 + 0x541E0026, // 000F LDINT R7 39 + 0x401E0807, // 0010 CONNECT R7 K4 R7 + 0x941C0C07, // 0011 GETIDX R7 R6 R7 + 0x54220027, // 0012 LDINT R8 40 + 0x5426004E, // 0013 LDINT R9 79 + 0x40201009, // 0014 CONNECT R8 R8 R9 + 0x94200C08, // 0015 GETIDX R8 R6 R8 + 0x8C240906, // 0016 GETMET R9 R4 K6 + 0x7C240200, // 0017 CALL R9 1 + 0x8C241307, // 0018 GETMET R9 R9 K7 + 0x5C2C0E00, // 0019 MOVE R11 R7 + 0x7C240400, // 001A CALL R9 2 + 0x90020A09, // 001B SETMBR R0 K5 R9 + 0x8C240906, // 001C GETMET R9 R4 K6 + 0x7C240200, // 001D CALL R9 1 + 0x8C241307, // 001E GETMET R9 R9 K7 + 0x5C2C1000, // 001F MOVE R11 R8 + 0x7C240400, // 0020 CALL R9 2 + 0x8C280906, // 0021 GETMET R10 R4 K6 + 0x7C280200, // 0022 CALL R10 1 + 0x8C281509, // 0023 GETMET R10 R10 K9 + 0x5C301200, // 0024 MOVE R12 R9 + 0x7C280400, // 0025 CALL R10 2 + 0x9002100A, // 0026 SETMBR R0 K8 R10 + 0x80000000, // 0027 RET 0 }) ) ); @@ -5044,114 +5073,135 @@ be_local_closure(Matter_Device_mdns_announce_PASE, /* name */ /******************************************************************** -** Solidified function: bridge_add_endpoint +** Solidified function: save_param ********************************************************************/ -be_local_closure(Matter_Device_bridge_add_endpoint, /* name */ +be_local_closure(Matter_Device_save_param, /* name */ be_nested_proto( - 17, /* nstack */ - 3, /* argc */ + 10, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(log), - /* K4 */ be_nested_str_weak(MTR_X3A_X20unknown_X20class_X20name_X20_X27), - /* K5 */ be_nested_str_weak(_X27_X20skipping), - /* K6 */ be_const_int(3), - /* K7 */ be_nested_str_weak(next_ep), - /* K8 */ be_nested_str_weak(plugins), - /* K9 */ be_nested_str_weak(push), - /* K10 */ be_nested_str_weak(type), - /* K11 */ be_nested_str_weak(keys), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(MTR_X3A_X20adding_X20endpoint_X20_X3D_X20_X25i_X20type_X3A_X25s_X25s), - /* K14 */ be_nested_str_weak(conf_to_log), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(plugins_config), - /* K17 */ be_nested_str_weak(plugins_persist), - /* K18 */ be_const_int(1), - /* K19 */ be_nested_str_weak(save_param), - /* K20 */ be_nested_str_weak(signal_endpoints_changed), + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(json), + /* K1 */ be_nested_str_weak(update_remotes_info), + /* K2 */ be_nested_str_weak(_X7B_X22distinguish_X22_X3A_X25i_X2C_X22passcode_X22_X3A_X25i_X2C_X22ipv4only_X22_X3A_X25s_X2C_X22disable_bridge_mode_X22_X3A_X25s_X2C_X22nextep_X22_X3A_X25i), + /* K3 */ be_nested_str_weak(root_discriminator), + /* K4 */ be_nested_str_weak(root_passcode), + /* K5 */ be_nested_str_weak(ipv4only), + /* K6 */ be_nested_str_weak(true), + /* K7 */ be_nested_str_weak(false), + /* K8 */ be_nested_str_weak(disable_bridge_mode), + /* K9 */ be_nested_str_weak(next_ep), + /* K10 */ be_nested_str_weak(plugins_persist), + /* K11 */ be_nested_str_weak(_X2C_X22config_X22_X3A), + /* K12 */ be_nested_str_weak(dump), + /* K13 */ be_nested_str_weak(plugins_config), + /* K14 */ be_nested_str_weak(plugins_config_remotes), + /* K15 */ be_const_int(0), + /* K16 */ be_nested_str_weak(_X2C_X22remotes_X22_X3A), + /* K17 */ be_nested_str_weak(_X7D), + /* K18 */ be_nested_str_weak(FILENAME), + /* K19 */ be_nested_str_weak(w), + /* K20 */ be_nested_str_weak(write), + /* K21 */ be_nested_str_weak(close), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(log), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20parameters_X25s), + /* K25 */ be_nested_str_weak(_X20and_X20configuration), + /* K26 */ be_nested_str_weak(), + /* K27 */ be_const_int(2), + /* K28 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K29 */ be_nested_str_weak(_X7C), }), - be_str_weak(bridge_add_endpoint), + be_str_weak(save_param), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x4C100000, // 0004 LDNIL R4 - 0x1C100604, // 0005 EQ R4 R3 R4 - 0x78120009, // 0006 JMPF R4 #0011 - 0xB8120400, // 0007 GETNGBL R4 K2 - 0x8C100903, // 0008 GETMET R4 R4 K3 - 0x60180008, // 0009 GETGBL R6 G8 - 0x5C1C0200, // 000A MOVE R7 R1 - 0x7C180200, // 000B CALL R6 1 - 0x001A0806, // 000C ADD R6 K4 R6 - 0x00180D05, // 000D ADD R6 R6 K5 + ( &(const binstruction[82]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x8C080101, // 0001 GETMET R2 R0 K1 + 0x7C080200, // 0002 CALL R2 1 + 0x60080018, // 0003 GETGBL R2 G24 + 0x580C0002, // 0004 LDCONST R3 K2 + 0x88100103, // 0005 GETMBR R4 R0 K3 + 0x88140104, // 0006 GETMBR R5 R0 K4 + 0x88180105, // 0007 GETMBR R6 R0 K5 + 0x781A0001, // 0008 JMPF R6 #000B + 0x58180006, // 0009 LDCONST R6 K6 + 0x70020000, // 000A JMP #000C + 0x58180007, // 000B LDCONST R6 K7 + 0x881C0108, // 000C GETMBR R7 R0 K8 + 0x781E0001, // 000D JMPF R7 #0010 0x581C0006, // 000E LDCONST R7 K6 - 0x7C100600, // 000F CALL R4 3 - 0x80000800, // 0010 RET 0 - 0x88100107, // 0011 GETMBR R4 R0 K7 - 0x60140008, // 0012 GETGBL R5 G8 - 0x5C180800, // 0013 MOVE R6 R4 - 0x7C140200, // 0014 CALL R5 1 - 0x5C180600, // 0015 MOVE R6 R3 - 0x5C1C0000, // 0016 MOVE R7 R0 - 0x5C200800, // 0017 MOVE R8 R4 - 0x5C240400, // 0018 MOVE R9 R2 - 0x7C180600, // 0019 CALL R6 3 - 0x881C0108, // 001A GETMBR R7 R0 K8 - 0x8C1C0F09, // 001B GETMET R7 R7 K9 - 0x5C240C00, // 001C MOVE R9 R6 - 0x7C1C0400, // 001D CALL R7 2 - 0x601C0013, // 001E GETGBL R7 G19 - 0x7C1C0000, // 001F CALL R7 0 - 0x981E1401, // 0020 SETIDX R7 K10 R1 - 0x60200010, // 0021 GETGBL R8 G16 - 0x8C24050B, // 0022 GETMET R9 R2 K11 - 0x7C240200, // 0023 CALL R9 1 - 0x7C200200, // 0024 CALL R8 1 - 0xA8020004, // 0025 EXBLK 0 #002B - 0x5C241000, // 0026 MOVE R9 R8 - 0x7C240000, // 0027 CALL R9 0 - 0x94280409, // 0028 GETIDX R10 R2 R9 - 0x981C120A, // 0029 SETIDX R7 R9 R10 - 0x7001FFFA, // 002A JMP #0026 - 0x5820000C, // 002B LDCONST R8 K12 - 0xAC200200, // 002C CATCH R8 1 0 - 0xB0080000, // 002D RAISE 2 R0 R0 - 0xB8220400, // 002E GETNGBL R8 K2 - 0x8C201103, // 002F GETMET R8 R8 K3 - 0x60280018, // 0030 GETGBL R10 G24 - 0x582C000D, // 0031 LDCONST R11 K13 - 0x5C300800, // 0032 MOVE R12 R4 - 0x5C340200, // 0033 MOVE R13 R1 - 0x8C38010E, // 0034 GETMET R14 R0 K14 - 0x5C400400, // 0035 MOVE R16 R2 - 0x7C380400, // 0036 CALL R14 2 - 0x7C280800, // 0037 CALL R10 4 - 0x582C000F, // 0038 LDCONST R11 K15 - 0x7C200600, // 0039 CALL R8 3 - 0x88200110, // 003A GETMBR R8 R0 K16 - 0x98200A07, // 003B SETIDX R8 R5 R7 - 0x50200200, // 003C LDBOOL R8 1 0 - 0x90022208, // 003D SETMBR R0 K17 R8 - 0x88200107, // 003E GETMBR R8 R0 K7 - 0x00201112, // 003F ADD R8 R8 K18 - 0x90020E08, // 0040 SETMBR R0 K7 R8 - 0x8C200113, // 0041 GETMET R8 R0 K19 - 0x7C200200, // 0042 CALL R8 1 - 0x8C200114, // 0043 GETMET R8 R0 K20 - 0x7C200200, // 0044 CALL R8 1 - 0x80040800, // 0045 RET 1 R4 + 0x70020000, // 000F JMP #0011 + 0x581C0007, // 0010 LDCONST R7 K7 + 0x88200109, // 0011 GETMBR R8 R0 K9 + 0x7C080C00, // 0012 CALL R2 6 + 0x880C010A, // 0013 GETMBR R3 R0 K10 + 0x780E000E, // 0014 JMPF R3 #0024 + 0x0008050B, // 0015 ADD R2 R2 K11 + 0x8C0C030C, // 0016 GETMET R3 R1 K12 + 0x8814010D, // 0017 GETMBR R5 R0 K13 + 0x7C0C0400, // 0018 CALL R3 2 + 0x00080403, // 0019 ADD R2 R2 R3 + 0x600C000C, // 001A GETGBL R3 G12 + 0x8810010E, // 001B GETMBR R4 R0 K14 + 0x7C0C0200, // 001C CALL R3 1 + 0x240C070F, // 001D GT R3 R3 K15 + 0x780E0004, // 001E JMPF R3 #0024 + 0x00080510, // 001F ADD R2 R2 K16 + 0x8C0C030C, // 0020 GETMET R3 R1 K12 + 0x8814010E, // 0021 GETMBR R5 R0 K14 + 0x7C0C0400, // 0022 CALL R3 2 + 0x00080403, // 0023 ADD R2 R2 R3 + 0x00080511, // 0024 ADD R2 R2 K17 + 0xA8020018, // 0025 EXBLK 0 #003F + 0x600C0011, // 0026 GETGBL R3 G17 + 0x88100112, // 0027 GETMBR R4 R0 K18 + 0x58140013, // 0028 LDCONST R5 K19 + 0x7C0C0400, // 0029 CALL R3 2 + 0x8C100714, // 002A GETMET R4 R3 K20 + 0x5C180400, // 002B MOVE R6 R2 + 0x7C100400, // 002C CALL R4 2 + 0x8C100715, // 002D GETMET R4 R3 K21 + 0x7C100200, // 002E CALL R4 1 + 0xB8122C00, // 002F GETNGBL R4 K22 + 0x8C100917, // 0030 GETMET R4 R4 K23 + 0x60180018, // 0031 GETGBL R6 G24 + 0x581C0018, // 0032 LDCONST R7 K24 + 0x8820010A, // 0033 GETMBR R8 R0 K10 + 0x78220001, // 0034 JMPF R8 #0037 + 0x58200019, // 0035 LDCONST R8 K25 + 0x70020000, // 0036 JMP #0038 + 0x5820001A, // 0037 LDCONST R8 K26 + 0x7C180400, // 0038 CALL R6 2 + 0x581C001B, // 0039 LDCONST R7 K27 + 0x7C100600, // 003A CALL R4 3 + 0xA8040001, // 003B EXBLK 1 1 + 0x80040400, // 003C RET 1 R2 + 0xA8040001, // 003D EXBLK 1 1 + 0x70020011, // 003E JMP #0051 + 0xAC0C0002, // 003F CATCH R3 0 2 + 0x7002000E, // 0040 JMP #0050 + 0xB8162C00, // 0041 GETNGBL R5 K22 + 0x8C140B17, // 0042 GETMET R5 R5 K23 + 0x601C0008, // 0043 GETGBL R7 G8 + 0x5C200600, // 0044 MOVE R8 R3 + 0x7C1C0200, // 0045 CALL R7 1 + 0x001E3807, // 0046 ADD R7 K28 R7 + 0x001C0F1D, // 0047 ADD R7 R7 K29 + 0x60200008, // 0048 GETGBL R8 G8 + 0x5C240800, // 0049 MOVE R9 R4 + 0x7C200200, // 004A CALL R8 1 + 0x001C0E08, // 004B ADD R7 R7 R8 + 0x5820001B, // 004C LDCONST R8 K27 + 0x7C140600, // 004D CALL R5 3 + 0x80040400, // 004E RET 1 R2 + 0x70020000, // 004F JMP #0051 + 0xB0080000, // 0050 RAISE 2 R0 R0 + 0x80000000, // 0051 RET 0 }) ) ); @@ -5291,36 +5341,81 @@ be_local_closure(Matter_Device_start_mdns_announce_hostnames, /* name */ /******************************************************************** -** Solidified function: get_plugin_class_arg +** Solidified function: k2l_num ********************************************************************/ -be_local_closure(Matter_Device_get_plugin_class_arg, /* name */ +be_local_closure(Matter_Device_k2l_num, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(plugins_classes), - /* K1 */ be_nested_str_weak(find), - /* K2 */ be_nested_str_weak(ARG), - /* K3 */ be_nested_str_weak(), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Device), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + /* K4 */ be_const_int(1), + /* K5 */ be_const_int(0), }), - be_str_weak(get_plugin_class_arg), + be_str_weak(k2l_num), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x880C0502, // 0005 GETMBR R3 R2 K2 - 0x70020000, // 0006 JMP #0008 - 0x580C0003, // 0007 LDCONST R3 K3 - 0x80040600, // 0008 RET 1 R3 + ( &(const binstruction[52]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080012, // 0001 GETGBL R2 G18 + 0x7C080000, // 0002 CALL R2 0 + 0x4C0C0000, // 0003 LDNIL R3 + 0x1C0C0003, // 0004 EQ R3 R0 R3 + 0x780E0000, // 0005 JMPF R3 #0007 + 0x80040400, // 0006 RET 1 R2 + 0x600C0010, // 0007 GETGBL R3 G16 + 0x8C100101, // 0008 GETMET R4 R0 K1 + 0x7C100200, // 0009 CALL R4 1 + 0x7C0C0200, // 000A CALL R3 1 + 0xA8020007, // 000B EXBLK 0 #0014 + 0x5C100600, // 000C MOVE R4 R3 + 0x7C100000, // 000D CALL R4 0 + 0x8C140502, // 000E GETMET R5 R2 K2 + 0x601C0009, // 000F GETGBL R7 G9 + 0x5C200800, // 0010 MOVE R8 R4 + 0x7C1C0200, // 0011 CALL R7 1 + 0x7C140400, // 0012 CALL R5 2 + 0x7001FFF7, // 0013 JMP #000C + 0x580C0003, // 0014 LDCONST R3 K3 + 0xAC0C0200, // 0015 CATCH R3 1 0 + 0xB0080000, // 0016 RAISE 2 R0 R0 + 0x600C0010, // 0017 GETGBL R3 G16 + 0x6010000C, // 0018 GETGBL R4 G12 + 0x5C140400, // 0019 MOVE R5 R2 + 0x7C100200, // 001A CALL R4 1 + 0x04100904, // 001B SUB R4 R4 K4 + 0x40120804, // 001C CONNECT R4 K4 R4 + 0x7C0C0200, // 001D CALL R3 1 + 0xA8020010, // 001E EXBLK 0 #0030 + 0x5C100600, // 001F MOVE R4 R3 + 0x7C100000, // 0020 CALL R4 0 + 0x94140404, // 0021 GETIDX R5 R2 R4 + 0x5C180800, // 0022 MOVE R6 R4 + 0x241C0D05, // 0023 GT R7 R6 K5 + 0x781E0008, // 0024 JMPF R7 #002E + 0x041C0D04, // 0025 SUB R7 R6 K4 + 0x941C0407, // 0026 GETIDX R7 R2 R7 + 0x241C0E05, // 0027 GT R7 R7 R5 + 0x781E0004, // 0028 JMPF R7 #002E + 0x041C0D04, // 0029 SUB R7 R6 K4 + 0x941C0407, // 002A GETIDX R7 R2 R7 + 0x98080C07, // 002B SETIDX R2 R6 R7 + 0x04180D04, // 002C SUB R6 R6 K4 + 0x7001FFF4, // 002D JMP #0023 + 0x98080C05, // 002E SETIDX R2 R6 R5 + 0x7001FFEE, // 002F JMP #001F + 0x580C0003, // 0030 LDCONST R3 K3 + 0xAC0C0200, // 0031 CATCH R3 1 0 + 0xB0080000, // 0032 RAISE 2 R0 R0 + 0x80040400, // 0033 RET 1 R2 }) ) ); @@ -5407,183 +5502,6 @@ be_local_closure(Matter_Device_autoconf_device, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: MtrJoin -********************************************************************/ -be_local_closure(Matter_Device_MtrJoin, /* name */ - be_nested_proto( - 8, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(start_root_basic_commissioning), - /* K1 */ be_nested_str_weak(stop_basic_commissioning), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(resp_cmnd_done), - }), - be_str_weak(MtrJoin), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60140009, // 0000 GETGBL R5 G9 - 0x5C180600, // 0001 MOVE R6 R3 - 0x7C140200, // 0002 CALL R5 1 - 0x78160002, // 0003 JMPF R5 #0007 - 0x8C180100, // 0004 GETMET R6 R0 K0 - 0x7C180200, // 0005 CALL R6 1 - 0x70020001, // 0006 JMP #0009 - 0x8C180101, // 0007 GETMET R6 R0 K1 - 0x7C180200, // 0008 CALL R6 1 - 0xB81A0400, // 0009 GETNGBL R6 K2 - 0x8C180D03, // 000A GETMET R6 R6 K3 - 0x7C180200, // 000B CALL R6 1 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _compute_pbkdf -********************************************************************/ -be_local_closure(Matter_Device__compute_pbkdf, /* name */ - be_nested_proto( - 13, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(add), - /* K2 */ be_nested_str_weak(PBKDF2_HMAC_SHA256), - /* K3 */ be_nested_str_weak(derive), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(root_w0), - /* K6 */ be_nested_str_weak(EC_P256), - /* K7 */ be_nested_str_weak(mod), - /* K8 */ be_nested_str_weak(root_L), - /* K9 */ be_nested_str_weak(public_key), - }), - be_str_weak(_compute_pbkdf), - &be_const_str_solidified, - ( &(const binstruction[40]) { /* code */ - 0xA4120000, // 0000 IMPORT R4 K0 - 0x60140015, // 0001 GETGBL R5 G21 - 0x7C140000, // 0002 CALL R5 0 - 0x8C140B01, // 0003 GETMET R5 R5 K1 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x54220003, // 0005 LDINT R8 4 - 0x7C140600, // 0006 CALL R5 3 - 0x8C180902, // 0007 GETMET R6 R4 K2 - 0x7C180200, // 0008 CALL R6 1 - 0x8C180D03, // 0009 GETMET R6 R6 K3 - 0x5C200A00, // 000A MOVE R8 R5 - 0x5C240600, // 000B MOVE R9 R3 - 0x5C280400, // 000C MOVE R10 R2 - 0x542E004F, // 000D LDINT R11 80 - 0x7C180A00, // 000E CALL R6 5 - 0x541E0026, // 000F LDINT R7 39 - 0x401E0807, // 0010 CONNECT R7 K4 R7 - 0x941C0C07, // 0011 GETIDX R7 R6 R7 - 0x54220027, // 0012 LDINT R8 40 - 0x5426004E, // 0013 LDINT R9 79 - 0x40201009, // 0014 CONNECT R8 R8 R9 - 0x94200C08, // 0015 GETIDX R8 R6 R8 - 0x8C240906, // 0016 GETMET R9 R4 K6 - 0x7C240200, // 0017 CALL R9 1 - 0x8C241307, // 0018 GETMET R9 R9 K7 - 0x5C2C0E00, // 0019 MOVE R11 R7 - 0x7C240400, // 001A CALL R9 2 - 0x90020A09, // 001B SETMBR R0 K5 R9 - 0x8C240906, // 001C GETMET R9 R4 K6 - 0x7C240200, // 001D CALL R9 1 - 0x8C241307, // 001E GETMET R9 R9 K7 - 0x5C2C1000, // 001F MOVE R11 R8 - 0x7C240400, // 0020 CALL R9 2 - 0x8C280906, // 0021 GETMET R10 R4 K6 - 0x7C280200, // 0022 CALL R10 1 - 0x8C281509, // 0023 GETMET R10 R10 K9 - 0x5C301200, // 0024 MOVE R12 R9 - 0x7C280400, // 0025 CALL R10 2 - 0x9002100A, // 0026 SETMBR R0 K8 R10 - 0x80000000, // 0027 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: register_commands -********************************************************************/ -be_local_closure(Matter_Device_register_commands, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x68100000, // 0000 GETUPV R4 U0 - 0x8C100900, // 0001 GETMET R4 R4 K0 - 0x5C180000, // 0002 MOVE R6 R0 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80040800, // 0007 RET 1 R4 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(add_cmd), - /* K2 */ be_nested_str_weak(MtrJoin), - }), - be_str_weak(register_commands), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x580C0002, // 0002 LDCONST R3 K2 - 0x84100000, // 0003 CLOSURE R4 P0 - 0x7C040600, // 0004 CALL R1 3 - 0xA0000000, // 0005 CLOSE R0 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: remove_fabric ********************************************************************/ @@ -5684,20 +5602,188 @@ be_local_closure(Matter_Device_remove_fabric, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: autoconf_sensors_list +********************************************************************/ +be_local_closure(Matter_Device_autoconf_sensors_list, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(k2l), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(Temperature), + /* K3 */ be_nested_str_weak(_X23Temperature), + /* K4 */ be_nested_str_weak(push), + /* K5 */ be_nested_str_weak(type), + /* K6 */ be_nested_str_weak(temperature), + /* K7 */ be_nested_str_weak(filter), + /* K8 */ be_nested_str_weak(stop_iteration), + /* K9 */ be_nested_str_weak(Pressure), + /* K10 */ be_nested_str_weak(_X23Pressure), + /* K11 */ be_nested_str_weak(pressure), + /* K12 */ be_nested_str_weak(Illuminance), + /* K13 */ be_nested_str_weak(_X23Illuminance), + /* K14 */ be_nested_str_weak(illuminance), + /* K15 */ be_nested_str_weak(Humidity), + /* K16 */ be_nested_str_weak(_X23Humidity), + /* K17 */ be_nested_str_weak(humidity), + }), + be_str_weak(autoconf_sensors_list), + &be_const_str_solidified, + ( &(const binstruction[119]) { /* code */ + 0x60080012, // 0000 GETGBL R2 G18 + 0x7C080000, // 0001 CALL R2 0 + 0x600C0010, // 0002 GETGBL R3 G16 + 0x8C100100, // 0003 GETMET R4 R0 K0 + 0x5C180200, // 0004 MOVE R6 R1 + 0x7C100400, // 0005 CALL R4 2 + 0x7C0C0200, // 0006 CALL R3 1 + 0xA8020013, // 0007 EXBLK 0 #001C + 0x5C100600, // 0008 MOVE R4 R3 + 0x7C100000, // 0009 CALL R4 0 + 0x94140204, // 000A GETIDX R5 R1 R4 + 0x6018000F, // 000B GETGBL R6 G15 + 0x5C1C0A00, // 000C MOVE R7 R5 + 0x60200013, // 000D GETGBL R8 G19 + 0x7C180400, // 000E CALL R6 2 + 0x781A000A, // 000F JMPF R6 #001B + 0x8C180B01, // 0010 GETMET R6 R5 K1 + 0x58200002, // 0011 LDCONST R8 K2 + 0x7C180400, // 0012 CALL R6 2 + 0x781A0006, // 0013 JMPF R6 #001B + 0x00180903, // 0014 ADD R6 R4 K3 + 0x8C1C0504, // 0015 GETMET R7 R2 K4 + 0x60240013, // 0016 GETGBL R9 G19 + 0x7C240000, // 0017 CALL R9 0 + 0x98260B06, // 0018 SETIDX R9 K5 K6 + 0x98260E06, // 0019 SETIDX R9 K7 R6 + 0x7C1C0400, // 001A CALL R7 2 + 0x7001FFEB, // 001B JMP #0008 + 0x580C0008, // 001C LDCONST R3 K8 + 0xAC0C0200, // 001D CATCH R3 1 0 + 0xB0080000, // 001E RAISE 2 R0 R0 + 0x600C0010, // 001F GETGBL R3 G16 + 0x8C100100, // 0020 GETMET R4 R0 K0 + 0x5C180200, // 0021 MOVE R6 R1 + 0x7C100400, // 0022 CALL R4 2 + 0x7C0C0200, // 0023 CALL R3 1 + 0xA8020013, // 0024 EXBLK 0 #0039 + 0x5C100600, // 0025 MOVE R4 R3 + 0x7C100000, // 0026 CALL R4 0 + 0x94140204, // 0027 GETIDX R5 R1 R4 + 0x6018000F, // 0028 GETGBL R6 G15 + 0x5C1C0A00, // 0029 MOVE R7 R5 + 0x60200013, // 002A GETGBL R8 G19 + 0x7C180400, // 002B CALL R6 2 + 0x781A000A, // 002C JMPF R6 #0038 + 0x8C180B01, // 002D GETMET R6 R5 K1 + 0x58200009, // 002E LDCONST R8 K9 + 0x7C180400, // 002F CALL R6 2 + 0x781A0006, // 0030 JMPF R6 #0038 + 0x0018090A, // 0031 ADD R6 R4 K10 + 0x8C1C0504, // 0032 GETMET R7 R2 K4 + 0x60240013, // 0033 GETGBL R9 G19 + 0x7C240000, // 0034 CALL R9 0 + 0x98260B0B, // 0035 SETIDX R9 K5 K11 + 0x98260E06, // 0036 SETIDX R9 K7 R6 + 0x7C1C0400, // 0037 CALL R7 2 + 0x7001FFEB, // 0038 JMP #0025 + 0x580C0008, // 0039 LDCONST R3 K8 + 0xAC0C0200, // 003A CATCH R3 1 0 + 0xB0080000, // 003B RAISE 2 R0 R0 + 0x600C0010, // 003C GETGBL R3 G16 + 0x8C100100, // 003D GETMET R4 R0 K0 + 0x5C180200, // 003E MOVE R6 R1 + 0x7C100400, // 003F CALL R4 2 + 0x7C0C0200, // 0040 CALL R3 1 + 0xA8020013, // 0041 EXBLK 0 #0056 + 0x5C100600, // 0042 MOVE R4 R3 + 0x7C100000, // 0043 CALL R4 0 + 0x94140204, // 0044 GETIDX R5 R1 R4 + 0x6018000F, // 0045 GETGBL R6 G15 + 0x5C1C0A00, // 0046 MOVE R7 R5 + 0x60200013, // 0047 GETGBL R8 G19 + 0x7C180400, // 0048 CALL R6 2 + 0x781A000A, // 0049 JMPF R6 #0055 + 0x8C180B01, // 004A GETMET R6 R5 K1 + 0x5820000C, // 004B LDCONST R8 K12 + 0x7C180400, // 004C CALL R6 2 + 0x781A0006, // 004D JMPF R6 #0055 + 0x0018090D, // 004E ADD R6 R4 K13 + 0x8C1C0504, // 004F GETMET R7 R2 K4 + 0x60240013, // 0050 GETGBL R9 G19 + 0x7C240000, // 0051 CALL R9 0 + 0x98260B0E, // 0052 SETIDX R9 K5 K14 + 0x98260E06, // 0053 SETIDX R9 K7 R6 + 0x7C1C0400, // 0054 CALL R7 2 + 0x7001FFEB, // 0055 JMP #0042 + 0x580C0008, // 0056 LDCONST R3 K8 + 0xAC0C0200, // 0057 CATCH R3 1 0 + 0xB0080000, // 0058 RAISE 2 R0 R0 + 0x600C0010, // 0059 GETGBL R3 G16 + 0x8C100100, // 005A GETMET R4 R0 K0 + 0x5C180200, // 005B MOVE R6 R1 + 0x7C100400, // 005C CALL R4 2 + 0x7C0C0200, // 005D CALL R3 1 + 0xA8020013, // 005E EXBLK 0 #0073 + 0x5C100600, // 005F MOVE R4 R3 + 0x7C100000, // 0060 CALL R4 0 + 0x94140204, // 0061 GETIDX R5 R1 R4 + 0x6018000F, // 0062 GETGBL R6 G15 + 0x5C1C0A00, // 0063 MOVE R7 R5 + 0x60200013, // 0064 GETGBL R8 G19 + 0x7C180400, // 0065 CALL R6 2 + 0x781A000A, // 0066 JMPF R6 #0072 + 0x8C180B01, // 0067 GETMET R6 R5 K1 + 0x5820000F, // 0068 LDCONST R8 K15 + 0x7C180400, // 0069 CALL R6 2 + 0x781A0006, // 006A JMPF R6 #0072 + 0x00180910, // 006B ADD R6 R4 K16 + 0x8C1C0504, // 006C GETMET R7 R2 K4 + 0x60240013, // 006D GETGBL R9 G19 + 0x7C240000, // 006E CALL R9 0 + 0x98260B11, // 006F SETIDX R9 K5 K17 + 0x98260E06, // 0070 SETIDX R9 K7 R6 + 0x7C1C0400, // 0071 CALL R7 2 + 0x7001FFEB, // 0072 JMP #005F + 0x580C0008, // 0073 LDCONST R3 K8 + 0xAC0C0200, // 0074 CATCH R3 1 0 + 0xB0080000, // 0075 RAISE 2 R0 R0 + 0x80040400, // 0076 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Device ********************************************************************/ be_local_class(Matter_Device, 37, NULL, - be_nested_map(109, + be_nested_map(110, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(plugins_classes, 34), be_const_var(3) }, - { be_const_key_weak(commissioning_L, -1), be_const_var(17) }, - { be_const_key_weak(autoconf_sensors_list, -1), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, - { be_const_key_weak(_start_udp, 47), be_const_closure(Matter_Device__start_udp_closure) }, - { be_const_key_weak(start_operational_discovery, 46), be_const_closure(Matter_Device_start_operational_discovery_closure) }, - { be_const_key_weak(sessions, -1), be_const_var(9) }, + { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, + { be_const_key_weak(plugins, 84), be_const_var(1) }, + { be_const_key_weak(autoconf_sensors_list, 41), be_const_closure(Matter_Device_autoconf_sensors_list_closure) }, + { be_const_key_weak(tick, -1), be_const_var(11) }, + { be_const_key_weak(process_attribute_read_solo, -1), be_const_closure(Matter_Device_process_attribute_read_solo_closure) }, + { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(26) }, + { be_const_key_weak(PASE_TIMEOUT, -1), be_const_int(600) }, + { be_const_key_weak(commissioning_iterations, -1), be_const_var(13) }, + { be_const_key_weak(root_passcode, -1), be_const_var(29) }, + { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, + { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, + { be_const_key_weak(root_discriminator, 35), be_const_var(28) }, { be_const_key_weak(PASSCODE_INVALID, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { be_const_list( * be_nested_list(12, ( (struct bvalue*) &(const bvalue[]) { @@ -5714,108 +5800,102 @@ be_local_class(Matter_Device, be_const_int(12345678), be_const_int(87654321), })) ) } )) }, - { be_const_key_weak(is_commissioning_open, 41), be_const_closure(Matter_Device_is_commissioning_open_closure) }, - { be_const_key_weak(hostname_wifi, -1), be_const_var(21) }, - { be_const_key_weak(plugins_config_remotes, 106), be_const_var(5) }, - { be_const_key_weak(load_param, 92), be_const_closure(Matter_Device_load_param_closure) }, - { be_const_key_weak(profiler, -1), be_const_var(7) }, - { be_const_key_weak(tick, 36), be_const_var(11) }, - { be_const_key_weak(root_w0, -1), be_const_var(35) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, - { be_const_key_weak(ui, -1), be_const_var(10) }, - { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, - { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, - { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, - { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, - { be_const_key_weak(register_commands, 61), be_const_closure(Matter_Device_register_commands_closure) }, - { be_const_key_weak(register_http_remote, -1), be_const_closure(Matter_Device_register_http_remote_closure) }, - { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, - { be_const_key_weak(PASE_TIMEOUT, 57), be_const_int(600) }, - { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, - { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, - { be_const_key_weak(mdns_pase_eth, -1), be_const_var(25) }, - { be_const_key_weak(MtrJoin, -1), be_const_closure(Matter_Device_MtrJoin_closure) }, - { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, - { be_const_key_weak(http_remotes, 27), be_const_var(27) }, + { be_const_key_weak(stop_basic_commissioning, 90), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, { be_const_key_weak(start_commissioning_complete, -1), be_const_closure(Matter_Device_start_commissioning_complete_closure) }, - { be_const_key_weak(root_passcode, 73), be_const_var(29) }, - { be_const_key_weak(every_250ms, 104), be_const_closure(Matter_Device_every_250ms_closure) }, - { be_const_key_weak(autoconf_device, 54), be_const_closure(Matter_Device_autoconf_device_closure) }, - { be_const_key_weak(get_plugin_class_arg, -1), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, - { be_const_key_weak(start_mdns_announce_hostnames, 43), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_Device_stop_closure) }, - { be_const_key_weak(sort_distinct, 69), be_const_static_closure(Matter_Device_sort_distinct_closure) }, - { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, - { be_const_key_weak(productid, -1), be_const_var(24) }, - { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, - { be_const_key_weak(started, 108), be_const_var(0) }, - { be_const_key_weak(get_plugin_remote_info, -1), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, - { be_const_key_weak(commissioning_w0, -1), be_const_var(16) }, - { be_const_key_weak(bridge_add_endpoint, -1), be_const_closure(Matter_Device_bridge_add_endpoint_closure) }, - { be_const_key_weak(PRODUCT_ID, -1), be_const_int(32768) }, - { be_const_key_weak(hostname_eth, -1), be_const_var(22) }, - { be_const_key_weak(mdns_announce_PASE, 19), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, - { be_const_key_weak(PBKDF_ITERATIONS, 38), be_const_int(1000) }, - { be_const_key_weak(bridge_remove_endpoint, 20), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, - { be_const_key_weak(commissioning_salt, 100), be_const_var(15) }, - { be_const_key_weak(find_plugin_by_endpoint, 96), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, - { be_const_key_weak(root_discriminator, -1), be_const_var(28) }, - { be_const_key_weak(every_50ms, 48), be_const_closure(Matter_Device_every_50ms_closure) }, - { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, - { be_const_key_weak(start_commissioning_complete_deferred, -1), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, - { be_const_key_weak(msg_send, 85), be_const_closure(Matter_Device_msg_send_closure) }, - { be_const_key_weak(clean_remotes, -1), be_const_closure(Matter_Device_clean_remotes_closure) }, - { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, - { be_const_key_weak(init, 35), be_const_closure(Matter_Device_init_closure) }, - { be_const_key_weak(FILENAME, -1), be_nested_str_weak(_matter_device_X2Ejson) }, - { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, 75), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(stop_basic_commissioning, -1), be_const_closure(Matter_Device_stop_basic_commissioning_closure) }, - { be_const_key_weak(get_plugin_class_displayname, -1), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, - { be_const_key_weak(vendorid, 39), be_const_var(23) }, - { be_const_key_weak(generate_random_passcode, -1), be_const_closure(Matter_Device_generate_random_passcode_closure) }, - { be_const_key_weak(save_before_restart, 91), be_const_closure(Matter_Device_save_before_restart_closure) }, - { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, - { be_const_key_weak(_init_basic_commissioning, 88), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, - { be_const_key_weak(commissioning_iterations, 28), be_const_var(13) }, - { be_const_key_weak(process_attribute_expansion, 60), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, - { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, - { be_const_key_weak(next_ep, -1), be_const_var(32) }, - { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, - { be_const_key_weak(k2l_num, 83), be_const_static_closure(Matter_Device_k2l_num_closure) }, - { be_const_key_weak(compute_manual_pairing_code, -1), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, - { be_const_key_weak(udp_server, 33), be_const_var(6) }, - { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, - { be_const_key_weak(mdns_announce_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_all_fabrics_closure) }, - { be_const_key_weak(mdns_remove_PASE, -1), be_const_closure(Matter_Device_mdns_remove_PASE_closure) }, - { be_const_key_weak(compute_qrcode_content, 81), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, - { be_const_key_weak(mdns_pase_wifi, -1), be_const_var(26) }, - { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, - { be_const_key_weak(ipv4only, -1), be_const_var(30) }, - { be_const_key_weak(invoke_request, 67), be_const_closure(Matter_Device_invoke_request_closure) }, { be_const_key_weak(root_iterations, -1), be_const_var(33) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, - { be_const_key_weak(commissioning_open, -1), be_const_var(12) }, - { be_const_key_weak(disable_bridge_mode, 95), be_const_var(31) }, - { be_const_key_weak(adjust_next_ep, 52), be_const_closure(Matter_Device_adjust_next_ep_closure) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_Device_msg_received_closure) }, - { be_const_key_weak(mdns_remove_op_discovery, 101), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, - { be_const_key_weak(update_remotes_info, -1), be_const_closure(Matter_Device_update_remotes_info_closure) }, - { be_const_key_weak(conf_to_log, 44), be_const_static_closure(Matter_Device_conf_to_log_closure) }, - { be_const_key_weak(message_handler, -1), be_const_var(8) }, - { be_const_key_weak(plugins, -1), be_const_var(1) }, - { be_const_key_weak(root_salt, 99), be_const_var(34) }, - { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, - { be_const_key_weak(commissioning_admin_fabric, -1), be_const_var(18) }, - { be_const_key_weak(commissioning_discriminator, -1), be_const_var(14) }, - { be_const_key_weak(root_L, -1), be_const_var(36) }, - { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, - { be_const_key_weak(attribute_updated, 31), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(get_plugin_remote_info, 94), be_const_closure(Matter_Device_get_plugin_remote_info_closure) }, + { be_const_key_weak(sessions, -1), be_const_var(9) }, + { be_const_key_weak(commissioning_L, -1), be_const_var(17) }, + { be_const_key_weak(commissioning_admin_fabric, 82), be_const_var(18) }, { be_const_key_weak(commissioning_instance_eth, -1), be_const_var(20) }, - { be_const_key_weak(plugins_config, 25), be_const_var(4) }, - { be_const_key_weak(_compute_pbkdf, -1), be_const_closure(Matter_Device__compute_pbkdf_closure) }, - { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(19) }, - { be_const_key_weak(remove_fabric, 11), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(start_operational_discovery_deferred, -1), be_const_closure(Matter_Device_start_operational_discovery_deferred_closure) }, + { be_const_key_weak(process_attribute_expansion, -1), be_const_closure(Matter_Device_process_attribute_expansion_closure) }, + { be_const_key_weak(hostname_eth, 63), be_const_var(22) }, + { be_const_key_weak(autoconf_device, 78), be_const_closure(Matter_Device_autoconf_device_closure) }, + { be_const_key_weak(next_ep, -1), be_const_var(32) }, + { be_const_key_weak(stop, 92), be_const_closure(Matter_Device_stop_closure) }, + { be_const_key_weak(msg_received, 36), be_const_closure(Matter_Device_msg_received_closure) }, + { be_const_key_weak(k2l, -1), be_const_static_closure(Matter_Device_k2l_closure) }, + { be_const_key_weak(register_http_remote, 11), be_const_closure(Matter_Device_register_http_remote_closure) }, + { be_const_key_weak(get_plugin_class_arg, 106), be_const_closure(Matter_Device_get_plugin_class_arg_closure) }, + { be_const_key_weak(FILENAME, 91), be_nested_str_weak(_matter_device_X2Ejson) }, + { be_const_key_weak(compute_manual_pairing_code, 104), be_const_closure(Matter_Device_compute_manual_pairing_code_closure) }, + { be_const_key_weak(is_commissioning_open, -1), be_const_closure(Matter_Device_is_commissioning_open_closure) }, + { be_const_key_weak(event_fabrics_saved, -1), be_const_closure(Matter_Device_event_fabrics_saved_closure) }, + { be_const_key_weak(root_L, 48), be_const_var(36) }, + { be_const_key_weak(compute_qrcode_content, 22), be_const_closure(Matter_Device_compute_qrcode_content_closure) }, + { be_const_key_weak(plugins_config_remotes, -1), be_const_var(5) }, + { be_const_key_weak(commissioning_open, 25), be_const_var(12) }, + { be_const_key_weak(every_250ms, 83), be_const_closure(Matter_Device_every_250ms_closure) }, + { be_const_key_weak(start_mdns_announce_hostnames, -1), be_const_closure(Matter_Device_start_mdns_announce_hostnames_closure) }, + { be_const_key_weak(sort_distinct, 29), be_const_static_closure(Matter_Device_sort_distinct_closure) }, + { be_const_key_weak(save_param, -1), be_const_closure(Matter_Device_save_param_closure) }, + { be_const_key_weak(find_plugin_by_endpoint, -1), be_const_closure(Matter_Device_find_plugin_by_endpoint_closure) }, + { be_const_key_weak(_compute_pbkdf, 64), be_const_closure(Matter_Device__compute_pbkdf_closure) }, + { be_const_key_weak(started, -1), be_const_var(0) }, { be_const_key_weak(signal_endpoints_changed, -1), be_const_closure(Matter_Device_signal_endpoints_changed_closure) }, + { be_const_key_weak(start_basic_commissioning, -1), be_const_closure(Matter_Device_start_basic_commissioning_closure) }, + { be_const_key_weak(start, -1), be_const_closure(Matter_Device_start_closure) }, + { be_const_key_weak(udp_server, -1), be_const_var(6) }, + { be_const_key_weak(VENDOR_ID, -1), be_const_int(65521) }, + { be_const_key_weak(commissioning_w0, 100), be_const_var(16) }, + { be_const_key_weak(commissioning_salt, 99), be_const_var(15) }, + { be_const_key_weak(PRODUCT_ID, 44), be_const_int(32768) }, + { be_const_key_weak(mdns_pase_eth, 96), be_const_var(25) }, + { be_const_key_weak(commissioning_instance_wifi, -1), be_const_var(19) }, + { be_const_key_weak(UDP_PORT, -1), be_const_int(5540) }, + { be_const_key_weak(_start_udp, 57), be_const_closure(Matter_Device__start_udp_closure) }, + { be_const_key_weak(load_param, -1), be_const_closure(Matter_Device_load_param_closure) }, + { be_const_key_weak(register_native_classes, -1), be_const_closure(Matter_Device_register_native_classes_closure) }, + { be_const_key_weak(register_commands, -1), be_const_closure(Matter_Device_register_commands_closure) }, + { be_const_key_weak(autoconf_device_map, -1), be_const_closure(Matter_Device_autoconf_device_map_closure) }, + { be_const_key_weak(received_ack, -1), be_const_closure(Matter_Device_received_ack_closure) }, + { be_const_key_weak(disable_bridge_mode, -1), be_const_var(31) }, + { be_const_key_weak(start_commissioning_complete_deferred, 93), be_const_closure(Matter_Device_start_commissioning_complete_deferred_closure) }, + { be_const_key_weak(plugins_config, -1), be_const_var(4) }, + { be_const_key_weak(get_active_endpoints, -1), be_const_closure(Matter_Device_get_active_endpoints_closure) }, + { be_const_key_weak(_mdns_announce_hostname, -1), be_const_closure(Matter_Device__mdns_announce_hostname_closure) }, + { be_const_key_weak(register_plugin_class, -1), be_const_closure(Matter_Device_register_plugin_class_closure) }, + { be_const_key_weak(plugins_persist, -1), be_const_var(2) }, + { be_const_key_weak(generate_random_passcode, 49), be_const_closure(Matter_Device_generate_random_passcode_closure) }, + { be_const_key_weak(profiler, 21), be_const_var(7) }, + { be_const_key_weak(attribute_updated, -1), be_const_closure(Matter_Device_attribute_updated_closure) }, + { be_const_key_weak(MtrJoin, 3), be_const_closure(Matter_Device_MtrJoin_closure) }, + { be_const_key_weak(init, 79), be_const_closure(Matter_Device_init_closure) }, + { be_const_key_weak(get_plugin_class_displayname, 70), be_const_closure(Matter_Device_get_plugin_class_displayname_closure) }, + { be_const_key_weak(bridge_remove_endpoint, 60), be_const_closure(Matter_Device_bridge_remove_endpoint_closure) }, + { be_const_key_weak(message_handler, -1), be_const_var(8) }, + { be_const_key_weak(start_root_basic_commissioning, -1), be_const_closure(Matter_Device_start_root_basic_commissioning_closure) }, + { be_const_key_weak(ipv4only, -1), be_const_var(30) }, + { be_const_key_weak(productid, -1), be_const_var(24) }, + { be_const_key_weak(mdns_remove_op_discovery_all_fabrics, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_all_fabrics_closure) }, + { be_const_key_weak(conf_to_log, 33), be_const_static_closure(Matter_Device_conf_to_log_closure) }, + { be_const_key_weak(_instantiate_plugins_from_config, -1), be_const_closure(Matter_Device__instantiate_plugins_from_config_closure) }, + { be_const_key_weak(root_w0, 73), be_const_var(35) }, + { be_const_key_weak(hostname_wifi, -1), be_const_var(21) }, + { be_const_key_weak(invoke_request, 69), be_const_closure(Matter_Device_invoke_request_closure) }, + { be_const_key_weak(every_50ms, 66), be_const_closure(Matter_Device_every_50ms_closure) }, + { be_const_key_weak(_init_basic_commissioning, 45), be_const_closure(Matter_Device__init_basic_commissioning_closure) }, + { be_const_key_weak(adjust_next_ep, -1), be_const_closure(Matter_Device_adjust_next_ep_closure) }, + { be_const_key_weak(root_salt, -1), be_const_var(34) }, + { be_const_key_weak(ui, 108), be_const_var(10) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_Device_every_second_closure) }, + { be_const_key_weak(_trigger_read_sensors, -1), be_const_closure(Matter_Device__trigger_read_sensors_closure) }, + { be_const_key_weak(update_remotes_info, 47), be_const_closure(Matter_Device_update_remotes_info_closure) }, + { be_const_key_weak(mdns_remove_op_discovery, -1), be_const_closure(Matter_Device_mdns_remove_op_discovery_closure) }, + { be_const_key_weak(mdns_announce_PASE, -1), be_const_closure(Matter_Device_mdns_announce_PASE_closure) }, + { be_const_key_weak(save_before_restart, 43), be_const_closure(Matter_Device_save_before_restart_closure) }, + { be_const_key_weak(msg_send, -1), be_const_closure(Matter_Device_msg_send_closure) }, + { be_const_key_weak(mdns_announce_op_discovery, -1), be_const_closure(Matter_Device_mdns_announce_op_discovery_closure) }, + { be_const_key_weak(k2l_num, -1), be_const_static_closure(Matter_Device_k2l_num_closure) }, + { be_const_key_weak(vendorid, -1), be_const_var(23) }, + { be_const_key_weak(http_remotes, -1), be_const_var(27) }, + { be_const_key_weak(plugins_classes, -1), be_const_var(3) }, + { be_const_key_weak(commissioning_discriminator, -1), be_const_var(14) }, + { be_const_key_weak(is_root_commissioning_open, -1), be_const_closure(Matter_Device_is_root_commissioning_open_closure) }, + { be_const_key_weak(remove_fabric, -1), be_const_closure(Matter_Device_remove_fabric_closure) }, + { be_const_key_weak(start_operational_discovery, -1), be_const_closure(Matter_Device_start_operational_discovery_closure) }, + { be_const_key_weak(PBKDF_ITERATIONS, 2), be_const_int(1000) }, })), be_str_weak(Matter_Device) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Expirable.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Expirable.h index 59867c307..4888f31a9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Expirable.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Expirable.h @@ -129,11 +129,10 @@ be_local_closure(Matter_Expirable_has_expired, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(rtc), - /* K2 */ be_nested_str_weak(utc), - /* K3 */ be_nested_str_weak(_expiration), + /* K1 */ be_nested_str_weak(rtc_utc), + /* K2 */ be_nested_str_weak(_expiration), }), be_str_weak(has_expired), &be_const_str_solidified, @@ -144,12 +143,12 @@ be_local_closure(Matter_Expirable_has_expired, /* name */ 0xB80A0000, // 0003 GETNGBL R2 K0 0x8C080501, // 0004 GETMET R2 R2 K1 0x7C080200, // 0005 CALL R2 1 - 0x94040502, // 0006 GETIDX R1 R2 K2 - 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x5C040400, // 0006 MOVE R1 R2 + 0x88080102, // 0007 GETMBR R2 R0 K2 0x4C0C0000, // 0008 LDNIL R3 0x20080403, // 0009 NE R2 R2 R3 0x780A0002, // 000A JMPF R2 #000E - 0x88080103, // 000B GETMBR R2 R0 K3 + 0x88080102, // 000B GETMBR R2 R0 K2 0x28080202, // 000C GE R2 R1 R2 0x80040400, // 000D RET 1 R2 0x50080000, // 000E LDBOOL R2 0 0 @@ -224,11 +223,10 @@ be_local_closure(Matter_Expirable_set_expire_in_seconds, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(rtc), - /* K2 */ be_nested_str_weak(utc), - /* K3 */ be_nested_str_weak(set_expire_time), + /* K1 */ be_nested_str_weak(rtc_utc), + /* K2 */ be_nested_str_weak(set_expire_time), }), be_str_weak(set_expire_in_seconds), &be_const_str_solidified, @@ -243,8 +241,8 @@ be_local_closure(Matter_Expirable_set_expire_in_seconds, /* name */ 0xB80E0000, // 0007 GETNGBL R3 K0 0x8C0C0701, // 0008 GETMET R3 R3 K1 0x7C0C0200, // 0009 CALL R3 1 - 0x94080702, // 000A GETIDX R2 R3 K2 - 0x8C0C0103, // 000B GETMET R3 R0 K3 + 0x5C080600, // 000A MOVE R2 R3 + 0x8C0C0102, // 000B GETMET R3 R0 K2 0x00140401, // 000C ADD R5 R2 R1 0x7C0C0400, // 000D CALL R3 2 0x80000000, // 000E RET 0 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h index f8d35d9da..046f20836 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Fabric.h @@ -389,7 +389,7 @@ be_local_closure(Matter_Fabric_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ + ( &(const bvalue[17]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(_store), /* K2 */ be_nested_str_weak(_sessions), @@ -399,19 +399,18 @@ be_local_closure(Matter_Fabric_init, /* name */ /* K6 */ be_nested_str_weak(), /* K7 */ be_nested_str_weak(created), /* K8 */ be_nested_str_weak(tasmota), - /* K9 */ be_nested_str_weak(rtc), - /* K10 */ be_nested_str_weak(utc), - /* K11 */ be_nested_str_weak(_counter_group_data_snd_impl), - /* K12 */ be_nested_str_weak(Counter), - /* K13 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), - /* K14 */ be_nested_str_weak(counter_group_data_snd), - /* K15 */ be_nested_str_weak(next), - /* K16 */ be_nested_str_weak(_GROUP_SND_INCR), - /* K17 */ be_nested_str_weak(counter_group_ctrl_snd), + /* K9 */ be_nested_str_weak(rtc_utc), + /* K10 */ be_nested_str_weak(_counter_group_data_snd_impl), + /* K11 */ be_nested_str_weak(Counter), + /* K12 */ be_nested_str_weak(_counter_group_ctrl_snd_impl), + /* K13 */ be_nested_str_weak(counter_group_data_snd), + /* K14 */ be_nested_str_weak(next), + /* K15 */ be_nested_str_weak(_GROUP_SND_INCR), + /* K16 */ be_nested_str_weak(counter_group_ctrl_snd), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ + ( &(const binstruction[32]) { /* code */ 0xA40A0000, // 0000 IMPORT R2 K0 0x90020201, // 0001 SETMBR R0 K1 R1 0xB80E0600, // 0002 GETNGBL R3 K3 @@ -422,29 +421,28 @@ be_local_closure(Matter_Fabric_init, /* name */ 0xB80E1000, // 0007 GETNGBL R3 K8 0x8C0C0709, // 0008 GETMET R3 R3 K9 0x7C0C0200, // 0009 CALL R3 1 - 0x940C070A, // 000A GETIDX R3 R3 K10 - 0x90020E03, // 000B SETMBR R0 K7 R3 - 0xB80E0600, // 000C GETNGBL R3 K3 - 0x8C0C070C, // 000D GETMET R3 R3 K12 - 0x7C0C0200, // 000E CALL R3 1 - 0x90021603, // 000F SETMBR R0 K11 R3 - 0xB80E0600, // 0010 GETNGBL R3 K3 - 0x8C0C070C, // 0011 GETMET R3 R3 K12 - 0x7C0C0200, // 0012 CALL R3 1 - 0x90021A03, // 0013 SETMBR R0 K13 R3 - 0x880C010B, // 0014 GETMBR R3 R0 K11 - 0x8C0C070F, // 0015 GETMET R3 R3 K15 - 0x7C0C0200, // 0016 CALL R3 1 - 0x88100110, // 0017 GETMBR R4 R0 K16 - 0x000C0604, // 0018 ADD R3 R3 R4 - 0x90021C03, // 0019 SETMBR R0 K14 R3 - 0x880C010B, // 001A GETMBR R3 R0 K11 - 0x8C0C070F, // 001B GETMET R3 R3 K15 - 0x7C0C0200, // 001C CALL R3 1 - 0x88100110, // 001D GETMBR R4 R0 K16 - 0x000C0604, // 001E ADD R3 R3 R4 - 0x90022203, // 001F SETMBR R0 K17 R3 - 0x80000000, // 0020 RET 0 + 0x90020E03, // 000A SETMBR R0 K7 R3 + 0xB80E0600, // 000B GETNGBL R3 K3 + 0x8C0C070B, // 000C GETMET R3 R3 K11 + 0x7C0C0200, // 000D CALL R3 1 + 0x90021403, // 000E SETMBR R0 K10 R3 + 0xB80E0600, // 000F GETNGBL R3 K3 + 0x8C0C070B, // 0010 GETMET R3 R3 K11 + 0x7C0C0200, // 0011 CALL R3 1 + 0x90021803, // 0012 SETMBR R0 K12 R3 + 0x880C010A, // 0013 GETMBR R3 R0 K10 + 0x8C0C070E, // 0014 GETMET R3 R3 K14 + 0x7C0C0200, // 0015 CALL R3 1 + 0x8810010F, // 0016 GETMBR R4 R0 K15 + 0x000C0604, // 0017 ADD R3 R3 R4 + 0x90021A03, // 0018 SETMBR R0 K13 R3 + 0x880C010A, // 0019 GETMBR R3 R0 K10 + 0x8C0C070E, // 001A GETMET R3 R3 K14 + 0x7C0C0200, // 001B CALL R3 1 + 0x8810010F, // 001C GETMBR R4 R0 K15 + 0x000C0604, // 001D ADD R3 R3 R4 + 0x90022003, // 001E SETMBR R0 K16 R3 + 0x80000000, // 001F RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h index 9aa8fd572..ee1c0bc37 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_HTTP_remote.h @@ -19,28 +19,26 @@ be_local_closure(Matter_HTTP_remote_device_is_alive, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(reachable), /* K1 */ be_nested_str_weak(reachable_utc), /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(rtc), - /* K4 */ be_nested_str_weak(utc), + /* K3 */ be_nested_str_weak(rtc_utc), }), be_str_weak(device_is_alive), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x78060007, // 0000 JMPF R1 #0009 + ( &(const binstruction[11]) { /* code */ + 0x78060006, // 0000 JMPF R1 #0008 0x50080200, // 0001 LDBOOL R2 1 0 0x90020002, // 0002 SETMBR R0 K0 R2 0xB80A0400, // 0003 GETNGBL R2 K2 0x8C080503, // 0004 GETMET R2 R2 K3 0x7C080200, // 0005 CALL R2 1 - 0x94080504, // 0006 GETIDX R2 R2 K4 - 0x90020202, // 0007 SETMBR R0 K1 R2 - 0x70020001, // 0008 JMP #000B - 0x50080000, // 0009 LDBOOL R2 0 0 - 0x90020002, // 000A SETMBR R0 K0 R2 - 0x80000000, // 000B RET 0 + 0x90020202, // 0006 SETMBR R0 K1 R2 + 0x70020001, // 0007 JMP #000A + 0x50080000, // 0008 LDBOOL R2 0 0 + 0x90020002, // 0009 SETMBR R0 K0 R2 + 0x80000000, // 000A RET 0 }) ) ); @@ -460,36 +458,34 @@ be_local_closure(Matter_HTTP_remote_web_last_seen, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ + ( &(const bvalue[ 6]) { /* constants */ /* K0 */ be_nested_str_weak(webserver), /* K1 */ be_nested_str_weak(reachable_utc), /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(rtc), - /* K4 */ be_nested_str_weak(utc), - /* K5 */ be_nested_str_weak(matter), - /* K6 */ be_nested_str_weak(seconds_to_dhm), + /* K3 */ be_nested_str_weak(rtc_utc), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(seconds_to_dhm), }), be_str_weak(web_last_seen), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[17]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x5409FFFE, // 0001 LDINT R2 -1 0x880C0101, // 0002 GETMBR R3 R0 K1 0x4C100000, // 0003 LDNIL R4 0x200C0604, // 0004 NE R3 R3 R4 - 0x780E0006, // 0005 JMPF R3 #000D + 0x780E0005, // 0005 JMPF R3 #000C 0xB80E0400, // 0006 GETNGBL R3 K2 0x8C0C0703, // 0007 GETMET R3 R3 K3 0x7C0C0200, // 0008 CALL R3 1 - 0x940C0704, // 0009 GETIDX R3 R3 K4 - 0x88100101, // 000A GETMBR R4 R0 K1 - 0x040C0604, // 000B SUB R3 R3 R4 - 0x5C080600, // 000C MOVE R2 R3 - 0xB80E0A00, // 000D GETNGBL R3 K5 - 0x8C0C0706, // 000E GETMET R3 R3 K6 - 0x5C140400, // 000F MOVE R5 R2 - 0x7C0C0400, // 0010 CALL R3 2 - 0x80040600, // 0011 RET 1 R3 + 0x88100101, // 0009 GETMBR R4 R0 K1 + 0x040C0604, // 000A SUB R3 R3 R4 + 0x5C080600, // 000B MOVE R2 R3 + 0xB80E0800, // 000C GETNGBL R3 K4 + 0x8C0C0705, // 000D GETMET R3 R3 K5 + 0x5C140400, // 000E MOVE R5 R2 + 0x7C0C0400, // 000F CALL R3 2 + 0x80040600, // 0010 RET 1 R3 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 07196c19c..83028f004 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -7,11 +7,11 @@ extern const bclass be_class_Matter_IM; /******************************************************************** -** Solidified function: expire_sendqueue +** Solidified function: every_250ms ********************************************************************/ -be_local_closure(Matter_IM_expire_sendqueue, /* name */ +be_local_closure(Matter_IM_every_250ms, /* name */ be_nested_proto( - 6, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,43 +19,835 @@ be_local_closure(Matter_IM_expire_sendqueue, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_int(0), - /* K1 */ be_nested_str_weak(send_queue), - /* K2 */ be_nested_str_weak(tasmota), - /* K3 */ be_nested_str_weak(time_reached), - /* K4 */ be_nested_str_weak(expiration), - /* K5 */ be_nested_str_weak(reached_timeout), - /* K6 */ be_nested_str_weak(remove), - /* K7 */ be_const_int(1), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(subs_shop), + /* K1 */ be_nested_str_weak(every_250ms), }), - be_str_weak(expire_sendqueue), + be_str_weak(every_250ms), &be_const_str_solidified, - ( &(const binstruction[24]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x6008000C, // 0001 GETGBL R2 G12 - 0x880C0101, // 0002 GETMBR R3 R0 K1 - 0x7C080200, // 0003 CALL R2 1 - 0x14080202, // 0004 LT R2 R1 R2 - 0x780A000F, // 0005 JMPF R2 #0016 - 0x88080101, // 0006 GETMBR R2 R0 K1 - 0x94080401, // 0007 GETIDX R2 R2 R1 - 0xB80E0400, // 0008 GETNGBL R3 K2 - 0x8C0C0703, // 0009 GETMET R3 R3 K3 - 0x88140504, // 000A GETMBR R5 R2 K4 - 0x7C0C0400, // 000B CALL R3 2 - 0x780E0006, // 000C JMPF R3 #0014 - 0x8C0C0505, // 000D GETMET R3 R2 K5 - 0x7C0C0200, // 000E CALL R3 1 - 0x880C0101, // 000F GETMBR R3 R0 K1 - 0x8C0C0706, // 0010 GETMET R3 R3 K6 - 0x5C140200, // 0011 MOVE R5 R1 - 0x7C0C0400, // 0012 CALL R3 2 - 0x70020000, // 0013 JMP #0015 - 0x00040307, // 0014 ADD R1 R1 K7 - 0x7001FFEA, // 0015 JMP #0001 - 0x4C080000, // 0016 LDNIL R2 - 0x80040400, // 0017 RET 1 R2 + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_incoming_ack +********************************************************************/ +be_local_closure(Matter_IM_process_incoming_ack, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(find_sendqueue_by_exchangeid), + /* K1 */ be_nested_str_weak(exchange_id), + /* K2 */ be_nested_str_weak(ack_received), + }), + be_str_weak(process_incoming_ack), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x88100301, // 0001 GETMBR R4 R1 K1 + 0x7C080400, // 0002 CALL R2 2 + 0x780A0003, // 0003 JMPF R2 #0008 + 0x8C0C0502, // 0004 GETMET R3 R2 K2 + 0x5C140200, // 0005 MOVE R5 R1 + 0x7C0C0400, // 0006 CALL R3 2 + 0x80040600, // 0007 RET 1 R3 + 0x500C0000, // 0008 LDBOOL R3 0 0 + 0x80040600, // 0009 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_response +********************************************************************/ +be_local_closure(Matter_IM_subscribe_response, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(SubscribeResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), + }), + be_str_weak(subscribe_response), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_write_response +********************************************************************/ +be_local_closure(Matter_IM_process_write_response, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(WriteResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), + }), + be_str_weak(process_write_response), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_status_response +********************************************************************/ +be_local_closure(Matter_IM_process_status_response, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(findsubval), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(find_sendqueue_by_exchangeid), + /* K3 */ be_nested_str_weak(exchange_id), + /* K4 */ be_nested_str_weak(matter), + /* K5 */ be_nested_str_weak(SUCCESS), + /* K6 */ be_nested_str_weak(status_ok_received), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20_X3EOK_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i_X20not_X20found), + /* K10 */ be_nested_str_weak(session), + /* K11 */ be_nested_str_weak(local_session_id), + /* K12 */ be_nested_str_weak(MTR_X3A_X20_X3EStatus_X20_X20_X20_X20ERROR_X20_X3D_X200x_X2502X), + /* K13 */ be_const_int(3), + /* K14 */ be_nested_str_weak(status_error_received), + /* K15 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), + }), + be_str_weak(process_status_response), + &be_const_str_solidified, + ( &(const binstruction[45]) { /* code */ + 0x8C0C0500, // 0000 GETMET R3 R2 K0 + 0x58140001, // 0001 LDCONST R5 K1 + 0x541A00FE, // 0002 LDINT R6 255 + 0x7C0C0600, // 0003 CALL R3 3 + 0x8C100102, // 0004 GETMET R4 R0 K2 + 0x88180303, // 0005 GETMBR R6 R1 K3 + 0x7C100400, // 0006 CALL R4 2 + 0xB8160800, // 0007 GETNGBL R5 K4 + 0x88140B05, // 0008 GETMBR R5 R5 K5 + 0x1C140605, // 0009 EQ R5 R3 R5 + 0x78160010, // 000A JMPF R5 #001C + 0x78120004, // 000B JMPF R4 #0011 + 0x8C140906, // 000C GETMET R5 R4 K6 + 0x5C1C0200, // 000D MOVE R7 R1 + 0x7C140400, // 000E CALL R5 2 + 0x80040A00, // 000F RET 1 R5 + 0x70020009, // 0010 JMP #001B + 0xB8160E00, // 0011 GETNGBL R5 K7 + 0x8C140B08, // 0012 GETMET R5 R5 K8 + 0x601C0018, // 0013 GETGBL R7 G24 + 0x58200009, // 0014 LDCONST R8 K9 + 0x8824030A, // 0015 GETMBR R9 R1 K10 + 0x8824130B, // 0016 GETMBR R9 R9 K11 + 0x88280303, // 0017 GETMBR R10 R1 K3 + 0x7C1C0600, // 0018 CALL R7 3 + 0x54220003, // 0019 LDINT R8 4 + 0x7C140600, // 001A CALL R5 3 + 0x7002000E, // 001B JMP #002B + 0xB8160E00, // 001C GETNGBL R5 K7 + 0x8C140B08, // 001D GETMET R5 R5 K8 + 0x601C0018, // 001E GETGBL R7 G24 + 0x5820000C, // 001F LDCONST R8 K12 + 0x5C240600, // 0020 MOVE R9 R3 + 0x7C1C0400, // 0021 CALL R7 2 + 0x5820000D, // 0022 LDCONST R8 K13 + 0x7C140600, // 0023 CALL R5 3 + 0x78120005, // 0024 JMPF R4 #002B + 0x8C14090E, // 0025 GETMET R5 R4 K14 + 0x5C1C0200, // 0026 MOVE R7 R1 + 0x7C140400, // 0027 CALL R5 2 + 0x8C14010F, // 0028 GETMET R5 R0 K15 + 0x881C0303, // 0029 GETMBR R7 R1 K3 + 0x7C140400, // 002A CALL R5 2 + 0x50140000, // 002B LDBOOL R5 0 0 + 0x80040A00, // 002C RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_timed_request +********************************************************************/ +be_local_closure(Matter_IM_process_timed_request, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TimedRequestMessage), + /* K2 */ be_nested_str_weak(from_TLV), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20TimedRequest_X3D_X25i), + /* K6 */ be_nested_str_weak(session), + /* K7 */ be_nested_str_weak(local_session_id), + /* K8 */ be_nested_str_weak(timeout), + /* K9 */ be_const_int(3), + /* K10 */ be_nested_str_weak(send_status), + /* K11 */ be_nested_str_weak(SUCCESS), + }), + be_str_weak(process_timed_request), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0xB8120600, // 0006 GETNGBL R4 K3 + 0x8C100904, // 0007 GETMET R4 R4 K4 + 0x60180018, // 0008 GETGBL R6 G24 + 0x581C0005, // 0009 LDCONST R7 K5 + 0x88200306, // 000A GETMBR R8 R1 K6 + 0x88201107, // 000B GETMBR R8 R8 K7 + 0x88240708, // 000C GETMBR R9 R3 K8 + 0x7C180600, // 000D CALL R6 3 + 0x581C0009, // 000E LDCONST R7 K9 + 0x7C100600, // 000F CALL R4 3 + 0x8C10010A, // 0010 GETMET R4 R0 K10 + 0x5C180200, // 0011 MOVE R6 R1 + 0xB81E0000, // 0012 GETNGBL R7 K0 + 0x881C0F0B, // 0013 GETMBR R7 R7 K11 + 0x7C100600, // 0014 CALL R4 3 + 0x50100200, // 0015 LDBOOL R4 1 0 + 0x80040800, // 0016 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attributedata2raw +********************************************************************/ +be_local_closure(Matter_IM_attributedata2raw, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(add), + /* K1 */ be_const_int(355795236), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(path2raw), + /* K4 */ be_nested_str_weak(tag_sub), + /* K5 */ be_const_int(2), + /* K6 */ be_nested_str_weak(tlv2raw), + }), + be_str_weak(attributedata2raw), + &be_const_str_solidified, + ( &(const binstruction[22]) { /* code */ + 0x8C100300, // 0000 GETMET R4 R1 K0 + 0x58180001, // 0001 LDCONST R6 K1 + 0x541DFFFB, // 0002 LDINT R7 -4 + 0x7C100600, // 0003 CALL R4 3 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x58180002, // 0005 LDCONST R6 K2 + 0x541DFFFD, // 0006 LDINT R7 -2 + 0x7C100600, // 0007 CALL R4 3 + 0x8C100103, // 0008 GETMET R4 R0 K3 + 0x5C180200, // 0009 MOVE R6 R1 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x58200002, // 000B LDCONST R8 K2 + 0x7C100800, // 000C CALL R4 4 + 0x900E0905, // 000D SETMBR R3 K4 K5 + 0x8C100706, // 000E GETMET R4 R3 K6 + 0x5C180200, // 000F MOVE R6 R1 + 0x7C100400, // 0010 CALL R4 2 + 0x8C100300, // 0011 GETMET R4 R1 K0 + 0x541A1817, // 0012 LDINT R6 6168 + 0x541DFFFD, // 0013 LDINT R7 -2 + 0x7C100600, // 0014 CALL R4 3 + 0x80000000, // 0015 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_invoke_request_solo +********************************************************************/ +be_local_closure(Matter_IM_process_invoke_request_solo, /* name */ + be_nested_proto( + 16, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[46]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(invoke_request_solo_start), + /* K4 */ be_nested_str_weak(msg), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K7 */ be_nested_str_weak(get_command_name), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(command), + /* K10 */ be_nested_str_weak(device), + /* K11 */ be_nested_str_weak(invoke_request), + /* K12 */ be_nested_str_weak(session), + /* K13 */ be_nested_str_weak(command_fields), + /* K14 */ be_nested_str_weak(COMMAND_X20DONE), + /* K15 */ be_nested_str_weak(_X28), + /* K16 */ be_nested_str_weak(_X29_X20), + /* K17 */ be_nested_str_weak(), + /* K18 */ be_nested_str_weak(endpoint), + /* K19 */ be_const_int(0), + /* K20 */ be_const_int(2), + /* K21 */ be_const_int(3), + /* K22 */ be_nested_str_weak(tasmota), + /* K23 */ be_nested_str_weak(loglevel), + /* K24 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand1_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), + /* K25 */ be_nested_str_weak(local_session_id), + /* K26 */ be_nested_str_weak(add), + /* K27 */ be_const_int(354943030), + /* K28 */ be_const_int(1), + /* K29 */ be_nested_str_weak(MTR_X3A_X20res_X3D_X25s_X20ctx_X2Estatus_X3D_X25s), + /* K30 */ be_nested_str_weak(SUCCESS), + /* K31 */ be_nested_str_weak(invokeresponse2raw), + /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K33 */ be_nested_str_weak(exchange_id), + /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K36 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K37 */ be_const_int(405077761), + /* K38 */ be_nested_str_weak(build_response), + /* K39 */ be_nested_str_weak(message_handler), + /* K40 */ be_nested_str_weak(raw), + /* K41 */ be_nested_str_weak(clear), + /* K42 */ be_nested_str_weak(encode_frame), + /* K43 */ be_nested_str_weak(encrypt), + /* K44 */ be_nested_str_weak(send_response_frame), + /* K45 */ be_nested_str_weak(RESPONSE_X20SENT), + }), + be_str_weak(process_invoke_request_solo), + &be_const_str_solidified, + ( &(const binstruction[223]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0x900A0801, // 0005 SETMBR R2 K4 R1 + 0xB80E0000, // 0006 GETNGBL R3 K0 + 0x880C0706, // 0007 GETMBR R3 R3 K6 + 0x900A0A03, // 0008 SETMBR R2 K5 R3 + 0xB80E0000, // 0009 GETNGBL R3 K0 + 0x8C0C0707, // 000A GETMET R3 R3 K7 + 0x88140508, // 000B GETMBR R5 R2 K8 + 0x88180509, // 000C GETMBR R6 R2 K9 + 0x7C0C0600, // 000D CALL R3 3 + 0x60100008, // 000E GETGBL R4 G8 + 0x5C140400, // 000F MOVE R5 R2 + 0x7C100200, // 0010 CALL R4 1 + 0x8814010A, // 0011 GETMBR R5 R0 K10 + 0x8C140B0B, // 0012 GETMET R5 R5 K11 + 0x881C030C, // 0013 GETMBR R7 R1 K12 + 0x8820050D, // 0014 GETMBR R8 R2 K13 + 0x5C240400, // 0015 MOVE R9 R2 + 0x7C140800, // 0016 CALL R5 4 + 0xB81A0000, // 0017 GETNGBL R6 K0 + 0x88180D01, // 0018 GETMBR R6 R6 K1 + 0x8C180D02, // 0019 GETMET R6 R6 K2 + 0x5820000E, // 001A LDCONST R8 K14 + 0x7C180400, // 001B CALL R6 2 + 0x88180502, // 001C GETMBR R6 R2 K2 + 0x4C1C0000, // 001D LDNIL R7 + 0x20180C07, // 001E NE R6 R6 R7 + 0x781A0005, // 001F JMPF R6 #0026 + 0x60180008, // 0020 GETGBL R6 G8 + 0x881C0502, // 0021 GETMBR R7 R2 K2 + 0x7C180200, // 0022 CALL R6 1 + 0x001A1E06, // 0023 ADD R6 K15 R6 + 0x00180D10, // 0024 ADD R6 R6 K16 + 0x70020000, // 0025 JMP #0027 + 0x58180011, // 0026 LDCONST R6 K17 + 0x881C0512, // 0027 GETMBR R7 R2 K18 + 0x201C0F13, // 0028 NE R7 R7 K19 + 0x781E0001, // 0029 JMPF R7 #002C + 0x581C0014, // 002A LDCONST R7 K20 + 0x70020000, // 002B JMP #002D + 0x581C0015, // 002C LDCONST R7 K21 + 0xB8222C00, // 002D GETNGBL R8 K22 + 0x8C201117, // 002E GETMET R8 R8 K23 + 0x5C280E00, // 002F MOVE R10 R7 + 0x7C200400, // 0030 CALL R8 2 + 0x7822000E, // 0031 JMPF R8 #0041 + 0xB8222C00, // 0032 GETNGBL R8 K22 + 0x8C201102, // 0033 GETMET R8 R8 K2 + 0x60280018, // 0034 GETGBL R10 G24 + 0x582C0018, // 0035 LDCONST R11 K24 + 0x8830030C, // 0036 GETMBR R12 R1 K12 + 0x88301919, // 0037 GETMBR R12 R12 K25 + 0x5C340800, // 0038 MOVE R13 R4 + 0x780E0001, // 0039 JMPF R3 #003C + 0x5C380600, // 003A MOVE R14 R3 + 0x70020000, // 003B JMP #003D + 0x58380011, // 003C LDCONST R14 K17 + 0x5C3C0C00, // 003D MOVE R15 R6 + 0x7C280A00, // 003E CALL R10 5 + 0x5C2C0E00, // 003F MOVE R11 R7 + 0x7C200600, // 0040 CALL R8 3 + 0x4C200000, // 0041 LDNIL R8 + 0x900A0408, // 0042 SETMBR R2 K2 R8 + 0x60200015, // 0043 GETGBL R8 G21 + 0x5426002F, // 0044 LDINT R9 48 + 0x7C200200, // 0045 CALL R8 1 + 0x8C24111A, // 0046 GETMET R9 R8 K26 + 0x582C001B, // 0047 LDCONST R11 K27 + 0x5431FFFB, // 0048 LDINT R12 -4 + 0x7C240600, // 0049 CALL R9 3 + 0x8C24111A, // 004A GETMET R9 R8 K26 + 0x582C001C, // 004B LDCONST R11 K28 + 0x5830001C, // 004C LDCONST R12 K28 + 0x7C240600, // 004D CALL R9 3 + 0xB8262C00, // 004E GETNGBL R9 K22 + 0x8C241302, // 004F GETMET R9 R9 K2 + 0x602C0018, // 0050 GETGBL R11 G24 + 0x5830001D, // 0051 LDCONST R12 K29 + 0x5C340A00, // 0052 MOVE R13 R5 + 0x88380505, // 0053 GETMBR R14 R2 K5 + 0x7C2C0600, // 0054 CALL R11 3 + 0x58300015, // 0055 LDCONST R12 K21 + 0x7C240600, // 0056 CALL R9 3 + 0x50240200, // 0057 LDBOOL R9 1 0 + 0x1C240A09, // 0058 EQ R9 R5 R9 + 0x74260004, // 0059 JMPT R9 #005F + 0x88240505, // 005A GETMBR R9 R2 K5 + 0xB82A0000, // 005B GETNGBL R10 K0 + 0x8828151E, // 005C GETMBR R10 R10 K30 + 0x1C24120A, // 005D EQ R9 R9 R10 + 0x78260017, // 005E JMPF R9 #0077 + 0xB8260000, // 005F GETNGBL R9 K0 + 0x8824131E, // 0060 GETMBR R9 R9 K30 + 0x900A0A09, // 0061 SETMBR R2 K5 R9 + 0x8C24011F, // 0062 GETMET R9 R0 K31 + 0x5C2C1000, // 0063 MOVE R11 R8 + 0x5C300400, // 0064 MOVE R12 R2 + 0x4C340000, // 0065 LDNIL R13 + 0x7C240800, // 0066 CALL R9 4 + 0xB8262C00, // 0067 GETNGBL R9 K22 + 0x8C241317, // 0068 GETMET R9 R9 K23 + 0x582C0015, // 0069 LDCONST R11 K21 + 0x7C240400, // 006A CALL R9 2 + 0x78260009, // 006B JMPF R9 #0076 + 0xB8262C00, // 006C GETNGBL R9 K22 + 0x8C241302, // 006D GETMET R9 R9 K2 + 0x602C0018, // 006E GETGBL R11 G24 + 0x58300020, // 006F LDCONST R12 K32 + 0x8834030C, // 0070 GETMBR R13 R1 K12 + 0x88341B19, // 0071 GETMBR R13 R13 K25 + 0x88380321, // 0072 GETMBR R14 R1 K33 + 0x7C2C0600, // 0073 CALL R11 3 + 0x58300015, // 0074 LDCONST R12 K21 + 0x7C240600, // 0075 CALL R9 3 + 0x70020046, // 0076 JMP #00BE + 0x4C240000, // 0077 LDNIL R9 + 0x20240A09, // 0078 NE R9 R5 R9 + 0x78260018, // 0079 JMPF R9 #0093 + 0x8C24011F, // 007A GETMET R9 R0 K31 + 0x5C2C1000, // 007B MOVE R11 R8 + 0x5C300400, // 007C MOVE R12 R2 + 0x5C340A00, // 007D MOVE R13 R5 + 0x7C240800, // 007E CALL R9 4 + 0x5C240600, // 007F MOVE R9 R3 + 0x74260000, // 0080 JMPT R9 #0082 + 0x580C0011, // 0081 LDCONST R3 K17 + 0xB8262C00, // 0082 GETNGBL R9 K22 + 0x8C241317, // 0083 GETMET R9 R9 K23 + 0x582C0015, // 0084 LDCONST R11 K21 + 0x7C240400, // 0085 CALL R9 2 + 0x7826000A, // 0086 JMPF R9 #0092 + 0xB8262C00, // 0087 GETNGBL R9 K22 + 0x8C241302, // 0088 GETMET R9 R9 K2 + 0x602C0018, // 0089 GETGBL R11 G24 + 0x58300022, // 008A LDCONST R12 K34 + 0x8834030C, // 008B GETMBR R13 R1 K12 + 0x88341B19, // 008C GETMBR R13 R13 K25 + 0x5C380400, // 008D MOVE R14 R2 + 0x5C3C0600, // 008E MOVE R15 R3 + 0x7C2C0800, // 008F CALL R11 4 + 0x58300015, // 0090 LDCONST R12 K21 + 0x7C240600, // 0091 CALL R9 3 + 0x7002002A, // 0092 JMP #00BE + 0x88240505, // 0093 GETMBR R9 R2 K5 + 0x4C280000, // 0094 LDNIL R10 + 0x2024120A, // 0095 NE R9 R9 R10 + 0x78260015, // 0096 JMPF R9 #00AD + 0x8C24011F, // 0097 GETMET R9 R0 K31 + 0x5C2C1000, // 0098 MOVE R11 R8 + 0x5C300400, // 0099 MOVE R12 R2 + 0x4C340000, // 009A LDNIL R13 + 0x7C240800, // 009B CALL R9 4 + 0xB8262C00, // 009C GETNGBL R9 K22 + 0x8C241317, // 009D GETMET R9 R9 K23 + 0x582C0015, // 009E LDCONST R11 K21 + 0x7C240400, // 009F CALL R9 2 + 0x7826000A, // 00A0 JMPF R9 #00AC + 0xB8262C00, // 00A1 GETNGBL R9 K22 + 0x8C241302, // 00A2 GETMET R9 R9 K2 + 0x602C0018, // 00A3 GETGBL R11 G24 + 0x58300023, // 00A4 LDCONST R12 K35 + 0x8834030C, // 00A5 GETMBR R13 R1 K12 + 0x88341B19, // 00A6 GETMBR R13 R13 K25 + 0x88380505, // 00A7 GETMBR R14 R2 K5 + 0x883C0321, // 00A8 GETMBR R15 R1 K33 + 0x7C2C0800, // 00A9 CALL R11 4 + 0x58300015, // 00AA LDCONST R12 K21 + 0x7C240600, // 00AB CALL R9 3 + 0x70020010, // 00AC JMP #00BE + 0xB8262C00, // 00AD GETNGBL R9 K22 + 0x8C241317, // 00AE GETMET R9 R9 K23 + 0x582C0015, // 00AF LDCONST R11 K21 + 0x7C240400, // 00B0 CALL R9 2 + 0x78260009, // 00B1 JMPF R9 #00BC + 0xB8262C00, // 00B2 GETNGBL R9 K22 + 0x8C241302, // 00B3 GETMET R9 R9 K2 + 0x602C0018, // 00B4 GETGBL R11 G24 + 0x58300024, // 00B5 LDCONST R12 K36 + 0x8834030C, // 00B6 GETMBR R13 R1 K12 + 0x88341B19, // 00B7 GETMBR R13 R13 K25 + 0x88380321, // 00B8 GETMBR R14 R1 K33 + 0x7C2C0600, // 00B9 CALL R11 3 + 0x58300015, // 00BA LDCONST R12 K21 + 0x7C240600, // 00BB CALL R9 3 + 0x50240000, // 00BC LDBOOL R9 0 0 + 0x80041200, // 00BD RET 1 R9 + 0x8C24111A, // 00BE GETMET R9 R8 K26 + 0x582C0025, // 00BF LDCONST R11 K37 + 0x5431FFFB, // 00C0 LDINT R12 -4 + 0x7C240600, // 00C1 CALL R9 3 + 0x8C24111A, // 00C2 GETMET R9 R8 K26 + 0x542E0017, // 00C3 LDINT R11 24 + 0x5830001C, // 00C4 LDCONST R12 K28 + 0x7C240600, // 00C5 CALL R9 3 + 0x8C240326, // 00C6 GETMET R9 R1 K38 + 0x542E0008, // 00C7 LDINT R11 9 + 0x50300200, // 00C8 LDBOOL R12 1 0 + 0x7C240600, // 00C9 CALL R9 3 + 0x8828010A, // 00CA GETMBR R10 R0 K10 + 0x88281527, // 00CB GETMBR R10 R10 K39 + 0x882C0328, // 00CC GETMBR R11 R1 K40 + 0x8C301729, // 00CD GETMET R12 R11 K41 + 0x7C300200, // 00CE CALL R12 1 + 0x8C30132A, // 00CF GETMET R12 R9 K42 + 0x5C381000, // 00D0 MOVE R14 R8 + 0x5C3C1600, // 00D1 MOVE R15 R11 + 0x7C300600, // 00D2 CALL R12 3 + 0x8C30132B, // 00D3 GETMET R12 R9 K43 + 0x7C300200, // 00D4 CALL R12 1 + 0x8C30152C, // 00D5 GETMET R12 R10 K44 + 0x5C381200, // 00D6 MOVE R14 R9 + 0x7C300400, // 00D7 CALL R12 2 + 0xB8320000, // 00D8 GETNGBL R12 K0 + 0x88301901, // 00D9 GETMBR R12 R12 K1 + 0x8C301902, // 00DA GETMET R12 R12 K2 + 0x5838002D, // 00DB LDCONST R14 K45 + 0x7C300400, // 00DC CALL R12 2 + 0x50300200, // 00DD LDBOOL R12 1 0 + 0x80041800, // 00DE RET 1 R12 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: invokeresponse2raw +********************************************************************/ +be_local_closure(Matter_IM_invokeresponse2raw, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(add), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(cluster), + /* K5 */ be_nested_str_weak(command), + /* K6 */ be_nested_str_weak(status), + /* K7 */ be_nested_str_weak(matter), + /* K8 */ be_nested_str_weak(SUCCESS), + /* K9 */ be_nested_str_weak(tag_sub), + /* K10 */ be_nested_str_weak(tlv2raw), + }), + be_str_weak(invokeresponse2raw), + &be_const_str_solidified, + ( &(const binstruction[148]) { /* code */ + 0x8C100300, // 0000 GETMET R4 R1 K0 + 0x541A0014, // 0001 LDINT R6 21 + 0x581C0001, // 0002 LDCONST R7 K1 + 0x7C100600, // 0003 CALL R4 3 + 0x4C100000, // 0004 LDNIL R4 + 0x1C100604, // 0005 EQ R4 R3 R4 + 0x78120004, // 0006 JMPF R4 #000C + 0x8C100300, // 0007 GETMET R4 R1 K0 + 0x541A3500, // 0008 LDINT R6 13569 + 0x541DFFFD, // 0009 LDINT R7 -2 + 0x7C100600, // 000A CALL R4 3 + 0x70020003, // 000B JMP #0010 + 0x8C100300, // 000C GETMET R4 R1 K0 + 0x541A34FF, // 000D LDINT R6 13568 + 0x541DFFFD, // 000E LDINT R7 -2 + 0x7C100600, // 000F CALL R4 3 + 0x8C100300, // 0010 GETMET R4 R1 K0 + 0x541A36FF, // 0011 LDINT R6 14080 + 0x541DFFFD, // 0012 LDINT R7 -2 + 0x7C100600, // 0013 CALL R4 3 + 0x88100502, // 0014 GETMBR R4 R2 K2 + 0x541600FE, // 0015 LDINT R5 255 + 0x18100805, // 0016 LE R4 R4 R5 + 0x78120008, // 0017 JMPF R4 #0021 + 0x8C100300, // 0018 GETMET R4 R1 K0 + 0x541A23FF, // 0019 LDINT R6 9216 + 0x541DFFFD, // 001A LDINT R7 -2 + 0x7C100600, // 001B CALL R4 3 + 0x8C100300, // 001C GETMET R4 R1 K0 + 0x88180502, // 001D GETMBR R6 R2 K2 + 0x581C0001, // 001E LDCONST R7 K1 + 0x7C100600, // 001F CALL R4 3 + 0x70020007, // 0020 JMP #0029 + 0x8C100300, // 0021 GETMET R4 R1 K0 + 0x541A24FF, // 0022 LDINT R6 9472 + 0x541DFFFD, // 0023 LDINT R7 -2 + 0x7C100600, // 0024 CALL R4 3 + 0x8C100300, // 0025 GETMET R4 R1 K0 + 0x88180502, // 0026 GETMBR R6 R2 K2 + 0x581C0003, // 0027 LDCONST R7 K3 + 0x7C100600, // 0028 CALL R4 3 + 0x88100504, // 0029 GETMBR R4 R2 K4 + 0x541600FE, // 002A LDINT R5 255 + 0x18100805, // 002B LE R4 R4 R5 + 0x78120008, // 002C JMPF R4 #0036 + 0x8C100300, // 002D GETMET R4 R1 K0 + 0x541A2400, // 002E LDINT R6 9217 + 0x541DFFFD, // 002F LDINT R7 -2 + 0x7C100600, // 0030 CALL R4 3 + 0x8C100300, // 0031 GETMET R4 R1 K0 + 0x88180504, // 0032 GETMBR R6 R2 K4 + 0x581C0001, // 0033 LDCONST R7 K1 + 0x7C100600, // 0034 CALL R4 3 + 0x70020014, // 0035 JMP #004B + 0x88100504, // 0036 GETMBR R4 R2 K4 + 0x5416FFFE, // 0037 LDINT R5 65535 + 0x18100805, // 0038 LE R4 R4 R5 + 0x78120008, // 0039 JMPF R4 #0043 + 0x8C100300, // 003A GETMET R4 R1 K0 + 0x541A2500, // 003B LDINT R6 9473 + 0x541DFFFD, // 003C LDINT R7 -2 + 0x7C100600, // 003D CALL R4 3 + 0x8C100300, // 003E GETMET R4 R1 K0 + 0x88180504, // 003F GETMBR R6 R2 K4 + 0x581C0003, // 0040 LDCONST R7 K3 + 0x7C100600, // 0041 CALL R4 3 + 0x70020007, // 0042 JMP #004B + 0x8C100300, // 0043 GETMET R4 R1 K0 + 0x541A2600, // 0044 LDINT R6 9729 + 0x541DFFFD, // 0045 LDINT R7 -2 + 0x7C100600, // 0046 CALL R4 3 + 0x8C100300, // 0047 GETMET R4 R1 K0 + 0x88180504, // 0048 GETMBR R6 R2 K4 + 0x541E0003, // 0049 LDINT R7 4 + 0x7C100600, // 004A CALL R4 3 + 0x88100505, // 004B GETMBR R4 R2 K5 + 0x541600FE, // 004C LDINT R5 255 + 0x18100805, // 004D LE R4 R4 R5 + 0x78120008, // 004E JMPF R4 #0058 + 0x8C100300, // 004F GETMET R4 R1 K0 + 0x541A2401, // 0050 LDINT R6 9218 + 0x541DFFFD, // 0051 LDINT R7 -2 + 0x7C100600, // 0052 CALL R4 3 + 0x8C100300, // 0053 GETMET R4 R1 K0 + 0x88180505, // 0054 GETMBR R6 R2 K5 + 0x581C0001, // 0055 LDCONST R7 K1 + 0x7C100600, // 0056 CALL R4 3 + 0x70020014, // 0057 JMP #006D + 0x88100505, // 0058 GETMBR R4 R2 K5 + 0x5416FFFE, // 0059 LDINT R5 65535 + 0x18100805, // 005A LE R4 R4 R5 + 0x78120008, // 005B JMPF R4 #0065 + 0x8C100300, // 005C GETMET R4 R1 K0 + 0x541A2501, // 005D LDINT R6 9474 + 0x541DFFFD, // 005E LDINT R7 -2 + 0x7C100600, // 005F CALL R4 3 + 0x8C100300, // 0060 GETMET R4 R1 K0 + 0x88180505, // 0061 GETMBR R6 R2 K5 + 0x581C0003, // 0062 LDCONST R7 K3 + 0x7C100600, // 0063 CALL R4 3 + 0x70020007, // 0064 JMP #006D + 0x8C100300, // 0065 GETMET R4 R1 K0 + 0x541A2601, // 0066 LDINT R6 9730 + 0x541DFFFD, // 0067 LDINT R7 -2 + 0x7C100600, // 0068 CALL R4 3 + 0x8C100300, // 0069 GETMET R4 R1 K0 + 0x88180505, // 006A GETMBR R6 R2 K5 + 0x541E0003, // 006B LDINT R7 4 + 0x7C100600, // 006C CALL R4 3 + 0x8C100300, // 006D GETMET R4 R1 K0 + 0x541A0017, // 006E LDINT R6 24 + 0x581C0001, // 006F LDCONST R7 K1 + 0x7C100600, // 0070 CALL R4 3 + 0x4C100000, // 0071 LDNIL R4 + 0x1C100604, // 0072 EQ R4 R3 R4 + 0x78120016, // 0073 JMPF R4 #008B + 0x88100506, // 0074 GETMBR R4 R2 K6 + 0x4C140000, // 0075 LDNIL R5 + 0x1C140805, // 0076 EQ R5 R4 R5 + 0x78160001, // 0077 JMPF R5 #007A + 0xB8160E00, // 0078 GETNGBL R5 K7 + 0x88100B08, // 0079 GETMBR R4 R5 K8 + 0x8C140300, // 007A GETMET R5 R1 K0 + 0x541E3500, // 007B LDINT R7 13569 + 0x5421FFFD, // 007C LDINT R8 -2 + 0x7C140600, // 007D CALL R5 3 + 0x8C140300, // 007E GETMET R5 R1 K0 + 0x541E23FF, // 007F LDINT R7 9216 + 0x5421FFFD, // 0080 LDINT R8 -2 + 0x7C140600, // 0081 CALL R5 3 + 0x8C140300, // 0082 GETMET R5 R1 K0 + 0x881C0506, // 0083 GETMBR R7 R2 K6 + 0x58200001, // 0084 LDCONST R8 K1 + 0x7C140600, // 0085 CALL R5 3 + 0x8C140300, // 0086 GETMET R5 R1 K0 + 0x541E0017, // 0087 LDINT R7 24 + 0x58200001, // 0088 LDCONST R8 K1 + 0x7C140600, // 0089 CALL R5 3 + 0x70020003, // 008A JMP #008F + 0x900E1301, // 008B SETMBR R3 K9 K1 + 0x8C10070A, // 008C GETMET R4 R3 K10 + 0x5C180200, // 008D MOVE R6 R1 + 0x7C100400, // 008E CALL R4 2 + 0x8C100300, // 008F GETMET R4 R1 K0 + 0x541A1817, // 0090 LDINT R6 6168 + 0x541DFFFD, // 0091 LDINT R7 -2 + 0x7C100600, // 0092 CALL R4 3 + 0x80000000, // 0093 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_ack_now +********************************************************************/ +be_local_closure(Matter_IM_send_ack_now, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(_message_handler), + /* K2 */ be_nested_str_weak(send_encrypted_ack), + }), + be_str_weak(send_ack_now), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x1C080202, // 0001 EQ R2 R1 R2 + 0x780A0000, // 0002 JMPF R2 #0004 + 0x80000400, // 0003 RET 0 + 0x88080300, // 0004 GETMBR R2 R1 K0 + 0x88080501, // 0005 GETMBR R2 R2 K1 + 0x8C080502, // 0006 GETMET R2 R2 K2 + 0x5C100200, // 0007 MOVE R4 R1 + 0x50140000, // 0008 LDBOOL R5 0 0 + 0x7C080600, // 0009 CALL R2 3 + 0x80000000, // 000A RET 0 }) ) ); @@ -75,338 +867,293 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[46]) { /* constants */ - /* K0 */ be_nested_str_weak(device), + ( &(const bvalue[44]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(profiler), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(invoke_request_start), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(Path), - /* K6 */ be_nested_str_weak(msg), - /* K7 */ be_nested_str_weak(InvokeRequestMessage), - /* K8 */ be_nested_str_weak(from_TLV), - /* K9 */ be_nested_str_weak(invoke_requests), - /* K10 */ be_nested_str_weak(InvokeResponseMessage), - /* K11 */ be_nested_str_weak(suppress_response), - /* K12 */ be_nested_str_weak(invoke_responses), - /* K13 */ be_nested_str_weak(endpoint), - /* K14 */ be_nested_str_weak(command_path), - /* K15 */ be_nested_str_weak(cluster), - /* K16 */ be_nested_str_weak(command), - /* K17 */ be_nested_str_weak(status), - /* K18 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K19 */ be_nested_str_weak(get_command_name), + /* K4 */ be_nested_str_weak(Path), + /* K5 */ be_nested_str_weak(msg), + /* K6 */ be_nested_str_weak(InvokeRequestMessage), + /* K7 */ be_nested_str_weak(from_TLV), + /* K8 */ be_nested_str_weak(invoke_requests), + /* K9 */ be_nested_str_weak(InvokeResponseMessage), + /* K10 */ be_nested_str_weak(suppress_response), + /* K11 */ be_nested_str_weak(invoke_responses), + /* K12 */ be_nested_str_weak(endpoint), + /* K13 */ be_nested_str_weak(command_path), + /* K14 */ be_nested_str_weak(cluster), + /* K15 */ be_nested_str_weak(command), + /* K16 */ be_nested_str_weak(status), + /* K17 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K18 */ be_nested_str_weak(get_command_name), + /* K19 */ be_nested_str_weak(device), /* K20 */ be_nested_str_weak(invoke_request), /* K21 */ be_nested_str_weak(session), /* K22 */ be_nested_str_weak(command_fields), - /* K23 */ be_nested_str_weak(_X28), - /* K24 */ be_nested_str_weak(_X29_X20), - /* K25 */ be_nested_str_weak(), - /* K26 */ be_nested_str_weak(tasmota), - /* K27 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), - /* K28 */ be_nested_str_weak(local_session_id), - /* K29 */ be_const_int(0), - /* K30 */ be_const_int(2), - /* K31 */ be_const_int(3), - /* K32 */ be_nested_str_weak(InvokeResponseIB), + /* K23 */ be_nested_str_weak(COMMAND_X20DONE), + /* K24 */ be_nested_str_weak(_X28), + /* K25 */ be_nested_str_weak(_X29_X20), + /* K26 */ be_nested_str_weak(), + /* K27 */ be_nested_str_weak(tasmota), + /* K28 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s_X20_X25s), + /* K29 */ be_nested_str_weak(local_session_id), + /* K30 */ be_const_int(0), + /* K31 */ be_const_int(2), + /* K32 */ be_const_int(3), /* K33 */ be_nested_str_weak(SUCCESS), - /* K34 */ be_nested_str_weak(CommandStatusIB), - /* K35 */ be_nested_str_weak(CommandPathIB), - /* K36 */ be_nested_str_weak(StatusIB), - /* K37 */ be_nested_str_weak(push), - /* K38 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K39 */ be_nested_str_weak(exchange_id), - /* K40 */ be_nested_str_weak(CommandDataIB), - /* K41 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K42 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K43 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K44 */ be_nested_str_weak(stop_iteration), - /* K45 */ be_nested_str_weak(send_invoke_response), + /* K34 */ be_nested_str_weak(invokeresponse2raw), + /* K35 */ be_nested_str_weak(push), + /* K36 */ be_nested_str_weak(loglevel), + /* K37 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K38 */ be_nested_str_weak(exchange_id), + /* K39 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K40 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K41 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K42 */ be_nested_str_weak(stop_iteration), + /* K43 */ be_nested_str_weak(send_invoke_response), }), be_str_weak(process_invoke_request), &be_const_str_solidified, - ( &(const binstruction[281]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 + ( &(const binstruction[238]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x8C0C0702, // 0002 GETMET R3 R3 K2 0x58140003, // 0003 LDCONST R5 K3 0x7C0C0400, // 0004 CALL R3 2 - 0xB80E0800, // 0005 GETNGBL R3 K4 - 0x8C0C0705, // 0006 GETMET R3 R3 K5 + 0xB80E0000, // 0005 GETNGBL R3 K0 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 0x7C0C0200, // 0007 CALL R3 1 - 0x900E0C01, // 0008 SETMBR R3 K6 R1 - 0xB8120800, // 0009 GETNGBL R4 K4 - 0x8C100907, // 000A GETMET R4 R4 K7 + 0x900E0A01, // 0008 SETMBR R3 K5 R1 + 0xB8120000, // 0009 GETNGBL R4 K0 + 0x8C100906, // 000A GETMET R4 R4 K6 0x7C100200, // 000B CALL R4 1 - 0x8C100908, // 000C GETMET R4 R4 K8 + 0x8C100907, // 000C GETMET R4 R4 K7 0x5C180400, // 000D MOVE R6 R2 0x7C100400, // 000E CALL R4 2 - 0x88140909, // 000F GETMBR R5 R4 K9 + 0x88140908, // 000F GETMBR R5 R4 K8 0x4C180000, // 0010 LDNIL R6 0x20140A06, // 0011 NE R5 R5 R6 - 0x78160104, // 0012 JMPF R5 #0118 - 0xB8160800, // 0013 GETNGBL R5 K4 - 0x8C140B0A, // 0014 GETMET R5 R5 K10 + 0x781600D9, // 0012 JMPF R5 #00ED + 0xB8160000, // 0013 GETNGBL R5 K0 + 0x8C140B09, // 0014 GETMET R5 R5 K9 0x7C140200, // 0015 CALL R5 1 0x50180000, // 0016 LDBOOL R6 0 0 - 0x90161606, // 0017 SETMBR R5 K11 R6 + 0x90161406, // 0017 SETMBR R5 K10 R6 0x60180012, // 0018 GETGBL R6 G18 0x7C180000, // 0019 CALL R6 0 - 0x90161806, // 001A SETMBR R5 K12 R6 + 0x90161606, // 001A SETMBR R5 K11 R6 0x60180010, // 001B GETGBL R6 G16 - 0x881C0909, // 001C GETMBR R7 R4 K9 + 0x881C0908, // 001C GETMBR R7 R4 K8 0x7C180200, // 001D CALL R6 1 - 0xA80200E7, // 001E EXBLK 0 #0107 + 0xA80200BC, // 001E EXBLK 0 #00DC 0x5C1C0C00, // 001F MOVE R7 R6 0x7C1C0000, // 0020 CALL R7 0 - 0x88200F0E, // 0021 GETMBR R8 R7 K14 - 0x8820110D, // 0022 GETMBR R8 R8 K13 - 0x900E1A08, // 0023 SETMBR R3 K13 R8 - 0x88200F0E, // 0024 GETMBR R8 R7 K14 - 0x8820110F, // 0025 GETMBR R8 R8 K15 - 0x900E1E08, // 0026 SETMBR R3 K15 R8 - 0x88200F0E, // 0027 GETMBR R8 R7 K14 - 0x88201110, // 0028 GETMBR R8 R8 K16 - 0x900E2008, // 0029 SETMBR R3 K16 R8 - 0xB8220800, // 002A GETNGBL R8 K4 - 0x88201112, // 002B GETMBR R8 R8 K18 - 0x900E2208, // 002C SETMBR R3 K17 R8 - 0xB8220800, // 002D GETNGBL R8 K4 - 0x8C201113, // 002E GETMET R8 R8 K19 - 0x8828070F, // 002F GETMBR R10 R3 K15 - 0x882C0710, // 0030 GETMBR R11 R3 K16 + 0x88200F0D, // 0021 GETMBR R8 R7 K13 + 0x8820110C, // 0022 GETMBR R8 R8 K12 + 0x900E1808, // 0023 SETMBR R3 K12 R8 + 0x88200F0D, // 0024 GETMBR R8 R7 K13 + 0x8820110E, // 0025 GETMBR R8 R8 K14 + 0x900E1C08, // 0026 SETMBR R3 K14 R8 + 0x88200F0D, // 0027 GETMBR R8 R7 K13 + 0x8820110F, // 0028 GETMBR R8 R8 K15 + 0x900E1E08, // 0029 SETMBR R3 K15 R8 + 0xB8220000, // 002A GETNGBL R8 K0 + 0x88201111, // 002B GETMBR R8 R8 K17 + 0x900E2008, // 002C SETMBR R3 K16 R8 + 0xB8220000, // 002D GETNGBL R8 K0 + 0x8C201112, // 002E GETMET R8 R8 K18 + 0x8828070E, // 002F GETMBR R10 R3 K14 + 0x882C070F, // 0030 GETMBR R11 R3 K15 0x7C200600, // 0031 CALL R8 3 0x60240008, // 0032 GETGBL R9 G8 0x5C280600, // 0033 MOVE R10 R3 0x7C240200, // 0034 CALL R9 1 - 0x88280100, // 0035 GETMBR R10 R0 K0 + 0x88280113, // 0035 GETMBR R10 R0 K19 0x8C281514, // 0036 GETMET R10 R10 K20 0x88300315, // 0037 GETMBR R12 R1 K21 0x88340F16, // 0038 GETMBR R13 R7 K22 0x5C380600, // 0039 MOVE R14 R3 0x7C280800, // 003A CALL R10 4 - 0x882C0702, // 003B GETMBR R11 R3 K2 - 0x4C300000, // 003C LDNIL R12 - 0x202C160C, // 003D NE R11 R11 R12 - 0x782E0005, // 003E JMPF R11 #0045 - 0x602C0008, // 003F GETGBL R11 G8 - 0x88300702, // 0040 GETMBR R12 R3 K2 - 0x7C2C0200, // 0041 CALL R11 1 - 0x002E2E0B, // 0042 ADD R11 K23 R11 - 0x002C1718, // 0043 ADD R11 R11 K24 - 0x70020000, // 0044 JMP #0046 - 0x582C0019, // 0045 LDCONST R11 K25 - 0xB8323400, // 0046 GETNGBL R12 K26 - 0x8C301902, // 0047 GETMET R12 R12 K2 - 0x60380018, // 0048 GETGBL R14 G24 - 0x583C001B, // 0049 LDCONST R15 K27 - 0x88400315, // 004A GETMBR R16 R1 K21 - 0x8840211C, // 004B GETMBR R16 R16 K28 - 0x5C441200, // 004C MOVE R17 R9 - 0x78220001, // 004D JMPF R8 #0050 - 0x5C481000, // 004E MOVE R18 R8 - 0x70020000, // 004F JMP #0051 - 0x58480019, // 0050 LDCONST R18 K25 - 0x5C4C1600, // 0051 MOVE R19 R11 - 0x7C380A00, // 0052 CALL R14 5 - 0x883C070D, // 0053 GETMBR R15 R3 K13 - 0x203C1F1D, // 0054 NE R15 R15 K29 - 0x783E0001, // 0055 JMPF R15 #0058 - 0x583C001E, // 0056 LDCONST R15 K30 - 0x70020000, // 0057 JMP #0059 - 0x583C001F, // 0058 LDCONST R15 K31 - 0x7C300600, // 0059 CALL R12 3 - 0x4C300000, // 005A LDNIL R12 - 0x900E040C, // 005B SETMBR R3 K2 R12 - 0xB8320800, // 005C GETNGBL R12 K4 - 0x8C301920, // 005D GETMET R12 R12 K32 - 0x7C300200, // 005E CALL R12 1 - 0x50340200, // 005F LDBOOL R13 1 0 - 0x1C34140D, // 0060 EQ R13 R10 R13 - 0x74360004, // 0061 JMPT R13 #0067 - 0x88340711, // 0062 GETMBR R13 R3 K17 - 0xB83A0800, // 0063 GETNGBL R14 K4 - 0x88381D21, // 0064 GETMBR R14 R14 K33 - 0x1C341A0E, // 0065 EQ R13 R13 R14 - 0x7836002D, // 0066 JMPF R13 #0095 - 0xB8360800, // 0067 GETNGBL R13 K4 - 0x8C341B22, // 0068 GETMET R13 R13 K34 - 0x7C340200, // 0069 CALL R13 1 - 0x9032220D, // 006A SETMBR R12 K17 R13 - 0x88341911, // 006B GETMBR R13 R12 K17 - 0xB83A0800, // 006C GETNGBL R14 K4 - 0x8C381D23, // 006D GETMET R14 R14 K35 - 0x7C380200, // 006E CALL R14 1 - 0x90361C0E, // 006F SETMBR R13 K14 R14 - 0x88341911, // 0070 GETMBR R13 R12 K17 - 0x88341B0E, // 0071 GETMBR R13 R13 K14 - 0x8838070D, // 0072 GETMBR R14 R3 K13 - 0x90361A0E, // 0073 SETMBR R13 K13 R14 - 0x88341911, // 0074 GETMBR R13 R12 K17 - 0x88341B0E, // 0075 GETMBR R13 R13 K14 - 0x8838070F, // 0076 GETMBR R14 R3 K15 - 0x90361E0E, // 0077 SETMBR R13 K15 R14 - 0x88341911, // 0078 GETMBR R13 R12 K17 - 0x88341B0E, // 0079 GETMBR R13 R13 K14 - 0x88380710, // 007A GETMBR R14 R3 K16 - 0x9036200E, // 007B SETMBR R13 K16 R14 - 0x88341911, // 007C GETMBR R13 R12 K17 - 0xB83A0800, // 007D GETNGBL R14 K4 - 0x8C381D24, // 007E GETMET R14 R14 K36 - 0x7C380200, // 007F CALL R14 1 - 0x9036220E, // 0080 SETMBR R13 K17 R14 - 0x88341911, // 0081 GETMBR R13 R12 K17 - 0x88341B11, // 0082 GETMBR R13 R13 K17 - 0xB83A0800, // 0083 GETNGBL R14 K4 - 0x88381D21, // 0084 GETMBR R14 R14 K33 - 0x9036220E, // 0085 SETMBR R13 K17 R14 - 0x88340B0C, // 0086 GETMBR R13 R5 K12 - 0x8C341B25, // 0087 GETMET R13 R13 K37 - 0x5C3C1800, // 0088 MOVE R15 R12 - 0x7C340400, // 0089 CALL R13 2 - 0xB8363400, // 008A GETNGBL R13 K26 - 0x8C341B02, // 008B GETMET R13 R13 K2 - 0x603C0018, // 008C GETGBL R15 G24 - 0x58400026, // 008D LDCONST R16 K38 - 0x88440315, // 008E GETMBR R17 R1 K21 - 0x8844231C, // 008F GETMBR R17 R17 K28 - 0x88480327, // 0090 GETMBR R18 R1 K39 - 0x7C3C0600, // 0091 CALL R15 3 - 0x5840001F, // 0092 LDCONST R16 K31 - 0x7C340600, // 0093 CALL R13 3 - 0x70020070, // 0094 JMP #0106 - 0x4C340000, // 0095 LDNIL R13 - 0x2034140D, // 0096 NE R13 R10 R13 - 0x78360031, // 0097 JMPF R13 #00CA - 0xB8360800, // 0098 GETNGBL R13 K4 - 0x8C341B28, // 0099 GETMET R13 R13 K40 - 0x7C340200, // 009A CALL R13 1 - 0x9032200D, // 009B SETMBR R12 K16 R13 - 0x88341910, // 009C GETMBR R13 R12 K16 - 0xB83A0800, // 009D GETNGBL R14 K4 - 0x8C381D23, // 009E GETMET R14 R14 K35 - 0x7C380200, // 009F CALL R14 1 - 0x90361C0E, // 00A0 SETMBR R13 K14 R14 - 0x88341910, // 00A1 GETMBR R13 R12 K16 - 0x88341B0E, // 00A2 GETMBR R13 R13 K14 - 0x8838070D, // 00A3 GETMBR R14 R3 K13 - 0x90361A0E, // 00A4 SETMBR R13 K13 R14 - 0x88341910, // 00A5 GETMBR R13 R12 K16 - 0x88341B0E, // 00A6 GETMBR R13 R13 K14 - 0x8838070F, // 00A7 GETMBR R14 R3 K15 - 0x90361E0E, // 00A8 SETMBR R13 K15 R14 - 0x88341910, // 00A9 GETMBR R13 R12 K16 - 0x88341B0E, // 00AA GETMBR R13 R13 K14 - 0x88380710, // 00AB GETMBR R14 R3 K16 - 0x9036200E, // 00AC SETMBR R13 K16 R14 - 0x88341910, // 00AD GETMBR R13 R12 K16 - 0x90362C0A, // 00AE SETMBR R13 K22 R10 - 0x88340B0C, // 00AF GETMBR R13 R5 K12 - 0x8C341B25, // 00B0 GETMET R13 R13 K37 - 0x5C3C1800, // 00B1 MOVE R15 R12 - 0x7C340400, // 00B2 CALL R13 2 - 0xB8360800, // 00B3 GETNGBL R13 K4 - 0x8C341B13, // 00B4 GETMET R13 R13 K19 - 0x883C070F, // 00B5 GETMBR R15 R3 K15 - 0x88400710, // 00B6 GETMBR R16 R3 K16 - 0x7C340600, // 00B7 CALL R13 3 - 0x5C201A00, // 00B8 MOVE R8 R13 - 0xB8363400, // 00B9 GETNGBL R13 K26 - 0x8C341B02, // 00BA GETMET R13 R13 K2 - 0x603C0018, // 00BB GETGBL R15 G24 - 0x58400029, // 00BC LDCONST R16 K41 - 0x88440315, // 00BD GETMBR R17 R1 K21 - 0x8844231C, // 00BE GETMBR R17 R17 K28 - 0x60480008, // 00BF GETGBL R18 G8 - 0x5C4C0600, // 00C0 MOVE R19 R3 - 0x7C480200, // 00C1 CALL R18 1 - 0x78220001, // 00C2 JMPF R8 #00C5 - 0x5C4C1000, // 00C3 MOVE R19 R8 - 0x70020000, // 00C4 JMP #00C6 - 0x584C0019, // 00C5 LDCONST R19 K25 - 0x7C3C0800, // 00C6 CALL R15 4 - 0x5840001F, // 00C7 LDCONST R16 K31 - 0x7C340600, // 00C8 CALL R13 3 - 0x7002003B, // 00C9 JMP #0106 - 0x88340711, // 00CA GETMBR R13 R3 K17 - 0x4C380000, // 00CB LDNIL R14 - 0x20341A0E, // 00CC NE R13 R13 R14 - 0x7836002D, // 00CD JMPF R13 #00FC - 0xB8360800, // 00CE GETNGBL R13 K4 - 0x8C341B22, // 00CF GETMET R13 R13 K34 - 0x7C340200, // 00D0 CALL R13 1 - 0x9032220D, // 00D1 SETMBR R12 K17 R13 - 0x88341911, // 00D2 GETMBR R13 R12 K17 - 0xB83A0800, // 00D3 GETNGBL R14 K4 - 0x8C381D23, // 00D4 GETMET R14 R14 K35 - 0x7C380200, // 00D5 CALL R14 1 - 0x90361C0E, // 00D6 SETMBR R13 K14 R14 - 0x88341911, // 00D7 GETMBR R13 R12 K17 - 0x88341B0E, // 00D8 GETMBR R13 R13 K14 - 0x8838070D, // 00D9 GETMBR R14 R3 K13 - 0x90361A0E, // 00DA SETMBR R13 K13 R14 - 0x88341911, // 00DB GETMBR R13 R12 K17 - 0x88341B0E, // 00DC GETMBR R13 R13 K14 - 0x8838070F, // 00DD GETMBR R14 R3 K15 - 0x90361E0E, // 00DE SETMBR R13 K15 R14 - 0x88341911, // 00DF GETMBR R13 R12 K17 - 0x88341B0E, // 00E0 GETMBR R13 R13 K14 - 0x88380710, // 00E1 GETMBR R14 R3 K16 - 0x9036200E, // 00E2 SETMBR R13 K16 R14 - 0x88341911, // 00E3 GETMBR R13 R12 K17 - 0xB83A0800, // 00E4 GETNGBL R14 K4 - 0x8C381D24, // 00E5 GETMET R14 R14 K36 - 0x7C380200, // 00E6 CALL R14 1 - 0x9036220E, // 00E7 SETMBR R13 K17 R14 - 0x88341911, // 00E8 GETMBR R13 R12 K17 - 0x88341B11, // 00E9 GETMBR R13 R13 K17 - 0x88380711, // 00EA GETMBR R14 R3 K17 - 0x9036220E, // 00EB SETMBR R13 K17 R14 - 0x88340B0C, // 00EC GETMBR R13 R5 K12 - 0x8C341B25, // 00ED GETMET R13 R13 K37 - 0x5C3C1800, // 00EE MOVE R15 R12 - 0x7C340400, // 00EF CALL R13 2 - 0xB8363400, // 00F0 GETNGBL R13 K26 - 0x8C341B02, // 00F1 GETMET R13 R13 K2 - 0x603C0018, // 00F2 GETGBL R15 G24 - 0x5840002A, // 00F3 LDCONST R16 K42 - 0x88440315, // 00F4 GETMBR R17 R1 K21 - 0x8844231C, // 00F5 GETMBR R17 R17 K28 - 0x88480711, // 00F6 GETMBR R18 R3 K17 - 0x884C0327, // 00F7 GETMBR R19 R1 K39 - 0x7C3C0800, // 00F8 CALL R15 4 - 0x5840001F, // 00F9 LDCONST R16 K31 - 0x7C340600, // 00FA CALL R13 3 - 0x70020009, // 00FB JMP #0106 - 0xB8363400, // 00FC GETNGBL R13 K26 - 0x8C341B02, // 00FD GETMET R13 R13 K2 - 0x603C0018, // 00FE GETGBL R15 G24 - 0x5840002B, // 00FF LDCONST R16 K43 - 0x88440315, // 0100 GETMBR R17 R1 K21 - 0x8844231C, // 0101 GETMBR R17 R17 K28 - 0x88480327, // 0102 GETMBR R18 R1 K39 - 0x7C3C0600, // 0103 CALL R15 3 - 0x5840001F, // 0104 LDCONST R16 K31 - 0x7C340600, // 0105 CALL R13 3 - 0x7001FF17, // 0106 JMP #001F - 0x5818002C, // 0107 LDCONST R6 K44 - 0xAC180200, // 0108 CATCH R6 1 0 - 0xB0080000, // 0109 RAISE 2 R0 R0 - 0x6018000C, // 010A GETGBL R6 G12 - 0x881C0B0C, // 010B GETMBR R7 R5 K12 - 0x7C180200, // 010C CALL R6 1 - 0x24180D1D, // 010D GT R6 R6 K29 - 0x781A0004, // 010E JMPF R6 #0114 - 0x8C18012D, // 010F GETMET R6 R0 K45 - 0x5C200200, // 0110 MOVE R8 R1 - 0x5C240A00, // 0111 MOVE R9 R5 - 0x7C180600, // 0112 CALL R6 3 - 0x70020001, // 0113 JMP #0116 - 0x50180000, // 0114 LDBOOL R6 0 0 - 0x80040C00, // 0115 RET 1 R6 - 0x50180200, // 0116 LDBOOL R6 1 0 - 0x80040C00, // 0117 RET 1 R6 - 0x80000000, // 0118 RET 0 + 0xB82E0000, // 003B GETNGBL R11 K0 + 0x882C1701, // 003C GETMBR R11 R11 K1 + 0x8C2C1702, // 003D GETMET R11 R11 K2 + 0x58340017, // 003E LDCONST R13 K23 + 0x7C2C0400, // 003F CALL R11 2 + 0x882C0702, // 0040 GETMBR R11 R3 K2 + 0x4C300000, // 0041 LDNIL R12 + 0x202C160C, // 0042 NE R11 R11 R12 + 0x782E0005, // 0043 JMPF R11 #004A + 0x602C0008, // 0044 GETGBL R11 G8 + 0x88300702, // 0045 GETMBR R12 R3 K2 + 0x7C2C0200, // 0046 CALL R11 1 + 0x002E300B, // 0047 ADD R11 K24 R11 + 0x002C1719, // 0048 ADD R11 R11 K25 + 0x70020000, // 0049 JMP #004B + 0x582C001A, // 004A LDCONST R11 K26 + 0xB8323600, // 004B GETNGBL R12 K27 + 0x8C301902, // 004C GETMET R12 R12 K2 + 0x60380018, // 004D GETGBL R14 G24 + 0x583C001C, // 004E LDCONST R15 K28 + 0x88400315, // 004F GETMBR R16 R1 K21 + 0x8840211D, // 0050 GETMBR R16 R16 K29 + 0x5C441200, // 0051 MOVE R17 R9 + 0x78220001, // 0052 JMPF R8 #0055 + 0x5C481000, // 0053 MOVE R18 R8 + 0x70020000, // 0054 JMP #0056 + 0x5848001A, // 0055 LDCONST R18 K26 + 0x5C4C1600, // 0056 MOVE R19 R11 + 0x7C380A00, // 0057 CALL R14 5 + 0x883C070C, // 0058 GETMBR R15 R3 K12 + 0x203C1F1E, // 0059 NE R15 R15 K30 + 0x783E0001, // 005A JMPF R15 #005D + 0x583C001F, // 005B LDCONST R15 K31 + 0x70020000, // 005C JMP #005E + 0x583C0020, // 005D LDCONST R15 K32 + 0x7C300600, // 005E CALL R12 3 + 0x4C300000, // 005F LDNIL R12 + 0x900E040C, // 0060 SETMBR R3 K2 R12 + 0x60300015, // 0061 GETGBL R12 G21 + 0x5436001F, // 0062 LDINT R13 32 + 0x7C300200, // 0063 CALL R12 1 + 0x50340200, // 0064 LDBOOL R13 1 0 + 0x1C34140D, // 0065 EQ R13 R10 R13 + 0x74360004, // 0066 JMPT R13 #006C + 0x88340710, // 0067 GETMBR R13 R3 K16 + 0xB83A0000, // 0068 GETNGBL R14 K0 + 0x88381D21, // 0069 GETMBR R14 R14 K33 + 0x1C341A0E, // 006A EQ R13 R13 R14 + 0x7836001B, // 006B JMPF R13 #0088 + 0xB8360000, // 006C GETNGBL R13 K0 + 0x88341B21, // 006D GETMBR R13 R13 K33 + 0x900E200D, // 006E SETMBR R3 K16 R13 + 0x8C340122, // 006F GETMET R13 R0 K34 + 0x5C3C1800, // 0070 MOVE R15 R12 + 0x5C400600, // 0071 MOVE R16 R3 + 0x4C440000, // 0072 LDNIL R17 + 0x7C340800, // 0073 CALL R13 4 + 0x88340B0B, // 0074 GETMBR R13 R5 K11 + 0x8C341B23, // 0075 GETMET R13 R13 K35 + 0x5C3C1800, // 0076 MOVE R15 R12 + 0x7C340400, // 0077 CALL R13 2 + 0xB8363600, // 0078 GETNGBL R13 K27 + 0x8C341B24, // 0079 GETMET R13 R13 K36 + 0x583C0020, // 007A LDCONST R15 K32 + 0x7C340400, // 007B CALL R13 2 + 0x78360009, // 007C JMPF R13 #0087 + 0xB8363600, // 007D GETNGBL R13 K27 + 0x8C341B02, // 007E GETMET R13 R13 K2 + 0x603C0018, // 007F GETGBL R15 G24 + 0x58400025, // 0080 LDCONST R16 K37 + 0x88440315, // 0081 GETMBR R17 R1 K21 + 0x8844231D, // 0082 GETMBR R17 R17 K29 + 0x88480326, // 0083 GETMBR R18 R1 K38 + 0x7C3C0600, // 0084 CALL R15 3 + 0x58400020, // 0085 LDCONST R16 K32 + 0x7C340600, // 0086 CALL R13 3 + 0x70020052, // 0087 JMP #00DB + 0x4C340000, // 0088 LDNIL R13 + 0x2034140D, // 0089 NE R13 R10 R13 + 0x78360022, // 008A JMPF R13 #00AE + 0x8C340122, // 008B GETMET R13 R0 K34 + 0x5C3C1800, // 008C MOVE R15 R12 + 0x5C400600, // 008D MOVE R16 R3 + 0x5C441400, // 008E MOVE R17 R10 + 0x7C340800, // 008F CALL R13 4 + 0x88340B0B, // 0090 GETMBR R13 R5 K11 + 0x8C341B23, // 0091 GETMET R13 R13 K35 + 0x5C3C1800, // 0092 MOVE R15 R12 + 0x7C340400, // 0093 CALL R13 2 + 0xB8360000, // 0094 GETNGBL R13 K0 + 0x8C341B12, // 0095 GETMET R13 R13 K18 + 0x883C070E, // 0096 GETMBR R15 R3 K14 + 0x8840070F, // 0097 GETMBR R16 R3 K15 + 0x7C340600, // 0098 CALL R13 3 + 0x5C201A00, // 0099 MOVE R8 R13 + 0x5C341000, // 009A MOVE R13 R8 + 0x74360000, // 009B JMPT R13 #009D + 0x5820001A, // 009C LDCONST R8 K26 + 0xB8363600, // 009D GETNGBL R13 K27 + 0x8C341B24, // 009E GETMET R13 R13 K36 + 0x583C0020, // 009F LDCONST R15 K32 + 0x7C340400, // 00A0 CALL R13 2 + 0x7836000A, // 00A1 JMPF R13 #00AD + 0xB8363600, // 00A2 GETNGBL R13 K27 + 0x8C341B02, // 00A3 GETMET R13 R13 K2 + 0x603C0018, // 00A4 GETGBL R15 G24 + 0x58400027, // 00A5 LDCONST R16 K39 + 0x88440315, // 00A6 GETMBR R17 R1 K21 + 0x8844231D, // 00A7 GETMBR R17 R17 K29 + 0x5C480600, // 00A8 MOVE R18 R3 + 0x5C4C1000, // 00A9 MOVE R19 R8 + 0x7C3C0800, // 00AA CALL R15 4 + 0x58400020, // 00AB LDCONST R16 K32 + 0x7C340600, // 00AC CALL R13 3 + 0x7002002C, // 00AD JMP #00DB + 0x88340710, // 00AE GETMBR R13 R3 K16 + 0x4C380000, // 00AF LDNIL R14 + 0x20341A0E, // 00B0 NE R13 R13 R14 + 0x78360019, // 00B1 JMPF R13 #00CC + 0x8C340122, // 00B2 GETMET R13 R0 K34 + 0x5C3C1800, // 00B3 MOVE R15 R12 + 0x5C400600, // 00B4 MOVE R16 R3 + 0x4C440000, // 00B5 LDNIL R17 + 0x7C340800, // 00B6 CALL R13 4 + 0x88340B0B, // 00B7 GETMBR R13 R5 K11 + 0x8C341B23, // 00B8 GETMET R13 R13 K35 + 0x5C3C1800, // 00B9 MOVE R15 R12 + 0x7C340400, // 00BA CALL R13 2 + 0xB8363600, // 00BB GETNGBL R13 K27 + 0x8C341B24, // 00BC GETMET R13 R13 K36 + 0x583C0020, // 00BD LDCONST R15 K32 + 0x7C340400, // 00BE CALL R13 2 + 0x7836000A, // 00BF JMPF R13 #00CB + 0xB8363600, // 00C0 GETNGBL R13 K27 + 0x8C341B02, // 00C1 GETMET R13 R13 K2 + 0x603C0018, // 00C2 GETGBL R15 G24 + 0x58400028, // 00C3 LDCONST R16 K40 + 0x88440315, // 00C4 GETMBR R17 R1 K21 + 0x8844231D, // 00C5 GETMBR R17 R17 K29 + 0x88480710, // 00C6 GETMBR R18 R3 K16 + 0x884C0326, // 00C7 GETMBR R19 R1 K38 + 0x7C3C0800, // 00C8 CALL R15 4 + 0x58400020, // 00C9 LDCONST R16 K32 + 0x7C340600, // 00CA CALL R13 3 + 0x7002000E, // 00CB JMP #00DB + 0xB8363600, // 00CC GETNGBL R13 K27 + 0x8C341B24, // 00CD GETMET R13 R13 K36 + 0x583C0020, // 00CE LDCONST R15 K32 + 0x7C340400, // 00CF CALL R13 2 + 0x78360009, // 00D0 JMPF R13 #00DB + 0xB8363600, // 00D1 GETNGBL R13 K27 + 0x8C341B02, // 00D2 GETMET R13 R13 K2 + 0x603C0018, // 00D3 GETGBL R15 G24 + 0x58400029, // 00D4 LDCONST R16 K41 + 0x88440315, // 00D5 GETMBR R17 R1 K21 + 0x8844231D, // 00D6 GETMBR R17 R17 K29 + 0x88480326, // 00D7 GETMBR R18 R1 K38 + 0x7C3C0600, // 00D8 CALL R15 3 + 0x58400020, // 00D9 LDCONST R16 K32 + 0x7C340600, // 00DA CALL R13 3 + 0x7001FF42, // 00DB JMP #001F + 0x5818002A, // 00DC LDCONST R6 K42 + 0xAC180200, // 00DD CATCH R6 1 0 + 0xB0080000, // 00DE RAISE 2 R0 R0 + 0x6018000C, // 00DF GETGBL R6 G12 + 0x881C0B0B, // 00E0 GETMBR R7 R5 K11 + 0x7C180200, // 00E1 CALL R6 1 + 0x24180D1E, // 00E2 GT R6 R6 K30 + 0x781A0004, // 00E3 JMPF R6 #00E9 + 0x8C18012B, // 00E4 GETMET R6 R0 K43 + 0x5C200200, // 00E5 MOVE R8 R1 + 0x5C240A00, // 00E6 MOVE R9 R5 + 0x7C180600, // 00E7 CALL R6 3 + 0x70020001, // 00E8 JMP #00EB + 0x50180000, // 00E9 LDBOOL R6 0 0 + 0x80040C00, // 00EA RET 1 R6 + 0x50180200, // 00EB LDBOOL R6 1 0 + 0x80040C00, // 00EC RET 1 R6 + 0x80000000, // 00ED RET 0 }) ) ); @@ -414,11 +1161,11 @@ be_local_closure(Matter_IM_process_invoke_request, /* name */ /******************************************************************** -** Solidified function: subscribe_request +** Solidified function: process_read_request ********************************************************************/ -be_local_closure(Matter_IM_subscribe_request, /* name */ +be_local_closure(Matter_IM_process_read_request, /* name */ be_nested_proto( - 17, /* nstack */ + 9, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -426,119 +1173,126 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(SubscribeRequestMessage), - /* K2 */ be_nested_str_weak(from_TLV), - /* K3 */ be_nested_str_weak(keep_subscriptions), - /* K4 */ be_nested_str_weak(subs_shop), - /* K5 */ be_nested_str_weak(remove_by_session), - /* K6 */ be_nested_str_weak(session), - /* K7 */ be_nested_str_weak(new_subscription), - /* K8 */ be_nested_str_weak(Path), - /* K9 */ be_nested_str_weak(msg), - /* K10 */ be_nested_str_weak(attributes_requests), - /* K11 */ be_nested_str_weak(endpoint), - /* K12 */ be_nested_str_weak(cluster), - /* K13 */ be_nested_str_weak(attribute), - /* K14 */ be_nested_str_weak(push), - /* K15 */ be_nested_str_weak(stop_iteration), - /* K16 */ be_nested_str_weak(tasmota), - /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), - /* K19 */ be_nested_str_weak(local_session_id), - /* K20 */ be_nested_str_weak(concat), - /* K21 */ be_nested_str_weak(_X20), - /* K22 */ be_nested_str_weak(min_interval), - /* K23 */ be_nested_str_weak(max_interval), - /* K24 */ be_const_int(1), - /* K25 */ be_const_int(0), - /* K26 */ be_nested_str_weak(subscription_id), - /* K27 */ be_const_int(3), - /* K28 */ be_nested_str_weak(_inner_process_read_request), - /* K29 */ be_nested_str_weak(send_subscribe_response), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(read_request_start), + /* K4 */ be_nested_str_weak(ReadRequestMessage), + /* K5 */ be_nested_str_weak(from_TLV), + /* K6 */ be_nested_str_weak(read_request_start_X2DTLV), + /* K7 */ be_nested_str_weak(attributes_requests), + /* K8 */ be_nested_str_weak(_inner_process_read_request), + /* K9 */ be_nested_str_weak(session), + /* K10 */ be_nested_str_weak(send_report_data), }), - be_str_weak(subscribe_request), + be_str_weak(process_read_request), &be_const_str_solidified, - ( &(const binstruction[78]) { /* code */ + ( &(const binstruction[30]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x880C0701, // 0001 GETMBR R3 R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x58140003, // 0003 LDCONST R5 K3 + 0x7C0C0400, // 0004 CALL R3 2 + 0xB80E0000, // 0005 GETNGBL R3 K0 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C0C0705, // 0008 GETMET R3 R3 K5 + 0x5C140400, // 0009 MOVE R5 R2 + 0x7C0C0400, // 000A CALL R3 2 + 0xB8120000, // 000B GETNGBL R4 K0 + 0x88100901, // 000C GETMBR R4 R4 K1 + 0x8C100902, // 000D GETMET R4 R4 K2 + 0x58180006, // 000E LDCONST R6 K6 + 0x7C100400, // 000F CALL R4 2 + 0x88100707, // 0010 GETMBR R4 R3 K7 + 0x4C140000, // 0011 LDNIL R5 + 0x20100805, // 0012 NE R4 R4 R5 + 0x78120007, // 0013 JMPF R4 #001C + 0x8C100108, // 0014 GETMET R4 R0 K8 + 0x88180309, // 0015 GETMBR R6 R1 K9 + 0x5C1C0600, // 0016 MOVE R7 R3 + 0x7C100600, // 0017 CALL R4 3 + 0x8C14010A, // 0018 GETMET R5 R0 K10 + 0x5C1C0200, // 0019 MOVE R7 R1 + 0x5C200800, // 001A MOVE R8 R4 + 0x7C140600, // 001B CALL R5 3 + 0x50100200, // 001C LDBOOL R4 1 0 + 0x80040800, // 001D RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_invoke_response +********************************************************************/ +be_local_closure(Matter_IM_send_invoke_response, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(send_queue), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(IM_InvokeResponse), + }), + be_str_weak(send_invoke_response), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x88100703, // 0006 GETMBR R4 R3 K3 - 0x74120003, // 0007 JMPT R4 #000C - 0x88100104, // 0008 GETMBR R4 R0 K4 - 0x8C100905, // 0009 GETMET R4 R4 K5 - 0x88180306, // 000A GETMBR R6 R1 K6 - 0x7C100400, // 000B CALL R4 2 - 0x88100104, // 000C GETMBR R4 R0 K4 - 0x8C100907, // 000D GETMET R4 R4 K7 - 0x88180306, // 000E GETMBR R6 R1 K6 - 0x5C1C0600, // 000F MOVE R7 R3 - 0x7C100600, // 0010 CALL R4 3 - 0x60140012, // 0011 GETGBL R5 G18 - 0x7C140000, // 0012 CALL R5 0 - 0xB81A0000, // 0013 GETNGBL R6 K0 - 0x8C180D08, // 0014 GETMET R6 R6 K8 - 0x7C180200, // 0015 CALL R6 1 - 0x901A1201, // 0016 SETMBR R6 K9 R1 - 0x601C0010, // 0017 GETGBL R7 G16 - 0x8820070A, // 0018 GETMBR R8 R3 K10 - 0x7C1C0200, // 0019 CALL R7 1 - 0xA802000D, // 001A EXBLK 0 #0029 - 0x5C200E00, // 001B MOVE R8 R7 - 0x7C200000, // 001C CALL R8 0 - 0x8824110B, // 001D GETMBR R9 R8 K11 - 0x901A1609, // 001E SETMBR R6 K11 R9 - 0x8824110C, // 001F GETMBR R9 R8 K12 - 0x901A1809, // 0020 SETMBR R6 K12 R9 - 0x8824110D, // 0021 GETMBR R9 R8 K13 - 0x901A1A09, // 0022 SETMBR R6 K13 R9 - 0x8C240B0E, // 0023 GETMET R9 R5 K14 - 0x602C0008, // 0024 GETGBL R11 G8 - 0x5C300C00, // 0025 MOVE R12 R6 - 0x7C2C0200, // 0026 CALL R11 1 - 0x7C240400, // 0027 CALL R9 2 - 0x7001FFF1, // 0028 JMP #001B - 0x581C000F, // 0029 LDCONST R7 K15 - 0xAC1C0200, // 002A CATCH R7 1 0 - 0xB0080000, // 002B RAISE 2 R0 R0 - 0xB81E2000, // 002C GETNGBL R7 K16 - 0x8C1C0F11, // 002D GETMET R7 R7 K17 - 0x60240018, // 002E GETGBL R9 G24 - 0x58280012, // 002F LDCONST R10 K18 - 0x882C0306, // 0030 GETMBR R11 R1 K6 - 0x882C1713, // 0031 GETMBR R11 R11 K19 - 0x8C300B14, // 0032 GETMET R12 R5 K20 - 0x58380015, // 0033 LDCONST R14 K21 - 0x7C300400, // 0034 CALL R12 2 - 0x88340916, // 0035 GETMBR R13 R4 K22 - 0x88380917, // 0036 GETMBR R14 R4 K23 - 0x883C0703, // 0037 GETMBR R15 R3 K3 - 0x783E0001, // 0038 JMPF R15 #003B - 0x583C0018, // 0039 LDCONST R15 K24 - 0x70020000, // 003A JMP #003C - 0x583C0019, // 003B LDCONST R15 K25 - 0x8840091A, // 003C GETMBR R16 R4 K26 - 0x7C240E00, // 003D CALL R9 7 - 0x5828001B, // 003E LDCONST R10 K27 - 0x7C1C0600, // 003F CALL R7 3 - 0x8C1C011C, // 0040 GETMET R7 R0 K28 - 0x88240306, // 0041 GETMBR R9 R1 K6 - 0x5C280600, // 0042 MOVE R10 R3 - 0x502C0200, // 0043 LDBOOL R11 1 0 - 0x7C1C0800, // 0044 CALL R7 4 - 0x8820091A, // 0045 GETMBR R8 R4 K26 - 0x901E3408, // 0046 SETMBR R7 K26 R8 - 0x8C20011D, // 0047 GETMET R8 R0 K29 - 0x5C280200, // 0048 MOVE R10 R1 - 0x5C2C0E00, // 0049 MOVE R11 R7 - 0x5C300800, // 004A MOVE R12 R4 - 0x7C200800, // 004B CALL R8 4 - 0x50200200, // 004C LDBOOL R8 1 0 - 0x80041000, // 004D RET 1 R8 + 0xB8160400, // 0002 GETNGBL R5 K2 + 0x8C140B03, // 0003 GETMET R5 R5 K3 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x5C200400, // 0005 MOVE R8 R2 + 0x7C140600, // 0006 CALL R5 3 + 0x7C0C0400, // 0007 CALL R3 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_write_response +********************************************************************/ +be_local_closure(Matter_IM_send_write_response, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(send_queue), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(IM_WriteResponse), + }), + be_str_weak(send_write_response), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0xB8160400, // 0002 GETNGBL R5 K2 + 0x8C140B03, // 0003 GETMET R5 R5 K3 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x5C200400, // 0005 MOVE R8 R2 + 0x7C140600, // 0006 CALL R5 3 + 0x7C0C0400, // 0007 CALL R3 2 + 0x80000000, // 0008 RET 0 }) ) ); @@ -875,36 +1629,246 @@ be_local_closure(Matter_IM_process_write_request, /* name */ /******************************************************************** -** Solidified function: send_write_response +** Solidified function: path2raw ********************************************************************/ -be_local_closure(Matter_IM_send_write_response, /* name */ +be_local_closure(Matter_IM_path2raw, /* name */ be_nested_proto( - 9, /* nstack */ - 3, /* argc */ + 8, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(send_queue), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(IM_WriteResponse), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(add), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(endpoint), + /* K3 */ be_const_int(2), + /* K4 */ be_nested_str_weak(cluster), + /* K5 */ be_nested_str_weak(attribute), }), - be_str_weak(send_write_response), + be_str_weak(path2raw), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0xB8160400, // 0002 GETNGBL R5 K2 - 0x8C140B03, // 0003 GETMET R5 R5 K3 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x5C200400, // 0005 MOVE R8 R2 - 0x7C140600, // 0006 CALL R5 3 - 0x7C0C0400, // 0007 CALL R3 2 - 0x80000000, // 0008 RET 0 + ( &(const binstruction[102]) { /* code */ + 0x8C100300, // 0000 GETMET R4 R1 K0 + 0x541A0036, // 0001 LDINT R6 55 + 0x581C0001, // 0002 LDCONST R7 K1 + 0x7C100600, // 0003 CALL R4 3 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x5C180600, // 0005 MOVE R6 R3 + 0x581C0001, // 0006 LDCONST R7 K1 + 0x7C100600, // 0007 CALL R4 3 + 0x88100502, // 0008 GETMBR R4 R2 K2 + 0x541600FE, // 0009 LDINT R5 255 + 0x18100805, // 000A LE R4 R4 R5 + 0x78120008, // 000B JMPF R4 #0015 + 0x8C100300, // 000C GETMET R4 R1 K0 + 0x541A2401, // 000D LDINT R6 9218 + 0x541DFFFD, // 000E LDINT R7 -2 + 0x7C100600, // 000F CALL R4 3 + 0x8C100300, // 0010 GETMET R4 R1 K0 + 0x88180502, // 0011 GETMBR R6 R2 K2 + 0x581C0001, // 0012 LDCONST R7 K1 + 0x7C100600, // 0013 CALL R4 3 + 0x70020007, // 0014 JMP #001D + 0x8C100300, // 0015 GETMET R4 R1 K0 + 0x541A2501, // 0016 LDINT R6 9474 + 0x541DFFFD, // 0017 LDINT R7 -2 + 0x7C100600, // 0018 CALL R4 3 + 0x8C100300, // 0019 GETMET R4 R1 K0 + 0x88180502, // 001A GETMBR R6 R2 K2 + 0x581C0003, // 001B LDCONST R7 K3 + 0x7C100600, // 001C CALL R4 3 + 0x88100504, // 001D GETMBR R4 R2 K4 + 0x541600FE, // 001E LDINT R5 255 + 0x18100805, // 001F LE R4 R4 R5 + 0x78120008, // 0020 JMPF R4 #002A + 0x8C100300, // 0021 GETMET R4 R1 K0 + 0x541A2402, // 0022 LDINT R6 9219 + 0x541DFFFD, // 0023 LDINT R7 -2 + 0x7C100600, // 0024 CALL R4 3 + 0x8C100300, // 0025 GETMET R4 R1 K0 + 0x88180504, // 0026 GETMBR R6 R2 K4 + 0x581C0001, // 0027 LDCONST R7 K1 + 0x7C100600, // 0028 CALL R4 3 + 0x70020014, // 0029 JMP #003F + 0x88100504, // 002A GETMBR R4 R2 K4 + 0x5416FFFE, // 002B LDINT R5 65535 + 0x18100805, // 002C LE R4 R4 R5 + 0x78120008, // 002D JMPF R4 #0037 + 0x8C100300, // 002E GETMET R4 R1 K0 + 0x541A2502, // 002F LDINT R6 9475 + 0x541DFFFD, // 0030 LDINT R7 -2 + 0x7C100600, // 0031 CALL R4 3 + 0x8C100300, // 0032 GETMET R4 R1 K0 + 0x88180504, // 0033 GETMBR R6 R2 K4 + 0x581C0003, // 0034 LDCONST R7 K3 + 0x7C100600, // 0035 CALL R4 3 + 0x70020007, // 0036 JMP #003F + 0x8C100300, // 0037 GETMET R4 R1 K0 + 0x541A2602, // 0038 LDINT R6 9731 + 0x541DFFFD, // 0039 LDINT R7 -2 + 0x7C100600, // 003A CALL R4 3 + 0x8C100300, // 003B GETMET R4 R1 K0 + 0x88180504, // 003C GETMBR R6 R2 K4 + 0x541E0003, // 003D LDINT R7 4 + 0x7C100600, // 003E CALL R4 3 + 0x88100505, // 003F GETMBR R4 R2 K5 + 0x541600FE, // 0040 LDINT R5 255 + 0x18100805, // 0041 LE R4 R4 R5 + 0x78120008, // 0042 JMPF R4 #004C + 0x8C100300, // 0043 GETMET R4 R1 K0 + 0x541A2403, // 0044 LDINT R6 9220 + 0x541DFFFD, // 0045 LDINT R7 -2 + 0x7C100600, // 0046 CALL R4 3 + 0x8C100300, // 0047 GETMET R4 R1 K0 + 0x88180505, // 0048 GETMBR R6 R2 K5 + 0x581C0001, // 0049 LDCONST R7 K1 + 0x7C100600, // 004A CALL R4 3 + 0x70020014, // 004B JMP #0061 + 0x88100505, // 004C GETMBR R4 R2 K5 + 0x5416FFFE, // 004D LDINT R5 65535 + 0x18100805, // 004E LE R4 R4 R5 + 0x78120008, // 004F JMPF R4 #0059 + 0x8C100300, // 0050 GETMET R4 R1 K0 + 0x541A2503, // 0051 LDINT R6 9476 + 0x541DFFFD, // 0052 LDINT R7 -2 + 0x7C100600, // 0053 CALL R4 3 + 0x8C100300, // 0054 GETMET R4 R1 K0 + 0x88180505, // 0055 GETMBR R6 R2 K5 + 0x581C0003, // 0056 LDCONST R7 K3 + 0x7C100600, // 0057 CALL R4 3 + 0x70020007, // 0058 JMP #0061 + 0x8C100300, // 0059 GETMET R4 R1 K0 + 0x541A2603, // 005A LDINT R6 9732 + 0x541DFFFD, // 005B LDINT R7 -2 + 0x7C100600, // 005C CALL R4 3 + 0x8C100300, // 005D GETMET R4 R1 K0 + 0x88180505, // 005E GETMBR R6 R2 K5 + 0x541E0003, // 005F LDINT R7 4 + 0x7C100600, // 0060 CALL R4 3 + 0x8C100300, // 0061 GETMET R4 R1 K0 + 0x541A0017, // 0062 LDINT R6 24 + 0x581C0001, // 0063 LDCONST R7 K1 + 0x7C100600, // 0064 CALL R4 3 + 0x80000000, // 0065 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_subscribe_update +********************************************************************/ +be_local_closure(Matter_IM_send_subscribe_update, /* name */ + be_nested_proto( + 11, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[25]) { /* constants */ + /* K0 */ be_nested_str_weak(session), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(ReadRequestMessage), + /* K3 */ be_nested_str_weak(fabric_filtered), + /* K4 */ be_nested_str_weak(attributes_requests), + /* K5 */ be_nested_str_weak(updates), + /* K6 */ be_nested_str_weak(AttributePathIB), + /* K7 */ be_nested_str_weak(endpoint), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(attribute), + /* K10 */ be_nested_str_weak(push), + /* K11 */ be_nested_str_weak(stop_iteration), + /* K12 */ be_nested_str_weak(tasmota), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Data_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), + /* K15 */ be_nested_str_weak(local_session_id), + /* K16 */ be_nested_str_weak(subscription_id), + /* K17 */ be_const_int(3), + /* K18 */ be_nested_str_weak(is_keep_alive), + /* K19 */ be_nested_str_weak(_inner_process_read_request), + /* K20 */ be_nested_str_weak(suppress_response), + /* K21 */ be_nested_str_weak(IM_ReportDataSubscribed), + /* K22 */ be_nested_str_weak(_message_handler), + /* K23 */ be_nested_str_weak(send_queue), + /* K24 */ be_nested_str_weak(send_enqueued), + }), + be_str_weak(send_subscribe_update), + &be_const_str_solidified, + ( &(const binstruction[66]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0xB80E0200, // 0001 GETNGBL R3 K1 + 0x8C0C0702, // 0002 GETMET R3 R3 K2 + 0x7C0C0200, // 0003 CALL R3 1 + 0x50100000, // 0004 LDBOOL R4 0 0 + 0x900E0604, // 0005 SETMBR R3 K3 R4 + 0x60100012, // 0006 GETGBL R4 G18 + 0x7C100000, // 0007 CALL R4 0 + 0x900E0804, // 0008 SETMBR R3 K4 R4 + 0x60100010, // 0009 GETGBL R4 G16 + 0x88140305, // 000A GETMBR R5 R1 K5 + 0x7C100200, // 000B CALL R4 1 + 0xA802000F, // 000C EXBLK 0 #001D + 0x5C140800, // 000D MOVE R5 R4 + 0x7C140000, // 000E CALL R5 0 + 0xB81A0200, // 000F GETNGBL R6 K1 + 0x8C180D06, // 0010 GETMET R6 R6 K6 + 0x7C180200, // 0011 CALL R6 1 + 0x881C0B07, // 0012 GETMBR R7 R5 K7 + 0x901A0E07, // 0013 SETMBR R6 K7 R7 + 0x881C0B08, // 0014 GETMBR R7 R5 K8 + 0x901A1007, // 0015 SETMBR R6 K8 R7 + 0x881C0B09, // 0016 GETMBR R7 R5 K9 + 0x901A1207, // 0017 SETMBR R6 K9 R7 + 0x881C0704, // 0018 GETMBR R7 R3 K4 + 0x8C1C0F0A, // 0019 GETMET R7 R7 K10 + 0x5C240C00, // 001A MOVE R9 R6 + 0x7C1C0400, // 001B CALL R7 2 + 0x7001FFEF, // 001C JMP #000D + 0x5810000B, // 001D LDCONST R4 K11 + 0xAC100200, // 001E CATCH R4 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0xB8121800, // 0020 GETNGBL R4 K12 + 0x8C10090D, // 0021 GETMET R4 R4 K13 + 0x60180018, // 0022 GETGBL R6 G24 + 0x581C000E, // 0023 LDCONST R7 K14 + 0x8820050F, // 0024 GETMBR R8 R2 K15 + 0x88240310, // 0025 GETMBR R9 R1 K16 + 0x7C180600, // 0026 CALL R6 3 + 0x581C0011, // 0027 LDCONST R7 K17 + 0x7C100600, // 0028 CALL R4 3 + 0x50100000, // 0029 LDBOOL R4 0 0 + 0x90062404, // 002A SETMBR R1 K18 R4 + 0x8C100113, // 002B GETMET R4 R0 K19 + 0x5C180400, // 002C MOVE R6 R2 + 0x5C1C0600, // 002D MOVE R7 R3 + 0x7C100600, // 002E CALL R4 3 + 0x50140000, // 002F LDBOOL R5 0 0 + 0x90122805, // 0030 SETMBR R4 K20 R5 + 0x88140310, // 0031 GETMBR R5 R1 K16 + 0x90122005, // 0032 SETMBR R4 K16 R5 + 0xB8160200, // 0033 GETNGBL R5 K1 + 0x8C140B15, // 0034 GETMET R5 R5 K21 + 0x881C0516, // 0035 GETMBR R7 R2 K22 + 0x5C200400, // 0036 MOVE R8 R2 + 0x5C240800, // 0037 MOVE R9 R4 + 0x5C280200, // 0038 MOVE R10 R1 + 0x7C140A00, // 0039 CALL R5 5 + 0x88180117, // 003A GETMBR R6 R0 K23 + 0x8C180D0A, // 003B GETMET R6 R6 K10 + 0x5C200A00, // 003C MOVE R8 R5 + 0x7C180400, // 003D CALL R6 2 + 0x8C180118, // 003E GETMET R6 R0 K24 + 0x88200516, // 003F GETMBR R8 R2 K22 + 0x7C180400, // 0040 CALL R6 2 + 0x80000000, // 0041 RET 0 }) ) ); @@ -964,6 +1928,223 @@ be_local_closure(Matter_IM_remove_sendqueue_by_exchangeid, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: process_incoming +********************************************************************/ +be_local_closure(Matter_IM_process_incoming, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[25]) { /* constants */ + /* K0 */ be_nested_str_weak(opcode), + /* K1 */ be_const_int(2), + /* K2 */ be_nested_str_weak(read_request_solo), + /* K3 */ be_nested_str_weak(from_raw), + /* K4 */ be_nested_str_weak(raw), + /* K5 */ be_nested_str_weak(app_payload_idx), + /* K6 */ be_nested_str_weak(process_read_request_solo), + /* K7 */ be_nested_str_weak(invoke_request_solo), + /* K8 */ be_nested_str_weak(process_invoke_request_solo), + /* K9 */ be_nested_str_weak(matter), + /* K10 */ be_nested_str_weak(TLV), + /* K11 */ be_nested_str_weak(parse), + /* K12 */ be_const_int(1), + /* K13 */ be_nested_str_weak(process_status_response), + /* K14 */ be_nested_str_weak(process_read_request), + /* K15 */ be_const_int(3), + /* K16 */ be_nested_str_weak(send_ack_now), + /* K17 */ be_nested_str_weak(subscribe_request), + /* K18 */ be_nested_str_weak(subscribe_response), + /* K19 */ be_nested_str_weak(report_data), + /* K20 */ be_nested_str_weak(process_write_request), + /* K21 */ be_nested_str_weak(process_write_response), + /* K22 */ be_nested_str_weak(process_invoke_request), + /* K23 */ be_nested_str_weak(process_invoke_response), + /* K24 */ be_nested_str_weak(process_timed_request), + }), + be_str_weak(process_incoming), + &be_const_str_solidified, + ( &(const binstruction[133]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0x1C0C0501, // 0001 EQ R3 R2 K1 + 0x780E000D, // 0002 JMPF R3 #0011 + 0x880C0102, // 0003 GETMBR R3 R0 K2 + 0x8C0C0703, // 0004 GETMET R3 R3 K3 + 0x88140304, // 0005 GETMBR R5 R1 K4 + 0x88180305, // 0006 GETMBR R6 R1 K5 + 0x7C0C0600, // 0007 CALL R3 3 + 0x4C100000, // 0008 LDNIL R4 + 0x20100604, // 0009 NE R4 R3 R4 + 0x78120004, // 000A JMPF R4 #0010 + 0x8C100106, // 000B GETMET R4 R0 K6 + 0x5C180200, // 000C MOVE R6 R1 + 0x5C1C0600, // 000D MOVE R7 R3 + 0x7C100600, // 000E CALL R4 3 + 0x80040800, // 000F RET 1 R4 + 0x7002000F, // 0010 JMP #0021 + 0x540E0007, // 0011 LDINT R3 8 + 0x1C0C0403, // 0012 EQ R3 R2 R3 + 0x780E000C, // 0013 JMPF R3 #0021 + 0x880C0107, // 0014 GETMBR R3 R0 K7 + 0x8C0C0703, // 0015 GETMET R3 R3 K3 + 0x88140304, // 0016 GETMBR R5 R1 K4 + 0x88180305, // 0017 GETMBR R6 R1 K5 + 0x7C0C0600, // 0018 CALL R3 3 + 0x4C100000, // 0019 LDNIL R4 + 0x20100604, // 001A NE R4 R3 R4 + 0x78120004, // 001B JMPF R4 #0021 + 0x8C100108, // 001C GETMET R4 R0 K8 + 0x5C180200, // 001D MOVE R6 R1 + 0x5C1C0600, // 001E MOVE R7 R3 + 0x7C100600, // 001F CALL R4 3 + 0x80040800, // 0020 RET 1 R4 + 0xB80E1200, // 0021 GETNGBL R3 K9 + 0x880C070A, // 0022 GETMBR R3 R3 K10 + 0x8C0C070B, // 0023 GETMET R3 R3 K11 + 0x88140304, // 0024 GETMBR R5 R1 K4 + 0x88180305, // 0025 GETMBR R6 R1 K5 + 0x7C0C0600, // 0026 CALL R3 3 + 0x1C10050C, // 0027 EQ R4 R2 K12 + 0x78120005, // 0028 JMPF R4 #002F + 0x8C10010D, // 0029 GETMET R4 R0 K13 + 0x5C180200, // 002A MOVE R6 R1 + 0x5C1C0600, // 002B MOVE R7 R3 + 0x7C100600, // 002C CALL R4 3 + 0x80040800, // 002D RET 1 R4 + 0x70020053, // 002E JMP #0083 + 0x1C100501, // 002F EQ R4 R2 K1 + 0x78120005, // 0030 JMPF R4 #0037 + 0x8C10010E, // 0031 GETMET R4 R0 K14 + 0x5C180200, // 0032 MOVE R6 R1 + 0x5C1C0600, // 0033 MOVE R7 R3 + 0x7C100600, // 0034 CALL R4 3 + 0x80040800, // 0035 RET 1 R4 + 0x7002004B, // 0036 JMP #0083 + 0x1C10050F, // 0037 EQ R4 R2 K15 + 0x78120008, // 0038 JMPF R4 #0042 + 0x8C100110, // 0039 GETMET R4 R0 K16 + 0x5C180200, // 003A MOVE R6 R1 + 0x7C100400, // 003B CALL R4 2 + 0x8C100111, // 003C GETMET R4 R0 K17 + 0x5C180200, // 003D MOVE R6 R1 + 0x5C1C0600, // 003E MOVE R7 R3 + 0x7C100600, // 003F CALL R4 3 + 0x80040800, // 0040 RET 1 R4 + 0x70020040, // 0041 JMP #0083 + 0x54120003, // 0042 LDINT R4 4 + 0x1C100404, // 0043 EQ R4 R2 R4 + 0x78120005, // 0044 JMPF R4 #004B + 0x8C100112, // 0045 GETMET R4 R0 K18 + 0x5C180200, // 0046 MOVE R6 R1 + 0x5C1C0600, // 0047 MOVE R7 R3 + 0x7C100600, // 0048 CALL R4 3 + 0x80040800, // 0049 RET 1 R4 + 0x70020037, // 004A JMP #0083 + 0x54120004, // 004B LDINT R4 5 + 0x1C100404, // 004C EQ R4 R2 R4 + 0x78120005, // 004D JMPF R4 #0054 + 0x8C100113, // 004E GETMET R4 R0 K19 + 0x5C180200, // 004F MOVE R6 R1 + 0x5C1C0600, // 0050 MOVE R7 R3 + 0x7C100600, // 0051 CALL R4 3 + 0x80040800, // 0052 RET 1 R4 + 0x7002002E, // 0053 JMP #0083 + 0x54120005, // 0054 LDINT R4 6 + 0x1C100404, // 0055 EQ R4 R2 R4 + 0x78120008, // 0056 JMPF R4 #0060 + 0x8C100110, // 0057 GETMET R4 R0 K16 + 0x5C180200, // 0058 MOVE R6 R1 + 0x7C100400, // 0059 CALL R4 2 + 0x8C100114, // 005A GETMET R4 R0 K20 + 0x5C180200, // 005B MOVE R6 R1 + 0x5C1C0600, // 005C MOVE R7 R3 + 0x7C100600, // 005D CALL R4 3 + 0x80040800, // 005E RET 1 R4 + 0x70020022, // 005F JMP #0083 + 0x54120006, // 0060 LDINT R4 7 + 0x1C100404, // 0061 EQ R4 R2 R4 + 0x78120005, // 0062 JMPF R4 #0069 + 0x8C100115, // 0063 GETMET R4 R0 K21 + 0x5C180200, // 0064 MOVE R6 R1 + 0x5C1C0600, // 0065 MOVE R7 R3 + 0x7C100600, // 0066 CALL R4 3 + 0x80040800, // 0067 RET 1 R4 + 0x70020019, // 0068 JMP #0083 + 0x54120007, // 0069 LDINT R4 8 + 0x1C100404, // 006A EQ R4 R2 R4 + 0x78120005, // 006B JMPF R4 #0072 + 0x8C100116, // 006C GETMET R4 R0 K22 + 0x5C180200, // 006D MOVE R6 R1 + 0x5C1C0600, // 006E MOVE R7 R3 + 0x7C100600, // 006F CALL R4 3 + 0x80040800, // 0070 RET 1 R4 + 0x70020010, // 0071 JMP #0083 + 0x54120008, // 0072 LDINT R4 9 + 0x1C100404, // 0073 EQ R4 R2 R4 + 0x78120005, // 0074 JMPF R4 #007B + 0x8C100117, // 0075 GETMET R4 R0 K23 + 0x5C180200, // 0076 MOVE R6 R1 + 0x5C1C0600, // 0077 MOVE R7 R3 + 0x7C100600, // 0078 CALL R4 3 + 0x80040800, // 0079 RET 1 R4 + 0x70020007, // 007A JMP #0083 + 0x54120009, // 007B LDINT R4 10 + 0x1C100404, // 007C EQ R4 R2 R4 + 0x78120004, // 007D JMPF R4 #0083 + 0x8C100118, // 007E GETMET R4 R0 K24 + 0x5C180200, // 007F MOVE R6 R1 + 0x5C1C0600, // 0080 MOVE R7 R3 + 0x7C100600, // 0081 CALL R4 3 + 0x80040800, // 0082 RET 1 R4 + 0x50100000, // 0083 LDBOOL R4 0 0 + 0x80040800, // 0084 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: process_invoke_response +********************************************************************/ +be_local_closure(Matter_IM_process_invoke_response, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(InvokeResponseMessage), + /* K2 */ be_nested_str_weak(from_TLV), + }), + be_str_weak(process_invoke_response), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: every_second ********************************************************************/ @@ -992,149 +2173,6 @@ be_local_closure(Matter_IM_every_second, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: send_ack_now -********************************************************************/ -be_local_closure(Matter_IM_send_ack_now, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(session), - /* K1 */ be_nested_str_weak(_message_handler), - /* K2 */ be_nested_str_weak(send_encrypted_ack), - }), - be_str_weak(send_ack_now), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x1C080202, // 0001 EQ R2 R1 R2 - 0x780A0000, // 0002 JMPF R2 #0004 - 0x80000400, // 0003 RET 0 - 0x88080300, // 0004 GETMBR R2 R1 K0 - 0x88080501, // 0005 GETMBR R2 R2 K1 - 0x8C080502, // 0006 GETMET R2 R2 K2 - 0x5C100200, // 0007 MOVE R4 R1 - 0x50140000, // 0008 LDBOOL R5 0 0 - 0x7C080600, // 0009 CALL R2 3 - 0x80000000, // 000A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_IM_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(subs_shop), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_subscribe_response -********************************************************************/ -be_local_closure(Matter_IM_send_subscribe_response, /* name */ - be_nested_proto( - 11, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(send_queue), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(IM_SubscribeResponse), - }), - be_str_weak(send_subscribe_response), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0xB81A0400, // 0002 GETNGBL R6 K2 - 0x8C180D03, // 0003 GETMET R6 R6 K3 - 0x5C200200, // 0004 MOVE R8 R1 - 0x5C240400, // 0005 MOVE R9 R2 - 0x5C280600, // 0006 MOVE R10 R3 - 0x7C180800, // 0007 CALL R6 4 - 0x7C100400, // 0008 CALL R4 2 - 0x80000000, // 0009 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_invoke_response -********************************************************************/ -be_local_closure(Matter_IM_send_invoke_response, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(send_queue), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(IM_InvokeResponse), - }), - be_str_weak(send_invoke_response), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0xB8160400, // 0002 GETNGBL R5 K2 - 0x8C140B03, // 0003 GETMET R5 R5 K3 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x5C200400, // 0005 MOVE R8 R2 - 0x7C140600, // 0006 CALL R5 3 - 0x7C0C0400, // 0007 CALL R3 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: send_status ********************************************************************/ @@ -1172,193 +2210,6 @@ be_local_closure(Matter_IM_send_status, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: subscribe_response -********************************************************************/ -be_local_closure(Matter_IM_subscribe_response, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(SubscribeResponseMessage), - /* K2 */ be_nested_str_weak(from_TLV), - }), - be_str_weak(subscribe_response), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x50100000, // 0006 LDBOOL R4 0 0 - 0x80040800, // 0007 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_incoming -********************************************************************/ -be_local_closure(Matter_IM_process_incoming, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[21]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(parse), - /* K3 */ be_nested_str_weak(raw), - /* K4 */ be_nested_str_weak(app_payload_idx), - /* K5 */ be_nested_str_weak(findsubval), - /* K6 */ be_nested_str_weak(opcode), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(process_status_response), - /* K9 */ be_const_int(2), - /* K10 */ be_nested_str_weak(send_ack_now), - /* K11 */ be_nested_str_weak(process_read_request), - /* K12 */ be_const_int(3), - /* K13 */ be_nested_str_weak(subscribe_request), - /* K14 */ be_nested_str_weak(subscribe_response), - /* K15 */ be_nested_str_weak(report_data), - /* K16 */ be_nested_str_weak(process_write_request), - /* K17 */ be_nested_str_weak(process_write_response), - /* K18 */ be_nested_str_weak(process_invoke_request), - /* K19 */ be_nested_str_weak(process_invoke_response), - /* K20 */ be_nested_str_weak(process_timed_request), - }), - be_str_weak(process_incoming), - &be_const_str_solidified, - ( &(const binstruction[107]) { /* code */ - 0xB80A0000, // 0000 GETNGBL R2 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x88100303, // 0003 GETMBR R4 R1 K3 - 0x88140304, // 0004 GETMBR R5 R1 K4 - 0x7C080600, // 0005 CALL R2 3 - 0x8C0C0505, // 0006 GETMET R3 R2 K5 - 0x541600FE, // 0007 LDINT R5 255 - 0x7C0C0400, // 0008 CALL R3 2 - 0x88100306, // 0009 GETMBR R4 R1 K6 - 0x1C140907, // 000A EQ R5 R4 K7 - 0x78160005, // 000B JMPF R5 #0012 - 0x8C140108, // 000C GETMET R5 R0 K8 - 0x5C1C0200, // 000D MOVE R7 R1 - 0x5C200400, // 000E MOVE R8 R2 - 0x7C140600, // 000F CALL R5 3 - 0x80040A00, // 0010 RET 1 R5 - 0x70020056, // 0011 JMP #0069 - 0x1C140909, // 0012 EQ R5 R4 K9 - 0x78160008, // 0013 JMPF R5 #001D - 0x8C14010A, // 0014 GETMET R5 R0 K10 - 0x5C1C0200, // 0015 MOVE R7 R1 - 0x7C140400, // 0016 CALL R5 2 - 0x8C14010B, // 0017 GETMET R5 R0 K11 - 0x5C1C0200, // 0018 MOVE R7 R1 - 0x5C200400, // 0019 MOVE R8 R2 - 0x7C140600, // 001A CALL R5 3 - 0x80040A00, // 001B RET 1 R5 - 0x7002004B, // 001C JMP #0069 - 0x1C14090C, // 001D EQ R5 R4 K12 - 0x78160008, // 001E JMPF R5 #0028 - 0x8C14010A, // 001F GETMET R5 R0 K10 - 0x5C1C0200, // 0020 MOVE R7 R1 - 0x7C140400, // 0021 CALL R5 2 - 0x8C14010D, // 0022 GETMET R5 R0 K13 - 0x5C1C0200, // 0023 MOVE R7 R1 - 0x5C200400, // 0024 MOVE R8 R2 - 0x7C140600, // 0025 CALL R5 3 - 0x80040A00, // 0026 RET 1 R5 - 0x70020040, // 0027 JMP #0069 - 0x54160003, // 0028 LDINT R5 4 - 0x1C140805, // 0029 EQ R5 R4 R5 - 0x78160005, // 002A JMPF R5 #0031 - 0x8C14010E, // 002B GETMET R5 R0 K14 - 0x5C1C0200, // 002C MOVE R7 R1 - 0x5C200400, // 002D MOVE R8 R2 - 0x7C140600, // 002E CALL R5 3 - 0x80040A00, // 002F RET 1 R5 - 0x70020037, // 0030 JMP #0069 - 0x54160004, // 0031 LDINT R5 5 - 0x1C140805, // 0032 EQ R5 R4 R5 - 0x78160005, // 0033 JMPF R5 #003A - 0x8C14010F, // 0034 GETMET R5 R0 K15 - 0x5C1C0200, // 0035 MOVE R7 R1 - 0x5C200400, // 0036 MOVE R8 R2 - 0x7C140600, // 0037 CALL R5 3 - 0x80040A00, // 0038 RET 1 R5 - 0x7002002E, // 0039 JMP #0069 - 0x54160005, // 003A LDINT R5 6 - 0x1C140805, // 003B EQ R5 R4 R5 - 0x78160008, // 003C JMPF R5 #0046 - 0x8C14010A, // 003D GETMET R5 R0 K10 - 0x5C1C0200, // 003E MOVE R7 R1 - 0x7C140400, // 003F CALL R5 2 - 0x8C140110, // 0040 GETMET R5 R0 K16 - 0x5C1C0200, // 0041 MOVE R7 R1 - 0x5C200400, // 0042 MOVE R8 R2 - 0x7C140600, // 0043 CALL R5 3 - 0x80040A00, // 0044 RET 1 R5 - 0x70020022, // 0045 JMP #0069 - 0x54160006, // 0046 LDINT R5 7 - 0x1C140805, // 0047 EQ R5 R4 R5 - 0x78160005, // 0048 JMPF R5 #004F - 0x8C140111, // 0049 GETMET R5 R0 K17 - 0x5C1C0200, // 004A MOVE R7 R1 - 0x5C200400, // 004B MOVE R8 R2 - 0x7C140600, // 004C CALL R5 3 - 0x80040A00, // 004D RET 1 R5 - 0x70020019, // 004E JMP #0069 - 0x54160007, // 004F LDINT R5 8 - 0x1C140805, // 0050 EQ R5 R4 R5 - 0x78160005, // 0051 JMPF R5 #0058 - 0x8C140112, // 0052 GETMET R5 R0 K18 - 0x5C1C0200, // 0053 MOVE R7 R1 - 0x5C200400, // 0054 MOVE R8 R2 - 0x7C140600, // 0055 CALL R5 3 - 0x80040A00, // 0056 RET 1 R5 - 0x70020010, // 0057 JMP #0069 - 0x54160008, // 0058 LDINT R5 9 - 0x1C140805, // 0059 EQ R5 R4 R5 - 0x78160005, // 005A JMPF R5 #0061 - 0x8C140113, // 005B GETMET R5 R0 K19 - 0x5C1C0200, // 005C MOVE R7 R1 - 0x5C200400, // 005D MOVE R8 R2 - 0x7C140600, // 005E CALL R5 3 - 0x80040A00, // 005F RET 1 R5 - 0x70020007, // 0060 JMP #0069 - 0x54160009, // 0061 LDINT R5 10 - 0x1C140805, // 0062 EQ R5 R4 R5 - 0x78160004, // 0063 JMPF R5 #0069 - 0x8C140114, // 0064 GETMET R5 R0 K20 - 0x5C1C0200, // 0065 MOVE R7 R1 - 0x5C200400, // 0066 MOVE R8 R2 - 0x7C140600, // 0067 CALL R5 3 - 0x80040A00, // 0068 RET 1 R5 - 0x50140000, // 0069 LDBOOL R5 0 0 - 0x80040A00, // 006A RET 1 R5 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: _inner_process_read_request ********************************************************************/ @@ -1372,18 +2223,19 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 1, /* has sup protos */ ( &(const struct bproto*[ 2]) { be_nested_proto( - 23, /* nstack */ + 19, /* nstack */ 4, /* argc */ 0, /* varg */ 1, /* has upvals */ - ( &(const bupvaldesc[ 2]) { /* upvals */ + ( &(const bupvaldesc[ 3]) { /* upvals */ be_local_const_upval(1, 1), + be_local_const_upval(1, 0), be_local_const_upval(1, 3), }), 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[38]) { /* constants */ + ( &(const bvalue[28]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(TLV), /* K2 */ be_nested_str_weak(get_attribute_name), @@ -1393,39 +2245,29 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /* K6 */ be_nested_str_weak(_X29), /* K7 */ be_nested_str_weak(), /* K8 */ be_nested_str_weak(read_attribute), - /* K9 */ be_nested_str_weak(AttributeReportIB), - /* K10 */ be_nested_str_weak(attribute_data), - /* K11 */ be_nested_str_weak(AttributeDataIB), - /* K12 */ be_nested_str_weak(data_version), - /* K13 */ be_const_int(1), - /* K14 */ be_nested_str_weak(path), - /* K15 */ be_nested_str_weak(AttributePathIB), - /* K16 */ be_nested_str_weak(endpoint), - /* K17 */ be_nested_str_weak(data), - /* K18 */ be_nested_str_weak(to_TLV), - /* K19 */ be_nested_str_weak(encode_len), - /* K20 */ be_nested_str_weak(tlv2raw), - /* K21 */ be_nested_str_weak(tasmota), - /* K22 */ be_nested_str_weak(log), - /* K23 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), - /* K24 */ be_nested_str_weak(local_session_id), - /* K25 */ be_const_int(3), - /* K26 */ be_nested_str_weak(status), - /* K27 */ be_nested_str_weak(attribute_status), - /* K28 */ be_nested_str_weak(AttributeStatusIB), - /* K29 */ be_nested_str_weak(StatusIB), - /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), - /* K31 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), - /* K33 */ be_nested_str_weak(attribute_reports), - /* K34 */ be_const_int(0), - /* K35 */ be_nested_str_weak(push), - /* K36 */ be_nested_str_weak(IM_ReportData), - /* K37 */ be_nested_str_weak(MAX_MESSAGE), + /* K9 */ be_nested_str_weak(tlv_solo), + /* K10 */ be_nested_str_weak(to_str_val), + /* K11 */ be_nested_str_weak(attributedata2raw), + /* K12 */ be_nested_str_weak(tasmota), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), + /* K15 */ be_nested_str_weak(local_session_id), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(status), + /* K18 */ be_nested_str_weak(attributestatus2raw), + /* K19 */ be_nested_str_weak(loglevel), + /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), + /* K21 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K22 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), + /* K23 */ be_nested_str_weak(attribute_reports), + /* K24 */ be_const_int(0), + /* K25 */ be_nested_str_weak(push), + /* K26 */ be_nested_str_weak(IM_ReportData), + /* K27 */ be_nested_str_weak(MAX_MESSAGE), }), be_str_weak(read_single_attribute), &be_const_str_solidified, - ( &(const binstruction[205]) { /* code */ + ( &(const binstruction[148]) { /* code */ 0xB8120000, // 0000 GETNGBL R4 K0 0x88100901, // 0001 GETMBR R4 R4 K1 0xB8160000, // 0002 GETNGBL R5 K0 @@ -1441,196 +2283,139 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0x5C140C00, // 000C MOVE R5 R6 0x4C180000, // 000D LDNIL R6 0x20180206, // 000E NE R6 R1 R6 - 0x781A0004, // 000F JMPF R6 #0015 + 0x781A0006, // 000F JMPF R6 #0017 0x8C180308, // 0010 GETMET R6 R1 K8 0x68200000, // 0011 GETUPV R8 U0 0x5C240400, // 0012 MOVE R9 R2 - 0x7C180600, // 0013 CALL R6 3 - 0x70020000, // 0014 JMP #0016 - 0x4C180000, // 0015 LDNIL R6 - 0x501C0200, // 0016 LDBOOL R7 1 0 - 0x4C200000, // 0017 LDNIL R8 - 0x4C240000, // 0018 LDNIL R9 - 0x20240C09, // 0019 NE R9 R6 R9 - 0x7826003A, // 001A JMPF R9 #0056 - 0x60240008, // 001B GETGBL R9 G8 - 0x5C280C00, // 001C MOVE R10 R6 - 0x7C240200, // 001D CALL R9 1 - 0xB82A0000, // 001E GETNGBL R10 K0 - 0x8C281509, // 001F GETMET R10 R10 K9 - 0x7C280200, // 0020 CALL R10 1 - 0xB82E0000, // 0021 GETNGBL R11 K0 - 0x8C2C170B, // 0022 GETMET R11 R11 K11 - 0x7C2C0200, // 0023 CALL R11 1 - 0x902A140B, // 0024 SETMBR R10 K10 R11 - 0x882C150A, // 0025 GETMBR R11 R10 K10 - 0x902E190D, // 0026 SETMBR R11 K12 K13 - 0x882C150A, // 0027 GETMBR R11 R10 K10 - 0xB8320000, // 0028 GETNGBL R12 K0 - 0x8C30190F, // 0029 GETMET R12 R12 K15 - 0x7C300200, // 002A CALL R12 1 - 0x902E1C0C, // 002B SETMBR R11 K14 R12 - 0x882C150A, // 002C GETMBR R11 R10 K10 - 0x882C170E, // 002D GETMBR R11 R11 K14 - 0x88300510, // 002E GETMBR R12 R2 K16 - 0x902E200C, // 002F SETMBR R11 K16 R12 - 0x882C150A, // 0030 GETMBR R11 R10 K10 - 0x882C170E, // 0031 GETMBR R11 R11 K14 - 0x88300503, // 0032 GETMBR R12 R2 K3 - 0x902E060C, // 0033 SETMBR R11 K3 R12 - 0x882C150A, // 0034 GETMBR R11 R10 K10 - 0x882C170E, // 0035 GETMBR R11 R11 K14 - 0x88300504, // 0036 GETMBR R12 R2 K4 - 0x902E080C, // 0037 SETMBR R11 K4 R12 - 0x882C150A, // 0038 GETMBR R11 R10 K10 - 0x902E2206, // 0039 SETMBR R11 K17 R6 - 0x8C2C1512, // 003A GETMET R11 R10 K18 - 0x7C2C0200, // 003B CALL R11 1 - 0x8C301713, // 003C GETMET R12 R11 K19 - 0x7C300200, // 003D CALL R12 1 - 0x60340015, // 003E GETGBL R13 G21 - 0x5C381800, // 003F MOVE R14 R12 - 0x7C340200, // 0040 CALL R13 1 - 0x8C381714, // 0041 GETMET R14 R11 K20 - 0x5C401A00, // 0042 MOVE R16 R13 - 0x7C380400, // 0043 CALL R14 2 - 0x5C201C00, // 0044 MOVE R8 R14 - 0x68380001, // 0045 GETUPV R14 U1 - 0x743A000D, // 0046 JMPT R14 #0055 - 0xB83A2A00, // 0047 GETNGBL R14 K21 - 0x8C381D16, // 0048 GETMET R14 R14 K22 - 0x60400018, // 0049 GETGBL R16 G24 - 0x58440017, // 004A LDCONST R17 K23 - 0x68480000, // 004B GETUPV R18 U0 - 0x88482518, // 004C GETMBR R18 R18 K24 - 0x604C0008, // 004D GETGBL R19 G8 - 0x5C500400, // 004E MOVE R20 R2 - 0x7C4C0200, // 004F CALL R19 1 - 0x5C500A00, // 0050 MOVE R20 R5 - 0x5C541200, // 0051 MOVE R21 R9 - 0x7C400A00, // 0052 CALL R16 5 - 0x58440019, // 0053 LDCONST R17 K25 - 0x7C380600, // 0054 CALL R14 3 - 0x70020055, // 0055 JMP #00AC - 0x8824051A, // 0056 GETMBR R9 R2 K26 - 0x4C280000, // 0057 LDNIL R10 - 0x2024120A, // 0058 NE R9 R9 R10 - 0x78260043, // 0059 JMPF R9 #009E - 0x780E0041, // 005A JMPF R3 #009D - 0xB8260000, // 005B GETNGBL R9 K0 - 0x8C241309, // 005C GETMET R9 R9 K9 - 0x7C240200, // 005D CALL R9 1 - 0xB82A0000, // 005E GETNGBL R10 K0 - 0x8C28151C, // 005F GETMET R10 R10 K28 - 0x7C280200, // 0060 CALL R10 1 - 0x9026360A, // 0061 SETMBR R9 K27 R10 - 0x8828131B, // 0062 GETMBR R10 R9 K27 - 0xB82E0000, // 0063 GETNGBL R11 K0 - 0x8C2C170F, // 0064 GETMET R11 R11 K15 - 0x7C2C0200, // 0065 CALL R11 1 - 0x902A1C0B, // 0066 SETMBR R10 K14 R11 - 0x8828131B, // 0067 GETMBR R10 R9 K27 - 0xB82E0000, // 0068 GETNGBL R11 K0 - 0x8C2C171D, // 0069 GETMET R11 R11 K29 - 0x7C2C0200, // 006A CALL R11 1 - 0x902A340B, // 006B SETMBR R10 K26 R11 - 0x8828131B, // 006C GETMBR R10 R9 K27 - 0x8828150E, // 006D GETMBR R10 R10 K14 - 0x882C0510, // 006E GETMBR R11 R2 K16 - 0x902A200B, // 006F SETMBR R10 K16 R11 - 0x8828131B, // 0070 GETMBR R10 R9 K27 - 0x8828150E, // 0071 GETMBR R10 R10 K14 - 0x882C0503, // 0072 GETMBR R11 R2 K3 - 0x902A060B, // 0073 SETMBR R10 K3 R11 - 0x8828131B, // 0074 GETMBR R10 R9 K27 - 0x8828150E, // 0075 GETMBR R10 R10 K14 - 0x882C0504, // 0076 GETMBR R11 R2 K4 - 0x902A080B, // 0077 SETMBR R10 K4 R11 - 0x8828131B, // 0078 GETMBR R10 R9 K27 - 0x8828151A, // 0079 GETMBR R10 R10 K26 - 0x882C051A, // 007A GETMBR R11 R2 K26 - 0x902A340B, // 007B SETMBR R10 K26 R11 - 0x8C281312, // 007C GETMET R10 R9 K18 - 0x7C280200, // 007D CALL R10 1 - 0x8C2C1513, // 007E GETMET R11 R10 K19 - 0x7C2C0200, // 007F CALL R11 1 - 0x60300015, // 0080 GETGBL R12 G21 - 0x5C341600, // 0081 MOVE R13 R11 - 0x7C300200, // 0082 CALL R12 1 - 0x8C341514, // 0083 GETMET R13 R10 K20 - 0x5C3C1800, // 0084 MOVE R15 R12 - 0x7C340400, // 0085 CALL R13 2 - 0x5C201A00, // 0086 MOVE R8 R13 - 0xB8362A00, // 0087 GETNGBL R13 K21 - 0x8C341B16, // 0088 GETMET R13 R13 K22 - 0x603C0018, // 0089 GETGBL R15 G24 - 0x5840001E, // 008A LDCONST R16 K30 - 0x68440000, // 008B GETUPV R17 U0 - 0x88442318, // 008C GETMBR R17 R17 K24 - 0x60480008, // 008D GETGBL R18 G8 - 0x5C4C0400, // 008E MOVE R19 R2 - 0x7C480200, // 008F CALL R18 1 - 0x5C4C0A00, // 0090 MOVE R19 R5 - 0x8850051A, // 0091 GETMBR R20 R2 K26 - 0x8854051A, // 0092 GETMBR R21 R2 K26 - 0xB85A0000, // 0093 GETNGBL R22 K0 - 0x88582D1F, // 0094 GETMBR R22 R22 K31 - 0x1C542A16, // 0095 EQ R21 R21 R22 - 0x78560001, // 0096 JMPF R21 #0099 - 0x5854001F, // 0097 LDCONST R21 K31 - 0x70020000, // 0098 JMP #009A - 0x58540007, // 0099 LDCONST R21 K7 - 0x7C3C0C00, // 009A CALL R15 6 - 0x58400019, // 009B LDCONST R16 K25 - 0x7C340600, // 009C CALL R13 3 - 0x7002000D, // 009D JMP #00AC - 0xB8262A00, // 009E GETNGBL R9 K21 - 0x8C241316, // 009F GETMET R9 R9 K22 - 0x602C0018, // 00A0 GETGBL R11 G24 - 0x58300020, // 00A1 LDCONST R12 K32 - 0x68340000, // 00A2 GETUPV R13 U0 - 0x88341B18, // 00A3 GETMBR R13 R13 K24 - 0x60380008, // 00A4 GETGBL R14 G8 - 0x5C3C0400, // 00A5 MOVE R15 R2 - 0x7C380200, // 00A6 CALL R14 1 - 0x5C3C0A00, // 00A7 MOVE R15 R5 - 0x7C2C0800, // 00A8 CALL R11 4 - 0x58300019, // 00A9 LDCONST R12 K25 - 0x7C240600, // 00AA CALL R9 3 - 0x501C0000, // 00AB LDBOOL R7 0 0 - 0x7822001E, // 00AC JMPF R8 #00CC - 0x6024000C, // 00AD GETGBL R9 G12 - 0x88280121, // 00AE GETMBR R10 R0 K33 - 0x7C240200, // 00AF CALL R9 1 - 0x1C241322, // 00B0 EQ R9 R9 K34 - 0x78260004, // 00B1 JMPF R9 #00B7 - 0x88240121, // 00B2 GETMBR R9 R0 K33 - 0x8C241323, // 00B3 GETMET R9 R9 K35 - 0x5C2C1000, // 00B4 MOVE R11 R8 - 0x7C240400, // 00B5 CALL R9 2 - 0x70020014, // 00B6 JMP #00CC - 0x5425FFFE, // 00B7 LDINT R9 -1 - 0x88280121, // 00B8 GETMBR R10 R0 K33 - 0x94241409, // 00B9 GETIDX R9 R10 R9 - 0x602C000C, // 00BA GETGBL R11 G12 - 0x5C301200, // 00BB MOVE R12 R9 - 0x7C2C0200, // 00BC CALL R11 1 - 0x6030000C, // 00BD GETGBL R12 G12 - 0x5C341000, // 00BE MOVE R13 R8 - 0x7C300200, // 00BF CALL R12 1 - 0x002C160C, // 00C0 ADD R11 R11 R12 - 0xB8320000, // 00C1 GETNGBL R12 K0 - 0x88301924, // 00C2 GETMBR R12 R12 K36 - 0x88301925, // 00C3 GETMBR R12 R12 K37 - 0x182C160C, // 00C4 LE R11 R11 R12 - 0x782E0001, // 00C5 JMPF R11 #00C8 - 0x402C1208, // 00C6 CONNECT R11 R9 R8 - 0x70020003, // 00C7 JMP #00CC - 0x88280121, // 00C8 GETMBR R10 R0 K33 - 0x8C281523, // 00C9 GETMET R10 R10 K35 - 0x5C301000, // 00CA MOVE R12 R8 - 0x7C280400, // 00CB CALL R10 2 - 0x80040E00, // 00CC RET 1 R7 + 0x68280001, // 0013 GETUPV R10 U1 + 0x88281509, // 0014 GETMBR R10 R10 K9 + 0x7C180800, // 0015 CALL R6 4 + 0x70020000, // 0016 JMP #0018 + 0x4C180000, // 0017 LDNIL R6 + 0x501C0200, // 0018 LDBOOL R7 1 0 + 0x4C200000, // 0019 LDNIL R8 + 0x4C240000, // 001A LDNIL R9 + 0x20240C09, // 001B NE R9 R6 R9 + 0x7826001C, // 001C JMPF R9 #003A + 0x8C240D0A, // 001D GETMET R9 R6 K10 + 0x7C240200, // 001E CALL R9 1 + 0x60280015, // 001F GETGBL R10 G21 + 0x542E002F, // 0020 LDINT R11 48 + 0x7C280200, // 0021 CALL R10 1 + 0x5C201400, // 0022 MOVE R8 R10 + 0x68280001, // 0023 GETUPV R10 U1 + 0x8C28150B, // 0024 GETMET R10 R10 K11 + 0x5C301000, // 0025 MOVE R12 R8 + 0x5C340400, // 0026 MOVE R13 R2 + 0x5C380C00, // 0027 MOVE R14 R6 + 0x7C280800, // 0028 CALL R10 4 + 0x68280002, // 0029 GETUPV R10 U2 + 0x742A000D, // 002A JMPT R10 #0039 + 0xB82A1800, // 002B GETNGBL R10 K12 + 0x8C28150D, // 002C GETMET R10 R10 K13 + 0x60300018, // 002D GETGBL R12 G24 + 0x5834000E, // 002E LDCONST R13 K14 + 0x68380000, // 002F GETUPV R14 U0 + 0x88381D0F, // 0030 GETMBR R14 R14 K15 + 0x603C0008, // 0031 GETGBL R15 G8 + 0x5C400400, // 0032 MOVE R16 R2 + 0x7C3C0200, // 0033 CALL R15 1 + 0x5C400A00, // 0034 MOVE R16 R5 + 0x5C441200, // 0035 MOVE R17 R9 + 0x7C300A00, // 0036 CALL R12 5 + 0x58340010, // 0037 LDCONST R13 K16 + 0x7C280600, // 0038 CALL R10 3 + 0x70020038, // 0039 JMP #0073 + 0x88240511, // 003A GETMBR R9 R2 K17 + 0x4C280000, // 003B LDNIL R10 + 0x2024120A, // 003C NE R9 R9 R10 + 0x78260026, // 003D JMPF R9 #0065 + 0x780E0024, // 003E JMPF R3 #0064 + 0x60240015, // 003F GETGBL R9 G21 + 0x542A002F, // 0040 LDINT R10 48 + 0x7C240200, // 0041 CALL R9 1 + 0x5C201200, // 0042 MOVE R8 R9 + 0x68240001, // 0043 GETUPV R9 U1 + 0x8C241312, // 0044 GETMET R9 R9 K18 + 0x5C2C1000, // 0045 MOVE R11 R8 + 0x5C300400, // 0046 MOVE R12 R2 + 0x88340511, // 0047 GETMBR R13 R2 K17 + 0x7C240800, // 0048 CALL R9 4 + 0xB8261800, // 0049 GETNGBL R9 K12 + 0x8C241313, // 004A GETMET R9 R9 K19 + 0x582C0010, // 004B LDCONST R11 K16 + 0x7C240400, // 004C CALL R9 2 + 0x78260015, // 004D JMPF R9 #0064 + 0xB8261800, // 004E GETNGBL R9 K12 + 0x8C24130D, // 004F GETMET R9 R9 K13 + 0x602C0018, // 0050 GETGBL R11 G24 + 0x58300014, // 0051 LDCONST R12 K20 + 0x68340000, // 0052 GETUPV R13 U0 + 0x88341B0F, // 0053 GETMBR R13 R13 K15 + 0x60380008, // 0054 GETGBL R14 G8 + 0x5C3C0400, // 0055 MOVE R15 R2 + 0x7C380200, // 0056 CALL R14 1 + 0x5C3C0A00, // 0057 MOVE R15 R5 + 0x88400511, // 0058 GETMBR R16 R2 K17 + 0x88440511, // 0059 GETMBR R17 R2 K17 + 0xB84A0000, // 005A GETNGBL R18 K0 + 0x88482515, // 005B GETMBR R18 R18 K21 + 0x1C442212, // 005C EQ R17 R17 R18 + 0x78460001, // 005D JMPF R17 #0060 + 0x58440015, // 005E LDCONST R17 K21 + 0x70020000, // 005F JMP #0061 + 0x58440007, // 0060 LDCONST R17 K7 + 0x7C2C0C00, // 0061 CALL R11 6 + 0x58300010, // 0062 LDCONST R12 K16 + 0x7C240600, // 0063 CALL R9 3 + 0x7002000D, // 0064 JMP #0073 + 0xB8261800, // 0065 GETNGBL R9 K12 + 0x8C24130D, // 0066 GETMET R9 R9 K13 + 0x602C0018, // 0067 GETGBL R11 G24 + 0x58300016, // 0068 LDCONST R12 K22 + 0x68340000, // 0069 GETUPV R13 U0 + 0x88341B0F, // 006A GETMBR R13 R13 K15 + 0x60380008, // 006B GETGBL R14 G8 + 0x5C3C0400, // 006C MOVE R15 R2 + 0x7C380200, // 006D CALL R14 1 + 0x5C3C0A00, // 006E MOVE R15 R5 + 0x7C2C0800, // 006F CALL R11 4 + 0x58300010, // 0070 LDCONST R12 K16 + 0x7C240600, // 0071 CALL R9 3 + 0x501C0000, // 0072 LDBOOL R7 0 0 + 0x7822001E, // 0073 JMPF R8 #0093 + 0x6024000C, // 0074 GETGBL R9 G12 + 0x88280117, // 0075 GETMBR R10 R0 K23 + 0x7C240200, // 0076 CALL R9 1 + 0x1C241318, // 0077 EQ R9 R9 K24 + 0x78260004, // 0078 JMPF R9 #007E + 0x88240117, // 0079 GETMBR R9 R0 K23 + 0x8C241319, // 007A GETMET R9 R9 K25 + 0x5C2C1000, // 007B MOVE R11 R8 + 0x7C240400, // 007C CALL R9 2 + 0x70020014, // 007D JMP #0093 + 0x5425FFFE, // 007E LDINT R9 -1 + 0x88280117, // 007F GETMBR R10 R0 K23 + 0x94241409, // 0080 GETIDX R9 R10 R9 + 0x602C000C, // 0081 GETGBL R11 G12 + 0x5C301200, // 0082 MOVE R12 R9 + 0x7C2C0200, // 0083 CALL R11 1 + 0x6030000C, // 0084 GETGBL R12 G12 + 0x5C341000, // 0085 MOVE R13 R8 + 0x7C300200, // 0086 CALL R12 1 + 0x002C160C, // 0087 ADD R11 R11 R12 + 0xB8320000, // 0088 GETNGBL R12 K0 + 0x8830191A, // 0089 GETMBR R12 R12 K26 + 0x8830191B, // 008A GETMBR R12 R12 K27 + 0x182C160C, // 008B LE R11 R11 R12 + 0x782E0001, // 008C JMPF R11 #008F + 0x402C1208, // 008D CONNECT R11 R9 R8 + 0x70020003, // 008E JMP #0093 + 0x88280117, // 008F GETMBR R10 R0 K23 + 0x8C281519, // 0090 GETMET R10 R10 K25 + 0x5C301000, // 0091 MOVE R12 R8 + 0x7C280400, // 0092 CALL R10 2 + 0x80040E00, // 0093 RET 1 R7 }) ), be_nested_proto( @@ -1787,6 +2572,193 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: report_data +********************************************************************/ +be_local_closure(Matter_IM_report_data, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(ReportDataMessage), + /* K2 */ be_nested_str_weak(from_TLV), + }), + be_str_weak(report_data), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x50100000, // 0006 LDBOOL R4 0 0 + 0x80040800, // 0007 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attributestatus2raw +********************************************************************/ +be_local_closure(Matter_IM_attributestatus2raw, /* name */ + be_nested_proto( + 9, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(add), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(path2raw), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(status), + /* K5 */ be_const_int(2), + }), + be_str_weak(attributestatus2raw), + &be_const_str_solidified, + ( &(const binstruction[47]) { /* code */ + 0x8C100300, // 0000 GETMET R4 R1 K0 + 0x541A0014, // 0001 LDINT R6 21 + 0x581C0001, // 0002 LDCONST R7 K1 + 0x7C100600, // 0003 CALL R4 3 + 0x8C100300, // 0004 GETMET R4 R1 K0 + 0x541A34FF, // 0005 LDINT R6 13568 + 0x541DFFFD, // 0006 LDINT R7 -2 + 0x7C100600, // 0007 CALL R4 3 + 0x8C100102, // 0008 GETMET R4 R0 K2 + 0x5C180200, // 0009 MOVE R6 R1 + 0x5C1C0400, // 000A MOVE R7 R2 + 0x58200003, // 000B LDCONST R8 K3 + 0x7C100800, // 000C CALL R4 4 + 0x8C100300, // 000D GETMET R4 R1 K0 + 0x541A3500, // 000E LDINT R6 13569 + 0x541DFFFD, // 000F LDINT R7 -2 + 0x7C100600, // 0010 CALL R4 3 + 0x88100504, // 0011 GETMBR R4 R2 K4 + 0x541600FE, // 0012 LDINT R5 255 + 0x18100805, // 0013 LE R4 R4 R5 + 0x78120008, // 0014 JMPF R4 #001E + 0x8C100300, // 0015 GETMET R4 R1 K0 + 0x541A23FF, // 0016 LDINT R6 9216 + 0x541DFFFD, // 0017 LDINT R7 -2 + 0x7C100600, // 0018 CALL R4 3 + 0x8C100300, // 0019 GETMET R4 R1 K0 + 0x88180504, // 001A GETMBR R6 R2 K4 + 0x581C0001, // 001B LDCONST R7 K1 + 0x7C100600, // 001C CALL R4 3 + 0x70020007, // 001D JMP #0026 + 0x8C100300, // 001E GETMET R4 R1 K0 + 0x541A24FF, // 001F LDINT R6 9472 + 0x541DFFFD, // 0020 LDINT R7 -2 + 0x7C100600, // 0021 CALL R4 3 + 0x8C100300, // 0022 GETMET R4 R1 K0 + 0x88180504, // 0023 GETMBR R6 R2 K4 + 0x581C0005, // 0024 LDCONST R7 K5 + 0x7C100600, // 0025 CALL R4 3 + 0x8C100300, // 0026 GETMET R4 R1 K0 + 0x541A1817, // 0027 LDINT R6 6168 + 0x541DFFFD, // 0028 LDINT R7 -2 + 0x7C100600, // 0029 CALL R4 3 + 0x8C100300, // 002A GETMET R4 R1 K0 + 0x541A0017, // 002B LDINT R6 24 + 0x581C0001, // 002C LDCONST R7 K1 + 0x7C100600, // 002D CALL R4 3 + 0x80000000, // 002E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_subscribe_response +********************************************************************/ +be_local_closure(Matter_IM_send_subscribe_response, /* name */ + be_nested_proto( + 11, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(send_queue), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(IM_SubscribeResponse), + }), + be_str_weak(send_subscribe_response), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0xB81A0400, // 0002 GETNGBL R6 K2 + 0x8C180D03, // 0003 GETMET R6 R6 K3 + 0x5C200200, // 0004 MOVE R8 R1 + 0x5C240400, // 0005 MOVE R9 R2 + 0x5C280600, // 0006 MOVE R10 R3 + 0x7C180800, // 0007 CALL R6 4 + 0x7C100400, // 0008 CALL R4 2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_report_data +********************************************************************/ +be_local_closure(Matter_IM_send_report_data, /* name */ + be_nested_proto( + 9, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(send_queue), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(IM_ReportData), + }), + be_str_weak(send_report_data), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0xB8160400, // 0002 GETNGBL R5 K2 + 0x8C140B03, // 0003 GETMET R5 R5 K3 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x5C200400, // 0005 MOVE R8 R2 + 0x7C140600, // 0006 CALL R5 3 + 0x7C0C0400, // 0007 CALL R3 2 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: find_sendqueue_by_exchangeid ********************************************************************/ @@ -1838,48 +2810,11 @@ be_local_closure(Matter_IM_find_sendqueue_by_exchangeid, /* name */ /******************************************************************** -** Solidified function: process_incoming_ack +** Solidified function: process_read_request_solo ********************************************************************/ -be_local_closure(Matter_IM_process_incoming_ack, /* name */ +be_local_closure(Matter_IM_process_read_request_solo, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(find_sendqueue_by_exchangeid), - /* K1 */ be_nested_str_weak(exchange_id), - /* K2 */ be_nested_str_weak(ack_received), - }), - be_str_weak(process_incoming_ack), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x88100301, // 0001 GETMBR R4 R1 K1 - 0x7C080400, // 0002 CALL R2 2 - 0x780A0003, // 0003 JMPF R2 #0008 - 0x8C0C0502, // 0004 GETMET R3 R2 K2 - 0x5C140200, // 0005 MOVE R5 R1 - 0x7C0C0400, // 0006 CALL R3 2 - 0x80040600, // 0007 RET 1 R3 - 0x500C0000, // 0008 LDBOOL R3 0 0 - 0x80040600, // 0009 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_read_request -********************************************************************/ -be_local_closure(Matter_IM_process_read_request, /* name */ - be_nested_proto( - 9, /* nstack */ + 20, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1887,319 +2822,275 @@ be_local_closure(Matter_IM_process_read_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(profiler), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(read_request_start), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(ReadRequestMessage), - /* K6 */ be_nested_str_weak(from_TLV), - /* K7 */ be_nested_str_weak(attributes_requests), - /* K8 */ be_nested_str_weak(_inner_process_read_request), - /* K9 */ be_nested_str_weak(session), - /* K10 */ be_nested_str_weak(send_report_data), - }), - be_str_weak(process_read_request), - &be_const_str_solidified, - ( &(const binstruction[25]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x58140003, // 0003 LDCONST R5 K3 - 0x7C0C0400, // 0004 CALL R3 2 - 0xB80E0800, // 0005 GETNGBL R3 K4 - 0x8C0C0705, // 0006 GETMET R3 R3 K5 - 0x7C0C0200, // 0007 CALL R3 1 - 0x8C0C0706, // 0008 GETMET R3 R3 K6 - 0x5C140400, // 0009 MOVE R5 R2 - 0x7C0C0400, // 000A CALL R3 2 - 0x88100707, // 000B GETMBR R4 R3 K7 - 0x4C140000, // 000C LDNIL R5 - 0x20100805, // 000D NE R4 R4 R5 - 0x78120007, // 000E JMPF R4 #0017 - 0x8C100108, // 000F GETMET R4 R0 K8 - 0x88180309, // 0010 GETMBR R6 R1 K9 - 0x5C1C0600, // 0011 MOVE R7 R3 - 0x7C100600, // 0012 CALL R4 3 - 0x8C14010A, // 0013 GETMET R5 R0 K10 - 0x5C1C0200, // 0014 MOVE R7 R1 - 0x5C200800, // 0015 MOVE R8 R4 - 0x7C140600, // 0016 CALL R5 3 - 0x50100200, // 0017 LDBOOL R4 1 0 - 0x80040800, // 0018 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_report_data -********************************************************************/ -be_local_closure(Matter_IM_send_report_data, /* name */ - be_nested_proto( - 9, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(send_queue), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(IM_ReportData), - }), - be_str_weak(send_report_data), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0xB8160400, // 0002 GETNGBL R5 K2 - 0x8C140B03, // 0003 GETMET R5 R5 K3 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x5C200400, // 0005 MOVE R8 R2 - 0x7C140600, // 0006 CALL R5 3 - 0x7C0C0400, // 0007 CALL R3 2 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_status_response -********************************************************************/ -be_local_closure(Matter_IM_process_status_response, /* name */ - be_nested_proto( - 11, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(findsubval), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(find_sendqueue_by_exchangeid), - /* K3 */ be_nested_str_weak(exchange_id), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(SUCCESS), - /* K6 */ be_nested_str_weak(status_ok_received), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20_X3EOK_X20_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i_X20not_X20found), - /* K10 */ be_nested_str_weak(session), - /* K11 */ be_nested_str_weak(local_session_id), - /* K12 */ be_nested_str_weak(MTR_X3A_X20_X3EStatus_X20_X20_X20_X20ERROR_X20_X3D_X200x_X2502X), - /* K13 */ be_const_int(3), - /* K14 */ be_nested_str_weak(status_error_received), - /* K15 */ be_nested_str_weak(remove_sendqueue_by_exchangeid), - }), - be_str_weak(process_status_response), - &be_const_str_solidified, - ( &(const binstruction[45]) { /* code */ - 0x8C0C0500, // 0000 GETMET R3 R2 K0 - 0x58140001, // 0001 LDCONST R5 K1 - 0x541A00FE, // 0002 LDINT R6 255 - 0x7C0C0600, // 0003 CALL R3 3 - 0x8C100102, // 0004 GETMET R4 R0 K2 - 0x88180303, // 0005 GETMBR R6 R1 K3 - 0x7C100400, // 0006 CALL R4 2 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x88140B05, // 0008 GETMBR R5 R5 K5 - 0x1C140605, // 0009 EQ R5 R3 R5 - 0x78160010, // 000A JMPF R5 #001C - 0x78120004, // 000B JMPF R4 #0011 - 0x8C140906, // 000C GETMET R5 R4 K6 - 0x5C1C0200, // 000D MOVE R7 R1 - 0x7C140400, // 000E CALL R5 2 - 0x80040A00, // 000F RET 1 R5 - 0x70020009, // 0010 JMP #001B - 0xB8160E00, // 0011 GETNGBL R5 K7 - 0x8C140B08, // 0012 GETMET R5 R5 K8 - 0x601C0018, // 0013 GETGBL R7 G24 - 0x58200009, // 0014 LDCONST R8 K9 - 0x8824030A, // 0015 GETMBR R9 R1 K10 - 0x8824130B, // 0016 GETMBR R9 R9 K11 - 0x88280303, // 0017 GETMBR R10 R1 K3 - 0x7C1C0600, // 0018 CALL R7 3 - 0x54220003, // 0019 LDINT R8 4 - 0x7C140600, // 001A CALL R5 3 - 0x7002000E, // 001B JMP #002B - 0xB8160E00, // 001C GETNGBL R5 K7 - 0x8C140B08, // 001D GETMET R5 R5 K8 - 0x601C0018, // 001E GETGBL R7 G24 - 0x5820000C, // 001F LDCONST R8 K12 - 0x5C240600, // 0020 MOVE R9 R3 - 0x7C1C0400, // 0021 CALL R7 2 - 0x5820000D, // 0022 LDCONST R8 K13 - 0x7C140600, // 0023 CALL R5 3 - 0x78120005, // 0024 JMPF R4 #002B - 0x8C14090E, // 0025 GETMET R5 R4 K14 - 0x5C1C0200, // 0026 MOVE R7 R1 - 0x7C140400, // 0027 CALL R5 2 - 0x8C14010F, // 0028 GETMET R5 R0 K15 - 0x881C0303, // 0029 GETMBR R7 R1 K3 - 0x7C140400, // 002A CALL R5 2 - 0x50140000, // 002B LDBOOL R5 0 0 - 0x80040A00, // 002C RET 1 R5 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_write_response -********************************************************************/ -be_local_closure(Matter_IM_process_write_response, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(WriteResponseMessage), - /* K2 */ be_nested_str_weak(from_TLV), - }), - be_str_weak(process_write_response), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x50100000, // 0006 LDBOOL R4 0 0 - 0x80040800, // 0007 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_subscribe_update -********************************************************************/ -be_local_closure(Matter_IM_send_subscribe_update, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ - /* K0 */ be_nested_str_weak(session), + ( &(const bvalue[44]) { /* constants */ + /* K0 */ be_nested_str_weak(status), /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(ReadRequestMessage), - /* K3 */ be_nested_str_weak(fabric_filtered), - /* K4 */ be_nested_str_weak(attributes_requests), - /* K5 */ be_nested_str_weak(updates), - /* K6 */ be_nested_str_weak(AttributePathIB), - /* K7 */ be_nested_str_weak(endpoint), - /* K8 */ be_nested_str_weak(cluster), - /* K9 */ be_nested_str_weak(attribute), - /* K10 */ be_nested_str_weak(push), - /* K11 */ be_nested_str_weak(stop_iteration), - /* K12 */ be_nested_str_weak(tasmota), - /* K13 */ be_nested_str_weak(log), - /* K14 */ be_nested_str_weak(MTR_X3A_X20_X3CSub_Data_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), - /* K15 */ be_nested_str_weak(local_session_id), - /* K16 */ be_nested_str_weak(subscription_id), - /* K17 */ be_const_int(3), - /* K18 */ be_nested_str_weak(is_keep_alive), - /* K19 */ be_nested_str_weak(_inner_process_read_request), - /* K20 */ be_nested_str_weak(suppress_response), - /* K21 */ be_nested_str_weak(IM_ReportDataSubscribed), - /* K22 */ be_nested_str_weak(_message_handler), - /* K23 */ be_nested_str_weak(send_queue), - /* K24 */ be_nested_str_weak(send_enqueued), + /* K2 */ be_nested_str_weak(INVALID_ACTION), + /* K3 */ be_nested_str_weak(device), + /* K4 */ be_nested_str_weak(process_attribute_read_solo), + /* K5 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K6 */ be_nested_str_weak(read_attribute), + /* K7 */ be_nested_str_weak(session), + /* K8 */ be_nested_str_weak(tlv_solo), + /* K9 */ be_nested_str_weak(profiler), + /* K10 */ be_nested_str_weak(log), + /* K11 */ be_nested_str_weak(read_request_solo_X20read_X20done), + /* K12 */ be_nested_str_weak(add), + /* K13 */ be_const_int(1), + /* K14 */ be_nested_str_weak(attributedata2raw), + /* K15 */ be_const_int(405077761), + /* K16 */ be_nested_str_weak(attributestatus2raw), + /* K17 */ be_nested_str_weak(tasmota), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s_X20_X2D_X20IGNORED), + /* K19 */ be_nested_str_weak(local_session_id), + /* K20 */ be_const_int(3), + /* K21 */ be_nested_str_weak(build_response), + /* K22 */ be_nested_str_weak(message_handler), + /* K23 */ be_nested_str_weak(raw), + /* K24 */ be_nested_str_weak(clear), + /* K25 */ be_nested_str_weak(encode_frame), + /* K26 */ be_nested_str_weak(encrypt), + /* K27 */ be_nested_str_weak(loglevel), + /* K28 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), + /* K29 */ be_nested_str_weak(message_counter), + /* K30 */ be_nested_str_weak(exchange_id), + /* K31 */ be_nested_str_weak(ack_message_counter), + /* K32 */ be_nested_str_weak(send_response_frame), + /* K33 */ be_nested_str_weak(RESPONSE_X20SENT), + /* K34 */ be_nested_str_weak(get_attribute_name), + /* K35 */ be_nested_str_weak(cluster), + /* K36 */ be_nested_str_weak(attribute), + /* K37 */ be_nested_str_weak(_X20_X28), + /* K38 */ be_nested_str_weak(_X29), + /* K39 */ be_nested_str_weak(), + /* K40 */ be_nested_str_weak(to_str_val), + /* K41 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr1_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20_X25s), + /* K42 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr1_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20STATUS_X3A_X200x_X2502X_X20_X25s), + /* K43 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr1_X28_X256i_X29_X20_X25s_X25s_X20_X2D_X20IGNORED), }), - be_str_weak(send_subscribe_update), + be_str_weak(process_read_request_solo), &be_const_str_solidified, - ( &(const binstruction[66]) { /* code */ - 0x88080300, // 0000 GETMBR R2 R1 K0 - 0xB80E0200, // 0001 GETNGBL R3 K1 - 0x8C0C0702, // 0002 GETMET R3 R3 K2 - 0x7C0C0200, // 0003 CALL R3 1 - 0x50100000, // 0004 LDBOOL R4 0 0 - 0x900E0604, // 0005 SETMBR R3 K3 R4 - 0x60100012, // 0006 GETGBL R4 G18 - 0x7C100000, // 0007 CALL R4 0 - 0x900E0804, // 0008 SETMBR R3 K4 R4 - 0x60100010, // 0009 GETGBL R4 G16 - 0x88140305, // 000A GETMBR R5 R1 K5 - 0x7C100200, // 000B CALL R4 1 - 0xA802000F, // 000C EXBLK 0 #001D - 0x5C140800, // 000D MOVE R5 R4 - 0x7C140000, // 000E CALL R5 0 - 0xB81A0200, // 000F GETNGBL R6 K1 - 0x8C180D06, // 0010 GETMET R6 R6 K6 - 0x7C180200, // 0011 CALL R6 1 - 0x881C0B07, // 0012 GETMBR R7 R5 K7 - 0x901A0E07, // 0013 SETMBR R6 K7 R7 - 0x881C0B08, // 0014 GETMBR R7 R5 K8 - 0x901A1007, // 0015 SETMBR R6 K8 R7 - 0x881C0B09, // 0016 GETMBR R7 R5 K9 - 0x901A1207, // 0017 SETMBR R6 K9 R7 - 0x881C0704, // 0018 GETMBR R7 R3 K4 - 0x8C1C0F0A, // 0019 GETMET R7 R7 K10 - 0x5C240C00, // 001A MOVE R9 R6 - 0x7C1C0400, // 001B CALL R7 2 - 0x7001FFEF, // 001C JMP #000D - 0x5810000B, // 001D LDCONST R4 K11 - 0xAC100200, // 001E CATCH R4 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0xB8121800, // 0020 GETNGBL R4 K12 - 0x8C10090D, // 0021 GETMET R4 R4 K13 - 0x60180018, // 0022 GETGBL R6 G24 - 0x581C000E, // 0023 LDCONST R7 K14 - 0x8820050F, // 0024 GETMBR R8 R2 K15 - 0x88240310, // 0025 GETMBR R9 R1 K16 - 0x7C180600, // 0026 CALL R6 3 - 0x581C0011, // 0027 LDCONST R7 K17 - 0x7C100600, // 0028 CALL R4 3 - 0x50100000, // 0029 LDBOOL R4 0 0 - 0x90062404, // 002A SETMBR R1 K18 R4 - 0x8C100113, // 002B GETMET R4 R0 K19 - 0x5C180400, // 002C MOVE R6 R2 - 0x5C1C0600, // 002D MOVE R7 R3 - 0x7C100600, // 002E CALL R4 3 - 0x50140000, // 002F LDBOOL R5 0 0 - 0x90122805, // 0030 SETMBR R4 K20 R5 - 0x88140310, // 0031 GETMBR R5 R1 K16 - 0x90122005, // 0032 SETMBR R4 K16 R5 - 0xB8160200, // 0033 GETNGBL R5 K1 - 0x8C140B15, // 0034 GETMET R5 R5 K21 - 0x881C0516, // 0035 GETMBR R7 R2 K22 - 0x5C200400, // 0036 MOVE R8 R2 - 0x5C240800, // 0037 MOVE R9 R4 - 0x5C280200, // 0038 MOVE R10 R1 - 0x7C140A00, // 0039 CALL R5 5 - 0x88180117, // 003A GETMBR R6 R0 K23 - 0x8C180D0A, // 003B GETMET R6 R6 K10 - 0x5C200A00, // 003C MOVE R8 R5 - 0x7C180400, // 003D CALL R6 2 - 0x8C180118, // 003E GETMET R6 R0 K24 - 0x88200516, // 003F GETMBR R8 R2 K22 - 0x7C180400, // 0040 CALL R6 2 - 0x80000000, // 0041 RET 0 + ( &(const binstruction[220]) { /* code */ + 0xB80E0200, // 0000 GETNGBL R3 K1 + 0x880C0702, // 0001 GETMBR R3 R3 K2 + 0x900A0003, // 0002 SETMBR R2 K0 R3 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x8C0C0704, // 0004 GETMET R3 R3 K4 + 0x5C140400, // 0005 MOVE R5 R2 + 0x7C0C0400, // 0006 CALL R3 2 + 0x4C100000, // 0007 LDNIL R4 + 0x4C140000, // 0008 LDNIL R5 + 0x4C180000, // 0009 LDNIL R6 + 0x20180606, // 000A NE R6 R3 R6 + 0x781A0008, // 000B JMPF R6 #0015 + 0xB81A0200, // 000C GETNGBL R6 K1 + 0x88180D05, // 000D GETMBR R6 R6 K5 + 0x900A0006, // 000E SETMBR R2 K0 R6 + 0x8C180706, // 000F GETMET R6 R3 K6 + 0x88200307, // 0010 GETMBR R8 R1 K7 + 0x5C240400, // 0011 MOVE R9 R2 + 0x88280108, // 0012 GETMBR R10 R0 K8 + 0x7C180800, // 0013 CALL R6 4 + 0x5C100C00, // 0014 MOVE R4 R6 + 0xB81A0200, // 0015 GETNGBL R6 K1 + 0x88180D09, // 0016 GETMBR R6 R6 K9 + 0x8C180D0A, // 0017 GETMET R6 R6 K10 + 0x5820000B, // 0018 LDCONST R8 K11 + 0x7C180400, // 0019 CALL R6 2 + 0x4C180000, // 001A LDNIL R6 + 0x20180806, // 001B NE R6 R4 R6 + 0x781A0019, // 001C JMPF R6 #0037 + 0x60180015, // 001D GETGBL R6 G21 + 0x541E002F, // 001E LDINT R7 48 + 0x7C180200, // 001F CALL R6 1 + 0x5C140C00, // 0020 MOVE R5 R6 + 0x8C180B0C, // 0021 GETMET R6 R5 K12 + 0x54220014, // 0022 LDINT R8 21 + 0x5824000D, // 0023 LDCONST R9 K13 + 0x7C180600, // 0024 CALL R6 3 + 0x8C180B0C, // 0025 GETMET R6 R5 K12 + 0x54223600, // 0026 LDINT R8 13825 + 0x5425FFFD, // 0027 LDINT R9 -2 + 0x7C180600, // 0028 CALL R6 3 + 0x8C18010E, // 0029 GETMET R6 R0 K14 + 0x5C200A00, // 002A MOVE R8 R5 + 0x5C240400, // 002B MOVE R9 R2 + 0x5C280800, // 002C MOVE R10 R4 + 0x7C180800, // 002D CALL R6 4 + 0x8C180B0C, // 002E GETMET R6 R5 K12 + 0x5820000F, // 002F LDCONST R8 K15 + 0x5425FFFB, // 0030 LDINT R9 -4 + 0x7C180600, // 0031 CALL R6 3 + 0x8C180B0C, // 0032 GETMET R6 R5 K12 + 0x54220017, // 0033 LDINT R8 24 + 0x5824000D, // 0034 LDCONST R9 K13 + 0x7C180600, // 0035 CALL R6 3 + 0x70020029, // 0036 JMP #0061 + 0x88180500, // 0037 GETMBR R6 R2 K0 + 0x4C1C0000, // 0038 LDNIL R7 + 0x20180C07, // 0039 NE R6 R6 R7 + 0x781A0019, // 003A JMPF R6 #0055 + 0x60180015, // 003B GETGBL R6 G21 + 0x541E002F, // 003C LDINT R7 48 + 0x7C180200, // 003D CALL R6 1 + 0x5C140C00, // 003E MOVE R5 R6 + 0x8C180B0C, // 003F GETMET R6 R5 K12 + 0x54220014, // 0040 LDINT R8 21 + 0x5824000D, // 0041 LDCONST R9 K13 + 0x7C180600, // 0042 CALL R6 3 + 0x8C180B0C, // 0043 GETMET R6 R5 K12 + 0x54223600, // 0044 LDINT R8 13825 + 0x5425FFFD, // 0045 LDINT R9 -2 + 0x7C180600, // 0046 CALL R6 3 + 0x8C180110, // 0047 GETMET R6 R0 K16 + 0x5C200A00, // 0048 MOVE R8 R5 + 0x5C240400, // 0049 MOVE R9 R2 + 0x88280500, // 004A GETMBR R10 R2 K0 + 0x7C180800, // 004B CALL R6 4 + 0x8C180B0C, // 004C GETMET R6 R5 K12 + 0x5820000F, // 004D LDCONST R8 K15 + 0x5425FFFB, // 004E LDINT R9 -4 + 0x7C180600, // 004F CALL R6 3 + 0x8C180B0C, // 0050 GETMET R6 R5 K12 + 0x54220017, // 0051 LDINT R8 24 + 0x5824000D, // 0052 LDCONST R9 K13 + 0x7C180600, // 0053 CALL R6 3 + 0x7002000B, // 0054 JMP #0061 + 0xB81A2200, // 0055 GETNGBL R6 K17 + 0x8C180D0A, // 0056 GETMET R6 R6 K10 + 0x60200018, // 0057 GETGBL R8 G24 + 0x58240012, // 0058 LDCONST R9 K18 + 0x88280307, // 0059 GETMBR R10 R1 K7 + 0x88281513, // 005A GETMBR R10 R10 K19 + 0x5C2C0400, // 005B MOVE R11 R2 + 0x7C200600, // 005C CALL R8 3 + 0x58240014, // 005D LDCONST R9 K20 + 0x7C180600, // 005E CALL R6 3 + 0x50180000, // 005F LDBOOL R6 0 0 + 0x80040C00, // 0060 RET 1 R6 + 0x8C180315, // 0061 GETMET R6 R1 K21 + 0x54220004, // 0062 LDINT R8 5 + 0x50240200, // 0063 LDBOOL R9 1 0 + 0x7C180600, // 0064 CALL R6 3 + 0x881C0103, // 0065 GETMBR R7 R0 K3 + 0x881C0F16, // 0066 GETMBR R7 R7 K22 + 0x88200317, // 0067 GETMBR R8 R1 K23 + 0x8C241118, // 0068 GETMET R9 R8 K24 + 0x7C240200, // 0069 CALL R9 1 + 0x8C240D19, // 006A GETMET R9 R6 K25 + 0x5C2C0A00, // 006B MOVE R11 R5 + 0x5C301000, // 006C MOVE R12 R8 + 0x7C240600, // 006D CALL R9 3 + 0x8C240D1A, // 006E GETMET R9 R6 K26 + 0x7C240200, // 006F CALL R9 1 + 0xB8262200, // 0070 GETNGBL R9 K17 + 0x8C24131B, // 0071 GETMET R9 R9 K27 + 0x542E0003, // 0072 LDINT R11 4 + 0x7C240400, // 0073 CALL R9 2 + 0x7826000B, // 0074 JMPF R9 #0081 + 0xB8262200, // 0075 GETNGBL R9 K17 + 0x8C24130A, // 0076 GETMET R9 R9 K10 + 0x602C0018, // 0077 GETGBL R11 G24 + 0x5830001C, // 0078 LDCONST R12 K28 + 0x88340D07, // 0079 GETMBR R13 R6 K7 + 0x88341B13, // 007A GETMBR R13 R13 K19 + 0x88380D1D, // 007B GETMBR R14 R6 K29 + 0x883C0D1E, // 007C GETMBR R15 R6 K30 + 0x88400D1F, // 007D GETMBR R16 R6 K31 + 0x7C2C0A00, // 007E CALL R11 5 + 0x54320003, // 007F LDINT R12 4 + 0x7C240600, // 0080 CALL R9 3 + 0x8C240F20, // 0081 GETMET R9 R7 K32 + 0x5C2C0C00, // 0082 MOVE R11 R6 + 0x7C240400, // 0083 CALL R9 2 + 0xB8260200, // 0084 GETNGBL R9 K1 + 0x88241309, // 0085 GETMBR R9 R9 K9 + 0x8C24130A, // 0086 GETMET R9 R9 K10 + 0x582C0021, // 0087 LDCONST R11 K33 + 0x7C240400, // 0088 CALL R9 2 + 0xB8260200, // 0089 GETNGBL R9 K1 + 0x8C241322, // 008A GETMET R9 R9 K34 + 0x882C0523, // 008B GETMBR R11 R2 K35 + 0x88300524, // 008C GETMBR R12 R2 K36 + 0x7C240600, // 008D CALL R9 3 + 0x78260002, // 008E JMPF R9 #0092 + 0x002A4A09, // 008F ADD R10 K37 R9 + 0x00281526, // 0090 ADD R10 R10 K38 + 0x70020000, // 0091 JMP #0093 + 0x58280027, // 0092 LDCONST R10 K39 + 0x5C241400, // 0093 MOVE R9 R10 + 0x4C280000, // 0094 LDNIL R10 + 0x2028080A, // 0095 NE R10 R4 R10 + 0x782A0013, // 0096 JMPF R10 #00AB + 0x8C280928, // 0097 GETMET R10 R4 K40 + 0x7C280200, // 0098 CALL R10 1 + 0xB82E2200, // 0099 GETNGBL R11 K17 + 0x8C2C171B, // 009A GETMET R11 R11 K27 + 0x58340014, // 009B LDCONST R13 K20 + 0x7C2C0400, // 009C CALL R11 2 + 0x782E000B, // 009D JMPF R11 #00AA + 0xB82E2200, // 009E GETNGBL R11 K17 + 0x8C2C170A, // 009F GETMET R11 R11 K10 + 0x60340018, // 00A0 GETGBL R13 G24 + 0x58380029, // 00A1 LDCONST R14 K41 + 0x883C0307, // 00A2 GETMBR R15 R1 K7 + 0x883C1F13, // 00A3 GETMBR R15 R15 K19 + 0x5C400400, // 00A4 MOVE R16 R2 + 0x5C441200, // 00A5 MOVE R17 R9 + 0x5C481400, // 00A6 MOVE R18 R10 + 0x7C340A00, // 00A7 CALL R13 5 + 0x58380014, // 00A8 LDCONST R14 K20 + 0x7C2C0600, // 00A9 CALL R11 3 + 0x7002002E, // 00AA JMP #00DA + 0x88280500, // 00AB GETMBR R10 R2 K0 + 0x4C2C0000, // 00AC LDNIL R11 + 0x2028140B, // 00AD NE R10 R10 R11 + 0x782A001A, // 00AE JMPF R10 #00CA + 0x88280500, // 00AF GETMBR R10 R2 K0 + 0xB82E0200, // 00B0 GETNGBL R11 K1 + 0x882C1705, // 00B1 GETMBR R11 R11 K5 + 0x1C28140B, // 00B2 EQ R10 R10 R11 + 0x782A0001, // 00B3 JMPF R10 #00B6 + 0x58280005, // 00B4 LDCONST R10 K5 + 0x70020000, // 00B5 JMP #00B7 + 0x58280027, // 00B6 LDCONST R10 K39 + 0xB82E2200, // 00B7 GETNGBL R11 K17 + 0x8C2C171B, // 00B8 GETMET R11 R11 K27 + 0x58340014, // 00B9 LDCONST R13 K20 + 0x7C2C0400, // 00BA CALL R11 2 + 0x782E000C, // 00BB JMPF R11 #00C9 + 0xB82E2200, // 00BC GETNGBL R11 K17 + 0x8C2C170A, // 00BD GETMET R11 R11 K10 + 0x60340018, // 00BE GETGBL R13 G24 + 0x5838002A, // 00BF LDCONST R14 K42 + 0x883C0307, // 00C0 GETMBR R15 R1 K7 + 0x883C1F13, // 00C1 GETMBR R15 R15 K19 + 0x5C400400, // 00C2 MOVE R16 R2 + 0x5C441200, // 00C3 MOVE R17 R9 + 0x88480500, // 00C4 GETMBR R18 R2 K0 + 0x5C4C1400, // 00C5 MOVE R19 R10 + 0x7C340C00, // 00C6 CALL R13 6 + 0x58380014, // 00C7 LDCONST R14 K20 + 0x7C2C0600, // 00C8 CALL R11 3 + 0x7002000F, // 00C9 JMP #00DA + 0xB82A2200, // 00CA GETNGBL R10 K17 + 0x8C28151B, // 00CB GETMET R10 R10 K27 + 0x58300014, // 00CC LDCONST R12 K20 + 0x7C280400, // 00CD CALL R10 2 + 0x782A000A, // 00CE JMPF R10 #00DA + 0xB82A2200, // 00CF GETNGBL R10 K17 + 0x8C28150A, // 00D0 GETMET R10 R10 K10 + 0x60300018, // 00D1 GETGBL R12 G24 + 0x5834002B, // 00D2 LDCONST R13 K43 + 0x88380307, // 00D3 GETMBR R14 R1 K7 + 0x88381D13, // 00D4 GETMBR R14 R14 K19 + 0x5C3C0400, // 00D5 MOVE R15 R2 + 0x5C401200, // 00D6 MOVE R16 R9 + 0x7C300800, // 00D7 CALL R12 4 + 0x58340014, // 00D8 LDCONST R13 K20 + 0x7C280600, // 00D9 CALL R10 3 + 0x50280200, // 00DA LDBOOL R10 1 0 + 0x80041400, // 00DB RET 1 R10 }) ) ); @@ -2276,135 +3167,6 @@ be_local_closure(Matter_IM_send_enqueued, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: process_timed_request -********************************************************************/ -be_local_closure(Matter_IM_process_timed_request, /* name */ - be_nested_proto( - 10, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TimedRequestMessage), - /* K2 */ be_nested_str_weak(from_TLV), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3ECommand_X20_X20_X20_X28_X256i_X29_X20TimedRequest_X3D_X25i), - /* K6 */ be_nested_str_weak(session), - /* K7 */ be_nested_str_weak(local_session_id), - /* K8 */ be_nested_str_weak(timeout), - /* K9 */ be_const_int(3), - /* K10 */ be_nested_str_weak(send_status), - /* K11 */ be_nested_str_weak(SUCCESS), - }), - be_str_weak(process_timed_request), - &be_const_str_solidified, - ( &(const binstruction[23]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0xB8120600, // 0006 GETNGBL R4 K3 - 0x8C100904, // 0007 GETMET R4 R4 K4 - 0x60180018, // 0008 GETGBL R6 G24 - 0x581C0005, // 0009 LDCONST R7 K5 - 0x88200306, // 000A GETMBR R8 R1 K6 - 0x88201107, // 000B GETMBR R8 R8 K7 - 0x88240708, // 000C GETMBR R9 R3 K8 - 0x7C180600, // 000D CALL R6 3 - 0x581C0009, // 000E LDCONST R7 K9 - 0x7C100600, // 000F CALL R4 3 - 0x8C10010A, // 0010 GETMET R4 R0 K10 - 0x5C180200, // 0011 MOVE R6 R1 - 0xB81E0000, // 0012 GETNGBL R7 K0 - 0x881C0F0B, // 0013 GETMBR R7 R7 K11 - 0x7C100600, // 0014 CALL R4 3 - 0x50100200, // 0015 LDBOOL R4 1 0 - 0x80040800, // 0016 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: report_data -********************************************************************/ -be_local_closure(Matter_IM_report_data, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(ReportDataMessage), - /* K2 */ be_nested_str_weak(from_TLV), - }), - be_str_weak(report_data), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x50100000, // 0006 LDBOOL R4 0 0 - 0x80040800, // 0007 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: process_invoke_response -********************************************************************/ -be_local_closure(Matter_IM_process_invoke_response, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(InvokeResponseMessage), - /* K2 */ be_nested_str_weak(from_TLV), - }), - be_str_weak(process_invoke_response), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x7C0C0200, // 0002 CALL R3 1 - 0x8C0C0702, // 0003 GETMET R3 R3 K2 - 0x5C140400, // 0004 MOVE R5 R2 - 0x7C0C0400, // 0005 CALL R3 2 - 0x50100000, // 0006 LDBOOL R4 0 0 - 0x80040800, // 0007 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -2418,16 +3180,23 @@ be_local_closure(Matter_IM_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[12]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(send_queue), /* K2 */ be_nested_str_weak(subs_shop), /* K3 */ be_nested_str_weak(matter), /* K4 */ be_nested_str_weak(IM_Subscription_Shop), + /* K5 */ be_nested_str_weak(read_request_solo), + /* K6 */ be_nested_str_weak(ReadRequestMessage_solo), + /* K7 */ be_nested_str_weak(invoke_request_solo), + /* K8 */ be_nested_str_weak(InvokeRequestMessage_solo), + /* K9 */ be_nested_str_weak(tlv_solo), + /* K10 */ be_nested_str_weak(TLV), + /* K11 */ be_nested_str_weak(Matter_TLV_item), }), be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0x90020001, // 0000 SETMBR R0 K0 R1 0x60080012, // 0001 GETGBL R2 G18 0x7C080000, // 0002 CALL R2 0 @@ -2437,7 +3206,208 @@ be_local_closure(Matter_IM_init, /* name */ 0x5C100000, // 0006 MOVE R4 R0 0x7C080400, // 0007 CALL R2 2 0x90020402, // 0008 SETMBR R0 K2 R2 - 0x80000000, // 0009 RET 0 + 0xB80A0600, // 0009 GETNGBL R2 K3 + 0x8C080506, // 000A GETMET R2 R2 K6 + 0x7C080200, // 000B CALL R2 1 + 0x90020A02, // 000C SETMBR R0 K5 R2 + 0xB80A0600, // 000D GETNGBL R2 K3 + 0x8C080508, // 000E GETMET R2 R2 K8 + 0x7C080200, // 000F CALL R2 1 + 0x90020E02, // 0010 SETMBR R0 K7 R2 + 0xB80A0600, // 0011 GETNGBL R2 K3 + 0x8808050A, // 0012 GETMBR R2 R2 K10 + 0x8C08050B, // 0013 GETMET R2 R2 K11 + 0x7C080200, // 0014 CALL R2 1 + 0x90021202, // 0015 SETMBR R0 K9 R2 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: expire_sendqueue +********************************************************************/ +be_local_closure(Matter_IM_expire_sendqueue, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(send_queue), + /* K2 */ be_nested_str_weak(tasmota), + /* K3 */ be_nested_str_weak(time_reached), + /* K4 */ be_nested_str_weak(expiration), + /* K5 */ be_nested_str_weak(reached_timeout), + /* K6 */ be_nested_str_weak(remove), + /* K7 */ be_const_int(1), + }), + be_str_weak(expire_sendqueue), + &be_const_str_solidified, + ( &(const binstruction[24]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x6008000C, // 0001 GETGBL R2 G12 + 0x880C0101, // 0002 GETMBR R3 R0 K1 + 0x7C080200, // 0003 CALL R2 1 + 0x14080202, // 0004 LT R2 R1 R2 + 0x780A000F, // 0005 JMPF R2 #0016 + 0x88080101, // 0006 GETMBR R2 R0 K1 + 0x94080401, // 0007 GETIDX R2 R2 R1 + 0xB80E0400, // 0008 GETNGBL R3 K2 + 0x8C0C0703, // 0009 GETMET R3 R3 K3 + 0x88140504, // 000A GETMBR R5 R2 K4 + 0x7C0C0400, // 000B CALL R3 2 + 0x780E0006, // 000C JMPF R3 #0014 + 0x8C0C0505, // 000D GETMET R3 R2 K5 + 0x7C0C0200, // 000E CALL R3 1 + 0x880C0101, // 000F GETMBR R3 R0 K1 + 0x8C0C0706, // 0010 GETMET R3 R3 K6 + 0x5C140200, // 0011 MOVE R5 R1 + 0x7C0C0400, // 0012 CALL R3 2 + 0x70020000, // 0013 JMP #0015 + 0x00040307, // 0014 ADD R1 R1 K7 + 0x7001FFEA, // 0015 JMP #0001 + 0x4C080000, // 0016 LDNIL R2 + 0x80040400, // 0017 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_request +********************************************************************/ +be_local_closure(Matter_IM_subscribe_request, /* name */ + be_nested_proto( + 17, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[30]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(SubscribeRequestMessage), + /* K2 */ be_nested_str_weak(from_TLV), + /* K3 */ be_nested_str_weak(keep_subscriptions), + /* K4 */ be_nested_str_weak(subs_shop), + /* K5 */ be_nested_str_weak(remove_by_session), + /* K6 */ be_nested_str_weak(session), + /* K7 */ be_nested_str_weak(new_subscription), + /* K8 */ be_nested_str_weak(Path), + /* K9 */ be_nested_str_weak(msg), + /* K10 */ be_nested_str_weak(attributes_requests), + /* K11 */ be_nested_str_weak(endpoint), + /* K12 */ be_nested_str_weak(cluster), + /* K13 */ be_nested_str_weak(attribute), + /* K14 */ be_nested_str_weak(push), + /* K15 */ be_nested_str_weak(stop_iteration), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), + /* K19 */ be_nested_str_weak(local_session_id), + /* K20 */ be_nested_str_weak(concat), + /* K21 */ be_nested_str_weak(_X20), + /* K22 */ be_nested_str_weak(min_interval), + /* K23 */ be_nested_str_weak(max_interval), + /* K24 */ be_const_int(1), + /* K25 */ be_const_int(0), + /* K26 */ be_nested_str_weak(subscription_id), + /* K27 */ be_const_int(3), + /* K28 */ be_nested_str_weak(_inner_process_read_request), + /* K29 */ be_nested_str_weak(send_subscribe_response), + }), + be_str_weak(subscribe_request), + &be_const_str_solidified, + ( &(const binstruction[78]) { /* code */ + 0xB80E0000, // 0000 GETNGBL R3 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x7C0C0200, // 0002 CALL R3 1 + 0x8C0C0702, // 0003 GETMET R3 R3 K2 + 0x5C140400, // 0004 MOVE R5 R2 + 0x7C0C0400, // 0005 CALL R3 2 + 0x88100703, // 0006 GETMBR R4 R3 K3 + 0x74120003, // 0007 JMPT R4 #000C + 0x88100104, // 0008 GETMBR R4 R0 K4 + 0x8C100905, // 0009 GETMET R4 R4 K5 + 0x88180306, // 000A GETMBR R6 R1 K6 + 0x7C100400, // 000B CALL R4 2 + 0x88100104, // 000C GETMBR R4 R0 K4 + 0x8C100907, // 000D GETMET R4 R4 K7 + 0x88180306, // 000E GETMBR R6 R1 K6 + 0x5C1C0600, // 000F MOVE R7 R3 + 0x7C100600, // 0010 CALL R4 3 + 0x60140012, // 0011 GETGBL R5 G18 + 0x7C140000, // 0012 CALL R5 0 + 0xB81A0000, // 0013 GETNGBL R6 K0 + 0x8C180D08, // 0014 GETMET R6 R6 K8 + 0x7C180200, // 0015 CALL R6 1 + 0x901A1201, // 0016 SETMBR R6 K9 R1 + 0x601C0010, // 0017 GETGBL R7 G16 + 0x8820070A, // 0018 GETMBR R8 R3 K10 + 0x7C1C0200, // 0019 CALL R7 1 + 0xA802000D, // 001A EXBLK 0 #0029 + 0x5C200E00, // 001B MOVE R8 R7 + 0x7C200000, // 001C CALL R8 0 + 0x8824110B, // 001D GETMBR R9 R8 K11 + 0x901A1609, // 001E SETMBR R6 K11 R9 + 0x8824110C, // 001F GETMBR R9 R8 K12 + 0x901A1809, // 0020 SETMBR R6 K12 R9 + 0x8824110D, // 0021 GETMBR R9 R8 K13 + 0x901A1A09, // 0022 SETMBR R6 K13 R9 + 0x8C240B0E, // 0023 GETMET R9 R5 K14 + 0x602C0008, // 0024 GETGBL R11 G8 + 0x5C300C00, // 0025 MOVE R12 R6 + 0x7C2C0200, // 0026 CALL R11 1 + 0x7C240400, // 0027 CALL R9 2 + 0x7001FFF1, // 0028 JMP #001B + 0x581C000F, // 0029 LDCONST R7 K15 + 0xAC1C0200, // 002A CATCH R7 1 0 + 0xB0080000, // 002B RAISE 2 R0 R0 + 0xB81E2000, // 002C GETNGBL R7 K16 + 0x8C1C0F11, // 002D GETMET R7 R7 K17 + 0x60240018, // 002E GETGBL R9 G24 + 0x58280012, // 002F LDCONST R10 K18 + 0x882C0306, // 0030 GETMBR R11 R1 K6 + 0x882C1713, // 0031 GETMBR R11 R11 K19 + 0x8C300B14, // 0032 GETMET R12 R5 K20 + 0x58380015, // 0033 LDCONST R14 K21 + 0x7C300400, // 0034 CALL R12 2 + 0x88340916, // 0035 GETMBR R13 R4 K22 + 0x88380917, // 0036 GETMBR R14 R4 K23 + 0x883C0703, // 0037 GETMBR R15 R3 K3 + 0x783E0001, // 0038 JMPF R15 #003B + 0x583C0018, // 0039 LDCONST R15 K24 + 0x70020000, // 003A JMP #003C + 0x583C0019, // 003B LDCONST R15 K25 + 0x8840091A, // 003C GETMBR R16 R4 K26 + 0x7C240E00, // 003D CALL R9 7 + 0x5828001B, // 003E LDCONST R10 K27 + 0x7C1C0600, // 003F CALL R7 3 + 0x8C1C011C, // 0040 GETMET R7 R0 K28 + 0x88240306, // 0041 GETMBR R9 R1 K6 + 0x5C280600, // 0042 MOVE R10 R3 + 0x502C0200, // 0043 LDBOOL R11 1 0 + 0x7C1C0800, // 0044 CALL R7 4 + 0x8820091A, // 0045 GETMBR R8 R4 K26 + 0x901E3408, // 0046 SETMBR R7 K26 R8 + 0x8C20011D, // 0047 GETMET R8 R0 K29 + 0x5C280200, // 0048 MOVE R10 R1 + 0x5C2C0E00, // 0049 MOVE R11 R7 + 0x5C300800, // 004A MOVE R12 R4 + 0x7C200800, // 004B CALL R8 4 + 0x50200200, // 004C LDBOOL R8 1 0 + 0x80041000, // 004D RET 1 R8 }) ) ); @@ -2522,41 +3492,50 @@ be_local_closure(Matter_IM_send_subscribe_heartbeat, /* name */ ** Solidified class: Matter_IM ********************************************************************/ be_local_class(Matter_IM, - 3, + 6, NULL, - be_nested_map(31, + be_nested_map(40, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(send_subscribe_heartbeat, -1), be_const_closure(Matter_IM_send_subscribe_heartbeat_closure) }, - { be_const_key_weak(subs_shop, 23), be_const_var(1) }, - { be_const_key_weak(send_queue, 30), be_const_var(2) }, - { be_const_key_weak(process_invoke_request, -1), be_const_closure(Matter_IM_process_invoke_request_closure) }, - { be_const_key_weak(subscribe_request, -1), be_const_closure(Matter_IM_subscribe_request_closure) }, - { be_const_key_weak(process_write_request, 11), be_const_closure(Matter_IM_process_write_request_closure) }, - { be_const_key_weak(send_write_response, -1), be_const_closure(Matter_IM_send_write_response_closure) }, - { be_const_key_weak(remove_sendqueue_by_exchangeid, -1), be_const_closure(Matter_IM_remove_sendqueue_by_exchangeid_closure) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_IM_every_second_closure) }, - { be_const_key_weak(send_ack_now, -1), be_const_closure(Matter_IM_send_ack_now_closure) }, { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_IM_every_250ms_closure) }, - { be_const_key_weak(send_invoke_response, -1), be_const_closure(Matter_IM_send_invoke_response_closure) }, - { be_const_key_weak(process_invoke_response, 21), be_const_closure(Matter_IM_process_invoke_response_closure) }, - { be_const_key_weak(_inner_process_read_request, -1), be_const_closure(Matter_IM__inner_process_read_request_closure) }, - { be_const_key_weak(subscribe_response, 22), be_const_closure(Matter_IM_subscribe_response_closure) }, - { be_const_key_weak(process_incoming, -1), be_const_closure(Matter_IM_process_incoming_closure) }, - { be_const_key_weak(send_subscribe_response, 18), be_const_closure(Matter_IM_send_subscribe_response_closure) }, - { be_const_key_weak(find_sendqueue_by_exchangeid, -1), be_const_closure(Matter_IM_find_sendqueue_by_exchangeid_closure) }, - { be_const_key_weak(process_incoming_ack, 13), be_const_closure(Matter_IM_process_incoming_ack_closure) }, - { be_const_key_weak(process_read_request, -1), be_const_closure(Matter_IM_process_read_request_closure) }, - { be_const_key_weak(send_report_data, -1), be_const_closure(Matter_IM_send_report_data_closure) }, - { be_const_key_weak(process_timed_request, -1), be_const_closure(Matter_IM_process_timed_request_closure) }, + { be_const_key_weak(process_incoming_ack, -1), be_const_closure(Matter_IM_process_incoming_ack_closure) }, + { be_const_key_weak(send_ack_now, -1), be_const_closure(Matter_IM_send_ack_now_closure) }, + { be_const_key_weak(subscribe_response, -1), be_const_closure(Matter_IM_subscribe_response_closure) }, + { be_const_key_weak(process_write_response, -1), be_const_closure(Matter_IM_process_write_response_closure) }, { be_const_key_weak(process_status_response, -1), be_const_closure(Matter_IM_process_status_response_closure) }, - { be_const_key_weak(send_subscribe_update, 28), be_const_closure(Matter_IM_send_subscribe_update_closure) }, - { be_const_key_weak(send_enqueued, -1), be_const_closure(Matter_IM_send_enqueued_closure) }, - { be_const_key_weak(process_write_response, 12), be_const_closure(Matter_IM_process_write_response_closure) }, - { be_const_key_weak(report_data, 0), be_const_closure(Matter_IM_report_data_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(send_subscribe_heartbeat, -1), be_const_closure(Matter_IM_send_subscribe_heartbeat_closure) }, + { be_const_key_weak(attributedata2raw, 12), be_const_closure(Matter_IM_attributedata2raw_closure) }, + { be_const_key_weak(subscribe_request, 37), be_const_closure(Matter_IM_subscribe_request_closure) }, + { be_const_key_weak(send_subscribe_update, -1), be_const_closure(Matter_IM_send_subscribe_update_closure) }, + { be_const_key_weak(invokeresponse2raw, 2), be_const_closure(Matter_IM_invokeresponse2raw_closure) }, + { be_const_key_weak(read_request_solo, 38), be_const_var(3) }, + { be_const_key_weak(process_incoming, -1), be_const_closure(Matter_IM_process_incoming_closure) }, + { be_const_key_weak(process_invoke_request_solo, 8), be_const_closure(Matter_IM_process_invoke_request_solo_closure) }, + { be_const_key_weak(send_invoke_response, -1), be_const_closure(Matter_IM_send_invoke_response_closure) }, + { be_const_key_weak(send_write_response, 6), be_const_closure(Matter_IM_send_write_response_closure) }, + { be_const_key_weak(process_write_request, -1), be_const_closure(Matter_IM_process_write_request_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_IM_every_second_closure) }, + { be_const_key_weak(path2raw, -1), be_const_closure(Matter_IM_path2raw_closure) }, + { be_const_key_weak(invoke_request_solo, -1), be_const_var(4) }, + { be_const_key_weak(_inner_process_read_request, -1), be_const_closure(Matter_IM__inner_process_read_request_closure) }, + { be_const_key_weak(tlv_solo, -1), be_const_var(5) }, + { be_const_key_weak(remove_sendqueue_by_exchangeid, -1), be_const_closure(Matter_IM_remove_sendqueue_by_exchangeid_closure) }, + { be_const_key_weak(find_sendqueue_by_exchangeid, -1), be_const_closure(Matter_IM_find_sendqueue_by_exchangeid_closure) }, + { be_const_key_weak(send_report_data, -1), be_const_closure(Matter_IM_send_report_data_closure) }, + { be_const_key_weak(process_invoke_request, 17), be_const_closure(Matter_IM_process_invoke_request_closure) }, { be_const_key_weak(send_status, -1), be_const_closure(Matter_IM_send_status_closure) }, + { be_const_key_weak(subs_shop, 20), be_const_var(1) }, + { be_const_key_weak(process_timed_request, 32), be_const_closure(Matter_IM_process_timed_request_closure) }, + { be_const_key_weak(attributestatus2raw, 23), be_const_closure(Matter_IM_attributestatus2raw_closure) }, + { be_const_key_weak(send_subscribe_response, -1), be_const_closure(Matter_IM_send_subscribe_response_closure) }, + { be_const_key_weak(process_invoke_response, 24), be_const_closure(Matter_IM_process_invoke_response_closure) }, + { be_const_key_weak(report_data, 9), be_const_closure(Matter_IM_report_data_closure) }, + { be_const_key_weak(process_read_request_solo, -1), be_const_closure(Matter_IM_process_read_request_solo_closure) }, + { be_const_key_weak(send_enqueued, -1), be_const_closure(Matter_IM_send_enqueued_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_IM_init_closure) }, { be_const_key_weak(expire_sendqueue, -1), be_const_closure(Matter_IM_expire_sendqueue_closure) }, + { be_const_key_weak(process_read_request, -1), be_const_closure(Matter_IM_process_read_request_closure) }, + { be_const_key_weak(device, -1), be_const_var(0) }, + { be_const_key_weak(send_queue, -1), be_const_var(2) }, })), be_str_weak(Matter_IM) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h index 365641ecd..1ffcdfd5e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Data.h @@ -2822,6 +2822,194 @@ void be_load_Matter_ReadRequestMessage_class(bvm *vm) { be_pop(vm, 1); } +extern const bclass be_class_Matter_ReadRequestMessage_solo; + +/******************************************************************** +** Solidified function: from_raw +********************************************************************/ +be_local_closure(Matter_ReadRequestMessage_solo_from_raw, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[10]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_const_int(355860503), + /* K3 */ be_const_int(1), + /* K4 */ be_const_int(2), + /* K5 */ be_const_int(3), + /* K6 */ be_nested_str_weak(endpoint), + /* K7 */ be_nested_str_weak(cluster), + /* K8 */ be_nested_str_weak(attribute), + /* K9 */ be_nested_str_weak(fabric_filtered), + }), + be_str_weak(from_raw), + &be_const_str_solidified, + ( &(const binstruction[131]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x7C0C0200, // 0001 CALL R3 1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100200, // 0003 MOVE R4 R1 + 0x7C0C0200, // 0004 CALL R3 1 + 0x4C100000, // 0005 LDNIL R4 + 0x8C140301, // 0006 GETMET R5 R1 K1 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0x5421FFFB, // 0008 LDINT R8 -4 + 0x7C140600, // 0009 CALL R5 3 + 0x20140B02, // 000A NE R5 R5 K2 + 0x78160001, // 000B JMPF R5 #000E + 0x4C140000, // 000C LDNIL R5 + 0x80040A00, // 000D RET 1 R5 + 0x54160003, // 000E LDINT R5 4 + 0x00080405, // 000F ADD R2 R2 R5 + 0x14140403, // 0010 LT R5 R2 R3 + 0x7816002D, // 0011 JMPF R5 #0040 + 0x8C140301, // 0012 GETMET R5 R1 K1 + 0x001C0503, // 0013 ADD R7 R2 K3 + 0x58200003, // 0014 LDCONST R8 K3 + 0x7C140600, // 0015 CALL R5 3 + 0x8C180301, // 0016 GETMET R6 R1 K1 + 0x5C200400, // 0017 MOVE R8 R2 + 0x58240003, // 0018 LDCONST R9 K3 + 0x7C180600, // 0019 CALL R6 3 + 0x541E0023, // 001A LDINT R7 36 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0006, // 001C JMPF R7 #0024 + 0x8C1C0301, // 001D GETMET R7 R1 K1 + 0x00240504, // 001E ADD R9 R2 K4 + 0x58280003, // 001F LDCONST R10 K3 + 0x7C1C0600, // 0020 CALL R7 3 + 0x5C100E00, // 0021 MOVE R4 R7 + 0x00080505, // 0022 ADD R2 R2 K5 + 0x7002000B, // 0023 JMP #0030 + 0x541E0024, // 0024 LDINT R7 37 + 0x1C1C0C07, // 0025 EQ R7 R6 R7 + 0x781E0007, // 0026 JMPF R7 #002F + 0x8C1C0301, // 0027 GETMET R7 R1 K1 + 0x00240504, // 0028 ADD R9 R2 K4 + 0x58280004, // 0029 LDCONST R10 K4 + 0x7C1C0600, // 002A CALL R7 3 + 0x5C100E00, // 002B MOVE R4 R7 + 0x541E0003, // 002C LDINT R7 4 + 0x00080407, // 002D ADD R2 R2 R7 + 0x70020000, // 002E JMP #0030 + 0x7002000F, // 002F JMP #0040 + 0x1C1C0B04, // 0030 EQ R7 R5 K4 + 0x781E0001, // 0031 JMPF R7 #0034 + 0x90020C04, // 0032 SETMBR R0 K6 R4 + 0x7002000A, // 0033 JMP #003F + 0x1C1C0B05, // 0034 EQ R7 R5 K5 + 0x781E0001, // 0035 JMPF R7 #0038 + 0x90020E04, // 0036 SETMBR R0 K7 R4 + 0x70020006, // 0037 JMP #003F + 0x541E0003, // 0038 LDINT R7 4 + 0x1C1C0A07, // 0039 EQ R7 R5 R7 + 0x781E0001, // 003A JMPF R7 #003D + 0x90021004, // 003B SETMBR R0 K8 R4 + 0x70020001, // 003C JMP #003F + 0x4C1C0000, // 003D LDNIL R7 + 0x80040E00, // 003E RET 1 R7 + 0x7001FFCF, // 003F JMP #0010 + 0x8C140301, // 0040 GETMET R5 R1 K1 + 0x5C1C0400, // 0041 MOVE R7 R2 + 0x5421FFFD, // 0042 LDINT R8 -2 + 0x7C140600, // 0043 CALL R5 3 + 0x5C100A00, // 0044 MOVE R4 R5 + 0x54161817, // 0045 LDINT R5 6168 + 0x20140805, // 0046 NE R5 R4 R5 + 0x78160001, // 0047 JMPF R5 #004A + 0x4C140000, // 0048 LDNIL R5 + 0x80040A00, // 0049 RET 1 R5 + 0x00080504, // 004A ADD R2 R2 K4 + 0x8C140301, // 004B GETMET R5 R1 K1 + 0x5C1C0400, // 004C MOVE R7 R2 + 0x5421FFFD, // 004D LDINT R8 -2 + 0x7C140600, // 004E CALL R5 3 + 0x5C100A00, // 004F MOVE R4 R5 + 0x54162802, // 0050 LDINT R5 10243 + 0x1C140805, // 0051 EQ R5 R4 R5 + 0x78160003, // 0052 JMPF R5 #0057 + 0x50140000, // 0053 LDBOOL R5 0 0 + 0x90021205, // 0054 SETMBR R0 K9 R5 + 0x00080504, // 0055 ADD R2 R2 K4 + 0x70020005, // 0056 JMP #005D + 0x54162902, // 0057 LDINT R5 10499 + 0x1C140805, // 0058 EQ R5 R4 R5 + 0x78160002, // 0059 JMPF R5 #005D + 0x50140200, // 005A LDBOOL R5 1 0 + 0x90021205, // 005B SETMBR R0 K9 R5 + 0x00080504, // 005C ADD R2 R2 K4 + 0x8C140301, // 005D GETMET R5 R1 K1 + 0x5C1C0400, // 005E MOVE R7 R2 + 0x5421FFFD, // 005F LDINT R8 -2 + 0x7C140600, // 0060 CALL R5 3 + 0x5C100A00, // 0061 MOVE R4 R5 + 0x541624FE, // 0062 LDINT R5 9471 + 0x1C140805, // 0063 EQ R5 R4 R5 + 0x78160000, // 0064 JMPF R5 #0066 + 0x00080505, // 0065 ADD R2 R2 K5 + 0x8C140301, // 0066 GETMET R5 R1 K1 + 0x5C1C0400, // 0067 MOVE R7 R2 + 0x58200003, // 0068 LDCONST R8 K3 + 0x7C140600, // 0069 CALL R5 3 + 0x541A0017, // 006A LDINT R6 24 + 0x20140A06, // 006B NE R5 R5 R6 + 0x78160001, // 006C JMPF R5 #006F + 0x4C140000, // 006D LDNIL R5 + 0x80040A00, // 006E RET 1 R5 + 0x00080503, // 006F ADD R2 R2 K3 + 0x88140106, // 0070 GETMBR R5 R0 K6 + 0x4C180000, // 0071 LDNIL R6 + 0x1C140A06, // 0072 EQ R5 R5 R6 + 0x7416000B, // 0073 JMPT R5 #0080 + 0x88140107, // 0074 GETMBR R5 R0 K7 + 0x4C180000, // 0075 LDNIL R6 + 0x1C140A06, // 0076 EQ R5 R5 R6 + 0x74160007, // 0077 JMPT R5 #0080 + 0x88140108, // 0078 GETMBR R5 R0 K8 + 0x4C180000, // 0079 LDNIL R6 + 0x1C140A06, // 007A EQ R5 R5 R6 + 0x74160003, // 007B JMPT R5 #0080 + 0x88140109, // 007C GETMBR R5 R0 K9 + 0x4C180000, // 007D LDNIL R6 + 0x1C140A06, // 007E EQ R5 R5 R6 + 0x78160001, // 007F JMPF R5 #0082 + 0x4C140000, // 0080 LDNIL R5 + 0x80040A00, // 0081 RET 1 R5 + 0x80040000, // 0082 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_ReadRequestMessage_solo +********************************************************************/ +extern const bclass be_class_Matter_Path; +be_local_class(Matter_ReadRequestMessage_solo, + 0, + &be_class_Matter_Path, + be_nested_map(1, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(from_raw, -1), be_const_closure(Matter_ReadRequestMessage_solo_from_raw_closure) }, + })), + be_str_weak(Matter_ReadRequestMessage_solo) +); +/*******************************************************************/ + +void be_load_Matter_ReadRequestMessage_solo_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_ReadRequestMessage_solo); + be_setglobal(vm, "Matter_ReadRequestMessage_solo"); + be_pop(vm, 1); +} + extern const bclass be_class_Matter_ReportDataMessage; /******************************************************************** @@ -3886,6 +4074,281 @@ void be_load_Matter_InvokeRequestMessage_class(bvm *vm) { be_pop(vm, 1); } +extern const bclass be_class_Matter_InvokeRequestMessage_solo; + +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_InvokeRequestMessage_solo_reset, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(SuppressResponse), + /* K2 */ be_nested_str_weak(TimedRequest), + /* K3 */ be_nested_str_weak(command_fields), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x60080003, // 0001 GETGBL R2 G3 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C080200, // 0003 CALL R2 1 + 0x8C080500, // 0004 GETMET R2 R2 K0 + 0x7C080200, // 0005 CALL R2 1 + 0x90020201, // 0006 SETMBR R0 K1 R1 + 0x90020401, // 0007 SETMBR R0 K2 R1 + 0x90020601, // 0008 SETMBR R0 K3 R1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: from_raw +********************************************************************/ +be_local_closure(Matter_InvokeRequestMessage_solo_from_raw, /* name */ + be_nested_proto( + 11, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(get), + /* K2 */ be_const_int(1), + /* K3 */ be_nested_str_weak(SuppressResponse), + /* K4 */ be_const_int(2), + /* K5 */ be_const_int(3), + /* K6 */ be_const_int(0), + /* K7 */ be_nested_str_weak(endpoint), + /* K8 */ be_nested_str_weak(cluster), + /* K9 */ be_nested_str_weak(command), + /* K10 */ be_nested_str_weak(command_fields), + /* K11 */ be_nested_str_weak(matter), + /* K12 */ be_nested_str_weak(TLV), + /* K13 */ be_nested_str_weak(parse), + /* K14 */ be_nested_str_weak(next_idx), + /* K15 */ be_const_int(620691736), + }), + be_str_weak(from_raw), + &be_const_str_solidified, + ( &(const binstruction[170]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x7C0C0200, // 0001 CALL R3 1 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100200, // 0003 MOVE R4 R1 + 0x7C0C0200, // 0004 CALL R3 1 + 0x4C100000, // 0005 LDNIL R4 + 0x8C140301, // 0006 GETMET R5 R1 K1 + 0x5C1C0400, // 0007 MOVE R7 R2 + 0x58200002, // 0008 LDCONST R8 K2 + 0x7C140600, // 0009 CALL R5 3 + 0x541A0014, // 000A LDINT R6 21 + 0x20140A06, // 000B NE R5 R5 R6 + 0x78160001, // 000C JMPF R5 #000F + 0x4C140000, // 000D LDNIL R5 + 0x80040A00, // 000E RET 1 R5 + 0x00080502, // 000F ADD R2 R2 K2 + 0x8C140301, // 0010 GETMET R5 R1 K1 + 0x5C1C0400, // 0011 MOVE R7 R2 + 0x5421FFFD, // 0012 LDINT R8 -2 + 0x7C140600, // 0013 CALL R5 3 + 0x5C100A00, // 0014 MOVE R4 R5 + 0x541627FF, // 0015 LDINT R5 10240 + 0x1C140805, // 0016 EQ R5 R4 R5 + 0x74160002, // 0017 JMPT R5 #001B + 0x541628FF, // 0018 LDINT R5 10496 + 0x1C140805, // 0019 EQ R5 R4 R5 + 0x78160003, // 001A JMPF R5 #001F + 0x541628FF, // 001B LDINT R5 10496 + 0x1C140805, // 001C EQ R5 R4 R5 + 0x90020605, // 001D SETMBR R0 K3 R5 + 0x00080504, // 001E ADD R2 R2 K4 + 0x8C140301, // 001F GETMET R5 R1 K1 + 0x5C1C0400, // 0020 MOVE R7 R2 + 0x5421FFFD, // 0021 LDINT R8 -2 + 0x7C140600, // 0022 CALL R5 3 + 0x5C100A00, // 0023 MOVE R4 R5 + 0x54162800, // 0024 LDINT R5 10241 + 0x1C140805, // 0025 EQ R5 R4 R5 + 0x74160002, // 0026 JMPT R5 #002A + 0x54162900, // 0027 LDINT R5 10497 + 0x1C140805, // 0028 EQ R5 R4 R5 + 0x78160003, // 0029 JMPF R5 #002E + 0x54162900, // 002A LDINT R5 10497 + 0x1C140805, // 002B EQ R5 R4 R5 + 0x90020605, // 002C SETMBR R0 K3 R5 + 0x00080504, // 002D ADD R2 R2 K4 + 0x8C140301, // 002E GETMET R5 R1 K1 + 0x5C1C0400, // 002F MOVE R7 R2 + 0x5421FFFD, // 0030 LDINT R8 -2 + 0x7C140600, // 0031 CALL R5 3 + 0x541A3601, // 0032 LDINT R6 13826 + 0x20140A06, // 0033 NE R5 R5 R6 + 0x78160001, // 0034 JMPF R5 #0037 + 0x4C140000, // 0035 LDNIL R5 + 0x80040A00, // 0036 RET 1 R5 + 0x00080504, // 0037 ADD R2 R2 K4 + 0x8C140301, // 0038 GETMET R5 R1 K1 + 0x5C1C0400, // 0039 MOVE R7 R2 + 0x58200002, // 003A LDCONST R8 K2 + 0x7C140600, // 003B CALL R5 3 + 0x541A0014, // 003C LDINT R6 21 + 0x20140A06, // 003D NE R5 R5 R6 + 0x78160001, // 003E JMPF R5 #0041 + 0x4C140000, // 003F LDNIL R5 + 0x80040A00, // 0040 RET 1 R5 + 0x00080502, // 0041 ADD R2 R2 K2 + 0x8C140301, // 0042 GETMET R5 R1 K1 + 0x5C1C0400, // 0043 MOVE R7 R2 + 0x5421FFFD, // 0044 LDINT R8 -2 + 0x7C140600, // 0045 CALL R5 3 + 0x541A36FF, // 0046 LDINT R6 14080 + 0x20140A06, // 0047 NE R5 R5 R6 + 0x78160001, // 0048 JMPF R5 #004B + 0x4C140000, // 0049 LDNIL R5 + 0x80040A00, // 004A RET 1 R5 + 0x00080504, // 004B ADD R2 R2 K4 + 0x14140403, // 004C LT R5 R2 R3 + 0x7816002C, // 004D JMPF R5 #007B + 0x8C140301, // 004E GETMET R5 R1 K1 + 0x001C0502, // 004F ADD R7 R2 K2 + 0x58200002, // 0050 LDCONST R8 K2 + 0x7C140600, // 0051 CALL R5 3 + 0x8C180301, // 0052 GETMET R6 R1 K1 + 0x5C200400, // 0053 MOVE R8 R2 + 0x58240002, // 0054 LDCONST R9 K2 + 0x7C180600, // 0055 CALL R6 3 + 0x541E0023, // 0056 LDINT R7 36 + 0x1C1C0C07, // 0057 EQ R7 R6 R7 + 0x781E0006, // 0058 JMPF R7 #0060 + 0x8C1C0301, // 0059 GETMET R7 R1 K1 + 0x00240504, // 005A ADD R9 R2 K4 + 0x58280002, // 005B LDCONST R10 K2 + 0x7C1C0600, // 005C CALL R7 3 + 0x5C100E00, // 005D MOVE R4 R7 + 0x00080505, // 005E ADD R2 R2 K5 + 0x7002000B, // 005F JMP #006C + 0x541E0024, // 0060 LDINT R7 37 + 0x1C1C0C07, // 0061 EQ R7 R6 R7 + 0x781E0007, // 0062 JMPF R7 #006B + 0x8C1C0301, // 0063 GETMET R7 R1 K1 + 0x00240504, // 0064 ADD R9 R2 K4 + 0x58280004, // 0065 LDCONST R10 K4 + 0x7C1C0600, // 0066 CALL R7 3 + 0x5C100E00, // 0067 MOVE R4 R7 + 0x541E0003, // 0068 LDINT R7 4 + 0x00080407, // 0069 ADD R2 R2 R7 + 0x70020000, // 006A JMP #006C + 0x7002000E, // 006B JMP #007B + 0x1C1C0B06, // 006C EQ R7 R5 K6 + 0x781E0001, // 006D JMPF R7 #0070 + 0x90020E04, // 006E SETMBR R0 K7 R4 + 0x70020009, // 006F JMP #007A + 0x1C1C0B02, // 0070 EQ R7 R5 K2 + 0x781E0001, // 0071 JMPF R7 #0074 + 0x90021004, // 0072 SETMBR R0 K8 R4 + 0x70020005, // 0073 JMP #007A + 0x1C1C0B04, // 0074 EQ R7 R5 K4 + 0x781E0001, // 0075 JMPF R7 #0078 + 0x90021204, // 0076 SETMBR R0 K9 R4 + 0x70020001, // 0077 JMP #007A + 0x4C1C0000, // 0078 LDNIL R7 + 0x80040E00, // 0079 RET 1 R7 + 0x7001FFD0, // 007A JMP #004C + 0x8C140301, // 007B GETMET R5 R1 K1 + 0x5C1C0400, // 007C MOVE R7 R2 + 0x58200002, // 007D LDCONST R8 K2 + 0x7C140600, // 007E CALL R5 3 + 0x541A0017, // 007F LDINT R6 24 + 0x20140A06, // 0080 NE R5 R5 R6 + 0x78160001, // 0081 JMPF R5 #0084 + 0x4C140000, // 0082 LDNIL R5 + 0x80040A00, // 0083 RET 1 R5 + 0x00080502, // 0084 ADD R2 R2 K2 + 0x8C140301, // 0085 GETMET R5 R1 K1 + 0x5C1C0400, // 0086 MOVE R7 R2 + 0x5421FFFD, // 0087 LDINT R8 -2 + 0x7C140600, // 0088 CALL R5 3 + 0x541A3500, // 0089 LDINT R6 13569 + 0x20140A06, // 008A NE R5 R5 R6 + 0x78160001, // 008B JMPF R5 #008E + 0x4C140000, // 008C LDNIL R5 + 0x80040A00, // 008D RET 1 R5 + 0xB8161600, // 008E GETNGBL R5 K11 + 0x88140B0C, // 008F GETMBR R5 R5 K12 + 0x8C140B0D, // 0090 GETMET R5 R5 K13 + 0x5C1C0200, // 0091 MOVE R7 R1 + 0x5C200400, // 0092 MOVE R8 R2 + 0x7C140600, // 0093 CALL R5 3 + 0x90021405, // 0094 SETMBR R0 K10 R5 + 0x8814010A, // 0095 GETMBR R5 R0 K10 + 0x88080B0E, // 0096 GETMBR R2 R5 K14 + 0x8C180301, // 0097 GETMET R6 R1 K1 + 0x5C200400, // 0098 MOVE R8 R2 + 0x5425FFFD, // 0099 LDINT R9 -2 + 0x7C180600, // 009A CALL R6 3 + 0x541E1817, // 009B LDINT R7 6168 + 0x20180C07, // 009C NE R6 R6 R7 + 0x781A0001, // 009D JMPF R6 #00A0 + 0x4C180000, // 009E LDNIL R6 + 0x80040C00, // 009F RET 1 R6 + 0x00080504, // 00A0 ADD R2 R2 K4 + 0x8C140301, // 00A1 GETMET R5 R1 K1 + 0x5C1C0400, // 00A2 MOVE R7 R2 + 0x5421FFFB, // 00A3 LDINT R8 -4 + 0x7C140600, // 00A4 CALL R5 3 + 0x20140B0F, // 00A5 NE R5 R5 K15 + 0x78160001, // 00A6 JMPF R5 #00A9 + 0x4C140000, // 00A7 LDNIL R5 + 0x80040A00, // 00A8 RET 1 R5 + 0x80040000, // 00A9 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified class: Matter_InvokeRequestMessage_solo +********************************************************************/ +extern const bclass be_class_Matter_Path; +be_local_class(Matter_InvokeRequestMessage_solo, + 3, + &be_class_Matter_Path, + be_nested_map(5, + ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(SuppressResponse, 4), be_const_var(0) }, + { be_const_key_weak(command_fields, 3), be_const_var(2) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_InvokeRequestMessage_solo_reset_closure) }, + { be_const_key_weak(from_raw, -1), be_const_closure(Matter_InvokeRequestMessage_solo_from_raw_closure) }, + { be_const_key_weak(TimedRequest, -1), be_const_var(1) }, + })), + be_str_weak(Matter_InvokeRequestMessage_solo) +); +/*******************************************************************/ + +void be_load_Matter_InvokeRequestMessage_solo_class(bvm *vm) { + be_pushntvclass(vm, &be_class_Matter_InvokeRequestMessage_solo); + be_setglobal(vm, "Matter_InvokeRequestMessage_solo"); + be_pop(vm, 1); +} + extern const bclass be_class_Matter_InvokeResponseMessage; /******************************************************************** diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h index 58a362bcb..9ce43b085 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h @@ -7,99 +7,30 @@ extern const bclass be_class_Matter_IM_Message; /******************************************************************** -** Solidified function: status_error_received +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_IM_Message_status_error_received, /* name */ +be_local_closure(Matter_IM_Message_init, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(status_error_received), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_im -********************************************************************/ -be_local_closure(Matter_IM_Message_send_im, /* name */ - be_nested_proto( - 11, /* nstack */ - 2, /* argc */ + 9, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(ready), - /* K1 */ be_nested_str_weak(resp), - /* K2 */ be_nested_str_weak(encode_frame), - /* K3 */ be_nested_str_weak(data), - /* K4 */ be_nested_str_weak(to_TLV), - /* K5 */ be_nested_str_weak(tlv2raw), - /* K6 */ be_nested_str_weak(encrypt), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), - /* K10 */ be_nested_str_weak(session), - /* K11 */ be_nested_str_weak(local_session_id), - /* K12 */ be_nested_str_weak(message_counter), - /* K13 */ be_nested_str_weak(exchange_id), - /* K14 */ be_nested_str_weak(ack_message_counter), - /* K15 */ be_nested_str_weak(send_response_frame), - /* K16 */ be_nested_str_weak(last_counter), - /* K17 */ be_nested_str_weak(finish), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), }), - be_str_weak(send_im), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x740A0001, // 0001 JMPT R2 #0004 - 0x50080000, // 0002 LDBOOL R2 0 0 - 0x80040400, // 0003 RET 1 R2 - 0x88080101, // 0004 GETMBR R2 R0 K1 - 0x8C0C0502, // 0005 GETMET R3 R2 K2 - 0x88140103, // 0006 GETMBR R5 R0 K3 - 0x8C140B04, // 0007 GETMET R5 R5 K4 - 0x7C140200, // 0008 CALL R5 1 - 0x8C140B05, // 0009 GETMET R5 R5 K5 - 0x7C140200, // 000A CALL R5 1 - 0x7C0C0400, // 000B CALL R3 2 - 0x8C0C0506, // 000C GETMET R3 R2 K6 - 0x7C0C0200, // 000D CALL R3 1 - 0xB80E0E00, // 000E GETNGBL R3 K7 - 0x8C0C0708, // 000F GETMET R3 R3 K8 - 0x60140018, // 0010 GETGBL R5 G24 - 0x58180009, // 0011 LDCONST R6 K9 - 0x881C050A, // 0012 GETMBR R7 R2 K10 - 0x881C0F0B, // 0013 GETMBR R7 R7 K11 - 0x8820050C, // 0014 GETMBR R8 R2 K12 - 0x8824050D, // 0015 GETMBR R9 R2 K13 - 0x8828050E, // 0016 GETMBR R10 R2 K14 - 0x7C140A00, // 0017 CALL R5 5 - 0x541A0003, // 0018 LDINT R6 4 - 0x7C0C0600, // 0019 CALL R3 3 - 0x8C0C030F, // 001A GETMET R3 R1 K15 - 0x5C140400, // 001B MOVE R5 R2 - 0x7C0C0400, // 001C CALL R3 2 - 0x880C050C, // 001D GETMBR R3 R2 K12 - 0x90022003, // 001E SETMBR R0 K16 R3 - 0x500C0200, // 001F LDBOOL R3 1 0 - 0x90022203, // 0020 SETMBR R0 K17 R3 - 0x80000000, // 0021 RET 0 + ( &(const binstruction[ 6]) { /* code */ + 0x8C100100, // 0000 GETMET R4 R0 K0 + 0x5C180200, // 0001 MOVE R6 R1 + 0x5C1C0400, // 0002 MOVE R7 R2 + 0x5C200600, // 0003 MOVE R8 R3 + 0x7C100800, // 0004 CALL R4 4 + 0x80000000, // 0005 RET 0 }) ) ); @@ -136,9 +67,154 @@ be_local_closure(Matter_IM_Message_get_exchangeid, /* name */ /******************************************************************** -** Solidified function: init +** Solidified function: send_im ********************************************************************/ -be_local_closure(Matter_IM_Message_init, /* name */ +be_local_closure(Matter_IM_Message_send_im, /* name */ + be_nested_proto( + 13, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[27]) { /* constants */ + /* K0 */ be_nested_str_weak(ready), + /* K1 */ be_nested_str_weak(resp), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(profiler), + /* K4 */ be_nested_str_weak(log), + /* K5 */ be_nested_str_weak(IM_Message_send_im_X2D1), + /* K6 */ be_nested_str_weak(data), + /* K7 */ be_nested_str_weak(to_TLV), + /* K8 */ be_nested_str_weak(IM_Message_send_im_X2D1_X2E1), + /* K9 */ be_nested_str_weak(tlv2raw), + /* K10 */ be_nested_str_weak(IM_Message_send_im_X2D1_X2E2), + /* K11 */ be_nested_str_weak(encode_frame), + /* K12 */ be_nested_str_weak(IM_Message_send_im_X2D2), + /* K13 */ be_nested_str_weak(encrypt), + /* K14 */ be_nested_str_weak(IM_Message_send_im_X2D3), + /* K15 */ be_nested_str_weak(tasmota), + /* K16 */ be_nested_str_weak(loglevel), + /* K17 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), + /* K18 */ be_nested_str_weak(session), + /* K19 */ be_nested_str_weak(local_session_id), + /* K20 */ be_nested_str_weak(message_counter), + /* K21 */ be_nested_str_weak(exchange_id), + /* K22 */ be_nested_str_weak(ack_message_counter), + /* K23 */ be_nested_str_weak(send_response_frame), + /* K24 */ be_nested_str_weak(IM_Message_send_im_X2D4), + /* K25 */ be_nested_str_weak(last_counter), + /* K26 */ be_nested_str_weak(finish), + }), + be_str_weak(send_im), + &be_const_str_solidified, + ( &(const binstruction[70]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0001, // 0001 JMPT R2 #0004 + 0x50080000, // 0002 LDBOOL R2 0 0 + 0x80040400, // 0003 RET 1 R2 + 0x88080101, // 0004 GETMBR R2 R0 K1 + 0xB80E0400, // 0005 GETNGBL R3 K2 + 0x880C0703, // 0006 GETMBR R3 R3 K3 + 0x8C0C0704, // 0007 GETMET R3 R3 K4 + 0x58140005, // 0008 LDCONST R5 K5 + 0x7C0C0400, // 0009 CALL R3 2 + 0x880C0106, // 000A GETMBR R3 R0 K6 + 0x8C0C0707, // 000B GETMET R3 R3 K7 + 0x7C0C0200, // 000C CALL R3 1 + 0xB8120400, // 000D GETNGBL R4 K2 + 0x88100903, // 000E GETMBR R4 R4 K3 + 0x8C100904, // 000F GETMET R4 R4 K4 + 0x58180008, // 0010 LDCONST R6 K8 + 0x7C100400, // 0011 CALL R4 2 + 0x8C100709, // 0012 GETMET R4 R3 K9 + 0x7C100200, // 0013 CALL R4 1 + 0xB8160400, // 0014 GETNGBL R5 K2 + 0x88140B03, // 0015 GETMBR R5 R5 K3 + 0x8C140B04, // 0016 GETMET R5 R5 K4 + 0x581C000A, // 0017 LDCONST R7 K10 + 0x7C140400, // 0018 CALL R5 2 + 0x8C14050B, // 0019 GETMET R5 R2 K11 + 0x5C1C0800, // 001A MOVE R7 R4 + 0x7C140400, // 001B CALL R5 2 + 0xB8160400, // 001C GETNGBL R5 K2 + 0x88140B03, // 001D GETMBR R5 R5 K3 + 0x8C140B04, // 001E GETMET R5 R5 K4 + 0x581C000C, // 001F LDCONST R7 K12 + 0x7C140400, // 0020 CALL R5 2 + 0x8C14050D, // 0021 GETMET R5 R2 K13 + 0x7C140200, // 0022 CALL R5 1 + 0xB8160400, // 0023 GETNGBL R5 K2 + 0x88140B03, // 0024 GETMBR R5 R5 K3 + 0x8C140B04, // 0025 GETMET R5 R5 K4 + 0x581C000E, // 0026 LDCONST R7 K14 + 0x7C140400, // 0027 CALL R5 2 + 0xB8161E00, // 0028 GETNGBL R5 K15 + 0x8C140B10, // 0029 GETMET R5 R5 K16 + 0x541E0003, // 002A LDINT R7 4 + 0x7C140400, // 002B CALL R5 2 + 0x7816000B, // 002C JMPF R5 #0039 + 0xB8161E00, // 002D GETNGBL R5 K15 + 0x8C140B04, // 002E GETMET R5 R5 K4 + 0x601C0018, // 002F GETGBL R7 G24 + 0x58200011, // 0030 LDCONST R8 K17 + 0x88240512, // 0031 GETMBR R9 R2 K18 + 0x88241313, // 0032 GETMBR R9 R9 K19 + 0x88280514, // 0033 GETMBR R10 R2 K20 + 0x882C0515, // 0034 GETMBR R11 R2 K21 + 0x88300516, // 0035 GETMBR R12 R2 K22 + 0x7C1C0A00, // 0036 CALL R7 5 + 0x54220003, // 0037 LDINT R8 4 + 0x7C140600, // 0038 CALL R5 3 + 0x8C140317, // 0039 GETMET R5 R1 K23 + 0x5C1C0400, // 003A MOVE R7 R2 + 0x7C140400, // 003B CALL R5 2 + 0xB8160400, // 003C GETNGBL R5 K2 + 0x88140B03, // 003D GETMBR R5 R5 K3 + 0x8C140B04, // 003E GETMET R5 R5 K4 + 0x581C0018, // 003F LDCONST R7 K24 + 0x7C140400, // 0040 CALL R5 2 + 0x88140514, // 0041 GETMBR R5 R2 K20 + 0x90023205, // 0042 SETMBR R0 K25 R5 + 0x50140200, // 0043 LDBOOL R5 1 0 + 0x90023405, // 0044 SETMBR R0 K26 R5 + 0x80000000, // 0045 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: status_error_received +********************************************************************/ +be_local_closure(Matter_IM_Message_status_error_received, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(status_error_received), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_IM_Message_reset, /* name */ be_nested_proto( 8, /* nstack */ 4, /* argc */ @@ -148,7 +224,7 @@ be_local_closure(Matter_IM_Message_init, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[11]) { /* constants */ /* K0 */ be_nested_str_weak(resp), /* K1 */ be_nested_str_weak(build_response), /* K2 */ be_nested_str_weak(ready), @@ -159,10 +235,11 @@ be_local_closure(Matter_IM_Message_init, /* name */ /* K7 */ be_nested_str_weak(last_counter), /* K8 */ be_const_int(0), /* K9 */ be_nested_str_weak(finish), + /* K10 */ be_nested_str_weak(data), }), - be_str_weak(init), + be_str_weak(reset), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[19]) { /* code */ 0x8C100301, // 0000 GETMET R4 R1 K1 0x5C180400, // 0001 MOVE R6 R2 0x5C1C0600, // 0002 MOVE R7 R3 @@ -179,43 +256,9 @@ be_local_closure(Matter_IM_Message_init, /* name */ 0x90020F08, // 000D SETMBR R0 K7 K8 0x50100000, // 000E LDBOOL R4 0 0 0x90021204, // 000F SETMBR R0 K9 R4 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ack_received -********************************************************************/ -be_local_closure(Matter_IM_Message_ack_received, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(expiration), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(millis), - /* K3 */ be_nested_str_weak(MSG_TIMEOUT), - }), - be_str_weak(ack_received), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0xB80A0200, // 0000 GETNGBL R2 K1 - 0x8C080502, // 0001 GETMET R2 R2 K2 - 0x7C080200, // 0002 CALL R2 1 - 0x880C0103, // 0003 GETMBR R3 R0 K3 - 0x00080403, // 0004 ADD R2 R2 R3 - 0x90020002, // 0005 SETMBR R0 K0 R2 - 0x50080000, // 0006 LDBOOL R2 0 0 - 0x80040400, // 0007 RET 1 R2 + 0x4C100000, // 0010 LDNIL R4 + 0x90021404, // 0011 SETMBR R0 K10 R4 + 0x80000000, // 0012 RET 0 }) ) ); @@ -298,28 +341,65 @@ be_local_closure(Matter_IM_Message_status_ok_received, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: ack_received +********************************************************************/ +be_local_closure(Matter_IM_Message_ack_received, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(expiration), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(millis), + /* K3 */ be_nested_str_weak(MSG_TIMEOUT), + }), + be_str_weak(ack_received), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0xB80A0200, // 0000 GETNGBL R2 K1 + 0x8C080502, // 0001 GETMET R2 R2 K2 + 0x7C080200, // 0002 CALL R2 1 + 0x880C0103, // 0003 GETMBR R3 R0 K3 + 0x00080403, // 0004 ADD R2 R2 R3 + 0x90020002, // 0005 SETMBR R0 K0 R2 + 0x50080000, // 0006 LDBOOL R2 0 0 + 0x80040400, // 0007 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_IM_Message ********************************************************************/ be_local_class(Matter_IM_Message, 6, NULL, - be_nested_map(14, + be_nested_map(15, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(MSG_TIMEOUT, -1), be_const_int(5000) }, - { be_const_key_weak(data, -1), be_const_var(4) }, + { be_const_key_weak(init, 11), be_const_closure(Matter_IM_Message_init_closure) }, + { be_const_key_weak(get_exchangeid, 10), be_const_closure(Matter_IM_Message_get_exchangeid_closure) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_IM_Message_reset_closure) }, { be_const_key_weak(send_im, -1), be_const_closure(Matter_IM_Message_send_im_closure) }, - { be_const_key_weak(status_ok_received, -1), be_const_closure(Matter_IM_Message_status_ok_received_closure) }, - { be_const_key_weak(get_exchangeid, 0), be_const_closure(Matter_IM_Message_get_exchangeid_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_IM_Message_init_closure) }, - { be_const_key_weak(expiration, -1), be_const_var(0) }, - { be_const_key_weak(resp, -1), be_const_var(1) }, - { be_const_key_weak(finish, 13), be_const_var(3) }, - { be_const_key_weak(last_counter, 6), be_const_var(5) }, - { be_const_key_weak(ack_received, 9), be_const_closure(Matter_IM_Message_ack_received_closure) }, + { be_const_key_weak(status_error_received, -1), be_const_closure(Matter_IM_Message_status_error_received_closure) }, + { be_const_key_weak(finish, -1), be_const_var(3) }, + { be_const_key_weak(status_ok_received, 2), be_const_closure(Matter_IM_Message_status_ok_received_closure) }, + { be_const_key_weak(last_counter, -1), be_const_var(5) }, { be_const_key_weak(reached_timeout, -1), be_const_closure(Matter_IM_Message_reached_timeout_closure) }, - { be_const_key_weak(status_error_received, 3), be_const_closure(Matter_IM_Message_status_error_received_closure) }, - { be_const_key_weak(ready, -1), be_const_var(2) }, + { be_const_key_weak(resp, -1), be_const_var(1) }, + { be_const_key_weak(data, -1), be_const_var(4) }, + { be_const_key_weak(expiration, -1), be_const_var(0) }, + { be_const_key_weak(ready, 6), be_const_var(2) }, + { be_const_key_weak(MSG_TIMEOUT, 5), be_const_int(5000) }, + { be_const_key_weak(ack_received, -1), be_const_closure(Matter_IM_Message_ack_received_closure) }, })), be_str_weak(Matter_IM_Message) ); @@ -749,7 +829,7 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ + ( &(const bvalue[21]) { /* constants */ /* K0 */ be_nested_str_weak(ready), /* K1 */ be_nested_str_weak(data), /* K2 */ be_nested_str_weak(attribute_reports), @@ -762,18 +842,19 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ /* K9 */ be_nested_str_weak(encode_frame), /* K10 */ be_nested_str_weak(encrypt), /* K11 */ be_nested_str_weak(tasmota), - /* K12 */ be_nested_str_weak(log), - /* K13 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i), - /* K14 */ be_nested_str_weak(session), - /* K15 */ be_nested_str_weak(local_session_id), - /* K16 */ be_nested_str_weak(ack_message_counter), - /* K17 */ be_nested_str_weak(message_counter), - /* K18 */ be_nested_str_weak(send_response_frame), - /* K19 */ be_nested_str_weak(last_counter), + /* K12 */ be_nested_str_weak(loglevel), + /* K13 */ be_nested_str_weak(log), + /* K14 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i), + /* K15 */ be_nested_str_weak(session), + /* K16 */ be_nested_str_weak(local_session_id), + /* K17 */ be_nested_str_weak(ack_message_counter), + /* K18 */ be_nested_str_weak(message_counter), + /* K19 */ be_nested_str_weak(send_response_frame), + /* K20 */ be_nested_str_weak(last_counter), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[69]) { /* code */ + ( &(const binstruction[74]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x740A0001, // 0001 JMPT R2 #0004 0x50080000, // 0002 LDBOOL R2 0 0 @@ -783,7 +864,7 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0x880C0702, // 0006 GETMBR R3 R3 K2 0x7C080200, // 0007 CALL R2 1 0x24080503, // 0008 GT R2 R2 K3 - 0x780A002C, // 0009 JMPF R2 #0037 + 0x780A0031, // 0009 JMPF R2 #003C 0x88080104, // 000A GETMBR R2 R0 K4 0x780A000F, // 000B JMPF R2 #001C 0x60080003, // 000C GETGBL R2 G3 @@ -801,7 +882,7 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0x90020002, // 0018 SETMBR R0 K0 R2 0x50080000, // 0019 LDBOOL R2 0 0 0x90020C02, // 001A SETMBR R0 K6 R2 - 0x70020019, // 001B JMP #0036 + 0x7002001E, // 001B JMP #003B 0x88080107, // 001C GETMBR R2 R0 K7 0x8C080508, // 001D GETMET R2 R2 K8 0x50100000, // 001E LDBOOL R4 0 0 @@ -812,37 +893,42 @@ be_local_closure(Matter_IM_ReportDataSubscribed_send_im, /* name */ 0x7C0C0200, // 0023 CALL R3 1 0xB80E1600, // 0024 GETNGBL R3 K11 0x8C0C070C, // 0025 GETMET R3 R3 K12 - 0x60140018, // 0026 GETGBL R5 G24 - 0x5818000D, // 0027 LDCONST R6 K13 - 0x881C050E, // 0028 GETMBR R7 R2 K14 - 0x881C0F0F, // 0029 GETMBR R7 R7 K15 - 0x88200510, // 002A GETMBR R8 R2 K16 - 0x88240511, // 002B GETMBR R9 R2 K17 - 0x7C140800, // 002C CALL R5 4 - 0x541A0003, // 002D LDINT R6 4 - 0x7C0C0600, // 002E CALL R3 3 - 0x8C0C0312, // 002F GETMET R3 R1 K18 - 0x5C140400, // 0030 MOVE R5 R2 - 0x7C0C0400, // 0031 CALL R3 2 - 0x880C0511, // 0032 GETMBR R3 R2 K17 - 0x90022603, // 0033 SETMBR R0 K19 R3 - 0x500C0200, // 0034 LDBOOL R3 1 0 - 0x90020C03, // 0035 SETMBR R0 K6 R3 - 0x7002000C, // 0036 JMP #0044 - 0x88080104, // 0037 GETMBR R2 R0 K4 - 0x780A0008, // 0038 JMPF R2 #0042 - 0x60080003, // 0039 GETGBL R2 G3 - 0x5C0C0000, // 003A MOVE R3 R0 - 0x7C080200, // 003B CALL R2 1 - 0x8C080505, // 003C GETMET R2 R2 K5 - 0x5C100200, // 003D MOVE R4 R1 - 0x7C080400, // 003E CALL R2 2 - 0x50080000, // 003F LDBOOL R2 0 0 - 0x90020802, // 0040 SETMBR R0 K4 R2 - 0x70020001, // 0041 JMP #0044 - 0x50080200, // 0042 LDBOOL R2 1 0 - 0x90020C02, // 0043 SETMBR R0 K6 R2 - 0x80000000, // 0044 RET 0 + 0x54160003, // 0026 LDINT R5 4 + 0x7C0C0400, // 0027 CALL R3 2 + 0x780E000A, // 0028 JMPF R3 #0034 + 0xB80E1600, // 0029 GETNGBL R3 K11 + 0x8C0C070D, // 002A GETMET R3 R3 K13 + 0x60140018, // 002B GETGBL R5 G24 + 0x5818000E, // 002C LDCONST R6 K14 + 0x881C050F, // 002D GETMBR R7 R2 K15 + 0x881C0F10, // 002E GETMBR R7 R7 K16 + 0x88200511, // 002F GETMBR R8 R2 K17 + 0x88240512, // 0030 GETMBR R9 R2 K18 + 0x7C140800, // 0031 CALL R5 4 + 0x541A0003, // 0032 LDINT R6 4 + 0x7C0C0600, // 0033 CALL R3 3 + 0x8C0C0313, // 0034 GETMET R3 R1 K19 + 0x5C140400, // 0035 MOVE R5 R2 + 0x7C0C0400, // 0036 CALL R3 2 + 0x880C0512, // 0037 GETMBR R3 R2 K18 + 0x90022803, // 0038 SETMBR R0 K20 R3 + 0x500C0200, // 0039 LDBOOL R3 1 0 + 0x90020C03, // 003A SETMBR R0 K6 R3 + 0x7002000C, // 003B JMP #0049 + 0x88080104, // 003C GETMBR R2 R0 K4 + 0x780A0008, // 003D JMPF R2 #0047 + 0x60080003, // 003E GETGBL R2 G3 + 0x5C0C0000, // 003F MOVE R3 R0 + 0x7C080200, // 0040 CALL R2 1 + 0x8C080505, // 0041 GETMET R2 R2 K5 + 0x5C100200, // 0042 MOVE R4 R1 + 0x7C080400, // 0043 CALL R2 2 + 0x50080000, // 0044 LDBOOL R2 0 0 + 0x90020802, // 0045 SETMBR R0 K4 R2 + 0x70020001, // 0046 JMP #0049 + 0x50080200, // 0047 LDBOOL R2 1 0 + 0x90020C02, // 0048 SETMBR R0 K6 R2 + 0x80000000, // 0049 RET 0 }) ) ); @@ -1343,38 +1429,44 @@ be_local_closure(Matter_IM_SubscribeResponse_status_ok_received, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X3ESub_OK_X20_X20_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), - /* K3 */ be_nested_str_weak(session), - /* K4 */ be_nested_str_weak(local_session_id), - /* K5 */ be_nested_str_weak(sub), - /* K6 */ be_nested_str_weak(subscription_id), - /* K7 */ be_const_int(3), - /* K8 */ be_nested_str_weak(status_ok_received), + /* K1 */ be_nested_str_weak(loglevel), + /* K2 */ be_const_int(3), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20_X3ESub_OK_X20_X20_X20_X20_X28_X256i_X29_X20sub_X3D_X25i), + /* K5 */ be_nested_str_weak(session), + /* K6 */ be_nested_str_weak(local_session_id), + /* K7 */ be_nested_str_weak(sub), + /* K8 */ be_nested_str_weak(subscription_id), + /* K9 */ be_nested_str_weak(status_ok_received), }), be_str_weak(status_ok_received), &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ + ( &(const binstruction[23]) { /* code */ 0xB80A0000, // 0000 GETNGBL R2 K0 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x60100018, // 0002 GETGBL R4 G24 - 0x58140002, // 0003 LDCONST R5 K2 - 0x88180303, // 0004 GETMBR R6 R1 K3 - 0x88180D04, // 0005 GETMBR R6 R6 K4 - 0x881C0105, // 0006 GETMBR R7 R0 K5 - 0x881C0F06, // 0007 GETMBR R7 R7 K6 - 0x7C100600, // 0008 CALL R4 3 - 0x58140007, // 0009 LDCONST R5 K7 - 0x7C080600, // 000A CALL R2 3 - 0x60080003, // 000B GETGBL R2 G3 - 0x5C0C0000, // 000C MOVE R3 R0 - 0x7C080200, // 000D CALL R2 1 - 0x8C080508, // 000E GETMET R2 R2 K8 - 0x5C100200, // 000F MOVE R4 R1 - 0x7C080400, // 0010 CALL R2 2 - 0x80040400, // 0011 RET 1 R2 + 0x58100002, // 0002 LDCONST R4 K2 + 0x7C080400, // 0003 CALL R2 2 + 0x780A000A, // 0004 JMPF R2 #0010 + 0xB80A0000, // 0005 GETNGBL R2 K0 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x60100018, // 0007 GETGBL R4 G24 + 0x58140004, // 0008 LDCONST R5 K4 + 0x88180305, // 0009 GETMBR R6 R1 K5 + 0x88180D06, // 000A GETMBR R6 R6 K6 + 0x881C0107, // 000B GETMBR R7 R0 K7 + 0x881C0F08, // 000C GETMBR R7 R7 K8 + 0x7C100600, // 000D CALL R4 3 + 0x58140002, // 000E LDCONST R5 K2 + 0x7C080600, // 000F CALL R2 3 + 0x60080003, // 0010 GETGBL R2 G3 + 0x5C0C0000, // 0011 MOVE R3 R0 + 0x7C080200, // 0012 CALL R2 1 + 0x8C080509, // 0013 GETMET R2 R2 K9 + 0x5C100200, // 0014 MOVE R4 R1 + 0x7C080400, // 0015 CALL R2 2 + 0x80040400, // 0016 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h index f4c65420e..08f9cf707 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Message.h @@ -12,16 +12,16 @@ extern const bclass be_class_Matter_Frame; be_local_closure(Matter_Frame_encode_frame, /* name */ be_nested_proto( 7, /* nstack */ - 2, /* argc */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ - /* K0 */ be_nested_str_weak(flags), - /* K1 */ be_const_int(0), + ( &(const bvalue[29]) { /* constants */ + /* K0 */ be_const_int(0), + /* K1 */ be_nested_str_weak(flags), /* K2 */ be_nested_str_weak(flag_s), /* K3 */ be_nested_str_weak(flag_dsiz), /* K4 */ be_const_int(3), @@ -48,158 +48,166 @@ be_local_closure(Matter_Frame_encode_frame, /* name */ /* K25 */ be_nested_str_weak(protocol_id), /* K26 */ be_nested_str_weak(ack_message_counter), /* K27 */ be_nested_str_weak(app_payload_idx), - /* K28 */ be_nested_str_weak(debug), - /* K29 */ be_nested_str_weak(raw), + /* K28 */ be_nested_str_weak(raw), }), be_str_weak(encode_frame), &be_const_str_solidified, - ( &(const binstruction[146]) { /* code */ - 0x60080015, // 0000 GETGBL R2 G21 - 0x7C080000, // 0001 CALL R2 0 - 0x880C0100, // 0002 GETMBR R3 R0 K0 - 0x4C100000, // 0003 LDNIL R4 - 0x1C0C0604, // 0004 EQ R3 R3 R4 - 0x780E000D, // 0005 JMPF R3 #0014 - 0x90020101, // 0006 SETMBR R0 K0 K1 - 0x880C0102, // 0007 GETMBR R3 R0 K2 - 0x780E0003, // 0008 JMPF R3 #000D - 0x880C0100, // 0009 GETMBR R3 R0 K0 - 0x54120003, // 000A LDINT R4 4 - 0x300C0604, // 000B OR R3 R3 R4 - 0x90020003, // 000C SETMBR R0 K0 R3 - 0x880C0103, // 000D GETMBR R3 R0 K3 - 0x780E0004, // 000E JMPF R3 #0014 - 0x880C0100, // 000F GETMBR R3 R0 K0 - 0x88100103, // 0010 GETMBR R4 R0 K3 - 0x2C100904, // 0011 AND R4 R4 K4 - 0x300C0604, // 0012 OR R3 R3 R4 - 0x90020003, // 0013 SETMBR R0 K0 R3 - 0x8C0C0505, // 0014 GETMET R3 R2 K5 - 0x88140100, // 0015 GETMBR R5 R0 K0 - 0x58180006, // 0016 LDCONST R6 K6 - 0x7C0C0600, // 0017 CALL R3 3 - 0x8C0C0505, // 0018 GETMET R3 R2 K5 - 0x88140107, // 0019 GETMBR R5 R0 K7 - 0x78160001, // 001A JMPF R5 #001D - 0x88140107, // 001B GETMBR R5 R0 K7 - 0x70020000, // 001C JMP #001E - 0x58140001, // 001D LDCONST R5 K1 - 0x58180008, // 001E LDCONST R6 K8 - 0x7C0C0600, // 001F CALL R3 3 - 0x880C0109, // 0020 GETMBR R3 R0 K9 - 0x4C100000, // 0021 LDNIL R4 - 0x1C0C0604, // 0022 EQ R3 R3 R4 - 0x780E0013, // 0023 JMPF R3 #0038 - 0x90021301, // 0024 SETMBR R0 K9 K1 - 0x880C010A, // 0025 GETMBR R3 R0 K10 - 0x780E0003, // 0026 JMPF R3 #002B - 0x880C0109, // 0027 GETMBR R3 R0 K9 - 0x5412007F, // 0028 LDINT R4 128 - 0x300C0604, // 0029 OR R3 R3 R4 - 0x90021203, // 002A SETMBR R0 K9 R3 - 0x880C010B, // 002B GETMBR R3 R0 K11 - 0x780E0003, // 002C JMPF R3 #0031 - 0x880C0109, // 002D GETMBR R3 R0 K9 - 0x5412003F, // 002E LDINT R4 64 - 0x300C0604, // 002F OR R3 R3 R4 - 0x90021203, // 0030 SETMBR R0 K9 R3 - 0x880C010C, // 0031 GETMBR R3 R0 K12 - 0x780E0004, // 0032 JMPF R3 #0038 + ( &(const binstruction[155]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x1C0C0403, // 0001 EQ R3 R2 R3 + 0x780E000A, // 0002 JMPF R3 #000E + 0x600C0015, // 0003 GETGBL R3 G21 + 0x5412000F, // 0004 LDINT R4 16 + 0x78060003, // 0005 JMPF R1 #000A + 0x6014000C, // 0006 GETGBL R5 G12 + 0x5C180200, // 0007 MOVE R6 R1 + 0x7C140200, // 0008 CALL R5 1 + 0x70020000, // 0009 JMP #000B + 0x58140000, // 000A LDCONST R5 K0 + 0x00100805, // 000B ADD R4 R4 R5 + 0x7C0C0200, // 000C CALL R3 1 + 0x5C080600, // 000D MOVE R2 R3 + 0x880C0101, // 000E GETMBR R3 R0 K1 + 0x4C100000, // 000F LDNIL R4 + 0x1C0C0604, // 0010 EQ R3 R3 R4 + 0x780E000D, // 0011 JMPF R3 #0020 + 0x90020300, // 0012 SETMBR R0 K1 K0 + 0x880C0102, // 0013 GETMBR R3 R0 K2 + 0x780E0003, // 0014 JMPF R3 #0019 + 0x880C0101, // 0015 GETMBR R3 R0 K1 + 0x54120003, // 0016 LDINT R4 4 + 0x300C0604, // 0017 OR R3 R3 R4 + 0x90020203, // 0018 SETMBR R0 K1 R3 + 0x880C0103, // 0019 GETMBR R3 R0 K3 + 0x780E0004, // 001A JMPF R3 #0020 + 0x880C0101, // 001B GETMBR R3 R0 K1 + 0x88100103, // 001C GETMBR R4 R0 K3 + 0x2C100904, // 001D AND R4 R4 K4 + 0x300C0604, // 001E OR R3 R3 R4 + 0x90020203, // 001F SETMBR R0 K1 R3 + 0x8C0C0505, // 0020 GETMET R3 R2 K5 + 0x88140101, // 0021 GETMBR R5 R0 K1 + 0x58180006, // 0022 LDCONST R6 K6 + 0x7C0C0600, // 0023 CALL R3 3 + 0x8C0C0505, // 0024 GETMET R3 R2 K5 + 0x88140107, // 0025 GETMBR R5 R0 K7 + 0x78160001, // 0026 JMPF R5 #0029 + 0x88140107, // 0027 GETMBR R5 R0 K7 + 0x70020000, // 0028 JMP #002A + 0x58140000, // 0029 LDCONST R5 K0 + 0x58180008, // 002A LDCONST R6 K8 + 0x7C0C0600, // 002B CALL R3 3 + 0x880C0109, // 002C GETMBR R3 R0 K9 + 0x4C100000, // 002D LDNIL R4 + 0x1C0C0604, // 002E EQ R3 R3 R4 + 0x780E0013, // 002F JMPF R3 #0044 + 0x90021300, // 0030 SETMBR R0 K9 K0 + 0x880C010A, // 0031 GETMBR R3 R0 K10 + 0x780E0003, // 0032 JMPF R3 #0037 0x880C0109, // 0033 GETMBR R3 R0 K9 - 0x8810010C, // 0034 GETMBR R4 R0 K12 - 0x2C100904, // 0035 AND R4 R4 K4 - 0x300C0604, // 0036 OR R3 R3 R4 - 0x90021203, // 0037 SETMBR R0 K9 R3 - 0x8C0C0505, // 0038 GETMET R3 R2 K5 - 0x88140109, // 0039 GETMBR R5 R0 K9 - 0x58180006, // 003A LDCONST R6 K6 - 0x7C0C0600, // 003B CALL R3 3 - 0x8C0C0505, // 003C GETMET R3 R2 K5 - 0x8814010D, // 003D GETMBR R5 R0 K13 - 0x541A0003, // 003E LDINT R6 4 - 0x7C0C0600, // 003F CALL R3 3 - 0x880C0102, // 0040 GETMBR R3 R0 K2 - 0x780E0001, // 0041 JMPF R3 #0044 - 0x880C010E, // 0042 GETMBR R3 R0 K14 - 0x400C0403, // 0043 CONNECT R3 R2 R3 - 0x880C0103, // 0044 GETMBR R3 R0 K3 - 0x1C0C0706, // 0045 EQ R3 R3 K6 - 0x780E0001, // 0046 JMPF R3 #0049 - 0x880C010F, // 0047 GETMBR R3 R0 K15 - 0x400C0403, // 0048 CONNECT R3 R2 R3 - 0x880C0103, // 0049 GETMBR R3 R0 K3 - 0x1C0C0708, // 004A EQ R3 R3 K8 - 0x780E0003, // 004B JMPF R3 #0050 - 0x8C0C0505, // 004C GETMET R3 R2 K5 - 0x88140110, // 004D GETMBR R5 R0 K16 - 0x58180008, // 004E LDCONST R6 K8 - 0x7C0C0600, // 004F CALL R3 3 - 0x600C000C, // 0050 GETGBL R3 G12 - 0x5C100400, // 0051 MOVE R4 R2 - 0x7C0C0200, // 0052 CALL R3 1 - 0x90022203, // 0053 SETMBR R0 K17 R3 - 0x880C0112, // 0054 GETMBR R3 R0 K18 - 0x4C100000, // 0055 LDNIL R4 - 0x1C0C0604, // 0056 EQ R3 R3 R4 - 0x780E0016, // 0057 JMPF R3 #006F - 0x90022501, // 0058 SETMBR R0 K18 K1 - 0x880C0113, // 0059 GETMBR R3 R0 K19 - 0x780E0003, // 005A JMPF R3 #005F - 0x880C0112, // 005B GETMBR R3 R0 K18 - 0x5412000F, // 005C LDINT R4 16 - 0x300C0604, // 005D OR R3 R3 R4 - 0x90022403, // 005E SETMBR R0 K18 R3 - 0x880C0114, // 005F GETMBR R3 R0 K20 - 0x780E0003, // 0060 JMPF R3 #0065 - 0x880C0112, // 0061 GETMBR R3 R0 K18 - 0x54120003, // 0062 LDINT R4 4 - 0x300C0604, // 0063 OR R3 R3 R4 - 0x90022403, // 0064 SETMBR R0 K18 R3 - 0x880C0115, // 0065 GETMBR R3 R0 K21 - 0x780E0002, // 0066 JMPF R3 #006A + 0x5412007F, // 0034 LDINT R4 128 + 0x300C0604, // 0035 OR R3 R3 R4 + 0x90021203, // 0036 SETMBR R0 K9 R3 + 0x880C010B, // 0037 GETMBR R3 R0 K11 + 0x780E0003, // 0038 JMPF R3 #003D + 0x880C0109, // 0039 GETMBR R3 R0 K9 + 0x5412003F, // 003A LDINT R4 64 + 0x300C0604, // 003B OR R3 R3 R4 + 0x90021203, // 003C SETMBR R0 K9 R3 + 0x880C010C, // 003D GETMBR R3 R0 K12 + 0x780E0004, // 003E JMPF R3 #0044 + 0x880C0109, // 003F GETMBR R3 R0 K9 + 0x8810010C, // 0040 GETMBR R4 R0 K12 + 0x2C100904, // 0041 AND R4 R4 K4 + 0x300C0604, // 0042 OR R3 R3 R4 + 0x90021203, // 0043 SETMBR R0 K9 R3 + 0x8C0C0505, // 0044 GETMET R3 R2 K5 + 0x88140109, // 0045 GETMBR R5 R0 K9 + 0x58180006, // 0046 LDCONST R6 K6 + 0x7C0C0600, // 0047 CALL R3 3 + 0x8C0C0505, // 0048 GETMET R3 R2 K5 + 0x8814010D, // 0049 GETMBR R5 R0 K13 + 0x541A0003, // 004A LDINT R6 4 + 0x7C0C0600, // 004B CALL R3 3 + 0x880C0102, // 004C GETMBR R3 R0 K2 + 0x780E0001, // 004D JMPF R3 #0050 + 0x880C010E, // 004E GETMBR R3 R0 K14 + 0x400C0403, // 004F CONNECT R3 R2 R3 + 0x880C0103, // 0050 GETMBR R3 R0 K3 + 0x1C0C0706, // 0051 EQ R3 R3 K6 + 0x780E0001, // 0052 JMPF R3 #0055 + 0x880C010F, // 0053 GETMBR R3 R0 K15 + 0x400C0403, // 0054 CONNECT R3 R2 R3 + 0x880C0103, // 0055 GETMBR R3 R0 K3 + 0x1C0C0708, // 0056 EQ R3 R3 K8 + 0x780E0003, // 0057 JMPF R3 #005C + 0x8C0C0505, // 0058 GETMET R3 R2 K5 + 0x88140110, // 0059 GETMBR R5 R0 K16 + 0x58180008, // 005A LDCONST R6 K8 + 0x7C0C0600, // 005B CALL R3 3 + 0x600C000C, // 005C GETGBL R3 G12 + 0x5C100400, // 005D MOVE R4 R2 + 0x7C0C0200, // 005E CALL R3 1 + 0x90022203, // 005F SETMBR R0 K17 R3 + 0x880C0112, // 0060 GETMBR R3 R0 K18 + 0x4C100000, // 0061 LDNIL R4 + 0x1C0C0604, // 0062 EQ R3 R3 R4 + 0x780E0016, // 0063 JMPF R3 #007B + 0x90022500, // 0064 SETMBR R0 K18 K0 + 0x880C0113, // 0065 GETMBR R3 R0 K19 + 0x780E0003, // 0066 JMPF R3 #006B 0x880C0112, // 0067 GETMBR R3 R0 K18 - 0x300C0708, // 0068 OR R3 R3 K8 - 0x90022403, // 0069 SETMBR R0 K18 R3 - 0x880C0116, // 006A GETMBR R3 R0 K22 - 0x780E0002, // 006B JMPF R3 #006F - 0x880C0112, // 006C GETMBR R3 R0 K18 - 0x300C0706, // 006D OR R3 R3 K6 - 0x90022403, // 006E SETMBR R0 K18 R3 - 0x8C0C0505, // 006F GETMET R3 R2 K5 - 0x88140112, // 0070 GETMBR R5 R0 K18 - 0x58180006, // 0071 LDCONST R6 K6 - 0x7C0C0600, // 0072 CALL R3 3 - 0x8C0C0505, // 0073 GETMET R3 R2 K5 - 0x88140117, // 0074 GETMBR R5 R0 K23 - 0x58180006, // 0075 LDCONST R6 K6 - 0x7C0C0600, // 0076 CALL R3 3 - 0x8C0C0505, // 0077 GETMET R3 R2 K5 - 0x88140118, // 0078 GETMBR R5 R0 K24 - 0x541AFFFE, // 0079 LDINT R6 65535 - 0x2C140A06, // 007A AND R5 R5 R6 - 0x58180008, // 007B LDCONST R6 K8 - 0x7C0C0600, // 007C CALL R3 3 - 0x8C0C0505, // 007D GETMET R3 R2 K5 - 0x88140119, // 007E GETMBR R5 R0 K25 - 0x58180008, // 007F LDCONST R6 K8 - 0x7C0C0600, // 0080 CALL R3 3 - 0x880C0115, // 0081 GETMBR R3 R0 K21 - 0x780E0003, // 0082 JMPF R3 #0087 + 0x5412000F, // 0068 LDINT R4 16 + 0x300C0604, // 0069 OR R3 R3 R4 + 0x90022403, // 006A SETMBR R0 K18 R3 + 0x880C0114, // 006B GETMBR R3 R0 K20 + 0x780E0003, // 006C JMPF R3 #0071 + 0x880C0112, // 006D GETMBR R3 R0 K18 + 0x54120003, // 006E LDINT R4 4 + 0x300C0604, // 006F OR R3 R3 R4 + 0x90022403, // 0070 SETMBR R0 K18 R3 + 0x880C0115, // 0071 GETMBR R3 R0 K21 + 0x780E0002, // 0072 JMPF R3 #0076 + 0x880C0112, // 0073 GETMBR R3 R0 K18 + 0x300C0708, // 0074 OR R3 R3 K8 + 0x90022403, // 0075 SETMBR R0 K18 R3 + 0x880C0116, // 0076 GETMBR R3 R0 K22 + 0x780E0002, // 0077 JMPF R3 #007B + 0x880C0112, // 0078 GETMBR R3 R0 K18 + 0x300C0706, // 0079 OR R3 R3 K6 + 0x90022403, // 007A SETMBR R0 K18 R3 + 0x8C0C0505, // 007B GETMET R3 R2 K5 + 0x88140112, // 007C GETMBR R5 R0 K18 + 0x58180006, // 007D LDCONST R6 K6 + 0x7C0C0600, // 007E CALL R3 3 + 0x8C0C0505, // 007F GETMET R3 R2 K5 + 0x88140117, // 0080 GETMBR R5 R0 K23 + 0x58180006, // 0081 LDCONST R6 K6 + 0x7C0C0600, // 0082 CALL R3 3 0x8C0C0505, // 0083 GETMET R3 R2 K5 - 0x8814011A, // 0084 GETMBR R5 R0 K26 - 0x541A0003, // 0085 LDINT R6 4 - 0x7C0C0600, // 0086 CALL R3 3 - 0x600C000C, // 0087 GETGBL R3 G12 - 0x5C100400, // 0088 MOVE R4 R2 - 0x7C0C0200, // 0089 CALL R3 1 - 0x90023603, // 008A SETMBR R0 K27 R3 - 0x78060000, // 008B JMPF R1 #008D - 0x400C0401, // 008C CONNECT R3 R2 R1 - 0x8C0C011C, // 008D GETMET R3 R0 K28 - 0x5C140400, // 008E MOVE R5 R2 - 0x7C0C0400, // 008F CALL R3 2 - 0x90023A02, // 0090 SETMBR R0 K29 R2 - 0x80040400, // 0091 RET 1 R2 + 0x88140118, // 0084 GETMBR R5 R0 K24 + 0x541AFFFE, // 0085 LDINT R6 65535 + 0x2C140A06, // 0086 AND R5 R5 R6 + 0x58180008, // 0087 LDCONST R6 K8 + 0x7C0C0600, // 0088 CALL R3 3 + 0x8C0C0505, // 0089 GETMET R3 R2 K5 + 0x88140119, // 008A GETMBR R5 R0 K25 + 0x58180008, // 008B LDCONST R6 K8 + 0x7C0C0600, // 008C CALL R3 3 + 0x880C0115, // 008D GETMBR R3 R0 K21 + 0x780E0003, // 008E JMPF R3 #0093 + 0x8C0C0505, // 008F GETMET R3 R2 K5 + 0x8814011A, // 0090 GETMBR R5 R0 K26 + 0x541A0003, // 0091 LDINT R6 4 + 0x7C0C0600, // 0092 CALL R3 3 + 0x600C000C, // 0093 GETGBL R3 G12 + 0x5C100400, // 0094 MOVE R4 R2 + 0x7C0C0200, // 0095 CALL R3 1 + 0x90023603, // 0096 SETMBR R0 K27 R3 + 0x78060000, // 0097 JMPF R1 #0099 + 0x400C0401, // 0098 CONNECT R3 R2 R1 + 0x90023802, // 0099 SETMBR R0 K28 R2 + 0x80040400, // 009A RET 1 R2 }) ) ); @@ -211,7 +219,7 @@ be_local_closure(Matter_Frame_encode_frame, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_encrypt, /* name */ be_nested_proto( - 15, /* nstack */ + 23, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -219,85 +227,92 @@ be_local_closure(Matter_Frame_encrypt, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ + ( &(const bvalue[18]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(raw), /* K2 */ be_nested_str_weak(session), - /* K3 */ be_nested_str_weak(get_r2i), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(payload_idx), - /* K6 */ be_const_int(1), - /* K7 */ be_const_int(2147483647), + /* K3 */ be_nested_str_weak(payload_idx), + /* K4 */ be_nested_str_weak(get_r2i), + /* K5 */ be_nested_str_weak(message_handler), + /* K6 */ be_nested_str_weak(_n_bytes), + /* K7 */ be_nested_str_weak(clear), /* K8 */ be_nested_str_weak(add), /* K9 */ be_nested_str_weak(flags), - /* K10 */ be_nested_str_weak(message_counter), - /* K11 */ be_nested_str_weak(is_CASE), - /* K12 */ be_nested_str_weak(get_device_id), - /* K13 */ be_nested_str_weak(resize), - /* K14 */ be_nested_str_weak(AES_CCM), - /* K15 */ be_nested_str_weak(encrypt), - /* K16 */ be_nested_str_weak(tag), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(message_counter), + /* K12 */ be_nested_str_weak(is_CASE), + /* K13 */ be_nested_str_weak(get_device_id), + /* K14 */ be_nested_str_weak(resize), + /* K15 */ be_nested_str_weak(AES_CCM), + /* K16 */ be_nested_str_weak(encrypt1), + /* K17 */ be_const_int(0), }), be_str_weak(encrypt), &be_const_str_solidified, - ( &(const binstruction[57]) { /* code */ + ( &(const binstruction[63]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x8C100703, // 0003 GETMET R4 R3 K3 - 0x7C100200, // 0004 CALL R4 1 - 0x88140105, // 0005 GETMBR R5 R0 K5 - 0x04140B06, // 0006 SUB R5 R5 K6 - 0x40160805, // 0007 CONNECT R5 K4 R5 - 0x94140405, // 0008 GETIDX R5 R2 R5 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x40180D07, // 000A CONNECT R6 R6 K7 - 0x94180406, // 000B GETIDX R6 R2 R6 - 0x601C0015, // 000C GETGBL R7 G21 - 0x7C1C0000, // 000D CALL R7 0 - 0x8C200F08, // 000E GETMET R8 R7 K8 - 0x88280109, // 000F GETMBR R10 R0 K9 - 0x582C0006, // 0010 LDCONST R11 K6 - 0x7C200600, // 0011 CALL R8 3 - 0x8C200F08, // 0012 GETMET R8 R7 K8 - 0x8828010A, // 0013 GETMBR R10 R0 K10 - 0x542E0003, // 0014 LDINT R11 4 - 0x7C200600, // 0015 CALL R8 3 - 0x8C20070B, // 0016 GETMET R8 R3 K11 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x5416000F, // 0004 LDINT R5 16 + 0x8C180704, // 0005 GETMET R6 R3 K4 + 0x7C180200, // 0006 CALL R6 1 + 0x881C0105, // 0007 GETMBR R7 R0 K5 + 0x881C0F06, // 0008 GETMBR R7 R7 K6 + 0x8C200F07, // 0009 GETMET R8 R7 K7 + 0x7C200200, // 000A CALL R8 1 + 0x8C200F08, // 000B GETMET R8 R7 K8 + 0x88280109, // 000C GETMBR R10 R0 K9 + 0x582C000A, // 000D LDCONST R11 K10 + 0x7C200600, // 000E CALL R8 3 + 0x8C200F08, // 000F GETMET R8 R7 K8 + 0x8828010B, // 0010 GETMBR R10 R0 K11 + 0x542E0003, // 0011 LDINT R11 4 + 0x7C200600, // 0012 CALL R8 3 + 0x8C20070C, // 0013 GETMET R8 R3 K12 + 0x7C200200, // 0014 CALL R8 1 + 0x78220005, // 0015 JMPF R8 #001C + 0x8C20070D, // 0016 GETMET R8 R3 K13 0x7C200200, // 0017 CALL R8 1 - 0x78220005, // 0018 JMPF R8 #001F - 0x8C20070C, // 0019 GETMET R8 R3 K12 + 0x78220002, // 0018 JMPF R8 #001C + 0x8C20070D, // 0019 GETMET R8 R3 K13 0x7C200200, // 001A CALL R8 1 - 0x78220002, // 001B JMPF R8 #001F - 0x8C20070C, // 001C GETMET R8 R3 K12 - 0x7C200200, // 001D CALL R8 1 - 0x40200E08, // 001E CONNECT R8 R7 R8 - 0x8C200F0D, // 001F GETMET R8 R7 K13 - 0x542A000C, // 0020 LDINT R10 13 - 0x7C200400, // 0021 CALL R8 2 - 0x8C20030E, // 0022 GETMET R8 R1 K14 - 0x5C280800, // 0023 MOVE R10 R4 - 0x5C2C0E00, // 0024 MOVE R11 R7 - 0x5C300A00, // 0025 MOVE R12 R5 - 0x6034000C, // 0026 GETGBL R13 G12 - 0x5C380C00, // 0027 MOVE R14 R6 - 0x7C340200, // 0028 CALL R13 1 - 0x543A000F, // 0029 LDINT R14 16 - 0x7C200C00, // 002A CALL R8 6 - 0x8C24110F, // 002B GETMET R9 R8 K15 - 0x5C2C0C00, // 002C MOVE R11 R6 - 0x7C240400, // 002D CALL R9 2 - 0x8C281110, // 002E GETMET R10 R8 K16 - 0x7C280200, // 002F CALL R10 1 - 0x882C0101, // 0030 GETMBR R11 R0 K1 - 0x8C2C170D, // 0031 GETMET R11 R11 K13 - 0x88340105, // 0032 GETMBR R13 R0 K5 - 0x7C2C0400, // 0033 CALL R11 2 - 0x882C0101, // 0034 GETMBR R11 R0 K1 - 0x402C1609, // 0035 CONNECT R11 R11 R9 - 0x882C0101, // 0036 GETMBR R11 R0 K1 - 0x402C160A, // 0037 CONNECT R11 R11 R10 - 0x80000000, // 0038 RET 0 + 0x40200E08, // 001B CONNECT R8 R7 R8 + 0x8C200F0E, // 001C GETMET R8 R7 K14 + 0x542A000C, // 001D LDINT R10 13 + 0x7C200400, // 001E CALL R8 2 + 0x8C20050E, // 001F GETMET R8 R2 K14 + 0x6028000C, // 0020 GETGBL R10 G12 + 0x5C2C0400, // 0021 MOVE R11 R2 + 0x7C280200, // 0022 CALL R10 1 + 0x00281405, // 0023 ADD R10 R10 R5 + 0x7C200400, // 0024 CALL R8 2 + 0x8820030F, // 0025 GETMBR R8 R1 K15 + 0x8C201110, // 0026 GETMET R8 R8 K16 + 0x5C280C00, // 0027 MOVE R10 R6 + 0x5C2C0E00, // 0028 MOVE R11 R7 + 0x58300011, // 0029 LDCONST R12 K17 + 0x6034000C, // 002A GETGBL R13 G12 + 0x5C380E00, // 002B MOVE R14 R7 + 0x7C340200, // 002C CALL R13 1 + 0x5C380400, // 002D MOVE R14 R2 + 0x583C0011, // 002E LDCONST R15 K17 + 0x5C400800, // 002F MOVE R16 R4 + 0x5C440400, // 0030 MOVE R17 R2 + 0x5C480800, // 0031 MOVE R18 R4 + 0x604C000C, // 0032 GETGBL R19 G12 + 0x5C500400, // 0033 MOVE R20 R2 + 0x7C4C0200, // 0034 CALL R19 1 + 0x044C2604, // 0035 SUB R19 R19 R4 + 0x044C2605, // 0036 SUB R19 R19 R5 + 0x5C500400, // 0037 MOVE R20 R2 + 0x6054000C, // 0038 GETGBL R21 G12 + 0x5C580400, // 0039 MOVE R22 R2 + 0x7C540200, // 003A CALL R21 1 + 0x04542A05, // 003B SUB R21 R21 R5 + 0x5C580A00, // 003C MOVE R22 R5 + 0x7C201C00, // 003D CALL R8 14 + 0x80000000, // 003E RET 0 }) ) ); @@ -1011,7 +1026,7 @@ be_local_closure(Matter_Frame_decode_payload, /* name */ ********************************************************************/ be_local_closure(Matter_Frame_decrypt, /* name */ be_nested_proto( - 16, /* nstack */ + 23, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1019,11 +1034,11 @@ be_local_closure(Matter_Frame_decrypt, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[30]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(session), /* K2 */ be_nested_str_weak(raw), - /* K3 */ be_const_int(2147483647), + /* K3 */ be_nested_str_weak(payload_idx), /* K4 */ be_nested_str_weak(get_i2r), /* K5 */ be_nested_str_weak(sec_p), /* K6 */ be_nested_str_weak(tasmota), @@ -1031,131 +1046,145 @@ be_local_closure(Matter_Frame_decrypt, /* name */ /* K8 */ be_nested_str_weak(MTR_X3A_X20_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X3E_X20Compute_X20Privacy_X20TODO), /* K9 */ be_const_int(2), /* K10 */ be_nested_str_weak(get_i2r_privacy), - /* K11 */ be_nested_str_weak(add), - /* K12 */ be_nested_str_weak(local_session_id), - /* K13 */ be_nested_str_weak(payload_idx), + /* K11 */ be_const_int(2147483647), + /* K12 */ be_nested_str_weak(add), + /* K13 */ be_nested_str_weak(local_session_id), /* K14 */ be_const_int(1), /* K15 */ be_nested_str_weak(AES_CTR), /* K16 */ be_nested_str_weak(decrypt), /* K17 */ be_const_int(0), /* K18 */ be_const_int(3), - /* K19 */ be_nested_str_weak(flags), - /* K20 */ be_nested_str_weak(message_counter), - /* K21 */ be_nested_str_weak(source_node_id), - /* K22 */ be_nested_str_weak(peer_node_id), - /* K23 */ be_nested_str_weak(resize), - /* K24 */ be_nested_str_weak(AES_CCM), - /* K25 */ be_nested_str_weak(tag), - /* K26 */ be_nested_str_weak(MTR_X3A_X20rejected_X20packet_X20due_X20to_X20invalid_X20MIC), + /* K19 */ be_nested_str_weak(message_handler), + /* K20 */ be_nested_str_weak(_n_bytes), + /* K21 */ be_nested_str_weak(clear), + /* K22 */ be_nested_str_weak(flags), + /* K23 */ be_nested_str_weak(message_counter), + /* K24 */ be_nested_str_weak(source_node_id), + /* K25 */ be_nested_str_weak(peer_node_id), + /* K26 */ be_nested_str_weak(resize), + /* K27 */ be_nested_str_weak(AES_CCM), + /* K28 */ be_nested_str_weak(decrypt1), + /* K29 */ be_nested_str_weak(MTR_X3A_X20rejected_X20packet_X20due_X20to_X20invalid_X20MIC), }), be_str_weak(decrypt), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ + ( &(const binstruction[116]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x88080101, // 0001 GETMBR R2 R0 K1 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x5411FFEF, // 0003 LDINT R4 -16 - 0x40100903, // 0004 CONNECT R4 R4 K3 - 0x94100604, // 0005 GETIDX R4 R3 R4 - 0x8C140504, // 0006 GETMET R5 R2 K4 - 0x7C140200, // 0007 CALL R5 1 - 0x88180105, // 0008 GETMBR R6 R0 K5 - 0x781A0029, // 0009 JMPF R6 #0034 - 0xB81A0C00, // 000A GETNGBL R6 K6 - 0x8C180D07, // 000B GETMET R6 R6 K7 - 0x58200008, // 000C LDCONST R8 K8 - 0x58240009, // 000D LDCONST R9 K9 - 0x7C180600, // 000E CALL R6 3 - 0x8C18050A, // 000F GETMET R6 R2 K10 - 0x7C180200, // 0010 CALL R6 1 - 0x601C0015, // 0011 GETGBL R7 G21 - 0x7C1C0000, // 0012 CALL R7 0 - 0x8C1C0F0B, // 0013 GETMET R7 R7 K11 - 0x8824010C, // 0014 GETMBR R9 R0 K12 - 0x5429FFFD, // 0015 LDINT R10 -2 - 0x7C1C0600, // 0016 CALL R7 3 - 0x54220004, // 0017 LDINT R8 5 - 0x5426000E, // 0018 LDINT R9 15 - 0x40201009, // 0019 CONNECT R8 R8 R9 - 0x94200808, // 001A GETIDX R8 R4 R8 - 0x001C0E08, // 001B ADD R7 R7 R8 - 0x54220003, // 001C LDINT R8 4 - 0x8824010D, // 001D GETMBR R9 R0 K13 - 0x0424130E, // 001E SUB R9 R9 K14 - 0x40201009, // 001F CONNECT R8 R8 R9 - 0x88240102, // 0020 GETMBR R9 R0 K2 - 0x94201208, // 0021 GETIDX R8 R9 R8 - 0x8C28030F, // 0022 GETMET R10 R1 K15 - 0x5C300C00, // 0023 MOVE R12 R6 - 0x7C280400, // 0024 CALL R10 2 - 0x8C281510, // 0025 GETMET R10 R10 K16 - 0x5C301000, // 0026 MOVE R12 R8 - 0x5C340E00, // 0027 MOVE R13 R7 - 0x58380009, // 0028 LDCONST R14 K9 - 0x7C280800, // 0029 CALL R10 4 - 0x5C241400, // 002A MOVE R9 R10 - 0x402A2312, // 002B CONNECT R10 K17 K18 - 0x882C0102, // 002C GETMBR R11 R0 K2 - 0x9428160A, // 002D GETIDX R10 R11 R10 - 0x00281409, // 002E ADD R10 R10 R9 - 0x882C010D, // 002F GETMBR R11 R0 K13 - 0x402C1703, // 0030 CONNECT R11 R11 K3 - 0x942C100B, // 0031 GETIDX R11 R8 R11 - 0x0028140B, // 0032 ADD R10 R10 R11 - 0x9002040A, // 0033 SETMBR R0 K2 R10 - 0x8818010D, // 0034 GETMBR R6 R0 K13 - 0x04180D0E, // 0035 SUB R6 R6 K14 - 0x401A2206, // 0036 CONNECT R6 K17 R6 - 0x94180606, // 0037 GETIDX R6 R3 R6 - 0x881C010D, // 0038 GETMBR R7 R0 K13 - 0x5421FFEE, // 0039 LDINT R8 -17 - 0x401C0E08, // 003A CONNECT R7 R7 R8 - 0x941C0607, // 003B GETIDX R7 R3 R7 - 0x60200015, // 003C GETGBL R8 G21 - 0x7C200000, // 003D CALL R8 0 - 0x8C24110B, // 003E GETMET R9 R8 K11 - 0x882C0113, // 003F GETMBR R11 R0 K19 - 0x5830000E, // 0040 LDCONST R12 K14 - 0x7C240600, // 0041 CALL R9 3 - 0x8C24110B, // 0042 GETMET R9 R8 K11 - 0x882C0114, // 0043 GETMBR R11 R0 K20 - 0x54320003, // 0044 LDINT R12 4 - 0x7C240600, // 0045 CALL R9 3 - 0x88240115, // 0046 GETMBR R9 R0 K21 - 0x78260001, // 0047 JMPF R9 #004A - 0x40241103, // 0048 CONNECT R9 R8 K3 - 0x70020006, // 0049 JMP #0051 - 0x88240516, // 004A GETMBR R9 R2 K22 - 0x78260001, // 004B JMPF R9 #004E - 0x88240516, // 004C GETMBR R9 R2 K22 - 0x40241009, // 004D CONNECT R9 R8 R9 - 0x8C241117, // 004E GETMET R9 R8 K23 - 0x542E000C, // 004F LDINT R11 13 - 0x7C240400, // 0050 CALL R9 2 - 0x8C240318, // 0051 GETMET R9 R1 K24 - 0x5C2C0A00, // 0052 MOVE R11 R5 - 0x5C301000, // 0053 MOVE R12 R8 - 0x5C340C00, // 0054 MOVE R13 R6 - 0x6038000C, // 0055 GETGBL R14 G12 - 0x5C3C0E00, // 0056 MOVE R15 R7 - 0x7C380200, // 0057 CALL R14 1 - 0x543E000F, // 0058 LDINT R15 16 - 0x7C240C00, // 0059 CALL R9 6 - 0x8C281310, // 005A GETMET R10 R9 K16 - 0x5C300E00, // 005B MOVE R12 R7 - 0x7C280400, // 005C CALL R10 2 - 0x8C2C1319, // 005D GETMET R11 R9 K25 - 0x7C2C0200, // 005E CALL R11 1 - 0x20301604, // 005F NE R12 R11 R4 - 0x78320006, // 0060 JMPF R12 #0068 - 0xB8320C00, // 0061 GETNGBL R12 K6 - 0x8C301907, // 0062 GETMET R12 R12 K7 - 0x5838001A, // 0063 LDCONST R14 K26 - 0x583C0012, // 0064 LDCONST R15 K18 - 0x7C300600, // 0065 CALL R12 3 - 0x4C300000, // 0066 LDNIL R12 - 0x80041800, // 0067 RET 1 R12 - 0x80041400, // 0068 RET 1 R10 + 0x88100103, // 0003 GETMBR R4 R0 K3 + 0x5416000F, // 0004 LDINT R5 16 + 0x8C180504, // 0005 GETMET R6 R2 K4 + 0x7C180200, // 0006 CALL R6 1 + 0x881C0105, // 0007 GETMBR R7 R0 K5 + 0x781E002C, // 0008 JMPF R7 #0036 + 0xB81E0C00, // 0009 GETNGBL R7 K6 + 0x8C1C0F07, // 000A GETMET R7 R7 K7 + 0x58240008, // 000B LDCONST R9 K8 + 0x58280009, // 000C LDCONST R10 K9 + 0x7C1C0600, // 000D CALL R7 3 + 0x8C1C050A, // 000E GETMET R7 R2 K10 + 0x7C1C0200, // 000F CALL R7 1 + 0x5421FFEF, // 0010 LDINT R8 -16 + 0x4020110B, // 0011 CONNECT R8 R8 K11 + 0x94200608, // 0012 GETIDX R8 R3 R8 + 0x60240015, // 0013 GETGBL R9 G21 + 0x7C240000, // 0014 CALL R9 0 + 0x8C24130C, // 0015 GETMET R9 R9 K12 + 0x882C010D, // 0016 GETMBR R11 R0 K13 + 0x5431FFFD, // 0017 LDINT R12 -2 + 0x7C240600, // 0018 CALL R9 3 + 0x542A0004, // 0019 LDINT R10 5 + 0x542E000E, // 001A LDINT R11 15 + 0x4028140B, // 001B CONNECT R10 R10 R11 + 0x9428100A, // 001C GETIDX R10 R8 R10 + 0x0024120A, // 001D ADD R9 R9 R10 + 0x542A0003, // 001E LDINT R10 4 + 0x882C0103, // 001F GETMBR R11 R0 K3 + 0x042C170E, // 0020 SUB R11 R11 K14 + 0x4028140B, // 0021 CONNECT R10 R10 R11 + 0x882C0102, // 0022 GETMBR R11 R0 K2 + 0x9428160A, // 0023 GETIDX R10 R11 R10 + 0x8C30030F, // 0024 GETMET R12 R1 K15 + 0x5C380E00, // 0025 MOVE R14 R7 + 0x7C300400, // 0026 CALL R12 2 + 0x8C301910, // 0027 GETMET R12 R12 K16 + 0x5C381400, // 0028 MOVE R14 R10 + 0x5C3C1200, // 0029 MOVE R15 R9 + 0x58400009, // 002A LDCONST R16 K9 + 0x7C300800, // 002B CALL R12 4 + 0x5C2C1800, // 002C MOVE R11 R12 + 0x40322312, // 002D CONNECT R12 K17 K18 + 0x88340102, // 002E GETMBR R13 R0 K2 + 0x94301A0C, // 002F GETIDX R12 R13 R12 + 0x0030180B, // 0030 ADD R12 R12 R11 + 0x88340103, // 0031 GETMBR R13 R0 K3 + 0x40341B0B, // 0032 CONNECT R13 R13 K11 + 0x9434140D, // 0033 GETIDX R13 R10 R13 + 0x0030180D, // 0034 ADD R12 R12 R13 + 0x9002040C, // 0035 SETMBR R0 K2 R12 + 0x881C0113, // 0036 GETMBR R7 R0 K19 + 0x881C0F14, // 0037 GETMBR R7 R7 K20 + 0x8C200F15, // 0038 GETMET R8 R7 K21 + 0x7C200200, // 0039 CALL R8 1 + 0x8C200F0C, // 003A GETMET R8 R7 K12 + 0x88280116, // 003B GETMBR R10 R0 K22 + 0x582C000E, // 003C LDCONST R11 K14 + 0x7C200600, // 003D CALL R8 3 + 0x8C200F0C, // 003E GETMET R8 R7 K12 + 0x88280117, // 003F GETMBR R10 R0 K23 + 0x542E0003, // 0040 LDINT R11 4 + 0x7C200600, // 0041 CALL R8 3 + 0x88200118, // 0042 GETMBR R8 R0 K24 + 0x78220001, // 0043 JMPF R8 #0046 + 0x40200F0B, // 0044 CONNECT R8 R7 K11 + 0x70020006, // 0045 JMP #004D + 0x88200519, // 0046 GETMBR R8 R2 K25 + 0x78220001, // 0047 JMPF R8 #004A + 0x88200519, // 0048 GETMBR R8 R2 K25 + 0x40200E08, // 0049 CONNECT R8 R7 R8 + 0x8C200F1A, // 004A GETMET R8 R7 K26 + 0x542A000C, // 004B LDINT R10 13 + 0x7C200400, // 004C CALL R8 2 + 0x8820031B, // 004D GETMBR R8 R1 K27 + 0x8C20111C, // 004E GETMET R8 R8 K28 + 0x5C280C00, // 004F MOVE R10 R6 + 0x5C2C0E00, // 0050 MOVE R11 R7 + 0x58300011, // 0051 LDCONST R12 K17 + 0x6034000C, // 0052 GETGBL R13 G12 + 0x5C380E00, // 0053 MOVE R14 R7 + 0x7C340200, // 0054 CALL R13 1 + 0x5C380600, // 0055 MOVE R14 R3 + 0x583C0011, // 0056 LDCONST R15 K17 + 0x5C400800, // 0057 MOVE R16 R4 + 0x5C440600, // 0058 MOVE R17 R3 + 0x5C480800, // 0059 MOVE R18 R4 + 0x604C000C, // 005A GETGBL R19 G12 + 0x5C500600, // 005B MOVE R20 R3 + 0x7C4C0200, // 005C CALL R19 1 + 0x044C2604, // 005D SUB R19 R19 R4 + 0x044C2605, // 005E SUB R19 R19 R5 + 0x5C500600, // 005F MOVE R20 R3 + 0x6054000C, // 0060 GETGBL R21 G12 + 0x5C580600, // 0061 MOVE R22 R3 + 0x7C540200, // 0062 CALL R21 1 + 0x04542A05, // 0063 SUB R21 R21 R5 + 0x5C580A00, // 0064 MOVE R22 R5 + 0x7C201C00, // 0065 CALL R8 14 + 0x78220006, // 0066 JMPF R8 #006E + 0x8C24071A, // 0067 GETMET R9 R3 K26 + 0x602C000C, // 0068 GETGBL R11 G12 + 0x5C300600, // 0069 MOVE R12 R3 + 0x7C2C0200, // 006A CALL R11 1 + 0x042C1605, // 006B SUB R11 R11 R5 + 0x7C240400, // 006C CALL R9 2 + 0x70020004, // 006D JMP #0073 + 0xB8260C00, // 006E GETNGBL R9 K6 + 0x8C241307, // 006F GETMET R9 R9 K7 + 0x582C001D, // 0070 LDCONST R11 K29 + 0x58300012, // 0071 LDCONST R12 K18 + 0x7C240600, // 0072 CALL R9 3 + 0x80041000, // 0073 RET 1 R8 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h index b339729d5..3dd940012 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_MessageHandler.h @@ -7,9 +7,9 @@ extern const bclass be_class_Matter_MessageHandler; /******************************************************************** -** Solidified function: send_response_frame +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_MessageHandler_send_response_frame, /* name */ +be_local_closure(Matter_MessageHandler_init, /* name */ be_nested_proto( 5, /* nstack */ 2, /* argc */ @@ -19,26 +19,41 @@ be_local_closure(Matter_MessageHandler_send_response_frame, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(profiler), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(send_response_frame), - /* K4 */ be_nested_str_weak(msg_send), + /* K1 */ be_nested_str_weak(commissioning), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Commisioning_Context), + /* K4 */ be_nested_str_weak(im), + /* K5 */ be_nested_str_weak(IM), + /* K6 */ be_nested_str_weak(control_message), + /* K7 */ be_nested_str_weak(Control_Message), + /* K8 */ be_nested_str_weak(_n_bytes), }), - be_str_weak(send_response_frame), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x8C080502, // 0002 GETMET R2 R2 K2 - 0x58100003, // 0003 LDCONST R4 K3 + ( &(const binstruction[21]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0xB80A0400, // 0001 GETNGBL R2 K2 + 0x8C080503, // 0002 GETMET R2 R2 K3 + 0x5C100000, // 0003 MOVE R4 R0 0x7C080400, // 0004 CALL R2 2 - 0x88080100, // 0005 GETMBR R2 R0 K0 - 0x8C080504, // 0006 GETMET R2 R2 K4 - 0x5C100200, // 0007 MOVE R4 R1 - 0x7C080400, // 0008 CALL R2 2 - 0x80000000, // 0009 RET 0 + 0x90020202, // 0005 SETMBR R0 K1 R2 + 0xB80A0400, // 0006 GETNGBL R2 K2 + 0x8C080505, // 0007 GETMET R2 R2 K5 + 0x5C100200, // 0008 MOVE R4 R1 + 0x7C080400, // 0009 CALL R2 2 + 0x90020802, // 000A SETMBR R0 K4 R2 + 0xB80A0400, // 000B GETNGBL R2 K2 + 0x8C080507, // 000C GETMET R2 R2 K7 + 0x5C100000, // 000D MOVE R4 R0 + 0x7C080400, // 000E CALL R2 2 + 0x90020C02, // 000F SETMBR R0 K6 R2 + 0x60080015, // 0010 GETGBL R2 G21 + 0x540E000F, // 0011 LDINT R3 16 + 0x7C080200, // 0012 CALL R2 1 + 0x90021002, // 0013 SETMBR R0 K8 R2 + 0x80000000, // 0014 RET 0 }) ) ); @@ -58,27 +73,28 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[14]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(x_flag_r), /* K1 */ be_nested_str_weak(build_standalone_ack), /* K2 */ be_nested_str_weak(encode_frame), /* K3 */ be_nested_str_weak(encrypt), /* K4 */ be_nested_str_weak(tasmota), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X2A_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), - /* K7 */ be_nested_str_weak(session), - /* K8 */ be_nested_str_weak(local_session_id), - /* K9 */ be_nested_str_weak(ack_message_counter), - /* K10 */ be_nested_str_weak(message_counter), - /* K11 */ be_nested_str_weak(_X7Breliable_X7D), - /* K12 */ be_nested_str_weak(), - /* K13 */ be_nested_str_weak(send_response_frame), + /* K5 */ be_nested_str_weak(loglevel), + /* K6 */ be_nested_str_weak(log), + /* K7 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X2A_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), + /* K8 */ be_nested_str_weak(session), + /* K9 */ be_nested_str_weak(local_session_id), + /* K10 */ be_nested_str_weak(ack_message_counter), + /* K11 */ be_nested_str_weak(message_counter), + /* K12 */ be_nested_str_weak(_X7Breliable_X7D), + /* K13 */ be_nested_str_weak(), + /* K14 */ be_nested_str_weak(send_response_frame), }), be_str_weak(send_encrypted_ack), &be_const_str_solidified, - ( &(const binstruction[28]) { /* code */ + ( &(const binstruction[33]) { /* code */ 0x880C0300, // 0000 GETMBR R3 R1 K0 - 0x780E0018, // 0001 JMPF R3 #001B + 0x780E001D, // 0001 JMPF R3 #0020 0x8C0C0301, // 0002 GETMET R3 R1 K1 0x5C140400, // 0003 MOVE R5 R2 0x7C0C0400, // 0004 CALL R3 2 @@ -88,23 +104,626 @@ be_local_closure(Matter_MessageHandler_send_encrypted_ack, /* name */ 0x7C100200, // 0008 CALL R4 1 0xB8120800, // 0009 GETNGBL R4 K4 0x8C100905, // 000A GETMET R4 R4 K5 - 0x60180018, // 000B GETGBL R6 G24 - 0x581C0006, // 000C LDCONST R7 K6 - 0x88200707, // 000D GETMBR R8 R3 K7 - 0x88201108, // 000E GETMBR R8 R8 K8 - 0x88240709, // 000F GETMBR R9 R3 K9 - 0x8828070A, // 0010 GETMBR R10 R3 K10 - 0x780A0001, // 0011 JMPF R2 #0014 - 0x582C000B, // 0012 LDCONST R11 K11 - 0x70020000, // 0013 JMP #0015 - 0x582C000C, // 0014 LDCONST R11 K12 - 0x7C180A00, // 0015 CALL R6 5 - 0x541E0003, // 0016 LDINT R7 4 - 0x7C100600, // 0017 CALL R4 3 - 0x8C10010D, // 0018 GETMET R4 R0 K13 - 0x5C180600, // 0019 MOVE R6 R3 - 0x7C100400, // 001A CALL R4 2 - 0x80000000, // 001B RET 0 + 0x541A0003, // 000B LDINT R6 4 + 0x7C100400, // 000C CALL R4 2 + 0x7812000E, // 000D JMPF R4 #001D + 0xB8120800, // 000E GETNGBL R4 K4 + 0x8C100906, // 000F GETMET R4 R4 K6 + 0x60180018, // 0010 GETGBL R6 G24 + 0x581C0007, // 0011 LDCONST R7 K7 + 0x88200708, // 0012 GETMBR R8 R3 K8 + 0x88201109, // 0013 GETMBR R8 R8 K9 + 0x8824070A, // 0014 GETMBR R9 R3 K10 + 0x8828070B, // 0015 GETMBR R10 R3 K11 + 0x780A0001, // 0016 JMPF R2 #0019 + 0x582C000C, // 0017 LDCONST R11 K12 + 0x70020000, // 0018 JMP #001A + 0x582C000D, // 0019 LDCONST R11 K13 + 0x7C180A00, // 001A CALL R6 5 + 0x541E0003, // 001B LDINT R7 4 + 0x7C100600, // 001C CALL R4 3 + 0x8C10010E, // 001D GETMET R4 R0 K14 + 0x5C180600, // 001E MOVE R6 R3 + 0x7C100400, // 001F CALL R4 2 + 0x80000000, // 0020 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: msg_received +********************************************************************/ +be_local_closure(Matter_MessageHandler_msg_received, /* name */ + be_nested_proto( + 19, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[70]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(msg_received), + /* K4 */ be_nested_str_weak(Frame), + /* K5 */ be_nested_str_weak(decode_header), + /* K6 */ be_nested_str_weak(sec_p), + /* K7 */ be_nested_str_weak(device), + /* K8 */ be_nested_str_weak(sessions), + /* K9 */ be_nested_str_weak(find_session_source_id_unsecure), + /* K10 */ be_nested_str_weak(source_node_id), + /* K11 */ be_nested_str_weak(control_message), + /* K12 */ be_nested_str_weak(process_incoming_control_message), + /* K13 */ be_nested_str_weak(local_session_id), + /* K14 */ be_const_int(0), + /* K15 */ be_nested_str_weak(sec_sesstype), + /* K16 */ be_nested_str_weak(_ip), + /* K17 */ be_nested_str_weak(_port), + /* K18 */ be_nested_str_weak(_message_handler), + /* K19 */ be_nested_str_weak(session), + /* K20 */ be_nested_str_weak(_counter_insecure_rcv), + /* K21 */ be_nested_str_weak(validate), + /* K22 */ be_nested_str_weak(message_counter), + /* K23 */ be_nested_str_weak(tasmota), + /* K24 */ be_nested_str_weak(loglevel), + /* K25 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), + /* K26 */ be_nested_str_weak(val), + /* K27 */ be_nested_str_weak(send_simple_ack), + /* K28 */ be_nested_str_weak(decode_payload), + /* K29 */ be_nested_str_weak(received_ack), + /* K30 */ be_nested_str_weak(opcode), + /* K31 */ be_nested_str_weak(get_opcode_name), + /* K32 */ be_nested_str_weak(0x_X2502X), + /* K33 */ be_const_int(3), + /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K35 */ be_nested_str_weak(exchange_id), + /* K36 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), + /* K37 */ be_nested_str_weak(x_flag_r), + /* K38 */ be_nested_str_weak(_X7Breliable_X7D_X20), + /* K39 */ be_nested_str_weak(), + /* K40 */ be_nested_str_weak(ack_message_counter), + /* K41 */ be_nested_str_weak(commissioning), + /* K42 */ be_nested_str_weak(process_incoming), + /* K43 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), + /* K44 */ be_nested_str_weak(get_session_by_local_session_id), + /* K45 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), + /* K46 */ be_nested_str_weak(counter_rcv_validate), + /* K47 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), + /* K48 */ be_nested_str_weak(_X20counter_X3D), + /* K49 */ be_nested_str_weak(counter_rcv), + /* K50 */ be_nested_str_weak(send_encrypted_ack), + /* K51 */ be_nested_str_weak(decrypt), + /* K52 */ be_nested_str_weak(msg_received_header_frame_decrypted), + /* K53 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), + /* K54 */ be_nested_str_weak(protocol_id), + /* K55 */ be_nested_str_weak(_X20opcode_X3D), + /* K56 */ be_nested_str_weak(_X20exchange_id_X3D), + /* K57 */ be_nested_str_weak(im), + /* K58 */ be_nested_str_weak(process_incoming_ack), + /* K59 */ be_nested_str_weak(send_enqueued), + /* K60 */ be_const_int(1), + /* K61 */ be_nested_str_weak(process_IM_start), + /* K62 */ be_nested_str_weak(process_IM_end), + /* K63 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), + /* K64 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), + /* K65 */ be_nested_str_weak(_X3B), + /* K66 */ be_const_int(2), + /* K67 */ be_nested_str_weak(_debug_present), + /* K68 */ be_nested_str_weak(debug), + /* K69 */ be_nested_str_weak(traceback), + }), + be_str_weak(msg_received), + &be_const_str_solidified, + ( &(const binstruction[365]) { /* code */ + 0x50100000, // 0000 LDBOOL R4 0 0 + 0xB8160000, // 0001 GETNGBL R5 K0 + 0x88140B01, // 0002 GETMBR R5 R5 K1 + 0x8C140B02, // 0003 GETMET R5 R5 K2 + 0x581C0003, // 0004 LDCONST R7 K3 + 0x7C140400, // 0005 CALL R5 2 + 0xA802014B, // 0006 EXBLK 0 #0153 + 0xB8160000, // 0007 GETNGBL R5 K0 + 0x8C140B04, // 0008 GETMET R5 R5 K4 + 0x5C1C0000, // 0009 MOVE R7 R0 + 0x5C200200, // 000A MOVE R8 R1 + 0x5C240400, // 000B MOVE R9 R2 + 0x5C280600, // 000C MOVE R10 R3 + 0x7C140A00, // 000D CALL R5 5 + 0x8C180B05, // 000E GETMET R6 R5 K5 + 0x7C180200, // 000F CALL R6 1 + 0x5C1C0C00, // 0010 MOVE R7 R6 + 0x741E0002, // 0011 JMPT R7 #0015 + 0x501C0000, // 0012 LDBOOL R7 0 0 + 0xA8040001, // 0013 EXBLK 1 1 + 0x80040E00, // 0014 RET 1 R7 + 0x881C0B06, // 0015 GETMBR R7 R5 K6 + 0x781E000C, // 0016 JMPF R7 #0024 + 0x881C0107, // 0017 GETMBR R7 R0 K7 + 0x881C0F08, // 0018 GETMBR R7 R7 K8 + 0x8C1C0F09, // 0019 GETMET R7 R7 K9 + 0x88240B0A, // 001A GETMBR R9 R5 K10 + 0x542A0059, // 001B LDINT R10 90 + 0x7C1C0600, // 001C CALL R7 3 + 0x8820010B, // 001D GETMBR R8 R0 K11 + 0x8C20110C, // 001E GETMET R8 R8 K12 + 0x5C280A00, // 001F MOVE R10 R5 + 0x7C200400, // 0020 CALL R8 2 + 0xA8040001, // 0021 EXBLK 1 1 + 0x80041000, // 0022 RET 1 R8 + 0x7002012A, // 0023 JMP #014F + 0x881C0B0D, // 0024 GETMBR R7 R5 K13 + 0x1C1C0F0E, // 0025 EQ R7 R7 K14 + 0x781E007F, // 0026 JMPF R7 #00A7 + 0x881C0B0F, // 0027 GETMBR R7 R5 K15 + 0x1C1C0F0E, // 0028 EQ R7 R7 K14 + 0x781E007C, // 0029 JMPF R7 #00A7 + 0x881C0107, // 002A GETMBR R7 R0 K7 + 0x881C0F08, // 002B GETMBR R7 R7 K8 + 0x8C1C0F09, // 002C GETMET R7 R7 K9 + 0x88240B0A, // 002D GETMBR R9 R5 K10 + 0x542A0059, // 002E LDINT R10 90 + 0x7C1C0600, // 002F CALL R7 3 + 0x780A0000, // 0030 JMPF R2 #0032 + 0x901E2002, // 0031 SETMBR R7 K16 R2 + 0x780E0000, // 0032 JMPF R3 #0034 + 0x901E2203, // 0033 SETMBR R7 K17 R3 + 0x901E2400, // 0034 SETMBR R7 K18 R0 + 0x90162607, // 0035 SETMBR R5 K19 R7 + 0x88200F14, // 0036 GETMBR R8 R7 K20 + 0x8C201115, // 0037 GETMET R8 R8 K21 + 0x88280B16, // 0038 GETMBR R10 R5 K22 + 0x502C0000, // 0039 LDBOOL R11 0 0 + 0x7C200600, // 003A CALL R8 3 + 0x74220016, // 003B JMPT R8 #0053 + 0xB8222E00, // 003C GETNGBL R8 K23 + 0x8C201118, // 003D GETMET R8 R8 K24 + 0x542A0003, // 003E LDINT R10 4 + 0x7C200400, // 003F CALL R8 2 + 0x7822000A, // 0040 JMPF R8 #004C + 0xB8222E00, // 0041 GETNGBL R8 K23 + 0x8C201102, // 0042 GETMET R8 R8 K2 + 0x60280018, // 0043 GETGBL R10 G24 + 0x582C0019, // 0044 LDCONST R11 K25 + 0x88300B16, // 0045 GETMBR R12 R5 K22 + 0x88340F14, // 0046 GETMBR R13 R7 K20 + 0x8C341B1A, // 0047 GETMET R13 R13 K26 + 0x7C340200, // 0048 CALL R13 1 + 0x7C280600, // 0049 CALL R10 3 + 0x542E0003, // 004A LDINT R11 4 + 0x7C200600, // 004B CALL R8 3 + 0x8C20011B, // 004C GETMET R8 R0 K27 + 0x5C280A00, // 004D MOVE R10 R5 + 0x502C0000, // 004E LDBOOL R11 0 0 + 0x7C200600, // 004F CALL R8 3 + 0x50200000, // 0050 LDBOOL R8 0 0 + 0xA8040001, // 0051 EXBLK 1 1 + 0x80041000, // 0052 RET 1 R8 + 0x8C200B1C, // 0053 GETMET R8 R5 K28 + 0x7C200200, // 0054 CALL R8 1 + 0x74220002, // 0055 JMPT R8 #0059 + 0x50200000, // 0056 LDBOOL R8 0 0 + 0xA8040001, // 0057 EXBLK 1 1 + 0x80041000, // 0058 RET 1 R8 + 0x88200107, // 0059 GETMBR R8 R0 K7 + 0x8C20111D, // 005A GETMET R8 R8 K29 + 0x5C280A00, // 005B MOVE R10 R5 + 0x7C200400, // 005C CALL R8 2 + 0x88200B1E, // 005D GETMBR R8 R5 K30 + 0x5426000F, // 005E LDINT R9 16 + 0x20201009, // 005F NE R8 R8 R9 + 0x7822001D, // 0060 JMPF R8 #007F + 0xB8220000, // 0061 GETNGBL R8 K0 + 0x8C20111F, // 0062 GETMET R8 R8 K31 + 0x88280B1E, // 0063 GETMBR R10 R5 K30 + 0x7C200400, // 0064 CALL R8 2 + 0x5C241000, // 0065 MOVE R9 R8 + 0x74260004, // 0066 JMPT R9 #006C + 0x60240018, // 0067 GETGBL R9 G24 + 0x58280020, // 0068 LDCONST R10 K32 + 0x882C0B1E, // 0069 GETMBR R11 R5 K30 + 0x7C240400, // 006A CALL R9 2 + 0x5C201200, // 006B MOVE R8 R9 + 0xB8262E00, // 006C GETNGBL R9 K23 + 0x8C241318, // 006D GETMET R9 R9 K24 + 0x582C0021, // 006E LDCONST R11 K33 + 0x7C240400, // 006F CALL R9 2 + 0x7826000C, // 0070 JMPF R9 #007E + 0xB8262E00, // 0071 GETNGBL R9 K23 + 0x8C241302, // 0072 GETMET R9 R9 K2 + 0x602C0018, // 0073 GETGBL R11 G24 + 0x58300022, // 0074 LDCONST R12 K34 + 0x88340F0D, // 0075 GETMBR R13 R7 K13 + 0x5C381000, // 0076 MOVE R14 R8 + 0x883C0B16, // 0077 GETMBR R15 R5 K22 + 0x88400B23, // 0078 GETMBR R16 R5 K35 + 0x5C440400, // 0079 MOVE R17 R2 + 0x5C480600, // 007A MOVE R18 R3 + 0x7C2C0E00, // 007B CALL R11 7 + 0x58300021, // 007C LDCONST R12 K33 + 0x7C240600, // 007D CALL R9 3 + 0x70020018, // 007E JMP #0098 + 0xB8222E00, // 007F GETNGBL R8 K23 + 0x8C201118, // 0080 GETMET R8 R8 K24 + 0x542A0003, // 0081 LDINT R10 4 + 0x7C200400, // 0082 CALL R8 2 + 0x78220013, // 0083 JMPF R8 #0098 + 0xB8222E00, // 0084 GETNGBL R8 K23 + 0x8C201102, // 0085 GETMET R8 R8 K2 + 0x60280018, // 0086 GETGBL R10 G24 + 0x582C0024, // 0087 LDCONST R11 K36 + 0x88300F0D, // 0088 GETMBR R12 R7 K13 + 0x88340B16, // 0089 GETMBR R13 R5 K22 + 0x88380B25, // 008A GETMBR R14 R5 K37 + 0x783A0001, // 008B JMPF R14 #008E + 0x58380026, // 008C LDCONST R14 K38 + 0x70020000, // 008D JMP #008F + 0x58380027, // 008E LDCONST R14 K39 + 0x883C0B23, // 008F GETMBR R15 R5 K35 + 0x60400008, // 0090 GETGBL R16 G8 + 0x88440B28, // 0091 GETMBR R17 R5 K40 + 0x7C400200, // 0092 CALL R16 1 + 0x5C440400, // 0093 MOVE R17 R2 + 0x5C480600, // 0094 MOVE R18 R3 + 0x7C281000, // 0095 CALL R10 8 + 0x542E0003, // 0096 LDINT R11 4 + 0x7C200600, // 0097 CALL R8 3 + 0x88200129, // 0098 GETMBR R8 R0 K41 + 0x8C20112A, // 0099 GETMET R8 R8 K42 + 0x5C280A00, // 009A MOVE R10 R5 + 0x7C200400, // 009B CALL R8 2 + 0x5C101000, // 009C MOVE R4 R8 + 0x5C200800, // 009D MOVE R8 R4 + 0x74220003, // 009E JMPT R8 #00A3 + 0x8C20011B, // 009F GETMET R8 R0 K27 + 0x5C280A00, // 00A0 MOVE R10 R5 + 0x502C0000, // 00A1 LDBOOL R11 0 0 + 0x7C200600, // 00A2 CALL R8 3 + 0x50200200, // 00A3 LDBOOL R8 1 0 + 0xA8040001, // 00A4 EXBLK 1 1 + 0x80041000, // 00A5 RET 1 R8 + 0x700200A7, // 00A6 JMP #014F + 0xB81E2E00, // 00A7 GETNGBL R7 K23 + 0x8C1C0F18, // 00A8 GETMET R7 R7 K24 + 0x54260003, // 00A9 LDINT R9 4 + 0x7C1C0400, // 00AA CALL R7 2 + 0x781E0008, // 00AB JMPF R7 #00B5 + 0xB81E2E00, // 00AC GETNGBL R7 K23 + 0x8C1C0F02, // 00AD GETMET R7 R7 K2 + 0x60240018, // 00AE GETGBL R9 G24 + 0x5828002B, // 00AF LDCONST R10 K43 + 0x882C0B0D, // 00B0 GETMBR R11 R5 K13 + 0x88300B16, // 00B1 GETMBR R12 R5 K22 + 0x7C240600, // 00B2 CALL R9 3 + 0x542A0003, // 00B3 LDINT R10 4 + 0x7C1C0600, // 00B4 CALL R7 3 + 0x881C0107, // 00B5 GETMBR R7 R0 K7 + 0x881C0F08, // 00B6 GETMBR R7 R7 K8 + 0x8C1C0F2C, // 00B7 GETMET R7 R7 K44 + 0x88240B0D, // 00B8 GETMBR R9 R5 K13 + 0x7C1C0400, // 00B9 CALL R7 2 + 0x4C200000, // 00BA LDNIL R8 + 0x1C200E08, // 00BB EQ R8 R7 R8 + 0x7822000A, // 00BC JMPF R8 #00C8 + 0xB8222E00, // 00BD GETNGBL R8 K23 + 0x8C201102, // 00BE GETMET R8 R8 K2 + 0x60280008, // 00BF GETGBL R10 G8 + 0x882C0B0D, // 00C0 GETMBR R11 R5 K13 + 0x7C280200, // 00C1 CALL R10 1 + 0x002A5A0A, // 00C2 ADD R10 K45 R10 + 0x582C0021, // 00C3 LDCONST R11 K33 + 0x7C200600, // 00C4 CALL R8 3 + 0x50200000, // 00C5 LDBOOL R8 0 0 + 0xA8040001, // 00C6 EXBLK 1 1 + 0x80041000, // 00C7 RET 1 R8 + 0x780A0000, // 00C8 JMPF R2 #00CA + 0x901E2002, // 00C9 SETMBR R7 K16 R2 + 0x780E0000, // 00CA JMPF R3 #00CC + 0x901E2203, // 00CB SETMBR R7 K17 R3 + 0x901E2400, // 00CC SETMBR R7 K18 R0 + 0x90162607, // 00CD SETMBR R5 K19 R7 + 0x8C200F2E, // 00CE GETMET R8 R7 K46 + 0x88280B16, // 00CF GETMBR R10 R5 K22 + 0x502C0200, // 00D0 LDBOOL R11 1 0 + 0x7C200600, // 00D1 CALL R8 3 + 0x74220018, // 00D2 JMPT R8 #00EC + 0xB8222E00, // 00D3 GETNGBL R8 K23 + 0x8C201118, // 00D4 GETMET R8 R8 K24 + 0x58280021, // 00D5 LDCONST R10 K33 + 0x7C200400, // 00D6 CALL R8 2 + 0x7822000C, // 00D7 JMPF R8 #00E5 + 0xB8222E00, // 00D8 GETNGBL R8 K23 + 0x8C201102, // 00D9 GETMET R8 R8 K2 + 0x60280008, // 00DA GETGBL R10 G8 + 0x882C0B16, // 00DB GETMBR R11 R5 K22 + 0x7C280200, // 00DC CALL R10 1 + 0x002A5E0A, // 00DD ADD R10 K47 R10 + 0x00281530, // 00DE ADD R10 R10 K48 + 0x602C0008, // 00DF GETGBL R11 G8 + 0x88300F31, // 00E0 GETMBR R12 R7 K49 + 0x7C2C0200, // 00E1 CALL R11 1 + 0x0028140B, // 00E2 ADD R10 R10 R11 + 0x582C0021, // 00E3 LDCONST R11 K33 + 0x7C200600, // 00E4 CALL R8 3 + 0x8C200132, // 00E5 GETMET R8 R0 K50 + 0x5C280A00, // 00E6 MOVE R10 R5 + 0x502C0000, // 00E7 LDBOOL R11 0 0 + 0x7C200600, // 00E8 CALL R8 3 + 0x50200000, // 00E9 LDBOOL R8 0 0 + 0xA8040001, // 00EA EXBLK 1 1 + 0x80041000, // 00EB RET 1 R8 + 0x8C200B33, // 00EC GETMET R8 R5 K51 + 0x7C200200, // 00ED CALL R8 1 + 0xB8260000, // 00EE GETNGBL R9 K0 + 0x88241301, // 00EF GETMBR R9 R9 K1 + 0x8C241302, // 00F0 GETMET R9 R9 K2 + 0x582C0034, // 00F1 LDCONST R11 K52 + 0x7C240400, // 00F2 CALL R9 2 + 0x5C241000, // 00F3 MOVE R9 R8 + 0x74260002, // 00F4 JMPT R9 #00F8 + 0x50240000, // 00F5 LDBOOL R9 0 0 + 0xA8040001, // 00F6 EXBLK 1 1 + 0x80041200, // 00F7 RET 1 R9 + 0x8C240B1C, // 00F8 GETMET R9 R5 K28 + 0x7C240200, // 00F9 CALL R9 1 + 0xB8262E00, // 00FA GETNGBL R9 K23 + 0x8C241318, // 00FB GETMET R9 R9 K24 + 0x542E0003, // 00FC LDINT R11 4 + 0x7C240400, // 00FD CALL R9 2 + 0x78260013, // 00FE JMPF R9 #0113 + 0xB8262E00, // 00FF GETNGBL R9 K23 + 0x8C241302, // 0100 GETMET R9 R9 K2 + 0x602C0008, // 0101 GETGBL R11 G8 + 0x88300B36, // 0102 GETMBR R12 R5 K54 + 0x7C2C0200, // 0103 CALL R11 1 + 0x002E6A0B, // 0104 ADD R11 K53 R11 + 0x002C1737, // 0105 ADD R11 R11 K55 + 0x60300008, // 0106 GETGBL R12 G8 + 0x88340B1E, // 0107 GETMBR R13 R5 K30 + 0x7C300200, // 0108 CALL R12 1 + 0x002C160C, // 0109 ADD R11 R11 R12 + 0x002C1738, // 010A ADD R11 R11 K56 + 0x60300008, // 010B GETGBL R12 G8 + 0x88340B23, // 010C GETMBR R13 R5 K35 + 0x543AFFFE, // 010D LDINT R14 65535 + 0x2C341A0E, // 010E AND R13 R13 R14 + 0x7C300200, // 010F CALL R12 1 + 0x002C160C, // 0110 ADD R11 R11 R12 + 0x54320003, // 0111 LDINT R12 4 + 0x7C240600, // 0112 CALL R9 3 + 0x88240107, // 0113 GETMBR R9 R0 K7 + 0x8C24131D, // 0114 GETMET R9 R9 K29 + 0x5C2C0A00, // 0115 MOVE R11 R5 + 0x7C240400, // 0116 CALL R9 2 + 0x88240B36, // 0117 GETMBR R9 R5 K54 + 0x1C28130E, // 0118 EQ R10 R9 K14 + 0x782A000F, // 0119 JMPF R10 #012A + 0x88280B1E, // 011A GETMBR R10 R5 K30 + 0x542E000F, // 011B LDINT R11 16 + 0x1C28140B, // 011C EQ R10 R10 R11 + 0x782A0009, // 011D JMPF R10 #0128 + 0x88280139, // 011E GETMBR R10 R0 K57 + 0x8C28153A, // 011F GETMET R10 R10 K58 + 0x5C300A00, // 0120 MOVE R12 R5 + 0x7C280400, // 0121 CALL R10 2 + 0x5C101400, // 0122 MOVE R4 R10 + 0x78120003, // 0123 JMPF R4 #0128 + 0x88280139, // 0124 GETMBR R10 R0 K57 + 0x8C28153B, // 0125 GETMET R10 R10 K59 + 0x5C300000, // 0126 MOVE R12 R0 + 0x7C280400, // 0127 CALL R10 2 + 0x50100200, // 0128 LDBOOL R4 1 0 + 0x70020024, // 0129 JMP #014F + 0x1C28133C, // 012A EQ R10 R9 K60 + 0x782A001A, // 012B JMPF R10 #0147 + 0xB82A0000, // 012C GETNGBL R10 K0 + 0x88281501, // 012D GETMBR R10 R10 K1 + 0x8C281502, // 012E GETMET R10 R10 K2 + 0x5830003D, // 012F LDCONST R12 K61 + 0x7C280400, // 0130 CALL R10 2 + 0x88280139, // 0131 GETMBR R10 R0 K57 + 0x8C28152A, // 0132 GETMET R10 R10 K42 + 0x5C300A00, // 0133 MOVE R12 R5 + 0x7C280400, // 0134 CALL R10 2 + 0x5C101400, // 0135 MOVE R4 R10 + 0xB82A0000, // 0136 GETNGBL R10 K0 + 0x88281501, // 0137 GETMBR R10 R10 K1 + 0x8C281502, // 0138 GETMET R10 R10 K2 + 0x5830003E, // 0139 LDCONST R12 K62 + 0x7C280400, // 013A CALL R10 2 + 0x78120004, // 013B JMPF R4 #0141 + 0x88280139, // 013C GETMBR R10 R0 K57 + 0x8C28153B, // 013D GETMET R10 R10 K59 + 0x5C300000, // 013E MOVE R12 R0 + 0x7C280400, // 013F CALL R10 2 + 0x70020003, // 0140 JMP #0145 + 0x8C280132, // 0141 GETMET R10 R0 K50 + 0x5C300A00, // 0142 MOVE R12 R5 + 0x50340200, // 0143 LDBOOL R13 1 0 + 0x7C280600, // 0144 CALL R10 3 + 0x50100200, // 0145 LDBOOL R4 1 0 + 0x70020007, // 0146 JMP #014F + 0xB82A2E00, // 0147 GETNGBL R10 K23 + 0x8C281502, // 0148 GETMET R10 R10 K2 + 0x60300008, // 0149 GETGBL R12 G8 + 0x5C341200, // 014A MOVE R13 R9 + 0x7C300200, // 014B CALL R12 1 + 0x00327E0C, // 014C ADD R12 K63 R12 + 0x58340021, // 014D LDCONST R13 K33 + 0x7C280600, // 014E CALL R10 3 + 0xA8040001, // 014F EXBLK 1 1 + 0x80040800, // 0150 RET 1 R4 + 0xA8040001, // 0151 EXBLK 1 1 + 0x70020018, // 0152 JMP #016C + 0xAC140002, // 0153 CATCH R5 0 2 + 0x70020015, // 0154 JMP #016B + 0xB81E2E00, // 0155 GETNGBL R7 K23 + 0x8C1C0F02, // 0156 GETMET R7 R7 K2 + 0x60240008, // 0157 GETGBL R9 G8 + 0x5C280A00, // 0158 MOVE R10 R5 + 0x7C240200, // 0159 CALL R9 1 + 0x00268009, // 015A ADD R9 K64 R9 + 0x00241341, // 015B ADD R9 R9 K65 + 0x60280008, // 015C GETGBL R10 G8 + 0x5C2C0C00, // 015D MOVE R11 R6 + 0x7C280200, // 015E CALL R10 1 + 0x0024120A, // 015F ADD R9 R9 R10 + 0x58280042, // 0160 LDCONST R10 K66 + 0x7C1C0600, // 0161 CALL R7 3 + 0xB81E2E00, // 0162 GETNGBL R7 K23 + 0x881C0F43, // 0163 GETMBR R7 R7 K67 + 0x781E0002, // 0164 JMPF R7 #0168 + 0xA41E8800, // 0165 IMPORT R7 K68 + 0x8C200F45, // 0166 GETMET R8 R7 K69 + 0x7C200200, // 0167 CALL R8 1 + 0x501C0000, // 0168 LDBOOL R7 0 0 + 0x80040E00, // 0169 RET 1 R7 + 0x70020000, // 016A JMP #016C + 0xB0080000, // 016B RAISE 2 R0 R0 + 0x80000000, // 016C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_response_frame +********************************************************************/ +be_local_closure(Matter_MessageHandler_send_response_frame, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(profiler), + /* K2 */ be_nested_str_weak(log), + /* K3 */ be_nested_str_weak(send_response_frame), + /* K4 */ be_nested_str_weak(device), + /* K5 */ be_nested_str_weak(msg_send), + }), + be_str_weak(send_response_frame), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0xB80A0000, // 0000 GETNGBL R2 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x8C080502, // 0002 GETMET R2 R2 K2 + 0x58100003, // 0003 LDCONST R4 K3 + 0x7C080400, // 0004 CALL R2 2 + 0x88080104, // 0005 GETMBR R2 R0 K4 + 0x8C080505, // 0006 GETMET R2 R2 K5 + 0x5C100200, // 0007 MOVE R4 R1 + 0x7C080400, // 0008 CALL R2 2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_simple_ack +********************************************************************/ +be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ + be_nested_proto( + 12, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[14]) { /* constants */ + /* K0 */ be_nested_str_weak(x_flag_r), + /* K1 */ be_nested_str_weak(build_standalone_ack), + /* K2 */ be_nested_str_weak(encode_frame), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(loglevel), + /* K5 */ be_nested_str_weak(log), + /* K6 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), + /* K7 */ be_nested_str_weak(session), + /* K8 */ be_nested_str_weak(local_session_id), + /* K9 */ be_nested_str_weak(ack_message_counter), + /* K10 */ be_nested_str_weak(message_counter), + /* K11 */ be_nested_str_weak(_X7Breliable_X7D), + /* K12 */ be_nested_str_weak(), + /* K13 */ be_nested_str_weak(send_response_frame), + }), + be_str_weak(send_simple_ack), + &be_const_str_solidified, + ( &(const binstruction[31]) { /* code */ + 0x880C0300, // 0000 GETMBR R3 R1 K0 + 0x780E001B, // 0001 JMPF R3 #001E + 0x8C0C0301, // 0002 GETMET R3 R1 K1 + 0x5C140400, // 0003 MOVE R5 R2 + 0x7C0C0400, // 0004 CALL R3 2 + 0x8C100702, // 0005 GETMET R4 R3 K2 + 0x7C100200, // 0006 CALL R4 1 + 0xB8120600, // 0007 GETNGBL R4 K3 + 0x8C100904, // 0008 GETMET R4 R4 K4 + 0x541A0003, // 0009 LDINT R6 4 + 0x7C100400, // 000A CALL R4 2 + 0x7812000E, // 000B JMPF R4 #001B + 0xB8120600, // 000C GETNGBL R4 K3 + 0x8C100905, // 000D GETMET R4 R4 K5 + 0x60180018, // 000E GETGBL R6 G24 + 0x581C0006, // 000F LDCONST R7 K6 + 0x88200707, // 0010 GETMBR R8 R3 K7 + 0x88201108, // 0011 GETMBR R8 R8 K8 + 0x88240709, // 0012 GETMBR R9 R3 K9 + 0x8828070A, // 0013 GETMBR R10 R3 K10 + 0x780A0001, // 0014 JMPF R2 #0017 + 0x582C000B, // 0015 LDCONST R11 K11 + 0x70020000, // 0016 JMP #0018 + 0x582C000C, // 0017 LDCONST R11 K12 + 0x7C180A00, // 0018 CALL R6 5 + 0x541E0003, // 0019 LDINT R7 4 + 0x7C100600, // 001A CALL R4 3 + 0x8C10010D, // 001B GETMET R4 R0 K13 + 0x5C180600, // 001C MOVE R6 R3 + 0x7C100400, // 001D CALL R4 2 + 0x80000000, // 001E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: every_250ms +********************************************************************/ +be_local_closure(Matter_MessageHandler_every_250ms, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(im), + /* K1 */ be_nested_str_weak(every_250ms), + }), + be_str_weak(every_250ms), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -145,593 +764,26 @@ be_local_closure(Matter_MessageHandler_every_second, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: send_simple_ack -********************************************************************/ -be_local_closure(Matter_MessageHandler_send_simple_ack, /* name */ - be_nested_proto( - 12, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ - /* K0 */ be_nested_str_weak(x_flag_r), - /* K1 */ be_nested_str_weak(build_standalone_ack), - /* K2 */ be_nested_str_weak(encode_frame), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(MTR_X3A_X20_X3CAck_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20ack_X3D_X25i_X20id_X3D_X25i_X20_X25s), - /* K6 */ be_nested_str_weak(session), - /* K7 */ be_nested_str_weak(local_session_id), - /* K8 */ be_nested_str_weak(ack_message_counter), - /* K9 */ be_nested_str_weak(message_counter), - /* K10 */ be_nested_str_weak(_X7Breliable_X7D), - /* K11 */ be_nested_str_weak(), - /* K12 */ be_nested_str_weak(send_response_frame), - }), - be_str_weak(send_simple_ack), - &be_const_str_solidified, - ( &(const binstruction[26]) { /* code */ - 0x880C0300, // 0000 GETMBR R3 R1 K0 - 0x780E0016, // 0001 JMPF R3 #0019 - 0x8C0C0301, // 0002 GETMET R3 R1 K1 - 0x5C140400, // 0003 MOVE R5 R2 - 0x7C0C0400, // 0004 CALL R3 2 - 0x8C100702, // 0005 GETMET R4 R3 K2 - 0x7C100200, // 0006 CALL R4 1 - 0xB8120600, // 0007 GETNGBL R4 K3 - 0x8C100904, // 0008 GETMET R4 R4 K4 - 0x60180018, // 0009 GETGBL R6 G24 - 0x581C0005, // 000A LDCONST R7 K5 - 0x88200706, // 000B GETMBR R8 R3 K6 - 0x88201107, // 000C GETMBR R8 R8 K7 - 0x88240708, // 000D GETMBR R9 R3 K8 - 0x88280709, // 000E GETMBR R10 R3 K9 - 0x780A0001, // 000F JMPF R2 #0012 - 0x582C000A, // 0010 LDCONST R11 K10 - 0x70020000, // 0011 JMP #0013 - 0x582C000B, // 0012 LDCONST R11 K11 - 0x7C180A00, // 0013 CALL R6 5 - 0x541E0003, // 0014 LDINT R7 4 - 0x7C100600, // 0015 CALL R4 3 - 0x8C10010C, // 0016 GETMET R4 R0 K12 - 0x5C180600, // 0017 MOVE R6 R3 - 0x7C100400, // 0018 CALL R4 2 - 0x80000000, // 0019 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: msg_received -********************************************************************/ -be_local_closure(Matter_MessageHandler_msg_received, /* name */ - be_nested_proto( - 19, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[69]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(profiler), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(msg_received), - /* K4 */ be_nested_str_weak(matter), - /* K5 */ be_nested_str_weak(Frame), - /* K6 */ be_nested_str_weak(decode_header), - /* K7 */ be_nested_str_weak(sec_p), - /* K8 */ be_nested_str_weak(sessions), - /* K9 */ be_nested_str_weak(find_session_source_id_unsecure), - /* K10 */ be_nested_str_weak(source_node_id), - /* K11 */ be_nested_str_weak(control_message), - /* K12 */ be_nested_str_weak(process_incoming_control_message), - /* K13 */ be_nested_str_weak(local_session_id), - /* K14 */ be_const_int(0), - /* K15 */ be_nested_str_weak(sec_sesstype), - /* K16 */ be_nested_str_weak(_ip), - /* K17 */ be_nested_str_weak(_port), - /* K18 */ be_nested_str_weak(_message_handler), - /* K19 */ be_nested_str_weak(session), - /* K20 */ be_nested_str_weak(_counter_insecure_rcv), - /* K21 */ be_nested_str_weak(validate), - /* K22 */ be_nested_str_weak(message_counter), - /* K23 */ be_nested_str_weak(tasmota), - /* K24 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20unencrypted_X20message_X20_X3D_X20_X25i_X20ref_X20_X3D_X20_X25i), - /* K25 */ be_nested_str_weak(val), - /* K26 */ be_nested_str_weak(send_simple_ack), - /* K27 */ be_nested_str_weak(decode_payload), - /* K28 */ be_nested_str_weak(received_ack), - /* K29 */ be_nested_str_weak(opcode), - /* K30 */ be_nested_str_weak(get_opcode_name), - /* K31 */ be_nested_str_weak(0x_X2502X), - /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3EReceived_X20_X20_X28_X256i_X29_X20_X25s_X20rid_X3D_X25i_X20exch_X3D_X25i_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K33 */ be_nested_str_weak(exchange_id), - /* K34 */ be_const_int(3), - /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3Ercv_X20Ack_X20_X20_X20_X28_X256i_X29_X20rid_X3D_X25i_X20exch_X3D_X25i_X20ack_X3D_X25s_X20_X25sfrom_X20_X5B_X25s_X5D_X3A_X25i), - /* K36 */ be_nested_str_weak(x_flag_r), - /* K37 */ be_nested_str_weak(_X7Breliable_X7D_X20), - /* K38 */ be_nested_str_weak(), - /* K39 */ be_nested_str_weak(ack_message_counter), - /* K40 */ be_nested_str_weak(commissioning), - /* K41 */ be_nested_str_weak(process_incoming), - /* K42 */ be_nested_str_weak(MTR_X3A_X20decode_X20header_X3A_X20local_session_id_X3D_X25i_X20message_counter_X3D_X25i), - /* K43 */ be_nested_str_weak(get_session_by_local_session_id), - /* K44 */ be_nested_str_weak(MTR_X3A_X20unknown_X20local_session_id_X3D), - /* K45 */ be_nested_str_weak(counter_rcv_validate), - /* K46 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Duplicate_X20encrypted_X20message_X20_X3D_X20), - /* K47 */ be_nested_str_weak(_X20counter_X3D), - /* K48 */ be_nested_str_weak(counter_rcv), - /* K49 */ be_nested_str_weak(send_encrypted_ack), - /* K50 */ be_nested_str_weak(decrypt), - /* K51 */ be_nested_str_weak(raw), - /* K52 */ be_nested_str_weak(payload_idx), - /* K53 */ be_const_int(1), - /* K54 */ be_nested_str_weak(MTR_X3A_X20_X3E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Decrypted_X20message_X3A_X20protocol_id_X3A), - /* K55 */ be_nested_str_weak(protocol_id), - /* K56 */ be_nested_str_weak(_X20opcode_X3D), - /* K57 */ be_nested_str_weak(_X20exchange_id_X3D), - /* K58 */ be_nested_str_weak(im), - /* K59 */ be_nested_str_weak(process_incoming_ack), - /* K60 */ be_nested_str_weak(send_enqueued), - /* K61 */ be_nested_str_weak(process_IM_end), - /* K62 */ be_nested_str_weak(MTR_X3A_X20ignoring_X20unhandled_X20protocol_id_X3A), - /* K63 */ be_nested_str_weak(MTR_X3A_X20MessageHandler_X3A_X3Amsg_received_X20exception_X3A_X20), - /* K64 */ be_nested_str_weak(_X3B), - /* K65 */ be_const_int(2), - /* K66 */ be_nested_str_weak(_debug_present), - /* K67 */ be_nested_str_weak(debug), - /* K68 */ be_nested_str_weak(traceback), - }), - be_str_weak(msg_received), - &be_const_str_solidified, - ( &(const binstruction[333]) { /* code */ - 0x50100000, // 0000 LDBOOL R4 0 0 - 0x88140100, // 0001 GETMBR R5 R0 K0 - 0x88140B01, // 0002 GETMBR R5 R5 K1 - 0x8C140B02, // 0003 GETMET R5 R5 K2 - 0x581C0003, // 0004 LDCONST R7 K3 - 0x7C140400, // 0005 CALL R5 2 - 0xA802012B, // 0006 EXBLK 0 #0133 - 0xB8160800, // 0007 GETNGBL R5 K4 - 0x8C140B05, // 0008 GETMET R5 R5 K5 - 0x5C1C0000, // 0009 MOVE R7 R0 - 0x5C200200, // 000A MOVE R8 R1 - 0x5C240400, // 000B MOVE R9 R2 - 0x5C280600, // 000C MOVE R10 R3 - 0x7C140A00, // 000D CALL R5 5 - 0x8C180B06, // 000E GETMET R6 R5 K6 - 0x7C180200, // 000F CALL R6 1 - 0x5C1C0C00, // 0010 MOVE R7 R6 - 0x741E0002, // 0011 JMPT R7 #0015 - 0x501C0000, // 0012 LDBOOL R7 0 0 - 0xA8040001, // 0013 EXBLK 1 1 - 0x80040E00, // 0014 RET 1 R7 - 0x881C0B07, // 0015 GETMBR R7 R5 K7 - 0x781E000C, // 0016 JMPF R7 #0024 - 0x881C0100, // 0017 GETMBR R7 R0 K0 - 0x881C0F08, // 0018 GETMBR R7 R7 K8 - 0x8C1C0F09, // 0019 GETMET R7 R7 K9 - 0x88240B0A, // 001A GETMBR R9 R5 K10 - 0x542A0059, // 001B LDINT R10 90 - 0x7C1C0600, // 001C CALL R7 3 - 0x8820010B, // 001D GETMBR R8 R0 K11 - 0x8C20110C, // 001E GETMET R8 R8 K12 - 0x5C280A00, // 001F MOVE R10 R5 - 0x7C200400, // 0020 CALL R8 2 - 0xA8040001, // 0021 EXBLK 1 1 - 0x80041000, // 0022 RET 1 R8 - 0x7002010A, // 0023 JMP #012F - 0x881C0B0D, // 0024 GETMBR R7 R5 K13 - 0x1C1C0F0E, // 0025 EQ R7 R7 K14 - 0x781E0070, // 0026 JMPF R7 #0098 - 0x881C0B0F, // 0027 GETMBR R7 R5 K15 - 0x1C1C0F0E, // 0028 EQ R7 R7 K14 - 0x781E006D, // 0029 JMPF R7 #0098 - 0x881C0100, // 002A GETMBR R7 R0 K0 - 0x881C0F08, // 002B GETMBR R7 R7 K8 - 0x8C1C0F09, // 002C GETMET R7 R7 K9 - 0x88240B0A, // 002D GETMBR R9 R5 K10 - 0x542A0059, // 002E LDINT R10 90 - 0x7C1C0600, // 002F CALL R7 3 - 0x780A0000, // 0030 JMPF R2 #0032 - 0x901E2002, // 0031 SETMBR R7 K16 R2 - 0x780E0000, // 0032 JMPF R3 #0034 - 0x901E2203, // 0033 SETMBR R7 K17 R3 - 0x901E2400, // 0034 SETMBR R7 K18 R0 - 0x90162607, // 0035 SETMBR R5 K19 R7 - 0x88200F14, // 0036 GETMBR R8 R7 K20 - 0x8C201115, // 0037 GETMET R8 R8 K21 - 0x88280B16, // 0038 GETMBR R10 R5 K22 - 0x502C0000, // 0039 LDBOOL R11 0 0 - 0x7C200600, // 003A CALL R8 3 - 0x74220011, // 003B JMPT R8 #004E - 0xB8222E00, // 003C GETNGBL R8 K23 - 0x8C201102, // 003D GETMET R8 R8 K2 - 0x60280018, // 003E GETGBL R10 G24 - 0x582C0018, // 003F LDCONST R11 K24 - 0x88300B16, // 0040 GETMBR R12 R5 K22 - 0x88340F14, // 0041 GETMBR R13 R7 K20 - 0x8C341B19, // 0042 GETMET R13 R13 K25 - 0x7C340200, // 0043 CALL R13 1 - 0x7C280600, // 0044 CALL R10 3 - 0x542E0003, // 0045 LDINT R11 4 - 0x7C200600, // 0046 CALL R8 3 - 0x8C20011A, // 0047 GETMET R8 R0 K26 - 0x5C280A00, // 0048 MOVE R10 R5 - 0x502C0000, // 0049 LDBOOL R11 0 0 - 0x7C200600, // 004A CALL R8 3 - 0x50200000, // 004B LDBOOL R8 0 0 - 0xA8040001, // 004C EXBLK 1 1 - 0x80041000, // 004D RET 1 R8 - 0x8C200B1B, // 004E GETMET R8 R5 K27 - 0x7C200200, // 004F CALL R8 1 - 0x74220002, // 0050 JMPT R8 #0054 - 0x50200000, // 0051 LDBOOL R8 0 0 - 0xA8040001, // 0052 EXBLK 1 1 - 0x80041000, // 0053 RET 1 R8 - 0x88200100, // 0054 GETMBR R8 R0 K0 - 0x8C20111C, // 0055 GETMET R8 R8 K28 - 0x5C280A00, // 0056 MOVE R10 R5 - 0x7C200400, // 0057 CALL R8 2 - 0x88200B1D, // 0058 GETMBR R8 R5 K29 - 0x5426000F, // 0059 LDINT R9 16 - 0x20201009, // 005A NE R8 R8 R9 - 0x78220018, // 005B JMPF R8 #0075 - 0xB8220800, // 005C GETNGBL R8 K4 - 0x8C20111E, // 005D GETMET R8 R8 K30 - 0x88280B1D, // 005E GETMBR R10 R5 K29 - 0x7C200400, // 005F CALL R8 2 - 0x5C241000, // 0060 MOVE R9 R8 - 0x74260004, // 0061 JMPT R9 #0067 - 0x60240018, // 0062 GETGBL R9 G24 - 0x5828001F, // 0063 LDCONST R10 K31 - 0x882C0B1D, // 0064 GETMBR R11 R5 K29 - 0x7C240400, // 0065 CALL R9 2 - 0x5C201200, // 0066 MOVE R8 R9 - 0xB8262E00, // 0067 GETNGBL R9 K23 - 0x8C241302, // 0068 GETMET R9 R9 K2 - 0x602C0018, // 0069 GETGBL R11 G24 - 0x58300020, // 006A LDCONST R12 K32 - 0x88340F0D, // 006B GETMBR R13 R7 K13 - 0x5C381000, // 006C MOVE R14 R8 - 0x883C0B16, // 006D GETMBR R15 R5 K22 - 0x88400B21, // 006E GETMBR R16 R5 K33 - 0x5C440400, // 006F MOVE R17 R2 - 0x5C480600, // 0070 MOVE R18 R3 - 0x7C2C0E00, // 0071 CALL R11 7 - 0x58300022, // 0072 LDCONST R12 K34 - 0x7C240600, // 0073 CALL R9 3 - 0x70020013, // 0074 JMP #0089 - 0xB8222E00, // 0075 GETNGBL R8 K23 - 0x8C201102, // 0076 GETMET R8 R8 K2 - 0x60280018, // 0077 GETGBL R10 G24 - 0x582C0023, // 0078 LDCONST R11 K35 - 0x88300F0D, // 0079 GETMBR R12 R7 K13 - 0x88340B16, // 007A GETMBR R13 R5 K22 - 0x88380B24, // 007B GETMBR R14 R5 K36 - 0x783A0001, // 007C JMPF R14 #007F - 0x58380025, // 007D LDCONST R14 K37 - 0x70020000, // 007E JMP #0080 - 0x58380026, // 007F LDCONST R14 K38 - 0x883C0B21, // 0080 GETMBR R15 R5 K33 - 0x60400008, // 0081 GETGBL R16 G8 - 0x88440B27, // 0082 GETMBR R17 R5 K39 - 0x7C400200, // 0083 CALL R16 1 - 0x5C440400, // 0084 MOVE R17 R2 - 0x5C480600, // 0085 MOVE R18 R3 - 0x7C281000, // 0086 CALL R10 8 - 0x542E0003, // 0087 LDINT R11 4 - 0x7C200600, // 0088 CALL R8 3 - 0x88200128, // 0089 GETMBR R8 R0 K40 - 0x8C201129, // 008A GETMET R8 R8 K41 - 0x5C280A00, // 008B MOVE R10 R5 - 0x7C200400, // 008C CALL R8 2 - 0x5C101000, // 008D MOVE R4 R8 - 0x5C200800, // 008E MOVE R8 R4 - 0x74220003, // 008F JMPT R8 #0094 - 0x8C20011A, // 0090 GETMET R8 R0 K26 - 0x5C280A00, // 0091 MOVE R10 R5 - 0x502C0000, // 0092 LDBOOL R11 0 0 - 0x7C200600, // 0093 CALL R8 3 - 0x50200200, // 0094 LDBOOL R8 1 0 - 0xA8040001, // 0095 EXBLK 1 1 - 0x80041000, // 0096 RET 1 R8 - 0x70020096, // 0097 JMP #012F - 0xB81E2E00, // 0098 GETNGBL R7 K23 - 0x8C1C0F02, // 0099 GETMET R7 R7 K2 - 0x60240018, // 009A GETGBL R9 G24 - 0x5828002A, // 009B LDCONST R10 K42 - 0x882C0B0D, // 009C GETMBR R11 R5 K13 - 0x88300B16, // 009D GETMBR R12 R5 K22 - 0x7C240600, // 009E CALL R9 3 - 0x542A0003, // 009F LDINT R10 4 - 0x7C1C0600, // 00A0 CALL R7 3 - 0x881C0100, // 00A1 GETMBR R7 R0 K0 - 0x881C0F08, // 00A2 GETMBR R7 R7 K8 - 0x8C1C0F2B, // 00A3 GETMET R7 R7 K43 - 0x88240B0D, // 00A4 GETMBR R9 R5 K13 - 0x7C1C0400, // 00A5 CALL R7 2 - 0x4C200000, // 00A6 LDNIL R8 - 0x1C200E08, // 00A7 EQ R8 R7 R8 - 0x7822000A, // 00A8 JMPF R8 #00B4 - 0xB8222E00, // 00A9 GETNGBL R8 K23 - 0x8C201102, // 00AA GETMET R8 R8 K2 - 0x60280008, // 00AB GETGBL R10 G8 - 0x882C0B0D, // 00AC GETMBR R11 R5 K13 - 0x7C280200, // 00AD CALL R10 1 - 0x002A580A, // 00AE ADD R10 K44 R10 - 0x582C0022, // 00AF LDCONST R11 K34 - 0x7C200600, // 00B0 CALL R8 3 - 0x50200000, // 00B1 LDBOOL R8 0 0 - 0xA8040001, // 00B2 EXBLK 1 1 - 0x80041000, // 00B3 RET 1 R8 - 0x780A0000, // 00B4 JMPF R2 #00B6 - 0x901E2002, // 00B5 SETMBR R7 K16 R2 - 0x780E0000, // 00B6 JMPF R3 #00B8 - 0x901E2203, // 00B7 SETMBR R7 K17 R3 - 0x901E2400, // 00B8 SETMBR R7 K18 R0 - 0x90162607, // 00B9 SETMBR R5 K19 R7 - 0x8C200F2D, // 00BA GETMET R8 R7 K45 - 0x88280B16, // 00BB GETMBR R10 R5 K22 - 0x502C0200, // 00BC LDBOOL R11 1 0 - 0x7C200600, // 00BD CALL R8 3 - 0x74220013, // 00BE JMPT R8 #00D3 - 0xB8222E00, // 00BF GETNGBL R8 K23 - 0x8C201102, // 00C0 GETMET R8 R8 K2 - 0x60280008, // 00C1 GETGBL R10 G8 - 0x882C0B16, // 00C2 GETMBR R11 R5 K22 - 0x7C280200, // 00C3 CALL R10 1 - 0x002A5C0A, // 00C4 ADD R10 K46 R10 - 0x0028152F, // 00C5 ADD R10 R10 K47 - 0x602C0008, // 00C6 GETGBL R11 G8 - 0x88300F30, // 00C7 GETMBR R12 R7 K48 - 0x7C2C0200, // 00C8 CALL R11 1 - 0x0028140B, // 00C9 ADD R10 R10 R11 - 0x582C0022, // 00CA LDCONST R11 K34 - 0x7C200600, // 00CB CALL R8 3 - 0x8C200131, // 00CC GETMET R8 R0 K49 - 0x5C280A00, // 00CD MOVE R10 R5 - 0x502C0000, // 00CE LDBOOL R11 0 0 - 0x7C200600, // 00CF CALL R8 3 - 0x50200000, // 00D0 LDBOOL R8 0 0 - 0xA8040001, // 00D1 EXBLK 1 1 - 0x80041000, // 00D2 RET 1 R8 - 0x8C200B32, // 00D3 GETMET R8 R5 K50 - 0x7C200200, // 00D4 CALL R8 1 - 0x5C241000, // 00D5 MOVE R9 R8 - 0x74260002, // 00D6 JMPT R9 #00DA - 0x50240000, // 00D7 LDBOOL R9 0 0 - 0xA8040001, // 00D8 EXBLK 1 1 - 0x80041200, // 00D9 RET 1 R9 - 0x88240B34, // 00DA GETMBR R9 R5 K52 - 0x04241335, // 00DB SUB R9 R9 K53 - 0x40261C09, // 00DC CONNECT R9 K14 R9 - 0x88280B33, // 00DD GETMBR R10 R5 K51 - 0x94241409, // 00DE GETIDX R9 R10 R9 - 0x90166609, // 00DF SETMBR R5 K51 R9 - 0x88240B33, // 00E0 GETMBR R9 R5 K51 - 0x40241208, // 00E1 CONNECT R9 R9 R8 - 0x8C240B1B, // 00E2 GETMET R9 R5 K27 - 0x7C240200, // 00E3 CALL R9 1 - 0xB8262E00, // 00E4 GETNGBL R9 K23 - 0x8C241302, // 00E5 GETMET R9 R9 K2 - 0x602C0008, // 00E6 GETGBL R11 G8 - 0x88300B37, // 00E7 GETMBR R12 R5 K55 - 0x7C2C0200, // 00E8 CALL R11 1 - 0x002E6C0B, // 00E9 ADD R11 K54 R11 - 0x002C1738, // 00EA ADD R11 R11 K56 - 0x60300008, // 00EB GETGBL R12 G8 - 0x88340B1D, // 00EC GETMBR R13 R5 K29 - 0x7C300200, // 00ED CALL R12 1 - 0x002C160C, // 00EE ADD R11 R11 R12 - 0x002C1739, // 00EF ADD R11 R11 K57 - 0x60300008, // 00F0 GETGBL R12 G8 - 0x88340B21, // 00F1 GETMBR R13 R5 K33 - 0x543AFFFE, // 00F2 LDINT R14 65535 - 0x2C341A0E, // 00F3 AND R13 R13 R14 - 0x7C300200, // 00F4 CALL R12 1 - 0x002C160C, // 00F5 ADD R11 R11 R12 - 0x54320003, // 00F6 LDINT R12 4 - 0x7C240600, // 00F7 CALL R9 3 - 0x88240100, // 00F8 GETMBR R9 R0 K0 - 0x8C24131C, // 00F9 GETMET R9 R9 K28 - 0x5C2C0A00, // 00FA MOVE R11 R5 - 0x7C240400, // 00FB CALL R9 2 - 0x88240B37, // 00FC GETMBR R9 R5 K55 - 0x1C28130E, // 00FD EQ R10 R9 K14 - 0x782A000F, // 00FE JMPF R10 #010F - 0x88280B1D, // 00FF GETMBR R10 R5 K29 - 0x542E000F, // 0100 LDINT R11 16 - 0x1C28140B, // 0101 EQ R10 R10 R11 - 0x782A0009, // 0102 JMPF R10 #010D - 0x8828013A, // 0103 GETMBR R10 R0 K58 - 0x8C28153B, // 0104 GETMET R10 R10 K59 - 0x5C300A00, // 0105 MOVE R12 R5 - 0x7C280400, // 0106 CALL R10 2 - 0x5C101400, // 0107 MOVE R4 R10 - 0x78120003, // 0108 JMPF R4 #010D - 0x8828013A, // 0109 GETMBR R10 R0 K58 - 0x8C28153C, // 010A GETMET R10 R10 K60 - 0x5C300000, // 010B MOVE R12 R0 - 0x7C280400, // 010C CALL R10 2 - 0x50100200, // 010D LDBOOL R4 1 0 - 0x7002001F, // 010E JMP #012F - 0x1C281335, // 010F EQ R10 R9 K53 - 0x782A0015, // 0110 JMPF R10 #0127 - 0x8828013A, // 0111 GETMBR R10 R0 K58 - 0x8C281529, // 0112 GETMET R10 R10 K41 - 0x5C300A00, // 0113 MOVE R12 R5 - 0x7C280400, // 0114 CALL R10 2 - 0x5C101400, // 0115 MOVE R4 R10 - 0x88280100, // 0116 GETMBR R10 R0 K0 - 0x88281501, // 0117 GETMBR R10 R10 K1 - 0x8C281502, // 0118 GETMET R10 R10 K2 - 0x5830003D, // 0119 LDCONST R12 K61 - 0x7C280400, // 011A CALL R10 2 - 0x78120004, // 011B JMPF R4 #0121 - 0x8828013A, // 011C GETMBR R10 R0 K58 - 0x8C28153C, // 011D GETMET R10 R10 K60 - 0x5C300000, // 011E MOVE R12 R0 - 0x7C280400, // 011F CALL R10 2 - 0x70020003, // 0120 JMP #0125 - 0x8C280131, // 0121 GETMET R10 R0 K49 - 0x5C300A00, // 0122 MOVE R12 R5 - 0x50340200, // 0123 LDBOOL R13 1 0 - 0x7C280600, // 0124 CALL R10 3 - 0x50100200, // 0125 LDBOOL R4 1 0 - 0x70020007, // 0126 JMP #012F - 0xB82A2E00, // 0127 GETNGBL R10 K23 - 0x8C281502, // 0128 GETMET R10 R10 K2 - 0x60300008, // 0129 GETGBL R12 G8 - 0x5C341200, // 012A MOVE R13 R9 - 0x7C300200, // 012B CALL R12 1 - 0x00327C0C, // 012C ADD R12 K62 R12 - 0x58340022, // 012D LDCONST R13 K34 - 0x7C280600, // 012E CALL R10 3 - 0xA8040001, // 012F EXBLK 1 1 - 0x80040800, // 0130 RET 1 R4 - 0xA8040001, // 0131 EXBLK 1 1 - 0x70020018, // 0132 JMP #014C - 0xAC140002, // 0133 CATCH R5 0 2 - 0x70020015, // 0134 JMP #014B - 0xB81E2E00, // 0135 GETNGBL R7 K23 - 0x8C1C0F02, // 0136 GETMET R7 R7 K2 - 0x60240008, // 0137 GETGBL R9 G8 - 0x5C280A00, // 0138 MOVE R10 R5 - 0x7C240200, // 0139 CALL R9 1 - 0x00267E09, // 013A ADD R9 K63 R9 - 0x00241340, // 013B ADD R9 R9 K64 - 0x60280008, // 013C GETGBL R10 G8 - 0x5C2C0C00, // 013D MOVE R11 R6 - 0x7C280200, // 013E CALL R10 1 - 0x0024120A, // 013F ADD R9 R9 R10 - 0x58280041, // 0140 LDCONST R10 K65 - 0x7C1C0600, // 0141 CALL R7 3 - 0xB81E2E00, // 0142 GETNGBL R7 K23 - 0x881C0F42, // 0143 GETMBR R7 R7 K66 - 0x781E0002, // 0144 JMPF R7 #0148 - 0xA41E8600, // 0145 IMPORT R7 K67 - 0x8C200F44, // 0146 GETMET R8 R7 K68 - 0x7C200200, // 0147 CALL R8 1 - 0x501C0000, // 0148 LDBOOL R7 0 0 - 0x80040E00, // 0149 RET 1 R7 - 0x70020000, // 014A JMP #014C - 0xB0080000, // 014B RAISE 2 R0 R0 - 0x80000000, // 014C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_250ms -********************************************************************/ -be_local_closure(Matter_MessageHandler_every_250ms, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(im), - /* K1 */ be_nested_str_weak(every_250ms), - }), - be_str_weak(every_250ms), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_MessageHandler_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(commissioning), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Commisioning_Context), - /* K4 */ be_nested_str_weak(im), - /* K5 */ be_nested_str_weak(IM), - /* K6 */ be_nested_str_weak(control_message), - /* K7 */ be_nested_str_weak(Control_Message), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0xB80A0400, // 0001 GETNGBL R2 K2 - 0x8C080503, // 0002 GETMET R2 R2 K3 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C080400, // 0004 CALL R2 2 - 0x90020202, // 0005 SETMBR R0 K1 R2 - 0xB80A0400, // 0006 GETNGBL R2 K2 - 0x8C080505, // 0007 GETMET R2 R2 K5 - 0x5C100200, // 0008 MOVE R4 R1 - 0x7C080400, // 0009 CALL R2 2 - 0x90020802, // 000A SETMBR R0 K4 R2 - 0xB80A0400, // 000B GETNGBL R2 K2 - 0x8C080507, // 000C GETMET R2 R2 K7 - 0x5C100000, // 000D MOVE R4 R0 - 0x7C080400, // 000E CALL R2 2 - 0x90020C02, // 000F SETMBR R0 K6 R2 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_MessageHandler ********************************************************************/ be_local_class(Matter_MessageHandler, - 4, + 5, NULL, - be_nested_map(11, + be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(im, 3), be_const_var(2) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_MessageHandler_init_closure) }, + { be_const_key_weak(commissioning, -1), be_const_var(1) }, + { be_const_key_weak(_n_bytes, 7), be_const_var(4) }, { be_const_key_weak(send_encrypted_ack, -1), be_const_closure(Matter_MessageHandler_send_encrypted_ack_closure) }, + { be_const_key_weak(init, 5), be_const_closure(Matter_MessageHandler_init_closure) }, + { be_const_key_weak(msg_received, -1), be_const_closure(Matter_MessageHandler_msg_received_closure) }, + { be_const_key_weak(im, 11), be_const_var(2) }, { be_const_key_weak(every_second, -1), be_const_closure(Matter_MessageHandler_every_second_closure) }, { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_MessageHandler_every_250ms_closure) }, - { be_const_key_weak(device, -1), be_const_var(0) }, - { be_const_key_weak(msg_received, -1), be_const_closure(Matter_MessageHandler_msg_received_closure) }, - { be_const_key_weak(control_message, 4), be_const_var(3) }, - { be_const_key_weak(commissioning, -1), be_const_var(1) }, { be_const_key_weak(send_simple_ack, 1), be_const_closure(Matter_MessageHandler_send_simple_ack_closure) }, - { be_const_key_weak(send_response_frame, 0), be_const_closure(Matter_MessageHandler_send_response_frame_closure) }, + { be_const_key_weak(send_response_frame, 6), be_const_closure(Matter_MessageHandler_send_response_frame_closure) }, + { be_const_key_weak(control_message, -1), be_const_var(3) }, + { be_const_key_weak(device, -1), be_const_var(0) }, })), be_str_weak(Matter_MessageHandler) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h index 3fa3881cc..b299cc24b 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h @@ -6,46 +6,6 @@ extern const bclass be_class_Matter_Path; -/******************************************************************** -** Solidified function: clear -********************************************************************/ -be_local_closure(Matter_Path_clear, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), - /* K1 */ be_nested_str_weak(cluster), - /* K2 */ be_nested_str_weak(attribute), - /* K3 */ be_nested_str_weak(command), - /* K4 */ be_nested_str_weak(status), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(msh), - }), - be_str_weak(clear), - &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0x4C040000, // 0000 LDNIL R1 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x90020201, // 0002 SETMBR R0 K1 R1 - 0x90020401, // 0003 SETMBR R0 K2 R1 - 0x90020601, // 0004 SETMBR R0 K3 R1 - 0x90020801, // 0005 SETMBR R0 K4 R1 - 0x90020A01, // 0006 SETMBR R0 K5 R1 - 0x90020C01, // 0007 SETMBR R0 K6 R1 - 0x80000000, // 0008 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: tostring ********************************************************************/ @@ -157,23 +117,66 @@ be_local_closure(Matter_Path_tostring, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_Path_reset, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + /* K1 */ be_nested_str_weak(cluster), + /* K2 */ be_nested_str_weak(attribute), + /* K3 */ be_nested_str_weak(fabric_filtered), + /* K4 */ be_nested_str_weak(command), + /* K5 */ be_nested_str_weak(status), + /* K6 */ be_nested_str_weak(log), + /* K7 */ be_nested_str_weak(msg), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C040000, // 0000 LDNIL R1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x90020201, // 0002 SETMBR R0 K1 R1 + 0x90020401, // 0003 SETMBR R0 K2 R1 + 0x90020601, // 0004 SETMBR R0 K3 R1 + 0x90020801, // 0005 SETMBR R0 K4 R1 + 0x90020A01, // 0006 SETMBR R0 K5 R1 + 0x90020C01, // 0007 SETMBR R0 K6 R1 + 0x90020E01, // 0008 SETMBR R0 K7 R1 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_Path ********************************************************************/ be_local_class(Matter_Path, - 7, + 8, NULL, - be_nested_map(9, + be_nested_map(10, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(log, -1), be_const_var(5) }, - { be_const_key_weak(cluster, -1), be_const_var(1) }, - { be_const_key_weak(command, -1), be_const_var(3) }, + { be_const_key_weak(attribute, -1), be_const_var(2) }, + { be_const_key_weak(log, 0), be_const_var(6) }, + { be_const_key_weak(fabric_filtered, 6), be_const_var(3) }, + { be_const_key_weak(command, -1), be_const_var(4) }, + { be_const_key_weak(msg, -1), be_const_var(7) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_Path_tostring_closure) }, - { be_const_key_weak(status, 1), be_const_var(4) }, - { be_const_key_weak(attribute, 6), be_const_var(2) }, - { be_const_key_weak(clear, -1), be_const_closure(Matter_Path_clear_closure) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_Path_reset_closure) }, + { be_const_key_weak(cluster, -1), be_const_var(1) }, { be_const_key_weak(endpoint, 3), be_const_var(0) }, - { be_const_key_weak(msg, -1), be_const_var(6) }, + { be_const_key_weak(status, -1), be_const_var(5) }, })), be_str_weak(Matter_Path) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h index 59b285408..1796b6216 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin.h @@ -6,322 +6,6 @@ extern const bclass be_class_Matter_Plugin; -/******************************************************************** -** Solidified function: parse_sensors -********************************************************************/ -be_local_closure(Matter_Plugin_parse_sensors, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_sensors), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_cluster_list -********************************************************************/ -be_local_closure(Matter_Plugin_get_cluster_list, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(keys), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(get_cluster_list), - &be_const_str_solidified, - ( &(const binstruction[18]) { /* code */ - 0x60080012, // 0000 GETGBL R2 G18 - 0x7C080000, // 0001 CALL R2 0 - 0x600C0010, // 0002 GETGBL R3 G16 - 0x88100100, // 0003 GETMBR R4 R0 K0 - 0x8C100901, // 0004 GETMET R4 R4 K1 - 0x7C100200, // 0005 CALL R4 1 - 0x7C0C0200, // 0006 CALL R3 1 - 0xA8020005, // 0007 EXBLK 0 #000E - 0x5C100600, // 0008 MOVE R4 R3 - 0x7C100000, // 0009 CALL R4 0 - 0x8C140502, // 000A GETMET R5 R2 K2 - 0x5C1C0800, // 000B MOVE R7 R4 - 0x7C140400, // 000C CALL R5 2 - 0x7001FFF9, // 000D JMP #0008 - 0x580C0003, // 000E LDCONST R3 K3 - 0xAC0C0200, // 000F CATCH R3 1 0 - 0xB0080000, // 0010 RAISE 2 R0 R0 - 0x80040400, // 0011 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: write_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_write_attribute, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(write_attribute), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: parse_configuration -********************************************************************/ -be_local_closure(Matter_Plugin_parse_configuration, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(parse_configuration), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: ui_conf_to_string -********************************************************************/ -be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(find), - /* K3 */ be_nested_str_weak(), - }), - be_str_weak(ui_conf_to_string), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x780E0006, // 0002 JMPF R3 #000A - 0x60100008, // 0003 GETGBL R4 G8 - 0x8C140302, // 0004 GETMET R5 R1 K2 - 0x5C1C0600, // 0005 MOVE R7 R3 - 0x58200003, // 0006 LDCONST R8 K3 - 0x7C140600, // 0007 CALL R5 3 - 0x7C100200, // 0008 CALL R4 1 - 0x70020000, // 0009 JMP #000B - 0x58100003, // 000A LDCONST R4 K3 - 0x80040800, // 000B RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: read_attribute -********************************************************************/ -be_local_closure(Matter_Plugin_read_attribute, /* name */ - be_nested_proto( - 16, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[20]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(cluster), - /* K3 */ be_nested_str_weak(attribute), - /* K4 */ be_const_int(0), - /* K5 */ be_nested_str_weak(Matter_TLV_array), - /* K6 */ be_nested_str_weak(TYPES), - /* K7 */ be_nested_str_weak(keys), - /* K8 */ be_nested_str_weak(add_struct), - /* K9 */ be_nested_str_weak(add_TLV), - /* K10 */ be_nested_str_weak(U2), - /* K11 */ be_const_int(1), - /* K12 */ be_nested_str_weak(stop_iteration), - /* K13 */ be_nested_str_weak(get_cluster_list), - /* K14 */ be_nested_str_weak(U4), - /* K15 */ be_const_int(2), - /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(create_TLV), - /* K18 */ be_nested_str_weak(BOOL), - /* K19 */ be_nested_str_weak(read_attribute), - }), - be_str_weak(read_attribute), - &be_const_str_solidified, - ( &(const binstruction[113]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A001C, // 0004 LDINT R6 29 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0051, // 0006 JMPF R6 #0059 - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A001B, // 0008 JMPF R6 #0025 - 0x8C180705, // 0009 GETMET R6 R3 K5 - 0x7C180200, // 000A CALL R6 1 - 0x881C0106, // 000B GETMBR R7 R0 K6 - 0x60200010, // 000C GETGBL R8 G16 - 0x8C240F07, // 000D GETMET R9 R7 K7 - 0x7C240200, // 000E CALL R9 1 - 0x7C200200, // 000F CALL R8 1 - 0xA802000E, // 0010 EXBLK 0 #0020 - 0x5C241000, // 0011 MOVE R9 R8 - 0x7C240000, // 0012 CALL R9 0 - 0x8C280D08, // 0013 GETMET R10 R6 K8 - 0x7C280200, // 0014 CALL R10 1 - 0x8C2C1509, // 0015 GETMET R11 R10 K9 - 0x58340004, // 0016 LDCONST R13 K4 - 0x8838070A, // 0017 GETMBR R14 R3 K10 - 0x5C3C1200, // 0018 MOVE R15 R9 - 0x7C2C0800, // 0019 CALL R11 4 - 0x8C2C1509, // 001A GETMET R11 R10 K9 - 0x5834000B, // 001B LDCONST R13 K11 - 0x8838070A, // 001C GETMBR R14 R3 K10 - 0x943C0E09, // 001D GETIDX R15 R7 R9 - 0x7C2C0800, // 001E CALL R11 4 - 0x7001FFF0, // 001F JMP #0011 - 0x5820000C, // 0020 LDCONST R8 K12 - 0xAC200200, // 0021 CATCH R8 1 0 - 0xB0080000, // 0022 RAISE 2 R0 R0 - 0x80040C00, // 0023 RET 1 R6 - 0x70020032, // 0024 JMP #0058 - 0x1C180B0B, // 0025 EQ R6 R5 K11 - 0x781A0013, // 0026 JMPF R6 #003B - 0x8C180705, // 0027 GETMET R6 R3 K5 - 0x7C180200, // 0028 CALL R6 1 - 0x601C0010, // 0029 GETGBL R7 G16 - 0x8C20010D, // 002A GETMET R8 R0 K13 - 0x7C200200, // 002B CALL R8 1 - 0x7C1C0200, // 002C CALL R7 1 - 0xA8020007, // 002D EXBLK 0 #0036 - 0x5C200E00, // 002E MOVE R8 R7 - 0x7C200000, // 002F CALL R8 0 - 0x8C240D09, // 0030 GETMET R9 R6 K9 - 0x4C2C0000, // 0031 LDNIL R11 - 0x8830070E, // 0032 GETMBR R12 R3 K14 - 0x5C341000, // 0033 MOVE R13 R8 - 0x7C240800, // 0034 CALL R9 4 - 0x7001FFF7, // 0035 JMP #002E - 0x581C000C, // 0036 LDCONST R7 K12 - 0xAC1C0200, // 0037 CATCH R7 1 0 - 0xB0080000, // 0038 RAISE 2 R0 R0 - 0x80040C00, // 0039 RET 1 R6 - 0x7002001C, // 003A JMP #0058 - 0x1C180B0F, // 003B EQ R6 R5 K15 - 0x781A0003, // 003C JMPF R6 #0041 - 0x8C180705, // 003D GETMET R6 R3 K5 - 0x7C180200, // 003E CALL R6 1 - 0x80040C00, // 003F RET 1 R6 - 0x70020016, // 0040 JMP #0058 - 0x1C180B10, // 0041 EQ R6 R5 K16 - 0x781A0003, // 0042 JMPF R6 #0047 - 0x8C180705, // 0043 GETMET R6 R3 K5 - 0x7C180200, // 0044 CALL R6 1 - 0x80040C00, // 0045 RET 1 R6 - 0x70020010, // 0046 JMP #0058 - 0x541AFFFB, // 0047 LDINT R6 65532 - 0x1C180A06, // 0048 EQ R6 R5 R6 - 0x781A0005, // 0049 JMPF R6 #0050 - 0x8C180711, // 004A GETMET R6 R3 K17 - 0x8820070E, // 004B GETMBR R8 R3 K14 - 0x58240004, // 004C LDCONST R9 K4 - 0x7C180600, // 004D CALL R6 3 - 0x80040C00, // 004E RET 1 R6 - 0x70020007, // 004F JMP #0058 - 0x541AFFFC, // 0050 LDINT R6 65533 - 0x1C180A06, // 0051 EQ R6 R5 R6 - 0x781A0004, // 0052 JMPF R6 #0058 - 0x8C180711, // 0053 GETMET R6 R3 K17 - 0x8820070E, // 0054 GETMBR R8 R3 K14 - 0x5824000B, // 0055 LDCONST R9 K11 - 0x7C180600, // 0056 CALL R6 3 - 0x80040C00, // 0057 RET 1 R6 - 0x70020016, // 0058 JMP #0070 - 0x541A0038, // 0059 LDINT R6 57 - 0x1C180806, // 005A EQ R6 R4 R6 - 0x781A0011, // 005B JMPF R6 #006E - 0x541A0010, // 005C LDINT R6 17 - 0x1C180A06, // 005D EQ R6 R5 R6 - 0x781A0005, // 005E JMPF R6 #0065 - 0x8C180711, // 005F GETMET R6 R3 K17 - 0x88200712, // 0060 GETMBR R8 R3 K18 - 0x5824000B, // 0061 LDCONST R9 K11 - 0x7C180600, // 0062 CALL R6 3 - 0x80040C00, // 0063 RET 1 R6 - 0x70020007, // 0064 JMP #006D - 0x60180003, // 0065 GETGBL R6 G3 - 0x5C1C0000, // 0066 MOVE R7 R0 - 0x7C180200, // 0067 CALL R6 1 - 0x8C180D13, // 0068 GETMET R6 R6 K19 - 0x5C200200, // 0069 MOVE R8 R1 - 0x5C240400, // 006A MOVE R9 R2 - 0x7C180600, // 006B CALL R6 3 - 0x80040C00, // 006C RET 1 R6 - 0x70020001, // 006D JMP #0070 - 0x4C180000, // 006E LDNIL R6 - 0x80040C00, // 006F RET 1 R6 - 0x80000000, // 0070 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -361,79 +45,9 @@ be_local_closure(Matter_Plugin_init, /* name */ /******************************************************************** -** Solidified function: +** Solidified function: read_event ********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: has -********************************************************************/ -be_local_closure(Matter_Plugin_has, /* name */ - be_nested_proto( - 6, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(contains), - /* K2 */ be_nested_str_weak(endpoints), - /* K3 */ be_nested_str_weak(find), - }), - be_str_weak(has), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x7C0C0400, // 0003 CALL R3 2 - 0x780E0006, // 0004 JMPF R3 #000C - 0x880C0102, // 0005 GETMBR R3 R0 K2 - 0x8C0C0703, // 0006 GETMET R3 R3 K3 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x4C100000, // 0009 LDNIL R4 - 0x200C0604, // 000A NE R3 R3 R4 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x80040600, // 000E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: subscribe_event -********************************************************************/ -be_local_closure(Matter_Plugin_subscribe_event, /* name */ +be_local_closure(Matter_Plugin_read_event, /* name */ be_nested_proto( 6, /* nstack */ 5, /* argc */ @@ -444,7 +58,7 @@ be_local_closure(Matter_Plugin_subscribe_event, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(subscribe_event), + be_str_weak(read_event), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 @@ -456,46 +70,9 @@ be_local_closure(Matter_Plugin_subscribe_event, /* name */ /******************************************************************** -** Solidified function: ui_string_to_conf +** Solidified function: is_local_device ********************************************************************/ -be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ - be_nested_proto( - 8, /* nstack */ - 3, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_Plugin), - /* K1 */ be_nested_str_weak(ARG), - /* K2 */ be_nested_str_weak(ARG_TYPE), - }), - be_str_weak(ui_string_to_conf), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x580C0000, // 0000 LDCONST R3 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140102, // 0002 GETMBR R5 R0 K2 - 0x780A0004, // 0003 JMPF R2 #0009 - 0x78120003, // 0004 JMPF R4 #0009 - 0x5C180A00, // 0005 MOVE R6 R5 - 0x5C1C0400, // 0006 MOVE R7 R2 - 0x7C180200, // 0007 CALL R6 1 - 0x98040806, // 0008 SETIDX R1 R4 R6 - 0x80040200, // 0009 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update_shadow -********************************************************************/ -be_local_closure(Matter_Plugin_update_shadow, /* name */ +be_local_closure(Matter_Plugin_is_local_device, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -504,18 +81,78 @@ be_local_closure(Matter_Plugin_update_shadow, /* name */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(tick), - /* K1 */ be_nested_str_weak(device), - }), - be_str_weak(update_shadow), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(is_local_device), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x88040300, // 0001 GETMBR R1 R1 K0 - 0x90020001, // 0002 SETMBR R0 K0 R1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x50040200, // 0000 LDBOOL R1 1 0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: write_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_write_attribute, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(write_attribute), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_conf_to_string +********************************************************************/ +be_local_closure(Matter_Plugin_ui_conf_to_string, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(find), + /* K3 */ be_nested_str_weak(), + }), + be_str_weak(ui_conf_to_string), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x780E0006, // 0002 JMPF R3 #000A + 0x60100008, // 0003 GETGBL R4 G8 + 0x8C140302, // 0004 GETMET R5 R1 K2 + 0x5C1C0600, // 0005 MOVE R7 R3 + 0x58200003, // 0006 LDCONST R8 K3 + 0x7C140600, // 0007 CALL R5 3 + 0x7C100200, // 0008 CALL R4 1 + 0x70020000, // 0009 JMP #000B + 0x58100003, // 000A LDCONST R4 K3 + 0x80040800, // 000B RET 1 R4 }) ) ); @@ -585,26 +222,134 @@ be_local_closure(Matter_Plugin_every_250ms, /* name */ /******************************************************************** -** Solidified function: get_endpoint +** Solidified function: contains_attribute ********************************************************************/ -be_local_closure(Matter_Plugin_get_endpoint, /* name */ +be_local_closure(Matter_Plugin_contains_attribute, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(endpoint), + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), + /* K2 */ be_const_int(0), + /* K3 */ be_const_int(1), }), - be_str_weak(get_endpoint), + be_str_weak(contains_attribute), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 + ( &(const binstruction[22]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x4C100000, // 0004 LDNIL R4 + 0x20100604, // 0005 NE R4 R3 R4 + 0x7812000C, // 0006 JMPF R4 #0014 + 0x58100002, // 0007 LDCONST R4 K2 + 0x6014000C, // 0008 GETGBL R5 G12 + 0x5C180600, // 0009 MOVE R6 R3 + 0x7C140200, // 000A CALL R5 1 + 0x14140805, // 000B LT R5 R4 R5 + 0x78160006, // 000C JMPF R5 #0014 + 0x94140604, // 000D GETIDX R5 R3 R4 + 0x1C140A02, // 000E EQ R5 R5 R2 + 0x78160001, // 000F JMPF R5 #0012 + 0x50140200, // 0010 LDBOOL R5 1 0 + 0x80040A00, // 0011 RET 1 R5 + 0x00100903, // 0012 ADD R4 R4 K3 + 0x7001FFF3, // 0013 JMP #0008 + 0x50100000, // 0014 LDBOOL R4 0 0 + 0x80040800, // 0015 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_sensors +********************************************************************/ +be_local_closure(Matter_Plugin_parse_sensors, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_sensors), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse_configuration +********************************************************************/ +be_local_closure(Matter_Plugin_parse_configuration, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(parse_configuration), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: ui_string_to_conf +********************************************************************/ +be_local_closure(Matter_Plugin_ui_string_to_conf, /* name */ + be_nested_proto( + 8, /* nstack */ + 3, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_Plugin), + /* K1 */ be_nested_str_weak(ARG), + /* K2 */ be_nested_str_weak(ARG_TYPE), + }), + be_str_weak(ui_string_to_conf), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x580C0000, // 0000 LDCONST R3 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140102, // 0002 GETMBR R5 R0 K2 + 0x780A0004, // 0003 JMPF R2 #0009 + 0x78120003, // 0004 JMPF R4 #0009 + 0x5C180A00, // 0005 MOVE R6 R5 + 0x5C1C0400, // 0006 MOVE R7 R2 + 0x7C180200, // 0007 CALL R6 1 + 0x98040806, // 0008 SETIDX R1 R4 R6 + 0x80040200, // 0009 RET 1 R1 }) ) ); @@ -637,24 +382,374 @@ be_local_closure(Matter_Plugin_subscribe_attribute, /* name */ /******************************************************************** -** Solidified function: timed_request +** Solidified function: has ********************************************************************/ -be_local_closure(Matter_Plugin_timed_request, /* name */ +be_local_closure(Matter_Plugin_has, /* name */ be_nested_proto( - 5, /* nstack */ + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(contains), + /* K2 */ be_nested_str_weak(endpoints), + /* K3 */ be_nested_str_weak(find), + }), + be_str_weak(has), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x7C0C0400, // 0003 CALL R3 2 + 0x780E0006, // 0004 JMPF R3 #000C + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x4C100000, // 0009 LDNIL R4 + 0x200C0604, // 000A NE R3 R3 R4 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x80040600, // 000E RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_endpoint +********************************************************************/ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_cluster_list +********************************************************************/ +be_local_closure(Matter_Plugin_get_cluster_list, /* name */ + be_nested_proto( + 7, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(keys), + /* K2 */ be_nested_str_weak(push), + /* K3 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(get_cluster_list), + &be_const_str_solidified, + ( &(const binstruction[18]) { /* code */ + 0x60040012, // 0000 GETGBL R1 G18 + 0x7C040000, // 0001 CALL R1 0 + 0x60080010, // 0002 GETGBL R2 G16 + 0x880C0100, // 0003 GETMBR R3 R0 K0 + 0x8C0C0701, // 0004 GETMET R3 R3 K1 + 0x7C0C0200, // 0005 CALL R3 1 + 0x7C080200, // 0006 CALL R2 1 + 0xA8020005, // 0007 EXBLK 0 #000E + 0x5C0C0400, // 0008 MOVE R3 R2 + 0x7C0C0000, // 0009 CALL R3 0 + 0x8C100302, // 000A GETMET R4 R1 K2 + 0x5C180600, // 000B MOVE R6 R3 + 0x7C100400, // 000C CALL R4 2 + 0x7001FFF9, // 000D JMP #0008 + 0x58080003, // 000E LDCONST R2 K3 + 0xAC080200, // 000F CATCH R2 1 0 + 0xB0080000, // 0010 RAISE 2 R0 R0 + 0x80040200, // 0011 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: read_attribute +********************************************************************/ +be_local_closure(Matter_Plugin_read_attribute, /* name */ + be_nested_proto( + 17, /* nstack */ 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(timed_request), + 1, /* has constants */ + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(cluster), + /* K3 */ be_nested_str_weak(attribute), + /* K4 */ be_const_int(0), + /* K5 */ be_nested_str_weak(Matter_TLV_array), + /* K6 */ be_nested_str_weak(TYPES), + /* K7 */ be_nested_str_weak(keys), + /* K8 */ be_nested_str_weak(add_struct), + /* K9 */ be_nested_str_weak(add_TLV), + /* K10 */ be_nested_str_weak(U2), + /* K11 */ be_const_int(1), + /* K12 */ be_nested_str_weak(stop_iteration), + /* K13 */ be_nested_str_weak(get_cluster_list), + /* K14 */ be_nested_str_weak(U4), + /* K15 */ be_const_int(2), + /* K16 */ be_const_int(3), + /* K17 */ be_nested_str_weak(set), + /* K18 */ be_nested_str_weak(BOOL), + /* K19 */ be_nested_str_weak(read_attribute), + }), + be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x80040800, // 0001 RET 1 R4 + ( &(const binstruction[114]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E001C, // 0004 LDINT R7 29 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0051, // 0006 JMPF R7 #0059 + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E001B, // 0008 JMPF R7 #0025 + 0x8C1C0905, // 0009 GETMET R7 R4 K5 + 0x7C1C0200, // 000A CALL R7 1 + 0x88200106, // 000B GETMBR R8 R0 K6 + 0x60240010, // 000C GETGBL R9 G16 + 0x8C281107, // 000D GETMET R10 R8 K7 + 0x7C280200, // 000E CALL R10 1 + 0x7C240200, // 000F CALL R9 1 + 0xA802000E, // 0010 EXBLK 0 #0020 + 0x5C281200, // 0011 MOVE R10 R9 + 0x7C280000, // 0012 CALL R10 0 + 0x8C2C0F08, // 0013 GETMET R11 R7 K8 + 0x7C2C0200, // 0014 CALL R11 1 + 0x8C301709, // 0015 GETMET R12 R11 K9 + 0x58380004, // 0016 LDCONST R14 K4 + 0x883C090A, // 0017 GETMBR R15 R4 K10 + 0x5C401400, // 0018 MOVE R16 R10 + 0x7C300800, // 0019 CALL R12 4 + 0x8C301709, // 001A GETMET R12 R11 K9 + 0x5838000B, // 001B LDCONST R14 K11 + 0x883C090A, // 001C GETMBR R15 R4 K10 + 0x9440100A, // 001D GETIDX R16 R8 R10 + 0x7C300800, // 001E CALL R12 4 + 0x7001FFF0, // 001F JMP #0011 + 0x5824000C, // 0020 LDCONST R9 K12 + 0xAC240200, // 0021 CATCH R9 1 0 + 0xB0080000, // 0022 RAISE 2 R0 R0 + 0x80040E00, // 0023 RET 1 R7 + 0x70020032, // 0024 JMP #0058 + 0x1C1C0D0B, // 0025 EQ R7 R6 K11 + 0x781E0013, // 0026 JMPF R7 #003B + 0x8C1C0905, // 0027 GETMET R7 R4 K5 + 0x7C1C0200, // 0028 CALL R7 1 + 0x60200010, // 0029 GETGBL R8 G16 + 0x8C24010D, // 002A GETMET R9 R0 K13 + 0x7C240200, // 002B CALL R9 1 + 0x7C200200, // 002C CALL R8 1 + 0xA8020007, // 002D EXBLK 0 #0036 + 0x5C241000, // 002E MOVE R9 R8 + 0x7C240000, // 002F CALL R9 0 + 0x8C280F09, // 0030 GETMET R10 R7 K9 + 0x4C300000, // 0031 LDNIL R12 + 0x8834090E, // 0032 GETMBR R13 R4 K14 + 0x5C381200, // 0033 MOVE R14 R9 + 0x7C280800, // 0034 CALL R10 4 + 0x7001FFF7, // 0035 JMP #002E + 0x5820000C, // 0036 LDCONST R8 K12 + 0xAC200200, // 0037 CATCH R8 1 0 + 0xB0080000, // 0038 RAISE 2 R0 R0 + 0x80040E00, // 0039 RET 1 R7 + 0x7002001C, // 003A JMP #0058 + 0x1C1C0D0F, // 003B EQ R7 R6 K15 + 0x781E0003, // 003C JMPF R7 #0041 + 0x8C1C0905, // 003D GETMET R7 R4 K5 + 0x7C1C0200, // 003E CALL R7 1 + 0x80040E00, // 003F RET 1 R7 + 0x70020016, // 0040 JMP #0058 + 0x1C1C0D10, // 0041 EQ R7 R6 K16 + 0x781E0003, // 0042 JMPF R7 #0047 + 0x8C1C0905, // 0043 GETMET R7 R4 K5 + 0x7C1C0200, // 0044 CALL R7 1 + 0x80040E00, // 0045 RET 1 R7 + 0x70020010, // 0046 JMP #0058 + 0x541EFFFB, // 0047 LDINT R7 65532 + 0x1C1C0C07, // 0048 EQ R7 R6 R7 + 0x781E0005, // 0049 JMPF R7 #0050 + 0x8C1C0711, // 004A GETMET R7 R3 K17 + 0x8824090E, // 004B GETMBR R9 R4 K14 + 0x58280004, // 004C LDCONST R10 K4 + 0x7C1C0600, // 004D CALL R7 3 + 0x80040E00, // 004E RET 1 R7 + 0x70020007, // 004F JMP #0058 + 0x541EFFFC, // 0050 LDINT R7 65533 + 0x1C1C0C07, // 0051 EQ R7 R6 R7 + 0x781E0004, // 0052 JMPF R7 #0058 + 0x8C1C0711, // 0053 GETMET R7 R3 K17 + 0x8824090E, // 0054 GETMBR R9 R4 K14 + 0x5828000B, // 0055 LDCONST R10 K11 + 0x7C1C0600, // 0056 CALL R7 3 + 0x80040E00, // 0057 RET 1 R7 + 0x70020017, // 0058 JMP #0071 + 0x541E0038, // 0059 LDINT R7 57 + 0x1C1C0A07, // 005A EQ R7 R5 R7 + 0x781E0012, // 005B JMPF R7 #006F + 0x541E0010, // 005C LDINT R7 17 + 0x1C1C0C07, // 005D EQ R7 R6 R7 + 0x781E0005, // 005E JMPF R7 #0065 + 0x8C1C0711, // 005F GETMET R7 R3 K17 + 0x88240912, // 0060 GETMBR R9 R4 K18 + 0x5828000B, // 0061 LDCONST R10 K11 + 0x7C1C0600, // 0062 CALL R7 3 + 0x80040E00, // 0063 RET 1 R7 + 0x70020008, // 0064 JMP #006E + 0x601C0003, // 0065 GETGBL R7 G3 + 0x5C200000, // 0066 MOVE R8 R0 + 0x7C1C0200, // 0067 CALL R7 1 + 0x8C1C0F13, // 0068 GETMET R7 R7 K19 + 0x5C240200, // 0069 MOVE R9 R1 + 0x5C280400, // 006A MOVE R10 R2 + 0x5C2C0600, // 006B MOVE R11 R3 + 0x7C1C0800, // 006C CALL R7 4 + 0x80040E00, // 006D RET 1 R7 + 0x70020001, // 006E JMP #0071 + 0x4C1C0000, // 006F LDNIL R7 + 0x80040E00, // 0070 RET 1 R7 + 0x80000000, // 0071 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: contains_cluster +********************************************************************/ +be_local_closure(Matter_Plugin_contains_cluster, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(contains), + }), + be_str_weak(contains_cluster), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send_ack_now +********************************************************************/ +be_local_closure(Matter_Plugin_send_ack_now, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(message_handler), + /* K2 */ be_nested_str_weak(im), + /* K3 */ be_nested_str_weak(send_ack_now), + }), + be_str_weak(send_ack_now), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x88080501, // 0001 GETMBR R2 R2 K1 + 0x88080502, // 0002 GETMBR R2 R2 K2 + 0x8C080503, // 0003 GETMET R2 R2 K3 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: attribute_updated +********************************************************************/ +be_local_closure(Matter_Plugin_attribute_updated, /* name */ + be_nested_proto( + 10, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(attribute_updated), + /* K2 */ be_nested_str_weak(endpoint), + }), + be_str_weak(attribute_updated), + &be_const_str_solidified, + ( &(const binstruction[ 8]) { /* code */ + 0x88100100, // 0000 GETMBR R4 R0 K0 + 0x8C100901, // 0001 GETMET R4 R4 K1 + 0x88180102, // 0002 GETMBR R6 R0 K2 + 0x5C1C0200, // 0003 MOVE R7 R1 + 0x5C200400, // 0004 MOVE R8 R2 + 0x5C240600, // 0005 MOVE R9 R3 + 0x7C100A00, // 0006 CALL R4 5 + 0x80000000, // 0007 RET 0 }) ) ); @@ -725,34 +820,26 @@ be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ /******************************************************************** -** Solidified function: attribute_updated +** Solidified function: ********************************************************************/ -be_local_closure(Matter_Plugin_attribute_updated, /* name */ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ be_nested_proto( - 10, /* nstack */ - 4, /* argc */ - 2, /* varg */ + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(attribute_updated), - /* K2 */ be_nested_str_weak(endpoint), - }), - be_str_weak(attribute_updated), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x88100100, // 0000 GETMBR R4 R0 K0 - 0x8C100901, // 0001 GETMET R4 R4 K1 - 0x88180102, // 0002 GETMBR R6 R0 K2 - 0x5C1C0200, // 0003 MOVE R7 R1 - 0x5C200400, // 0004 MOVE R8 R2 - 0x5C240600, // 0005 MOVE R9 R3 - 0x7C100A00, // 0006 CALL R4 5 - 0x80000000, // 0007 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -760,9 +847,34 @@ be_local_closure(Matter_Plugin_attribute_updated, /* name */ /******************************************************************** -** Solidified function: read_event +** Solidified function: timed_request ********************************************************************/ -be_local_closure(Matter_Plugin_read_event, /* name */ +be_local_closure(Matter_Plugin_timed_request, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(timed_request), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x80040800, // 0001 RET 1 R4 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: subscribe_event +********************************************************************/ +be_local_closure(Matter_Plugin_subscribe_event, /* name */ be_nested_proto( 6, /* nstack */ 5, /* argc */ @@ -773,7 +885,7 @@ be_local_closure(Matter_Plugin_read_event, /* name */ NULL, /* no sub protos */ 0, /* has constants */ NULL, /* no const */ - be_str_weak(read_event), + be_str_weak(subscribe_event), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x4C140000, // 0000 LDNIL R5 @@ -785,12 +897,12 @@ be_local_closure(Matter_Plugin_read_event, /* name */ /******************************************************************** -** Solidified function: get_attribute_list +** Solidified function: update_shadow ********************************************************************/ -be_local_closure(Matter_Plugin_get_attribute_list, /* name */ +be_local_closure(Matter_Plugin_update_shadow, /* name */ be_nested_proto( - 7, /* nstack */ - 3, /* argc */ + 2, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -798,19 +910,16 @@ be_local_closure(Matter_Plugin_get_attribute_list, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(clusters), - /* K1 */ be_nested_str_weak(find), + /* K0 */ be_nested_str_weak(tick), + /* K1 */ be_nested_str_weak(device), }), - be_str_weak(get_attribute_list), + be_str_weak(update_shadow), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140400, // 0002 MOVE R5 R2 - 0x60180012, // 0003 GETGBL R6 G18 - 0x7C180000, // 0004 CALL R6 0 - 0x7C0C0600, // 0005 CALL R3 3 - 0x80040600, // 0006 RET 1 R3 + ( &(const binstruction[ 4]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x88040300, // 0001 GETMBR R1 R1 K0 + 0x90020001, // 0002 SETMBR R0 K0 R1 + 0x80000000, // 0003 RET 0 }) ) ); @@ -921,36 +1030,11 @@ be_local_closure(Matter_Plugin_consolidate_clusters, /* name */ /******************************************************************** -** Solidified function: is_local_device +** Solidified function: get_attribute_list ********************************************************************/ -be_local_closure(Matter_Plugin_is_local_device, /* name */ +be_local_closure(Matter_Plugin_get_attribute_list, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(is_local_device), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x50040200, // 0000 LDBOOL R1 1 0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send_ack_now -********************************************************************/ -be_local_closure(Matter_Plugin_send_ack_now, /* name */ - be_nested_proto( - 5, /* nstack */ + 6, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -958,22 +1042,20 @@ be_local_closure(Matter_Plugin_send_ack_now, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(message_handler), - /* K2 */ be_nested_str_weak(im), - /* K3 */ be_nested_str_weak(send_ack_now), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(clusters), + /* K1 */ be_nested_str_weak(find), }), - be_str_weak(send_ack_now), + be_str_weak(get_attribute_list), &be_const_str_solidified, ( &(const binstruction[ 7]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x88080502, // 0002 GETMBR R2 R2 K2 - 0x8C080503, // 0003 GETMET R2 R2 K3 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x80000000, // 0006 RET 0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x60140012, // 0003 GETGBL R5 G18 + 0x7C140000, // 0004 CALL R5 0 + 0x7C080600, // 0005 CALL R2 3 + 0x80040400, // 0006 RET 1 R2 }) ) ); @@ -986,23 +1068,17 @@ be_local_closure(Matter_Plugin_send_ack_now, /* name */ be_local_class(Matter_Plugin, 5, NULL, - be_nested_map(35, + be_nested_map(37, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(send_ack_now, 22), be_const_closure(Matter_Plugin_send_ack_now_closure) }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, - { be_const_key_weak(NAME, 19), be_nested_str_weak() }, - { be_const_key_weak(parse_configuration, 32), be_const_closure(Matter_Plugin_parse_configuration_closure) }, - { be_const_key_weak(ui_conf_to_string, 34), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, - { be_const_key_weak(device, -1), be_const_var(1) }, - { be_const_key_weak(read_attribute, 18), be_const_closure(Matter_Plugin_read_attribute_closure) }, - { be_const_key_weak(update_next, -1), be_const_var(0) }, - { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(_Not_X20used_) }, - { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, - { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, - { be_const_key_weak(CLUSTERS, 33), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { + { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(read_event, 8), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(tick, -1), be_const_var(4) }, + { be_const_key_weak(is_local_device, 18), be_const_closure(Matter_Plugin_is_local_device_closure) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, + { be_const_key_weak(ui_conf_to_string, 28), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(CLUSTERS, 36), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_int(29, -1), be_const_simple_instance(be_nested_simple_instance(&be_class_list, { @@ -1021,26 +1097,34 @@ be_local_class(Matter_Plugin, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(every_250ms, 0), be_const_closure(Matter_Plugin_every_250ms_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, - { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, - { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(tick, -1), be_const_var(4) }, - { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, - { be_const_key_weak(read_event, -1), be_const_closure(Matter_Plugin_read_event_closure) }, - { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(TYPE, 20), be_nested_str_weak() }, - { be_const_key_weak(write_attribute, 27), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(3) }, + { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_parse_configuration_closure) }, + { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, + { be_const_key_weak(contains_cluster, -1), be_const_closure(Matter_Plugin_contains_cluster_closure) }, { be_const_key_weak(attribute_updated, 11), be_const_closure(Matter_Plugin_attribute_updated_closure) }, + { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(device, 4), be_const_var(1) }, + { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, + { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, + { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, + { be_const_key_weak(ARG, 14), be_nested_str_weak() }, + { be_const_key_weak(send_ack_now, -1), be_const_closure(Matter_Plugin_send_ack_now_closure) }, + { be_const_key_weak(subscribe_attribute, 26), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(3) }, + { be_const_key_weak(write_attribute, 24), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(ARG_TYPE, 15), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, + { be_const_key_weak(invoke_request, 30), be_const_closure(Matter_Plugin_invoke_request_closure) }, { be_const_key_weak(endpoint, -1), be_const_var(2) }, - { be_const_key_weak(ARG, 3), be_nested_str_weak() }, - { be_const_key_weak(consolidate_clusters, 8), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, - { be_const_key_weak(is_local_device, -1), be_const_closure(Matter_Plugin_is_local_device_closure) }, - { be_const_key_weak(subscribe_attribute, -1), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(_Not_X20used_) }, + { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, + { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, + { be_const_key_weak(TYPE, -1), be_nested_str_weak() }, + { be_const_key_weak(update_next, 5), be_const_var(0) }, + { be_const_key_weak(contains_attribute, -1), be_const_closure(Matter_Plugin_contains_attribute_closure) }, })), be_str_weak(Matter_Plugin) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h index 79fc33df1..f681758cc 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Aggregator.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Aggregator; ********************************************************************/ be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ be_nested_proto( - 15, /* nstack */ - 3, /* argc */ + 16, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -35,60 +35,62 @@ be_local_closure(Matter_Plugin_Aggregator_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[53]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A001C, // 0004 LDINT R6 29 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0024, // 0006 JMPF R6 #002C - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0019, // 0008 JMPF R6 #0023 - 0x8C180705, // 0009 GETMET R6 R3 K5 - 0x7C180200, // 000A CALL R6 1 - 0x881C0106, // 000B GETMBR R7 R0 K6 - 0x8C1C0F07, // 000C GETMET R7 R7 K7 - 0x50240200, // 000D LDBOOL R9 1 0 - 0x7C1C0400, // 000E CALL R7 2 - 0x60200010, // 000F GETGBL R8 G16 - 0x5C240E00, // 0010 MOVE R9 R7 - 0x7C200200, // 0011 CALL R8 1 + ( &(const binstruction[55]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E001C, // 0004 LDINT R7 29 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0025, // 0006 JMPF R7 #002D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0019, // 0008 JMPF R7 #0023 + 0x8C1C0905, // 0009 GETMET R7 R4 K5 + 0x7C1C0200, // 000A CALL R7 1 + 0x88200106, // 000B GETMBR R8 R0 K6 + 0x8C201107, // 000C GETMET R8 R8 K7 + 0x50280200, // 000D LDBOOL R10 1 0 + 0x7C200400, // 000E CALL R8 2 + 0x60240010, // 000F GETGBL R9 G16 + 0x5C281000, // 0010 MOVE R10 R8 + 0x7C240200, // 0011 CALL R9 1 0xA802000A, // 0012 EXBLK 0 #001E - 0x5C241000, // 0013 MOVE R9 R8 - 0x7C240000, // 0014 CALL R9 0 - 0x542AFEFF, // 0015 LDINT R10 65280 - 0x1428120A, // 0016 LT R10 R9 R10 - 0x782A0004, // 0017 JMPF R10 #001D - 0x8C280D08, // 0018 GETMET R10 R6 K8 - 0x4C300000, // 0019 LDNIL R12 - 0x88340709, // 001A GETMBR R13 R3 K9 - 0x5C381200, // 001B MOVE R14 R9 - 0x7C280800, // 001C CALL R10 4 + 0x5C281200, // 0013 MOVE R10 R9 + 0x7C280000, // 0014 CALL R10 0 + 0x542EFEFF, // 0015 LDINT R11 65280 + 0x142C140B, // 0016 LT R11 R10 R11 + 0x782E0004, // 0017 JMPF R11 #001D + 0x8C2C0F08, // 0018 GETMET R11 R7 K8 + 0x4C340000, // 0019 LDNIL R13 + 0x88380909, // 001A GETMBR R14 R4 K9 + 0x5C3C1400, // 001B MOVE R15 R10 + 0x7C2C0800, // 001C CALL R11 4 0x7001FFF4, // 001D JMP #0013 - 0x5820000A, // 001E LDCONST R8 K10 - 0xAC200200, // 001F CATCH R8 1 0 + 0x5824000A, // 001E LDCONST R9 K10 + 0xAC240200, // 001F CATCH R9 1 0 0xB0080000, // 0020 RAISE 2 R0 R0 - 0x80040C00, // 0021 RET 1 R6 - 0x70020007, // 0022 JMP #002B - 0x60180003, // 0023 GETGBL R6 G3 - 0x5C1C0000, // 0024 MOVE R7 R0 - 0x7C180200, // 0025 CALL R6 1 - 0x8C180D0B, // 0026 GETMET R6 R6 K11 - 0x5C200200, // 0027 MOVE R8 R1 - 0x5C240400, // 0028 MOVE R9 R2 - 0x7C180600, // 0029 CALL R6 3 - 0x80040C00, // 002A RET 1 R6 - 0x70020007, // 002B JMP #0034 - 0x60180003, // 002C GETGBL R6 G3 - 0x5C1C0000, // 002D MOVE R7 R0 - 0x7C180200, // 002E CALL R6 1 - 0x8C180D0B, // 002F GETMET R6 R6 K11 - 0x5C200200, // 0030 MOVE R8 R1 - 0x5C240400, // 0031 MOVE R9 R2 - 0x7C180600, // 0032 CALL R6 3 - 0x80040C00, // 0033 RET 1 R6 - 0x80000000, // 0034 RET 0 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0B, // 0026 GETMET R7 R7 K11 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x70020008, // 002C JMP #0036 + 0x601C0003, // 002D GETGBL R7 G3 + 0x5C200000, // 002E MOVE R8 R0 + 0x7C1C0200, // 002F CALL R7 1 + 0x8C1C0F0B, // 0030 GETMET R7 R7 K11 + 0x5C240200, // 0031 MOVE R9 R1 + 0x5C280400, // 0032 MOVE R10 R2 + 0x5C2C0600, // 0033 MOVE R11 R3 + 0x7C1C0800, // 0034 CALL R7 4 + 0x80040E00, // 0035 RET 1 R7 + 0x80000000, // 0036 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h index e35ae514d..32305eea5 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_HTTP.h @@ -567,8 +567,8 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_web_values_prefix, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ be_nested_proto( - 13, /* nstack */ - 3, /* argc */ + 14, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -586,7 +586,7 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ /* K7 */ be_nested_str_weak(get_info), /* K8 */ be_nested_str_weak(find), /* K9 */ be_nested_str_weak(name), - /* K10 */ be_nested_str_weak(create_TLV), + /* K10 */ be_nested_str_weak(set), /* K11 */ be_nested_str_weak(UTF1), /* K12 */ be_nested_str_weak(NULL), /* K13 */ be_nested_str_weak(version), @@ -600,120 +600,122 @@ be_local_closure(Matter_Plugin_Bridge_HTTP_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[113]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0038, // 0004 LDINT R6 57 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0060, // 0006 JMPF R6 #0068 - 0xA41A0800, // 0007 IMPORT R6 K4 - 0x1C1C0B05, // 0008 EQ R7 R5 K5 - 0x781E0012, // 0009 JMPF R7 #001D - 0x881C0106, // 000A GETMBR R7 R0 K6 - 0x8C1C0F07, // 000B GETMET R7 R7 K7 - 0x7C1C0200, // 000C CALL R7 1 - 0x8C1C0F08, // 000D GETMET R7 R7 K8 - 0x58240009, // 000E LDCONST R9 K9 - 0x7C1C0400, // 000F CALL R7 2 - 0x781E0005, // 0010 JMPF R7 #0017 - 0x8C20070A, // 0011 GETMET R8 R3 K10 - 0x8828070B, // 0012 GETMBR R10 R3 K11 - 0x5C2C0E00, // 0013 MOVE R11 R7 - 0x7C200600, // 0014 CALL R8 3 - 0x80041000, // 0015 RET 1 R8 + ( &(const binstruction[115]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0038, // 0004 LDINT R7 57 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0061, // 0006 JMPF R7 #0069 + 0xA41E0800, // 0007 IMPORT R7 K4 + 0x1C200D05, // 0008 EQ R8 R6 K5 + 0x78220012, // 0009 JMPF R8 #001D + 0x88200106, // 000A GETMBR R8 R0 K6 + 0x8C201107, // 000B GETMET R8 R8 K7 + 0x7C200200, // 000C CALL R8 1 + 0x8C201108, // 000D GETMET R8 R8 K8 + 0x58280009, // 000E LDCONST R10 K9 + 0x7C200400, // 000F CALL R8 2 + 0x78220005, // 0010 JMPF R8 #0017 + 0x8C24070A, // 0011 GETMET R9 R3 K10 + 0x882C090B, // 0012 GETMBR R11 R4 K11 + 0x5C301000, // 0013 MOVE R12 R8 + 0x7C240600, // 0014 CALL R9 3 + 0x80041200, // 0015 RET 1 R9 0x70020004, // 0016 JMP #001C - 0x8C20070A, // 0017 GETMET R8 R3 K10 - 0x8828070C, // 0018 GETMBR R10 R3 K12 - 0x4C2C0000, // 0019 LDNIL R11 - 0x7C200600, // 001A CALL R8 3 - 0x80041000, // 001B RET 1 R8 - 0x70020049, // 001C JMP #0067 - 0x541E0009, // 001D LDINT R7 10 - 0x1C1C0A07, // 001E EQ R7 R5 R7 - 0x781E001B, // 001F JMPF R7 #003C - 0x881C0106, // 0020 GETMBR R7 R0 K6 - 0x8C1C0F07, // 0021 GETMET R7 R7 K7 - 0x7C1C0200, // 0022 CALL R7 1 - 0x8C1C0F08, // 0023 GETMET R7 R7 K8 - 0x5824000D, // 0024 LDCONST R9 K13 - 0x7C1C0400, // 0025 CALL R7 2 - 0x781E000E, // 0026 JMPF R7 #0036 - 0x8C200D08, // 0027 GETMET R8 R6 K8 - 0x5C280E00, // 0028 MOVE R10 R7 - 0x582C000E, // 0029 LDCONST R11 K14 - 0x7C200600, // 002A CALL R8 3 - 0x2424110F, // 002B GT R9 R8 K15 - 0x78260002, // 002C JMPF R9 #0030 - 0x04241110, // 002D SUB R9 R8 K16 - 0x40261E09, // 002E CONNECT R9 K15 R9 - 0x941C0E09, // 002F GETIDX R7 R7 R9 - 0x8C24070A, // 0030 GETMET R9 R3 K10 - 0x882C070B, // 0031 GETMBR R11 R3 K11 - 0x5C300E00, // 0032 MOVE R12 R7 - 0x7C240600, // 0033 CALL R9 3 - 0x80041200, // 0034 RET 1 R9 + 0x8C24070A, // 0017 GETMET R9 R3 K10 + 0x882C090C, // 0018 GETMBR R11 R4 K12 + 0x4C300000, // 0019 LDNIL R12 + 0x7C240600, // 001A CALL R9 3 + 0x80041200, // 001B RET 1 R9 + 0x7002004A, // 001C JMP #0068 + 0x54220009, // 001D LDINT R8 10 + 0x1C200C08, // 001E EQ R8 R6 R8 + 0x7822001B, // 001F JMPF R8 #003C + 0x88200106, // 0020 GETMBR R8 R0 K6 + 0x8C201107, // 0021 GETMET R8 R8 K7 + 0x7C200200, // 0022 CALL R8 1 + 0x8C201108, // 0023 GETMET R8 R8 K8 + 0x5828000D, // 0024 LDCONST R10 K13 + 0x7C200400, // 0025 CALL R8 2 + 0x7822000E, // 0026 JMPF R8 #0036 + 0x8C240F08, // 0027 GETMET R9 R7 K8 + 0x5C2C1000, // 0028 MOVE R11 R8 + 0x5830000E, // 0029 LDCONST R12 K14 + 0x7C240600, // 002A CALL R9 3 + 0x2428130F, // 002B GT R10 R9 K15 + 0x782A0002, // 002C JMPF R10 #0030 + 0x04281310, // 002D SUB R10 R9 K16 + 0x402A1E0A, // 002E CONNECT R10 K15 R10 + 0x9420100A, // 002F GETIDX R8 R8 R10 + 0x8C28070A, // 0030 GETMET R10 R3 K10 + 0x8830090B, // 0031 GETMBR R12 R4 K11 + 0x5C341000, // 0032 MOVE R13 R8 + 0x7C280600, // 0033 CALL R10 3 + 0x80041400, // 0034 RET 1 R10 0x70020004, // 0035 JMP #003B - 0x8C20070A, // 0036 GETMET R8 R3 K10 - 0x8828070C, // 0037 GETMBR R10 R3 K12 - 0x4C2C0000, // 0038 LDNIL R11 - 0x7C200600, // 0039 CALL R8 3 - 0x80041000, // 003A RET 1 R8 - 0x7002002A, // 003B JMP #0067 - 0x541E000E, // 003C LDINT R7 15 - 0x1C1C0A07, // 003D EQ R7 R5 R7 - 0x741E0002, // 003E JMPT R7 #0042 - 0x541E0011, // 003F LDINT R7 18 - 0x1C1C0A07, // 0040 EQ R7 R5 R7 - 0x781E0012, // 0041 JMPF R7 #0055 - 0x881C0106, // 0042 GETMBR R7 R0 K6 - 0x8C1C0F07, // 0043 GETMET R7 R7 K7 - 0x7C1C0200, // 0044 CALL R7 1 - 0x8C1C0F08, // 0045 GETMET R7 R7 K8 - 0x58240011, // 0046 LDCONST R9 K17 - 0x7C1C0400, // 0047 CALL R7 2 - 0x781E0005, // 0048 JMPF R7 #004F - 0x8C20070A, // 0049 GETMET R8 R3 K10 - 0x8828070B, // 004A GETMBR R10 R3 K11 - 0x5C2C0E00, // 004B MOVE R11 R7 - 0x7C200600, // 004C CALL R8 3 - 0x80041000, // 004D RET 1 R8 + 0x8C24070A, // 0036 GETMET R9 R3 K10 + 0x882C090C, // 0037 GETMBR R11 R4 K12 + 0x4C300000, // 0038 LDNIL R12 + 0x7C240600, // 0039 CALL R9 3 + 0x80041200, // 003A RET 1 R9 + 0x7002002B, // 003B JMP #0068 + 0x5422000E, // 003C LDINT R8 15 + 0x1C200C08, // 003D EQ R8 R6 R8 + 0x74220002, // 003E JMPT R8 #0042 + 0x54220011, // 003F LDINT R8 18 + 0x1C200C08, // 0040 EQ R8 R6 R8 + 0x78220012, // 0041 JMPF R8 #0055 + 0x88200106, // 0042 GETMBR R8 R0 K6 + 0x8C201107, // 0043 GETMET R8 R8 K7 + 0x7C200200, // 0044 CALL R8 1 + 0x8C201108, // 0045 GETMET R8 R8 K8 + 0x58280011, // 0046 LDCONST R10 K17 + 0x7C200400, // 0047 CALL R8 2 + 0x78220005, // 0048 JMPF R8 #004F + 0x8C24070A, // 0049 GETMET R9 R3 K10 + 0x882C090B, // 004A GETMBR R11 R4 K11 + 0x5C301000, // 004B MOVE R12 R8 + 0x7C240600, // 004C CALL R9 3 + 0x80041200, // 004D RET 1 R9 0x70020004, // 004E JMP #0054 - 0x8C20070A, // 004F GETMET R8 R3 K10 - 0x8828070C, // 0050 GETMBR R10 R3 K12 - 0x4C2C0000, // 0051 LDNIL R11 - 0x7C200600, // 0052 CALL R8 3 - 0x80041000, // 0053 RET 1 R8 - 0x70020011, // 0054 JMP #0067 - 0x541E0010, // 0055 LDINT R7 17 - 0x1C1C0A07, // 0056 EQ R7 R5 R7 - 0x781E0006, // 0057 JMPF R7 #005F - 0x8C1C070A, // 0058 GETMET R7 R3 K10 - 0x88240712, // 0059 GETMBR R9 R3 K18 - 0x88280106, // 005A GETMBR R10 R0 K6 - 0x88281513, // 005B GETMBR R10 R10 K19 - 0x7C1C0600, // 005C CALL R7 3 - 0x80040E00, // 005D RET 1 R7 - 0x70020007, // 005E JMP #0067 - 0x601C0003, // 005F GETGBL R7 G3 - 0x5C200000, // 0060 MOVE R8 R0 - 0x7C1C0200, // 0061 CALL R7 1 - 0x8C1C0F14, // 0062 GETMET R7 R7 K20 - 0x5C240200, // 0063 MOVE R9 R1 - 0x5C280400, // 0064 MOVE R10 R2 - 0x7C1C0600, // 0065 CALL R7 3 - 0x80040E00, // 0066 RET 1 R7 - 0x70020007, // 0067 JMP #0070 - 0x60180003, // 0068 GETGBL R6 G3 - 0x5C1C0000, // 0069 MOVE R7 R0 - 0x7C180200, // 006A CALL R6 1 - 0x8C180D14, // 006B GETMET R6 R6 K20 - 0x5C200200, // 006C MOVE R8 R1 - 0x5C240400, // 006D MOVE R9 R2 - 0x7C180600, // 006E CALL R6 3 - 0x80040C00, // 006F RET 1 R6 - 0x80000000, // 0070 RET 0 + 0x8C24070A, // 004F GETMET R9 R3 K10 + 0x882C090C, // 0050 GETMBR R11 R4 K12 + 0x4C300000, // 0051 LDNIL R12 + 0x7C240600, // 0052 CALL R9 3 + 0x80041200, // 0053 RET 1 R9 + 0x70020012, // 0054 JMP #0068 + 0x54220010, // 0055 LDINT R8 17 + 0x1C200C08, // 0056 EQ R8 R6 R8 + 0x78220006, // 0057 JMPF R8 #005F + 0x8C20070A, // 0058 GETMET R8 R3 K10 + 0x88280912, // 0059 GETMBR R10 R4 K18 + 0x882C0106, // 005A GETMBR R11 R0 K6 + 0x882C1713, // 005B GETMBR R11 R11 K19 + 0x7C200600, // 005C CALL R8 3 + 0x80041000, // 005D RET 1 R8 + 0x70020008, // 005E JMP #0068 + 0x60200003, // 005F GETGBL R8 G3 + 0x5C240000, // 0060 MOVE R9 R0 + 0x7C200200, // 0061 CALL R8 1 + 0x8C201114, // 0062 GETMET R8 R8 K20 + 0x5C280200, // 0063 MOVE R10 R1 + 0x5C2C0400, // 0064 MOVE R11 R2 + 0x5C300600, // 0065 MOVE R12 R3 + 0x7C200800, // 0066 CALL R8 4 + 0x80041000, // 0067 RET 1 R8 + 0x70020008, // 0068 JMP #0072 + 0x601C0003, // 0069 GETGBL R7 G3 + 0x5C200000, // 006A MOVE R8 R0 + 0x7C1C0200, // 006B CALL R7 1 + 0x8C1C0F14, // 006C GETMET R7 R7 K20 + 0x5C240200, // 006D MOVE R9 R1 + 0x5C280400, // 006E MOVE R10 R2 + 0x5C2C0600, // 006F MOVE R11 R3 + 0x7C1C0800, // 0070 CALL R7 4 + 0x80040E00, // 0071 RET 1 R7 + 0x80000000, // 0072 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h index 74131ca6d..635323adf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light0.h @@ -139,8 +139,8 @@ be_local_closure(Matter_Plugin_Bridge_Light0_init, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -154,7 +154,7 @@ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(shadow_onoff), /* K9 */ be_nested_str_weak(U4), @@ -162,51 +162,52 @@ be_local_closure(Matter_Plugin_Bridge_Light0_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0005, // 0004 LDINT R6 6 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A001B, // 0006 JMPF R6 #0023 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[45]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x70020010, // 0010 JMP #0022 - 0x541AFFFB, // 0011 LDINT R6 65532 - 0x1C180A06, // 0012 EQ R6 R5 R6 - 0x781A0005, // 0013 JMPF R6 #001A - 0x8C180706, // 0014 GETMET R6 R3 K6 - 0x88200709, // 0015 GETMBR R8 R3 K9 - 0x58240005, // 0016 LDCONST R9 K5 - 0x7C180600, // 0017 CALL R6 3 - 0x80040C00, // 0018 RET 1 R6 + 0x541EFFFB, // 0011 LDINT R7 65532 + 0x1C1C0C07, // 0012 EQ R7 R6 R7 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0706, // 0014 GETMET R7 R3 K6 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x58280005, // 0016 LDCONST R10 K5 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 0x70020007, // 0019 JMP #0022 - 0x541AFFFC, // 001A LDINT R6 65533 - 0x1C180A06, // 001B EQ R6 R5 R6 - 0x781A0004, // 001C JMPF R6 #0022 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200709, // 001E GETMBR R8 R3 K9 - 0x54260003, // 001F LDINT R9 4 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 - 0x70020007, // 0022 JMP #002B - 0x60180003, // 0023 GETGBL R6 G3 - 0x5C1C0000, // 0024 MOVE R7 R0 - 0x7C180200, // 0025 CALL R6 1 - 0x8C180D0A, // 0026 GETMET R6 R6 K10 - 0x5C200200, // 0027 MOVE R8 R1 - 0x5C240400, // 0028 MOVE R9 R2 - 0x7C180600, // 0029 CALL R6 3 - 0x80040C00, // 002A RET 1 R6 - 0x80000000, // 002B RET 0 + 0x541EFFFC, // 001A LDINT R7 65533 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0004, // 001C JMPF R7 #0022 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240909, // 001E GETMBR R9 R4 K9 + 0x542A0003, // 001F LDINT R10 4 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h index 13635eaba..e14326c29 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light1.h @@ -136,8 +136,8 @@ be_local_closure(Matter_Plugin_Bridge_Light1_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -152,7 +152,7 @@ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), /* K6 */ be_nested_str_weak(shadow_bri), - /* K7 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(set), /* K8 */ be_nested_str_weak(U1), /* K9 */ be_nested_str_weak(NULL), /* K10 */ be_const_int(2), @@ -163,105 +163,106 @@ be_local_closure(Matter_Plugin_Bridge_Light1_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[98]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0007, // 0004 LDINT R6 8 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0051, // 0006 JMPF R6 #0059 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A000F, // 000A JMPF R6 #001B - 0x88180106, // 000B GETMBR R6 R0 K6 - 0x4C1C0000, // 000C LDNIL R7 - 0x20180C07, // 000D NE R6 R6 R7 - 0x781A0005, // 000E JMPF R6 #0015 - 0x8C180707, // 000F GETMET R6 R3 K7 - 0x88200708, // 0010 GETMBR R8 R3 K8 - 0x88240106, // 0011 GETMBR R9 R0 K6 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[99]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0007, // 0004 LDINT R7 8 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0051, // 0006 JMPF R7 #0059 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E000F, // 000A JMPF R7 #001B + 0x881C0106, // 000B GETMBR R7 R0 K6 + 0x4C200000, // 000C LDNIL R8 + 0x201C0E08, // 000D NE R7 R7 R8 + 0x781E0005, // 000E JMPF R7 #0015 + 0x8C1C0707, // 000F GETMET R7 R3 K7 + 0x88240908, // 0010 GETMBR R9 R4 K8 + 0x88280106, // 0011 GETMBR R10 R0 K6 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180707, // 0015 GETMET R6 R3 K7 - 0x88200709, // 0016 GETMBR R8 R3 K9 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0707, // 0015 GETMET R7 R3 K7 + 0x88240909, // 0016 GETMBR R9 R4 K9 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x7002003C, // 001A JMP #0058 - 0x1C180B0A, // 001B EQ R6 R5 K10 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180707, // 001D GETMET R6 R3 K7 - 0x88200708, // 001E GETMBR R8 R3 K8 - 0x58240005, // 001F LDCONST R9 K5 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D0A, // 001B EQ R7 R6 K10 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0707, // 001D GETMET R7 R3 K7 + 0x88240908, // 001E GETMBR R9 R4 K8 + 0x58280005, // 001F LDCONST R10 K5 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020034, // 0022 JMP #0058 - 0x1C180B0B, // 0023 EQ R6 R5 K11 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180707, // 0025 GETMET R6 R3 K7 - 0x88200708, // 0026 GETMBR R8 R3 K8 - 0x542600FD, // 0027 LDINT R9 254 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0B, // 0023 EQ R7 R6 K11 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0707, // 0025 GETMET R7 R3 K7 + 0x88240908, // 0026 GETMBR R9 R4 K8 + 0x542A00FD, // 0027 LDINT R10 254 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x7002002C, // 002A JMP #0058 - 0x541A000E, // 002B LDINT R6 15 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180707, // 002E GETMET R6 R3 K7 - 0x88200708, // 002F GETMBR R8 R3 K8 - 0x58240005, // 0030 LDCONST R9 K5 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541E000E, // 002B LDINT R7 15 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0707, // 002E GETMET R7 R3 K7 + 0x88240908, // 002F GETMBR R9 R4 K8 + 0x58280005, // 0030 LDCONST R10 K5 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020023, // 0033 JMP #0058 - 0x541A0010, // 0034 LDINT R6 17 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A000F, // 0036 JMPF R6 #0047 - 0x88180106, // 0037 GETMBR R6 R0 K6 - 0x4C1C0000, // 0038 LDNIL R7 - 0x20180C07, // 0039 NE R6 R6 R7 - 0x781A0005, // 003A JMPF R6 #0041 - 0x8C180707, // 003B GETMET R6 R3 K7 - 0x88200708, // 003C GETMBR R8 R3 K8 - 0x88240106, // 003D GETMBR R9 R0 K6 - 0x7C180600, // 003E CALL R6 3 - 0x80040C00, // 003F RET 1 R6 + 0x541E0010, // 0034 LDINT R7 17 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E000F, // 0036 JMPF R7 #0047 + 0x881C0106, // 0037 GETMBR R7 R0 K6 + 0x4C200000, // 0038 LDNIL R8 + 0x201C0E08, // 0039 NE R7 R7 R8 + 0x781E0005, // 003A JMPF R7 #0041 + 0x8C1C0707, // 003B GETMET R7 R3 K7 + 0x88240908, // 003C GETMBR R9 R4 K8 + 0x88280106, // 003D GETMBR R10 R0 K6 + 0x7C1C0600, // 003E CALL R7 3 + 0x80040E00, // 003F RET 1 R7 0x70020004, // 0040 JMP #0046 - 0x8C180707, // 0041 GETMET R6 R3 K7 - 0x88200709, // 0042 GETMBR R8 R3 K9 - 0x4C240000, // 0043 LDNIL R9 - 0x7C180600, // 0044 CALL R6 3 - 0x80040C00, // 0045 RET 1 R6 + 0x8C1C0707, // 0041 GETMET R7 R3 K7 + 0x88240909, // 0042 GETMBR R9 R4 K9 + 0x4C280000, // 0043 LDNIL R10 + 0x7C1C0600, // 0044 CALL R7 3 + 0x80040E00, // 0045 RET 1 R7 0x70020010, // 0046 JMP #0058 - 0x541AFFFB, // 0047 LDINT R6 65532 - 0x1C180A06, // 0048 EQ R6 R5 R6 - 0x781A0005, // 0049 JMPF R6 #0050 - 0x8C180707, // 004A GETMET R6 R3 K7 - 0x8820070C, // 004B GETMBR R8 R3 K12 - 0x5824000D, // 004C LDCONST R9 K13 - 0x7C180600, // 004D CALL R6 3 - 0x80040C00, // 004E RET 1 R6 + 0x541EFFFB, // 0047 LDINT R7 65532 + 0x1C1C0C07, // 0048 EQ R7 R6 R7 + 0x781E0005, // 0049 JMPF R7 #0050 + 0x8C1C0707, // 004A GETMET R7 R3 K7 + 0x8824090C, // 004B GETMBR R9 R4 K12 + 0x5828000D, // 004C LDCONST R10 K13 + 0x7C1C0600, // 004D CALL R7 3 + 0x80040E00, // 004E RET 1 R7 0x70020007, // 004F JMP #0058 - 0x541AFFFC, // 0050 LDINT R6 65533 - 0x1C180A06, // 0051 EQ R6 R5 R6 - 0x781A0004, // 0052 JMPF R6 #0058 - 0x8C180707, // 0053 GETMET R6 R3 K7 - 0x8820070C, // 0054 GETMBR R8 R3 K12 - 0x54260004, // 0055 LDINT R9 5 - 0x7C180600, // 0056 CALL R6 3 - 0x80040C00, // 0057 RET 1 R6 - 0x70020007, // 0058 JMP #0061 - 0x60180003, // 0059 GETGBL R6 G3 - 0x5C1C0000, // 005A MOVE R7 R0 - 0x7C180200, // 005B CALL R6 1 - 0x8C180D0E, // 005C GETMET R6 R6 K14 - 0x5C200200, // 005D MOVE R8 R1 - 0x5C240400, // 005E MOVE R9 R2 - 0x7C180600, // 005F CALL R6 3 - 0x80040C00, // 0060 RET 1 R6 - 0x80000000, // 0061 RET 0 + 0x541EFFFC, // 0050 LDINT R7 65533 + 0x1C1C0C07, // 0051 EQ R7 R6 R7 + 0x781E0004, // 0052 JMPF R7 #0058 + 0x8C1C0707, // 0053 GETMET R7 R3 K7 + 0x8824090C, // 0054 GETMBR R9 R4 K12 + 0x542A0004, // 0055 LDINT R10 5 + 0x7C1C0600, // 0056 CALL R7 3 + 0x80040E00, // 0057 RET 1 R7 + 0x70020008, // 0058 JMP #0062 + 0x601C0003, // 0059 GETGBL R7 G3 + 0x5C200000, // 005A MOVE R8 R0 + 0x7C1C0200, // 005B CALL R7 1 + 0x8C1C0F0E, // 005C GETMET R7 R7 K14 + 0x5C240200, // 005D MOVE R9 R1 + 0x5C280400, // 005E MOVE R10 R2 + 0x5C2C0600, // 005F MOVE R11 R3 + 0x7C1C0800, // 0060 CALL R7 4 + 0x80040E00, // 0061 RET 1 R7 + 0x80000000, // 0062 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h index ca2c96879..1dc7e126f 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light2.h @@ -391,8 +391,8 @@ be_local_closure(Matter_Plugin_Bridge_Light2_update_ct_minmax, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -406,7 +406,7 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_nested_str_weak(shadow_ct), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(2), @@ -418,107 +418,108 @@ be_local_closure(Matter_Plugin_Bridge_Light2_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[100]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A02FF, // 0004 LDINT R6 768 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0053, // 0006 JMPF R6 #005B - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x541A0006, // 0009 LDINT R6 7 - 0x1C180A06, // 000A EQ R6 R5 R6 - 0x781A000F, // 000B JMPF R6 #001C - 0x88180105, // 000C GETMBR R6 R0 K5 - 0x4C1C0000, // 000D LDNIL R7 - 0x20180C07, // 000E NE R6 R6 R7 - 0x781A0005, // 000F JMPF R6 #0016 - 0x8C180706, // 0010 GETMET R6 R3 K6 - 0x88200707, // 0011 GETMBR R8 R3 K7 - 0x88240105, // 0012 GETMBR R9 R0 K5 - 0x7C180600, // 0013 CALL R6 3 - 0x80040C00, // 0014 RET 1 R6 + ( &(const binstruction[101]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0053, // 0006 JMPF R7 #005B + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x541E0006, // 0009 LDINT R7 7 + 0x1C1C0C07, // 000A EQ R7 R6 R7 + 0x781E000F, // 000B JMPF R7 #001C + 0x881C0105, // 000C GETMBR R7 R0 K5 + 0x4C200000, // 000D LDNIL R8 + 0x201C0E08, // 000E NE R7 R7 R8 + 0x781E0005, // 000F JMPF R7 #0016 + 0x8C1C0706, // 0010 GETMET R7 R3 K6 + 0x88240907, // 0011 GETMBR R9 R4 K7 + 0x88280105, // 0012 GETMBR R10 R0 K5 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 0x70020004, // 0015 JMP #001B - 0x8C180706, // 0016 GETMET R6 R3 K6 - 0x88200708, // 0017 GETMBR R8 R3 K8 - 0x4C240000, // 0018 LDNIL R9 - 0x7C180600, // 0019 CALL R6 3 - 0x80040C00, // 001A RET 1 R6 + 0x8C1C0706, // 0016 GETMET R7 R3 K6 + 0x88240908, // 0017 GETMBR R9 R4 K8 + 0x4C280000, // 0018 LDNIL R10 + 0x7C1C0600, // 0019 CALL R7 3 + 0x80040E00, // 001A RET 1 R7 0x7002003D, // 001B JMP #005A - 0x541A0007, // 001C LDINT R6 8 - 0x1C180A06, // 001D EQ R6 R5 R6 - 0x781A0005, // 001E JMPF R6 #0025 - 0x8C180706, // 001F GETMET R6 R3 K6 - 0x88200707, // 0020 GETMBR R8 R3 K7 - 0x58240009, // 0021 LDCONST R9 K9 - 0x7C180600, // 0022 CALL R6 3 - 0x80040C00, // 0023 RET 1 R6 + 0x541E0007, // 001C LDINT R7 8 + 0x1C1C0C07, // 001D EQ R7 R6 R7 + 0x781E0005, // 001E JMPF R7 #0025 + 0x8C1C0706, // 001F GETMET R7 R3 K6 + 0x88240907, // 0020 GETMBR R9 R4 K7 + 0x58280009, // 0021 LDCONST R10 K9 + 0x7C1C0600, // 0022 CALL R7 3 + 0x80040E00, // 0023 RET 1 R7 0x70020034, // 0024 JMP #005A - 0x541A000E, // 0025 LDINT R6 15 - 0x1C180A06, // 0026 EQ R6 R5 R6 - 0x781A0005, // 0027 JMPF R6 #002E - 0x8C180706, // 0028 GETMET R6 R3 K6 - 0x88200707, // 0029 GETMBR R8 R3 K7 - 0x5824000A, // 002A LDCONST R9 K10 - 0x7C180600, // 002B CALL R6 3 - 0x80040C00, // 002C RET 1 R6 + 0x541E000E, // 0025 LDINT R7 15 + 0x1C1C0C07, // 0026 EQ R7 R6 R7 + 0x781E0005, // 0027 JMPF R7 #002E + 0x8C1C0706, // 0028 GETMET R7 R3 K6 + 0x88240907, // 0029 GETMBR R9 R4 K7 + 0x5828000A, // 002A LDCONST R10 K10 + 0x7C1C0600, // 002B CALL R7 3 + 0x80040E00, // 002C RET 1 R7 0x7002002B, // 002D JMP #005A - 0x541A400A, // 002E LDINT R6 16395 - 0x1C180A06, // 002F EQ R6 R5 R6 - 0x781A0005, // 0030 JMPF R6 #0037 - 0x8C180706, // 0031 GETMET R6 R3 K6 - 0x88200707, // 0032 GETMBR R8 R3 K7 - 0x8824010B, // 0033 GETMBR R9 R0 K11 - 0x7C180600, // 0034 CALL R6 3 - 0x80040C00, // 0035 RET 1 R6 + 0x541E400A, // 002E LDINT R7 16395 + 0x1C1C0C07, // 002F EQ R7 R6 R7 + 0x781E0005, // 0030 JMPF R7 #0037 + 0x8C1C0706, // 0031 GETMET R7 R3 K6 + 0x88240907, // 0032 GETMBR R9 R4 K7 + 0x8828010B, // 0033 GETMBR R10 R0 K11 + 0x7C1C0600, // 0034 CALL R7 3 + 0x80040E00, // 0035 RET 1 R7 0x70020022, // 0036 JMP #005A - 0x541A400B, // 0037 LDINT R6 16396 - 0x1C180A06, // 0038 EQ R6 R5 R6 - 0x781A0005, // 0039 JMPF R6 #0040 - 0x8C180706, // 003A GETMET R6 R3 K6 - 0x88200707, // 003B GETMBR R8 R3 K7 - 0x8824010C, // 003C GETMBR R9 R0 K12 - 0x7C180600, // 003D CALL R6 3 - 0x80040C00, // 003E RET 1 R6 + 0x541E400B, // 0037 LDINT R7 16396 + 0x1C1C0C07, // 0038 EQ R7 R6 R7 + 0x781E0005, // 0039 JMPF R7 #0040 + 0x8C1C0706, // 003A GETMET R7 R3 K6 + 0x88240907, // 003B GETMBR R9 R4 K7 + 0x8828010C, // 003C GETMBR R10 R0 K12 + 0x7C1C0600, // 003D CALL R7 3 + 0x80040E00, // 003E RET 1 R7 0x70020019, // 003F JMP #005A - 0x541A4009, // 0040 LDINT R6 16394 - 0x1C180A06, // 0041 EQ R6 R5 R6 - 0x781A0005, // 0042 JMPF R6 #0049 - 0x8C180706, // 0043 GETMET R6 R3 K6 - 0x8820070D, // 0044 GETMBR R8 R3 K13 - 0x5426000F, // 0045 LDINT R9 16 - 0x7C180600, // 0046 CALL R6 3 - 0x80040C00, // 0047 RET 1 R6 + 0x541E4009, // 0040 LDINT R7 16394 + 0x1C1C0C07, // 0041 EQ R7 R6 R7 + 0x781E0005, // 0042 JMPF R7 #0049 + 0x8C1C0706, // 0043 GETMET R7 R3 K6 + 0x8824090D, // 0044 GETMBR R9 R4 K13 + 0x542A000F, // 0045 LDINT R10 16 + 0x7C1C0600, // 0046 CALL R7 3 + 0x80040E00, // 0047 RET 1 R7 0x70020010, // 0048 JMP #005A - 0x541AFFFB, // 0049 LDINT R6 65532 - 0x1C180A06, // 004A EQ R6 R5 R6 - 0x781A0005, // 004B JMPF R6 #0052 - 0x8C180706, // 004C GETMET R6 R3 K6 - 0x8820070D, // 004D GETMBR R8 R3 K13 - 0x5426000F, // 004E LDINT R9 16 - 0x7C180600, // 004F CALL R6 3 - 0x80040C00, // 0050 RET 1 R6 + 0x541EFFFB, // 0049 LDINT R7 65532 + 0x1C1C0C07, // 004A EQ R7 R6 R7 + 0x781E0005, // 004B JMPF R7 #0052 + 0x8C1C0706, // 004C GETMET R7 R3 K6 + 0x8824090D, // 004D GETMBR R9 R4 K13 + 0x542A000F, // 004E LDINT R10 16 + 0x7C1C0600, // 004F CALL R7 3 + 0x80040E00, // 0050 RET 1 R7 0x70020007, // 0051 JMP #005A - 0x541AFFFC, // 0052 LDINT R6 65533 - 0x1C180A06, // 0053 EQ R6 R5 R6 - 0x781A0004, // 0054 JMPF R6 #005A - 0x8C180706, // 0055 GETMET R6 R3 K6 - 0x8820070D, // 0056 GETMBR R8 R3 K13 - 0x54260004, // 0057 LDINT R9 5 - 0x7C180600, // 0058 CALL R6 3 - 0x80040C00, // 0059 RET 1 R6 - 0x70020007, // 005A JMP #0063 - 0x60180003, // 005B GETGBL R6 G3 - 0x5C1C0000, // 005C MOVE R7 R0 - 0x7C180200, // 005D CALL R6 1 - 0x8C180D0E, // 005E GETMET R6 R6 K14 - 0x5C200200, // 005F MOVE R8 R1 - 0x5C240400, // 0060 MOVE R9 R2 - 0x7C180600, // 0061 CALL R6 3 - 0x80040C00, // 0062 RET 1 R6 - 0x80000000, // 0063 RET 0 + 0x541EFFFC, // 0052 LDINT R7 65533 + 0x1C1C0C07, // 0053 EQ R7 R6 R7 + 0x781E0004, // 0054 JMPF R7 #005A + 0x8C1C0706, // 0055 GETMET R7 R3 K6 + 0x8824090D, // 0056 GETMBR R9 R4 K13 + 0x542A0004, // 0057 LDINT R10 5 + 0x7C1C0600, // 0058 CALL R7 3 + 0x80040E00, // 0059 RET 1 R7 + 0x70020008, // 005A JMP #0064 + 0x601C0003, // 005B GETGBL R7 G3 + 0x5C200000, // 005C MOVE R8 R0 + 0x7C1C0200, // 005D CALL R7 1 + 0x8C1C0F0E, // 005E GETMET R7 R7 K14 + 0x5C240200, // 005F MOVE R9 R1 + 0x5C280400, // 0060 MOVE R10 R2 + 0x5C2C0600, // 0061 MOVE R11 R3 + 0x7C1C0800, // 0062 CALL R7 4 + 0x80040E00, // 0063 RET 1 R7 + 0x80000000, // 0064 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h index e73b1bd35..f5cd9c4ae 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Light3.h @@ -445,8 +445,8 @@ be_local_closure(Matter_Plugin_Bridge_Light3_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -461,7 +461,7 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), /* K6 */ be_nested_str_weak(shadow_hue), - /* K7 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(set), /* K8 */ be_nested_str_weak(U1), /* K9 */ be_nested_str_weak(NULL), /* K10 */ be_const_int(1), @@ -471,133 +471,134 @@ be_local_closure(Matter_Plugin_Bridge_Light3_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[126]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A02FF, // 0004 LDINT R6 768 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A006D, // 0006 JMPF R6 #0075 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A000F, // 000A JMPF R6 #001B - 0x88180106, // 000B GETMBR R6 R0 K6 - 0x4C1C0000, // 000C LDNIL R7 - 0x20180C07, // 000D NE R6 R6 R7 - 0x781A0005, // 000E JMPF R6 #0015 - 0x8C180707, // 000F GETMET R6 R3 K7 - 0x88200708, // 0010 GETMBR R8 R3 K8 - 0x88240106, // 0011 GETMBR R9 R0 K6 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[127]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E006D, // 0006 JMPF R7 #0075 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E000F, // 000A JMPF R7 #001B + 0x881C0106, // 000B GETMBR R7 R0 K6 + 0x4C200000, // 000C LDNIL R8 + 0x201C0E08, // 000D NE R7 R7 R8 + 0x781E0005, // 000E JMPF R7 #0015 + 0x8C1C0707, // 000F GETMET R7 R3 K7 + 0x88240908, // 0010 GETMBR R9 R4 K8 + 0x88280106, // 0011 GETMBR R10 R0 K6 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180707, // 0015 GETMET R6 R3 K7 - 0x88200709, // 0016 GETMBR R8 R3 K9 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0707, // 0015 GETMET R7 R3 K7 + 0x88240909, // 0016 GETMBR R9 R4 K9 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020058, // 001A JMP #0074 - 0x1C180B0A, // 001B EQ R6 R5 K10 - 0x781A000F, // 001C JMPF R6 #002D - 0x8818010B, // 001D GETMBR R6 R0 K11 - 0x4C1C0000, // 001E LDNIL R7 - 0x20180C07, // 001F NE R6 R6 R7 - 0x781A0005, // 0020 JMPF R6 #0027 - 0x8C180707, // 0021 GETMET R6 R3 K7 - 0x88200708, // 0022 GETMBR R8 R3 K8 - 0x8824010B, // 0023 GETMBR R9 R0 K11 - 0x7C180600, // 0024 CALL R6 3 - 0x80040C00, // 0025 RET 1 R6 + 0x1C1C0D0A, // 001B EQ R7 R6 K10 + 0x781E000F, // 001C JMPF R7 #002D + 0x881C010B, // 001D GETMBR R7 R0 K11 + 0x4C200000, // 001E LDNIL R8 + 0x201C0E08, // 001F NE R7 R7 R8 + 0x781E0005, // 0020 JMPF R7 #0027 + 0x8C1C0707, // 0021 GETMET R7 R3 K7 + 0x88240908, // 0022 GETMBR R9 R4 K8 + 0x8828010B, // 0023 GETMBR R10 R0 K11 + 0x7C1C0600, // 0024 CALL R7 3 + 0x80040E00, // 0025 RET 1 R7 0x70020004, // 0026 JMP #002C - 0x8C180707, // 0027 GETMET R6 R3 K7 - 0x88200709, // 0028 GETMBR R8 R3 K9 - 0x4C240000, // 0029 LDNIL R9 - 0x7C180600, // 002A CALL R6 3 - 0x80040C00, // 002B RET 1 R6 + 0x8C1C0707, // 0027 GETMET R7 R3 K7 + 0x88240909, // 0028 GETMBR R9 R4 K9 + 0x4C280000, // 0029 LDNIL R10 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 0x70020046, // 002C JMP #0074 - 0x541A0006, // 002D LDINT R6 7 - 0x1C180A06, // 002E EQ R6 R5 R6 - 0x781A0005, // 002F JMPF R6 #0036 - 0x8C180707, // 0030 GETMET R6 R3 K7 - 0x88200708, // 0031 GETMBR R8 R3 K8 - 0x58240005, // 0032 LDCONST R9 K5 - 0x7C180600, // 0033 CALL R6 3 - 0x80040C00, // 0034 RET 1 R6 + 0x541E0006, // 002D LDINT R7 7 + 0x1C1C0C07, // 002E EQ R7 R6 R7 + 0x781E0005, // 002F JMPF R7 #0036 + 0x8C1C0707, // 0030 GETMET R7 R3 K7 + 0x88240908, // 0031 GETMBR R9 R4 K8 + 0x58280005, // 0032 LDCONST R10 K5 + 0x7C1C0600, // 0033 CALL R7 3 + 0x80040E00, // 0034 RET 1 R7 0x7002003D, // 0035 JMP #0074 - 0x541A0007, // 0036 LDINT R6 8 - 0x1C180A06, // 0037 EQ R6 R5 R6 - 0x781A0005, // 0038 JMPF R6 #003F - 0x8C180707, // 0039 GETMET R6 R3 K7 - 0x88200708, // 003A GETMBR R8 R3 K8 - 0x58240005, // 003B LDCONST R9 K5 - 0x7C180600, // 003C CALL R6 3 - 0x80040C00, // 003D RET 1 R6 + 0x541E0007, // 0036 LDINT R7 8 + 0x1C1C0C07, // 0037 EQ R7 R6 R7 + 0x781E0005, // 0038 JMPF R7 #003F + 0x8C1C0707, // 0039 GETMET R7 R3 K7 + 0x88240908, // 003A GETMBR R9 R4 K8 + 0x58280005, // 003B LDCONST R10 K5 + 0x7C1C0600, // 003C CALL R7 3 + 0x80040E00, // 003D RET 1 R7 0x70020034, // 003E JMP #0074 - 0x541A000E, // 003F LDINT R6 15 - 0x1C180A06, // 0040 EQ R6 R5 R6 - 0x781A0005, // 0041 JMPF R6 #0048 - 0x8C180707, // 0042 GETMET R6 R3 K7 - 0x88200708, // 0043 GETMBR R8 R3 K8 - 0x58240005, // 0044 LDCONST R9 K5 - 0x7C180600, // 0045 CALL R6 3 - 0x80040C00, // 0046 RET 1 R6 + 0x541E000E, // 003F LDINT R7 15 + 0x1C1C0C07, // 0040 EQ R7 R6 R7 + 0x781E0005, // 0041 JMPF R7 #0048 + 0x8C1C0707, // 0042 GETMET R7 R3 K7 + 0x88240908, // 0043 GETMBR R9 R4 K8 + 0x58280005, // 0044 LDCONST R10 K5 + 0x7C1C0600, // 0045 CALL R7 3 + 0x80040E00, // 0046 RET 1 R7 0x7002002B, // 0047 JMP #0074 - 0x541A4000, // 0048 LDINT R6 16385 - 0x1C180A06, // 0049 EQ R6 R5 R6 - 0x781A0005, // 004A JMPF R6 #0051 - 0x8C180707, // 004B GETMET R6 R3 K7 - 0x88200708, // 004C GETMBR R8 R3 K8 - 0x58240005, // 004D LDCONST R9 K5 - 0x7C180600, // 004E CALL R6 3 - 0x80040C00, // 004F RET 1 R6 + 0x541E4000, // 0048 LDINT R7 16385 + 0x1C1C0C07, // 0049 EQ R7 R6 R7 + 0x781E0005, // 004A JMPF R7 #0051 + 0x8C1C0707, // 004B GETMET R7 R3 K7 + 0x88240908, // 004C GETMBR R9 R4 K8 + 0x58280005, // 004D LDCONST R10 K5 + 0x7C1C0600, // 004E CALL R7 3 + 0x80040E00, // 004F RET 1 R7 0x70020022, // 0050 JMP #0074 - 0x541A4009, // 0051 LDINT R6 16394 - 0x1C180A06, // 0052 EQ R6 R5 R6 - 0x781A0005, // 0053 JMPF R6 #005A - 0x8C180707, // 0054 GETMET R6 R3 K7 - 0x8820070C, // 0055 GETMBR R8 R3 K12 - 0x5824000A, // 0056 LDCONST R9 K10 - 0x7C180600, // 0057 CALL R6 3 - 0x80040C00, // 0058 RET 1 R6 + 0x541E4009, // 0051 LDINT R7 16394 + 0x1C1C0C07, // 0052 EQ R7 R6 R7 + 0x781E0005, // 0053 JMPF R7 #005A + 0x8C1C0707, // 0054 GETMET R7 R3 K7 + 0x8824090C, // 0055 GETMBR R9 R4 K12 + 0x5828000A, // 0056 LDCONST R10 K10 + 0x7C1C0600, // 0057 CALL R7 3 + 0x80040E00, // 0058 RET 1 R7 0x70020019, // 0059 JMP #0074 - 0x541A000F, // 005A LDINT R6 16 - 0x1C180A06, // 005B EQ R6 R5 R6 - 0x781A0005, // 005C JMPF R6 #0063 - 0x8C180707, // 005D GETMET R6 R3 K7 - 0x88200708, // 005E GETMBR R8 R3 K8 - 0x58240005, // 005F LDCONST R9 K5 - 0x7C180600, // 0060 CALL R6 3 - 0x80040C00, // 0061 RET 1 R6 + 0x541E000F, // 005A LDINT R7 16 + 0x1C1C0C07, // 005B EQ R7 R6 R7 + 0x781E0005, // 005C JMPF R7 #0063 + 0x8C1C0707, // 005D GETMET R7 R3 K7 + 0x88240908, // 005E GETMBR R9 R4 K8 + 0x58280005, // 005F LDCONST R10 K5 + 0x7C1C0600, // 0060 CALL R7 3 + 0x80040E00, // 0061 RET 1 R7 0x70020010, // 0062 JMP #0074 - 0x541AFFFB, // 0063 LDINT R6 65532 - 0x1C180A06, // 0064 EQ R6 R5 R6 - 0x781A0005, // 0065 JMPF R6 #006C - 0x8C180707, // 0066 GETMET R6 R3 K7 - 0x8820070C, // 0067 GETMBR R8 R3 K12 - 0x5824000A, // 0068 LDCONST R9 K10 - 0x7C180600, // 0069 CALL R6 3 - 0x80040C00, // 006A RET 1 R6 + 0x541EFFFB, // 0063 LDINT R7 65532 + 0x1C1C0C07, // 0064 EQ R7 R6 R7 + 0x781E0005, // 0065 JMPF R7 #006C + 0x8C1C0707, // 0066 GETMET R7 R3 K7 + 0x8824090C, // 0067 GETMBR R9 R4 K12 + 0x5828000A, // 0068 LDCONST R10 K10 + 0x7C1C0600, // 0069 CALL R7 3 + 0x80040E00, // 006A RET 1 R7 0x70020007, // 006B JMP #0074 - 0x541AFFFC, // 006C LDINT R6 65533 - 0x1C180A06, // 006D EQ R6 R5 R6 - 0x781A0004, // 006E JMPF R6 #0074 - 0x8C180707, // 006F GETMET R6 R3 K7 - 0x8820070C, // 0070 GETMBR R8 R3 K12 - 0x54260004, // 0071 LDINT R9 5 - 0x7C180600, // 0072 CALL R6 3 - 0x80040C00, // 0073 RET 1 R6 - 0x70020007, // 0074 JMP #007D - 0x60180003, // 0075 GETGBL R6 G3 - 0x5C1C0000, // 0076 MOVE R7 R0 - 0x7C180200, // 0077 CALL R6 1 - 0x8C180D0D, // 0078 GETMET R6 R6 K13 - 0x5C200200, // 0079 MOVE R8 R1 - 0x5C240400, // 007A MOVE R9 R2 - 0x7C180600, // 007B CALL R6 3 - 0x80040C00, // 007C RET 1 R6 - 0x80000000, // 007D RET 0 + 0x541EFFFC, // 006C LDINT R7 65533 + 0x1C1C0C07, // 006D EQ R7 R6 R7 + 0x781E0004, // 006E JMPF R7 #0074 + 0x8C1C0707, // 006F GETMET R7 R3 K7 + 0x8824090C, // 0070 GETMBR R9 R4 K12 + 0x542A0004, // 0071 LDINT R10 5 + 0x7C1C0600, // 0072 CALL R7 3 + 0x80040E00, // 0073 RET 1 R7 + 0x70020008, // 0074 JMP #007E + 0x601C0003, // 0075 GETGBL R7 G3 + 0x5C200000, // 0076 MOVE R8 R0 + 0x7C1C0200, // 0077 CALL R7 1 + 0x8C1C0F0D, // 0078 GETMET R7 R7 K13 + 0x5C240200, // 0079 MOVE R9 R1 + 0x5C280400, // 007A MOVE R10 R2 + 0x5C2C0600, // 007B MOVE R11 R3 + 0x7C1C0800, // 007C CALL R7 4 + 0x80040E00, // 007D RET 1 R7 + 0x80000000, // 007E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h index 7cbc1c9a3..00465b9d9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Contact.h @@ -201,8 +201,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_parse_update, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -216,7 +216,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name * /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_contact), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_nested_str_weak(U4), @@ -225,59 +225,60 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Contact_read_attribute, /* name * }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0044, // 0004 LDINT R6 69 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0023, // 0006 JMPF R6 #002B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[53]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0044, // 0004 LDINT R7 69 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0023, // 0006 JMPF R7 #002B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020010, // 0018 JMP #002A - 0x541AFFFB, // 0019 LDINT R6 65532 - 0x1C180A06, // 001A EQ R6 R5 R6 - 0x781A0005, // 001B JMPF R6 #0022 - 0x8C180706, // 001C GETMET R6 R3 K6 - 0x88200709, // 001D GETMBR R8 R3 K9 - 0x58240004, // 001E LDCONST R9 K4 - 0x7C180600, // 001F CALL R6 3 - 0x80040C00, // 0020 RET 1 R6 + 0x541EFFFB, // 0019 LDINT R7 65532 + 0x1C1C0C07, // 001A EQ R7 R6 R7 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0706, // 001C GETMET R7 R3 K6 + 0x88240909, // 001D GETMBR R9 R4 K9 + 0x58280004, // 001E LDCONST R10 K4 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 0x70020007, // 0021 JMP #002A - 0x541AFFFC, // 0022 LDINT R6 65533 - 0x1C180A06, // 0023 EQ R6 R5 R6 - 0x781A0004, // 0024 JMPF R6 #002A - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200709, // 0026 GETMBR R8 R3 K9 - 0x5824000A, // 0027 LDCONST R9 K10 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 - 0x70020007, // 002A JMP #0033 - 0x60180003, // 002B GETGBL R6 G3 - 0x5C1C0000, // 002C MOVE R7 R0 - 0x7C180200, // 002D CALL R6 1 - 0x8C180D0B, // 002E GETMET R6 R6 K11 - 0x5C200200, // 002F MOVE R8 R1 - 0x5C240400, // 0030 MOVE R9 R2 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 - 0x80000000, // 0033 RET 0 + 0x541EFFFC, // 0022 LDINT R7 65533 + 0x1C1C0C07, // 0023 EQ R7 R6 R7 + 0x781E0004, // 0024 JMPF R7 #002A + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240909, // 0026 GETMBR R9 R4 K9 + 0x5828000A, // 0027 LDCONST R10 K10 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 + 0x70020008, // 002A JMP #0034 + 0x601C0003, // 002B GETGBL R7 G3 + 0x5C200000, // 002C MOVE R8 R0 + 0x7C1C0200, // 002D CALL R7 1 + 0x8C1C0F0B, // 002E GETMET R7 R7 K11 + 0x5C240200, // 002F MOVE R9 R1 + 0x5C280400, // 0030 MOVE R10 R2 + 0x5C2C0600, // 0031 MOVE R11 R3 + 0x7C1C0800, // 0032 CALL R7 4 + 0x80040E00, // 0033 RET 1 R7 + 0x80000000, // 0034 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h index a1f03d75c..999d0b35d 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Humidity.h @@ -44,8 +44,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -59,7 +59,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -70,77 +70,78 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Humidity_read_attribute, /* name }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0404, // 0004 LDINT R6 1029 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0404, // 0004 LDINT R7 1029 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x542601F3, // 001F LDINT R9 500 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x542A01F3, // 001F LDINT R10 500 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x5426270F, // 0027 LDINT R9 10000 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542A270F, // 0027 LDINT R10 10000 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h index e732c9cf3..894d2caaf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Illuminance.h @@ -56,8 +56,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -71,7 +71,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -82,77 +82,78 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Illuminance_read_attribute, /* na }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A03FF, // 0004 LDINT R6 1024 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E03FF, // 0004 LDINT R7 1024 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x58240009, // 001F LDCONST R9 K9 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x58280009, // 001F LDCONST R10 K9 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x5426FFFD, // 0027 LDINT R9 65534 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542AFFFD, // 0027 LDINT R10 65534 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h index acce61c30..9f232fc03 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Occupancy.h @@ -201,8 +201,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_web_values_prefix, /* n ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -216,7 +216,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_occupancy), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -227,75 +227,76 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Occupancy_read_attribute, /* name }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0405, // 0004 LDINT R6 1030 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0033, // 0006 JMPF R6 #003B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[69]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0405, // 0004 LDINT R7 1030 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0033, // 0006 JMPF R7 #003B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020020, // 0018 JMP #003A - 0x1C180B09, // 0019 EQ R6 R5 K9 - 0x781A0005, // 001A JMPF R6 #0021 - 0x8C180706, // 001B GETMET R6 R3 K6 - 0x88200707, // 001C GETMBR R8 R3 K7 - 0x5824000A, // 001D LDCONST R9 K10 - 0x7C180600, // 001E CALL R6 3 - 0x80040C00, // 001F RET 1 R6 + 0x1C1C0D09, // 0019 EQ R7 R6 K9 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0706, // 001B GETMET R7 R3 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x5828000A, // 001D LDCONST R10 K10 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 0x70020018, // 0020 JMP #003A - 0x1C180B0B, // 0021 EQ R6 R5 K11 - 0x781A0005, // 0022 JMPF R6 #0029 - 0x8C180706, // 0023 GETMET R6 R3 K6 - 0x88200707, // 0024 GETMBR R8 R3 K7 - 0x58240004, // 0025 LDCONST R9 K4 - 0x7C180600, // 0026 CALL R6 3 - 0x80040C00, // 0027 RET 1 R6 + 0x1C1C0D0B, // 0021 EQ R7 R6 K11 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0706, // 0023 GETMET R7 R3 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x58280004, // 0025 LDCONST R10 K4 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 0x70020010, // 0028 JMP #003A - 0x541AFFFB, // 0029 LDINT R6 65532 - 0x1C180A06, // 002A EQ R6 R5 R6 - 0x781A0005, // 002B JMPF R6 #0032 - 0x8C180706, // 002C GETMET R6 R3 K6 - 0x8820070C, // 002D GETMBR R8 R3 K12 - 0x58240004, // 002E LDCONST R9 K4 - 0x7C180600, // 002F CALL R6 3 - 0x80040C00, // 0030 RET 1 R6 + 0x541EFFFB, // 0029 LDINT R7 65532 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0706, // 002C GETMET R7 R3 K6 + 0x8824090C, // 002D GETMBR R9 R4 K12 + 0x58280004, // 002E LDCONST R10 K4 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 0x70020007, // 0031 JMP #003A - 0x541AFFFC, // 0032 LDINT R6 65533 - 0x1C180A06, // 0033 EQ R6 R5 R6 - 0x781A0004, // 0034 JMPF R6 #003A - 0x8C180706, // 0035 GETMET R6 R3 K6 - 0x8820070C, // 0036 GETMBR R8 R3 K12 - 0x5824000A, // 0037 LDCONST R9 K10 - 0x7C180600, // 0038 CALL R6 3 - 0x80040C00, // 0039 RET 1 R6 - 0x70020007, // 003A JMP #0043 - 0x60180003, // 003B GETGBL R6 G3 - 0x5C1C0000, // 003C MOVE R7 R0 - 0x7C180200, // 003D CALL R6 1 - 0x8C180D0D, // 003E GETMET R6 R6 K13 - 0x5C200200, // 003F MOVE R8 R1 - 0x5C240400, // 0040 MOVE R9 R2 - 0x7C180600, // 0041 CALL R6 3 - 0x80040C00, // 0042 RET 1 R6 - 0x80000000, // 0043 RET 0 + 0x541EFFFC, // 0032 LDINT R7 65533 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0004, // 0034 JMPF R7 #003A + 0x8C1C0706, // 0035 GETMET R7 R3 K6 + 0x8824090C, // 0036 GETMBR R9 R4 K12 + 0x5828000A, // 0037 LDCONST R10 K10 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020008, // 003A JMP #0044 + 0x601C0003, // 003B GETGBL R7 G3 + 0x5C200000, // 003C MOVE R8 R0 + 0x7C1C0200, // 003D CALL R7 1 + 0x8C1C0F0D, // 003E GETMET R7 R7 K13 + 0x5C240200, // 003F MOVE R9 R1 + 0x5C280400, // 0040 MOVE R10 R2 + 0x5C2C0600, // 0041 MOVE R11 R3 + 0x7C1C0800, // 0042 CALL R7 4 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h index 1e89935ec..a72084820 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Pressure.h @@ -43,8 +43,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -58,7 +58,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(I2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -69,77 +69,78 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Pressure_read_attribute, /* name }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0402, // 0004 LDINT R6 1027 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0402, // 0004 LDINT R7 1027 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x542601F3, // 001F LDINT R9 500 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x542A01F3, // 001F LDINT R10 500 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x542605DB, // 0027 LDINT R9 1500 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542A05DB, // 0027 LDINT R10 1500 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h index c6bd8b6ff..ac392119c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Bridge_Sensor_Temp.h @@ -56,8 +56,8 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_pre_value, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -71,7 +71,7 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(I2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -81,75 +81,76 @@ be_local_closure(Matter_Plugin_Bridge_Sensor_Temp_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0401, // 0004 LDINT R6 1026 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0033, // 0006 JMPF R6 #003B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[69]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0401, // 0004 LDINT R7 1026 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0033, // 0006 JMPF R7 #003B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020020, // 0018 JMP #003A - 0x1C180B09, // 0019 EQ R6 R5 K9 - 0x781A0005, // 001A JMPF R6 #0021 - 0x8C180706, // 001B GETMET R6 R3 K6 - 0x88200707, // 001C GETMBR R8 R3 K7 - 0x5425EC77, // 001D LDINT R9 -5000 - 0x7C180600, // 001E CALL R6 3 - 0x80040C00, // 001F RET 1 R6 + 0x1C1C0D09, // 0019 EQ R7 R6 K9 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0706, // 001B GETMET R7 R3 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x5429EC77, // 001D LDINT R10 -5000 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 0x70020018, // 0020 JMP #003A - 0x1C180B0A, // 0021 EQ R6 R5 K10 - 0x781A0005, // 0022 JMPF R6 #0029 - 0x8C180706, // 0023 GETMET R6 R3 K6 - 0x88200707, // 0024 GETMBR R8 R3 K7 - 0x54263A97, // 0025 LDINT R9 15000 - 0x7C180600, // 0026 CALL R6 3 - 0x80040C00, // 0027 RET 1 R6 + 0x1C1C0D0A, // 0021 EQ R7 R6 K10 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0706, // 0023 GETMET R7 R3 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x542A3A97, // 0025 LDINT R10 15000 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 0x70020010, // 0028 JMP #003A - 0x541AFFFB, // 0029 LDINT R6 65532 - 0x1C180A06, // 002A EQ R6 R5 R6 - 0x781A0005, // 002B JMPF R6 #0032 - 0x8C180706, // 002C GETMET R6 R3 K6 - 0x8820070B, // 002D GETMBR R8 R3 K11 - 0x58240004, // 002E LDCONST R9 K4 - 0x7C180600, // 002F CALL R6 3 - 0x80040C00, // 0030 RET 1 R6 + 0x541EFFFB, // 0029 LDINT R7 65532 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0706, // 002C GETMET R7 R3 K6 + 0x8824090B, // 002D GETMBR R9 R4 K11 + 0x58280004, // 002E LDCONST R10 K4 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 0x70020007, // 0031 JMP #003A - 0x541AFFFC, // 0032 LDINT R6 65533 - 0x1C180A06, // 0033 EQ R6 R5 R6 - 0x781A0004, // 0034 JMPF R6 #003A - 0x8C180706, // 0035 GETMET R6 R3 K6 - 0x8820070B, // 0036 GETMBR R8 R3 K11 - 0x54260003, // 0037 LDINT R9 4 - 0x7C180600, // 0038 CALL R6 3 - 0x80040C00, // 0039 RET 1 R6 - 0x70020007, // 003A JMP #0043 - 0x60180003, // 003B GETGBL R6 G3 - 0x5C1C0000, // 003C MOVE R7 R0 - 0x7C180200, // 003D CALL R6 1 - 0x8C180D0C, // 003E GETMET R6 R6 K12 - 0x5C200200, // 003F MOVE R8 R1 - 0x5C240400, // 0040 MOVE R9 R2 - 0x7C180600, // 0041 CALL R6 3 - 0x80040C00, // 0042 RET 1 R6 - 0x80000000, // 0043 RET 0 + 0x541EFFFC, // 0032 LDINT R7 65533 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0004, // 0034 JMPF R7 #003A + 0x8C1C0706, // 0035 GETMET R7 R3 K6 + 0x8824090B, // 0036 GETMBR R9 R4 K11 + 0x542A0003, // 0037 LDINT R10 4 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020008, // 003A JMP #0044 + 0x601C0003, // 003B GETGBL R7 G3 + 0x5C200000, // 003C MOVE R8 R0 + 0x7C1C0200, // 003D CALL R7 1 + 0x8C1C0F0C, // 003E GETMET R7 R7 K12 + 0x5C240200, // 003F MOVE R9 R1 + 0x5C280400, // 0040 MOVE R10 R2 + 0x5C2C0600, // 0041 MOVE R11 R3 + 0x7C1C0800, // 0042 CALL R7 4 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h index 77716f333..af4eb7167 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Device.h @@ -202,8 +202,8 @@ be_local_closure(Matter_Plugin_Device_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ be_nested_proto( - 16, /* nstack */ - 3, /* argc */ + 17, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -217,7 +217,7 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(3), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U2), /* K8 */ be_const_int(1), /* K9 */ be_nested_str_weak(U1), @@ -251,268 +251,271 @@ be_local_closure(Matter_Plugin_Device_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[261]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x1C180904, // 0004 EQ R6 R4 K4 - 0x781A0021, // 0005 JMPF R6 #0028 - 0x1C180B05, // 0006 EQ R6 R5 K5 - 0x781A0005, // 0007 JMPF R6 #000E - 0x8C180706, // 0008 GETMET R6 R3 K6 - 0x88200707, // 0009 GETMBR R8 R3 K7 - 0x58240005, // 000A LDCONST R9 K5 - 0x7C180600, // 000B CALL R6 3 - 0x80040C00, // 000C RET 1 R6 + ( &(const binstruction[264]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x1C1C0B04, // 0004 EQ R7 R5 K4 + 0x781E0021, // 0005 JMPF R7 #0028 + 0x1C1C0D05, // 0006 EQ R7 R6 K5 + 0x781E0005, // 0007 JMPF R7 #000E + 0x8C1C0706, // 0008 GETMET R7 R3 K6 + 0x88240907, // 0009 GETMBR R9 R4 K7 + 0x58280005, // 000A LDCONST R10 K5 + 0x7C1C0600, // 000B CALL R7 3 + 0x80040E00, // 000C RET 1 R7 0x70020018, // 000D JMP #0027 - 0x1C180B08, // 000E EQ R6 R5 K8 - 0x781A0005, // 000F JMPF R6 #0016 - 0x8C180706, // 0010 GETMET R6 R3 K6 - 0x88200709, // 0011 GETMBR R8 R3 K9 - 0x58240005, // 0012 LDCONST R9 K5 - 0x7C180600, // 0013 CALL R6 3 - 0x80040C00, // 0014 RET 1 R6 + 0x1C1C0D08, // 000E EQ R7 R6 K8 + 0x781E0005, // 000F JMPF R7 #0016 + 0x8C1C0706, // 0010 GETMET R7 R3 K6 + 0x88240909, // 0011 GETMBR R9 R4 K9 + 0x58280005, // 0012 LDCONST R10 K5 + 0x7C1C0600, // 0013 CALL R7 3 + 0x80040E00, // 0014 RET 1 R7 0x70020010, // 0015 JMP #0027 - 0x541AFFFB, // 0016 LDINT R6 65532 - 0x1C180A06, // 0017 EQ R6 R5 R6 - 0x781A0005, // 0018 JMPF R6 #001F - 0x8C180706, // 0019 GETMET R6 R3 K6 - 0x8820070A, // 001A GETMBR R8 R3 K10 - 0x58240005, // 001B LDCONST R9 K5 - 0x7C180600, // 001C CALL R6 3 - 0x80040C00, // 001D RET 1 R6 + 0x541EFFFB, // 0016 LDINT R7 65532 + 0x1C1C0C07, // 0017 EQ R7 R6 R7 + 0x781E0005, // 0018 JMPF R7 #001F + 0x8C1C0706, // 0019 GETMET R7 R3 K6 + 0x8824090A, // 001A GETMBR R9 R4 K10 + 0x58280005, // 001B LDCONST R10 K5 + 0x7C1C0600, // 001C CALL R7 3 + 0x80040E00, // 001D RET 1 R7 0x70020007, // 001E JMP #0027 - 0x541AFFFC, // 001F LDINT R6 65533 - 0x1C180A06, // 0020 EQ R6 R5 R6 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x8C180706, // 0022 GETMET R6 R3 K6 - 0x8820070A, // 0023 GETMBR R8 R3 K10 - 0x54260003, // 0024 LDINT R9 4 - 0x7C180600, // 0025 CALL R6 3 - 0x80040C00, // 0026 RET 1 R6 - 0x700200DB, // 0027 JMP #0104 - 0x541A0003, // 0028 LDINT R6 4 - 0x1C180806, // 0029 EQ R6 R4 R6 - 0x781A0016, // 002A JMPF R6 #0042 - 0x1C180B05, // 002B EQ R6 R5 K5 - 0x781A0002, // 002C JMPF R6 #0030 - 0x4C180000, // 002D LDNIL R6 - 0x80040C00, // 002E RET 1 R6 + 0x541EFFFC, // 001F LDINT R7 65533 + 0x1C1C0C07, // 0020 EQ R7 R6 R7 + 0x781E0004, // 0021 JMPF R7 #0027 + 0x8C1C0706, // 0022 GETMET R7 R3 K6 + 0x8824090A, // 0023 GETMBR R9 R4 K10 + 0x542A0003, // 0024 LDINT R10 4 + 0x7C1C0600, // 0025 CALL R7 3 + 0x80040E00, // 0026 RET 1 R7 + 0x700200DE, // 0027 JMP #0107 + 0x541E0003, // 0028 LDINT R7 4 + 0x1C1C0A07, // 0029 EQ R7 R5 R7 + 0x781E0016, // 002A JMPF R7 #0042 + 0x1C1C0D05, // 002B EQ R7 R6 K5 + 0x781E0002, // 002C JMPF R7 #0030 + 0x4C1C0000, // 002D LDNIL R7 + 0x80040E00, // 002E RET 1 R7 0x70020010, // 002F JMP #0041 - 0x541AFFFB, // 0030 LDINT R6 65532 - 0x1C180A06, // 0031 EQ R6 R5 R6 - 0x781A0005, // 0032 JMPF R6 #0039 - 0x8C180706, // 0033 GETMET R6 R3 K6 - 0x8820070A, // 0034 GETMBR R8 R3 K10 - 0x58240005, // 0035 LDCONST R9 K5 - 0x7C180600, // 0036 CALL R6 3 - 0x80040C00, // 0037 RET 1 R6 + 0x541EFFFB, // 0030 LDINT R7 65532 + 0x1C1C0C07, // 0031 EQ R7 R6 R7 + 0x781E0005, // 0032 JMPF R7 #0039 + 0x8C1C0706, // 0033 GETMET R7 R3 K6 + 0x8824090A, // 0034 GETMBR R9 R4 K10 + 0x58280005, // 0035 LDCONST R10 K5 + 0x7C1C0600, // 0036 CALL R7 3 + 0x80040E00, // 0037 RET 1 R7 0x70020007, // 0038 JMP #0041 - 0x541AFFFC, // 0039 LDINT R6 65533 - 0x1C180A06, // 003A EQ R6 R5 R6 - 0x781A0004, // 003B JMPF R6 #0041 - 0x8C180706, // 003C GETMET R6 R3 K6 - 0x8820070A, // 003D GETMBR R8 R3 K10 - 0x54260003, // 003E LDINT R9 4 - 0x7C180600, // 003F CALL R6 3 - 0x80040C00, // 0040 RET 1 R6 - 0x700200C1, // 0041 JMP #0104 - 0x541A0004, // 0042 LDINT R6 5 - 0x1C180806, // 0043 EQ R6 R4 R6 - 0x781A0011, // 0044 JMPF R6 #0057 - 0x541AFFFB, // 0045 LDINT R6 65532 - 0x1C180A06, // 0046 EQ R6 R5 R6 - 0x781A0005, // 0047 JMPF R6 #004E - 0x8C180706, // 0048 GETMET R6 R3 K6 - 0x8820070A, // 0049 GETMBR R8 R3 K10 - 0x58240005, // 004A LDCONST R9 K5 - 0x7C180600, // 004B CALL R6 3 - 0x80040C00, // 004C RET 1 R6 + 0x541EFFFC, // 0039 LDINT R7 65533 + 0x1C1C0C07, // 003A EQ R7 R6 R7 + 0x781E0004, // 003B JMPF R7 #0041 + 0x8C1C0706, // 003C GETMET R7 R3 K6 + 0x8824090A, // 003D GETMBR R9 R4 K10 + 0x542A0003, // 003E LDINT R10 4 + 0x7C1C0600, // 003F CALL R7 3 + 0x80040E00, // 0040 RET 1 R7 + 0x700200C4, // 0041 JMP #0107 + 0x541E0004, // 0042 LDINT R7 5 + 0x1C1C0A07, // 0043 EQ R7 R5 R7 + 0x781E0011, // 0044 JMPF R7 #0057 + 0x541EFFFB, // 0045 LDINT R7 65532 + 0x1C1C0C07, // 0046 EQ R7 R6 R7 + 0x781E0005, // 0047 JMPF R7 #004E + 0x8C1C0706, // 0048 GETMET R7 R3 K6 + 0x8824090A, // 0049 GETMBR R9 R4 K10 + 0x58280005, // 004A LDCONST R10 K5 + 0x7C1C0600, // 004B CALL R7 3 + 0x80040E00, // 004C RET 1 R7 0x70020007, // 004D JMP #0056 - 0x541AFFFC, // 004E LDINT R6 65533 - 0x1C180A06, // 004F EQ R6 R5 R6 - 0x781A0004, // 0050 JMPF R6 #0056 - 0x8C180706, // 0051 GETMET R6 R3 K6 - 0x8820070A, // 0052 GETMBR R8 R3 K10 - 0x54260003, // 0053 LDINT R9 4 - 0x7C180600, // 0054 CALL R6 3 - 0x80040C00, // 0055 RET 1 R6 - 0x700200AC, // 0056 JMP #0104 - 0x541A001C, // 0057 LDINT R6 29 - 0x1C180806, // 0058 EQ R6 R4 R6 - 0x781A003D, // 0059 JMPF R6 #0098 - 0x1C180B05, // 005A EQ R6 R5 K5 - 0x781A0032, // 005B JMPF R6 #008F - 0x8C18070B, // 005C GETMET R6 R3 K11 - 0x7C180200, // 005D CALL R6 1 - 0x881C010C, // 005E GETMBR R7 R0 K12 - 0x60200010, // 005F GETGBL R8 G16 - 0x8C240F0D, // 0060 GETMET R9 R7 K13 - 0x7C240200, // 0061 CALL R9 1 - 0x7C200200, // 0062 CALL R8 1 + 0x541EFFFC, // 004E LDINT R7 65533 + 0x1C1C0C07, // 004F EQ R7 R6 R7 + 0x781E0004, // 0050 JMPF R7 #0056 + 0x8C1C0706, // 0051 GETMET R7 R3 K6 + 0x8824090A, // 0052 GETMBR R9 R4 K10 + 0x542A0003, // 0053 LDINT R10 4 + 0x7C1C0600, // 0054 CALL R7 3 + 0x80040E00, // 0055 RET 1 R7 + 0x700200AF, // 0056 JMP #0107 + 0x541E001C, // 0057 LDINT R7 29 + 0x1C1C0A07, // 0058 EQ R7 R5 R7 + 0x781E003E, // 0059 JMPF R7 #0099 + 0x1C1C0D05, // 005A EQ R7 R6 K5 + 0x781E0032, // 005B JMPF R7 #008F + 0x8C1C090B, // 005C GETMET R7 R4 K11 + 0x7C1C0200, // 005D CALL R7 1 + 0x8820010C, // 005E GETMBR R8 R0 K12 + 0x60240010, // 005F GETGBL R9 G16 + 0x8C28110D, // 0060 GETMET R10 R8 K13 + 0x7C280200, // 0061 CALL R10 1 + 0x7C240200, // 0062 CALL R9 1 0xA802000E, // 0063 EXBLK 0 #0073 - 0x5C241000, // 0064 MOVE R9 R8 - 0x7C240000, // 0065 CALL R9 0 - 0x8C280D0E, // 0066 GETMET R10 R6 K14 - 0x7C280200, // 0067 CALL R10 1 - 0x8C2C150F, // 0068 GETMET R11 R10 K15 - 0x58340005, // 0069 LDCONST R13 K5 - 0x88380707, // 006A GETMBR R14 R3 K7 - 0x5C3C1200, // 006B MOVE R15 R9 - 0x7C2C0800, // 006C CALL R11 4 - 0x8C2C150F, // 006D GETMET R11 R10 K15 - 0x58340008, // 006E LDCONST R13 K8 - 0x88380707, // 006F GETMBR R14 R3 K7 - 0x943C0E09, // 0070 GETIDX R15 R7 R9 - 0x7C2C0800, // 0071 CALL R11 4 + 0x5C281200, // 0064 MOVE R10 R9 + 0x7C280000, // 0065 CALL R10 0 + 0x8C2C0F0E, // 0066 GETMET R11 R7 K14 + 0x7C2C0200, // 0067 CALL R11 1 + 0x8C30170F, // 0068 GETMET R12 R11 K15 + 0x58380005, // 0069 LDCONST R14 K5 + 0x883C0907, // 006A GETMBR R15 R4 K7 + 0x5C401400, // 006B MOVE R16 R10 + 0x7C300800, // 006C CALL R12 4 + 0x8C30170F, // 006D GETMET R12 R11 K15 + 0x58380008, // 006E LDCONST R14 K8 + 0x883C0907, // 006F GETMBR R15 R4 K7 + 0x9440100A, // 0070 GETIDX R16 R8 R10 + 0x7C300800, // 0071 CALL R12 4 0x7001FFF0, // 0072 JMP #0064 - 0x58200010, // 0073 LDCONST R8 K16 - 0xAC200200, // 0074 CATCH R8 1 0 + 0x58240010, // 0073 LDCONST R9 K16 + 0xAC240200, // 0074 CATCH R9 1 0 0xB0080000, // 0075 RAISE 2 R0 R0 - 0x88200111, // 0076 GETMBR R8 R0 K17 - 0x8C201112, // 0077 GETMET R8 R8 K18 - 0x8C280313, // 0078 GETMET R10 R1 K19 - 0x7C280200, // 0079 CALL R10 1 - 0x7C200400, // 007A CALL R8 2 - 0x4C240000, // 007B LDNIL R9 - 0x1C201009, // 007C EQ R8 R8 R9 - 0x7822000E, // 007D JMPF R8 #008D - 0x88200114, // 007E GETMBR R8 R0 K20 - 0x88201115, // 007F GETMBR R8 R8 K21 - 0x7422000B, // 0080 JMPT R8 #008D - 0x8C200D0E, // 0081 GETMET R8 R6 K14 - 0x7C200200, // 0082 CALL R8 1 - 0x8C24110F, // 0083 GETMET R9 R8 K15 - 0x582C0005, // 0084 LDCONST R11 K5 - 0x88300707, // 0085 GETMBR R12 R3 K7 - 0x54360012, // 0086 LDINT R13 19 - 0x7C240800, // 0087 CALL R9 4 - 0x8C24110F, // 0088 GETMET R9 R8 K15 - 0x582C0008, // 0089 LDCONST R11 K8 - 0x88300707, // 008A GETMBR R12 R3 K7 - 0x58340008, // 008B LDCONST R13 K8 - 0x7C240800, // 008C CALL R9 4 - 0x80040C00, // 008D RET 1 R6 - 0x70020007, // 008E JMP #0097 - 0x60180003, // 008F GETGBL R6 G3 - 0x5C1C0000, // 0090 MOVE R7 R0 - 0x7C180200, // 0091 CALL R6 1 - 0x8C180D16, // 0092 GETMET R6 R6 K22 - 0x5C200200, // 0093 MOVE R8 R1 - 0x5C240400, // 0094 MOVE R9 R2 - 0x7C180600, // 0095 CALL R6 3 - 0x80040C00, // 0096 RET 1 R6 - 0x7002006B, // 0097 JMP #0104 - 0x541A0038, // 0098 LDINT R6 57 - 0x1C180806, // 0099 EQ R6 R4 R6 - 0x781A0060, // 009A JMPF R6 #00FC - 0xA41A2E00, // 009B IMPORT R6 K23 - 0x1C1C0B04, // 009C EQ R7 R5 K4 - 0x781E000A, // 009D JMPF R7 #00A9 - 0x8C1C0706, // 009E GETMET R7 R3 K6 - 0x88240718, // 009F GETMBR R9 R3 K24 - 0xB82A3200, // 00A0 GETNGBL R10 K25 - 0x8C28151A, // 00A1 GETMET R10 R10 K26 - 0x5830001B, // 00A2 LDCONST R12 K27 - 0x50340200, // 00A3 LDBOOL R13 1 0 - 0x7C280600, // 00A4 CALL R10 3 - 0x9428151B, // 00A5 GETIDX R10 R10 K27 - 0x7C1C0600, // 00A6 CALL R7 3 - 0x80040E00, // 00A7 RET 1 R7 - 0x70020051, // 00A8 JMP #00FB - 0x541E0004, // 00A9 LDINT R7 5 - 0x1C1C0A07, // 00AA EQ R7 R5 R7 - 0x781E0006, // 00AB JMPF R7 #00B3 - 0x8C1C0706, // 00AC GETMET R7 R3 K6 - 0x88240718, // 00AD GETMBR R9 R3 K24 - 0x8C28011C, // 00AE GETMET R10 R0 K28 - 0x7C280200, // 00AF CALL R10 1 - 0x7C1C0600, // 00B0 CALL R7 3 - 0x80040E00, // 00B1 RET 1 R7 - 0x70020047, // 00B2 JMP #00FB - 0x541E0009, // 00B3 LDINT R7 10 - 0x1C1C0A07, // 00B4 EQ R7 R5 R7 - 0x781E0015, // 00B5 JMPF R7 #00CC - 0xB81E3200, // 00B6 GETNGBL R7 K25 - 0x8C1C0F1A, // 00B7 GETMET R7 R7 K26 - 0x5824001D, // 00B8 LDCONST R9 K29 - 0x50280200, // 00B9 LDBOOL R10 1 0 - 0x7C1C0600, // 00BA CALL R7 3 - 0x941C0F1E, // 00BB GETIDX R7 R7 K30 - 0x941C0F1F, // 00BC GETIDX R7 R7 K31 - 0x8C200D12, // 00BD GETMET R8 R6 K18 - 0x5C280E00, // 00BE MOVE R10 R7 - 0x582C0020, // 00BF LDCONST R11 K32 - 0x7C200600, // 00C0 CALL R8 3 - 0x24241105, // 00C1 GT R9 R8 K5 - 0x78260002, // 00C2 JMPF R9 #00C6 - 0x04241108, // 00C3 SUB R9 R8 K8 - 0x40260A09, // 00C4 CONNECT R9 K5 R9 - 0x941C0E09, // 00C5 GETIDX R7 R7 R9 - 0x8C240706, // 00C6 GETMET R9 R3 K6 - 0x882C0718, // 00C7 GETMBR R11 R3 K24 - 0x5C300E00, // 00C8 MOVE R12 R7 - 0x7C240600, // 00C9 CALL R9 3 - 0x80041200, // 00CA RET 1 R9 - 0x7002002E, // 00CB JMP #00FB - 0x541E000E, // 00CC LDINT R7 15 - 0x1C1C0A07, // 00CD EQ R7 R5 R7 - 0x781E000B, // 00CE JMPF R7 #00DB - 0x8C1C0706, // 00CF GETMET R7 R3 K6 - 0x88240718, // 00D0 GETMBR R9 R3 K24 - 0xB82A3200, // 00D1 GETNGBL R10 K25 - 0x8C281521, // 00D2 GETMET R10 R10 K33 - 0x7C280200, // 00D3 CALL R10 1 - 0x8C281512, // 00D4 GETMET R10 R10 K18 - 0x58300022, // 00D5 LDCONST R12 K34 - 0x58340023, // 00D6 LDCONST R13 K35 - 0x7C280600, // 00D7 CALL R10 3 - 0x7C1C0600, // 00D8 CALL R7 3 - 0x80040E00, // 00D9 RET 1 R7 - 0x7002001F, // 00DA JMP #00FB - 0x541E0010, // 00DB LDINT R7 17 - 0x1C1C0A07, // 00DC EQ R7 R5 R7 - 0x781E0005, // 00DD JMPF R7 #00E4 - 0x8C1C0706, // 00DE GETMET R7 R3 K6 - 0x88240724, // 00DF GETMBR R9 R3 K36 - 0x58280008, // 00E0 LDCONST R10 K8 - 0x7C1C0600, // 00E1 CALL R7 3 - 0x80040E00, // 00E2 RET 1 R7 - 0x70020016, // 00E3 JMP #00FB - 0x541E0011, // 00E4 LDINT R7 18 - 0x1C1C0A07, // 00E5 EQ R7 R5 R7 - 0x781E000B, // 00E6 JMPF R7 #00F3 - 0x8C1C0706, // 00E7 GETMET R7 R3 K6 - 0x88240718, // 00E8 GETMBR R9 R3 K24 - 0xB82A3200, // 00E9 GETNGBL R10 K25 - 0x8C281521, // 00EA GETMET R10 R10 K33 - 0x7C280200, // 00EB CALL R10 1 - 0x8C281512, // 00EC GETMET R10 R10 K18 - 0x58300022, // 00ED LDCONST R12 K34 - 0x58340023, // 00EE LDCONST R13 K35 - 0x7C280600, // 00EF CALL R10 3 - 0x7C1C0600, // 00F0 CALL R7 3 - 0x80040E00, // 00F1 RET 1 R7 - 0x70020007, // 00F2 JMP #00FB - 0x601C0003, // 00F3 GETGBL R7 G3 - 0x5C200000, // 00F4 MOVE R8 R0 - 0x7C1C0200, // 00F5 CALL R7 1 - 0x8C1C0F16, // 00F6 GETMET R7 R7 K22 - 0x5C240200, // 00F7 MOVE R9 R1 - 0x5C280400, // 00F8 MOVE R10 R2 - 0x7C1C0600, // 00F9 CALL R7 3 - 0x80040E00, // 00FA RET 1 R7 - 0x70020007, // 00FB JMP #0104 - 0x60180003, // 00FC GETGBL R6 G3 - 0x5C1C0000, // 00FD MOVE R7 R0 - 0x7C180200, // 00FE CALL R6 1 - 0x8C180D16, // 00FF GETMET R6 R6 K22 - 0x5C200200, // 0100 MOVE R8 R1 - 0x5C240400, // 0101 MOVE R9 R2 - 0x7C180600, // 0102 CALL R6 3 - 0x80040C00, // 0103 RET 1 R6 - 0x80000000, // 0104 RET 0 + 0x88240111, // 0076 GETMBR R9 R0 K17 + 0x8C241312, // 0077 GETMET R9 R9 K18 + 0x8C2C0313, // 0078 GETMET R11 R1 K19 + 0x7C2C0200, // 0079 CALL R11 1 + 0x7C240400, // 007A CALL R9 2 + 0x4C280000, // 007B LDNIL R10 + 0x1C24120A, // 007C EQ R9 R9 R10 + 0x7826000E, // 007D JMPF R9 #008D + 0x88240114, // 007E GETMBR R9 R0 K20 + 0x88241315, // 007F GETMBR R9 R9 K21 + 0x7426000B, // 0080 JMPT R9 #008D + 0x8C240F0E, // 0081 GETMET R9 R7 K14 + 0x7C240200, // 0082 CALL R9 1 + 0x8C28130F, // 0083 GETMET R10 R9 K15 + 0x58300005, // 0084 LDCONST R12 K5 + 0x88340907, // 0085 GETMBR R13 R4 K7 + 0x543A0012, // 0086 LDINT R14 19 + 0x7C280800, // 0087 CALL R10 4 + 0x8C28130F, // 0088 GETMET R10 R9 K15 + 0x58300008, // 0089 LDCONST R12 K8 + 0x88340907, // 008A GETMBR R13 R4 K7 + 0x58380008, // 008B LDCONST R14 K8 + 0x7C280800, // 008C CALL R10 4 + 0x80040E00, // 008D RET 1 R7 + 0x70020008, // 008E JMP #0098 + 0x601C0003, // 008F GETGBL R7 G3 + 0x5C200000, // 0090 MOVE R8 R0 + 0x7C1C0200, // 0091 CALL R7 1 + 0x8C1C0F16, // 0092 GETMET R7 R7 K22 + 0x5C240200, // 0093 MOVE R9 R1 + 0x5C280400, // 0094 MOVE R10 R2 + 0x5C2C0600, // 0095 MOVE R11 R3 + 0x7C1C0800, // 0096 CALL R7 4 + 0x80040E00, // 0097 RET 1 R7 + 0x7002006D, // 0098 JMP #0107 + 0x541E0038, // 0099 LDINT R7 57 + 0x1C1C0A07, // 009A EQ R7 R5 R7 + 0x781E0061, // 009B JMPF R7 #00FE + 0xA41E2E00, // 009C IMPORT R7 K23 + 0x1C200D04, // 009D EQ R8 R6 K4 + 0x7822000A, // 009E JMPF R8 #00AA + 0x8C200706, // 009F GETMET R8 R3 K6 + 0x88280918, // 00A0 GETMBR R10 R4 K24 + 0xB82E3200, // 00A1 GETNGBL R11 K25 + 0x8C2C171A, // 00A2 GETMET R11 R11 K26 + 0x5834001B, // 00A3 LDCONST R13 K27 + 0x50380200, // 00A4 LDBOOL R14 1 0 + 0x7C2C0600, // 00A5 CALL R11 3 + 0x942C171B, // 00A6 GETIDX R11 R11 K27 + 0x7C200600, // 00A7 CALL R8 3 + 0x80041000, // 00A8 RET 1 R8 + 0x70020052, // 00A9 JMP #00FD + 0x54220004, // 00AA LDINT R8 5 + 0x1C200C08, // 00AB EQ R8 R6 R8 + 0x78220006, // 00AC JMPF R8 #00B4 + 0x8C200706, // 00AD GETMET R8 R3 K6 + 0x88280918, // 00AE GETMBR R10 R4 K24 + 0x8C2C011C, // 00AF GETMET R11 R0 K28 + 0x7C2C0200, // 00B0 CALL R11 1 + 0x7C200600, // 00B1 CALL R8 3 + 0x80041000, // 00B2 RET 1 R8 + 0x70020048, // 00B3 JMP #00FD + 0x54220009, // 00B4 LDINT R8 10 + 0x1C200C08, // 00B5 EQ R8 R6 R8 + 0x78220015, // 00B6 JMPF R8 #00CD + 0xB8223200, // 00B7 GETNGBL R8 K25 + 0x8C20111A, // 00B8 GETMET R8 R8 K26 + 0x5828001D, // 00B9 LDCONST R10 K29 + 0x502C0200, // 00BA LDBOOL R11 1 0 + 0x7C200600, // 00BB CALL R8 3 + 0x9420111E, // 00BC GETIDX R8 R8 K30 + 0x9420111F, // 00BD GETIDX R8 R8 K31 + 0x8C240F12, // 00BE GETMET R9 R7 K18 + 0x5C2C1000, // 00BF MOVE R11 R8 + 0x58300020, // 00C0 LDCONST R12 K32 + 0x7C240600, // 00C1 CALL R9 3 + 0x24281305, // 00C2 GT R10 R9 K5 + 0x782A0002, // 00C3 JMPF R10 #00C7 + 0x04281308, // 00C4 SUB R10 R9 K8 + 0x402A0A0A, // 00C5 CONNECT R10 K5 R10 + 0x9420100A, // 00C6 GETIDX R8 R8 R10 + 0x8C280706, // 00C7 GETMET R10 R3 K6 + 0x88300918, // 00C8 GETMBR R12 R4 K24 + 0x5C341000, // 00C9 MOVE R13 R8 + 0x7C280600, // 00CA CALL R10 3 + 0x80041400, // 00CB RET 1 R10 + 0x7002002F, // 00CC JMP #00FD + 0x5422000E, // 00CD LDINT R8 15 + 0x1C200C08, // 00CE EQ R8 R6 R8 + 0x7822000B, // 00CF JMPF R8 #00DC + 0x8C200706, // 00D0 GETMET R8 R3 K6 + 0x88280918, // 00D1 GETMBR R10 R4 K24 + 0xB82E3200, // 00D2 GETNGBL R11 K25 + 0x8C2C1721, // 00D3 GETMET R11 R11 K33 + 0x7C2C0200, // 00D4 CALL R11 1 + 0x8C2C1712, // 00D5 GETMET R11 R11 K18 + 0x58340022, // 00D6 LDCONST R13 K34 + 0x58380023, // 00D7 LDCONST R14 K35 + 0x7C2C0600, // 00D8 CALL R11 3 + 0x7C200600, // 00D9 CALL R8 3 + 0x80041000, // 00DA RET 1 R8 + 0x70020020, // 00DB JMP #00FD + 0x54220010, // 00DC LDINT R8 17 + 0x1C200C08, // 00DD EQ R8 R6 R8 + 0x78220005, // 00DE JMPF R8 #00E5 + 0x8C200706, // 00DF GETMET R8 R3 K6 + 0x88280924, // 00E0 GETMBR R10 R4 K36 + 0x582C0008, // 00E1 LDCONST R11 K8 + 0x7C200600, // 00E2 CALL R8 3 + 0x80041000, // 00E3 RET 1 R8 + 0x70020017, // 00E4 JMP #00FD + 0x54220011, // 00E5 LDINT R8 18 + 0x1C200C08, // 00E6 EQ R8 R6 R8 + 0x7822000B, // 00E7 JMPF R8 #00F4 + 0x8C200706, // 00E8 GETMET R8 R3 K6 + 0x88280918, // 00E9 GETMBR R10 R4 K24 + 0xB82E3200, // 00EA GETNGBL R11 K25 + 0x8C2C1721, // 00EB GETMET R11 R11 K33 + 0x7C2C0200, // 00EC CALL R11 1 + 0x8C2C1712, // 00ED GETMET R11 R11 K18 + 0x58340022, // 00EE LDCONST R13 K34 + 0x58380023, // 00EF LDCONST R14 K35 + 0x7C2C0600, // 00F0 CALL R11 3 + 0x7C200600, // 00F1 CALL R8 3 + 0x80041000, // 00F2 RET 1 R8 + 0x70020008, // 00F3 JMP #00FD + 0x60200003, // 00F4 GETGBL R8 G3 + 0x5C240000, // 00F5 MOVE R9 R0 + 0x7C200200, // 00F6 CALL R8 1 + 0x8C201116, // 00F7 GETMET R8 R8 K22 + 0x5C280200, // 00F8 MOVE R10 R1 + 0x5C2C0400, // 00F9 MOVE R11 R2 + 0x5C300600, // 00FA MOVE R12 R3 + 0x7C200800, // 00FB CALL R8 4 + 0x80041000, // 00FC RET 1 R8 + 0x70020008, // 00FD JMP #0107 + 0x601C0003, // 00FE GETGBL R7 G3 + 0x5C200000, // 00FF MOVE R8 R0 + 0x7C1C0200, // 0100 CALL R7 1 + 0x8C1C0F16, // 0101 GETMET R7 R7 K22 + 0x5C240200, // 0102 MOVE R9 R1 + 0x5C280400, // 0103 MOVE R10 R2 + 0x5C2C0600, // 0104 MOVE R11 R3 + 0x7C1C0800, // 0105 CALL R7 4 + 0x80040E00, // 0106 RET 1 R7 + 0x80000000, // 0107 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h index a9fd5b727..28aa6cea3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light0.h @@ -67,8 +67,8 @@ be_local_closure(Matter_Plugin_Light0_update_shadow, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -82,7 +82,7 @@ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(shadow_onoff), /* K9 */ be_nested_str_weak(U4), @@ -90,51 +90,52 @@ be_local_closure(Matter_Plugin_Light0_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0005, // 0004 LDINT R6 6 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A001B, // 0006 JMPF R6 #0023 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[45]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x70020010, // 0010 JMP #0022 - 0x541AFFFB, // 0011 LDINT R6 65532 - 0x1C180A06, // 0012 EQ R6 R5 R6 - 0x781A0005, // 0013 JMPF R6 #001A - 0x8C180706, // 0014 GETMET R6 R3 K6 - 0x88200709, // 0015 GETMBR R8 R3 K9 - 0x58240005, // 0016 LDCONST R9 K5 - 0x7C180600, // 0017 CALL R6 3 - 0x80040C00, // 0018 RET 1 R6 + 0x541EFFFB, // 0011 LDINT R7 65532 + 0x1C1C0C07, // 0012 EQ R7 R6 R7 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0706, // 0014 GETMET R7 R3 K6 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x58280005, // 0016 LDCONST R10 K5 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 0x70020007, // 0019 JMP #0022 - 0x541AFFFC, // 001A LDINT R6 65533 - 0x1C180A06, // 001B EQ R6 R5 R6 - 0x781A0004, // 001C JMPF R6 #0022 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200709, // 001E GETMBR R8 R3 K9 - 0x54260003, // 001F LDINT R9 4 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 - 0x70020007, // 0022 JMP #002B - 0x60180003, // 0023 GETGBL R6 G3 - 0x5C1C0000, // 0024 MOVE R7 R0 - 0x7C180200, // 0025 CALL R6 1 - 0x8C180D0A, // 0026 GETMET R6 R6 K10 - 0x5C200200, // 0027 MOVE R8 R1 - 0x5C240400, // 0028 MOVE R9 R2 - 0x7C180600, // 0029 CALL R6 3 - 0x80040C00, // 002A RET 1 R6 - 0x80000000, // 002B RET 0 + 0x541EFFFC, // 001A LDINT R7 65533 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0004, // 001C JMPF R7 #0022 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240909, // 001E GETMBR R9 R4 K9 + 0x542A0003, // 001F LDINT R10 4 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h index ca1b20831..119611183 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light1.h @@ -237,8 +237,8 @@ be_local_closure(Matter_Plugin_Light1_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -252,7 +252,7 @@ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_nested_str_weak(shadow_bri), /* K9 */ be_const_int(2), @@ -263,85 +263,86 @@ be_local_closure(Matter_Plugin_Light1_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[78]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0007, // 0004 LDINT R6 8 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A003D, // 0006 JMPF R6 #0045 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[79]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0007, // 0004 LDINT R7 8 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E003D, // 0006 JMPF R7 #0045 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x70020032, // 0010 JMP #0044 - 0x1C180B09, // 0011 EQ R6 R5 K9 - 0x781A0005, // 0012 JMPF R6 #0019 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200707, // 0014 GETMBR R8 R3 K7 - 0x58240005, // 0015 LDCONST R9 K5 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x1C1C0D09, // 0011 EQ R7 R6 K9 + 0x781E0005, // 0012 JMPF R7 #0019 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240907, // 0014 GETMBR R9 R4 K7 + 0x58280005, // 0015 LDCONST R10 K5 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x7002002A, // 0018 JMP #0044 - 0x1C180B0A, // 0019 EQ R6 R5 K10 - 0x781A0005, // 001A JMPF R6 #0021 - 0x8C180706, // 001B GETMET R6 R3 K6 - 0x88200707, // 001C GETMBR R8 R3 K7 - 0x542600FD, // 001D LDINT R9 254 - 0x7C180600, // 001E CALL R6 3 - 0x80040C00, // 001F RET 1 R6 + 0x1C1C0D0A, // 0019 EQ R7 R6 K10 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0706, // 001B GETMET R7 R3 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x542A00FD, // 001D LDINT R10 254 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 0x70020022, // 0020 JMP #0044 - 0x541A000E, // 0021 LDINT R6 15 - 0x1C180A06, // 0022 EQ R6 R5 R6 - 0x781A0005, // 0023 JMPF R6 #002A - 0x8C180706, // 0024 GETMET R6 R3 K6 - 0x88200707, // 0025 GETMBR R8 R3 K7 - 0x58240005, // 0026 LDCONST R9 K5 - 0x7C180600, // 0027 CALL R6 3 - 0x80040C00, // 0028 RET 1 R6 + 0x541E000E, // 0021 LDINT R7 15 + 0x1C1C0C07, // 0022 EQ R7 R6 R7 + 0x781E0005, // 0023 JMPF R7 #002A + 0x8C1C0706, // 0024 GETMET R7 R3 K6 + 0x88240907, // 0025 GETMBR R9 R4 K7 + 0x58280005, // 0026 LDCONST R10 K5 + 0x7C1C0600, // 0027 CALL R7 3 + 0x80040E00, // 0028 RET 1 R7 0x70020019, // 0029 JMP #0044 - 0x541A0010, // 002A LDINT R6 17 - 0x1C180A06, // 002B EQ R6 R5 R6 - 0x781A0005, // 002C JMPF R6 #0033 - 0x8C180706, // 002D GETMET R6 R3 K6 - 0x88200707, // 002E GETMBR R8 R3 K7 - 0x88240108, // 002F GETMBR R9 R0 K8 - 0x7C180600, // 0030 CALL R6 3 - 0x80040C00, // 0031 RET 1 R6 + 0x541E0010, // 002A LDINT R7 17 + 0x1C1C0C07, // 002B EQ R7 R6 R7 + 0x781E0005, // 002C JMPF R7 #0033 + 0x8C1C0706, // 002D GETMET R7 R3 K6 + 0x88240907, // 002E GETMBR R9 R4 K7 + 0x88280108, // 002F GETMBR R10 R0 K8 + 0x7C1C0600, // 0030 CALL R7 3 + 0x80040E00, // 0031 RET 1 R7 0x70020010, // 0032 JMP #0044 - 0x541AFFFB, // 0033 LDINT R6 65532 - 0x1C180A06, // 0034 EQ R6 R5 R6 - 0x781A0005, // 0035 JMPF R6 #003C - 0x8C180706, // 0036 GETMET R6 R3 K6 - 0x8820070B, // 0037 GETMBR R8 R3 K11 - 0x5824000C, // 0038 LDCONST R9 K12 - 0x7C180600, // 0039 CALL R6 3 - 0x80040C00, // 003A RET 1 R6 + 0x541EFFFB, // 0033 LDINT R7 65532 + 0x1C1C0C07, // 0034 EQ R7 R6 R7 + 0x781E0005, // 0035 JMPF R7 #003C + 0x8C1C0706, // 0036 GETMET R7 R3 K6 + 0x8824090B, // 0037 GETMBR R9 R4 K11 + 0x5828000C, // 0038 LDCONST R10 K12 + 0x7C1C0600, // 0039 CALL R7 3 + 0x80040E00, // 003A RET 1 R7 0x70020007, // 003B JMP #0044 - 0x541AFFFC, // 003C LDINT R6 65533 - 0x1C180A06, // 003D EQ R6 R5 R6 - 0x781A0004, // 003E JMPF R6 #0044 - 0x8C180706, // 003F GETMET R6 R3 K6 - 0x8820070B, // 0040 GETMBR R8 R3 K11 - 0x54260004, // 0041 LDINT R9 5 - 0x7C180600, // 0042 CALL R6 3 - 0x80040C00, // 0043 RET 1 R6 - 0x70020007, // 0044 JMP #004D - 0x60180003, // 0045 GETGBL R6 G3 - 0x5C1C0000, // 0046 MOVE R7 R0 - 0x7C180200, // 0047 CALL R6 1 - 0x8C180D0D, // 0048 GETMET R6 R6 K13 - 0x5C200200, // 0049 MOVE R8 R1 - 0x5C240400, // 004A MOVE R9 R2 - 0x7C180600, // 004B CALL R6 3 - 0x80040C00, // 004C RET 1 R6 - 0x80000000, // 004D RET 0 + 0x541EFFFC, // 003C LDINT R7 65533 + 0x1C1C0C07, // 003D EQ R7 R6 R7 + 0x781E0004, // 003E JMPF R7 #0044 + 0x8C1C0706, // 003F GETMET R7 R3 K6 + 0x8824090B, // 0040 GETMBR R9 R4 K11 + 0x542A0004, // 0041 LDINT R10 5 + 0x7C1C0600, // 0042 CALL R7 3 + 0x80040E00, // 0043 RET 1 R7 + 0x70020008, // 0044 JMP #004E + 0x601C0003, // 0045 GETGBL R7 G3 + 0x5C200000, // 0046 MOVE R8 R0 + 0x7C1C0200, // 0047 CALL R7 1 + 0x8C1C0F0D, // 0048 GETMET R7 R7 K13 + 0x5C240200, // 0049 MOVE R9 R1 + 0x5C280400, // 004A MOVE R10 R2 + 0x5C2C0600, // 004B MOVE R11 R3 + 0x7C1C0800, // 004C CALL R7 4 + 0x80040E00, // 004D RET 1 R7 + 0x80000000, // 004E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h index 55b734a1d..8294b2afa 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light2.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Light2; ********************************************************************/ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -25,7 +25,7 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_nested_str_weak(create_TLV), + /* K5 */ be_nested_str_weak(set), /* K6 */ be_nested_str_weak(U1), /* K7 */ be_nested_str_weak(shadow_ct), /* K8 */ be_const_int(2), @@ -37,88 +37,89 @@ be_local_closure(Matter_Plugin_Light2_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[81]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A02FF, // 0004 LDINT R6 768 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0040, // 0006 JMPF R6 #0048 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x541A0006, // 0009 LDINT R6 7 - 0x1C180A06, // 000A EQ R6 R5 R6 - 0x781A0005, // 000B JMPF R6 #0012 - 0x8C180705, // 000C GETMET R6 R3 K5 - 0x88200706, // 000D GETMBR R8 R3 K6 - 0x88240107, // 000E GETMBR R9 R0 K7 - 0x7C180600, // 000F CALL R6 3 - 0x80040C00, // 0010 RET 1 R6 + ( &(const binstruction[82]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0040, // 0006 JMPF R7 #0048 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x541E0006, // 0009 LDINT R7 7 + 0x1C1C0C07, // 000A EQ R7 R6 R7 + 0x781E0005, // 000B JMPF R7 #0012 + 0x8C1C0705, // 000C GETMET R7 R3 K5 + 0x88240906, // 000D GETMBR R9 R4 K6 + 0x88280107, // 000E GETMBR R10 R0 K7 + 0x7C1C0600, // 000F CALL R7 3 + 0x80040E00, // 0010 RET 1 R7 0x70020034, // 0011 JMP #0047 - 0x541A0007, // 0012 LDINT R6 8 - 0x1C180A06, // 0013 EQ R6 R5 R6 - 0x781A0005, // 0014 JMPF R6 #001B - 0x8C180705, // 0015 GETMET R6 R3 K5 - 0x88200706, // 0016 GETMBR R8 R3 K6 - 0x58240008, // 0017 LDCONST R9 K8 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x541E0007, // 0012 LDINT R7 8 + 0x1C1C0C07, // 0013 EQ R7 R6 R7 + 0x781E0005, // 0014 JMPF R7 #001B + 0x8C1C0705, // 0015 GETMET R7 R3 K5 + 0x88240906, // 0016 GETMBR R9 R4 K6 + 0x58280008, // 0017 LDCONST R10 K8 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x7002002B, // 001A JMP #0047 - 0x541A000E, // 001B LDINT R6 15 - 0x1C180A06, // 001C EQ R6 R5 R6 - 0x781A0005, // 001D JMPF R6 #0024 - 0x8C180705, // 001E GETMET R6 R3 K5 - 0x88200706, // 001F GETMBR R8 R3 K6 - 0x58240009, // 0020 LDCONST R9 K9 - 0x7C180600, // 0021 CALL R6 3 - 0x80040C00, // 0022 RET 1 R6 + 0x541E000E, // 001B LDINT R7 15 + 0x1C1C0C07, // 001C EQ R7 R6 R7 + 0x781E0005, // 001D JMPF R7 #0024 + 0x8C1C0705, // 001E GETMET R7 R3 K5 + 0x88240906, // 001F GETMBR R9 R4 K6 + 0x58280009, // 0020 LDCONST R10 K9 + 0x7C1C0600, // 0021 CALL R7 3 + 0x80040E00, // 0022 RET 1 R7 0x70020022, // 0023 JMP #0047 - 0x541A400A, // 0024 LDINT R6 16395 - 0x1C180A06, // 0025 EQ R6 R5 R6 - 0x781A0005, // 0026 JMPF R6 #002D - 0x8C180705, // 0027 GETMET R6 R3 K5 - 0x88200706, // 0028 GETMBR R8 R3 K6 - 0x8824010A, // 0029 GETMBR R9 R0 K10 - 0x7C180600, // 002A CALL R6 3 - 0x80040C00, // 002B RET 1 R6 + 0x541E400A, // 0024 LDINT R7 16395 + 0x1C1C0C07, // 0025 EQ R7 R6 R7 + 0x781E0005, // 0026 JMPF R7 #002D + 0x8C1C0705, // 0027 GETMET R7 R3 K5 + 0x88240906, // 0028 GETMBR R9 R4 K6 + 0x8828010A, // 0029 GETMBR R10 R0 K10 + 0x7C1C0600, // 002A CALL R7 3 + 0x80040E00, // 002B RET 1 R7 0x70020019, // 002C JMP #0047 - 0x541A400B, // 002D LDINT R6 16396 - 0x1C180A06, // 002E EQ R6 R5 R6 - 0x781A0005, // 002F JMPF R6 #0036 - 0x8C180705, // 0030 GETMET R6 R3 K5 - 0x88200706, // 0031 GETMBR R8 R3 K6 - 0x8824010B, // 0032 GETMBR R9 R0 K11 - 0x7C180600, // 0033 CALL R6 3 - 0x80040C00, // 0034 RET 1 R6 + 0x541E400B, // 002D LDINT R7 16396 + 0x1C1C0C07, // 002E EQ R7 R6 R7 + 0x781E0005, // 002F JMPF R7 #0036 + 0x8C1C0705, // 0030 GETMET R7 R3 K5 + 0x88240906, // 0031 GETMBR R9 R4 K6 + 0x8828010B, // 0032 GETMBR R10 R0 K11 + 0x7C1C0600, // 0033 CALL R7 3 + 0x80040E00, // 0034 RET 1 R7 0x70020010, // 0035 JMP #0047 - 0x541AFFFB, // 0036 LDINT R6 65532 - 0x1C180A06, // 0037 EQ R6 R5 R6 - 0x781A0005, // 0038 JMPF R6 #003F - 0x8C180705, // 0039 GETMET R6 R3 K5 - 0x8820070C, // 003A GETMBR R8 R3 K12 - 0x5426000F, // 003B LDINT R9 16 - 0x7C180600, // 003C CALL R6 3 - 0x80040C00, // 003D RET 1 R6 + 0x541EFFFB, // 0036 LDINT R7 65532 + 0x1C1C0C07, // 0037 EQ R7 R6 R7 + 0x781E0005, // 0038 JMPF R7 #003F + 0x8C1C0705, // 0039 GETMET R7 R3 K5 + 0x8824090C, // 003A GETMBR R9 R4 K12 + 0x542A000F, // 003B LDINT R10 16 + 0x7C1C0600, // 003C CALL R7 3 + 0x80040E00, // 003D RET 1 R7 0x70020007, // 003E JMP #0047 - 0x541AFFFC, // 003F LDINT R6 65533 - 0x1C180A06, // 0040 EQ R6 R5 R6 - 0x781A0004, // 0041 JMPF R6 #0047 - 0x8C180705, // 0042 GETMET R6 R3 K5 - 0x8820070C, // 0043 GETMBR R8 R3 K12 - 0x54260004, // 0044 LDINT R9 5 - 0x7C180600, // 0045 CALL R6 3 - 0x80040C00, // 0046 RET 1 R6 - 0x70020007, // 0047 JMP #0050 - 0x60180003, // 0048 GETGBL R6 G3 - 0x5C1C0000, // 0049 MOVE R7 R0 - 0x7C180200, // 004A CALL R6 1 - 0x8C180D0D, // 004B GETMET R6 R6 K13 - 0x5C200200, // 004C MOVE R8 R1 - 0x5C240400, // 004D MOVE R9 R2 - 0x7C180600, // 004E CALL R6 3 - 0x80040C00, // 004F RET 1 R6 - 0x80000000, // 0050 RET 0 + 0x541EFFFC, // 003F LDINT R7 65533 + 0x1C1C0C07, // 0040 EQ R7 R6 R7 + 0x781E0004, // 0041 JMPF R7 #0047 + 0x8C1C0705, // 0042 GETMET R7 R3 K5 + 0x8824090C, // 0043 GETMBR R9 R4 K12 + 0x542A0004, // 0044 LDINT R10 5 + 0x7C1C0600, // 0045 CALL R7 3 + 0x80040E00, // 0046 RET 1 R7 + 0x70020008, // 0047 JMP #0051 + 0x601C0003, // 0048 GETGBL R7 G3 + 0x5C200000, // 0049 MOVE R8 R0 + 0x7C1C0200, // 004A CALL R7 1 + 0x8C1C0F0D, // 004B GETMET R7 R7 K13 + 0x5C240200, // 004C MOVE R9 R1 + 0x5C280400, // 004D MOVE R10 R2 + 0x5C2C0600, // 004E MOVE R11 R3 + 0x7C1C0800, // 004F CALL R7 4 + 0x80040E00, // 0050 RET 1 R7 + 0x80000000, // 0051 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h index 97ac6cc6b..284eaf8e6 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Light3.h @@ -112,8 +112,8 @@ be_local_closure(Matter_Plugin_Light3_update_shadow, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -127,7 +127,7 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_nested_str_weak(shadow_hue), /* K9 */ be_const_int(1), @@ -137,113 +137,114 @@ be_local_closure(Matter_Plugin_Light3_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[106]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A02FF, // 0004 LDINT R6 768 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0059, // 0006 JMPF R6 #0061 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[107]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E02FF, // 0004 LDINT R7 768 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0059, // 0006 JMPF R7 #0061 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x7002004E, // 0010 JMP #0060 - 0x1C180B09, // 0011 EQ R6 R5 K9 - 0x781A0005, // 0012 JMPF R6 #0019 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200707, // 0014 GETMBR R8 R3 K7 - 0x8824010A, // 0015 GETMBR R9 R0 K10 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x1C1C0D09, // 0011 EQ R7 R6 K9 + 0x781E0005, // 0012 JMPF R7 #0019 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240907, // 0014 GETMBR R9 R4 K7 + 0x8828010A, // 0015 GETMBR R10 R0 K10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020046, // 0018 JMP #0060 - 0x541A0006, // 0019 LDINT R6 7 - 0x1C180A06, // 001A EQ R6 R5 R6 - 0x781A0005, // 001B JMPF R6 #0022 - 0x8C180706, // 001C GETMET R6 R3 K6 - 0x88200707, // 001D GETMBR R8 R3 K7 - 0x58240005, // 001E LDCONST R9 K5 - 0x7C180600, // 001F CALL R6 3 - 0x80040C00, // 0020 RET 1 R6 + 0x541E0006, // 0019 LDINT R7 7 + 0x1C1C0C07, // 001A EQ R7 R6 R7 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0706, // 001C GETMET R7 R3 K6 + 0x88240907, // 001D GETMBR R9 R4 K7 + 0x58280005, // 001E LDCONST R10 K5 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 0x7002003D, // 0021 JMP #0060 - 0x541A0007, // 0022 LDINT R6 8 - 0x1C180A06, // 0023 EQ R6 R5 R6 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x58240005, // 0027 LDCONST R9 K5 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x541E0007, // 0022 LDINT R7 8 + 0x1C1C0C07, // 0023 EQ R7 R6 R7 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x58280005, // 0027 LDCONST R10 K5 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020034, // 002A JMP #0060 - 0x541A000E, // 002B LDINT R6 15 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x88200707, // 002F GETMBR R8 R3 K7 - 0x58240005, // 0030 LDCONST R9 K5 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541E000E, // 002B LDINT R7 15 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x88240907, // 002F GETMBR R9 R4 K7 + 0x58280005, // 0030 LDCONST R10 K5 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x7002002B, // 0033 JMP #0060 - 0x541A4000, // 0034 LDINT R6 16385 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0005, // 0036 JMPF R6 #003D - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x88200707, // 0038 GETMBR R8 R3 K7 - 0x58240005, // 0039 LDCONST R9 K5 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 + 0x541E4000, // 0034 LDINT R7 16385 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0005, // 0036 JMPF R7 #003D + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x88240907, // 0038 GETMBR R9 R4 K7 + 0x58280005, // 0039 LDCONST R10 K5 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 0x70020022, // 003C JMP #0060 - 0x541A4009, // 003D LDINT R6 16394 - 0x1C180A06, // 003E EQ R6 R5 R6 - 0x781A0005, // 003F JMPF R6 #0046 - 0x8C180706, // 0040 GETMET R6 R3 K6 - 0x88200707, // 0041 GETMBR R8 R3 K7 - 0x58240009, // 0042 LDCONST R9 K9 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 + 0x541E4009, // 003D LDINT R7 16394 + 0x1C1C0C07, // 003E EQ R7 R6 R7 + 0x781E0005, // 003F JMPF R7 #0046 + 0x8C1C0706, // 0040 GETMET R7 R3 K6 + 0x88240907, // 0041 GETMBR R9 R4 K7 + 0x58280009, // 0042 LDCONST R10 K9 + 0x7C1C0600, // 0043 CALL R7 3 + 0x80040E00, // 0044 RET 1 R7 0x70020019, // 0045 JMP #0060 - 0x541A000F, // 0046 LDINT R6 16 - 0x1C180A06, // 0047 EQ R6 R5 R6 - 0x781A0005, // 0048 JMPF R6 #004F - 0x8C180706, // 0049 GETMET R6 R3 K6 - 0x88200707, // 004A GETMBR R8 R3 K7 - 0x58240005, // 004B LDCONST R9 K5 - 0x7C180600, // 004C CALL R6 3 - 0x80040C00, // 004D RET 1 R6 + 0x541E000F, // 0046 LDINT R7 16 + 0x1C1C0C07, // 0047 EQ R7 R6 R7 + 0x781E0005, // 0048 JMPF R7 #004F + 0x8C1C0706, // 0049 GETMET R7 R3 K6 + 0x88240907, // 004A GETMBR R9 R4 K7 + 0x58280005, // 004B LDCONST R10 K5 + 0x7C1C0600, // 004C CALL R7 3 + 0x80040E00, // 004D RET 1 R7 0x70020010, // 004E JMP #0060 - 0x541AFFFB, // 004F LDINT R6 65532 - 0x1C180A06, // 0050 EQ R6 R5 R6 - 0x781A0005, // 0051 JMPF R6 #0058 - 0x8C180706, // 0052 GETMET R6 R3 K6 - 0x8820070B, // 0053 GETMBR R8 R3 K11 - 0x58240009, // 0054 LDCONST R9 K9 - 0x7C180600, // 0055 CALL R6 3 - 0x80040C00, // 0056 RET 1 R6 + 0x541EFFFB, // 004F LDINT R7 65532 + 0x1C1C0C07, // 0050 EQ R7 R6 R7 + 0x781E0005, // 0051 JMPF R7 #0058 + 0x8C1C0706, // 0052 GETMET R7 R3 K6 + 0x8824090B, // 0053 GETMBR R9 R4 K11 + 0x58280009, // 0054 LDCONST R10 K9 + 0x7C1C0600, // 0055 CALL R7 3 + 0x80040E00, // 0056 RET 1 R7 0x70020007, // 0057 JMP #0060 - 0x541AFFFC, // 0058 LDINT R6 65533 - 0x1C180A06, // 0059 EQ R6 R5 R6 - 0x781A0004, // 005A JMPF R6 #0060 - 0x8C180706, // 005B GETMET R6 R3 K6 - 0x8820070B, // 005C GETMBR R8 R3 K11 - 0x54260004, // 005D LDINT R9 5 - 0x7C180600, // 005E CALL R6 3 - 0x80040C00, // 005F RET 1 R6 - 0x70020007, // 0060 JMP #0069 - 0x60180003, // 0061 GETGBL R6 G3 - 0x5C1C0000, // 0062 MOVE R7 R0 - 0x7C180200, // 0063 CALL R6 1 - 0x8C180D0C, // 0064 GETMET R6 R6 K12 - 0x5C200200, // 0065 MOVE R8 R1 - 0x5C240400, // 0066 MOVE R9 R2 - 0x7C180600, // 0067 CALL R6 3 - 0x80040C00, // 0068 RET 1 R6 - 0x80000000, // 0069 RET 0 + 0x541EFFFC, // 0058 LDINT R7 65533 + 0x1C1C0C07, // 0059 EQ R7 R6 R7 + 0x781E0004, // 005A JMPF R7 #0060 + 0x8C1C0706, // 005B GETMET R7 R3 K6 + 0x8824090B, // 005C GETMBR R9 R4 K11 + 0x542A0004, // 005D LDINT R10 5 + 0x7C1C0600, // 005E CALL R7 3 + 0x80040E00, // 005F RET 1 R7 + 0x70020008, // 0060 JMP #006A + 0x601C0003, // 0061 GETGBL R7 G3 + 0x5C200000, // 0062 MOVE R8 R0 + 0x7C1C0200, // 0063 CALL R7 1 + 0x8C1C0F0C, // 0064 GETMET R7 R7 K12 + 0x5C240200, // 0065 MOVE R9 R1 + 0x5C280400, // 0066 MOVE R10 R2 + 0x5C2C0600, // 0067 MOVE R11 R3 + 0x7C1C0800, // 0068 CALL R7 4 + 0x80040E00, // 0069 RET 1 R7 + 0x80000000, // 006A RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h index 5a8d6ac96..bf855e119 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_OnOff.h @@ -190,8 +190,8 @@ be_local_closure(Matter_Plugin_OnOff_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -205,7 +205,7 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(shadow_onoff), /* K9 */ be_nested_str_weak(U4), @@ -213,51 +213,52 @@ be_local_closure(Matter_Plugin_OnOff_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0005, // 0004 LDINT R6 6 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A001B, // 0006 JMPF R6 #0023 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[45]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x70020010, // 0010 JMP #0022 - 0x541AFFFB, // 0011 LDINT R6 65532 - 0x1C180A06, // 0012 EQ R6 R5 R6 - 0x781A0005, // 0013 JMPF R6 #001A - 0x8C180706, // 0014 GETMET R6 R3 K6 - 0x88200709, // 0015 GETMBR R8 R3 K9 - 0x58240005, // 0016 LDCONST R9 K5 - 0x7C180600, // 0017 CALL R6 3 - 0x80040C00, // 0018 RET 1 R6 + 0x541EFFFB, // 0011 LDINT R7 65532 + 0x1C1C0C07, // 0012 EQ R7 R6 R7 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0706, // 0014 GETMET R7 R3 K6 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x58280005, // 0016 LDCONST R10 K5 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 0x70020007, // 0019 JMP #0022 - 0x541AFFFC, // 001A LDINT R6 65533 - 0x1C180A06, // 001B EQ R6 R5 R6 - 0x781A0004, // 001C JMPF R6 #0022 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200709, // 001E GETMBR R8 R3 K9 - 0x54260003, // 001F LDINT R9 4 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 - 0x70020007, // 0022 JMP #002B - 0x60180003, // 0023 GETGBL R6 G3 - 0x5C1C0000, // 0024 MOVE R7 R0 - 0x7C180200, // 0025 CALL R6 1 - 0x8C180D0A, // 0026 GETMET R6 R6 K10 - 0x5C200200, // 0027 MOVE R8 R1 - 0x5C240400, // 0028 MOVE R9 R2 - 0x7C180600, // 0029 CALL R6 3 - 0x80040C00, // 002A RET 1 R6 - 0x80000000, // 002B RET 0 + 0x541EFFFC, // 001A LDINT R7 65533 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0004, // 001C JMPF R7 #0022 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240909, // 001E GETMBR R9 R4 K9 + 0x542A0003, // 001F LDINT R10 4 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 3c5b8c679..56c6ff303 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -47,7 +47,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[102]) { /* constants */ + ( &(const bvalue[101]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -84,76 +84,75 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K33 */ be_nested_str_weak(B1), /* K34 */ be_nested_str_weak(U4), /* K35 */ be_nested_str_weak(tasmota), - /* K36 */ be_nested_str_weak(rtc), - /* K37 */ be_nested_str_weak(utc), - /* K38 */ be_nested_str_weak(tlv2raw), - /* K39 */ be_nested_str_weak(get_ac), - /* K40 */ be_nested_str_weak(EC_P256), - /* K41 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K42 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K43 */ be_nested_str_weak(gen_CSR), - /* K44 */ be_nested_str_weak(set_temp_ca), - /* K45 */ be_nested_str_weak(SUCCESS), - /* K46 */ be_nested_str_weak(log), - /* K47 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K48 */ be_nested_str_weak(get_temp_ca), - /* K49 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K50 */ be_nested_str_weak(sessions), - /* K51 */ be_nested_str_weak(create_fabric), - /* K52 */ be_nested_str_weak(set_ca), - /* K53 */ be_nested_str_weak(set_noc_icac), - /* K54 */ be_nested_str_weak(set_ipk_epoch_key), - /* K55 */ be_nested_str_weak(set_admin_subject_vendor), - /* K56 */ be_nested_str_weak(set_pk), - /* K57 */ be_nested_str_weak(get_pk), - /* K58 */ be_nested_str_weak(parse), - /* K59 */ be_nested_str_weak(findsub), - /* K60 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K61 */ be_nested_str_weak(int), - /* K62 */ be_nested_str_weak(int64), - /* K63 */ be_nested_str_weak(fromu32), - /* K64 */ be_nested_str_weak(tobytes), - /* K65 */ be_nested_str_weak(get_temp_ca_pub), - /* K66 */ be_const_int(2147483647), - /* K67 */ be_nested_str_weak(fromstring), - /* K68 */ be_nested_str_weak(CompressedFabric), - /* K69 */ be_nested_str_weak(HKDF_SHA256), - /* K70 */ be_nested_str_weak(copy), - /* K71 */ be_nested_str_weak(reverse), - /* K72 */ be_nested_str_weak(derive), - /* K73 */ be_nested_str_weak(commissioning_admin_fabric), - /* K74 */ be_nested_str_weak(set_fabric_device), - /* K75 */ be_nested_str_weak(fabric_candidate), - /* K76 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K77 */ be_nested_str_weak(is_PASE), - /* K78 */ be_nested_str_weak(set_expire_in_seconds), - /* K79 */ be_nested_str_weak(log_new_fabric), - /* K80 */ be_nested_str_weak(set_fabric_label), - /* K81 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K82 */ be_nested_str_weak(get_fabric_id), - /* K83 */ be_nested_str_weak(tohex), - /* K84 */ be_nested_str_weak(fabric_index_X3A), - /* K85 */ be_nested_str_weak(active_fabrics), - /* K86 */ be_nested_str_weak(get_fabric_index), - /* K87 */ be_nested_str_weak(set_timer), - /* K88 */ be_nested_str_weak(stop_iteration), - /* K89 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K90 */ be_nested_str_weak(_X29_X20not_X20found), - /* K91 */ be_nested_str_weak(INVALID_ACTION), - /* K92 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K93 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K94 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K95 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K96 */ be_nested_str_weak(start_basic_commissioning), - /* K97 */ be_nested_str_weak(get_fabric), - /* K98 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K99 */ be_nested_str_weak(start_root_basic_commissioning), - /* K100 */ be_nested_str_weak(stop_basic_commissioning), - /* K101 */ be_nested_str_weak(invoke_request), + /* K36 */ be_nested_str_weak(rtc_utc), + /* K37 */ be_nested_str_weak(tlv2raw), + /* K38 */ be_nested_str_weak(get_ac), + /* K39 */ be_nested_str_weak(EC_P256), + /* K40 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K41 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K42 */ be_nested_str_weak(gen_CSR), + /* K43 */ be_nested_str_weak(set_temp_ca), + /* K44 */ be_nested_str_weak(SUCCESS), + /* K45 */ be_nested_str_weak(log), + /* K46 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K47 */ be_nested_str_weak(get_temp_ca), + /* K48 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K49 */ be_nested_str_weak(sessions), + /* K50 */ be_nested_str_weak(create_fabric), + /* K51 */ be_nested_str_weak(set_ca), + /* K52 */ be_nested_str_weak(set_noc_icac), + /* K53 */ be_nested_str_weak(set_ipk_epoch_key), + /* K54 */ be_nested_str_weak(set_admin_subject_vendor), + /* K55 */ be_nested_str_weak(set_pk), + /* K56 */ be_nested_str_weak(get_pk), + /* K57 */ be_nested_str_weak(parse), + /* K58 */ be_nested_str_weak(findsub), + /* K59 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K60 */ be_nested_str_weak(int), + /* K61 */ be_nested_str_weak(int64), + /* K62 */ be_nested_str_weak(fromu32), + /* K63 */ be_nested_str_weak(tobytes), + /* K64 */ be_nested_str_weak(get_temp_ca_pub), + /* K65 */ be_const_int(2147483647), + /* K66 */ be_nested_str_weak(fromstring), + /* K67 */ be_nested_str_weak(CompressedFabric), + /* K68 */ be_nested_str_weak(HKDF_SHA256), + /* K69 */ be_nested_str_weak(copy), + /* K70 */ be_nested_str_weak(reverse), + /* K71 */ be_nested_str_weak(derive), + /* K72 */ be_nested_str_weak(commissioning_admin_fabric), + /* K73 */ be_nested_str_weak(set_fabric_device), + /* K74 */ be_nested_str_weak(fabric_candidate), + /* K75 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K76 */ be_nested_str_weak(is_PASE), + /* K77 */ be_nested_str_weak(set_expire_in_seconds), + /* K78 */ be_nested_str_weak(log_new_fabric), + /* K79 */ be_nested_str_weak(set_fabric_label), + /* K80 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K81 */ be_nested_str_weak(get_fabric_id), + /* K82 */ be_nested_str_weak(tohex), + /* K83 */ be_nested_str_weak(fabric_index_X3A), + /* K84 */ be_nested_str_weak(active_fabrics), + /* K85 */ be_nested_str_weak(get_fabric_index), + /* K86 */ be_nested_str_weak(set_timer), + /* K87 */ be_nested_str_weak(stop_iteration), + /* K88 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K89 */ be_nested_str_weak(_X29_X20not_X20found), + /* K90 */ be_nested_str_weak(INVALID_ACTION), + /* K91 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K92 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K93 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K94 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K95 */ be_nested_str_weak(start_basic_commissioning), + /* K96 */ be_nested_str_weak(get_fabric), + /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K98 */ be_nested_str_weak(start_root_basic_commissioning), + /* K99 */ be_nested_str_weak(stop_basic_commissioning), + /* K100 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, - ( &(const binstruction[714]) { /* code */ + ( &(const binstruction[713]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -254,10 +253,10 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x80041000, // 0061 RET 1 R8 0x70020000, // 0062 JMP #0064 0xB006331A, // 0063 RAISE 1 K25 K26 - 0x70020262, // 0064 JMP #02C8 + 0x70020261, // 0064 JMP #02C7 0x5422003D, // 0065 LDINT R8 62 0x1C200C08, // 0066 EQ R8 R6 R8 - 0x782201C3, // 0067 JMPF R8 #022C + 0x782201C2, // 0067 JMPF R8 #022B 0x1C200F0E, // 0068 EQ R8 R7 K14 0x7822001D, // 0069 JMPF R8 #0088 0x8C200506, // 006A GETMET R8 R2 K6 @@ -289,9 +288,9 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C280800, // 0084 CALL R10 4 0x900E0910, // 0085 SETMBR R3 K4 K16 0x80041200, // 0086 RET 1 R9 - 0x700201A2, // 0087 JMP #022B + 0x700201A1, // 0087 JMP #022A 0x1C200F05, // 0088 EQ R8 R7 K5 - 0x7822003D, // 0089 JMPF R8 #00C8 + 0x7822003C, // 0089 JMPF R8 #00C7 0x8C200506, // 008A GETMET R8 R2 K6 0x58280005, // 008B LDCONST R10 K5 0x7C200400, // 008C CALL R8 2 @@ -324,550 +323,549 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0xB83A4600, // 00A7 GETNGBL R14 K35 0x8C381D24, // 00A8 GETMET R14 R14 K36 0x7C380200, // 00A9 CALL R14 1 - 0x94381D25, // 00AA GETIDX R14 R14 K37 - 0x7C280800, // 00AB CALL R10 4 - 0x8C281326, // 00AC GETMET R10 R9 K38 - 0x7C280200, // 00AD CALL R10 1 - 0x8C2C0327, // 00AE GETMET R11 R1 K39 - 0x7C2C0200, // 00AF CALL R11 1 - 0x0030140B, // 00B0 ADD R12 R10 R11 - 0x8C340928, // 00B1 GETMET R13 R4 K40 - 0x7C340200, // 00B2 CALL R13 1 - 0x8C341B29, // 00B3 GETMET R13 R13 K41 - 0xB83E0200, // 00B4 GETNGBL R15 K1 - 0x8C3C1F2A, // 00B5 GETMET R15 R15 K42 - 0x7C3C0200, // 00B6 CALL R15 1 - 0x5C401800, // 00B7 MOVE R16 R12 - 0x7C340600, // 00B8 CALL R13 3 - 0x8C380B09, // 00B9 GETMET R14 R5 K9 - 0x7C380200, // 00BA CALL R14 1 - 0x8C3C1D0A, // 00BB GETMET R15 R14 K10 - 0x58440005, // 00BC LDCONST R17 K5 - 0x88480B1D, // 00BD GETMBR R18 R5 K29 - 0x5C4C1400, // 00BE MOVE R19 R10 - 0x7C3C0800, // 00BF CALL R15 4 - 0x8C3C1D0A, // 00C0 GETMET R15 R14 K10 - 0x58440007, // 00C1 LDCONST R17 K7 - 0x88480B21, // 00C2 GETMBR R18 R5 K33 - 0x5C4C1A00, // 00C3 MOVE R19 R13 - 0x7C3C0800, // 00C4 CALL R15 4 - 0x900E0907, // 00C5 SETMBR R3 K4 K7 - 0x80041C00, // 00C6 RET 1 R14 - 0x70020162, // 00C7 JMP #022B - 0x54220003, // 00C8 LDINT R8 4 - 0x1C200E08, // 00C9 EQ R8 R7 R8 - 0x7822003C, // 00CA JMPF R8 #0108 - 0x8C200111, // 00CB GETMET R8 R0 K17 - 0x88280712, // 00CC GETMBR R10 R3 K18 - 0x7C200400, // 00CD CALL R8 2 - 0x8C200506, // 00CE GETMET R8 R2 K6 - 0x58280005, // 00CF LDCONST R10 K5 - 0x7C200400, // 00D0 CALL R8 2 - 0x6024000C, // 00D1 GETGBL R9 G12 - 0x5C281000, // 00D2 MOVE R10 R8 - 0x7C240200, // 00D3 CALL R9 1 - 0x542A001F, // 00D4 LDINT R10 32 - 0x2024120A, // 00D5 NE R9 R9 R10 - 0x78260001, // 00D6 JMPF R9 #00D9 - 0x4C240000, // 00D7 LDNIL R9 - 0x80041200, // 00D8 RET 1 R9 - 0x8C240506, // 00D9 GETMET R9 R2 K6 - 0x582C0007, // 00DA LDCONST R11 K7 - 0x50300000, // 00DB LDBOOL R12 0 0 - 0x7C240600, // 00DC CALL R9 3 - 0x8C28032B, // 00DD GETMET R10 R1 K43 - 0x7C280200, // 00DE CALL R10 1 - 0x8C2C0B09, // 00DF GETMET R11 R5 K9 - 0x7C2C0200, // 00E0 CALL R11 1 - 0x8C30170A, // 00E1 GETMET R12 R11 K10 - 0x58380007, // 00E2 LDCONST R14 K7 - 0x883C0B1D, // 00E3 GETMBR R15 R5 K29 - 0x5C401400, // 00E4 MOVE R16 R10 - 0x7C300800, // 00E5 CALL R12 4 - 0x8C30170A, // 00E6 GETMET R12 R11 K10 - 0x5838000E, // 00E7 LDCONST R14 K14 - 0x883C0B21, // 00E8 GETMBR R15 R5 K33 - 0x5C401000, // 00E9 MOVE R16 R8 - 0x7C300800, // 00EA CALL R12 4 - 0x8C301726, // 00EB GETMET R12 R11 K38 - 0x7C300200, // 00EC CALL R12 1 - 0x8C340327, // 00ED GETMET R13 R1 K39 - 0x7C340200, // 00EE CALL R13 1 - 0x0034180D, // 00EF ADD R13 R12 R13 - 0x8C380928, // 00F0 GETMET R14 R4 K40 - 0x7C380200, // 00F1 CALL R14 1 - 0x8C381D29, // 00F2 GETMET R14 R14 K41 - 0xB8420200, // 00F3 GETNGBL R16 K1 - 0x8C40212A, // 00F4 GETMET R16 R16 K42 - 0x7C400200, // 00F5 CALL R16 1 - 0x5C441A00, // 00F6 MOVE R17 R13 - 0x7C380600, // 00F7 CALL R14 3 - 0x8C3C0B09, // 00F8 GETMET R15 R5 K9 - 0x7C3C0200, // 00F9 CALL R15 1 - 0x8C401F0A, // 00FA GETMET R16 R15 K10 - 0x58480005, // 00FB LDCONST R18 K5 - 0x884C0B1D, // 00FC GETMBR R19 R5 K29 - 0x5C501800, // 00FD MOVE R20 R12 - 0x7C400800, // 00FE CALL R16 4 - 0x8C401F0A, // 00FF GETMET R16 R15 K10 - 0x58480007, // 0100 LDCONST R18 K7 - 0x884C0B21, // 0101 GETMBR R19 R5 K33 - 0x5C501C00, // 0102 MOVE R20 R14 - 0x7C400800, // 0103 CALL R16 4 - 0x54420004, // 0104 LDINT R16 5 - 0x900E0810, // 0105 SETMBR R3 K4 R16 - 0x80041E00, // 0106 RET 1 R15 - 0x70020122, // 0107 JMP #022B - 0x5422000A, // 0108 LDINT R8 11 - 0x1C200E08, // 0109 EQ R8 R7 R8 - 0x7822000B, // 010A JMPF R8 #0117 - 0x8C200506, // 010B GETMET R8 R2 K6 - 0x58280005, // 010C LDCONST R10 K5 - 0x7C200400, // 010D CALL R8 2 - 0x8C24032C, // 010E GETMET R9 R1 K44 - 0x5C2C1000, // 010F MOVE R11 R8 - 0x7C240400, // 0110 CALL R9 2 - 0xB8260200, // 0111 GETNGBL R9 K1 - 0x8824132D, // 0112 GETMBR R9 R9 K45 - 0x900E3609, // 0113 SETMBR R3 K27 R9 - 0x4C240000, // 0114 LDNIL R9 - 0x80041200, // 0115 RET 1 R9 - 0x70020113, // 0116 JMP #022B - 0x54220005, // 0117 LDINT R8 6 - 0x1C200E08, // 0118 EQ R8 R7 R8 - 0x782200B9, // 0119 JMPF R8 #01D4 - 0xB8224600, // 011A GETNGBL R8 K35 - 0x8C20112E, // 011B GETMET R8 R8 K46 - 0x60280008, // 011C GETGBL R10 G8 - 0x5C2C0400, // 011D MOVE R11 R2 - 0x7C280200, // 011E CALL R10 1 - 0x002A5E0A, // 011F ADD R10 K47 R10 - 0x542E0003, // 0120 LDINT R11 4 - 0x7C200600, // 0121 CALL R8 3 - 0x8C200506, // 0122 GETMET R8 R2 K6 - 0x58280005, // 0123 LDCONST R10 K5 - 0x7C200400, // 0124 CALL R8 2 - 0x8C240506, // 0125 GETMET R9 R2 K6 - 0x582C0007, // 0126 LDCONST R11 K7 - 0x7C240400, // 0127 CALL R9 2 - 0x6028000C, // 0128 GETGBL R10 G12 - 0x5C2C1200, // 0129 MOVE R11 R9 - 0x7C280200, // 012A CALL R10 1 - 0x1C281505, // 012B EQ R10 R10 K5 - 0x782A0000, // 012C JMPF R10 #012E - 0x4C240000, // 012D LDNIL R9 - 0x8C280506, // 012E GETMET R10 R2 K6 - 0x5830000E, // 012F LDCONST R12 K14 - 0x7C280400, // 0130 CALL R10 2 - 0x8C2C0506, // 0131 GETMET R11 R2 K6 - 0x58340010, // 0132 LDCONST R13 K16 - 0x7C2C0400, // 0133 CALL R11 2 - 0x8C300506, // 0134 GETMET R12 R2 K6 - 0x543A0003, // 0135 LDINT R14 4 - 0x7C300400, // 0136 CALL R12 2 - 0x8C340330, // 0137 GETMET R13 R1 K48 - 0x7C340200, // 0138 CALL R13 1 - 0x4C380000, // 0139 LDNIL R14 - 0x1C341A0E, // 013A EQ R13 R13 R14 - 0x78360006, // 013B JMPF R13 #0143 - 0xB8364600, // 013C GETNGBL R13 K35 - 0x8C341B2E, // 013D GETMET R13 R13 K46 - 0x583C0031, // 013E LDCONST R15 K49 - 0x5840000E, // 013F LDCONST R16 K14 - 0x7C340600, // 0140 CALL R13 3 - 0x4C340000, // 0141 LDNIL R13 - 0x80041A00, // 0142 RET 1 R13 - 0x88340117, // 0143 GETMBR R13 R0 K23 - 0x88341B32, // 0144 GETMBR R13 R13 K50 - 0x8C341B33, // 0145 GETMET R13 R13 K51 - 0x7C340200, // 0146 CALL R13 1 - 0x8C381B34, // 0147 GETMET R14 R13 K52 - 0x8C400330, // 0148 GETMET R16 R1 K48 - 0x7C400200, // 0149 CALL R16 1 - 0x7C380400, // 014A CALL R14 2 - 0x8C381B35, // 014B GETMET R14 R13 K53 - 0x5C401000, // 014C MOVE R16 R8 - 0x5C441200, // 014D MOVE R17 R9 - 0x7C380600, // 014E CALL R14 3 - 0x8C381B36, // 014F GETMET R14 R13 K54 - 0x5C401400, // 0150 MOVE R16 R10 - 0x7C380400, // 0151 CALL R14 2 - 0x8C381B37, // 0152 GETMET R14 R13 K55 - 0x5C401600, // 0153 MOVE R16 R11 - 0x5C441800, // 0154 MOVE R17 R12 - 0x7C380600, // 0155 CALL R14 3 - 0x8C381B38, // 0156 GETMET R14 R13 K56 - 0x8C400339, // 0157 GETMET R16 R1 K57 - 0x7C400200, // 0158 CALL R16 1 - 0x7C380400, // 0159 CALL R14 2 - 0xB83A0200, // 015A GETNGBL R14 K1 - 0x88381D02, // 015B GETMBR R14 R14 K2 - 0x8C381D3A, // 015C GETMET R14 R14 K58 - 0x5C401000, // 015D MOVE R16 R8 - 0x7C380400, // 015E CALL R14 2 - 0x8C3C1D3B, // 015F GETMET R15 R14 K59 - 0x54460005, // 0160 LDINT R17 6 - 0x7C3C0400, // 0161 CALL R15 2 - 0x8C401F06, // 0162 GETMET R16 R15 K6 - 0x544A0014, // 0163 LDINT R18 21 - 0x7C400400, // 0164 CALL R16 2 - 0x8C441F06, // 0165 GETMET R17 R15 K6 - 0x544E0010, // 0166 LDINT R19 17 - 0x7C440400, // 0167 CALL R17 2 - 0x5C482000, // 0168 MOVE R18 R16 - 0x784A0001, // 0169 JMPF R18 #016C - 0x5C482200, // 016A MOVE R18 R17 - 0x744A0006, // 016B JMPT R18 #0173 - 0xB84A4600, // 016C GETNGBL R18 K35 - 0x8C48252E, // 016D GETMET R18 R18 K46 - 0x5850003C, // 016E LDCONST R20 K60 - 0x5854000E, // 016F LDCONST R21 K14 - 0x7C480600, // 0170 CALL R18 3 - 0x50480000, // 0171 LDBOOL R18 0 0 - 0x80042400, // 0172 RET 1 R18 - 0x60480004, // 0173 GETGBL R18 G4 - 0x5C4C2000, // 0174 MOVE R19 R16 - 0x7C480200, // 0175 CALL R18 1 - 0x1C48253D, // 0176 EQ R18 R18 K61 - 0x784A0007, // 0177 JMPF R18 #0180 - 0xB84A7C00, // 0178 GETNGBL R18 K62 - 0x8C48253F, // 0179 GETMET R18 R18 K63 - 0x5C502000, // 017A MOVE R20 R16 - 0x7C480400, // 017B CALL R18 2 - 0x8C482540, // 017C GETMET R18 R18 K64 - 0x7C480200, // 017D CALL R18 1 - 0x5C402400, // 017E MOVE R16 R18 - 0x70020002, // 017F JMP #0183 - 0x8C482140, // 0180 GETMET R18 R16 K64 - 0x7C480200, // 0181 CALL R18 1 - 0x5C402400, // 0182 MOVE R16 R18 - 0x60480004, // 0183 GETGBL R18 G4 - 0x5C4C2200, // 0184 MOVE R19 R17 - 0x7C480200, // 0185 CALL R18 1 - 0x1C48253D, // 0186 EQ R18 R18 K61 - 0x784A0007, // 0187 JMPF R18 #0190 - 0xB84A7C00, // 0188 GETNGBL R18 K62 - 0x8C48253F, // 0189 GETMET R18 R18 K63 - 0x5C502200, // 018A MOVE R20 R17 - 0x7C480400, // 018B CALL R18 2 - 0x8C482540, // 018C GETMET R18 R18 K64 - 0x7C480200, // 018D CALL R18 1 - 0x5C442400, // 018E MOVE R17 R18 - 0x70020002, // 018F JMP #0193 - 0x8C482340, // 0190 GETMET R18 R17 K64 - 0x7C480200, // 0191 CALL R18 1 - 0x5C442400, // 0192 MOVE R17 R18 - 0x8C480341, // 0193 GETMET R18 R1 K65 - 0x7C480200, // 0194 CALL R18 1 - 0x404E0F42, // 0195 CONNECT R19 K7 K66 - 0x94482413, // 0196 GETIDX R18 R18 R19 - 0x60500015, // 0197 GETGBL R20 G21 - 0x7C500000, // 0198 CALL R20 0 - 0x8C502943, // 0199 GETMET R20 R20 K67 - 0x58580044, // 019A LDCONST R22 K68 - 0x7C500400, // 019B CALL R20 2 - 0x5C4C2800, // 019C MOVE R19 R20 - 0x8C500945, // 019D GETMET R20 R4 K69 - 0x7C500200, // 019E CALL R20 1 - 0x8C542146, // 019F GETMET R21 R16 K70 - 0x7C540200, // 01A0 CALL R21 1 - 0x8C542B47, // 01A1 GETMET R21 R21 K71 - 0x7C540200, // 01A2 CALL R21 1 - 0x8C582948, // 01A3 GETMET R22 R20 K72 - 0x5C602400, // 01A4 MOVE R24 R18 - 0x5C642A00, // 01A5 MOVE R25 R21 - 0x5C682600, // 01A6 MOVE R26 R19 - 0x546E0007, // 01A7 LDINT R27 8 - 0x7C580A00, // 01A8 CALL R22 5 - 0x885C0313, // 01A9 GETMBR R23 R1 K19 - 0x785E0001, // 01AA JMPF R23 #01AD - 0x885C0313, // 01AB GETMBR R23 R1 K19 - 0x70020001, // 01AC JMP #01AF - 0x885C0117, // 01AD GETMBR R23 R0 K23 - 0x885C2F49, // 01AE GETMBR R23 R23 K73 - 0x8C601B4A, // 01AF GETMET R24 R13 K74 - 0x5C682000, // 01B0 MOVE R26 R16 - 0x5C6C2200, // 01B1 MOVE R27 R17 - 0x5C702C00, // 01B2 MOVE R28 R22 - 0x5C742E00, // 01B3 MOVE R29 R23 - 0x7C600A00, // 01B4 CALL R24 5 - 0x8C601B4B, // 01B5 GETMET R24 R13 K75 - 0x7C600200, // 01B6 CALL R24 1 - 0x88600117, // 01B7 GETMBR R24 R0 K23 - 0x8C60314C, // 01B8 GETMET R24 R24 K76 - 0x5C681A00, // 01B9 MOVE R26 R13 - 0x7C600400, // 01BA CALL R24 2 - 0x8C60034D, // 01BB GETMET R24 R1 K77 - 0x7C600200, // 01BC CALL R24 1 - 0x78620002, // 01BD JMPF R24 #01C1 - 0x8C60034E, // 01BE GETMET R24 R1 K78 - 0x546A003B, // 01BF LDINT R26 60 - 0x7C600400, // 01C0 CALL R24 2 - 0x8C601B4F, // 01C1 GETMET R24 R13 K79 - 0x7C600200, // 01C2 CALL R24 1 - 0x8C600B09, // 01C3 GETMET R24 R5 K9 - 0x7C600200, // 01C4 CALL R24 1 - 0x8C64310A, // 01C5 GETMET R25 R24 K10 - 0x586C0005, // 01C6 LDCONST R27 K5 - 0x88700B0B, // 01C7 GETMBR R28 R5 K11 - 0xB8760200, // 01C8 GETNGBL R29 K1 - 0x88743B2D, // 01C9 GETMBR R29 R29 K45 - 0x7C640800, // 01CA CALL R25 4 - 0x8C64310A, // 01CB GETMET R25 R24 K10 - 0x586C0007, // 01CC LDCONST R27 K7 - 0x88700B0B, // 01CD GETMBR R28 R5 K11 - 0x58740007, // 01CE LDCONST R29 K7 - 0x7C640800, // 01CF CALL R25 4 - 0x54660007, // 01D0 LDINT R25 8 - 0x900E0819, // 01D1 SETMBR R3 K4 R25 - 0x80043000, // 01D2 RET 1 R24 - 0x70020056, // 01D3 JMP #022B - 0x54220008, // 01D4 LDINT R8 9 - 0x1C200E08, // 01D5 EQ R8 R7 R8 - 0x7822001E, // 01D6 JMPF R8 #01F6 - 0x8C200506, // 01D7 GETMET R8 R2 K6 - 0x58280005, // 01D8 LDCONST R10 K5 - 0x7C200400, // 01D9 CALL R8 2 - 0x8C240350, // 01DA GETMET R9 R1 K80 - 0x5C2C1000, // 01DB MOVE R11 R8 - 0x7C240400, // 01DC CALL R9 2 - 0xB8264600, // 01DD GETNGBL R9 K35 - 0x8C24132E, // 01DE GETMET R9 R9 K46 - 0x602C0018, // 01DF GETGBL R11 G24 - 0x58300051, // 01E0 LDCONST R12 K81 - 0x88340313, // 01E1 GETMBR R13 R1 K19 - 0x8C341B52, // 01E2 GETMET R13 R13 K82 - 0x7C340200, // 01E3 CALL R13 1 - 0x8C341B46, // 01E4 GETMET R13 R13 K70 - 0x7C340200, // 01E5 CALL R13 1 - 0x8C341B47, // 01E6 GETMET R13 R13 K71 - 0x7C340200, // 01E7 CALL R13 1 - 0x8C341B53, // 01E8 GETMET R13 R13 K83 - 0x7C340200, // 01E9 CALL R13 1 - 0x60380008, // 01EA GETGBL R14 G8 - 0x5C3C1000, // 01EB MOVE R15 R8 - 0x7C380200, // 01EC CALL R14 1 - 0x7C2C0600, // 01ED CALL R11 3 - 0x58300010, // 01EE LDCONST R12 K16 - 0x7C240600, // 01EF CALL R9 3 - 0xB8260200, // 01F0 GETNGBL R9 K1 - 0x8824132D, // 01F1 GETMBR R9 R9 K45 - 0x900E3609, // 01F2 SETMBR R3 K27 R9 - 0x4C240000, // 01F3 LDNIL R9 - 0x80041200, // 01F4 RET 1 R9 - 0x70020034, // 01F5 JMP #022B - 0x54220009, // 01F6 LDINT R8 10 - 0x1C200E08, // 01F7 EQ R8 R7 R8 - 0x78220031, // 01F8 JMPF R8 #022B - 0x8C200506, // 01F9 GETMET R8 R2 K6 - 0x58280005, // 01FA LDCONST R10 K5 - 0x7C200400, // 01FB CALL R8 2 - 0x60240008, // 01FC GETGBL R9 G8 - 0x5C281000, // 01FD MOVE R10 R8 - 0x7C240200, // 01FE CALL R9 1 - 0x0026A809, // 01FF ADD R9 K84 R9 - 0x900E5C09, // 0200 SETMBR R3 K46 R9 - 0x60240010, // 0201 GETGBL R9 G16 - 0x88280117, // 0202 GETMBR R10 R0 K23 - 0x88281532, // 0203 GETMBR R10 R10 K50 - 0x8C281555, // 0204 GETMET R10 R10 K85 - 0x7C280200, // 0205 CALL R10 1 - 0x7C240200, // 0206 CALL R9 1 - 0xA8020010, // 0207 EXBLK 0 #0219 - 0x5C281200, // 0208 MOVE R10 R9 - 0x7C280000, // 0209 CALL R10 0 - 0x8C2C1556, // 020A GETMET R11 R10 K86 - 0x7C2C0200, // 020B CALL R11 1 - 0x1C2C1608, // 020C EQ R11 R11 R8 - 0x782E0008, // 020D JMPF R11 #0217 - 0xB82E4600, // 020E GETNGBL R11 K35 - 0x8C2C1757, // 020F GETMET R11 R11 K87 - 0x543607CF, // 0210 LDINT R13 2000 - 0x84380000, // 0211 CLOSURE R14 P0 - 0x7C2C0600, // 0212 CALL R11 3 - 0x502C0200, // 0213 LDBOOL R11 1 0 - 0xA0000000, // 0214 CLOSE R0 - 0xA8040001, // 0215 EXBLK 1 1 - 0x80041600, // 0216 RET 1 R11 - 0xA0240000, // 0217 CLOSE R9 - 0x7001FFEE, // 0218 JMP #0208 - 0x58240058, // 0219 LDCONST R9 K88 - 0xAC240200, // 021A CATCH R9 1 0 - 0xB0080000, // 021B RAISE 2 R0 R0 - 0xB8264600, // 021C GETNGBL R9 K35 - 0x8C24132E, // 021D GETMET R9 R9 K46 - 0x602C0008, // 021E GETGBL R11 G8 - 0x5C301000, // 021F MOVE R12 R8 - 0x7C2C0200, // 0220 CALL R11 1 - 0x002EB20B, // 0221 ADD R11 K89 R11 - 0x002C175A, // 0222 ADD R11 R11 K90 - 0x5830000E, // 0223 LDCONST R12 K14 - 0x7C240600, // 0224 CALL R9 3 - 0xB8260200, // 0225 GETNGBL R9 K1 - 0x8824135B, // 0226 GETMBR R9 R9 K91 - 0x900E3609, // 0227 SETMBR R3 K27 R9 - 0x4C240000, // 0228 LDNIL R9 - 0xA0000000, // 0229 CLOSE R0 - 0x80041200, // 022A RET 1 R9 - 0x7002009B, // 022B JMP #02C8 - 0x5422003B, // 022C LDINT R8 60 - 0x1C200C08, // 022D EQ R8 R6 R8 - 0x78220085, // 022E JMPF R8 #02B5 - 0x1C200F05, // 022F EQ R8 R7 K5 - 0x78220065, // 0230 JMPF R8 #0297 - 0x8C200506, // 0231 GETMET R8 R2 K6 - 0x58280005, // 0232 LDCONST R10 K5 - 0x7C200400, // 0233 CALL R8 2 - 0x8C240506, // 0234 GETMET R9 R2 K6 - 0x582C0007, // 0235 LDCONST R11 K7 - 0x7C240400, // 0236 CALL R9 2 - 0x8C280506, // 0237 GETMET R10 R2 K6 - 0x5830000E, // 0238 LDCONST R12 K14 - 0x7C280400, // 0239 CALL R10 2 - 0x8C2C0506, // 023A GETMET R11 R2 K6 - 0x58340010, // 023B LDCONST R13 K16 - 0x7C2C0400, // 023C CALL R11 2 - 0x8C300506, // 023D GETMET R12 R2 K6 - 0x543A0003, // 023E LDINT R14 4 - 0x7C300400, // 023F CALL R12 2 - 0xB8364600, // 0240 GETNGBL R13 K35 - 0x8C341B2E, // 0241 GETMET R13 R13 K46 - 0x603C0018, // 0242 GETGBL R15 G24 - 0x5840005C, // 0243 LDCONST R16 K92 - 0x5C441000, // 0244 MOVE R17 R8 - 0x8C481353, // 0245 GETMET R18 R9 K83 - 0x7C480200, // 0246 CALL R18 1 - 0x5C4C1400, // 0247 MOVE R19 R10 - 0x5C501600, // 0248 MOVE R20 R11 - 0x8C541953, // 0249 GETMET R21 R12 K83 - 0x7C540200, // 024A CALL R21 1 - 0x7C3C0C00, // 024B CALL R15 6 - 0x54420003, // 024C LDINT R16 4 - 0x7C340600, // 024D CALL R13 3 - 0x4C340000, // 024E LDNIL R13 - 0x1C34100D, // 024F EQ R13 R8 R13 - 0x7436000B, // 0250 JMPT R13 #025D - 0x4C340000, // 0251 LDNIL R13 - 0x1C34120D, // 0252 EQ R13 R9 R13 - 0x74360008, // 0253 JMPT R13 #025D - 0x4C340000, // 0254 LDNIL R13 - 0x1C34140D, // 0255 EQ R13 R10 R13 - 0x74360005, // 0256 JMPT R13 #025D - 0x4C340000, // 0257 LDNIL R13 - 0x1C34160D, // 0258 EQ R13 R11 R13 - 0x74360002, // 0259 JMPT R13 #025D - 0x4C340000, // 025A LDNIL R13 - 0x1C34180D, // 025B EQ R13 R12 R13 - 0x78360005, // 025C JMPF R13 #0263 - 0xB8360200, // 025D GETNGBL R13 K1 - 0x88341B5D, // 025E GETMBR R13 R13 K93 - 0x900E360D, // 025F SETMBR R3 K27 R13 - 0x4C340000, // 0260 LDNIL R13 - 0xA0000000, // 0261 CLOSE R0 - 0x80041A00, // 0262 RET 1 R13 - 0x6034000C, // 0263 GETGBL R13 G12 - 0x5C381200, // 0264 MOVE R14 R9 - 0x7C340200, // 0265 CALL R13 1 - 0x543A001F, // 0266 LDINT R14 32 - 0x543E0040, // 0267 LDINT R15 65 - 0x00381C0F, // 0268 ADD R14 R14 R15 - 0x20341A0E, // 0269 NE R13 R13 R14 - 0x7436000B, // 026A JMPT R13 #0277 - 0x6034000C, // 026B GETGBL R13 G12 - 0x5C381800, // 026C MOVE R14 R12 - 0x7C340200, // 026D CALL R13 1 - 0x543A000F, // 026E LDINT R14 16 - 0x14341A0E, // 026F LT R13 R13 R14 - 0x74360005, // 0270 JMPT R13 #0277 - 0x6034000C, // 0271 GETGBL R13 G12 - 0x5C381800, // 0272 MOVE R14 R12 - 0x7C340200, // 0273 CALL R13 1 - 0x543A001F, // 0274 LDINT R14 32 - 0x24341A0E, // 0275 GT R13 R13 R14 - 0x7836000A, // 0276 JMPF R13 #0282 - 0xB8364600, // 0277 GETNGBL R13 K35 - 0x8C341B2E, // 0278 GETMET R13 R13 K46 - 0x583C005E, // 0279 LDCONST R15 K94 - 0x5840000E, // 027A LDCONST R16 K14 - 0x7C340600, // 027B CALL R13 3 - 0xB8360200, // 027C GETNGBL R13 K1 - 0x88341B5F, // 027D GETMBR R13 R13 K95 - 0x900E360D, // 027E SETMBR R3 K27 R13 - 0x4C340000, // 027F LDNIL R13 - 0xA0000000, // 0280 CLOSE R0 - 0x80041A00, // 0281 RET 1 R13 - 0x5436001E, // 0282 LDINT R13 31 - 0x40360A0D, // 0283 CONNECT R13 K5 R13 - 0x9434120D, // 0284 GETIDX R13 R9 R13 - 0x543A001F, // 0285 LDINT R14 32 - 0x40381D42, // 0286 CONNECT R14 R14 K66 - 0x9438120E, // 0287 GETIDX R14 R9 R14 - 0x883C0117, // 0288 GETMBR R15 R0 K23 - 0x8C3C1F60, // 0289 GETMET R15 R15 K96 - 0x5C441000, // 028A MOVE R17 R8 - 0x5C481600, // 028B MOVE R18 R11 - 0x5C4C1400, // 028C MOVE R19 R10 - 0x5C501800, // 028D MOVE R20 R12 - 0x5C541A00, // 028E MOVE R21 R13 - 0x5C581C00, // 028F MOVE R22 R14 - 0x8C5C0361, // 0290 GETMET R23 R1 K97 - 0x7C5C0200, // 0291 CALL R23 1 - 0x7C3C1000, // 0292 CALL R15 8 - 0x503C0200, // 0293 LDBOOL R15 1 0 - 0xA0000000, // 0294 CLOSE R0 - 0x80041E00, // 0295 RET 1 R15 - 0x7002001C, // 0296 JMP #02B4 - 0x1C200F07, // 0297 EQ R8 R7 K7 - 0x78220012, // 0298 JMPF R8 #02AC - 0x8C200506, // 0299 GETMET R8 R2 K6 - 0x58280005, // 029A LDCONST R10 K5 - 0x7C200400, // 029B CALL R8 2 - 0xB8264600, // 029C GETNGBL R9 K35 - 0x8C24132E, // 029D GETMET R9 R9 K46 - 0x602C0008, // 029E GETGBL R11 G8 - 0x5C301000, // 029F MOVE R12 R8 - 0x7C2C0200, // 02A0 CALL R11 1 - 0x002EC40B, // 02A1 ADD R11 K98 R11 - 0x58300010, // 02A2 LDCONST R12 K16 - 0x7C240600, // 02A3 CALL R9 3 - 0x88240117, // 02A4 GETMBR R9 R0 K23 - 0x8C241363, // 02A5 GETMET R9 R9 K99 - 0x5C2C1000, // 02A6 MOVE R11 R8 - 0x7C240400, // 02A7 CALL R9 2 - 0x50240200, // 02A8 LDBOOL R9 1 0 - 0xA0000000, // 02A9 CLOSE R0 - 0x80041200, // 02AA RET 1 R9 - 0x70020007, // 02AB JMP #02B4 - 0x1C200F0E, // 02AC EQ R8 R7 K14 - 0x78220005, // 02AD JMPF R8 #02B4 - 0x88200117, // 02AE GETMBR R8 R0 K23 - 0x8C201164, // 02AF GETMET R8 R8 K100 - 0x7C200200, // 02B0 CALL R8 1 - 0x50200200, // 02B1 LDBOOL R8 1 0 - 0xA0000000, // 02B2 CLOSE R0 - 0x80041000, // 02B3 RET 1 R8 - 0x70020012, // 02B4 JMP #02C8 - 0x54220029, // 02B5 LDINT R8 42 - 0x1C200C08, // 02B6 EQ R8 R6 R8 - 0x78220005, // 02B7 JMPF R8 #02BE - 0x1C200F05, // 02B8 EQ R8 R7 K5 - 0x78220002, // 02B9 JMPF R8 #02BD - 0x50200200, // 02BA LDBOOL R8 1 0 - 0xA0000000, // 02BB CLOSE R0 - 0x80041000, // 02BC RET 1 R8 - 0x70020009, // 02BD JMP #02C8 - 0x60200003, // 02BE GETGBL R8 G3 - 0x5C240000, // 02BF MOVE R9 R0 - 0x7C200200, // 02C0 CALL R8 1 - 0x8C201165, // 02C1 GETMET R8 R8 K101 - 0x5C280200, // 02C2 MOVE R10 R1 - 0x5C2C0400, // 02C3 MOVE R11 R2 - 0x5C300600, // 02C4 MOVE R12 R3 - 0x7C200800, // 02C5 CALL R8 4 - 0xA0000000, // 02C6 CLOSE R0 - 0x80041000, // 02C7 RET 1 R8 - 0xA0000000, // 02C8 CLOSE R0 - 0x80000000, // 02C9 RET 0 + 0x7C280800, // 00AA CALL R10 4 + 0x8C281325, // 00AB GETMET R10 R9 K37 + 0x7C280200, // 00AC CALL R10 1 + 0x8C2C0326, // 00AD GETMET R11 R1 K38 + 0x7C2C0200, // 00AE CALL R11 1 + 0x0030140B, // 00AF ADD R12 R10 R11 + 0x8C340927, // 00B0 GETMET R13 R4 K39 + 0x7C340200, // 00B1 CALL R13 1 + 0x8C341B28, // 00B2 GETMET R13 R13 K40 + 0xB83E0200, // 00B3 GETNGBL R15 K1 + 0x8C3C1F29, // 00B4 GETMET R15 R15 K41 + 0x7C3C0200, // 00B5 CALL R15 1 + 0x5C401800, // 00B6 MOVE R16 R12 + 0x7C340600, // 00B7 CALL R13 3 + 0x8C380B09, // 00B8 GETMET R14 R5 K9 + 0x7C380200, // 00B9 CALL R14 1 + 0x8C3C1D0A, // 00BA GETMET R15 R14 K10 + 0x58440005, // 00BB LDCONST R17 K5 + 0x88480B1D, // 00BC GETMBR R18 R5 K29 + 0x5C4C1400, // 00BD MOVE R19 R10 + 0x7C3C0800, // 00BE CALL R15 4 + 0x8C3C1D0A, // 00BF GETMET R15 R14 K10 + 0x58440007, // 00C0 LDCONST R17 K7 + 0x88480B21, // 00C1 GETMBR R18 R5 K33 + 0x5C4C1A00, // 00C2 MOVE R19 R13 + 0x7C3C0800, // 00C3 CALL R15 4 + 0x900E0907, // 00C4 SETMBR R3 K4 K7 + 0x80041C00, // 00C5 RET 1 R14 + 0x70020162, // 00C6 JMP #022A + 0x54220003, // 00C7 LDINT R8 4 + 0x1C200E08, // 00C8 EQ R8 R7 R8 + 0x7822003C, // 00C9 JMPF R8 #0107 + 0x8C200111, // 00CA GETMET R8 R0 K17 + 0x88280712, // 00CB GETMBR R10 R3 K18 + 0x7C200400, // 00CC CALL R8 2 + 0x8C200506, // 00CD GETMET R8 R2 K6 + 0x58280005, // 00CE LDCONST R10 K5 + 0x7C200400, // 00CF CALL R8 2 + 0x6024000C, // 00D0 GETGBL R9 G12 + 0x5C281000, // 00D1 MOVE R10 R8 + 0x7C240200, // 00D2 CALL R9 1 + 0x542A001F, // 00D3 LDINT R10 32 + 0x2024120A, // 00D4 NE R9 R9 R10 + 0x78260001, // 00D5 JMPF R9 #00D8 + 0x4C240000, // 00D6 LDNIL R9 + 0x80041200, // 00D7 RET 1 R9 + 0x8C240506, // 00D8 GETMET R9 R2 K6 + 0x582C0007, // 00D9 LDCONST R11 K7 + 0x50300000, // 00DA LDBOOL R12 0 0 + 0x7C240600, // 00DB CALL R9 3 + 0x8C28032A, // 00DC GETMET R10 R1 K42 + 0x7C280200, // 00DD CALL R10 1 + 0x8C2C0B09, // 00DE GETMET R11 R5 K9 + 0x7C2C0200, // 00DF CALL R11 1 + 0x8C30170A, // 00E0 GETMET R12 R11 K10 + 0x58380007, // 00E1 LDCONST R14 K7 + 0x883C0B1D, // 00E2 GETMBR R15 R5 K29 + 0x5C401400, // 00E3 MOVE R16 R10 + 0x7C300800, // 00E4 CALL R12 4 + 0x8C30170A, // 00E5 GETMET R12 R11 K10 + 0x5838000E, // 00E6 LDCONST R14 K14 + 0x883C0B21, // 00E7 GETMBR R15 R5 K33 + 0x5C401000, // 00E8 MOVE R16 R8 + 0x7C300800, // 00E9 CALL R12 4 + 0x8C301725, // 00EA GETMET R12 R11 K37 + 0x7C300200, // 00EB CALL R12 1 + 0x8C340326, // 00EC GETMET R13 R1 K38 + 0x7C340200, // 00ED CALL R13 1 + 0x0034180D, // 00EE ADD R13 R12 R13 + 0x8C380927, // 00EF GETMET R14 R4 K39 + 0x7C380200, // 00F0 CALL R14 1 + 0x8C381D28, // 00F1 GETMET R14 R14 K40 + 0xB8420200, // 00F2 GETNGBL R16 K1 + 0x8C402129, // 00F3 GETMET R16 R16 K41 + 0x7C400200, // 00F4 CALL R16 1 + 0x5C441A00, // 00F5 MOVE R17 R13 + 0x7C380600, // 00F6 CALL R14 3 + 0x8C3C0B09, // 00F7 GETMET R15 R5 K9 + 0x7C3C0200, // 00F8 CALL R15 1 + 0x8C401F0A, // 00F9 GETMET R16 R15 K10 + 0x58480005, // 00FA LDCONST R18 K5 + 0x884C0B1D, // 00FB GETMBR R19 R5 K29 + 0x5C501800, // 00FC MOVE R20 R12 + 0x7C400800, // 00FD CALL R16 4 + 0x8C401F0A, // 00FE GETMET R16 R15 K10 + 0x58480007, // 00FF LDCONST R18 K7 + 0x884C0B21, // 0100 GETMBR R19 R5 K33 + 0x5C501C00, // 0101 MOVE R20 R14 + 0x7C400800, // 0102 CALL R16 4 + 0x54420004, // 0103 LDINT R16 5 + 0x900E0810, // 0104 SETMBR R3 K4 R16 + 0x80041E00, // 0105 RET 1 R15 + 0x70020122, // 0106 JMP #022A + 0x5422000A, // 0107 LDINT R8 11 + 0x1C200E08, // 0108 EQ R8 R7 R8 + 0x7822000B, // 0109 JMPF R8 #0116 + 0x8C200506, // 010A GETMET R8 R2 K6 + 0x58280005, // 010B LDCONST R10 K5 + 0x7C200400, // 010C CALL R8 2 + 0x8C24032B, // 010D GETMET R9 R1 K43 + 0x5C2C1000, // 010E MOVE R11 R8 + 0x7C240400, // 010F CALL R9 2 + 0xB8260200, // 0110 GETNGBL R9 K1 + 0x8824132C, // 0111 GETMBR R9 R9 K44 + 0x900E3609, // 0112 SETMBR R3 K27 R9 + 0x4C240000, // 0113 LDNIL R9 + 0x80041200, // 0114 RET 1 R9 + 0x70020113, // 0115 JMP #022A + 0x54220005, // 0116 LDINT R8 6 + 0x1C200E08, // 0117 EQ R8 R7 R8 + 0x782200B9, // 0118 JMPF R8 #01D3 + 0xB8224600, // 0119 GETNGBL R8 K35 + 0x8C20112D, // 011A GETMET R8 R8 K45 + 0x60280008, // 011B GETGBL R10 G8 + 0x5C2C0400, // 011C MOVE R11 R2 + 0x7C280200, // 011D CALL R10 1 + 0x002A5C0A, // 011E ADD R10 K46 R10 + 0x542E0003, // 011F LDINT R11 4 + 0x7C200600, // 0120 CALL R8 3 + 0x8C200506, // 0121 GETMET R8 R2 K6 + 0x58280005, // 0122 LDCONST R10 K5 + 0x7C200400, // 0123 CALL R8 2 + 0x8C240506, // 0124 GETMET R9 R2 K6 + 0x582C0007, // 0125 LDCONST R11 K7 + 0x7C240400, // 0126 CALL R9 2 + 0x6028000C, // 0127 GETGBL R10 G12 + 0x5C2C1200, // 0128 MOVE R11 R9 + 0x7C280200, // 0129 CALL R10 1 + 0x1C281505, // 012A EQ R10 R10 K5 + 0x782A0000, // 012B JMPF R10 #012D + 0x4C240000, // 012C LDNIL R9 + 0x8C280506, // 012D GETMET R10 R2 K6 + 0x5830000E, // 012E LDCONST R12 K14 + 0x7C280400, // 012F CALL R10 2 + 0x8C2C0506, // 0130 GETMET R11 R2 K6 + 0x58340010, // 0131 LDCONST R13 K16 + 0x7C2C0400, // 0132 CALL R11 2 + 0x8C300506, // 0133 GETMET R12 R2 K6 + 0x543A0003, // 0134 LDINT R14 4 + 0x7C300400, // 0135 CALL R12 2 + 0x8C34032F, // 0136 GETMET R13 R1 K47 + 0x7C340200, // 0137 CALL R13 1 + 0x4C380000, // 0138 LDNIL R14 + 0x1C341A0E, // 0139 EQ R13 R13 R14 + 0x78360006, // 013A JMPF R13 #0142 + 0xB8364600, // 013B GETNGBL R13 K35 + 0x8C341B2D, // 013C GETMET R13 R13 K45 + 0x583C0030, // 013D LDCONST R15 K48 + 0x5840000E, // 013E LDCONST R16 K14 + 0x7C340600, // 013F CALL R13 3 + 0x4C340000, // 0140 LDNIL R13 + 0x80041A00, // 0141 RET 1 R13 + 0x88340117, // 0142 GETMBR R13 R0 K23 + 0x88341B31, // 0143 GETMBR R13 R13 K49 + 0x8C341B32, // 0144 GETMET R13 R13 K50 + 0x7C340200, // 0145 CALL R13 1 + 0x8C381B33, // 0146 GETMET R14 R13 K51 + 0x8C40032F, // 0147 GETMET R16 R1 K47 + 0x7C400200, // 0148 CALL R16 1 + 0x7C380400, // 0149 CALL R14 2 + 0x8C381B34, // 014A GETMET R14 R13 K52 + 0x5C401000, // 014B MOVE R16 R8 + 0x5C441200, // 014C MOVE R17 R9 + 0x7C380600, // 014D CALL R14 3 + 0x8C381B35, // 014E GETMET R14 R13 K53 + 0x5C401400, // 014F MOVE R16 R10 + 0x7C380400, // 0150 CALL R14 2 + 0x8C381B36, // 0151 GETMET R14 R13 K54 + 0x5C401600, // 0152 MOVE R16 R11 + 0x5C441800, // 0153 MOVE R17 R12 + 0x7C380600, // 0154 CALL R14 3 + 0x8C381B37, // 0155 GETMET R14 R13 K55 + 0x8C400338, // 0156 GETMET R16 R1 K56 + 0x7C400200, // 0157 CALL R16 1 + 0x7C380400, // 0158 CALL R14 2 + 0xB83A0200, // 0159 GETNGBL R14 K1 + 0x88381D02, // 015A GETMBR R14 R14 K2 + 0x8C381D39, // 015B GETMET R14 R14 K57 + 0x5C401000, // 015C MOVE R16 R8 + 0x7C380400, // 015D CALL R14 2 + 0x8C3C1D3A, // 015E GETMET R15 R14 K58 + 0x54460005, // 015F LDINT R17 6 + 0x7C3C0400, // 0160 CALL R15 2 + 0x8C401F06, // 0161 GETMET R16 R15 K6 + 0x544A0014, // 0162 LDINT R18 21 + 0x7C400400, // 0163 CALL R16 2 + 0x8C441F06, // 0164 GETMET R17 R15 K6 + 0x544E0010, // 0165 LDINT R19 17 + 0x7C440400, // 0166 CALL R17 2 + 0x5C482000, // 0167 MOVE R18 R16 + 0x784A0001, // 0168 JMPF R18 #016B + 0x5C482200, // 0169 MOVE R18 R17 + 0x744A0006, // 016A JMPT R18 #0172 + 0xB84A4600, // 016B GETNGBL R18 K35 + 0x8C48252D, // 016C GETMET R18 R18 K45 + 0x5850003B, // 016D LDCONST R20 K59 + 0x5854000E, // 016E LDCONST R21 K14 + 0x7C480600, // 016F CALL R18 3 + 0x50480000, // 0170 LDBOOL R18 0 0 + 0x80042400, // 0171 RET 1 R18 + 0x60480004, // 0172 GETGBL R18 G4 + 0x5C4C2000, // 0173 MOVE R19 R16 + 0x7C480200, // 0174 CALL R18 1 + 0x1C48253C, // 0175 EQ R18 R18 K60 + 0x784A0007, // 0176 JMPF R18 #017F + 0xB84A7A00, // 0177 GETNGBL R18 K61 + 0x8C48253E, // 0178 GETMET R18 R18 K62 + 0x5C502000, // 0179 MOVE R20 R16 + 0x7C480400, // 017A CALL R18 2 + 0x8C48253F, // 017B GETMET R18 R18 K63 + 0x7C480200, // 017C CALL R18 1 + 0x5C402400, // 017D MOVE R16 R18 + 0x70020002, // 017E JMP #0182 + 0x8C48213F, // 017F GETMET R18 R16 K63 + 0x7C480200, // 0180 CALL R18 1 + 0x5C402400, // 0181 MOVE R16 R18 + 0x60480004, // 0182 GETGBL R18 G4 + 0x5C4C2200, // 0183 MOVE R19 R17 + 0x7C480200, // 0184 CALL R18 1 + 0x1C48253C, // 0185 EQ R18 R18 K60 + 0x784A0007, // 0186 JMPF R18 #018F + 0xB84A7A00, // 0187 GETNGBL R18 K61 + 0x8C48253E, // 0188 GETMET R18 R18 K62 + 0x5C502200, // 0189 MOVE R20 R17 + 0x7C480400, // 018A CALL R18 2 + 0x8C48253F, // 018B GETMET R18 R18 K63 + 0x7C480200, // 018C CALL R18 1 + 0x5C442400, // 018D MOVE R17 R18 + 0x70020002, // 018E JMP #0192 + 0x8C48233F, // 018F GETMET R18 R17 K63 + 0x7C480200, // 0190 CALL R18 1 + 0x5C442400, // 0191 MOVE R17 R18 + 0x8C480340, // 0192 GETMET R18 R1 K64 + 0x7C480200, // 0193 CALL R18 1 + 0x404E0F41, // 0194 CONNECT R19 K7 K65 + 0x94482413, // 0195 GETIDX R18 R18 R19 + 0x60500015, // 0196 GETGBL R20 G21 + 0x7C500000, // 0197 CALL R20 0 + 0x8C502942, // 0198 GETMET R20 R20 K66 + 0x58580043, // 0199 LDCONST R22 K67 + 0x7C500400, // 019A CALL R20 2 + 0x5C4C2800, // 019B MOVE R19 R20 + 0x8C500944, // 019C GETMET R20 R4 K68 + 0x7C500200, // 019D CALL R20 1 + 0x8C542145, // 019E GETMET R21 R16 K69 + 0x7C540200, // 019F CALL R21 1 + 0x8C542B46, // 01A0 GETMET R21 R21 K70 + 0x7C540200, // 01A1 CALL R21 1 + 0x8C582947, // 01A2 GETMET R22 R20 K71 + 0x5C602400, // 01A3 MOVE R24 R18 + 0x5C642A00, // 01A4 MOVE R25 R21 + 0x5C682600, // 01A5 MOVE R26 R19 + 0x546E0007, // 01A6 LDINT R27 8 + 0x7C580A00, // 01A7 CALL R22 5 + 0x885C0313, // 01A8 GETMBR R23 R1 K19 + 0x785E0001, // 01A9 JMPF R23 #01AC + 0x885C0313, // 01AA GETMBR R23 R1 K19 + 0x70020001, // 01AB JMP #01AE + 0x885C0117, // 01AC GETMBR R23 R0 K23 + 0x885C2F48, // 01AD GETMBR R23 R23 K72 + 0x8C601B49, // 01AE GETMET R24 R13 K73 + 0x5C682000, // 01AF MOVE R26 R16 + 0x5C6C2200, // 01B0 MOVE R27 R17 + 0x5C702C00, // 01B1 MOVE R28 R22 + 0x5C742E00, // 01B2 MOVE R29 R23 + 0x7C600A00, // 01B3 CALL R24 5 + 0x8C601B4A, // 01B4 GETMET R24 R13 K74 + 0x7C600200, // 01B5 CALL R24 1 + 0x88600117, // 01B6 GETMBR R24 R0 K23 + 0x8C60314B, // 01B7 GETMET R24 R24 K75 + 0x5C681A00, // 01B8 MOVE R26 R13 + 0x7C600400, // 01B9 CALL R24 2 + 0x8C60034C, // 01BA GETMET R24 R1 K76 + 0x7C600200, // 01BB CALL R24 1 + 0x78620002, // 01BC JMPF R24 #01C0 + 0x8C60034D, // 01BD GETMET R24 R1 K77 + 0x546A003B, // 01BE LDINT R26 60 + 0x7C600400, // 01BF CALL R24 2 + 0x8C601B4E, // 01C0 GETMET R24 R13 K78 + 0x7C600200, // 01C1 CALL R24 1 + 0x8C600B09, // 01C2 GETMET R24 R5 K9 + 0x7C600200, // 01C3 CALL R24 1 + 0x8C64310A, // 01C4 GETMET R25 R24 K10 + 0x586C0005, // 01C5 LDCONST R27 K5 + 0x88700B0B, // 01C6 GETMBR R28 R5 K11 + 0xB8760200, // 01C7 GETNGBL R29 K1 + 0x88743B2C, // 01C8 GETMBR R29 R29 K44 + 0x7C640800, // 01C9 CALL R25 4 + 0x8C64310A, // 01CA GETMET R25 R24 K10 + 0x586C0007, // 01CB LDCONST R27 K7 + 0x88700B0B, // 01CC GETMBR R28 R5 K11 + 0x58740007, // 01CD LDCONST R29 K7 + 0x7C640800, // 01CE CALL R25 4 + 0x54660007, // 01CF LDINT R25 8 + 0x900E0819, // 01D0 SETMBR R3 K4 R25 + 0x80043000, // 01D1 RET 1 R24 + 0x70020056, // 01D2 JMP #022A + 0x54220008, // 01D3 LDINT R8 9 + 0x1C200E08, // 01D4 EQ R8 R7 R8 + 0x7822001E, // 01D5 JMPF R8 #01F5 + 0x8C200506, // 01D6 GETMET R8 R2 K6 + 0x58280005, // 01D7 LDCONST R10 K5 + 0x7C200400, // 01D8 CALL R8 2 + 0x8C24034F, // 01D9 GETMET R9 R1 K79 + 0x5C2C1000, // 01DA MOVE R11 R8 + 0x7C240400, // 01DB CALL R9 2 + 0xB8264600, // 01DC GETNGBL R9 K35 + 0x8C24132D, // 01DD GETMET R9 R9 K45 + 0x602C0018, // 01DE GETGBL R11 G24 + 0x58300050, // 01DF LDCONST R12 K80 + 0x88340313, // 01E0 GETMBR R13 R1 K19 + 0x8C341B51, // 01E1 GETMET R13 R13 K81 + 0x7C340200, // 01E2 CALL R13 1 + 0x8C341B45, // 01E3 GETMET R13 R13 K69 + 0x7C340200, // 01E4 CALL R13 1 + 0x8C341B46, // 01E5 GETMET R13 R13 K70 + 0x7C340200, // 01E6 CALL R13 1 + 0x8C341B52, // 01E7 GETMET R13 R13 K82 + 0x7C340200, // 01E8 CALL R13 1 + 0x60380008, // 01E9 GETGBL R14 G8 + 0x5C3C1000, // 01EA MOVE R15 R8 + 0x7C380200, // 01EB CALL R14 1 + 0x7C2C0600, // 01EC CALL R11 3 + 0x58300010, // 01ED LDCONST R12 K16 + 0x7C240600, // 01EE CALL R9 3 + 0xB8260200, // 01EF GETNGBL R9 K1 + 0x8824132C, // 01F0 GETMBR R9 R9 K44 + 0x900E3609, // 01F1 SETMBR R3 K27 R9 + 0x4C240000, // 01F2 LDNIL R9 + 0x80041200, // 01F3 RET 1 R9 + 0x70020034, // 01F4 JMP #022A + 0x54220009, // 01F5 LDINT R8 10 + 0x1C200E08, // 01F6 EQ R8 R7 R8 + 0x78220031, // 01F7 JMPF R8 #022A + 0x8C200506, // 01F8 GETMET R8 R2 K6 + 0x58280005, // 01F9 LDCONST R10 K5 + 0x7C200400, // 01FA CALL R8 2 + 0x60240008, // 01FB GETGBL R9 G8 + 0x5C281000, // 01FC MOVE R10 R8 + 0x7C240200, // 01FD CALL R9 1 + 0x0026A609, // 01FE ADD R9 K83 R9 + 0x900E5A09, // 01FF SETMBR R3 K45 R9 + 0x60240010, // 0200 GETGBL R9 G16 + 0x88280117, // 0201 GETMBR R10 R0 K23 + 0x88281531, // 0202 GETMBR R10 R10 K49 + 0x8C281554, // 0203 GETMET R10 R10 K84 + 0x7C280200, // 0204 CALL R10 1 + 0x7C240200, // 0205 CALL R9 1 + 0xA8020010, // 0206 EXBLK 0 #0218 + 0x5C281200, // 0207 MOVE R10 R9 + 0x7C280000, // 0208 CALL R10 0 + 0x8C2C1555, // 0209 GETMET R11 R10 K85 + 0x7C2C0200, // 020A CALL R11 1 + 0x1C2C1608, // 020B EQ R11 R11 R8 + 0x782E0008, // 020C JMPF R11 #0216 + 0xB82E4600, // 020D GETNGBL R11 K35 + 0x8C2C1756, // 020E GETMET R11 R11 K86 + 0x543607CF, // 020F LDINT R13 2000 + 0x84380000, // 0210 CLOSURE R14 P0 + 0x7C2C0600, // 0211 CALL R11 3 + 0x502C0200, // 0212 LDBOOL R11 1 0 + 0xA0000000, // 0213 CLOSE R0 + 0xA8040001, // 0214 EXBLK 1 1 + 0x80041600, // 0215 RET 1 R11 + 0xA0240000, // 0216 CLOSE R9 + 0x7001FFEE, // 0217 JMP #0207 + 0x58240057, // 0218 LDCONST R9 K87 + 0xAC240200, // 0219 CATCH R9 1 0 + 0xB0080000, // 021A RAISE 2 R0 R0 + 0xB8264600, // 021B GETNGBL R9 K35 + 0x8C24132D, // 021C GETMET R9 R9 K45 + 0x602C0008, // 021D GETGBL R11 G8 + 0x5C301000, // 021E MOVE R12 R8 + 0x7C2C0200, // 021F CALL R11 1 + 0x002EB00B, // 0220 ADD R11 K88 R11 + 0x002C1759, // 0221 ADD R11 R11 K89 + 0x5830000E, // 0222 LDCONST R12 K14 + 0x7C240600, // 0223 CALL R9 3 + 0xB8260200, // 0224 GETNGBL R9 K1 + 0x8824135A, // 0225 GETMBR R9 R9 K90 + 0x900E3609, // 0226 SETMBR R3 K27 R9 + 0x4C240000, // 0227 LDNIL R9 + 0xA0000000, // 0228 CLOSE R0 + 0x80041200, // 0229 RET 1 R9 + 0x7002009B, // 022A JMP #02C7 + 0x5422003B, // 022B LDINT R8 60 + 0x1C200C08, // 022C EQ R8 R6 R8 + 0x78220085, // 022D JMPF R8 #02B4 + 0x1C200F05, // 022E EQ R8 R7 K5 + 0x78220065, // 022F JMPF R8 #0296 + 0x8C200506, // 0230 GETMET R8 R2 K6 + 0x58280005, // 0231 LDCONST R10 K5 + 0x7C200400, // 0232 CALL R8 2 + 0x8C240506, // 0233 GETMET R9 R2 K6 + 0x582C0007, // 0234 LDCONST R11 K7 + 0x7C240400, // 0235 CALL R9 2 + 0x8C280506, // 0236 GETMET R10 R2 K6 + 0x5830000E, // 0237 LDCONST R12 K14 + 0x7C280400, // 0238 CALL R10 2 + 0x8C2C0506, // 0239 GETMET R11 R2 K6 + 0x58340010, // 023A LDCONST R13 K16 + 0x7C2C0400, // 023B CALL R11 2 + 0x8C300506, // 023C GETMET R12 R2 K6 + 0x543A0003, // 023D LDINT R14 4 + 0x7C300400, // 023E CALL R12 2 + 0xB8364600, // 023F GETNGBL R13 K35 + 0x8C341B2D, // 0240 GETMET R13 R13 K45 + 0x603C0018, // 0241 GETGBL R15 G24 + 0x5840005B, // 0242 LDCONST R16 K91 + 0x5C441000, // 0243 MOVE R17 R8 + 0x8C481352, // 0244 GETMET R18 R9 K82 + 0x7C480200, // 0245 CALL R18 1 + 0x5C4C1400, // 0246 MOVE R19 R10 + 0x5C501600, // 0247 MOVE R20 R11 + 0x8C541952, // 0248 GETMET R21 R12 K82 + 0x7C540200, // 0249 CALL R21 1 + 0x7C3C0C00, // 024A CALL R15 6 + 0x54420003, // 024B LDINT R16 4 + 0x7C340600, // 024C CALL R13 3 + 0x4C340000, // 024D LDNIL R13 + 0x1C34100D, // 024E EQ R13 R8 R13 + 0x7436000B, // 024F JMPT R13 #025C + 0x4C340000, // 0250 LDNIL R13 + 0x1C34120D, // 0251 EQ R13 R9 R13 + 0x74360008, // 0252 JMPT R13 #025C + 0x4C340000, // 0253 LDNIL R13 + 0x1C34140D, // 0254 EQ R13 R10 R13 + 0x74360005, // 0255 JMPT R13 #025C + 0x4C340000, // 0256 LDNIL R13 + 0x1C34160D, // 0257 EQ R13 R11 R13 + 0x74360002, // 0258 JMPT R13 #025C + 0x4C340000, // 0259 LDNIL R13 + 0x1C34180D, // 025A EQ R13 R12 R13 + 0x78360005, // 025B JMPF R13 #0262 + 0xB8360200, // 025C GETNGBL R13 K1 + 0x88341B5C, // 025D GETMBR R13 R13 K92 + 0x900E360D, // 025E SETMBR R3 K27 R13 + 0x4C340000, // 025F LDNIL R13 + 0xA0000000, // 0260 CLOSE R0 + 0x80041A00, // 0261 RET 1 R13 + 0x6034000C, // 0262 GETGBL R13 G12 + 0x5C381200, // 0263 MOVE R14 R9 + 0x7C340200, // 0264 CALL R13 1 + 0x543A001F, // 0265 LDINT R14 32 + 0x543E0040, // 0266 LDINT R15 65 + 0x00381C0F, // 0267 ADD R14 R14 R15 + 0x20341A0E, // 0268 NE R13 R13 R14 + 0x7436000B, // 0269 JMPT R13 #0276 + 0x6034000C, // 026A GETGBL R13 G12 + 0x5C381800, // 026B MOVE R14 R12 + 0x7C340200, // 026C CALL R13 1 + 0x543A000F, // 026D LDINT R14 16 + 0x14341A0E, // 026E LT R13 R13 R14 + 0x74360005, // 026F JMPT R13 #0276 + 0x6034000C, // 0270 GETGBL R13 G12 + 0x5C381800, // 0271 MOVE R14 R12 + 0x7C340200, // 0272 CALL R13 1 + 0x543A001F, // 0273 LDINT R14 32 + 0x24341A0E, // 0274 GT R13 R13 R14 + 0x7836000A, // 0275 JMPF R13 #0281 + 0xB8364600, // 0276 GETNGBL R13 K35 + 0x8C341B2D, // 0277 GETMET R13 R13 K45 + 0x583C005D, // 0278 LDCONST R15 K93 + 0x5840000E, // 0279 LDCONST R16 K14 + 0x7C340600, // 027A CALL R13 3 + 0xB8360200, // 027B GETNGBL R13 K1 + 0x88341B5E, // 027C GETMBR R13 R13 K94 + 0x900E360D, // 027D SETMBR R3 K27 R13 + 0x4C340000, // 027E LDNIL R13 + 0xA0000000, // 027F CLOSE R0 + 0x80041A00, // 0280 RET 1 R13 + 0x5436001E, // 0281 LDINT R13 31 + 0x40360A0D, // 0282 CONNECT R13 K5 R13 + 0x9434120D, // 0283 GETIDX R13 R9 R13 + 0x543A001F, // 0284 LDINT R14 32 + 0x40381D41, // 0285 CONNECT R14 R14 K65 + 0x9438120E, // 0286 GETIDX R14 R9 R14 + 0x883C0117, // 0287 GETMBR R15 R0 K23 + 0x8C3C1F5F, // 0288 GETMET R15 R15 K95 + 0x5C441000, // 0289 MOVE R17 R8 + 0x5C481600, // 028A MOVE R18 R11 + 0x5C4C1400, // 028B MOVE R19 R10 + 0x5C501800, // 028C MOVE R20 R12 + 0x5C541A00, // 028D MOVE R21 R13 + 0x5C581C00, // 028E MOVE R22 R14 + 0x8C5C0360, // 028F GETMET R23 R1 K96 + 0x7C5C0200, // 0290 CALL R23 1 + 0x7C3C1000, // 0291 CALL R15 8 + 0x503C0200, // 0292 LDBOOL R15 1 0 + 0xA0000000, // 0293 CLOSE R0 + 0x80041E00, // 0294 RET 1 R15 + 0x7002001C, // 0295 JMP #02B3 + 0x1C200F07, // 0296 EQ R8 R7 K7 + 0x78220012, // 0297 JMPF R8 #02AB + 0x8C200506, // 0298 GETMET R8 R2 K6 + 0x58280005, // 0299 LDCONST R10 K5 + 0x7C200400, // 029A CALL R8 2 + 0xB8264600, // 029B GETNGBL R9 K35 + 0x8C24132D, // 029C GETMET R9 R9 K45 + 0x602C0008, // 029D GETGBL R11 G8 + 0x5C301000, // 029E MOVE R12 R8 + 0x7C2C0200, // 029F CALL R11 1 + 0x002EC20B, // 02A0 ADD R11 K97 R11 + 0x58300010, // 02A1 LDCONST R12 K16 + 0x7C240600, // 02A2 CALL R9 3 + 0x88240117, // 02A3 GETMBR R9 R0 K23 + 0x8C241362, // 02A4 GETMET R9 R9 K98 + 0x5C2C1000, // 02A5 MOVE R11 R8 + 0x7C240400, // 02A6 CALL R9 2 + 0x50240200, // 02A7 LDBOOL R9 1 0 + 0xA0000000, // 02A8 CLOSE R0 + 0x80041200, // 02A9 RET 1 R9 + 0x70020007, // 02AA JMP #02B3 + 0x1C200F0E, // 02AB EQ R8 R7 K14 + 0x78220005, // 02AC JMPF R8 #02B3 + 0x88200117, // 02AD GETMBR R8 R0 K23 + 0x8C201163, // 02AE GETMET R8 R8 K99 + 0x7C200200, // 02AF CALL R8 1 + 0x50200200, // 02B0 LDBOOL R8 1 0 + 0xA0000000, // 02B1 CLOSE R0 + 0x80041000, // 02B2 RET 1 R8 + 0x70020012, // 02B3 JMP #02C7 + 0x54220029, // 02B4 LDINT R8 42 + 0x1C200C08, // 02B5 EQ R8 R6 R8 + 0x78220005, // 02B6 JMPF R8 #02BD + 0x1C200F05, // 02B7 EQ R8 R7 K5 + 0x78220002, // 02B8 JMPF R8 #02BC + 0x50200200, // 02B9 LDBOOL R8 1 0 + 0xA0000000, // 02BA CLOSE R0 + 0x80041000, // 02BB RET 1 R8 + 0x70020009, // 02BC JMP #02C7 + 0x60200003, // 02BD GETGBL R8 G3 + 0x5C240000, // 02BE MOVE R9 R0 + 0x7C200200, // 02BF CALL R8 1 + 0x8C201164, // 02C0 GETMET R8 R8 K100 + 0x5C280200, // 02C1 MOVE R10 R1 + 0x5C2C0400, // 02C2 MOVE R11 R2 + 0x5C300600, // 02C3 MOVE R12 R3 + 0x7C200800, // 02C4 CALL R8 4 + 0xA0000000, // 02C5 CLOSE R0 + 0x80041000, // 02C6 RET 1 R8 + 0xA0000000, // 02C7 CLOSE R0 + 0x80000000, // 02C8 RET 0 }) ) ); @@ -879,22 +877,22 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ be_nested_proto( - 24, /* nstack */ - 3, /* argc */ + 25, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[88]) { /* constants */ + ( &(const bvalue[91]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), /* K3 */ be_nested_str_weak(cluster), /* K4 */ be_nested_str_weak(attribute), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U8), /* K8 */ be_nested_str_weak(_breadcrumb), /* K9 */ be_const_int(1), @@ -935,955 +933,965 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /* K44 */ be_nested_str_weak(StatusSTS), /* K45 */ be_nested_str_weak(UptimeSec), /* K46 */ be_nested_str_weak(int64), - /* K47 */ be_nested_str_weak(rtc), - /* K48 */ be_nested_str_weak(utc), - /* K49 */ be_const_int(1000000), + /* K47 */ be_nested_str_weak(rtc_utc), + /* K48 */ be_const_int(1000000), + /* K49 */ be_nested_str_weak(rtc), /* K50 */ be_nested_str_weak(local), - /* K51 */ be_nested_str_weak(device), - /* K52 */ be_nested_str_weak(sessions), - /* K53 */ be_nested_str_weak(active_fabrics), - /* K54 */ be_nested_str_weak(B2), - /* K55 */ be_nested_str_weak(get_noc), - /* K56 */ be_nested_str_weak(get_icac), - /* K57 */ be_nested_str_weak(get_fabric_index), - /* K58 */ be_nested_str_weak(stop_iteration), - /* K59 */ be_nested_str_weak(parse), - /* K60 */ be_nested_str_weak(get_ca), - /* K61 */ be_nested_str_weak(findsubval), - /* K62 */ be_nested_str_weak(get_admin_vendor), - /* K63 */ be_nested_str_weak(get_fabric_id), - /* K64 */ be_nested_str_weak(get_device_id), - /* K65 */ be_nested_str_weak(get_fabric_label), - /* K66 */ be_nested_str_weak(Fabric), - /* K67 */ be_nested_str_weak(_MAX_CASE), - /* K68 */ be_nested_str_weak(count_active_fabrics), - /* K69 */ be_nested_str_weak(_fabric), - /* K70 */ be_nested_str_weak(is_commissioning_open), - /* K71 */ be_nested_str_weak(is_root_commissioning_open), - /* K72 */ be_nested_str_weak(commissioning_admin_fabric), - /* K73 */ be_nested_str_weak(Tasmota), - /* K74 */ be_nested_str_weak(vendorid), - /* K75 */ be_nested_str_weak(DeviceName), - /* K76 */ be_nested_str_weak(FriendlyName), - /* K77 */ be_nested_str_weak(FriendlyName1), - /* K78 */ be_nested_str_weak(XX), - /* K79 */ be_nested_str_weak(Status_X202), - /* K80 */ be_nested_str_weak(StatusFWR), - /* K81 */ be_nested_str_weak(Hardware), - /* K82 */ be_nested_str_weak(Version), - /* K83 */ be_nested_str_weak(_X28), - /* K84 */ be_nested_str_weak(locale), - /* K85 */ be_nested_str_weak(get_active_endpoints), - /* K86 */ be_nested_str_weak(disable_bridge_mode), - /* K87 */ be_nested_str_weak(read_attribute), + /* K51 */ be_nested_str_weak(send_ack_now), + /* K52 */ be_nested_str_weak(msg), + /* K53 */ be_nested_str_weak(device), + /* K54 */ be_nested_str_weak(sessions), + /* K55 */ be_nested_str_weak(active_fabrics), + /* K56 */ be_nested_str_weak(B2), + /* K57 */ be_nested_str_weak(get_noc), + /* K58 */ be_nested_str_weak(get_icac), + /* K59 */ be_nested_str_weak(get_fabric_index), + /* K60 */ be_nested_str_weak(stop_iteration), + /* K61 */ be_nested_str_weak(parse), + /* K62 */ be_nested_str_weak(get_ca), + /* K63 */ be_nested_str_weak(findsubval), + /* K64 */ be_nested_str_weak(get_admin_vendor), + /* K65 */ be_nested_str_weak(get_fabric_id), + /* K66 */ be_nested_str_weak(get_device_id), + /* K67 */ be_nested_str_weak(get_fabric_label), + /* K68 */ be_nested_str_weak(Fabric), + /* K69 */ be_nested_str_weak(_MAX_CASE), + /* K70 */ be_nested_str_weak(count_active_fabrics), + /* K71 */ be_nested_str_weak(_fabric), + /* K72 */ be_nested_str_weak(is_commissioning_open), + /* K73 */ be_nested_str_weak(is_root_commissioning_open), + /* K74 */ be_nested_str_weak(commissioning_admin_fabric), + /* K75 */ be_nested_str_weak(Tasmota), + /* K76 */ be_nested_str_weak(vendorid), + /* K77 */ be_nested_str_weak(DeviceName), + /* K78 */ be_nested_str_weak(FriendlyName), + /* K79 */ be_nested_str_weak(FriendlyName1), + /* K80 */ be_nested_str_weak(XX), + /* K81 */ be_nested_str_weak(Status_X202), + /* K82 */ be_nested_str_weak(StatusFWR), + /* K83 */ be_nested_str_weak(Hardware), + /* K84 */ be_nested_str_weak(Version), + /* K85 */ be_nested_str_weak(_X28), + /* K86 */ be_nested_str_weak(locale), + /* K87 */ be_nested_str_weak(create_TLV), + /* K88 */ be_nested_str_weak(get_active_endpoints), + /* K89 */ be_nested_str_weak(disable_bridge_mode), + /* K90 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[904]) { /* code */ - 0xA40E0000, // 0000 IMPORT R3 K0 - 0xB8120200, // 0001 GETNGBL R4 K1 - 0x88100902, // 0002 GETMBR R4 R4 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x88180504, // 0004 GETMBR R6 R2 K4 - 0x541E002F, // 0005 LDINT R7 48 - 0x1C1C0A07, // 0006 EQ R7 R5 R7 - 0x781E0030, // 0007 JMPF R7 #0039 - 0x1C1C0D05, // 0008 EQ R7 R6 K5 - 0x781E0005, // 0009 JMPF R7 #0010 - 0x8C1C0906, // 000A GETMET R7 R4 K6 - 0x88240907, // 000B GETMBR R9 R4 K7 - 0x88280308, // 000C GETMBR R10 R1 K8 - 0x7C1C0600, // 000D CALL R7 3 - 0x80040E00, // 000E RET 1 R7 + ( &(const binstruction[911]) { /* code */ + 0xA4120000, // 0000 IMPORT R4 K0 + 0xB8160200, // 0001 GETNGBL R5 K1 + 0x88140B02, // 0002 GETMBR R5 R5 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x881C0504, // 0004 GETMBR R7 R2 K4 + 0x5422002F, // 0005 LDINT R8 48 + 0x1C200C08, // 0006 EQ R8 R6 R8 + 0x78220030, // 0007 JMPF R8 #0039 + 0x1C200F05, // 0008 EQ R8 R7 K5 + 0x78220005, // 0009 JMPF R8 #0010 + 0x8C200706, // 000A GETMET R8 R3 K6 + 0x88280B07, // 000B GETMBR R10 R5 K7 + 0x882C0308, // 000C GETMBR R11 R1 K8 + 0x7C200600, // 000D CALL R8 3 + 0x80041000, // 000E RET 1 R8 0x70020027, // 000F JMP #0038 - 0x1C1C0D09, // 0010 EQ R7 R6 K9 - 0x781E000D, // 0011 JMPF R7 #0020 - 0x8C1C090A, // 0012 GETMET R7 R4 K10 - 0x7C1C0200, // 0013 CALL R7 1 - 0x8C200F0B, // 0014 GETMET R8 R7 K11 - 0x58280005, // 0015 LDCONST R10 K5 - 0x882C090C, // 0016 GETMBR R11 R4 K12 - 0x5432003B, // 0017 LDINT R12 60 - 0x7C200800, // 0018 CALL R8 4 - 0x8C200F0B, // 0019 GETMET R8 R7 K11 - 0x58280009, // 001A LDCONST R10 K9 - 0x882C090C, // 001B GETMBR R11 R4 K12 - 0x54320383, // 001C LDINT R12 900 - 0x7C200800, // 001D CALL R8 4 - 0x80040E00, // 001E RET 1 R7 + 0x1C200F09, // 0010 EQ R8 R7 K9 + 0x7822000D, // 0011 JMPF R8 #0020 + 0x8C200B0A, // 0012 GETMET R8 R5 K10 + 0x7C200200, // 0013 CALL R8 1 + 0x8C24110B, // 0014 GETMET R9 R8 K11 + 0x582C0005, // 0015 LDCONST R11 K5 + 0x88300B0C, // 0016 GETMBR R12 R5 K12 + 0x5436003B, // 0017 LDINT R13 60 + 0x7C240800, // 0018 CALL R9 4 + 0x8C24110B, // 0019 GETMET R9 R8 K11 + 0x582C0009, // 001A LDCONST R11 K9 + 0x88300B0C, // 001B GETMBR R12 R5 K12 + 0x54360383, // 001C LDINT R13 900 + 0x7C240800, // 001D CALL R9 4 + 0x80041000, // 001E RET 1 R8 0x70020017, // 001F JMP #0038 - 0x1C1C0D0D, // 0020 EQ R7 R6 K13 - 0x781E0005, // 0021 JMPF R7 #0028 - 0x8C1C0906, // 0022 GETMET R7 R4 K6 - 0x8824090E, // 0023 GETMBR R9 R4 K14 - 0x5828000D, // 0024 LDCONST R10 K13 - 0x7C1C0600, // 0025 CALL R7 3 - 0x80040E00, // 0026 RET 1 R7 + 0x1C200F0D, // 0020 EQ R8 R7 K13 + 0x78220005, // 0021 JMPF R8 #0028 + 0x8C200706, // 0022 GETMET R8 R3 K6 + 0x88280B0E, // 0023 GETMBR R10 R5 K14 + 0x582C000D, // 0024 LDCONST R11 K13 + 0x7C200600, // 0025 CALL R8 3 + 0x80041000, // 0026 RET 1 R8 0x7002000F, // 0027 JMP #0038 - 0x1C1C0D0F, // 0028 EQ R7 R6 K15 - 0x781E0005, // 0029 JMPF R7 #0030 - 0x8C1C0906, // 002A GETMET R7 R4 K6 - 0x8824090E, // 002B GETMBR R9 R4 K14 - 0x5828000D, // 002C LDCONST R10 K13 - 0x7C1C0600, // 002D CALL R7 3 - 0x80040E00, // 002E RET 1 R7 + 0x1C200F0F, // 0028 EQ R8 R7 K15 + 0x78220005, // 0029 JMPF R8 #0030 + 0x8C200706, // 002A GETMET R8 R3 K6 + 0x88280B0E, // 002B GETMBR R10 R5 K14 + 0x582C000D, // 002C LDCONST R11 K13 + 0x7C200600, // 002D CALL R8 3 + 0x80041000, // 002E RET 1 R8 0x70020007, // 002F JMP #0038 - 0x541E0003, // 0030 LDINT R7 4 - 0x1C1C0C07, // 0031 EQ R7 R6 R7 - 0x781E0004, // 0032 JMPF R7 #0038 - 0x8C1C0906, // 0033 GETMET R7 R4 K6 - 0x88240910, // 0034 GETMBR R9 R4 K16 - 0x50280000, // 0035 LDBOOL R10 0 0 - 0x7C1C0600, // 0036 CALL R7 3 - 0x80040E00, // 0037 RET 1 R7 - 0x7002034D, // 0038 JMP #0387 - 0x541E0031, // 0039 LDINT R7 50 - 0x1C1C0A07, // 003A EQ R7 R5 R7 - 0x781E0000, // 003B JMPF R7 #003D - 0x70020349, // 003C JMP #0387 - 0x541E0032, // 003D LDINT R7 51 - 0x1C1C0A07, // 003E EQ R7 R5 R7 - 0x781E00DC, // 003F JMPF R7 #011D - 0x1C1C0D05, // 0040 EQ R7 R6 K5 - 0x781E00B5, // 0041 JMPF R7 #00F8 - 0x8C1C0911, // 0042 GETMET R7 R4 K17 - 0x7C1C0200, // 0043 CALL R7 1 - 0xB8222400, // 0044 GETNGBL R8 K18 - 0x8C201113, // 0045 GETMET R8 R8 K19 - 0x7C200200, // 0046 CALL R8 1 - 0x94241114, // 0047 GETIDX R9 R8 K20 - 0x78260053, // 0048 JMPF R9 #009D - 0x8C240F15, // 0049 GETMET R9 R7 K21 - 0x4C2C0000, // 004A LDNIL R11 - 0x7C240400, // 004B CALL R9 2 - 0x8C28130B, // 004C GETMET R10 R9 K11 - 0x58300005, // 004D LDCONST R12 K5 - 0x88340916, // 004E GETMBR R13 R4 K22 - 0x58380017, // 004F LDCONST R14 K23 - 0x7C280800, // 0050 CALL R10 4 - 0x8C28130B, // 0051 GETMET R10 R9 K11 - 0x58300009, // 0052 LDCONST R12 K9 - 0x88340910, // 0053 GETMBR R13 R4 K16 - 0x58380009, // 0054 LDCONST R14 K9 - 0x7C280800, // 0055 CALL R10 4 - 0x8C28130B, // 0056 GETMET R10 R9 K11 - 0x5830000D, // 0057 LDCONST R12 K13 - 0x88340910, // 0058 GETMBR R13 R4 K16 - 0x58380009, // 0059 LDCONST R14 K9 - 0x7C280800, // 005A CALL R10 4 - 0x8C28130B, // 005B GETMET R10 R9 K11 - 0x5830000F, // 005C LDCONST R12 K15 - 0x88340918, // 005D GETMBR R13 R4 K24 - 0x4C380000, // 005E LDNIL R14 - 0x7C280800, // 005F CALL R10 4 - 0x60280015, // 0060 GETGBL R10 G21 - 0x7C280000, // 0061 CALL R10 0 - 0x8C281519, // 0062 GETMET R10 R10 K25 - 0x8C30071A, // 0063 GETMET R12 R3 K26 - 0x8C38111B, // 0064 GETMET R14 R8 K27 - 0x5840001C, // 0065 LDCONST R16 K28 - 0x5844001D, // 0066 LDCONST R17 K29 - 0x7C380600, // 0067 CALL R14 3 - 0x583C001E, // 0068 LDCONST R15 K30 - 0x5840001D, // 0069 LDCONST R16 K29 - 0x7C300800, // 006A CALL R12 4 - 0x7C280400, // 006B CALL R10 2 - 0x8C2C130B, // 006C GETMET R11 R9 K11 - 0x54360003, // 006D LDINT R13 4 - 0x8838091F, // 006E GETMBR R14 R4 K31 - 0x5C3C1400, // 006F MOVE R15 R10 - 0x7C2C0800, // 0070 CALL R11 4 - 0x8C2C1320, // 0071 GETMET R11 R9 K32 - 0x54360004, // 0072 LDINT R13 5 - 0x7C2C0400, // 0073 CALL R11 2 - 0x8C30170B, // 0074 GETMET R12 R11 K11 - 0x4C380000, // 0075 LDNIL R14 - 0x883C091F, // 0076 GETMBR R15 R4 K31 - 0xB8420200, // 0077 GETNGBL R16 K1 - 0x8C402121, // 0078 GETMET R16 R16 K33 - 0x8C48111B, // 0079 GETMET R18 R8 K27 - 0x58500022, // 007A LDCONST R20 K34 - 0x5854001D, // 007B LDCONST R21 K29 - 0x7C480600, // 007C CALL R18 3 - 0x7C400400, // 007D CALL R16 2 - 0x7C300800, // 007E CALL R12 4 - 0x8C301320, // 007F GETMET R12 R9 K32 - 0x543A0005, // 0080 LDINT R14 6 - 0x7C300400, // 0081 CALL R12 2 - 0x8C34190B, // 0082 GETMET R13 R12 K11 - 0x4C3C0000, // 0083 LDNIL R15 - 0x8840091F, // 0084 GETMBR R16 R4 K31 - 0xB8460200, // 0085 GETNGBL R17 K1 - 0x8C442321, // 0086 GETMET R17 R17 K33 - 0x8C4C111B, // 0087 GETMET R19 R8 K27 - 0x58540023, // 0088 LDCONST R21 K35 - 0x5858001D, // 0089 LDCONST R22 K29 - 0x7C4C0600, // 008A CALL R19 3 - 0x7C440400, // 008B CALL R17 2 - 0x7C340800, // 008C CALL R13 4 - 0x8C34190B, // 008D GETMET R13 R12 K11 - 0x4C3C0000, // 008E LDNIL R15 - 0x8840091F, // 008F GETMBR R16 R4 K31 - 0xB8460200, // 0090 GETNGBL R17 K1 - 0x8C442321, // 0091 GETMET R17 R17 K33 - 0x8C4C111B, // 0092 GETMET R19 R8 K27 - 0x58540024, // 0093 LDCONST R21 K36 - 0x5858001D, // 0094 LDCONST R22 K29 - 0x7C4C0600, // 0095 CALL R19 3 - 0x7C440400, // 0096 CALL R17 2 - 0x7C340800, // 0097 CALL R13 4 - 0x8C34130B, // 0098 GETMET R13 R9 K11 - 0x543E0006, // 0099 LDINT R15 7 - 0x8840090E, // 009A GETMBR R16 R4 K14 - 0x5844000D, // 009B LDCONST R17 K13 - 0x7C340800, // 009C CALL R13 4 - 0xB8262400, // 009D GETNGBL R9 K18 - 0x8C241325, // 009E GETMET R9 R9 K37 - 0x7C240200, // 009F CALL R9 1 - 0x94281314, // 00A0 GETIDX R10 R9 K20 - 0x782A0053, // 00A1 JMPF R10 #00F6 - 0x8C280F15, // 00A2 GETMET R10 R7 K21 - 0x4C300000, // 00A3 LDNIL R12 - 0x7C280400, // 00A4 CALL R10 2 - 0x8C2C150B, // 00A5 GETMET R11 R10 K11 - 0x58340005, // 00A6 LDCONST R13 K5 - 0x88380916, // 00A7 GETMBR R14 R4 K22 - 0x583C0025, // 00A8 LDCONST R15 K37 - 0x7C2C0800, // 00A9 CALL R11 4 - 0x8C2C150B, // 00AA GETMET R11 R10 K11 - 0x58340009, // 00AB LDCONST R13 K9 - 0x88380910, // 00AC GETMBR R14 R4 K16 - 0x583C0009, // 00AD LDCONST R15 K9 - 0x7C2C0800, // 00AE CALL R11 4 - 0x8C2C150B, // 00AF GETMET R11 R10 K11 - 0x5834000D, // 00B0 LDCONST R13 K13 - 0x88380910, // 00B1 GETMBR R14 R4 K16 - 0x583C0009, // 00B2 LDCONST R15 K9 - 0x7C2C0800, // 00B3 CALL R11 4 - 0x8C2C150B, // 00B4 GETMET R11 R10 K11 - 0x5834000F, // 00B5 LDCONST R13 K15 - 0x88380918, // 00B6 GETMBR R14 R4 K24 - 0x4C3C0000, // 00B7 LDNIL R15 - 0x7C2C0800, // 00B8 CALL R11 4 - 0x602C0015, // 00B9 GETGBL R11 G21 - 0x7C2C0000, // 00BA CALL R11 0 - 0x8C2C1719, // 00BB GETMET R11 R11 K25 - 0x8C34071A, // 00BC GETMET R13 R3 K26 - 0x8C3C131B, // 00BD GETMET R15 R9 K27 - 0x5844001C, // 00BE LDCONST R17 K28 - 0x5848001D, // 00BF LDCONST R18 K29 - 0x7C3C0600, // 00C0 CALL R15 3 - 0x5840001E, // 00C1 LDCONST R16 K30 - 0x5844001D, // 00C2 LDCONST R17 K29 - 0x7C340800, // 00C3 CALL R13 4 - 0x7C2C0400, // 00C4 CALL R11 2 - 0x8C30150B, // 00C5 GETMET R12 R10 K11 - 0x543A0003, // 00C6 LDINT R14 4 - 0x883C091F, // 00C7 GETMBR R15 R4 K31 - 0x5C401600, // 00C8 MOVE R16 R11 - 0x7C300800, // 00C9 CALL R12 4 - 0x8C301520, // 00CA GETMET R12 R10 K32 - 0x543A0004, // 00CB LDINT R14 5 - 0x7C300400, // 00CC CALL R12 2 - 0x8C34190B, // 00CD GETMET R13 R12 K11 - 0x4C3C0000, // 00CE LDNIL R15 - 0x8840091F, // 00CF GETMBR R16 R4 K31 - 0xB8460200, // 00D0 GETNGBL R17 K1 - 0x8C442321, // 00D1 GETMET R17 R17 K33 - 0x8C4C131B, // 00D2 GETMET R19 R9 K27 - 0x58540022, // 00D3 LDCONST R21 K34 - 0x5858001D, // 00D4 LDCONST R22 K29 - 0x7C4C0600, // 00D5 CALL R19 3 - 0x7C440400, // 00D6 CALL R17 2 - 0x7C340800, // 00D7 CALL R13 4 - 0x8C341520, // 00D8 GETMET R13 R10 K32 - 0x543E0005, // 00D9 LDINT R15 6 - 0x7C340400, // 00DA CALL R13 2 - 0x8C381B0B, // 00DB GETMET R14 R13 K11 - 0x4C400000, // 00DC LDNIL R16 - 0x8844091F, // 00DD GETMBR R17 R4 K31 - 0xB84A0200, // 00DE GETNGBL R18 K1 - 0x8C482521, // 00DF GETMET R18 R18 K33 - 0x8C50131B, // 00E0 GETMET R20 R9 K27 - 0x58580023, // 00E1 LDCONST R22 K35 - 0x585C001D, // 00E2 LDCONST R23 K29 - 0x7C500600, // 00E3 CALL R20 3 - 0x7C480400, // 00E4 CALL R18 2 - 0x7C380800, // 00E5 CALL R14 4 - 0x8C381B0B, // 00E6 GETMET R14 R13 K11 - 0x4C400000, // 00E7 LDNIL R16 - 0x8844091F, // 00E8 GETMBR R17 R4 K31 - 0xB84A0200, // 00E9 GETNGBL R18 K1 - 0x8C482521, // 00EA GETMET R18 R18 K33 - 0x8C50131B, // 00EB GETMET R20 R9 K27 - 0x58580024, // 00EC LDCONST R22 K36 - 0x585C001D, // 00ED LDCONST R23 K29 - 0x7C500600, // 00EE CALL R20 3 - 0x7C480400, // 00EF CALL R18 2 - 0x7C380800, // 00F0 CALL R14 4 - 0x8C38150B, // 00F1 GETMET R14 R10 K11 - 0x54420006, // 00F2 LDINT R16 7 - 0x8844090E, // 00F3 GETMBR R17 R4 K14 - 0x58480009, // 00F4 LDCONST R18 K9 - 0x7C380800, // 00F5 CALL R14 4 - 0x80040E00, // 00F6 RET 1 R7 + 0x54220003, // 0030 LDINT R8 4 + 0x1C200E08, // 0031 EQ R8 R7 R8 + 0x78220004, // 0032 JMPF R8 #0038 + 0x8C200706, // 0033 GETMET R8 R3 K6 + 0x88280B10, // 0034 GETMBR R10 R5 K16 + 0x502C0000, // 0035 LDBOOL R11 0 0 + 0x7C200600, // 0036 CALL R8 3 + 0x80041000, // 0037 RET 1 R8 + 0x70020354, // 0038 JMP #038E + 0x54220031, // 0039 LDINT R8 50 + 0x1C200C08, // 003A EQ R8 R6 R8 + 0x78220000, // 003B JMPF R8 #003D + 0x70020350, // 003C JMP #038E + 0x54220032, // 003D LDINT R8 51 + 0x1C200C08, // 003E EQ R8 R6 R8 + 0x782200DC, // 003F JMPF R8 #011D + 0x1C200F05, // 0040 EQ R8 R7 K5 + 0x782200B5, // 0041 JMPF R8 #00F8 + 0x8C200B11, // 0042 GETMET R8 R5 K17 + 0x7C200200, // 0043 CALL R8 1 + 0xB8262400, // 0044 GETNGBL R9 K18 + 0x8C241313, // 0045 GETMET R9 R9 K19 + 0x7C240200, // 0046 CALL R9 1 + 0x94281314, // 0047 GETIDX R10 R9 K20 + 0x782A0053, // 0048 JMPF R10 #009D + 0x8C281115, // 0049 GETMET R10 R8 K21 + 0x4C300000, // 004A LDNIL R12 + 0x7C280400, // 004B CALL R10 2 + 0x8C2C150B, // 004C GETMET R11 R10 K11 + 0x58340005, // 004D LDCONST R13 K5 + 0x88380B16, // 004E GETMBR R14 R5 K22 + 0x583C0017, // 004F LDCONST R15 K23 + 0x7C2C0800, // 0050 CALL R11 4 + 0x8C2C150B, // 0051 GETMET R11 R10 K11 + 0x58340009, // 0052 LDCONST R13 K9 + 0x88380B10, // 0053 GETMBR R14 R5 K16 + 0x583C0009, // 0054 LDCONST R15 K9 + 0x7C2C0800, // 0055 CALL R11 4 + 0x8C2C150B, // 0056 GETMET R11 R10 K11 + 0x5834000D, // 0057 LDCONST R13 K13 + 0x88380B10, // 0058 GETMBR R14 R5 K16 + 0x583C0009, // 0059 LDCONST R15 K9 + 0x7C2C0800, // 005A CALL R11 4 + 0x8C2C150B, // 005B GETMET R11 R10 K11 + 0x5834000F, // 005C LDCONST R13 K15 + 0x88380B18, // 005D GETMBR R14 R5 K24 + 0x4C3C0000, // 005E LDNIL R15 + 0x7C2C0800, // 005F CALL R11 4 + 0x602C0015, // 0060 GETGBL R11 G21 + 0x7C2C0000, // 0061 CALL R11 0 + 0x8C2C1719, // 0062 GETMET R11 R11 K25 + 0x8C34091A, // 0063 GETMET R13 R4 K26 + 0x8C3C131B, // 0064 GETMET R15 R9 K27 + 0x5844001C, // 0065 LDCONST R17 K28 + 0x5848001D, // 0066 LDCONST R18 K29 + 0x7C3C0600, // 0067 CALL R15 3 + 0x5840001E, // 0068 LDCONST R16 K30 + 0x5844001D, // 0069 LDCONST R17 K29 + 0x7C340800, // 006A CALL R13 4 + 0x7C2C0400, // 006B CALL R11 2 + 0x8C30150B, // 006C GETMET R12 R10 K11 + 0x543A0003, // 006D LDINT R14 4 + 0x883C0B1F, // 006E GETMBR R15 R5 K31 + 0x5C401600, // 006F MOVE R16 R11 + 0x7C300800, // 0070 CALL R12 4 + 0x8C301520, // 0071 GETMET R12 R10 K32 + 0x543A0004, // 0072 LDINT R14 5 + 0x7C300400, // 0073 CALL R12 2 + 0x8C34190B, // 0074 GETMET R13 R12 K11 + 0x4C3C0000, // 0075 LDNIL R15 + 0x88400B1F, // 0076 GETMBR R16 R5 K31 + 0xB8460200, // 0077 GETNGBL R17 K1 + 0x8C442321, // 0078 GETMET R17 R17 K33 + 0x8C4C131B, // 0079 GETMET R19 R9 K27 + 0x58540022, // 007A LDCONST R21 K34 + 0x5858001D, // 007B LDCONST R22 K29 + 0x7C4C0600, // 007C CALL R19 3 + 0x7C440400, // 007D CALL R17 2 + 0x7C340800, // 007E CALL R13 4 + 0x8C341520, // 007F GETMET R13 R10 K32 + 0x543E0005, // 0080 LDINT R15 6 + 0x7C340400, // 0081 CALL R13 2 + 0x8C381B0B, // 0082 GETMET R14 R13 K11 + 0x4C400000, // 0083 LDNIL R16 + 0x88440B1F, // 0084 GETMBR R17 R5 K31 + 0xB84A0200, // 0085 GETNGBL R18 K1 + 0x8C482521, // 0086 GETMET R18 R18 K33 + 0x8C50131B, // 0087 GETMET R20 R9 K27 + 0x58580023, // 0088 LDCONST R22 K35 + 0x585C001D, // 0089 LDCONST R23 K29 + 0x7C500600, // 008A CALL R20 3 + 0x7C480400, // 008B CALL R18 2 + 0x7C380800, // 008C CALL R14 4 + 0x8C381B0B, // 008D GETMET R14 R13 K11 + 0x4C400000, // 008E LDNIL R16 + 0x88440B1F, // 008F GETMBR R17 R5 K31 + 0xB84A0200, // 0090 GETNGBL R18 K1 + 0x8C482521, // 0091 GETMET R18 R18 K33 + 0x8C50131B, // 0092 GETMET R20 R9 K27 + 0x58580024, // 0093 LDCONST R22 K36 + 0x585C001D, // 0094 LDCONST R23 K29 + 0x7C500600, // 0095 CALL R20 3 + 0x7C480400, // 0096 CALL R18 2 + 0x7C380800, // 0097 CALL R14 4 + 0x8C38150B, // 0098 GETMET R14 R10 K11 + 0x54420006, // 0099 LDINT R16 7 + 0x88440B0E, // 009A GETMBR R17 R5 K14 + 0x5848000D, // 009B LDCONST R18 K13 + 0x7C380800, // 009C CALL R14 4 + 0xB82A2400, // 009D GETNGBL R10 K18 + 0x8C281525, // 009E GETMET R10 R10 K37 + 0x7C280200, // 009F CALL R10 1 + 0x942C1514, // 00A0 GETIDX R11 R10 K20 + 0x782E0053, // 00A1 JMPF R11 #00F6 + 0x8C2C1115, // 00A2 GETMET R11 R8 K21 + 0x4C340000, // 00A3 LDNIL R13 + 0x7C2C0400, // 00A4 CALL R11 2 + 0x8C30170B, // 00A5 GETMET R12 R11 K11 + 0x58380005, // 00A6 LDCONST R14 K5 + 0x883C0B16, // 00A7 GETMBR R15 R5 K22 + 0x58400025, // 00A8 LDCONST R16 K37 + 0x7C300800, // 00A9 CALL R12 4 + 0x8C30170B, // 00AA GETMET R12 R11 K11 + 0x58380009, // 00AB LDCONST R14 K9 + 0x883C0B10, // 00AC GETMBR R15 R5 K16 + 0x58400009, // 00AD LDCONST R16 K9 + 0x7C300800, // 00AE CALL R12 4 + 0x8C30170B, // 00AF GETMET R12 R11 K11 + 0x5838000D, // 00B0 LDCONST R14 K13 + 0x883C0B10, // 00B1 GETMBR R15 R5 K16 + 0x58400009, // 00B2 LDCONST R16 K9 + 0x7C300800, // 00B3 CALL R12 4 + 0x8C30170B, // 00B4 GETMET R12 R11 K11 + 0x5838000F, // 00B5 LDCONST R14 K15 + 0x883C0B18, // 00B6 GETMBR R15 R5 K24 + 0x4C400000, // 00B7 LDNIL R16 + 0x7C300800, // 00B8 CALL R12 4 + 0x60300015, // 00B9 GETGBL R12 G21 + 0x7C300000, // 00BA CALL R12 0 + 0x8C301919, // 00BB GETMET R12 R12 K25 + 0x8C38091A, // 00BC GETMET R14 R4 K26 + 0x8C40151B, // 00BD GETMET R16 R10 K27 + 0x5848001C, // 00BE LDCONST R18 K28 + 0x584C001D, // 00BF LDCONST R19 K29 + 0x7C400600, // 00C0 CALL R16 3 + 0x5844001E, // 00C1 LDCONST R17 K30 + 0x5848001D, // 00C2 LDCONST R18 K29 + 0x7C380800, // 00C3 CALL R14 4 + 0x7C300400, // 00C4 CALL R12 2 + 0x8C34170B, // 00C5 GETMET R13 R11 K11 + 0x543E0003, // 00C6 LDINT R15 4 + 0x88400B1F, // 00C7 GETMBR R16 R5 K31 + 0x5C441800, // 00C8 MOVE R17 R12 + 0x7C340800, // 00C9 CALL R13 4 + 0x8C341720, // 00CA GETMET R13 R11 K32 + 0x543E0004, // 00CB LDINT R15 5 + 0x7C340400, // 00CC CALL R13 2 + 0x8C381B0B, // 00CD GETMET R14 R13 K11 + 0x4C400000, // 00CE LDNIL R16 + 0x88440B1F, // 00CF GETMBR R17 R5 K31 + 0xB84A0200, // 00D0 GETNGBL R18 K1 + 0x8C482521, // 00D1 GETMET R18 R18 K33 + 0x8C50151B, // 00D2 GETMET R20 R10 K27 + 0x58580022, // 00D3 LDCONST R22 K34 + 0x585C001D, // 00D4 LDCONST R23 K29 + 0x7C500600, // 00D5 CALL R20 3 + 0x7C480400, // 00D6 CALL R18 2 + 0x7C380800, // 00D7 CALL R14 4 + 0x8C381720, // 00D8 GETMET R14 R11 K32 + 0x54420005, // 00D9 LDINT R16 6 + 0x7C380400, // 00DA CALL R14 2 + 0x8C3C1D0B, // 00DB GETMET R15 R14 K11 + 0x4C440000, // 00DC LDNIL R17 + 0x88480B1F, // 00DD GETMBR R18 R5 K31 + 0xB84E0200, // 00DE GETNGBL R19 K1 + 0x8C4C2721, // 00DF GETMET R19 R19 K33 + 0x8C54151B, // 00E0 GETMET R21 R10 K27 + 0x585C0023, // 00E1 LDCONST R23 K35 + 0x5860001D, // 00E2 LDCONST R24 K29 + 0x7C540600, // 00E3 CALL R21 3 + 0x7C4C0400, // 00E4 CALL R19 2 + 0x7C3C0800, // 00E5 CALL R15 4 + 0x8C3C1D0B, // 00E6 GETMET R15 R14 K11 + 0x4C440000, // 00E7 LDNIL R17 + 0x88480B1F, // 00E8 GETMBR R18 R5 K31 + 0xB84E0200, // 00E9 GETNGBL R19 K1 + 0x8C4C2721, // 00EA GETMET R19 R19 K33 + 0x8C54151B, // 00EB GETMET R21 R10 K27 + 0x585C0024, // 00EC LDCONST R23 K36 + 0x5860001D, // 00ED LDCONST R24 K29 + 0x7C540600, // 00EE CALL R21 3 + 0x7C4C0400, // 00EF CALL R19 2 + 0x7C3C0800, // 00F0 CALL R15 4 + 0x8C3C170B, // 00F1 GETMET R15 R11 K11 + 0x54460006, // 00F2 LDINT R17 7 + 0x88480B0E, // 00F3 GETMBR R18 R5 K14 + 0x584C0009, // 00F4 LDCONST R19 K9 + 0x7C3C0800, // 00F5 CALL R15 4 + 0x80041000, // 00F6 RET 1 R8 0x70020023, // 00F7 JMP #011C - 0x1C1C0D09, // 00F8 EQ R7 R6 K9 - 0x781E000B, // 00F9 JMPF R7 #0106 - 0x8C1C0906, // 00FA GETMET R7 R4 K6 - 0x8824090C, // 00FB GETMBR R9 R4 K12 - 0xB82A2400, // 00FC GETNGBL R10 K18 - 0x8C281526, // 00FD GETMET R10 R10 K38 - 0x58300027, // 00FE LDCONST R12 K39 - 0x50340200, // 00FF LDBOOL R13 1 0 - 0x7C280600, // 0100 CALL R10 3 - 0x94281528, // 0101 GETIDX R10 R10 K40 - 0x94281529, // 0102 GETIDX R10 R10 K41 - 0x7C1C0600, // 0103 CALL R7 3 - 0x80040E00, // 0104 RET 1 R7 + 0x1C200F09, // 00F8 EQ R8 R7 K9 + 0x7822000B, // 00F9 JMPF R8 #0106 + 0x8C200706, // 00FA GETMET R8 R3 K6 + 0x88280B0C, // 00FB GETMBR R10 R5 K12 + 0xB82E2400, // 00FC GETNGBL R11 K18 + 0x8C2C1726, // 00FD GETMET R11 R11 K38 + 0x58340027, // 00FE LDCONST R13 K39 + 0x50380200, // 00FF LDBOOL R14 1 0 + 0x7C2C0600, // 0100 CALL R11 3 + 0x942C1728, // 0101 GETIDX R11 R11 K40 + 0x942C1729, // 0102 GETIDX R11 R11 K41 + 0x7C200600, // 0103 CALL R8 3 + 0x80041000, // 0104 RET 1 R8 0x70020015, // 0105 JMP #011C - 0x1C1C0D0D, // 0106 EQ R7 R6 K13 - 0x781E000B, // 0107 JMPF R7 #0114 - 0x8C1C0906, // 0108 GETMET R7 R4 K6 - 0x8824092A, // 0109 GETMBR R9 R4 K42 - 0xB82A2400, // 010A GETNGBL R10 K18 - 0x8C281526, // 010B GETMET R10 R10 K38 - 0x5830002B, // 010C LDCONST R12 K43 - 0x50340200, // 010D LDBOOL R13 1 0 - 0x7C280600, // 010E CALL R10 3 - 0x9428152C, // 010F GETIDX R10 R10 K44 - 0x9428152D, // 0110 GETIDX R10 R10 K45 - 0x7C1C0600, // 0111 CALL R7 3 - 0x80040E00, // 0112 RET 1 R7 + 0x1C200F0D, // 0106 EQ R8 R7 K13 + 0x7822000B, // 0107 JMPF R8 #0114 + 0x8C200706, // 0108 GETMET R8 R3 K6 + 0x88280B2A, // 0109 GETMBR R10 R5 K42 + 0xB82E2400, // 010A GETNGBL R11 K18 + 0x8C2C1726, // 010B GETMET R11 R11 K38 + 0x5834002B, // 010C LDCONST R13 K43 + 0x50380200, // 010D LDBOOL R14 1 0 + 0x7C2C0600, // 010E CALL R11 3 + 0x942C172C, // 010F GETIDX R11 R11 K44 + 0x942C172D, // 0110 GETIDX R11 R11 K45 + 0x7C200600, // 0111 CALL R8 3 + 0x80041000, // 0112 RET 1 R8 0x70020007, // 0113 JMP #011C - 0x541E0007, // 0114 LDINT R7 8 - 0x1C1C0C07, // 0115 EQ R7 R6 R7 - 0x781E0004, // 0116 JMPF R7 #011C - 0x8C1C0906, // 0117 GETMET R7 R4 K6 - 0x88240910, // 0118 GETMBR R9 R4 K16 - 0x50280000, // 0119 LDBOOL R10 0 0 - 0x7C1C0600, // 011A CALL R7 3 - 0x80040E00, // 011B RET 1 R7 - 0x70020269, // 011C JMP #0387 - 0x541E0033, // 011D LDINT R7 52 - 0x1C1C0A07, // 011E EQ R7 R5 R7 - 0x781E0000, // 011F JMPF R7 #0121 - 0x70020265, // 0120 JMP #0387 - 0x541E0037, // 0121 LDINT R7 56 - 0x1C1C0A07, // 0122 EQ R7 R5 R7 - 0x781E002C, // 0123 JMPF R7 #0151 - 0x1C1C0D05, // 0124 EQ R7 R6 K5 - 0x781E000F, // 0125 JMPF R7 #0136 - 0xB81E5C00, // 0126 GETNGBL R7 K46 - 0xB8222400, // 0127 GETNGBL R8 K18 - 0x8C20112F, // 0128 GETMET R8 R8 K47 - 0x7C200200, // 0129 CALL R8 1 - 0x94201130, // 012A GETIDX R8 R8 K48 - 0x7C1C0200, // 012B CALL R7 1 - 0xB8225C00, // 012C GETNGBL R8 K46 - 0x58240031, // 012D LDCONST R9 K49 - 0x7C200200, // 012E CALL R8 1 - 0x081C0E08, // 012F MUL R7 R7 R8 - 0x8C200906, // 0130 GETMET R8 R4 K6 - 0x88280907, // 0131 GETMBR R10 R4 K7 - 0x5C2C0E00, // 0132 MOVE R11 R7 - 0x7C200600, // 0133 CALL R8 3 - 0x80041000, // 0134 RET 1 R8 - 0x70020019, // 0135 JMP #0150 - 0x1C1C0D09, // 0136 EQ R7 R6 K9 - 0x781E0005, // 0137 JMPF R7 #013E - 0x8C1C0906, // 0138 GETMET R7 R4 K6 - 0x8824090E, // 0139 GETMBR R9 R4 K14 - 0x5828000F, // 013A LDCONST R10 K15 - 0x7C1C0600, // 013B CALL R7 3 - 0x80040E00, // 013C RET 1 R7 - 0x70020011, // 013D JMP #0150 - 0x541E0006, // 013E LDINT R7 7 - 0x1C1C0C07, // 013F EQ R7 R6 R7 - 0x781E000E, // 0140 JMPF R7 #0150 - 0xB81E5C00, // 0141 GETNGBL R7 K46 - 0xB8222400, // 0142 GETNGBL R8 K18 - 0x8C20112F, // 0143 GETMET R8 R8 K47 - 0x7C200200, // 0144 CALL R8 1 - 0x94201132, // 0145 GETIDX R8 R8 K50 - 0x7C1C0200, // 0146 CALL R7 1 - 0xB8225C00, // 0147 GETNGBL R8 K46 - 0x58240031, // 0148 LDCONST R9 K49 - 0x7C200200, // 0149 CALL R8 1 - 0x081C0E08, // 014A MUL R7 R7 R8 - 0x8C200906, // 014B GETMET R8 R4 K6 - 0x88280907, // 014C GETMBR R10 R4 K7 - 0x5C2C0E00, // 014D MOVE R11 R7 - 0x7C200600, // 014E CALL R8 3 - 0x80041000, // 014F RET 1 R8 - 0x70020235, // 0150 JMP #0387 - 0x541E003D, // 0151 LDINT R7 62 - 0x1C1C0A07, // 0152 EQ R7 R5 R7 - 0x781E0090, // 0153 JMPF R7 #01E5 - 0x1C1C0D05, // 0154 EQ R7 R6 K5 - 0x781E0025, // 0155 JMPF R7 #017C - 0x8C1C0911, // 0156 GETMET R7 R4 K17 - 0x7C1C0200, // 0157 CALL R7 1 - 0x60200010, // 0158 GETGBL R8 G16 - 0x88240133, // 0159 GETMBR R9 R0 K51 - 0x88241334, // 015A GETMBR R9 R9 K52 - 0x8C241335, // 015B GETMET R9 R9 K53 - 0x7C240200, // 015C CALL R9 1 - 0x7C200200, // 015D CALL R8 1 - 0xA8020017, // 015E EXBLK 0 #0177 - 0x5C241000, // 015F MOVE R9 R8 - 0x7C240000, // 0160 CALL R9 0 - 0x8C280F15, // 0161 GETMET R10 R7 K21 - 0x4C300000, // 0162 LDNIL R12 - 0x7C280400, // 0163 CALL R10 2 - 0x8C2C150B, // 0164 GETMET R11 R10 K11 - 0x58340009, // 0165 LDCONST R13 K9 - 0x88380936, // 0166 GETMBR R14 R4 K54 - 0x8C3C1337, // 0167 GETMET R15 R9 K55 - 0x7C3C0200, // 0168 CALL R15 1 - 0x7C2C0800, // 0169 CALL R11 4 - 0x8C2C150B, // 016A GETMET R11 R10 K11 - 0x5834000D, // 016B LDCONST R13 K13 - 0x88380936, // 016C GETMBR R14 R4 K54 - 0x8C3C1338, // 016D GETMET R15 R9 K56 - 0x7C3C0200, // 016E CALL R15 1 - 0x7C2C0800, // 016F CALL R11 4 - 0x8C2C150B, // 0170 GETMET R11 R10 K11 - 0x543600FD, // 0171 LDINT R13 254 - 0x8838090C, // 0172 GETMBR R14 R4 K12 - 0x8C3C1339, // 0173 GETMET R15 R9 K57 - 0x7C3C0200, // 0174 CALL R15 1 - 0x7C2C0800, // 0175 CALL R11 4 - 0x7001FFE7, // 0176 JMP #015F - 0x5820003A, // 0177 LDCONST R8 K58 - 0xAC200200, // 0178 CATCH R8 1 0 - 0xB0080000, // 0179 RAISE 2 R0 R0 - 0x80040E00, // 017A RET 1 R7 - 0x70020067, // 017B JMP #01E4 - 0x1C1C0D09, // 017C EQ R7 R6 K9 - 0x781E003C, // 017D JMPF R7 #01BB - 0x8C1C0911, // 017E GETMET R7 R4 K17 - 0x7C1C0200, // 017F CALL R7 1 - 0x60200010, // 0180 GETGBL R8 G16 - 0x88240133, // 0181 GETMBR R9 R0 K51 - 0x88241334, // 0182 GETMBR R9 R9 K52 - 0x8C241335, // 0183 GETMET R9 R9 K53 - 0x7C240200, // 0184 CALL R9 1 - 0x7C200200, // 0185 CALL R8 1 - 0xA802002E, // 0186 EXBLK 0 #01B6 - 0x5C241000, // 0187 MOVE R9 R8 - 0x7C240000, // 0188 CALL R9 0 - 0x8C28093B, // 0189 GETMET R10 R4 K59 - 0x8C30133C, // 018A GETMET R12 R9 K60 - 0x7C300200, // 018B CALL R12 1 - 0x7C280400, // 018C CALL R10 2 - 0x8C2C0F15, // 018D GETMET R11 R7 K21 - 0x4C340000, // 018E LDNIL R13 - 0x7C2C0400, // 018F CALL R11 2 - 0x8C30170B, // 0190 GETMET R12 R11 K11 - 0x58380009, // 0191 LDCONST R14 K9 - 0x883C0936, // 0192 GETMBR R15 R4 K54 - 0x8C40153D, // 0193 GETMET R16 R10 K61 - 0x544A0008, // 0194 LDINT R18 9 - 0x7C400400, // 0195 CALL R16 2 - 0x7C300800, // 0196 CALL R12 4 - 0x8C30170B, // 0197 GETMET R12 R11 K11 - 0x5838000D, // 0198 LDCONST R14 K13 - 0x883C090C, // 0199 GETMBR R15 R4 K12 - 0x8C40133E, // 019A GETMET R16 R9 K62 - 0x7C400200, // 019B CALL R16 1 - 0x7C300800, // 019C CALL R12 4 - 0x8C30170B, // 019D GETMET R12 R11 K11 - 0x5838000F, // 019E LDCONST R14 K15 - 0x883C0907, // 019F GETMBR R15 R4 K7 - 0x8C40133F, // 01A0 GETMET R16 R9 K63 - 0x7C400200, // 01A1 CALL R16 1 - 0x7C300800, // 01A2 CALL R12 4 - 0x8C30170B, // 01A3 GETMET R12 R11 K11 - 0x543A0003, // 01A4 LDINT R14 4 - 0x883C0907, // 01A5 GETMBR R15 R4 K7 - 0x8C401340, // 01A6 GETMET R16 R9 K64 - 0x7C400200, // 01A7 CALL R16 1 - 0x7C300800, // 01A8 CALL R12 4 - 0x8C30170B, // 01A9 GETMET R12 R11 K11 - 0x543A0004, // 01AA LDINT R14 5 - 0x883C0916, // 01AB GETMBR R15 R4 K22 - 0x8C401341, // 01AC GETMET R16 R9 K65 - 0x7C400200, // 01AD CALL R16 1 - 0x7C300800, // 01AE CALL R12 4 - 0x8C30170B, // 01AF GETMET R12 R11 K11 - 0x543A00FD, // 01B0 LDINT R14 254 - 0x883C090C, // 01B1 GETMBR R15 R4 K12 - 0x8C401339, // 01B2 GETMET R16 R9 K57 - 0x7C400200, // 01B3 CALL R16 1 - 0x7C300800, // 01B4 CALL R12 4 - 0x7001FFD0, // 01B5 JMP #0187 - 0x5820003A, // 01B6 LDCONST R8 K58 - 0xAC200200, // 01B7 CATCH R8 1 0 - 0xB0080000, // 01B8 RAISE 2 R0 R0 - 0x80040E00, // 01B9 RET 1 R7 - 0x70020028, // 01BA JMP #01E4 - 0x1C1C0D0D, // 01BB EQ R7 R6 K13 - 0x781E0007, // 01BC JMPF R7 #01C5 - 0x8C1C0906, // 01BD GETMET R7 R4 K6 - 0x8824090E, // 01BE GETMBR R9 R4 K14 - 0xB82A0200, // 01BF GETNGBL R10 K1 - 0x88281542, // 01C0 GETMBR R10 R10 K66 - 0x88281543, // 01C1 GETMBR R10 R10 K67 - 0x7C1C0600, // 01C2 CALL R7 3 - 0x80040E00, // 01C3 RET 1 R7 - 0x7002001E, // 01C4 JMP #01E4 - 0x1C1C0D0F, // 01C5 EQ R7 R6 K15 - 0x781E0009, // 01C6 JMPF R7 #01D1 - 0x881C0133, // 01C7 GETMBR R7 R0 K51 - 0x881C0F34, // 01C8 GETMBR R7 R7 K52 - 0x8C1C0F44, // 01C9 GETMET R7 R7 K68 - 0x7C1C0200, // 01CA CALL R7 1 - 0x8C200906, // 01CB GETMET R8 R4 K6 - 0x8828090E, // 01CC GETMBR R10 R4 K14 - 0x5C2C0E00, // 01CD MOVE R11 R7 - 0x7C200600, // 01CE CALL R8 3 - 0x80041000, // 01CF RET 1 R8 - 0x70020012, // 01D0 JMP #01E4 - 0x541E0003, // 01D1 LDINT R7 4 - 0x1C1C0C07, // 01D2 EQ R7 R6 R7 - 0x781E0000, // 01D3 JMPF R7 #01D5 - 0x7002000E, // 01D4 JMP #01E4 - 0x541E0004, // 01D5 LDINT R7 5 - 0x1C1C0C07, // 01D6 EQ R7 R6 R7 - 0x781E000B, // 01D7 JMPF R7 #01E4 - 0x881C0345, // 01D8 GETMBR R7 R1 K69 - 0x8C1C0F39, // 01D9 GETMET R7 R7 K57 - 0x7C1C0200, // 01DA CALL R7 1 - 0x4C200000, // 01DB LDNIL R8 - 0x1C200E08, // 01DC EQ R8 R7 R8 - 0x78220000, // 01DD JMPF R8 #01DF - 0x581C0005, // 01DE LDCONST R7 K5 - 0x8C200906, // 01DF GETMET R8 R4 K6 - 0x8828090E, // 01E0 GETMBR R10 R4 K14 - 0x5C2C0E00, // 01E1 MOVE R11 R7 - 0x7C200600, // 01E2 CALL R8 3 - 0x80041000, // 01E3 RET 1 R8 - 0x700201A1, // 01E4 JMP #0387 - 0x541E003B, // 01E5 LDINT R7 60 - 0x1C1C0A07, // 01E6 EQ R7 R5 R7 - 0x781E003C, // 01E7 JMPF R7 #0225 - 0x1C1C0D05, // 01E8 EQ R7 R6 K5 - 0x781E0012, // 01E9 JMPF R7 #01FD - 0x881C0133, // 01EA GETMBR R7 R0 K51 - 0x8C1C0F46, // 01EB GETMET R7 R7 K70 - 0x7C1C0200, // 01EC CALL R7 1 - 0x88200133, // 01ED GETMBR R8 R0 K51 - 0x8C201147, // 01EE GETMET R8 R8 K71 - 0x7C200200, // 01EF CALL R8 1 - 0x781E0004, // 01F0 JMPF R7 #01F6 - 0x78220001, // 01F1 JMPF R8 #01F4 - 0x5824000D, // 01F2 LDCONST R9 K13 - 0x70020000, // 01F3 JMP #01F5 - 0x58240009, // 01F4 LDCONST R9 K9 + 0x54220007, // 0114 LDINT R8 8 + 0x1C200E08, // 0115 EQ R8 R7 R8 + 0x78220004, // 0116 JMPF R8 #011C + 0x8C200706, // 0117 GETMET R8 R3 K6 + 0x88280B10, // 0118 GETMBR R10 R5 K16 + 0x502C0000, // 0119 LDBOOL R11 0 0 + 0x7C200600, // 011A CALL R8 3 + 0x80041000, // 011B RET 1 R8 + 0x70020270, // 011C JMP #038E + 0x54220033, // 011D LDINT R8 52 + 0x1C200C08, // 011E EQ R8 R6 R8 + 0x78220000, // 011F JMPF R8 #0121 + 0x7002026C, // 0120 JMP #038E + 0x54220037, // 0121 LDINT R8 56 + 0x1C200C08, // 0122 EQ R8 R6 R8 + 0x7822002B, // 0123 JMPF R8 #0150 + 0x1C200F05, // 0124 EQ R8 R7 K5 + 0x7822000E, // 0125 JMPF R8 #0135 + 0xB8225C00, // 0126 GETNGBL R8 K46 + 0xB8262400, // 0127 GETNGBL R9 K18 + 0x8C24132F, // 0128 GETMET R9 R9 K47 + 0x7C240200, // 0129 CALL R9 1 + 0x7C200200, // 012A CALL R8 1 + 0xB8265C00, // 012B GETNGBL R9 K46 + 0x58280030, // 012C LDCONST R10 K48 + 0x7C240200, // 012D CALL R9 1 + 0x08201009, // 012E MUL R8 R8 R9 + 0x8C240706, // 012F GETMET R9 R3 K6 + 0x882C0B07, // 0130 GETMBR R11 R5 K7 + 0x5C301000, // 0131 MOVE R12 R8 + 0x7C240600, // 0132 CALL R9 3 + 0x80041200, // 0133 RET 1 R9 + 0x70020019, // 0134 JMP #014F + 0x1C200F09, // 0135 EQ R8 R7 K9 + 0x78220005, // 0136 JMPF R8 #013D + 0x8C200706, // 0137 GETMET R8 R3 K6 + 0x88280B0E, // 0138 GETMBR R10 R5 K14 + 0x582C000F, // 0139 LDCONST R11 K15 + 0x7C200600, // 013A CALL R8 3 + 0x80041000, // 013B RET 1 R8 + 0x70020011, // 013C JMP #014F + 0x54220006, // 013D LDINT R8 7 + 0x1C200E08, // 013E EQ R8 R7 R8 + 0x7822000E, // 013F JMPF R8 #014F + 0xB8225C00, // 0140 GETNGBL R8 K46 + 0xB8262400, // 0141 GETNGBL R9 K18 + 0x8C241331, // 0142 GETMET R9 R9 K49 + 0x7C240200, // 0143 CALL R9 1 + 0x94241332, // 0144 GETIDX R9 R9 K50 + 0x7C200200, // 0145 CALL R8 1 + 0xB8265C00, // 0146 GETNGBL R9 K46 + 0x58280030, // 0147 LDCONST R10 K48 + 0x7C240200, // 0148 CALL R9 1 + 0x08201009, // 0149 MUL R8 R8 R9 + 0x8C240706, // 014A GETMET R9 R3 K6 + 0x882C0B07, // 014B GETMBR R11 R5 K7 + 0x5C301000, // 014C MOVE R12 R8 + 0x7C240600, // 014D CALL R9 3 + 0x80041200, // 014E RET 1 R9 + 0x7002023D, // 014F JMP #038E + 0x5422003D, // 0150 LDINT R8 62 + 0x1C200C08, // 0151 EQ R8 R6 R8 + 0x78220093, // 0152 JMPF R8 #01E7 + 0x8C200133, // 0153 GETMET R8 R0 K51 + 0x88280534, // 0154 GETMBR R10 R2 K52 + 0x7C200400, // 0155 CALL R8 2 + 0x1C200F05, // 0156 EQ R8 R7 K5 + 0x78220025, // 0157 JMPF R8 #017E + 0x8C200B11, // 0158 GETMET R8 R5 K17 + 0x7C200200, // 0159 CALL R8 1 + 0x60240010, // 015A GETGBL R9 G16 + 0x88280135, // 015B GETMBR R10 R0 K53 + 0x88281536, // 015C GETMBR R10 R10 K54 + 0x8C281537, // 015D GETMET R10 R10 K55 + 0x7C280200, // 015E CALL R10 1 + 0x7C240200, // 015F CALL R9 1 + 0xA8020017, // 0160 EXBLK 0 #0179 + 0x5C281200, // 0161 MOVE R10 R9 + 0x7C280000, // 0162 CALL R10 0 + 0x8C2C1115, // 0163 GETMET R11 R8 K21 + 0x4C340000, // 0164 LDNIL R13 + 0x7C2C0400, // 0165 CALL R11 2 + 0x8C30170B, // 0166 GETMET R12 R11 K11 + 0x58380009, // 0167 LDCONST R14 K9 + 0x883C0B38, // 0168 GETMBR R15 R5 K56 + 0x8C401539, // 0169 GETMET R16 R10 K57 + 0x7C400200, // 016A CALL R16 1 + 0x7C300800, // 016B CALL R12 4 + 0x8C30170B, // 016C GETMET R12 R11 K11 + 0x5838000D, // 016D LDCONST R14 K13 + 0x883C0B38, // 016E GETMBR R15 R5 K56 + 0x8C40153A, // 016F GETMET R16 R10 K58 + 0x7C400200, // 0170 CALL R16 1 + 0x7C300800, // 0171 CALL R12 4 + 0x8C30170B, // 0172 GETMET R12 R11 K11 + 0x543A00FD, // 0173 LDINT R14 254 + 0x883C0B0C, // 0174 GETMBR R15 R5 K12 + 0x8C40153B, // 0175 GETMET R16 R10 K59 + 0x7C400200, // 0176 CALL R16 1 + 0x7C300800, // 0177 CALL R12 4 + 0x7001FFE7, // 0178 JMP #0161 + 0x5824003C, // 0179 LDCONST R9 K60 + 0xAC240200, // 017A CATCH R9 1 0 + 0xB0080000, // 017B RAISE 2 R0 R0 + 0x80041000, // 017C RET 1 R8 + 0x70020067, // 017D JMP #01E6 + 0x1C200F09, // 017E EQ R8 R7 K9 + 0x7822003C, // 017F JMPF R8 #01BD + 0x8C200B11, // 0180 GETMET R8 R5 K17 + 0x7C200200, // 0181 CALL R8 1 + 0x60240010, // 0182 GETGBL R9 G16 + 0x88280135, // 0183 GETMBR R10 R0 K53 + 0x88281536, // 0184 GETMBR R10 R10 K54 + 0x8C281537, // 0185 GETMET R10 R10 K55 + 0x7C280200, // 0186 CALL R10 1 + 0x7C240200, // 0187 CALL R9 1 + 0xA802002E, // 0188 EXBLK 0 #01B8 + 0x5C281200, // 0189 MOVE R10 R9 + 0x7C280000, // 018A CALL R10 0 + 0x8C2C0B3D, // 018B GETMET R11 R5 K61 + 0x8C34153E, // 018C GETMET R13 R10 K62 + 0x7C340200, // 018D CALL R13 1 + 0x7C2C0400, // 018E CALL R11 2 + 0x8C301115, // 018F GETMET R12 R8 K21 + 0x4C380000, // 0190 LDNIL R14 + 0x7C300400, // 0191 CALL R12 2 + 0x8C34190B, // 0192 GETMET R13 R12 K11 + 0x583C0009, // 0193 LDCONST R15 K9 + 0x88400B38, // 0194 GETMBR R16 R5 K56 + 0x8C44173F, // 0195 GETMET R17 R11 K63 + 0x544E0008, // 0196 LDINT R19 9 + 0x7C440400, // 0197 CALL R17 2 + 0x7C340800, // 0198 CALL R13 4 + 0x8C34190B, // 0199 GETMET R13 R12 K11 + 0x583C000D, // 019A LDCONST R15 K13 + 0x88400B0C, // 019B GETMBR R16 R5 K12 + 0x8C441540, // 019C GETMET R17 R10 K64 + 0x7C440200, // 019D CALL R17 1 + 0x7C340800, // 019E CALL R13 4 + 0x8C34190B, // 019F GETMET R13 R12 K11 + 0x583C000F, // 01A0 LDCONST R15 K15 + 0x88400B07, // 01A1 GETMBR R16 R5 K7 + 0x8C441541, // 01A2 GETMET R17 R10 K65 + 0x7C440200, // 01A3 CALL R17 1 + 0x7C340800, // 01A4 CALL R13 4 + 0x8C34190B, // 01A5 GETMET R13 R12 K11 + 0x543E0003, // 01A6 LDINT R15 4 + 0x88400B07, // 01A7 GETMBR R16 R5 K7 + 0x8C441542, // 01A8 GETMET R17 R10 K66 + 0x7C440200, // 01A9 CALL R17 1 + 0x7C340800, // 01AA CALL R13 4 + 0x8C34190B, // 01AB GETMET R13 R12 K11 + 0x543E0004, // 01AC LDINT R15 5 + 0x88400B16, // 01AD GETMBR R16 R5 K22 + 0x8C441543, // 01AE GETMET R17 R10 K67 + 0x7C440200, // 01AF CALL R17 1 + 0x7C340800, // 01B0 CALL R13 4 + 0x8C34190B, // 01B1 GETMET R13 R12 K11 + 0x543E00FD, // 01B2 LDINT R15 254 + 0x88400B0C, // 01B3 GETMBR R16 R5 K12 + 0x8C44153B, // 01B4 GETMET R17 R10 K59 + 0x7C440200, // 01B5 CALL R17 1 + 0x7C340800, // 01B6 CALL R13 4 + 0x7001FFD0, // 01B7 JMP #0189 + 0x5824003C, // 01B8 LDCONST R9 K60 + 0xAC240200, // 01B9 CATCH R9 1 0 + 0xB0080000, // 01BA RAISE 2 R0 R0 + 0x80041000, // 01BB RET 1 R8 + 0x70020028, // 01BC JMP #01E6 + 0x1C200F0D, // 01BD EQ R8 R7 K13 + 0x78220007, // 01BE JMPF R8 #01C7 + 0x8C200706, // 01BF GETMET R8 R3 K6 + 0x88280B0E, // 01C0 GETMBR R10 R5 K14 + 0xB82E0200, // 01C1 GETNGBL R11 K1 + 0x882C1744, // 01C2 GETMBR R11 R11 K68 + 0x882C1745, // 01C3 GETMBR R11 R11 K69 + 0x7C200600, // 01C4 CALL R8 3 + 0x80041000, // 01C5 RET 1 R8 + 0x7002001E, // 01C6 JMP #01E6 + 0x1C200F0F, // 01C7 EQ R8 R7 K15 + 0x78220009, // 01C8 JMPF R8 #01D3 + 0x88200135, // 01C9 GETMBR R8 R0 K53 + 0x88201136, // 01CA GETMBR R8 R8 K54 + 0x8C201146, // 01CB GETMET R8 R8 K70 + 0x7C200200, // 01CC CALL R8 1 + 0x8C240706, // 01CD GETMET R9 R3 K6 + 0x882C0B0E, // 01CE GETMBR R11 R5 K14 + 0x5C301000, // 01CF MOVE R12 R8 + 0x7C240600, // 01D0 CALL R9 3 + 0x80041200, // 01D1 RET 1 R9 + 0x70020012, // 01D2 JMP #01E6 + 0x54220003, // 01D3 LDINT R8 4 + 0x1C200E08, // 01D4 EQ R8 R7 R8 + 0x78220000, // 01D5 JMPF R8 #01D7 + 0x7002000E, // 01D6 JMP #01E6 + 0x54220004, // 01D7 LDINT R8 5 + 0x1C200E08, // 01D8 EQ R8 R7 R8 + 0x7822000B, // 01D9 JMPF R8 #01E6 + 0x88200347, // 01DA GETMBR R8 R1 K71 + 0x8C20113B, // 01DB GETMET R8 R8 K59 + 0x7C200200, // 01DC CALL R8 1 + 0x4C240000, // 01DD LDNIL R9 + 0x1C241009, // 01DE EQ R9 R8 R9 + 0x78260000, // 01DF JMPF R9 #01E1 + 0x58200005, // 01E0 LDCONST R8 K5 + 0x8C240706, // 01E1 GETMET R9 R3 K6 + 0x882C0B0E, // 01E2 GETMBR R11 R5 K14 + 0x5C301000, // 01E3 MOVE R12 R8 + 0x7C240600, // 01E4 CALL R9 3 + 0x80041200, // 01E5 RET 1 R9 + 0x700201A6, // 01E6 JMP #038E + 0x5422003B, // 01E7 LDINT R8 60 + 0x1C200C08, // 01E8 EQ R8 R6 R8 + 0x7822003C, // 01E9 JMPF R8 #0227 + 0x1C200F05, // 01EA EQ R8 R7 K5 + 0x78220012, // 01EB JMPF R8 #01FF + 0x88200135, // 01EC GETMBR R8 R0 K53 + 0x8C201148, // 01ED GETMET R8 R8 K72 + 0x7C200200, // 01EE CALL R8 1 + 0x88240135, // 01EF GETMBR R9 R0 K53 + 0x8C241349, // 01F0 GETMET R9 R9 K73 + 0x7C240200, // 01F1 CALL R9 1 + 0x78220004, // 01F2 JMPF R8 #01F8 + 0x78260001, // 01F3 JMPF R9 #01F6 + 0x5828000D, // 01F4 LDCONST R10 K13 0x70020000, // 01F5 JMP #01F7 - 0x58240005, // 01F6 LDCONST R9 K5 - 0x8C280906, // 01F7 GETMET R10 R4 K6 - 0x8830090E, // 01F8 GETMBR R12 R4 K14 - 0x5C341200, // 01F9 MOVE R13 R9 - 0x7C280600, // 01FA CALL R10 3 - 0x80041400, // 01FB RET 1 R10 - 0x70020026, // 01FC JMP #0224 - 0x1C1C0D09, // 01FD EQ R7 R6 K9 - 0x781E0011, // 01FE JMPF R7 #0211 - 0x881C0133, // 01FF GETMBR R7 R0 K51 - 0x881C0F48, // 0200 GETMBR R7 R7 K72 - 0x4C200000, // 0201 LDNIL R8 - 0x20200E08, // 0202 NE R8 R7 R8 - 0x78220006, // 0203 JMPF R8 #020B - 0x8C200906, // 0204 GETMET R8 R4 K6 - 0x8828090C, // 0205 GETMBR R10 R4 K12 - 0x8C2C0F39, // 0206 GETMET R11 R7 K57 - 0x7C2C0200, // 0207 CALL R11 1 - 0x7C200600, // 0208 CALL R8 3 - 0x80041000, // 0209 RET 1 R8 - 0x70020004, // 020A JMP #0210 - 0x8C200906, // 020B GETMET R8 R4 K6 - 0x88280918, // 020C GETMBR R10 R4 K24 - 0x4C2C0000, // 020D LDNIL R11 - 0x7C200600, // 020E CALL R8 3 - 0x80041000, // 020F RET 1 R8 - 0x70020012, // 0210 JMP #0224 - 0x1C1C0D0D, // 0211 EQ R7 R6 K13 - 0x781E0010, // 0212 JMPF R7 #0224 - 0x881C0133, // 0213 GETMBR R7 R0 K51 - 0x881C0F48, // 0214 GETMBR R7 R7 K72 - 0x4C200000, // 0215 LDNIL R8 - 0x20200E08, // 0216 NE R8 R7 R8 - 0x78220006, // 0217 JMPF R8 #021F - 0x8C200906, // 0218 GETMET R8 R4 K6 - 0x8828090C, // 0219 GETMBR R10 R4 K12 - 0x8C2C0F3E, // 021A GETMET R11 R7 K62 - 0x7C2C0200, // 021B CALL R11 1 - 0x7C200600, // 021C CALL R8 3 - 0x80041000, // 021D RET 1 R8 - 0x70020004, // 021E JMP #0224 - 0x8C200906, // 021F GETMET R8 R4 K6 - 0x88280918, // 0220 GETMBR R10 R4 K24 - 0x4C2C0000, // 0221 LDNIL R11 - 0x7C200600, // 0222 CALL R8 3 - 0x80041000, // 0223 RET 1 R8 - 0x70020161, // 0224 JMP #0387 - 0x541E0027, // 0225 LDINT R7 40 - 0x1C1C0A07, // 0226 EQ R7 R5 R7 - 0x781E00B7, // 0227 JMPF R7 #02E0 - 0x1C1C0D05, // 0228 EQ R7 R6 K5 - 0x781E0005, // 0229 JMPF R7 #0230 - 0x8C1C0906, // 022A GETMET R7 R4 K6 - 0x8824090C, // 022B GETMBR R9 R4 K12 - 0x58280009, // 022C LDCONST R10 K9 - 0x7C1C0600, // 022D CALL R7 3 - 0x80040E00, // 022E RET 1 R7 - 0x700200AE, // 022F JMP #02DF - 0x1C1C0D09, // 0230 EQ R7 R6 K9 - 0x781E0005, // 0231 JMPF R7 #0238 - 0x8C1C0906, // 0232 GETMET R7 R4 K6 - 0x88240916, // 0233 GETMBR R9 R4 K22 - 0x58280049, // 0234 LDCONST R10 K73 - 0x7C1C0600, // 0235 CALL R7 3 - 0x80040E00, // 0236 RET 1 R7 - 0x700200A6, // 0237 JMP #02DF - 0x1C1C0D0D, // 0238 EQ R7 R6 K13 - 0x781E0006, // 0239 JMPF R7 #0241 - 0x8C1C0906, // 023A GETMET R7 R4 K6 - 0x8824090C, // 023B GETMBR R9 R4 K12 - 0x88280133, // 023C GETMBR R10 R0 K51 - 0x8828154A, // 023D GETMBR R10 R10 K74 - 0x7C1C0600, // 023E CALL R7 3 - 0x80040E00, // 023F RET 1 R7 - 0x7002009D, // 0240 JMP #02DF - 0x1C1C0D0F, // 0241 EQ R7 R6 K15 - 0x781E000A, // 0242 JMPF R7 #024E - 0x8C1C0906, // 0243 GETMET R7 R4 K6 - 0x88240916, // 0244 GETMBR R9 R4 K22 - 0xB82A2400, // 0245 GETNGBL R10 K18 - 0x8C281526, // 0246 GETMET R10 R10 K38 - 0x5830004B, // 0247 LDCONST R12 K75 - 0x50340200, // 0248 LDBOOL R13 1 0 - 0x7C280600, // 0249 CALL R10 3 - 0x9428154B, // 024A GETIDX R10 R10 K75 - 0x7C1C0600, // 024B CALL R7 3 - 0x80040E00, // 024C RET 1 R7 - 0x70020090, // 024D JMP #02DF - 0x541E0003, // 024E LDINT R7 4 - 0x1C1C0C07, // 024F EQ R7 R6 R7 - 0x781E0005, // 0250 JMPF R7 #0257 - 0x8C1C0906, // 0251 GETMET R7 R4 K6 - 0x8824090C, // 0252 GETMBR R9 R4 K12 - 0x542A7FFF, // 0253 LDINT R10 32768 - 0x7C1C0600, // 0254 CALL R7 3 - 0x80040E00, // 0255 RET 1 R7 - 0x70020087, // 0256 JMP #02DF - 0x541E0004, // 0257 LDINT R7 5 - 0x1C1C0C07, // 0258 EQ R7 R6 R7 - 0x781E000A, // 0259 JMPF R7 #0265 - 0x8C1C0906, // 025A GETMET R7 R4 K6 - 0x88240916, // 025B GETMBR R9 R4 K22 - 0xB82A2400, // 025C GETNGBL R10 K18 - 0x8C281526, // 025D GETMET R10 R10 K38 - 0x5830004C, // 025E LDCONST R12 K76 - 0x50340200, // 025F LDBOOL R13 1 0 - 0x7C280600, // 0260 CALL R10 3 - 0x9428154D, // 0261 GETIDX R10 R10 K77 - 0x7C1C0600, // 0262 CALL R7 3 - 0x80040E00, // 0263 RET 1 R7 - 0x70020079, // 0264 JMP #02DF - 0x541E0005, // 0265 LDINT R7 6 - 0x1C1C0C07, // 0266 EQ R7 R6 R7 - 0x781E0005, // 0267 JMPF R7 #026E - 0x8C1C0906, // 0268 GETMET R7 R4 K6 - 0x88240916, // 0269 GETMBR R9 R4 K22 - 0x5828004E, // 026A LDCONST R10 K78 - 0x7C1C0600, // 026B CALL R7 3 - 0x80040E00, // 026C RET 1 R7 - 0x70020070, // 026D JMP #02DF - 0x541E0006, // 026E LDINT R7 7 - 0x1C1C0C07, // 026F EQ R7 R6 R7 - 0x781E0005, // 0270 JMPF R7 #0277 - 0x8C1C0906, // 0271 GETMET R7 R4 K6 - 0x8824090C, // 0272 GETMBR R9 R4 K12 - 0x58280005, // 0273 LDCONST R10 K5 - 0x7C1C0600, // 0274 CALL R7 3 - 0x80040E00, // 0275 RET 1 R7 - 0x70020067, // 0276 JMP #02DF - 0x541E0007, // 0277 LDINT R7 8 - 0x1C1C0C07, // 0278 EQ R7 R6 R7 - 0x781E000B, // 0279 JMPF R7 #0286 - 0x8C1C0906, // 027A GETMET R7 R4 K6 - 0x88240916, // 027B GETMBR R9 R4 K22 - 0xB82A2400, // 027C GETNGBL R10 K18 - 0x8C281526, // 027D GETMET R10 R10 K38 - 0x5830004F, // 027E LDCONST R12 K79 - 0x50340200, // 027F LDBOOL R13 1 0 - 0x7C280600, // 0280 CALL R10 3 - 0x94281550, // 0281 GETIDX R10 R10 K80 - 0x94281551, // 0282 GETIDX R10 R10 K81 - 0x7C1C0600, // 0283 CALL R7 3 - 0x80040E00, // 0284 RET 1 R7 - 0x70020058, // 0285 JMP #02DF - 0x541E0008, // 0286 LDINT R7 9 - 0x1C1C0C07, // 0287 EQ R7 R6 R7 - 0x781E0005, // 0288 JMPF R7 #028F - 0x8C1C0906, // 0289 GETMET R7 R4 K6 - 0x8824090C, // 028A GETMBR R9 R4 K12 - 0x58280009, // 028B LDCONST R10 K9 - 0x7C1C0600, // 028C CALL R7 3 - 0x80040E00, // 028D RET 1 R7 - 0x7002004F, // 028E JMP #02DF - 0x541E0009, // 028F LDINT R7 10 - 0x1C1C0C07, // 0290 EQ R7 R6 R7 - 0x781E0015, // 0291 JMPF R7 #02A8 - 0xB81E2400, // 0292 GETNGBL R7 K18 - 0x8C1C0F26, // 0293 GETMET R7 R7 K38 - 0x5824004F, // 0294 LDCONST R9 K79 - 0x50280200, // 0295 LDBOOL R10 1 0 - 0x7C1C0600, // 0296 CALL R7 3 - 0x941C0F50, // 0297 GETIDX R7 R7 K80 - 0x941C0F52, // 0298 GETIDX R7 R7 K82 - 0x8C20071B, // 0299 GETMET R8 R3 K27 - 0x5C280E00, // 029A MOVE R10 R7 - 0x582C0053, // 029B LDCONST R11 K83 - 0x7C200600, // 029C CALL R8 3 - 0x24241105, // 029D GT R9 R8 K5 - 0x78260002, // 029E JMPF R9 #02A2 - 0x04241109, // 029F SUB R9 R8 K9 - 0x40260A09, // 02A0 CONNECT R9 K5 R9 - 0x941C0E09, // 02A1 GETIDX R7 R7 R9 - 0x8C240906, // 02A2 GETMET R9 R4 K6 - 0x882C0916, // 02A3 GETMBR R11 R4 K22 - 0x5C300E00, // 02A4 MOVE R12 R7 - 0x7C240600, // 02A5 CALL R9 3 - 0x80041200, // 02A6 RET 1 R9 - 0x70020036, // 02A7 JMP #02DF - 0x541E000E, // 02A8 LDINT R7 15 - 0x1C1C0C07, // 02A9 EQ R7 R6 R7 - 0x781E000B, // 02AA JMPF R7 #02B7 - 0x8C1C0906, // 02AB GETMET R7 R4 K6 - 0x88240916, // 02AC GETMBR R9 R4 K22 - 0xB82A2400, // 02AD GETNGBL R10 K18 - 0x8C281525, // 02AE GETMET R10 R10 K37 - 0x7C280200, // 02AF CALL R10 1 - 0x8C28151B, // 02B0 GETMET R10 R10 K27 - 0x5830001C, // 02B1 LDCONST R12 K28 - 0x5834001D, // 02B2 LDCONST R13 K29 - 0x7C280600, // 02B3 CALL R10 3 - 0x7C1C0600, // 02B4 CALL R7 3 - 0x80040E00, // 02B5 RET 1 R7 - 0x70020027, // 02B6 JMP #02DF - 0x541E0010, // 02B7 LDINT R7 17 - 0x1C1C0C07, // 02B8 EQ R7 R6 R7 - 0x781E0005, // 02B9 JMPF R7 #02C0 - 0x8C1C0906, // 02BA GETMET R7 R4 K6 - 0x88240910, // 02BB GETMBR R9 R4 K16 - 0x58280009, // 02BC LDCONST R10 K9 - 0x7C1C0600, // 02BD CALL R7 3 - 0x80040E00, // 02BE RET 1 R7 - 0x7002001E, // 02BF JMP #02DF - 0x541E0011, // 02C0 LDINT R7 18 - 0x1C1C0C07, // 02C1 EQ R7 R6 R7 - 0x781E000B, // 02C2 JMPF R7 #02CF - 0x8C1C0906, // 02C3 GETMET R7 R4 K6 - 0x88240916, // 02C4 GETMBR R9 R4 K22 - 0xB82A2400, // 02C5 GETNGBL R10 K18 - 0x8C281525, // 02C6 GETMET R10 R10 K37 - 0x7C280200, // 02C7 CALL R10 1 - 0x8C28151B, // 02C8 GETMET R10 R10 K27 - 0x5830001C, // 02C9 LDCONST R12 K28 - 0x5834001D, // 02CA LDCONST R13 K29 - 0x7C280600, // 02CB CALL R10 3 - 0x7C1C0600, // 02CC CALL R7 3 - 0x80040E00, // 02CD RET 1 R7 - 0x7002000F, // 02CE JMP #02DF - 0x541E0012, // 02CF LDINT R7 19 - 0x1C1C0C07, // 02D0 EQ R7 R6 R7 - 0x781E000C, // 02D1 JMPF R7 #02DF - 0x8C1C090A, // 02D2 GETMET R7 R4 K10 - 0x7C1C0200, // 02D3 CALL R7 1 - 0x8C200F0B, // 02D4 GETMET R8 R7 K11 - 0x58280005, // 02D5 LDCONST R10 K5 - 0x882C090C, // 02D6 GETMBR R11 R4 K12 - 0x5830000F, // 02D7 LDCONST R12 K15 - 0x7C200800, // 02D8 CALL R8 4 - 0x8C200F0B, // 02D9 GETMET R8 R7 K11 - 0x58280009, // 02DA LDCONST R10 K9 - 0x882C090C, // 02DB GETMBR R11 R4 K12 - 0x5830000F, // 02DC LDCONST R12 K15 - 0x7C200800, // 02DD CALL R8 4 - 0x80040E00, // 02DE RET 1 R7 - 0x700200A6, // 02DF JMP #0387 - 0x541E003E, // 02E0 LDINT R7 63 - 0x1C1C0A07, // 02E1 EQ R7 R5 R7 - 0x781E0000, // 02E2 JMPF R7 #02E4 - 0x700200A2, // 02E3 JMP #0387 - 0x541E0029, // 02E4 LDINT R7 42 - 0x1C1C0A07, // 02E5 EQ R7 R5 R7 - 0x781E001D, // 02E6 JMPF R7 #0305 - 0x1C1C0D05, // 02E7 EQ R7 R6 K5 - 0x781E0003, // 02E8 JMPF R7 #02ED - 0x8C1C0911, // 02E9 GETMET R7 R4 K17 - 0x7C1C0200, // 02EA CALL R7 1 - 0x80040E00, // 02EB RET 1 R7 - 0x70020016, // 02EC JMP #0304 - 0x1C1C0D09, // 02ED EQ R7 R6 K9 - 0x781E0005, // 02EE JMPF R7 #02F5 - 0x8C1C0906, // 02EF GETMET R7 R4 K6 - 0x88240910, // 02F0 GETMBR R9 R4 K16 - 0x58280005, // 02F1 LDCONST R10 K5 - 0x7C1C0600, // 02F2 CALL R7 3 - 0x80040E00, // 02F3 RET 1 R7 - 0x7002000E, // 02F4 JMP #0304 - 0x1C1C0D0D, // 02F5 EQ R7 R6 K13 - 0x781E0005, // 02F6 JMPF R7 #02FD - 0x8C1C0906, // 02F7 GETMET R7 R4 K6 - 0x8824090E, // 02F8 GETMBR R9 R4 K14 - 0x58280009, // 02F9 LDCONST R10 K9 - 0x7C1C0600, // 02FA CALL R7 3 - 0x80040E00, // 02FB RET 1 R7 - 0x70020006, // 02FC JMP #0304 - 0x1C1C0D0F, // 02FD EQ R7 R6 K15 - 0x781E0004, // 02FE JMPF R7 #0304 - 0x8C1C0906, // 02FF GETMET R7 R4 K6 - 0x88240918, // 0300 GETMBR R9 R4 K24 - 0x4C280000, // 0301 LDNIL R10 - 0x7C1C0600, // 0302 CALL R7 3 - 0x80040E00, // 0303 RET 1 R7 - 0x70020081, // 0304 JMP #0387 - 0x541E002A, // 0305 LDINT R7 43 - 0x1C1C0A07, // 0306 EQ R7 R5 R7 - 0x781E0016, // 0307 JMPF R7 #031F - 0x1C1C0D05, // 0308 EQ R7 R6 K5 - 0x781E0007, // 0309 JMPF R7 #0312 - 0x8C1C0906, // 030A GETMET R7 R4 K6 - 0x88240916, // 030B GETMBR R9 R4 K22 - 0xB82A2400, // 030C GETNGBL R10 K18 - 0x8C281554, // 030D GETMET R10 R10 K84 - 0x7C280200, // 030E CALL R10 1 - 0x7C1C0600, // 030F CALL R7 3 - 0x80040E00, // 0310 RET 1 R7 - 0x7002000B, // 0311 JMP #031E - 0x1C1C0D09, // 0312 EQ R7 R6 K9 - 0x781E0009, // 0313 JMPF R7 #031E - 0x8C1C0911, // 0314 GETMET R7 R4 K17 - 0x7C1C0200, // 0315 CALL R7 1 - 0x8C200F0B, // 0316 GETMET R8 R7 K11 - 0x4C280000, // 0317 LDNIL R10 - 0x882C0916, // 0318 GETMBR R11 R4 K22 - 0xB8322400, // 0319 GETNGBL R12 K18 - 0x8C301954, // 031A GETMET R12 R12 K84 - 0x7C300200, // 031B CALL R12 1 - 0x7C200800, // 031C CALL R8 4 - 0x80040E00, // 031D RET 1 R7 - 0x70020067, // 031E JMP #0387 - 0x541E002B, // 031F LDINT R7 44 - 0x1C1C0A07, // 0320 EQ R7 R5 R7 - 0x781E001C, // 0321 JMPF R7 #033F - 0x1C1C0D05, // 0322 EQ R7 R6 K5 - 0x781E0005, // 0323 JMPF R7 #032A - 0x8C1C0906, // 0324 GETMET R7 R4 K6 - 0x8824090E, // 0325 GETMBR R9 R4 K14 - 0x58280009, // 0326 LDCONST R10 K9 - 0x7C1C0600, // 0327 CALL R7 3 - 0x80040E00, // 0328 RET 1 R7 - 0x70020013, // 0329 JMP #033E - 0x1C1C0D09, // 032A EQ R7 R6 K9 - 0x781E0005, // 032B JMPF R7 #0332 - 0x8C1C0906, // 032C GETMET R7 R4 K6 - 0x8824090E, // 032D GETMBR R9 R4 K14 - 0x542A0003, // 032E LDINT R10 4 - 0x7C1C0600, // 032F CALL R7 3 - 0x80040E00, // 0330 RET 1 R7 - 0x7002000B, // 0331 JMP #033E - 0x1C1C0D0D, // 0332 EQ R7 R6 K13 - 0x781E0009, // 0333 JMPF R7 #033E - 0x8C1C0911, // 0334 GETMET R7 R4 K17 - 0x7C1C0200, // 0335 CALL R7 1 - 0x8C200F0B, // 0336 GETMET R8 R7 K11 - 0x4C280000, // 0337 LDNIL R10 - 0x8C2C0906, // 0338 GETMET R11 R4 K6 - 0x8834090E, // 0339 GETMBR R13 R4 K14 - 0x543A0003, // 033A LDINT R14 4 - 0x7C2C0600, // 033B CALL R11 3 - 0x7C200600, // 033C CALL R8 3 - 0x80040E00, // 033D RET 1 R7 - 0x70020047, // 033E JMP #0387 - 0x541E0030, // 033F LDINT R7 49 - 0x1C1C0A07, // 0340 EQ R7 R5 R7 - 0x781E0010, // 0341 JMPF R7 #0353 - 0x1C1C0D0F, // 0342 EQ R7 R6 K15 - 0x781E0005, // 0343 JMPF R7 #034A - 0x8C1C0906, // 0344 GETMET R7 R4 K6 - 0x8824090E, // 0345 GETMBR R9 R4 K14 - 0x542A001D, // 0346 LDINT R10 30 - 0x7C1C0600, // 0347 CALL R7 3 - 0x80040E00, // 0348 RET 1 R7 - 0x70020007, // 0349 JMP #0352 - 0x541EFFFB, // 034A LDINT R7 65532 - 0x1C1C0C07, // 034B EQ R7 R6 R7 - 0x781E0004, // 034C JMPF R7 #0352 - 0x8C1C0906, // 034D GETMET R7 R4 K6 - 0x8824092A, // 034E GETMBR R9 R4 K42 - 0x542A0003, // 034F LDINT R10 4 - 0x7C1C0600, // 0350 CALL R7 3 - 0x80040E00, // 0351 RET 1 R7 - 0x70020033, // 0352 JMP #0387 - 0x541E001C, // 0353 LDINT R7 29 - 0x1C1C0A07, // 0354 EQ R7 R5 R7 - 0x781E0028, // 0355 JMPF R7 #037F - 0x1C1C0D0F, // 0356 EQ R7 R6 K15 - 0x781E001D, // 0357 JMPF R7 #0376 - 0x8C1C0911, // 0358 GETMET R7 R4 K17 - 0x7C1C0200, // 0359 CALL R7 1 - 0x88200133, // 035A GETMBR R8 R0 K51 - 0x8C201155, // 035B GETMET R8 R8 K85 - 0x50280200, // 035C LDBOOL R10 1 0 - 0x7C200400, // 035D CALL R8 2 - 0x88240133, // 035E GETMBR R9 R0 K51 - 0x88241356, // 035F GETMBR R9 R9 K86 - 0x60280010, // 0360 GETGBL R10 G16 - 0x5C2C1000, // 0361 MOVE R11 R8 - 0x7C280200, // 0362 CALL R10 1 - 0xA802000C, // 0363 EXBLK 0 #0371 - 0x5C2C1400, // 0364 MOVE R11 R10 - 0x7C2C0000, // 0365 CALL R11 0 + 0x58280009, // 01F6 LDCONST R10 K9 + 0x70020000, // 01F7 JMP #01F9 + 0x58280005, // 01F8 LDCONST R10 K5 + 0x8C2C0706, // 01F9 GETMET R11 R3 K6 + 0x88340B0E, // 01FA GETMBR R13 R5 K14 + 0x5C381400, // 01FB MOVE R14 R10 + 0x7C2C0600, // 01FC CALL R11 3 + 0x80041600, // 01FD RET 1 R11 + 0x70020026, // 01FE JMP #0226 + 0x1C200F09, // 01FF EQ R8 R7 K9 + 0x78220011, // 0200 JMPF R8 #0213 + 0x88200135, // 0201 GETMBR R8 R0 K53 + 0x8820114A, // 0202 GETMBR R8 R8 K74 + 0x4C240000, // 0203 LDNIL R9 + 0x20241009, // 0204 NE R9 R8 R9 + 0x78260006, // 0205 JMPF R9 #020D + 0x8C240706, // 0206 GETMET R9 R3 K6 + 0x882C0B0C, // 0207 GETMBR R11 R5 K12 + 0x8C30113B, // 0208 GETMET R12 R8 K59 + 0x7C300200, // 0209 CALL R12 1 + 0x7C240600, // 020A CALL R9 3 + 0x80041200, // 020B RET 1 R9 + 0x70020004, // 020C JMP #0212 + 0x8C240706, // 020D GETMET R9 R3 K6 + 0x882C0B18, // 020E GETMBR R11 R5 K24 + 0x4C300000, // 020F LDNIL R12 + 0x7C240600, // 0210 CALL R9 3 + 0x80041200, // 0211 RET 1 R9 + 0x70020012, // 0212 JMP #0226 + 0x1C200F0D, // 0213 EQ R8 R7 K13 + 0x78220010, // 0214 JMPF R8 #0226 + 0x88200135, // 0215 GETMBR R8 R0 K53 + 0x8820114A, // 0216 GETMBR R8 R8 K74 + 0x4C240000, // 0217 LDNIL R9 + 0x20241009, // 0218 NE R9 R8 R9 + 0x78260006, // 0219 JMPF R9 #0221 + 0x8C240706, // 021A GETMET R9 R3 K6 + 0x882C0B0C, // 021B GETMBR R11 R5 K12 + 0x8C301140, // 021C GETMET R12 R8 K64 + 0x7C300200, // 021D CALL R12 1 + 0x7C240600, // 021E CALL R9 3 + 0x80041200, // 021F RET 1 R9 + 0x70020004, // 0220 JMP #0226 + 0x8C240706, // 0221 GETMET R9 R3 K6 + 0x882C0B18, // 0222 GETMBR R11 R5 K24 + 0x4C300000, // 0223 LDNIL R12 + 0x7C240600, // 0224 CALL R9 3 + 0x80041200, // 0225 RET 1 R9 + 0x70020166, // 0226 JMP #038E + 0x54220027, // 0227 LDINT R8 40 + 0x1C200C08, // 0228 EQ R8 R6 R8 + 0x782200BA, // 0229 JMPF R8 #02E5 + 0x8C200133, // 022A GETMET R8 R0 K51 + 0x88280534, // 022B GETMBR R10 R2 K52 + 0x7C200400, // 022C CALL R8 2 + 0x1C200F05, // 022D EQ R8 R7 K5 + 0x78220005, // 022E JMPF R8 #0235 + 0x8C200706, // 022F GETMET R8 R3 K6 + 0x88280B0C, // 0230 GETMBR R10 R5 K12 + 0x582C0009, // 0231 LDCONST R11 K9 + 0x7C200600, // 0232 CALL R8 3 + 0x80041000, // 0233 RET 1 R8 + 0x700200AE, // 0234 JMP #02E4 + 0x1C200F09, // 0235 EQ R8 R7 K9 + 0x78220005, // 0236 JMPF R8 #023D + 0x8C200706, // 0237 GETMET R8 R3 K6 + 0x88280B16, // 0238 GETMBR R10 R5 K22 + 0x582C004B, // 0239 LDCONST R11 K75 + 0x7C200600, // 023A CALL R8 3 + 0x80041000, // 023B RET 1 R8 + 0x700200A6, // 023C JMP #02E4 + 0x1C200F0D, // 023D EQ R8 R7 K13 + 0x78220006, // 023E JMPF R8 #0246 + 0x8C200706, // 023F GETMET R8 R3 K6 + 0x88280B0C, // 0240 GETMBR R10 R5 K12 + 0x882C0135, // 0241 GETMBR R11 R0 K53 + 0x882C174C, // 0242 GETMBR R11 R11 K76 + 0x7C200600, // 0243 CALL R8 3 + 0x80041000, // 0244 RET 1 R8 + 0x7002009D, // 0245 JMP #02E4 + 0x1C200F0F, // 0246 EQ R8 R7 K15 + 0x7822000A, // 0247 JMPF R8 #0253 + 0x8C200706, // 0248 GETMET R8 R3 K6 + 0x88280B16, // 0249 GETMBR R10 R5 K22 + 0xB82E2400, // 024A GETNGBL R11 K18 + 0x8C2C1726, // 024B GETMET R11 R11 K38 + 0x5834004D, // 024C LDCONST R13 K77 + 0x50380200, // 024D LDBOOL R14 1 0 + 0x7C2C0600, // 024E CALL R11 3 + 0x942C174D, // 024F GETIDX R11 R11 K77 + 0x7C200600, // 0250 CALL R8 3 + 0x80041000, // 0251 RET 1 R8 + 0x70020090, // 0252 JMP #02E4 + 0x54220003, // 0253 LDINT R8 4 + 0x1C200E08, // 0254 EQ R8 R7 R8 + 0x78220005, // 0255 JMPF R8 #025C + 0x8C200706, // 0256 GETMET R8 R3 K6 + 0x88280B0C, // 0257 GETMBR R10 R5 K12 + 0x542E7FFF, // 0258 LDINT R11 32768 + 0x7C200600, // 0259 CALL R8 3 + 0x80041000, // 025A RET 1 R8 + 0x70020087, // 025B JMP #02E4 + 0x54220004, // 025C LDINT R8 5 + 0x1C200E08, // 025D EQ R8 R7 R8 + 0x7822000A, // 025E JMPF R8 #026A + 0x8C200706, // 025F GETMET R8 R3 K6 + 0x88280B16, // 0260 GETMBR R10 R5 K22 + 0xB82E2400, // 0261 GETNGBL R11 K18 + 0x8C2C1726, // 0262 GETMET R11 R11 K38 + 0x5834004E, // 0263 LDCONST R13 K78 + 0x50380200, // 0264 LDBOOL R14 1 0 + 0x7C2C0600, // 0265 CALL R11 3 + 0x942C174F, // 0266 GETIDX R11 R11 K79 + 0x7C200600, // 0267 CALL R8 3 + 0x80041000, // 0268 RET 1 R8 + 0x70020079, // 0269 JMP #02E4 + 0x54220005, // 026A LDINT R8 6 + 0x1C200E08, // 026B EQ R8 R7 R8 + 0x78220005, // 026C JMPF R8 #0273 + 0x8C200706, // 026D GETMET R8 R3 K6 + 0x88280B16, // 026E GETMBR R10 R5 K22 + 0x582C0050, // 026F LDCONST R11 K80 + 0x7C200600, // 0270 CALL R8 3 + 0x80041000, // 0271 RET 1 R8 + 0x70020070, // 0272 JMP #02E4 + 0x54220006, // 0273 LDINT R8 7 + 0x1C200E08, // 0274 EQ R8 R7 R8 + 0x78220005, // 0275 JMPF R8 #027C + 0x8C200706, // 0276 GETMET R8 R3 K6 + 0x88280B0C, // 0277 GETMBR R10 R5 K12 + 0x582C0005, // 0278 LDCONST R11 K5 + 0x7C200600, // 0279 CALL R8 3 + 0x80041000, // 027A RET 1 R8 + 0x70020067, // 027B JMP #02E4 + 0x54220007, // 027C LDINT R8 8 + 0x1C200E08, // 027D EQ R8 R7 R8 + 0x7822000B, // 027E JMPF R8 #028B + 0x8C200706, // 027F GETMET R8 R3 K6 + 0x88280B16, // 0280 GETMBR R10 R5 K22 + 0xB82E2400, // 0281 GETNGBL R11 K18 + 0x8C2C1726, // 0282 GETMET R11 R11 K38 + 0x58340051, // 0283 LDCONST R13 K81 + 0x50380200, // 0284 LDBOOL R14 1 0 + 0x7C2C0600, // 0285 CALL R11 3 + 0x942C1752, // 0286 GETIDX R11 R11 K82 + 0x942C1753, // 0287 GETIDX R11 R11 K83 + 0x7C200600, // 0288 CALL R8 3 + 0x80041000, // 0289 RET 1 R8 + 0x70020058, // 028A JMP #02E4 + 0x54220008, // 028B LDINT R8 9 + 0x1C200E08, // 028C EQ R8 R7 R8 + 0x78220005, // 028D JMPF R8 #0294 + 0x8C200706, // 028E GETMET R8 R3 K6 + 0x88280B0C, // 028F GETMBR R10 R5 K12 + 0x582C0009, // 0290 LDCONST R11 K9 + 0x7C200600, // 0291 CALL R8 3 + 0x80041000, // 0292 RET 1 R8 + 0x7002004F, // 0293 JMP #02E4 + 0x54220009, // 0294 LDINT R8 10 + 0x1C200E08, // 0295 EQ R8 R7 R8 + 0x78220015, // 0296 JMPF R8 #02AD + 0xB8222400, // 0297 GETNGBL R8 K18 + 0x8C201126, // 0298 GETMET R8 R8 K38 + 0x58280051, // 0299 LDCONST R10 K81 + 0x502C0200, // 029A LDBOOL R11 1 0 + 0x7C200600, // 029B CALL R8 3 + 0x94201152, // 029C GETIDX R8 R8 K82 + 0x94201154, // 029D GETIDX R8 R8 K84 + 0x8C24091B, // 029E GETMET R9 R4 K27 + 0x5C2C1000, // 029F MOVE R11 R8 + 0x58300055, // 02A0 LDCONST R12 K85 + 0x7C240600, // 02A1 CALL R9 3 + 0x24281305, // 02A2 GT R10 R9 K5 + 0x782A0002, // 02A3 JMPF R10 #02A7 + 0x04281309, // 02A4 SUB R10 R9 K9 + 0x402A0A0A, // 02A5 CONNECT R10 K5 R10 + 0x9420100A, // 02A6 GETIDX R8 R8 R10 + 0x8C280706, // 02A7 GETMET R10 R3 K6 + 0x88300B16, // 02A8 GETMBR R12 R5 K22 + 0x5C341000, // 02A9 MOVE R13 R8 + 0x7C280600, // 02AA CALL R10 3 + 0x80041400, // 02AB RET 1 R10 + 0x70020036, // 02AC JMP #02E4 + 0x5422000E, // 02AD LDINT R8 15 + 0x1C200E08, // 02AE EQ R8 R7 R8 + 0x7822000B, // 02AF JMPF R8 #02BC + 0x8C200706, // 02B0 GETMET R8 R3 K6 + 0x88280B16, // 02B1 GETMBR R10 R5 K22 + 0xB82E2400, // 02B2 GETNGBL R11 K18 + 0x8C2C1725, // 02B3 GETMET R11 R11 K37 + 0x7C2C0200, // 02B4 CALL R11 1 + 0x8C2C171B, // 02B5 GETMET R11 R11 K27 + 0x5834001C, // 02B6 LDCONST R13 K28 + 0x5838001D, // 02B7 LDCONST R14 K29 + 0x7C2C0600, // 02B8 CALL R11 3 + 0x7C200600, // 02B9 CALL R8 3 + 0x80041000, // 02BA RET 1 R8 + 0x70020027, // 02BB JMP #02E4 + 0x54220010, // 02BC LDINT R8 17 + 0x1C200E08, // 02BD EQ R8 R7 R8 + 0x78220005, // 02BE JMPF R8 #02C5 + 0x8C200706, // 02BF GETMET R8 R3 K6 + 0x88280B10, // 02C0 GETMBR R10 R5 K16 + 0x582C0009, // 02C1 LDCONST R11 K9 + 0x7C200600, // 02C2 CALL R8 3 + 0x80041000, // 02C3 RET 1 R8 + 0x7002001E, // 02C4 JMP #02E4 + 0x54220011, // 02C5 LDINT R8 18 + 0x1C200E08, // 02C6 EQ R8 R7 R8 + 0x7822000B, // 02C7 JMPF R8 #02D4 + 0x8C200706, // 02C8 GETMET R8 R3 K6 + 0x88280B16, // 02C9 GETMBR R10 R5 K22 + 0xB82E2400, // 02CA GETNGBL R11 K18 + 0x8C2C1725, // 02CB GETMET R11 R11 K37 + 0x7C2C0200, // 02CC CALL R11 1 + 0x8C2C171B, // 02CD GETMET R11 R11 K27 + 0x5834001C, // 02CE LDCONST R13 K28 + 0x5838001D, // 02CF LDCONST R14 K29 + 0x7C2C0600, // 02D0 CALL R11 3 + 0x7C200600, // 02D1 CALL R8 3 + 0x80041000, // 02D2 RET 1 R8 + 0x7002000F, // 02D3 JMP #02E4 + 0x54220012, // 02D4 LDINT R8 19 + 0x1C200E08, // 02D5 EQ R8 R7 R8 + 0x7822000C, // 02D6 JMPF R8 #02E4 + 0x8C200B0A, // 02D7 GETMET R8 R5 K10 + 0x7C200200, // 02D8 CALL R8 1 + 0x8C24110B, // 02D9 GETMET R9 R8 K11 + 0x582C0005, // 02DA LDCONST R11 K5 + 0x88300B0C, // 02DB GETMBR R12 R5 K12 + 0x5834000F, // 02DC LDCONST R13 K15 + 0x7C240800, // 02DD CALL R9 4 + 0x8C24110B, // 02DE GETMET R9 R8 K11 + 0x582C0009, // 02DF LDCONST R11 K9 + 0x88300B0C, // 02E0 GETMBR R12 R5 K12 + 0x5834000F, // 02E1 LDCONST R13 K15 + 0x7C240800, // 02E2 CALL R9 4 + 0x80041000, // 02E3 RET 1 R8 + 0x700200A8, // 02E4 JMP #038E + 0x5422003E, // 02E5 LDINT R8 63 + 0x1C200C08, // 02E6 EQ R8 R6 R8 + 0x78220000, // 02E7 JMPF R8 #02E9 + 0x700200A4, // 02E8 JMP #038E + 0x54220029, // 02E9 LDINT R8 42 + 0x1C200C08, // 02EA EQ R8 R6 R8 + 0x7822001D, // 02EB JMPF R8 #030A + 0x1C200F05, // 02EC EQ R8 R7 K5 + 0x78220003, // 02ED JMPF R8 #02F2 + 0x8C200B11, // 02EE GETMET R8 R5 K17 + 0x7C200200, // 02EF CALL R8 1 + 0x80041000, // 02F0 RET 1 R8 + 0x70020016, // 02F1 JMP #0309 + 0x1C200F09, // 02F2 EQ R8 R7 K9 + 0x78220005, // 02F3 JMPF R8 #02FA + 0x8C200706, // 02F4 GETMET R8 R3 K6 + 0x88280B10, // 02F5 GETMBR R10 R5 K16 + 0x582C0005, // 02F6 LDCONST R11 K5 + 0x7C200600, // 02F7 CALL R8 3 + 0x80041000, // 02F8 RET 1 R8 + 0x7002000E, // 02F9 JMP #0309 + 0x1C200F0D, // 02FA EQ R8 R7 K13 + 0x78220005, // 02FB JMPF R8 #0302 + 0x8C200706, // 02FC GETMET R8 R3 K6 + 0x88280B0E, // 02FD GETMBR R10 R5 K14 + 0x582C0009, // 02FE LDCONST R11 K9 + 0x7C200600, // 02FF CALL R8 3 + 0x80041000, // 0300 RET 1 R8 + 0x70020006, // 0301 JMP #0309 + 0x1C200F0F, // 0302 EQ R8 R7 K15 + 0x78220004, // 0303 JMPF R8 #0309 + 0x8C200706, // 0304 GETMET R8 R3 K6 + 0x88280B18, // 0305 GETMBR R10 R5 K24 + 0x4C2C0000, // 0306 LDNIL R11 + 0x7C200600, // 0307 CALL R8 3 + 0x80041000, // 0308 RET 1 R8 + 0x70020083, // 0309 JMP #038E + 0x5422002A, // 030A LDINT R8 43 + 0x1C200C08, // 030B EQ R8 R6 R8 + 0x78220016, // 030C JMPF R8 #0324 + 0x1C200F05, // 030D EQ R8 R7 K5 + 0x78220007, // 030E JMPF R8 #0317 + 0x8C200706, // 030F GETMET R8 R3 K6 + 0x88280B16, // 0310 GETMBR R10 R5 K22 + 0xB82E2400, // 0311 GETNGBL R11 K18 + 0x8C2C1756, // 0312 GETMET R11 R11 K86 + 0x7C2C0200, // 0313 CALL R11 1 + 0x7C200600, // 0314 CALL R8 3 + 0x80041000, // 0315 RET 1 R8 + 0x7002000B, // 0316 JMP #0323 + 0x1C200F09, // 0317 EQ R8 R7 K9 + 0x78220009, // 0318 JMPF R8 #0323 + 0x8C200B11, // 0319 GETMET R8 R5 K17 + 0x7C200200, // 031A CALL R8 1 + 0x8C24110B, // 031B GETMET R9 R8 K11 + 0x4C2C0000, // 031C LDNIL R11 + 0x88300B16, // 031D GETMBR R12 R5 K22 + 0xB8362400, // 031E GETNGBL R13 K18 + 0x8C341B56, // 031F GETMET R13 R13 K86 + 0x7C340200, // 0320 CALL R13 1 + 0x7C240800, // 0321 CALL R9 4 + 0x80041000, // 0322 RET 1 R8 + 0x70020069, // 0323 JMP #038E + 0x5422002B, // 0324 LDINT R8 44 + 0x1C200C08, // 0325 EQ R8 R6 R8 + 0x7822001C, // 0326 JMPF R8 #0344 + 0x1C200F05, // 0327 EQ R8 R7 K5 + 0x78220005, // 0328 JMPF R8 #032F + 0x8C200706, // 0329 GETMET R8 R3 K6 + 0x88280B0E, // 032A GETMBR R10 R5 K14 + 0x582C0009, // 032B LDCONST R11 K9 + 0x7C200600, // 032C CALL R8 3 + 0x80041000, // 032D RET 1 R8 + 0x70020013, // 032E JMP #0343 + 0x1C200F09, // 032F EQ R8 R7 K9 + 0x78220005, // 0330 JMPF R8 #0337 + 0x8C200706, // 0331 GETMET R8 R3 K6 + 0x88280B0E, // 0332 GETMBR R10 R5 K14 + 0x542E0003, // 0333 LDINT R11 4 + 0x7C200600, // 0334 CALL R8 3 + 0x80041000, // 0335 RET 1 R8 + 0x7002000B, // 0336 JMP #0343 + 0x1C200F0D, // 0337 EQ R8 R7 K13 + 0x78220009, // 0338 JMPF R8 #0343 + 0x8C200B11, // 0339 GETMET R8 R5 K17 + 0x7C200200, // 033A CALL R8 1 + 0x8C24110B, // 033B GETMET R9 R8 K11 + 0x4C2C0000, // 033C LDNIL R11 + 0x8C300B57, // 033D GETMET R12 R5 K87 + 0x88380B0E, // 033E GETMBR R14 R5 K14 + 0x543E0003, // 033F LDINT R15 4 + 0x7C300600, // 0340 CALL R12 3 + 0x7C240600, // 0341 CALL R9 3 + 0x80041000, // 0342 RET 1 R8 + 0x70020049, // 0343 JMP #038E + 0x54220030, // 0344 LDINT R8 49 + 0x1C200C08, // 0345 EQ R8 R6 R8 + 0x78220010, // 0346 JMPF R8 #0358 + 0x1C200F0F, // 0347 EQ R8 R7 K15 + 0x78220005, // 0348 JMPF R8 #034F + 0x8C200706, // 0349 GETMET R8 R3 K6 + 0x88280B0E, // 034A GETMBR R10 R5 K14 + 0x542E001D, // 034B LDINT R11 30 + 0x7C200600, // 034C CALL R8 3 + 0x80041000, // 034D RET 1 R8 + 0x70020007, // 034E JMP #0357 + 0x5422FFFB, // 034F LDINT R8 65532 + 0x1C200E08, // 0350 EQ R8 R7 R8 + 0x78220004, // 0351 JMPF R8 #0357 + 0x8C200706, // 0352 GETMET R8 R3 K6 + 0x88280B2A, // 0353 GETMBR R10 R5 K42 + 0x542E0003, // 0354 LDINT R11 4 + 0x7C200600, // 0355 CALL R8 3 + 0x80041000, // 0356 RET 1 R8 + 0x70020035, // 0357 JMP #038E + 0x5422001C, // 0358 LDINT R8 29 + 0x1C200C08, // 0359 EQ R8 R6 R8 + 0x78220029, // 035A JMPF R8 #0385 + 0x1C200F0F, // 035B EQ R8 R7 K15 + 0x7822001D, // 035C JMPF R8 #037B + 0x8C200B11, // 035D GETMET R8 R5 K17 + 0x7C200200, // 035E CALL R8 1 + 0x88240135, // 035F GETMBR R9 R0 K53 + 0x8C241358, // 0360 GETMET R9 R9 K88 + 0x502C0200, // 0361 LDBOOL R11 1 0 + 0x7C240400, // 0362 CALL R9 2 + 0x88280135, // 0363 GETMBR R10 R0 K53 + 0x88281559, // 0364 GETMBR R10 R10 K89 + 0x602C0010, // 0365 GETGBL R11 G16 0x5C301200, // 0366 MOVE R12 R9 - 0x78320002, // 0367 JMPF R12 #036B - 0x5432FEFF, // 0368 LDINT R12 65280 - 0x1430160C, // 0369 LT R12 R11 R12 - 0x78320004, // 036A JMPF R12 #0370 - 0x8C300F0B, // 036B GETMET R12 R7 K11 - 0x4C380000, // 036C LDNIL R14 - 0x883C090C, // 036D GETMBR R15 R4 K12 - 0x5C401600, // 036E MOVE R16 R11 - 0x7C300800, // 036F CALL R12 4 - 0x7001FFF2, // 0370 JMP #0364 - 0x5828003A, // 0371 LDCONST R10 K58 - 0xAC280200, // 0372 CATCH R10 1 0 - 0xB0080000, // 0373 RAISE 2 R0 R0 - 0x80040E00, // 0374 RET 1 R7 - 0x70020007, // 0375 JMP #037E - 0x601C0003, // 0376 GETGBL R7 G3 - 0x5C200000, // 0377 MOVE R8 R0 - 0x7C1C0200, // 0378 CALL R7 1 - 0x8C1C0F57, // 0379 GETMET R7 R7 K87 - 0x5C240200, // 037A MOVE R9 R1 - 0x5C280400, // 037B MOVE R10 R2 - 0x7C1C0600, // 037C CALL R7 3 - 0x80040E00, // 037D RET 1 R7 - 0x70020007, // 037E JMP #0387 - 0x601C0003, // 037F GETGBL R7 G3 - 0x5C200000, // 0380 MOVE R8 R0 - 0x7C1C0200, // 0381 CALL R7 1 - 0x8C1C0F57, // 0382 GETMET R7 R7 K87 - 0x5C240200, // 0383 MOVE R9 R1 - 0x5C280400, // 0384 MOVE R10 R2 - 0x7C1C0600, // 0385 CALL R7 3 - 0x80040E00, // 0386 RET 1 R7 - 0x80000000, // 0387 RET 0 + 0x7C2C0200, // 0367 CALL R11 1 + 0xA802000C, // 0368 EXBLK 0 #0376 + 0x5C301600, // 0369 MOVE R12 R11 + 0x7C300000, // 036A CALL R12 0 + 0x5C341400, // 036B MOVE R13 R10 + 0x78360002, // 036C JMPF R13 #0370 + 0x5436FEFF, // 036D LDINT R13 65280 + 0x1434180D, // 036E LT R13 R12 R13 + 0x78360004, // 036F JMPF R13 #0375 + 0x8C34110B, // 0370 GETMET R13 R8 K11 + 0x4C3C0000, // 0371 LDNIL R15 + 0x88400B0C, // 0372 GETMBR R16 R5 K12 + 0x5C441800, // 0373 MOVE R17 R12 + 0x7C340800, // 0374 CALL R13 4 + 0x7001FFF2, // 0375 JMP #0369 + 0x582C003C, // 0376 LDCONST R11 K60 + 0xAC2C0200, // 0377 CATCH R11 1 0 + 0xB0080000, // 0378 RAISE 2 R0 R0 + 0x80041000, // 0379 RET 1 R8 + 0x70020008, // 037A JMP #0384 + 0x60200003, // 037B GETGBL R8 G3 + 0x5C240000, // 037C MOVE R9 R0 + 0x7C200200, // 037D CALL R8 1 + 0x8C20115A, // 037E GETMET R8 R8 K90 + 0x5C280200, // 037F MOVE R10 R1 + 0x5C2C0400, // 0380 MOVE R11 R2 + 0x5C300600, // 0381 MOVE R12 R3 + 0x7C200800, // 0382 CALL R8 4 + 0x80041000, // 0383 RET 1 R8 + 0x70020008, // 0384 JMP #038E + 0x60200003, // 0385 GETGBL R8 G3 + 0x5C240000, // 0386 MOVE R9 R0 + 0x7C200200, // 0387 CALL R8 1 + 0x8C20115A, // 0388 GETMET R8 R8 K90 + 0x5C280200, // 0389 MOVE R10 R1 + 0x5C2C0400, // 038A MOVE R11 R2 + 0x5C300600, // 038B MOVE R12 R3 + 0x7C200800, // 038C CALL R8 4 + 0x80041000, // 038D RET 1 R8 + 0x80000000, // 038E RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h index c52c654e9..3382434a3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h @@ -79,8 +79,8 @@ be_local_closure(Matter_Plugin_Sensor_Contact_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -94,7 +94,7 @@ be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_contact), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_nested_str_weak(U4), @@ -103,59 +103,60 @@ be_local_closure(Matter_Plugin_Sensor_Contact_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[52]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0044, // 0004 LDINT R6 69 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0023, // 0006 JMPF R6 #002B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[53]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0044, // 0004 LDINT R7 69 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0023, // 0006 JMPF R7 #002B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020010, // 0018 JMP #002A - 0x541AFFFB, // 0019 LDINT R6 65532 - 0x1C180A06, // 001A EQ R6 R5 R6 - 0x781A0005, // 001B JMPF R6 #0022 - 0x8C180706, // 001C GETMET R6 R3 K6 - 0x88200709, // 001D GETMBR R8 R3 K9 - 0x58240004, // 001E LDCONST R9 K4 - 0x7C180600, // 001F CALL R6 3 - 0x80040C00, // 0020 RET 1 R6 + 0x541EFFFB, // 0019 LDINT R7 65532 + 0x1C1C0C07, // 001A EQ R7 R6 R7 + 0x781E0005, // 001B JMPF R7 #0022 + 0x8C1C0706, // 001C GETMET R7 R3 K6 + 0x88240909, // 001D GETMBR R9 R4 K9 + 0x58280004, // 001E LDCONST R10 K4 + 0x7C1C0600, // 001F CALL R7 3 + 0x80040E00, // 0020 RET 1 R7 0x70020007, // 0021 JMP #002A - 0x541AFFFC, // 0022 LDINT R6 65533 - 0x1C180A06, // 0023 EQ R6 R5 R6 - 0x781A0004, // 0024 JMPF R6 #002A - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200709, // 0026 GETMBR R8 R3 K9 - 0x5824000A, // 0027 LDCONST R9 K10 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 - 0x70020007, // 002A JMP #0033 - 0x60180003, // 002B GETGBL R6 G3 - 0x5C1C0000, // 002C MOVE R7 R0 - 0x7C180200, // 002D CALL R6 1 - 0x8C180D0B, // 002E GETMET R6 R6 K11 - 0x5C200200, // 002F MOVE R8 R1 - 0x5C240400, // 0030 MOVE R9 R2 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 - 0x80000000, // 0033 RET 0 + 0x541EFFFC, // 0022 LDINT R7 65533 + 0x1C1C0C07, // 0023 EQ R7 R6 R7 + 0x781E0004, // 0024 JMPF R7 #002A + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240909, // 0026 GETMBR R9 R4 K9 + 0x5828000A, // 0027 LDCONST R10 K10 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 + 0x70020008, // 002A JMP #0034 + 0x601C0003, // 002B GETGBL R7 G3 + 0x5C200000, // 002C MOVE R8 R0 + 0x7C1C0200, // 002D CALL R7 1 + 0x8C1C0F0B, // 002E GETMET R7 R7 K11 + 0x5C240200, // 002F MOVE R9 R1 + 0x5C280400, // 0030 MOVE R10 R2 + 0x5C2C0600, // 0031 MOVE R11 R3 + 0x7C1C0800, // 0032 CALL R7 4 + 0x80040E00, // 0033 RET 1 R7 + 0x80000000, // 0034 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h index 3cb1f9110..77df755f2 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Humidity.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Sensor_Humidity; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -26,7 +26,7 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -37,77 +37,78 @@ be_local_closure(Matter_Plugin_Sensor_Humidity_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0404, // 0004 LDINT R6 1029 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0404, // 0004 LDINT R7 1029 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x542601F3, // 001F LDINT R9 500 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x542A01F3, // 001F LDINT R10 500 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x5426270F, // 0027 LDINT R9 10000 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542A270F, // 0027 LDINT R10 10000 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h index 01b62792a..6da510376 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Illuminance.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Sensor_Illuminance; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -26,7 +26,7 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -37,77 +37,78 @@ be_local_closure(Matter_Plugin_Sensor_Illuminance_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A03FF, // 0004 LDINT R6 1024 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E03FF, // 0004 LDINT R7 1024 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x58240009, // 001F LDCONST R9 K9 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x58280009, // 001F LDCONST R10 K9 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x5426FFFD, // 0027 LDINT R9 65534 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542AFFFD, // 0027 LDINT R10 65534 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 82b3c1363..18a99659f 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -79,8 +79,8 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration, /* name * ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -94,7 +94,7 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_occupancy), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(U1), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -105,75 +105,76 @@ be_local_closure(Matter_Plugin_Sensor_Occupancy_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0405, // 0004 LDINT R6 1030 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0033, // 0006 JMPF R6 #003B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[69]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0405, // 0004 LDINT R7 1030 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0033, // 0006 JMPF R7 #003B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020020, // 0018 JMP #003A - 0x1C180B09, // 0019 EQ R6 R5 K9 - 0x781A0005, // 001A JMPF R6 #0021 - 0x8C180706, // 001B GETMET R6 R3 K6 - 0x88200707, // 001C GETMBR R8 R3 K7 - 0x5824000A, // 001D LDCONST R9 K10 - 0x7C180600, // 001E CALL R6 3 - 0x80040C00, // 001F RET 1 R6 + 0x1C1C0D09, // 0019 EQ R7 R6 K9 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0706, // 001B GETMET R7 R3 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x5828000A, // 001D LDCONST R10 K10 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 0x70020018, // 0020 JMP #003A - 0x1C180B0B, // 0021 EQ R6 R5 K11 - 0x781A0005, // 0022 JMPF R6 #0029 - 0x8C180706, // 0023 GETMET R6 R3 K6 - 0x88200707, // 0024 GETMBR R8 R3 K7 - 0x58240004, // 0025 LDCONST R9 K4 - 0x7C180600, // 0026 CALL R6 3 - 0x80040C00, // 0027 RET 1 R6 + 0x1C1C0D0B, // 0021 EQ R7 R6 K11 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0706, // 0023 GETMET R7 R3 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x58280004, // 0025 LDCONST R10 K4 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 0x70020010, // 0028 JMP #003A - 0x541AFFFB, // 0029 LDINT R6 65532 - 0x1C180A06, // 002A EQ R6 R5 R6 - 0x781A0005, // 002B JMPF R6 #0032 - 0x8C180706, // 002C GETMET R6 R3 K6 - 0x8820070C, // 002D GETMBR R8 R3 K12 - 0x58240004, // 002E LDCONST R9 K4 - 0x7C180600, // 002F CALL R6 3 - 0x80040C00, // 0030 RET 1 R6 + 0x541EFFFB, // 0029 LDINT R7 65532 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0706, // 002C GETMET R7 R3 K6 + 0x8824090C, // 002D GETMBR R9 R4 K12 + 0x58280004, // 002E LDCONST R10 K4 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 0x70020007, // 0031 JMP #003A - 0x541AFFFC, // 0032 LDINT R6 65533 - 0x1C180A06, // 0033 EQ R6 R5 R6 - 0x781A0004, // 0034 JMPF R6 #003A - 0x8C180706, // 0035 GETMET R6 R3 K6 - 0x8820070C, // 0036 GETMBR R8 R3 K12 - 0x5824000A, // 0037 LDCONST R9 K10 - 0x7C180600, // 0038 CALL R6 3 - 0x80040C00, // 0039 RET 1 R6 - 0x70020007, // 003A JMP #0043 - 0x60180003, // 003B GETGBL R6 G3 - 0x5C1C0000, // 003C MOVE R7 R0 - 0x7C180200, // 003D CALL R6 1 - 0x8C180D0D, // 003E GETMET R6 R6 K13 - 0x5C200200, // 003F MOVE R8 R1 - 0x5C240400, // 0040 MOVE R9 R2 - 0x7C180600, // 0041 CALL R6 3 - 0x80040C00, // 0042 RET 1 R6 - 0x80000000, // 0043 RET 0 + 0x541EFFFC, // 0032 LDINT R7 65533 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0004, // 0034 JMPF R7 #003A + 0x8C1C0706, // 0035 GETMET R7 R3 K6 + 0x8824090C, // 0036 GETMBR R9 R4 K12 + 0x5828000A, // 0037 LDCONST R10 K10 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020008, // 003A JMP #0044 + 0x601C0003, // 003B GETGBL R7 G3 + 0x5C200000, // 003C MOVE R8 R0 + 0x7C1C0200, // 003D CALL R7 1 + 0x8C1C0F0D, // 003E GETMET R7 R7 K13 + 0x5C240200, // 003F MOVE R9 R1 + 0x5C280400, // 0040 MOVE R10 R2 + 0x5C2C0600, // 0041 MOVE R11 R3 + 0x7C1C0800, // 0042 CALL R7 4 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index c5aa42dbb..5e5c6a054 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -79,8 +79,8 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_parse_configuration, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -94,7 +94,7 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_const_int(0), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(BOOL), /* K8 */ be_nested_str_weak(shadow_onoff), /* K9 */ be_nested_str_weak(U4), @@ -102,51 +102,52 @@ be_local_closure(Matter_Plugin_Sensor_OnOff_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[44]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0005, // 0004 LDINT R6 6 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A001B, // 0006 JMPF R6 #0023 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x1C180B05, // 0009 EQ R6 R5 K5 - 0x781A0005, // 000A JMPF R6 #0011 - 0x8C180706, // 000B GETMET R6 R3 K6 - 0x88200707, // 000C GETMBR R8 R3 K7 - 0x88240108, // 000D GETMBR R9 R0 K8 - 0x7C180600, // 000E CALL R6 3 - 0x80040C00, // 000F RET 1 R6 + ( &(const binstruction[45]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0005, // 0004 LDINT R7 6 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E001B, // 0006 JMPF R7 #0023 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x1C1C0D05, // 0009 EQ R7 R6 K5 + 0x781E0005, // 000A JMPF R7 #0011 + 0x8C1C0706, // 000B GETMET R7 R3 K6 + 0x88240907, // 000C GETMBR R9 R4 K7 + 0x88280108, // 000D GETMBR R10 R0 K8 + 0x7C1C0600, // 000E CALL R7 3 + 0x80040E00, // 000F RET 1 R7 0x70020010, // 0010 JMP #0022 - 0x541AFFFB, // 0011 LDINT R6 65532 - 0x1C180A06, // 0012 EQ R6 R5 R6 - 0x781A0005, // 0013 JMPF R6 #001A - 0x8C180706, // 0014 GETMET R6 R3 K6 - 0x88200709, // 0015 GETMBR R8 R3 K9 - 0x58240005, // 0016 LDCONST R9 K5 - 0x7C180600, // 0017 CALL R6 3 - 0x80040C00, // 0018 RET 1 R6 + 0x541EFFFB, // 0011 LDINT R7 65532 + 0x1C1C0C07, // 0012 EQ R7 R6 R7 + 0x781E0005, // 0013 JMPF R7 #001A + 0x8C1C0706, // 0014 GETMET R7 R3 K6 + 0x88240909, // 0015 GETMBR R9 R4 K9 + 0x58280005, // 0016 LDCONST R10 K5 + 0x7C1C0600, // 0017 CALL R7 3 + 0x80040E00, // 0018 RET 1 R7 0x70020007, // 0019 JMP #0022 - 0x541AFFFC, // 001A LDINT R6 65533 - 0x1C180A06, // 001B EQ R6 R5 R6 - 0x781A0004, // 001C JMPF R6 #0022 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200709, // 001E GETMBR R8 R3 K9 - 0x54260003, // 001F LDINT R9 4 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 - 0x70020007, // 0022 JMP #002B - 0x60180003, // 0023 GETGBL R6 G3 - 0x5C1C0000, // 0024 MOVE R7 R0 - 0x7C180200, // 0025 CALL R6 1 - 0x8C180D0A, // 0026 GETMET R6 R6 K10 - 0x5C200200, // 0027 MOVE R8 R1 - 0x5C240400, // 0028 MOVE R9 R2 - 0x7C180600, // 0029 CALL R6 3 - 0x80040C00, // 002A RET 1 R6 - 0x80000000, // 002B RET 0 + 0x541EFFFC, // 001A LDINT R7 65533 + 0x1C1C0C07, // 001B EQ R7 R6 R7 + 0x781E0004, // 001C JMPF R7 #0022 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240909, // 001E GETMBR R9 R4 K9 + 0x542A0003, // 001F LDINT R10 4 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 + 0x70020008, // 0022 JMP #002C + 0x601C0003, // 0023 GETGBL R7 G3 + 0x5C200000, // 0024 MOVE R8 R0 + 0x7C1C0200, // 0025 CALL R7 1 + 0x8C1C0F0A, // 0026 GETMET R7 R7 K10 + 0x5C240200, // 0027 MOVE R9 R1 + 0x5C280400, // 0028 MOVE R10 R2 + 0x5C2C0600, // 0029 MOVE R11 R3 + 0x7C1C0800, // 002A CALL R7 4 + 0x80040E00, // 002B RET 1 R7 + 0x80000000, // 002C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h index d3761e562..02d98c5fc 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Pressure.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Sensor_Pressure; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ be_nested_proto( - 11, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -26,7 +26,7 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(I2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -37,77 +37,78 @@ be_local_closure(Matter_Plugin_Sensor_Pressure_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0402, // 0004 LDINT R6 1027 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0035, // 0006 JMPF R6 #003D - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A0011, // 0008 JMPF R6 #001B - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0007, // 000C JMPF R6 #0015 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x60240009, // 000F GETGBL R9 G9 - 0x88280105, // 0010 GETMBR R10 R0 K5 - 0x7C240200, // 0011 CALL R9 1 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[71]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0402, // 0004 LDINT R7 1027 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0035, // 0006 JMPF R7 #003D + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E0011, // 0008 JMPF R7 #001B + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0007, // 000C JMPF R7 #0015 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x60280009, // 000F GETGBL R10 G9 + 0x882C0105, // 0010 GETMBR R11 R0 K5 + 0x7C280200, // 0011 CALL R10 1 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020004, // 0014 JMP #001A - 0x8C180706, // 0015 GETMET R6 R3 K6 - 0x88200708, // 0016 GETMBR R8 R3 K8 - 0x4C240000, // 0017 LDNIL R9 - 0x7C180600, // 0018 CALL R6 3 - 0x80040C00, // 0019 RET 1 R6 + 0x8C1C0706, // 0015 GETMET R7 R3 K6 + 0x88240908, // 0016 GETMBR R9 R4 K8 + 0x4C280000, // 0017 LDNIL R10 + 0x7C1C0600, // 0018 CALL R7 3 + 0x80040E00, // 0019 RET 1 R7 0x70020020, // 001A JMP #003C - 0x1C180B09, // 001B EQ R6 R5 K9 - 0x781A0005, // 001C JMPF R6 #0023 - 0x8C180706, // 001D GETMET R6 R3 K6 - 0x88200707, // 001E GETMBR R8 R3 K7 - 0x542601F3, // 001F LDINT R9 500 - 0x7C180600, // 0020 CALL R6 3 - 0x80040C00, // 0021 RET 1 R6 + 0x1C1C0D09, // 001B EQ R7 R6 K9 + 0x781E0005, // 001C JMPF R7 #0023 + 0x8C1C0706, // 001D GETMET R7 R3 K6 + 0x88240907, // 001E GETMBR R9 R4 K7 + 0x542A01F3, // 001F LDINT R10 500 + 0x7C1C0600, // 0020 CALL R7 3 + 0x80040E00, // 0021 RET 1 R7 0x70020018, // 0022 JMP #003C - 0x1C180B0A, // 0023 EQ R6 R5 K10 - 0x781A0005, // 0024 JMPF R6 #002B - 0x8C180706, // 0025 GETMET R6 R3 K6 - 0x88200707, // 0026 GETMBR R8 R3 K7 - 0x542605DB, // 0027 LDINT R9 1500 - 0x7C180600, // 0028 CALL R6 3 - 0x80040C00, // 0029 RET 1 R6 + 0x1C1C0D0A, // 0023 EQ R7 R6 K10 + 0x781E0005, // 0024 JMPF R7 #002B + 0x8C1C0706, // 0025 GETMET R7 R3 K6 + 0x88240907, // 0026 GETMBR R9 R4 K7 + 0x542A05DB, // 0027 LDINT R10 1500 + 0x7C1C0600, // 0028 CALL R7 3 + 0x80040E00, // 0029 RET 1 R7 0x70020010, // 002A JMP #003C - 0x541AFFFB, // 002B LDINT R6 65532 - 0x1C180A06, // 002C EQ R6 R5 R6 - 0x781A0005, // 002D JMPF R6 #0034 - 0x8C180706, // 002E GETMET R6 R3 K6 - 0x8820070B, // 002F GETMBR R8 R3 K11 - 0x58240004, // 0030 LDCONST R9 K4 - 0x7C180600, // 0031 CALL R6 3 - 0x80040C00, // 0032 RET 1 R6 + 0x541EFFFB, // 002B LDINT R7 65532 + 0x1C1C0C07, // 002C EQ R7 R6 R7 + 0x781E0005, // 002D JMPF R7 #0034 + 0x8C1C0706, // 002E GETMET R7 R3 K6 + 0x8824090B, // 002F GETMBR R9 R4 K11 + 0x58280004, // 0030 LDCONST R10 K4 + 0x7C1C0600, // 0031 CALL R7 3 + 0x80040E00, // 0032 RET 1 R7 0x70020007, // 0033 JMP #003C - 0x541AFFFC, // 0034 LDINT R6 65533 - 0x1C180A06, // 0035 EQ R6 R5 R6 - 0x781A0004, // 0036 JMPF R6 #003C - 0x8C180706, // 0037 GETMET R6 R3 K6 - 0x8820070B, // 0038 GETMBR R8 R3 K11 - 0x5824000C, // 0039 LDCONST R9 K12 - 0x7C180600, // 003A CALL R6 3 - 0x80040C00, // 003B RET 1 R6 - 0x70020007, // 003C JMP #0045 - 0x60180003, // 003D GETGBL R6 G3 - 0x5C1C0000, // 003E MOVE R7 R0 - 0x7C180200, // 003F CALL R6 1 - 0x8C180D0D, // 0040 GETMET R6 R6 K13 - 0x5C200200, // 0041 MOVE R8 R1 - 0x5C240400, // 0042 MOVE R9 R2 - 0x7C180600, // 0043 CALL R6 3 - 0x80040C00, // 0044 RET 1 R6 - 0x80000000, // 0045 RET 0 + 0x541EFFFC, // 0034 LDINT R7 65533 + 0x1C1C0C07, // 0035 EQ R7 R6 R7 + 0x781E0004, // 0036 JMPF R7 #003C + 0x8C1C0706, // 0037 GETMET R7 R3 K6 + 0x8824090B, // 0038 GETMBR R9 R4 K11 + 0x5828000C, // 0039 LDCONST R10 K12 + 0x7C1C0600, // 003A CALL R7 3 + 0x80040E00, // 003B RET 1 R7 + 0x70020008, // 003C JMP #0046 + 0x601C0003, // 003D GETGBL R7 G3 + 0x5C200000, // 003E MOVE R8 R0 + 0x7C1C0200, // 003F CALL R7 1 + 0x8C1C0F0D, // 0040 GETMET R7 R7 K13 + 0x5C240200, // 0041 MOVE R9 R1 + 0x5C280400, // 0042 MOVE R10 R2 + 0x5C2C0600, // 0043 MOVE R11 R3 + 0x7C1C0800, // 0044 CALL R7 4 + 0x80040E00, // 0045 RET 1 R7 + 0x80000000, // 0046 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h index a1deb8b75..4213f69d3 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Temp.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Sensor_Temp; ********************************************************************/ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ be_nested_proto( - 10, /* nstack */ - 3, /* argc */ + 12, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -26,7 +26,7 @@ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_const_int(0), /* K5 */ be_nested_str_weak(shadow_value), - /* K6 */ be_nested_str_weak(create_TLV), + /* K6 */ be_nested_str_weak(set), /* K7 */ be_nested_str_weak(I2), /* K8 */ be_nested_str_weak(NULL), /* K9 */ be_const_int(1), @@ -36,75 +36,76 @@ be_local_closure(Matter_Plugin_Sensor_Temp_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[68]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0401, // 0004 LDINT R6 1026 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0033, // 0006 JMPF R6 #003B - 0x1C180B04, // 0007 EQ R6 R5 K4 - 0x781A000F, // 0008 JMPF R6 #0019 - 0x88180105, // 0009 GETMBR R6 R0 K5 - 0x4C1C0000, // 000A LDNIL R7 - 0x20180C07, // 000B NE R6 R6 R7 - 0x781A0005, // 000C JMPF R6 #0013 - 0x8C180706, // 000D GETMET R6 R3 K6 - 0x88200707, // 000E GETMBR R8 R3 K7 - 0x88240105, // 000F GETMBR R9 R0 K5 - 0x7C180600, // 0010 CALL R6 3 - 0x80040C00, // 0011 RET 1 R6 + ( &(const binstruction[69]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0401, // 0004 LDINT R7 1026 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0033, // 0006 JMPF R7 #003B + 0x1C1C0D04, // 0007 EQ R7 R6 K4 + 0x781E000F, // 0008 JMPF R7 #0019 + 0x881C0105, // 0009 GETMBR R7 R0 K5 + 0x4C200000, // 000A LDNIL R8 + 0x201C0E08, // 000B NE R7 R7 R8 + 0x781E0005, // 000C JMPF R7 #0013 + 0x8C1C0706, // 000D GETMET R7 R3 K6 + 0x88240907, // 000E GETMBR R9 R4 K7 + 0x88280105, // 000F GETMBR R10 R0 K5 + 0x7C1C0600, // 0010 CALL R7 3 + 0x80040E00, // 0011 RET 1 R7 0x70020004, // 0012 JMP #0018 - 0x8C180706, // 0013 GETMET R6 R3 K6 - 0x88200708, // 0014 GETMBR R8 R3 K8 - 0x4C240000, // 0015 LDNIL R9 - 0x7C180600, // 0016 CALL R6 3 - 0x80040C00, // 0017 RET 1 R6 + 0x8C1C0706, // 0013 GETMET R7 R3 K6 + 0x88240908, // 0014 GETMBR R9 R4 K8 + 0x4C280000, // 0015 LDNIL R10 + 0x7C1C0600, // 0016 CALL R7 3 + 0x80040E00, // 0017 RET 1 R7 0x70020020, // 0018 JMP #003A - 0x1C180B09, // 0019 EQ R6 R5 K9 - 0x781A0005, // 001A JMPF R6 #0021 - 0x8C180706, // 001B GETMET R6 R3 K6 - 0x88200707, // 001C GETMBR R8 R3 K7 - 0x5425EC77, // 001D LDINT R9 -5000 - 0x7C180600, // 001E CALL R6 3 - 0x80040C00, // 001F RET 1 R6 + 0x1C1C0D09, // 0019 EQ R7 R6 K9 + 0x781E0005, // 001A JMPF R7 #0021 + 0x8C1C0706, // 001B GETMET R7 R3 K6 + 0x88240907, // 001C GETMBR R9 R4 K7 + 0x5429EC77, // 001D LDINT R10 -5000 + 0x7C1C0600, // 001E CALL R7 3 + 0x80040E00, // 001F RET 1 R7 0x70020018, // 0020 JMP #003A - 0x1C180B0A, // 0021 EQ R6 R5 K10 - 0x781A0005, // 0022 JMPF R6 #0029 - 0x8C180706, // 0023 GETMET R6 R3 K6 - 0x88200707, // 0024 GETMBR R8 R3 K7 - 0x54263A97, // 0025 LDINT R9 15000 - 0x7C180600, // 0026 CALL R6 3 - 0x80040C00, // 0027 RET 1 R6 + 0x1C1C0D0A, // 0021 EQ R7 R6 K10 + 0x781E0005, // 0022 JMPF R7 #0029 + 0x8C1C0706, // 0023 GETMET R7 R3 K6 + 0x88240907, // 0024 GETMBR R9 R4 K7 + 0x542A3A97, // 0025 LDINT R10 15000 + 0x7C1C0600, // 0026 CALL R7 3 + 0x80040E00, // 0027 RET 1 R7 0x70020010, // 0028 JMP #003A - 0x541AFFFB, // 0029 LDINT R6 65532 - 0x1C180A06, // 002A EQ R6 R5 R6 - 0x781A0005, // 002B JMPF R6 #0032 - 0x8C180706, // 002C GETMET R6 R3 K6 - 0x8820070B, // 002D GETMBR R8 R3 K11 - 0x58240004, // 002E LDCONST R9 K4 - 0x7C180600, // 002F CALL R6 3 - 0x80040C00, // 0030 RET 1 R6 + 0x541EFFFB, // 0029 LDINT R7 65532 + 0x1C1C0C07, // 002A EQ R7 R6 R7 + 0x781E0005, // 002B JMPF R7 #0032 + 0x8C1C0706, // 002C GETMET R7 R3 K6 + 0x8824090B, // 002D GETMBR R9 R4 K11 + 0x58280004, // 002E LDCONST R10 K4 + 0x7C1C0600, // 002F CALL R7 3 + 0x80040E00, // 0030 RET 1 R7 0x70020007, // 0031 JMP #003A - 0x541AFFFC, // 0032 LDINT R6 65533 - 0x1C180A06, // 0033 EQ R6 R5 R6 - 0x781A0004, // 0034 JMPF R6 #003A - 0x8C180706, // 0035 GETMET R6 R3 K6 - 0x8820070B, // 0036 GETMBR R8 R3 K11 - 0x54260003, // 0037 LDINT R9 4 - 0x7C180600, // 0038 CALL R6 3 - 0x80040C00, // 0039 RET 1 R6 - 0x70020007, // 003A JMP #0043 - 0x60180003, // 003B GETGBL R6 G3 - 0x5C1C0000, // 003C MOVE R7 R0 - 0x7C180200, // 003D CALL R6 1 - 0x8C180D0C, // 003E GETMET R6 R6 K12 - 0x5C200200, // 003F MOVE R8 R1 - 0x5C240400, // 0040 MOVE R9 R2 - 0x7C180600, // 0041 CALL R6 3 - 0x80040C00, // 0042 RET 1 R6 - 0x80000000, // 0043 RET 0 + 0x541EFFFC, // 0032 LDINT R7 65533 + 0x1C1C0C07, // 0033 EQ R7 R6 R7 + 0x781E0004, // 0034 JMPF R7 #003A + 0x8C1C0706, // 0035 GETMET R7 R3 K6 + 0x8824090B, // 0036 GETMBR R9 R4 K11 + 0x542A0003, // 0037 LDINT R10 4 + 0x7C1C0600, // 0038 CALL R7 3 + 0x80040E00, // 0039 RET 1 R7 + 0x70020008, // 003A JMP #0044 + 0x601C0003, // 003B GETGBL R7 G3 + 0x5C200000, // 003C MOVE R8 R0 + 0x7C1C0200, // 003D CALL R7 1 + 0x8C1C0F0C, // 003E GETMET R7 R7 K12 + 0x5C240200, // 003F MOVE R9 R1 + 0x5C280400, // 0040 MOVE R10 R2 + 0x5C2C0600, // 0041 MOVE R11 R3 + 0x7C1C0800, // 0042 CALL R7 4 + 0x80040E00, // 0043 RET 1 R7 + 0x80000000, // 0044 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h index 5a9d6576f..f071d2f26 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Shutter.h @@ -11,8 +11,8 @@ extern const bclass be_class_Matter_Plugin_Shutter; ********************************************************************/ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ be_nested_proto( - 12, /* nstack */ - 3, /* argc */ + 13, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -27,7 +27,7 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ /* K4 */ be_nested_str_weak(update_shadow_lazy), /* K5 */ be_nested_str_weak(update_inverted), /* K6 */ be_const_int(0), - /* K7 */ be_nested_str_weak(create_TLV), + /* K7 */ be_nested_str_weak(set), /* K8 */ be_nested_str_weak(U1), /* K9 */ be_nested_str_weak(U2), /* K10 */ be_const_int(1), @@ -41,158 +41,159 @@ be_local_closure(Matter_Plugin_Shutter_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[151]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x4C180000, // 0004 LDNIL R6 - 0x541E0101, // 0005 LDINT R7 258 - 0x1C1C0807, // 0006 EQ R7 R4 R7 - 0x781E0085, // 0007 JMPF R7 #008E - 0x8C1C0104, // 0008 GETMET R7 R0 K4 - 0x7C1C0200, // 0009 CALL R7 1 - 0x8C1C0105, // 000A GETMET R7 R0 K5 - 0x7C1C0200, // 000B CALL R7 1 - 0x1C1C0B06, // 000C EQ R7 R5 K6 - 0x781E0005, // 000D JMPF R7 #0014 - 0x8C1C0707, // 000E GETMET R7 R3 K7 - 0x88240708, // 000F GETMBR R9 R3 K8 - 0x542A00FE, // 0010 LDINT R10 255 - 0x7C1C0600, // 0011 CALL R7 3 - 0x80040E00, // 0012 RET 1 R7 + ( &(const binstruction[152]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x4C1C0000, // 0004 LDNIL R7 + 0x54220101, // 0005 LDINT R8 258 + 0x1C200A08, // 0006 EQ R8 R5 R8 + 0x78220085, // 0007 JMPF R8 #008E + 0x8C200104, // 0008 GETMET R8 R0 K4 + 0x7C200200, // 0009 CALL R8 1 + 0x8C200105, // 000A GETMET R8 R0 K5 + 0x7C200200, // 000B CALL R8 1 + 0x1C200D06, // 000C EQ R8 R6 K6 + 0x78220005, // 000D JMPF R8 #0014 + 0x8C200707, // 000E GETMET R8 R3 K7 + 0x88280908, // 000F GETMBR R10 R4 K8 + 0x542E00FE, // 0010 LDINT R11 255 + 0x7C200600, // 0011 CALL R8 3 + 0x80041000, // 0012 RET 1 R8 0x70020078, // 0013 JMP #008D - 0x541E0004, // 0014 LDINT R7 5 - 0x1C1C0A07, // 0015 EQ R7 R5 R7 - 0x781E0005, // 0016 JMPF R7 #001D - 0x8C1C0707, // 0017 GETMET R7 R3 K7 - 0x88240709, // 0018 GETMBR R9 R3 K9 - 0x58280006, // 0019 LDCONST R10 K6 - 0x7C1C0600, // 001A CALL R7 3 - 0x80040E00, // 001B RET 1 R7 + 0x54220004, // 0014 LDINT R8 5 + 0x1C200C08, // 0015 EQ R8 R6 R8 + 0x78220005, // 0016 JMPF R8 #001D + 0x8C200707, // 0017 GETMET R8 R3 K7 + 0x88280909, // 0018 GETMBR R10 R4 K9 + 0x582C0006, // 0019 LDCONST R11 K6 + 0x7C200600, // 001A CALL R8 3 + 0x80041000, // 001B RET 1 R8 0x7002006F, // 001C JMP #008D - 0x541E0006, // 001D LDINT R7 7 - 0x1C1C0A07, // 001E EQ R7 R5 R7 - 0x781E0006, // 001F JMPF R7 #0027 - 0x8C1C0707, // 0020 GETMET R7 R3 K7 - 0x88240708, // 0021 GETMBR R9 R3 K8 - 0x542A0007, // 0022 LDINT R10 8 - 0x002A140A, // 0023 ADD R10 K10 R10 - 0x7C1C0600, // 0024 CALL R7 3 - 0x80040E00, // 0025 RET 1 R7 + 0x54220006, // 001D LDINT R8 7 + 0x1C200C08, // 001E EQ R8 R6 R8 + 0x78220006, // 001F JMPF R8 #0027 + 0x8C200707, // 0020 GETMET R8 R3 K7 + 0x88280908, // 0021 GETMBR R10 R4 K8 + 0x542E0007, // 0022 LDINT R11 8 + 0x002E140B, // 0023 ADD R11 K10 R11 + 0x7C200600, // 0024 CALL R8 3 + 0x80041000, // 0025 RET 1 R8 0x70020065, // 0026 JMP #008D - 0x541E000C, // 0027 LDINT R7 13 - 0x1C1C0A07, // 0028 EQ R7 R5 R7 - 0x781E0005, // 0029 JMPF R7 #0030 - 0x8C1C0707, // 002A GETMET R7 R3 K7 - 0x88240708, // 002B GETMBR R9 R3 K8 - 0x542A00FE, // 002C LDINT R10 255 - 0x7C1C0600, // 002D CALL R7 3 - 0x80040E00, // 002E RET 1 R7 + 0x5422000C, // 0027 LDINT R8 13 + 0x1C200C08, // 0028 EQ R8 R6 R8 + 0x78220005, // 0029 JMPF R8 #0030 + 0x8C200707, // 002A GETMET R8 R3 K7 + 0x88280908, // 002B GETMBR R10 R4 K8 + 0x542E00FE, // 002C LDINT R11 255 + 0x7C200600, // 002D CALL R8 3 + 0x80041000, // 002E RET 1 R8 0x7002005C, // 002F JMP #008D - 0x541E000D, // 0030 LDINT R7 14 - 0x1C1C0A07, // 0031 EQ R7 R5 R7 - 0x781E0013, // 0032 JMPF R7 #0047 - 0x881C010B, // 0033 GETMBR R7 R0 K11 - 0x1C1C0F06, // 0034 EQ R7 R7 K6 - 0x781E0006, // 0035 JMPF R7 #003D - 0x541E0063, // 0036 LDINT R7 100 - 0x8820010C, // 0037 GETMBR R8 R0 K12 - 0x041C0E08, // 0038 SUB R7 R7 R8 - 0x54220063, // 0039 LDINT R8 100 - 0x081C0E08, // 003A MUL R7 R7 R8 - 0x5C180E00, // 003B MOVE R6 R7 + 0x5422000D, // 0030 LDINT R8 14 + 0x1C200C08, // 0031 EQ R8 R6 R8 + 0x78220013, // 0032 JMPF R8 #0047 + 0x8820010B, // 0033 GETMBR R8 R0 K11 + 0x1C201106, // 0034 EQ R8 R8 K6 + 0x78220006, // 0035 JMPF R8 #003D + 0x54220063, // 0036 LDINT R8 100 + 0x8824010C, // 0037 GETMBR R9 R0 K12 + 0x04201009, // 0038 SUB R8 R8 R9 + 0x54260063, // 0039 LDINT R9 100 + 0x08201009, // 003A MUL R8 R8 R9 + 0x5C1C1000, // 003B MOVE R7 R8 0x70020003, // 003C JMP #0041 - 0x881C010C, // 003D GETMBR R7 R0 K12 - 0x54220063, // 003E LDINT R8 100 - 0x081C0E08, // 003F MUL R7 R7 R8 - 0x5C180E00, // 0040 MOVE R6 R7 - 0x8C1C0707, // 0041 GETMET R7 R3 K7 - 0x88240709, // 0042 GETMBR R9 R3 K9 - 0x5C280C00, // 0043 MOVE R10 R6 - 0x7C1C0600, // 0044 CALL R7 3 - 0x80040E00, // 0045 RET 1 R7 + 0x8820010C, // 003D GETMBR R8 R0 K12 + 0x54260063, // 003E LDINT R9 100 + 0x08201009, // 003F MUL R8 R8 R9 + 0x5C1C1000, // 0040 MOVE R7 R8 + 0x8C200707, // 0041 GETMET R8 R3 K7 + 0x88280909, // 0042 GETMBR R10 R4 K9 + 0x5C2C0E00, // 0043 MOVE R11 R7 + 0x7C200600, // 0044 CALL R8 3 + 0x80041000, // 0045 RET 1 R8 0x70020045, // 0046 JMP #008D - 0x541E0009, // 0047 LDINT R7 10 - 0x1C1C0A07, // 0048 EQ R7 R5 R7 - 0x781E0010, // 0049 JMPF R7 #005B - 0x881C010D, // 004A GETMBR R7 R0 K13 - 0x1C1C0F06, // 004B EQ R7 R7 K6 - 0x781E0001, // 004C JMPF R7 #004F - 0x581C0006, // 004D LDCONST R7 K6 + 0x54220009, // 0047 LDINT R8 10 + 0x1C200C08, // 0048 EQ R8 R6 R8 + 0x78220010, // 0049 JMPF R8 #005B + 0x8820010D, // 004A GETMBR R8 R0 K13 + 0x1C201106, // 004B EQ R8 R8 K6 + 0x78220001, // 004C JMPF R8 #004F + 0x58200006, // 004D LDCONST R8 K6 0x70020005, // 004E JMP #0055 - 0x881C010D, // 004F GETMBR R7 R0 K13 - 0x241C0F06, // 0050 GT R7 R7 K6 - 0x781E0001, // 0051 JMPF R7 #0054 - 0x581C000A, // 0052 LDCONST R7 K10 + 0x8820010D, // 004F GETMBR R8 R0 K13 + 0x24201106, // 0050 GT R8 R8 K6 + 0x78220001, // 0051 JMPF R8 #0054 + 0x5820000A, // 0052 LDCONST R8 K10 0x70020000, // 0053 JMP #0055 - 0x581C000E, // 0054 LDCONST R7 K14 - 0x8C200707, // 0055 GETMET R8 R3 K7 - 0x88280708, // 0056 GETMBR R10 R3 K8 - 0x5C2C0E00, // 0057 MOVE R11 R7 - 0x7C200600, // 0058 CALL R8 3 - 0x80041000, // 0059 RET 1 R8 + 0x5820000E, // 0054 LDCONST R8 K14 + 0x8C240707, // 0055 GETMET R9 R3 K7 + 0x882C0908, // 0056 GETMBR R11 R4 K8 + 0x5C301000, // 0057 MOVE R12 R8 + 0x7C240600, // 0058 CALL R9 3 + 0x80041200, // 0059 RET 1 R9 0x70020031, // 005A JMP #008D - 0x541E000A, // 005B LDINT R7 11 - 0x1C1C0A07, // 005C EQ R7 R5 R7 - 0x781E0013, // 005D JMPF R7 #0072 - 0x881C010B, // 005E GETMBR R7 R0 K11 - 0x1C1C0F06, // 005F EQ R7 R7 K6 - 0x781E0006, // 0060 JMPF R7 #0068 - 0x541E0063, // 0061 LDINT R7 100 - 0x8820010F, // 0062 GETMBR R8 R0 K15 - 0x041C0E08, // 0063 SUB R7 R7 R8 - 0x54220063, // 0064 LDINT R8 100 - 0x081C0E08, // 0065 MUL R7 R7 R8 - 0x5C180E00, // 0066 MOVE R6 R7 + 0x5422000A, // 005B LDINT R8 11 + 0x1C200C08, // 005C EQ R8 R6 R8 + 0x78220013, // 005D JMPF R8 #0072 + 0x8820010B, // 005E GETMBR R8 R0 K11 + 0x1C201106, // 005F EQ R8 R8 K6 + 0x78220006, // 0060 JMPF R8 #0068 + 0x54220063, // 0061 LDINT R8 100 + 0x8824010F, // 0062 GETMBR R9 R0 K15 + 0x04201009, // 0063 SUB R8 R8 R9 + 0x54260063, // 0064 LDINT R9 100 + 0x08201009, // 0065 MUL R8 R8 R9 + 0x5C1C1000, // 0066 MOVE R7 R8 0x70020003, // 0067 JMP #006C - 0x881C010F, // 0068 GETMBR R7 R0 K15 - 0x54220063, // 0069 LDINT R8 100 - 0x081C0E08, // 006A MUL R7 R7 R8 - 0x5C180E00, // 006B MOVE R6 R7 - 0x8C1C0707, // 006C GETMET R7 R3 K7 - 0x88240709, // 006D GETMBR R9 R3 K9 - 0x5C280C00, // 006E MOVE R10 R6 - 0x7C1C0600, // 006F CALL R7 3 - 0x80040E00, // 0070 RET 1 R7 + 0x8820010F, // 0068 GETMBR R8 R0 K15 + 0x54260063, // 0069 LDINT R9 100 + 0x08201009, // 006A MUL R8 R8 R9 + 0x5C1C1000, // 006B MOVE R7 R8 + 0x8C200707, // 006C GETMET R8 R3 K7 + 0x88280909, // 006D GETMBR R10 R4 K9 + 0x5C2C0E00, // 006E MOVE R11 R7 + 0x7C200600, // 006F CALL R8 3 + 0x80041000, // 0070 RET 1 R8 0x7002001A, // 0071 JMP #008D - 0x541E0016, // 0072 LDINT R7 23 - 0x1C1C0A07, // 0073 EQ R7 R5 R7 - 0x781E0005, // 0074 JMPF R7 #007B - 0x8C1C0707, // 0075 GETMET R7 R3 K7 - 0x88240708, // 0076 GETMBR R9 R3 K8 - 0x58280006, // 0077 LDCONST R10 K6 - 0x7C1C0600, // 0078 CALL R7 3 - 0x80040E00, // 0079 RET 1 R7 + 0x54220016, // 0072 LDINT R8 23 + 0x1C200C08, // 0073 EQ R8 R6 R8 + 0x78220005, // 0074 JMPF R8 #007B + 0x8C200707, // 0075 GETMET R8 R3 K7 + 0x88280908, // 0076 GETMBR R10 R4 K8 + 0x582C0006, // 0077 LDCONST R11 K6 + 0x7C200600, // 0078 CALL R8 3 + 0x80041000, // 0079 RET 1 R8 0x70020011, // 007A JMP #008D - 0x541EFFFB, // 007B LDINT R7 65532 - 0x1C1C0A07, // 007C EQ R7 R5 R7 - 0x781E0006, // 007D JMPF R7 #0085 - 0x8C1C0707, // 007E GETMET R7 R3 K7 - 0x88240710, // 007F GETMBR R9 R3 K16 - 0x542A0003, // 0080 LDINT R10 4 - 0x002A140A, // 0081 ADD R10 K10 R10 - 0x7C1C0600, // 0082 CALL R7 3 - 0x80040E00, // 0083 RET 1 R7 + 0x5422FFFB, // 007B LDINT R8 65532 + 0x1C200C08, // 007C EQ R8 R6 R8 + 0x78220006, // 007D JMPF R8 #0085 + 0x8C200707, // 007E GETMET R8 R3 K7 + 0x88280910, // 007F GETMBR R10 R4 K16 + 0x542E0003, // 0080 LDINT R11 4 + 0x002E140B, // 0081 ADD R11 K10 R11 + 0x7C200600, // 0082 CALL R8 3 + 0x80041000, // 0083 RET 1 R8 0x70020007, // 0084 JMP #008D - 0x541EFFFC, // 0085 LDINT R7 65533 - 0x1C1C0A07, // 0086 EQ R7 R5 R7 - 0x781E0004, // 0087 JMPF R7 #008D - 0x8C1C0707, // 0088 GETMET R7 R3 K7 - 0x88240710, // 0089 GETMBR R9 R3 K16 - 0x542A0004, // 008A LDINT R10 5 - 0x7C1C0600, // 008B CALL R7 3 - 0x80040E00, // 008C RET 1 R7 - 0x70020007, // 008D JMP #0096 - 0x601C0003, // 008E GETGBL R7 G3 - 0x5C200000, // 008F MOVE R8 R0 - 0x7C1C0200, // 0090 CALL R7 1 - 0x8C1C0F11, // 0091 GETMET R7 R7 K17 - 0x5C240200, // 0092 MOVE R9 R1 - 0x5C280400, // 0093 MOVE R10 R2 - 0x7C1C0600, // 0094 CALL R7 3 - 0x80040E00, // 0095 RET 1 R7 - 0x80000000, // 0096 RET 0 + 0x5422FFFC, // 0085 LDINT R8 65533 + 0x1C200C08, // 0086 EQ R8 R6 R8 + 0x78220004, // 0087 JMPF R8 #008D + 0x8C200707, // 0088 GETMET R8 R3 K7 + 0x88280910, // 0089 GETMBR R10 R4 K16 + 0x542E0004, // 008A LDINT R11 5 + 0x7C200600, // 008B CALL R8 3 + 0x80041000, // 008C RET 1 R8 + 0x70020008, // 008D JMP #0097 + 0x60200003, // 008E GETGBL R8 G3 + 0x5C240000, // 008F MOVE R9 R0 + 0x7C200200, // 0090 CALL R8 1 + 0x8C201111, // 0091 GETMET R8 R8 K17 + 0x5C280200, // 0092 MOVE R10 R1 + 0x5C2C0400, // 0093 MOVE R11 R2 + 0x5C300600, // 0094 MOVE R12 R3 + 0x7C200800, // 0095 CALL R8 4 + 0x80041000, // 0096 RET 1 R8 + 0x80000000, // 0097 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h index 9e89d19d9..bfd316679 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_ShutterTilt.h @@ -207,8 +207,8 @@ be_local_closure(Matter_Plugin_ShutterTilt_invoke_request, /* name */ ********************************************************************/ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ be_nested_proto( - 13, /* nstack */ - 3, /* argc */ + 14, /* nstack */ + 4, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -221,7 +221,7 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ /* K2 */ be_nested_str_weak(cluster), /* K3 */ be_nested_str_weak(attribute), /* K4 */ be_nested_str_weak(update_shadow_lazy), - /* K5 */ be_nested_str_weak(create_TLV), + /* K5 */ be_nested_str_weak(set), /* K6 */ be_nested_str_weak(U1), /* K7 */ be_const_int(1), /* K8 */ be_nested_str_weak(update_tilt_min_max), @@ -239,119 +239,120 @@ be_local_closure(Matter_Plugin_ShutterTilt_read_attribute, /* name */ }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[112]) { /* code */ - 0xB80E0000, // 0000 GETNGBL R3 K0 - 0x880C0701, // 0001 GETMBR R3 R3 K1 - 0x88100502, // 0002 GETMBR R4 R2 K2 - 0x88140503, // 0003 GETMBR R5 R2 K3 - 0x541A0101, // 0004 LDINT R6 258 - 0x1C180806, // 0005 EQ R6 R4 R6 - 0x781A0060, // 0006 JMPF R6 #0068 - 0x8C180104, // 0007 GETMET R6 R0 K4 - 0x7C180200, // 0008 CALL R6 1 - 0x541A0006, // 0009 LDINT R6 7 - 0x1C180A06, // 000A EQ R6 R5 R6 - 0x781A0008, // 000B JMPF R6 #0015 - 0x8C180705, // 000C GETMET R6 R3 K5 - 0x88200706, // 000D GETMBR R8 R3 K6 - 0x54260007, // 000E LDINT R9 8 - 0x00260E09, // 000F ADD R9 K7 R9 - 0x542A000F, // 0010 LDINT R10 16 - 0x0024120A, // 0011 ADD R9 R9 R10 - 0x7C180600, // 0012 CALL R6 3 - 0x80040C00, // 0013 RET 1 R6 + ( &(const binstruction[113]) { /* code */ + 0xB8120000, // 0000 GETNGBL R4 K0 + 0x88100901, // 0001 GETMBR R4 R4 K1 + 0x88140502, // 0002 GETMBR R5 R2 K2 + 0x88180503, // 0003 GETMBR R6 R2 K3 + 0x541E0101, // 0004 LDINT R7 258 + 0x1C1C0A07, // 0005 EQ R7 R5 R7 + 0x781E0060, // 0006 JMPF R7 #0068 + 0x8C1C0104, // 0007 GETMET R7 R0 K4 + 0x7C1C0200, // 0008 CALL R7 1 + 0x541E0006, // 0009 LDINT R7 7 + 0x1C1C0C07, // 000A EQ R7 R6 R7 + 0x781E0008, // 000B JMPF R7 #0015 + 0x8C1C0705, // 000C GETMET R7 R3 K5 + 0x88240906, // 000D GETMBR R9 R4 K6 + 0x542A0007, // 000E LDINT R10 8 + 0x002A0E0A, // 000F ADD R10 K7 R10 + 0x542E000F, // 0010 LDINT R11 16 + 0x0028140B, // 0011 ADD R10 R10 R11 + 0x7C1C0600, // 0012 CALL R7 3 + 0x80040E00, // 0013 RET 1 R7 0x70020052, // 0014 JMP #0068 - 0x541A000E, // 0015 LDINT R6 15 - 0x1C180A06, // 0016 EQ R6 R5 R6 - 0x781A0021, // 0017 JMPF R6 #003A - 0x8C180108, // 0018 GETMET R6 R0 K8 - 0x7C180200, // 0019 CALL R6 1 - 0x88180109, // 001A GETMBR R6 R0 K9 - 0x4C1C0000, // 001B LDNIL R7 - 0x20180C07, // 001C NE R6 R6 R7 - 0x781A0015, // 001D JMPF R6 #0034 - 0x8818010A, // 001E GETMBR R6 R0 K10 - 0x4C1C0000, // 001F LDNIL R7 - 0x20180C07, // 0020 NE R6 R6 R7 - 0x781A0011, // 0021 JMPF R6 #0034 - 0xB81A1600, // 0022 GETNGBL R6 K11 - 0x8C180D0C, // 0023 GETMET R6 R6 K12 - 0x8820010D, // 0024 GETMBR R8 R0 K13 - 0x88240109, // 0025 GETMBR R9 R0 K9 - 0x04201009, // 0026 SUB R8 R8 R9 - 0x5824000E, // 0027 LDCONST R9 K14 - 0x8828010A, // 0028 GETMBR R10 R0 K10 - 0x882C0109, // 0029 GETMBR R11 R0 K9 - 0x0428140B, // 002A SUB R10 R10 R11 - 0x582C000E, // 002B LDCONST R11 K14 - 0x5432270F, // 002C LDINT R12 10000 - 0x7C180C00, // 002D CALL R6 6 - 0x8C1C0705, // 002E GETMET R7 R3 K5 - 0x8824070F, // 002F GETMBR R9 R3 K15 - 0x5C280C00, // 0030 MOVE R10 R6 - 0x7C1C0600, // 0031 CALL R7 3 - 0x80040E00, // 0032 RET 1 R7 + 0x541E000E, // 0015 LDINT R7 15 + 0x1C1C0C07, // 0016 EQ R7 R6 R7 + 0x781E0021, // 0017 JMPF R7 #003A + 0x8C1C0108, // 0018 GETMET R7 R0 K8 + 0x7C1C0200, // 0019 CALL R7 1 + 0x881C0109, // 001A GETMBR R7 R0 K9 + 0x4C200000, // 001B LDNIL R8 + 0x201C0E08, // 001C NE R7 R7 R8 + 0x781E0015, // 001D JMPF R7 #0034 + 0x881C010A, // 001E GETMBR R7 R0 K10 + 0x4C200000, // 001F LDNIL R8 + 0x201C0E08, // 0020 NE R7 R7 R8 + 0x781E0011, // 0021 JMPF R7 #0034 + 0xB81E1600, // 0022 GETNGBL R7 K11 + 0x8C1C0F0C, // 0023 GETMET R7 R7 K12 + 0x8824010D, // 0024 GETMBR R9 R0 K13 + 0x88280109, // 0025 GETMBR R10 R0 K9 + 0x0424120A, // 0026 SUB R9 R9 R10 + 0x5828000E, // 0027 LDCONST R10 K14 + 0x882C010A, // 0028 GETMBR R11 R0 K10 + 0x88300109, // 0029 GETMBR R12 R0 K9 + 0x042C160C, // 002A SUB R11 R11 R12 + 0x5830000E, // 002B LDCONST R12 K14 + 0x5436270F, // 002C LDINT R13 10000 + 0x7C1C0C00, // 002D CALL R7 6 + 0x8C200705, // 002E GETMET R8 R3 K5 + 0x8828090F, // 002F GETMBR R10 R4 K15 + 0x5C2C0E00, // 0030 MOVE R11 R7 + 0x7C200600, // 0031 CALL R8 3 + 0x80041000, // 0032 RET 1 R8 0x70020004, // 0033 JMP #0039 - 0x8C180705, // 0034 GETMET R6 R3 K5 - 0x88200710, // 0035 GETMBR R8 R3 K16 - 0x4C240000, // 0036 LDNIL R9 - 0x7C180600, // 0037 CALL R6 3 - 0x80040C00, // 0038 RET 1 R6 + 0x8C1C0705, // 0034 GETMET R7 R3 K5 + 0x88240910, // 0035 GETMBR R9 R4 K16 + 0x4C280000, // 0036 LDNIL R10 + 0x7C1C0600, // 0037 CALL R7 3 + 0x80040E00, // 0038 RET 1 R7 0x7002002D, // 0039 JMP #0068 - 0x541A000B, // 003A LDINT R6 12 - 0x1C180A06, // 003B EQ R6 R5 R6 - 0x781A001F, // 003C JMPF R6 #005D - 0x88180109, // 003D GETMBR R6 R0 K9 - 0x4C1C0000, // 003E LDNIL R7 - 0x20180C07, // 003F NE R6 R6 R7 - 0x781A0015, // 0040 JMPF R6 #0057 - 0x8818010A, // 0041 GETMBR R6 R0 K10 - 0x4C1C0000, // 0042 LDNIL R7 - 0x20180C07, // 0043 NE R6 R6 R7 - 0x781A0011, // 0044 JMPF R6 #0057 - 0xB81A1600, // 0045 GETNGBL R6 K11 - 0x8C180D0C, // 0046 GETMET R6 R6 K12 - 0x8820010D, // 0047 GETMBR R8 R0 K13 - 0x88240109, // 0048 GETMBR R9 R0 K9 - 0x04201009, // 0049 SUB R8 R8 R9 - 0x5824000E, // 004A LDCONST R9 K14 - 0x8828010A, // 004B GETMBR R10 R0 K10 - 0x882C0109, // 004C GETMBR R11 R0 K9 - 0x0428140B, // 004D SUB R10 R10 R11 - 0x582C000E, // 004E LDCONST R11 K14 - 0x5432270F, // 004F LDINT R12 10000 - 0x7C180C00, // 0050 CALL R6 6 - 0x8C1C0705, // 0051 GETMET R7 R3 K5 - 0x8824070F, // 0052 GETMBR R9 R3 K15 - 0x5C280C00, // 0053 MOVE R10 R6 - 0x7C1C0600, // 0054 CALL R7 3 - 0x80040E00, // 0055 RET 1 R7 + 0x541E000B, // 003A LDINT R7 12 + 0x1C1C0C07, // 003B EQ R7 R6 R7 + 0x781E001F, // 003C JMPF R7 #005D + 0x881C0109, // 003D GETMBR R7 R0 K9 + 0x4C200000, // 003E LDNIL R8 + 0x201C0E08, // 003F NE R7 R7 R8 + 0x781E0015, // 0040 JMPF R7 #0057 + 0x881C010A, // 0041 GETMBR R7 R0 K10 + 0x4C200000, // 0042 LDNIL R8 + 0x201C0E08, // 0043 NE R7 R7 R8 + 0x781E0011, // 0044 JMPF R7 #0057 + 0xB81E1600, // 0045 GETNGBL R7 K11 + 0x8C1C0F0C, // 0046 GETMET R7 R7 K12 + 0x8824010D, // 0047 GETMBR R9 R0 K13 + 0x88280109, // 0048 GETMBR R10 R0 K9 + 0x0424120A, // 0049 SUB R9 R9 R10 + 0x5828000E, // 004A LDCONST R10 K14 + 0x882C010A, // 004B GETMBR R11 R0 K10 + 0x88300109, // 004C GETMBR R12 R0 K9 + 0x042C160C, // 004D SUB R11 R11 R12 + 0x5830000E, // 004E LDCONST R12 K14 + 0x5436270F, // 004F LDINT R13 10000 + 0x7C1C0C00, // 0050 CALL R7 6 + 0x8C200705, // 0051 GETMET R8 R3 K5 + 0x8828090F, // 0052 GETMBR R10 R4 K15 + 0x5C2C0E00, // 0053 MOVE R11 R7 + 0x7C200600, // 0054 CALL R8 3 + 0x80041000, // 0055 RET 1 R8 0x70020004, // 0056 JMP #005C - 0x8C180705, // 0057 GETMET R6 R3 K5 - 0x88200710, // 0058 GETMBR R8 R3 K16 - 0x4C240000, // 0059 LDNIL R9 - 0x7C180600, // 005A CALL R6 3 - 0x80040C00, // 005B RET 1 R6 + 0x8C1C0705, // 0057 GETMET R7 R3 K5 + 0x88240910, // 0058 GETMBR R9 R4 K16 + 0x4C280000, // 0059 LDNIL R10 + 0x7C1C0600, // 005A CALL R7 3 + 0x80040E00, // 005B RET 1 R7 0x7002000A, // 005C JMP #0068 - 0x541AFFFB, // 005D LDINT R6 65532 - 0x1C180A06, // 005E EQ R6 R5 R6 - 0x781A0007, // 005F JMPF R6 #0068 - 0x8C180705, // 0060 GETMET R6 R3 K5 - 0x88200711, // 0061 GETMBR R8 R3 K17 - 0x54260003, // 0062 LDINT R9 4 - 0x00262409, // 0063 ADD R9 K18 R9 - 0x542A000F, // 0064 LDINT R10 16 - 0x0024120A, // 0065 ADD R9 R9 R10 - 0x7C180600, // 0066 CALL R6 3 - 0x80040C00, // 0067 RET 1 R6 - 0x60180003, // 0068 GETGBL R6 G3 - 0x5C1C0000, // 0069 MOVE R7 R0 - 0x7C180200, // 006A CALL R6 1 - 0x8C180D13, // 006B GETMET R6 R6 K19 - 0x5C200200, // 006C MOVE R8 R1 - 0x5C240400, // 006D MOVE R9 R2 - 0x7C180600, // 006E CALL R6 3 - 0x80040C00, // 006F RET 1 R6 + 0x541EFFFB, // 005D LDINT R7 65532 + 0x1C1C0C07, // 005E EQ R7 R6 R7 + 0x781E0007, // 005F JMPF R7 #0068 + 0x8C1C0705, // 0060 GETMET R7 R3 K5 + 0x88240911, // 0061 GETMBR R9 R4 K17 + 0x542A0003, // 0062 LDINT R10 4 + 0x002A240A, // 0063 ADD R10 K18 R10 + 0x542E000F, // 0064 LDINT R11 16 + 0x0028140B, // 0065 ADD R10 R10 R11 + 0x7C1C0600, // 0066 CALL R7 3 + 0x80040E00, // 0067 RET 1 R7 + 0x601C0003, // 0068 GETGBL R7 G3 + 0x5C200000, // 0069 MOVE R8 R0 + 0x7C1C0200, // 006A CALL R7 1 + 0x8C1C0F13, // 006B GETMET R7 R7 K19 + 0x5C240200, // 006C MOVE R9 R1 + 0x5C280400, // 006D MOVE R10 R2 + 0x5C2C0600, // 006E MOVE R11 R3 + 0x7C1C0800, // 006F CALL R7 4 + 0x80040E00, // 0070 RET 1 R7 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h index f4d56bf04..4150c0997 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Profiler.h @@ -6,6 +6,129 @@ extern const bclass be_class_Matter_Profiler; +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_Profiler_start, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(PREALLOCATED), + /* K3 */ be_nested_str_weak(millis), + /* K4 */ be_nested_str_weak(names), + /* K5 */ be_const_int(1), + /* K6 */ be_nested_str_weak(len), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(gc), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(start), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[23]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x74060000, // 0001 JMPT R1 #0003 + 0x80000200, // 0002 RET 0 + 0x58040001, // 0003 LDCONST R1 K1 + 0x88080102, // 0004 GETMBR R2 R0 K2 + 0x14080202, // 0005 LT R2 R1 R2 + 0x780A0007, // 0006 JMPF R2 #000F + 0x88080103, // 0007 GETMBR R2 R0 K3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x98080203, // 0009 SETIDX R2 R1 R3 + 0x88080104, // 000A GETMBR R2 R0 K4 + 0x4C0C0000, // 000B LDNIL R3 + 0x98080203, // 000C SETIDX R2 R1 R3 + 0x00040305, // 000D ADD R1 R1 K5 + 0x7001FFF4, // 000E JMP #0004 + 0x90020D01, // 000F SETMBR R0 K6 K1 + 0xB80A0E00, // 0010 GETNGBL R2 K7 + 0x8C080508, // 0011 GETMET R2 R2 K8 + 0x7C080200, // 0012 CALL R2 1 + 0x8C080109, // 0013 GETMET R2 R0 K9 + 0x5810000A, // 0014 LDCONST R4 K10 + 0x7C080400, // 0015 CALL R2 2 + 0x80000000, // 0016 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_Profiler_init, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(active), + /* K1 */ be_nested_str_weak(millis), + /* K2 */ be_nested_str_weak(resize), + /* K3 */ be_nested_str_weak(PREALLOCATED), + /* K4 */ be_nested_str_weak(names), + /* K5 */ be_nested_str_weak(allocs), + /* K6 */ be_nested_str_weak(reallocs), + /* K7 */ be_nested_str_weak(len), + /* K8 */ be_const_int(0), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[32]) { /* code */ + 0x50040000, // 0000 LDBOOL R1 0 0 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x60040012, // 0002 GETGBL R1 G18 + 0x7C040000, // 0003 CALL R1 0 + 0x90020201, // 0004 SETMBR R0 K1 R1 + 0x88040101, // 0005 GETMBR R1 R0 K1 + 0x8C040302, // 0006 GETMET R1 R1 K2 + 0x880C0103, // 0007 GETMBR R3 R0 K3 + 0x7C040400, // 0008 CALL R1 2 + 0x60040012, // 0009 GETGBL R1 G18 + 0x7C040000, // 000A CALL R1 0 + 0x90020801, // 000B SETMBR R0 K4 R1 + 0x88040104, // 000C GETMBR R1 R0 K4 + 0x8C040302, // 000D GETMET R1 R1 K2 + 0x880C0103, // 000E GETMBR R3 R0 K3 + 0x7C040400, // 000F CALL R1 2 + 0x60040012, // 0010 GETGBL R1 G18 + 0x7C040000, // 0011 CALL R1 0 + 0x90020A01, // 0012 SETMBR R0 K5 R1 + 0x88040105, // 0013 GETMBR R1 R0 K5 + 0x8C040302, // 0014 GETMET R1 R1 K2 + 0x880C0103, // 0015 GETMBR R3 R0 K3 + 0x7C040400, // 0016 CALL R1 2 + 0x60040012, // 0017 GETGBL R1 G18 + 0x7C040000, // 0018 CALL R1 0 + 0x90020C01, // 0019 SETMBR R0 K6 R1 + 0x88040106, // 001A GETMBR R1 R0 K6 + 0x8C040302, // 001B GETMET R1 R1 K2 + 0x880C0103, // 001C GETMBR R3 R0 K3 + 0x7C040400, // 001D CALL R1 2 + 0x90020F08, // 001E SETMBR R0 K7 K8 + 0x80000000, // 001F RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_active ********************************************************************/ @@ -36,58 +159,12 @@ be_local_closure(Matter_Profiler_set_active, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: start -********************************************************************/ -be_local_closure(Matter_Profiler_start, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(active), - /* K1 */ be_nested_str_weak(millis), - /* K2 */ be_nested_str_weak(resize), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(names), - /* K5 */ be_nested_str_weak(log), - /* K6 */ be_nested_str_weak(start), - }), - be_str_weak(start), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x74060000, // 0001 JMPT R1 #0003 - 0x80000200, // 0002 RET 0 - 0x88040101, // 0003 GETMBR R1 R0 K1 - 0x8C040302, // 0004 GETMET R1 R1 K2 - 0x580C0003, // 0005 LDCONST R3 K3 - 0x7C040400, // 0006 CALL R1 2 - 0x88040104, // 0007 GETMBR R1 R0 K4 - 0x8C040302, // 0008 GETMET R1 R1 K2 - 0x580C0003, // 0009 LDCONST R3 K3 - 0x7C040400, // 000A CALL R1 2 - 0x8C040105, // 000B GETMET R1 R0 K5 - 0x580C0006, // 000C LDCONST R3 K6 - 0x7C040400, // 000D CALL R1 2 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: log ********************************************************************/ be_local_closure(Matter_Profiler_log, /* name */ be_nested_proto( - 6, /* nstack */ + 7, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -95,76 +172,49 @@ be_local_closure(Matter_Profiler_log, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(active), - /* K1 */ be_nested_str_weak(millis), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(names), + /* K1 */ be_nested_str_weak(debug), + /* K2 */ be_nested_str_weak(len), + /* K3 */ be_nested_str_weak(PREALLOCATED), + /* K4 */ be_nested_str_weak(millis), + /* K5 */ be_nested_str_weak(tasmota), + /* K6 */ be_nested_str_weak(names), + /* K7 */ be_nested_str_weak(allocs), + /* K8 */ be_nested_str_weak(reallocs), + /* K9 */ be_const_int(1), }), be_str_weak(log), &be_const_str_solidified, - ( &(const binstruction[14]) { /* code */ + ( &(const binstruction[28]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x740A0000, // 0001 JMPT R2 #0003 0x80000400, // 0002 RET 0 - 0x88080101, // 0003 GETMBR R2 R0 K1 - 0x8C080502, // 0004 GETMET R2 R2 K2 - 0xB8120600, // 0005 GETNGBL R4 K3 - 0x8C100901, // 0006 GETMET R4 R4 K1 - 0x7C100200, // 0007 CALL R4 1 - 0x7C080400, // 0008 CALL R2 2 - 0x88080104, // 0009 GETMBR R2 R0 K4 - 0x8C080502, // 000A GETMET R2 R2 K2 - 0x5C100200, // 000B MOVE R4 R1 - 0x7C080400, // 000C CALL R2 2 - 0x80000000, // 000D RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Profiler_init, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(active), - /* K1 */ be_nested_str_weak(millis), - /* K2 */ be_nested_str_weak(resize), - /* K3 */ be_nested_str_weak(PREALLOCATED), - /* K4 */ be_nested_str_weak(names), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x50040000, // 0000 LDBOOL R1 0 0 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x60040012, // 0002 GETGBL R1 G18 - 0x7C040000, // 0003 CALL R1 0 - 0x90020201, // 0004 SETMBR R0 K1 R1 - 0x88040101, // 0005 GETMBR R1 R0 K1 - 0x8C040302, // 0006 GETMET R1 R1 K2 - 0x880C0103, // 0007 GETMBR R3 R0 K3 - 0x7C040400, // 0008 CALL R1 2 - 0x60040012, // 0009 GETGBL R1 G18 - 0x7C040000, // 000A CALL R1 0 - 0x90020801, // 000B SETMBR R0 K4 R1 - 0x88040104, // 000C GETMBR R1 R0 K4 - 0x8C040302, // 000D GETMET R1 R1 K2 - 0x880C0103, // 000E GETMBR R3 R0 K3 - 0x7C040400, // 000F CALL R1 2 - 0x80000000, // 0010 RET 0 + 0xA40A0200, // 0003 IMPORT R2 K1 + 0x880C0102, // 0004 GETMBR R3 R0 K2 + 0x88100103, // 0005 GETMBR R4 R0 K3 + 0x28100604, // 0006 GE R4 R3 R4 + 0x78120000, // 0007 JMPF R4 #0009 + 0x80000800, // 0008 RET 0 + 0x88100104, // 0009 GETMBR R4 R0 K4 + 0xB8160A00, // 000A GETNGBL R5 K5 + 0x8C140B04, // 000B GETMET R5 R5 K4 + 0x7C140200, // 000C CALL R5 1 + 0x98100605, // 000D SETIDX R4 R3 R5 + 0x88100106, // 000E GETMBR R4 R0 K6 + 0x98100601, // 000F SETIDX R4 R3 R1 + 0x88100107, // 0010 GETMBR R4 R0 K7 + 0x8C140507, // 0011 GETMET R5 R2 K7 + 0x7C140200, // 0012 CALL R5 1 + 0x98100605, // 0013 SETIDX R4 R3 R5 + 0x88100108, // 0014 GETMBR R4 R0 K8 + 0x8C140508, // 0015 GETMET R5 R2 K8 + 0x7C140200, // 0016 CALL R5 1 + 0x98100605, // 0017 SETIDX R4 R3 R5 + 0x88100102, // 0018 GETMBR R4 R0 K2 + 0x00100909, // 0019 ADD R4 R4 K9 + 0x90020404, // 001A SETMBR R0 K2 R4 + 0x80000000, // 001B RET 0 }) ) ); @@ -176,7 +226,7 @@ be_local_closure(Matter_Profiler_init, /* name */ ********************************************************************/ be_local_closure(Matter_Profiler_dump, /* name */ be_nested_proto( - 10, /* nstack */ + 13, /* nstack */ 2, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -184,7 +234,7 @@ be_local_closure(Matter_Profiler_dump, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ + ( &(const bvalue[13]) { /* constants */ /* K0 */ be_nested_str_weak(active), /* K1 */ be_nested_str_weak(log), /* K2 */ be_nested_str_weak(_X3C_X2D_X2Dend_X2D_X2D_X3E), @@ -192,13 +242,16 @@ be_local_closure(Matter_Profiler_dump, /* name */ /* K4 */ be_nested_str_weak(MTR_X3A_X20Profiler_X20dump_X3A), /* K5 */ be_nested_str_weak(millis), /* K6 */ be_const_int(0), - /* K7 */ be_const_int(1), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X20_X20_X254i_X20_X27_X25s_X27), - /* K9 */ be_nested_str_weak(names), + /* K7 */ be_nested_str_weak(allocs), + /* K8 */ be_nested_str_weak(reallocs), + /* K9 */ be_const_int(1), + /* K10 */ be_nested_str_weak(len), + /* K11 */ be_nested_str_weak(MTR_X3A_X20_X20_X20_X254i_X20_X5B_X254i_X5D_X27_X25s_X27), + /* K12 */ be_nested_str_weak(names), }), be_str_weak(dump), &be_const_str_solidified, - ( &(const binstruction[34]) { /* code */ + ( &(const binstruction[39]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x740A0000, // 0001 JMPT R2 #0003 0x80000400, // 0002 RET 0 @@ -212,27 +265,32 @@ be_local_closure(Matter_Profiler_dump, /* name */ 0x7C080600, // 000A CALL R2 3 0x88080105, // 000B GETMBR R2 R0 K5 0x94080506, // 000C GETIDX R2 R2 K6 - 0x580C0007, // 000D LDCONST R3 K7 - 0x6010000C, // 000E GETGBL R4 G12 - 0x88140105, // 000F GETMBR R5 R0 K5 - 0x7C100200, // 0010 CALL R4 1 - 0x14100604, // 0011 LT R4 R3 R4 - 0x7812000D, // 0012 JMPF R4 #0021 - 0xB8120600, // 0013 GETNGBL R4 K3 - 0x8C100901, // 0014 GETMET R4 R4 K1 - 0x60180018, // 0015 GETGBL R6 G24 - 0x581C0008, // 0016 LDCONST R7 K8 - 0x88200105, // 0017 GETMBR R8 R0 K5 - 0x94201003, // 0018 GETIDX R8 R8 R3 - 0x04201002, // 0019 SUB R8 R8 R2 - 0x88240109, // 001A GETMBR R9 R0 K9 - 0x94241203, // 001B GETIDX R9 R9 R3 - 0x7C180600, // 001C CALL R6 3 - 0x5C1C0200, // 001D MOVE R7 R1 - 0x7C100600, // 001E CALL R4 3 - 0x000C0707, // 001F ADD R3 R3 K7 - 0x7001FFEC, // 0020 JMP #000E - 0x80000000, // 0021 RET 0 + 0x880C0107, // 000D GETMBR R3 R0 K7 + 0x940C0706, // 000E GETIDX R3 R3 K6 + 0x88100108, // 000F GETMBR R4 R0 K8 + 0x94100906, // 0010 GETIDX R4 R4 K6 + 0x58140009, // 0011 LDCONST R5 K9 + 0x8818010A, // 0012 GETMBR R6 R0 K10 + 0x14180A06, // 0013 LT R6 R5 R6 + 0x781A0010, // 0014 JMPF R6 #0026 + 0xB81A0600, // 0015 GETNGBL R6 K3 + 0x8C180D01, // 0016 GETMET R6 R6 K1 + 0x60200018, // 0017 GETGBL R8 G24 + 0x5824000B, // 0018 LDCONST R9 K11 + 0x88280105, // 0019 GETMBR R10 R0 K5 + 0x94281405, // 001A GETIDX R10 R10 R5 + 0x04281402, // 001B SUB R10 R10 R2 + 0x882C0107, // 001C GETMBR R11 R0 K7 + 0x942C1605, // 001D GETIDX R11 R11 R5 + 0x042C1603, // 001E SUB R11 R11 R3 + 0x8830010C, // 001F GETMBR R12 R0 K12 + 0x94301805, // 0020 GETIDX R12 R12 R5 + 0x7C200800, // 0021 CALL R8 4 + 0x5C240200, // 0022 MOVE R9 R1 + 0x7C180600, // 0023 CALL R6 3 + 0x00140B09, // 0024 ADD R5 R5 K9 + 0x7001FFEB, // 0025 JMP #0012 + 0x80000000, // 0026 RET 0 }) ) ); @@ -243,19 +301,22 @@ be_local_closure(Matter_Profiler_dump, /* name */ ** Solidified class: Matter_Profiler ********************************************************************/ be_local_class(Matter_Profiler, - 3, + 6, NULL, - be_nested_map(9, + be_nested_map(12, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(set_active, 5), be_const_closure(Matter_Profiler_set_active_closure) }, - { be_const_key_weak(millis, -1), be_const_var(0) }, - { be_const_key_weak(start, 4), be_const_closure(Matter_Profiler_start_closure) }, - { be_const_key_weak(active, 1), be_const_var(2) }, - { be_const_key_weak(PREALLOCATED, -1), be_const_int(50) }, - { be_const_key_weak(log, -1), be_const_closure(Matter_Profiler_log_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Profiler_init_closure) }, + { be_const_key_weak(dump, 8), be_const_closure(Matter_Profiler_dump_closure) }, + { be_const_key_weak(millis, 5), be_const_var(0) }, + { be_const_key_weak(reallocs, -1), be_const_var(4) }, + { be_const_key_weak(init, 1), be_const_closure(Matter_Profiler_init_closure) }, + { be_const_key_weak(len, -1), be_const_var(5) }, + { be_const_key_weak(active, -1), be_const_var(2) }, + { be_const_key_weak(set_active, -1), be_const_closure(Matter_Profiler_set_active_closure) }, { be_const_key_weak(names, -1), be_const_var(1) }, - { be_const_key_weak(dump, -1), be_const_closure(Matter_Profiler_dump_closure) }, + { be_const_key_weak(allocs, 10), be_const_var(3) }, + { be_const_key_weak(log, -1), be_const_closure(Matter_Profiler_log_closure) }, + { be_const_key_weak(PREALLOCATED, -1), be_const_int(50) }, + { be_const_key_weak(start, 0), be_const_closure(Matter_Profiler_start_closure) }, })), be_str_weak(Matter_Profiler) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h index b65e1f6fd..d1685288e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h @@ -851,21 +851,19 @@ be_local_closure(Matter_Session_update, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ + ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(last_used), /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(rtc), - /* K3 */ be_nested_str_weak(utc), + /* K2 */ be_nested_str_weak(rtc_utc), }), be_str_weak(update), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ 0xB8060200, // 0000 GETNGBL R1 K1 0x8C040302, // 0001 GETMET R1 R1 K2 0x7C040200, // 0002 CALL R1 1 - 0x94040303, // 0003 GETIDX R1 R1 K3 - 0x90020001, // 0004 SETMBR R0 K0 R1 - 0x80000000, // 0005 RET 0 + 0x90020001, // 0003 SETMBR R0 K0 R1 + 0x80000000, // 0004 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index f5bce6577..b42a7facf 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -6,400 +6,6 @@ extern const bclass be_class_Matter_TLV_item; -/******************************************************************** -** Solidified function: set_parent -********************************************************************/ -be_local_closure(Matter_TLV_item_set_parent, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parent), - }), - be_str_weak(set_parent), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: create_TLV -********************************************************************/ -be_local_closure(Matter_TLV_item_create_TLV, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_TLV_item), - /* K1 */ be_nested_str_weak(typ), - /* K2 */ be_nested_str_weak(val), - }), - be_str_weak(create_TLV), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x200C0203, // 0002 NE R3 R1 R3 - 0x740E0002, // 0003 JMPT R3 #0007 - 0x540E0013, // 0004 LDINT R3 20 - 0x1C0C0003, // 0005 EQ R3 R0 R3 - 0x780E0004, // 0006 JMPF R3 #000C - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x900E0200, // 0009 SETMBR R3 K1 R0 - 0x900E0401, // 000A SETMBR R3 K2 R1 - 0x80040600, // 000B RET 1 R3 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_anonymoustag -********************************************************************/ -be_local_closure(Matter_TLV_item_set_anonymoustag, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_fulltag), - }), - be_str_weak(set_anonymoustag), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_commonprofile -********************************************************************/ -be_local_closure(Matter_TLV_item_set_commonprofile, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_fulltag), - }), - be_str_weak(set_commonprofile), - &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x5411FFFE, // 0002 LDINT R4 -1 - 0x4C140000, // 0003 LDNIL R5 - 0x7C040800, // 0004 CALL R1 4 - 0x80000000, // 0005 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _cmp_gt -********************************************************************/ -be_local_closure(Matter_TLV_item__cmp_gt, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(tag_vendor), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(tag_profile), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(tag_number), - /* K5 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(_cmp_gt), - &be_const_str_solidified, - ( &(const binstruction[72]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0012, // 0003 JMPF R2 #0017 - 0x88080300, // 0004 GETMBR R2 R1 K0 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C080403, // 0006 EQ R2 R2 R3 - 0x780A0000, // 0007 JMPF R2 #0009 - 0x80060200, // 0008 RET 1 K1 - 0x88080100, // 0009 GETMBR R2 R0 K0 - 0x880C0300, // 000A GETMBR R3 R1 K0 - 0x24080403, // 000B GT R2 R2 R3 - 0x780A0000, // 000C JMPF R2 #000E - 0x80060200, // 000D RET 1 K1 - 0x88080100, // 000E GETMBR R2 R0 K0 - 0x880C0300, // 000F GETMBR R3 R1 K0 - 0x1C080403, // 0010 EQ R2 R2 R3 - 0x780A0004, // 0011 JMPF R2 #0017 - 0x88080102, // 0012 GETMBR R2 R0 K2 - 0x880C0302, // 0013 GETMBR R3 R1 K2 - 0x24080403, // 0014 GT R2 R2 R3 - 0x780A0000, // 0015 JMPF R2 #0017 - 0x80060200, // 0016 RET 1 K1 - 0x88080102, // 0017 GETMBR R2 R0 K2 - 0x540DFFFE, // 0018 LDINT R3 -1 - 0x1C080403, // 0019 EQ R2 R2 R3 - 0x780A0005, // 001A JMPF R2 #0021 - 0x88080302, // 001B GETMBR R2 R1 K2 - 0x4C0C0000, // 001C LDNIL R3 - 0x1C080403, // 001D EQ R2 R2 R3 - 0x780A0000, // 001E JMPF R2 #0020 - 0x80060200, // 001F RET 1 K1 - 0x70020008, // 0020 JMP #002A - 0x88080102, // 0021 GETMBR R2 R0 K2 - 0x4C0C0000, // 0022 LDNIL R3 - 0x1C080403, // 0023 EQ R2 R2 R3 - 0x780A0004, // 0024 JMPF R2 #002A - 0x88080302, // 0025 GETMBR R2 R1 K2 - 0x540DFFFE, // 0026 LDINT R3 -1 - 0x1C080403, // 0027 EQ R2 R2 R3 - 0x780A0000, // 0028 JMPF R2 #002A - 0x80060600, // 0029 RET 1 K3 - 0x88080104, // 002A GETMBR R2 R0 K4 - 0x4C0C0000, // 002B LDNIL R3 - 0x20080403, // 002C NE R2 R2 R3 - 0x780A000A, // 002D JMPF R2 #0039 - 0x88080304, // 002E GETMBR R2 R1 K4 - 0x4C0C0000, // 002F LDNIL R3 - 0x1C080403, // 0030 EQ R2 R2 R3 - 0x780A0000, // 0031 JMPF R2 #0033 - 0x80060200, // 0032 RET 1 K1 - 0x88080104, // 0033 GETMBR R2 R0 K4 - 0x880C0304, // 0034 GETMBR R3 R1 K4 - 0x24080403, // 0035 GT R2 R2 R3 - 0x780A0000, // 0036 JMPF R2 #0038 - 0x80060200, // 0037 RET 1 K1 - 0x80060600, // 0038 RET 1 K3 - 0x88080105, // 0039 GETMBR R2 R0 K5 - 0x4C0C0000, // 003A LDNIL R3 - 0x20080403, // 003B NE R2 R2 R3 - 0x780A0009, // 003C JMPF R2 #0047 - 0x88080305, // 003D GETMBR R2 R1 K5 - 0x4C0C0000, // 003E LDNIL R3 - 0x1C080403, // 003F EQ R2 R2 R3 - 0x780A0000, // 0040 JMPF R2 #0042 - 0x80060200, // 0041 RET 1 K1 - 0x88080105, // 0042 GETMBR R2 R0 K5 - 0x880C0305, // 0043 GETMBR R3 R1 K5 - 0x24080403, // 0044 GT R2 R2 R3 - 0x780A0000, // 0045 JMPF R2 #0047 - 0x80060200, // 0046 RET 1 K1 - 0x80060600, // 0047 RET 1 K3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _encode_tag -********************************************************************/ -be_local_closure(Matter_TLV_item__encode_tag, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tag_number), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(tag_vendor), - /* K3 */ be_nested_str_weak(add), - /* K4 */ be_nested_str_weak(typ), - /* K5 */ be_const_int(1), - /* K6 */ be_const_int(2), - /* K7 */ be_nested_str_weak(tag_profile), - /* K8 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(_encode_tag), - &be_const_str_solidified, - ( &(const binstruction[133]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0001, // 0003 JMPF R2 #0006 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x70020000, // 0005 JMP #0007 - 0x58080001, // 0006 LDCONST R2 K1 - 0x540EFFFF, // 0007 LDINT R3 65536 - 0x280C0403, // 0008 GE R3 R2 R3 - 0x740E0002, // 0009 JMPT R3 #000D - 0x140C0501, // 000A LT R3 R2 K1 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x58100001, // 000E LDCONST R4 K1 - 0x88140102, // 000F GETMBR R5 R0 K2 - 0x4C180000, // 0010 LDNIL R6 - 0x20140A06, // 0011 NE R5 R5 R6 - 0x78160026, // 0012 JMPF R5 #003A - 0x780E0012, // 0013 JMPF R3 #0027 - 0x8C140303, // 0014 GETMET R5 R1 K3 - 0x541E00DF, // 0015 LDINT R7 224 - 0x88200104, // 0016 GETMBR R8 R0 K4 - 0x001C0E08, // 0017 ADD R7 R7 R8 - 0x58200005, // 0018 LDCONST R8 K5 - 0x7C140600, // 0019 CALL R5 3 - 0x8C140303, // 001A GETMET R5 R1 K3 - 0x881C0102, // 001B GETMBR R7 R0 K2 - 0x58200006, // 001C LDCONST R8 K6 - 0x7C140600, // 001D CALL R5 3 - 0x8C140303, // 001E GETMET R5 R1 K3 - 0x881C0107, // 001F GETMBR R7 R0 K7 - 0x58200006, // 0020 LDCONST R8 K6 - 0x7C140600, // 0021 CALL R5 3 - 0x8C140303, // 0022 GETMET R5 R1 K3 - 0x881C0100, // 0023 GETMBR R7 R0 K0 - 0x54220003, // 0024 LDINT R8 4 - 0x7C140600, // 0025 CALL R5 3 - 0x70020011, // 0026 JMP #0039 - 0x8C140303, // 0027 GETMET R5 R1 K3 - 0x541E00BF, // 0028 LDINT R7 192 - 0x88200104, // 0029 GETMBR R8 R0 K4 - 0x001C0E08, // 002A ADD R7 R7 R8 - 0x58200005, // 002B LDCONST R8 K5 - 0x7C140600, // 002C CALL R5 3 - 0x8C140303, // 002D GETMET R5 R1 K3 - 0x881C0102, // 002E GETMBR R7 R0 K2 - 0x58200006, // 002F LDCONST R8 K6 - 0x7C140600, // 0030 CALL R5 3 - 0x8C140303, // 0031 GETMET R5 R1 K3 - 0x881C0107, // 0032 GETMBR R7 R0 K7 - 0x58200006, // 0033 LDCONST R8 K6 - 0x7C140600, // 0034 CALL R5 3 - 0x8C140303, // 0035 GETMET R5 R1 K3 - 0x881C0100, // 0036 GETMBR R7 R0 K0 - 0x58200006, // 0037 LDCONST R8 K6 - 0x7C140600, // 0038 CALL R5 3 - 0x70020049, // 0039 JMP #0084 - 0x88140107, // 003A GETMBR R5 R0 K7 - 0x5419FFFE, // 003B LDINT R6 -1 - 0x1C140A06, // 003C EQ R5 R5 R6 - 0x78160016, // 003D JMPF R5 #0055 - 0x780E000A, // 003E JMPF R3 #004A - 0x8C140303, // 003F GETMET R5 R1 K3 - 0x541E005F, // 0040 LDINT R7 96 - 0x88200104, // 0041 GETMBR R8 R0 K4 - 0x001C0E08, // 0042 ADD R7 R7 R8 - 0x58200005, // 0043 LDCONST R8 K5 - 0x7C140600, // 0044 CALL R5 3 - 0x8C140303, // 0045 GETMET R5 R1 K3 - 0x881C0100, // 0046 GETMBR R7 R0 K0 - 0x54220003, // 0047 LDINT R8 4 - 0x7C140600, // 0048 CALL R5 3 - 0x70020009, // 0049 JMP #0054 - 0x8C140303, // 004A GETMET R5 R1 K3 - 0x541E003F, // 004B LDINT R7 64 - 0x88200104, // 004C GETMBR R8 R0 K4 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x58200005, // 004E LDCONST R8 K5 - 0x7C140600, // 004F CALL R5 3 - 0x8C140303, // 0050 GETMET R5 R1 K3 - 0x881C0100, // 0051 GETMBR R7 R0 K0 - 0x58200006, // 0052 LDCONST R8 K6 - 0x7C140600, // 0053 CALL R5 3 - 0x7002002E, // 0054 JMP #0084 - 0x88140107, // 0055 GETMBR R5 R0 K7 - 0x4C180000, // 0056 LDNIL R6 - 0x20140A06, // 0057 NE R5 R5 R6 - 0x78160016, // 0058 JMPF R5 #0070 - 0x780E000A, // 0059 JMPF R3 #0065 - 0x8C140303, // 005A GETMET R5 R1 K3 - 0x541E009F, // 005B LDINT R7 160 - 0x88200104, // 005C GETMBR R8 R0 K4 - 0x001C0E08, // 005D ADD R7 R7 R8 - 0x58200005, // 005E LDCONST R8 K5 - 0x7C140600, // 005F CALL R5 3 - 0x8C140303, // 0060 GETMET R5 R1 K3 - 0x881C0100, // 0061 GETMBR R7 R0 K0 - 0x54220003, // 0062 LDINT R8 4 - 0x7C140600, // 0063 CALL R5 3 - 0x70020009, // 0064 JMP #006F - 0x8C140303, // 0065 GETMET R5 R1 K3 - 0x541E007F, // 0066 LDINT R7 128 - 0x88200104, // 0067 GETMBR R8 R0 K4 - 0x001C0E08, // 0068 ADD R7 R7 R8 - 0x58200005, // 0069 LDCONST R8 K5 - 0x7C140600, // 006A CALL R5 3 - 0x8C140303, // 006B GETMET R5 R1 K3 - 0x881C0100, // 006C GETMBR R7 R0 K0 - 0x58200006, // 006D LDCONST R8 K6 - 0x7C140600, // 006E CALL R5 3 - 0x70020013, // 006F JMP #0084 - 0x88140108, // 0070 GETMBR R5 R0 K8 - 0x4C180000, // 0071 LDNIL R6 - 0x20140A06, // 0072 NE R5 R5 R6 - 0x7816000A, // 0073 JMPF R5 #007F - 0x8C140303, // 0074 GETMET R5 R1 K3 - 0x541E001F, // 0075 LDINT R7 32 - 0x88200104, // 0076 GETMBR R8 R0 K4 - 0x001C0E08, // 0077 ADD R7 R7 R8 - 0x58200005, // 0078 LDCONST R8 K5 - 0x7C140600, // 0079 CALL R5 3 - 0x8C140303, // 007A GETMET R5 R1 K3 - 0x881C0108, // 007B GETMBR R7 R0 K8 - 0x58200005, // 007C LDCONST R8 K5 - 0x7C140600, // 007D CALL R5 3 - 0x70020004, // 007E JMP #0084 - 0x8C140303, // 007F GETMET R5 R1 K3 - 0x881C0104, // 0080 GETMBR R7 R0 K4 - 0x001E0207, // 0081 ADD R7 K1 R7 - 0x58200005, // 0082 LDCONST R8 K5 - 0x7C140600, // 0083 CALL R5 3 - 0x80000000, // 0084 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: encode_len ********************************************************************/ @@ -714,6 +320,630 @@ be_local_closure(Matter_TLV_item_encode_len, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: to_str_val +********************************************************************/ +be_local_closure(Matter_TLV_item_to_str_val, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(int), + /* K2 */ be_nested_str_weak(typ), + /* K3 */ be_nested_str_weak(TLV), + /* K4 */ be_nested_str_weak(U1), + /* K5 */ be_nested_str_weak(U8), + /* K6 */ be_nested_str_weak(U), + /* K7 */ be_nested_str_weak(bool), + /* K8 */ be_nested_str_weak(true), + /* K9 */ be_nested_str_weak(false), + /* K10 */ be_nested_str_weak(null), + /* K11 */ be_nested_str_weak(real), + /* K12 */ be_nested_str_weak(string), + /* K13 */ be_nested_str_weak(int64), + /* K14 */ be_nested_str_weak(tostring), + /* K15 */ be_nested_str_weak(instance), + }), + be_str_weak(to_str_val), + &be_const_str_solidified, + ( &(const binstruction[98]) { /* code */ + 0x60040004, // 0000 GETGBL R1 G4 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040301, // 0003 EQ R1 R1 K1 + 0x78060014, // 0004 JMPF R1 #001A + 0x88040102, // 0005 GETMBR R1 R0 K2 + 0x88080103, // 0006 GETMBR R2 R0 K3 + 0x88080504, // 0007 GETMBR R2 R2 K4 + 0x28040202, // 0008 GE R1 R1 R2 + 0x7806000A, // 0009 JMPF R1 #0015 + 0x88040102, // 000A GETMBR R1 R0 K2 + 0x88080103, // 000B GETMBR R2 R0 K3 + 0x88080505, // 000C GETMBR R2 R2 K5 + 0x18040202, // 000D LE R1 R1 R2 + 0x78060005, // 000E JMPF R1 #0015 + 0x60040008, // 000F GETGBL R1 G8 + 0x88080100, // 0010 GETMBR R2 R0 K0 + 0x7C040200, // 0011 CALL R1 1 + 0x00040306, // 0012 ADD R1 R1 K6 + 0x80040200, // 0013 RET 1 R1 + 0x70020003, // 0014 JMP #0019 + 0x60040008, // 0015 GETGBL R1 G8 + 0x88080100, // 0016 GETMBR R2 R0 K0 + 0x7C040200, // 0017 CALL R1 1 + 0x80040200, // 0018 RET 1 R1 + 0x70020046, // 0019 JMP #0061 + 0x60040004, // 001A GETGBL R1 G4 + 0x88080100, // 001B GETMBR R2 R0 K0 + 0x7C040200, // 001C CALL R1 1 + 0x1C040307, // 001D EQ R1 R1 K7 + 0x78060006, // 001E JMPF R1 #0026 + 0x88040100, // 001F GETMBR R1 R0 K0 + 0x78060001, // 0020 JMPF R1 #0023 + 0x58040008, // 0021 LDCONST R1 K8 + 0x70020000, // 0022 JMP #0024 + 0x58040009, // 0023 LDCONST R1 K9 + 0x80040200, // 0024 RET 1 R1 + 0x7002003A, // 0025 JMP #0061 + 0x88040100, // 0026 GETMBR R1 R0 K0 + 0x4C080000, // 0027 LDNIL R2 + 0x1C040202, // 0028 EQ R1 R1 R2 + 0x78060001, // 0029 JMPF R1 #002C + 0x80061400, // 002A RET 1 K10 + 0x70020034, // 002B JMP #0061 + 0x60040004, // 002C GETGBL R1 G4 + 0x88080100, // 002D GETMBR R2 R0 K0 + 0x7C040200, // 002E CALL R1 1 + 0x1C04030B, // 002F EQ R1 R1 K11 + 0x78060004, // 0030 JMPF R1 #0036 + 0x60040008, // 0031 GETGBL R1 G8 + 0x88080100, // 0032 GETMBR R2 R0 K0 + 0x7C040200, // 0033 CALL R1 1 + 0x80040200, // 0034 RET 1 R1 + 0x7002002A, // 0035 JMP #0061 + 0x60040004, // 0036 GETGBL R1 G4 + 0x88080100, // 0037 GETMBR R2 R0 K0 + 0x7C040200, // 0038 CALL R1 1 + 0x1C04030C, // 0039 EQ R1 R1 K12 + 0x78060002, // 003A JMPF R1 #003E + 0x88040100, // 003B GETMBR R1 R0 K0 + 0x80040200, // 003C RET 1 R1 + 0x70020022, // 003D JMP #0061 + 0x6004000F, // 003E GETGBL R1 G15 + 0x88080100, // 003F GETMBR R2 R0 K0 + 0xB80E1A00, // 0040 GETNGBL R3 K13 + 0x7C040400, // 0041 CALL R1 2 + 0x78060014, // 0042 JMPF R1 #0058 + 0x88040102, // 0043 GETMBR R1 R0 K2 + 0x88080103, // 0044 GETMBR R2 R0 K3 + 0x88080504, // 0045 GETMBR R2 R2 K4 + 0x28040202, // 0046 GE R1 R1 R2 + 0x7806000A, // 0047 JMPF R1 #0053 + 0x88040102, // 0048 GETMBR R1 R0 K2 + 0x88080103, // 0049 GETMBR R2 R0 K3 + 0x88080505, // 004A GETMBR R2 R2 K5 + 0x18040202, // 004B LE R1 R1 R2 + 0x78060005, // 004C JMPF R1 #0053 + 0x88040100, // 004D GETMBR R1 R0 K0 + 0x8C04030E, // 004E GETMET R1 R1 K14 + 0x7C040200, // 004F CALL R1 1 + 0x00040306, // 0050 ADD R1 R1 K6 + 0x80040200, // 0051 RET 1 R1 + 0x70020003, // 0052 JMP #0057 + 0x88040100, // 0053 GETMBR R1 R0 K0 + 0x8C04030E, // 0054 GETMET R1 R1 K14 + 0x7C040200, // 0055 CALL R1 1 + 0x80040200, // 0056 RET 1 R1 + 0x70020008, // 0057 JMP #0061 + 0x60040004, // 0058 GETGBL R1 G4 + 0x88080100, // 0059 GETMBR R2 R0 K0 + 0x7C040200, // 005A CALL R1 1 + 0x1C04030F, // 005B EQ R1 R1 K15 + 0x78060003, // 005C JMPF R1 #0061 + 0x8C04010E, // 005D GETMET R1 R0 K14 + 0x500C0200, // 005E LDBOOL R3 1 0 + 0x7C040400, // 005F CALL R1 2 + 0x80040200, // 0060 RET 1 R1 + 0x80000000, // 0061 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: parse +********************************************************************/ +be_local_closure(Matter_TLV_item_parse, /* name */ + be_nested_proto( + 10, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[25]) { /* constants */ + /* K0 */ be_nested_str_weak(typ), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(_len), + /* K3 */ be_nested_str_weak(val), + /* K4 */ be_nested_str_weak(int64), + /* K5 */ be_nested_str_weak(frombytes), + /* K6 */ be_nested_str_weak(BFALSE), + /* K7 */ be_nested_str_weak(BTRUE), + /* K8 */ be_nested_str_weak(U8), + /* K9 */ be_nested_str_weak(I8), + /* K10 */ be_nested_str_weak(geti), + /* K11 */ be_nested_str_weak(get), + /* K12 */ be_nested_str_weak(FLOAT), + /* K13 */ be_nested_str_weak(getfloat), + /* K14 */ be_const_int(1), + /* K15 */ be_nested_str_weak(UTF8), + /* K16 */ be_nested_str_weak(asstring), + /* K17 */ be_nested_str_weak(NULL), + /* K18 */ be_nested_str_weak(EOC), + /* K19 */ be_nested_str_weak(tasmota), + /* K20 */ be_nested_str_weak(log), + /* K21 */ be_nested_str_weak(MTR_X3A_X20unexpected_X20eoc), + /* K22 */ be_const_int(3), + /* K23 */ be_nested_str_weak(MTR_X3A_X20unexpected_X20type_X3A_X20), + /* K24 */ be_nested_str_weak(next_idx), + }), + be_str_weak(parse), + &be_const_str_solidified, + ( &(const binstruction[105]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x88100101, // 0001 GETMBR R4 R0 K1 + 0x88140902, // 0002 GETMBR R5 R4 K2 + 0x94140A03, // 0003 GETIDX R5 R5 R3 + 0x541A0007, // 0004 LDINT R6 8 + 0x1C180A06, // 0005 EQ R6 R5 R6 + 0x781A000A, // 0006 JMPF R6 #0012 + 0xB81A0800, // 0007 GETNGBL R6 K4 + 0x7C180000, // 0008 CALL R6 0 + 0x90020606, // 0009 SETMBR R0 K3 R6 + 0x88180103, // 000A GETMBR R6 R0 K3 + 0x8C180D05, // 000B GETMET R6 R6 K5 + 0x5C200200, // 000C MOVE R8 R1 + 0x5C240400, // 000D MOVE R9 R2 + 0x7C180600, // 000E CALL R6 3 + 0x541A0007, // 000F LDINT R6 8 + 0x00080406, // 0010 ADD R2 R2 R6 + 0x70020054, // 0011 JMP #0067 + 0x88180906, // 0012 GETMBR R6 R4 K6 + 0x1C180606, // 0013 EQ R6 R3 R6 + 0x741A0002, // 0014 JMPT R6 #0018 + 0x88180907, // 0015 GETMBR R6 R4 K7 + 0x1C180606, // 0016 EQ R6 R3 R6 + 0x781A0003, // 0017 JMPF R6 #001C + 0x88180907, // 0018 GETMBR R6 R4 K7 + 0x1C180606, // 0019 EQ R6 R3 R6 + 0x90020606, // 001A SETMBR R0 K3 R6 + 0x7002004A, // 001B JMP #0067 + 0x88180908, // 001C GETMBR R6 R4 K8 + 0x14180606, // 001D LT R6 R3 R6 + 0x781A000E, // 001E JMPF R6 #002E + 0x88180909, // 001F GETMBR R6 R4 K9 + 0x18180606, // 0020 LE R6 R3 R6 + 0x781A0004, // 0021 JMPF R6 #0027 + 0x8C18030A, // 0022 GETMET R6 R1 K10 + 0x5C200400, // 0023 MOVE R8 R2 + 0x5C240A00, // 0024 MOVE R9 R5 + 0x7C180600, // 0025 CALL R6 3 + 0x70020003, // 0026 JMP #002B + 0x8C18030B, // 0027 GETMET R6 R1 K11 + 0x5C200400, // 0028 MOVE R8 R2 + 0x5C240A00, // 0029 MOVE R9 R5 + 0x7C180600, // 002A CALL R6 3 + 0x90020606, // 002B SETMBR R0 K3 R6 + 0x00080405, // 002C ADD R2 R2 R5 + 0x70020038, // 002D JMP #0067 + 0x8818090C, // 002E GETMBR R6 R4 K12 + 0x1C180606, // 002F EQ R6 R3 R6 + 0x781A0006, // 0030 JMPF R6 #0038 + 0x8C18030D, // 0031 GETMET R6 R1 K13 + 0x5C200400, // 0032 MOVE R8 R2 + 0x7C180400, // 0033 CALL R6 2 + 0x90020606, // 0034 SETMBR R0 K3 R6 + 0x541A0003, // 0035 LDINT R6 4 + 0x00080406, // 0036 ADD R2 R2 R6 + 0x7002002E, // 0037 JMP #0067 + 0x5419FFF7, // 0038 LDINT R6 -8 + 0x28180A06, // 0039 GE R6 R5 R6 + 0x781A0016, // 003A JMPF R6 #0052 + 0x5419FFFE, // 003B LDINT R6 -1 + 0x18180A06, // 003C LE R6 R5 R6 + 0x781A0013, // 003D JMPF R6 #0052 + 0x8C18030B, // 003E GETMET R6 R1 K11 + 0x5C200400, // 003F MOVE R8 R2 + 0x44240A00, // 0040 NEG R9 R5 + 0x7C180600, // 0041 CALL R6 3 + 0x441C0A00, // 0042 NEG R7 R5 + 0x00080407, // 0043 ADD R2 R2 R7 + 0x001C0406, // 0044 ADD R7 R2 R6 + 0x041C0F0E, // 0045 SUB R7 R7 K14 + 0x401C0407, // 0046 CONNECT R7 R2 R7 + 0x941C0207, // 0047 GETIDX R7 R1 R7 + 0x90020607, // 0048 SETMBR R0 K3 R7 + 0x00080406, // 0049 ADD R2 R2 R6 + 0x881C090F, // 004A GETMBR R7 R4 K15 + 0x181C0607, // 004B LE R7 R3 R7 + 0x781E0003, // 004C JMPF R7 #0051 + 0x881C0103, // 004D GETMBR R7 R0 K3 + 0x8C1C0F10, // 004E GETMET R7 R7 K16 + 0x7C1C0200, // 004F CALL R7 1 + 0x90020607, // 0050 SETMBR R0 K3 R7 + 0x70020014, // 0051 JMP #0067 + 0x88180911, // 0052 GETMBR R6 R4 K17 + 0x1C180606, // 0053 EQ R6 R3 R6 + 0x781A0000, // 0054 JMPF R6 #0056 + 0x70020010, // 0055 JMP #0067 + 0x88180912, // 0056 GETMBR R6 R4 K18 + 0x1C180606, // 0057 EQ R6 R3 R6 + 0x781A0005, // 0058 JMPF R6 #005F + 0xB81A2600, // 0059 GETNGBL R6 K19 + 0x8C180D14, // 005A GETMET R6 R6 K20 + 0x58200015, // 005B LDCONST R8 K21 + 0x58240016, // 005C LDCONST R9 K22 + 0x7C180600, // 005D CALL R6 3 + 0x70020007, // 005E JMP #0067 + 0xB81A2600, // 005F GETNGBL R6 K19 + 0x8C180D14, // 0060 GETMET R6 R6 K20 + 0x60200008, // 0061 GETGBL R8 G8 + 0x5C240600, // 0062 MOVE R9 R3 + 0x7C200200, // 0063 CALL R8 1 + 0x00222E08, // 0064 ADD R8 K23 R8 + 0x58240016, // 0065 LDCONST R9 K22 + 0x7C180600, // 0066 CALL R6 3 + 0x90023002, // 0067 SETMBR R0 K24 R2 + 0x80040400, // 0068 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _cmp_gt +********************************************************************/ +be_local_closure(Matter_TLV_item__cmp_gt, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tag_vendor), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(tag_profile), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(tag_number), + /* K5 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(_cmp_gt), + &be_const_str_solidified, + ( &(const binstruction[72]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0012, // 0003 JMPF R2 #0017 + 0x88080300, // 0004 GETMBR R2 R1 K0 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C080403, // 0006 EQ R2 R2 R3 + 0x780A0000, // 0007 JMPF R2 #0009 + 0x80060200, // 0008 RET 1 K1 + 0x88080100, // 0009 GETMBR R2 R0 K0 + 0x880C0300, // 000A GETMBR R3 R1 K0 + 0x24080403, // 000B GT R2 R2 R3 + 0x780A0000, // 000C JMPF R2 #000E + 0x80060200, // 000D RET 1 K1 + 0x88080100, // 000E GETMBR R2 R0 K0 + 0x880C0300, // 000F GETMBR R3 R1 K0 + 0x1C080403, // 0010 EQ R2 R2 R3 + 0x780A0004, // 0011 JMPF R2 #0017 + 0x88080102, // 0012 GETMBR R2 R0 K2 + 0x880C0302, // 0013 GETMBR R3 R1 K2 + 0x24080403, // 0014 GT R2 R2 R3 + 0x780A0000, // 0015 JMPF R2 #0017 + 0x80060200, // 0016 RET 1 K1 + 0x88080102, // 0017 GETMBR R2 R0 K2 + 0x540DFFFE, // 0018 LDINT R3 -1 + 0x1C080403, // 0019 EQ R2 R2 R3 + 0x780A0005, // 001A JMPF R2 #0021 + 0x88080302, // 001B GETMBR R2 R1 K2 + 0x4C0C0000, // 001C LDNIL R3 + 0x1C080403, // 001D EQ R2 R2 R3 + 0x780A0000, // 001E JMPF R2 #0020 + 0x80060200, // 001F RET 1 K1 + 0x70020008, // 0020 JMP #002A + 0x88080102, // 0021 GETMBR R2 R0 K2 + 0x4C0C0000, // 0022 LDNIL R3 + 0x1C080403, // 0023 EQ R2 R2 R3 + 0x780A0004, // 0024 JMPF R2 #002A + 0x88080302, // 0025 GETMBR R2 R1 K2 + 0x540DFFFE, // 0026 LDINT R3 -1 + 0x1C080403, // 0027 EQ R2 R2 R3 + 0x780A0000, // 0028 JMPF R2 #002A + 0x80060600, // 0029 RET 1 K3 + 0x88080104, // 002A GETMBR R2 R0 K4 + 0x4C0C0000, // 002B LDNIL R3 + 0x20080403, // 002C NE R2 R2 R3 + 0x780A000A, // 002D JMPF R2 #0039 + 0x88080304, // 002E GETMBR R2 R1 K4 + 0x4C0C0000, // 002F LDNIL R3 + 0x1C080403, // 0030 EQ R2 R2 R3 + 0x780A0000, // 0031 JMPF R2 #0033 + 0x80060200, // 0032 RET 1 K1 + 0x88080104, // 0033 GETMBR R2 R0 K4 + 0x880C0304, // 0034 GETMBR R3 R1 K4 + 0x24080403, // 0035 GT R2 R2 R3 + 0x780A0000, // 0036 JMPF R2 #0038 + 0x80060200, // 0037 RET 1 K1 + 0x80060600, // 0038 RET 1 K3 + 0x88080105, // 0039 GETMBR R2 R0 K5 + 0x4C0C0000, // 003A LDNIL R3 + 0x20080403, // 003B NE R2 R2 R3 + 0x780A0009, // 003C JMPF R2 #0047 + 0x88080305, // 003D GETMBR R2 R1 K5 + 0x4C0C0000, // 003E LDNIL R3 + 0x1C080403, // 003F EQ R2 R2 R3 + 0x780A0000, // 0040 JMPF R2 #0042 + 0x80060200, // 0041 RET 1 K1 + 0x88080105, // 0042 GETMBR R2 R0 K5 + 0x880C0305, // 0043 GETMBR R3 R1 K5 + 0x24080403, // 0044 GT R2 R2 R3 + 0x780A0000, // 0045 JMPF R2 #0047 + 0x80060200, // 0046 RET 1 K1 + 0x80060600, // 0047 RET 1 K3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: create_TLV +********************************************************************/ +be_local_closure(Matter_TLV_item_create_TLV, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_TLV_item), + /* K1 */ be_nested_str_weak(typ), + /* K2 */ be_nested_str_weak(val), + }), + be_str_weak(create_TLV), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x200C0203, // 0002 NE R3 R1 R3 + 0x740E0002, // 0003 JMPT R3 #0007 + 0x540E0013, // 0004 LDINT R3 20 + 0x1C0C0003, // 0005 EQ R3 R0 R3 + 0x780E0004, // 0006 JMPF R3 #000C + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x900E0200, // 0009 SETMBR R3 K1 R0 + 0x900E0401, // 000A SETMBR R3 K2 R1 + 0x80040600, // 000B RET 1 R3 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: to_TLV +********************************************************************/ +be_local_closure(Matter_TLV_item_to_TLV, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(to_TLV), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040000, // 0000 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _encode_tag +********************************************************************/ +be_local_closure(Matter_TLV_item__encode_tag, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(tag_number), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(tag_vendor), + /* K3 */ be_nested_str_weak(add), + /* K4 */ be_nested_str_weak(typ), + /* K5 */ be_const_int(1), + /* K6 */ be_const_int(2), + /* K7 */ be_nested_str_weak(tag_profile), + /* K8 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(_encode_tag), + &be_const_str_solidified, + ( &(const binstruction[133]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0001, // 0003 JMPF R2 #0006 + 0x88080100, // 0004 GETMBR R2 R0 K0 + 0x70020000, // 0005 JMP #0007 + 0x58080001, // 0006 LDCONST R2 K1 + 0x540EFFFF, // 0007 LDINT R3 65536 + 0x280C0403, // 0008 GE R3 R2 R3 + 0x740E0002, // 0009 JMPT R3 #000D + 0x140C0501, // 000A LT R3 R2 K1 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x58100001, // 000E LDCONST R4 K1 + 0x88140102, // 000F GETMBR R5 R0 K2 + 0x4C180000, // 0010 LDNIL R6 + 0x20140A06, // 0011 NE R5 R5 R6 + 0x78160026, // 0012 JMPF R5 #003A + 0x780E0012, // 0013 JMPF R3 #0027 + 0x8C140303, // 0014 GETMET R5 R1 K3 + 0x541E00DF, // 0015 LDINT R7 224 + 0x88200104, // 0016 GETMBR R8 R0 K4 + 0x001C0E08, // 0017 ADD R7 R7 R8 + 0x58200005, // 0018 LDCONST R8 K5 + 0x7C140600, // 0019 CALL R5 3 + 0x8C140303, // 001A GETMET R5 R1 K3 + 0x881C0102, // 001B GETMBR R7 R0 K2 + 0x58200006, // 001C LDCONST R8 K6 + 0x7C140600, // 001D CALL R5 3 + 0x8C140303, // 001E GETMET R5 R1 K3 + 0x881C0107, // 001F GETMBR R7 R0 K7 + 0x58200006, // 0020 LDCONST R8 K6 + 0x7C140600, // 0021 CALL R5 3 + 0x8C140303, // 0022 GETMET R5 R1 K3 + 0x881C0100, // 0023 GETMBR R7 R0 K0 + 0x54220003, // 0024 LDINT R8 4 + 0x7C140600, // 0025 CALL R5 3 + 0x70020011, // 0026 JMP #0039 + 0x8C140303, // 0027 GETMET R5 R1 K3 + 0x541E00BF, // 0028 LDINT R7 192 + 0x88200104, // 0029 GETMBR R8 R0 K4 + 0x001C0E08, // 002A ADD R7 R7 R8 + 0x58200005, // 002B LDCONST R8 K5 + 0x7C140600, // 002C CALL R5 3 + 0x8C140303, // 002D GETMET R5 R1 K3 + 0x881C0102, // 002E GETMBR R7 R0 K2 + 0x58200006, // 002F LDCONST R8 K6 + 0x7C140600, // 0030 CALL R5 3 + 0x8C140303, // 0031 GETMET R5 R1 K3 + 0x881C0107, // 0032 GETMBR R7 R0 K7 + 0x58200006, // 0033 LDCONST R8 K6 + 0x7C140600, // 0034 CALL R5 3 + 0x8C140303, // 0035 GETMET R5 R1 K3 + 0x881C0100, // 0036 GETMBR R7 R0 K0 + 0x58200006, // 0037 LDCONST R8 K6 + 0x7C140600, // 0038 CALL R5 3 + 0x70020049, // 0039 JMP #0084 + 0x88140107, // 003A GETMBR R5 R0 K7 + 0x5419FFFE, // 003B LDINT R6 -1 + 0x1C140A06, // 003C EQ R5 R5 R6 + 0x78160016, // 003D JMPF R5 #0055 + 0x780E000A, // 003E JMPF R3 #004A + 0x8C140303, // 003F GETMET R5 R1 K3 + 0x541E005F, // 0040 LDINT R7 96 + 0x88200104, // 0041 GETMBR R8 R0 K4 + 0x001C0E08, // 0042 ADD R7 R7 R8 + 0x58200005, // 0043 LDCONST R8 K5 + 0x7C140600, // 0044 CALL R5 3 + 0x8C140303, // 0045 GETMET R5 R1 K3 + 0x881C0100, // 0046 GETMBR R7 R0 K0 + 0x54220003, // 0047 LDINT R8 4 + 0x7C140600, // 0048 CALL R5 3 + 0x70020009, // 0049 JMP #0054 + 0x8C140303, // 004A GETMET R5 R1 K3 + 0x541E003F, // 004B LDINT R7 64 + 0x88200104, // 004C GETMBR R8 R0 K4 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x58200005, // 004E LDCONST R8 K5 + 0x7C140600, // 004F CALL R5 3 + 0x8C140303, // 0050 GETMET R5 R1 K3 + 0x881C0100, // 0051 GETMBR R7 R0 K0 + 0x58200006, // 0052 LDCONST R8 K6 + 0x7C140600, // 0053 CALL R5 3 + 0x7002002E, // 0054 JMP #0084 + 0x88140107, // 0055 GETMBR R5 R0 K7 + 0x4C180000, // 0056 LDNIL R6 + 0x20140A06, // 0057 NE R5 R5 R6 + 0x78160016, // 0058 JMPF R5 #0070 + 0x780E000A, // 0059 JMPF R3 #0065 + 0x8C140303, // 005A GETMET R5 R1 K3 + 0x541E009F, // 005B LDINT R7 160 + 0x88200104, // 005C GETMBR R8 R0 K4 + 0x001C0E08, // 005D ADD R7 R7 R8 + 0x58200005, // 005E LDCONST R8 K5 + 0x7C140600, // 005F CALL R5 3 + 0x8C140303, // 0060 GETMET R5 R1 K3 + 0x881C0100, // 0061 GETMBR R7 R0 K0 + 0x54220003, // 0062 LDINT R8 4 + 0x7C140600, // 0063 CALL R5 3 + 0x70020009, // 0064 JMP #006F + 0x8C140303, // 0065 GETMET R5 R1 K3 + 0x541E007F, // 0066 LDINT R7 128 + 0x88200104, // 0067 GETMBR R8 R0 K4 + 0x001C0E08, // 0068 ADD R7 R7 R8 + 0x58200005, // 0069 LDCONST R8 K5 + 0x7C140600, // 006A CALL R5 3 + 0x8C140303, // 006B GETMET R5 R1 K3 + 0x881C0100, // 006C GETMBR R7 R0 K0 + 0x58200006, // 006D LDCONST R8 K6 + 0x7C140600, // 006E CALL R5 3 + 0x70020013, // 006F JMP #0084 + 0x88140108, // 0070 GETMBR R5 R0 K8 + 0x4C180000, // 0071 LDNIL R6 + 0x20140A06, // 0072 NE R5 R5 R6 + 0x7816000A, // 0073 JMPF R5 #007F + 0x8C140303, // 0074 GETMET R5 R1 K3 + 0x541E001F, // 0075 LDINT R7 32 + 0x88200104, // 0076 GETMBR R8 R0 K4 + 0x001C0E08, // 0077 ADD R7 R7 R8 + 0x58200005, // 0078 LDCONST R8 K5 + 0x7C140600, // 0079 CALL R5 3 + 0x8C140303, // 007A GETMET R5 R1 K3 + 0x881C0108, // 007B GETMBR R7 R0 K8 + 0x58200005, // 007C LDCONST R8 K5 + 0x7C140600, // 007D CALL R5 3 + 0x70020004, // 007E JMP #0084 + 0x8C140303, // 007F GETMET R5 R1 K3 + 0x881C0104, // 0080 GETMBR R7 R0 K4 + 0x001E0207, // 0081 ADD R7 K1 R7 + 0x58200005, // 0082 LDCONST R8 K5 + 0x7C140600, // 0083 CALL R5 3 + 0x80000000, // 0084 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_contextspecific ********************************************************************/ @@ -747,6 +977,110 @@ be_local_closure(Matter_TLV_item_set_contextspecific, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: reset +********************************************************************/ +be_local_closure(Matter_TLV_item_reset, /* name */ + be_nested_proto( + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(parent), + /* K1 */ be_nested_str_weak(next_idx), + /* K2 */ be_nested_str_weak(tag_vendor), + /* K3 */ be_nested_str_weak(tag_profile), + /* K4 */ be_nested_str_weak(tag_number), + /* K5 */ be_nested_str_weak(tag_sub), + /* K6 */ be_nested_str_weak(typ), + /* K7 */ be_nested_str_weak(val), + }), + be_str_weak(reset), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x90020202, // 0002 SETMBR R0 K1 R2 + 0x90020402, // 0003 SETMBR R0 K2 R2 + 0x90020602, // 0004 SETMBR R0 K3 R2 + 0x90020802, // 0005 SETMBR R0 K4 R2 + 0x90020A02, // 0006 SETMBR R0 K5 R2 + 0x90020C02, // 0007 SETMBR R0 K6 R2 + 0x90020E02, // 0008 SETMBR R0 K7 R2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort +********************************************************************/ +be_local_closure(Matter_TLV_item_sort, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_TLV_item), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(_cmp_gt), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(sort), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020013, // 0008 EXBLK 0 #001D + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A000B, // 000E JMPF R6 #001B + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x8C180D03, // 0011 GETMET R6 R6 K3 + 0x5C200800, // 0012 MOVE R8 R4 + 0x7C180400, // 0013 CALL R6 2 + 0x24180D02, // 0014 GT R6 R6 K2 + 0x781A0004, // 0015 JMPF R6 #001B + 0x04180B01, // 0016 SUB R6 R5 K1 + 0x94180006, // 0017 GETIDX R6 R0 R6 + 0x98000A06, // 0018 SETIDX R0 R5 R6 + 0x04140B01, // 0019 SUB R5 R5 K1 + 0x7001FFF1, // 001A JMP #000D + 0x98000A04, // 001B SETIDX R0 R5 R4 + 0x7001FFEB, // 001C JMP #0009 + 0x58080004, // 001D LDCONST R2 K4 + 0xAC080200, // 001E CATCH R2 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x80040000, // 0020 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: set_fulltag ********************************************************************/ @@ -790,13 +1124,40 @@ be_local_closure(Matter_TLV_item_set_fulltag, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: set_parent +********************************************************************/ +be_local_closure(Matter_TLV_item_set_parent, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parent), + }), + be_str_weak(set_parent), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: tostring ********************************************************************/ be_local_closure(Matter_TLV_item_tostring, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 7, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -841,171 +1202,202 @@ be_local_closure(Matter_TLV_item_tostring, /* name */ }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[164]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0xA8020099, // 0001 EXBLK 0 #009C - 0x88080101, // 0002 GETMBR R2 R0 K1 - 0x540DFFFE, // 0003 LDINT R3 -1 - 0x1C080403, // 0004 EQ R2 R2 R3 - 0x780A000A, // 0005 JMPF R2 #0011 - 0x00040302, // 0006 ADD R1 R1 K2 - 0x88080103, // 0007 GETMBR R2 R0 K3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x20080403, // 0009 NE R2 R2 R3 - 0x780A0004, // 000A JMPF R2 #0010 - 0x60080018, // 000B GETGBL R2 G24 - 0x580C0004, // 000C LDCONST R3 K4 - 0x88100103, // 000D GETMBR R4 R0 K3 - 0x7C080400, // 000E CALL R2 2 - 0x00040202, // 000F ADD R1 R1 R2 - 0x70020023, // 0010 JMP #0035 - 0x88080105, // 0011 GETMBR R2 R0 K5 - 0x4C0C0000, // 0012 LDNIL R3 - 0x20080403, // 0013 NE R2 R2 R3 - 0x780A0004, // 0014 JMPF R2 #001A - 0x60080018, // 0015 GETGBL R2 G24 - 0x580C0006, // 0016 LDCONST R3 K6 - 0x88100105, // 0017 GETMBR R4 R0 K5 - 0x7C080400, // 0018 CALL R2 2 - 0x00040202, // 0019 ADD R1 R1 R2 - 0x88080101, // 001A GETMBR R2 R0 K1 - 0x4C0C0000, // 001B LDNIL R3 - 0x20080403, // 001C NE R2 R2 R3 - 0x780A0004, // 001D JMPF R2 #0023 - 0x60080018, // 001E GETGBL R2 G24 - 0x580C0007, // 001F LDCONST R3 K7 - 0x88100101, // 0020 GETMBR R4 R0 K1 - 0x7C080400, // 0021 CALL R2 2 - 0x00040202, // 0022 ADD R1 R1 R2 - 0x88080103, // 0023 GETMBR R2 R0 K3 - 0x4C0C0000, // 0024 LDNIL R3 - 0x20080403, // 0025 NE R2 R2 R3 - 0x780A0004, // 0026 JMPF R2 #002C - 0x60080018, // 0027 GETGBL R2 G24 - 0x580C0004, // 0028 LDCONST R3 K4 - 0x88100103, // 0029 GETMBR R4 R0 K3 - 0x7C080400, // 002A CALL R2 2 - 0x00040202, // 002B ADD R1 R1 R2 - 0x88080108, // 002C GETMBR R2 R0 K8 - 0x4C0C0000, // 002D LDNIL R3 - 0x20080403, // 002E NE R2 R2 R3 - 0x780A0004, // 002F JMPF R2 #0035 - 0x60080018, // 0030 GETGBL R2 G24 - 0x580C0009, // 0031 LDCONST R3 K9 - 0x88100108, // 0032 GETMBR R4 R0 K8 - 0x7C080400, // 0033 CALL R2 2 - 0x00040202, // 0034 ADD R1 R1 R2 - 0x6008000C, // 0035 GETGBL R2 G12 - 0x5C0C0200, // 0036 MOVE R3 R1 - 0x7C080200, // 0037 CALL R2 1 - 0x2408050A, // 0038 GT R2 R2 K10 - 0x780A0000, // 0039 JMPF R2 #003B - 0x0004030B, // 003A ADD R1 R1 K11 - 0x60080004, // 003B GETGBL R2 G4 - 0x880C010C, // 003C GETMBR R3 R0 K12 - 0x7C080200, // 003D CALL R2 1 - 0x1C08050D, // 003E EQ R2 R2 K13 - 0x780A0010, // 003F JMPF R2 #0051 - 0x60080018, // 0040 GETGBL R2 G24 - 0x580C000E, // 0041 LDCONST R3 K14 - 0x8810010C, // 0042 GETMBR R4 R0 K12 - 0x7C080400, // 0043 CALL R2 2 - 0x00040202, // 0044 ADD R1 R1 R2 - 0x8808010F, // 0045 GETMBR R2 R0 K15 - 0x880C0110, // 0046 GETMBR R3 R0 K16 - 0x880C0711, // 0047 GETMBR R3 R3 K17 - 0x28080403, // 0048 GE R2 R2 R3 - 0x780A0005, // 0049 JMPF R2 #0050 - 0x8808010F, // 004A GETMBR R2 R0 K15 - 0x880C0110, // 004B GETMBR R3 R0 K16 - 0x880C0712, // 004C GETMBR R3 R3 K18 - 0x18080403, // 004D LE R2 R2 R3 - 0x780A0000, // 004E JMPF R2 #0050 - 0x00040313, // 004F ADD R1 R1 K19 - 0x70020048, // 0050 JMP #009A - 0x60080004, // 0051 GETGBL R2 G4 - 0x880C010C, // 0052 GETMBR R3 R0 K12 - 0x7C080200, // 0053 CALL R2 1 - 0x1C080514, // 0054 EQ R2 R2 K20 - 0x780A0006, // 0055 JMPF R2 #005D - 0x8808010C, // 0056 GETMBR R2 R0 K12 - 0x780A0001, // 0057 JMPF R2 #005A - 0x58080015, // 0058 LDCONST R2 K21 - 0x70020000, // 0059 JMP #005B - 0x58080016, // 005A LDCONST R2 K22 - 0x00040202, // 005B ADD R1 R1 R2 - 0x7002003C, // 005C JMP #009A - 0x8808010C, // 005D GETMBR R2 R0 K12 - 0x4C0C0000, // 005E LDNIL R3 - 0x1C080403, // 005F EQ R2 R2 R3 - 0x780A0001, // 0060 JMPF R2 #0063 - 0x00040317, // 0061 ADD R1 R1 K23 - 0x70020036, // 0062 JMP #009A - 0x60080004, // 0063 GETGBL R2 G4 - 0x880C010C, // 0064 GETMBR R3 R0 K12 - 0x7C080200, // 0065 CALL R2 1 - 0x1C080518, // 0066 EQ R2 R2 K24 - 0x780A0005, // 0067 JMPF R2 #006E - 0x60080018, // 0068 GETGBL R2 G24 - 0x580C0019, // 0069 LDCONST R3 K25 - 0x8810010C, // 006A GETMBR R4 R0 K12 - 0x7C080400, // 006B CALL R2 2 - 0x00040202, // 006C ADD R1 R1 R2 - 0x7002002B, // 006D JMP #009A - 0x60080004, // 006E GETGBL R2 G4 - 0x880C010C, // 006F GETMBR R3 R0 K12 - 0x7C080200, // 0070 CALL R2 1 - 0x1C08051A, // 0071 EQ R2 R2 K26 - 0x780A0005, // 0072 JMPF R2 #0079 - 0x60080018, // 0073 GETGBL R2 G24 - 0x580C001B, // 0074 LDCONST R3 K27 - 0x8810010C, // 0075 GETMBR R4 R0 K12 - 0x7C080400, // 0076 CALL R2 2 - 0x00040202, // 0077 ADD R1 R1 R2 - 0x70020020, // 0078 JMP #009A - 0x6008000F, // 0079 GETGBL R2 G15 - 0x880C010C, // 007A GETMBR R3 R0 K12 - 0xB8123800, // 007B GETNGBL R4 K28 - 0x7C080400, // 007C CALL R2 2 - 0x780A000F, // 007D JMPF R2 #008E - 0x8808010C, // 007E GETMBR R2 R0 K12 - 0x8C08051D, // 007F GETMET R2 R2 K29 - 0x7C080200, // 0080 CALL R2 1 - 0x00040202, // 0081 ADD R1 R1 R2 - 0x8808010F, // 0082 GETMBR R2 R0 K15 - 0x880C0110, // 0083 GETMBR R3 R0 K16 - 0x880C0711, // 0084 GETMBR R3 R3 K17 - 0x28080403, // 0085 GE R2 R2 R3 - 0x780A0005, // 0086 JMPF R2 #008D - 0x8808010F, // 0087 GETMBR R2 R0 K15 - 0x880C0110, // 0088 GETMBR R3 R0 K16 - 0x880C0712, // 0089 GETMBR R3 R3 K18 - 0x18080403, // 008A LE R2 R2 R3 - 0x780A0000, // 008B JMPF R2 #008D - 0x00040313, // 008C ADD R1 R1 K19 - 0x7002000B, // 008D JMP #009A - 0x60080004, // 008E GETGBL R2 G4 - 0x880C010C, // 008F GETMBR R3 R0 K12 - 0x7C080200, // 0090 CALL R2 1 - 0x1C08051E, // 0091 EQ R2 R2 K30 - 0x780A0006, // 0092 JMPF R2 #009A - 0x60080018, // 0093 GETGBL R2 G24 - 0x580C001F, // 0094 LDCONST R3 K31 - 0x8810010C, // 0095 GETMBR R4 R0 K12 - 0x8C100920, // 0096 GETMET R4 R4 K32 - 0x7C100200, // 0097 CALL R4 1 - 0x7C080400, // 0098 CALL R2 2 - 0x00040202, // 0099 ADD R1 R1 R2 - 0xA8040001, // 009A EXBLK 1 1 - 0x70020006, // 009B JMP #00A3 - 0xAC080002, // 009C CATCH R2 0 2 - 0x70020003, // 009D JMP #00A2 - 0x00100521, // 009E ADD R4 R2 K33 - 0x00100803, // 009F ADD R4 R4 R3 - 0x80040800, // 00A0 RET 1 R4 - 0x70020000, // 00A1 JMP #00A3 - 0xB0080000, // 00A2 RAISE 2 R0 R0 - 0x80040200, // 00A3 RET 1 R1 + ( &(const binstruction[167]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0xA802009C, // 0001 EXBLK 0 #009F + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x200C0203, // 0003 NE R3 R1 R3 + 0x780E0038, // 0004 JMPF R3 #003E + 0x880C0101, // 0005 GETMBR R3 R0 K1 + 0x5411FFFE, // 0006 LDINT R4 -1 + 0x1C0C0604, // 0007 EQ R3 R3 R4 + 0x780E000A, // 0008 JMPF R3 #0014 + 0x00080502, // 0009 ADD R2 R2 K2 + 0x880C0103, // 000A GETMBR R3 R0 K3 + 0x4C100000, // 000B LDNIL R4 + 0x200C0604, // 000C NE R3 R3 R4 + 0x780E0004, // 000D JMPF R3 #0013 + 0x600C0018, // 000E GETGBL R3 G24 + 0x58100004, // 000F LDCONST R4 K4 + 0x88140103, // 0010 GETMBR R5 R0 K3 + 0x7C0C0400, // 0011 CALL R3 2 + 0x00080403, // 0012 ADD R2 R2 R3 + 0x70020023, // 0013 JMP #0038 + 0x880C0105, // 0014 GETMBR R3 R0 K5 + 0x4C100000, // 0015 LDNIL R4 + 0x200C0604, // 0016 NE R3 R3 R4 + 0x780E0004, // 0017 JMPF R3 #001D + 0x600C0018, // 0018 GETGBL R3 G24 + 0x58100006, // 0019 LDCONST R4 K6 + 0x88140105, // 001A GETMBR R5 R0 K5 + 0x7C0C0400, // 001B CALL R3 2 + 0x00080403, // 001C ADD R2 R2 R3 + 0x880C0101, // 001D GETMBR R3 R0 K1 + 0x4C100000, // 001E LDNIL R4 + 0x200C0604, // 001F NE R3 R3 R4 + 0x780E0004, // 0020 JMPF R3 #0026 + 0x600C0018, // 0021 GETGBL R3 G24 + 0x58100007, // 0022 LDCONST R4 K7 + 0x88140101, // 0023 GETMBR R5 R0 K1 + 0x7C0C0400, // 0024 CALL R3 2 + 0x00080403, // 0025 ADD R2 R2 R3 + 0x880C0103, // 0026 GETMBR R3 R0 K3 + 0x4C100000, // 0027 LDNIL R4 + 0x200C0604, // 0028 NE R3 R3 R4 + 0x780E0004, // 0029 JMPF R3 #002F + 0x600C0018, // 002A GETGBL R3 G24 + 0x58100004, // 002B LDCONST R4 K4 + 0x88140103, // 002C GETMBR R5 R0 K3 + 0x7C0C0400, // 002D CALL R3 2 + 0x00080403, // 002E ADD R2 R2 R3 + 0x880C0108, // 002F GETMBR R3 R0 K8 + 0x4C100000, // 0030 LDNIL R4 + 0x200C0604, // 0031 NE R3 R3 R4 + 0x780E0004, // 0032 JMPF R3 #0038 + 0x600C0018, // 0033 GETGBL R3 G24 + 0x58100009, // 0034 LDCONST R4 K9 + 0x88140108, // 0035 GETMBR R5 R0 K8 + 0x7C0C0400, // 0036 CALL R3 2 + 0x00080403, // 0037 ADD R2 R2 R3 + 0x600C000C, // 0038 GETGBL R3 G12 + 0x5C100400, // 0039 MOVE R4 R2 + 0x7C0C0200, // 003A CALL R3 1 + 0x240C070A, // 003B GT R3 R3 K10 + 0x780E0000, // 003C JMPF R3 #003E + 0x0008050B, // 003D ADD R2 R2 K11 + 0x600C0004, // 003E GETGBL R3 G4 + 0x8810010C, // 003F GETMBR R4 R0 K12 + 0x7C0C0200, // 0040 CALL R3 1 + 0x1C0C070D, // 0041 EQ R3 R3 K13 + 0x780E0010, // 0042 JMPF R3 #0054 + 0x600C0018, // 0043 GETGBL R3 G24 + 0x5810000E, // 0044 LDCONST R4 K14 + 0x8814010C, // 0045 GETMBR R5 R0 K12 + 0x7C0C0400, // 0046 CALL R3 2 + 0x00080403, // 0047 ADD R2 R2 R3 + 0x880C010F, // 0048 GETMBR R3 R0 K15 + 0x88100110, // 0049 GETMBR R4 R0 K16 + 0x88100911, // 004A GETMBR R4 R4 K17 + 0x280C0604, // 004B GE R3 R3 R4 + 0x780E0005, // 004C JMPF R3 #0053 + 0x880C010F, // 004D GETMBR R3 R0 K15 + 0x88100110, // 004E GETMBR R4 R0 K16 + 0x88100912, // 004F GETMBR R4 R4 K18 + 0x180C0604, // 0050 LE R3 R3 R4 + 0x780E0000, // 0051 JMPF R3 #0053 + 0x00080513, // 0052 ADD R2 R2 K19 + 0x70020048, // 0053 JMP #009D + 0x600C0004, // 0054 GETGBL R3 G4 + 0x8810010C, // 0055 GETMBR R4 R0 K12 + 0x7C0C0200, // 0056 CALL R3 1 + 0x1C0C0714, // 0057 EQ R3 R3 K20 + 0x780E0006, // 0058 JMPF R3 #0060 + 0x880C010C, // 0059 GETMBR R3 R0 K12 + 0x780E0001, // 005A JMPF R3 #005D + 0x580C0015, // 005B LDCONST R3 K21 + 0x70020000, // 005C JMP #005E + 0x580C0016, // 005D LDCONST R3 K22 + 0x00080403, // 005E ADD R2 R2 R3 + 0x7002003C, // 005F JMP #009D + 0x880C010C, // 0060 GETMBR R3 R0 K12 + 0x4C100000, // 0061 LDNIL R4 + 0x1C0C0604, // 0062 EQ R3 R3 R4 + 0x780E0001, // 0063 JMPF R3 #0066 + 0x00080517, // 0064 ADD R2 R2 K23 + 0x70020036, // 0065 JMP #009D + 0x600C0004, // 0066 GETGBL R3 G4 + 0x8810010C, // 0067 GETMBR R4 R0 K12 + 0x7C0C0200, // 0068 CALL R3 1 + 0x1C0C0718, // 0069 EQ R3 R3 K24 + 0x780E0005, // 006A JMPF R3 #0071 + 0x600C0018, // 006B GETGBL R3 G24 + 0x58100019, // 006C LDCONST R4 K25 + 0x8814010C, // 006D GETMBR R5 R0 K12 + 0x7C0C0400, // 006E CALL R3 2 + 0x00080403, // 006F ADD R2 R2 R3 + 0x7002002B, // 0070 JMP #009D + 0x600C0004, // 0071 GETGBL R3 G4 + 0x8810010C, // 0072 GETMBR R4 R0 K12 + 0x7C0C0200, // 0073 CALL R3 1 + 0x1C0C071A, // 0074 EQ R3 R3 K26 + 0x780E0005, // 0075 JMPF R3 #007C + 0x600C0018, // 0076 GETGBL R3 G24 + 0x5810001B, // 0077 LDCONST R4 K27 + 0x8814010C, // 0078 GETMBR R5 R0 K12 + 0x7C0C0400, // 0079 CALL R3 2 + 0x00080403, // 007A ADD R2 R2 R3 + 0x70020020, // 007B JMP #009D + 0x600C000F, // 007C GETGBL R3 G15 + 0x8810010C, // 007D GETMBR R4 R0 K12 + 0xB8163800, // 007E GETNGBL R5 K28 + 0x7C0C0400, // 007F CALL R3 2 + 0x780E000F, // 0080 JMPF R3 #0091 + 0x880C010C, // 0081 GETMBR R3 R0 K12 + 0x8C0C071D, // 0082 GETMET R3 R3 K29 + 0x7C0C0200, // 0083 CALL R3 1 + 0x00080403, // 0084 ADD R2 R2 R3 + 0x880C010F, // 0085 GETMBR R3 R0 K15 + 0x88100110, // 0086 GETMBR R4 R0 K16 + 0x88100911, // 0087 GETMBR R4 R4 K17 + 0x280C0604, // 0088 GE R3 R3 R4 + 0x780E0005, // 0089 JMPF R3 #0090 + 0x880C010F, // 008A GETMBR R3 R0 K15 + 0x88100110, // 008B GETMBR R4 R0 K16 + 0x88100912, // 008C GETMBR R4 R4 K18 + 0x180C0604, // 008D LE R3 R3 R4 + 0x780E0000, // 008E JMPF R3 #0090 + 0x00080513, // 008F ADD R2 R2 K19 + 0x7002000B, // 0090 JMP #009D + 0x600C0004, // 0091 GETGBL R3 G4 + 0x8810010C, // 0092 GETMBR R4 R0 K12 + 0x7C0C0200, // 0093 CALL R3 1 + 0x1C0C071E, // 0094 EQ R3 R3 K30 + 0x780E0006, // 0095 JMPF R3 #009D + 0x600C0018, // 0096 GETGBL R3 G24 + 0x5810001F, // 0097 LDCONST R4 K31 + 0x8814010C, // 0098 GETMBR R5 R0 K12 + 0x8C140B20, // 0099 GETMET R5 R5 K32 + 0x7C140200, // 009A CALL R5 1 + 0x7C0C0400, // 009B CALL R3 2 + 0x00080403, // 009C ADD R2 R2 R3 + 0xA8040001, // 009D EXBLK 1 1 + 0x70020006, // 009E JMP #00A6 + 0xAC0C0002, // 009F CATCH R3 0 2 + 0x70020003, // 00A0 JMP #00A5 + 0x00140721, // 00A1 ADD R5 R3 K33 + 0x00140A04, // 00A2 ADD R5 R5 R4 + 0x80040A00, // 00A3 RET 1 R5 + 0x70020000, // 00A4 JMP #00A6 + 0xB0080000, // 00A5 RAISE 2 R0 R0 + 0x80040400, // 00A6 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_anonymoustag +********************************************************************/ +be_local_closure(Matter_TLV_item_set_anonymoustag, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_fulltag), + }), + be_str_weak(set_anonymoustag), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -1560,61 +1952,30 @@ be_local_closure(Matter_TLV_item__encode_tag_len, /* name */ /******************************************************************** -** Solidified function: sort +** Solidified function: set_commonprofile ********************************************************************/ -be_local_closure(Matter_TLV_item_sort, /* name */ +be_local_closure(Matter_TLV_item_set_commonprofile, /* name */ be_nested_proto( - 9, /* nstack */ + 6, /* nstack */ 1, /* argc */ - 4, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_TLV_item), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(_cmp_gt), - /* K4 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_fulltag), }), - be_str_weak(sort), + be_str_weak(set_commonprofile), &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020013, // 0008 EXBLK 0 #001D - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A000B, // 000E JMPF R6 #001B - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x8C180D03, // 0011 GETMET R6 R6 K3 - 0x5C200800, // 0012 MOVE R8 R4 - 0x7C180400, // 0013 CALL R6 2 - 0x24180D02, // 0014 GT R6 R6 K2 - 0x781A0004, // 0015 JMPF R6 #001B - 0x04180B01, // 0016 SUB R6 R5 K1 - 0x94180006, // 0017 GETIDX R6 R0 R6 - 0x98000A06, // 0018 SETIDX R0 R5 R6 - 0x04140B01, // 0019 SUB R5 R5 K1 - 0x7001FFF1, // 001A JMP #000D - 0x98000A04, // 001B SETIDX R0 R5 R4 - 0x7001FFEB, // 001C JMP #0009 - 0x58080004, // 001D LDCONST R2 K4 - 0xAC080200, // 001E CATCH R2 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x80040000, // 0020 RET 1 R0 + ( &(const binstruction[ 6]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x5411FFFE, // 0002 LDINT R4 -1 + 0x4C140000, // 0003 LDNIL R5 + 0x7C040800, // 0004 CALL R1 4 + 0x80000000, // 0005 RET 0 }) ) ); @@ -1622,11 +1983,11 @@ be_local_closure(Matter_TLV_item_sort, /* name */ /******************************************************************** -** Solidified function: parse +** Solidified function: set ********************************************************************/ -be_local_closure(Matter_TLV_item_parse, /* name */ +be_local_closure(Matter_TLV_item_set, /* name */ be_nested_proto( - 10, /* nstack */ + 5, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1634,165 +1995,26 @@ be_local_closure(Matter_TLV_item_parse, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[25]) { /* constants */ - /* K0 */ be_nested_str_weak(typ), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(_len), - /* K3 */ be_nested_str_weak(val), - /* K4 */ be_nested_str_weak(int64), - /* K5 */ be_nested_str_weak(frombytes), - /* K6 */ be_nested_str_weak(BFALSE), - /* K7 */ be_nested_str_weak(BTRUE), - /* K8 */ be_nested_str_weak(U8), - /* K9 */ be_nested_str_weak(I8), - /* K10 */ be_nested_str_weak(geti), - /* K11 */ be_nested_str_weak(get), - /* K12 */ be_nested_str_weak(FLOAT), - /* K13 */ be_nested_str_weak(getfloat), - /* K14 */ be_const_int(1), - /* K15 */ be_nested_str_weak(UTF8), - /* K16 */ be_nested_str_weak(asstring), - /* K17 */ be_nested_str_weak(NULL), - /* K18 */ be_nested_str_weak(EOC), - /* K19 */ be_nested_str_weak(tasmota), - /* K20 */ be_nested_str_weak(log), - /* K21 */ be_nested_str_weak(MTR_X3A_X20unexpected_X20eoc), - /* K22 */ be_const_int(3), - /* K23 */ be_nested_str_weak(MTR_X3A_X20unexpected_X20type_X3A_X20), - /* K24 */ be_nested_str_weak(next_idx), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(typ), + /* K2 */ be_nested_str_weak(val), }), - be_str_weak(parse), + be_str_weak(set), &be_const_str_solidified, - ( &(const binstruction[105]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x88100101, // 0001 GETMBR R4 R0 K1 - 0x88140902, // 0002 GETMBR R5 R4 K2 - 0x94140A03, // 0003 GETIDX R5 R5 R3 - 0x541A0007, // 0004 LDINT R6 8 - 0x1C180A06, // 0005 EQ R6 R5 R6 - 0x781A000A, // 0006 JMPF R6 #0012 - 0xB81A0800, // 0007 GETNGBL R6 K4 - 0x7C180000, // 0008 CALL R6 0 - 0x90020606, // 0009 SETMBR R0 K3 R6 - 0x88180103, // 000A GETMBR R6 R0 K3 - 0x8C180D05, // 000B GETMET R6 R6 K5 - 0x5C200200, // 000C MOVE R8 R1 - 0x5C240400, // 000D MOVE R9 R2 - 0x7C180600, // 000E CALL R6 3 - 0x541A0007, // 000F LDINT R6 8 - 0x00080406, // 0010 ADD R2 R2 R6 - 0x70020054, // 0011 JMP #0067 - 0x88180906, // 0012 GETMBR R6 R4 K6 - 0x1C180606, // 0013 EQ R6 R3 R6 - 0x741A0002, // 0014 JMPT R6 #0018 - 0x88180907, // 0015 GETMBR R6 R4 K7 - 0x1C180606, // 0016 EQ R6 R3 R6 - 0x781A0003, // 0017 JMPF R6 #001C - 0x88180907, // 0018 GETMBR R6 R4 K7 - 0x1C180606, // 0019 EQ R6 R3 R6 - 0x90020606, // 001A SETMBR R0 K3 R6 - 0x7002004A, // 001B JMP #0067 - 0x88180908, // 001C GETMBR R6 R4 K8 - 0x14180606, // 001D LT R6 R3 R6 - 0x781A000E, // 001E JMPF R6 #002E - 0x88180909, // 001F GETMBR R6 R4 K9 - 0x18180606, // 0020 LE R6 R3 R6 - 0x781A0004, // 0021 JMPF R6 #0027 - 0x8C18030A, // 0022 GETMET R6 R1 K10 - 0x5C200400, // 0023 MOVE R8 R2 - 0x5C240A00, // 0024 MOVE R9 R5 - 0x7C180600, // 0025 CALL R6 3 - 0x70020003, // 0026 JMP #002B - 0x8C18030B, // 0027 GETMET R6 R1 K11 - 0x5C200400, // 0028 MOVE R8 R2 - 0x5C240A00, // 0029 MOVE R9 R5 - 0x7C180600, // 002A CALL R6 3 - 0x90020606, // 002B SETMBR R0 K3 R6 - 0x00080405, // 002C ADD R2 R2 R5 - 0x70020038, // 002D JMP #0067 - 0x8818090C, // 002E GETMBR R6 R4 K12 - 0x1C180606, // 002F EQ R6 R3 R6 - 0x781A0006, // 0030 JMPF R6 #0038 - 0x8C18030D, // 0031 GETMET R6 R1 K13 - 0x5C200400, // 0032 MOVE R8 R2 - 0x7C180400, // 0033 CALL R6 2 - 0x90020606, // 0034 SETMBR R0 K3 R6 - 0x541A0003, // 0035 LDINT R6 4 - 0x00080406, // 0036 ADD R2 R2 R6 - 0x7002002E, // 0037 JMP #0067 - 0x5419FFF7, // 0038 LDINT R6 -8 - 0x28180A06, // 0039 GE R6 R5 R6 - 0x781A0016, // 003A JMPF R6 #0052 - 0x5419FFFE, // 003B LDINT R6 -1 - 0x18180A06, // 003C LE R6 R5 R6 - 0x781A0013, // 003D JMPF R6 #0052 - 0x8C18030B, // 003E GETMET R6 R1 K11 - 0x5C200400, // 003F MOVE R8 R2 - 0x44240A00, // 0040 NEG R9 R5 - 0x7C180600, // 0041 CALL R6 3 - 0x441C0A00, // 0042 NEG R7 R5 - 0x00080407, // 0043 ADD R2 R2 R7 - 0x001C0406, // 0044 ADD R7 R2 R6 - 0x041C0F0E, // 0045 SUB R7 R7 K14 - 0x401C0407, // 0046 CONNECT R7 R2 R7 - 0x941C0207, // 0047 GETIDX R7 R1 R7 - 0x90020607, // 0048 SETMBR R0 K3 R7 - 0x00080406, // 0049 ADD R2 R2 R6 - 0x881C090F, // 004A GETMBR R7 R4 K15 - 0x181C0607, // 004B LE R7 R3 R7 - 0x781E0003, // 004C JMPF R7 #0051 - 0x881C0103, // 004D GETMBR R7 R0 K3 - 0x8C1C0F10, // 004E GETMET R7 R7 K16 - 0x7C1C0200, // 004F CALL R7 1 - 0x90020607, // 0050 SETMBR R0 K3 R7 - 0x70020014, // 0051 JMP #0067 - 0x88180911, // 0052 GETMBR R6 R4 K17 - 0x1C180606, // 0053 EQ R6 R3 R6 - 0x781A0000, // 0054 JMPF R6 #0056 - 0x70020010, // 0055 JMP #0067 - 0x88180912, // 0056 GETMBR R6 R4 K18 - 0x1C180606, // 0057 EQ R6 R3 R6 - 0x781A0005, // 0058 JMPF R6 #005F - 0xB81A2600, // 0059 GETNGBL R6 K19 - 0x8C180D14, // 005A GETMET R6 R6 K20 - 0x58200015, // 005B LDCONST R8 K21 - 0x58240016, // 005C LDCONST R9 K22 - 0x7C180600, // 005D CALL R6 3 - 0x70020007, // 005E JMP #0067 - 0xB81A2600, // 005F GETNGBL R6 K19 - 0x8C180D14, // 0060 GETMET R6 R6 K20 - 0x60200008, // 0061 GETGBL R8 G8 - 0x5C240600, // 0062 MOVE R9 R3 - 0x7C200200, // 0063 CALL R8 1 - 0x00222E08, // 0064 ADD R8 K23 R8 - 0x58240016, // 0065 LDCONST R9 K22 - 0x7C180600, // 0066 CALL R6 3 - 0x90023002, // 0067 SETMBR R0 K24 R2 - 0x80040400, // 0068 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: to_TLV -********************************************************************/ -be_local_closure(Matter_TLV_item_to_TLV, /* name */ - be_nested_proto( - 1, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(to_TLV), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040000, // 0000 RET 1 R0 + ( &(const binstruction[12]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x7C0C0200, // 0001 CALL R3 1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x200C0403, // 0003 NE R3 R2 R3 + 0x740E0002, // 0004 JMPT R3 #0008 + 0x540E0013, // 0005 LDINT R3 20 + 0x1C0C0203, // 0006 EQ R3 R1 R3 + 0x780E0002, // 0007 JMPF R3 #000B + 0x90020201, // 0008 SETMBR R0 K1 R1 + 0x90020402, // 0009 SETMBR R0 K2 R2 + 0x80040000, // 000A RET 1 R0 + 0x80000000, // 000B RET 0 }) ) ); @@ -1805,33 +2027,36 @@ be_local_closure(Matter_TLV_item_to_TLV, /* name */ be_local_class(Matter_TLV_item, 8, NULL, - be_nested_map(25, + be_nested_map(28, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(set_parent, -1), be_const_closure(Matter_TLV_item_set_parent_closure) }, - { be_const_key_weak(create_TLV, -1), be_const_static_closure(Matter_TLV_item_create_TLV_closure) }, - { be_const_key_weak(next_idx, -1), be_const_var(1) }, - { be_const_key_weak(TLV, -1), be_const_class(be_class_Matter_TLV) }, - { be_const_key_weak(tag_vendor, 22), be_const_var(2) }, - { be_const_key_weak(set_anonymoustag, 17), be_const_closure(Matter_TLV_item_set_anonymoustag_closure) }, - { be_const_key_weak(val, -1), be_const_var(7) }, - { be_const_key_weak(to_TLV, -1), be_const_closure(Matter_TLV_item_to_TLV_closure) }, - { be_const_key_weak(parse, -1), be_const_closure(Matter_TLV_item_parse_closure) }, - { be_const_key_weak(_cmp_gt, 7), be_const_closure(Matter_TLV_item__cmp_gt_closure) }, - { be_const_key_weak(tag_profile, -1), be_const_var(3) }, - { be_const_key_weak(encode_len, 10), be_const_closure(Matter_TLV_item_encode_len_closure) }, - { be_const_key_weak(set_contextspecific, 8), be_const_closure(Matter_TLV_item_set_contextspecific_closure) }, - { be_const_key_weak(set_fulltag, -1), be_const_closure(Matter_TLV_item_set_fulltag_closure) }, { be_const_key_weak(parent, -1), be_const_var(0) }, - { be_const_key_weak(_encode_tag_len, 19), be_const_closure(Matter_TLV_item__encode_tag_len_closure) }, + { be_const_key_weak(TLV, 0), be_const_class(be_class_Matter_TLV) }, { be_const_key_weak(tag_sub, -1), be_const_var(5) }, - { be_const_key_weak(init, 23), be_const_closure(Matter_TLV_item_init_closure) }, + { be_const_key_weak(encode_len, -1), be_const_closure(Matter_TLV_item_encode_len_closure) }, + { be_const_key_weak(val, 5), be_const_var(7) }, + { be_const_key_weak(_cmp_gt, -1), be_const_closure(Matter_TLV_item__cmp_gt_closure) }, + { be_const_key_weak(create_TLV, -1), be_const_static_closure(Matter_TLV_item_create_TLV_closure) }, + { be_const_key_weak(reset, -1), be_const_closure(Matter_TLV_item_reset_closure) }, + { be_const_key_weak(to_str_val, 6), be_const_closure(Matter_TLV_item_to_str_val_closure) }, + { be_const_key_weak(to_TLV, -1), be_const_closure(Matter_TLV_item_to_TLV_closure) }, + { be_const_key_weak(_encode_tag_len, -1), be_const_closure(Matter_TLV_item__encode_tag_len_closure) }, + { be_const_key_weak(set_contextspecific, -1), be_const_closure(Matter_TLV_item_set_contextspecific_closure) }, + { be_const_key_weak(parse, 7), be_const_closure(Matter_TLV_item_parse_closure) }, + { be_const_key_weak(set_anonymoustag, -1), be_const_closure(Matter_TLV_item_set_anonymoustag_closure) }, { be_const_key_weak(tlv2raw, -1), be_const_closure(Matter_TLV_item_tlv2raw_closure) }, + { be_const_key_weak(set_fulltag, 10), be_const_closure(Matter_TLV_item_set_fulltag_closure) }, + { be_const_key_weak(set_parent, -1), be_const_closure(Matter_TLV_item_set_parent_closure) }, + { be_const_key_weak(tag_profile, 23), be_const_var(3) }, + { be_const_key_weak(typ, -1), be_const_var(6) }, + { be_const_key_weak(_encode_tag, 20), be_const_closure(Matter_TLV_item__encode_tag_closure) }, + { be_const_key_weak(init, 13), be_const_closure(Matter_TLV_item_init_closure) }, + { be_const_key_weak(sort, 14), be_const_static_closure(Matter_TLV_item_sort_closure) }, + { be_const_key_weak(tag_vendor, -1), be_const_var(2) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_item_tostring_closure) }, - { be_const_key_weak(set_commonprofile, 15), be_const_closure(Matter_TLV_item_set_commonprofile_closure) }, - { be_const_key_weak(sort, -1), be_const_static_closure(Matter_TLV_item_sort_closure) }, - { be_const_key_weak(_encode_tag, -1), be_const_closure(Matter_TLV_item__encode_tag_closure) }, - { be_const_key_weak(tag_number, 16), be_const_var(4) }, - { be_const_key_weak(typ, 3), be_const_var(6) }, + { be_const_key_weak(next_idx, -1), be_const_var(1) }, + { be_const_key_weak(tag_number, -1), be_const_var(4) }, + { be_const_key_weak(set_commonprofile, -1), be_const_closure(Matter_TLV_item_set_commonprofile_closure) }, + { be_const_key_weak(set, -1), be_const_closure(Matter_TLV_item_set_closure) }, })), be_str_weak(Matter_TLV_item) ); @@ -1845,486 +2070,6 @@ void be_load_Matter_TLV_item_class(bvm *vm) { extern const bclass be_class_Matter_TLV_list; -/******************************************************************** -** Solidified function: add_obj -********************************************************************/ -be_local_closure(Matter_TLV_list_add_obj, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(to_TLV), - /* K3 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(add_obj), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x200C0403, // 0001 NE R3 R2 R3 - 0x780E0010, // 0002 JMPF R3 #0014 - 0x600C000F, // 0003 GETGBL R3 G15 - 0x5C100400, // 0004 MOVE R4 R2 - 0x60140015, // 0005 GETGBL R5 G21 - 0x7C0C0400, // 0006 CALL R3 2 - 0x780E0004, // 0007 JMPF R3 #000D - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x8C0C0701, // 0009 GETMET R3 R3 K1 - 0x5C140400, // 000A MOVE R5 R2 - 0x7C0C0400, // 000B CALL R3 2 - 0x70020006, // 000C JMP #0014 - 0x8C0C0502, // 000D GETMET R3 R2 K2 - 0x7C0C0200, // 000E CALL R3 1 - 0x900E0601, // 000F SETMBR R3 K3 R1 - 0x88100100, // 0010 GETMBR R4 R0 K0 - 0x8C100901, // 0011 GETMET R4 R4 K1 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C100400, // 0013 CALL R4 2 - 0x80040000, // 0014 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_struct -********************************************************************/ -be_local_closure(Matter_TLV_list_add_struct, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(TLV), - /* K1 */ be_nested_str_weak(Matter_TLV_struct), - /* K2 */ be_nested_str_weak(tag_sub), - /* K3 */ be_nested_str_weak(val), - /* K4 */ be_nested_str_weak(push), - }), - be_str_weak(add_struct), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100000, // 0002 MOVE R4 R0 - 0x7C080400, // 0003 CALL R2 2 - 0x900A0401, // 0004 SETMBR R2 K2 R1 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x80040400, // 0009 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: push -********************************************************************/ -be_local_closure(Matter_TLV_list_push, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(push), - }), - be_str_weak(push), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: getsubval -********************************************************************/ -be_local_closure(Matter_TLV_list_getsubval, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(getsub), - /* K1 */ be_nested_str_weak(val), - }), - be_str_weak(getsubval), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x88080501, // 0003 GETMBR R2 R2 K1 - 0x80040400, // 0004 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: setitem -********************************************************************/ -be_local_closure(Matter_TLV_list_setitem, /* name */ - be_nested_proto( - 4, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - }), - be_str_weak(setitem), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x980C0202, // 0001 SETIDX R3 R1 R2 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: item -********************************************************************/ -be_local_closure(Matter_TLV_list_item, /* name */ - be_nested_proto( - 3, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - }), - be_str_weak(item), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x94080401, // 0001 GETIDX R2 R2 R1 - 0x80040400, // 0002 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: size -********************************************************************/ -be_local_closure(Matter_TLV_list_size, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - }), - be_str_weak(size), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x6004000C, // 0000 GETGBL R1 G12 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: findsubtyp -********************************************************************/ -be_local_closure(Matter_TLV_list_findsubtyp, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(findsub), - /* K1 */ be_nested_str_weak(typ), - }), - be_str_weak(findsubtyp), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x5C100200, // 0001 MOVE R4 R1 - 0x7C080400, // 0002 CALL R2 2 - 0x4C0C0000, // 0003 LDNIL R3 - 0x200C0403, // 0004 NE R3 R2 R3 - 0x780E0001, // 0005 JMPF R3 #0008 - 0x880C0501, // 0006 GETMBR R3 R2 K1 - 0x80040600, // 0007 RET 1 R3 - 0x4C0C0000, // 0008 LDNIL R3 - 0x80040600, // 0009 RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_list -********************************************************************/ -be_local_closure(Matter_TLV_list_add_list, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(TLV), - /* K1 */ be_nested_str_weak(Matter_TLV_list), - /* K2 */ be_nested_str_weak(tag_sub), - /* K3 */ be_nested_str_weak(val), - /* K4 */ be_nested_str_weak(push), - }), - be_str_weak(add_list), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100000, // 0002 MOVE R4 R0 - 0x7C080400, // 0003 CALL R2 2 - 0x900A0401, // 0004 SETMBR R2 K2 R1 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x80040400, // 0009 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: tostring_inner -********************************************************************/ -be_local_closure(Matter_TLV_list_tostring_inner, /* name */ - be_nested_proto( - 9, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(), - /* K1 */ be_nested_str_weak(tag_profile), - /* K2 */ be_nested_str_weak(Matter_X3A_X3A), - /* K3 */ be_nested_str_weak(tag_number), - /* K4 */ be_nested_str_weak(0x_X2508X_X20), - /* K5 */ be_nested_str_weak(tag_vendor), - /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), - /* K7 */ be_nested_str_weak(0x_X2504X_X3A), - /* K8 */ be_nested_str_weak(tag_sub), - /* K9 */ be_nested_str_weak(_X25i_X20), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(_X3D_X20), - /* K12 */ be_nested_str_weak(val), - /* K13 */ be_nested_str_weak(copy), - /* K14 */ be_nested_str_weak(sort), - /* K15 */ be_nested_str_weak(concat), - /* K16 */ be_nested_str_weak(_X2C_X20), - /* K17 */ be_nested_str_weak(_X20), - }), - be_str_weak(tostring_inner), - &be_const_str_solidified, - ( &(const binstruction[82]) { /* code */ - 0x58100000, // 0000 LDCONST R4 K0 - 0xA8020047, // 0001 EXBLK 0 #004A - 0x88140101, // 0002 GETMBR R5 R0 K1 - 0x5419FFFE, // 0003 LDINT R6 -1 - 0x1C140A06, // 0004 EQ R5 R5 R6 - 0x7816000A, // 0005 JMPF R5 #0011 - 0x00100902, // 0006 ADD R4 R4 K2 - 0x88140103, // 0007 GETMBR R5 R0 K3 - 0x4C180000, // 0008 LDNIL R6 - 0x20140A06, // 0009 NE R5 R5 R6 - 0x78160004, // 000A JMPF R5 #0010 - 0x60140018, // 000B GETGBL R5 G24 - 0x58180004, // 000C LDCONST R6 K4 - 0x881C0103, // 000D GETMBR R7 R0 K3 - 0x7C140400, // 000E CALL R5 2 - 0x00100805, // 000F ADD R4 R4 R5 - 0x70020023, // 0010 JMP #0035 - 0x88140105, // 0011 GETMBR R5 R0 K5 - 0x4C180000, // 0012 LDNIL R6 - 0x20140A06, // 0013 NE R5 R5 R6 - 0x78160004, // 0014 JMPF R5 #001A - 0x60140018, // 0015 GETGBL R5 G24 - 0x58180006, // 0016 LDCONST R6 K6 - 0x881C0105, // 0017 GETMBR R7 R0 K5 - 0x7C140400, // 0018 CALL R5 2 - 0x00100805, // 0019 ADD R4 R4 R5 - 0x88140101, // 001A GETMBR R5 R0 K1 - 0x4C180000, // 001B LDNIL R6 - 0x20140A06, // 001C NE R5 R5 R6 - 0x78160004, // 001D JMPF R5 #0023 - 0x60140018, // 001E GETGBL R5 G24 - 0x58180007, // 001F LDCONST R6 K7 - 0x881C0101, // 0020 GETMBR R7 R0 K1 - 0x7C140400, // 0021 CALL R5 2 - 0x00100805, // 0022 ADD R4 R4 R5 - 0x88140103, // 0023 GETMBR R5 R0 K3 - 0x4C180000, // 0024 LDNIL R6 - 0x20140A06, // 0025 NE R5 R5 R6 - 0x78160004, // 0026 JMPF R5 #002C - 0x60140018, // 0027 GETGBL R5 G24 - 0x58180004, // 0028 LDCONST R6 K4 - 0x881C0103, // 0029 GETMBR R7 R0 K3 - 0x7C140400, // 002A CALL R5 2 - 0x00100805, // 002B ADD R4 R4 R5 - 0x88140108, // 002C GETMBR R5 R0 K8 - 0x4C180000, // 002D LDNIL R6 - 0x20140A06, // 002E NE R5 R5 R6 - 0x78160004, // 002F JMPF R5 #0035 - 0x60140018, // 0030 GETGBL R5 G24 - 0x58180009, // 0031 LDCONST R6 K9 - 0x881C0108, // 0032 GETMBR R7 R0 K8 - 0x7C140400, // 0033 CALL R5 2 - 0x00100805, // 0034 ADD R4 R4 R5 - 0x6014000C, // 0035 GETGBL R5 G12 - 0x5C180800, // 0036 MOVE R6 R4 - 0x7C140200, // 0037 CALL R5 1 - 0x24140B0A, // 0038 GT R5 R5 K10 - 0x78160000, // 0039 JMPF R5 #003B - 0x0010090B, // 003A ADD R4 R4 K11 - 0x00100802, // 003B ADD R4 R4 R2 - 0x8814010C, // 003C GETMBR R5 R0 K12 - 0x8C140B0D, // 003D GETMET R5 R5 K13 - 0x7C140200, // 003E CALL R5 1 - 0x78060002, // 003F JMPF R1 #0043 - 0x8C18010E, // 0040 GETMET R6 R0 K14 - 0x5C200A00, // 0041 MOVE R8 R5 - 0x7C180400, // 0042 CALL R6 2 - 0x8C180B0F, // 0043 GETMET R6 R5 K15 - 0x58200010, // 0044 LDCONST R8 K16 - 0x7C180400, // 0045 CALL R6 2 - 0x00100806, // 0046 ADD R4 R4 R6 - 0x00100803, // 0047 ADD R4 R4 R3 - 0xA8040001, // 0048 EXBLK 1 1 - 0x70020006, // 0049 JMP #0051 - 0xAC140002, // 004A CATCH R5 0 2 - 0x70020003, // 004B JMP #0050 - 0x001C0B11, // 004C ADD R7 R5 K17 - 0x001C0E06, // 004D ADD R7 R7 R6 - 0x80040E00, // 004E RET 1 R7 - 0x70020000, // 004F JMP #0051 - 0xB0080000, // 0050 RAISE 2 R0 R0 - 0x80040800, // 0051 RET 1 R4 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: encode_len -********************************************************************/ -be_local_closure(Matter_TLV_list_encode_len, /* name */ - be_nested_proto( - 5, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_encode_tag_len), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(val), - /* K3 */ be_nested_str_weak(encode_len), - /* K4 */ be_const_int(1), - }), - be_str_weak(encode_len), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x58080001, // 0002 LDCONST R2 K1 - 0x600C000C, // 0003 GETGBL R3 G12 - 0x88100102, // 0004 GETMBR R4 R0 K2 - 0x7C0C0200, // 0005 CALL R3 1 - 0x140C0403, // 0006 LT R3 R2 R3 - 0x780E0006, // 0007 JMPF R3 #000F - 0x880C0102, // 0008 GETMBR R3 R0 K2 - 0x940C0602, // 0009 GETIDX R3 R3 R2 - 0x8C0C0703, // 000A GETMET R3 R3 K3 - 0x7C0C0200, // 000B CALL R3 1 - 0x00040203, // 000C ADD R1 R1 R3 - 0x00080504, // 000D ADD R2 R2 K4 - 0x7001FFF3, // 000E JMP #0003 - 0x00040304, // 000F ADD R1 R1 K4 - 0x80040200, // 0010 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: findsubval ********************************************************************/ @@ -2360,139 +2105,6 @@ be_local_closure(Matter_TLV_list_findsubval, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_TLV_list_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(init), - /* K1 */ be_nested_str_weak(typ), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(LIST), - /* K4 */ be_nested_str_weak(val), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x60080003, // 0000 GETGBL R2 G3 - 0x5C0C0000, // 0001 MOVE R3 R0 - 0x7C080200, // 0002 CALL R2 1 - 0x8C080500, // 0003 GETMET R2 R2 K0 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x88080102, // 0006 GETMBR R2 R0 K2 - 0x88080503, // 0007 GETMBR R2 R2 K3 - 0x90020202, // 0008 SETMBR R0 K1 R2 - 0x60080012, // 0009 GETGBL R2 G18 - 0x7C080000, // 000A CALL R2 0 - 0x90020802, // 000B SETMBR R0 K4 R2 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_array -********************************************************************/ -be_local_closure(Matter_TLV_list_add_array, /* name */ - be_nested_proto( - 6, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(TLV), - /* K1 */ be_nested_str_weak(Matter_TLV_array), - /* K2 */ be_nested_str_weak(tag_sub), - /* K3 */ be_nested_str_weak(val), - /* K4 */ be_nested_str_weak(push), - }), - be_str_weak(add_array), - &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100000, // 0002 MOVE R4 R0 - 0x7C080400, // 0003 CALL R2 2 - 0x900A0401, // 0004 SETMBR R2 K2 R1 - 0x880C0103, // 0005 GETMBR R3 R0 K3 - 0x8C0C0704, // 0006 GETMET R3 R3 K4 - 0x5C140400, // 0007 MOVE R5 R2 - 0x7C0C0400, // 0008 CALL R3 2 - 0x80040400, // 0009 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: add_TLV -********************************************************************/ -be_local_closure(Matter_TLV_list_add_TLV, /* name */ - be_nested_proto( - 8, /* nstack */ - 4, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(matter), - /* K1 */ be_nested_str_weak(TLV), - /* K2 */ be_nested_str_weak(NULL), - /* K3 */ be_nested_str_weak(Matter_TLV_item), - /* K4 */ be_nested_str_weak(tag_sub), - /* K5 */ be_nested_str_weak(typ), - /* K6 */ be_nested_str_weak(val), - /* K7 */ be_nested_str_weak(push), - }), - be_str_weak(add_TLV), - &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x4C100000, // 0000 LDNIL R4 - 0x20100604, // 0001 NE R4 R3 R4 - 0x74120004, // 0002 JMPT R4 #0008 - 0xB8120000, // 0003 GETNGBL R4 K0 - 0x88100901, // 0004 GETMBR R4 R4 K1 - 0x88100902, // 0005 GETMBR R4 R4 K2 - 0x1C100404, // 0006 EQ R4 R2 R4 - 0x7812000A, // 0007 JMPF R4 #0013 - 0x88100101, // 0008 GETMBR R4 R0 K1 - 0x8C100903, // 0009 GETMET R4 R4 K3 - 0x5C180000, // 000A MOVE R6 R0 - 0x7C100400, // 000B CALL R4 2 - 0x90120801, // 000C SETMBR R4 K4 R1 - 0x90120A02, // 000D SETMBR R4 K5 R2 - 0x90120C03, // 000E SETMBR R4 K6 R3 - 0x88140106, // 000F GETMBR R5 R0 K6 - 0x8C140B07, // 0010 GETMET R5 R5 K7 - 0x5C1C0800, // 0011 MOVE R7 R4 - 0x7C140400, // 0012 CALL R5 2 - 0x80040000, // 0013 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: tlv2raw ********************************************************************/ @@ -2573,42 +2185,28 @@ be_local_closure(Matter_TLV_list_tlv2raw, /* name */ /******************************************************************** -** Solidified function: findsub +** Solidified function: to_str_val ********************************************************************/ -be_local_closure(Matter_TLV_list_findsub, /* name */ +be_local_closure(Matter_TLV_list_to_str_val, /* name */ be_nested_proto( - 6, /* nstack */ - 3, /* argc */ + 4, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(tag_sub), - /* K2 */ be_nested_str_weak(stop_iteration), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(tostring), }), - be_str_weak(findsub), + be_str_weak(to_str_val), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x600C0010, // 0000 GETGBL R3 G16 - 0x88100100, // 0001 GETMBR R4 R0 K0 - 0x7C0C0200, // 0002 CALL R3 1 - 0xA8020007, // 0003 EXBLK 0 #000C - 0x5C100600, // 0004 MOVE R4 R3 - 0x7C100000, // 0005 CALL R4 0 - 0x88140901, // 0006 GETMBR R5 R4 K1 - 0x1C140A01, // 0007 EQ R5 R5 R1 - 0x78160001, // 0008 JMPF R5 #000B - 0xA8040001, // 0009 EXBLK 1 1 - 0x80040800, // 000A RET 1 R4 - 0x7001FFF7, // 000B JMP #0004 - 0x580C0002, // 000C LDCONST R3 K2 - 0xAC0C0200, // 000D CATCH R3 1 0 - 0xB0080000, // 000E RAISE 2 R0 R0 - 0x80040400, // 000F RET 1 R2 + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x500C0200, // 0001 LDBOOL R3 1 0 + 0x7C040400, // 0002 CALL R1 2 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -2620,8 +2218,8 @@ be_local_closure(Matter_TLV_list_findsub, /* name */ ********************************************************************/ be_local_closure(Matter_TLV_list_tostring, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2635,13 +2233,149 @@ be_local_closure(Matter_TLV_list_tostring, /* name */ }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0000, // 0001 LDBOOL R3 0 0 - 0x58100001, // 0002 LDCONST R4 K1 - 0x58140002, // 0003 LDCONST R5 K2 - 0x7C040800, // 0004 CALL R1 4 - 0x80040200, // 0005 RET 1 R1 + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x50100000, // 0001 LDBOOL R4 0 0 + 0x58140001, // 0002 LDCONST R5 K1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x7C080A00, // 0005 CALL R2 5 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: size +********************************************************************/ +be_local_closure(Matter_TLV_list_size, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + }), + be_str_weak(size), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x6004000C, // 0000 GETGBL R1 G12 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: setitem +********************************************************************/ +be_local_closure(Matter_TLV_list_setitem, /* name */ + be_nested_proto( + 4, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + }), + be_str_weak(setitem), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x980C0202, // 0001 SETIDX R3 R1 R2 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_struct +********************************************************************/ +be_local_closure(Matter_TLV_list_add_struct, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(TLV), + /* K1 */ be_nested_str_weak(Matter_TLV_struct), + /* K2 */ be_nested_str_weak(tag_sub), + /* K3 */ be_nested_str_weak(val), + /* K4 */ be_nested_str_weak(push), + }), + be_str_weak(add_struct), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100000, // 0002 MOVE R4 R0 + 0x7C080400, // 0003 CALL R2 2 + 0x900A0401, // 0004 SETMBR R2 K2 R1 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_list +********************************************************************/ +be_local_closure(Matter_TLV_list_add_list, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(TLV), + /* K1 */ be_nested_str_weak(Matter_TLV_list), + /* K2 */ be_nested_str_weak(tag_sub), + /* K3 */ be_nested_str_weak(val), + /* K4 */ be_nested_str_weak(push), + }), + be_str_weak(add_list), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100000, // 0002 MOVE R4 R0 + 0x7C080400, // 0003 CALL R2 2 + 0x900A0401, // 0004 SETMBR R2 K2 R1 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x80040400, // 0009 RET 1 R2 }) ) ); @@ -2699,6 +2433,156 @@ be_local_closure(Matter_TLV_list_parse, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_TLV_list_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(init), + /* K1 */ be_nested_str_weak(typ), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(LIST), + /* K4 */ be_nested_str_weak(val), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x60080003, // 0000 GETGBL R2 G3 + 0x5C0C0000, // 0001 MOVE R3 R0 + 0x7C080200, // 0002 CALL R2 1 + 0x8C080500, // 0003 GETMET R2 R2 K0 + 0x5C100200, // 0004 MOVE R4 R1 + 0x7C080400, // 0005 CALL R2 2 + 0x88080102, // 0006 GETMBR R2 R0 K2 + 0x88080503, // 0007 GETMBR R2 R2 K3 + 0x90020202, // 0008 SETMBR R0 K1 R2 + 0x60080012, // 0009 GETGBL R2 G18 + 0x7C080000, // 000A CALL R2 0 + 0x90020802, // 000B SETMBR R0 K4 R2 + 0x80000000, // 000C RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: item +********************************************************************/ +be_local_closure(Matter_TLV_list_item, /* name */ + be_nested_proto( + 3, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + }), + be_str_weak(item), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x94080401, // 0001 GETIDX R2 R2 R1 + 0x80040400, // 0002 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_obj +********************************************************************/ +be_local_closure(Matter_TLV_list_add_obj, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(to_TLV), + /* K3 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(add_obj), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x200C0403, // 0001 NE R3 R2 R3 + 0x780E0010, // 0002 JMPF R3 #0014 + 0x600C000F, // 0003 GETGBL R3 G15 + 0x5C100400, // 0004 MOVE R4 R2 + 0x60140015, // 0005 GETGBL R5 G21 + 0x7C0C0400, // 0006 CALL R3 2 + 0x780E0004, // 0007 JMPF R3 #000D + 0x880C0100, // 0008 GETMBR R3 R0 K0 + 0x8C0C0701, // 0009 GETMET R3 R3 K1 + 0x5C140400, // 000A MOVE R5 R2 + 0x7C0C0400, // 000B CALL R3 2 + 0x70020006, // 000C JMP #0014 + 0x8C0C0502, // 000D GETMET R3 R2 K2 + 0x7C0C0200, // 000E CALL R3 1 + 0x900E0601, // 000F SETMBR R3 K3 R1 + 0x88100100, // 0010 GETMBR R4 R0 K0 + 0x8C100901, // 0011 GETMET R4 R4 K1 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x80040000, // 0014 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: getsubval +********************************************************************/ +be_local_closure(Matter_TLV_list_getsubval, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(getsub), + /* K1 */ be_nested_str_weak(val), + }), + be_str_weak(getsubval), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x88080501, // 0003 GETMBR R2 R2 K1 + 0x80040400, // 0004 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: getsub ********************************************************************/ @@ -2734,6 +2618,380 @@ be_local_closure(Matter_TLV_list_getsub, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: findsub +********************************************************************/ +be_local_closure(Matter_TLV_list_findsub, /* name */ + be_nested_proto( + 6, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(tag_sub), + /* K2 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(findsub), + &be_const_str_solidified, + ( &(const binstruction[16]) { /* code */ + 0x600C0010, // 0000 GETGBL R3 G16 + 0x88100100, // 0001 GETMBR R4 R0 K0 + 0x7C0C0200, // 0002 CALL R3 1 + 0xA8020007, // 0003 EXBLK 0 #000C + 0x5C100600, // 0004 MOVE R4 R3 + 0x7C100000, // 0005 CALL R4 0 + 0x88140901, // 0006 GETMBR R5 R4 K1 + 0x1C140A01, // 0007 EQ R5 R5 R1 + 0x78160001, // 0008 JMPF R5 #000B + 0xA8040001, // 0009 EXBLK 1 1 + 0x80040800, // 000A RET 1 R4 + 0x7001FFF7, // 000B JMP #0004 + 0x580C0002, // 000C LDCONST R3 K2 + 0xAC0C0200, // 000D CATCH R3 1 0 + 0xB0080000, // 000E RAISE 2 R0 R0 + 0x80040400, // 000F RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_TLV +********************************************************************/ +be_local_closure(Matter_TLV_list_add_TLV, /* name */ + be_nested_proto( + 8, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), + /* K1 */ be_nested_str_weak(TLV), + /* K2 */ be_nested_str_weak(NULL), + /* K3 */ be_nested_str_weak(Matter_TLV_item), + /* K4 */ be_nested_str_weak(tag_sub), + /* K5 */ be_nested_str_weak(typ), + /* K6 */ be_nested_str_weak(val), + /* K7 */ be_nested_str_weak(push), + }), + be_str_weak(add_TLV), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x4C100000, // 0000 LDNIL R4 + 0x20100604, // 0001 NE R4 R3 R4 + 0x74120004, // 0002 JMPT R4 #0008 + 0xB8120000, // 0003 GETNGBL R4 K0 + 0x88100901, // 0004 GETMBR R4 R4 K1 + 0x88100902, // 0005 GETMBR R4 R4 K2 + 0x1C100404, // 0006 EQ R4 R2 R4 + 0x7812000A, // 0007 JMPF R4 #0013 + 0x88100101, // 0008 GETMBR R4 R0 K1 + 0x8C100903, // 0009 GETMET R4 R4 K3 + 0x5C180000, // 000A MOVE R6 R0 + 0x7C100400, // 000B CALL R4 2 + 0x90120801, // 000C SETMBR R4 K4 R1 + 0x90120A02, // 000D SETMBR R4 K5 R2 + 0x90120C03, // 000E SETMBR R4 K6 R3 + 0x88140106, // 000F GETMBR R5 R0 K6 + 0x8C140B07, // 0010 GETMET R5 R5 K7 + 0x5C1C0800, // 0011 MOVE R7 R4 + 0x7C140400, // 0012 CALL R5 2 + 0x80040000, // 0013 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: add_array +********************************************************************/ +be_local_closure(Matter_TLV_list_add_array, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(TLV), + /* K1 */ be_nested_str_weak(Matter_TLV_array), + /* K2 */ be_nested_str_weak(tag_sub), + /* K3 */ be_nested_str_weak(val), + /* K4 */ be_nested_str_weak(push), + }), + be_str_weak(add_array), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100000, // 0002 MOVE R4 R0 + 0x7C080400, // 0003 CALL R2 2 + 0x900A0401, // 0004 SETMBR R2 K2 R1 + 0x880C0103, // 0005 GETMBR R3 R0 K3 + 0x8C0C0704, // 0006 GETMET R3 R3 K4 + 0x5C140400, // 0007 MOVE R5 R2 + 0x7C0C0400, // 0008 CALL R3 2 + 0x80040400, // 0009 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: push +********************************************************************/ +be_local_closure(Matter_TLV_list_push, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(push), + }), + be_str_weak(push), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tostring_inner +********************************************************************/ +be_local_closure(Matter_TLV_list_tostring_inner, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[18]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(tag_profile), + /* K2 */ be_nested_str_weak(Matter_X3A_X3A), + /* K3 */ be_nested_str_weak(tag_number), + /* K4 */ be_nested_str_weak(0x_X2508X_X20), + /* K5 */ be_nested_str_weak(tag_vendor), + /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), + /* K7 */ be_nested_str_weak(0x_X2504X_X3A), + /* K8 */ be_nested_str_weak(tag_sub), + /* K9 */ be_nested_str_weak(_X25i_X20), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(_X3D_X20), + /* K12 */ be_nested_str_weak(val), + /* K13 */ be_nested_str_weak(copy), + /* K14 */ be_nested_str_weak(sort), + /* K15 */ be_nested_str_weak(concat), + /* K16 */ be_nested_str_weak(_X2C_X20), + /* K17 */ be_nested_str_weak(_X20), + }), + be_str_weak(tostring_inner), + &be_const_str_solidified, + ( &(const binstruction[85]) { /* code */ + 0x58140000, // 0000 LDCONST R5 K0 + 0xA802004A, // 0001 EXBLK 0 #004D + 0x50180200, // 0002 LDBOOL R6 1 0 + 0x20180806, // 0003 NE R6 R4 R6 + 0x781A0038, // 0004 JMPF R6 #003E + 0x88180101, // 0005 GETMBR R6 R0 K1 + 0x541DFFFE, // 0006 LDINT R7 -1 + 0x1C180C07, // 0007 EQ R6 R6 R7 + 0x781A000A, // 0008 JMPF R6 #0014 + 0x00140B02, // 0009 ADD R5 R5 K2 + 0x88180103, // 000A GETMBR R6 R0 K3 + 0x4C1C0000, // 000B LDNIL R7 + 0x20180C07, // 000C NE R6 R6 R7 + 0x781A0004, // 000D JMPF R6 #0013 + 0x60180018, // 000E GETGBL R6 G24 + 0x581C0004, // 000F LDCONST R7 K4 + 0x88200103, // 0010 GETMBR R8 R0 K3 + 0x7C180400, // 0011 CALL R6 2 + 0x00140A06, // 0012 ADD R5 R5 R6 + 0x70020023, // 0013 JMP #0038 + 0x88180105, // 0014 GETMBR R6 R0 K5 + 0x4C1C0000, // 0015 LDNIL R7 + 0x20180C07, // 0016 NE R6 R6 R7 + 0x781A0004, // 0017 JMPF R6 #001D + 0x60180018, // 0018 GETGBL R6 G24 + 0x581C0006, // 0019 LDCONST R7 K6 + 0x88200105, // 001A GETMBR R8 R0 K5 + 0x7C180400, // 001B CALL R6 2 + 0x00140A06, // 001C ADD R5 R5 R6 + 0x88180101, // 001D GETMBR R6 R0 K1 + 0x4C1C0000, // 001E LDNIL R7 + 0x20180C07, // 001F NE R6 R6 R7 + 0x781A0004, // 0020 JMPF R6 #0026 + 0x60180018, // 0021 GETGBL R6 G24 + 0x581C0007, // 0022 LDCONST R7 K7 + 0x88200101, // 0023 GETMBR R8 R0 K1 + 0x7C180400, // 0024 CALL R6 2 + 0x00140A06, // 0025 ADD R5 R5 R6 + 0x88180103, // 0026 GETMBR R6 R0 K3 + 0x4C1C0000, // 0027 LDNIL R7 + 0x20180C07, // 0028 NE R6 R6 R7 + 0x781A0004, // 0029 JMPF R6 #002F + 0x60180018, // 002A GETGBL R6 G24 + 0x581C0004, // 002B LDCONST R7 K4 + 0x88200103, // 002C GETMBR R8 R0 K3 + 0x7C180400, // 002D CALL R6 2 + 0x00140A06, // 002E ADD R5 R5 R6 + 0x88180108, // 002F GETMBR R6 R0 K8 + 0x4C1C0000, // 0030 LDNIL R7 + 0x20180C07, // 0031 NE R6 R6 R7 + 0x781A0004, // 0032 JMPF R6 #0038 + 0x60180018, // 0033 GETGBL R6 G24 + 0x581C0009, // 0034 LDCONST R7 K9 + 0x88200108, // 0035 GETMBR R8 R0 K8 + 0x7C180400, // 0036 CALL R6 2 + 0x00140A06, // 0037 ADD R5 R5 R6 + 0x6018000C, // 0038 GETGBL R6 G12 + 0x5C1C0A00, // 0039 MOVE R7 R5 + 0x7C180200, // 003A CALL R6 1 + 0x24180D0A, // 003B GT R6 R6 K10 + 0x781A0000, // 003C JMPF R6 #003E + 0x00140B0B, // 003D ADD R5 R5 K11 + 0x00140A02, // 003E ADD R5 R5 R2 + 0x8818010C, // 003F GETMBR R6 R0 K12 + 0x8C180D0D, // 0040 GETMET R6 R6 K13 + 0x7C180200, // 0041 CALL R6 1 + 0x78060002, // 0042 JMPF R1 #0046 + 0x8C1C010E, // 0043 GETMET R7 R0 K14 + 0x5C240C00, // 0044 MOVE R9 R6 + 0x7C1C0400, // 0045 CALL R7 2 + 0x8C1C0D0F, // 0046 GETMET R7 R6 K15 + 0x58240010, // 0047 LDCONST R9 K16 + 0x7C1C0400, // 0048 CALL R7 2 + 0x00140A07, // 0049 ADD R5 R5 R7 + 0x00140A03, // 004A ADD R5 R5 R3 + 0xA8040001, // 004B EXBLK 1 1 + 0x70020006, // 004C JMP #0054 + 0xAC180002, // 004D CATCH R6 0 2 + 0x70020003, // 004E JMP #0053 + 0x00200D11, // 004F ADD R8 R6 K17 + 0x00201007, // 0050 ADD R8 R8 R7 + 0x80041000, // 0051 RET 1 R8 + 0x70020000, // 0052 JMP #0054 + 0xB0080000, // 0053 RAISE 2 R0 R0 + 0x80040A00, // 0054 RET 1 R5 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: findsubtyp +********************************************************************/ +be_local_closure(Matter_TLV_list_findsubtyp, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(findsub), + /* K1 */ be_nested_str_weak(typ), + }), + be_str_weak(findsubtyp), + &be_const_str_solidified, + ( &(const binstruction[10]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x5C100200, // 0001 MOVE R4 R1 + 0x7C080400, // 0002 CALL R2 2 + 0x4C0C0000, // 0003 LDNIL R3 + 0x200C0403, // 0004 NE R3 R2 R3 + 0x780E0001, // 0005 JMPF R3 #0008 + 0x880C0501, // 0006 GETMBR R3 R2 K1 + 0x80040600, // 0007 RET 1 R3 + 0x4C0C0000, // 0008 LDNIL R3 + 0x80040600, // 0009 RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: encode_len +********************************************************************/ +be_local_closure(Matter_TLV_list_encode_len, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_encode_tag_len), + /* K1 */ be_const_int(0), + /* K2 */ be_nested_str_weak(val), + /* K3 */ be_nested_str_weak(encode_len), + /* K4 */ be_const_int(1), + }), + be_str_weak(encode_len), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x58080001, // 0002 LDCONST R2 K1 + 0x600C000C, // 0003 GETGBL R3 G12 + 0x88100102, // 0004 GETMBR R4 R0 K2 + 0x7C0C0200, // 0005 CALL R3 1 + 0x140C0403, // 0006 LT R3 R2 R3 + 0x780E0006, // 0007 JMPF R3 #000F + 0x880C0102, // 0008 GETMBR R3 R0 K2 + 0x940C0602, // 0009 GETIDX R3 R3 R2 + 0x8C0C0703, // 000A GETMET R3 R3 K3 + 0x7C0C0200, // 000B CALL R3 1 + 0x00040203, // 000C ADD R1 R1 R3 + 0x00080504, // 000D ADD R2 R2 K4 + 0x7001FFF3, // 000E JMP #0003 + 0x00040304, // 000F ADD R1 R1 K4 + 0x80040200, // 0010 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified class: Matter_TLV_list ********************************************************************/ @@ -2741,29 +2999,30 @@ extern const bclass be_class_Matter_TLV_item; be_local_class(Matter_TLV_list, 0, &be_class_Matter_TLV_item, - be_nested_map(21, + be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(add_obj, -1), be_const_closure(Matter_TLV_list_add_obj_closure) }, - { be_const_key_weak(add_struct, -1), be_const_closure(Matter_TLV_list_add_struct_closure) }, - { be_const_key_weak(push, -1), be_const_closure(Matter_TLV_list_push_closure) }, - { be_const_key_weak(getsubval, 20), be_const_closure(Matter_TLV_list_getsubval_closure) }, - { be_const_key_weak(getsub, -1), be_const_closure(Matter_TLV_list_getsub_closure) }, - { be_const_key_weak(parse, -1), be_const_closure(Matter_TLV_list_parse_closure) }, + { be_const_key_weak(encode_len, 14), be_const_closure(Matter_TLV_list_encode_len_closure) }, + { be_const_key_weak(tlv2raw, -1), be_const_closure(Matter_TLV_list_tlv2raw_closure) }, + { be_const_key_weak(to_str_val, 19), be_const_closure(Matter_TLV_list_to_str_val_closure) }, + { be_const_key_weak(findsubval, 7), be_const_closure(Matter_TLV_list_findsubval_closure) }, { be_const_key_weak(size, -1), be_const_closure(Matter_TLV_list_size_closure) }, - { be_const_key_weak(findsubtyp, -1), be_const_closure(Matter_TLV_list_findsubtyp_closure) }, - { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_list_tostring_closure) }, - { be_const_key_weak(tostring_inner, 4), be_const_closure(Matter_TLV_list_tostring_inner_closure) }, - { be_const_key_weak(encode_len, 8), be_const_closure(Matter_TLV_list_encode_len_closure) }, - { be_const_key_weak(findsubval, -1), be_const_closure(Matter_TLV_list_findsubval_closure) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_TLV_list_init_closure) }, - { be_const_key_weak(add_array, 16), be_const_closure(Matter_TLV_list_add_array_closure) }, - { be_const_key_weak(setitem, 15), be_const_closure(Matter_TLV_list_setitem_closure) }, - { be_const_key_weak(tlv2raw, 18), be_const_closure(Matter_TLV_list_tlv2raw_closure) }, - { be_const_key_weak(findsub, -1), be_const_closure(Matter_TLV_list_findsub_closure) }, { be_const_key_weak(is_struct, -1), be_const_bool(0) }, + { be_const_key_weak(add_struct, 20), be_const_closure(Matter_TLV_list_add_struct_closure) }, + { be_const_key_weak(findsubtyp, 21), be_const_closure(Matter_TLV_list_findsubtyp_closure) }, + { be_const_key_weak(parse, -1), be_const_closure(Matter_TLV_list_parse_closure) }, + { be_const_key_weak(init, 0), be_const_closure(Matter_TLV_list_init_closure) }, + { be_const_key_weak(item, -1), be_const_closure(Matter_TLV_list_item_closure) }, + { be_const_key_weak(tostring_inner, -1), be_const_closure(Matter_TLV_list_tostring_inner_closure) }, + { be_const_key_weak(getsubval, -1), be_const_closure(Matter_TLV_list_getsubval_closure) }, + { be_const_key_weak(getsub, 5), be_const_closure(Matter_TLV_list_getsub_closure) }, + { be_const_key_weak(push, -1), be_const_closure(Matter_TLV_list_push_closure) }, + { be_const_key_weak(add_list, 17), be_const_closure(Matter_TLV_list_add_list_closure) }, + { be_const_key_weak(add_array, -1), be_const_closure(Matter_TLV_list_add_array_closure) }, { be_const_key_weak(add_TLV, -1), be_const_closure(Matter_TLV_list_add_TLV_closure) }, - { be_const_key_weak(item, 5), be_const_closure(Matter_TLV_list_item_closure) }, - { be_const_key_weak(add_list, -1), be_const_closure(Matter_TLV_list_add_list_closure) }, + { be_const_key_weak(setitem, 11), be_const_closure(Matter_TLV_list_setitem_closure) }, + { be_const_key_weak(findsub, -1), be_const_closure(Matter_TLV_list_findsub_closure) }, + { be_const_key_weak(add_obj, -1), be_const_closure(Matter_TLV_list_add_obj_closure) }, + { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_list_tostring_closure) }, })), be_str_weak(Matter_TLV_list) ); @@ -2824,8 +3083,8 @@ be_local_closure(Matter_TLV_struct_init, /* name */ ********************************************************************/ be_local_closure(Matter_TLV_struct_tostring, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -2839,13 +3098,14 @@ be_local_closure(Matter_TLV_struct_tostring, /* name */ }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0200, // 0001 LDBOOL R3 1 0 - 0x58100001, // 0002 LDCONST R4 K1 - 0x58140002, // 0003 LDCONST R5 K2 - 0x7C040800, // 0004 CALL R1 4 - 0x80040200, // 0005 RET 1 R1 + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x50100200, // 0001 LDBOOL R4 1 0 + 0x58140001, // 0002 LDCONST R5 K1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x7C080A00, // 0005 CALL R2 5 + 0x80040400, // 0006 RET 1 R2 }) ) ); @@ -2987,8 +3247,8 @@ be_local_closure(Matter_TLV_array_parse, /* name */ ********************************************************************/ be_local_closure(Matter_TLV_array_tostring, /* name */ be_nested_proto( - 6, /* nstack */ - 1, /* argc */ + 8, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -3002,13 +3262,14 @@ be_local_closure(Matter_TLV_array_tostring, /* name */ }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[ 6]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x500C0000, // 0001 LDBOOL R3 0 0 - 0x58100001, // 0002 LDCONST R4 K1 - 0x58140002, // 0003 LDCONST R5 K2 - 0x7C040800, // 0004 CALL R1 4 - 0x80040200, // 0005 RET 1 R1 + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x50100000, // 0001 LDBOOL R4 0 0 + 0x58140001, // 0002 LDCONST R5 K1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x7C080A00, // 0005 CALL R2 5 + 0x80040400, // 0006 RET 1 R2 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h index 1ae1625fc..0dd231c3a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_UDPServer.h @@ -120,110 +120,27 @@ void be_load_Matter_UDPPacket_sent_class(bvm *vm) { extern const bclass be_class_Matter_UDPServer; /******************************************************************** -** Solidified function: _backoff_time +** Solidified function: every_50ms ********************************************************************/ -be_local_closure(Matter_UDPServer__backoff_time, /* name */ +be_local_closure(Matter_UDPServer_every_50ms, /* name */ be_nested_proto( - 10, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 1, /* has sup protos */ - ( &(const struct bproto*[ 1]) { - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 0, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_const_int(1), - /* K1 */ be_const_int(0), - }), - be_str_weak(power_int), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x240C0301, // 0001 GT R3 R1 K1 - 0x780E0002, // 0002 JMPF R3 #0006 - 0x08080400, // 0003 MUL R2 R2 R0 - 0x04040300, // 0004 SUB R1 R1 K0 - 0x7001FFFA, // 0005 JMP #0001 - 0x80040400, // 0006 RET 1 R2 - }) - ), - }), - 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_UDPServer), - /* K1 */ be_nested_str_weak(math), - /* K2 */ be_nested_str_weak(rand), - /* K3 */ be_const_int(0), - /* K4 */ be_const_int(1), - /* K5 */ be_const_real_hex(0x3FCCCCCD), - /* K6 */ be_const_real_hex(0x3F800000), - /* K7 */ be_const_real_hex(0x3E800000), - }), - be_str_weak(_backoff_time), - &be_const_str_solidified, - ( &(const binstruction[29]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x84080000, // 0001 CLOSURE R2 P0 - 0xA40E0200, // 0002 IMPORT R3 K1 - 0x5412012B, // 0003 LDINT R4 300 - 0x6014000A, // 0004 GETGBL R5 G10 - 0x8C180702, // 0005 GETMET R6 R3 K2 - 0x7C180200, // 0006 CALL R6 1 - 0x541E00FE, // 0007 LDINT R7 255 - 0x2C180C07, // 0008 AND R6 R6 R7 - 0x7C140200, // 0009 CALL R5 1 - 0x541A00FE, // 000A LDINT R6 255 - 0x0C140A06, // 000B DIV R5 R5 R6 - 0x24180103, // 000C GT R6 R0 K3 - 0x781A0001, // 000D JMPF R6 #0010 - 0x04180104, // 000E SUB R6 R0 K4 - 0x70020000, // 000F JMP #0011 - 0x58180003, // 0010 LDCONST R6 K3 - 0x5C1C0400, // 0011 MOVE R7 R2 - 0x58200005, // 0012 LDCONST R8 K5 - 0x5C240C00, // 0013 MOVE R9 R6 - 0x7C1C0400, // 0014 CALL R7 2 - 0x081C0807, // 0015 MUL R7 R4 R7 - 0x08200B07, // 0016 MUL R8 R5 K7 - 0x00220C08, // 0017 ADD R8 K6 R8 - 0x081C0E08, // 0018 MUL R7 R7 R8 - 0x60200009, // 0019 GETGBL R8 G9 - 0x5C240E00, // 001A MOVE R9 R7 - 0x7C200200, // 001B CALL R8 1 - 0x80041000, // 001C RET 1 R8 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_second -********************************************************************/ -be_local_closure(Matter_UDPServer_every_second, /* name */ - be_nested_proto( - 1, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(every_second), + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(every_50ms), &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80000000, // 0000 RET 0 + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 }) ) ); @@ -274,6 +191,340 @@ be_local_closure(Matter_UDPServer_send_UDP, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: received_ack +********************************************************************/ +be_local_closure(Matter_UDPServer_received_ack, /* name */ + be_nested_proto( + 10, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[11]) { /* constants */ + /* K0 */ be_nested_str_weak(ack_message_counter), + /* K1 */ be_nested_str_weak(exchange_id), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(packets_sent), + /* K4 */ be_nested_str_weak(msg_id), + /* K5 */ be_nested_str_weak(remove), + /* K6 */ be_nested_str_weak(tasmota), + /* K7 */ be_nested_str_weak(loglevel), + /* K8 */ be_nested_str_weak(log), + /* K9 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), + /* K10 */ be_const_int(1), + }), + be_str_weak(received_ack), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0x88080300, // 0000 GETMBR R2 R1 K0 + 0x880C0301, // 0001 GETMBR R3 R1 K1 + 0x4C100000, // 0002 LDNIL R4 + 0x1C100404, // 0003 EQ R4 R2 R4 + 0x78120000, // 0004 JMPF R4 #0006 + 0x80000800, // 0005 RET 0 + 0x58100002, // 0006 LDCONST R4 K2 + 0x6014000C, // 0007 GETGBL R5 G12 + 0x88180103, // 0008 GETMBR R6 R0 K3 + 0x7C140200, // 0009 CALL R5 1 + 0x14140805, // 000A LT R5 R4 R5 + 0x7816001B, // 000B JMPF R5 #0028 + 0x88140103, // 000C GETMBR R5 R0 K3 + 0x94140A04, // 000D GETIDX R5 R5 R4 + 0x88180B04, // 000E GETMBR R6 R5 K4 + 0x1C180C02, // 000F EQ R6 R6 R2 + 0x781A0014, // 0010 JMPF R6 #0026 + 0x88180B01, // 0011 GETMBR R6 R5 K1 + 0x1C180C03, // 0012 EQ R6 R6 R3 + 0x781A0011, // 0013 JMPF R6 #0026 + 0x88180103, // 0014 GETMBR R6 R0 K3 + 0x8C180D05, // 0015 GETMET R6 R6 K5 + 0x5C200800, // 0016 MOVE R8 R4 + 0x7C180400, // 0017 CALL R6 2 + 0xB81A0C00, // 0018 GETNGBL R6 K6 + 0x8C180D07, // 0019 GETMET R6 R6 K7 + 0x54220003, // 001A LDINT R8 4 + 0x7C180400, // 001B CALL R6 2 + 0x781A0007, // 001C JMPF R6 #0025 + 0xB81A0C00, // 001D GETNGBL R6 K6 + 0x8C180D08, // 001E GETMET R6 R6 K8 + 0x60200008, // 001F GETGBL R8 G8 + 0x5C240400, // 0020 MOVE R9 R2 + 0x7C200200, // 0021 CALL R8 1 + 0x00221208, // 0022 ADD R8 K9 R8 + 0x54260003, // 0023 LDINT R9 4 + 0x7C180600, // 0024 CALL R6 3 + 0x70020000, // 0025 JMP #0027 + 0x0010090A, // 0026 ADD R4 R4 K10 + 0x7001FFDE, // 0027 JMP #0007 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: start +********************************************************************/ +be_local_closure(Matter_UDPServer_start, /* name */ + be_nested_proto( + 6, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(listening), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(udp), + /* K3 */ be_nested_str_weak(begin), + /* K4 */ be_nested_str_weak(addr), + /* K5 */ be_nested_str_weak(port), + /* K6 */ be_nested_str_weak(network_error), + /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), + /* K8 */ be_nested_str_weak(dispatch_cb), + /* K9 */ be_nested_str_weak(tasmota), + /* K10 */ be_nested_str_weak(add_fast_loop), + /* K11 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(start), + &be_const_str_solidified, + ( &(const binstruction[21]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x740A0011, // 0001 JMPT R2 #0014 + 0xB80A0400, // 0002 GETNGBL R2 K2 + 0x7C080000, // 0003 CALL R2 0 + 0x90020202, // 0004 SETMBR R0 K1 R2 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x8C080503, // 0006 GETMET R2 R2 K3 + 0x88100104, // 0007 GETMBR R4 R0 K4 + 0x88140105, // 0008 GETMBR R5 R0 K5 + 0x7C080600, // 0009 CALL R2 3 + 0x5C0C0400, // 000A MOVE R3 R2 + 0x740E0000, // 000B JMPT R3 #000D + 0xB0060D07, // 000C RAISE 1 K6 K7 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x90020003, // 000E SETMBR R0 K0 R3 + 0x90021001, // 000F SETMBR R0 K8 R1 + 0xB80E1200, // 0010 GETNGBL R3 K9 + 0x8C0C070A, // 0011 GETMET R3 R3 K10 + 0x8814010B, // 0012 GETMBR R5 R0 K11 + 0x7C0C0400, // 0013 CALL R3 2 + 0x80000000, // 0014 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: send +********************************************************************/ +be_local_closure(Matter_UDPServer_send, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[13]) { /* constants */ + /* K0 */ be_nested_str_weak(udp_socket), + /* K1 */ be_nested_str_weak(send), + /* K2 */ be_nested_str_weak(addr), + /* K3 */ be_nested_str_weak(remote_ip), + /* K4 */ be_nested_str_weak(port), + /* K5 */ be_nested_str_weak(remote_port), + /* K6 */ be_nested_str_weak(raw), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(loglevel), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + /* K11 */ be_const_int(3), + /* K12 */ be_nested_str_weak(MTR_X3A_X20error_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), + }), + be_str_weak(send), + &be_const_str_solidified, + ( &(const binstruction[47]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x88100302, // 0002 GETMBR R4 R1 K2 + 0x78120001, // 0003 JMPF R4 #0006 + 0x88100302, // 0004 GETMBR R4 R1 K2 + 0x70020001, // 0005 JMP #0008 + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x88100903, // 0007 GETMBR R4 R4 K3 + 0x88140304, // 0008 GETMBR R5 R1 K4 + 0x78160001, // 0009 JMPF R5 #000C + 0x88140304, // 000A GETMBR R5 R1 K4 + 0x70020001, // 000B JMP #000E + 0x88140100, // 000C GETMBR R5 R0 K0 + 0x88140B05, // 000D GETMBR R5 R5 K5 + 0x88180306, // 000E GETMBR R6 R1 K6 + 0x7C080800, // 000F CALL R2 4 + 0x780A000E, // 0010 JMPF R2 #0020 + 0xB80E0E00, // 0011 GETNGBL R3 K7 + 0x8C0C0708, // 0012 GETMET R3 R3 K8 + 0x54160003, // 0013 LDINT R5 4 + 0x7C0C0400, // 0014 CALL R3 2 + 0x780E0008, // 0015 JMPF R3 #001F + 0xB80E0E00, // 0016 GETNGBL R3 K7 + 0x8C0C0709, // 0017 GETMET R3 R3 K9 + 0x60140018, // 0018 GETGBL R5 G24 + 0x5818000A, // 0019 LDCONST R6 K10 + 0x881C0302, // 001A GETMBR R7 R1 K2 + 0x88200304, // 001B GETMBR R8 R1 K4 + 0x7C140600, // 001C CALL R5 3 + 0x541A0003, // 001D LDINT R6 4 + 0x7C0C0600, // 001E CALL R3 3 + 0x7002000D, // 001F JMP #002E + 0xB80E0E00, // 0020 GETNGBL R3 K7 + 0x8C0C0708, // 0021 GETMET R3 R3 K8 + 0x5814000B, // 0022 LDCONST R5 K11 + 0x7C0C0400, // 0023 CALL R3 2 + 0x780E0008, // 0024 JMPF R3 #002E + 0xB80E0E00, // 0025 GETNGBL R3 K7 + 0x8C0C0709, // 0026 GETMET R3 R3 K9 + 0x60140018, // 0027 GETGBL R5 G24 + 0x5818000C, // 0028 LDCONST R6 K12 + 0x881C0302, // 0029 GETMBR R7 R1 K2 + 0x88200304, // 002A GETMBR R8 R1 K4 + 0x7C140600, // 002B CALL R5 3 + 0x5818000B, // 002C LDCONST R6 K11 + 0x7C0C0600, // 002D CALL R3 3 + 0x80040400, // 002E RET 1 R2 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: stop +********************************************************************/ +be_local_closure(Matter_UDPServer_stop, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(listening), + /* K1 */ be_nested_str_weak(udp_socket), + /* K2 */ be_nested_str_weak(stop), + /* K3 */ be_nested_str_weak(tasmota), + /* K4 */ be_nested_str_weak(remove_fast_loop), + /* K5 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(stop), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060008, // 0001 JMPF R1 #000B + 0x88040101, // 0002 GETMBR R1 R0 K1 + 0x8C040302, // 0003 GETMET R1 R1 K2 + 0x7C040200, // 0004 CALL R1 1 + 0x50040000, // 0005 LDBOOL R1 0 0 + 0x90020001, // 0006 SETMBR R0 K0 R1 + 0xB8060600, // 0007 GETNGBL R1 K3 + 0x8C040304, // 0008 GETMET R1 R1 K4 + 0x880C0105, // 0009 GETMBR R3 R0 K5 + 0x7C040400, // 000A CALL R1 2 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(Matter_UDPServer_init, /* name */ + be_nested_proto( + 5, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 1, /* has sup protos */ + ( &(const struct bproto*[ 1]) { + be_nested_proto( + 2, /* nstack */ + 0, /* argc */ + 0, /* varg */ + 1, /* has upvals */ + ( &(const bupvaldesc[ 1]) { /* upvals */ + be_local_const_upval(1, 0), + }), + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(loop), + }), + be_str_weak(_anonymous_), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x68000000, // 0000 GETUPV R0 U0 + 0x8C000100, // 0001 GETMET R0 R0 K0 + 0x7C000200, // 0002 CALL R0 1 + 0x80000000, // 0003 RET 0 + }) + ), + }), + 1, /* has constants */ + ( &(const bvalue[ 7]) { /* constants */ + /* K0 */ be_nested_str_weak(device), + /* K1 */ be_nested_str_weak(addr), + /* K2 */ be_nested_str_weak(), + /* K3 */ be_nested_str_weak(port), + /* K4 */ be_nested_str_weak(listening), + /* K5 */ be_nested_str_weak(packets_sent), + /* K6 */ be_nested_str_weak(loop_cb), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[20]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x780A0001, // 0001 JMPF R2 #0004 + 0x5C100400, // 0002 MOVE R4 R2 + 0x70020000, // 0003 JMP #0005 + 0x58100002, // 0004 LDCONST R4 K2 + 0x90020204, // 0005 SETMBR R0 K1 R4 + 0x780E0001, // 0006 JMPF R3 #0009 + 0x5C100600, // 0007 MOVE R4 R3 + 0x70020000, // 0008 JMP #000A + 0x541215A3, // 0009 LDINT R4 5540 + 0x90020604, // 000A SETMBR R0 K3 R4 + 0x50100000, // 000B LDBOOL R4 0 0 + 0x90020804, // 000C SETMBR R0 K4 R4 + 0x60100012, // 000D GETGBL R4 G18 + 0x7C100000, // 000E CALL R4 0 + 0x90020A04, // 000F SETMBR R0 K5 R4 + 0x84100000, // 0010 CLOSURE R4 P0 + 0x90020C04, // 0011 SETMBR R0 K6 R4 + 0xA0000000, // 0012 CLOSE R0 + 0x80000000, // 0013 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: _resend_packets ********************************************************************/ @@ -379,287 +630,86 @@ be_local_closure(Matter_UDPServer__resend_packets, /* name */ /******************************************************************** -** Solidified function: received_ack +** Solidified function: _backoff_time ********************************************************************/ -be_local_closure(Matter_UDPServer_received_ack, /* name */ +be_local_closure(Matter_UDPServer__backoff_time, /* name */ be_nested_proto( 10, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[10]) { /* constants */ - /* K0 */ be_nested_str_weak(ack_message_counter), - /* K1 */ be_nested_str_weak(exchange_id), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(packets_sent), - /* K4 */ be_nested_str_weak(msg_id), - /* K5 */ be_nested_str_weak(remove), - /* K6 */ be_nested_str_weak(tasmota), - /* K7 */ be_nested_str_weak(log), - /* K8 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Removed_X20packet_X20from_X20sending_X20list_X20id_X3D), - /* K9 */ be_const_int(1), - }), - be_str_weak(received_ack), - &be_const_str_solidified, - ( &(const binstruction[36]) { /* code */ - 0x88080300, // 0000 GETMBR R2 R1 K0 - 0x880C0301, // 0001 GETMBR R3 R1 K1 - 0x4C100000, // 0002 LDNIL R4 - 0x1C100404, // 0003 EQ R4 R2 R4 - 0x78120000, // 0004 JMPF R4 #0006 - 0x80000800, // 0005 RET 0 - 0x58100002, // 0006 LDCONST R4 K2 - 0x6014000C, // 0007 GETGBL R5 G12 - 0x88180103, // 0008 GETMBR R6 R0 K3 - 0x7C140200, // 0009 CALL R5 1 - 0x14140805, // 000A LT R5 R4 R5 - 0x78160016, // 000B JMPF R5 #0023 - 0x88140103, // 000C GETMBR R5 R0 K3 - 0x94140A04, // 000D GETIDX R5 R5 R4 - 0x88180B04, // 000E GETMBR R6 R5 K4 - 0x1C180C02, // 000F EQ R6 R6 R2 - 0x781A000F, // 0010 JMPF R6 #0021 - 0x88180B01, // 0011 GETMBR R6 R5 K1 - 0x1C180C03, // 0012 EQ R6 R6 R3 - 0x781A000C, // 0013 JMPF R6 #0021 - 0x88180103, // 0014 GETMBR R6 R0 K3 - 0x8C180D05, // 0015 GETMET R6 R6 K5 - 0x5C200800, // 0016 MOVE R8 R4 - 0x7C180400, // 0017 CALL R6 2 - 0xB81A0C00, // 0018 GETNGBL R6 K6 - 0x8C180D07, // 0019 GETMET R6 R6 K7 - 0x60200008, // 001A GETGBL R8 G8 - 0x5C240400, // 001B MOVE R9 R2 - 0x7C200200, // 001C CALL R8 1 - 0x00221008, // 001D ADD R8 K8 R8 - 0x54260003, // 001E LDINT R9 4 - 0x7C180600, // 001F CALL R6 3 - 0x70020000, // 0020 JMP #0022 - 0x00100909, // 0021 ADD R4 R4 K9 - 0x7001FFE3, // 0022 JMP #0007 - 0x80000000, // 0023 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: every_50ms -********************************************************************/ -be_local_closure(Matter_UDPServer_every_50ms, /* name */ - be_nested_proto( - 3, /* nstack */ 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(loop), - }), - be_str_weak(every_50ms), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_UDPServer_init, /* name */ - be_nested_proto( - 5, /* nstack */ - 4, /* argc */ - 2, /* varg */ + 4, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 1, /* has sup protos */ ( &(const struct bproto*[ 1]) { be_nested_proto( - 2, /* nstack */ - 0, /* argc */ + 4, /* nstack */ + 2, /* argc */ 0, /* varg */ - 1, /* has upvals */ - ( &(const bupvaldesc[ 1]) { /* upvals */ - be_local_const_upval(1, 0), - }), + 0, /* has upvals */ + NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(loop), + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_const_int(1), + /* K1 */ be_const_int(0), }), - be_str_weak(_anonymous_), + be_str_weak(power_int), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x68000000, // 0000 GETUPV R0 U0 - 0x8C000100, // 0001 GETMET R0 R0 K0 - 0x7C000200, // 0002 CALL R0 1 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 7]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x240C0301, // 0001 GT R3 R1 K1 + 0x780E0002, // 0002 JMPF R3 #0006 + 0x08080400, // 0003 MUL R2 R2 R0 + 0x04040300, // 0004 SUB R1 R1 K0 + 0x7001FFFA, // 0005 JMP #0001 + 0x80040400, // 0006 RET 1 R2 }) ), }), 1, /* has constants */ - ( &(const bvalue[ 7]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(addr), - /* K2 */ be_nested_str_weak(), - /* K3 */ be_nested_str_weak(port), - /* K4 */ be_nested_str_weak(listening), - /* K5 */ be_nested_str_weak(packets_sent), - /* K6 */ be_nested_str_weak(loop_cb), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_UDPServer), + /* K1 */ be_nested_str_weak(math), + /* K2 */ be_nested_str_weak(rand), + /* K3 */ be_const_int(0), + /* K4 */ be_const_int(1), + /* K5 */ be_const_real_hex(0x3FCCCCCD), + /* K6 */ be_const_real_hex(0x3F800000), + /* K7 */ be_const_real_hex(0x3E800000), }), - be_str_weak(init), + be_str_weak(_backoff_time), &be_const_str_solidified, - ( &(const binstruction[20]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x780A0001, // 0001 JMPF R2 #0004 - 0x5C100400, // 0002 MOVE R4 R2 - 0x70020000, // 0003 JMP #0005 - 0x58100002, // 0004 LDCONST R4 K2 - 0x90020204, // 0005 SETMBR R0 K1 R4 - 0x780E0001, // 0006 JMPF R3 #0009 - 0x5C100600, // 0007 MOVE R4 R3 - 0x70020000, // 0008 JMP #000A - 0x541215A3, // 0009 LDINT R4 5540 - 0x90020604, // 000A SETMBR R0 K3 R4 - 0x50100000, // 000B LDBOOL R4 0 0 - 0x90020804, // 000C SETMBR R0 K4 R4 - 0x60100012, // 000D GETGBL R4 G18 - 0x7C100000, // 000E CALL R4 0 - 0x90020A04, // 000F SETMBR R0 K5 R4 - 0x84100000, // 0010 CLOSURE R4 P0 - 0x90020C04, // 0011 SETMBR R0 K6 R4 - 0xA0000000, // 0012 CLOSE R0 - 0x80000000, // 0013 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: send -********************************************************************/ -be_local_closure(Matter_UDPServer_send, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(udp_socket), - /* K1 */ be_nested_str_weak(send), - /* K2 */ be_nested_str_weak(addr), - /* K3 */ be_nested_str_weak(remote_ip), - /* K4 */ be_nested_str_weak(port), - /* K5 */ be_nested_str_weak(remote_port), - /* K6 */ be_nested_str_weak(raw), - /* K7 */ be_nested_str_weak(tasmota), - /* K8 */ be_nested_str_weak(log), - /* K9 */ be_nested_str_weak(MTR_X3A_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K10 */ be_nested_str_weak(MTR_X3A_X20error_X20sending_X20packet_X20to_X20_X27_X5B_X25s_X5D_X3A_X25i_X27), - /* K11 */ be_const_int(3), - }), - be_str_weak(send), - &be_const_str_solidified, - ( &(const binstruction[37]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x88100302, // 0002 GETMBR R4 R1 K2 - 0x78120001, // 0003 JMPF R4 #0006 - 0x88100302, // 0004 GETMBR R4 R1 K2 - 0x70020001, // 0005 JMP #0008 - 0x88100100, // 0006 GETMBR R4 R0 K0 - 0x88100903, // 0007 GETMBR R4 R4 K3 - 0x88140304, // 0008 GETMBR R5 R1 K4 - 0x78160001, // 0009 JMPF R5 #000C - 0x88140304, // 000A GETMBR R5 R1 K4 - 0x70020001, // 000B JMP #000E - 0x88140100, // 000C GETMBR R5 R0 K0 - 0x88140B05, // 000D GETMBR R5 R5 K5 - 0x88180306, // 000E GETMBR R6 R1 K6 - 0x7C080800, // 000F CALL R2 4 - 0x780A0009, // 0010 JMPF R2 #001B - 0xB80E0E00, // 0011 GETNGBL R3 K7 - 0x8C0C0708, // 0012 GETMET R3 R3 K8 - 0x60140018, // 0013 GETGBL R5 G24 - 0x58180009, // 0014 LDCONST R6 K9 - 0x881C0302, // 0015 GETMBR R7 R1 K2 - 0x88200304, // 0016 GETMBR R8 R1 K4 - 0x7C140600, // 0017 CALL R5 3 - 0x541A0003, // 0018 LDINT R6 4 - 0x7C0C0600, // 0019 CALL R3 3 - 0x70020008, // 001A JMP #0024 - 0xB80E0E00, // 001B GETNGBL R3 K7 - 0x8C0C0708, // 001C GETMET R3 R3 K8 - 0x60140018, // 001D GETGBL R5 G24 - 0x5818000A, // 001E LDCONST R6 K10 - 0x881C0302, // 001F GETMBR R7 R1 K2 - 0x88200304, // 0020 GETMBR R8 R1 K4 - 0x7C140600, // 0021 CALL R5 3 - 0x5818000B, // 0022 LDCONST R6 K11 - 0x7C0C0600, // 0023 CALL R3 3 - 0x80040400, // 0024 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: stop -********************************************************************/ -be_local_closure(Matter_UDPServer_stop, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(listening), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(stop), - /* K3 */ be_nested_str_weak(tasmota), - /* K4 */ be_nested_str_weak(remove_fast_loop), - /* K5 */ be_nested_str_weak(loop_cb), - }), - be_str_weak(stop), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060008, // 0001 JMPF R1 #000B - 0x88040101, // 0002 GETMBR R1 R0 K1 - 0x8C040302, // 0003 GETMET R1 R1 K2 - 0x7C040200, // 0004 CALL R1 1 - 0x50040000, // 0005 LDBOOL R1 0 0 - 0x90020001, // 0006 SETMBR R0 K0 R1 - 0xB8060600, // 0007 GETNGBL R1 K3 - 0x8C040304, // 0008 GETMET R1 R1 K4 - 0x880C0105, // 0009 GETMBR R3 R0 K5 - 0x7C040400, // 000A CALL R1 2 - 0x80000000, // 000B RET 0 + ( &(const binstruction[29]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x84080000, // 0001 CLOSURE R2 P0 + 0xA40E0200, // 0002 IMPORT R3 K1 + 0x5412012B, // 0003 LDINT R4 300 + 0x6014000A, // 0004 GETGBL R5 G10 + 0x8C180702, // 0005 GETMET R6 R3 K2 + 0x7C180200, // 0006 CALL R6 1 + 0x541E00FE, // 0007 LDINT R7 255 + 0x2C180C07, // 0008 AND R6 R6 R7 + 0x7C140200, // 0009 CALL R5 1 + 0x541A00FE, // 000A LDINT R6 255 + 0x0C140A06, // 000B DIV R5 R5 R6 + 0x24180103, // 000C GT R6 R0 K3 + 0x781A0001, // 000D JMPF R6 #0010 + 0x04180104, // 000E SUB R6 R0 K4 + 0x70020000, // 000F JMP #0011 + 0x58180003, // 0010 LDCONST R6 K3 + 0x5C1C0400, // 0011 MOVE R7 R2 + 0x58200005, // 0012 LDCONST R8 K5 + 0x5C240C00, // 0013 MOVE R9 R6 + 0x7C1C0400, // 0014 CALL R7 2 + 0x081C0807, // 0015 MUL R7 R4 R7 + 0x08200B07, // 0016 MUL R8 R5 K7 + 0x00220C08, // 0017 ADD R8 K6 R8 + 0x081C0E08, // 0018 MUL R7 R7 R8 + 0x60200009, // 0019 GETGBL R8 G9 + 0x5C240E00, // 001A MOVE R9 R7 + 0x7C200200, // 001B CALL R8 1 + 0x80041000, // 001C RET 1 R8 }) ) ); @@ -679,30 +729,32 @@ be_local_closure(Matter_UDPServer_loop, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[18]) { /* constants */ - /* K0 */ be_nested_str_weak(device), + ( &(const bvalue[20]) { /* constants */ + /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(profiler), /* K2 */ be_const_int(0), /* K3 */ be_nested_str_weak(udp_socket), /* K4 */ be_nested_str_weak(read), - /* K5 */ be_nested_str_weak(start), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(remote_ip), - /* K8 */ be_nested_str_weak(remote_port), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(log), - /* K11 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), - /* K12 */ be_nested_str_weak(dispatch_cb), - /* K13 */ be_nested_str_weak(udp_loop_dispatch), - /* K14 */ be_nested_str_weak(dump), - /* K15 */ be_const_int(2), - /* K16 */ be_nested_str_weak(MAX_PACKETS_READ), - /* K17 */ be_nested_str_weak(_resend_packets), + /* K5 */ be_nested_str_weak(packet), + /* K6 */ be_nested_str_weak(start), + /* K7 */ be_const_int(1), + /* K8 */ be_nested_str_weak(remote_ip), + /* K9 */ be_nested_str_weak(remote_port), + /* K10 */ be_nested_str_weak(tasmota), + /* K11 */ be_nested_str_weak(loglevel), + /* K12 */ be_nested_str_weak(log), + /* K13 */ be_nested_str_weak(MTR_X3A_X20UDP_X20received_X20from_X20_X5B_X25s_X5D_X3A_X25i), + /* K14 */ be_nested_str_weak(dispatch_cb), + /* K15 */ be_nested_str_weak(udp_loop_dispatch), + /* K16 */ be_nested_str_weak(dump), + /* K17 */ be_const_int(2), + /* K18 */ be_nested_str_weak(MAX_PACKETS_READ), + /* K19 */ be_nested_str_weak(_resend_packets), }), be_str_weak(loop), &be_const_str_solidified, - ( &(const binstruction[56]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 + ( &(const binstruction[63]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 0x88040301, // 0001 GETMBR R1 R1 K1 0x58080002, // 0002 LDCONST R2 K2 0x880C0103, // 0003 GETMBR R3 R0 K3 @@ -712,52 +764,59 @@ be_local_closure(Matter_UDPServer_loop, /* name */ 0x80000600, // 0007 RET 0 0x880C0103, // 0008 GETMBR R3 R0 K3 0x8C0C0704, // 0009 GETMET R3 R3 K4 - 0x7C0C0200, // 000A CALL R3 1 - 0x4C100000, // 000B LDNIL R4 - 0x20100604, // 000C NE R4 R3 R4 - 0x78120026, // 000D JMPF R4 #0035 - 0x8C100305, // 000E GETMET R4 R1 K5 - 0x7C100200, // 000F CALL R4 1 - 0x00080506, // 0010 ADD R2 R2 K6 - 0x88100103, // 0011 GETMBR R4 R0 K3 - 0x88100907, // 0012 GETMBR R4 R4 K7 - 0x88140103, // 0013 GETMBR R5 R0 K3 - 0x88140B08, // 0014 GETMBR R5 R5 K8 - 0xB81A1200, // 0015 GETNGBL R6 K9 - 0x8C180D0A, // 0016 GETMET R6 R6 K10 - 0x60200018, // 0017 GETGBL R8 G24 - 0x5824000B, // 0018 LDCONST R9 K11 - 0x5C280800, // 0019 MOVE R10 R4 - 0x5C2C0A00, // 001A MOVE R11 R5 - 0x7C200600, // 001B CALL R8 3 - 0x54260003, // 001C LDINT R9 4 - 0x7C180600, // 001D CALL R6 3 - 0x8818010C, // 001E GETMBR R6 R0 K12 - 0x781A0007, // 001F JMPF R6 #0028 - 0x8C18030A, // 0020 GETMET R6 R1 K10 - 0x5820000D, // 0021 LDCONST R8 K13 - 0x7C180400, // 0022 CALL R6 2 - 0x8C18010C, // 0023 GETMET R6 R0 K12 - 0x5C200600, // 0024 MOVE R8 R3 - 0x5C240800, // 0025 MOVE R9 R4 - 0x5C280A00, // 0026 MOVE R10 R5 - 0x7C180800, // 0027 CALL R6 4 - 0x8C18030E, // 0028 GETMET R6 R1 K14 - 0x5820000F, // 0029 LDCONST R8 K15 - 0x7C180400, // 002A CALL R6 2 - 0x88180110, // 002B GETMBR R6 R0 K16 - 0x14180406, // 002C LT R6 R2 R6 - 0x781A0004, // 002D JMPF R6 #0033 - 0x88180103, // 002E GETMBR R6 R0 K3 - 0x8C180D04, // 002F GETMET R6 R6 K4 - 0x7C180200, // 0030 CALL R6 1 - 0x5C0C0C00, // 0031 MOVE R3 R6 - 0x70020000, // 0032 JMP #0034 - 0x4C0C0000, // 0033 LDNIL R3 - 0x7001FFD5, // 0034 JMP #000B - 0x8C100111, // 0035 GETMET R4 R0 K17 - 0x7C100200, // 0036 CALL R4 1 - 0x80000000, // 0037 RET 0 + 0x88140105, // 000A GETMBR R5 R0 K5 + 0x7C0C0400, // 000B CALL R3 2 + 0x4C100000, // 000C LDNIL R4 + 0x20100604, // 000D NE R4 R3 R4 + 0x7812002C, // 000E JMPF R4 #003C + 0x8C100306, // 000F GETMET R4 R1 K6 + 0x7C100200, // 0010 CALL R4 1 + 0x90020A03, // 0011 SETMBR R0 K5 R3 + 0x00080507, // 0012 ADD R2 R2 K7 + 0x88100103, // 0013 GETMBR R4 R0 K3 + 0x88100908, // 0014 GETMBR R4 R4 K8 + 0x88140103, // 0015 GETMBR R5 R0 K3 + 0x88140B09, // 0016 GETMBR R5 R5 K9 + 0xB81A1400, // 0017 GETNGBL R6 K10 + 0x8C180D0B, // 0018 GETMET R6 R6 K11 + 0x54220003, // 0019 LDINT R8 4 + 0x7C180400, // 001A CALL R6 2 + 0x781A0008, // 001B JMPF R6 #0025 + 0xB81A1400, // 001C GETNGBL R6 K10 + 0x8C180D0C, // 001D GETMET R6 R6 K12 + 0x60200018, // 001E GETGBL R8 G24 + 0x5824000D, // 001F LDCONST R9 K13 + 0x5C280800, // 0020 MOVE R10 R4 + 0x5C2C0A00, // 0021 MOVE R11 R5 + 0x7C200600, // 0022 CALL R8 3 + 0x54260003, // 0023 LDINT R9 4 + 0x7C180600, // 0024 CALL R6 3 + 0x8818010E, // 0025 GETMBR R6 R0 K14 + 0x781A0007, // 0026 JMPF R6 #002F + 0x8C18030C, // 0027 GETMET R6 R1 K12 + 0x5820000F, // 0028 LDCONST R8 K15 + 0x7C180400, // 0029 CALL R6 2 + 0x8C18010E, // 002A GETMET R6 R0 K14 + 0x5C200600, // 002B MOVE R8 R3 + 0x5C240800, // 002C MOVE R9 R4 + 0x5C280A00, // 002D MOVE R10 R5 + 0x7C180800, // 002E CALL R6 4 + 0x8C180310, // 002F GETMET R6 R1 K16 + 0x58200011, // 0030 LDCONST R8 K17 + 0x7C180400, // 0031 CALL R6 2 + 0x88180112, // 0032 GETMBR R6 R0 K18 + 0x14180406, // 0033 LT R6 R2 R6 + 0x781A0004, // 0034 JMPF R6 #003A + 0x88180103, // 0035 GETMBR R6 R0 K3 + 0x8C180D04, // 0036 GETMET R6 R6 K4 + 0x7C180200, // 0037 CALL R6 1 + 0x5C0C0C00, // 0038 MOVE R3 R6 + 0x70020000, // 0039 JMP #003B + 0x4C0C0000, // 003A LDNIL R3 + 0x7001FFCF, // 003B JMP #000C + 0x8C100113, // 003C GETMET R4 R0 K19 + 0x7C100200, // 003D CALL R4 1 + 0x80000000, // 003E RET 0 }) ) ); @@ -765,56 +824,23 @@ be_local_closure(Matter_UDPServer_loop, /* name */ /******************************************************************** -** Solidified function: start +** Solidified function: every_second ********************************************************************/ -be_local_closure(Matter_UDPServer_start, /* name */ +be_local_closure(Matter_UDPServer_every_second, /* name */ be_nested_proto( - 6, /* nstack */ - 2, /* argc */ + 1, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(listening), - /* K1 */ be_nested_str_weak(udp_socket), - /* K2 */ be_nested_str_weak(udp), - /* K3 */ be_nested_str_weak(begin), - /* K4 */ be_nested_str_weak(addr), - /* K5 */ be_nested_str_weak(port), - /* K6 */ be_nested_str_weak(network_error), - /* K7 */ be_nested_str_weak(could_X20not_X20open_X20UDP_X20server), - /* K8 */ be_nested_str_weak(dispatch_cb), - /* K9 */ be_nested_str_weak(tasmota), - /* K10 */ be_nested_str_weak(add_fast_loop), - /* K11 */ be_nested_str_weak(loop_cb), - }), - be_str_weak(start), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(every_second), &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x740A0011, // 0001 JMPT R2 #0014 - 0xB80A0400, // 0002 GETNGBL R2 K2 - 0x7C080000, // 0003 CALL R2 0 - 0x90020202, // 0004 SETMBR R0 K1 R2 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x8C080503, // 0006 GETMET R2 R2 K3 - 0x88100104, // 0007 GETMBR R4 R0 K4 - 0x88140105, // 0008 GETMBR R5 R0 K5 - 0x7C080600, // 0009 CALL R2 3 - 0x5C0C0400, // 000A MOVE R3 R2 - 0x740E0000, // 000B JMPT R3 #000D - 0xB0060D07, // 000C RAISE 1 K6 K7 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x90020003, // 000E SETMBR R0 K0 R3 - 0x90021001, // 000F SETMBR R0 K8 R1 - 0xB80E1200, // 0010 GETNGBL R3 K9 - 0x8C0C070A, // 0011 GETMET R3 R3 K10 - 0x8814010B, // 0012 GETMBR R5 R0 K11 - 0x7C0C0400, // 0013 CALL R3 2 - 0x80000000, // 0014 RET 0 + ( &(const binstruction[ 1]) { /* code */ + 0x80000000, // 0000 RET 0 }) ) ); @@ -825,31 +851,32 @@ be_local_closure(Matter_UDPServer_start, /* name */ ** Solidified class: Matter_UDPServer ********************************************************************/ be_local_class(Matter_UDPServer, - 8, + 9, NULL, - be_nested_map(21, + be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(loop_cb, -1), be_const_var(7) }, - { be_const_key_weak(addr, -1), be_const_var(0) }, - { be_const_key_weak(dispatch_cb, 10), be_const_var(5) }, - { be_const_key_weak(every_second, -1), be_const_closure(Matter_UDPServer_every_second_closure) }, - { be_const_key_weak(send_UDP, 0), be_const_closure(Matter_UDPServer_send_UDP_closure) }, - { be_const_key_weak(loop, 18), be_const_closure(Matter_UDPServer_loop_closure) }, - { be_const_key_weak(device, 11), be_const_var(2) }, - { be_const_key_weak(_resend_packets, -1), be_const_closure(Matter_UDPServer__resend_packets_closure) }, - { be_const_key_weak(MAX_PACKETS_READ, 14), be_const_int(4) }, - { be_const_key_weak(_backoff_time, 5), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, { be_const_key_weak(every_50ms, -1), be_const_closure(Matter_UDPServer_every_50ms_closure) }, - { be_const_key_weak(listening, -1), be_const_var(3) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_UDPServer_init_closure) }, - { be_const_key_weak(RETRIES, -1), be_const_int(5) }, - { be_const_key_weak(packets_sent, 1), be_const_var(6) }, - { be_const_key_weak(udp_socket, -1), be_const_var(4) }, - { be_const_key_weak(send, -1), be_const_closure(Matter_UDPServer_send_closure) }, - { be_const_key_weak(stop, -1), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(send_UDP, -1), be_const_closure(Matter_UDPServer_send_UDP_closure) }, { be_const_key_weak(received_ack, -1), be_const_closure(Matter_UDPServer_received_ack_closure) }, - { be_const_key_weak(port, -1), be_const_var(1) }, - { be_const_key_weak(start, -1), be_const_closure(Matter_UDPServer_start_closure) }, + { be_const_key_weak(every_second, -1), be_const_closure(Matter_UDPServer_every_second_closure) }, + { be_const_key_weak(stop, 18), be_const_closure(Matter_UDPServer_stop_closure) }, + { be_const_key_weak(start, 4), be_const_closure(Matter_UDPServer_start_closure) }, + { be_const_key_weak(listening, -1), be_const_var(3) }, + { be_const_key_weak(send, -1), be_const_closure(Matter_UDPServer_send_closure) }, + { be_const_key_weak(loop, -1), be_const_closure(Matter_UDPServer_loop_closure) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_UDPServer_init_closure) }, + { be_const_key_weak(udp_socket, 6), be_const_var(4) }, + { be_const_key_weak(packet, -1), be_const_var(8) }, + { be_const_key_weak(_backoff_time, -1), be_const_static_closure(Matter_UDPServer__backoff_time_closure) }, + { be_const_key_weak(_resend_packets, -1), be_const_closure(Matter_UDPServer__resend_packets_closure) }, + { be_const_key_weak(addr, -1), be_const_var(0) }, + { be_const_key_weak(dispatch_cb, 8), be_const_var(5) }, + { be_const_key_weak(port, 12), be_const_var(1) }, + { be_const_key_weak(packets_sent, -1), be_const_var(6) }, + { be_const_key_weak(device, -1), be_const_var(2) }, + { be_const_key_weak(loop_cb, -1), be_const_var(7) }, + { be_const_key_weak(MAX_PACKETS_READ, -1), be_const_int(4) }, + { be_const_key_weak(RETRIES, 3), be_const_int(5) }, })), be_str_weak(Matter_UDPServer) ); diff --git a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c index fd250e236..5cb5d7f10 100644 --- a/lib/libesp32/berry_tasmota/src/be_crypto_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_crypto_lib.c @@ -15,6 +15,7 @@ extern int m_rsa_rsassa_pkcs1_v1_5(bvm *vm); extern int m_aes_ccm_init(bvm *vm); extern int m_aes_ccm_encrypt(bvm *vm); +extern int m_aes_ccm_encrypt1(bvm *vm); extern int m_aes_ccm_decrypt(bvm *vm); extern int m_aes_ccm_decrypt1(bvm *vm); extern int m_aes_ccm_tag(bvm *vm); @@ -140,6 +141,7 @@ class be_class_aes_ccm (scope: global, name: AES_CCM) { tag, func(m_aes_ccm_tag) decrypt1, static_func(m_aes_ccm_decrypt1) + encrypt1, static_func(m_aes_ccm_encrypt1) } class be_class_aes_gcm (scope: global, name: AES_GCM) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino index 7270bd7ae..6ac2b6ae4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_crypto.ino @@ -358,8 +358,10 @@ extern "C" { // all-in-one decrypt function // decryption in place // - int32_t m_aes_ccm_decrypt1(struct bvm *vm); - int32_t m_aes_ccm_decrypt1(struct bvm *vm) { + int32_t m_aes_ccm_encrypt1_or_decryt1(bvm *vm, int encrypt); + int32_t m_aes_ccm_encrypt1(bvm *vm) { return m_aes_ccm_encrypt1_or_decryt1(vm, 1); } + int32_t m_aes_ccm_decrypt1(bvm *vm) { return m_aes_ccm_encrypt1_or_decryt1(vm, 0); } + int32_t m_aes_ccm_encrypt1_or_decryt1(bvm *vm, int encrypt) { int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 13 && be_isbytes(vm, 1) // secret_key && be_isbytes(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) // iv, iv_start, iv_len @@ -432,16 +434,24 @@ extern "C" { } br_ccm_flip(&ccm_ctx); - br_ccm_run(&ccm_ctx, 0 /*decrypt*/, data, data_len); // decrypt in place + br_ccm_run(&ccm_ctx, encrypt, data, data_len); // decrypt in place // check tag // create a bytes buffer of 16 bytes uint8_t tag_computed[16] = {}; br_ccm_get_tag(&ccm_ctx, tag_computed); - if (memcmp(tag_computed, tag, tag_len) == 0) { + + if (encrypt) { + // copy the tag back + memcpy(tag, tag_computed, tag_len); be_pushbool(vm, btrue); } else { - be_pushbool(vm, bfalse); + // check that the tag match + if (memcmp(tag_computed, tag, tag_len) == 0) { + be_pushbool(vm, btrue); + } else { + be_pushbool(vm, bfalse); + } } // success From 2cc0964a5fe0dff8ba0dcdb8d51ac6ebec77fb37 Mon Sep 17 00:00:00 2001 From: s-hadinger Date: Thu, 20 Jul 2023 19:28:05 +0000 Subject: [PATCH 087/150] Solidified Code updated --- .../src/solidify/solidified_Matter_IM.h | 364 +++++++++--------- .../solidify/solidified_Matter_IM_Message.h | 146 +++---- 2 files changed, 228 insertions(+), 282 deletions(-) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index 83028f004..ec19acea4 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -353,7 +353,7 @@ be_local_closure(Matter_IM_process_invoke_request_solo, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[46]) { /* constants */ + ( &(const bvalue[45]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(profiler), /* K2 */ be_nested_str_weak(log), @@ -383,27 +383,26 @@ be_local_closure(Matter_IM_process_invoke_request_solo, /* name */ /* K26 */ be_nested_str_weak(add), /* K27 */ be_const_int(354943030), /* K28 */ be_const_int(1), - /* K29 */ be_nested_str_weak(MTR_X3A_X20res_X3D_X25s_X20ctx_X2Estatus_X3D_X25s), - /* K30 */ be_nested_str_weak(SUCCESS), - /* K31 */ be_nested_str_weak(invokeresponse2raw), - /* K32 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), - /* K33 */ be_nested_str_weak(exchange_id), - /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), - /* K35 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), - /* K36 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), - /* K37 */ be_const_int(405077761), - /* K38 */ be_nested_str_weak(build_response), - /* K39 */ be_nested_str_weak(message_handler), - /* K40 */ be_nested_str_weak(raw), - /* K41 */ be_nested_str_weak(clear), - /* K42 */ be_nested_str_weak(encode_frame), - /* K43 */ be_nested_str_weak(encrypt), - /* K44 */ be_nested_str_weak(send_response_frame), - /* K45 */ be_nested_str_weak(RESPONSE_X20SENT), + /* K29 */ be_nested_str_weak(SUCCESS), + /* K30 */ be_nested_str_weak(invokeresponse2raw), + /* K31 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20OK_X20exch_X3D_X25i), + /* K32 */ be_nested_str_weak(exchange_id), + /* K33 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20_X25s_X20_X25s), + /* K34 */ be_nested_str_weak(MTR_X3A_X20_X3CReplied_X20_X20_X20_X28_X256i_X29_X20Status_X3D0x_X2502X_X20exch_X3D_X25i), + /* K35 */ be_nested_str_weak(MTR_X3A_X20_Ignore_X20_X20_X20_X20_X28_X256i_X29_X20exch_X3D_X25i), + /* K36 */ be_const_int(405077761), + /* K37 */ be_nested_str_weak(build_response), + /* K38 */ be_nested_str_weak(message_handler), + /* K39 */ be_nested_str_weak(raw), + /* K40 */ be_nested_str_weak(clear), + /* K41 */ be_nested_str_weak(encode_frame), + /* K42 */ be_nested_str_weak(encrypt), + /* K43 */ be_nested_str_weak(send_response_frame), + /* K44 */ be_nested_str_weak(RESPONSE_X20SENT), }), be_str_weak(process_invoke_request_solo), &be_const_str_solidified, - ( &(const binstruction[223]) { /* code */ + ( &(const binstruction[214]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x8C0C0702, // 0002 GETMET R3 R3 K2 @@ -482,151 +481,142 @@ be_local_closure(Matter_IM_process_invoke_request_solo, /* name */ 0x582C001C, // 004B LDCONST R11 K28 0x5830001C, // 004C LDCONST R12 K28 0x7C240600, // 004D CALL R9 3 - 0xB8262C00, // 004E GETNGBL R9 K22 - 0x8C241302, // 004F GETMET R9 R9 K2 - 0x602C0018, // 0050 GETGBL R11 G24 - 0x5830001D, // 0051 LDCONST R12 K29 - 0x5C340A00, // 0052 MOVE R13 R5 - 0x88380505, // 0053 GETMBR R14 R2 K5 - 0x7C2C0600, // 0054 CALL R11 3 - 0x58300015, // 0055 LDCONST R12 K21 - 0x7C240600, // 0056 CALL R9 3 - 0x50240200, // 0057 LDBOOL R9 1 0 - 0x1C240A09, // 0058 EQ R9 R5 R9 - 0x74260004, // 0059 JMPT R9 #005F - 0x88240505, // 005A GETMBR R9 R2 K5 - 0xB82A0000, // 005B GETNGBL R10 K0 - 0x8828151E, // 005C GETMBR R10 R10 K30 - 0x1C24120A, // 005D EQ R9 R9 R10 - 0x78260017, // 005E JMPF R9 #0077 - 0xB8260000, // 005F GETNGBL R9 K0 - 0x8824131E, // 0060 GETMBR R9 R9 K30 - 0x900A0A09, // 0061 SETMBR R2 K5 R9 - 0x8C24011F, // 0062 GETMET R9 R0 K31 - 0x5C2C1000, // 0063 MOVE R11 R8 - 0x5C300400, // 0064 MOVE R12 R2 - 0x4C340000, // 0065 LDNIL R13 - 0x7C240800, // 0066 CALL R9 4 - 0xB8262C00, // 0067 GETNGBL R9 K22 - 0x8C241317, // 0068 GETMET R9 R9 K23 - 0x582C0015, // 0069 LDCONST R11 K21 - 0x7C240400, // 006A CALL R9 2 - 0x78260009, // 006B JMPF R9 #0076 - 0xB8262C00, // 006C GETNGBL R9 K22 - 0x8C241302, // 006D GETMET R9 R9 K2 - 0x602C0018, // 006E GETGBL R11 G24 - 0x58300020, // 006F LDCONST R12 K32 - 0x8834030C, // 0070 GETMBR R13 R1 K12 - 0x88341B19, // 0071 GETMBR R13 R13 K25 - 0x88380321, // 0072 GETMBR R14 R1 K33 - 0x7C2C0600, // 0073 CALL R11 3 - 0x58300015, // 0074 LDCONST R12 K21 - 0x7C240600, // 0075 CALL R9 3 - 0x70020046, // 0076 JMP #00BE - 0x4C240000, // 0077 LDNIL R9 - 0x20240A09, // 0078 NE R9 R5 R9 - 0x78260018, // 0079 JMPF R9 #0093 - 0x8C24011F, // 007A GETMET R9 R0 K31 - 0x5C2C1000, // 007B MOVE R11 R8 - 0x5C300400, // 007C MOVE R12 R2 - 0x5C340A00, // 007D MOVE R13 R5 - 0x7C240800, // 007E CALL R9 4 - 0x5C240600, // 007F MOVE R9 R3 - 0x74260000, // 0080 JMPT R9 #0082 - 0x580C0011, // 0081 LDCONST R3 K17 - 0xB8262C00, // 0082 GETNGBL R9 K22 - 0x8C241317, // 0083 GETMET R9 R9 K23 - 0x582C0015, // 0084 LDCONST R11 K21 - 0x7C240400, // 0085 CALL R9 2 - 0x7826000A, // 0086 JMPF R9 #0092 - 0xB8262C00, // 0087 GETNGBL R9 K22 - 0x8C241302, // 0088 GETMET R9 R9 K2 - 0x602C0018, // 0089 GETGBL R11 G24 - 0x58300022, // 008A LDCONST R12 K34 - 0x8834030C, // 008B GETMBR R13 R1 K12 - 0x88341B19, // 008C GETMBR R13 R13 K25 - 0x5C380400, // 008D MOVE R14 R2 - 0x5C3C0600, // 008E MOVE R15 R3 - 0x7C2C0800, // 008F CALL R11 4 - 0x58300015, // 0090 LDCONST R12 K21 - 0x7C240600, // 0091 CALL R9 3 - 0x7002002A, // 0092 JMP #00BE - 0x88240505, // 0093 GETMBR R9 R2 K5 - 0x4C280000, // 0094 LDNIL R10 - 0x2024120A, // 0095 NE R9 R9 R10 - 0x78260015, // 0096 JMPF R9 #00AD - 0x8C24011F, // 0097 GETMET R9 R0 K31 - 0x5C2C1000, // 0098 MOVE R11 R8 - 0x5C300400, // 0099 MOVE R12 R2 - 0x4C340000, // 009A LDNIL R13 - 0x7C240800, // 009B CALL R9 4 - 0xB8262C00, // 009C GETNGBL R9 K22 - 0x8C241317, // 009D GETMET R9 R9 K23 - 0x582C0015, // 009E LDCONST R11 K21 - 0x7C240400, // 009F CALL R9 2 - 0x7826000A, // 00A0 JMPF R9 #00AC - 0xB8262C00, // 00A1 GETNGBL R9 K22 - 0x8C241302, // 00A2 GETMET R9 R9 K2 - 0x602C0018, // 00A3 GETGBL R11 G24 - 0x58300023, // 00A4 LDCONST R12 K35 - 0x8834030C, // 00A5 GETMBR R13 R1 K12 - 0x88341B19, // 00A6 GETMBR R13 R13 K25 - 0x88380505, // 00A7 GETMBR R14 R2 K5 - 0x883C0321, // 00A8 GETMBR R15 R1 K33 - 0x7C2C0800, // 00A9 CALL R11 4 - 0x58300015, // 00AA LDCONST R12 K21 - 0x7C240600, // 00AB CALL R9 3 - 0x70020010, // 00AC JMP #00BE - 0xB8262C00, // 00AD GETNGBL R9 K22 - 0x8C241317, // 00AE GETMET R9 R9 K23 - 0x582C0015, // 00AF LDCONST R11 K21 - 0x7C240400, // 00B0 CALL R9 2 - 0x78260009, // 00B1 JMPF R9 #00BC - 0xB8262C00, // 00B2 GETNGBL R9 K22 - 0x8C241302, // 00B3 GETMET R9 R9 K2 - 0x602C0018, // 00B4 GETGBL R11 G24 - 0x58300024, // 00B5 LDCONST R12 K36 - 0x8834030C, // 00B6 GETMBR R13 R1 K12 - 0x88341B19, // 00B7 GETMBR R13 R13 K25 - 0x88380321, // 00B8 GETMBR R14 R1 K33 - 0x7C2C0600, // 00B9 CALL R11 3 - 0x58300015, // 00BA LDCONST R12 K21 - 0x7C240600, // 00BB CALL R9 3 - 0x50240000, // 00BC LDBOOL R9 0 0 - 0x80041200, // 00BD RET 1 R9 - 0x8C24111A, // 00BE GETMET R9 R8 K26 - 0x582C0025, // 00BF LDCONST R11 K37 - 0x5431FFFB, // 00C0 LDINT R12 -4 - 0x7C240600, // 00C1 CALL R9 3 - 0x8C24111A, // 00C2 GETMET R9 R8 K26 - 0x542E0017, // 00C3 LDINT R11 24 - 0x5830001C, // 00C4 LDCONST R12 K28 - 0x7C240600, // 00C5 CALL R9 3 - 0x8C240326, // 00C6 GETMET R9 R1 K38 - 0x542E0008, // 00C7 LDINT R11 9 - 0x50300200, // 00C8 LDBOOL R12 1 0 - 0x7C240600, // 00C9 CALL R9 3 - 0x8828010A, // 00CA GETMBR R10 R0 K10 - 0x88281527, // 00CB GETMBR R10 R10 K39 - 0x882C0328, // 00CC GETMBR R11 R1 K40 - 0x8C301729, // 00CD GETMET R12 R11 K41 - 0x7C300200, // 00CE CALL R12 1 - 0x8C30132A, // 00CF GETMET R12 R9 K42 - 0x5C381000, // 00D0 MOVE R14 R8 - 0x5C3C1600, // 00D1 MOVE R15 R11 - 0x7C300600, // 00D2 CALL R12 3 - 0x8C30132B, // 00D3 GETMET R12 R9 K43 - 0x7C300200, // 00D4 CALL R12 1 - 0x8C30152C, // 00D5 GETMET R12 R10 K44 - 0x5C381200, // 00D6 MOVE R14 R9 - 0x7C300400, // 00D7 CALL R12 2 - 0xB8320000, // 00D8 GETNGBL R12 K0 - 0x88301901, // 00D9 GETMBR R12 R12 K1 - 0x8C301902, // 00DA GETMET R12 R12 K2 - 0x5838002D, // 00DB LDCONST R14 K45 - 0x7C300400, // 00DC CALL R12 2 - 0x50300200, // 00DD LDBOOL R12 1 0 - 0x80041800, // 00DE RET 1 R12 + 0x50240200, // 004E LDBOOL R9 1 0 + 0x1C240A09, // 004F EQ R9 R5 R9 + 0x74260004, // 0050 JMPT R9 #0056 + 0x88240505, // 0051 GETMBR R9 R2 K5 + 0xB82A0000, // 0052 GETNGBL R10 K0 + 0x8828151D, // 0053 GETMBR R10 R10 K29 + 0x1C24120A, // 0054 EQ R9 R9 R10 + 0x78260017, // 0055 JMPF R9 #006E + 0xB8260000, // 0056 GETNGBL R9 K0 + 0x8824131D, // 0057 GETMBR R9 R9 K29 + 0x900A0A09, // 0058 SETMBR R2 K5 R9 + 0x8C24011E, // 0059 GETMET R9 R0 K30 + 0x5C2C1000, // 005A MOVE R11 R8 + 0x5C300400, // 005B MOVE R12 R2 + 0x4C340000, // 005C LDNIL R13 + 0x7C240800, // 005D CALL R9 4 + 0xB8262C00, // 005E GETNGBL R9 K22 + 0x8C241317, // 005F GETMET R9 R9 K23 + 0x582C0015, // 0060 LDCONST R11 K21 + 0x7C240400, // 0061 CALL R9 2 + 0x78260009, // 0062 JMPF R9 #006D + 0xB8262C00, // 0063 GETNGBL R9 K22 + 0x8C241302, // 0064 GETMET R9 R9 K2 + 0x602C0018, // 0065 GETGBL R11 G24 + 0x5830001F, // 0066 LDCONST R12 K31 + 0x8834030C, // 0067 GETMBR R13 R1 K12 + 0x88341B19, // 0068 GETMBR R13 R13 K25 + 0x88380320, // 0069 GETMBR R14 R1 K32 + 0x7C2C0600, // 006A CALL R11 3 + 0x58300015, // 006B LDCONST R12 K21 + 0x7C240600, // 006C CALL R9 3 + 0x70020046, // 006D JMP #00B5 + 0x4C240000, // 006E LDNIL R9 + 0x20240A09, // 006F NE R9 R5 R9 + 0x78260018, // 0070 JMPF R9 #008A + 0x8C24011E, // 0071 GETMET R9 R0 K30 + 0x5C2C1000, // 0072 MOVE R11 R8 + 0x5C300400, // 0073 MOVE R12 R2 + 0x5C340A00, // 0074 MOVE R13 R5 + 0x7C240800, // 0075 CALL R9 4 + 0x5C240600, // 0076 MOVE R9 R3 + 0x74260000, // 0077 JMPT R9 #0079 + 0x580C0011, // 0078 LDCONST R3 K17 + 0xB8262C00, // 0079 GETNGBL R9 K22 + 0x8C241317, // 007A GETMET R9 R9 K23 + 0x582C0015, // 007B LDCONST R11 K21 + 0x7C240400, // 007C CALL R9 2 + 0x7826000A, // 007D JMPF R9 #0089 + 0xB8262C00, // 007E GETNGBL R9 K22 + 0x8C241302, // 007F GETMET R9 R9 K2 + 0x602C0018, // 0080 GETGBL R11 G24 + 0x58300021, // 0081 LDCONST R12 K33 + 0x8834030C, // 0082 GETMBR R13 R1 K12 + 0x88341B19, // 0083 GETMBR R13 R13 K25 + 0x5C380400, // 0084 MOVE R14 R2 + 0x5C3C0600, // 0085 MOVE R15 R3 + 0x7C2C0800, // 0086 CALL R11 4 + 0x58300015, // 0087 LDCONST R12 K21 + 0x7C240600, // 0088 CALL R9 3 + 0x7002002A, // 0089 JMP #00B5 + 0x88240505, // 008A GETMBR R9 R2 K5 + 0x4C280000, // 008B LDNIL R10 + 0x2024120A, // 008C NE R9 R9 R10 + 0x78260015, // 008D JMPF R9 #00A4 + 0x8C24011E, // 008E GETMET R9 R0 K30 + 0x5C2C1000, // 008F MOVE R11 R8 + 0x5C300400, // 0090 MOVE R12 R2 + 0x4C340000, // 0091 LDNIL R13 + 0x7C240800, // 0092 CALL R9 4 + 0xB8262C00, // 0093 GETNGBL R9 K22 + 0x8C241317, // 0094 GETMET R9 R9 K23 + 0x582C0015, // 0095 LDCONST R11 K21 + 0x7C240400, // 0096 CALL R9 2 + 0x7826000A, // 0097 JMPF R9 #00A3 + 0xB8262C00, // 0098 GETNGBL R9 K22 + 0x8C241302, // 0099 GETMET R9 R9 K2 + 0x602C0018, // 009A GETGBL R11 G24 + 0x58300022, // 009B LDCONST R12 K34 + 0x8834030C, // 009C GETMBR R13 R1 K12 + 0x88341B19, // 009D GETMBR R13 R13 K25 + 0x88380505, // 009E GETMBR R14 R2 K5 + 0x883C0320, // 009F GETMBR R15 R1 K32 + 0x7C2C0800, // 00A0 CALL R11 4 + 0x58300015, // 00A1 LDCONST R12 K21 + 0x7C240600, // 00A2 CALL R9 3 + 0x70020010, // 00A3 JMP #00B5 + 0xB8262C00, // 00A4 GETNGBL R9 K22 + 0x8C241317, // 00A5 GETMET R9 R9 K23 + 0x582C0015, // 00A6 LDCONST R11 K21 + 0x7C240400, // 00A7 CALL R9 2 + 0x78260009, // 00A8 JMPF R9 #00B3 + 0xB8262C00, // 00A9 GETNGBL R9 K22 + 0x8C241302, // 00AA GETMET R9 R9 K2 + 0x602C0018, // 00AB GETGBL R11 G24 + 0x58300023, // 00AC LDCONST R12 K35 + 0x8834030C, // 00AD GETMBR R13 R1 K12 + 0x88341B19, // 00AE GETMBR R13 R13 K25 + 0x88380320, // 00AF GETMBR R14 R1 K32 + 0x7C2C0600, // 00B0 CALL R11 3 + 0x58300015, // 00B1 LDCONST R12 K21 + 0x7C240600, // 00B2 CALL R9 3 + 0x50240000, // 00B3 LDBOOL R9 0 0 + 0x80041200, // 00B4 RET 1 R9 + 0x8C24111A, // 00B5 GETMET R9 R8 K26 + 0x582C0024, // 00B6 LDCONST R11 K36 + 0x5431FFFB, // 00B7 LDINT R12 -4 + 0x7C240600, // 00B8 CALL R9 3 + 0x8C24111A, // 00B9 GETMET R9 R8 K26 + 0x542E0017, // 00BA LDINT R11 24 + 0x5830001C, // 00BB LDCONST R12 K28 + 0x7C240600, // 00BC CALL R9 3 + 0x8C240325, // 00BD GETMET R9 R1 K37 + 0x542E0008, // 00BE LDINT R11 9 + 0x50300200, // 00BF LDBOOL R12 1 0 + 0x7C240600, // 00C0 CALL R9 3 + 0x8828010A, // 00C1 GETMBR R10 R0 K10 + 0x88281526, // 00C2 GETMBR R10 R10 K38 + 0x882C0327, // 00C3 GETMBR R11 R1 K39 + 0x8C301728, // 00C4 GETMET R12 R11 K40 + 0x7C300200, // 00C5 CALL R12 1 + 0x8C301329, // 00C6 GETMET R12 R9 K41 + 0x5C381000, // 00C7 MOVE R14 R8 + 0x5C3C1600, // 00C8 MOVE R15 R11 + 0x7C300600, // 00C9 CALL R12 3 + 0x8C30132A, // 00CA GETMET R12 R9 K42 + 0x7C300200, // 00CB CALL R12 1 + 0x8C30152B, // 00CC GETMET R12 R10 K43 + 0x5C381200, // 00CD MOVE R14 R9 + 0x7C300400, // 00CE CALL R12 2 + 0xB8320000, // 00CF GETNGBL R12 K0 + 0x88301901, // 00D0 GETMBR R12 R12 K1 + 0x8C301902, // 00D1 GETMET R12 R12 K2 + 0x5838002C, // 00D2 LDCONST R14 K44 + 0x7C300400, // 00D3 CALL R12 2 + 0x50300200, // 00D4 LDBOOL R12 1 0 + 0x80041800, // 00D5 RET 1 R12 }) ) ); @@ -1173,22 +1163,21 @@ be_local_closure(Matter_IM_process_read_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[11]) { /* constants */ + ( &(const bvalue[10]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(profiler), /* K2 */ be_nested_str_weak(log), /* K3 */ be_nested_str_weak(read_request_start), /* K4 */ be_nested_str_weak(ReadRequestMessage), /* K5 */ be_nested_str_weak(from_TLV), - /* K6 */ be_nested_str_weak(read_request_start_X2DTLV), - /* K7 */ be_nested_str_weak(attributes_requests), - /* K8 */ be_nested_str_weak(_inner_process_read_request), - /* K9 */ be_nested_str_weak(session), - /* K10 */ be_nested_str_weak(send_report_data), + /* K6 */ be_nested_str_weak(attributes_requests), + /* K7 */ be_nested_str_weak(_inner_process_read_request), + /* K8 */ be_nested_str_weak(session), + /* K9 */ be_nested_str_weak(send_report_data), }), be_str_weak(process_read_request), &be_const_str_solidified, - ( &(const binstruction[30]) { /* code */ + ( &(const binstruction[25]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x880C0701, // 0001 GETMBR R3 R3 K1 0x8C0C0702, // 0002 GETMET R3 R3 K2 @@ -1200,25 +1189,20 @@ be_local_closure(Matter_IM_process_read_request, /* name */ 0x8C0C0705, // 0008 GETMET R3 R3 K5 0x5C140400, // 0009 MOVE R5 R2 0x7C0C0400, // 000A CALL R3 2 - 0xB8120000, // 000B GETNGBL R4 K0 - 0x88100901, // 000C GETMBR R4 R4 K1 - 0x8C100902, // 000D GETMET R4 R4 K2 - 0x58180006, // 000E LDCONST R6 K6 - 0x7C100400, // 000F CALL R4 2 - 0x88100707, // 0010 GETMBR R4 R3 K7 - 0x4C140000, // 0011 LDNIL R5 - 0x20100805, // 0012 NE R4 R4 R5 - 0x78120007, // 0013 JMPF R4 #001C - 0x8C100108, // 0014 GETMET R4 R0 K8 - 0x88180309, // 0015 GETMBR R6 R1 K9 - 0x5C1C0600, // 0016 MOVE R7 R3 - 0x7C100600, // 0017 CALL R4 3 - 0x8C14010A, // 0018 GETMET R5 R0 K10 - 0x5C1C0200, // 0019 MOVE R7 R1 - 0x5C200800, // 001A MOVE R8 R4 - 0x7C140600, // 001B CALL R5 3 - 0x50100200, // 001C LDBOOL R4 1 0 - 0x80040800, // 001D RET 1 R4 + 0x88100706, // 000B GETMBR R4 R3 K6 + 0x4C140000, // 000C LDNIL R5 + 0x20100805, // 000D NE R4 R4 R5 + 0x78120007, // 000E JMPF R4 #0017 + 0x8C100107, // 000F GETMET R4 R0 K7 + 0x88180308, // 0010 GETMBR R6 R1 K8 + 0x5C1C0600, // 0011 MOVE R7 R3 + 0x7C100600, // 0012 CALL R4 3 + 0x8C140109, // 0013 GETMET R5 R0 K9 + 0x5C1C0200, // 0014 MOVE R7 R1 + 0x5C200800, // 0015 MOVE R8 R4 + 0x7C140600, // 0016 CALL R5 3 + 0x50100200, // 0017 LDBOOL R4 1 0 + 0x80040800, // 0018 RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h index 9ce43b085..61bae0147 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM_Message.h @@ -79,108 +79,70 @@ be_local_closure(Matter_IM_Message_send_im, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[27]) { /* constants */ + ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(ready), /* K1 */ be_nested_str_weak(resp), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(profiler), - /* K4 */ be_nested_str_weak(log), - /* K5 */ be_nested_str_weak(IM_Message_send_im_X2D1), - /* K6 */ be_nested_str_weak(data), - /* K7 */ be_nested_str_weak(to_TLV), - /* K8 */ be_nested_str_weak(IM_Message_send_im_X2D1_X2E1), - /* K9 */ be_nested_str_weak(tlv2raw), - /* K10 */ be_nested_str_weak(IM_Message_send_im_X2D1_X2E2), - /* K11 */ be_nested_str_weak(encode_frame), - /* K12 */ be_nested_str_weak(IM_Message_send_im_X2D2), - /* K13 */ be_nested_str_weak(encrypt), - /* K14 */ be_nested_str_weak(IM_Message_send_im_X2D3), - /* K15 */ be_nested_str_weak(tasmota), - /* K16 */ be_nested_str_weak(loglevel), - /* K17 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), - /* K18 */ be_nested_str_weak(session), - /* K19 */ be_nested_str_weak(local_session_id), - /* K20 */ be_nested_str_weak(message_counter), - /* K21 */ be_nested_str_weak(exchange_id), - /* K22 */ be_nested_str_weak(ack_message_counter), - /* K23 */ be_nested_str_weak(send_response_frame), - /* K24 */ be_nested_str_weak(IM_Message_send_im_X2D4), - /* K25 */ be_nested_str_weak(last_counter), - /* K26 */ be_nested_str_weak(finish), + /* K2 */ be_nested_str_weak(data), + /* K3 */ be_nested_str_weak(to_TLV), + /* K4 */ be_nested_str_weak(tlv2raw), + /* K5 */ be_nested_str_weak(encode_frame), + /* K6 */ be_nested_str_weak(encrypt), + /* K7 */ be_nested_str_weak(tasmota), + /* K8 */ be_nested_str_weak(loglevel), + /* K9 */ be_nested_str_weak(log), + /* K10 */ be_nested_str_weak(MTR_X3A_X20_X3Csnd_X20_X20_X20_X20_X20_X20_X20_X28_X256i_X29_X20id_X3D_X25i_X20exch_X3D_X25i_X20rack_X3D_X25s), + /* K11 */ be_nested_str_weak(session), + /* K12 */ be_nested_str_weak(local_session_id), + /* K13 */ be_nested_str_weak(message_counter), + /* K14 */ be_nested_str_weak(exchange_id), + /* K15 */ be_nested_str_weak(ack_message_counter), + /* K16 */ be_nested_str_weak(send_response_frame), + /* K17 */ be_nested_str_weak(last_counter), + /* K18 */ be_nested_str_weak(finish), }), be_str_weak(send_im), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ + ( &(const binstruction[40]) { /* code */ 0x88080100, // 0000 GETMBR R2 R0 K0 0x740A0001, // 0001 JMPT R2 #0004 0x50080000, // 0002 LDBOOL R2 0 0 0x80040400, // 0003 RET 1 R2 0x88080101, // 0004 GETMBR R2 R0 K1 - 0xB80E0400, // 0005 GETNGBL R3 K2 - 0x880C0703, // 0006 GETMBR R3 R3 K3 - 0x8C0C0704, // 0007 GETMET R3 R3 K4 - 0x58140005, // 0008 LDCONST R5 K5 - 0x7C0C0400, // 0009 CALL R3 2 - 0x880C0106, // 000A GETMBR R3 R0 K6 - 0x8C0C0707, // 000B GETMET R3 R3 K7 - 0x7C0C0200, // 000C CALL R3 1 - 0xB8120400, // 000D GETNGBL R4 K2 - 0x88100903, // 000E GETMBR R4 R4 K3 - 0x8C100904, // 000F GETMET R4 R4 K4 - 0x58180008, // 0010 LDCONST R6 K8 - 0x7C100400, // 0011 CALL R4 2 - 0x8C100709, // 0012 GETMET R4 R3 K9 - 0x7C100200, // 0013 CALL R4 1 - 0xB8160400, // 0014 GETNGBL R5 K2 - 0x88140B03, // 0015 GETMBR R5 R5 K3 - 0x8C140B04, // 0016 GETMET R5 R5 K4 - 0x581C000A, // 0017 LDCONST R7 K10 - 0x7C140400, // 0018 CALL R5 2 - 0x8C14050B, // 0019 GETMET R5 R2 K11 - 0x5C1C0800, // 001A MOVE R7 R4 - 0x7C140400, // 001B CALL R5 2 - 0xB8160400, // 001C GETNGBL R5 K2 - 0x88140B03, // 001D GETMBR R5 R5 K3 - 0x8C140B04, // 001E GETMET R5 R5 K4 - 0x581C000C, // 001F LDCONST R7 K12 - 0x7C140400, // 0020 CALL R5 2 - 0x8C14050D, // 0021 GETMET R5 R2 K13 - 0x7C140200, // 0022 CALL R5 1 - 0xB8160400, // 0023 GETNGBL R5 K2 - 0x88140B03, // 0024 GETMBR R5 R5 K3 - 0x8C140B04, // 0025 GETMET R5 R5 K4 - 0x581C000E, // 0026 LDCONST R7 K14 - 0x7C140400, // 0027 CALL R5 2 - 0xB8161E00, // 0028 GETNGBL R5 K15 - 0x8C140B10, // 0029 GETMET R5 R5 K16 - 0x541E0003, // 002A LDINT R7 4 - 0x7C140400, // 002B CALL R5 2 - 0x7816000B, // 002C JMPF R5 #0039 - 0xB8161E00, // 002D GETNGBL R5 K15 - 0x8C140B04, // 002E GETMET R5 R5 K4 - 0x601C0018, // 002F GETGBL R7 G24 - 0x58200011, // 0030 LDCONST R8 K17 - 0x88240512, // 0031 GETMBR R9 R2 K18 - 0x88241313, // 0032 GETMBR R9 R9 K19 - 0x88280514, // 0033 GETMBR R10 R2 K20 - 0x882C0515, // 0034 GETMBR R11 R2 K21 - 0x88300516, // 0035 GETMBR R12 R2 K22 - 0x7C1C0A00, // 0036 CALL R7 5 - 0x54220003, // 0037 LDINT R8 4 - 0x7C140600, // 0038 CALL R5 3 - 0x8C140317, // 0039 GETMET R5 R1 K23 - 0x5C1C0400, // 003A MOVE R7 R2 - 0x7C140400, // 003B CALL R5 2 - 0xB8160400, // 003C GETNGBL R5 K2 - 0x88140B03, // 003D GETMBR R5 R5 K3 - 0x8C140B04, // 003E GETMET R5 R5 K4 - 0x581C0018, // 003F LDCONST R7 K24 - 0x7C140400, // 0040 CALL R5 2 - 0x88140514, // 0041 GETMBR R5 R2 K20 - 0x90023205, // 0042 SETMBR R0 K25 R5 - 0x50140200, // 0043 LDBOOL R5 1 0 - 0x90023405, // 0044 SETMBR R0 K26 R5 - 0x80000000, // 0045 RET 0 + 0x880C0102, // 0005 GETMBR R3 R0 K2 + 0x8C0C0703, // 0006 GETMET R3 R3 K3 + 0x7C0C0200, // 0007 CALL R3 1 + 0x8C100704, // 0008 GETMET R4 R3 K4 + 0x7C100200, // 0009 CALL R4 1 + 0x8C140505, // 000A GETMET R5 R2 K5 + 0x5C1C0800, // 000B MOVE R7 R4 + 0x7C140400, // 000C CALL R5 2 + 0x8C140506, // 000D GETMET R5 R2 K6 + 0x7C140200, // 000E CALL R5 1 + 0xB8160E00, // 000F GETNGBL R5 K7 + 0x8C140B08, // 0010 GETMET R5 R5 K8 + 0x541E0003, // 0011 LDINT R7 4 + 0x7C140400, // 0012 CALL R5 2 + 0x7816000B, // 0013 JMPF R5 #0020 + 0xB8160E00, // 0014 GETNGBL R5 K7 + 0x8C140B09, // 0015 GETMET R5 R5 K9 + 0x601C0018, // 0016 GETGBL R7 G24 + 0x5820000A, // 0017 LDCONST R8 K10 + 0x8824050B, // 0018 GETMBR R9 R2 K11 + 0x8824130C, // 0019 GETMBR R9 R9 K12 + 0x8828050D, // 001A GETMBR R10 R2 K13 + 0x882C050E, // 001B GETMBR R11 R2 K14 + 0x8830050F, // 001C GETMBR R12 R2 K15 + 0x7C1C0A00, // 001D CALL R7 5 + 0x54220003, // 001E LDINT R8 4 + 0x7C140600, // 001F CALL R5 3 + 0x8C140310, // 0020 GETMET R5 R1 K16 + 0x5C1C0400, // 0021 MOVE R7 R2 + 0x7C140400, // 0022 CALL R5 2 + 0x8814050D, // 0023 GETMBR R5 R2 K13 + 0x90022205, // 0024 SETMBR R0 K17 R5 + 0x50140200, // 0025 LDBOOL R5 1 0 + 0x90022405, // 0026 SETMBR R0 K18 R5 + 0x80000000, // 0027 RET 0 }) ) ); From b149443691b049210c7cde75a2e9d9135a251cb0 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:35:22 +0200 Subject: [PATCH 088/150] Fix default battery level - Fix default battery level (#19160) - Bump version to v13.0.0.3 --- CHANGELOG.md | 28 +++++++++++-------- RELEASENOTES.md | 10 ++++++- tasmota/include/tasmota_version.h | 2 +- tasmota/tasmota_support/settings.ino | 3 ++ tasmota/tasmota_support/support_tasmota.ino | 10 +++---- .../tasmota_xdrv_driver/xdrv_12_discovery.ino | 4 +-- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d159e8be4..db42b7baa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,28 +3,34 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [13.0.0.2] +## [13.0.0.3] +### Added + +### Breaking Changed + +### Changed + +### Fixed +- Initial battery level percentage (#19160) + +### Removed + +## [13.0.0.2] 20230721 ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) - Matter mini-profiler (#19075) - Berry `_class` can be used in `static var` initialization code (#19088) -- Berry add `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver -- Berry add metrics for memory allocation/deallocation/reallocation +- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver +- Berry metrics for memory allocation/deallocation/reallocation - Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance -- Berry add AES CCM decrypting in a single call to avoid any object allocation - -### Breaking Changed +- Berry AES CCM decrypting in a single call to avoid any object allocation ### Changed - ESP32 shutter driver support up to 16 shutters (#18295) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) - Berry extend `range(lower, upper, incr)` to arbitrary increment - Berry updated syntax highlighting plugin for VSCode -- Matter latency improvement for single attribute reads and single commands - -### Fixed - -### Removed +- Matter latency improvement for single attribute reads and single commands (#19158) ## [13.0.0.1] 20230708 ### Added diff --git a/RELEASENOTES.md b/RELEASENOTES.md index abaf0b4fd..32031066a 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,7 +110,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v13.0.0.2 +## Changelog v13.0.0.3 ### Added - Command ``BrRestart`` to restart the Berry VM (experimental) [#19003](https://github.com/arendst/Tasmota/issues/19003) - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) @@ -118,6 +118,10 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) - Berry `_class` can be used in `static var` initialization code [#19088](https://github.com/arendst/Tasmota/issues/19088) +- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver +- Berry metrics for memory allocation/deallocation/reallocation +- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance +- Berry AES CCM decrypting in a single call to avoid any object allocation - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Matter mini-profiler [#19075](https://github.com/arendst/Tasmota/issues/19075) @@ -130,9 +134,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) +- Berry extend `range(lower, upper, incr)` to arbitrary increment +- Berry updated syntax highlighting plugin for VSCode - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) - Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) - Matter improve latency for remote commands [#19072](https://github.com/arendst/Tasmota/issues/19072) +- Matter improve latency for single attribute reads and single commands [#19158](https://github.com/arendst/Tasmota/issues/19072) + ### Fixed - Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 6dfd360a2..8350c6860 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0D000002; // 13.0.0.2 +const uint32_t VERSION = 0x0D000003; // 13.0.0.2 #endif // _TASMOTA_VERSION_H_ diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index d1a75ff7f..445940865 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -1741,6 +1741,9 @@ void SettingsDelta(void) { RtcSettings.energy_usage.last_usage_kWhtotal /= 100; #endif } + if (Settings->version < 0x0D000003) { // 13.0.0.3 + Settings->battery_level_percent = 101; + } Settings->version = VERSION; SettingsSave(1); diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index c035f77ca..4daeb4571 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -829,12 +829,10 @@ void MqttShowState(void) ResponseAppendTime(); ResponseAppend_P(PSTR(",\"" D_JSON_UPTIME "\":\"%s\",\"UptimeSec\":%u"), GetUptime().c_str(), UpTime()); - -// Battery Level expliciet for deepsleep devices -if (Settings->battery_level_percent != 101) { - ResponseAppend_P(PSTR(",\"" D_CMND_ZIGBEE_BATTPERCENT "\":%d"), Settings->battery_level_percent); -} - + // Battery Level expliciet for deepsleep devices + if (Settings->battery_level_percent != 101) { + ResponseAppend_P(PSTR(",\"" D_CMND_ZIGBEE_BATTPERCENT "\":%d"), Settings->battery_level_percent); + } #ifdef ESP8266 #ifdef USE_ADC_VCC diff --git a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino index f5fa3a3f7..f71a19b8d 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_12_discovery.ino @@ -201,8 +201,8 @@ void TasDiscoverMessage(void) { Settings->flag5.fade_fixed_duration, light_controller_isCTRGBLinked, light_subtype, - Settings->battery_level_percent==101?0:1, - Settings->deepsleep==0?0:1 + (Settings->battery_level_percent == 101) ? 0 : 1, + (Settings->deepsleep == 0) ? 0 : 1 ); for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { From c7a22f175b11da35aee55146a30401f69d883c36 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 21 Jul 2023 14:55:06 +0200 Subject: [PATCH 089/150] Update changelogs --- CHANGELOG.md | 14 ++++++++------ RELEASENOTES.md | 16 +++++++++------- tasmota/include/tasmota_version.h | 2 +- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db42b7baa..bb3a0f677 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. ### Breaking Changed ### Changed +- Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) ### Fixed - Initial battery level percentage (#19160) @@ -20,16 +21,17 @@ All notable changes to this project will be documented in this file. - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) - Matter mini-profiler (#19075) - Berry `_class` can be used in `static var` initialization code (#19088) -- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver -- Berry metrics for memory allocation/deallocation/reallocation -- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance -- Berry AES CCM decrypting in a single call to avoid any object allocation +- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver (#19117) +- Support for DeepSleep battery level percentage (#19134) +- Berry metrics for memory allocation/deallocation/reallocation (#19150) +- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance (#19152) +- Berry AES CCM decrypting in a single call to avoid any object allocation (#19153) ### Changed - ESP32 shutter driver support up to 16 shutters (#18295) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too (#18295) -- Berry extend `range(lower, upper, incr)` to arbitrary increment -- Berry updated syntax highlighting plugin for VSCode +- Berry extend `range(lower, upper, incr)` to arbitrary increment (#19120) +- Berry updated syntax highlighting plugin for VSCode (#19123) - Matter latency improvement for single attribute reads and single commands (#19158) ## [13.0.0.1] 20230708 diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 32031066a..cd0e562d6 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,12 +116,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) +- Support for DeepSleep battery level percentage [#19134](https://github.com/arendst/Tasmota/issues/19134) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) - Berry `_class` can be used in `static var` initialization code [#19088](https://github.com/arendst/Tasmota/issues/19088) -- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver -- Berry metrics for memory allocation/deallocation/reallocation -- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance -- Berry AES CCM decrypting in a single call to avoid any object allocation +- Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver [#19117](https://github.com/arendst/Tasmota/issues/19117) +- Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance [#19152](https://github.com/arendst/Tasmota/issues/19152) +- Berry metrics for memory allocation/deallocation/reallocation [#19150](https://github.com/arendst/Tasmota/issues/19150) +- Berry AES CCM decrypting in a single call to avoid any object allocation [#19153](https://github.com/arendst/Tasmota/issues/19153) - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Matter mini-profiler [#19075](https://github.com/arendst/Tasmota/issues/19075) @@ -132,14 +133,15 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) +- Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) -- Berry extend `range(lower, upper, incr)` to arbitrary increment -- Berry updated syntax highlighting plugin for VSCode +- Berry extend `range(lower, upper, incr)` to arbitrary increment [#19120](https://github.com/arendst/Tasmota/issues/19120) +- Berry updated syntax highlighting plugin for VSCode [#19123](https://github.com/arendst/Tasmota/issues/19123) - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) - Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) - Matter improve latency for remote commands [#19072](https://github.com/arendst/Tasmota/issues/19072) -- Matter improve latency for single attribute reads and single commands [#19158](https://github.com/arendst/Tasmota/issues/19072) +- Matter improve latency for single attribute reads and single commands [#19158](https://github.com/arendst/Tasmota/issues/19158) ### Fixed diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index 8350c6860..acb8a752a 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0D000003; // 13.0.0.2 +const uint32_t VERSION = 0x0D000003; // 13.0.0.3 #endif // _TASMOTA_VERSION_H_ From 973ce106e77af14647fc52e30f58c6a78a712e64 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 22 Jul 2023 11:28:23 +0200 Subject: [PATCH 090/150] Fix compilation (#19134) --- tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino b/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino index 244ece57e..6d639bce8 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_29_deepsleep.ino @@ -197,7 +197,7 @@ void CmndDeepsleepTime(void) Settings->tele_period = TELE_PERIOD; // Need teleperiod to go back to sleep } } - TasDiscovery(); + TasmotaGlobal.discovery_counter = 1; // force TasDiscovery() } ResponseCmndNumber(Settings->deepsleep); } From bc41500d9c4045a66e4a240b72c0b717c221e7c4 Mon Sep 17 00:00:00 2001 From: Vincent de Groot <53112521+Vincent1964@users.noreply.github.com> Date: Sat, 22 Jul 2023 13:33:47 +0200 Subject: [PATCH 091/150] MAX17043 sensor integration (#18788) * Restart MAX17043 from the scratch * revert change * Changed battery capacity in charge (capacity is the Ah value of the battery, this degrades over time when battery ages) * merge * Changing xsns_109 to 110 * fix nr * removed old xsns109 * Update I2CDEVICES.md * clean-up usage of Interface --- CODE_OWNERS.md | 1 + I2CDEVICES.md | 1 + .../DFRobot_MAX17043/DFRobot_MAX17043.cpp | 68 +++++++++ .../DFRobot_MAX17043/DFRobot_MAX17043.h | 121 ++++++++++++++++ lib/lib_i2c/DFRobot_MAX17043/LICENSE | 7 + lib/lib_i2c/DFRobot_MAX17043/README_CN.md | 121 ++++++++++++++++ .../DFRobot_MAX17043/DFRobot_MAX17043.ino | 74 ++++++++++ lib/lib_i2c/DFRobot_MAX17043/keywords.txt | 9 ++ .../DFRobot_MAX17043/library.properties | 9 ++ .../python/micropython/DFRobot_MAX17043.py | 111 +++++++++++++++ .../python/micropython/README.md | 100 +++++++++++++ .../python/micropython/README_CN.md | 97 +++++++++++++ .../python/micropython/demo_MAX17043.py | 38 +++++ .../python/raspberry/DFRobot_MAX17043.py | 109 +++++++++++++++ .../python/raspberry/README.md | 128 +++++++++++++++++ .../python/raspberry/README_CN.md | 119 ++++++++++++++++ .../raspberry/examples/demo_read_and_int.py | 44 ++++++ lib/lib_i2c/DFRobot_MAX17043/readme.md | 122 ++++++++++++++++ .../resources/images/DFR0563.jpg | Bin 0 -> 12228 bytes .../resources/images/Raspberry Pi.jpg | Bin 0 -> 29834 bytes .../DFRobot_MAX17043/resources/images/UNO.jpg | Bin 0 -> 26373 bytes .../resources/images/esp32.jpg | Bin 0 -> 52867 bytes tasmota/include/i18n.h | 1 + tasmota/language/af_AF.h | 1 + tasmota/language/bg_BG.h | 1 + tasmota/language/ca_AD.h | 1 + tasmota/language/cs_CZ.h | 1 + tasmota/language/de_DE.h | 1 + tasmota/language/el_GR.h | 1 + tasmota/language/en_GB.h | 1 + tasmota/language/es_ES.h | 1 + tasmota/language/fr_FR.h | 1 + tasmota/language/fy_NL.h | 1 + tasmota/language/he_HE.h | 1 + tasmota/language/hu_HU.h | 1 + tasmota/language/it_IT.h | 1 + tasmota/language/ko_KO.h | 1 + tasmota/language/nl_NL.h | 1 + tasmota/language/pl_PL.h | 1 + tasmota/language/pt_BR.h | 1 + tasmota/language/pt_PT.h | 1 + tasmota/language/ro_RO.h | 1 + tasmota/language/ru_RU.h | 1 + tasmota/language/sk_SK.h | 1 + tasmota/language/sv_SE.h | 1 + tasmota/language/tr_TR.h | 1 + tasmota/language/uk_UA.h | 1 + tasmota/language/vi_VN.h | 1 + tasmota/language/zh_CN.h | 1 + tasmota/language/zh_TW.h | 1 + tasmota/my_user_config.h | 2 + .../tasmota_xsns_sensor/xsns_110_max17043.ino | 132 ++++++++++++++++++ 52 files changed, 1441 insertions(+) create mode 100644 lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp create mode 100644 lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h create mode 100644 lib/lib_i2c/DFRobot_MAX17043/LICENSE create mode 100644 lib/lib_i2c/DFRobot_MAX17043/README_CN.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino create mode 100644 lib/lib_i2c/DFRobot_MAX17043/keywords.txt create mode 100644 lib/lib_i2c/DFRobot_MAX17043/library.properties create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py create mode 100644 lib/lib_i2c/DFRobot_MAX17043/readme.md create mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg create mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg create mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg create mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/esp32.jpg create mode 100644 tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md index 49d7f6f53..796f9e58e 100644 --- a/CODE_OWNERS.md +++ b/CODE_OWNERS.md @@ -208,6 +208,7 @@ In addition to @arendst the following code is mainly owned by: | xsns_106_gdk101 | @Szewcson | xsns_107_gm861 | @arendst | xsns_108_tc74 | Michael Loftis +| xsns_110_max17043 | Vincent de Groot | | | Libraries | | | diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 2a51ad36c..040c25469 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -118,3 +118,4 @@ Index | Define | Driver | Device | Address(es) | Description 80 | USE_TC74 | xsns_108 | TC74 | 0x48 - 0x4F | Temperature sensor 81 | USE_PCA9557 | xdrv_69 | PCA95xx | 0x18 - 0x1F | 8-bit I/O expander as virtual button/switch/relay 82 | USE_SGP4X | xsns_109 | SGP4X | 0x59 | Gas (TVOC/NOx index) + 83 | USE_MAX17043 | xsns_110 | MAX17043 | 0x36 | Fuel-gauge for 3.7 Volt Lipo battery diff --git a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp new file mode 100644 index 000000000..b24f686af --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp @@ -0,0 +1,68 @@ +/*! + * @file DFRobot_MAX17043.cpp + * + * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + * @license The MIT License (MIT) + * @author [ouki.wang](ouki.wang@dfrobot.com) + * @version V1.0 + * @date 2018-4-14 + * @url https://github.com/DFRobot/DFRobot_MAX17043 + */ + +#include "DFRobot_MAX17043.h" + +DFRobot_MAX17043::DFRobot_MAX17043() {} + +int DFRobot_MAX17043::begin() +{ + // write16(MAX17043_COMMAND, 0x0054); //power on reset + write16(MAX17043_COMMAND, 0x5400); //power on reset + delay(10); + _DBG_CODE(Serial.print("\nbegin: ")); + _DBG_CODE(Serial.println(read16(MAX17043_CONFIG), HEX)); + if(read16(MAX17043_CONFIG) == 0x971c) { //default 0x971c + write16(MAX17043_MODE, 0x4000); //quick start + write16(MAX17043_CONFIG, 0x9700); + _DBG_CODE(Serial.println(read16(MAX17043_CONFIG), HEX)); + delay(10); + return 0; + } + return -1; +} + +float DFRobot_MAX17043::readVoltage() +{ + return (1.25f * (float)(read16(MAX17043_VCELL) >> 4)); +} + +float DFRobot_MAX17043::readPercentage() +{ + uint16_t per = read16(MAX17043_SOC); + return (float)((per >> 8) + 0.003906f * (per & 0x00ff)); +} + +void DFRobot_MAX17043::setInterrupt(uint8_t per) +{ + uint16_t temp; + if(per > 32) + temp = 32; + else if(per < 1) + temp = 1; + temp = 32 - temp; + writeRegBits(MAX17043_CONFIG, temp, 0x01f, 0); +} + +void DFRobot_MAX17043::clearInterrupt() +{ + writeRegBits(MAX17043_CONFIG, 0, 0x01, 5); +} + +void DFRobot_MAX17043::setSleep() +{ + writeRegBits(MAX17043_CONFIG, 1, 0x01, 7); +} + +void DFRobot_MAX17043::setWakeUp() +{ + writeRegBits(MAX17043_CONFIG, 0, 0x01, 7); +} diff --git a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h new file mode 100644 index 000000000..f4147ba69 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h @@ -0,0 +1,121 @@ +/*! + * @file DFRobot_MAX17043.h + * + * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + * @license The MIT License (MIT) + * @author [ouki.wang](ouki.wang@dfrobot.com) + * @version V1.0 + * @date 2018-4-14 + * @url https://github.com/DFRobot/DFRobot_MAX17043 + */ + +#ifndef __DFROBOT_MAX17043_H +#define __DFROBOT_MAX17043_H + +#include "Arduino.h" +#include "Wire.h" + +#define _DBG 0 + +#if(_DBG) + #define _DBG_CODE(x) x +#else + #define _DBG_CODE(x) +#endif + +#define MAX17043_ADDRESS 0x36 + +#define MAX17043_VCELL 0x02 +#define MAX17043_SOC 0x04 +#define MAX17043_MODE 0x06 +#define MAX17043_VERSION 0x08 +#define MAX17043_CONFIG 0x0c +#define MAX17043_COMMAND 0xfe + +class DFRobot_MAX17043 { +public: + /** + * @fn DFRobot_MAX17043 + * @brief create MAX17043 object + * @return MAX17043 object + */ + DFRobot_MAX17043(); + /** + * @fn begin + * @brief MAX17043 begin and test moudle + * + * @return initialization result + * @retval 0 successful + * @retval -1 faild + */ + int begin(); + /** + * @fn readVoltage + * @brief read battery voltage in mV + * @return voltage in mV + */ + float readVoltage(); + /** + * @fn readPercentage + * @brief read battery remaining capacity in percentage + * + * @return battery remaining capacity in percentage + */ + float readPercentage(); + /** + * @fn setInterrupt + * @brief set MAX17043 interrput threshold + * + * @param per interrupt threshold as %1 - 32% (integer) + */ + void setInterrupt(uint8_t per); + /** + * @fn clearInterrupt + * @brief clear MAX17043 interrupt + */ + void clearInterrupt(); + /** + * @fn setSleep + * @brief set MAX17043 in sleep mode + * + */ + void setSleep(); + /** + * @fn setWakeUp + * @brief weak up MAX17043 + * + */ + void setWakeUp(); + + private: + void write16(uint8_t reg, uint16_t dat) { + Wire.begin(); + Wire.beginTransmission(MAX17043_ADDRESS); + Wire.write(reg); + Wire.write(dat >> 8); + Wire.write(dat); + Wire.endTransmission(); + } + + uint16_t read16(uint8_t reg) { + uint16_t temp; + Wire.begin(); + Wire.beginTransmission(MAX17043_ADDRESS); + Wire.write(reg); + Wire.endTransmission(); + Wire.requestFrom(MAX17043_ADDRESS, 2); + temp = (uint16_t)Wire.read() << 8; + temp |= (uint16_t)Wire.read(); + Wire.endTransmission(); + return temp; + } + + void writeRegBits(uint8_t reg, uint16_t dat, uint16_t bits, uint8_t offset) { + uint16_t temp; + temp = read16(reg); + temp = (temp & (~(bits << offset))) | (dat << offset); + write16(reg, temp); + } +}; + +#endif diff --git a/lib/lib_i2c/DFRobot_MAX17043/LICENSE b/lib/lib_i2c/DFRobot_MAX17043/LICENSE new file mode 100644 index 000000000..79f310082 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/LICENSE @@ -0,0 +1,7 @@ +Copyright 2010 DFRobot Co.Ltd + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/lib/lib_i2c/DFRobot_MAX17043/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/README_CN.md new file mode 100644 index 000000000..85d1f9c87 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/README_CN.md @@ -0,0 +1,121 @@ +# DFRobot_MAX17043 + +* [English Version](./README.md) + +Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 + +![产品效果图](./resources/images/DFR0563.jpg) + + +## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) + SKU: DFR0563 + +## 目录 + +* [概述](#概述) +* [连接](连接) +* [库安装](#库安装) +* [方法](#方法) +* [兼容性](#兼容性) +* [历史](#历史) +* [创作者](#创作者) + +## 概述 + +提供 Arduino 库,用于通过 I2C 读取和解释 MAX17043 数据。 + +## 连接 +相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: + +* Arduino UNO +
    + +
    + +* ESP32 +
    + +
    + + +## 库安装 + +这里有2种安装方法: +1. 使用此库前,请首先下载库文件,将其粘贴到\Arduino\libraries目录中,然后打开examples文件夹并在该文件夹中运行演示。 +2. 直接在Arduino软件库管理中搜索下载 DFRobot_MAX17043 库 + +## 方法 + +```C++ + /** + * @fn DFRobot_MAX17043 + * @brief 构造MAX17043对象 + * @return MAX17043 类对象 + */ + DFRobot_MAX17043(); + /** + * @fn begin + * @brief MAX17043 初始化 + * + * @return 初始化结果 + * @retval 0 成功 + * @retval -1 失败 + */ + int begin(); + /** + * @fn readVoltage + * @brief 读电池电压,单位: mV + * @return 电池电压,单位:mV + */ + float readVoltage(); + /** + * @fn readPercentage + * @brief 读取剩余电池容量的百分比 + * + * @return 剩余电池容量的百分比 + */ + float readPercentage(); + /** + * @fn setInterrupt + * @brief 设置 MAX17043 中断阈值 + * + * @param per 中断阈值范围: %1 - 32% (整数) + */ + void setInterrupt(uint8_t per); + /** + * @fn clearInterrupt + * @brief 清除 MAX17043 中断 + */ + void clearInterrupt(); + /** + * @fn setSleep + * @brief 设置 MAX17043 进入睡眠模式 + * + */ + void setSleep(); + /** + * @fn setWakeUp + * @brief 唤醒 MAX17043 + */ + void setWakeUp(); +``` + +## 兼容性 + +| MCU | Work Well | Work Wrong | Untested | Remarks | +| ------------------ | :-------: | :--------: | :------: | ------- | +| FireBeetle-ESP32 | √ | | | +| FireBeetle-ESP8266 | √ | | | +| Arduino uno | √ | | | + +## 历史 + +- 2018/04/14 - 1.0.0 版本 + +## 创作者 + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) + + + + diff --git a/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino b/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino new file mode 100644 index 000000000..746f166fe --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino @@ -0,0 +1,74 @@ +/*! + * @file DFRobot_MAX17043.ino + * @brief connect gauge I2C interface with your board (please reference board compatibility) + * @n Voltage, percentage will be printed via serial. + * @n Use API to config alaram and sleep (please reference to the readme in lib) + * + * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + * @license The MIT License (MIT) + * @author [ouki.wang](ouki.wang@dfrobot.com) + * @version V1.0 + * @date 2018-4-14 + * @url https://github.com/DFRobot/DFRobot_MAX17043 + */ + +#include "DFRobot_MAX17043.h" +#include "Wire.h" + +#ifdef __AVR__ + #define ALR_PIN 2 +#else + #define ALR_PIN D2 +#endif + +#define PRINT_INTERVAL 2000 + +DFRobot_MAX17043 gauge; +uint8_t intFlag = 0; + +void interruptCallBack() +{ + intFlag = 1; +} + +void setup() +{ + Serial.begin(115200); + while(!Serial); + Serial.println(); + Serial.println(); + pinMode(ALR_PIN, INPUT_PULLUP); + attachInterrupt(ALR_PIN, interruptCallBack, FALLING); //default alert is 32% + + while(gauge.begin() != 0) { + Serial.println("gauge begin faild!"); + delay(2000); + } + delay(2); + Serial.println("gauge begin successful!"); + //gauge.setInterrupt(32); //use this to modify alert threshold as 1% - 32% (integer) +} + +void loop() +{ + static unsigned long lastMillis = 0; + if((millis() - lastMillis) > PRINT_INTERVAL) { + lastMillis = millis(); + Serial.println(); + + Serial.print("voltage: "); + Serial.print(gauge.readVoltage()); + Serial.println(" mV"); + + Serial.print("precentage: "); + Serial.print(gauge.readPercentage()); + Serial.println(" %"); + } + + if(intFlag == 1) { + intFlag = 0; + gauge.clearInterrupt(); + Serial.println("Low power alert interrupt!"); + //put your battery low power alert interrupt service routine here + } +} diff --git a/lib/lib_i2c/DFRobot_MAX17043/keywords.txt b/lib/lib_i2c/DFRobot_MAX17043/keywords.txt new file mode 100644 index 000000000..bcb479a57 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/keywords.txt @@ -0,0 +1,9 @@ +DFRobot_MAX17043 KEYWORD1 + +begin KEYWORD2 +readVoltage KEYWORD2 +readPercentage KEYWORD2 +setInterrupt KEYWORD2 +clearInterrupt KEYWORD2 +setSleep KEYWORD2 +setWakeUp KEYWORD2 \ No newline at end of file diff --git a/lib/lib_i2c/DFRobot_MAX17043/library.properties b/lib/lib_i2c/DFRobot_MAX17043/library.properties new file mode 100644 index 000000000..c769e3bef --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/library.properties @@ -0,0 +1,9 @@ +name=DFRobot_MAX17043 +version=1.0.0 +author=DFRobot +maintainer=ouki.wang +sentence=DFRobot Standard library(SKU:DFR0563). +paragraph=Gravity: I2C 3.7V Li Battery Fuel Gauge. +category=Sensors +url=https://github.com/DFRobot/DFRobot_MAX17043 +architectures=* diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py new file mode 100644 index 000000000..b7ac8b9e8 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py @@ -0,0 +1,111 @@ +'''! + @file DFRobot_MAX17043.py + @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + @license The MIT License (MIT) + @author [ouki.wang](ouki.wang@dfrobot.com) + @version V1.0 + @date 2018-4-14 + @url https://github.com/DFRobot/DFRobot_MAX17043 +''' + +import time + +from machine import I2C, Pin + +## Get I2C bus +i2c = I2C(scl = Pin(22), sda = Pin(21), freq=400000) + +MAX17043_ADDR = 0x36 +MAX17043_VCELL = 0x02 +MAX17043_SOC = 0x04 +MAX17043_MODE = 0x06 +MAX17043_VERSION = 0x08 +MAX17043_CONFIG = 0x0c +MAX17043_COMMAND = 0xfe + +class DFRobot_MAX17043(): + + def __init__(self): + '''! + @brief create MAX17043 object + @return MAX17043 object + ''' + pass + + def begin(self): + '''! + @brief MAX17043 begin and test moudle + @return initialization result: + @retval 0 successful + @retval -1 faild + ''' + self._write16(MAX17043_COMMAND, 0x5400) + time.sleep(0.01) + if self._read16(MAX17043_CONFIG) == 0x971c: + self._write16(MAX17043_MODE, 0x4000) + time.sleep(0.01) + self._write16(MAX17043_CONFIG, 0x9700) + return 0 + else: + return -1 + + def read_voltage(self): + '''! + @brief read battery voltage in mV + @return voltage in mV + ''' + return (1.25 * (self._read16(MAX17043_VCELL) >> 4)) + + def read_percentage(self): + '''! + @brief read battery remaining capacity in percentage + @return battery remaining capacity in percentage + ''' + tmp = self._read16(MAX17043_SOC) + return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff)) + + def set_Interrupt(self, per): + '''! + @brief set MAX17043 interrput threshold + @param per interrupt threshold as %1 - 32% (integer) + ''' + if per > 32: + per = 32 + elif per < 1: + per = 1 + per = 32 - int(per) + self._write_reg_bits(MAX17043_CONFIG, per, 0x01f, 0) + + def clear_interrupt(self): + '''! + @brief clear MAX17043 interrupt. + ''' + self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 5) + + def set_sleep(self): + '''! + @brief set MAX17043 in sleep mode. + ''' + self._write_reg_bits(MAX17043_CONFIG, 1, 0x01, 7) + + def set_wakeup(self): + '''! + @brief wake up MAX17043. + ''' + self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 7) + + def _write16(self, reg, dat): + buf = bytearray(2) + buf[0] = dat >> 8 + buf[1] = dat & 0x00ff + i2c.writeto_mem(MAX17043_ADDR, reg, buf) + + def _read16(self, reg): + buf = i2c.readfrom_mem(MAX17043_ADDR, reg, 2) + return ((buf[0] << 8) | buf[1]) + + def _write_reg_bits(self, reg, dat, bits, offset): + tmp = self._read16(reg) + tmp = (tmp & (~(bits << offset))) | (dat << offset) + self._write16(reg, tmp) + diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md new file mode 100644 index 000000000..106363df4 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md @@ -0,0 +1,100 @@ +# DFRobot_MAX17043 + +* [中文版](./README_CN.md) + +The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable +equpiment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge +(SOC) of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion +errors.Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low +battery power alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling +pluse to trigger the external interrupt of the controller.One thing should mention that the default value of the battery low power +interrupt alert threshold is 32%, this threshold can be set by the function set_interrupt(). + +![产品效果图](../../resources/images/DFR0563.jpg) + +## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) + SKU: DFR0563 + +## Table of Contents +* [Summary](#summary) +* [connection](connection) +* [Installation](#installation) +* [Methods](#methods) +* [Compatibility](#compatibility) +* [History](#history) +* [Credits](#credits) + +## Summary +Provides a microPython library for reading and interperting MAX17043 data over I2C. + +## Connection +Wires of the same color are linked together,and We only exemplify how this board is connected to the Fuel Gauge. +When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. + +* ESP32 + +
    + +
    + + +## Installation + +To use this library download the zip file, uncomperss it to a folder named DFRobot_MAX17043 in your upyCraft workspace. + +## Methods + +```python + '''! + @brief MAX17043 begin and test moudle + @return initialization result: + @retval 0 successful + @retval -1 faild + ''' + def begin(self): + + '''! + @brief read battery voltage in mV + @return voltage in mV + ''' + def read_voltage(self): + + '''! + @brief read battery remaining capacity in percentage + @return battery remaining capacity in percentage + ''' + def read_percentage(self): + '''! + @brief set MAX17043 interrput threshold + @param per interrupt threshold as %1 - 32% (integer) + ''' + def set_interrupt(self, per): + + '''! + @brief clear MAX17043 interrupt. + ''' + def clear_interrupt(self): + + '''! + @brief set MAX17043 in sleep mode. + ''' + def set_sleep(self): + + '''! + @brief wake up MAX17043. + ''' + +``` +## Compatibility + +| MCU | Work Well | Work Wrong | Untested | Remarks | +| ------------------ | :-------: | :--------: | :------: | ------- | +| ESP32 | √ | | | + +## History + +- 2018/04/14 - Version 1.0.0 released. + +## Credits + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md new file mode 100644 index 000000000..48af8058c --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md @@ -0,0 +1,97 @@ +# DFRobot_MAX17043 + +* [English Version](./README.md) + +Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 + +![产品效果图](../../resources/images/DFR0563.jpg) + + +## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) + SKU: DFR0563 + +## 目录 + +* [概述](#概述) +* [连接](连接) +* [库安装](#库安装) +* [方法](#方法) +* [兼容性](#兼容性) +* [历史](#历史) +* [创作者](#创作者) + +## 概述 +提供 microPython 库,用于通过 I2C 读取和解释 MAX17043 数据 + +## 连接 +相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: + +* ESP32 + +
    + +
    + + +## 库安装 + +要使用此库,请下载 zip 文件,将其解压缩到 upyCraft 工作区中名为 DFRobot_MAX17043 的文件夹中。 + +## 方法 + +```python + '''! + @brief 构造MAX17043对象 + @return MAX17043 初始化 + @retval 0 成功 + @retval -1 失败 + ''' + def begin(self): + + '''! + @brief 读电池电压,单位: mV + @return 电池电压,单位:mV + ''' + def read_voltage(self): + + '''! + @brief 读取剩余电池容量的百分比 + @return 剩余电池容量的百分比 + ''' + def read_percentage(self): + '''! + @brief 设置 MAX17043 中断阈值 + @param per 中断阈值范围: %1 - 32% (整数) + ''' + def set_interrupt(self, per): + + '''! + @brief 清除 MAX17043 中断. + ''' + def clear_interrupt(self): + + '''! + @brief 设置 MAX17043 进入睡眠模式 + ''' + def set_sleep(self): + + '''! + @brief 唤醒 MAX17043 + ''' + def set_wakeup(self): +``` + +## 兼容性 + +| MCU | Work Well | Work Wrong | Untested | Remarks | +| ------------------ | :-------: | :--------: | :------: | ------- | +| ESP32 | √ | | | + +## 历史 + +- 2018/04/14 - 1.0.0 版本 + +## 创作者 + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) + diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py new file mode 100644 index 000000000..d6d5e2f54 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py @@ -0,0 +1,38 @@ +'''! + @file demo_MAX17043.py + @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + @license The MIT License (MIT) + @author [ouki.wang](ouki.wang@dfrobot.com) + @version V1.0 + @date 2018-4-14 + @url https://github.com/DFRobot/DFRobot_MAX17043 +''' + +import time +from machine import Pin +from DFRobot_MAX17043 import DFRobot_MAX17043 + +gauge = DFRobot_MAX17043() + +def interruptCallBack(channel): + gauge.clear_interrupt() + print('Low power alert interrupt!') + #put your battery low power alert interrupt service routine here + +pin_irq = Pin(25, Pin.IN) +pin_irq.irq(trigger = Pin.IRQ_FALLING, handler = interruptCallBack) + +rslt = gauge.begin() + +while rslt != 0: + print('gauge begin faild') + time.sleep(2) + rslt = gauge.begin() + +#gauge.set_Interrupt(32) #use this to modify alert threshold as 1% - 32% (integer) +print('gauge begin successful') + +while True: + time.sleep(2) + print('voltage: ' + str(gauge.read_voltage()) + 'mV') + print('percentage: ' + str(round(gauge.read_percentage(), 2)) + '%') diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py new file mode 100644 index 000000000..1ddc751ca --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py @@ -0,0 +1,109 @@ +'''! + @file DFRobot_MAX17043.py + @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + @license The MIT License (MIT) + @author [ouki.wang](ouki.wang@dfrobot.com) + @version V1.0 + @date 2018-4-14 + @url https://github.com/DFRobot/DFRobot_MAX17043 +''' + +import smbus +import time +import datetime + +# Get I2C bus +bus = smbus.SMBus(1) + +MAX17043_ADDR = 0x36 +MAX17043_VCELL = 0x02 +MAX17043_SOC = 0x04 +MAX17043_MODE = 0x06 +MAX17043_VERSION = 0x08 +MAX17043_CONFIG = 0x0c +MAX17043_COMMAND = 0xfe + +class DFRobot_MAX17043(): + + def __init__(self): + '''! + @brief create MAX17043 object + @return MAX17043 object + ''' + pass + + def begin(self): + '''! + @brief MAX17043 begin and test moudle + @return initialization result: + @retval 0 successful + @retval -1 faild + ''' + self._write16(MAX17043_COMMAND, 0x5400) + time.sleep(0.01) + if self._read16(MAX17043_CONFIG) == 0x971c: + self._write16(MAX17043_MODE, 0x4000) + time.sleep(0.01) + self._write16(MAX17043_CONFIG, 0x9700) + return 0 + else: + return -1 + + def read_voltage(self): + '''! + @brief read battery voltage in mV + @return voltage in mV + ''' + return (1.25 * (self._read16(MAX17043_VCELL) >> 4)) + + def read_percentage(self): + '''! + @brief read battery remaining capacity in percentage + @return battery remaining capacity in percentage + ''' + tmp = self._read16(MAX17043_SOC) + return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff)) + + def set_interrupt(self, per): + '''! + @brief set MAX17043 interrput threshold + @param per interrupt threshold as %1 - 32% (integer) + ''' + if per > 32: + per = 32 + elif per < 1: + per = 1 + per = 32 - int(per) + self._write_reg_bits(MAX17043_CONFIG, per, 0x01f, 0) + + def clear_interrupt(self): + '''! + @brief clear MAX17043 interrupt. + ''' + self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 5) + + def set_sleep(self): + '''! + @brief set MAX17043 in sleep mode. + ''' + self._write_reg_bits(MAX17043_CONFIG, 1, 0x01, 7) + + def set_wakeup(self): + '''! + @brief wake up MAX17043. + ''' + self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 7) + + def _write16(self, reg, dat): + buf = [dat >> 8, dat & 0x00ff] + bus.write_i2c_block_data(MAX17043_ADDR, reg, buf) + + def _read16(self, reg): + buf = bus.read_i2c_block_data(MAX17043_ADDR, reg, 2) + return ((buf[0] << 8) | buf[1]) + + def _write_reg_bits(self, reg, dat, bits, offset): + tmp = self._read16(reg) + tmp = (tmp & (~(bits << offset))) | (dat << offset) + self._write16(reg, tmp) + diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md new file mode 100644 index 000000000..47bd42678 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md @@ -0,0 +1,128 @@ +# DFRobot_MAX17043 + +* [中文版](./README_CN.md) + +The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable +equpiment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge +(SOC) of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion +errors.Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low +battery power alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling +pluse to trigger the external interrupt of the controller.One thing should mention that the default value of the battery low power +interrupt alert threshold is 32%, this threshold can be set by the function set_interrupt(). + +![产品效果图](../../resources/images/DFR0563.jpg) + +## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) + SKU: DFR0563 + +## Table of Contents +* [Summary](#summary) +* [connection](connection) +* [Installation](#installation) +* [Methods](#methods) +* [Compatibility](#compatibility) +* [History](#history) +* [Credits](#credits) + +## Summary + +Provides an Raspberry pi library for reading and interperting MAX17043 data over I2C. + +## Connection +Wires of the same color are linked together,and We only exemplify how these three boards are connected to the Fuel Gauge. +When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. + +* Raspberry Pi +
    + +
    + +## Installation + +Download and install smbus library on Raspberry pi. Steps to install smbus are provided at: + +```python +$> sudo apt-get install -y python-smbus +$> sudo apt-get install -y i2c-tools +``` + +1. To use this library, first download the library file
    +```python +sudo git clone https://github.com/DFRobot/DFRobot_MAX17043 +``` +2. Open and run the routine. To execute a routine demo_x.py, enter python demo_x.py in the command line. For example, to execute the demo_read_and_int.py.py routine, you need to enter :
    + +```python +python demo_read_and_int.py.py +or +python2 demo_read_and_int.py.py +``` + +## Methods + +```python + '''! + @brief MAX17043 begin and test moudle + @return initialization result: + @retval 0 successful + @retval -1 faild + ''' + def begin(self): + + '''! + @brief read battery voltage in mV + @return voltage in mV + ''' + def read_voltage(self): + + '''! + @brief read battery remaining capacity in percentage + @return battery remaining capacity in percentage + ''' + def read_percentage(self): + '''! + @brief set MAX17043 interrput threshold + @param per interrupt threshold as %1 - 32% (integer) + ''' + def set_interrupt(self, per): + + '''! + @brief clear MAX17043 interrupt. + ''' + def clear_interrupt(self): + + '''! + @brief set MAX17043 in sleep mode. + ''' + def set_sleep(self): + + '''! + @brief wake up MAX17043. + ''' + def set_wakeup(self): + + +``` + +## Compatibility + +| 主板 | 通过 | 未通过 | 未测试 | 备注 | +| ------------ | :--: | :----: | :----: | :--: | +| RaspberryPi2 | | | √ | | +| RaspberryPi3 | | | √ | | +| RaspberryPi4 | √ | | | | + +* Python 版本 + +| Python | 通过 | 未通过 | 未测试 | 备注 | +| ------- | :--: | :----: | :----: | ---- | +| Python2 | √ | | | | +| Python3 | | | √ | | + +## History + +- 2018/04/14 - Version 1.0.0 released. + +## Credits + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md new file mode 100644 index 000000000..00894b09a --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md @@ -0,0 +1,119 @@ +# DFRobot_MAX17043 + +* [English Version](./README.md) + +Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 + +![产品效果图](../../resources/images/DFR0563.jpg) + + +## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) + SKU: DFR0563 + +## 目录 + +* [概述](#概述) +* [连接](连接) +* [库安装](#库安装) +* [方法](#方法) +* [兼容性](#兼容性) +* [历史](#历史) +* [创作者](#创作者) + +## 概述 + +提供 python 库,用于通过 I2C 读取和解释 MAX17043 数据。 + +## 连接 +相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: + +* Raspberry Pi +
    + +
    + +## 库安装 +1. 下载库至树莓派,要使用这个库,首先要将库下载到Raspberry Pi,命令下载方法如下:
    +```python +sudo git clone https://github.com/DFRobot/DFRobot_MAX17043 +``` +2. 打开并运行例程,要执行一个例程demo_x.py,请在命令行中输入python demo_x.py。例如,要执行 demo_read_and_int.py例程,你需要输入:
    + +```python +python demo_read_and_int.py +或 +python2 demo_read_and_int.py +``` + +## 方法 + +```python + '''! + @brief 构造MAX17043对象 + @return MAX17043 初始化 + @retval 0 成功 + @retval -1 失败 + ''' + def begin(self): + + '''! + @brief 读电池电压,单位: mV + @return 电池电压,单位:mV + ''' + def read_voltage(self): + + '''! + @brief 读取剩余电池容量的百分比 + @return 剩余电池容量的百分比 + ''' + def read_percentage(self): + '''! + @brief 设置 MAX17043 中断阈值 + @param per 中断阈值范围: %1 - 32% (整数) + ''' + def set_interrupt(self, per): + + '''! + @brief 清除 MAX17043 中断. + ''' + def clear_interrupt(self): + + '''! + @brief 设置 MAX17043 进入睡眠模式 + ''' + def set_sleep(self): + + '''! + @brief 唤醒 MAX17043 + ''' + def set_wakeup(self): +``` + +## 兼容性 + +| 主板 | 通过 | 未通过 | 未测试 | 备注 | +| ------------ | :--: | :----: | :----: | :--: | +| RaspberryPi2 | | | √ | | +| RaspberryPi3 | | | √ | | +| RaspberryPi4 | √ | | | | + +* Python 版本 + +| Python | 通过 | 未通过 | 未测试 | 备注 | +| ------- | :--: | :----: | :----: | ---- | +| Python2 | √ | | | | +| Python3 | | | √ | | + +## 历史 + +- 2018/04/14 - 1.0.0 版本 + +## 创作者 + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) + + + + + + diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py new file mode 100644 index 000000000..dd328c640 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py @@ -0,0 +1,44 @@ +'''! + @file demo_read_and_int.py + @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) + @license The MIT License (MIT) + @author [ouki.wang](ouki.wang@dfrobot.com) + @version V1.0 + @date 2018-4-14 + @url https://github.com/DFRobot/DFRobot_MAX17043 +''' + +import sys +sys.path.append('../') +import time + +sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) +from DFRobot_MAX17043 import DFRobot_MAX17043 +import RPi.GPIO as GPIO + +gauge = DFRobot_MAX17043() + +GPIO.setmode(GPIO.BOARD) +GPIO.setup(7, GPIO.IN) + +def interruptCallBack(channel): + gauge.clear_interrupt() + print('Low power alert interrupt!') + #put your battery low power alert interrupt service routine here + +GPIO.add_event_detect(7, GPIO.FALLING, callback = interruptCallBack, bouncetime = 5) + +rslt = gauge.begin() + +while rslt != 0: + print('gauge begin faild') + time.sleep(2) + rslt = gauge.begin() + +gauge.set_interrupt(32) #use this to modify alert threshold as 1% - 32% (integer) +print('gauge begin successful') + +while True: + time.sleep(2) + print('voltage: ' + str(gauge.read_voltage()) + 'mV') + print('percentage: ' + str(round(gauge.read_percentage(), 2)) + '%') diff --git a/lib/lib_i2c/DFRobot_MAX17043/readme.md b/lib/lib_i2c/DFRobot_MAX17043/readme.md new file mode 100644 index 000000000..fdc79ac77 --- /dev/null +++ b/lib/lib_i2c/DFRobot_MAX17043/readme.md @@ -0,0 +1,122 @@ +# DFRobot_MAX17043 + +* [中文版](./README_CN.md) + + The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable +equipment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge (SOC) +of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion errors. +Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low battery power +alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling pluse to trigger +the external interrupt of the controller.One thing should mention that the default value of the battery low power interrupt alert +threshold is 32%, this threshold can be set by the function setInterrupt(). + +![产品效果图](./resources/images/DFR0563.jpg) + +## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) + SKU: DFR0563 + +## Table of Contents +* [Summary](#summary) +* [connection](connection) +* [Installation](#installation) +* [Methods](#methods) +* [Compatibility](#compatibility) +* [History](#history) +* [Credits](#credits) + +## Summary + +Provides an Arduino library for reading and interperting MAX17043 data over I2C. + +## Connection +Wires of the same color are linked together,and We only exemplify how these the boards are connected to the Fuel Gauge. +When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. + +* Arduino UNO +
    + +
    + +* ESP32 +
    + +
    + + +## Installation + +To use this library download the zip file, uncomperss it to a folder named DFRobot_MAX17043 in Arduino library. +## Methods + +```C++ + /** + * @fn DFRobot_MAX17043 + * @brief create MAX17043 object + * @return MAX17043 object + */ + DFRobot_MAX17043(); + /** + * @fn begin + * @brief MAX17043 begin and test moudle + * + * @return initialization result + * @retval 0 successful + * @retval -1 faild + */ + int begin(); + /** + * @fn readVoltage + * @brief read battery voltage in mV + * @return voltage in mV + */ + float readVoltage(); + /** + * @fn readPercentage + * @brief read battery remaining capacity in percentage + * + * @return battery remaining capacity in percentage + */ + float readPercentage(); + /** + * @fn setInterrupt + * @brief set MAX17043 interrput threshold + * + * @param per interrupt threshold as %1 - 32% (integer) + */ + void setInterrupt(uint8_t per); + /** + * @fn clearInterrupt + * @brief clear MAX17043 interrupt + */ + void clearInterrupt(); + /** + * @fn setSleep + * @brief set MAX17043 in sleep mode + * + */ + void setSleep(); + /** + * @fn setWakeUp + * @brief wake up MAX17043 + * + */ + void setWakeUp(); + +``` + +## Compatibility + +| MCU | Work Well | Work Wrong | Untested | Remarks | +| ------------------ | :-------: | :--------: | :------: | ------- | +| FireBeetle-ESP32 | √ | | | +| FireBeetle-ESP8266 | √ | | | +| Arduino uno | √ | | | + +## History + +- 2018/04/14 - Version 1.0.0 released. + +## Credits + +Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) + diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg new file mode 100644 index 0000000000000000000000000000000000000000..eb0370a56c7a5819263a3f203dadfe10ecc6f234 GIT binary patch literal 12228 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 G2mU{%k|r1c literal 0 HcmV?d00001 diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ab96c2cde7ffbf0cc6dbdc186aaacff594a993e GIT binary patch literal 29834 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 literal 0 HcmV?d00001 diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c3d66b653306b3a6f64fac678c7d7e998d8075c GIT binary patch literal 26373 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 U&LiW}XK@~wC8#@j`On7x0mp*$umAu6 literal 0 HcmV?d00001 diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 1cbb6ffd4..9daf1e90c 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -238,6 +238,7 @@ #define D_JSON_MY "YaxisInduction" #define D_JSON_MZ "ZaxisInduction" #define D_JSON_MAGNETICFLD "MagneticInduction" +#define D_JSON_BATTPERCENT "BatteryPercentage" #define D_RSLT_ENERGY "ENERGY" #define D_RSLT_HASS_STATE "HASS_STATE" #define D_RSLT_INFO "INFO" diff --git a/tasmota/language/af_AF.h b/tasmota/language/af_AF.h index f3df5343f..7e4a8266c 100644 --- a/tasmota/language/af_AF.h +++ b/tasmota/language/af_AF.h @@ -58,6 +58,7 @@ #define D_AS "as" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Lading" // Battery charge in % #define D_BLINK "Flits" #define D_BLINKOFF "FlitsAf" #define D_BOOT_COUNT "Opstarttelling" diff --git a/tasmota/language/bg_BG.h b/tasmota/language/bg_BG.h index 880777669..b88b41a1d 100644 --- a/tasmota/language/bg_BG.h +++ b/tasmota/language/bg_BG.h @@ -58,6 +58,7 @@ #define D_AS "като" #define D_AUTO "АВТОМАТИЧНО" #define D_BATT "Бат." // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Мигане вкл." #define D_BLINKOFF "Мигане изкл." #define D_BOOT_COUNT "Брой стартирания" diff --git a/tasmota/language/ca_AD.h b/tasmota/language/ca_AD.h index ef786b868..9236ad1d4 100644 --- a/tasmota/language/ca_AD.h +++ b/tasmota/language/ca_AD.h @@ -58,6 +58,7 @@ #define D_AS "com" #define D_AUTO "AUTO" #define D_BATT "Bat" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Espurna" #define D_BLINKOFF "Espurna Fora" #define D_BOOT_COUNT "Compte Arrencs" diff --git a/tasmota/language/cs_CZ.h b/tasmota/language/cs_CZ.h index 863ab0786..29be007fe 100644 --- a/tasmota/language/cs_CZ.h +++ b/tasmota/language/cs_CZ.h @@ -58,6 +58,7 @@ #define D_AS "jako" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blikání" #define D_BLINKOFF "BlikáníVyp" #define D_BOOT_COUNT "Počítadlo spuštění" diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index fc3c7950a..81d078731 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -58,6 +58,7 @@ #define D_AS "als" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Ladung" // Battery charge in % #define D_BLINK "Blinken" #define D_BLINKOFF "BlinkenAus" #define D_BOOT_COUNT "Anzahl Startvorgänge" diff --git a/tasmota/language/el_GR.h b/tasmota/language/el_GR.h index d25e8c307..d28d321c7 100644 --- a/tasmota/language/el_GR.h +++ b/tasmota/language/el_GR.h @@ -58,6 +58,7 @@ #define D_AS "ως" #define D_AUTO "ΑΥΤΟΜΑΤΟ" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Καταμέτρηση εκκινήσεων" diff --git a/tasmota/language/en_GB.h b/tasmota/language/en_GB.h index 416fc3c03..f98f11e5f 100644 --- a/tasmota/language/en_GB.h +++ b/tasmota/language/en_GB.h @@ -58,6 +58,7 @@ #define D_AS "as" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Boot Count" diff --git a/tasmota/language/es_ES.h b/tasmota/language/es_ES.h index 1e8632008..0faf11db5 100644 --- a/tasmota/language/es_ES.h +++ b/tasmota/language/es_ES.h @@ -58,6 +58,7 @@ #define D_AS "como" #define D_AUTO "AUTO" #define D_BATT "Bat" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Conteo Reinicios" diff --git a/tasmota/language/fr_FR.h b/tasmota/language/fr_FR.h index 0f62d1571..a2d25a85f 100644 --- a/tasmota/language/fr_FR.h +++ b/tasmota/language/fr_FR.h @@ -58,6 +58,7 @@ #define D_AS "comme" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" // Not better in french #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Nb. de boot" diff --git a/tasmota/language/fy_NL.h b/tasmota/language/fy_NL.h index 7c3955dac..8881749bd 100644 --- a/tasmota/language/fy_NL.h +++ b/tasmota/language/fy_NL.h @@ -58,6 +58,7 @@ #define D_AS "als" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Lading" // Battery charge in % #define D_BLINK "Blinkje" #define D_BLINKOFF "BlinkjeUit" #define D_BOOT_COUNT "Op 'e nij begjinne" diff --git a/tasmota/language/he_HE.h b/tasmota/language/he_HE.h index 39daf879e..545c44ba3 100644 --- a/tasmota/language/he_HE.h +++ b/tasmota/language/he_HE.h @@ -58,6 +58,7 @@ #define D_AS "-כ" #define D_AUTO "אוטומטי" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "מהבהב" #define D_BLINKOFF "כיבוי היבהוב" #define D_BOOT_COUNT "מונה הפעלה מחדש" diff --git a/tasmota/language/hu_HU.h b/tasmota/language/hu_HU.h index bb0e6b211..4154a31f1 100644 --- a/tasmota/language/hu_HU.h +++ b/tasmota/language/hu_HU.h @@ -58,6 +58,7 @@ #define D_AS "mint" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Villogás" #define D_BLINKOFF "Villogás ki" #define D_BOOT_COUNT "Újraindulások száma" diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index 3e8b80e6f..e2f5412e4 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -58,6 +58,7 @@ #define D_AS "come" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Lampeggia" #define D_BLINKOFF "Lampeggia OFF" #define D_BOOT_COUNT "Numero boot" diff --git a/tasmota/language/ko_KO.h b/tasmota/language/ko_KO.h index c5db16e45..f04d95756 100644 --- a/tasmota/language/ko_KO.h +++ b/tasmota/language/ko_KO.h @@ -58,6 +58,7 @@ #define D_AS "as" #define D_AUTO "자동" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "깜박임" #define D_BLINKOFF "깜박임 끄기" #define D_BOOT_COUNT "부팅 횟수" diff --git a/tasmota/language/nl_NL.h b/tasmota/language/nl_NL.h index 4ab10ce0e..87a38d82e 100644 --- a/tasmota/language/nl_NL.h +++ b/tasmota/language/nl_NL.h @@ -58,6 +58,7 @@ #define D_AS "als" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Lading" // Battery charge in % #define D_BLINK "Knipper" #define D_BLINKOFF "KnipperUit" #define D_BOOT_COUNT "Herstarts" diff --git a/tasmota/language/pl_PL.h b/tasmota/language/pl_PL.h index 840a0a847..1da04b14b 100644 --- a/tasmota/language/pl_PL.h +++ b/tasmota/language/pl_PL.h @@ -58,6 +58,7 @@ #define D_AS "jak" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Miganie" #define D_BLINKOFF "Miganie - Wył." #define D_BOOT_COUNT "Licznik restartów" diff --git a/tasmota/language/pt_BR.h b/tasmota/language/pt_BR.h index b4b32eeb1..6b0136112 100644 --- a/tasmota/language/pt_BR.h +++ b/tasmota/language/pt_BR.h @@ -58,6 +58,7 @@ #define D_AS "como" #define D_AUTO "Auto" #define D_BATT "Bat" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Piscar" #define D_BLINKOFF "Piscar desligado" #define D_BOOT_COUNT "Contagem de inicialização" diff --git a/tasmota/language/pt_PT.h b/tasmota/language/pt_PT.h index 8d22afd35..eeb3dd2d9 100644 --- a/tasmota/language/pt_PT.h +++ b/tasmota/language/pt_PT.h @@ -58,6 +58,7 @@ #define D_AS "como" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Piscar" #define D_BLINKOFF "Piscar Desligado" #define D_BOOT_COUNT "Contagem de Inicialização" diff --git a/tasmota/language/ro_RO.h b/tasmota/language/ro_RO.h index ddb93ccc6..995490a7d 100644 --- a/tasmota/language/ro_RO.h +++ b/tasmota/language/ro_RO.h @@ -58,6 +58,7 @@ #define D_AS "as" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Boot Count" diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 655778364..60d61d492 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -58,6 +58,7 @@ #define D_AS "как" #define D_AUTO "АВТО" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Мигать" #define D_BLINKOFF "Не Мигать" #define D_BOOT_COUNT "Количество загрузок" diff --git a/tasmota/language/sk_SK.h b/tasmota/language/sk_SK.h index bcb03e92d..15a3ae00c 100644 --- a/tasmota/language/sk_SK.h +++ b/tasmota/language/sk_SK.h @@ -58,6 +58,7 @@ #define D_AS "ako" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blikanie" #define D_BLINKOFF "BlikanieVyp" #define D_BOOT_COUNT "Počítadlo spustení" diff --git a/tasmota/language/sv_SE.h b/tasmota/language/sv_SE.h index 7555763c0..1bbb4ddd9 100644 --- a/tasmota/language/sv_SE.h +++ b/tasmota/language/sv_SE.h @@ -58,6 +58,7 @@ #define D_AS "som" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blinka" #define D_BLINKOFF "BlinkaAv" #define D_BOOT_COUNT "Uppstartsräknare" diff --git a/tasmota/language/tr_TR.h b/tasmota/language/tr_TR.h index 36b763a07..32b6864ab 100644 --- a/tasmota/language/tr_TR.h +++ b/tasmota/language/tr_TR.h @@ -58,6 +58,7 @@ #define D_AS "as" #define D_AUTO "OTOMATIK" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Yeniden başlama sayısı" diff --git a/tasmota/language/uk_UA.h b/tasmota/language/uk_UA.h index 0023f5c34..6271fe952 100644 --- a/tasmota/language/uk_UA.h +++ b/tasmota/language/uk_UA.h @@ -58,6 +58,7 @@ #define D_AS "як" #define D_AUTO "АВТО" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Блимати" #define D_BLINKOFF "Не блимати" #define D_BOOT_COUNT "К-сть завант." diff --git a/tasmota/language/vi_VN.h b/tasmota/language/vi_VN.h index 11f293b03..63e522ba1 100644 --- a/tasmota/language/vi_VN.h +++ b/tasmota/language/vi_VN.h @@ -58,6 +58,7 @@ #define D_AS "với tên gọi" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "Blink" #define D_BLINKOFF "BlinkOff" #define D_BOOT_COUNT "Số lần khởi động" diff --git a/tasmota/language/zh_CN.h b/tasmota/language/zh_CN.h index ea316b48d..63d65eae2 100644 --- a/tasmota/language/zh_CN.h +++ b/tasmota/language/zh_CN.h @@ -58,6 +58,7 @@ #define D_AS "名称:" #define D_AUTO "自动" #define D_BATT "Batt" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "闪烁" #define D_BLINKOFF "闪烁关" #define D_BOOT_COUNT "启动次数" diff --git a/tasmota/language/zh_TW.h b/tasmota/language/zh_TW.h index 62b656086..d6e7b5f7a 100644 --- a/tasmota/language/zh_TW.h +++ b/tasmota/language/zh_TW.h @@ -58,6 +58,7 @@ #define D_AS "名稱:" #define D_AUTO "自動" #define D_BATT "電池" // Short for Battery +#define D_BATTERY_CHARGE "Charge" // Battery charge in % #define D_BLINK "閃爍" #define D_BLINKOFF "閃爍關" #define D_BOOT_COUNT "啟動計數" diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 495495bd8..4a8291e27 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -711,6 +711,8 @@ // #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses // #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support // #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later +// #define USE_MAX17043 // [I2cDriver110] Enable MAX17043 sensor (I2C addresses 0x36) + // #define USE_PCA9557 // [I2cDriver81] Enable PCA9557 8-bit I/O Expander (I2C addresses 0x18 - 0x1F) (+2k5 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino new file mode 100644 index 000000000..918deeb68 --- /dev/null +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -0,0 +1,132 @@ +/* + xsns_109_max17043.ino - Support for MAX17043 fuel-gauge systems Lipo batteries for Tasmota + + Copyright (C) 2023 Vincent de Groot + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_I2C +#ifdef USE_MAX17043 + +#define XI2C_83 83 // See I2CDEVICES.md + +#define SENSOR_NAME "MAX17043" + +#include "DFRobot_MAX17043.h" + +/*********************************************************************************************\ + * MAX17043 fuel-gauge for 3.7 Volt Lipo batteries + * + * Battery voltage in Volt and State Of Charge (SOC) in percent are published via MQTT + * + * The alert flag and alert threshold are not required for MQTT, the alert pin is not used + * by this sensor driver. + * + * Wirering and other information: + * + * \lib\lib_i2c\DFRobot_MAX17043\resources + * + * Tested module(s): + * + * https://www.dfrobot.com/product-1734.html + * + * Not yet tested module(s): + * + * https://www.aliexpress.us/item/2251832479401925.html + * + \*********************************************************************************************/ + +#define XSNS_109 109 + +const char *mqttId = "MAX17043"; + +DFRobot_MAX17043 gauge; // Class to read from MAX17043 + +struct MAX17043 +{ + float voltage = 0.0; // Battery voltage in Volt + float percentage = 0.0; // Battery remaining charge in percent +} *max17043 = nullptr; + + /*********************************************************************************************/ + +void Max17043Init(void) { + + if (I2cSetDevice(MAX17043_ADDRESS)) { + I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); + if (gauge.begin() == 0) { + max17043 = (MAX17043 *)calloc(1, sizeof(struct MAX17043)); + } + } +} + +void Max17043Read(void) { + + float percentage = 0.0; + + max17043->voltage = gauge.readVoltage()/1000.0; + + // During charging the percentage might be (slightly) above 100%. To avoid stange numbers + // in the statistics we the percentage provided by this driver will not go above 100% + percentage = gauge.readPercentage(); + if (percentage > 100.0) { + max17043->percentage = 100.0; + } + else { + max17043->percentage = percentage; + } +} + +void Max17043Json(void) { + ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), mqttId, &max17043->voltage, &max17043->percentage ); +} + +#ifdef USE_WEBSERVER +void Max17043Show(void) { + WSContentSend_PD(PSTR("{s}%s " D_VOLTAGE "{m}%1_f" D_UNIT_VOLT "{e}"), SENSOR_NAME, &max17043->voltage); + WSContentSend_PD(PSTR("{s}%s " D_BATTERY_CHARGE "{m}%1_f %% {e}"), SENSOR_NAME, &max17043->percentage); +} +#endif // USE_WEBSERVER + +/*********************************************************************************************\ + * Interface +\*********************************************************************************************/ + +bool Xsns109(uint32_t function) { +if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } + + if (FUNC_INIT == function) { + Max17043Init(); + } + else if (max17043 != nullptr) { + switch (function) { + case FUNC_EVERY_SECOND: + Max17043Read(); + break; + case FUNC_JSON_APPEND: + Max17043Json(); + break; + #ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Max17043Show(); + break; + #endif // USE_WEBSERVER + } + } + return false; +} + +#endif // USE_MAX17043 +#endif // USE_I2C \ No newline at end of file From 421c95a51bd9bee13667e20cfe26368b8c392702 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 22 Jul 2023 14:55:20 +0200 Subject: [PATCH 092/150] Update change logs --- CHANGELOG.md | 1 + CODE_OWNERS.md | 12 +++++++++++- RELEASENOTES.md | 1 + tasmota/my_user_config.h | 2 +- tasmota/tasmota_support/support_features.ino | 5 +++-- tools/decode-status.py | 4 ++-- 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb3a0f677..86b43dabc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.3] ### Added +- Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) ### Breaking Changed diff --git a/CODE_OWNERS.md b/CODE_OWNERS.md index 796f9e58e..b0d05100f 100644 --- a/CODE_OWNERS.md +++ b/CODE_OWNERS.md @@ -80,7 +80,16 @@ In addition to @arendst the following code is mainly owned by: | xdrv_66_tm1638 | @arendst | xdrv_67_mcp23xxx | @arendst | xdrv_68_zerocrossDimmer.ino | @stefanbode -| | +| xdrv_69_pca9557 | @cctweaker +| xdrv_70 | +| xdrv_71 | +| xdrv_72 | +| xdrv_73 | +| xdrv_74 | +| xdrv_75 | +| xdrv_76 | +| xdrv_77 | +| xdrv_78 | | xdrv_79_esp32_ble | @staars, @btsimonh | xdrv_81_esp32_webcam | @gemu, @philrich | xdrv_82_esp32_ethernet | @arendst @@ -208,6 +217,7 @@ In addition to @arendst the following code is mainly owned by: | xsns_106_gdk101 | @Szewcson | xsns_107_gm861 | @arendst | xsns_108_tc74 | Michael Loftis +| xsns_109_sgp4x | Andrew Klaus | xsns_110_max17043 | Vincent de Groot | | | Libraries | diff --git a/RELEASENOTES.md b/RELEASENOTES.md index cd0e562d6..218c428f5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -115,6 +115,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``BrRestart`` to restart the Berry VM (experimental) [#19003](https://github.com/arendst/Tasmota/issues/19003) - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) +- Support for MAX17043 fuel-gauge systems Lipo batteries [#18788](https://github.com/arendst/Tasmota/issues/18788) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Support for DeepSleep battery level percentage [#19134](https://github.com/arendst/Tasmota/issues/19134) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 4a8291e27..a29158ccf 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -711,7 +711,7 @@ // #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses // #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support // #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later -// #define USE_MAX17043 // [I2cDriver110] Enable MAX17043 sensor (I2C addresses 0x36) +// #define USE_MAX17043 // [I2cDriver110] Enable MAX17043 sensor (I2C address 0x36) (+0k9 code) // #define USE_PCA9557 // [I2cDriver81] Enable PCA9557 8-bit I/O Expander (I2C addresses 0x18 - 0x1F) (+2k5 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 5103f7ac2..3a73c7e61 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -900,8 +900,9 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_SGP4X) feature9 |= 0x01000000; // xdrv_109_sgp4x.ino #endif - -// feature9 |= 0x02000000; +#if defined(USE_I2C) && defined(USE_MAX17043) + feature9 |= 0x02000000; +#endif // feature9 |= 0x04000000; // feature9 |= 0x08000000; diff --git a/tools/decode-status.py b/tools/decode-status.py index 7a76bde39..4a5533e80 100755 --- a/tools/decode-status.py +++ b/tools/decode-status.py @@ -298,7 +298,7 @@ a_features = [[ "USE_DISPLAY_TM1650","USE_PCA9632","USE_TUYAMCUBR","USE_SEN5X", "USE_BIOPDU","USE_MCP23XXX_DRV","USE_PMSA003I","USE_LOX_O2", "USE_GDK101","USE_GM861","USE_TC74","USE_PCA9557", - "USE_SGP4X","","","", + "USE_SGP4X","USE_MAX17043","","", "","","","" ]] @@ -327,7 +327,7 @@ else: obj = json.load(fp) def StartDecode(): - print ("\n*** decode-status.py v13.0.0.1 by Theo Arends and Jacek Ziolkowski ***") + print ("\n*** decode-status.py v13.0.0.3 by Theo Arends and Jacek Ziolkowski ***") # print("Decoding\n{}".format(obj)) From 6d3aedcafe6851bee060b860d25b563f5bb8f6a5 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 22 Jul 2023 21:51:37 +0200 Subject: [PATCH 093/150] Berry SK6812_GRBW crash (#19166) --- CHANGELOG.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86b43dabc..6d9d519ba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Initial battery level percentage (#19160) +- Berry SK6812_GRBW crash ### Removed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino index 2c6fec252..c62f3bc30 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_leds.ino @@ -155,7 +155,7 @@ extern "C" { } uint32_t pixels_size; // number of bytes to push if (s_ws2812_grb) { s_ws2812_grb->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } - if (s_sk6812_grbw) { s_sk6812_grbw->Show(); pixels_size = s_ws2812_grb->PixelsSize(); } + if (s_sk6812_grbw) { s_sk6812_grbw->Show(); pixels_size = s_sk6812_grbw->PixelsSize(); } // Wait for RMT/I2S to complete fixes distortion due to analogRead // 1ms is needed for 96 bytes From 31c3555d4de1f91f22ff721efb0dc0e25b27a2b2 Mon Sep 17 00:00:00 2001 From: bovirus <1262554+bovirus@users.noreply.github.com> Date: Sun, 23 Jul 2023 09:39:17 +0200 Subject: [PATCH 094/150] Update italian language (#19169) --- tasmota/language/it_IT.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/language/it_IT.h b/tasmota/language/it_IT.h index e2f5412e4..a250ffbc7 100644 --- a/tasmota/language/it_IT.h +++ b/tasmota/language/it_IT.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.4.0.1 - Last update 08.05.2023 + * Updated until v9.4.0.1 - Last update 23.07.2023 \*********************************************************************/ #define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -58,7 +58,7 @@ #define D_AS "come" #define D_AUTO "AUTO" #define D_BATT "Batt" // Short for Battery -#define D_BATTERY_CHARGE "Charge" // Battery charge in % +#define D_BATTERY_CHARGE "Carica" // Battery charge in % #define D_BLINK "Lampeggia" #define D_BLINKOFF "Lampeggia OFF" #define D_BOOT_COUNT "Numero boot" From 547169c57d95b2f0354e99b6a324982b7cfc7612 Mon Sep 17 00:00:00 2001 From: Vincent de Groot <53112521+Vincent1964@users.noreply.github.com> Date: Sun, 23 Jul 2023 11:30:44 +0200 Subject: [PATCH 095/150] changing reference to xsns109 (#19170) --- tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino index 918deeb68..28c736465 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -1,5 +1,5 @@ /* - xsns_109_max17043.ino - Support for MAX17043 fuel-gauge systems Lipo batteries for Tasmota + xsns_110_max17043.ino - Support for MAX17043 fuel-gauge systems Lipo batteries for Tasmota Copyright (C) 2023 Vincent de Groot @@ -48,7 +48,7 @@ * \*********************************************************************************************/ -#define XSNS_109 109 +#define XSNS_110 110 const char *mqttId = "MAX17043"; @@ -104,7 +104,7 @@ void Max17043Show(void) { * Interface \*********************************************************************************************/ -bool Xsns109(uint32_t function) { +bool Xsns110(uint32_t function) { if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } if (FUNC_INIT == function) { @@ -129,4 +129,4 @@ if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } } #endif // USE_MAX17043 -#endif // USE_I2C \ No newline at end of file +#endif // USE_I2C From 994c105bdaa4e55ef62add32da30af0bc74f15dc Mon Sep 17 00:00:00 2001 From: gemu Date: Sun, 23 Jul 2023 11:55:01 +0200 Subject: [PATCH 096/150] fix empty line problem (#19171) --- .../tasmota_xdrv_driver/xdrv_10_scripter.ino | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index ac24a6a9a..54922adf9 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -3807,6 +3807,13 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); SCRIPT_SKIP_SPACES lp = GetNumericArgument(lp, OPER_EQU, &fvar, gv); SCRIPT_SKIP_SPACES + char delimc = 0; + if (*lp != ')') { + // get delimiter + delimc = *lp; + lp++; + } + char rstring[SCRIPT_MAXSSIZE]; rstring[0] = 0; int8_t index = fvar; @@ -3857,6 +3864,12 @@ extern void W8960_SetGain(uint8_t sel, uint16_t value); break; } } + if (delimc) { + char *xp = strchr(rstring, delimc); + if (xp) { + *xp = 0; + } + } free(mqd); } } @@ -6803,6 +6816,11 @@ startline: } // skip empty line SCRIPT_SKIP_EOL + + while (*lp == '\t' || *lp == ' ') { + lp++; + } + // skip comment if (*lp == ';') goto next_line; if (!*lp) break; From c5be85f4437333bab6965649a0e16bf122933ec9 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 23 Jul 2023 14:13:23 +0200 Subject: [PATCH 097/150] Update de_DE.h --- tasmota/language/de_DE.h | 42 ++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tasmota/language/de_DE.h b/tasmota/language/de_DE.h index 81d078731..0dd1b5e4f 100644 --- a/tasmota/language/de_DE.h +++ b/tasmota/language/de_DE.h @@ -28,7 +28,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v10.0.0.1 + * Updated until v13.0.0.3 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -79,15 +79,15 @@ #define D_COUNTER "Zähler" #define D_CT_POWER "CT Power" #define D_CURRENT "Strom" // As in Voltage and Current -#define D_CURRENT_NEUTRAL "Current Neutral" +#define D_CURRENT_NEUTRAL "Strom Neutral" #define D_DATA "Daten" #define D_DARKLIGHT "dunkel" #define D_DEBUG "debug" #define D_DEWPOINT "Taupunkt" #define D_DISABLED "deaktiviert" -#define D_MOVING_DISTANCE "Moving Distance" -#define D_STATIC_DISTANCE "Static Distance" -#define D_DETECT_DISTANCE "Detect Distance" +#define D_MOVING_DISTANCE "Abstand bewegt" +#define D_STATIC_DISTANCE "Abstand fix" +#define D_DETECT_DISTANCE "Abstandsfeststellung" #define D_DISTANCE "Abstand" #define D_DNS_SERVER "DNS-Server" #define D_DO "gelöster Sauerstoff" @@ -108,7 +108,7 @@ #define D_FILE_SYSTEM_SIZE "Dateisystemgröße" #define D_FLOW_RATE "Durchflussmenge" #define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" -#define D_FRAME_RATE "Frame rate" +#define D_FRAME_RATE "Frame Rate" #define D_FREE_MEMORY "Freier Arbeitsspeicher" #define D_PSR_MAX_MEMORY "PS-RAM Speicher" #define D_PSR_FREE_MEMORY "PS-RAM freier Speicher" @@ -191,7 +191,7 @@ #define D_UPGRADE "update" #define D_UPLOAD "Upload" #define D_UPTIME "Laufzeit" -#define D_USED "used" +#define D_USED "genutzt" #define D_USER "Benutzer" #define D_UTC_TIME "UTC" #define D_UV_INDEX "UV-Index" @@ -367,7 +367,7 @@ #define D_MAC_ADDRESS "MAC-Adresse" #define D_MQTT_HOST "MQTT Host" #define D_MQTT_PORT "MQTT Port" -#define D_MQTT_CLIENT "MQTT Client" +#define D_MQTT_CLIENT "MQTT Klient" #define D_MQTT_USER "MQTT Benutzer" #define D_MQTT_TOPIC "MQTT Topic" #define D_MQTT_GROUP_TOPIC "MQTT Group Topic" @@ -384,7 +384,7 @@ #define D_OTA_URL "OTA-URL" #define D_START_UPGRADE "Update starten" #define D_UPGRADE_BY_FILE_UPLOAD "Update Datei hochladen" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPLOAD_FACTORY "Wechsle zur Safeboot Partition" #define D_UPLOAD_STARTED "Upload gestartet" #define D_UPGRADE_STARTED "Update gestartet" #define D_UPLOAD_DONE "Upload abgeschlossen" @@ -503,12 +503,12 @@ #define D_ZIGBEE_GENERATE_KEY "Erzeuge zufälligen Zigbee Netzwerkschlüssel" #define D_ZIGBEE_UNKNOWN_DEVICE "Unbekanntes Gerät" #define D_ZIGBEE_UNKNOWN_ATTRIBUTE "Unbekanntes Attribut" -#define D_ZIGBEE_UNKNOWN_ENDPOINT "Unknown endpoint" +#define D_ZIGBEE_UNKNOWN_ENDPOINT "Unkbekannter Endpunkt" #define D_ZIGBEE_INVALID_PARAM "Ungültiger Parameter" #define D_ZIGBEE_MISSING_PARAM "Fehlende Parameter" #define D_ZIGBEE_UNKNWON_ATTRIBUTE "Unbekannter Attribut Name (ignoriert): %s" #define D_ZIGBEE_TOO_MANY_CLUSTERS "Nur eine Cluster id pro Kommando" -#define D_ZIGBEE_CONFLICTING_ENDPOINTS "Conflicting destination endpoints" +#define D_ZIGBEE_CONFLICTING_ENDPOINTS "Kollidierende Endpunkte" #define D_ZIGBEE_WRONG_DELIMITER "Falscher Delimeter für Payload" #define D_ZIGBEE_UNRECOGNIZED_COMMAND "Unerkanntes Zigbee Kommando: %s" #define D_ZIGBEE_TOO_MANY_COMMANDS "Nur 1 Kommando zulässig (%d)" @@ -522,7 +522,7 @@ // xdrv_89_dali.ino #define D_SENSOR_DALI_RX "Dali RX" #define D_SENSOR_DALI_TX "Dali TX" -#define D_CONFIGURE_DALI "Config DALI" +#define D_CONFIGURE_DALI "Konfig. DALI" // xdrv_03_energy.ino #define D_ENERGY_TODAY "Energie heute" @@ -784,7 +784,7 @@ #define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ" #define D_SENSOR_ADE7953_RST "ADE7953 RST" #define D_SENSOR_ADE7953_CS "ADE7953 CS" -#define D_SENSOR_BUZZER "Buzzer" +#define D_SENSOR_BUZZER "Summer" #define D_SENSOR_DISP_RESET "Display Rst" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" @@ -840,11 +840,11 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" -#define D_SENSOR_ADC_INPUT "ADC Input" -#define D_SENSOR_ADC_TEMP "ADC Temp" -#define D_SENSOR_ADC_LIGHT "ADC Light" -#define D_SENSOR_ADC_BUTTON "ADC Button" -#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_INPUT "ADC Eingang" +#define D_SENSOR_ADC_TEMP "ADC Temp." +#define D_SENSOR_ADC_LIGHT "ADC Licht" +#define D_SENSOR_ADC_BUTTON "ADC Knopf" +#define D_SENSOR_ADC_RANGE "ADC Bereich" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_SENSOR_ADC_PH "ADC pH" @@ -900,7 +900,7 @@ #define D_SENSOR_TFMINIPLUS_TX "TFmini+ TX" #define D_SENSOR_TFMINIPLUS_RX "TFmini+ RX" #define D_SENSOR_ZEROCROSS "ZC Puls" -#define D_SENSOR_HALLEFFECT "HallEffect" +#define D_SENSOR_HALLEFFECT "Hall Effekt" #define D_SENSOR_EPD_DATA "EPD Data" #define D_SENSOR_PCF8574_INT "PCF8574 Int" #define D_SENSOR_MCP23XXX_INT "MCP23xxx Int" @@ -1074,8 +1074,8 @@ #define D_AS3935_FLICKER "IRQ Pin flackert!" #define D_AS3935_POWEROFF "Ausgeschaltet" #define D_AS3935_NOMESS "lausche..." -#define D_AS3935_ON "On" -#define D_AS3935_OFF "Off" +#define D_AS3935_ON "An" +#define D_AS3935_OFF "Aus" #define D_AS3935_INDOORS "Indoors" #define D_AS3935_OUTDOORS "Outdoors" #define D_AS3935_CAL_FAIL "Kalibrierung fehlerhaft" From f626539c1845175eef43e36ae18de238f31da1df Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 24 Jul 2023 12:29:43 +0200 Subject: [PATCH 098/150] Refactor MAX17043 driver --- tasmota/my_user_config.h | 3 +- .../tasmota_xsns_sensor/xsns_110_max17043.ino | 94 +++++++------------ 2 files changed, 36 insertions(+), 61 deletions(-) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index a29158ccf..625368941 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -711,9 +711,8 @@ // #define TC74_MAX_SENSORS 8 // Support non-default/multiple I2C addresses // #define TC74_I2C_PROBE_ADDRESSES { 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F } // Addresses to probe/support // #define TC74_MAX_FAILCOUNT 8 // Maximum failed polls before it's marked inactive until reprobing later -// #define USE_MAX17043 // [I2cDriver110] Enable MAX17043 sensor (I2C address 0x36) (+0k9 code) - // #define USE_PCA9557 // [I2cDriver81] Enable PCA9557 8-bit I/O Expander (I2C addresses 0x18 - 0x1F) (+2k5 code) +// #define USE_MAX17043 // [I2cDriver83] Enable MAX17043 fuel-gauge systems Lipo batteries sensor (I2C address 0x36) (+0k9 code) // #define USE_RTC_CHIPS // Enable RTC chip support and NTP server - Select only one // #define USE_DS3231 // [I2cDriver26] Enable DS3231 RTC (I2C address 0x68) (+1k2 code) diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino index 28c736465..9a4e235bd 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -19,13 +19,6 @@ #ifdef USE_I2C #ifdef USE_MAX17043 - -#define XI2C_83 83 // See I2CDEVICES.md - -#define SENSOR_NAME "MAX17043" - -#include "DFRobot_MAX17043.h" - /*********************************************************************************************\ * MAX17043 fuel-gauge for 3.7 Volt Lipo batteries * @@ -34,7 +27,7 @@ * The alert flag and alert threshold are not required for MQTT, the alert pin is not used * by this sensor driver. * - * Wirering and other information: + * Wiring and other information: * * \lib\lib_i2c\DFRobot_MAX17043\resources * @@ -46,83 +39,66 @@ * * https://www.aliexpress.us/item/2251832479401925.html * - \*********************************************************************************************/ +\*********************************************************************************************/ -#define XSNS_110 110 +#define XSNS_110 110 +#define XI2C_83 83 // See I2CDEVICES.md -const char *mqttId = "MAX17043"; +#include "DFRobot_MAX17043.h" -DFRobot_MAX17043 gauge; // Class to read from MAX17043 +DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 +bool max17043 = false; -struct MAX17043 -{ - float voltage = 0.0; // Battery voltage in Volt - float percentage = 0.0; // Battery remaining charge in percent -} *max17043 = nullptr; - - /*********************************************************************************************/ +/*********************************************************************************************/ void Max17043Init(void) { - if (I2cSetDevice(MAX17043_ADDRESS)) { - I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); - if (gauge.begin() == 0) { - max17043 = (MAX17043 *)calloc(1, sizeof(struct MAX17043)); + if (max17043_gauge.begin() == 0) { + max17043 = true; + I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); } } } -void Max17043Read(void) { +void Max17043Show(bool json) { + float voltage = max17043_gauge.readVoltage() / 1000.0; // Battery voltage in Volt - float percentage = 0.0; - - max17043->voltage = gauge.readVoltage()/1000.0; - - // During charging the percentage might be (slightly) above 100%. To avoid stange numbers - // in the statistics we the percentage provided by this driver will not go above 100% - percentage = gauge.readPercentage(); - if (percentage > 100.0) { - max17043->percentage = 100.0; - } - else { - max17043->percentage = percentage; - } -} - -void Max17043Json(void) { - ResponseAppend_P(PSTR(",\"%s\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), mqttId, &max17043->voltage, &max17043->percentage ); -} + // During charging the percentage might be (slightly) above 100%. To avoid strange numbers + // in the statistics the percentage provided by this driver will not go above 100% + float percentage = max17043_gauge.readPercentage(); // Battery remaining charge in percent + if (percentage > 100.0) { percentage = 100.0; } + if (json) { + ResponseAppend_P(PSTR(",\"MAX17043\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), &voltage, &percentage ); #ifdef USE_WEBSERVER -void Max17043Show(void) { - WSContentSend_PD(PSTR("{s}%s " D_VOLTAGE "{m}%1_f" D_UNIT_VOLT "{e}"), SENSOR_NAME, &max17043->voltage); - WSContentSend_PD(PSTR("{s}%s " D_BATTERY_CHARGE "{m}%1_f %% {e}"), SENSOR_NAME, &max17043->percentage); -} -#endif // USE_WEBSERVER + } else { +// WSContentSend_Voltage("MAX17043", voltage); + WSContentSend_PD(PSTR("{s}MAX17043 " D_VOLTAGE "{m}%1_f" D_UNIT_VOLT "{e}"), &voltage); + WSContentSend_PD(PSTR("{s}MAX17043 " D_BATTERY_CHARGE "{m}%1_f %% {e}"), &percentage); +#endif + } +} /*********************************************************************************************\ * Interface \*********************************************************************************************/ bool Xsns110(uint32_t function) { -if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } + if (!I2cEnabled(MAX17043_ADDRESS)) { return false; } if (FUNC_INIT == function) { Max17043Init(); } - else if (max17043 != nullptr) { + else if (max17043) { switch (function) { - case FUNC_EVERY_SECOND: - Max17043Read(); - break; - case FUNC_JSON_APPEND: - Max17043Json(); - break; - #ifdef USE_WEBSERVER - case FUNC_WEB_SENSOR: - Max17043Show(); + case FUNC_JSON_APPEND: + Max17043Show(1); break; - #endif // USE_WEBSERVER +#ifdef USE_WEBSERVER + case FUNC_WEB_SENSOR: + Max17043Show(0); + break; +#endif // USE_WEBSERVER } } return false; From 17cf73595f77b2d1bfc0c767aa301098d4b7789d Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 24 Jul 2023 14:28:57 +0200 Subject: [PATCH 099/150] Refactor MAX17043 driver Refactor MAX17043 driver optional enable library (default off providing smaller footprint (-250 bytes) --- .../tasmota_xsns_sensor/xsns_110_max17043.ino | 52 +++++++++++++++++-- 1 file changed, 47 insertions(+), 5 deletions(-) diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino index 9a4e235bd..4a90f0b13 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -41,19 +41,51 @@ * \*********************************************************************************************/ -#define XSNS_110 110 -#define XI2C_83 83 // See I2CDEVICES.md +#define XSNS_110 110 +#define XI2C_83 83 // See I2CDEVICES.md + +#define MAX17043_ADDRESS 0x36 + +//#define MAX17043_USE_LIB + +#ifdef MAX17043_USE_LIB #include "DFRobot_MAX17043.h" +DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 + +#else + +#define MAX17043_VCELL 0x02 +#define MAX17043_SOC 0x04 +#define MAX17043_MODE 0x06 +#define MAX17043_VERSION 0x08 +#define MAX17043_CONFIG 0x0c +#define MAX17043_COMMAND 0xfe + +#endif // MAX17043_USE_LIB -DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 bool max17043 = false; /*********************************************************************************************/ void Max17043Init(void) { if (I2cSetDevice(MAX17043_ADDRESS)) { + +#ifdef MAX17043_USE_LIB + if (max17043_gauge.begin() == 0) { + +#else + + I2cWrite16(MAX17043_ADDRESS, MAX17043_COMMAND, 0x5400); // Power on reset + delay(10); + if (I2cRead16(MAX17043_ADDRESS, MAX17043_CONFIG) == 0x971c) { // Default 0x971c + I2cWrite16(MAX17043_ADDRESS, MAX17043_MODE, 0x4000); // Quick start + I2cWrite16(MAX17043_ADDRESS, MAX17043_CONFIG, 0x9700); + delay(10); + +#endif // MAX17043_USE_LIB + max17043 = true; I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); } @@ -61,13 +93,23 @@ void Max17043Init(void) { } void Max17043Show(bool json) { + +#ifdef MAX17043_USE_LIB + float voltage = max17043_gauge.readVoltage() / 1000.0; // Battery voltage in Volt + float percentage = max17043_gauge.readPercentage(); // Battery remaining charge in percent + +#else + + float voltage = (1.25f * (float)(I2cRead16(MAX17043_ADDRESS, MAX17043_VCELL) >> 4)) / 1000.0; // Battery voltage in Volt + uint16_t per = I2cRead16(MAX17043_ADDRESS, MAX17043_SOC); + float percentage = (float)((per >> 8) + 0.003906f * (per & 0x00ff)); // Battery remaining charge in percent + +#endif // MAX17043_USE_LIB // During charging the percentage might be (slightly) above 100%. To avoid strange numbers // in the statistics the percentage provided by this driver will not go above 100% - float percentage = max17043_gauge.readPercentage(); // Battery remaining charge in percent if (percentage > 100.0) { percentage = 100.0; } - if (json) { ResponseAppend_P(PSTR(",\"MAX17043\":{\"" D_JSON_VOLTAGE "\":%3_f,\"" D_JSON_BATTPERCENT "\":%2_f}"), &voltage, &percentage ); #ifdef USE_WEBSERVER From 0ddcea9905c476582eecda31f9e9e8c902928ba1 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 24 Jul 2023 15:11:20 +0200 Subject: [PATCH 100/150] Add alternative for PCA9685 Add alternative for PCA9685 as define PCA9685_V2 (#18805) --- .../xdrv_15_pca9685_v2.ino | 622 ++++++++++++++++++ 1 file changed, 622 insertions(+) create mode 100644 tasmota/tasmota_xdrv_driver/xdrv_15_pca9685_v2.ino diff --git a/tasmota/tasmota_xdrv_driver/xdrv_15_pca9685_v2.ino b/tasmota/tasmota_xdrv_driver/xdrv_15_pca9685_v2.ino new file mode 100644 index 000000000..75ff7dd08 --- /dev/null +++ b/tasmota/tasmota_xdrv_driver/xdrv_15_pca9685_v2.ino @@ -0,0 +1,622 @@ +/* + xdrv_15_pca9685_v2.ino - Support for I2C PCA9685 12bit 16 pin hardware PWM driver on Tasmota + + Copyright (C) 2021 Andre Thomas and Theo Arends + 2023 Fabrizio Amodio + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#ifdef USE_I2C +#ifdef USE_PCA9685_V2 +/*********************************************************************************************\ + * PCA9685 - 16-channel 12-bit pwm driver + * + * I2C Address: 0x40 .. 0x47 +\*********************************************************************************************/ +/* + 2023-06-05 v2.0 Changelog by F.Amodio + - Code Refactoring + + - Support for multiple PCA9685 without breaking support for previuos driver version + all command (PWM,INVERT,etc) now support the suffix from 0 to PCA9685_MAX_COUNT to address the board, + without the suffix the command is relative to the board 0, e.g. + DRIVER15 PWM 0 350 Board address 0 pin 0 value 350 + DRIVER15 PWM0 2 300 Board address 0 pin 2 value 300 + DRIVER15 PWM1 3 235 Board address 1 pin 3 value 235 + DRIVER15 RESET2 Reset Board 2 + + - new command INTCLK to fine tuning the internal clock setting, unit: 0.1 MHz + this is a not permanent setting! + DRIVER15 INTCLK 270 Set to 27.0 MHz + DRIVER15 INTCLK 250 Set to 25.0 Mhz (default value, use USE_PCA9685_INT_CLOCK to change it at compile time) + + - new command PWMTO to move all the required pin from the current pin position to a new one, all the move will be completed into the required time, so each motor will be stepped relative to timing + + - new command PWMSTOP to stop all running movement + + Updated Command List: + + DRIVER15 STATUS // Will return a JSON string containing all the current settings / parameters for all board + DRIVER15 RESET[0-8] // Reset to power-up settings - i.e. F=50hz and all pins in OFF state for a specific board + DRIVER15 INVERT[0-8],pin[,0-1] // print or set the inversion bit on pin of the specific board + DRIVER15 INTCLK[0-8],clock // where clock is the Interal Clock value in 1/10 MHz (default USE_PCA9685_INT_CLOCK = 250) + DRIVER15 PMWF[0-8],frequency // where frequency is the PWM frequency from 24 to 1526 in Hz + DRIVER15 PWM[0-8],pin,pwmvalue // where pin=LED, pin 0 through 15 and pwmvalue is the pulse width between 0 and 4096 + DRIVER15 PWM[0-8],pin,ON // Fully turn a specific board/pin/LED ON + DRIVER15 PWM[0-8],pin,OFF // Fully turn a specific board/pin/LED OFF + + DRIVER15 PWMTO[0-8] tensecs,pin,value[,pin,value[,pin,value...]] // Move all the specified pin to a new location in the specified time (1/10 sec resolution), if "tensecs" is zero it's equivalent to PWM command for all the pins + + e.g. + PWMTO 40 0 327 1 550 2 187 3 200 + this move the PIN0 of the Board 0 from the current position to 327 + the PIN1 of the Board 0 from the current position to 550 + the PIN2 of the Board 0 from the current position to 187 + the PIN3 of the Board 0 from the current position to 200 + + all the movements will be completed in 4 seconds, every PIN will be stepped relative to that @ 50ms step. + + PWMTO1 40 0 327 1 550 2 187 3 200 + same logic on the board #1 + + DRIVER15 PWMSTOP[0-8] // stop all the moment on the relative board +*/ + +#define XDRV_15 15 +#define XI2C_01 1 // See I2CDEVICES.md + +/* + default prescale value from datasheet 7.3.5 + + round(25000000/(4096*freq))-1; +*/ +#ifndef USE_PCA9685_INT_CLOCK +#define USE_PCA9685_INT_CLOCK 250 +#endif + +#ifndef USE_PCA9685_ADDR +#define USE_PCA9685_ADDR 0x40 +#endif + +#ifndef USE_PCA9685_FREQ +#define USE_PCA9685_FREQ 50 +#endif + +#ifndef PCA9685_MAX_COUNT +#define PCA9685_MAX_COUNT 4 +#endif + +#define PCA9685_REG_MODE1 0x00 +#define PCA9685_REG_LED0_ON_L 0x06 +#define PCA9685_REG_PRE_SCALE 0xFE + +typedef struct +{ + uint16_t pwm; + bool running; + uint16_t step; + int16_t every; + uint16_t target; + int16_t direction; // 1 == UP , 0 == stop; -1 == down +} tMotor; + +struct PCA9685 +{ + uint8_t count; + char name[10]; + bool inverted[PCA9685_MAX_COUNT]; + bool detected[PCA9685_MAX_COUNT]; + uint16_t intclk[PCA9685_MAX_COUNT]; + uint16_t freq[PCA9685_MAX_COUNT]; + tMotor motor[PCA9685_MAX_COUNT][16]; +} pca9685; + +#include + +Ticker TickerPCA9685; + +void PCA9685_SetName(uint8_t pca) +{ + if (pca9685.count > 1) + { + pca9685.name[7] = IndexSeparator(); + pca9685.name[8] = '0' + pca; + pca9685.name[9] = 0; + } + else + { + pca9685.name[7] = 0; + } +} + +void PCA9685_Detect(void) +{ + memset(&pca9685, 0x0, sizeof(PCA9685)); + + strcpy_P(pca9685.name, PSTR("PCA9685")); + + for (uint8_t dev = 0; dev < PCA9685_MAX_COUNT; dev++) + { + uint32_t addr = USE_PCA9685_ADDR + dev; + + if (!I2cSetDevice(addr)) + { + continue; + } + + pca9685.freq[dev] = USE_PCA9685_FREQ; + pca9685.intclk[dev] = USE_PCA9685_INT_CLOCK; + + uint8_t buffer; + if (I2cValidRead8(&buffer, addr, PCA9685_REG_MODE1)) + { + I2cWrite8(addr, PCA9685_REG_MODE1, 0x20); + if (I2cValidRead8(&buffer, addr, PCA9685_REG_MODE1)) + { + if (0x20 == buffer) + { + // AddLog(LOG_LEVEL_DEBUG, "PCA9685[%02x] found", addr); + pca9685.count++; + pca9685.detected[dev] = true; + I2cSetActiveFound(addr, PSTR("PCA9685")); + PCA9685_Reset(dev); // Reset the controller + } + } + } + } + + if (pca9685.count > 0) + { + TickerPCA9685.attach_ms(50, PCA9685_RunMotor); + } +} + +void PCA9685_Reset(uint8_t pca) +{ + if (!pca9685.detected[pca]) + { + return; + } + + PCA9685_SetName(pca); + + I2cWrite8(USE_PCA9685_ADDR + pca, PCA9685_REG_MODE1, 0x80); + PCA9685_SetPWMfreq(pca, USE_PCA9685_FREQ); + pca9685.inverted[pca] = false; + for (uint32_t pin = 0; pin < 16; pin++) + { + PCA9685_SetPWM(pca, pin, 0, pca9685.inverted[pca]); + pca9685.motor[pca][pin].pwm = PCA9685_GetPWMvalue(0, pca9685.inverted[pca]); + } + Response_P(PSTR("{\"%s\":"), pca9685.name); + ResponseAppend_P(S_JSON_COMMAND_SVALUE, D_CMND_RESET, PSTR("OK")); + ResponseJsonEnd(); +} + +uint16_t PCA9685_GetPWMvalue(uint16_t pwm, bool inverted) +{ + uint16_t pwm_val = pwm; + if (inverted) + { + pwm_val = 4096 - pwm; + } + return pwm_val; +} + +void PCA9685_SetPWMfreq(uint8_t pca, double freq) +{ + if (freq > 23 && freq < 1527) + { + pca9685.freq[pca] = freq; + } + else + { + pca9685.freq[pca] = 50; + } + uint8_t pre_scale_osc = round((pca9685.intclk[pca] * 100000) / (4096 * pca9685.freq[pca])) - 1; + if (1526 == pca9685.freq[pca]) + pre_scale_osc = 0xFF; // force setting for 24hz because rounding causes 1526 to be 254 + uint8_t current_mode1 = I2cRead8(USE_PCA9685_ADDR + pca, PCA9685_REG_MODE1); // read current value of MODE1 register + uint8_t sleep_mode1 = (current_mode1 & 0x7F) | 0x10; // Determine register value to put PCA to sleep + I2cWrite8(USE_PCA9685_ADDR + pca, PCA9685_REG_MODE1, sleep_mode1); // Let's sleep a little + I2cWrite8(USE_PCA9685_ADDR + pca, PCA9685_REG_PRE_SCALE, pre_scale_osc); // Set the pre-scaler + I2cWrite8(USE_PCA9685_ADDR + pca, PCA9685_REG_MODE1, current_mode1 | 0xA0); // Reset MODE1 register to original state and enable auto increment +} + +void PCA9685_SetPWM_Reg(uint8_t pca, uint8_t pin, uint16_t on, uint16_t off) +{ + uint8_t led_reg = PCA9685_REG_LED0_ON_L + 4 * pin; + uint32_t led_data = 0; + I2cWrite8(USE_PCA9685_ADDR + pca, led_reg, on); + I2cWrite8(USE_PCA9685_ADDR + pca, led_reg + 1, (on >> 8)); + I2cWrite8(USE_PCA9685_ADDR + pca, led_reg + 2, off); + I2cWrite8(USE_PCA9685_ADDR + pca, led_reg + 3, (off >> 8)); +} + +void PCA9685_SetPWM(uint8_t pca, uint8_t pin, uint16_t pwm, bool inverted) +{ + uint16_t pwm_val = PCA9685_GetPWMvalue(pwm, inverted); + if (4096 == pwm_val) + { + PCA9685_SetPWM_Reg(pca, pin, 4096, 0); // Special use additional bit causes channel to turn on completely without PWM + } + else + { + PCA9685_SetPWM_Reg(pca, pin, 0, pwm_val); + } + pca9685.motor[pca][pin].pwm = pwm_val; +} + +void PCA9685_RunMotor() +{ + for (uint8_t dev = 0; dev < PCA9685_MAX_COUNT; dev++) + { + if (!pca9685.detected[dev]) + continue; + + for (uint8_t pin = 0; pin < 15; pin++) + { + tMotor *m = &(pca9685.motor[dev][pin]); + + if (!m->running) + continue; + + if (m->every == -1 || (m->direction > 0 && m->pwm >= m->target) || (m->direction < 0 && m->pwm <= m->target)) + { + m->running = false; + if (m->pwm != m->target) + { + PCA9685_SetPWM(dev, pin, m->target, pca9685.inverted[dev]); + } + continue; + } + + if (m->step == 0 || (m->step % m->every == 0)) + { + // AddLog(LOG_LEVEL_DEBUG, "PCA9685: MOTOR dev=%u pin=%u s=%u e=%u pwm=%lu target=%lu dir=%d", + // dev, + // pin, + // m->step, + // m->every, + // m->pwm, + // m->target, + // m->direction); + + PCA9685_SetPWM(dev, pin, m->pwm + m->direction, pca9685.inverted[dev]); + } + + m->step++; + } + } +} + +void PCA9685_getCmdSuffix(char *command, uint8_t *suffixNumber) +{ + size_t commandLength = strlen(command); + uint8_t result = 0; + *suffixNumber = 0; + + if (isdigit(command[commandLength - 1])) + { + result = command[commandLength - 1] - '0'; + if (result >= 0 && result <= 7) + { + *suffixNumber = result; + command[commandLength - 1] = '\0'; + } + } +} + +bool PCA9685_Command(void) +{ + bool serviced = true; + bool validpin = false; + uint8_t paramcount = 0; + + if (XdrvMailbox.data_len > 0) + { + paramcount = 1; + } + else + { + serviced = false; + return serviced; + } + char argument[XdrvMailbox.data_len]; + for (uint32_t ca = 0; ca < XdrvMailbox.data_len; ca++) + { + if ((' ' == XdrvMailbox.data[ca]) || ('=' == XdrvMailbox.data[ca])) + { + XdrvMailbox.data[ca] = ','; + } + if (',' == XdrvMailbox.data[ca]) + { + paramcount++; + } + } + UpperCase(XdrvMailbox.data, XdrvMailbox.data); + + char command[CMDSZ] = {0}; + char pcaName[10]; + uint8_t dev; + + PCA9685_getCmdSuffix(ArgV(command, 1), &dev); + + if (!strcmp(command, "RESET")) + { + PCA9685_Reset(dev); + return serviced; + } + + if (!strcmp(command, "STATUS")) + { + PCA9685_OutputTelemetry(false); + return serviced; + } + + PCA9685_SetName(dev); + + if (!strcmp(command, "INVERT")) + { + if (paramcount > 1) + { + pca9685.inverted[dev] = (1 == atoi(ArgV(argument, 2))); + Response_P(PSTR("{\"%s\":{\"INVERT\":%i, \"Result\":\"OK\"}}"), pca9685.name, pca9685.inverted[dev] ? 1 : 0); + return serviced; + } + else + { // No parameter was given for invert, so we return current setting + Response_P(PSTR("{\"%s\":{\"INVERT\":%i}}"), pca9685.name, pca9685.inverted[dev] ? 1 : 0); + return serviced; + } + } + + if (!strcmp(command, "INTCLK")) + { + if (paramcount > 1) + { + pca9685.intclk[dev] = atoi(ArgV(argument, 2)); + Response_P(PSTR("{\"%s\":{\"INTCLK\":%lu, \"Result\":\"OK\"}}"), pca9685.name, pca9685.intclk[dev]); + return serviced; + } + else + { + Response_P(PSTR("{\"%s\":{\"INTCLK\":%lu}}"), pca9685.name, pca9685.intclk[dev]); + return serviced; + } + } + + /* + PWMTO timeinsec,pin,target[[,pin,target]...] + */ + if (!strcmp(command, "PWMTO")) + { + uint8_t paramFrom = 1; + while (true) + { + if (paramcount > (2 + paramFrom)) + { + uint16_t tids = atoi(ArgV(argument, 2)); // time in 1/10 of second to complete all the motors move + + uint16_t pin = atoi(ArgV(argument, 2 + paramFrom)); + /* + Sanity check - To be refactored + */ + if (pin > 15) + pin = 15; + if (tids < 2) + tids = 0; // min 2/10 seconds to complete all the moves + if (tids > 600) + tids = 600; // max 60 seconds to complete all the moves + + tMotor *m = &pca9685.motor[dev][pin]; + m->target = atoi(ArgV(argument, 2 + paramFrom + 1)); + if (m->target != m->pwm) + { + m->step = 0; + m->direction = m->target < m->pwm ? -1 : 1; + + if( tids == 0 ) + { + m->every = -1; + m->running = true; + } else { + // AddLog(LOG_LEVEL_DEBUG, "PCA9685: PWMTO dev=%u pin=%u tids=%u e=? pwm=%lu target=%lu dir=%d", + // dev, + // pin, + // tids, + // m->pwm, + // m->target, + // m->direction); + + m->every = 0; + while (m->every < 1) + { + uint16_t stepValue = abs((int16_t)m->pwm - (int16_t)m->target) / abs(m->direction); + if (stepValue < 1) + { + m->direction += m->target < m->pwm ? -1 : 1; + continue; + } + + m->every = round((tids * 200) / stepValue); + if (m->every < 1) + { + m->direction += m->target < m->pwm ? -1 : 1; + continue; + } + } + + m->running = true; + } + } + else + { + m->running = false; + } + + paramFrom += 2; + } + else + { + break; + } + } + + Response_P(PSTR("{\"%s\":{\"PWMTO\":\"OK\"}}"), pca9685.name); + return serviced; + } + + if (!strcmp(command, "PWMSTOP")) + { + if (pca9685.detected[dev]) + { + for (uint8_t pin = 0; pin < 15; pin++) + { + pca9685.motor[dev][pin].running = false; + } + + Response_P(PSTR("{\"%s\":{\"PWMSTOP\":\"OK\"}}"), pca9685.name); + return serviced; + } + } + + if (!strcmp(command, "PWMF")) + { + if (paramcount > 1) + { + uint16_t new_freq = atoi(ArgV(argument, 2)); + if ((new_freq >= 24) && (new_freq <= 1526)) + { + PCA9685_SetPWMfreq(dev, new_freq); + Response_P(PSTR("{\"%s\":{\"PWMF\":%i, \"Result\":\"OK\"}}"), pca9685.name, new_freq); + return serviced; + } + } + else + { // No parameter was given for setfreq, so we return current setting + Response_P(PSTR("{\"%s\":{\"PWMF\":%i}}"), pca9685.name, pca9685.freq[dev]); + return serviced; + } + } + + if (!strcmp(command, "PWM")) + { + if (paramcount > 1) + { + uint8_t pin = atoi(ArgV(argument, 2)); + if (paramcount > 2) + { + // force motor stop + pca9685.motor[dev][pin].running = false; + + if (!strcmp(ArgV(argument, 3), "ON")) + { + PCA9685_SetPWM(dev, pin, 4096, pca9685.inverted[dev]); + Response_P(PSTR("{\"%s\":{\"PIN\":%i,\"PWM\":%i}}"), pca9685.name, pin, 4096); + serviced = true; + return serviced; + } + if (!strcmp(ArgV(argument, 3), "OFF")) + { + PCA9685_SetPWM(dev, pin, 0, pca9685.inverted[dev]); + Response_P(PSTR("{\"%s\":{\"PIN\":%i,\"PWM\":%i}}"), pca9685.name, pin, 0); + serviced = true; + return serviced; + } + uint16_t pwm = atoi(ArgV(argument, 3)); + if ((pin >= 0 && pin <= 15 || pin == 61) && (pwm >= 0 && pwm <= 4096)) + { + PCA9685_SetPWM(dev, pin, pwm, pca9685.inverted[dev]); + Response_P(PSTR("{\"%s\":{\"PIN\":%i,\"PWM\":%i}}"), pca9685.name, pin, pwm); + serviced = true; + return serviced; + } + } + } + } + return serviced; +} + +void PCA9685_OutputTelemetry(bool telemetry) +{ + ResponseTime_P(PSTR("")); + + for (uint8_t dev = 0; dev < PCA9685_MAX_COUNT; dev++) + { + if (!pca9685.detected[dev]) + { + continue; + } + + PCA9685_SetName(dev); + + ResponseAppend_P(PSTR(",\"%s\":{\"PWM_FREQ\":%i"), pca9685.name, pca9685.freq[dev]); + ResponseAppend_P(PSTR(",\"INVERT\":%i"), pca9685.inverted[dev] ? 1 : 0); + ResponseAppend_P(PSTR(",\"INTCLK\":%lu"), pca9685.intclk[dev]); + + for (uint32_t pin = 0; pin < 16; pin++) + { + uint16_t pwm_val = PCA9685_GetPWMvalue(pca9685.motor[dev][pin].pwm, pca9685.inverted[dev]); // return logical (possibly inverted) pwm value + ResponseAppend_P(PSTR(",\"PWM%i\":%i"), pin, pwm_val); + } + + ResponseJsonEnd(); + } + + ResponseJsonEnd(); + + if (telemetry) + { + MqttPublishTeleSensor(); + } +} + +bool Xdrv15(uint32_t function) +{ + if (!I2cEnabled(XI2C_01)) + { + return false; + } + + bool result = false; + + if (FUNC_INIT == function) + { + PCA9685_Detect(); + } + else if (pca9685.count > 0) + { + switch (function) + { + case FUNC_EVERY_SECOND: + if (TasmotaGlobal.tele_period == 0) + { + PCA9685_OutputTelemetry(true); + } + break; + case FUNC_COMMAND_DRIVER: + if (XDRV_15 == XdrvMailbox.index) + { + result = PCA9685_Command(); + } + break; + } + } + return result; +} + +#endif // USE_PCA9685_V2 +#endif // USE_IC2 \ No newline at end of file From 978a21240cb98ee06912c51e9b41d2120ba543c7 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Mon, 24 Jul 2023 15:30:48 +0200 Subject: [PATCH 101/150] Update changelogs --- BUILDS.md | 1 + CHANGELOG.md | 3 ++- I2CDEVICES.md | 1 + RELEASENOTES.md | 1 + tasmota/include/tasmota_configurations.h | 1 + tasmota/include/tasmota_configurations_ESP32.h | 2 ++ tasmota/my_user_config.h | 1 + tasmota/tasmota_support/support_features.ino | 8 ++++---- 8 files changed, 13 insertions(+), 5 deletions(-) diff --git a/BUILDS.md b/BUILDS.md index d84374984..7cfe5a568 100644 --- a/BUILDS.md +++ b/BUILDS.md @@ -128,6 +128,7 @@ Note: `minimal` variant is not listed as it shouldn't be used outside of the [up | USE_MCP23XXX_DRV | - | - / - | - | - | - | - | | USE_PCA9632 | - | - / - | - | - | - | - | | USE_PCA9685 | - | - / - | - | - | - | - | +| USE_PCA9685_V2 | - | - / - | - | - | - | - | | USE_MPR121 | - | - / - | - | - | - | - | | USE_CCS811 | - | - / - | - | x | - | - | | USE_CCS811_V2 | - | - / x | - | - | - | - | diff --git a/CHANGELOG.md b/CHANGELOG.md index 6d9d519ba..8c0cb01ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. ## [13.0.0.3] ### Added - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) +- Support for multiple PCA9685 with extended functionality (#18805) ### Breaking Changed @@ -14,7 +15,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Initial battery level percentage (#19160) -- Berry SK6812_GRBW crash +- Berry SK6812_GRBW crash (#19166) ### Removed diff --git a/I2CDEVICES.md b/I2CDEVICES.md index 040c25469..9bba8962e 100644 --- a/I2CDEVICES.md +++ b/I2CDEVICES.md @@ -9,6 +9,7 @@ The following table lists the supported I2C devices Index | Define | Driver | Device | Address(es) | Description ------|---------------------|----------|----------|-------------|----------------------------------------------- 1 | USE_PCA9685 | xdrv_15 | PCA9685 | 0x40 - 0x47 | 16-channel 12-bit pwm driver + 1 | USE_PCA9685_V2 | xdrv_15 | PCA9685 | 0x40 - 0x47 | 16-channel 12-bit pwm driver 2 | USE_PCF8574 | xdrv_28 | PCF8574 | 0x20 - 0x26 | 8-bit I/O expander (address range overridable) 2 | USE_PCF8574 | xdrv_28 | PCF8574A | 0x39 - 0x3F | 8-bit I/O expander (address range overridable) 3 | USE_DISPLAY_LCD | xdsp_01 | | 0x27, 0x3F | LCD display diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 218c428f5..5081d46fd 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -116,6 +116,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) - Command ``Restart 9`` to save all changes and go into deepsleep waiting for a reset [#19024](https://github.com/arendst/Tasmota/issues/19024) - Support for MAX17043 fuel-gauge systems Lipo batteries [#18788](https://github.com/arendst/Tasmota/issues/18788) +- Support for multiple PCA9685 with extended functionality [#18805](https://github.com/arendst/Tasmota/issues/18805) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Support for DeepSleep battery level percentage [#19134](https://github.com/arendst/Tasmota/issues/19134) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) diff --git a/tasmota/include/tasmota_configurations.h b/tasmota/include/tasmota_configurations.h index d88f8d536..c588f16cf 100644 --- a/tasmota/include/tasmota_configurations.h +++ b/tasmota/include/tasmota_configurations.h @@ -107,6 +107,7 @@ //#define USE_MCP230xx // [I2cDriver22] Enable MCP23008/MCP23017 - Must define I2C Address in #define USE_MCP230xx_ADDR below - range 0x20 - 0x27 (+4k7 code) //#define USE_MCP23XXX_DRV // [I2cDriver77] Enable MCP23xxx support as virtual switch/button/relay (+3k(I2C)/+5k(SPI) code) //#define USE_PCA9685 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+1k4 code) +//#define USE_PCA9685_V2 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+3k4 code) //#define USE_MPR121 // [I2cDriver23] Enable MPR121 controller (I2C addresses 0x5A, 0x5B, 0x5C and 0x5D) in input mode for touch buttons (+1k3 code) #define USE_CCS811 // [I2cDriver24] Enable CCS811 sensor (I2C address 0x5A) (+2k2 code) //#define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 6b2840ae3..9d438475d 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -384,6 +384,7 @@ //#define USE_MCP230xx // [I2cDriver22] Enable MCP23008/MCP23017 - Must define I2C Address in #define USE_MCP230xx_ADDR below - range 0x20 - 0x27 (+4k7 code) #define USE_MCP23XXX_DRV // [I2cDriver77] Enable MCP23xxx support as virtual switch/button/relay (+3k(I2C)/+5k(SPI) code) //#define USE_PCA9685 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+1k4 code) +//#define USE_PCA9685_V2 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+3k4 code) //#define USE_MPR121 // [I2cDriver23] Enable MPR121 controller (I2C addresses 0x5A, 0x5B, 0x5C and 0x5D) in input mode for touch buttons (+1k3 code) //#define USE_CCS811 // [I2cDriver24] Enable CCS811 sensor (I2C address 0x5A) (+2k2 code) //#define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) @@ -618,6 +619,7 @@ //#define USE_MCP230xx // [I2cDriver22] Enable MCP23008/MCP23017 - Must define I2C Address in #define USE_MCP230xx_ADDR below - range 0x20 - 0x27 (+4k7 code) #define USE_MCP23XXX_DRV // [I2cDriver77] Enable MCP23xxx support as virtual switch/button/relay (+3k(I2C)/+5k(SPI) code) //#define USE_PCA9685 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+1k4 code) +//#define USE_PCA9685_V2 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+3k4 code) //#define USE_MPR121 // [I2cDriver23] Enable MPR121 controller (I2C addresses 0x5A, 0x5B, 0x5C and 0x5D) in input mode for touch buttons (+1k3 code) //#define USE_CCS811 // [I2cDriver24] Enable CCS811 sensor (I2C address 0x5A) (+2k2 code) #define USE_CCS811_V2 // [I2cDriver24] Enable CCS811 sensor (I2C addresses 0x5A and 0x5B) (+2k8 code) diff --git a/tasmota/my_user_config.h b/tasmota/my_user_config.h index 625368941..31e3e5935 100644 --- a/tasmota/my_user_config.h +++ b/tasmota/my_user_config.h @@ -616,6 +616,7 @@ // #define USE_MCP230xx_DISPLAYOUTPUT // Enable MCP23008/MCP23017 to display state of OUTPUT pins on Web UI (+0k2 code) // #define USE_MCP23XXX_DRV // [I2cDriver77] Enable MCP23xxx support as virtual switch/button/relay (+3k(I2C)/+5k(SPI) code) // #define USE_PCA9685 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+1k4 code) +// #define USE_PCA9685_V2 // [I2cDriver1] Enable PCA9685 I2C HW PWM Driver - Must define I2C Address in #define USE_PCA9685_ADDR below - range 0x40 - 0x47 (+3k4 code) // #define USE_PCA9685_ADDR 0x40 // Enable PCA9685 I2C Address to use (Must be within range 0x40 through 0x47 - set according to your wired setup) // #define USE_PCA9685_FREQ 50 // Define default PWM frequency in Hz to be used (must be within 24 to 1526) - If other value is used, it will rever to 50Hz // #define USE_PCA9632 // [I2cDriver75] Enable PCA9632 I2C HW PWM Driver (+1k8 code) diff --git a/tasmota/tasmota_support/support_features.ino b/tasmota/tasmota_support/support_features.ino index 3a73c7e61..b942d4942 100644 --- a/tasmota/tasmota_support/support_features.ino +++ b/tasmota/tasmota_support/support_features.ino @@ -167,8 +167,8 @@ void ResponseAppendFeatures(void) #ifdef USE_MP3_PLAYER feature2 |= 0x00002000; // xdrv_14_mp3.ino #endif -#if defined(USE_I2C) && defined(USE_PCA9685) - feature2 |= 0x00004000; // xdrv_15_pca9685.ino +#if defined(USE_I2C) && (defined(USE_PCA9685) || defined(USE_PCA9685_V2)) + feature2 |= 0x00004000; // xdrv_15_pca9685.ino or xdrv_15_pca9685_v2.ino #endif #if defined(USE_LIGHT) && defined(USE_TUYA_MCU) feature2 |= 0x00008000; // xdrv_16_tuyadimmer.ino @@ -331,8 +331,8 @@ void ResponseAppendFeatures(void) #if defined(USE_I2C) && defined(USE_MPR121) feature4 |= 0x00000002; // xsns_30_mpr121.ino #endif -#if defined(USE_I2C) && defined(USE_CCS811) - feature4 |= 0x00000004; // xsns_31_ccs811.ino +#if defined(USE_I2C) && (defined(USE_CCS811) || defined(USE_CCS811_V2)) + feature4 |= 0x00000004; // xsns_31_ccs811.ino or xsns_31_ccs811_v2.ino #endif #if defined(USE_I2C) && defined(USE_MPU6050) feature4 |= 0x00000008; // xsns_32_mpu6050.ino From 3b9ae4c553f613b7de14423f201a07d28ae1a983 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 24 Jul 2023 18:06:16 +0200 Subject: [PATCH 102/150] Core 2.0.11 (#19181) --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- platformio_tasmota32.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 215b7dd29..c144c06ec 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -7,7 +7,7 @@ - [ ] Only relevant files were touched - [ ] Only one feature/fix was added per PR and the code change compiles without warnings - [ ] The code change is tested and works with Tasmota core ESP8266 V.2.7.4.9 - - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.10 + - [ ] The code change is tested and works with Tasmota core ESP32 V.2.0.11 - [ ] I accept the [CLA](https://github.com/arendst/Tasmota/blob/development/CONTRIBUTING.md#contributor-license-agreement-cla). _NOTE: The code change must pass CI tests. **Your PR cannot be merged unless tests pass**_ diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index f6a4ec000..814af20a0 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -42,7 +42,7 @@ extra_scripts = pre:pio-tools/add_c_flags.py ${esp_defaults.extra_scripts} [core32] -platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.06.04/platform-espressif32.zip +platform = https://github.com/tasmota/platform-espressif32/releases/download/2023.07.00/platform-espressif32.zip platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} From 0a664b36133e8cd163a568e4ff7473dffd6495bd Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Tue, 25 Jul 2023 11:50:46 +0200 Subject: [PATCH 103/150] Update changelogs --- CHANGELOG.md | 1 + RELEASENOTES.md | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c0cb01ae..e6f8a03b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ All notable changes to this project will be documented in this file. ### Changed - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) +- ESP32 Framework (Core) from v2.0.10 to v2.0.11 ### Fixed - Initial battery level percentage (#19160) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 5081d46fd..8c1519789 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -36,9 +36,9 @@ While fallback or downgrading is common practice it was never supported due to S This release will be supported from ESP8266/Arduino library Core version **2.7.4.9** due to reported security and stability issues on previous Core version. This will also support gzipped binaries. -This release will be supported from ESP32/Arduino library Core version **2.0.10**. +This release will be supported from ESP32/Arduino library Core version **2.0.11**. -Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.10 have been removed. +Support of ESP8266 Core versions before 2.7.4.9 and ESP32 Core versions before 2.0.11 have been removed. ## Support of TLS @@ -80,7 +80,7 @@ Historical binaries can be downloaded from The latter links can be used for OTA upgrades too like ``OtaUrl http://ota.tasmota.com/tasmota/release/tasmota.bin.gz`` ### ESP32, ESP32-C3, ESP32-S2 and ESP32-S3 based -The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.10**. +The following binary downloads have been compiled with ESP32/Arduino library core version **2.0.11**. - **tasmota32.bin** = The Tasmota version with most drivers including additional sensors and KNX for 4M+ flash. **RECOMMENDED RELEASE BINARY** - **tasmota32xy.bin** = The Tasmota version with most drivers including additional sensors and KNX for ESP32-C3/S2/S3 and 4M+ flash. @@ -134,6 +134,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Berry `import strict` now detects useless expression without side effects [#18997](https://github.com/arendst/Tasmota/issues/18997) ### Changed +- ESP32 Framework (Core) from v2.0.10 to v2.0.11 - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) From 9f16f09f29548c9e86a23906c4a31fea14b2cf67 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 26 Jul 2023 19:54:14 +0200 Subject: [PATCH 104/150] Berry `mqtt.publish` now distinguishes between `string` and `bytes` (#19196) --- CHANGELOG.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_mqtt.ino | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6f8a03b2..1b2050d40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ All notable changes to this project will be documented in this file. ### Changed - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) - ESP32 Framework (Core) from v2.0.10 to v2.0.11 +- Berry `mqtt.publish` now distinguishes between `string` and `bytes` ### Fixed - Initial battery level percentage (#19160) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_mqtt.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_mqtt.ino index 16139a295..6cb6c4e2e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_mqtt.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_mqtt.ino @@ -33,8 +33,10 @@ extern "C" { bool retain = false; int32_t payload_start = 0; int32_t len = -1; // send all of it + bool is_binary = be_isbytes(vm, 3); // is this a binary payload (or false = string) if (top >= 4) { retain = be_tobool(vm, 4); } if (top >= 5) { + if (!is_binary) { be_raise(vm, "argument_error", "start and len are not allowed with string payloads"); } payload_start = be_toint(vm, 5); if (payload_start < 0) payload_start = 0; } @@ -60,7 +62,7 @@ extern "C" { be_pop(vm, be_top(vm)); // clear stack to avoid any indirect warning message in subsequent calls to Berry - MqttPublishPayload(topic, payload, len, retain); + MqttPublishPayload(topic, payload, is_binary ? len : 0 /*if string don't send length*/, retain); be_return_nil(vm); // Return } From 1a91dc441b8a322d7d3d106bf1ad9a590d5117fb Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:31:22 +0200 Subject: [PATCH 105/150] Berry improve tasmota.scale_uint() (#19197) --- lib/libesp32/berry_tasmota/src/be_tasmota_lib.c | 2 +- .../tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c index edfd1cd6e..e0fd4cdf8 100644 --- a/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c +++ b/lib/libesp32/berry_tasmota/src/be_tasmota_lib.c @@ -112,7 +112,7 @@ class be_class_tasmota (scope: global, name: Tasmota) { yield, func(l_yield) delay, func(l_delay) delay_microseconds, func(l_delay_microseconds) - scale_uint, func(l_scaleuint) + scale_uint, static_func(l_scaleuint) log, func(l_logInfo) loglevel, func(l_loglevel) save, func(l_save) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino index 3b7b8110b..dd08a9121 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tasmota.ino @@ -395,7 +395,18 @@ extern "C" { // int32_t l_scaleuint(struct bvm *vm); int32_t l_scaleuint(struct bvm *vm) { - return be_call_c_func(vm, (void*) &changeUIntScale, "i", "-iiiii"); + int32_t top = be_top(vm); // Get the number of arguments + if (top == 5 && be_isint(vm, 1) && be_isint(vm, 2) && be_isint(vm, 3) && be_isint(vm, 4) && be_isint(vm, 5)) { + int32_t val = be_toint(vm, 1); + int32_t from_min = be_toint(vm, 2); + int32_t from_max = be_toint(vm, 3); + int32_t to_min = be_toint(vm, 4); + int32_t to_max = be_toint(vm, 5); + int32_t scaled = changeUIntScale(val, from_min, from_max, to_min, to_max); + be_pushint(vm, scaled); + be_return(vm); + } + be_raise(vm, kTypeError, nullptr); } int32_t l_respCmnd(bvm *vm); From 11f056040ed72bc41464aa9e549b02a92749d29f Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 26 Jul 2023 22:52:48 +0200 Subject: [PATCH 106/150] Make TCPStart ip filter more IPv6 friendly (#19199) --- tasmota/tasmota_xdrv_driver/xdrv_41_tcp_bridge.ino | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_41_tcp_bridge.ino b/tasmota/tasmota_xdrv_driver/xdrv_41_tcp_bridge.ino index b5c4a0789..1ac33358b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_41_tcp_bridge.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_41_tcp_bridge.ino @@ -35,6 +35,7 @@ WiFiServer *server_tcp = nullptr; WiFiClient client_tcp[TCP_BRIDGE_CONNECTIONS]; uint8_t client_next = 0; uint8_t *tcp_buf = nullptr; // data transfer buffer +bool ip_filter_enabled = false; IPAddress ip_filter; #include @@ -65,7 +66,7 @@ void TCPLoop(void) AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Got connection from %s"), new_client.remoteIP().toString().c_str()); // Check for IP filtering if it's enabled. - if (ip_filter) { + if (ip_filter_enabled) { if (ip_filter != new_client.remoteIP()) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Rejected due to filtering")); new_client.stop(); @@ -173,9 +174,10 @@ void CmndTCPStart(void) { if (ArgC() == 2) { char sub_string[XdrvMailbox.data_len]; ip_filter.fromString(ArgV(sub_string, 2)); + ip_filter_enabled = true; } else { // Disable whitelist if previously set - ip_filter = (uint32_t)0; + ip_filter_enabled = false; } if (server_tcp) { @@ -191,7 +193,7 @@ void CmndTCPStart(void) { } if (tcp_port > 0) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Starting TCP server on port %d"), tcp_port); - if (ip_filter) { + if (ip_filter_enabled) { AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_TCP "Filtering %s"), ip_filter.toString().c_str()); } server_tcp = new WiFiServer(tcp_port); From c73fd88d1c80dab8098e3731a5094cb11962a65a Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 29 Jul 2023 14:13:58 +0200 Subject: [PATCH 107/150] IRremoteESP8266 library from v2.8.5 to v2.8.6 (#19212) --- CHANGELOG.md | 1 + .../IRremoteESP8266/IRremoteESP8266/README.md | 4 +-- .../IRremoteESP8266/README_de.md | 4 +-- .../IRremoteESP8266/README_fr.md | 4 +-- .../IRremoteESP8266/README_nl.md | 4 +-- .../IRremoteESP8266/ReleaseNotes.md | 18 ++++++++++ .../IRremoteESP8266/SupportedProtocols.md | 5 ++- .../examples/BlynkIrRemote/BlynkIrRemote.ino | 2 ++ .../examples/IRrecvDumpV2/platformio.ini | 7 +++- .../examples/SmartIRRepeater/platformio.ini | 1 + .../IRremoteESP8266/library.json | 2 +- .../IRremoteESP8266/library.properties | 2 +- .../IRremoteESP8266/src/IRac.cpp | 28 +++++++++------ .../IRremoteESP8266/src/IRrecv.cpp | 8 ----- .../IRremoteESP8266/src/IRremoteESP8266.h | 2 +- .../IRremoteESP8266/src/IRsend.h | 5 +-- .../IRremoteESP8266/src/IRutils.cpp | 14 +++----- .../IRremoteESP8266/src/ir_Coolix.cpp | 3 ++ .../IRremoteESP8266/src/ir_Kelvinator.h | 2 +- .../IRremoteESP8266/src/ir_Samsung.cpp | 5 +-- .../IRremoteESP8266/test/IRac_test.cpp | 11 +++--- .../IRremoteESP8266/test/ir_Coolix_test.cpp | 36 +++++++++++++++++++ lib/lib_basic/IRremoteESP8266/library.json | 2 +- 23 files changed, 118 insertions(+), 52 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b2050d40..bb3a66d80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) - ESP32 Framework (Core) from v2.0.10 to v2.0.11 - Berry `mqtt.publish` now distinguishes between `string` and `bytes` +- IRremoteESP8266 library from v2.8.5 to v2.8.6 ### Fixed - Initial battery level percentage (#19160) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md index 47178861a..5eac39e4b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README.md @@ -10,8 +10,8 @@ This library enables you to **send _and_ receive** infra-red signals on an [ESP8266](https://github.com/esp8266/Arduino) or an [ESP32](https://github.com/espressif/arduino-esp32) using the [Arduino framework](https://www.arduino.cc/) using common 940nm IR LEDs and common IR receiver modules. e.g. TSOP{17,22,24,36,38,44,48}* demodulators etc. -## v2.8.5 Now Available -Version 2.8.5 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes. +## v2.8.6 Now Available +Version 2.8.6 of the library is now [available](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). You can view the [Release Notes](ReleaseNotes.md) for all the significant changes. #### Upgrading from pre-v2.0 Usage of the library has been slightly changed in v2.0. You will need to change your usage to work with v2.0 and beyond. You can read more about the changes required on our [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md index f55860528..9e584bb84 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_de.md @@ -11,8 +11,8 @@ Diese Programmbibliothek ermöglicht das **Senden _und_ Empfangen** von Infrarotsignalen mit [ESP8266](https://github.com/esp8266/Arduino)- und [ESP32](https://github.com/espressif/arduino-esp32)-Mikrocontrollern mithilfe des [Arduino-Frameworks](https://www.arduino.cc/) und handelsüblichen 940nm Infrarot-LEDs undIR-Empfängermodulen, wie zum Beispiel TSOP{17,22,24,36,38,44,48}*-Demodulatoren. -## v2.8.5 jetzt verfügbar -Version 2.8.5 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. +## v2.8.6 jetzt verfügbar +Version 2.8.6 der Bibliothek ist nun [verfügbar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Die [Versionshinweise](ReleaseNotes.md) enthalten alle wichtigen Neuerungen. #### Hinweis für Nutzer von Versionen vor v2.0 Die Benutzung der Bibliothek hat sich mit Version 2.0 leicht geändert. Einige Anpassungen im aufrufenden Code werden nötig sein, um mit Version ab 2.0 korrekt zu funktionieren. Mehr zu den Anpassungen finden sich auf unserer [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0)-Seite. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md index 430d32de3..f7bd69eaf 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_fr.md @@ -10,8 +10,8 @@ Cette librairie vous permetra de **recevoir et d'envoyer des signaux** infrarouge sur le protocole [ESP8266](https://github.com/esp8266/Arduino) ou sur le protocole [ESP32](https://github.com/espressif/arduino-esp32) en utilisant le [Arduino framework](https://www.arduino.cc/) qui utilise la norme 940nm IR LEDs et le module basique de reception d'onde IR. Exemple : TSOP{17,22,24,36,38,44,48}* modules etc. -## v2.8.5 disponible -Version 2.8.5 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants. +## v2.8.6 disponible +Version 2.8.6 de la libraire est maintenant [disponible](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Vous pouvez voir le [Release Notes](ReleaseNotes.md) pour tous les changements importants. #### mise à jour depuis pre-v2.0 L'utilisation de la librairie à un peu changer depuis la version in v2.0. Si vous voulez l'utiliser vous devrez changer votre utilisation aussi. Vous pouvez vous renseigner sur les précondition d'utilisation ici : [Upgrade to v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) page. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md index fdea85cae..8c4cb8e08 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/README_nl.md @@ -10,8 +10,8 @@ Deze library maakt het mogelijk om Infraroodsignalen **te versturen en ontvangen** via het [Arduino framework](https://www.arduino.cc/) met veelgebruikte 940nm IR LEDs en IR ontvang modules. b.v. TSOP{17,22,24,36,38,44,48}* demodulatoren enz. -## v2.8.5 nu beschikbaar -Versie 2.8.5 van de bibliotheek is nu [beschikbaar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Bekijk de [Release Notes](ReleaseNotes.md) voor alle belangrijke veranderingen. +## v2.8.6 nu beschikbaar +Versie 2.8.6 van de bibliotheek is nu [beschikbaar](https://github.com/crankyoldgit/IRremoteESP8266/releases/latest). Bekijk de [Release Notes](ReleaseNotes.md) voor alle belangrijke veranderingen. #### Upgraden vanaf pre-v2.0 Het gebruik van de bibliotheek is enigszins gewijzigd in v2.0. Je zult het gebruik moeten aanpassen om te kunnen werken met v2.0 en hoger. Je kunt meer lezen over de vereiste aanpassingen op onze [Upgraden naar v2.0](https://github.com/crankyoldgit/IRremoteESP8266/wiki/Upgrading-to-v2.0) pagina. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md index d9e86c7e3..27b5b3fac 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/ReleaseNotes.md @@ -1,5 +1,23 @@ # Release Notes +## _v2.8.6 (20230727)_ + +**[Bug Fixes]** +- Ensure `IRCoolixAC::toCommon()` returns `kNoTempValue` when no sensor temp is detected. (#2015 #2012) +- Fix compilation dependency of LG on Samsung send protocol (#2011 #2010) +- Fix missing parameter in call to `IRac::gree()` (#2008 #2007) + +**[Features]** +- IRac: Ensure the `sleep` parameter is used for the `FUJITSU_AC` protocol. (#1992 #1991) + +**[Misc]** +- Allow the BlynkIRRemote.ino code to compile again. (#2016) +- do not list WHIRLPOOL_AC unconditionally as supported protocol (#2003) +- IRUtils:typeToString() — simplify (#2002) +- Fix brand Green -> Gree (#1994) +- Fix undefined `std::round` compilation error (#1989) + + ## _v2.8.5 (20230508)_ **[Bug Fixes]** diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md index 46b65ca5e..3c6d38a03 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/SupportedProtocols.md @@ -1,6 +1,6 @@ + Last generated: Thu 27 Jul 2023 05:37:11 +0000 ---> # IR Protocols supported by this library | Protocol | Brand | Model | A/C Model | Detailed A/C Support | @@ -65,8 +65,7 @@ | [JVC](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_JVC.cpp) | **JVC** | PTU94023B remote | | - | | [Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.cpp) | **[Hisense](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.h)** | AST-09UW4RVETG00A A/C (KELON168) | | Yes | | [Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.cpp) | **[Kelon](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelon.h)** | AST-09UW4RVETG00A A/C (KELON168)
    DG11R2-01 remote (KELON168)
    ON/OFF 9000-12000 (KELON) | | Yes | -| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAP0F8 remote | | Yes | -| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Green](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAPOF3 remote | | Yes | +| [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Gree](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | YAP0F8 remote
    YAPOF3 remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | KSV26CRC A/C
    KSV26HRC A/C
    KSV35CRC A/C
    KSV35HRC A/C
    KSV53HRC A/C
    KSV62HRC A/C
    KSV70CRC A/C
    KSV70HRC A/C
    KSV80HRC A/C
    YALIF Remote | | Yes | | [Kelvinator](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.cpp) | **[Sharp](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_Kelvinator.h)** | A5VEY A/C
    YB1FA remote | | Yes | | [LG](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.cpp) | **[General Electric](https://github.com/crankyoldgit/IRremoteESP8266/blob/master/src/ir_LG.h)** | 6711AR2853M Remote (LG - GE6711AR2853M)
    AG1BH09AW101 A/C (LG - GE6711AR2853M) | | Yes | diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/BlynkIrRemote/BlynkIrRemote.ino b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/BlynkIrRemote/BlynkIrRemote.ino index 6e659bd64..1948f3c4c 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/BlynkIrRemote/BlynkIrRemote.ino +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/BlynkIrRemote/BlynkIrRemote.ino @@ -104,6 +104,8 @@ /* Comment this out to disable prints and save space */ #define BLYNK_PRINT Serial +#define BLYNK_TEMPLATE_ID "TMPL••••••••" // Made up values. Please Change. +#define BLYNK_TEMPLATE_NAME "My First Device" // Please Change. #if defined(ESP8266) #include diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRrecvDumpV2/platformio.ini b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRrecvDumpV2/platformio.ini index b56304f66..eca7c917e 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRrecvDumpV2/platformio.ini +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/IRrecvDumpV2/platformio.ini @@ -64,4 +64,9 @@ build_flags = -D_IR_LOCALE_=zh-CN ; Chinese (Simplified) ; Build the library with all protocols disabled to flush out #if/#ifdef issues & ; any compiler warnings, by turning them into errors. [env:shakedown_no_protocols] -build_flags = -D_IR_ENABLE_DEFAULT_=false -Werror -Wno-error=switch +build_flags = + ${env.build_flags} + -Werror + -Wno-error=switch + -Wno-error=switch-unreachable + -D_IR_ENABLE_DEFAULT_=false diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/SmartIRRepeater/platformio.ini b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/SmartIRRepeater/platformio.ini index 0db3d6dc8..88a7e8a17 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/SmartIRRepeater/platformio.ini +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/examples/SmartIRRepeater/platformio.ini @@ -34,4 +34,5 @@ build_flags = ${env.build_flags} -Werror -Wno-error=switch + -Wno-error=switch-unreachable -D_IR_ENABLE_DEFAULT_=false diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json index 302372566..60c481152 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.json @@ -1,6 +1,6 @@ { "name": "IRremoteESP8266", - "version": "2.8.5", + "version": "2.8.6", "keywords": "infrared, ir, remote, esp8266, esp32", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "repository": diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties index 769cbc1fa..faed00b75 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/library.properties @@ -1,5 +1,5 @@ name=IRremoteESP8266 -version=2.8.5 +version=2.8.6 author=David Conran, Sebastien Warin, Mark Szabo, Ken Shirriff maintainer=David Conran, Mark Szabo, Sebastien Warin, Roi Dayan, Massimiliano Pinto, Christian Nilsson sentence=Send and receive infrared signals with multiple protocols (ESP8266/ESP32) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp index 8826bc1ae..67c218c1e 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRac.cpp @@ -13,6 +13,11 @@ #include #endif #include +#if __cplusplus >= 201103L && defined(_GLIBCXX_USE_C99_MATH_TR1) + using std::roundf; +#else + using ::roundf; +#endif #include "IRsend.h" #include "IRremoteESP8266.h" #include "IRtext.h" @@ -366,7 +371,9 @@ bool IRac::isProtocolSupported(const decode_type_t protocol) { #if SEND_YORK case decode_type_t::YORK: #endif +#if SEND_WHIRLPOOL_AC case decode_type_t::WHIRLPOOL_AC: +#endif return true; default: return false; @@ -489,9 +496,9 @@ void IRac::argo(IRArgoAC *ac, ac->begin(); ac->setPower(on); ac->setMode(ac->convertMode(mode)); - ac->setTemp(static_cast(std::round(degrees))); + ac->setTemp(static_cast(roundf(degrees))); if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } ac->setiFeel(iFeel); ac->setFan(ac->convertFan(fan)); @@ -537,7 +544,7 @@ void IRac::argoWrem3_ACCommand(IRArgoAC_WREM3 *ac, const bool on, ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } ac->setiFeel(iFeel); ac->setFan(ac->convertFan(fan)); @@ -563,7 +570,7 @@ void IRac::argoWrem3_ACCommand(IRArgoAC_WREM3 *ac, const bool on, void IRac::argoWrem3_iFeelReport(IRArgoAC_WREM3 *ac, const float sensorTemp) { ac->begin(); ac->setMessageType(argoIrMessageType_t::IFEEL_TEMP_REPORT); - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); ac->send(); } @@ -738,7 +745,7 @@ void IRac::coolix(IRCoolixAC *ac, // No Econo setting available. // No Quiet setting available. if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } else { ac->clearSensorTemp(); } @@ -1128,7 +1135,7 @@ void IRac::ecoclim(IREcoclimAc *ac, ac->setTemp(degrees); ac->setFan(ac->convertFan(fan)); if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } else { ac->setSensorTemp(degrees); //< Set to the desired temp // until we can disable. @@ -1174,7 +1181,7 @@ void IRac::electra(IRElectraAc *ac, ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } ac->setFan(ac->convertFan(fan)); ac->setSwingV(swingv != stdAc::swingv_t::kOff); @@ -2288,7 +2295,7 @@ void IRac::sanyo(IRSanyoAc *ac, ac->setMode(ac->convertMode(mode)); ac->setTemp(degrees); if (sensorTemp != kNoTempValue) { - ac->setSensorTemp(static_cast(std::round(sensorTemp))); + ac->setSensorTemp(static_cast(roundf(sensorTemp))); } else { ac->setSensorTemp(degrees); // Set the sensor temp to the desired // (normal) temp. @@ -3229,7 +3236,7 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { fujitsu(&ac, (fujitsu_ac_remote_model_t)send.model, send.power, send.mode, send.celsius, send.degrees, send.fanspeed, send.swingv, send.swingh, send.quiet, - send.turbo, send.econo, send.filter, send.clean); + send.turbo, send.econo, send.filter, send.clean, send.sleep); break; } #endif // SEND_FUJITSU_AC @@ -3249,7 +3256,8 @@ bool IRac::sendAc(const stdAc::state_t desired, const stdAc::state_t *prev) { _modulation); gree(&ac, (gree_ac_remote_model_t)send.model, send.power, send.mode, send.celsius, send.degrees, send.fanspeed, send.swingv, send.swingh, - send.turbo, send.econo, send.light, send.clean, send.sleep); + send.iFeel, send.turbo, send.econo, send.light, send.clean, + send.sleep); break; } #endif // SEND_GREE diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp index ecb8a382b..173526104 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRrecv.cpp @@ -412,10 +412,6 @@ void IRrecv::pause(void) { params.rcvstate = kStopState; params.rawlen = 0; params.overflow = false; -#if defined(ESP8266) - os_timer_disarm(&timer); - detachInterrupt(params.recvpin); -#endif #if defined(ESP32) gpio_intr_disable((gpio_num_t)params.recvpin); #endif // ESP32 @@ -429,10 +425,6 @@ void IRrecv::resume(void) { params.rcvstate = kIdleState; params.rawlen = 0; params.overflow = false; -#if defined(ESP8266) - os_timer_setfn(&timer, reinterpret_cast(read_timeout),NULL); - attachInterrupt(params.recvpin, gpio_intr, CHANGE); -#endif #if defined(ESP32) timerAlarmDisable(timer); gpio_intr_enable((gpio_num_t)params.recvpin); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h index 133d507b8..949de1ecf 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRremoteESP8266.h @@ -58,7 +58,7 @@ // Minor version number (x.X.x) #define _IRREMOTEESP8266_VERSION_MINOR 8 // Patch version number (x.x.X) -#define _IRREMOTEESP8266_VERSION_PATCH 5 +#define _IRREMOTEESP8266_VERSION_PATCH 6 // Macro to convert version info into an integer #define _IRREMOTEESP8266_VERSION_VAL(major, minor, patch) \ (((major) << 16) | ((minor) << 8) | (patch)) diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h index f8a447197..38491372a 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRsend.h @@ -310,11 +310,12 @@ class IRsend { void sendSherwood(uint64_t data, uint16_t nbits = kSherwoodBits, uint16_t repeat = kSherwoodMinRepeat); #endif -#if SEND_SAMSUNG + // `sendSAMSUNG()` is required by `sendLG()` +#if (SEND_SAMSUNG || SEND_LG) void sendSAMSUNG(const uint64_t data, const uint16_t nbits = kSamsungBits, const uint16_t repeat = kNoRepeat); uint32_t encodeSAMSUNG(const uint8_t customer, const uint8_t command); -#endif +#endif // (SEND_SAMSUNG || SEND_LG) #if SEND_SAMSUNG36 void sendSamsung36(const uint64_t data, const uint16_t nbits = kSamsung36Bits, const uint16_t repeat = kNoRepeat); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp index 4c713c87b..e9af0b28f 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/IRutils.cpp @@ -145,16 +145,12 @@ String typeToString(const decode_type_t protocol, const bool isRepeat) { result = kUnknownStr; } else { auto *ptr = reinterpret_cast(kAllProtocolNamesStr); - if (protocol > kLastDecodeType || protocol == decode_type_t::UNKNOWN) { - result = kUnknownStr; - } else { - for (uint16_t i = 0; i <= protocol && STRLEN(ptr); i++) { - if (i == protocol) { - result = FPSTR(ptr); - break; - } - ptr += STRLEN(ptr) + 1; + for (uint16_t i = 0; i <= protocol && STRLEN(ptr); i++) { + if (i == protocol) { + result = FPSTR(ptr); + break; } + ptr += STRLEN(ptr) + 1; } } if (isRepeat) { diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp index 3fb4e8d0a..6769ebb79 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Coolix.cpp @@ -549,6 +549,9 @@ stdAc::state_t IRCoolixAC::toCommon(const stdAc::state_t *prev) const { result.mode = toCommonMode(getMode()); result.degrees = getTemp(); result.sensorTemperature = getSensorTemp(); + if (result.sensorTemperature == kCoolixSensorTempIgnoreCode) { + result.sensorTemperature = kNoTempValue; + } result.iFeel = getZoneFollow(); result.fanspeed = toCommonFanSpeed(getFan()); return result; diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Kelvinator.h b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Kelvinator.h index 32cb3e1fa..342c60592 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Kelvinator.h +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Kelvinator.h @@ -13,7 +13,7 @@ // Brand: Kelvinator, Model: KSV70CRC A/C // Brand: Kelvinator, Model: KSV70HRC A/C // Brand: Kelvinator, Model: KSV80HRC A/C -// Brand: Green, Model: YAPOF3 remote +// Brand: Gree, Model: YAPOF3 remote // Brand: Gree, Model: YAP0F8 remote // Brand: Sharp, Model: YB1FA remote // Brand: Sharp, Model: A5VEY A/C diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Samsung.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Samsung.cpp index b3fe2a860..958f2665b 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Samsung.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/src/ir_Samsung.cpp @@ -82,7 +82,8 @@ using irutils::addTempToString; using irutils::addToggleToString; using irutils::minsToString; -#if SEND_SAMSUNG +// This sending protocol is used by some other protocols. e.g. LG. +#if (SEND_SAMSUNG || SEND_LG) /// Send a 32-bit Samsung formatted message. /// Status: STABLE / Should be working. /// @param[in] data The message to be sent. @@ -112,7 +113,7 @@ uint32_t IRsend::encodeSAMSUNG(const uint8_t customer, const uint8_t command) { return ((revcommand ^ 0xFF) | (revcommand << 8) | (revcustomer << 16) | (revcustomer << 24)); } -#endif +#endif // (SEND_SAMSUNG || SEND_LG) #if DECODE_SAMSUNG /// Decode the supplied Samsung 32-bit message. diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp index 32a745a31..8d6274c65 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/IRac_test.cpp @@ -669,7 +669,8 @@ TEST(TestIRac, Fujitsu) { false, // Turbo (Powerful) false, // Econo true, // Filter - true); // Clean + true, // Clean + -1); // Sleep ASSERT_EQ(ardb1_expected, ac.toString()); ac._irsend.makeDecodeResult(); EXPECT_TRUE(capture.decode(&ac._irsend.capture)); @@ -719,7 +720,8 @@ TEST(TestIRac, Fujitsu) { false, // Turbo (Powerful) false, // Econo true, // Filter - true); // Clean + true, // Clean + -1); // Sleep ASSERT_EQ(arry4_expected, ac.toString()); ac._irsend.makeDecodeResult(); EXPECT_TRUE(capture.decode(&ac._irsend.capture)); @@ -742,8 +744,9 @@ TEST(TestIRac, Fujitsu) { false, // Quiet false, // Turbo (Powerful) false, // Econo - false, // Filter - false); // Clean + false, // Filter + false, // Clean + -1); // Sleep ASSERT_EQ(arrew4e_expected, ac.toString()); ac._irsend.makeDecodeResult(); EXPECT_TRUE(capture.decode(&ac._irsend.capture)); diff --git a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Coolix_test.cpp b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Coolix_test.cpp index ba3610bc7..101fab654 100644 --- a/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Coolix_test.cpp +++ b/lib/lib_basic/IRremoteESP8266/IRremoteESP8266/test/ir_Coolix_test.cpp @@ -492,6 +492,9 @@ TEST(TestCoolixACClass, SetGetClearSensorTempAndZoneFollow) { EXPECT_EQ( "Power: On, Mode: 3 (Heat), Fan: 6 (Zone Follow), Temp: 24C, " "Zone Follow: On, Sensor Temp: 19C", ac.toString()); + // For #Issue2012 + EXPECT_EQ(19, ac.getSensorTemp()); + EXPECT_EQ(19, ac.toCommon().sensorTemperature); } TEST(TestCoolixACClass, SpecialModesAndReset) { @@ -1068,3 +1071,36 @@ TEST(TestDecodeCoolix48, SyntheticSelfDecode) { "m552s5244", irsend.outputStr()); } + +// Test for issue https://github.com/crankyoldgit/IRremoteESP8266/issues/2012#issuecomment-1650098971 +TEST(TestCoolixACClass, Issue2012) { + IRrecv irrecv(kGpioUnused); + IRCoolixAC ac(kGpioUnused); + + ac.stateReset(); + ac.setRaw(0xB21FD8); + EXPECT_EQ( + "Power: On, Mode: 2 (Auto), Fan: 0 (Auto0), Temp: 26C, " + "Zone Follow: Off, Sensor Temp: Off", + ac.toString()); + EXPECT_EQ(kNoTempValue, ac.toCommon().sensorTemperature); + + ac.setRaw(0xB21F98); + EXPECT_EQ( + "Power: On, Mode: 2 (Auto), Fan: 0 (Auto0), Temp: 27C, " + "Zone Follow: Off, Sensor Temp: Off", + ac.toString()); + EXPECT_EQ(kNoTempValue, ac.toCommon().sensorTemperature); + + ac.setRaw(0xB21F88); + EXPECT_EQ( + "Power: On, Mode: 2 (Auto), Fan: 0 (Auto0), Temp: 28C, " + "Zone Follow: Off, Sensor Temp: Off", + ac.toString()); + EXPECT_EQ(kNoTempValue, ac.toCommon().sensorTemperature); + ac.setRaw(0xB27BE0); + EXPECT_EQ( + "Power: Off", + ac.toString()); + EXPECT_EQ(kNoTempValue, ac.toCommon().sensorTemperature); +} diff --git a/lib/lib_basic/IRremoteESP8266/library.json b/lib/lib_basic/IRremoteESP8266/library.json index 476000469..87c32e687 100644 --- a/lib/lib_basic/IRremoteESP8266/library.json +++ b/lib/lib_basic/IRremoteESP8266/library.json @@ -1,6 +1,6 @@ { "name": "IRremoteESP8266", - "version": "2.8.5", + "version": "2.8.6", "keywords": "infrared, ir, remote, esp8266, esp32", "description": "Send and receive infrared signals with multiple protocols (ESP8266/ESP32)", "repository": From de3b0a4b0043b9342a23e72c308d9d5aa9a1971a Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sat, 29 Jul 2023 14:15:00 +0200 Subject: [PATCH 108/150] ensure minimum interrupt time (#19211) prevent interrupts <30 micro seconds because sometimes see crashes on esp8266. esp32 stop of interrupt >30microseconds and < 105microseconds --- .../tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index f0199b783..3ab5ef1b6 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -139,21 +139,21 @@ void IRAM_ATTR ACDimmerTimer_intr() { for (uint8_t i = 0 ; i < MAX_PWMS; i++ ) { if (Pin(GPIO_PWM1, i) == -1) continue; - if (time_since_zc + TRIGGER_PERIOD >= ac_zero_cross_dimmer.enable_time_us[i]){ + if (time_since_zc + TRIGGER_PERIOD + 30 >= ac_zero_cross_dimmer.enable_time_us[i]){ // Very close to the fire event. Loop the last µseconds to wait. #ifdef ESP8266 - // on ESP8266 we can change dynamically the trigger interval - ac_zero_cross_dimmer.actual_tigger_Period = tmin(ac_zero_cross_dimmer.actual_tigger_Period,tmax(5,ac_zero_cross_dimmer.enable_time_us[i] - time_since_zc)); + // on ESP8266 we can change dynamically the trigger interval. + ac_zero_cross_dimmer.actual_tigger_Period = tmin(ac_zero_cross_dimmer.actual_tigger_Period*2,ac_zero_cross_dimmer.enable_time_us[i] - time_since_zc); #endif #ifdef ESP32 while (time_since_zc < ac_zero_cross_dimmer.enable_time_us[i]) { time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; } #endif - if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i] && !ac_zero_cross_dimmer.triggered[i] ) { + if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]-5 && !ac_zero_cross_dimmer.triggered[i] ) { digitalWrite(Pin(GPIO_PWM1, i), HIGH ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); ac_zero_cross_dimmer.triggered[i] = true; - ac_zero_cross_dimmer.accurracy[i] = tmax(ac_zero_cross_dimmer.accurracy[i],time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]); + ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; } if (time_since_zc >= ac_zero_cross_dimmer.disable_time_us[i]) { digitalWrite(Pin(GPIO_PWM1, i), LOW ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); @@ -214,12 +214,13 @@ void ACDimmerLogging(void) ); for (uint8_t i = 0; i < MAX_PWMS; i++){ if (Pin(GPIO_PWM1, i) == -1) continue; - if (ac_zero_cross_dimmer.accurracy[i]) ac_zero_cross_dimmer.accurracy[i]--; + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("ZCD: PWM[%d] en: %ld µs, dis: %ld µs, fade: %d, cur: %d, end: %d, lastlight: %d, acc: %ld"), i+1, ac_zero_cross_dimmer.enable_time_us[i], ac_zero_cross_dimmer.disable_time_us[i], Light.fade_cur_10[i], Light.fade_start_10[i], Light.fade_end_10[i], ac_zero_cross_dimmer.lastlight[i], ac_zero_cross_dimmer.accurracy[i] ); + if (ac_zero_cross_dimmer.accurracy[i]) ac_zero_cross_dimmer.accurracy[i]=0; } } From f2ab3b36a97b2314972b7eec750e2738790173b3 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 29 Jul 2023 14:19:15 +0200 Subject: [PATCH 109/150] Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature (#19210) * Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature * Changed to AqaraTemperature --- CHANGELOG.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino | 2 ++ 2 files changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb3a66d80..7d078da4d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Added - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) - Support for multiple PCA9685 with extended functionality (#18805) +- Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature ### Breaking Changed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino index 6c682450c..67929f758 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_23_zigbee_5_2_converters.ino @@ -1214,6 +1214,8 @@ void ZCLFrame::syntheticAqaraSensor(Z_attribute_list &attr_list, class Z_attribu attr_list.addAttribute(0x0001, 0x0020).setFloat(batteryvoltage); uint8_t batterypercentage = toPercentageCR2032(uval32); attr_list.addAttribute(0x0001, 0x0021).setUInt(batterypercentage * 2); + } else if (0x03 == attrid) { + attr_list.addAttributePMEM("AqaraTemperature").copyVal(attr); // Temperature } else if ((nullptr != modelId) && ((0 == getManufCode()) || (0x115F == getManufCode()))) { translated = true; if (modelId.startsWith(F("lumi.sensor_magnet"))) { // door / window sensor From fb45e73384e9bc2f260694489a99dae00c271be4 Mon Sep 17 00:00:00 2001 From: msedv Date: Sat, 29 Jul 2023 16:50:27 +0200 Subject: [PATCH 110/150] Four files which used #ifdef EPS8266 instead of #ifdef ESP8266 - which e.g. broke the MFRC522 functionality between 12.5 and 13.x. (#19209) --- CHANGELOG.md | 2 +- tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino | 4 ++-- tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino | 4 ++-- tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d078da4d..2a2b6cdc7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -136,7 +136,7 @@ All notable changes to this project will be documented in this file. ### Added - Matter support for Shutters with Tilt - Matter POC for remote Relay -- Support for Zero-Cross Dimmer on ESP32, changed calculation on EPS8266, high resolution control e.g. Solar: `ZCDimmerSet` +- Support for Zero-Cross Dimmer on ESP32, changed calculation on ESP8266, high resolution control e.g. Solar: `ZCDimmerSet` - ESP32 Enhanced Shutterbuttons functionality to control tilt position, additionally incr/decr possible to position and tilt. - ESP32 command ``Shuttersetup`` for "Shelly 2.5 pro" automatic calibration and setup (experimental) - Berry `tcpclientasync` class for non-blocking TCP client diff --git a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino index 54922adf9..a91c48b0f 100755 --- a/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_10_scripter.ino @@ -5379,10 +5379,10 @@ extern char *SML_GetSVal(uint32_t index); glob_script_mem.spi.settings = SPISettings(fvar, MSBFIRST, SPI_MODE0); if (TasmotaGlobal.spi_enabled) { -#ifdef EPS8266 +#ifdef ESP8266 SPI.begin(); glob_script_mem.spi.spip = &SPI; -#endif // EPS8266 +#endif // ESP8266 #ifdef ESP32 if (glob_script_mem.spi.sclk == -1) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino index ee99a4f80..dfc54172e 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_50_filesystem.ino @@ -183,9 +183,9 @@ void UfsCheckSDCardInit(void) { if (TasmotaGlobal.spi_enabled && PinUsed(GPIO_SDCARD_CS)) { int8_t cs = Pin(GPIO_SDCARD_CS); -#ifdef EPS8266 +#ifdef ESP8266 SPI.begin(); -#endif // EPS8266 +#endif // ESP8266 #ifdef ESP32 SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1); #endif // ESP32 diff --git a/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino b/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino index 037ded6da..7ceeed9ae 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_80_mfrc522.ino @@ -100,9 +100,9 @@ void RC522ScanForTag(void) { void RC522Init(void) { if (PinUsed(GPIO_RC522_CS) && PinUsed(GPIO_RC522_RST) && (SPI_MOSI_MISO == TasmotaGlobal.spi_enabled)) { Mfrc522 = new MFRC522(Pin(GPIO_RC522_CS), Pin(GPIO_RC522_RST)); -#ifdef EPS8266 +#ifdef ESP8266 SPI.begin(); -#endif // EPS8266 +#endif // ESP8266 #ifdef ESP32 SPI.begin(Pin(GPIO_SPI_CLK), Pin(GPIO_SPI_MISO), Pin(GPIO_SPI_MOSI), -1); #endif // ESP32 From 2e9cd6a57d76c0272481117f0e65c8d179ef1976 Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sat, 29 Jul 2023 19:48:43 +0200 Subject: [PATCH 111/150] Auto detect flash size and adjust FS (#349) (#19215) --- pio-tools/get_flash_size.py | 43 ++++++++++++++++++++++++++++ pio-tools/post_esp32.py | 46 +++++++++++++++++++++++++++--- platformio_tasmota32.ini | 1 + platformio_tasmota_cenv_sample.ini | 7 ----- 4 files changed, 86 insertions(+), 11 deletions(-) create mode 100644 pio-tools/get_flash_size.py diff --git a/pio-tools/get_flash_size.py b/pio-tools/get_flash_size.py new file mode 100644 index 000000000..7d1bf09f5 --- /dev/null +++ b/pio-tools/get_flash_size.py @@ -0,0 +1,43 @@ +from os.path import join +import subprocess +from SCons.Script import COMMAND_LINE_TARGETS + +Import("env") +env = DefaultEnvironment() +platform = env.PioPlatform() + +if "upload" in COMMAND_LINE_TARGETS: + + def esp32_detect_flashsize(): + esptoolpy = join(platform.get_package_dir("tool-esptoolpy") or "", "esptool.py") + esptoolpy_flags = ["flash_id"] + esptoolpy_cmd = [env["PYTHONEXE"], esptoolpy] + esptoolpy_flags + try: + output = subprocess.run(esptoolpy_cmd, capture_output=True).stdout.splitlines() + for l in output: + if l.decode().startswith("Detected flash size: "): + size = (l.decode().split(": ")[1]) + print("Did get flash size:",size) + return size, True + return "4MB",False + except subprocess.CalledProcessError as exc: + print("Did get chip info failed with " + str(exc)) + return "4MB",False + + size, overridden = esp32_detect_flashsize() + old_flash_size = env.BoardConfig().get("upload.flash_size") + old_maximum_size = env.BoardConfig().get("upload.maximum_size") + new_maximum_size = int(size.split("MB")[0]) * 0x100000 + + extra_flags = env.BoardConfig().get("build.extra_flags").split(" ") + new_flags = "" + for flag in extra_flags: + if flag.startswith("-DESP32"): + flag = f"-DESP32_{size}" + new_flags += flag + " " + env.BoardConfig().update("build.extra_flags",new_flags) + env.BoardConfig().update("upload.flash_size",size) + + env.BoardConfig().update("upload.maximum_size", new_maximum_size) + + env.Replace(TASMOTA_flash_size=size) \ No newline at end of file diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 9f8a2f637..33e9ffa7e 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -1,6 +1,8 @@ # From: https://github.com/letscontrolit/ESPEasy/blob/mega/tools/pio/post_esp32.py # Thanks TD-er :) +# Thanks @staars for safeboot and auto resizing LittleFS code and enhancements + # Combines separate bin files with their respective offsets into a single file # This single file must then be flashed to an ESP32 node with 0 offset. # @@ -29,6 +31,8 @@ import csv import requests import shutil import subprocess +import codecs +from SCons.Script import COMMAND_LINE_TARGETS sys.path.append(join(platform.get_package_dir("tool-esptoolpy"))) import esptool @@ -52,6 +56,29 @@ else: variants_dir = join(FRAMEWORK_DIR, "variants", "tasmota") +def patch_partitions_bin(size_string): + partition_bin_path = join(env.subst("$BUILD_DIR"),"partitions.bin") + with open(partition_bin_path, 'r+b') as file: + binary_data = file.read(0xb0) + import hashlib + bin_list = list(binary_data) + size = codecs.decode(size_string[2:], 'hex_codec') # 0xc50000 -> [c5,00,00] + bin_list[0x8a] = size[0] + bin_list[0x8b] = size[1] + result = hashlib.md5(bytes(bin_list[0:0xa0])) + partition_data = bytes(bin_list) + result.digest() + file.seek(0) + file.write(partition_data) + print("New partition hash:",result.digest().hex()) + +def esp32_detect_flashsize(): + if not "upload" in COMMAND_LINE_TARGETS: + return "4MB",False + try: + return env.get("TASMOTA_flash_size"),True + except: + return "4MB",False + def esp32_create_chip_string(chip): tasmota_platform = env.subst("$BUILD_DIR").split(os.path.sep)[-1] tasmota_platform = tasmota_platform.split('-')[0] @@ -120,6 +147,8 @@ def esp32_create_combined_bin(source, target, env): # factory_offset = -1 # error code value - currently unused app_offset = 0x10000 # default value for "old" scheme fs_offset = -1 # error code value + flash_size_from_esp, flash_size_was_overridden = esp32_detect_flashsize() + with open(env.BoardConfig().get("build.partitions")) as csv_file: print("Read partitions from ",env.BoardConfig().get("build.partitions")) csv_reader = csv.reader(csv_file, delimiter=',') @@ -136,7 +165,13 @@ def esp32_create_combined_bin(source, target, env): # elif(row[0] == 'factory'): # factory_offset = int(row[3],base=16) elif(row[0] == 'spiffs'): - if esp32_build_filesystem(row[4]): + partition_size = row[4] + if flash_size_was_overridden: + print(f"Will override fixed FS partition size from {env.BoardConfig().get('build.partitions')}: {partition_size} ...") + partition_size = hex(int(flash_size_from_esp.split("MB")[0]) * 0x100000 - int(row[3],base=16)) + print(f"... with computed maximum size from connected {env.get('BOARD_MCU')}: {partition_size}") + patch_partitions_bin(partition_size) + if esp32_build_filesystem(partition_size): fs_offset = int(row[3],base=16) @@ -147,16 +182,19 @@ def esp32_create_combined_bin(source, target, env): tasmota_platform = esp32_create_chip_string(chip) if "-DUSE_USB_CDC_CONSOLE" in env.BoardConfig().get("build.extra_flags") and "cdc" not in tasmota_platform: - tasmota_platform += "cdc" + tasmota_platform += "cdc" print("WARNING: board definition uses CDC configuration, but environment name does not -> changing tasmota safeboot binary to:", tasmota_platform + "-safeboot.bin") - + if not os.path.exists(variants_dir): os.makedirs(variants_dir) if("safeboot" in firmware_name): esp32_copy_new_safeboot_bin(tasmota_platform,firmware_name) else: esp32_fetch_safeboot_bin(tasmota_platform) + flash_size = env.BoardConfig().get("upload.flash_size", "4MB") + if flash_size_was_overridden: + flash_size = flash_size_from_esp flash_freq = env.BoardConfig().get("build.f_flash", "40000000L") flash_freq = str(flash_freq).replace("L", "") flash_freq = str(int(int(flash_freq) / 1000000)) + "m" @@ -225,4 +263,4 @@ def esp32_create_combined_bin(source, target, env): esptool.main(cmd) -env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) +env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", esp32_create_combined_bin) \ No newline at end of file diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 814af20a0..30f42a99a 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -37,6 +37,7 @@ build_flags = ${esp_defaults.build_flags} -Wl,--wrap=_Z11analogWritehi ; `analogWrite(unsigned char, int)` use the Tasmota version of analogWrite for deeper integration and phase control -Wl,--wrap=ledcReadFreq ; `uint32_t ledcReadFreq(uint8_t chan)` extra_scripts = pre:pio-tools/add_c_flags.py + pre:pio-tools/get_flash_size.py pre:pio-tools/gen-berry-structures.py post:pio-tools/post_esp32.py ${esp_defaults.extra_scripts} diff --git a/platformio_tasmota_cenv_sample.ini b/platformio_tasmota_cenv_sample.ini index 2f987d809..ed427a6ed 100644 --- a/platformio_tasmota_cenv_sample.ini +++ b/platformio_tasmota_cenv_sample.ini @@ -22,13 +22,6 @@ board_build.f_flash = 80000000L build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_TASMOTA32 -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32s3.bin"' -; !!! Real flash size needed, avoid autoresize since it is formating FS !!! -board_upload.flash_size = 8MB -board_upload.maximum_size = 8388608 -; Without autoresize a partition scheme is needed which does fit to flash size -board_build.partitions = partitions/esp32_partition_app2944k_fs2M.csv -; Dont use safeboot, not used in this partition scheme -> an empty entry needed to overwrite the default setting -board_upload.arduino.flash_extra_images = ; Example for custom file upload in Tasmota Filesystem custom_files_upload = ${env:tasmota32_base.custom_files_upload} tasmota/berry/modules/Partition_Wizard.tapp From 2c15cfe4da37610a52095bf55d487fbc3c4ae025 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 29 Jul 2023 23:09:03 +0200 Subject: [PATCH 112/150] Reduced log level for TeleInfo (#19216) --- CHANGELOG.md | 1 + .../tasmota_xnrg_energy/xnrg_15_teleinfo.ino | 22 +++++++++---------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a2b6cdc7..ef78d526e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,7 @@ All notable changes to this project will be documented in this file. - ESP32 Framework (Core) from v2.0.10 to v2.0.11 - Berry `mqtt.publish` now distinguishes between `string` and `bytes` - IRremoteESP8266 library from v2.8.5 to v2.8.6 +- Reduced log level for TeleInfo ### Fixed - Initial battery level percentage (#19160) diff --git a/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino b/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino index bc40715b4..34c3993bd 100644 --- a/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino +++ b/tasmota/tasmota_xnrg_energy/xnrg_15_teleinfo.ino @@ -406,7 +406,7 @@ void DataCallback(struct _ValueList * me, uint8_t flags) AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: HC:%ld HP:%ld Total:%ld"), hc, hp, total_wh); } - AddLog (LOG_LEVEL_INFO, PSTR ("TIC: Total counter updated to %ld Wh"), total_wh); + AddLog (LOG_LEVEL_DEBUG_MORE, PSTR ("TIC: Total counter updated to %ld Wh"), total_wh); if (total_wh>0) { Energy->total[0] = (float) total_wh / 1000.0f; Energy->import_active[0] = Energy->total[0]; @@ -422,17 +422,17 @@ void DataCallback(struct _ValueList * me, uint8_t flags) total_wh = atol(me->value); Energy->total[0] = (float) total_wh / 1000.0f; Energy->import_active[0] = Energy->total[0]; - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: Total:%ldWh"), total_wh); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: Total:%ldWh"), total_wh); } // Wh indexes (standard) else if ( ilabel == LABEL_EASF01) { - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: HC:%ld"), atol(me->value)); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: HC:%ld"), atol(me->value)); } else if ( ilabel == LABEL_EASF02) { - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: HP:%ld"), atol(me->value)); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: HP:%ld"), atol(me->value)); } // Contract subscribed (legacy) @@ -468,7 +468,7 @@ void DataCallback(struct _ValueList * me, uint8_t flags) else if (ilabel == LABEL_ISOUSC) { isousc = atoi( me->value); - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: ISousc set to %d"), isousc); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: ISousc set to %d"), isousc); } // Contract subscribed (Power in KVA) @@ -477,20 +477,20 @@ void DataCallback(struct _ValueList * me, uint8_t flags) // Convert KVA to A isousc = atoi( me->value) * 5 ; - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: ISousc set to %d"), isousc); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: ISousc set to %d"), isousc); } // Serial Number of device else if (ilabel == LABEL_ADCO || ilabel == LABEL_ADSC) { strcpy(serialNumber, me->value); - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: %s set to %s"), me->name, serialNumber); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: %s set to %s"), me->name, serialNumber); } // Status else if (ilabel == LABEL_STGE) { status_register = strtol(me->value, nullptr, 16); - AddLog(LOG_LEVEL_DEBUG, PSTR("Status Resister : %s set to %08X"), me->name, status_register); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("Status Resister : %s set to %08X"), me->name, status_register); } } @@ -786,7 +786,7 @@ bool TInfoCmd(void) { // At least "EnergyConfig" if (CMND_ENERGYCONFIG == Energy->command_code) { - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: len %d, data '%s'"), XdrvMailbox.data_len, XdrvMailbox.data ? XdrvMailbox.data : "null" ); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: len %d, data '%s'"), XdrvMailbox.data_len, XdrvMailbox.data ? XdrvMailbox.data : "null" ); // Just "EnergyConfig" no more parameter // Show Teleinfo configuration @@ -838,7 +838,7 @@ bool TInfoCmd(void) { int command_code = GetCommandCode(command, sizeof(command), pParam, kTInfo_Commands); - AddLog(LOG_LEVEL_DEBUG, PSTR("TIC: param '%s' cmnd %d"), pParam, command_code); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("TIC: param '%s' cmnd %d"), pParam, command_code); switch (command_code) { case CMND_TELEINFO_STANDARD: @@ -1002,7 +1002,7 @@ void TInfoProcess(void) // if needed, update energy total every hour if (tick_update++ > 3600 * 4) { EnergyUpdateTotal(); - AddLog (LOG_LEVEL_INFO, PSTR ("TIC: Total counter updated to %lu Wh"), total_wh); + AddLog (LOG_LEVEL_DEBUG, PSTR ("TIC: Total counter updated to %lu Wh"), total_wh); tick_update = 0; } From 355b1e3b746fc89cfa657a8fa1442dc520c008e1 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sun, 30 Jul 2023 15:01:21 +0200 Subject: [PATCH 113/150] unsigned overflow fixed (#19221) fixed overflow on negative value with dimmer 100% --- tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 3ab5ef1b6..2f504d673 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -150,7 +150,7 @@ void IRAM_ATTR ACDimmerTimer_intr() { time_since_zc = micros() - ac_zero_cross_dimmer.crossed_zero_at; } #endif - if (time_since_zc >= ac_zero_cross_dimmer.enable_time_us[i]-5 && !ac_zero_cross_dimmer.triggered[i] ) { + if (time_since_zc+5 >= ac_zero_cross_dimmer.enable_time_us[i] && !ac_zero_cross_dimmer.triggered[i] ) { digitalWrite(Pin(GPIO_PWM1, i), HIGH ^ ac_zero_cross_dimmer.fallingEdgeDimmer ); ac_zero_cross_dimmer.triggered[i] = true; ac_zero_cross_dimmer.accurracy[i] = time_since_zc-ac_zero_cross_dimmer.enable_time_us[i]; From 148c1a2f747d95dcfec34173114fc30297b78553 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sun, 30 Jul 2023 19:09:27 +0200 Subject: [PATCH 114/150] Fix fabric saving exception (#19224) --- .../src/embedded/Matter_Session_Store.be | 25 ++- .../solidified_Matter_Session_Store.h | 178 +++++++++--------- 2 files changed, 103 insertions(+), 100 deletions(-) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be index 9acc749e0..0c819b906 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session_Store.be @@ -313,19 +313,24 @@ class Matter_Session_Store try self.remove_expired() # clean before saving var sessions_saved = 0 - - var fabs = [] - for f : self.fabrics.persistables() - for _ : f._sessions.persistables() sessions_saved += 1 end # count persitable sessions - fabs.push(f.tojson()) - end - var fabs_size = size(fabs) - fabs = "[" + fabs.concat(",") + "]" + var fabrics_saved = 0 var f = open(self._FABRICS, "w") - f.write(fabs) + + f.write("[") + for fab : self.fabrics.persistables() + for _ : fab._sessions.persistables() sessions_saved += 1 end # count persitable sessions + if fabrics_saved > 0 + f.write(",") + end + var f_json = fab.tojson() + f.write(f_json) + fabrics_saved += 1 + end + f.write("]") + f.close() - tasmota.log(format("MTR: =Saved %i fabric(s) and %i session(s)", fabs_size, sessions_saved), 2) + tasmota.log(f"MTR: =Saved {fabrics_saved} fabric(s) and {sessions_saved} session(s)", 2) self.device.event_fabrics_saved() # signal event except .. as e, m tasmota.log("MTR: Session_Store::save Exception:" + str(e) + "|" + str(m), 2) diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h index b462b8ac3..e4ccf468a 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session_Store.h @@ -1156,7 +1156,7 @@ be_local_closure(Matter_Session_Store_find_session_by_resumption_id, /* name * ********************************************************************/ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ be_nested_proto( - 12, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1164,33 +1164,31 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[26]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(json), /* K1 */ be_nested_str_weak(remove_expired), /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(fabrics), - /* K4 */ be_nested_str_weak(persistables), - /* K5 */ be_nested_str_weak(_sessions), - /* K6 */ be_const_int(1), - /* K7 */ be_nested_str_weak(stop_iteration), - /* K8 */ be_nested_str_weak(push), - /* K9 */ be_nested_str_weak(tojson), - /* K10 */ be_nested_str_weak(_X5B), - /* K11 */ be_nested_str_weak(concat), + /* K3 */ be_nested_str_weak(_FABRICS), + /* K4 */ be_nested_str_weak(w), + /* K5 */ be_nested_str_weak(write), + /* K6 */ be_nested_str_weak(_X5B), + /* K7 */ be_nested_str_weak(fabrics), + /* K8 */ be_nested_str_weak(persistables), + /* K9 */ be_nested_str_weak(_sessions), + /* K10 */ be_const_int(1), + /* K11 */ be_nested_str_weak(stop_iteration), /* K12 */ be_nested_str_weak(_X2C), - /* K13 */ be_nested_str_weak(_X5D), - /* K14 */ be_nested_str_weak(_FABRICS), - /* K15 */ be_nested_str_weak(w), - /* K16 */ be_nested_str_weak(write), - /* K17 */ be_nested_str_weak(close), - /* K18 */ be_nested_str_weak(tasmota), - /* K19 */ be_nested_str_weak(log), - /* K20 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25i_X20fabric_X28s_X29_X20and_X20_X25i_X20session_X28s_X29), - /* K21 */ be_const_int(2), - /* K22 */ be_nested_str_weak(device), - /* K23 */ be_nested_str_weak(event_fabrics_saved), - /* K24 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), - /* K25 */ be_nested_str_weak(_X7C), + /* K13 */ be_nested_str_weak(tojson), + /* K14 */ be_nested_str_weak(_X5D), + /* K15 */ be_nested_str_weak(close), + /* K16 */ be_nested_str_weak(tasmota), + /* K17 */ be_nested_str_weak(log), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3DSaved_X20_X20_X20_X20_X20_X25s_X20fabric_X28s_X29_X20and_X20_X25s_X20session_X28s_X29), + /* K19 */ be_const_int(2), + /* K20 */ be_nested_str_weak(device), + /* K21 */ be_nested_str_weak(event_fabrics_saved), + /* K22 */ be_nested_str_weak(MTR_X3A_X20Session_Store_X3A_X3Asave_X20Exception_X3A), + /* K23 */ be_nested_str_weak(_X7C), }), be_str_weak(save_fabrics), &be_const_str_solidified, @@ -1200,83 +1198,83 @@ be_local_closure(Matter_Session_Store_save_fabrics, /* name */ 0x8C080101, // 0002 GETMET R2 R0 K1 0x7C080200, // 0003 CALL R2 1 0x58080002, // 0004 LDCONST R2 K2 - 0x600C0012, // 0005 GETGBL R3 G18 - 0x7C0C0000, // 0006 CALL R3 0 - 0x60100010, // 0007 GETGBL R4 G16 - 0x88140103, // 0008 GETMBR R5 R0 K3 - 0x8C140B04, // 0009 GETMET R5 R5 K4 - 0x7C140200, // 000A CALL R5 1 - 0x7C100200, // 000B CALL R4 1 - 0xA8020013, // 000C EXBLK 0 #0021 - 0x5C140800, // 000D MOVE R5 R4 - 0x7C140000, // 000E CALL R5 0 - 0x60180010, // 000F GETGBL R6 G16 - 0x881C0B05, // 0010 GETMBR R7 R5 K5 - 0x8C1C0F04, // 0011 GETMET R7 R7 K4 - 0x7C1C0200, // 0012 CALL R7 1 - 0x7C180200, // 0013 CALL R6 1 - 0xA8020003, // 0014 EXBLK 0 #0019 - 0x5C1C0C00, // 0015 MOVE R7 R6 - 0x7C1C0000, // 0016 CALL R7 0 - 0x00080506, // 0017 ADD R2 R2 K6 - 0x7001FFFB, // 0018 JMP #0015 - 0x58180007, // 0019 LDCONST R6 K7 - 0xAC180200, // 001A CATCH R6 1 0 - 0xB0080000, // 001B RAISE 2 R0 R0 - 0x8C180708, // 001C GETMET R6 R3 K8 - 0x8C200B09, // 001D GETMET R8 R5 K9 - 0x7C200200, // 001E CALL R8 1 - 0x7C180400, // 001F CALL R6 2 - 0x7001FFEB, // 0020 JMP #000D - 0x58100007, // 0021 LDCONST R4 K7 - 0xAC100200, // 0022 CATCH R4 1 0 - 0xB0080000, // 0023 RAISE 2 R0 R0 - 0x6010000C, // 0024 GETGBL R4 G12 - 0x5C140600, // 0025 MOVE R5 R3 - 0x7C100200, // 0026 CALL R4 1 - 0x8C14070B, // 0027 GETMET R5 R3 K11 - 0x581C000C, // 0028 LDCONST R7 K12 - 0x7C140400, // 0029 CALL R5 2 - 0x00161405, // 002A ADD R5 K10 R5 - 0x00140B0D, // 002B ADD R5 R5 K13 - 0x5C0C0A00, // 002C MOVE R3 R5 - 0x60140011, // 002D GETGBL R5 G17 - 0x8818010E, // 002E GETMBR R6 R0 K14 - 0x581C000F, // 002F LDCONST R7 K15 - 0x7C140400, // 0030 CALL R5 2 - 0x8C180B10, // 0031 GETMET R6 R5 K16 - 0x5C200600, // 0032 MOVE R8 R3 - 0x7C180400, // 0033 CALL R6 2 - 0x8C180B11, // 0034 GETMET R6 R5 K17 - 0x7C180200, // 0035 CALL R6 1 - 0xB81A2400, // 0036 GETNGBL R6 K18 - 0x8C180D13, // 0037 GETMET R6 R6 K19 - 0x60200018, // 0038 GETGBL R8 G24 - 0x58240014, // 0039 LDCONST R9 K20 - 0x5C280800, // 003A MOVE R10 R4 - 0x5C2C0400, // 003B MOVE R11 R2 - 0x7C200600, // 003C CALL R8 3 - 0x58240015, // 003D LDCONST R9 K21 - 0x7C180600, // 003E CALL R6 3 - 0x88180116, // 003F GETMBR R6 R0 K22 - 0x8C180D17, // 0040 GETMET R6 R6 K23 - 0x7C180200, // 0041 CALL R6 1 + 0x580C0002, // 0005 LDCONST R3 K2 + 0x60100011, // 0006 GETGBL R4 G17 + 0x88140103, // 0007 GETMBR R5 R0 K3 + 0x58180004, // 0008 LDCONST R6 K4 + 0x7C100400, // 0009 CALL R4 2 + 0x8C140905, // 000A GETMET R5 R4 K5 + 0x581C0006, // 000B LDCONST R7 K6 + 0x7C140400, // 000C CALL R5 2 + 0x60140010, // 000D GETGBL R5 G16 + 0x88180107, // 000E GETMBR R6 R0 K7 + 0x8C180D08, // 000F GETMET R6 R6 K8 + 0x7C180200, // 0010 CALL R6 1 + 0x7C140200, // 0011 CALL R5 1 + 0xA802001A, // 0012 EXBLK 0 #002E + 0x5C180A00, // 0013 MOVE R6 R5 + 0x7C180000, // 0014 CALL R6 0 + 0x601C0010, // 0015 GETGBL R7 G16 + 0x88200D09, // 0016 GETMBR R8 R6 K9 + 0x8C201108, // 0017 GETMET R8 R8 K8 + 0x7C200200, // 0018 CALL R8 1 + 0x7C1C0200, // 0019 CALL R7 1 + 0xA8020003, // 001A EXBLK 0 #001F + 0x5C200E00, // 001B MOVE R8 R7 + 0x7C200000, // 001C CALL R8 0 + 0x0008050A, // 001D ADD R2 R2 K10 + 0x7001FFFB, // 001E JMP #001B + 0x581C000B, // 001F LDCONST R7 K11 + 0xAC1C0200, // 0020 CATCH R7 1 0 + 0xB0080000, // 0021 RAISE 2 R0 R0 + 0x241C0702, // 0022 GT R7 R3 K2 + 0x781E0002, // 0023 JMPF R7 #0027 + 0x8C1C0905, // 0024 GETMET R7 R4 K5 + 0x5824000C, // 0025 LDCONST R9 K12 + 0x7C1C0400, // 0026 CALL R7 2 + 0x8C1C0D0D, // 0027 GETMET R7 R6 K13 + 0x7C1C0200, // 0028 CALL R7 1 + 0x8C200905, // 0029 GETMET R8 R4 K5 + 0x5C280E00, // 002A MOVE R10 R7 + 0x7C200400, // 002B CALL R8 2 + 0x000C070A, // 002C ADD R3 R3 K10 + 0x7001FFE4, // 002D JMP #0013 + 0x5814000B, // 002E LDCONST R5 K11 + 0xAC140200, // 002F CATCH R5 1 0 + 0xB0080000, // 0030 RAISE 2 R0 R0 + 0x8C140905, // 0031 GETMET R5 R4 K5 + 0x581C000E, // 0032 LDCONST R7 K14 + 0x7C140400, // 0033 CALL R5 2 + 0x8C14090F, // 0034 GETMET R5 R4 K15 + 0x7C140200, // 0035 CALL R5 1 + 0xB8162000, // 0036 GETNGBL R5 K16 + 0x8C140B11, // 0037 GETMET R5 R5 K17 + 0x601C0018, // 0038 GETGBL R7 G24 + 0x58200012, // 0039 LDCONST R8 K18 + 0x5C240600, // 003A MOVE R9 R3 + 0x5C280400, // 003B MOVE R10 R2 + 0x7C1C0600, // 003C CALL R7 3 + 0x58200013, // 003D LDCONST R8 K19 + 0x7C140600, // 003E CALL R5 3 + 0x88140114, // 003F GETMBR R5 R0 K20 + 0x8C140B15, // 0040 GETMET R5 R5 K21 + 0x7C140200, // 0041 CALL R5 1 0xA8040001, // 0042 EXBLK 1 1 0x70020010, // 0043 JMP #0055 0xAC080002, // 0044 CATCH R2 0 2 0x7002000D, // 0045 JMP #0054 - 0xB8122400, // 0046 GETNGBL R4 K18 - 0x8C100913, // 0047 GETMET R4 R4 K19 + 0xB8122000, // 0046 GETNGBL R4 K16 + 0x8C100911, // 0047 GETMET R4 R4 K17 0x60180008, // 0048 GETGBL R6 G8 0x5C1C0400, // 0049 MOVE R7 R2 0x7C180200, // 004A CALL R6 1 - 0x001A3006, // 004B ADD R6 K24 R6 - 0x00180D19, // 004C ADD R6 R6 K25 + 0x001A2C06, // 004B ADD R6 K22 R6 + 0x00180D17, // 004C ADD R6 R6 K23 0x601C0008, // 004D GETGBL R7 G8 0x5C200600, // 004E MOVE R8 R3 0x7C1C0200, // 004F CALL R7 1 0x00180C07, // 0050 ADD R6 R6 R7 - 0x581C0015, // 0051 LDCONST R7 K21 + 0x581C0013, // 0051 LDCONST R7 K19 0x7C100600, // 0052 CALL R4 3 0x70020000, // 0053 JMP #0055 0xB0080000, // 0054 RAISE 2 R0 R0 From 80617e96e1238a57bc3f2df1ecaae0a64e3e0963 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Mon, 31 Jul 2023 13:57:07 +0200 Subject: [PATCH 115/150] Berry bytes `get` and `set` work for 3 bytes values (#19225) * Berry bytes `get` and `set` work for 3 bytes values * Fix error message --- CHANGELOG.md | 1 + lib/libesp32/berry/src/be_byteslib.c | 46 ++++++++++++++++++++++++++-- 2 files changed, 45 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef78d526e..5b5aa73e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file. - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) - Support for multiple PCA9685 with extended functionality (#18805) - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature +- Berry bytes `get` and `set` work for 3 bytes values ### Breaking Changed diff --git a/lib/libesp32/berry/src/be_byteslib.c b/lib/libesp32/berry/src/be_byteslib.c index 665d630f3..0a5c1747e 100644 --- a/lib/libesp32/berry/src/be_byteslib.c +++ b/lib/libesp32/berry/src/be_byteslib.c @@ -356,6 +356,40 @@ static uint16_t buf_get2_be(buf_impl* attr, size_t offset) return 0; } +static uint32_t buf_get3_le(buf_impl* attr, size_t offset) +{ + if ((int32_t)offset + 2 < attr->len) { + return attr->bufptr[offset] | (attr->bufptr[offset+1] << 8) | (attr->bufptr[offset+2] << 16); + } + return 0; +} + +static uint16_t buf_get3_be(buf_impl* attr, size_t offset) +{ + if ((int32_t)offset + 2 < attr->len) { + return attr->bufptr[offset+2] | (attr->bufptr[offset+1] << 8) | (attr->bufptr[offset] << 16); + } + return 0; +} + +static void buf_set3_le(buf_impl* attr, size_t offset, uint32_t data) +{ + if ((int32_t)offset + 2 < attr->len) { + attr->bufptr[offset] = data & 0xFF; + attr->bufptr[offset+1] = (data >> 8) & 0xFF; + attr->bufptr[offset+2] = (data >> 16) & 0xFF; + } +} + +static void buf_set3_be(buf_impl* attr, size_t offset, uint32_t data) +{ + if ((int32_t)offset + 2 < attr->len) { + attr->bufptr[offset+2] = data & 0xFF; + attr->bufptr[offset+1] = (data >> 8) & 0xFF; + attr->bufptr[offset] = (data >> 16) & 0xFF; + } +} + static void buf_set4_le(buf_impl* attr, size_t offset, uint32_t data) { if ((int32_t)offset + 3 < attr->len) { @@ -832,12 +866,18 @@ static int m_get(bvm *vm, bbool sign) case 2: ret = buf_get2_le(&attr, idx); if (sign) { ret = (int16_t)(uint16_t) ret; } break; + case 3: ret = buf_get3_le(&attr, idx); + if (sign & (ret & 0x800000)) { ret = ret | 0xFF000000; } + break; case 4: ret = buf_get4_le(&attr, idx); break; case -2: ret = buf_get2_be(&attr, idx); if (sign) { ret = (int16_t)(uint16_t) ret; } break; + case -3: ret = buf_get3_be(&attr, idx); + if (sign & (ret & 0x800000)) { ret = ret | 0xFF000000; } + break; case -4: ret = buf_get4_be(&attr, idx); break; - default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); + default: be_raise(vm, "type_error", "size must be -4, -3, -2, -1, 0, 1, 2, 3 or 4."); } be_pop(vm, argc - 1); if (vsize != 0) { @@ -911,10 +951,12 @@ static int m_set(bvm *vm) case -1: /* fallback below */ case 1: buf_set1(&attr, idx, value); break; case 2: buf_set2_le(&attr, idx, value); break; + case 3: buf_set3_le(&attr, idx, value); break; case 4: buf_set4_le(&attr, idx, value); break; case -2: buf_set2_be(&attr, idx, value); break; + case -3: buf_set3_be(&attr, idx, value); break; case -4: buf_set4_be(&attr, idx, value); break; - default: be_raise(vm, "type_error", "size must be -4, -2, -1, 0, 1, 2 or 4."); + default: be_raise(vm, "type_error", "size must be -4, -3, -2, -1, 0, 1, 2, 3 or 4."); } be_pop(vm, argc - 1); m_write_attributes(vm, 1, &attr); /* update attributes */ From 222b47627f9cce81733ed10c79d8beb4516266ef Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Mon, 31 Jul 2023 17:43:47 +0200 Subject: [PATCH 116/150] fix 4MB PIO script upload regression --- pio-tools/get_flash_size.py | 22 ++++++++++++---------- pio-tools/post_esp32.py | 7 ++++--- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/pio-tools/get_flash_size.py b/pio-tools/get_flash_size.py index 7d1bf09f5..c0480d854 100644 --- a/pio-tools/get_flash_size.py +++ b/pio-tools/get_flash_size.py @@ -29,15 +29,17 @@ if "upload" in COMMAND_LINE_TARGETS: old_maximum_size = env.BoardConfig().get("upload.maximum_size") new_maximum_size = int(size.split("MB")[0]) * 0x100000 - extra_flags = env.BoardConfig().get("build.extra_flags").split(" ") - new_flags = "" - for flag in extra_flags: - if flag.startswith("-DESP32"): - flag = f"-DESP32_{size}" - new_flags += flag + " " - env.BoardConfig().update("build.extra_flags",new_flags) - env.BoardConfig().update("upload.flash_size",size) + if new_maximum_size > old_maximum_size: - env.BoardConfig().update("upload.maximum_size", new_maximum_size) + extra_flags = env.BoardConfig().get("build.extra_flags").split(" ") + new_flags = "" + for flag in extra_flags: + if flag.startswith("-DESP32"): + flag = f"-DESP32_{size}" + new_flags += flag + " " + env.BoardConfig().update("build.extra_flags",new_flags) + env.BoardConfig().update("upload.flash_size",size) - env.Replace(TASMOTA_flash_size=size) \ No newline at end of file + env.BoardConfig().update("upload.maximum_size", new_maximum_size) + + env.Replace(TASMOTA_flash_size=size) \ No newline at end of file diff --git a/pio-tools/post_esp32.py b/pio-tools/post_esp32.py index 33e9ffa7e..facff33e7 100644 --- a/pio-tools/post_esp32.py +++ b/pio-tools/post_esp32.py @@ -74,10 +74,11 @@ def patch_partitions_bin(size_string): def esp32_detect_flashsize(): if not "upload" in COMMAND_LINE_TARGETS: return "4MB",False - try: - return env.get("TASMOTA_flash_size"),True - except: + size = env.get("TASMOTA_flash_size") + if size == None: return "4MB",False + else: + return size,True def esp32_create_chip_string(chip): tasmota_platform = env.subst("$BUILD_DIR").split(os.path.sep)[-1] From 58fce333123c84cc8e027815a4259f1111474d2d Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 2 Aug 2023 09:02:08 +0200 Subject: [PATCH 117/150] Matter increased polling frequency for local switches/occupancy (#19242) --- CHANGELOG.md | 1 + .../berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be | 2 +- .../berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be | 2 +- .../berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be | 2 +- .../src/solidify/solidified_Matter_Plugin_Sensor_Contact.h | 2 +- .../src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h | 2 +- .../src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h | 2 +- 7 files changed, 7 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5aa73e6..56ae54e9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - Berry `mqtt.publish` now distinguishes between `string` and `bytes` - IRremoteESP8266 library from v2.8.5 to v2.8.6 - Reduced log level for TeleInfo +- Matter increased polling frequency for local switches/occupancy ### Fixed - Initial battery level percentage (#19160) diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be index ae9b5097b..7b5fbf6fa 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Contact.be @@ -32,7 +32,7 @@ class Matter_Plugin_Sensor_Contact : Matter_Plugin_Device static var ARG = "switch" # additional argument name (or empty if none) static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var UPDATE_TIME = 5000 # update every 250ms + static var UPDATE_TIME = 750 # update every 750ms static var CLUSTERS = { 0x0045: [0,0xFFFC,0xFFFD], # Boolean State p.70 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be index 1400c55b0..6d2106849 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_Occupancy.be @@ -32,7 +32,7 @@ class Matter_Plugin_Sensor_Occupancy : Matter_Plugin_Device static var ARG = "switch" # additional argument name (or empty if none) static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var UPDATE_TIME = 5000 # update every 250ms + static var UPDATE_TIME = 750 # update every 750ms static var CLUSTERS = { 0x0406: [0,1,2,0xFFFC,0xFFFD], # Occupancy Sensing p.105 - no writable } diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be index 5f2858d68..0746ee49f 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Sensor_OnOff.be @@ -30,7 +30,7 @@ class Matter_Plugin_Sensor_OnOff : Matter_Plugin_Device static var ARG = "switch" # additional argument name (or empty if none) static var ARG_HINT = "Switch number" static var ARG_TYPE = / x -> int(x) # function to convert argument to the right type - static var UPDATE_TIME = 5000 # update every 250ms + static var UPDATE_TIME = 750 # update every 750ms static var CLUSTERS = { 0x0006: [0,0xFFFC,0xFFFD], # On/Off 1.5 p.48 } diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h index 3382434a3..00e5c533c 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Contact.h @@ -258,7 +258,7 @@ be_local_class(Matter_Plugin_Sensor_Contact, { be_const_key_weak(shadow_contact, -1), be_const_var(1) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(contact) }, { be_const_key_weak(ARG_TYPE, 5), be_const_static_closure(Matter_Plugin_Sensor_Contact__X3Clambda_X3E_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(750) }, { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(Contact) }, { be_const_key_weak(parse_configuration, 8), be_const_closure(Matter_Plugin_Sensor_Contact_parse_configuration_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h index 18a99659f..7d9f5f042 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_Occupancy.h @@ -272,7 +272,7 @@ be_local_class(Matter_Plugin_Sensor_Occupancy, { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin_Sensor_Occupancy__X3Clambda_X3E_closure) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(occupancy) }, { be_const_key_weak(ARG_HINT, 1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(750) }, { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_Sensor_Occupancy_parse_configuration_closure) }, { be_const_key_weak(tasmota_switch_index, -1), be_const_var(0) }, { be_const_key_weak(shadow_occupancy, 8), be_const_var(1) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h index 5e5c6a054..98a98f080 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Sensor_OnOff.h @@ -245,7 +245,7 @@ be_local_class(Matter_Plugin_Sensor_OnOff, { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(Switch_X3Cx_X3E_X20number) }, { be_const_key_weak(TYPE, -1), be_nested_str_weak(onoff) }, { be_const_key_weak(ARG_TYPE, 1), be_const_static_closure(Matter_Plugin_Sensor_OnOff__X3Clambda_X3E_closure) }, - { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, + { be_const_key_weak(UPDATE_TIME, -1), be_const_int(750) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_Sensor_OnOff_update_shadow_closure) }, { be_const_key_weak(NAME, -1), be_nested_str_weak(OnOff_X20Sensor) }, { be_const_key_weak(parse_configuration, 5), be_const_closure(Matter_Plugin_Sensor_OnOff_parse_configuration_closure) }, From df50a56c25c085bd5260aa82f1b9a541eb3337ea Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 2 Aug 2023 17:48:12 +0200 Subject: [PATCH 118/150] Fade would fail when the difference between start and target would be too small (#19246) --- CHANGELOG.md | 1 + tasmota/tasmota_xdrv_driver/xdrv_04_light.ino | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56ae54e9a..b81eac2b7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Initial battery level percentage (#19160) - Berry SK6812_GRBW crash (#19166) +- Fade would fail when the difference between start and target would be too small ### Removed diff --git a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino index f4b27dd10..6599fde21 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_04_light.ino @@ -2080,7 +2080,7 @@ bool LightApplyFade(void) { // did the value chanegd and needs to be applied Light.fade_duration = LightGetSpeedSetting() * 500; Light.speed_once_enabled = false; // The once off speed value has been read, reset it if (!Settings->flag5.fade_fixed_duration) { - Light.fade_duration = (distance * Light.fade_duration) / 1023; // time is proportional to distance, except with SO117 + Light.fade_duration = (distance * Light.fade_duration) / 1023 + 1 /* make sure value is not zero */; // time is proportional to distance, except with SO117 } if (Settings->save_data) { // Also postpone the save_data for the duration of the Fade (in seconds) From 76662ab236d6fd4b267f97144b228666cccfc38b Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Wed, 2 Aug 2023 23:00:26 +0200 Subject: [PATCH 119/150] Matter support for fabric_filtered request (for Google compatibility) (#19249) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Commissioning.be | 10 +- .../src/embedded/Matter_Device.be | 2 +- .../berry_matter/src/embedded/Matter_IM.be | 8 +- .../berry_matter/src/embedded/Matter_Path.be | 1 + .../src/embedded/Matter_Plugin_Root.be | 8 +- .../src/embedded/Matter_Session.be | 3 +- .../solidified_Matter_Commissioning.h | 163 +- .../src/solidify/solidified_Matter_IM.h | 242 +- .../src/solidify/solidified_Matter_Path.h | 73 +- .../solidify/solidified_Matter_Plugin_Root.h | 1240 ++++----- .../src/solidify/solidified_Matter_Session.h | 2250 +++++++++-------- 12 files changed, 2058 insertions(+), 1943 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b81eac2b7..1c1dbd298 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ All notable changes to this project will be documented in this file. - Support for multiple PCA9685 with extended functionality (#18805) - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature - Berry bytes `get` and `set` work for 3 bytes values +- Matter support for fabric_filtered request (for Google compatibility) ### Breaking Changed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be index 0ccc062c3..db7bc669e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Commissioning.be @@ -289,18 +289,22 @@ class Matter_Commisioning_Context import crypto # Validate Sigma1 Destination ID, p.162 # traverse all existing fabrics - tasmota.log("MTR: SEARCHING: destinationId=" + destinationId.tohex(), 4) + if tasmota.loglevel(4) + tasmota.log("MTR: SEARCHING: destinationId=" + destinationId.tohex(), 4) + end for fabric : self.device.sessions.fabrics if fabric.noc == nil || fabric.fabric_id == nil || fabric.device_id == nil continue end # compute candidateDestinationId, Section 4.13.2.4.1, “Destination Identifier” var destinationMessage = initiatorRandom + fabric.get_ca_pub() + fabric.fabric_id + fabric.device_id var key = fabric.get_ipk_group_key() - tasmota.log("MTR: SIGMA1: destinationMessage=" + destinationMessage.tohex(), 4) + # tasmota.log("MTR: SIGMA1: destinationMessage=" + destinationMessage.tohex(), 4) # tasmota.log("MTR: SIGMA1: key_ipk=" + key.tohex(), 4) var h = crypto.HMAC_SHA256(key) h.update(destinationMessage) var candidateDestinationId = h.out() - tasmota.log("MTR: SIGMA1: candidateDestinationId=" + candidateDestinationId.tohex(), 4) + if tasmota.loglevel(4) + tasmota.log("MTR: SIGMA1: candidateDestinationId=" + candidateDestinationId.tohex(), 4) + end if candidateDestinationId == destinationId return fabric end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 1a1575490..d9f58469e 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -431,7 +431,7 @@ class Matter_Device var fabric = session.get_fabric() var fabric_id = fabric.get_fabric_id().copy().reverse().tohex() var vendor_name = fabric.get_admin_vendor_name() - tasmota.log(format("MTR: --- Commissioning complete for Fabric '%s' (Vendor %s) ---", fabric_id, vendor_name), 2) + tasmota.log(f"MTR: --- Commissioning complete for Fabric '{fabric_id}' (Vendor {vendor_name}) ---", 2) self.stop_basic_commissioning() # by default close commissioning when it's complete end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index 1f60e6b51..3f37b7c1a 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -302,6 +302,7 @@ class Matter_IM ctx.endpoint = q.endpoint ctx.cluster = q.cluster ctx.attribute = q.attribute + ctx.fabric_filtered = query.fabric_filtered ctx.status = matter.UNSUPPORTED_ATTRIBUTE #default error if returned `nil` # expand endpoint @@ -772,8 +773,11 @@ class Matter_IM ctx.attribute = q.attribute attr_req.push(str(ctx)) end - tasmota.log(format("MTR: >Subscribe (%6i) %s (min=%i, max=%i, keep=%i) sub=%i", - msg.session.local_session_id, attr_req.concat(" "), sub.min_interval, sub.max_interval, query.keep_subscriptions ? 1 : 0, sub.subscription_id), 3) + tasmota.log(format("MTR: >Subscribe (%6i) %s (min=%i, max=%i, keep=%i) sub=%i fabric_filtered=%s", + msg.session.local_session_id, attr_req.concat(" "), sub.min_interval, sub.max_interval, query.keep_subscriptions ? 1 : 0, sub.subscription_id, query.fabric_filtered), 3) + if query.event_requests != nil && size(query.event_requests) > 0 + tasmota.log(f"MTR: >Subscribe (%6i) event_requests_size={size(query.event_requests)}", 3) + end var ret = self._inner_process_read_request(msg.session, query, true #-no_log-#) # ret is of type `Matter_ReportDataMessage` diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be index c22b87276..5dd1c7d77 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Path.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Path.be @@ -56,6 +56,7 @@ class Matter_Path s += (self.cluster != nil ? format("%04X/", self.cluster) : "****/") s += (self.attribute != nil ? format("%04X", self.attribute) : "") s += (self.command != nil ? format("%04X", self.command) : "") + if self.fabric_filtered s += "!" end if self.attribute == nil && self.command == nil s += "****" end return s except .. as e, m diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be index 6ff7c7d80..ff5c63db8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Plugin_Root.be @@ -155,7 +155,9 @@ class Matter_Plugin_Root : Matter_Plugin if attribute == 0x0000 # ---------- NOCs / list[NOCStruct] ---------- var nocl = TLV.Matter_TLV_array() # NOCs, p.711 - for loc_fabric: self.device.sessions.active_fabrics() + var fabs = ctx.fabric_filtered ? [session.get_fabric()] : self.device.sessions.active_fabrics() + for loc_fabric: fabs + if loc_fabric == nil continue end var nocs = nocl.add_struct(nil) nocs.add_TLV(1, TLV.B2, loc_fabric.get_noc()) # NOC nocs.add_TLV(2, TLV.B2, loc_fabric.get_icac()) # ICAC @@ -164,7 +166,9 @@ class Matter_Plugin_Root : Matter_Plugin return nocl elif attribute == 0x0001 # ---------- Fabrics / list[FabricDescriptorStruct] ---------- var fabrics = TLV.Matter_TLV_array() # Fabrics, p.711 - for loc_fabric: self.device.sessions.active_fabrics() + var fabs = ctx.fabric_filtered ? [session.get_fabric()] : self.device.sessions.active_fabrics() + for loc_fabric: fabs + if loc_fabric == nil continue end var root_ca_tlv = TLV.parse(loc_fabric.get_ca()) var fab = fabrics.add_struct(nil) # encoding see p.303 fab.add_TLV(1, TLV.B2, root_ca_tlv.findsubval(9)) # RootPublicKey diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be index 558da861e..dd17a0df0 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Session.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Session.be @@ -254,7 +254,8 @@ class Matter_Session : Matter_Expirable def get_icac() return self._fabric.icac end def get_ipk_epoch_key() return self._fabric.ipk_epoch_key end def get_fabric_id() return self._fabric.fabric_id end - def get_device_id() return self._fabric.device_id end + def get_fabric_index() return self._fabric ? self._fabric.fabric_index : nil end + def get_device_id() return self._fabric ? self._fabric.device_id : nil end def get_fabric_compressed() return self._fabric.fabric_compressed end def get_fabric_label() return self._fabric.fabric_label end def get_admin_subject() return self._fabric.admin_subject end diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h index 978e5a3aa..d4d7f5a9e 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Commissioning.h @@ -69,18 +69,18 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* ( &(const bvalue[19]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(log), - /* K3 */ be_nested_str_weak(MTR_X3A_X20SEARCHING_X3A_X20destinationId_X3D), - /* K4 */ be_nested_str_weak(tohex), - /* K5 */ be_nested_str_weak(device), - /* K6 */ be_nested_str_weak(sessions), - /* K7 */ be_nested_str_weak(fabrics), - /* K8 */ be_nested_str_weak(noc), - /* K9 */ be_nested_str_weak(fabric_id), - /* K10 */ be_nested_str_weak(device_id), - /* K11 */ be_nested_str_weak(get_ca_pub), - /* K12 */ be_nested_str_weak(get_ipk_group_key), - /* K13 */ be_nested_str_weak(MTR_X3A_X20SIGMA1_X3A_X20destinationMessage_X3D), + /* K2 */ be_nested_str_weak(loglevel), + /* K3 */ be_nested_str_weak(log), + /* K4 */ be_nested_str_weak(MTR_X3A_X20SEARCHING_X3A_X20destinationId_X3D), + /* K5 */ be_nested_str_weak(tohex), + /* K6 */ be_nested_str_weak(device), + /* K7 */ be_nested_str_weak(sessions), + /* K8 */ be_nested_str_weak(fabrics), + /* K9 */ be_nested_str_weak(noc), + /* K10 */ be_nested_str_weak(fabric_id), + /* K11 */ be_nested_str_weak(device_id), + /* K12 */ be_nested_str_weak(get_ca_pub), + /* K13 */ be_nested_str_weak(get_ipk_group_key), /* K14 */ be_nested_str_weak(HMAC_SHA256), /* K15 */ be_nested_str_weak(update), /* K16 */ be_nested_str_weak(out), @@ -89,77 +89,80 @@ be_local_closure(Matter_Commisioning_Context_find_fabric_by_destination_id, /* }), be_str_weak(find_fabric_by_destination_id), &be_const_str_solidified, - ( &(const binstruction[70]) { /* code */ + ( &(const binstruction[73]) { /* code */ 0xA40E0000, // 0000 IMPORT R3 K0 0xB8120200, // 0001 GETNGBL R4 K1 0x8C100902, // 0002 GETMET R4 R4 K2 - 0x8C180304, // 0003 GETMET R6 R1 K4 - 0x7C180200, // 0004 CALL R6 1 - 0x001A0606, // 0005 ADD R6 K3 R6 - 0x541E0003, // 0006 LDINT R7 4 - 0x7C100600, // 0007 CALL R4 3 - 0x60100010, // 0008 GETGBL R4 G16 - 0x88140105, // 0009 GETMBR R5 R0 K5 - 0x88140B06, // 000A GETMBR R5 R5 K6 - 0x88140B07, // 000B GETMBR R5 R5 K7 - 0x7C100200, // 000C CALL R4 1 - 0xA8020032, // 000D EXBLK 0 #0041 - 0x5C140800, // 000E MOVE R5 R4 - 0x7C140000, // 000F CALL R5 0 - 0x88180B08, // 0010 GETMBR R6 R5 K8 - 0x4C1C0000, // 0011 LDNIL R7 - 0x1C180C07, // 0012 EQ R6 R6 R7 - 0x741A0007, // 0013 JMPT R6 #001C - 0x88180B09, // 0014 GETMBR R6 R5 K9 - 0x4C1C0000, // 0015 LDNIL R7 - 0x1C180C07, // 0016 EQ R6 R6 R7 - 0x741A0003, // 0017 JMPT R6 #001C - 0x88180B0A, // 0018 GETMBR R6 R5 K10 - 0x4C1C0000, // 0019 LDNIL R7 - 0x1C180C07, // 001A EQ R6 R6 R7 - 0x781A0000, // 001B JMPF R6 #001D - 0x7001FFF0, // 001C JMP #000E - 0x8C180B0B, // 001D GETMET R6 R5 K11 - 0x7C180200, // 001E CALL R6 1 - 0x00180406, // 001F ADD R6 R2 R6 - 0x881C0B09, // 0020 GETMBR R7 R5 K9 - 0x00180C07, // 0021 ADD R6 R6 R7 - 0x881C0B0A, // 0022 GETMBR R7 R5 K10 - 0x00180C07, // 0023 ADD R6 R6 R7 - 0x8C1C0B0C, // 0024 GETMET R7 R5 K12 - 0x7C1C0200, // 0025 CALL R7 1 - 0xB8220200, // 0026 GETNGBL R8 K1 - 0x8C201102, // 0027 GETMET R8 R8 K2 - 0x8C280D04, // 0028 GETMET R10 R6 K4 - 0x7C280200, // 0029 CALL R10 1 - 0x002A1A0A, // 002A ADD R10 K13 R10 - 0x542E0003, // 002B LDINT R11 4 - 0x7C200600, // 002C CALL R8 3 - 0x8C20070E, // 002D GETMET R8 R3 K14 - 0x5C280E00, // 002E MOVE R10 R7 - 0x7C200400, // 002F CALL R8 2 - 0x8C24110F, // 0030 GETMET R9 R8 K15 - 0x5C2C0C00, // 0031 MOVE R11 R6 - 0x7C240400, // 0032 CALL R9 2 - 0x8C241110, // 0033 GETMET R9 R8 K16 - 0x7C240200, // 0034 CALL R9 1 - 0xB82A0200, // 0035 GETNGBL R10 K1 - 0x8C281502, // 0036 GETMET R10 R10 K2 - 0x8C301304, // 0037 GETMET R12 R9 K4 - 0x7C300200, // 0038 CALL R12 1 - 0x0032220C, // 0039 ADD R12 K17 R12 - 0x54360003, // 003A LDINT R13 4 - 0x7C280600, // 003B CALL R10 3 - 0x1C281201, // 003C EQ R10 R9 R1 - 0x782A0001, // 003D JMPF R10 #0040 - 0xA8040001, // 003E EXBLK 1 1 - 0x80040A00, // 003F RET 1 R5 - 0x7001FFCC, // 0040 JMP #000E - 0x58100012, // 0041 LDCONST R4 K18 - 0xAC100200, // 0042 CATCH R4 1 0 - 0xB0080000, // 0043 RAISE 2 R0 R0 - 0x4C100000, // 0044 LDNIL R4 - 0x80040800, // 0045 RET 1 R4 + 0x541A0003, // 0003 LDINT R6 4 + 0x7C100400, // 0004 CALL R4 2 + 0x78120006, // 0005 JMPF R4 #000D + 0xB8120200, // 0006 GETNGBL R4 K1 + 0x8C100903, // 0007 GETMET R4 R4 K3 + 0x8C180305, // 0008 GETMET R6 R1 K5 + 0x7C180200, // 0009 CALL R6 1 + 0x001A0806, // 000A ADD R6 K4 R6 + 0x541E0003, // 000B LDINT R7 4 + 0x7C100600, // 000C CALL R4 3 + 0x60100010, // 000D GETGBL R4 G16 + 0x88140106, // 000E GETMBR R5 R0 K6 + 0x88140B07, // 000F GETMBR R5 R5 K7 + 0x88140B08, // 0010 GETMBR R5 R5 K8 + 0x7C100200, // 0011 CALL R4 1 + 0xA8020030, // 0012 EXBLK 0 #0044 + 0x5C140800, // 0013 MOVE R5 R4 + 0x7C140000, // 0014 CALL R5 0 + 0x88180B09, // 0015 GETMBR R6 R5 K9 + 0x4C1C0000, // 0016 LDNIL R7 + 0x1C180C07, // 0017 EQ R6 R6 R7 + 0x741A0007, // 0018 JMPT R6 #0021 + 0x88180B0A, // 0019 GETMBR R6 R5 K10 + 0x4C1C0000, // 001A LDNIL R7 + 0x1C180C07, // 001B EQ R6 R6 R7 + 0x741A0003, // 001C JMPT R6 #0021 + 0x88180B0B, // 001D GETMBR R6 R5 K11 + 0x4C1C0000, // 001E LDNIL R7 + 0x1C180C07, // 001F EQ R6 R6 R7 + 0x781A0000, // 0020 JMPF R6 #0022 + 0x7001FFF0, // 0021 JMP #0013 + 0x8C180B0C, // 0022 GETMET R6 R5 K12 + 0x7C180200, // 0023 CALL R6 1 + 0x00180406, // 0024 ADD R6 R2 R6 + 0x881C0B0A, // 0025 GETMBR R7 R5 K10 + 0x00180C07, // 0026 ADD R6 R6 R7 + 0x881C0B0B, // 0027 GETMBR R7 R5 K11 + 0x00180C07, // 0028 ADD R6 R6 R7 + 0x8C1C0B0D, // 0029 GETMET R7 R5 K13 + 0x7C1C0200, // 002A CALL R7 1 + 0x8C20070E, // 002B GETMET R8 R3 K14 + 0x5C280E00, // 002C MOVE R10 R7 + 0x7C200400, // 002D CALL R8 2 + 0x8C24110F, // 002E GETMET R9 R8 K15 + 0x5C2C0C00, // 002F MOVE R11 R6 + 0x7C240400, // 0030 CALL R9 2 + 0x8C241110, // 0031 GETMET R9 R8 K16 + 0x7C240200, // 0032 CALL R9 1 + 0xB82A0200, // 0033 GETNGBL R10 K1 + 0x8C281502, // 0034 GETMET R10 R10 K2 + 0x54320003, // 0035 LDINT R12 4 + 0x7C280400, // 0036 CALL R10 2 + 0x782A0006, // 0037 JMPF R10 #003F + 0xB82A0200, // 0038 GETNGBL R10 K1 + 0x8C281503, // 0039 GETMET R10 R10 K3 + 0x8C301305, // 003A GETMET R12 R9 K5 + 0x7C300200, // 003B CALL R12 1 + 0x0032220C, // 003C ADD R12 K17 R12 + 0x54360003, // 003D LDINT R13 4 + 0x7C280600, // 003E CALL R10 3 + 0x1C281201, // 003F EQ R10 R9 R1 + 0x782A0001, // 0040 JMPF R10 #0043 + 0xA8040001, // 0041 EXBLK 1 1 + 0x80040A00, // 0042 RET 1 R5 + 0x7001FFCE, // 0043 JMP #0013 + 0x58100012, // 0044 LDCONST R4 K18 + 0xAC100200, // 0045 CATCH R4 1 0 + 0xB0080000, // 0046 RAISE 2 R0 R0 + 0x4C100000, // 0047 LDNIL R4 + 0x80040800, // 0048 RET 1 R4 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h index ec19acea4..1f0c8faec 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_IM.h @@ -2429,7 +2429,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ + ( &(const bvalue[24]) { /* constants */ /* K0 */ be_nested_str_weak(device), /* K1 */ be_nested_str_weak(get_active_endpoints), /* K2 */ be_nested_str_weak(matter), @@ -2440,23 +2440,24 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ /* K7 */ be_nested_str_weak(endpoint), /* K8 */ be_nested_str_weak(cluster), /* K9 */ be_nested_str_weak(attribute), - /* K10 */ be_nested_str_weak(status), - /* K11 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), - /* K12 */ be_nested_str_weak(get_attribute_name), - /* K13 */ be_nested_str_weak(tasmota), - /* K14 */ be_nested_str_weak(log), - /* K15 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s), - /* K16 */ be_nested_str_weak(local_session_id), - /* K17 */ be_nested_str_weak(_X20_X28), - /* K18 */ be_nested_str_weak(_X29), - /* K19 */ be_nested_str_weak(), - /* K20 */ be_const_int(3), - /* K21 */ be_nested_str_weak(process_attribute_expansion), - /* K22 */ be_nested_str_weak(stop_iteration), + /* K10 */ be_nested_str_weak(fabric_filtered), + /* K11 */ be_nested_str_weak(status), + /* K12 */ be_nested_str_weak(UNSUPPORTED_ATTRIBUTE), + /* K13 */ be_nested_str_weak(get_attribute_name), + /* K14 */ be_nested_str_weak(tasmota), + /* K15 */ be_nested_str_weak(log), + /* K16 */ be_nested_str_weak(MTR_X3A_X20_X3ERead_Attr_X20_X28_X256i_X29_X20_X25s), + /* K17 */ be_nested_str_weak(local_session_id), + /* K18 */ be_nested_str_weak(_X20_X28), + /* K19 */ be_nested_str_weak(_X29), + /* K20 */ be_nested_str_weak(), + /* K21 */ be_const_int(3), + /* K22 */ be_nested_str_weak(process_attribute_expansion), + /* K23 */ be_nested_str_weak(stop_iteration), }), be_str_weak(_inner_process_read_request), &be_const_str_solidified, - ( &(const binstruction[93]) { /* code */ + ( &(const binstruction[95]) { /* code */ 0x84100000, // 0000 CLOSURE R4 P0 0x88140100, // 0001 GETMBR R5 R0 K0 0x8C140B01, // 0002 GETMET R5 R5 K1 @@ -2473,7 +2474,7 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0x60200010, // 000D GETGBL R8 G16 0x88240506, // 000E GETMBR R9 R2 K6 0x7C200200, // 000F CALL R8 1 - 0xA8020046, // 0010 EXBLK 0 #0058 + 0xA8020048, // 0010 EXBLK 0 #005A 0x5C241000, // 0011 MOVE R9 R8 0x7C240000, // 0012 CALL R9 0 0x88281307, // 0013 GETMBR R10 R9 K7 @@ -2482,74 +2483,76 @@ be_local_closure(Matter_IM__inner_process_read_request, /* name */ 0x901A100A, // 0016 SETMBR R6 K8 R10 0x88281309, // 0017 GETMBR R10 R9 K9 0x901A120A, // 0018 SETMBR R6 K9 R10 - 0xB82A0400, // 0019 GETNGBL R10 K2 - 0x8828150B, // 001A GETMBR R10 R10 K11 - 0x901A140A, // 001B SETMBR R6 K10 R10 - 0x88280D07, // 001C GETMBR R10 R6 K7 - 0x4C2C0000, // 001D LDNIL R11 - 0x1C28140B, // 001E EQ R10 R10 R11 - 0x742A0007, // 001F JMPT R10 #0028 - 0x88280D08, // 0020 GETMBR R10 R6 K8 - 0x4C2C0000, // 0021 LDNIL R11 - 0x1C28140B, // 0022 EQ R10 R10 R11 - 0x742A0003, // 0023 JMPT R10 #0028 - 0x88280D09, // 0024 GETMBR R10 R6 K9 - 0x4C2C0000, // 0025 LDNIL R11 - 0x1C28140B, // 0026 EQ R10 R10 R11 - 0x782A0029, // 0027 JMPF R10 #0052 - 0x88280D08, // 0028 GETMBR R10 R6 K8 - 0x4C2C0000, // 0029 LDNIL R11 - 0x2028140B, // 002A NE R10 R10 R11 - 0x782A001A, // 002B JMPF R10 #0047 - 0x88280D09, // 002C GETMBR R10 R6 K9 - 0x4C2C0000, // 002D LDNIL R11 - 0x2028140B, // 002E NE R10 R10 R11 - 0x782A0016, // 002F JMPF R10 #0047 - 0xB82A0400, // 0030 GETNGBL R10 K2 - 0x8C28150C, // 0031 GETMET R10 R10 K12 - 0x88300D08, // 0032 GETMBR R12 R6 K8 - 0x88340D09, // 0033 GETMBR R13 R6 K9 - 0x7C280600, // 0034 CALL R10 3 - 0xB82E1A00, // 0035 GETNGBL R11 K13 - 0x8C2C170E, // 0036 GETMET R11 R11 K14 - 0x60340018, // 0037 GETGBL R13 G24 - 0x5838000F, // 0038 LDCONST R14 K15 - 0x883C0310, // 0039 GETMBR R15 R1 K16 - 0x60400008, // 003A GETGBL R16 G8 - 0x5C440C00, // 003B MOVE R17 R6 - 0x7C400200, // 003C CALL R16 1 - 0x782A0002, // 003D JMPF R10 #0041 - 0x0046220A, // 003E ADD R17 K17 R10 - 0x00442312, // 003F ADD R17 R17 K18 - 0x70020000, // 0040 JMP #0042 - 0x58440013, // 0041 LDCONST R17 K19 - 0x00402011, // 0042 ADD R16 R16 R17 - 0x7C340600, // 0043 CALL R13 3 - 0x58380014, // 0044 LDCONST R14 K20 - 0x7C2C0600, // 0045 CALL R11 3 - 0x7002000A, // 0046 JMP #0052 - 0xB82A1A00, // 0047 GETNGBL R10 K13 - 0x8C28150E, // 0048 GETMET R10 R10 K14 - 0x60300018, // 0049 GETGBL R12 G24 - 0x5834000F, // 004A LDCONST R13 K15 - 0x88380310, // 004B GETMBR R14 R1 K16 - 0x603C0008, // 004C GETGBL R15 G8 - 0x5C400C00, // 004D MOVE R16 R6 - 0x7C3C0200, // 004E CALL R15 1 - 0x7C300600, // 004F CALL R12 3 - 0x58340014, // 0050 LDCONST R13 K20 - 0x7C280600, // 0051 CALL R10 3 - 0x88280100, // 0052 GETMBR R10 R0 K0 - 0x8C281515, // 0053 GETMET R10 R10 K21 - 0x5C300C00, // 0054 MOVE R12 R6 - 0x84340001, // 0055 CLOSURE R13 P1 - 0x7C280600, // 0056 CALL R10 3 - 0x7001FFB8, // 0057 JMP #0011 - 0x58200016, // 0058 LDCONST R8 K22 - 0xAC200200, // 0059 CATCH R8 1 0 - 0xB0080000, // 005A RAISE 2 R0 R0 - 0xA0000000, // 005B CLOSE R0 - 0x80040E00, // 005C RET 1 R7 + 0x8828050A, // 0019 GETMBR R10 R2 K10 + 0x901A140A, // 001A SETMBR R6 K10 R10 + 0xB82A0400, // 001B GETNGBL R10 K2 + 0x8828150C, // 001C GETMBR R10 R10 K12 + 0x901A160A, // 001D SETMBR R6 K11 R10 + 0x88280D07, // 001E GETMBR R10 R6 K7 + 0x4C2C0000, // 001F LDNIL R11 + 0x1C28140B, // 0020 EQ R10 R10 R11 + 0x742A0007, // 0021 JMPT R10 #002A + 0x88280D08, // 0022 GETMBR R10 R6 K8 + 0x4C2C0000, // 0023 LDNIL R11 + 0x1C28140B, // 0024 EQ R10 R10 R11 + 0x742A0003, // 0025 JMPT R10 #002A + 0x88280D09, // 0026 GETMBR R10 R6 K9 + 0x4C2C0000, // 0027 LDNIL R11 + 0x1C28140B, // 0028 EQ R10 R10 R11 + 0x782A0029, // 0029 JMPF R10 #0054 + 0x88280D08, // 002A GETMBR R10 R6 K8 + 0x4C2C0000, // 002B LDNIL R11 + 0x2028140B, // 002C NE R10 R10 R11 + 0x782A001A, // 002D JMPF R10 #0049 + 0x88280D09, // 002E GETMBR R10 R6 K9 + 0x4C2C0000, // 002F LDNIL R11 + 0x2028140B, // 0030 NE R10 R10 R11 + 0x782A0016, // 0031 JMPF R10 #0049 + 0xB82A0400, // 0032 GETNGBL R10 K2 + 0x8C28150D, // 0033 GETMET R10 R10 K13 + 0x88300D08, // 0034 GETMBR R12 R6 K8 + 0x88340D09, // 0035 GETMBR R13 R6 K9 + 0x7C280600, // 0036 CALL R10 3 + 0xB82E1C00, // 0037 GETNGBL R11 K14 + 0x8C2C170F, // 0038 GETMET R11 R11 K15 + 0x60340018, // 0039 GETGBL R13 G24 + 0x58380010, // 003A LDCONST R14 K16 + 0x883C0311, // 003B GETMBR R15 R1 K17 + 0x60400008, // 003C GETGBL R16 G8 + 0x5C440C00, // 003D MOVE R17 R6 + 0x7C400200, // 003E CALL R16 1 + 0x782A0002, // 003F JMPF R10 #0043 + 0x0046240A, // 0040 ADD R17 K18 R10 + 0x00442313, // 0041 ADD R17 R17 K19 + 0x70020000, // 0042 JMP #0044 + 0x58440014, // 0043 LDCONST R17 K20 + 0x00402011, // 0044 ADD R16 R16 R17 + 0x7C340600, // 0045 CALL R13 3 + 0x58380015, // 0046 LDCONST R14 K21 + 0x7C2C0600, // 0047 CALL R11 3 + 0x7002000A, // 0048 JMP #0054 + 0xB82A1C00, // 0049 GETNGBL R10 K14 + 0x8C28150F, // 004A GETMET R10 R10 K15 + 0x60300018, // 004B GETGBL R12 G24 + 0x58340010, // 004C LDCONST R13 K16 + 0x88380311, // 004D GETMBR R14 R1 K17 + 0x603C0008, // 004E GETGBL R15 G8 + 0x5C400C00, // 004F MOVE R16 R6 + 0x7C3C0200, // 0050 CALL R15 1 + 0x7C300600, // 0051 CALL R12 3 + 0x58340015, // 0052 LDCONST R13 K21 + 0x7C280600, // 0053 CALL R10 3 + 0x88280100, // 0054 GETMBR R10 R0 K0 + 0x8C281516, // 0055 GETMET R10 R10 K22 + 0x5C300C00, // 0056 MOVE R12 R6 + 0x84340001, // 0057 CLOSURE R13 P1 + 0x7C280600, // 0058 CALL R10 3 + 0x7001FFB6, // 0059 JMP #0011 + 0x58200017, // 005A LDCONST R8 K23 + 0xAC200200, // 005B CATCH R8 1 0 + 0xB0080000, // 005C RAISE 2 R0 R0 + 0xA0000000, // 005D CLOSE R0 + 0x80040E00, // 005E RET 1 R7 }) ) ); @@ -3271,7 +3274,7 @@ be_local_closure(Matter_IM_expire_sendqueue, /* name */ ********************************************************************/ be_local_closure(Matter_IM_subscribe_request, /* name */ be_nested_proto( - 17, /* nstack */ + 18, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -3279,7 +3282,7 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[30]) { /* constants */ + ( &(const bvalue[33]) { /* constants */ /* K0 */ be_nested_str_weak(matter), /* K1 */ be_nested_str_weak(SubscribeRequestMessage), /* K2 */ be_nested_str_weak(from_TLV), @@ -3298,7 +3301,7 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ /* K15 */ be_nested_str_weak(stop_iteration), /* K16 */ be_nested_str_weak(tasmota), /* K17 */ be_nested_str_weak(log), - /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i), + /* K18 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X256i_X29_X20_X25s_X20_X28min_X3D_X25i_X2C_X20max_X3D_X25i_X2C_X20keep_X3D_X25i_X29_X20sub_X3D_X25i_X20fabric_filtered_X3D_X25s), /* K19 */ be_nested_str_weak(local_session_id), /* K20 */ be_nested_str_weak(concat), /* K21 */ be_nested_str_weak(_X20), @@ -3307,13 +3310,16 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ /* K24 */ be_const_int(1), /* K25 */ be_const_int(0), /* K26 */ be_nested_str_weak(subscription_id), - /* K27 */ be_const_int(3), - /* K28 */ be_nested_str_weak(_inner_process_read_request), - /* K29 */ be_nested_str_weak(send_subscribe_response), + /* K27 */ be_nested_str_weak(fabric_filtered), + /* K28 */ be_const_int(3), + /* K29 */ be_nested_str_weak(event_requests), + /* K30 */ be_nested_str_weak(MTR_X3A_X20_X3ESubscribe_X20_X28_X25_X256i_X29_X20event_requests_size_X3D_X25s), + /* K31 */ be_nested_str_weak(_inner_process_read_request), + /* K32 */ be_nested_str_weak(send_subscribe_response), }), be_str_weak(subscribe_request), &be_const_str_solidified, - ( &(const binstruction[78]) { /* code */ + ( &(const binstruction[98]) { /* code */ 0xB80E0000, // 0000 GETNGBL R3 K0 0x8C0C0701, // 0001 GETMET R3 R3 K1 0x7C0C0200, // 0002 CALL R3 1 @@ -3375,23 +3381,43 @@ be_local_closure(Matter_IM_subscribe_request, /* name */ 0x70020000, // 003A JMP #003C 0x583C0019, // 003B LDCONST R15 K25 0x8840091A, // 003C GETMBR R16 R4 K26 - 0x7C240E00, // 003D CALL R9 7 - 0x5828001B, // 003E LDCONST R10 K27 - 0x7C1C0600, // 003F CALL R7 3 - 0x8C1C011C, // 0040 GETMET R7 R0 K28 - 0x88240306, // 0041 GETMBR R9 R1 K6 - 0x5C280600, // 0042 MOVE R10 R3 - 0x502C0200, // 0043 LDBOOL R11 1 0 - 0x7C1C0800, // 0044 CALL R7 4 - 0x8820091A, // 0045 GETMBR R8 R4 K26 - 0x901E3408, // 0046 SETMBR R7 K26 R8 - 0x8C20011D, // 0047 GETMET R8 R0 K29 - 0x5C280200, // 0048 MOVE R10 R1 - 0x5C2C0E00, // 0049 MOVE R11 R7 - 0x5C300800, // 004A MOVE R12 R4 - 0x7C200800, // 004B CALL R8 4 - 0x50200200, // 004C LDBOOL R8 1 0 - 0x80041000, // 004D RET 1 R8 + 0x8844071B, // 003D GETMBR R17 R3 K27 + 0x7C241000, // 003E CALL R9 8 + 0x5828001C, // 003F LDCONST R10 K28 + 0x7C1C0600, // 0040 CALL R7 3 + 0x881C071D, // 0041 GETMBR R7 R3 K29 + 0x4C200000, // 0042 LDNIL R8 + 0x201C0E08, // 0043 NE R7 R7 R8 + 0x781E000E, // 0044 JMPF R7 #0054 + 0x601C000C, // 0045 GETGBL R7 G12 + 0x8820071D, // 0046 GETMBR R8 R3 K29 + 0x7C1C0200, // 0047 CALL R7 1 + 0x241C0F19, // 0048 GT R7 R7 K25 + 0x781E0009, // 0049 JMPF R7 #0054 + 0xB81E2000, // 004A GETNGBL R7 K16 + 0x8C1C0F11, // 004B GETMET R7 R7 K17 + 0x60240018, // 004C GETGBL R9 G24 + 0x5828001E, // 004D LDCONST R10 K30 + 0x602C000C, // 004E GETGBL R11 G12 + 0x8830071D, // 004F GETMBR R12 R3 K29 + 0x7C2C0200, // 0050 CALL R11 1 + 0x7C240400, // 0051 CALL R9 2 + 0x5828001C, // 0052 LDCONST R10 K28 + 0x7C1C0600, // 0053 CALL R7 3 + 0x8C1C011F, // 0054 GETMET R7 R0 K31 + 0x88240306, // 0055 GETMBR R9 R1 K6 + 0x5C280600, // 0056 MOVE R10 R3 + 0x502C0200, // 0057 LDBOOL R11 1 0 + 0x7C1C0800, // 0058 CALL R7 4 + 0x8820091A, // 0059 GETMBR R8 R4 K26 + 0x901E3408, // 005A SETMBR R7 K26 R8 + 0x8C200120, // 005B GETMET R8 R0 K32 + 0x5C280200, // 005C MOVE R10 R1 + 0x5C2C0E00, // 005D MOVE R11 R7 + 0x5C300800, // 005E MOVE R12 R4 + 0x7C200800, // 005F CALL R8 4 + 0x50200200, // 0060 LDBOOL R8 1 0 + 0x80041000, // 0061 RET 1 R8 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h index b299cc24b..bab7d9909 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Path.h @@ -19,7 +19,7 @@ be_local_closure(Matter_Path_tostring, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[13]) { /* constants */ + ( &(const bvalue[15]) { /* constants */ /* K0 */ be_nested_str_weak(), /* K1 */ be_nested_str_weak(endpoint), /* K2 */ be_nested_str_weak(_X5B_X2502X_X5D), @@ -30,14 +30,16 @@ be_local_closure(Matter_Path_tostring, /* name */ /* K7 */ be_nested_str_weak(attribute), /* K8 */ be_nested_str_weak(_X2504X), /* K9 */ be_nested_str_weak(command), - /* K10 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), - /* K11 */ be_nested_str_weak(Exception_X3E_X20), - /* K12 */ be_nested_str_weak(_X2C_X20), + /* K10 */ be_nested_str_weak(fabric_filtered), + /* K11 */ be_nested_str_weak(_X21), + /* K12 */ be_nested_str_weak(_X2A_X2A_X2A_X2A), + /* K13 */ be_nested_str_weak(Exception_X3E_X20), + /* K14 */ be_nested_str_weak(_X2C_X20), }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[74]) { /* code */ - 0xA8020039, // 0000 EXBLK 0 #003B + ( &(const binstruction[77]) { /* code */ + 0xA802003C, // 0000 EXBLK 0 #003E 0x58040000, // 0001 LDCONST R1 K0 0x88080101, // 0002 GETMBR R2 R0 K1 0x4C0C0000, // 0003 LDNIL R3 @@ -83,34 +85,37 @@ be_local_closure(Matter_Path_tostring, /* name */ 0x70020000, // 002B JMP #002D 0x58080000, // 002C LDCONST R2 K0 0x00040202, // 002D ADD R1 R1 R2 - 0x88080107, // 002E GETMBR R2 R0 K7 - 0x4C0C0000, // 002F LDNIL R3 - 0x1C080403, // 0030 EQ R2 R2 R3 - 0x780A0004, // 0031 JMPF R2 #0037 - 0x88080109, // 0032 GETMBR R2 R0 K9 - 0x4C0C0000, // 0033 LDNIL R3 - 0x1C080403, // 0034 EQ R2 R2 R3 - 0x780A0000, // 0035 JMPF R2 #0037 - 0x0004030A, // 0036 ADD R1 R1 K10 - 0xA8040001, // 0037 EXBLK 1 1 - 0x80040200, // 0038 RET 1 R1 - 0xA8040001, // 0039 EXBLK 1 1 - 0x7002000D, // 003A JMP #0049 - 0xAC040002, // 003B CATCH R1 0 2 - 0x7002000A, // 003C JMP #0048 - 0x600C0008, // 003D GETGBL R3 G8 - 0x5C100200, // 003E MOVE R4 R1 - 0x7C0C0200, // 003F CALL R3 1 - 0x000E1603, // 0040 ADD R3 K11 R3 - 0x000C070C, // 0041 ADD R3 R3 K12 - 0x60100008, // 0042 GETGBL R4 G8 - 0x5C140400, // 0043 MOVE R5 R2 - 0x7C100200, // 0044 CALL R4 1 - 0x000C0604, // 0045 ADD R3 R3 R4 - 0x80040600, // 0046 RET 1 R3 - 0x70020000, // 0047 JMP #0049 - 0xB0080000, // 0048 RAISE 2 R0 R0 - 0x80000000, // 0049 RET 0 + 0x8808010A, // 002E GETMBR R2 R0 K10 + 0x780A0000, // 002F JMPF R2 #0031 + 0x0004030B, // 0030 ADD R1 R1 K11 + 0x88080107, // 0031 GETMBR R2 R0 K7 + 0x4C0C0000, // 0032 LDNIL R3 + 0x1C080403, // 0033 EQ R2 R2 R3 + 0x780A0004, // 0034 JMPF R2 #003A + 0x88080109, // 0035 GETMBR R2 R0 K9 + 0x4C0C0000, // 0036 LDNIL R3 + 0x1C080403, // 0037 EQ R2 R2 R3 + 0x780A0000, // 0038 JMPF R2 #003A + 0x0004030C, // 0039 ADD R1 R1 K12 + 0xA8040001, // 003A EXBLK 1 1 + 0x80040200, // 003B RET 1 R1 + 0xA8040001, // 003C EXBLK 1 1 + 0x7002000D, // 003D JMP #004C + 0xAC040002, // 003E CATCH R1 0 2 + 0x7002000A, // 003F JMP #004B + 0x600C0008, // 0040 GETGBL R3 G8 + 0x5C100200, // 0041 MOVE R4 R1 + 0x7C0C0200, // 0042 CALL R3 1 + 0x000E1A03, // 0043 ADD R3 K13 R3 + 0x000C070E, // 0044 ADD R3 R3 K14 + 0x60100008, // 0045 GETGBL R4 G8 + 0x5C140400, // 0046 MOVE R5 R2 + 0x7C100200, // 0047 CALL R4 1 + 0x000C0604, // 0048 ADD R3 R3 R4 + 0x80040600, // 0049 RET 1 R3 + 0x70020000, // 004A JMP #004C + 0xB0080000, // 004B RAISE 2 R0 R0 + 0x80000000, // 004C RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 56c6ff303..12725f394 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -885,7 +885,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[91]) { /* constants */ + ( &(const bvalue[93]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -939,48 +939,50 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /* K50 */ be_nested_str_weak(local), /* K51 */ be_nested_str_weak(send_ack_now), /* K52 */ be_nested_str_weak(msg), - /* K53 */ be_nested_str_weak(device), - /* K54 */ be_nested_str_weak(sessions), - /* K55 */ be_nested_str_weak(active_fabrics), - /* K56 */ be_nested_str_weak(B2), - /* K57 */ be_nested_str_weak(get_noc), - /* K58 */ be_nested_str_weak(get_icac), - /* K59 */ be_nested_str_weak(get_fabric_index), - /* K60 */ be_nested_str_weak(stop_iteration), - /* K61 */ be_nested_str_weak(parse), - /* K62 */ be_nested_str_weak(get_ca), - /* K63 */ be_nested_str_weak(findsubval), - /* K64 */ be_nested_str_weak(get_admin_vendor), - /* K65 */ be_nested_str_weak(get_fabric_id), - /* K66 */ be_nested_str_weak(get_device_id), - /* K67 */ be_nested_str_weak(get_fabric_label), - /* K68 */ be_nested_str_weak(Fabric), - /* K69 */ be_nested_str_weak(_MAX_CASE), - /* K70 */ be_nested_str_weak(count_active_fabrics), - /* K71 */ be_nested_str_weak(_fabric), - /* K72 */ be_nested_str_weak(is_commissioning_open), - /* K73 */ be_nested_str_weak(is_root_commissioning_open), - /* K74 */ be_nested_str_weak(commissioning_admin_fabric), - /* K75 */ be_nested_str_weak(Tasmota), - /* K76 */ be_nested_str_weak(vendorid), - /* K77 */ be_nested_str_weak(DeviceName), - /* K78 */ be_nested_str_weak(FriendlyName), - /* K79 */ be_nested_str_weak(FriendlyName1), - /* K80 */ be_nested_str_weak(XX), - /* K81 */ be_nested_str_weak(Status_X202), - /* K82 */ be_nested_str_weak(StatusFWR), - /* K83 */ be_nested_str_weak(Hardware), - /* K84 */ be_nested_str_weak(Version), - /* K85 */ be_nested_str_weak(_X28), - /* K86 */ be_nested_str_weak(locale), - /* K87 */ be_nested_str_weak(create_TLV), - /* K88 */ be_nested_str_weak(get_active_endpoints), - /* K89 */ be_nested_str_weak(disable_bridge_mode), - /* K90 */ be_nested_str_weak(read_attribute), + /* K53 */ be_nested_str_weak(fabric_filtered), + /* K54 */ be_nested_str_weak(get_fabric), + /* K55 */ be_nested_str_weak(device), + /* K56 */ be_nested_str_weak(sessions), + /* K57 */ be_nested_str_weak(active_fabrics), + /* K58 */ be_nested_str_weak(B2), + /* K59 */ be_nested_str_weak(get_noc), + /* K60 */ be_nested_str_weak(get_icac), + /* K61 */ be_nested_str_weak(get_fabric_index), + /* K62 */ be_nested_str_weak(stop_iteration), + /* K63 */ be_nested_str_weak(parse), + /* K64 */ be_nested_str_weak(get_ca), + /* K65 */ be_nested_str_weak(findsubval), + /* K66 */ be_nested_str_weak(get_admin_vendor), + /* K67 */ be_nested_str_weak(get_fabric_id), + /* K68 */ be_nested_str_weak(get_device_id), + /* K69 */ be_nested_str_weak(get_fabric_label), + /* K70 */ be_nested_str_weak(Fabric), + /* K71 */ be_nested_str_weak(_MAX_CASE), + /* K72 */ be_nested_str_weak(count_active_fabrics), + /* K73 */ be_nested_str_weak(_fabric), + /* K74 */ be_nested_str_weak(is_commissioning_open), + /* K75 */ be_nested_str_weak(is_root_commissioning_open), + /* K76 */ be_nested_str_weak(commissioning_admin_fabric), + /* K77 */ be_nested_str_weak(Tasmota), + /* K78 */ be_nested_str_weak(vendorid), + /* K79 */ be_nested_str_weak(DeviceName), + /* K80 */ be_nested_str_weak(FriendlyName), + /* K81 */ be_nested_str_weak(FriendlyName1), + /* K82 */ be_nested_str_weak(XX), + /* K83 */ be_nested_str_weak(Status_X202), + /* K84 */ be_nested_str_weak(StatusFWR), + /* K85 */ be_nested_str_weak(Hardware), + /* K86 */ be_nested_str_weak(Version), + /* K87 */ be_nested_str_weak(_X28), + /* K88 */ be_nested_str_weak(locale), + /* K89 */ be_nested_str_weak(create_TLV), + /* K90 */ be_nested_str_weak(get_active_endpoints), + /* K91 */ be_nested_str_weak(disable_bridge_mode), + /* K92 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, - ( &(const binstruction[911]) { /* code */ + ( &(const binstruction[937]) { /* code */ 0xA4120000, // 0000 IMPORT R4 K0 0xB8160200, // 0001 GETNGBL R5 K1 0x88140B02, // 0002 GETMBR R5 R5 K2 @@ -1037,11 +1039,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x502C0000, // 0035 LDBOOL R11 0 0 0x7C200600, // 0036 CALL R8 3 0x80041000, // 0037 RET 1 R8 - 0x70020354, // 0038 JMP #038E + 0x7002036E, // 0038 JMP #03A8 0x54220031, // 0039 LDINT R8 50 0x1C200C08, // 003A EQ R8 R6 R8 0x78220000, // 003B JMPF R8 #003D - 0x70020350, // 003C JMP #038E + 0x7002036A, // 003C JMP #03A8 0x54220032, // 003D LDINT R8 51 0x1C200C08, // 003E EQ R8 R6 R8 0x782200DC, // 003F JMPF R8 #011D @@ -1265,11 +1267,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x502C0000, // 0119 LDBOOL R11 0 0 0x7C200600, // 011A CALL R8 3 0x80041000, // 011B RET 1 R8 - 0x70020270, // 011C JMP #038E + 0x7002028A, // 011C JMP #03A8 0x54220033, // 011D LDINT R8 52 0x1C200C08, // 011E EQ R8 R6 R8 0x78220000, // 011F JMPF R8 #0121 - 0x7002026C, // 0120 JMP #038E + 0x70020286, // 0120 JMP #03A8 0x54220037, // 0121 LDINT R8 56 0x1C200C08, // 0122 EQ R8 R6 R8 0x7822002B, // 0123 JMPF R8 #0150 @@ -1316,582 +1318,608 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x5C301000, // 014C MOVE R12 R8 0x7C240600, // 014D CALL R9 3 0x80041200, // 014E RET 1 R9 - 0x7002023D, // 014F JMP #038E + 0x70020257, // 014F JMP #03A8 0x5422003D, // 0150 LDINT R8 62 0x1C200C08, // 0151 EQ R8 R6 R8 - 0x78220093, // 0152 JMPF R8 #01E7 + 0x782200AD, // 0152 JMPF R8 #0201 0x8C200133, // 0153 GETMET R8 R0 K51 0x88280534, // 0154 GETMBR R10 R2 K52 0x7C200400, // 0155 CALL R8 2 0x1C200F05, // 0156 EQ R8 R7 K5 - 0x78220025, // 0157 JMPF R8 #017E + 0x78220032, // 0157 JMPF R8 #018B 0x8C200B11, // 0158 GETMET R8 R5 K17 0x7C200200, // 0159 CALL R8 1 - 0x60240010, // 015A GETGBL R9 G16 - 0x88280135, // 015B GETMBR R10 R0 K53 - 0x88281536, // 015C GETMBR R10 R10 K54 - 0x8C281537, // 015D GETMET R10 R10 K55 - 0x7C280200, // 015E CALL R10 1 - 0x7C240200, // 015F CALL R9 1 - 0xA8020017, // 0160 EXBLK 0 #0179 - 0x5C281200, // 0161 MOVE R10 R9 - 0x7C280000, // 0162 CALL R10 0 - 0x8C2C1115, // 0163 GETMET R11 R8 K21 - 0x4C340000, // 0164 LDNIL R13 - 0x7C2C0400, // 0165 CALL R11 2 - 0x8C30170B, // 0166 GETMET R12 R11 K11 - 0x58380009, // 0167 LDCONST R14 K9 - 0x883C0B38, // 0168 GETMBR R15 R5 K56 - 0x8C401539, // 0169 GETMET R16 R10 K57 - 0x7C400200, // 016A CALL R16 1 - 0x7C300800, // 016B CALL R12 4 - 0x8C30170B, // 016C GETMET R12 R11 K11 - 0x5838000D, // 016D LDCONST R14 K13 - 0x883C0B38, // 016E GETMBR R15 R5 K56 - 0x8C40153A, // 016F GETMET R16 R10 K58 - 0x7C400200, // 0170 CALL R16 1 - 0x7C300800, // 0171 CALL R12 4 - 0x8C30170B, // 0172 GETMET R12 R11 K11 - 0x543A00FD, // 0173 LDINT R14 254 - 0x883C0B0C, // 0174 GETMBR R15 R5 K12 - 0x8C40153B, // 0175 GETMET R16 R10 K59 - 0x7C400200, // 0176 CALL R16 1 - 0x7C300800, // 0177 CALL R12 4 - 0x7001FFE7, // 0178 JMP #0161 - 0x5824003C, // 0179 LDCONST R9 K60 - 0xAC240200, // 017A CATCH R9 1 0 - 0xB0080000, // 017B RAISE 2 R0 R0 - 0x80041000, // 017C RET 1 R8 - 0x70020067, // 017D JMP #01E6 - 0x1C200F09, // 017E EQ R8 R7 K9 - 0x7822003C, // 017F JMPF R8 #01BD - 0x8C200B11, // 0180 GETMET R8 R5 K17 - 0x7C200200, // 0181 CALL R8 1 - 0x60240010, // 0182 GETGBL R9 G16 - 0x88280135, // 0183 GETMBR R10 R0 K53 - 0x88281536, // 0184 GETMBR R10 R10 K54 - 0x8C281537, // 0185 GETMET R10 R10 K55 - 0x7C280200, // 0186 CALL R10 1 - 0x7C240200, // 0187 CALL R9 1 - 0xA802002E, // 0188 EXBLK 0 #01B8 - 0x5C281200, // 0189 MOVE R10 R9 - 0x7C280000, // 018A CALL R10 0 - 0x8C2C0B3D, // 018B GETMET R11 R5 K61 - 0x8C34153E, // 018C GETMET R13 R10 K62 - 0x7C340200, // 018D CALL R13 1 - 0x7C2C0400, // 018E CALL R11 2 - 0x8C301115, // 018F GETMET R12 R8 K21 - 0x4C380000, // 0190 LDNIL R14 - 0x7C300400, // 0191 CALL R12 2 - 0x8C34190B, // 0192 GETMET R13 R12 K11 - 0x583C0009, // 0193 LDCONST R15 K9 - 0x88400B38, // 0194 GETMBR R16 R5 K56 - 0x8C44173F, // 0195 GETMET R17 R11 K63 - 0x544E0008, // 0196 LDINT R19 9 - 0x7C440400, // 0197 CALL R17 2 - 0x7C340800, // 0198 CALL R13 4 - 0x8C34190B, // 0199 GETMET R13 R12 K11 - 0x583C000D, // 019A LDCONST R15 K13 - 0x88400B0C, // 019B GETMBR R16 R5 K12 - 0x8C441540, // 019C GETMET R17 R10 K64 - 0x7C440200, // 019D CALL R17 1 - 0x7C340800, // 019E CALL R13 4 - 0x8C34190B, // 019F GETMET R13 R12 K11 - 0x583C000F, // 01A0 LDCONST R15 K15 - 0x88400B07, // 01A1 GETMBR R16 R5 K7 - 0x8C441541, // 01A2 GETMET R17 R10 K65 - 0x7C440200, // 01A3 CALL R17 1 - 0x7C340800, // 01A4 CALL R13 4 - 0x8C34190B, // 01A5 GETMET R13 R12 K11 - 0x543E0003, // 01A6 LDINT R15 4 - 0x88400B07, // 01A7 GETMBR R16 R5 K7 - 0x8C441542, // 01A8 GETMET R17 R10 K66 - 0x7C440200, // 01A9 CALL R17 1 - 0x7C340800, // 01AA CALL R13 4 - 0x8C34190B, // 01AB GETMET R13 R12 K11 - 0x543E0004, // 01AC LDINT R15 5 - 0x88400B16, // 01AD GETMBR R16 R5 K22 - 0x8C441543, // 01AE GETMET R17 R10 K67 - 0x7C440200, // 01AF CALL R17 1 - 0x7C340800, // 01B0 CALL R13 4 - 0x8C34190B, // 01B1 GETMET R13 R12 K11 - 0x543E00FD, // 01B2 LDINT R15 254 - 0x88400B0C, // 01B3 GETMBR R16 R5 K12 - 0x8C44153B, // 01B4 GETMET R17 R10 K59 - 0x7C440200, // 01B5 CALL R17 1 - 0x7C340800, // 01B6 CALL R13 4 - 0x7001FFD0, // 01B7 JMP #0189 - 0x5824003C, // 01B8 LDCONST R9 K60 - 0xAC240200, // 01B9 CATCH R9 1 0 - 0xB0080000, // 01BA RAISE 2 R0 R0 - 0x80041000, // 01BB RET 1 R8 - 0x70020028, // 01BC JMP #01E6 - 0x1C200F0D, // 01BD EQ R8 R7 K13 - 0x78220007, // 01BE JMPF R8 #01C7 - 0x8C200706, // 01BF GETMET R8 R3 K6 - 0x88280B0E, // 01C0 GETMBR R10 R5 K14 - 0xB82E0200, // 01C1 GETNGBL R11 K1 - 0x882C1744, // 01C2 GETMBR R11 R11 K68 - 0x882C1745, // 01C3 GETMBR R11 R11 K69 - 0x7C200600, // 01C4 CALL R8 3 - 0x80041000, // 01C5 RET 1 R8 - 0x7002001E, // 01C6 JMP #01E6 - 0x1C200F0F, // 01C7 EQ R8 R7 K15 - 0x78220009, // 01C8 JMPF R8 #01D3 - 0x88200135, // 01C9 GETMBR R8 R0 K53 - 0x88201136, // 01CA GETMBR R8 R8 K54 - 0x8C201146, // 01CB GETMET R8 R8 K70 - 0x7C200200, // 01CC CALL R8 1 - 0x8C240706, // 01CD GETMET R9 R3 K6 - 0x882C0B0E, // 01CE GETMBR R11 R5 K14 - 0x5C301000, // 01CF MOVE R12 R8 - 0x7C240600, // 01D0 CALL R9 3 - 0x80041200, // 01D1 RET 1 R9 - 0x70020012, // 01D2 JMP #01E6 - 0x54220003, // 01D3 LDINT R8 4 - 0x1C200E08, // 01D4 EQ R8 R7 R8 - 0x78220000, // 01D5 JMPF R8 #01D7 - 0x7002000E, // 01D6 JMP #01E6 - 0x54220004, // 01D7 LDINT R8 5 - 0x1C200E08, // 01D8 EQ R8 R7 R8 - 0x7822000B, // 01D9 JMPF R8 #01E6 - 0x88200347, // 01DA GETMBR R8 R1 K71 - 0x8C20113B, // 01DB GETMET R8 R8 K59 - 0x7C200200, // 01DC CALL R8 1 - 0x4C240000, // 01DD LDNIL R9 - 0x1C241009, // 01DE EQ R9 R8 R9 - 0x78260000, // 01DF JMPF R9 #01E1 - 0x58200005, // 01E0 LDCONST R8 K5 - 0x8C240706, // 01E1 GETMET R9 R3 K6 - 0x882C0B0E, // 01E2 GETMBR R11 R5 K14 - 0x5C301000, // 01E3 MOVE R12 R8 - 0x7C240600, // 01E4 CALL R9 3 - 0x80041200, // 01E5 RET 1 R9 - 0x700201A6, // 01E6 JMP #038E - 0x5422003B, // 01E7 LDINT R8 60 - 0x1C200C08, // 01E8 EQ R8 R6 R8 - 0x7822003C, // 01E9 JMPF R8 #0227 - 0x1C200F05, // 01EA EQ R8 R7 K5 - 0x78220012, // 01EB JMPF R8 #01FF - 0x88200135, // 01EC GETMBR R8 R0 K53 - 0x8C201148, // 01ED GETMET R8 R8 K72 - 0x7C200200, // 01EE CALL R8 1 - 0x88240135, // 01EF GETMBR R9 R0 K53 - 0x8C241349, // 01F0 GETMET R9 R9 K73 - 0x7C240200, // 01F1 CALL R9 1 - 0x78220004, // 01F2 JMPF R8 #01F8 - 0x78260001, // 01F3 JMPF R9 #01F6 - 0x5828000D, // 01F4 LDCONST R10 K13 - 0x70020000, // 01F5 JMP #01F7 - 0x58280009, // 01F6 LDCONST R10 K9 - 0x70020000, // 01F7 JMP #01F9 - 0x58280005, // 01F8 LDCONST R10 K5 - 0x8C2C0706, // 01F9 GETMET R11 R3 K6 - 0x88340B0E, // 01FA GETMBR R13 R5 K14 - 0x5C381400, // 01FB MOVE R14 R10 - 0x7C2C0600, // 01FC CALL R11 3 - 0x80041600, // 01FD RET 1 R11 - 0x70020026, // 01FE JMP #0226 - 0x1C200F09, // 01FF EQ R8 R7 K9 - 0x78220011, // 0200 JMPF R8 #0213 - 0x88200135, // 0201 GETMBR R8 R0 K53 - 0x8820114A, // 0202 GETMBR R8 R8 K74 - 0x4C240000, // 0203 LDNIL R9 - 0x20241009, // 0204 NE R9 R8 R9 - 0x78260006, // 0205 JMPF R9 #020D - 0x8C240706, // 0206 GETMET R9 R3 K6 - 0x882C0B0C, // 0207 GETMBR R11 R5 K12 - 0x8C30113B, // 0208 GETMET R12 R8 K59 - 0x7C300200, // 0209 CALL R12 1 - 0x7C240600, // 020A CALL R9 3 - 0x80041200, // 020B RET 1 R9 - 0x70020004, // 020C JMP #0212 - 0x8C240706, // 020D GETMET R9 R3 K6 - 0x882C0B18, // 020E GETMBR R11 R5 K24 - 0x4C300000, // 020F LDNIL R12 - 0x7C240600, // 0210 CALL R9 3 - 0x80041200, // 0211 RET 1 R9 - 0x70020012, // 0212 JMP #0226 - 0x1C200F0D, // 0213 EQ R8 R7 K13 - 0x78220010, // 0214 JMPF R8 #0226 - 0x88200135, // 0215 GETMBR R8 R0 K53 - 0x8820114A, // 0216 GETMBR R8 R8 K74 - 0x4C240000, // 0217 LDNIL R9 - 0x20241009, // 0218 NE R9 R8 R9 - 0x78260006, // 0219 JMPF R9 #0221 - 0x8C240706, // 021A GETMET R9 R3 K6 - 0x882C0B0C, // 021B GETMBR R11 R5 K12 - 0x8C301140, // 021C GETMET R12 R8 K64 - 0x7C300200, // 021D CALL R12 1 - 0x7C240600, // 021E CALL R9 3 - 0x80041200, // 021F RET 1 R9 - 0x70020004, // 0220 JMP #0226 - 0x8C240706, // 0221 GETMET R9 R3 K6 - 0x882C0B18, // 0222 GETMBR R11 R5 K24 - 0x4C300000, // 0223 LDNIL R12 + 0x88240535, // 015A GETMBR R9 R2 K53 + 0x78260005, // 015B JMPF R9 #0162 + 0x60240012, // 015C GETGBL R9 G18 + 0x7C240000, // 015D CALL R9 0 + 0x8C280336, // 015E GETMET R10 R1 K54 + 0x7C280200, // 015F CALL R10 1 + 0x4028120A, // 0160 CONNECT R10 R9 R10 + 0x70020003, // 0161 JMP #0166 + 0x88240137, // 0162 GETMBR R9 R0 K55 + 0x88241338, // 0163 GETMBR R9 R9 K56 + 0x8C241339, // 0164 GETMET R9 R9 K57 + 0x7C240200, // 0165 CALL R9 1 + 0x60280010, // 0166 GETGBL R10 G16 + 0x5C2C1200, // 0167 MOVE R11 R9 + 0x7C280200, // 0168 CALL R10 1 + 0xA802001B, // 0169 EXBLK 0 #0186 + 0x5C2C1400, // 016A MOVE R11 R10 + 0x7C2C0000, // 016B CALL R11 0 + 0x4C300000, // 016C LDNIL R12 + 0x1C30160C, // 016D EQ R12 R11 R12 + 0x78320000, // 016E JMPF R12 #0170 + 0x7001FFF9, // 016F JMP #016A + 0x8C301115, // 0170 GETMET R12 R8 K21 + 0x4C380000, // 0171 LDNIL R14 + 0x7C300400, // 0172 CALL R12 2 + 0x8C34190B, // 0173 GETMET R13 R12 K11 + 0x583C0009, // 0174 LDCONST R15 K9 + 0x88400B3A, // 0175 GETMBR R16 R5 K58 + 0x8C44173B, // 0176 GETMET R17 R11 K59 + 0x7C440200, // 0177 CALL R17 1 + 0x7C340800, // 0178 CALL R13 4 + 0x8C34190B, // 0179 GETMET R13 R12 K11 + 0x583C000D, // 017A LDCONST R15 K13 + 0x88400B3A, // 017B GETMBR R16 R5 K58 + 0x8C44173C, // 017C GETMET R17 R11 K60 + 0x7C440200, // 017D CALL R17 1 + 0x7C340800, // 017E CALL R13 4 + 0x8C34190B, // 017F GETMET R13 R12 K11 + 0x543E00FD, // 0180 LDINT R15 254 + 0x88400B0C, // 0181 GETMBR R16 R5 K12 + 0x8C44173D, // 0182 GETMET R17 R11 K61 + 0x7C440200, // 0183 CALL R17 1 + 0x7C340800, // 0184 CALL R13 4 + 0x7001FFE3, // 0185 JMP #016A + 0x5828003E, // 0186 LDCONST R10 K62 + 0xAC280200, // 0187 CATCH R10 1 0 + 0xB0080000, // 0188 RAISE 2 R0 R0 + 0x80041000, // 0189 RET 1 R8 + 0x70020074, // 018A JMP #0200 + 0x1C200F09, // 018B EQ R8 R7 K9 + 0x78220049, // 018C JMPF R8 #01D7 + 0x8C200B11, // 018D GETMET R8 R5 K17 + 0x7C200200, // 018E CALL R8 1 + 0x88240535, // 018F GETMBR R9 R2 K53 + 0x78260005, // 0190 JMPF R9 #0197 + 0x60240012, // 0191 GETGBL R9 G18 + 0x7C240000, // 0192 CALL R9 0 + 0x8C280336, // 0193 GETMET R10 R1 K54 + 0x7C280200, // 0194 CALL R10 1 + 0x4028120A, // 0195 CONNECT R10 R9 R10 + 0x70020003, // 0196 JMP #019B + 0x88240137, // 0197 GETMBR R9 R0 K55 + 0x88241338, // 0198 GETMBR R9 R9 K56 + 0x8C241339, // 0199 GETMET R9 R9 K57 + 0x7C240200, // 019A CALL R9 1 + 0x60280010, // 019B GETGBL R10 G16 + 0x5C2C1200, // 019C MOVE R11 R9 + 0x7C280200, // 019D CALL R10 1 + 0xA8020032, // 019E EXBLK 0 #01D2 + 0x5C2C1400, // 019F MOVE R11 R10 + 0x7C2C0000, // 01A0 CALL R11 0 + 0x4C300000, // 01A1 LDNIL R12 + 0x1C30160C, // 01A2 EQ R12 R11 R12 + 0x78320000, // 01A3 JMPF R12 #01A5 + 0x7001FFF9, // 01A4 JMP #019F + 0x8C300B3F, // 01A5 GETMET R12 R5 K63 + 0x8C381740, // 01A6 GETMET R14 R11 K64 + 0x7C380200, // 01A7 CALL R14 1 + 0x7C300400, // 01A8 CALL R12 2 + 0x8C341115, // 01A9 GETMET R13 R8 K21 + 0x4C3C0000, // 01AA LDNIL R15 + 0x7C340400, // 01AB CALL R13 2 + 0x8C381B0B, // 01AC GETMET R14 R13 K11 + 0x58400009, // 01AD LDCONST R16 K9 + 0x88440B3A, // 01AE GETMBR R17 R5 K58 + 0x8C481941, // 01AF GETMET R18 R12 K65 + 0x54520008, // 01B0 LDINT R20 9 + 0x7C480400, // 01B1 CALL R18 2 + 0x7C380800, // 01B2 CALL R14 4 + 0x8C381B0B, // 01B3 GETMET R14 R13 K11 + 0x5840000D, // 01B4 LDCONST R16 K13 + 0x88440B0C, // 01B5 GETMBR R17 R5 K12 + 0x8C481742, // 01B6 GETMET R18 R11 K66 + 0x7C480200, // 01B7 CALL R18 1 + 0x7C380800, // 01B8 CALL R14 4 + 0x8C381B0B, // 01B9 GETMET R14 R13 K11 + 0x5840000F, // 01BA LDCONST R16 K15 + 0x88440B07, // 01BB GETMBR R17 R5 K7 + 0x8C481743, // 01BC GETMET R18 R11 K67 + 0x7C480200, // 01BD CALL R18 1 + 0x7C380800, // 01BE CALL R14 4 + 0x8C381B0B, // 01BF GETMET R14 R13 K11 + 0x54420003, // 01C0 LDINT R16 4 + 0x88440B07, // 01C1 GETMBR R17 R5 K7 + 0x8C481744, // 01C2 GETMET R18 R11 K68 + 0x7C480200, // 01C3 CALL R18 1 + 0x7C380800, // 01C4 CALL R14 4 + 0x8C381B0B, // 01C5 GETMET R14 R13 K11 + 0x54420004, // 01C6 LDINT R16 5 + 0x88440B16, // 01C7 GETMBR R17 R5 K22 + 0x8C481745, // 01C8 GETMET R18 R11 K69 + 0x7C480200, // 01C9 CALL R18 1 + 0x7C380800, // 01CA CALL R14 4 + 0x8C381B0B, // 01CB GETMET R14 R13 K11 + 0x544200FD, // 01CC LDINT R16 254 + 0x88440B0C, // 01CD GETMBR R17 R5 K12 + 0x8C48173D, // 01CE GETMET R18 R11 K61 + 0x7C480200, // 01CF CALL R18 1 + 0x7C380800, // 01D0 CALL R14 4 + 0x7001FFCC, // 01D1 JMP #019F + 0x5828003E, // 01D2 LDCONST R10 K62 + 0xAC280200, // 01D3 CATCH R10 1 0 + 0xB0080000, // 01D4 RAISE 2 R0 R0 + 0x80041000, // 01D5 RET 1 R8 + 0x70020028, // 01D6 JMP #0200 + 0x1C200F0D, // 01D7 EQ R8 R7 K13 + 0x78220007, // 01D8 JMPF R8 #01E1 + 0x8C200706, // 01D9 GETMET R8 R3 K6 + 0x88280B0E, // 01DA GETMBR R10 R5 K14 + 0xB82E0200, // 01DB GETNGBL R11 K1 + 0x882C1746, // 01DC GETMBR R11 R11 K70 + 0x882C1747, // 01DD GETMBR R11 R11 K71 + 0x7C200600, // 01DE CALL R8 3 + 0x80041000, // 01DF RET 1 R8 + 0x7002001E, // 01E0 JMP #0200 + 0x1C200F0F, // 01E1 EQ R8 R7 K15 + 0x78220009, // 01E2 JMPF R8 #01ED + 0x88200137, // 01E3 GETMBR R8 R0 K55 + 0x88201138, // 01E4 GETMBR R8 R8 K56 + 0x8C201148, // 01E5 GETMET R8 R8 K72 + 0x7C200200, // 01E6 CALL R8 1 + 0x8C240706, // 01E7 GETMET R9 R3 K6 + 0x882C0B0E, // 01E8 GETMBR R11 R5 K14 + 0x5C301000, // 01E9 MOVE R12 R8 + 0x7C240600, // 01EA CALL R9 3 + 0x80041200, // 01EB RET 1 R9 + 0x70020012, // 01EC JMP #0200 + 0x54220003, // 01ED LDINT R8 4 + 0x1C200E08, // 01EE EQ R8 R7 R8 + 0x78220000, // 01EF JMPF R8 #01F1 + 0x7002000E, // 01F0 JMP #0200 + 0x54220004, // 01F1 LDINT R8 5 + 0x1C200E08, // 01F2 EQ R8 R7 R8 + 0x7822000B, // 01F3 JMPF R8 #0200 + 0x88200349, // 01F4 GETMBR R8 R1 K73 + 0x8C20113D, // 01F5 GETMET R8 R8 K61 + 0x7C200200, // 01F6 CALL R8 1 + 0x4C240000, // 01F7 LDNIL R9 + 0x1C241009, // 01F8 EQ R9 R8 R9 + 0x78260000, // 01F9 JMPF R9 #01FB + 0x58200005, // 01FA LDCONST R8 K5 + 0x8C240706, // 01FB GETMET R9 R3 K6 + 0x882C0B0E, // 01FC GETMBR R11 R5 K14 + 0x5C301000, // 01FD MOVE R12 R8 + 0x7C240600, // 01FE CALL R9 3 + 0x80041200, // 01FF RET 1 R9 + 0x700201A6, // 0200 JMP #03A8 + 0x5422003B, // 0201 LDINT R8 60 + 0x1C200C08, // 0202 EQ R8 R6 R8 + 0x7822003C, // 0203 JMPF R8 #0241 + 0x1C200F05, // 0204 EQ R8 R7 K5 + 0x78220012, // 0205 JMPF R8 #0219 + 0x88200137, // 0206 GETMBR R8 R0 K55 + 0x8C20114A, // 0207 GETMET R8 R8 K74 + 0x7C200200, // 0208 CALL R8 1 + 0x88240137, // 0209 GETMBR R9 R0 K55 + 0x8C24134B, // 020A GETMET R9 R9 K75 + 0x7C240200, // 020B CALL R9 1 + 0x78220004, // 020C JMPF R8 #0212 + 0x78260001, // 020D JMPF R9 #0210 + 0x5828000D, // 020E LDCONST R10 K13 + 0x70020000, // 020F JMP #0211 + 0x58280009, // 0210 LDCONST R10 K9 + 0x70020000, // 0211 JMP #0213 + 0x58280005, // 0212 LDCONST R10 K5 + 0x8C2C0706, // 0213 GETMET R11 R3 K6 + 0x88340B0E, // 0214 GETMBR R13 R5 K14 + 0x5C381400, // 0215 MOVE R14 R10 + 0x7C2C0600, // 0216 CALL R11 3 + 0x80041600, // 0217 RET 1 R11 + 0x70020026, // 0218 JMP #0240 + 0x1C200F09, // 0219 EQ R8 R7 K9 + 0x78220011, // 021A JMPF R8 #022D + 0x88200137, // 021B GETMBR R8 R0 K55 + 0x8820114C, // 021C GETMBR R8 R8 K76 + 0x4C240000, // 021D LDNIL R9 + 0x20241009, // 021E NE R9 R8 R9 + 0x78260006, // 021F JMPF R9 #0227 + 0x8C240706, // 0220 GETMET R9 R3 K6 + 0x882C0B0C, // 0221 GETMBR R11 R5 K12 + 0x8C30113D, // 0222 GETMET R12 R8 K61 + 0x7C300200, // 0223 CALL R12 1 0x7C240600, // 0224 CALL R9 3 0x80041200, // 0225 RET 1 R9 - 0x70020166, // 0226 JMP #038E - 0x54220027, // 0227 LDINT R8 40 - 0x1C200C08, // 0228 EQ R8 R6 R8 - 0x782200BA, // 0229 JMPF R8 #02E5 - 0x8C200133, // 022A GETMET R8 R0 K51 - 0x88280534, // 022B GETMBR R10 R2 K52 - 0x7C200400, // 022C CALL R8 2 - 0x1C200F05, // 022D EQ R8 R7 K5 - 0x78220005, // 022E JMPF R8 #0235 - 0x8C200706, // 022F GETMET R8 R3 K6 - 0x88280B0C, // 0230 GETMBR R10 R5 K12 - 0x582C0009, // 0231 LDCONST R11 K9 - 0x7C200600, // 0232 CALL R8 3 - 0x80041000, // 0233 RET 1 R8 - 0x700200AE, // 0234 JMP #02E4 - 0x1C200F09, // 0235 EQ R8 R7 K9 - 0x78220005, // 0236 JMPF R8 #023D - 0x8C200706, // 0237 GETMET R8 R3 K6 - 0x88280B16, // 0238 GETMBR R10 R5 K22 - 0x582C004B, // 0239 LDCONST R11 K75 - 0x7C200600, // 023A CALL R8 3 - 0x80041000, // 023B RET 1 R8 - 0x700200A6, // 023C JMP #02E4 - 0x1C200F0D, // 023D EQ R8 R7 K13 - 0x78220006, // 023E JMPF R8 #0246 - 0x8C200706, // 023F GETMET R8 R3 K6 - 0x88280B0C, // 0240 GETMBR R10 R5 K12 - 0x882C0135, // 0241 GETMBR R11 R0 K53 - 0x882C174C, // 0242 GETMBR R11 R11 K76 - 0x7C200600, // 0243 CALL R8 3 - 0x80041000, // 0244 RET 1 R8 - 0x7002009D, // 0245 JMP #02E4 - 0x1C200F0F, // 0246 EQ R8 R7 K15 - 0x7822000A, // 0247 JMPF R8 #0253 - 0x8C200706, // 0248 GETMET R8 R3 K6 - 0x88280B16, // 0249 GETMBR R10 R5 K22 - 0xB82E2400, // 024A GETNGBL R11 K18 - 0x8C2C1726, // 024B GETMET R11 R11 K38 - 0x5834004D, // 024C LDCONST R13 K77 - 0x50380200, // 024D LDBOOL R14 1 0 - 0x7C2C0600, // 024E CALL R11 3 - 0x942C174D, // 024F GETIDX R11 R11 K77 - 0x7C200600, // 0250 CALL R8 3 - 0x80041000, // 0251 RET 1 R8 - 0x70020090, // 0252 JMP #02E4 - 0x54220003, // 0253 LDINT R8 4 - 0x1C200E08, // 0254 EQ R8 R7 R8 - 0x78220005, // 0255 JMPF R8 #025C - 0x8C200706, // 0256 GETMET R8 R3 K6 - 0x88280B0C, // 0257 GETMBR R10 R5 K12 - 0x542E7FFF, // 0258 LDINT R11 32768 - 0x7C200600, // 0259 CALL R8 3 - 0x80041000, // 025A RET 1 R8 - 0x70020087, // 025B JMP #02E4 - 0x54220004, // 025C LDINT R8 5 - 0x1C200E08, // 025D EQ R8 R7 R8 - 0x7822000A, // 025E JMPF R8 #026A - 0x8C200706, // 025F GETMET R8 R3 K6 - 0x88280B16, // 0260 GETMBR R10 R5 K22 - 0xB82E2400, // 0261 GETNGBL R11 K18 - 0x8C2C1726, // 0262 GETMET R11 R11 K38 - 0x5834004E, // 0263 LDCONST R13 K78 - 0x50380200, // 0264 LDBOOL R14 1 0 - 0x7C2C0600, // 0265 CALL R11 3 - 0x942C174F, // 0266 GETIDX R11 R11 K79 - 0x7C200600, // 0267 CALL R8 3 - 0x80041000, // 0268 RET 1 R8 - 0x70020079, // 0269 JMP #02E4 - 0x54220005, // 026A LDINT R8 6 - 0x1C200E08, // 026B EQ R8 R7 R8 - 0x78220005, // 026C JMPF R8 #0273 - 0x8C200706, // 026D GETMET R8 R3 K6 - 0x88280B16, // 026E GETMBR R10 R5 K22 - 0x582C0050, // 026F LDCONST R11 K80 - 0x7C200600, // 0270 CALL R8 3 - 0x80041000, // 0271 RET 1 R8 - 0x70020070, // 0272 JMP #02E4 - 0x54220006, // 0273 LDINT R8 7 - 0x1C200E08, // 0274 EQ R8 R7 R8 - 0x78220005, // 0275 JMPF R8 #027C - 0x8C200706, // 0276 GETMET R8 R3 K6 - 0x88280B0C, // 0277 GETMBR R10 R5 K12 - 0x582C0005, // 0278 LDCONST R11 K5 - 0x7C200600, // 0279 CALL R8 3 - 0x80041000, // 027A RET 1 R8 - 0x70020067, // 027B JMP #02E4 - 0x54220007, // 027C LDINT R8 8 - 0x1C200E08, // 027D EQ R8 R7 R8 - 0x7822000B, // 027E JMPF R8 #028B - 0x8C200706, // 027F GETMET R8 R3 K6 - 0x88280B16, // 0280 GETMBR R10 R5 K22 - 0xB82E2400, // 0281 GETNGBL R11 K18 - 0x8C2C1726, // 0282 GETMET R11 R11 K38 - 0x58340051, // 0283 LDCONST R13 K81 - 0x50380200, // 0284 LDBOOL R14 1 0 - 0x7C2C0600, // 0285 CALL R11 3 - 0x942C1752, // 0286 GETIDX R11 R11 K82 - 0x942C1753, // 0287 GETIDX R11 R11 K83 - 0x7C200600, // 0288 CALL R8 3 - 0x80041000, // 0289 RET 1 R8 - 0x70020058, // 028A JMP #02E4 - 0x54220008, // 028B LDINT R8 9 - 0x1C200E08, // 028C EQ R8 R7 R8 - 0x78220005, // 028D JMPF R8 #0294 - 0x8C200706, // 028E GETMET R8 R3 K6 - 0x88280B0C, // 028F GETMBR R10 R5 K12 - 0x582C0009, // 0290 LDCONST R11 K9 - 0x7C200600, // 0291 CALL R8 3 - 0x80041000, // 0292 RET 1 R8 - 0x7002004F, // 0293 JMP #02E4 - 0x54220009, // 0294 LDINT R8 10 - 0x1C200E08, // 0295 EQ R8 R7 R8 - 0x78220015, // 0296 JMPF R8 #02AD - 0xB8222400, // 0297 GETNGBL R8 K18 - 0x8C201126, // 0298 GETMET R8 R8 K38 - 0x58280051, // 0299 LDCONST R10 K81 - 0x502C0200, // 029A LDBOOL R11 1 0 - 0x7C200600, // 029B CALL R8 3 - 0x94201152, // 029C GETIDX R8 R8 K82 - 0x94201154, // 029D GETIDX R8 R8 K84 - 0x8C24091B, // 029E GETMET R9 R4 K27 - 0x5C2C1000, // 029F MOVE R11 R8 - 0x58300055, // 02A0 LDCONST R12 K85 - 0x7C240600, // 02A1 CALL R9 3 - 0x24281305, // 02A2 GT R10 R9 K5 - 0x782A0002, // 02A3 JMPF R10 #02A7 - 0x04281309, // 02A4 SUB R10 R9 K9 - 0x402A0A0A, // 02A5 CONNECT R10 K5 R10 - 0x9420100A, // 02A6 GETIDX R8 R8 R10 - 0x8C280706, // 02A7 GETMET R10 R3 K6 - 0x88300B16, // 02A8 GETMBR R12 R5 K22 - 0x5C341000, // 02A9 MOVE R13 R8 - 0x7C280600, // 02AA CALL R10 3 - 0x80041400, // 02AB RET 1 R10 - 0x70020036, // 02AC JMP #02E4 - 0x5422000E, // 02AD LDINT R8 15 - 0x1C200E08, // 02AE EQ R8 R7 R8 - 0x7822000B, // 02AF JMPF R8 #02BC - 0x8C200706, // 02B0 GETMET R8 R3 K6 - 0x88280B16, // 02B1 GETMBR R10 R5 K22 - 0xB82E2400, // 02B2 GETNGBL R11 K18 - 0x8C2C1725, // 02B3 GETMET R11 R11 K37 - 0x7C2C0200, // 02B4 CALL R11 1 - 0x8C2C171B, // 02B5 GETMET R11 R11 K27 - 0x5834001C, // 02B6 LDCONST R13 K28 - 0x5838001D, // 02B7 LDCONST R14 K29 - 0x7C2C0600, // 02B8 CALL R11 3 - 0x7C200600, // 02B9 CALL R8 3 - 0x80041000, // 02BA RET 1 R8 - 0x70020027, // 02BB JMP #02E4 - 0x54220010, // 02BC LDINT R8 17 - 0x1C200E08, // 02BD EQ R8 R7 R8 - 0x78220005, // 02BE JMPF R8 #02C5 - 0x8C200706, // 02BF GETMET R8 R3 K6 - 0x88280B10, // 02C0 GETMBR R10 R5 K16 - 0x582C0009, // 02C1 LDCONST R11 K9 - 0x7C200600, // 02C2 CALL R8 3 - 0x80041000, // 02C3 RET 1 R8 - 0x7002001E, // 02C4 JMP #02E4 - 0x54220011, // 02C5 LDINT R8 18 - 0x1C200E08, // 02C6 EQ R8 R7 R8 - 0x7822000B, // 02C7 JMPF R8 #02D4 - 0x8C200706, // 02C8 GETMET R8 R3 K6 - 0x88280B16, // 02C9 GETMBR R10 R5 K22 - 0xB82E2400, // 02CA GETNGBL R11 K18 - 0x8C2C1725, // 02CB GETMET R11 R11 K37 - 0x7C2C0200, // 02CC CALL R11 1 - 0x8C2C171B, // 02CD GETMET R11 R11 K27 - 0x5834001C, // 02CE LDCONST R13 K28 - 0x5838001D, // 02CF LDCONST R14 K29 - 0x7C2C0600, // 02D0 CALL R11 3 - 0x7C200600, // 02D1 CALL R8 3 - 0x80041000, // 02D2 RET 1 R8 - 0x7002000F, // 02D3 JMP #02E4 - 0x54220012, // 02D4 LDINT R8 19 - 0x1C200E08, // 02D5 EQ R8 R7 R8 - 0x7822000C, // 02D6 JMPF R8 #02E4 - 0x8C200B0A, // 02D7 GETMET R8 R5 K10 - 0x7C200200, // 02D8 CALL R8 1 - 0x8C24110B, // 02D9 GETMET R9 R8 K11 - 0x582C0005, // 02DA LDCONST R11 K5 - 0x88300B0C, // 02DB GETMBR R12 R5 K12 - 0x5834000F, // 02DC LDCONST R13 K15 - 0x7C240800, // 02DD CALL R9 4 - 0x8C24110B, // 02DE GETMET R9 R8 K11 - 0x582C0009, // 02DF LDCONST R11 K9 - 0x88300B0C, // 02E0 GETMBR R12 R5 K12 - 0x5834000F, // 02E1 LDCONST R13 K15 - 0x7C240800, // 02E2 CALL R9 4 - 0x80041000, // 02E3 RET 1 R8 - 0x700200A8, // 02E4 JMP #038E - 0x5422003E, // 02E5 LDINT R8 63 - 0x1C200C08, // 02E6 EQ R8 R6 R8 - 0x78220000, // 02E7 JMPF R8 #02E9 - 0x700200A4, // 02E8 JMP #038E - 0x54220029, // 02E9 LDINT R8 42 - 0x1C200C08, // 02EA EQ R8 R6 R8 - 0x7822001D, // 02EB JMPF R8 #030A - 0x1C200F05, // 02EC EQ R8 R7 K5 - 0x78220003, // 02ED JMPF R8 #02F2 - 0x8C200B11, // 02EE GETMET R8 R5 K17 - 0x7C200200, // 02EF CALL R8 1 - 0x80041000, // 02F0 RET 1 R8 - 0x70020016, // 02F1 JMP #0309 - 0x1C200F09, // 02F2 EQ R8 R7 K9 - 0x78220005, // 02F3 JMPF R8 #02FA - 0x8C200706, // 02F4 GETMET R8 R3 K6 - 0x88280B10, // 02F5 GETMBR R10 R5 K16 - 0x582C0005, // 02F6 LDCONST R11 K5 - 0x7C200600, // 02F7 CALL R8 3 - 0x80041000, // 02F8 RET 1 R8 - 0x7002000E, // 02F9 JMP #0309 - 0x1C200F0D, // 02FA EQ R8 R7 K13 - 0x78220005, // 02FB JMPF R8 #0302 - 0x8C200706, // 02FC GETMET R8 R3 K6 - 0x88280B0E, // 02FD GETMBR R10 R5 K14 - 0x582C0009, // 02FE LDCONST R11 K9 - 0x7C200600, // 02FF CALL R8 3 - 0x80041000, // 0300 RET 1 R8 - 0x70020006, // 0301 JMP #0309 - 0x1C200F0F, // 0302 EQ R8 R7 K15 - 0x78220004, // 0303 JMPF R8 #0309 - 0x8C200706, // 0304 GETMET R8 R3 K6 - 0x88280B18, // 0305 GETMBR R10 R5 K24 - 0x4C2C0000, // 0306 LDNIL R11 - 0x7C200600, // 0307 CALL R8 3 - 0x80041000, // 0308 RET 1 R8 - 0x70020083, // 0309 JMP #038E - 0x5422002A, // 030A LDINT R8 43 - 0x1C200C08, // 030B EQ R8 R6 R8 - 0x78220016, // 030C JMPF R8 #0324 - 0x1C200F05, // 030D EQ R8 R7 K5 - 0x78220007, // 030E JMPF R8 #0317 - 0x8C200706, // 030F GETMET R8 R3 K6 - 0x88280B16, // 0310 GETMBR R10 R5 K22 - 0xB82E2400, // 0311 GETNGBL R11 K18 - 0x8C2C1756, // 0312 GETMET R11 R11 K86 - 0x7C2C0200, // 0313 CALL R11 1 - 0x7C200600, // 0314 CALL R8 3 - 0x80041000, // 0315 RET 1 R8 - 0x7002000B, // 0316 JMP #0323 - 0x1C200F09, // 0317 EQ R8 R7 K9 - 0x78220009, // 0318 JMPF R8 #0323 - 0x8C200B11, // 0319 GETMET R8 R5 K17 - 0x7C200200, // 031A CALL R8 1 - 0x8C24110B, // 031B GETMET R9 R8 K11 - 0x4C2C0000, // 031C LDNIL R11 - 0x88300B16, // 031D GETMBR R12 R5 K22 - 0xB8362400, // 031E GETNGBL R13 K18 - 0x8C341B56, // 031F GETMET R13 R13 K86 - 0x7C340200, // 0320 CALL R13 1 - 0x7C240800, // 0321 CALL R9 4 + 0x70020004, // 0226 JMP #022C + 0x8C240706, // 0227 GETMET R9 R3 K6 + 0x882C0B18, // 0228 GETMBR R11 R5 K24 + 0x4C300000, // 0229 LDNIL R12 + 0x7C240600, // 022A CALL R9 3 + 0x80041200, // 022B RET 1 R9 + 0x70020012, // 022C JMP #0240 + 0x1C200F0D, // 022D EQ R8 R7 K13 + 0x78220010, // 022E JMPF R8 #0240 + 0x88200137, // 022F GETMBR R8 R0 K55 + 0x8820114C, // 0230 GETMBR R8 R8 K76 + 0x4C240000, // 0231 LDNIL R9 + 0x20241009, // 0232 NE R9 R8 R9 + 0x78260006, // 0233 JMPF R9 #023B + 0x8C240706, // 0234 GETMET R9 R3 K6 + 0x882C0B0C, // 0235 GETMBR R11 R5 K12 + 0x8C301142, // 0236 GETMET R12 R8 K66 + 0x7C300200, // 0237 CALL R12 1 + 0x7C240600, // 0238 CALL R9 3 + 0x80041200, // 0239 RET 1 R9 + 0x70020004, // 023A JMP #0240 + 0x8C240706, // 023B GETMET R9 R3 K6 + 0x882C0B18, // 023C GETMBR R11 R5 K24 + 0x4C300000, // 023D LDNIL R12 + 0x7C240600, // 023E CALL R9 3 + 0x80041200, // 023F RET 1 R9 + 0x70020166, // 0240 JMP #03A8 + 0x54220027, // 0241 LDINT R8 40 + 0x1C200C08, // 0242 EQ R8 R6 R8 + 0x782200BA, // 0243 JMPF R8 #02FF + 0x8C200133, // 0244 GETMET R8 R0 K51 + 0x88280534, // 0245 GETMBR R10 R2 K52 + 0x7C200400, // 0246 CALL R8 2 + 0x1C200F05, // 0247 EQ R8 R7 K5 + 0x78220005, // 0248 JMPF R8 #024F + 0x8C200706, // 0249 GETMET R8 R3 K6 + 0x88280B0C, // 024A GETMBR R10 R5 K12 + 0x582C0009, // 024B LDCONST R11 K9 + 0x7C200600, // 024C CALL R8 3 + 0x80041000, // 024D RET 1 R8 + 0x700200AE, // 024E JMP #02FE + 0x1C200F09, // 024F EQ R8 R7 K9 + 0x78220005, // 0250 JMPF R8 #0257 + 0x8C200706, // 0251 GETMET R8 R3 K6 + 0x88280B16, // 0252 GETMBR R10 R5 K22 + 0x582C004D, // 0253 LDCONST R11 K77 + 0x7C200600, // 0254 CALL R8 3 + 0x80041000, // 0255 RET 1 R8 + 0x700200A6, // 0256 JMP #02FE + 0x1C200F0D, // 0257 EQ R8 R7 K13 + 0x78220006, // 0258 JMPF R8 #0260 + 0x8C200706, // 0259 GETMET R8 R3 K6 + 0x88280B0C, // 025A GETMBR R10 R5 K12 + 0x882C0137, // 025B GETMBR R11 R0 K55 + 0x882C174E, // 025C GETMBR R11 R11 K78 + 0x7C200600, // 025D CALL R8 3 + 0x80041000, // 025E RET 1 R8 + 0x7002009D, // 025F JMP #02FE + 0x1C200F0F, // 0260 EQ R8 R7 K15 + 0x7822000A, // 0261 JMPF R8 #026D + 0x8C200706, // 0262 GETMET R8 R3 K6 + 0x88280B16, // 0263 GETMBR R10 R5 K22 + 0xB82E2400, // 0264 GETNGBL R11 K18 + 0x8C2C1726, // 0265 GETMET R11 R11 K38 + 0x5834004F, // 0266 LDCONST R13 K79 + 0x50380200, // 0267 LDBOOL R14 1 0 + 0x7C2C0600, // 0268 CALL R11 3 + 0x942C174F, // 0269 GETIDX R11 R11 K79 + 0x7C200600, // 026A CALL R8 3 + 0x80041000, // 026B RET 1 R8 + 0x70020090, // 026C JMP #02FE + 0x54220003, // 026D LDINT R8 4 + 0x1C200E08, // 026E EQ R8 R7 R8 + 0x78220005, // 026F JMPF R8 #0276 + 0x8C200706, // 0270 GETMET R8 R3 K6 + 0x88280B0C, // 0271 GETMBR R10 R5 K12 + 0x542E7FFF, // 0272 LDINT R11 32768 + 0x7C200600, // 0273 CALL R8 3 + 0x80041000, // 0274 RET 1 R8 + 0x70020087, // 0275 JMP #02FE + 0x54220004, // 0276 LDINT R8 5 + 0x1C200E08, // 0277 EQ R8 R7 R8 + 0x7822000A, // 0278 JMPF R8 #0284 + 0x8C200706, // 0279 GETMET R8 R3 K6 + 0x88280B16, // 027A GETMBR R10 R5 K22 + 0xB82E2400, // 027B GETNGBL R11 K18 + 0x8C2C1726, // 027C GETMET R11 R11 K38 + 0x58340050, // 027D LDCONST R13 K80 + 0x50380200, // 027E LDBOOL R14 1 0 + 0x7C2C0600, // 027F CALL R11 3 + 0x942C1751, // 0280 GETIDX R11 R11 K81 + 0x7C200600, // 0281 CALL R8 3 + 0x80041000, // 0282 RET 1 R8 + 0x70020079, // 0283 JMP #02FE + 0x54220005, // 0284 LDINT R8 6 + 0x1C200E08, // 0285 EQ R8 R7 R8 + 0x78220005, // 0286 JMPF R8 #028D + 0x8C200706, // 0287 GETMET R8 R3 K6 + 0x88280B16, // 0288 GETMBR R10 R5 K22 + 0x582C0052, // 0289 LDCONST R11 K82 + 0x7C200600, // 028A CALL R8 3 + 0x80041000, // 028B RET 1 R8 + 0x70020070, // 028C JMP #02FE + 0x54220006, // 028D LDINT R8 7 + 0x1C200E08, // 028E EQ R8 R7 R8 + 0x78220005, // 028F JMPF R8 #0296 + 0x8C200706, // 0290 GETMET R8 R3 K6 + 0x88280B0C, // 0291 GETMBR R10 R5 K12 + 0x582C0005, // 0292 LDCONST R11 K5 + 0x7C200600, // 0293 CALL R8 3 + 0x80041000, // 0294 RET 1 R8 + 0x70020067, // 0295 JMP #02FE + 0x54220007, // 0296 LDINT R8 8 + 0x1C200E08, // 0297 EQ R8 R7 R8 + 0x7822000B, // 0298 JMPF R8 #02A5 + 0x8C200706, // 0299 GETMET R8 R3 K6 + 0x88280B16, // 029A GETMBR R10 R5 K22 + 0xB82E2400, // 029B GETNGBL R11 K18 + 0x8C2C1726, // 029C GETMET R11 R11 K38 + 0x58340053, // 029D LDCONST R13 K83 + 0x50380200, // 029E LDBOOL R14 1 0 + 0x7C2C0600, // 029F CALL R11 3 + 0x942C1754, // 02A0 GETIDX R11 R11 K84 + 0x942C1755, // 02A1 GETIDX R11 R11 K85 + 0x7C200600, // 02A2 CALL R8 3 + 0x80041000, // 02A3 RET 1 R8 + 0x70020058, // 02A4 JMP #02FE + 0x54220008, // 02A5 LDINT R8 9 + 0x1C200E08, // 02A6 EQ R8 R7 R8 + 0x78220005, // 02A7 JMPF R8 #02AE + 0x8C200706, // 02A8 GETMET R8 R3 K6 + 0x88280B0C, // 02A9 GETMBR R10 R5 K12 + 0x582C0009, // 02AA LDCONST R11 K9 + 0x7C200600, // 02AB CALL R8 3 + 0x80041000, // 02AC RET 1 R8 + 0x7002004F, // 02AD JMP #02FE + 0x54220009, // 02AE LDINT R8 10 + 0x1C200E08, // 02AF EQ R8 R7 R8 + 0x78220015, // 02B0 JMPF R8 #02C7 + 0xB8222400, // 02B1 GETNGBL R8 K18 + 0x8C201126, // 02B2 GETMET R8 R8 K38 + 0x58280053, // 02B3 LDCONST R10 K83 + 0x502C0200, // 02B4 LDBOOL R11 1 0 + 0x7C200600, // 02B5 CALL R8 3 + 0x94201154, // 02B6 GETIDX R8 R8 K84 + 0x94201156, // 02B7 GETIDX R8 R8 K86 + 0x8C24091B, // 02B8 GETMET R9 R4 K27 + 0x5C2C1000, // 02B9 MOVE R11 R8 + 0x58300057, // 02BA LDCONST R12 K87 + 0x7C240600, // 02BB CALL R9 3 + 0x24281305, // 02BC GT R10 R9 K5 + 0x782A0002, // 02BD JMPF R10 #02C1 + 0x04281309, // 02BE SUB R10 R9 K9 + 0x402A0A0A, // 02BF CONNECT R10 K5 R10 + 0x9420100A, // 02C0 GETIDX R8 R8 R10 + 0x8C280706, // 02C1 GETMET R10 R3 K6 + 0x88300B16, // 02C2 GETMBR R12 R5 K22 + 0x5C341000, // 02C3 MOVE R13 R8 + 0x7C280600, // 02C4 CALL R10 3 + 0x80041400, // 02C5 RET 1 R10 + 0x70020036, // 02C6 JMP #02FE + 0x5422000E, // 02C7 LDINT R8 15 + 0x1C200E08, // 02C8 EQ R8 R7 R8 + 0x7822000B, // 02C9 JMPF R8 #02D6 + 0x8C200706, // 02CA GETMET R8 R3 K6 + 0x88280B16, // 02CB GETMBR R10 R5 K22 + 0xB82E2400, // 02CC GETNGBL R11 K18 + 0x8C2C1725, // 02CD GETMET R11 R11 K37 + 0x7C2C0200, // 02CE CALL R11 1 + 0x8C2C171B, // 02CF GETMET R11 R11 K27 + 0x5834001C, // 02D0 LDCONST R13 K28 + 0x5838001D, // 02D1 LDCONST R14 K29 + 0x7C2C0600, // 02D2 CALL R11 3 + 0x7C200600, // 02D3 CALL R8 3 + 0x80041000, // 02D4 RET 1 R8 + 0x70020027, // 02D5 JMP #02FE + 0x54220010, // 02D6 LDINT R8 17 + 0x1C200E08, // 02D7 EQ R8 R7 R8 + 0x78220005, // 02D8 JMPF R8 #02DF + 0x8C200706, // 02D9 GETMET R8 R3 K6 + 0x88280B10, // 02DA GETMBR R10 R5 K16 + 0x582C0009, // 02DB LDCONST R11 K9 + 0x7C200600, // 02DC CALL R8 3 + 0x80041000, // 02DD RET 1 R8 + 0x7002001E, // 02DE JMP #02FE + 0x54220011, // 02DF LDINT R8 18 + 0x1C200E08, // 02E0 EQ R8 R7 R8 + 0x7822000B, // 02E1 JMPF R8 #02EE + 0x8C200706, // 02E2 GETMET R8 R3 K6 + 0x88280B16, // 02E3 GETMBR R10 R5 K22 + 0xB82E2400, // 02E4 GETNGBL R11 K18 + 0x8C2C1725, // 02E5 GETMET R11 R11 K37 + 0x7C2C0200, // 02E6 CALL R11 1 + 0x8C2C171B, // 02E7 GETMET R11 R11 K27 + 0x5834001C, // 02E8 LDCONST R13 K28 + 0x5838001D, // 02E9 LDCONST R14 K29 + 0x7C2C0600, // 02EA CALL R11 3 + 0x7C200600, // 02EB CALL R8 3 + 0x80041000, // 02EC RET 1 R8 + 0x7002000F, // 02ED JMP #02FE + 0x54220012, // 02EE LDINT R8 19 + 0x1C200E08, // 02EF EQ R8 R7 R8 + 0x7822000C, // 02F0 JMPF R8 #02FE + 0x8C200B0A, // 02F1 GETMET R8 R5 K10 + 0x7C200200, // 02F2 CALL R8 1 + 0x8C24110B, // 02F3 GETMET R9 R8 K11 + 0x582C0005, // 02F4 LDCONST R11 K5 + 0x88300B0C, // 02F5 GETMBR R12 R5 K12 + 0x5834000F, // 02F6 LDCONST R13 K15 + 0x7C240800, // 02F7 CALL R9 4 + 0x8C24110B, // 02F8 GETMET R9 R8 K11 + 0x582C0009, // 02F9 LDCONST R11 K9 + 0x88300B0C, // 02FA GETMBR R12 R5 K12 + 0x5834000F, // 02FB LDCONST R13 K15 + 0x7C240800, // 02FC CALL R9 4 + 0x80041000, // 02FD RET 1 R8 + 0x700200A8, // 02FE JMP #03A8 + 0x5422003E, // 02FF LDINT R8 63 + 0x1C200C08, // 0300 EQ R8 R6 R8 + 0x78220000, // 0301 JMPF R8 #0303 + 0x700200A4, // 0302 JMP #03A8 + 0x54220029, // 0303 LDINT R8 42 + 0x1C200C08, // 0304 EQ R8 R6 R8 + 0x7822001D, // 0305 JMPF R8 #0324 + 0x1C200F05, // 0306 EQ R8 R7 K5 + 0x78220003, // 0307 JMPF R8 #030C + 0x8C200B11, // 0308 GETMET R8 R5 K17 + 0x7C200200, // 0309 CALL R8 1 + 0x80041000, // 030A RET 1 R8 + 0x70020016, // 030B JMP #0323 + 0x1C200F09, // 030C EQ R8 R7 K9 + 0x78220005, // 030D JMPF R8 #0314 + 0x8C200706, // 030E GETMET R8 R3 K6 + 0x88280B10, // 030F GETMBR R10 R5 K16 + 0x582C0005, // 0310 LDCONST R11 K5 + 0x7C200600, // 0311 CALL R8 3 + 0x80041000, // 0312 RET 1 R8 + 0x7002000E, // 0313 JMP #0323 + 0x1C200F0D, // 0314 EQ R8 R7 K13 + 0x78220005, // 0315 JMPF R8 #031C + 0x8C200706, // 0316 GETMET R8 R3 K6 + 0x88280B0E, // 0317 GETMBR R10 R5 K14 + 0x582C0009, // 0318 LDCONST R11 K9 + 0x7C200600, // 0319 CALL R8 3 + 0x80041000, // 031A RET 1 R8 + 0x70020006, // 031B JMP #0323 + 0x1C200F0F, // 031C EQ R8 R7 K15 + 0x78220004, // 031D JMPF R8 #0323 + 0x8C200706, // 031E GETMET R8 R3 K6 + 0x88280B18, // 031F GETMBR R10 R5 K24 + 0x4C2C0000, // 0320 LDNIL R11 + 0x7C200600, // 0321 CALL R8 3 0x80041000, // 0322 RET 1 R8 - 0x70020069, // 0323 JMP #038E - 0x5422002B, // 0324 LDINT R8 44 + 0x70020083, // 0323 JMP #03A8 + 0x5422002A, // 0324 LDINT R8 43 0x1C200C08, // 0325 EQ R8 R6 R8 - 0x7822001C, // 0326 JMPF R8 #0344 + 0x78220016, // 0326 JMPF R8 #033E 0x1C200F05, // 0327 EQ R8 R7 K5 - 0x78220005, // 0328 JMPF R8 #032F + 0x78220007, // 0328 JMPF R8 #0331 0x8C200706, // 0329 GETMET R8 R3 K6 - 0x88280B0E, // 032A GETMBR R10 R5 K14 - 0x582C0009, // 032B LDCONST R11 K9 - 0x7C200600, // 032C CALL R8 3 - 0x80041000, // 032D RET 1 R8 - 0x70020013, // 032E JMP #0343 - 0x1C200F09, // 032F EQ R8 R7 K9 - 0x78220005, // 0330 JMPF R8 #0337 - 0x8C200706, // 0331 GETMET R8 R3 K6 - 0x88280B0E, // 0332 GETMBR R10 R5 K14 - 0x542E0003, // 0333 LDINT R11 4 - 0x7C200600, // 0334 CALL R8 3 - 0x80041000, // 0335 RET 1 R8 - 0x7002000B, // 0336 JMP #0343 - 0x1C200F0D, // 0337 EQ R8 R7 K13 - 0x78220009, // 0338 JMPF R8 #0343 - 0x8C200B11, // 0339 GETMET R8 R5 K17 - 0x7C200200, // 033A CALL R8 1 - 0x8C24110B, // 033B GETMET R9 R8 K11 - 0x4C2C0000, // 033C LDNIL R11 - 0x8C300B57, // 033D GETMET R12 R5 K87 - 0x88380B0E, // 033E GETMBR R14 R5 K14 - 0x543E0003, // 033F LDINT R15 4 - 0x7C300600, // 0340 CALL R12 3 - 0x7C240600, // 0341 CALL R9 3 - 0x80041000, // 0342 RET 1 R8 - 0x70020049, // 0343 JMP #038E - 0x54220030, // 0344 LDINT R8 49 - 0x1C200C08, // 0345 EQ R8 R6 R8 - 0x78220010, // 0346 JMPF R8 #0358 - 0x1C200F0F, // 0347 EQ R8 R7 K15 - 0x78220005, // 0348 JMPF R8 #034F - 0x8C200706, // 0349 GETMET R8 R3 K6 - 0x88280B0E, // 034A GETMBR R10 R5 K14 - 0x542E001D, // 034B LDINT R11 30 - 0x7C200600, // 034C CALL R8 3 - 0x80041000, // 034D RET 1 R8 - 0x70020007, // 034E JMP #0357 - 0x5422FFFB, // 034F LDINT R8 65532 - 0x1C200E08, // 0350 EQ R8 R7 R8 - 0x78220004, // 0351 JMPF R8 #0357 - 0x8C200706, // 0352 GETMET R8 R3 K6 - 0x88280B2A, // 0353 GETMBR R10 R5 K42 - 0x542E0003, // 0354 LDINT R11 4 - 0x7C200600, // 0355 CALL R8 3 - 0x80041000, // 0356 RET 1 R8 - 0x70020035, // 0357 JMP #038E - 0x5422001C, // 0358 LDINT R8 29 - 0x1C200C08, // 0359 EQ R8 R6 R8 - 0x78220029, // 035A JMPF R8 #0385 - 0x1C200F0F, // 035B EQ R8 R7 K15 - 0x7822001D, // 035C JMPF R8 #037B - 0x8C200B11, // 035D GETMET R8 R5 K17 - 0x7C200200, // 035E CALL R8 1 - 0x88240135, // 035F GETMBR R9 R0 K53 - 0x8C241358, // 0360 GETMET R9 R9 K88 - 0x502C0200, // 0361 LDBOOL R11 1 0 - 0x7C240400, // 0362 CALL R9 2 - 0x88280135, // 0363 GETMBR R10 R0 K53 - 0x88281559, // 0364 GETMBR R10 R10 K89 - 0x602C0010, // 0365 GETGBL R11 G16 - 0x5C301200, // 0366 MOVE R12 R9 - 0x7C2C0200, // 0367 CALL R11 1 - 0xA802000C, // 0368 EXBLK 0 #0376 - 0x5C301600, // 0369 MOVE R12 R11 - 0x7C300000, // 036A CALL R12 0 - 0x5C341400, // 036B MOVE R13 R10 - 0x78360002, // 036C JMPF R13 #0370 - 0x5436FEFF, // 036D LDINT R13 65280 - 0x1434180D, // 036E LT R13 R12 R13 - 0x78360004, // 036F JMPF R13 #0375 - 0x8C34110B, // 0370 GETMET R13 R8 K11 - 0x4C3C0000, // 0371 LDNIL R15 - 0x88400B0C, // 0372 GETMBR R16 R5 K12 - 0x5C441800, // 0373 MOVE R17 R12 - 0x7C340800, // 0374 CALL R13 4 - 0x7001FFF2, // 0375 JMP #0369 - 0x582C003C, // 0376 LDCONST R11 K60 - 0xAC2C0200, // 0377 CATCH R11 1 0 - 0xB0080000, // 0378 RAISE 2 R0 R0 - 0x80041000, // 0379 RET 1 R8 - 0x70020008, // 037A JMP #0384 - 0x60200003, // 037B GETGBL R8 G3 - 0x5C240000, // 037C MOVE R9 R0 - 0x7C200200, // 037D CALL R8 1 - 0x8C20115A, // 037E GETMET R8 R8 K90 - 0x5C280200, // 037F MOVE R10 R1 - 0x5C2C0400, // 0380 MOVE R11 R2 - 0x5C300600, // 0381 MOVE R12 R3 - 0x7C200800, // 0382 CALL R8 4 - 0x80041000, // 0383 RET 1 R8 - 0x70020008, // 0384 JMP #038E - 0x60200003, // 0385 GETGBL R8 G3 - 0x5C240000, // 0386 MOVE R9 R0 - 0x7C200200, // 0387 CALL R8 1 - 0x8C20115A, // 0388 GETMET R8 R8 K90 - 0x5C280200, // 0389 MOVE R10 R1 - 0x5C2C0400, // 038A MOVE R11 R2 - 0x5C300600, // 038B MOVE R12 R3 - 0x7C200800, // 038C CALL R8 4 - 0x80041000, // 038D RET 1 R8 - 0x80000000, // 038E RET 0 + 0x88280B16, // 032A GETMBR R10 R5 K22 + 0xB82E2400, // 032B GETNGBL R11 K18 + 0x8C2C1758, // 032C GETMET R11 R11 K88 + 0x7C2C0200, // 032D CALL R11 1 + 0x7C200600, // 032E CALL R8 3 + 0x80041000, // 032F RET 1 R8 + 0x7002000B, // 0330 JMP #033D + 0x1C200F09, // 0331 EQ R8 R7 K9 + 0x78220009, // 0332 JMPF R8 #033D + 0x8C200B11, // 0333 GETMET R8 R5 K17 + 0x7C200200, // 0334 CALL R8 1 + 0x8C24110B, // 0335 GETMET R9 R8 K11 + 0x4C2C0000, // 0336 LDNIL R11 + 0x88300B16, // 0337 GETMBR R12 R5 K22 + 0xB8362400, // 0338 GETNGBL R13 K18 + 0x8C341B58, // 0339 GETMET R13 R13 K88 + 0x7C340200, // 033A CALL R13 1 + 0x7C240800, // 033B CALL R9 4 + 0x80041000, // 033C RET 1 R8 + 0x70020069, // 033D JMP #03A8 + 0x5422002B, // 033E LDINT R8 44 + 0x1C200C08, // 033F EQ R8 R6 R8 + 0x7822001C, // 0340 JMPF R8 #035E + 0x1C200F05, // 0341 EQ R8 R7 K5 + 0x78220005, // 0342 JMPF R8 #0349 + 0x8C200706, // 0343 GETMET R8 R3 K6 + 0x88280B0E, // 0344 GETMBR R10 R5 K14 + 0x582C0009, // 0345 LDCONST R11 K9 + 0x7C200600, // 0346 CALL R8 3 + 0x80041000, // 0347 RET 1 R8 + 0x70020013, // 0348 JMP #035D + 0x1C200F09, // 0349 EQ R8 R7 K9 + 0x78220005, // 034A JMPF R8 #0351 + 0x8C200706, // 034B GETMET R8 R3 K6 + 0x88280B0E, // 034C GETMBR R10 R5 K14 + 0x542E0003, // 034D LDINT R11 4 + 0x7C200600, // 034E CALL R8 3 + 0x80041000, // 034F RET 1 R8 + 0x7002000B, // 0350 JMP #035D + 0x1C200F0D, // 0351 EQ R8 R7 K13 + 0x78220009, // 0352 JMPF R8 #035D + 0x8C200B11, // 0353 GETMET R8 R5 K17 + 0x7C200200, // 0354 CALL R8 1 + 0x8C24110B, // 0355 GETMET R9 R8 K11 + 0x4C2C0000, // 0356 LDNIL R11 + 0x8C300B59, // 0357 GETMET R12 R5 K89 + 0x88380B0E, // 0358 GETMBR R14 R5 K14 + 0x543E0003, // 0359 LDINT R15 4 + 0x7C300600, // 035A CALL R12 3 + 0x7C240600, // 035B CALL R9 3 + 0x80041000, // 035C RET 1 R8 + 0x70020049, // 035D JMP #03A8 + 0x54220030, // 035E LDINT R8 49 + 0x1C200C08, // 035F EQ R8 R6 R8 + 0x78220010, // 0360 JMPF R8 #0372 + 0x1C200F0F, // 0361 EQ R8 R7 K15 + 0x78220005, // 0362 JMPF R8 #0369 + 0x8C200706, // 0363 GETMET R8 R3 K6 + 0x88280B0E, // 0364 GETMBR R10 R5 K14 + 0x542E001D, // 0365 LDINT R11 30 + 0x7C200600, // 0366 CALL R8 3 + 0x80041000, // 0367 RET 1 R8 + 0x70020007, // 0368 JMP #0371 + 0x5422FFFB, // 0369 LDINT R8 65532 + 0x1C200E08, // 036A EQ R8 R7 R8 + 0x78220004, // 036B JMPF R8 #0371 + 0x8C200706, // 036C GETMET R8 R3 K6 + 0x88280B2A, // 036D GETMBR R10 R5 K42 + 0x542E0003, // 036E LDINT R11 4 + 0x7C200600, // 036F CALL R8 3 + 0x80041000, // 0370 RET 1 R8 + 0x70020035, // 0371 JMP #03A8 + 0x5422001C, // 0372 LDINT R8 29 + 0x1C200C08, // 0373 EQ R8 R6 R8 + 0x78220029, // 0374 JMPF R8 #039F + 0x1C200F0F, // 0375 EQ R8 R7 K15 + 0x7822001D, // 0376 JMPF R8 #0395 + 0x8C200B11, // 0377 GETMET R8 R5 K17 + 0x7C200200, // 0378 CALL R8 1 + 0x88240137, // 0379 GETMBR R9 R0 K55 + 0x8C24135A, // 037A GETMET R9 R9 K90 + 0x502C0200, // 037B LDBOOL R11 1 0 + 0x7C240400, // 037C CALL R9 2 + 0x88280137, // 037D GETMBR R10 R0 K55 + 0x8828155B, // 037E GETMBR R10 R10 K91 + 0x602C0010, // 037F GETGBL R11 G16 + 0x5C301200, // 0380 MOVE R12 R9 + 0x7C2C0200, // 0381 CALL R11 1 + 0xA802000C, // 0382 EXBLK 0 #0390 + 0x5C301600, // 0383 MOVE R12 R11 + 0x7C300000, // 0384 CALL R12 0 + 0x5C341400, // 0385 MOVE R13 R10 + 0x78360002, // 0386 JMPF R13 #038A + 0x5436FEFF, // 0387 LDINT R13 65280 + 0x1434180D, // 0388 LT R13 R12 R13 + 0x78360004, // 0389 JMPF R13 #038F + 0x8C34110B, // 038A GETMET R13 R8 K11 + 0x4C3C0000, // 038B LDNIL R15 + 0x88400B0C, // 038C GETMBR R16 R5 K12 + 0x5C441800, // 038D MOVE R17 R12 + 0x7C340800, // 038E CALL R13 4 + 0x7001FFF2, // 038F JMP #0383 + 0x582C003E, // 0390 LDCONST R11 K62 + 0xAC2C0200, // 0391 CATCH R11 1 0 + 0xB0080000, // 0392 RAISE 2 R0 R0 + 0x80041000, // 0393 RET 1 R8 + 0x70020008, // 0394 JMP #039E + 0x60200003, // 0395 GETGBL R8 G3 + 0x5C240000, // 0396 MOVE R9 R0 + 0x7C200200, // 0397 CALL R8 1 + 0x8C20115C, // 0398 GETMET R8 R8 K92 + 0x5C280200, // 0399 MOVE R10 R1 + 0x5C2C0400, // 039A MOVE R11 R2 + 0x5C300600, // 039B MOVE R12 R3 + 0x7C200800, // 039C CALL R8 4 + 0x80041000, // 039D RET 1 R8 + 0x70020008, // 039E JMP #03A8 + 0x60200003, // 039F GETGBL R8 G3 + 0x5C240000, // 03A0 MOVE R9 R0 + 0x7C200200, // 03A1 CALL R8 1 + 0x8C20115C, // 03A2 GETMET R8 R8 K92 + 0x5C280200, // 03A3 MOVE R10 R1 + 0x5C2C0400, // 03A4 MOVE R11 R2 + 0x5C300600, // 03A5 MOVE R12 R3 + 0x7C200800, // 03A6 CALL R8 4 + 0x80041000, // 03A7 RET 1 R8 + 0x80000000, // 03A8 RET 0 }) ) ); diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h index d1685288e..b0e498421 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Session.h @@ -7,11 +7,11 @@ extern const bclass be_class_Matter_Session; /******************************************************************** -** Solidified function: before_remove +** Solidified function: close ********************************************************************/ -be_local_closure(Matter_Session_before_remove, /* name */ +be_local_closure(Matter_Session_close, /* name */ be_nested_proto( - 6, /* nstack */ + 8, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -19,25 +19,93 @@ be_local_closure(Matter_Session_before_remove, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(tasmota), - /* K1 */ be_nested_str_weak(log), - /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), - /* K3 */ be_nested_str_weak(local_session_id), - /* K4 */ be_const_int(3), + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(local_session_id), + /* K1 */ be_nested_str_weak(__future_local_session_id), + /* K2 */ be_nested_str_weak(initiator_session_id), + /* K3 */ be_nested_str_weak(__future_initiator_session_id), + /* K4 */ be_nested_str_weak(_counter_rcv_impl), + /* K5 */ be_nested_str_weak(reset), + /* K6 */ be_nested_str_weak(_counter_snd_impl), + /* K7 */ be_nested_str_weak(counter_rcv), + /* K8 */ be_const_int(0), + /* K9 */ be_nested_str_weak(counter_snd), + /* K10 */ be_nested_str_weak(next), + /* K11 */ be_nested_str_weak(i2rkey), + /* K12 */ be_nested_str_weak(_i2r_privacy), + /* K13 */ be_nested_str_weak(r2ikey), + /* K14 */ be_nested_str_weak(attestation_challenge), + /* K15 */ be_nested_str_weak(introspect), + /* K16 */ be_nested_str_weak(members), + /* K17 */ be_nested_str_weak(get), + /* K18 */ be_nested_str_weak(function), + /* K19 */ be_nested_str_weak(instance), + /* K20 */ be_nested_str_weak(_), + /* K21 */ be_const_int(1), + /* K22 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(before_remove), + be_str_weak(close), &be_const_str_solidified, - ( &(const binstruction[ 9]) { /* code */ - 0xB8060000, // 0000 GETNGBL R1 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x600C0018, // 0002 GETGBL R3 G24 - 0x58100002, // 0003 LDCONST R4 K2 - 0x88140103, // 0004 GETMBR R5 R0 K3 - 0x7C0C0400, // 0005 CALL R3 2 - 0x58100004, // 0006 LDCONST R4 K4 - 0x7C040600, // 0007 CALL R1 3 - 0x80000000, // 0008 RET 0 + ( &(const binstruction[59]) { /* code */ + 0x88040101, // 0000 GETMBR R1 R0 K1 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x88040103, // 0002 GETMBR R1 R0 K3 + 0x90020401, // 0003 SETMBR R0 K2 R1 + 0x88040104, // 0004 GETMBR R1 R0 K4 + 0x8C040305, // 0005 GETMET R1 R1 K5 + 0x7C040200, // 0006 CALL R1 1 + 0x88040106, // 0007 GETMBR R1 R0 K6 + 0x8C040305, // 0008 GETMET R1 R1 K5 + 0x7C040200, // 0009 CALL R1 1 + 0x90020F08, // 000A SETMBR R0 K7 K8 + 0x88040106, // 000B GETMBR R1 R0 K6 + 0x8C04030A, // 000C GETMET R1 R1 K10 + 0x7C040200, // 000D CALL R1 1 + 0x90021201, // 000E SETMBR R0 K9 R1 + 0x4C040000, // 000F LDNIL R1 + 0x90021601, // 0010 SETMBR R0 K11 R1 + 0x4C040000, // 0011 LDNIL R1 + 0x90021801, // 0012 SETMBR R0 K12 R1 + 0x4C040000, // 0013 LDNIL R1 + 0x90021A01, // 0014 SETMBR R0 K13 R1 + 0x4C040000, // 0015 LDNIL R1 + 0x90021C01, // 0016 SETMBR R0 K14 R1 + 0xA4061E00, // 0017 IMPORT R1 K15 + 0x60080010, // 0018 GETGBL R2 G16 + 0x8C0C0310, // 0019 GETMET R3 R1 K16 + 0x5C140000, // 001A MOVE R5 R0 + 0x7C0C0400, // 001B CALL R3 2 + 0x7C080200, // 001C CALL R2 1 + 0xA8020018, // 001D EXBLK 0 #0037 + 0x5C0C0400, // 001E MOVE R3 R2 + 0x7C0C0000, // 001F CALL R3 0 + 0x8C100311, // 0020 GETMET R4 R1 K17 + 0x5C180000, // 0021 MOVE R6 R0 + 0x5C1C0600, // 0022 MOVE R7 R3 + 0x7C100600, // 0023 CALL R4 3 + 0x60140004, // 0024 GETGBL R5 G4 + 0x5C180800, // 0025 MOVE R6 R4 + 0x7C140200, // 0026 CALL R5 1 + 0x20140B12, // 0027 NE R5 R5 K18 + 0x7816000C, // 0028 JMPF R5 #0036 + 0x60140004, // 0029 GETGBL R5 G4 + 0x5C180800, // 002A MOVE R6 R4 + 0x7C140200, // 002B CALL R5 1 + 0x20140B13, // 002C NE R5 R5 K19 + 0x78160007, // 002D JMPF R5 #0036 + 0x94140708, // 002E GETIDX R5 R3 K8 + 0x1C140B14, // 002F EQ R5 R5 K20 + 0x78160004, // 0030 JMPF R5 #0036 + 0x94140715, // 0031 GETIDX R5 R3 K21 + 0x1C140B14, // 0032 EQ R5 R5 K20 + 0x78160001, // 0033 JMPF R5 #0036 + 0x4C140000, // 0034 LDNIL R5 + 0x90000605, // 0035 SETMBR R0 R3 R5 + 0x7001FFE6, // 0036 JMP #001E + 0x58080016, // 0037 LDCONST R2 K22 + 0xAC080200, // 0038 CATCH R2 1 0 + 0xB0080000, // 0039 RAISE 2 R0 R0 + 0x80000000, // 003A RET 0 }) ) ); @@ -45,11 +113,11 @@ be_local_closure(Matter_Session_before_remove, /* name */ /******************************************************************** -** Solidified function: get_pk +** Solidified function: update ********************************************************************/ -be_local_closure(Matter_Session_get_pk, /* name */ +be_local_closure(Matter_Session_update, /* name */ be_nested_proto( - 5, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -57,33 +125,46 @@ be_local_closure(Matter_Session_get_pk, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(get_pk), - /* K2 */ be_nested_str_weak(_temp_pk), - /* K3 */ be_nested_str_weak(crypto), - /* K4 */ be_nested_str_weak(random), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(last_used), + /* K1 */ be_nested_str_weak(tasmota), + /* K2 */ be_nested_str_weak(rtc_utc), }), - be_str_weak(get_pk), + be_str_weak(update), &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ + ( &(const binstruction[ 5]) { /* code */ + 0xB8060200, // 0000 GETNGBL R1 K1 + 0x8C040302, // 0001 GETMET R1 R1 K2 + 0x7C040200, // 0002 CALL R1 1 + 0x90020001, // 0003 SETMBR R0 K0 R1 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ac +********************************************************************/ +be_local_closure(Matter_Session_get_ac, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(attestation_challenge), + }), + be_str_weak(get_ac), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060004, // 0001 JMPF R1 #0007 - 0x88040100, // 0002 GETMBR R1 R0 K0 - 0x8C040301, // 0003 GETMET R1 R1 K1 - 0x7C040200, // 0004 CALL R1 1 - 0x80040200, // 0005 RET 1 R1 - 0x70020008, // 0006 JMP #0010 - 0x88040102, // 0007 GETMBR R1 R0 K2 - 0x74060004, // 0008 JMPT R1 #000E - 0xA4060600, // 0009 IMPORT R1 K3 - 0x8C080304, // 000A GETMET R2 R1 K4 - 0x5412001F, // 000B LDINT R4 32 - 0x7C080400, // 000C CALL R2 2 - 0x90020402, // 000D SETMBR R0 K2 R2 - 0x88040102, // 000E GETMBR R1 R0 K2 - 0x80040200, // 000F RET 1 R1 - 0x80000000, // 0010 RET 0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -91,11 +172,11 @@ be_local_closure(Matter_Session_get_pk, /* name */ /******************************************************************** -** Solidified function: set_mode_CASE +** Solidified function: get_fabric ********************************************************************/ -be_local_closure(Matter_Session_set_mode_CASE, /* name */ +be_local_closure(Matter_Session_get_fabric, /* name */ be_nested_proto( - 4, /* nstack */ + 2, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -103,17 +184,14 @@ be_local_closure(Matter_Session_set_mode_CASE, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(set_mode), - /* K1 */ be_nested_str_weak(_CASE), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), }), - be_str_weak(set_mode_CASE), + be_str_weak(get_fabric), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x7C040400, // 0002 CALL R1 2 - 0x80000000, // 0003 RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -150,50 +228,9 @@ be_local_closure(Matter_Session_get_noc, /* name */ /******************************************************************** -** Solidified function: get_temp_ca_pub +** Solidified function: get_device_id ********************************************************************/ -be_local_closure(Matter_Session_get_temp_ca_pub, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), - /* K1 */ be_nested_str_weak(matter), - /* K2 */ be_nested_str_weak(TLV), - /* K3 */ be_nested_str_weak(parse), - /* K4 */ be_nested_str_weak(findsubval), - }), - be_str_weak(get_temp_ca_pub), - &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x78060008, // 0001 JMPF R1 #000B - 0xB80A0200, // 0002 GETNGBL R2 K1 - 0x88080502, // 0003 GETMBR R2 R2 K2 - 0x8C080503, // 0004 GETMET R2 R2 K3 - 0x5C100200, // 0005 MOVE R4 R1 - 0x7C080400, // 0006 CALL R2 2 - 0x8C0C0504, // 0007 GETMET R3 R2 K4 - 0x54160008, // 0008 LDINT R5 9 - 0x7C0C0400, // 0009 CALL R3 2 - 0x80040600, // 000A RET 1 R3 - 0x80000000, // 000B RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric_compressed -********************************************************************/ -be_local_closure(Matter_Session_get_fabric_compressed, /* name */ +be_local_closure(Matter_Session_get_device_id, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -205,14 +242,18 @@ be_local_closure(Matter_Session_get_fabric_compressed, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_compressed), + /* K1 */ be_nested_str_weak(device_id), }), - be_str_weak(get_fabric_compressed), + be_str_weak(get_device_id), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ + ( &(const binstruction[ 7]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 + 0x78060002, // 0001 JMPF R1 #0005 + 0x88040100, // 0002 GETMBR R1 R0 K0 + 0x88040301, // 0003 GETMBR R1 R1 K1 + 0x70020000, // 0004 JMP #0006 + 0x4C040000, // 0005 LDNIL R1 + 0x80040200, // 0006 RET 1 R1 }) ) ); @@ -220,28 +261,34 @@ be_local_closure(Matter_Session_get_fabric_compressed, /* name */ /******************************************************************** -** Solidified function: get_fabric_label +** Solidified function: set_fabric_label ********************************************************************/ -be_local_closure(Matter_Session_get_fabric_label, /* name */ +be_local_closure(Matter_Session_set_fabric_label, /* name */ be_nested_proto( - 2, /* nstack */ - 1, /* argc */ + 4, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(fabric_label), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(string), + /* K1 */ be_nested_str_weak(_fabric), + /* K2 */ be_nested_str_weak(fabric_label), }), - be_str_weak(get_fabric_label), + be_str_weak(set_fabric_label), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 + ( &(const binstruction[ 8]) { /* code */ + 0x60080004, // 0000 GETGBL R2 G4 + 0x5C0C0200, // 0001 MOVE R3 R1 + 0x7C080200, // 0002 CALL R2 1 + 0x1C080500, // 0003 EQ R2 R2 K0 + 0x780A0001, // 0004 JMPF R2 #0007 + 0x88080101, // 0005 GETMBR R2 R0 K1 + 0x900A0401, // 0006 SETMBR R2 K2 R1 + 0x80000000, // 0007 RET 0 }) ) ); @@ -284,93 +331,6 @@ be_local_closure(Matter_Session_set_keys, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: set_mode_PASE -********************************************************************/ -be_local_closure(Matter_Session_set_mode_PASE, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(set_mode), - /* K1 */ be_nested_str_weak(_PASE), - }), - be_str_weak(set_mode_PASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x880C0101, // 0001 GETMBR R3 R0 K1 - 0x7C040400, // 0002 CALL R1 2 - 0x80000000, // 0003 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_CASE -********************************************************************/ -be_local_closure(Matter_Session_is_CASE, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), - /* K1 */ be_nested_str_weak(_CASE), - }), - be_str_weak(is_CASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_mode -********************************************************************/ -be_local_closure(Matter_Session_get_mode, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), - }), - be_str_weak(get_mode), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: get_r2i ********************************************************************/ @@ -539,651 +499,6 @@ be_local_closure(Matter_Session_tojson, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: get_i2r -********************************************************************/ -be_local_closure(Matter_Session_get_i2r, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(i2rkey), - }), - be_str_weak(get_i2r), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: is_PASE -********************************************************************/ -be_local_closure(Matter_Session_is_PASE, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(mode), - /* K1 */ be_nested_str_weak(_PASE), - }), - be_str_weak(is_PASE), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88080101, // 0001 GETMBR R2 R0 K1 - 0x1C040202, // 0002 EQ R1 R1 R2 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: gen_CSR -********************************************************************/ -be_local_closure(Matter_Session_gen_CSR, /* name */ - be_nested_proto( - 15, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[12]) { /* constants */ - /* K0 */ be_nested_str_weak(get_pk), - /* K1 */ be_nested_str_weak(crypto), - /* K2 */ be_nested_str_weak(EC_P256), - /* K3 */ be_nested_str_weak(public_key), - /* K4 */ be_nested_str_weak(3070020100300E310C300A060355040A0C034353523059301306072A8648CE3D020106082A8648CE3D030107034200), - /* K5 */ be_nested_str_weak(A000), - /* K6 */ be_nested_str_weak(300C06082A8648CE3D0403020500), - /* K7 */ be_nested_str_weak(ecdsa_sign_sha256_asn1), - /* K8 */ be_nested_str_weak(add), - /* K9 */ be_const_int(3), - /* K10 */ be_const_int(1), - /* K11 */ be_const_int(0), - }), - be_str_weak(gen_CSR), - &be_const_str_solidified, - ( &(const binstruction[73]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0xA40A0200, // 0002 IMPORT R2 K1 - 0x8C0C0502, // 0003 GETMET R3 R2 K2 - 0x7C0C0200, // 0004 CALL R3 1 - 0x8C100703, // 0005 GETMET R4 R3 K3 - 0x5C180200, // 0006 MOVE R6 R1 - 0x7C100400, // 0007 CALL R4 2 - 0x60140015, // 0008 GETGBL R5 G21 - 0x58180004, // 0009 LDCONST R6 K4 - 0x7C140200, // 000A CALL R5 1 - 0x40180A04, // 000B CONNECT R6 R5 R4 - 0x60180015, // 000C GETGBL R6 G21 - 0x581C0005, // 000D LDCONST R7 K5 - 0x7C180200, // 000E CALL R6 1 - 0x40180A06, // 000F CONNECT R6 R5 R6 - 0x60180015, // 0010 GETGBL R6 G21 - 0x581C0006, // 0011 LDCONST R7 K6 - 0x7C180200, // 0012 CALL R6 1 - 0x8C1C0707, // 0013 GETMET R7 R3 K7 - 0x5C240200, // 0014 MOVE R9 R1 - 0x5C280A00, // 0015 MOVE R10 R5 - 0x7C1C0600, // 0016 CALL R7 3 - 0x60200015, // 0017 GETGBL R8 G21 - 0x5426007F, // 0018 LDINT R9 128 - 0x7C200200, // 0019 CALL R8 1 - 0x8C241108, // 001A GETMET R9 R8 K8 - 0x582C0009, // 001B LDCONST R11 K9 - 0x5830000A, // 001C LDCONST R12 K10 - 0x7C240600, // 001D CALL R9 3 - 0x8C241108, // 001E GETMET R9 R8 K8 - 0x602C000C, // 001F GETGBL R11 G12 - 0x5C300E00, // 0020 MOVE R12 R7 - 0x7C2C0200, // 0021 CALL R11 1 - 0x002C170A, // 0022 ADD R11 R11 K10 - 0x5830000A, // 0023 LDCONST R12 K10 - 0x7C240600, // 0024 CALL R9 3 - 0x8C241108, // 0025 GETMET R9 R8 K8 - 0x582C000B, // 0026 LDCONST R11 K11 - 0x5830000A, // 0027 LDCONST R12 K10 - 0x7C240600, // 0028 CALL R9 3 - 0x40241007, // 0029 CONNECT R9 R8 R7 - 0x6024000C, // 002A GETGBL R9 G12 - 0x5C280A00, // 002B MOVE R10 R5 - 0x7C240200, // 002C CALL R9 1 - 0x6028000C, // 002D GETGBL R10 G12 - 0x5C2C0C00, // 002E MOVE R11 R6 - 0x7C280200, // 002F CALL R10 1 - 0x0024120A, // 0030 ADD R9 R9 R10 - 0x6028000C, // 0031 GETGBL R10 G12 - 0x5C2C1000, // 0032 MOVE R11 R8 - 0x7C280200, // 0033 CALL R10 1 - 0x0024120A, // 0034 ADD R9 R9 R10 - 0x60280015, // 0035 GETGBL R10 G21 - 0x542E00CF, // 0036 LDINT R11 208 - 0x7C280200, // 0037 CALL R10 1 - 0x8C2C1508, // 0038 GETMET R11 R10 K8 - 0x5436002F, // 0039 LDINT R13 48 - 0x5838000A, // 003A LDCONST R14 K10 - 0x7C2C0600, // 003B CALL R11 3 - 0x8C2C1508, // 003C GETMET R11 R10 K8 - 0x54360080, // 003D LDINT R13 129 - 0x5838000A, // 003E LDCONST R14 K10 - 0x7C2C0600, // 003F CALL R11 3 - 0x8C2C1508, // 0040 GETMET R11 R10 K8 - 0x543600FE, // 0041 LDINT R13 255 - 0x2C34120D, // 0042 AND R13 R9 R13 - 0x5838000A, // 0043 LDCONST R14 K10 - 0x7C2C0600, // 0044 CALL R11 3 - 0x402C1405, // 0045 CONNECT R11 R10 R5 - 0x402C1406, // 0046 CONNECT R11 R10 R6 - 0x402C1408, // 0047 CONNECT R11 R10 R8 - 0x80041400, // 0048 RET 1 R10 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_temp_ca -********************************************************************/ -be_local_closure(Matter_Session_get_temp_ca, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), - }), - be_str_weak(get_temp_ca), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: close -********************************************************************/ -be_local_closure(Matter_Session_close, /* name */ - be_nested_proto( - 8, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(local_session_id), - /* K1 */ be_nested_str_weak(__future_local_session_id), - /* K2 */ be_nested_str_weak(initiator_session_id), - /* K3 */ be_nested_str_weak(__future_initiator_session_id), - /* K4 */ be_nested_str_weak(_counter_rcv_impl), - /* K5 */ be_nested_str_weak(reset), - /* K6 */ be_nested_str_weak(_counter_snd_impl), - /* K7 */ be_nested_str_weak(counter_rcv), - /* K8 */ be_const_int(0), - /* K9 */ be_nested_str_weak(counter_snd), - /* K10 */ be_nested_str_weak(next), - /* K11 */ be_nested_str_weak(i2rkey), - /* K12 */ be_nested_str_weak(_i2r_privacy), - /* K13 */ be_nested_str_weak(r2ikey), - /* K14 */ be_nested_str_weak(attestation_challenge), - /* K15 */ be_nested_str_weak(introspect), - /* K16 */ be_nested_str_weak(members), - /* K17 */ be_nested_str_weak(get), - /* K18 */ be_nested_str_weak(function), - /* K19 */ be_nested_str_weak(instance), - /* K20 */ be_nested_str_weak(_), - /* K21 */ be_const_int(1), - /* K22 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(close), - &be_const_str_solidified, - ( &(const binstruction[59]) { /* code */ - 0x88040101, // 0000 GETMBR R1 R0 K1 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x88040103, // 0002 GETMBR R1 R0 K3 - 0x90020401, // 0003 SETMBR R0 K2 R1 - 0x88040104, // 0004 GETMBR R1 R0 K4 - 0x8C040305, // 0005 GETMET R1 R1 K5 - 0x7C040200, // 0006 CALL R1 1 - 0x88040106, // 0007 GETMBR R1 R0 K6 - 0x8C040305, // 0008 GETMET R1 R1 K5 - 0x7C040200, // 0009 CALL R1 1 - 0x90020F08, // 000A SETMBR R0 K7 K8 - 0x88040106, // 000B GETMBR R1 R0 K6 - 0x8C04030A, // 000C GETMET R1 R1 K10 - 0x7C040200, // 000D CALL R1 1 - 0x90021201, // 000E SETMBR R0 K9 R1 - 0x4C040000, // 000F LDNIL R1 - 0x90021601, // 0010 SETMBR R0 K11 R1 - 0x4C040000, // 0011 LDNIL R1 - 0x90021801, // 0012 SETMBR R0 K12 R1 - 0x4C040000, // 0013 LDNIL R1 - 0x90021A01, // 0014 SETMBR R0 K13 R1 - 0x4C040000, // 0015 LDNIL R1 - 0x90021C01, // 0016 SETMBR R0 K14 R1 - 0xA4061E00, // 0017 IMPORT R1 K15 - 0x60080010, // 0018 GETGBL R2 G16 - 0x8C0C0310, // 0019 GETMET R3 R1 K16 - 0x5C140000, // 001A MOVE R5 R0 - 0x7C0C0400, // 001B CALL R3 2 - 0x7C080200, // 001C CALL R2 1 - 0xA8020018, // 001D EXBLK 0 #0037 - 0x5C0C0400, // 001E MOVE R3 R2 - 0x7C0C0000, // 001F CALL R3 0 - 0x8C100311, // 0020 GETMET R4 R1 K17 - 0x5C180000, // 0021 MOVE R6 R0 - 0x5C1C0600, // 0022 MOVE R7 R3 - 0x7C100600, // 0023 CALL R4 3 - 0x60140004, // 0024 GETGBL R5 G4 - 0x5C180800, // 0025 MOVE R6 R4 - 0x7C140200, // 0026 CALL R5 1 - 0x20140B12, // 0027 NE R5 R5 K18 - 0x7816000C, // 0028 JMPF R5 #0036 - 0x60140004, // 0029 GETGBL R5 G4 - 0x5C180800, // 002A MOVE R6 R4 - 0x7C140200, // 002B CALL R5 1 - 0x20140B13, // 002C NE R5 R5 K19 - 0x78160007, // 002D JMPF R5 #0036 - 0x94140708, // 002E GETIDX R5 R3 K8 - 0x1C140B14, // 002F EQ R5 R5 K20 - 0x78160004, // 0030 JMPF R5 #0036 - 0x94140715, // 0031 GETIDX R5 R3 K21 - 0x1C140B14, // 0032 EQ R5 R5 K20 - 0x78160001, // 0033 JMPF R5 #0036 - 0x4C140000, // 0034 LDNIL R5 - 0x90000605, // 0035 SETMBR R0 R3 R5 - 0x7001FFE6, // 0036 JMP #001E - 0x58080016, // 0037 LDCONST R2 K22 - 0xAC080200, // 0038 CATCH R2 1 0 - 0xB0080000, // 0039 RAISE 2 R0 R0 - 0x80000000, // 003A RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: update -********************************************************************/ -be_local_closure(Matter_Session_update, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(last_used), - /* K1 */ be_nested_str_weak(tasmota), - /* K2 */ be_nested_str_weak(rtc_utc), - }), - be_str_weak(update), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0xB8060200, // 0000 GETNGBL R1 K1 - 0x8C040302, // 0001 GETMET R1 R1 K2 - 0x7C040200, // 0002 CALL R1 1 - 0x90020001, // 0003 SETMBR R0 K0 R1 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_vendor -********************************************************************/ -be_local_closure(Matter_Session_get_admin_vendor, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(admin_vendor), - }), - be_str_weak(get_admin_vendor), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_fabric -********************************************************************/ -be_local_closure(Matter_Session_get_fabric, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - }), - be_str_weak(get_fabric), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x80040200, // 0001 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_admin_subject -********************************************************************/ -be_local_closure(Matter_Session_get_admin_subject, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(admin_subject), - }), - be_str_weak(get_admin_subject), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ipk_group_key -********************************************************************/ -be_local_closure(Matter_Session_get_ipk_group_key, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(get_ipk_group_key), - }), - be_str_weak(get_ipk_group_key), - &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_Session_init, /* name */ - be_nested_proto( - 10, /* nstack */ - 5, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[23]) { /* constants */ - /* K0 */ be_nested_str_weak(crypto), - /* K1 */ be_nested_str_weak(_store), - /* K2 */ be_nested_str_weak(mode), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(local_session_id), - /* K5 */ be_nested_str_weak(initiator_session_id), - /* K6 */ be_nested_str_weak(_counter_snd_impl), - /* K7 */ be_nested_str_weak(matter), - /* K8 */ be_nested_str_weak(Counter), - /* K9 */ be_nested_str_weak(_counter_rcv_impl), - /* K10 */ be_nested_str_weak(counter_rcv), - /* K11 */ be_nested_str_weak(counter_snd), - /* K12 */ be_nested_str_weak(next), - /* K13 */ be_nested_str_weak(_COUNTER_SND_INCR), - /* K14 */ be_nested_str_weak(_counter_insecure_rcv), - /* K15 */ be_nested_str_weak(_counter_insecure_snd), - /* K16 */ be_nested_str_weak(_breadcrumb), - /* K17 */ be_nested_str_weak(_exchange_id), - /* K18 */ be_nested_str_weak(random), - /* K19 */ be_const_int(2), - /* K20 */ be_nested_str_weak(get), - /* K21 */ be_nested_str_weak(_fabric), - /* K22 */ be_nested_str_weak(update), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[41]) { /* code */ - 0xA4160000, // 0000 IMPORT R5 K0 - 0x90020201, // 0001 SETMBR R0 K1 R1 - 0x90020503, // 0002 SETMBR R0 K2 K3 - 0x90020802, // 0003 SETMBR R0 K4 R2 - 0x90020A03, // 0004 SETMBR R0 K5 R3 - 0xB81A0E00, // 0005 GETNGBL R6 K7 - 0x8C180D08, // 0006 GETMET R6 R6 K8 - 0x7C180200, // 0007 CALL R6 1 - 0x90020C06, // 0008 SETMBR R0 K6 R6 - 0xB81A0E00, // 0009 GETNGBL R6 K7 - 0x8C180D08, // 000A GETMET R6 R6 K8 - 0x7C180200, // 000B CALL R6 1 - 0x90021206, // 000C SETMBR R0 K9 R6 - 0x90021503, // 000D SETMBR R0 K10 K3 - 0x88180106, // 000E GETMBR R6 R0 K6 - 0x8C180D0C, // 000F GETMET R6 R6 K12 - 0x7C180200, // 0010 CALL R6 1 - 0x881C010D, // 0011 GETMBR R7 R0 K13 - 0x00180C07, // 0012 ADD R6 R6 R7 - 0x90021606, // 0013 SETMBR R0 K11 R6 - 0xB81A0E00, // 0014 GETNGBL R6 K7 - 0x8C180D08, // 0015 GETMET R6 R6 K8 - 0x7C180200, // 0016 CALL R6 1 - 0x90021C06, // 0017 SETMBR R0 K14 R6 - 0xB81A0E00, // 0018 GETNGBL R6 K7 - 0x8C180D08, // 0019 GETMET R6 R6 K8 - 0x7C180200, // 001A CALL R6 1 - 0x90021E06, // 001B SETMBR R0 K15 R6 - 0x90022103, // 001C SETMBR R0 K16 K3 - 0x8C180B12, // 001D GETMET R6 R5 K18 - 0x58200013, // 001E LDCONST R8 K19 - 0x7C180400, // 001F CALL R6 2 - 0x8C180D14, // 0020 GETMET R6 R6 K20 - 0x58200003, // 0021 LDCONST R8 K3 - 0x58240013, // 0022 LDCONST R9 K19 - 0x7C180600, // 0023 CALL R6 3 - 0x90022206, // 0024 SETMBR R0 K17 R6 - 0x90022A04, // 0025 SETMBR R0 K21 R4 - 0x8C180116, // 0026 GETMET R6 R0 K22 - 0x7C180200, // 0027 CALL R6 1 - 0x80000000, // 0028 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_device_id -********************************************************************/ -be_local_closure(Matter_Session_get_device_id, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(device_id), - }), - be_str_weak(get_device_id), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_fabric_label -********************************************************************/ -be_local_closure(Matter_Session_set_fabric_label, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(string), - /* K1 */ be_nested_str_weak(_fabric), - /* K2 */ be_nested_str_weak(fabric_label), - }), - be_str_weak(set_fabric_label), - &be_const_str_solidified, - ( &(const binstruction[ 8]) { /* code */ - 0x60080004, // 0000 GETGBL R2 G4 - 0x5C0C0200, // 0001 MOVE R3 R1 - 0x7C080200, // 0002 CALL R2 1 - 0x1C080500, // 0003 EQ R2 R2 K0 - 0x780A0001, // 0004 JMPF R2 #0007 - 0x88080101, // 0005 GETMBR R2 R0 K1 - 0x900A0401, // 0006 SETMBR R2 K2 R1 - 0x80000000, // 0007 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: hydrate_post -********************************************************************/ -be_local_closure(Matter_Session_hydrate_post, /* name */ - be_nested_proto( - 4, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_snd_impl), - /* K1 */ be_nested_str_weak(reset), - /* K2 */ be_nested_str_weak(counter_snd), - /* K3 */ be_nested_str_weak(_counter_rcv_impl), - /* K4 */ be_nested_str_weak(counter_rcv), - /* K5 */ be_nested_str_weak(val), - }), - be_str_weak(hydrate_post), - &be_const_str_solidified, - ( &(const binstruction[17]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x880C0102, // 0002 GETMBR R3 R0 K2 - 0x7C040400, // 0003 CALL R1 2 - 0x88040103, // 0004 GETMBR R1 R0 K3 - 0x8C040301, // 0005 GETMET R1 R1 K1 - 0x880C0104, // 0006 GETMBR R3 R0 K4 - 0x7C040400, // 0007 CALL R1 2 - 0x88040100, // 0008 GETMBR R1 R0 K0 - 0x8C040305, // 0009 GETMET R1 R1 K5 - 0x7C040200, // 000A CALL R1 1 - 0x90020401, // 000B SETMBR R0 K2 R1 - 0x88040103, // 000C GETMBR R1 R0 K3 - 0x8C040305, // 000D GETMET R1 R1 K5 - 0x7C040200, // 000E CALL R1 1 - 0x90020801, // 000F SETMBR R0 K4 R1 - 0x80000000, // 0010 RET 0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: fromjson ********************************************************************/ @@ -1300,6 +615,399 @@ be_local_closure(Matter_Session_fromjson, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: gen_CSR +********************************************************************/ +be_local_closure(Matter_Session_gen_CSR, /* name */ + be_nested_proto( + 15, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[12]) { /* constants */ + /* K0 */ be_nested_str_weak(get_pk), + /* K1 */ be_nested_str_weak(crypto), + /* K2 */ be_nested_str_weak(EC_P256), + /* K3 */ be_nested_str_weak(public_key), + /* K4 */ be_nested_str_weak(3070020100300E310C300A060355040A0C034353523059301306072A8648CE3D020106082A8648CE3D030107034200), + /* K5 */ be_nested_str_weak(A000), + /* K6 */ be_nested_str_weak(300C06082A8648CE3D0403020500), + /* K7 */ be_nested_str_weak(ecdsa_sign_sha256_asn1), + /* K8 */ be_nested_str_weak(add), + /* K9 */ be_const_int(3), + /* K10 */ be_const_int(1), + /* K11 */ be_const_int(0), + }), + be_str_weak(gen_CSR), + &be_const_str_solidified, + ( &(const binstruction[73]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0xA40A0200, // 0002 IMPORT R2 K1 + 0x8C0C0502, // 0003 GETMET R3 R2 K2 + 0x7C0C0200, // 0004 CALL R3 1 + 0x8C100703, // 0005 GETMET R4 R3 K3 + 0x5C180200, // 0006 MOVE R6 R1 + 0x7C100400, // 0007 CALL R4 2 + 0x60140015, // 0008 GETGBL R5 G21 + 0x58180004, // 0009 LDCONST R6 K4 + 0x7C140200, // 000A CALL R5 1 + 0x40180A04, // 000B CONNECT R6 R5 R4 + 0x60180015, // 000C GETGBL R6 G21 + 0x581C0005, // 000D LDCONST R7 K5 + 0x7C180200, // 000E CALL R6 1 + 0x40180A06, // 000F CONNECT R6 R5 R6 + 0x60180015, // 0010 GETGBL R6 G21 + 0x581C0006, // 0011 LDCONST R7 K6 + 0x7C180200, // 0012 CALL R6 1 + 0x8C1C0707, // 0013 GETMET R7 R3 K7 + 0x5C240200, // 0014 MOVE R9 R1 + 0x5C280A00, // 0015 MOVE R10 R5 + 0x7C1C0600, // 0016 CALL R7 3 + 0x60200015, // 0017 GETGBL R8 G21 + 0x5426007F, // 0018 LDINT R9 128 + 0x7C200200, // 0019 CALL R8 1 + 0x8C241108, // 001A GETMET R9 R8 K8 + 0x582C0009, // 001B LDCONST R11 K9 + 0x5830000A, // 001C LDCONST R12 K10 + 0x7C240600, // 001D CALL R9 3 + 0x8C241108, // 001E GETMET R9 R8 K8 + 0x602C000C, // 001F GETGBL R11 G12 + 0x5C300E00, // 0020 MOVE R12 R7 + 0x7C2C0200, // 0021 CALL R11 1 + 0x002C170A, // 0022 ADD R11 R11 K10 + 0x5830000A, // 0023 LDCONST R12 K10 + 0x7C240600, // 0024 CALL R9 3 + 0x8C241108, // 0025 GETMET R9 R8 K8 + 0x582C000B, // 0026 LDCONST R11 K11 + 0x5830000A, // 0027 LDCONST R12 K10 + 0x7C240600, // 0028 CALL R9 3 + 0x40241007, // 0029 CONNECT R9 R8 R7 + 0x6024000C, // 002A GETGBL R9 G12 + 0x5C280A00, // 002B MOVE R10 R5 + 0x7C240200, // 002C CALL R9 1 + 0x6028000C, // 002D GETGBL R10 G12 + 0x5C2C0C00, // 002E MOVE R11 R6 + 0x7C280200, // 002F CALL R10 1 + 0x0024120A, // 0030 ADD R9 R9 R10 + 0x6028000C, // 0031 GETGBL R10 G12 + 0x5C2C1000, // 0032 MOVE R11 R8 + 0x7C280200, // 0033 CALL R10 1 + 0x0024120A, // 0034 ADD R9 R9 R10 + 0x60280015, // 0035 GETGBL R10 G21 + 0x542E00CF, // 0036 LDINT R11 208 + 0x7C280200, // 0037 CALL R10 1 + 0x8C2C1508, // 0038 GETMET R11 R10 K8 + 0x5436002F, // 0039 LDINT R13 48 + 0x5838000A, // 003A LDCONST R14 K10 + 0x7C2C0600, // 003B CALL R11 3 + 0x8C2C1508, // 003C GETMET R11 R10 K8 + 0x54360080, // 003D LDINT R13 129 + 0x5838000A, // 003E LDCONST R14 K10 + 0x7C2C0600, // 003F CALL R11 3 + 0x8C2C1508, // 0040 GETMET R11 R10 K8 + 0x543600FE, // 0041 LDINT R13 255 + 0x2C34120D, // 0042 AND R13 R9 R13 + 0x5838000A, // 0043 LDCONST R14 K10 + 0x7C2C0600, // 0044 CALL R11 3 + 0x402C1405, // 0045 CONNECT R11 R10 R5 + 0x402C1406, // 0046 CONNECT R11 R10 R6 + 0x402C1408, // 0047 CONNECT R11 R10 R8 + 0x80041400, // 0048 RET 1 R10 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ipk_epoch_key +********************************************************************/ +be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(ipk_epoch_key), + }), + be_str_weak(get_ipk_epoch_key), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: counter_rcv_validate +********************************************************************/ +be_local_closure(Matter_Session_counter_rcv_validate, /* name */ + be_nested_proto( + 7, /* nstack */ + 3, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_rcv_impl), + /* K1 */ be_nested_str_weak(validate), + /* K2 */ be_nested_str_weak(counter_rcv), + /* K3 */ be_nested_str_weak(val), + }), + be_str_weak(counter_rcv_validate), + &be_const_str_solidified, + ( &(const binstruction[11]) { /* code */ + 0x880C0100, // 0000 GETMBR R3 R0 K0 + 0x8C0C0701, // 0001 GETMET R3 R3 K1 + 0x5C140200, // 0002 MOVE R5 R1 + 0x5C180400, // 0003 MOVE R6 R2 + 0x7C0C0600, // 0004 CALL R3 3 + 0x780E0003, // 0005 JMPF R3 #000A + 0x88100100, // 0006 GETMBR R4 R0 K0 + 0x8C100903, // 0007 GETMET R4 R4 K3 + 0x7C100200, // 0008 CALL R4 1 + 0x90020404, // 0009 SETMBR R0 K2 R4 + 0x80040600, // 000A RET 1 R3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_admin_subject +********************************************************************/ +be_local_closure(Matter_Session_get_admin_subject, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(admin_subject), + }), + be_str_weak(get_admin_subject), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_compressed +********************************************************************/ +be_local_closure(Matter_Session_get_fabric_compressed, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(fabric_compressed), + }), + be_str_weak(get_fabric_compressed), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: persist_to_fabric +********************************************************************/ +be_local_closure(Matter_Session_persist_to_fabric, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(add_session), + }), + be_str_weak(persist_to_fabric), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x5C0C0000, // 0002 MOVE R3 R0 + 0x7C040400, // 0003 CALL R1 2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca +********************************************************************/ +be_local_closure(Matter_Session_get_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(root_ca_certificate), + }), + be_str_weak(get_ca), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_PASE +********************************************************************/ +be_local_closure(Matter_Session_is_PASE, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(mode), + /* K1 */ be_nested_str_weak(_PASE), + }), + be_str_weak(is_PASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: is_CASE +********************************************************************/ +be_local_closure(Matter_Session_is_CASE, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(mode), + /* K1 */ be_nested_str_weak(_CASE), + }), + be_str_weak(is_CASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x1C040202, // 0002 EQ R1 R1 R2 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: before_remove +********************************************************************/ +be_local_closure(Matter_Session_before_remove, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(tasmota), + /* K1 */ be_nested_str_weak(log), + /* K2 */ be_nested_str_weak(MTR_X3A_X20_X2DSession_X20_X20_X20_X28_X256i_X29_X20_X28removed_X29), + /* K3 */ be_nested_str_weak(local_session_id), + /* K4 */ be_const_int(3), + }), + be_str_weak(before_remove), + &be_const_str_solidified, + ( &(const binstruction[ 9]) { /* code */ + 0xB8060000, // 0000 GETNGBL R1 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x600C0018, // 0002 GETGBL R3 G24 + 0x58100002, // 0003 LDCONST R4 K2 + 0x88140103, // 0004 GETMBR R5 R0 K3 + 0x7C0C0400, // 0005 CALL R3 2 + 0x58100004, // 0006 LDCONST R4 K4 + 0x7C040600, // 0007 CALL R1 3 + 0x80000000, // 0008 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: save ********************************************************************/ @@ -1360,12 +1068,113 @@ be_local_closure(Matter_Session_get_fabric_id, /* name */ /******************************************************************** -** Solidified function: set_mode +** Solidified function: get_ipk_group_key ********************************************************************/ -be_local_closure(Matter_Session_set_mode, /* name */ +be_local_closure(Matter_Session_get_ipk_group_key, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_ipk_group_key), + }), + be_str_weak(get_ipk_group_key), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_temp_ca_pub +********************************************************************/ +be_local_closure(Matter_Session_get_temp_ca_pub, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), + /* K1 */ be_nested_str_weak(matter), + /* K2 */ be_nested_str_weak(TLV), + /* K3 */ be_nested_str_weak(parse), + /* K4 */ be_nested_str_weak(findsubval), + }), + be_str_weak(get_temp_ca_pub), + &be_const_str_solidified, + ( &(const binstruction[12]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060008, // 0001 JMPF R1 #000B + 0xB80A0200, // 0002 GETNGBL R2 K1 + 0x88080502, // 0003 GETMBR R2 R2 K2 + 0x8C080503, // 0004 GETMET R2 R2 K3 + 0x5C100200, // 0005 MOVE R4 R1 + 0x7C080400, // 0006 CALL R2 2 + 0x8C0C0504, // 0007 GETMET R3 R2 K4 + 0x54160008, // 0008 LDINT R5 9 + 0x7C0C0400, // 0009 CALL R3 2 + 0x80040600, // 000A RET 1 R3 + 0x80000000, // 000B RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_ca_pub +********************************************************************/ +be_local_closure(Matter_Session_get_ca_pub, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_ca_pub), + }), + be_str_weak(get_ca_pub), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_mode +********************************************************************/ +be_local_closure(Matter_Session_get_mode, /* name */ be_nested_proto( 2, /* nstack */ - 2, /* argc */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ @@ -1375,11 +1184,11 @@ be_local_closure(Matter_Session_set_mode, /* name */ ( &(const bvalue[ 1]) { /* constants */ /* K0 */ be_nested_str_weak(mode), }), - be_str_weak(set_mode), + be_str_weak(get_mode), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -1387,26 +1196,186 @@ be_local_closure(Matter_Session_set_mode, /* name */ /******************************************************************** -** Solidified function: set_temp_ca +** Solidified function: hydrate_post ********************************************************************/ -be_local_closure(Matter_Session_set_temp_ca, /* name */ +be_local_closure(Matter_Session_hydrate_post, /* name */ be_nested_proto( - 2, /* nstack */ - 2, /* argc */ + 4, /* nstack */ + 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_snd_impl), + /* K1 */ be_nested_str_weak(reset), + /* K2 */ be_nested_str_weak(counter_snd), + /* K3 */ be_nested_str_weak(_counter_rcv_impl), + /* K4 */ be_nested_str_weak(counter_rcv), + /* K5 */ be_nested_str_weak(val), }), - be_str_weak(set_temp_ca), + be_str_weak(hydrate_post), &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x880C0102, // 0002 GETMBR R3 R0 K2 + 0x7C040400, // 0003 CALL R1 2 + 0x88040103, // 0004 GETMBR R1 R0 K3 + 0x8C040301, // 0005 GETMET R1 R1 K1 + 0x880C0104, // 0006 GETMBR R3 R0 K4 + 0x7C040400, // 0007 CALL R1 2 + 0x88040100, // 0008 GETMBR R1 R0 K0 + 0x8C040305, // 0009 GETMET R1 R1 K5 + 0x7C040200, // 000A CALL R1 1 + 0x90020401, // 000B SETMBR R0 K2 R1 + 0x88040103, // 000C GETMBR R1 R0 K3 + 0x8C040305, // 000D GETMET R1 R1 K5 + 0x7C040200, // 000E CALL R1 1 + 0x90020801, // 000F SETMBR R0 K4 R1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_label +********************************************************************/ +be_local_closure(Matter_Session_get_fabric_label, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(fabric_label), + }), + be_str_weak(get_fabric_label), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_icac +********************************************************************/ +be_local_closure(Matter_Session_get_icac, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(icac), + }), + be_str_weak(get_icac), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x88040301, // 0001 GETMBR R1 R1 K1 + 0x80040200, // 0002 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode_CASE +********************************************************************/ +be_local_closure(Matter_Session_set_mode_CASE, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(set_mode), + /* K1 */ be_nested_str_weak(_CASE), + }), + be_str_weak(set_mode_CASE), + &be_const_str_solidified, + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: counter_snd_next +********************************************************************/ +be_local_closure(Matter_Session_counter_snd_next, /* name */ + be_nested_proto( + 6, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ + /* K0 */ be_nested_str_weak(_counter_snd_impl), + /* K1 */ be_nested_str_weak(next), + /* K2 */ be_nested_str_weak(matter), + /* K3 */ be_nested_str_weak(Counter), + /* K4 */ be_nested_str_weak(is_greater), + /* K5 */ be_nested_str_weak(counter_snd), + /* K6 */ be_nested_str_weak(_COUNTER_SND_INCR), + /* K7 */ be_nested_str_weak(does_persist), + /* K8 */ be_nested_str_weak(save), + }), + be_str_weak(counter_snd_next), + &be_const_str_solidified, + ( &(const binstruction[19]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x8C040301, // 0001 GETMET R1 R1 K1 + 0x7C040200, // 0002 CALL R1 1 + 0xB80A0400, // 0003 GETNGBL R2 K2 + 0x88080503, // 0004 GETMBR R2 R2 K3 + 0x8C080504, // 0005 GETMET R2 R2 K4 + 0x5C100200, // 0006 MOVE R4 R1 + 0x88140105, // 0007 GETMBR R5 R0 K5 + 0x7C080600, // 0008 CALL R2 3 + 0x780A0007, // 0009 JMPF R2 #0012 + 0x88080106, // 000A GETMBR R2 R0 K6 + 0x00080202, // 000B ADD R2 R1 R2 + 0x90020A02, // 000C SETMBR R0 K5 R2 + 0x8C080107, // 000D GETMET R2 R0 K7 + 0x7C080200, // 000E CALL R2 1 + 0x780A0001, // 000F JMPF R2 #0012 + 0x8C080108, // 0010 GETMET R2 R0 K8 + 0x7C080200, // 0011 CALL R2 1 + 0x80040200, // 0012 RET 1 R1 }) ) ); @@ -1467,38 +1436,9 @@ be_local_closure(Matter_Session_get_i2r_privacy, /* name */ /******************************************************************** -** Solidified function: get_ca +** Solidified function: get_i2r ********************************************************************/ -be_local_closure(Matter_Session_get_ca, /* name */ - be_nested_proto( - 2, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(root_ca_certificate), - }), - be_str_weak(get_ca), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_ac -********************************************************************/ -be_local_closure(Matter_Session_get_ac, /* name */ +be_local_closure(Matter_Session_get_i2r, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -1509,9 +1449,9 @@ be_local_closure(Matter_Session_get_ac, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(attestation_challenge), + /* K0 */ be_nested_str_weak(i2rkey), }), - be_str_weak(get_ac), + be_str_weak(get_i2r), &be_const_str_solidified, ( &(const binstruction[ 2]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -1523,100 +1463,9 @@ be_local_closure(Matter_Session_get_ac, /* name */ /******************************************************************** -** Solidified function: counter_snd_next +** Solidified function: get_admin_vendor ********************************************************************/ -be_local_closure(Matter_Session_counter_snd_next, /* name */ - be_nested_proto( - 6, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_snd_impl), - /* K1 */ be_nested_str_weak(next), - /* K2 */ be_nested_str_weak(matter), - /* K3 */ be_nested_str_weak(Counter), - /* K4 */ be_nested_str_weak(is_greater), - /* K5 */ be_nested_str_weak(counter_snd), - /* K6 */ be_nested_str_weak(_COUNTER_SND_INCR), - /* K7 */ be_nested_str_weak(does_persist), - /* K8 */ be_nested_str_weak(save), - }), - be_str_weak(counter_snd_next), - &be_const_str_solidified, - ( &(const binstruction[19]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0xB80A0400, // 0003 GETNGBL R2 K2 - 0x88080503, // 0004 GETMBR R2 R2 K3 - 0x8C080504, // 0005 GETMET R2 R2 K4 - 0x5C100200, // 0006 MOVE R4 R1 - 0x88140105, // 0007 GETMBR R5 R0 K5 - 0x7C080600, // 0008 CALL R2 3 - 0x780A0007, // 0009 JMPF R2 #0012 - 0x88080106, // 000A GETMBR R2 R0 K6 - 0x00080202, // 000B ADD R2 R1 R2 - 0x90020A02, // 000C SETMBR R0 K5 R2 - 0x8C080107, // 000D GETMET R2 R0 K7 - 0x7C080200, // 000E CALL R2 1 - 0x780A0001, // 000F JMPF R2 #0012 - 0x8C080108, // 0010 GETMET R2 R0 K8 - 0x7C080200, // 0011 CALL R2 1 - 0x80040200, // 0012 RET 1 R1 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: counter_rcv_validate -********************************************************************/ -be_local_closure(Matter_Session_counter_rcv_validate, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(_counter_rcv_impl), - /* K1 */ be_nested_str_weak(validate), - /* K2 */ be_nested_str_weak(counter_rcv), - /* K3 */ be_nested_str_weak(val), - }), - be_str_weak(counter_rcv_validate), - &be_const_str_solidified, - ( &(const binstruction[11]) { /* code */ - 0x880C0100, // 0000 GETMBR R3 R0 K0 - 0x8C0C0701, // 0001 GETMET R3 R3 K1 - 0x5C140200, // 0002 MOVE R5 R1 - 0x5C180400, // 0003 MOVE R6 R2 - 0x7C0C0600, // 0004 CALL R3 3 - 0x780E0003, // 0005 JMPF R3 #000A - 0x88100100, // 0006 GETMBR R4 R0 K0 - 0x8C100903, // 0007 GETMET R4 R4 K3 - 0x7C100200, // 0008 CALL R4 1 - 0x90020404, // 0009 SETMBR R0 K2 R4 - 0x80040600, // 000A RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: get_icac -********************************************************************/ -be_local_closure(Matter_Session_get_icac, /* name */ +be_local_closure(Matter_Session_get_admin_vendor, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -1628,9 +1477,9 @@ be_local_closure(Matter_Session_get_icac, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(icac), + /* K1 */ be_nested_str_weak(admin_vendor), }), - be_str_weak(get_icac), + be_str_weak(get_admin_vendor), &be_const_str_solidified, ( &(const binstruction[ 3]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 @@ -1643,29 +1492,26 @@ be_local_closure(Matter_Session_get_icac, /* name */ /******************************************************************** -** Solidified function: get_ca_pub +** Solidified function: set_temp_ca ********************************************************************/ -be_local_closure(Matter_Session_get_ca_pub, /* name */ +be_local_closure(Matter_Session_set_temp_ca, /* name */ be_nested_proto( - 3, /* nstack */ - 1, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(get_ca_pub), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), }), - be_str_weak(get_ca_pub), + be_str_weak(set_temp_ca), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -1673,9 +1519,97 @@ be_local_closure(Matter_Session_get_ca_pub, /* name */ /******************************************************************** -** Solidified function: get_ipk_epoch_key +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ +be_local_closure(Matter_Session_init, /* name */ + be_nested_proto( + 10, /* nstack */ + 5, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str_weak(crypto), + /* K1 */ be_nested_str_weak(_store), + /* K2 */ be_nested_str_weak(mode), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(local_session_id), + /* K5 */ be_nested_str_weak(initiator_session_id), + /* K6 */ be_nested_str_weak(_counter_snd_impl), + /* K7 */ be_nested_str_weak(matter), + /* K8 */ be_nested_str_weak(Counter), + /* K9 */ be_nested_str_weak(_counter_rcv_impl), + /* K10 */ be_nested_str_weak(counter_rcv), + /* K11 */ be_nested_str_weak(counter_snd), + /* K12 */ be_nested_str_weak(next), + /* K13 */ be_nested_str_weak(_COUNTER_SND_INCR), + /* K14 */ be_nested_str_weak(_counter_insecure_rcv), + /* K15 */ be_nested_str_weak(_counter_insecure_snd), + /* K16 */ be_nested_str_weak(_breadcrumb), + /* K17 */ be_nested_str_weak(_exchange_id), + /* K18 */ be_nested_str_weak(random), + /* K19 */ be_const_int(2), + /* K20 */ be_nested_str_weak(get), + /* K21 */ be_nested_str_weak(_fabric), + /* K22 */ be_nested_str_weak(update), + }), + be_str_weak(init), + &be_const_str_solidified, + ( &(const binstruction[41]) { /* code */ + 0xA4160000, // 0000 IMPORT R5 K0 + 0x90020201, // 0001 SETMBR R0 K1 R1 + 0x90020503, // 0002 SETMBR R0 K2 K3 + 0x90020802, // 0003 SETMBR R0 K4 R2 + 0x90020A03, // 0004 SETMBR R0 K5 R3 + 0xB81A0E00, // 0005 GETNGBL R6 K7 + 0x8C180D08, // 0006 GETMET R6 R6 K8 + 0x7C180200, // 0007 CALL R6 1 + 0x90020C06, // 0008 SETMBR R0 K6 R6 + 0xB81A0E00, // 0009 GETNGBL R6 K7 + 0x8C180D08, // 000A GETMET R6 R6 K8 + 0x7C180200, // 000B CALL R6 1 + 0x90021206, // 000C SETMBR R0 K9 R6 + 0x90021503, // 000D SETMBR R0 K10 K3 + 0x88180106, // 000E GETMBR R6 R0 K6 + 0x8C180D0C, // 000F GETMET R6 R6 K12 + 0x7C180200, // 0010 CALL R6 1 + 0x881C010D, // 0011 GETMBR R7 R0 K13 + 0x00180C07, // 0012 ADD R6 R6 R7 + 0x90021606, // 0013 SETMBR R0 K11 R6 + 0xB81A0E00, // 0014 GETNGBL R6 K7 + 0x8C180D08, // 0015 GETMET R6 R6 K8 + 0x7C180200, // 0016 CALL R6 1 + 0x90021C06, // 0017 SETMBR R0 K14 R6 + 0xB81A0E00, // 0018 GETNGBL R6 K7 + 0x8C180D08, // 0019 GETMET R6 R6 K8 + 0x7C180200, // 001A CALL R6 1 + 0x90021E06, // 001B SETMBR R0 K15 R6 + 0x90022103, // 001C SETMBR R0 K16 K3 + 0x8C180B12, // 001D GETMET R6 R5 K18 + 0x58200013, // 001E LDCONST R8 K19 + 0x7C180400, // 001F CALL R6 2 + 0x8C180D14, // 0020 GETMET R6 R6 K20 + 0x58200003, // 0021 LDCONST R8 K3 + 0x58240013, // 0022 LDCONST R9 K19 + 0x7C180600, // 0023 CALL R6 3 + 0x90022206, // 0024 SETMBR R0 K17 R6 + 0x90022A04, // 0025 SETMBR R0 K21 R4 + 0x8C180116, // 0026 GETMET R6 R0 K22 + 0x7C180200, // 0027 CALL R6 1 + 0x80000000, // 0028 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_fabric_index +********************************************************************/ +be_local_closure(Matter_Session_get_fabric_index, /* name */ be_nested_proto( 2, /* nstack */ 1, /* argc */ @@ -1687,14 +1621,18 @@ be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(ipk_epoch_key), + /* K1 */ be_nested_str_weak(fabric_index), }), - be_str_weak(get_ipk_epoch_key), + be_str_weak(get_fabric_index), &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ + ( &(const binstruction[ 7]) { /* code */ 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x88040301, // 0001 GETMBR R1 R1 K1 - 0x80040200, // 0002 RET 1 R1 + 0x78060002, // 0001 JMPF R1 #0005 + 0x88040100, // 0002 GETMBR R1 R0 K0 + 0x88040301, // 0003 GETMBR R1 R1 K1 + 0x70020000, // 0004 JMP #0006 + 0x4C040000, // 0005 LDNIL R1 + 0x80040200, // 0006 RET 1 R1 }) ) ); @@ -1702,9 +1640,82 @@ be_local_closure(Matter_Session_get_ipk_epoch_key, /* name */ /******************************************************************** -** Solidified function: persist_to_fabric +** Solidified function: get_temp_ca ********************************************************************/ -be_local_closure(Matter_Session_persist_to_fabric, /* name */ +be_local_closure(Matter_Session_get_temp_ca, /* name */ + be_nested_proto( + 2, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(_temp_root_ca_certificate), + }), + be_str_weak(get_temp_ca), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: get_pk +********************************************************************/ +be_local_closure(Matter_Session_get_pk, /* name */ + be_nested_proto( + 5, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_nested_str_weak(_fabric), + /* K1 */ be_nested_str_weak(get_pk), + /* K2 */ be_nested_str_weak(_temp_pk), + /* K3 */ be_nested_str_weak(crypto), + /* K4 */ be_nested_str_weak(random), + }), + be_str_weak(get_pk), + &be_const_str_solidified, + ( &(const binstruction[17]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x78060004, // 0001 JMPF R1 #0007 + 0x88040100, // 0002 GETMBR R1 R0 K0 + 0x8C040301, // 0003 GETMET R1 R1 K1 + 0x7C040200, // 0004 CALL R1 1 + 0x80040200, // 0005 RET 1 R1 + 0x70020008, // 0006 JMP #0010 + 0x88040102, // 0007 GETMBR R1 R0 K2 + 0x74060004, // 0008 JMPT R1 #000E + 0xA4060600, // 0009 IMPORT R1 K3 + 0x8C080304, // 000A GETMET R2 R1 K4 + 0x5412001F, // 000B LDINT R4 32 + 0x7C080400, // 000C CALL R2 2 + 0x90020402, // 000D SETMBR R0 K2 R2 + 0x88040102, // 000E GETMBR R1 R0 K2 + 0x80040200, // 000F RET 1 R1 + 0x80000000, // 0010 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode_PASE +********************************************************************/ +be_local_closure(Matter_Session_set_mode_PASE, /* name */ be_nested_proto( 4, /* nstack */ 1, /* argc */ @@ -1715,17 +1726,43 @@ be_local_closure(Matter_Session_persist_to_fabric, /* name */ NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(_fabric), - /* K1 */ be_nested_str_weak(add_session), + /* K0 */ be_nested_str_weak(set_mode), + /* K1 */ be_nested_str_weak(_PASE), }), - be_str_weak(persist_to_fabric), + be_str_weak(set_mode_PASE), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x8C040301, // 0001 GETMET R1 R1 K1 - 0x5C0C0000, // 0002 MOVE R3 R0 - 0x7C040400, // 0003 CALL R1 2 - 0x80000000, // 0004 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x880C0101, // 0001 GETMBR R3 R0 K1 + 0x7C040400, // 0002 CALL R1 2 + 0x80000000, // 0003 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_mode +********************************************************************/ +be_local_closure(Matter_Session_set_mode, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(mode), + }), + be_str_weak(set_mode), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -1739,91 +1776,92 @@ extern const bclass be_class_Matter_Expirable; be_local_class(Matter_Session, 38, &be_class_Matter_Expirable, - be_nested_map(83, + be_nested_map(84, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(resumption_id, -1), be_const_var(28) }, - { be_const_key_weak(mode, 4), be_const_var(1) }, - { be_const_key_weak(get_pk, -1), be_const_closure(Matter_Session_get_pk_closure) }, - { be_const_key_weak(set_mode_CASE, 65), be_const_closure(Matter_Session_set_mode_CASE_closure) }, - { be_const_key_weak(__spake_cA, 22), be_const_var(33) }, - { be_const_key_weak(__initiator_pub, -1), be_const_var(32) }, - { be_const_key_weak(get_temp_ca_pub, 55), be_const_closure(Matter_Session_get_temp_ca_pub_closure) }, - { be_const_key_weak(get_i2r, -1), be_const_closure(Matter_Session_get_i2r_closure) }, - { be_const_key_weak(_ip, 82), be_const_var(17) }, - { be_const_key_weak(__Msg2, -1), be_const_var(36) }, - { be_const_key_weak(get_fabric_label, 59), be_const_closure(Matter_Session_get_fabric_label_closure) }, - { be_const_key_weak(__future_initiator_session_id, -1), be_const_var(10) }, - { be_const_key_weak(set_keys, 0), be_const_closure(Matter_Session_set_keys_closure) }, - { be_const_key_weak(set_mode_PASE, -1), be_const_closure(Matter_Session_set_mode_PASE_closure) }, - { be_const_key_weak(_fabric, 7), be_const_var(2) }, - { be_const_key_weak(get_temp_ca, -1), be_const_closure(Matter_Session_get_temp_ca_closure) }, - { be_const_key_weak(attestation_challenge, -1), be_const_var(25) }, - { be_const_key_weak(_temp_pk, -1), be_const_var(9) }, - { be_const_key_weak(last_used, -1), be_const_var(6) }, - { be_const_key_weak(peer_node_id, -1), be_const_var(26) }, - { be_const_key_weak(is_CASE, -1), be_const_closure(Matter_Session_is_CASE_closure) }, - { be_const_key_weak(get_ipk_epoch_key, 80), be_const_closure(Matter_Session_get_ipk_epoch_key_closure) }, - { be_const_key_weak(_exchange_id, -1), be_const_var(16) }, - { be_const_key_weak(__chunked_attr_reports, -1), be_const_var(37) }, - { be_const_key_weak(counter_snd, -1), be_const_var(13) }, - { be_const_key_weak(_i2r_privacy, -1), be_const_var(24) }, - { be_const_key_weak(_PASE, -1), be_const_int(1) }, - { be_const_key_weak(get_mode, 1), be_const_closure(Matter_Session_get_mode_closure) }, - { be_const_key_weak(get_icac, 53), be_const_closure(Matter_Session_get_icac_closure) }, - { be_const_key_weak(is_PASE, -1), be_const_closure(Matter_Session_is_PASE_closure) }, - { be_const_key_weak(gen_CSR, -1), be_const_closure(Matter_Session_gen_CSR_closure) }, - { be_const_key_weak(_message_handler, 51), be_const_var(19) }, - { be_const_key_weak(__spake_Ke, -1), be_const_var(34) }, - { be_const_key_weak(get_admin_subject, -1), be_const_closure(Matter_Session_get_admin_subject_closure) }, - { be_const_key_weak(before_remove, 73), be_const_closure(Matter_Session_before_remove_closure) }, - { be_const_key_weak(__responder_pub, -1), be_const_var(31) }, - { be_const_key_weak(i2rkey, -1), be_const_var(22) }, - { be_const_key_weak(created, -1), be_const_var(5) }, - { be_const_key_weak(_CASE, -1), be_const_int(2) }, - { be_const_key_weak(_port, -1), be_const_var(18) }, - { be_const_key_weak(_store, -1), be_const_var(0) }, - { be_const_key_weak(get_device_id, -1), be_const_closure(Matter_Session_get_device_id_closure) }, - { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Session_get_admin_vendor_closure) }, - { be_const_key_weak(get_fabric, -1), be_const_closure(Matter_Session_get_fabric_closure) }, - { be_const_key_weak(_counter_insecure_rcv, 28), be_const_var(20) }, - { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Session_get_ipk_group_key_closure) }, - { be_const_key_weak(__responder_priv, -1), be_const_var(30) }, - { be_const_key_weak(_GROUP_KEY, 56), be_nested_str_weak(GroupKey_X20v1_X2E0) }, - { be_const_key_weak(_temp_root_ca_certificate, -1), be_const_var(8) }, - { be_const_key_weak(init, -1), be_const_closure(Matter_Session_init_closure) }, - { be_const_key_weak(get_noc, 41), be_const_closure(Matter_Session_get_noc_closure) }, - { be_const_key_weak(set_fabric_label, 15), be_const_closure(Matter_Session_set_fabric_label_closure) }, - { be_const_key_weak(shared_secret, -1), be_const_var(29) }, - { be_const_key_weak(hydrate_post, 33), be_const_closure(Matter_Session_hydrate_post_closure) }, - { be_const_key_weak(fromjson, -1), be_const_static_closure(Matter_Session_fromjson_closure) }, - { be_const_key_weak(save, -1), be_const_closure(Matter_Session_save_closure) }, - { be_const_key_weak(_source_node_id, -1), be_const_var(7) }, - { be_const_key_weak(set_mode, 25), be_const_closure(Matter_Session_set_mode_closure) }, - { be_const_key_weak(_counter_snd_impl, -1), be_const_var(15) }, - { be_const_key_weak(__Msg1, 81), be_const_var(35) }, - { be_const_key_weak(set_temp_ca, -1), be_const_closure(Matter_Session_set_temp_ca_closure) }, - { be_const_key_weak(get_i2r_privacy, -1), be_const_closure(Matter_Session_get_i2r_privacy_closure) }, - { be_const_key_weak(initiator_session_id, -1), be_const_var(4) }, - { be_const_key_weak(__future_local_session_id, -1), be_const_var(11) }, - { be_const_key_weak(r2ikey, -1), be_const_var(23) }, - { be_const_key_weak(get_fabric_id, 72), be_const_closure(Matter_Session_get_fabric_id_closure) }, + { be_const_key_weak(set_mode, 6), be_const_closure(Matter_Session_set_mode_closure) }, + { be_const_key_weak(set_mode_PASE, 57), be_const_closure(Matter_Session_set_mode_PASE_closure) }, + { be_const_key_weak(_counter_rcv_impl, 79), be_const_var(14) }, + { be_const_key_weak(attestation_challenge, 56), be_const_var(25) }, { be_const_key_weak(get_ac, -1), be_const_closure(Matter_Session_get_ac_closure) }, - { be_const_key_weak(local_session_id, -1), be_const_var(3) }, - { be_const_key_weak(counter_snd_next, -1), be_const_closure(Matter_Session_counter_snd_next_closure) }, - { be_const_key_weak(counter_rcv_validate, -1), be_const_closure(Matter_Session_counter_rcv_validate_closure) }, - { be_const_key_weak(get_ca, 35), be_const_closure(Matter_Session_get_ca_closure) }, - { be_const_key_weak(_counter_rcv_impl, -1), be_const_var(14) }, - { be_const_key_weak(update, -1), be_const_closure(Matter_Session_update_closure) }, - { be_const_key_weak(close, 23), be_const_closure(Matter_Session_close_closure) }, - { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Session_get_ca_pub_closure) }, + { be_const_key_weak(get_fabric, -1), be_const_closure(Matter_Session_get_fabric_closure) }, + { be_const_key_weak(get_temp_ca, 69), be_const_closure(Matter_Session_get_temp_ca_closure) }, + { be_const_key_weak(_COUNTER_SND_INCR, -1), be_const_int(1024) }, + { be_const_key_weak(_CASE, -1), be_const_int(2) }, + { be_const_key_weak(_counter_insecure_rcv, 2), be_const_var(20) }, { be_const_key_weak(_breadcrumb, -1), be_const_var(27) }, - { be_const_key_weak(_COUNTER_SND_INCR, 21), be_const_int(1024) }, - { be_const_key_weak(_counter_insecure_snd, -1), be_const_var(21) }, + { be_const_key_weak(r2ikey, 82), be_const_var(23) }, + { be_const_key_weak(set_keys, 52), be_const_closure(Matter_Session_set_keys_closure) }, + { be_const_key_weak(_exchange_id, -1), be_const_var(16) }, + { be_const_key_weak(peer_node_id, 8), be_const_var(26) }, + { be_const_key_weak(last_used, 80), be_const_var(6) }, + { be_const_key_weak(_source_node_id, 48), be_const_var(7) }, + { be_const_key_weak(init, 36), be_const_closure(Matter_Session_init_closure) }, + { be_const_key_weak(set_temp_ca, -1), be_const_closure(Matter_Session_set_temp_ca_closure) }, + { be_const_key_weak(created, -1), be_const_var(5) }, { be_const_key_weak(persist_to_fabric, -1), be_const_closure(Matter_Session_persist_to_fabric_closure) }, - { be_const_key_weak(counter_rcv, 5), be_const_var(12) }, - { be_const_key_weak(tojson, -1), be_const_closure(Matter_Session_tojson_closure) }, - { be_const_key_weak(get_r2i, -1), be_const_closure(Matter_Session_get_r2i_closure) }, + { be_const_key_weak(__initiator_pub, -1), be_const_var(32) }, + { be_const_key_weak(gen_CSR, -1), be_const_closure(Matter_Session_gen_CSR_closure) }, + { be_const_key_weak(_store, -1), be_const_var(0) }, + { be_const_key_weak(get_ipk_epoch_key, 49), be_const_closure(Matter_Session_get_ipk_epoch_key_closure) }, + { be_const_key_weak(__responder_priv, 7), be_const_var(30) }, + { be_const_key_weak(counter_rcv_validate, -1), be_const_closure(Matter_Session_counter_rcv_validate_closure) }, + { be_const_key_weak(_ip, -1), be_const_var(17) }, + { be_const_key_weak(get_admin_subject, 40), be_const_closure(Matter_Session_get_admin_subject_closure) }, + { be_const_key_weak(resumption_id, -1), be_const_var(28) }, + { be_const_key_weak(_i2r_privacy, -1), be_const_var(24) }, { be_const_key_weak(get_fabric_compressed, -1), be_const_closure(Matter_Session_get_fabric_compressed_closure) }, + { be_const_key_weak(_temp_pk, -1), be_const_var(9) }, + { be_const_key_weak(shared_secret, 74), be_const_var(29) }, + { be_const_key_weak(_temp_root_ca_certificate, -1), be_const_var(8) }, + { be_const_key_weak(get_ca, -1), be_const_closure(Matter_Session_get_ca_closure) }, + { be_const_key_weak(_fabric, 10), be_const_var(2) }, + { be_const_key_weak(__spake_cA, -1), be_const_var(33) }, + { be_const_key_weak(get_ipk_group_key, -1), be_const_closure(Matter_Session_get_ipk_group_key_closure) }, + { be_const_key_weak(initiator_session_id, 18), be_const_var(4) }, + { be_const_key_weak(get_i2r_privacy, -1), be_const_closure(Matter_Session_get_i2r_privacy_closure) }, + { be_const_key_weak(__chunked_attr_reports, -1), be_const_var(37) }, + { be_const_key_weak(get_ca_pub, -1), be_const_closure(Matter_Session_get_ca_pub_closure) }, + { be_const_key_weak(counter_snd, 20), be_const_var(13) }, + { be_const_key_weak(set_fabric_label, 35), be_const_closure(Matter_Session_set_fabric_label_closure) }, + { be_const_key_weak(_counter_snd_impl, 71), be_const_var(15) }, + { be_const_key_weak(is_CASE, -1), be_const_closure(Matter_Session_is_CASE_closure) }, + { be_const_key_weak(before_remove, -1), be_const_closure(Matter_Session_before_remove_closure) }, + { be_const_key_weak(set_mode_CASE, -1), be_const_closure(Matter_Session_set_mode_CASE_closure) }, + { be_const_key_weak(get_icac, -1), be_const_closure(Matter_Session_get_icac_closure) }, + { be_const_key_weak(tojson, 61), be_const_closure(Matter_Session_tojson_closure) }, + { be_const_key_weak(close, 1), be_const_closure(Matter_Session_close_closure) }, + { be_const_key_weak(get_fabric_label, 42), be_const_closure(Matter_Session_get_fabric_label_closure) }, + { be_const_key_weak(_counter_insecure_snd, -1), be_const_var(21) }, + { be_const_key_weak(get_device_id, 63), be_const_closure(Matter_Session_get_device_id_closure) }, + { be_const_key_weak(counter_rcv, 62), be_const_var(12) }, + { be_const_key_weak(__Msg1, -1), be_const_var(35) }, + { be_const_key_weak(hydrate_post, 66), be_const_closure(Matter_Session_hydrate_post_closure) }, + { be_const_key_weak(_message_handler, -1), be_const_var(19) }, + { be_const_key_weak(__future_initiator_session_id, -1), be_const_var(10) }, + { be_const_key_weak(__spake_Ke, 32), be_const_var(34) }, + { be_const_key_weak(__Msg2, 38), be_const_var(36) }, + { be_const_key_weak(get_mode, -1), be_const_closure(Matter_Session_get_mode_closure) }, + { be_const_key_weak(mode, -1), be_const_var(1) }, + { be_const_key_weak(update, 16), be_const_closure(Matter_Session_update_closure) }, + { be_const_key_weak(counter_snd_next, -1), be_const_closure(Matter_Session_counter_snd_next_closure) }, + { be_const_key_weak(get_temp_ca_pub, -1), be_const_closure(Matter_Session_get_temp_ca_pub_closure) }, + { be_const_key_weak(get_i2r, -1), be_const_closure(Matter_Session_get_i2r_closure) }, + { be_const_key_weak(get_noc, 37), be_const_closure(Matter_Session_get_noc_closure) }, + { be_const_key_weak(get_fabric_id, -1), be_const_closure(Matter_Session_get_fabric_id_closure) }, + { be_const_key_weak(get_admin_vendor, -1), be_const_closure(Matter_Session_get_admin_vendor_closure) }, + { be_const_key_weak(is_PASE, -1), be_const_closure(Matter_Session_is_PASE_closure) }, + { be_const_key_weak(save, 21), be_const_closure(Matter_Session_save_closure) }, + { be_const_key_weak(_GROUP_KEY, -1), be_nested_str_weak(GroupKey_X20v1_X2E0) }, + { be_const_key_weak(local_session_id, 76), be_const_var(3) }, + { be_const_key_weak(i2rkey, 17), be_const_var(22) }, + { be_const_key_weak(__future_local_session_id, -1), be_const_var(11) }, + { be_const_key_weak(_PASE, -1), be_const_int(1) }, + { be_const_key_weak(get_fabric_index, -1), be_const_closure(Matter_Session_get_fabric_index_closure) }, + { be_const_key_weak(_port, -1), be_const_var(18) }, + { be_const_key_weak(get_r2i, -1), be_const_closure(Matter_Session_get_r2i_closure) }, + { be_const_key_weak(get_pk, -1), be_const_closure(Matter_Session_get_pk_closure) }, + { be_const_key_weak(__responder_pub, -1), be_const_var(31) }, + { be_const_key_weak(fromjson, 0), be_const_static_closure(Matter_Session_fromjson_closure) }, })), be_str_weak(Matter_Session) ); From 57fb19f2594ba4f344f71989e84bf440374c1e2c Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:45:36 +0200 Subject: [PATCH 120/150] Update changelogs --- CHANGELOG.md | 17 ++++++++++------- RELEASENOTES.md | 11 +++++++++++ 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c1dbd298..52994e7ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,24 +7,27 @@ All notable changes to this project will be documented in this file. ### Added - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) - Support for multiple PCA9685 with extended functionality (#18805) -- Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature -- Berry bytes `get` and `set` work for 3 bytes values -- Matter support for fabric_filtered request (for Google compatibility) +- Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature (#19210) +- Berry bytes `get` and `set` work for 3 bytes values (#19225) +- Matter support for fabric_filtered request (for Google compatibility) (#19249) ### Breaking Changed ### Changed - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) - ESP32 Framework (Core) from v2.0.10 to v2.0.11 -- Berry `mqtt.publish` now distinguishes between `string` and `bytes` +- Berry `mqtt.publish` now distinguishes between `string` and `bytes` (#19196) - IRremoteESP8266 library from v2.8.5 to v2.8.6 -- Reduced log level for TeleInfo -- Matter increased polling frequency for local switches/occupancy +- ESP32 autodetect flashsize and adjust filesystem (#19215) +- Reduced log level for TeleInfo (#19216) +- Matter increased polling frequency for local switches/occupancy (#19242) ### Fixed - Initial battery level percentage (#19160) - Berry SK6812_GRBW crash (#19166) -- Fade would fail when the difference between start and target would be too small +- ESP8266 SPI initialization for scripter, filesystem and MFRC522 (#19209) +- Zero cross dimmer minimum interrupt time (#19211) +- Fade would fail when the difference between start and target would be too small (#19248) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 8c1519789..71d04bcd4 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -119,37 +119,48 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Support for multiple PCA9685 with extended functionality [#18805](https://github.com/arendst/Tasmota/issues/18805) - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Support for DeepSleep battery level percentage [#19134](https://github.com/arendst/Tasmota/issues/19134) +- Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature [#19210](https://github.com/arendst/Tasmota/issues/19210) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) - Berry `_class` can be used in `static var` initialization code [#19088](https://github.com/arendst/Tasmota/issues/19088) - Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver [#19117](https://github.com/arendst/Tasmota/issues/19117) - Berry `tasmota.loglevel()` and `tasmota.rtc_utc()` for faster performance [#19152](https://github.com/arendst/Tasmota/issues/19152) - Berry metrics for memory allocation/deallocation/reallocation [#19150](https://github.com/arendst/Tasmota/issues/19150) - Berry AES CCM decrypting in a single call to avoid any object allocation [#19153](https://github.com/arendst/Tasmota/issues/19153) +- Berry bytes `get` and `set` work for 3 bytes values [#19225](https://github.com/arendst/Tasmota/issues/19225) - Partition Wizard is now able to convert to safeboot from Shelly partition layout [#19034](https://github.com/arendst/Tasmota/issues/19034) - Matter option to disable bridge mode [#18992](https://github.com/arendst/Tasmota/issues/18992) - Matter mini-profiler [#19075](https://github.com/arendst/Tasmota/issues/19075) +- Matter support for fabric_filtered request (for Google compatibility) [#19249](https://github.com/arendst/Tasmota/issues/19249) ### Breaking Changed - Berry `bool( [] )` and `bool( {} )` now evaluate as `false` [#18986](https://github.com/arendst/Tasmota/issues/18986) - Berry `import strict` now detects useless expression without side effects [#18997](https://github.com/arendst/Tasmota/issues/18997) ### Changed +- IRremoteESP8266 library from v2.8.5 to v2.8.6 - ESP32 Framework (Core) from v2.0.10 to v2.0.11 - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) - Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) +- Reduced log level for TeleInfo [#19216](https://github.com/arendst/Tasmota/issues/19216) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) +- ESP32 autodetect flashsize and adjust filesystem [#19215](https://github.com/arendst/Tasmota/issues/19215) - Berry extend `range(lower, upper, incr)` to arbitrary increment [#19120](https://github.com/arendst/Tasmota/issues/19120) - Berry updated syntax highlighting plugin for VSCode [#19123](https://github.com/arendst/Tasmota/issues/19123) +- Berry `mqtt.publish` now distinguishes between `string` and `bytes` [#19196](https://github.com/arendst/Tasmota/issues/19196) - Matter support for temperature in Fahrenheit (`SetOption8 1`) [#18987](https://github.com/arendst/Tasmota/issues/18987) - Matter improve responsiveness [#19002](https://github.com/arendst/Tasmota/issues/19002) - Matter improve latency for remote commands [#19072](https://github.com/arendst/Tasmota/issues/19072) - Matter improve latency for single attribute reads and single commands [#19158](https://github.com/arendst/Tasmota/issues/19158) +- Matter increased polling frequency for local switches/occupancy [#19242](https://github.com/arendst/Tasmota/issues/19242) ### Fixed - Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) - MiElHVAC power commands regression from v12.4.0.1 [#18923](https://github.com/arendst/Tasmota/issues/18923) +- Zero cross dimmer minimum interrupt time [#19211](https://github.com/arendst/Tasmota/issues/19211) +- Fade would fail when the difference between start and target would be too small [#19248](https://github.com/arendst/Tasmota/issues/19248) +- ESP8266 SPI initialization for scripter, filesystem and MFRC522 [#19209](https://github.com/arendst/Tasmota/issues/19209) ### Removed - Support for ESP32-C3 with chip revision below 3 (old development boards) From 5e591ef7db21b315b35781cfc20e2db5914241ec Mon Sep 17 00:00:00 2001 From: Vincent de Groot <53112521+Vincent1964@users.noreply.github.com> Date: Thu, 3 Aug 2023 11:54:41 +0200 Subject: [PATCH 121/150] Integrate MAX17043 driver mechanisms in xsns_110 (#19219) --- .../DFRobot_MAX17043/DFRobot_MAX17043.cpp | 68 ---------- .../DFRobot_MAX17043/DFRobot_MAX17043.h | 121 ----------------- lib/lib_i2c/DFRobot_MAX17043/LICENSE | 7 - lib/lib_i2c/DFRobot_MAX17043/README_CN.md | 121 ----------------- .../DFRobot_MAX17043/DFRobot_MAX17043.ino | 74 ---------- lib/lib_i2c/DFRobot_MAX17043/keywords.txt | 9 -- .../DFRobot_MAX17043/library.properties | 9 -- .../python/micropython/DFRobot_MAX17043.py | 111 --------------- .../python/micropython/README.md | 100 -------------- .../python/micropython/README_CN.md | 97 ------------- .../python/micropython/demo_MAX17043.py | 38 ------ .../python/raspberry/DFRobot_MAX17043.py | 109 --------------- .../python/raspberry/README.md | 128 ------------------ .../python/raspberry/README_CN.md | 119 ---------------- .../raspberry/examples/demo_read_and_int.py | 44 ------ lib/lib_i2c/DFRobot_MAX17043/readme.md | 122 ----------------- .../resources/images/DFR0563.jpg | Bin 12228 -> 0 bytes .../resources/images/Raspberry Pi.jpg | Bin 29834 -> 0 bytes .../DFRobot_MAX17043/resources/images/UNO.jpg | Bin 26373 -> 0 bytes .../resources/images/esp32.jpg | Bin 52867 -> 0 bytes .../tasmota_xsns_sensor/xsns_110_max17043.ino | 36 ----- 21 files changed, 1313 deletions(-) delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/LICENSE delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/README_CN.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/keywords.txt delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/library.properties delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/readme.md delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg delete mode 100644 lib/lib_i2c/DFRobot_MAX17043/resources/images/esp32.jpg diff --git a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp deleted file mode 100644 index b24f686af..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/*! - * @file DFRobot_MAX17043.cpp - * - * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - * @license The MIT License (MIT) - * @author [ouki.wang](ouki.wang@dfrobot.com) - * @version V1.0 - * @date 2018-4-14 - * @url https://github.com/DFRobot/DFRobot_MAX17043 - */ - -#include "DFRobot_MAX17043.h" - -DFRobot_MAX17043::DFRobot_MAX17043() {} - -int DFRobot_MAX17043::begin() -{ - // write16(MAX17043_COMMAND, 0x0054); //power on reset - write16(MAX17043_COMMAND, 0x5400); //power on reset - delay(10); - _DBG_CODE(Serial.print("\nbegin: ")); - _DBG_CODE(Serial.println(read16(MAX17043_CONFIG), HEX)); - if(read16(MAX17043_CONFIG) == 0x971c) { //default 0x971c - write16(MAX17043_MODE, 0x4000); //quick start - write16(MAX17043_CONFIG, 0x9700); - _DBG_CODE(Serial.println(read16(MAX17043_CONFIG), HEX)); - delay(10); - return 0; - } - return -1; -} - -float DFRobot_MAX17043::readVoltage() -{ - return (1.25f * (float)(read16(MAX17043_VCELL) >> 4)); -} - -float DFRobot_MAX17043::readPercentage() -{ - uint16_t per = read16(MAX17043_SOC); - return (float)((per >> 8) + 0.003906f * (per & 0x00ff)); -} - -void DFRobot_MAX17043::setInterrupt(uint8_t per) -{ - uint16_t temp; - if(per > 32) - temp = 32; - else if(per < 1) - temp = 1; - temp = 32 - temp; - writeRegBits(MAX17043_CONFIG, temp, 0x01f, 0); -} - -void DFRobot_MAX17043::clearInterrupt() -{ - writeRegBits(MAX17043_CONFIG, 0, 0x01, 5); -} - -void DFRobot_MAX17043::setSleep() -{ - writeRegBits(MAX17043_CONFIG, 1, 0x01, 7); -} - -void DFRobot_MAX17043::setWakeUp() -{ - writeRegBits(MAX17043_CONFIG, 0, 0x01, 7); -} diff --git a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h b/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h deleted file mode 100644 index f4147ba69..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/DFRobot_MAX17043.h +++ /dev/null @@ -1,121 +0,0 @@ -/*! - * @file DFRobot_MAX17043.h - * - * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - * @license The MIT License (MIT) - * @author [ouki.wang](ouki.wang@dfrobot.com) - * @version V1.0 - * @date 2018-4-14 - * @url https://github.com/DFRobot/DFRobot_MAX17043 - */ - -#ifndef __DFROBOT_MAX17043_H -#define __DFROBOT_MAX17043_H - -#include "Arduino.h" -#include "Wire.h" - -#define _DBG 0 - -#if(_DBG) - #define _DBG_CODE(x) x -#else - #define _DBG_CODE(x) -#endif - -#define MAX17043_ADDRESS 0x36 - -#define MAX17043_VCELL 0x02 -#define MAX17043_SOC 0x04 -#define MAX17043_MODE 0x06 -#define MAX17043_VERSION 0x08 -#define MAX17043_CONFIG 0x0c -#define MAX17043_COMMAND 0xfe - -class DFRobot_MAX17043 { -public: - /** - * @fn DFRobot_MAX17043 - * @brief create MAX17043 object - * @return MAX17043 object - */ - DFRobot_MAX17043(); - /** - * @fn begin - * @brief MAX17043 begin and test moudle - * - * @return initialization result - * @retval 0 successful - * @retval -1 faild - */ - int begin(); - /** - * @fn readVoltage - * @brief read battery voltage in mV - * @return voltage in mV - */ - float readVoltage(); - /** - * @fn readPercentage - * @brief read battery remaining capacity in percentage - * - * @return battery remaining capacity in percentage - */ - float readPercentage(); - /** - * @fn setInterrupt - * @brief set MAX17043 interrput threshold - * - * @param per interrupt threshold as %1 - 32% (integer) - */ - void setInterrupt(uint8_t per); - /** - * @fn clearInterrupt - * @brief clear MAX17043 interrupt - */ - void clearInterrupt(); - /** - * @fn setSleep - * @brief set MAX17043 in sleep mode - * - */ - void setSleep(); - /** - * @fn setWakeUp - * @brief weak up MAX17043 - * - */ - void setWakeUp(); - - private: - void write16(uint8_t reg, uint16_t dat) { - Wire.begin(); - Wire.beginTransmission(MAX17043_ADDRESS); - Wire.write(reg); - Wire.write(dat >> 8); - Wire.write(dat); - Wire.endTransmission(); - } - - uint16_t read16(uint8_t reg) { - uint16_t temp; - Wire.begin(); - Wire.beginTransmission(MAX17043_ADDRESS); - Wire.write(reg); - Wire.endTransmission(); - Wire.requestFrom(MAX17043_ADDRESS, 2); - temp = (uint16_t)Wire.read() << 8; - temp |= (uint16_t)Wire.read(); - Wire.endTransmission(); - return temp; - } - - void writeRegBits(uint8_t reg, uint16_t dat, uint16_t bits, uint8_t offset) { - uint16_t temp; - temp = read16(reg); - temp = (temp & (~(bits << offset))) | (dat << offset); - write16(reg, temp); - } -}; - -#endif diff --git a/lib/lib_i2c/DFRobot_MAX17043/LICENSE b/lib/lib_i2c/DFRobot_MAX17043/LICENSE deleted file mode 100644 index 79f310082..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/LICENSE +++ /dev/null @@ -1,7 +0,0 @@ -Copyright 2010 DFRobot Co.Ltd - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/lib/lib_i2c/DFRobot_MAX17043/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/README_CN.md deleted file mode 100644 index 85d1f9c87..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/README_CN.md +++ /dev/null @@ -1,121 +0,0 @@ -# DFRobot_MAX17043 - -* [English Version](./README.md) - -Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 - -![产品效果图](./resources/images/DFR0563.jpg) - - -## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) - SKU: DFR0563 - -## 目录 - -* [概述](#概述) -* [连接](连接) -* [库安装](#库安装) -* [方法](#方法) -* [兼容性](#兼容性) -* [历史](#历史) -* [创作者](#创作者) - -## 概述 - -提供 Arduino 库,用于通过 I2C 读取和解释 MAX17043 数据。 - -## 连接 -相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: - -* Arduino UNO -
    - -
    - -* ESP32 -
    - -
    - - -## 库安装 - -这里有2种安装方法: -1. 使用此库前,请首先下载库文件,将其粘贴到\Arduino\libraries目录中,然后打开examples文件夹并在该文件夹中运行演示。 -2. 直接在Arduino软件库管理中搜索下载 DFRobot_MAX17043 库 - -## 方法 - -```C++ - /** - * @fn DFRobot_MAX17043 - * @brief 构造MAX17043对象 - * @return MAX17043 类对象 - */ - DFRobot_MAX17043(); - /** - * @fn begin - * @brief MAX17043 初始化 - * - * @return 初始化结果 - * @retval 0 成功 - * @retval -1 失败 - */ - int begin(); - /** - * @fn readVoltage - * @brief 读电池电压,单位: mV - * @return 电池电压,单位:mV - */ - float readVoltage(); - /** - * @fn readPercentage - * @brief 读取剩余电池容量的百分比 - * - * @return 剩余电池容量的百分比 - */ - float readPercentage(); - /** - * @fn setInterrupt - * @brief 设置 MAX17043 中断阈值 - * - * @param per 中断阈值范围: %1 - 32% (整数) - */ - void setInterrupt(uint8_t per); - /** - * @fn clearInterrupt - * @brief 清除 MAX17043 中断 - */ - void clearInterrupt(); - /** - * @fn setSleep - * @brief 设置 MAX17043 进入睡眠模式 - * - */ - void setSleep(); - /** - * @fn setWakeUp - * @brief 唤醒 MAX17043 - */ - void setWakeUp(); -``` - -## 兼容性 - -| MCU | Work Well | Work Wrong | Untested | Remarks | -| ------------------ | :-------: | :--------: | :------: | ------- | -| FireBeetle-ESP32 | √ | | | -| FireBeetle-ESP8266 | √ | | | -| Arduino uno | √ | | | - -## 历史 - -- 2018/04/14 - 1.0.0 版本 - -## 创作者 - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) - - - - diff --git a/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino b/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino deleted file mode 100644 index 746f166fe..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/examples/DFRobot_MAX17043/DFRobot_MAX17043.ino +++ /dev/null @@ -1,74 +0,0 @@ -/*! - * @file DFRobot_MAX17043.ino - * @brief connect gauge I2C interface with your board (please reference board compatibility) - * @n Voltage, percentage will be printed via serial. - * @n Use API to config alaram and sleep (please reference to the readme in lib) - * - * @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - * @license The MIT License (MIT) - * @author [ouki.wang](ouki.wang@dfrobot.com) - * @version V1.0 - * @date 2018-4-14 - * @url https://github.com/DFRobot/DFRobot_MAX17043 - */ - -#include "DFRobot_MAX17043.h" -#include "Wire.h" - -#ifdef __AVR__ - #define ALR_PIN 2 -#else - #define ALR_PIN D2 -#endif - -#define PRINT_INTERVAL 2000 - -DFRobot_MAX17043 gauge; -uint8_t intFlag = 0; - -void interruptCallBack() -{ - intFlag = 1; -} - -void setup() -{ - Serial.begin(115200); - while(!Serial); - Serial.println(); - Serial.println(); - pinMode(ALR_PIN, INPUT_PULLUP); - attachInterrupt(ALR_PIN, interruptCallBack, FALLING); //default alert is 32% - - while(gauge.begin() != 0) { - Serial.println("gauge begin faild!"); - delay(2000); - } - delay(2); - Serial.println("gauge begin successful!"); - //gauge.setInterrupt(32); //use this to modify alert threshold as 1% - 32% (integer) -} - -void loop() -{ - static unsigned long lastMillis = 0; - if((millis() - lastMillis) > PRINT_INTERVAL) { - lastMillis = millis(); - Serial.println(); - - Serial.print("voltage: "); - Serial.print(gauge.readVoltage()); - Serial.println(" mV"); - - Serial.print("precentage: "); - Serial.print(gauge.readPercentage()); - Serial.println(" %"); - } - - if(intFlag == 1) { - intFlag = 0; - gauge.clearInterrupt(); - Serial.println("Low power alert interrupt!"); - //put your battery low power alert interrupt service routine here - } -} diff --git a/lib/lib_i2c/DFRobot_MAX17043/keywords.txt b/lib/lib_i2c/DFRobot_MAX17043/keywords.txt deleted file mode 100644 index bcb479a57..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/keywords.txt +++ /dev/null @@ -1,9 +0,0 @@ -DFRobot_MAX17043 KEYWORD1 - -begin KEYWORD2 -readVoltage KEYWORD2 -readPercentage KEYWORD2 -setInterrupt KEYWORD2 -clearInterrupt KEYWORD2 -setSleep KEYWORD2 -setWakeUp KEYWORD2 \ No newline at end of file diff --git a/lib/lib_i2c/DFRobot_MAX17043/library.properties b/lib/lib_i2c/DFRobot_MAX17043/library.properties deleted file mode 100644 index c769e3bef..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/library.properties +++ /dev/null @@ -1,9 +0,0 @@ -name=DFRobot_MAX17043 -version=1.0.0 -author=DFRobot -maintainer=ouki.wang -sentence=DFRobot Standard library(SKU:DFR0563). -paragraph=Gravity: I2C 3.7V Li Battery Fuel Gauge. -category=Sensors -url=https://github.com/DFRobot/DFRobot_MAX17043 -architectures=* diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py deleted file mode 100644 index b7ac8b9e8..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/DFRobot_MAX17043.py +++ /dev/null @@ -1,111 +0,0 @@ -'''! - @file DFRobot_MAX17043.py - @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - @license The MIT License (MIT) - @author [ouki.wang](ouki.wang@dfrobot.com) - @version V1.0 - @date 2018-4-14 - @url https://github.com/DFRobot/DFRobot_MAX17043 -''' - -import time - -from machine import I2C, Pin - -## Get I2C bus -i2c = I2C(scl = Pin(22), sda = Pin(21), freq=400000) - -MAX17043_ADDR = 0x36 -MAX17043_VCELL = 0x02 -MAX17043_SOC = 0x04 -MAX17043_MODE = 0x06 -MAX17043_VERSION = 0x08 -MAX17043_CONFIG = 0x0c -MAX17043_COMMAND = 0xfe - -class DFRobot_MAX17043(): - - def __init__(self): - '''! - @brief create MAX17043 object - @return MAX17043 object - ''' - pass - - def begin(self): - '''! - @brief MAX17043 begin and test moudle - @return initialization result: - @retval 0 successful - @retval -1 faild - ''' - self._write16(MAX17043_COMMAND, 0x5400) - time.sleep(0.01) - if self._read16(MAX17043_CONFIG) == 0x971c: - self._write16(MAX17043_MODE, 0x4000) - time.sleep(0.01) - self._write16(MAX17043_CONFIG, 0x9700) - return 0 - else: - return -1 - - def read_voltage(self): - '''! - @brief read battery voltage in mV - @return voltage in mV - ''' - return (1.25 * (self._read16(MAX17043_VCELL) >> 4)) - - def read_percentage(self): - '''! - @brief read battery remaining capacity in percentage - @return battery remaining capacity in percentage - ''' - tmp = self._read16(MAX17043_SOC) - return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff)) - - def set_Interrupt(self, per): - '''! - @brief set MAX17043 interrput threshold - @param per interrupt threshold as %1 - 32% (integer) - ''' - if per > 32: - per = 32 - elif per < 1: - per = 1 - per = 32 - int(per) - self._write_reg_bits(MAX17043_CONFIG, per, 0x01f, 0) - - def clear_interrupt(self): - '''! - @brief clear MAX17043 interrupt. - ''' - self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 5) - - def set_sleep(self): - '''! - @brief set MAX17043 in sleep mode. - ''' - self._write_reg_bits(MAX17043_CONFIG, 1, 0x01, 7) - - def set_wakeup(self): - '''! - @brief wake up MAX17043. - ''' - self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 7) - - def _write16(self, reg, dat): - buf = bytearray(2) - buf[0] = dat >> 8 - buf[1] = dat & 0x00ff - i2c.writeto_mem(MAX17043_ADDR, reg, buf) - - def _read16(self, reg): - buf = i2c.readfrom_mem(MAX17043_ADDR, reg, 2) - return ((buf[0] << 8) | buf[1]) - - def _write_reg_bits(self, reg, dat, bits, offset): - tmp = self._read16(reg) - tmp = (tmp & (~(bits << offset))) | (dat << offset) - self._write16(reg, tmp) - diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md deleted file mode 100644 index 106363df4..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# DFRobot_MAX17043 - -* [中文版](./README_CN.md) - -The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable -equpiment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge -(SOC) of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion -errors.Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low -battery power alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling -pluse to trigger the external interrupt of the controller.One thing should mention that the default value of the battery low power -interrupt alert threshold is 32%, this threshold can be set by the function set_interrupt(). - -![产品效果图](../../resources/images/DFR0563.jpg) - -## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) - SKU: DFR0563 - -## Table of Contents -* [Summary](#summary) -* [connection](connection) -* [Installation](#installation) -* [Methods](#methods) -* [Compatibility](#compatibility) -* [History](#history) -* [Credits](#credits) - -## Summary -Provides a microPython library for reading and interperting MAX17043 data over I2C. - -## Connection -Wires of the same color are linked together,and We only exemplify how this board is connected to the Fuel Gauge. -When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. - -* ESP32 - -
    - -
    - - -## Installation - -To use this library download the zip file, uncomperss it to a folder named DFRobot_MAX17043 in your upyCraft workspace. - -## Methods - -```python - '''! - @brief MAX17043 begin and test moudle - @return initialization result: - @retval 0 successful - @retval -1 faild - ''' - def begin(self): - - '''! - @brief read battery voltage in mV - @return voltage in mV - ''' - def read_voltage(self): - - '''! - @brief read battery remaining capacity in percentage - @return battery remaining capacity in percentage - ''' - def read_percentage(self): - '''! - @brief set MAX17043 interrput threshold - @param per interrupt threshold as %1 - 32% (integer) - ''' - def set_interrupt(self, per): - - '''! - @brief clear MAX17043 interrupt. - ''' - def clear_interrupt(self): - - '''! - @brief set MAX17043 in sleep mode. - ''' - def set_sleep(self): - - '''! - @brief wake up MAX17043. - ''' - -``` -## Compatibility - -| MCU | Work Well | Work Wrong | Untested | Remarks | -| ------------------ | :-------: | :--------: | :------: | ------- | -| ESP32 | √ | | | - -## History - -- 2018/04/14 - Version 1.0.0 released. - -## Credits - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md deleted file mode 100644 index 48af8058c..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/README_CN.md +++ /dev/null @@ -1,97 +0,0 @@ -# DFRobot_MAX17043 - -* [English Version](./README.md) - -Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 - -![产品效果图](../../resources/images/DFR0563.jpg) - - -## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) - SKU: DFR0563 - -## 目录 - -* [概述](#概述) -* [连接](连接) -* [库安装](#库安装) -* [方法](#方法) -* [兼容性](#兼容性) -* [历史](#历史) -* [创作者](#创作者) - -## 概述 -提供 microPython 库,用于通过 I2C 读取和解释 MAX17043 数据 - -## 连接 -相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: - -* ESP32 - -
    - -
    - - -## 库安装 - -要使用此库,请下载 zip 文件,将其解压缩到 upyCraft 工作区中名为 DFRobot_MAX17043 的文件夹中。 - -## 方法 - -```python - '''! - @brief 构造MAX17043对象 - @return MAX17043 初始化 - @retval 0 成功 - @retval -1 失败 - ''' - def begin(self): - - '''! - @brief 读电池电压,单位: mV - @return 电池电压,单位:mV - ''' - def read_voltage(self): - - '''! - @brief 读取剩余电池容量的百分比 - @return 剩余电池容量的百分比 - ''' - def read_percentage(self): - '''! - @brief 设置 MAX17043 中断阈值 - @param per 中断阈值范围: %1 - 32% (整数) - ''' - def set_interrupt(self, per): - - '''! - @brief 清除 MAX17043 中断. - ''' - def clear_interrupt(self): - - '''! - @brief 设置 MAX17043 进入睡眠模式 - ''' - def set_sleep(self): - - '''! - @brief 唤醒 MAX17043 - ''' - def set_wakeup(self): -``` - -## 兼容性 - -| MCU | Work Well | Work Wrong | Untested | Remarks | -| ------------------ | :-------: | :--------: | :------: | ------- | -| ESP32 | √ | | | - -## 历史 - -- 2018/04/14 - 1.0.0 版本 - -## 创作者 - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) - diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py deleted file mode 100644 index d6d5e2f54..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/micropython/demo_MAX17043.py +++ /dev/null @@ -1,38 +0,0 @@ -'''! - @file demo_MAX17043.py - @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - @license The MIT License (MIT) - @author [ouki.wang](ouki.wang@dfrobot.com) - @version V1.0 - @date 2018-4-14 - @url https://github.com/DFRobot/DFRobot_MAX17043 -''' - -import time -from machine import Pin -from DFRobot_MAX17043 import DFRobot_MAX17043 - -gauge = DFRobot_MAX17043() - -def interruptCallBack(channel): - gauge.clear_interrupt() - print('Low power alert interrupt!') - #put your battery low power alert interrupt service routine here - -pin_irq = Pin(25, Pin.IN) -pin_irq.irq(trigger = Pin.IRQ_FALLING, handler = interruptCallBack) - -rslt = gauge.begin() - -while rslt != 0: - print('gauge begin faild') - time.sleep(2) - rslt = gauge.begin() - -#gauge.set_Interrupt(32) #use this to modify alert threshold as 1% - 32% (integer) -print('gauge begin successful') - -while True: - time.sleep(2) - print('voltage: ' + str(gauge.read_voltage()) + 'mV') - print('percentage: ' + str(round(gauge.read_percentage(), 2)) + '%') diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py deleted file mode 100644 index 1ddc751ca..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/DFRobot_MAX17043.py +++ /dev/null @@ -1,109 +0,0 @@ -'''! - @file DFRobot_MAX17043.py - @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - @license The MIT License (MIT) - @author [ouki.wang](ouki.wang@dfrobot.com) - @version V1.0 - @date 2018-4-14 - @url https://github.com/DFRobot/DFRobot_MAX17043 -''' - -import smbus -import time -import datetime - -# Get I2C bus -bus = smbus.SMBus(1) - -MAX17043_ADDR = 0x36 -MAX17043_VCELL = 0x02 -MAX17043_SOC = 0x04 -MAX17043_MODE = 0x06 -MAX17043_VERSION = 0x08 -MAX17043_CONFIG = 0x0c -MAX17043_COMMAND = 0xfe - -class DFRobot_MAX17043(): - - def __init__(self): - '''! - @brief create MAX17043 object - @return MAX17043 object - ''' - pass - - def begin(self): - '''! - @brief MAX17043 begin and test moudle - @return initialization result: - @retval 0 successful - @retval -1 faild - ''' - self._write16(MAX17043_COMMAND, 0x5400) - time.sleep(0.01) - if self._read16(MAX17043_CONFIG) == 0x971c: - self._write16(MAX17043_MODE, 0x4000) - time.sleep(0.01) - self._write16(MAX17043_CONFIG, 0x9700) - return 0 - else: - return -1 - - def read_voltage(self): - '''! - @brief read battery voltage in mV - @return voltage in mV - ''' - return (1.25 * (self._read16(MAX17043_VCELL) >> 4)) - - def read_percentage(self): - '''! - @brief read battery remaining capacity in percentage - @return battery remaining capacity in percentage - ''' - tmp = self._read16(MAX17043_SOC) - return ((tmp >> 8) + 0.003906 * (tmp & 0x00ff)) - - def set_interrupt(self, per): - '''! - @brief set MAX17043 interrput threshold - @param per interrupt threshold as %1 - 32% (integer) - ''' - if per > 32: - per = 32 - elif per < 1: - per = 1 - per = 32 - int(per) - self._write_reg_bits(MAX17043_CONFIG, per, 0x01f, 0) - - def clear_interrupt(self): - '''! - @brief clear MAX17043 interrupt. - ''' - self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 5) - - def set_sleep(self): - '''! - @brief set MAX17043 in sleep mode. - ''' - self._write_reg_bits(MAX17043_CONFIG, 1, 0x01, 7) - - def set_wakeup(self): - '''! - @brief wake up MAX17043. - ''' - self._write_reg_bits(MAX17043_CONFIG, 0, 0x01, 7) - - def _write16(self, reg, dat): - buf = [dat >> 8, dat & 0x00ff] - bus.write_i2c_block_data(MAX17043_ADDR, reg, buf) - - def _read16(self, reg): - buf = bus.read_i2c_block_data(MAX17043_ADDR, reg, 2) - return ((buf[0] << 8) | buf[1]) - - def _write_reg_bits(self, reg, dat, bits, offset): - tmp = self._read16(reg) - tmp = (tmp & (~(bits << offset))) | (dat << offset) - self._write16(reg, tmp) - diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md deleted file mode 100644 index 47bd42678..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# DFRobot_MAX17043 - -* [中文版](./README_CN.md) - -The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable -equpiment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge -(SOC) of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion -errors.Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low -battery power alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling -pluse to trigger the external interrupt of the controller.One thing should mention that the default value of the battery low power -interrupt alert threshold is 32%, this threshold can be set by the function set_interrupt(). - -![产品效果图](../../resources/images/DFR0563.jpg) - -## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) - SKU: DFR0563 - -## Table of Contents -* [Summary](#summary) -* [connection](connection) -* [Installation](#installation) -* [Methods](#methods) -* [Compatibility](#compatibility) -* [History](#history) -* [Credits](#credits) - -## Summary - -Provides an Raspberry pi library for reading and interperting MAX17043 data over I2C. - -## Connection -Wires of the same color are linked together,and We only exemplify how these three boards are connected to the Fuel Gauge. -When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. - -* Raspberry Pi -
    - -
    - -## Installation - -Download and install smbus library on Raspberry pi. Steps to install smbus are provided at: - -```python -$> sudo apt-get install -y python-smbus -$> sudo apt-get install -y i2c-tools -``` - -1. To use this library, first download the library file
    -```python -sudo git clone https://github.com/DFRobot/DFRobot_MAX17043 -``` -2. Open and run the routine. To execute a routine demo_x.py, enter python demo_x.py in the command line. For example, to execute the demo_read_and_int.py.py routine, you need to enter :
    - -```python -python demo_read_and_int.py.py -or -python2 demo_read_and_int.py.py -``` - -## Methods - -```python - '''! - @brief MAX17043 begin and test moudle - @return initialization result: - @retval 0 successful - @retval -1 faild - ''' - def begin(self): - - '''! - @brief read battery voltage in mV - @return voltage in mV - ''' - def read_voltage(self): - - '''! - @brief read battery remaining capacity in percentage - @return battery remaining capacity in percentage - ''' - def read_percentage(self): - '''! - @brief set MAX17043 interrput threshold - @param per interrupt threshold as %1 - 32% (integer) - ''' - def set_interrupt(self, per): - - '''! - @brief clear MAX17043 interrupt. - ''' - def clear_interrupt(self): - - '''! - @brief set MAX17043 in sleep mode. - ''' - def set_sleep(self): - - '''! - @brief wake up MAX17043. - ''' - def set_wakeup(self): - - -``` - -## Compatibility - -| 主板 | 通过 | 未通过 | 未测试 | 备注 | -| ------------ | :--: | :----: | :----: | :--: | -| RaspberryPi2 | | | √ | | -| RaspberryPi3 | | | √ | | -| RaspberryPi4 | √ | | | | - -* Python 版本 - -| Python | 通过 | 未通过 | 未测试 | 备注 | -| ------- | :--: | :----: | :----: | ---- | -| Python2 | √ | | | | -| Python3 | | | √ | | - -## History - -- 2018/04/14 - Version 1.0.0 released. - -## Credits - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md deleted file mode 100644 index 00894b09a..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/README_CN.md +++ /dev/null @@ -1,119 +0,0 @@ -# DFRobot_MAX17043 - -* [English Version](./README.md) - -Gravity 3.7V锂电池电量计使用Gravity I2C接口,超低工作电流,通过Maxim专利算法,实时跟踪电池的相对充电状态(SOC,State-Of-Charge),无需充放电学习过程,无积累误差,即插即用,准确地测量锂电池的当前电压和剩余电量。模块预留低电量报警中断引脚,当电池电量低于指定电量时,该引脚产生一个下跳脉冲,触发主控的外部中断。 - -![产品效果图](../../resources/images/DFR0563.jpg) - - -## 产品链接([https://www.dfrobot.com.cn/goods-1743.html](https://www.dfrobot.com.cn/goods-1743.html)) - SKU: DFR0563 - -## 目录 - -* [概述](#概述) -* [连接](连接) -* [库安装](#库安装) -* [方法](#方法) -* [兼容性](#兼容性) -* [历史](#历史) -* [创作者](#创作者) - -## 概述 - -提供 python 库,用于通过 I2C 读取和解释 MAX17043 数据。 - -## 连接 -相同颜色的线连接在一起,我们只举例说明主板是如何连接到电量计的。接线时要注意管脚的对应关系,接线图如下: - -* Raspberry Pi -
    - -
    - -## 库安装 -1. 下载库至树莓派,要使用这个库,首先要将库下载到Raspberry Pi,命令下载方法如下:
    -```python -sudo git clone https://github.com/DFRobot/DFRobot_MAX17043 -``` -2. 打开并运行例程,要执行一个例程demo_x.py,请在命令行中输入python demo_x.py。例如,要执行 demo_read_and_int.py例程,你需要输入:
    - -```python -python demo_read_and_int.py -或 -python2 demo_read_and_int.py -``` - -## 方法 - -```python - '''! - @brief 构造MAX17043对象 - @return MAX17043 初始化 - @retval 0 成功 - @retval -1 失败 - ''' - def begin(self): - - '''! - @brief 读电池电压,单位: mV - @return 电池电压,单位:mV - ''' - def read_voltage(self): - - '''! - @brief 读取剩余电池容量的百分比 - @return 剩余电池容量的百分比 - ''' - def read_percentage(self): - '''! - @brief 设置 MAX17043 中断阈值 - @param per 中断阈值范围: %1 - 32% (整数) - ''' - def set_interrupt(self, per): - - '''! - @brief 清除 MAX17043 中断. - ''' - def clear_interrupt(self): - - '''! - @brief 设置 MAX17043 进入睡眠模式 - ''' - def set_sleep(self): - - '''! - @brief 唤醒 MAX17043 - ''' - def set_wakeup(self): -``` - -## 兼容性 - -| 主板 | 通过 | 未通过 | 未测试 | 备注 | -| ------------ | :--: | :----: | :----: | :--: | -| RaspberryPi2 | | | √ | | -| RaspberryPi3 | | | √ | | -| RaspberryPi4 | √ | | | | - -* Python 版本 - -| Python | 通过 | 未通过 | 未测试 | 备注 | -| ------- | :--: | :----: | :----: | ---- | -| Python2 | √ | | | | -| Python3 | | | √ | | - -## 历史 - -- 2018/04/14 - 1.0.0 版本 - -## 创作者 - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) - - - - - - diff --git a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py b/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py deleted file mode 100644 index dd328c640..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/python/raspberry/examples/demo_read_and_int.py +++ /dev/null @@ -1,44 +0,0 @@ -'''! - @file demo_read_and_int.py - @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com) - @license The MIT License (MIT) - @author [ouki.wang](ouki.wang@dfrobot.com) - @version V1.0 - @date 2018-4-14 - @url https://github.com/DFRobot/DFRobot_MAX17043 -''' - -import sys -sys.path.append('../') -import time - -sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) -from DFRobot_MAX17043 import DFRobot_MAX17043 -import RPi.GPIO as GPIO - -gauge = DFRobot_MAX17043() - -GPIO.setmode(GPIO.BOARD) -GPIO.setup(7, GPIO.IN) - -def interruptCallBack(channel): - gauge.clear_interrupt() - print('Low power alert interrupt!') - #put your battery low power alert interrupt service routine here - -GPIO.add_event_detect(7, GPIO.FALLING, callback = interruptCallBack, bouncetime = 5) - -rslt = gauge.begin() - -while rslt != 0: - print('gauge begin faild') - time.sleep(2) - rslt = gauge.begin() - -gauge.set_interrupt(32) #use this to modify alert threshold as 1% - 32% (integer) -print('gauge begin successful') - -while True: - time.sleep(2) - print('voltage: ' + str(gauge.read_voltage()) + 'mV') - print('percentage: ' + str(round(gauge.read_percentage(), 2)) + '%') diff --git a/lib/lib_i2c/DFRobot_MAX17043/readme.md b/lib/lib_i2c/DFRobot_MAX17043/readme.md deleted file mode 100644 index fdc79ac77..000000000 --- a/lib/lib_i2c/DFRobot_MAX17043/readme.md +++ /dev/null @@ -1,122 +0,0 @@ -# DFRobot_MAX17043 - -* [中文版](./README_CN.md) - - The MAX17043 is ultra-compact, low-cost,host-side fuel-gauge systems for lithium-ion (Li+) batter-ies in handheld and portable -equipment.It employs Gravity I2C interface,ultra-low opearting current, and real-time tracking of the relative state of charge (SOC) -of the battery through Maxim's patented algorithm,eliminating the need for full-to-empty relearning and offset accumualtion errors. -Plug and play to accurately measure the voltage and remaining power of the battery. The module also features as a low battery power -alert interrupt function. When the battery power falls below specified threshold, the ALR pin generates a falling pluse to trigger -the external interrupt of the controller.One thing should mention that the default value of the battery low power interrupt alert -threshold is 32%, this threshold can be set by the function setInterrupt(). - -![产品效果图](./resources/images/DFR0563.jpg) - -## Product Link([https://www.dfrobot.com/product-1734.html](https://www.dfrobot.com/product-1734.html)) - SKU: DFR0563 - -## Table of Contents -* [Summary](#summary) -* [connection](connection) -* [Installation](#installation) -* [Methods](#methods) -* [Compatibility](#compatibility) -* [History](#history) -* [Credits](#credits) - -## Summary - -Provides an Arduino library for reading and interperting MAX17043 data over I2C. - -## Connection -Wires of the same color are linked together,and We only exemplify how these the boards are connected to the Fuel Gauge. -When connecting , it is necessary to pay attention to the correspondence among pins, the connection diagram is as fellows. - -* Arduino UNO -
    - -
    - -* ESP32 -
    - -
    - - -## Installation - -To use this library download the zip file, uncomperss it to a folder named DFRobot_MAX17043 in Arduino library. -## Methods - -```C++ - /** - * @fn DFRobot_MAX17043 - * @brief create MAX17043 object - * @return MAX17043 object - */ - DFRobot_MAX17043(); - /** - * @fn begin - * @brief MAX17043 begin and test moudle - * - * @return initialization result - * @retval 0 successful - * @retval -1 faild - */ - int begin(); - /** - * @fn readVoltage - * @brief read battery voltage in mV - * @return voltage in mV - */ - float readVoltage(); - /** - * @fn readPercentage - * @brief read battery remaining capacity in percentage - * - * @return battery remaining capacity in percentage - */ - float readPercentage(); - /** - * @fn setInterrupt - * @brief set MAX17043 interrput threshold - * - * @param per interrupt threshold as %1 - 32% (integer) - */ - void setInterrupt(uint8_t per); - /** - * @fn clearInterrupt - * @brief clear MAX17043 interrupt - */ - void clearInterrupt(); - /** - * @fn setSleep - * @brief set MAX17043 in sleep mode - * - */ - void setSleep(); - /** - * @fn setWakeUp - * @brief wake up MAX17043 - * - */ - void setWakeUp(); - -``` - -## Compatibility - -| MCU | Work Well | Work Wrong | Untested | Remarks | -| ------------------ | :-------: | :--------: | :------: | ------- | -| FireBeetle-ESP32 | √ | | | -| FireBeetle-ESP8266 | √ | | | -| Arduino uno | √ | | | - -## History - -- 2018/04/14 - Version 1.0.0 released. - -## Credits - -Written by ouki.wang(ouki.wang@dfrobot.com), 2018. (Welcome to our [website](https://www.dfrobot.com/)) - diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/DFR0563.jpg deleted file mode 100644 index eb0370a56c7a5819263a3f203dadfe10ecc6f234..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12228 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 G2mU{%k|r1c diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/Raspberry Pi.jpg deleted file mode 100644 index 3ab96c2cde7ffbf0cc6dbdc186aaacff594a993e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29834 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 diff --git a/lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg b/lib/lib_i2c/DFRobot_MAX17043/resources/images/UNO.jpg deleted file mode 100644 index 8c3d66b653306b3a6f64fac678c7d7e998d8075c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26373 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 U&LiW}XK@~wC8#@j`On7x0mp*$umAu6 diff --git a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino index 4a90f0b13..7c97be17e 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_110_max17043.ino @@ -27,10 +27,6 @@ * The alert flag and alert threshold are not required for MQTT, the alert pin is not used * by this sensor driver. * - * Wiring and other information: - * - * \lib\lib_i2c\DFRobot_MAX17043\resources - * * Tested module(s): * * https://www.dfrobot.com/product-1734.html @@ -45,16 +41,6 @@ #define XI2C_83 83 // See I2CDEVICES.md #define MAX17043_ADDRESS 0x36 - -//#define MAX17043_USE_LIB - -#ifdef MAX17043_USE_LIB - -#include "DFRobot_MAX17043.h" -DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 - -#else - #define MAX17043_VCELL 0x02 #define MAX17043_SOC 0x04 #define MAX17043_MODE 0x06 @@ -62,30 +48,18 @@ DFRobot_MAX17043 max17043_gauge; // Class to read from MAX17043 #define MAX17043_CONFIG 0x0c #define MAX17043_COMMAND 0xfe -#endif // MAX17043_USE_LIB - bool max17043 = false; /*********************************************************************************************/ void Max17043Init(void) { if (I2cSetDevice(MAX17043_ADDRESS)) { - -#ifdef MAX17043_USE_LIB - - if (max17043_gauge.begin() == 0) { - -#else - I2cWrite16(MAX17043_ADDRESS, MAX17043_COMMAND, 0x5400); // Power on reset delay(10); if (I2cRead16(MAX17043_ADDRESS, MAX17043_CONFIG) == 0x971c) { // Default 0x971c I2cWrite16(MAX17043_ADDRESS, MAX17043_MODE, 0x4000); // Quick start I2cWrite16(MAX17043_ADDRESS, MAX17043_CONFIG, 0x9700); delay(10); - -#endif // MAX17043_USE_LIB - max17043 = true; I2cSetActiveFound(MAX17043_ADDRESS, "MAX17043"); } @@ -93,20 +67,10 @@ void Max17043Init(void) { } void Max17043Show(bool json) { - -#ifdef MAX17043_USE_LIB - - float voltage = max17043_gauge.readVoltage() / 1000.0; // Battery voltage in Volt - float percentage = max17043_gauge.readPercentage(); // Battery remaining charge in percent - -#else - float voltage = (1.25f * (float)(I2cRead16(MAX17043_ADDRESS, MAX17043_VCELL) >> 4)) / 1000.0; // Battery voltage in Volt uint16_t per = I2cRead16(MAX17043_ADDRESS, MAX17043_SOC); float percentage = (float)((per >> 8) + 0.003906f * (per & 0x00ff)); // Battery remaining charge in percent -#endif // MAX17043_USE_LIB - // During charging the percentage might be (slightly) above 100%. To avoid strange numbers // in the statistics the percentage provided by this driver will not go above 100% if (percentage > 100.0) { percentage = 100.0; } From 6572f0ed395714474757cdb66af50a395e48f826 Mon Sep 17 00:00:00 2001 From: stefanbode Date: Thu, 3 Aug 2023 11:55:20 +0200 Subject: [PATCH 122/150] Fixing SHUTTERINVERT issues (#19243) * fix wrong inverted shutter * fix inverted shutter for esp32 --- .../xdrv_27_esp32_shutter.ino | 16 ++++++++-------- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 15 +++++++-------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index f09370ed6..9ff0807c0 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -460,8 +460,6 @@ void ShutterRtc50mS(void) int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) { - // if inverted recalculate the percentposition - percent = (ShutterSettings.shutter_options[index] & 1) ? 100 - percent : percent; if (ShutterSettings.shutter_set50percent[index] != 50) { return (percent <= 5) ? ShutterSettings.shuttercoeff[2][index] * percent*10 : (ShutterSettings.shuttercoeff[1][index] * percent + (ShutterSettings.shuttercoeff[0][index]*10))*10; } else { @@ -523,9 +521,8 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) } } } - realpercent = realpercent < 0 ? 0 : realpercent; - // if inverted recalculate the percentposition - return (ShutterSettings.shutter_options[index] & 1) ? 100 - realpercent : realpercent; + realpercent = realpercent < 0 ? 0 : realpercent; + return realpercent; } void ShutterInit(void) @@ -1321,7 +1318,7 @@ void ShutterToggle(bool dir) void ShutterShow(){ for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (ShutterSettings.shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(ShutterSettings.shutter_options[i] & 1) ? D_CLOSE : D_OPEN, ShutterRealToPercentPosition(-9999, i), i+1); + WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (Settings->shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(Settings->shutter_options[i] & 1) ? D_CLOSE : D_OPEN, (Settings->shutter_options[i] & 1) ? (100 - ShutterRealToPercentPosition(-9999, i)) : ShutterRealToPercentPosition(-9999, i), i+1); } } /*********************************************************************************************\ @@ -1516,8 +1513,11 @@ void CmndShutterPosition(void) } int8_t target_pos_percent = (XdrvMailbox.payload < 0) ? (XdrvMailbox.payload == -99 ? ShutterRealToPercentPosition(Shutter[index].real_position, index) : 0) : ((XdrvMailbox.payload > 100) ? 100 : XdrvMailbox.payload); - // webgui still send also on inverted shutter the native position. - target_pos_percent = ((ShutterSettings.shutter_options[index] & 1) && (SRC_WEBGUI == TasmotaGlobal.last_source)) ? 100 - target_pos_percent : target_pos_percent; + target_pos_percent = ((Settings->shutter_options[index] & 1) && ((SRC_MQTT != TasmotaGlobal.last_source) + || (SRC_SERIAL != TasmotaGlobal.last_source) + || (SRC_WEBCOMMAND != TasmotaGlobal.last_source) + )) ? 100 - target_pos_percent : target_pos_percent; + if (XdrvMailbox.payload != -99) { Shutter[index].target_position = ShutterPercentToRealPosition(target_pos_percent, index); //Shutter[i].accelerator[index] = ShutterGlobal.open_velocity_max / ((Shutter[i].motordelay[index] > 0) ? Shutter[i].motordelay[index] : 1); diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index f6fe28a40..e49c1b633 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -252,8 +252,6 @@ void ShutterRtc50mS(void) int32_t ShutterPercentToRealPosition(int16_t percent, uint32_t index) { - // if inverted recalculate the percentposition - percent = (Settings->shutter_options[index] & 1) ? 100 - percent : percent; if (Settings->shutter_set50percent[index] != 50) { return (percent <= 5) ? Settings->shuttercoeff[2][index] * percent*10 : (Settings->shuttercoeff[1][index] * percent + (Settings->shuttercoeff[0][index]*10))*10; } else { @@ -315,9 +313,8 @@ uint8_t ShutterRealToPercentPosition(int32_t realpos, uint32_t index) } } } - realpercent = realpercent < 0 ? 0 : realpercent; - // if inverted recalculate the percentposition - return (Settings->shutter_options[index] & 1) ? 100 - realpercent : realpercent; + realpercent = realpercent < 0 ? 0 : realpercent; + return realpercent; } void ShutterInit(void) @@ -1144,7 +1141,7 @@ void ShutterToggle(bool dir) void ShutterShow(){ for (uint32_t i = 0; i < TasmotaGlobal.shutters_present; i++) { - WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (Settings->shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(Settings->shutter_options[i] & 1) ? D_CLOSE : D_OPEN, ShutterRealToPercentPosition(-9999, i), i+1); + WSContentSend_P(HTTP_MSG_SLIDER_SHUTTER, (Settings->shutter_options[i] & 1) ? D_OPEN : D_CLOSE,(Settings->shutter_options[i] & 1) ? D_CLOSE : D_OPEN, (Settings->shutter_options[i] & 1) ? (100 - ShutterRealToPercentPosition(-9999, i)) : ShutterRealToPercentPosition(-9999, i), i+1); } } @@ -1338,8 +1335,10 @@ void CmndShutterPosition(void) } int8_t target_pos_percent = (XdrvMailbox.payload < 0) ? (XdrvMailbox.payload == -99 ? ShutterRealToPercentPosition(Shutter[index].real_position, index) : 0) : ((XdrvMailbox.payload > 100) ? 100 : XdrvMailbox.payload); - // webgui still send also on inverted shutter the native position. - target_pos_percent = ((Settings->shutter_options[index] & 1) && (SRC_WEBGUI != TasmotaGlobal.last_source)) ? 100 - target_pos_percent : target_pos_percent; + target_pos_percent = ((Settings->shutter_options[index] & 1) && ((SRC_MQTT != TasmotaGlobal.last_source) + || (SRC_SERIAL != TasmotaGlobal.last_source) + || (SRC_WEBCOMMAND != TasmotaGlobal.last_source) + )) ? 100 - target_pos_percent : target_pos_percent; if (XdrvMailbox.payload != -99) { //target_pos_percent = (Settings->shutter_options[index] & 1) ? 100 - target_pos_percent : target_pos_percent; Shutter[index].target_position = ShutterPercentToRealPosition(target_pos_percent, index); From 39643611d498ecadd612af312b4723469888566b Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Thu, 3 Aug 2023 12:12:55 +0200 Subject: [PATCH 123/150] Update changelogs --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + 2 files changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 52994e7ed..95fc45227 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ All notable changes to this project will be documented in this file. - ESP8266 SPI initialization for scripter, filesystem and MFRC522 (#19209) - Zero cross dimmer minimum interrupt time (#19211) - Fade would fail when the difference between start and target would be too small (#19248) +- Inverted shutter (#19243) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 71d04bcd4..00df47f48 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -160,6 +160,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - MiElHVAC power commands regression from v12.4.0.1 [#18923](https://github.com/arendst/Tasmota/issues/18923) - Zero cross dimmer minimum interrupt time [#19211](https://github.com/arendst/Tasmota/issues/19211) - Fade would fail when the difference between start and target would be too small [#19248](https://github.com/arendst/Tasmota/issues/19248) +- Inverted shutter [#19243](https://github.com/arendst/Tasmota/issues/19243) - ESP8266 SPI initialization for scripter, filesystem and MFRC522 [#19209](https://github.com/arendst/Tasmota/issues/19209) ### Removed From b6129f2ab7a6a28dbed56946dac066ec6bed82b8 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Thu, 3 Aug 2023 18:28:25 +0200 Subject: [PATCH 124/150] Matter support for large atribute responses (#19252) Support for responses (arrays) that do not fit in a single UDP packer Do not remove children fabrics --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 28 +- .../berry_matter/src/embedded/Matter_IM.be | 145 +- .../src/embedded/Matter_Plugin.be | 8 +- .../src/embedded/Matter_Plugin_Root.be | 8 +- .../berry_matter/src/embedded/Matter_TLV.be | 14 +- .../src/solidify/solidified_Matter_Device.h | 131 +- .../src/solidify/solidified_Matter_IM.h | 1739 ++++++------ .../src/solidify/solidified_Matter_Plugin.h | 205 +- .../solidify/solidified_Matter_Plugin_Root.h | 680 +++-- .../src/solidify/solidified_Matter_TLV.h | 2362 +++++++++-------- 11 files changed, 2760 insertions(+), 2561 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95fc45227..286d1a90b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ All notable changes to this project will be documented in this file. - Zero cross dimmer minimum interrupt time (#19211) - Fade would fail when the difference between start and target would be too small (#19248) - Inverted shutter (#19243) +- Matter support for large atribute responses ### Removed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index d9f58469e..95ef1a7dd 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -176,18 +176,24 @@ class Matter_Device ##################################################################### # Remove a fabric and clean all corresponding values and mDNS entries - def remove_fabric(fabric_parent) - var sub_fabrics = self.sessions.find_children_fabrics(fabric_parent.get_fabric_index()) - if sub_fabrics == nil return end - for fabric_index : sub_fabrics - var fabric = self.sessions.find_fabric_by_index(fabric_index) - if fabric != nil - tasmota.log("MTR: removing fabric " + fabric.get_fabric_id().copy().reverse().tohex(), 2) - self.message_handler.im.subs_shop.remove_by_fabric(fabric) - self.mdns_remove_op_discovery(fabric) - self.sessions.remove_fabric(fabric) - end + def remove_fabric(fabric) + if fabric != nil + tasmota.log("MTR: removing fabric " + fabric.get_fabric_id().copy().reverse().tohex(), 2) + self.message_handler.im.subs_shop.remove_by_fabric(fabric) + self.mdns_remove_op_discovery(fabric) + self.sessions.remove_fabric(fabric) end + # var sub_fabrics = self.sessions.find_children_fabrics(fabric_parent.get_fabric_index()) + # if sub_fabrics == nil return end + # for fabric_index : sub_fabrics + # var fabric = self.sessions.find_fabric_by_index(fabric_index) + # if fabric != nil + # tasmota.log("MTR: removing fabric " + fabric.get_fabric_id().copy().reverse().tohex(), 2) + # self.message_handler.im.subs_shop.remove_by_fabric(fabric) + # self.mdns_remove_op_discovery(fabric) + # self.sessions.remove_fabric(fabric) + # end + # end self.sessions.save_fabrics() end diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be index 3f37b7c1a..016115fc8 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_IM.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_IM.be @@ -225,7 +225,7 @@ class Matter_IM # Inner code shared between read_attributes and subscribe_request # # query: `ReadRequestMessage` or `SubscribeRequestMessage` - def _inner_process_read_request(session, query, no_log) + def _inner_process_read_request(session, query, msg, no_log) ### Inner function to be iterated upon # ret is the ReportDataMessage list to send back @@ -243,22 +243,47 @@ class Matter_IM # Special case to report unsupported item, if pi==nil var res = (pi != nil) ? pi.read_attribute(session, ctx, self.tlv_solo) : nil var found = true # stop expansion since we have a value - var a1_raw # this is the bytes() block we need to add to response (or nil) + var a1_raw_or_list # contains either a bytes() buffer to append, or a list of bytes(), or nil if res != nil - var res_str = res.to_str_val() # get the value with anonymous tag before it is tagged, for logging + var res_str = "" + if !no_log + res_str = res.to_str_val() # get the value with anonymous tag before it is tagged, for logging + end - # encode directly raw bytes() - a1_raw = bytes(48) # pre-reserve 48 bytes - self.attributedata2raw(a1_raw, ctx, res) + # check if too big to encode as a single packet + if (res.is_list || res.is_array) && res.encode_len() > matter.IM_ReportData.MAX_MESSAGE + # tasmota.log(f"MTR: >>>>>> long response", 3) + a1_raw_or_list = [] # we return a list of block + var a1_raw = bytes(48) + var empty_list = TLV.Matter_TLV_array() + self.attributedata2raw(a1_raw, ctx, empty_list, false) + a1_raw_or_list.push(a1_raw) + # tasmota.log(f"MTR: >>>>>> long response global DELETE {a1_raw.tohex()}", 3) + + for elt:res.val + a1_raw = bytes(48) + # var list_item = TLV.Matter_TLV_array() + # list_item.val.push(elt) + self.attributedata2raw(a1_raw, ctx, elt, true #- add ListIndex:null -#) + # tasmota.log(f"MTR: >>>>>> long response global ADD {a1_raw.tohex()}", 3) + a1_raw_or_list.push(a1_raw) + end + # tasmota.log(f"MTR: >>>>>> long response global {a1_raw_or_list}", 3) + else + # normal encoding + # encode directly raw bytes() + a1_raw_or_list = bytes(48) # pre-reserve 48 bytes + self.attributedata2raw(a1_raw_or_list, ctx, res) + end if !no_log - tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - %s", session.local_session_id, str(ctx), attr_name, res_str), 3) + tasmota.log(f"MTR: >Read_Attr ({session.local_session_id:6i}) {ctx}{attr_name} - {res_str}", 3) end elif ctx.status != nil if direct # we report an error only if a concrete direct read, not with wildcards # encode directly raw bytes() - a1_raw = bytes(48) # pre-reserve 48 bytes - self.attributestatus2raw(a1_raw, ctx, ctx.status) + a1_raw_or_list = bytes(48) # pre-reserve 48 bytes + self.attributestatus2raw(a1_raw_or_list, ctx, ctx.status) if tasmota.loglevel(3) tasmota.log(format("MTR: >Read_Attr (%6i) %s%s - STATUS: 0x%02X %s", session.local_session_id, str(ctx), attr_name, ctx.status, ctx.status == matter.UNSUPPORTED_ATTRIBUTE ? "UNSUPPORTED_ATTRIBUTE" : ""), 3) @@ -270,27 +295,55 @@ class Matter_IM found = false end - # check if we still have enough room in last block - if a1_raw # do we have bytes to add, and it's not zero size + # a1_raw_or_list if either nil, bytes(), of list(bytes()) + var idx = isinstance(a1_raw_or_list, list) ? 0 : nil # index in list, or nil if non-list + while a1_raw_or_list != nil + var elt = (idx == nil) ? a1_raw_or_list : a1_raw_or_list[idx] # dereference + if size(ret.attribute_reports) == 0 - ret.attribute_reports.push(a1_raw) # push raw binary instead of a TLV + ret.attribute_reports.push(elt) # push raw binary instead of a TLV else # already blocks present, see if we can add to the latest, or need to create a new block var last_block = ret.attribute_reports[-1] - if size(last_block) + size(a1_raw) <= matter.IM_ReportData.MAX_MESSAGE + if size(last_block) + size(elt) <= matter.IM_ReportData.MAX_MESSAGE # add to last block - last_block .. a1_raw + last_block .. elt else - ret.attribute_reports.push(a1_raw) # push raw binary instead of a TLV + ret.attribute_reports.push(elt) # push raw binary instead of a TLV + end + end + + if idx == nil + a1_raw_or_list = nil # stop loop + else + idx += 1 + if idx >= size(a1_raw_or_list) + a1_raw_or_list = nil # stop loop end end end + # check if we still have enough room in last block + # if a1_raw_or_list # do we have bytes to add, and it's not zero size + # if size(ret.attribute_reports) == 0 + # ret.attribute_reports.push(a1_raw_or_list) # push raw binary instead of a TLV + # else # already blocks present, see if we can add to the latest, or need to create a new block + # var last_block = ret.attribute_reports[-1] + # if size(last_block) + size(a1_raw_or_list) <= matter.IM_ReportData.MAX_MESSAGE + # # add to last block + # last_block .. a1_raw_or_list + # else + # ret.attribute_reports.push(a1_raw_or_list) # push raw binary instead of a TLV + # end + # end + # end + return found # return true if we had a match end var endpoints = self.device.get_active_endpoints() # structure is `ReadRequestMessage` 10.6.2 p.558 var ctx = matter.Path() + ctx.msg = msg # prepare the response var ret = matter.ReportDataMessage() @@ -347,8 +400,10 @@ class Matter_IM # 2402 01 2 = 1U (U1) # 2403 39 3 = 0x39U (U1) # 2404 11 4 = 0x11U (U1) + # [OPTIONAL ListIndex] + # 3405 5 = NULL # 18 - def path2raw(raw, ctx, sub_tag) + def path2raw(raw, ctx, sub_tag, list_index_null) # open struct raw.add(0x37, 1) # add 37 raw.add(sub_tag, 1) # add sub_tag @@ -382,6 +437,11 @@ class Matter_IM raw.add(0x2604, -2) # add 2604 raw.add(ctx.attribute, 4) end + # do we add ListIndex: null + if list_index_null + raw.add(0x3405, -2) # add 3405 + end + # close raw.add(0x18, 1) # add 18 end @@ -418,15 +478,18 @@ class Matter_IM # 2402 01 2 = 1U (U1) # 2403 39 3 = 0x39U (U1) # 2404 11 4 = 0x11U (U1) + # [OPTIONAL ListIndex] + # 3405 5 = NULL + # # 18 # 2902 2 = True # 18 # 18 - def attributedata2raw(raw, ctx, val) + def attributedata2raw(raw, ctx, val, list_index_null) raw.add(0x15350124, -4) # add 15350124 raw.add(0x0001, -2) # add 0001 - self.path2raw(raw, ctx, 0x01) + self.path2raw(raw, ctx, 0x01, list_index_null) # add value with tag 2 val.tag_sub = 2 @@ -615,7 +678,7 @@ class Matter_IM var query = matter.ReadRequestMessage().from_TLV(val) # matter.profiler.log(str(query)) if query.attributes_requests != nil - var ret = self._inner_process_read_request(msg.session, query) + var ret = self._inner_process_read_request(msg.session, query, msg) self.send_report_data(msg, ret) end @@ -629,15 +692,10 @@ class Matter_IM # returns `true` if processed, `false` if silently ignored, # or raises an exception def process_read_request_solo(msg, ctx) - # matter.profiler.log("read_request_solo start") - # matter.profiler.log(str(val)) - # var query = matter.ReadRequestMessage().from_TLV(val) - # matter.profiler.log("read_request_start-TLV") - # prepare fallback error ctx.status = matter.INVALID_ACTION + ctx.msg = msg - # TODO # find pi for this endpoint/cluster/attribute var pi = self.device.process_attribute_read_solo(ctx) var res = nil @@ -653,6 +711,15 @@ class Matter_IM if res != nil + # check if the payload is a complex structure and too long to fit in a single response packet + if (res.is_list || res.is_array) && res.encode_len() > matter.IM_ReportData.MAX_MESSAGE + # revert to standard + # the attribute will be read again, but it's hard to avoid it + res = nil # indicated to GC that we don't need it again + tasmota.log(f"MTR: Response to big, revert to non-solo", 3) + var val = matter.TLV.parse(msg.raw, msg.app_payload_idx) + return self.process_read_request(msg, val) + end # encode directly raw bytes() raw = bytes(48) # pre-reserve 48 bytes @@ -665,8 +732,6 @@ class Matter_IM raw.add(0x1824FF01, -4) # add 1824FF01 raw.add(0x18, 1) # add 18 - # matter.profiler.log("read_request_solo raw done") - elif ctx.status != nil # encode directly raw bytes() @@ -686,31 +751,14 @@ class Matter_IM return false end - # matter.profiler.log("read_request_solo res ready") - # tasmota.log(f"MTR: process_read_request_solo {raw=}") - # send packet - # self.send_report_data_solo(msg, ret) - # var report_solo = matter.IM_ReportData_solo(msg, ret) var resp = msg.build_response(0x05 #-Report Data-#, true) - # super(self).reset(msg, 0x05 #-Report Data-#, true) - # matter.profiler.log("read_request_solo report_solo") - - # send_im() - # report_solo.send_im(self.device.message_handler) var responder = self.device.message_handler - # matter.profiler.log("read_request_solo send_im-1") - # if tasmota.loglevel(3) # TODO remove before flight - # tasmota.log(f">>>: data_raw={raw.tohex()}", 3) - # end - # matter.profiler.log("read_request_solo send_im-2") var msg_raw = msg.raw msg_raw.clear() resp.encode_frame(raw, msg_raw) # payload in cleartext - # matter.profiler.log("read_request_solo send_im-3") resp.encrypt() - # matter.profiler.log("read_request_solo send_im-encrypted") if tasmota.loglevel(4) tasmota.log(format("MTR: Subscribe (%6i) event_requests_size={size(query.event_requests)}", 3) end - var ret = self._inner_process_read_request(msg.session, query, true #-no_log-#) + var ret = self._inner_process_read_request(msg.session, query, msg, true #-no_log-#) # ret is of type `Matter_ReportDataMessage` ret.subscription_id = sub.subscription_id # enrich with subscription id TODO self.send_subscribe_response(msg, ret, sub) @@ -853,11 +901,7 @@ class Matter_IM end end - # tasmota.log("MTR: invoke_responses="+str(ret.invoke_responses), 4) if size(ret.invoke_responses) > 0 - # tasmota.log("MTR: InvokeResponse=" + str(ret), 4) - # tasmota.log("MTR: InvokeResponseTLV=" + str(ret.to_TLV()), 3) - self.send_invoke_response(msg, ret) else return false # we don't send anything, hence the responder sends a simple packet ack @@ -1009,6 +1053,7 @@ class Matter_IM # structure is `ReadRequestMessage` 10.6.2 p.558 # tasmota.log("MTR: IM:write_request processing start", 4) var ctx = matter.Path() + ctx.msg = msg if query.write_requests != nil # prepare the response @@ -1112,7 +1157,7 @@ class Matter_IM tasmota.log(format("MTR: ********************************************************************/ -be_local_closure(Matter_Plugin_send_ack_now, /* name */ +be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(device), - /* K1 */ be_nested_str_weak(message_handler), - /* K2 */ be_nested_str_weak(im), - /* K3 */ be_nested_str_weak(send_ack_now), - }), - be_str_weak(send_ack_now), + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(_X3Clambda_X3E), &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x88080501, // 0001 GETMBR R2 R2 K1 - 0x88080502, // 0002 GETMBR R2 R2 K2 - 0x8C080503, // 0003 GETMET R2 R2 K3 - 0x5C100200, // 0004 MOVE R4 R1 - 0x7C080400, // 0005 CALL R2 2 - 0x80000000, // 0006 RET 0 + ( &(const binstruction[ 4]) { /* code */ + 0x60040008, // 0000 GETGBL R1 G8 + 0x5C080000, // 0001 MOVE R2 R0 + 0x7C040200, // 0002 CALL R1 1 + 0x80040200, // 0003 RET 1 R1 }) ) ); @@ -820,26 +827,26 @@ be_local_closure(Matter_Plugin_update_shadow_lazy, /* name */ /******************************************************************** -** Solidified function: +** Solidified function: get_endpoint ********************************************************************/ -be_local_closure(Matter_Plugin__X3Clambda_X3E, /* name */ +be_local_closure(Matter_Plugin_get_endpoint, /* name */ be_nested_proto( - 3, /* nstack */ + 2, /* nstack */ 1, /* argc */ - 0, /* varg */ + 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(_X3Clambda_X3E), + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(endpoint), + }), + be_str_weak(get_endpoint), &be_const_str_solidified, - ( &(const binstruction[ 4]) { /* code */ - 0x60040008, // 0000 GETGBL R1 G8 - 0x5C080000, // 0001 MOVE R2 R0 - 0x7C040200, // 0002 CALL R1 1 - 0x80040200, // 0003 RET 1 R1 + ( &(const binstruction[ 2]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x80040200, // 0001 RET 1 R1 }) ) ); @@ -1071,13 +1078,16 @@ be_local_class(Matter_Plugin, be_nested_map(37, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(init, -1), be_const_closure(Matter_Plugin_init_closure) }, - { be_const_key_weak(read_event, 8), be_const_closure(Matter_Plugin_read_event_closure) }, + { be_const_key_weak(read_event, 11), be_const_closure(Matter_Plugin_read_event_closure) }, { be_const_key_weak(tick, -1), be_const_var(4) }, { be_const_key_weak(is_local_device, 18), be_const_closure(Matter_Plugin_is_local_device_closure) }, { be_const_key_weak(UPDATE_TIME, -1), be_const_int(5000) }, { be_const_key_weak(get_attribute_list, -1), be_const_closure(Matter_Plugin_get_attribute_list_closure) }, - { be_const_key_weak(ui_conf_to_string, 28), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, + { be_const_key_weak(ui_conf_to_string, 26), be_const_static_closure(Matter_Plugin_ui_conf_to_string_closure) }, { be_const_key_weak(every_250ms, -1), be_const_closure(Matter_Plugin_every_250ms_closure) }, + { be_const_key_weak(ack_request, -1), be_const_closure(Matter_Plugin_ack_request_closure) }, + { be_const_key_weak(NAME, -1), be_nested_str_weak() }, + { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, { be_const_key_weak(CLUSTERS, 36), be_const_simple_instance(be_nested_simple_instance(&be_class_map, { be_const_map( * be_nested_map(2, ( (struct bmapnode*) &(const bmapnode[]) { @@ -1097,28 +1107,25 @@ be_local_class(Matter_Plugin, be_const_int(17), })) ) } )) }, })) ) } )) }, - { be_const_key_weak(NAME, -1), be_nested_str_weak() }, - { be_const_key_weak(parse_sensors, -1), be_const_closure(Matter_Plugin_parse_sensors_closure) }, - { be_const_key_weak(get_endpoint, -1), be_const_closure(Matter_Plugin_get_endpoint_closure) }, { be_const_key_weak(parse_configuration, -1), be_const_closure(Matter_Plugin_parse_configuration_closure) }, { be_const_key_weak(ui_string_to_conf, -1), be_const_static_closure(Matter_Plugin_ui_string_to_conf_closure) }, { be_const_key_weak(contains_cluster, -1), be_const_closure(Matter_Plugin_contains_cluster_closure) }, - { be_const_key_weak(attribute_updated, 11), be_const_closure(Matter_Plugin_attribute_updated_closure) }, - { be_const_key_weak(has, -1), be_const_closure(Matter_Plugin_has_closure) }, + { be_const_key_weak(ARG_TYPE, -1), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(has, 8), be_const_closure(Matter_Plugin_has_closure) }, { be_const_key_weak(device, 4), be_const_var(1) }, { be_const_key_weak(timed_request, -1), be_const_closure(Matter_Plugin_timed_request_closure) }, { be_const_key_weak(get_cluster_list, -1), be_const_closure(Matter_Plugin_get_cluster_list_closure) }, { be_const_key_weak(read_attribute, -1), be_const_closure(Matter_Plugin_read_attribute_closure) }, { be_const_key_weak(ARG, 14), be_nested_str_weak() }, - { be_const_key_weak(send_ack_now, -1), be_const_closure(Matter_Plugin_send_ack_now_closure) }, - { be_const_key_weak(subscribe_attribute, 26), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, - { be_const_key_weak(clusters, -1), be_const_var(3) }, - { be_const_key_weak(write_attribute, 24), be_const_closure(Matter_Plugin_write_attribute_closure) }, - { be_const_key_weak(ARG_TYPE, 15), be_const_static_closure(Matter_Plugin__X3Clambda_X3E_closure) }, + { be_const_key_weak(invoke_request, -1), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(subscribe_attribute, 24), be_const_closure(Matter_Plugin_subscribe_attribute_closure) }, + { be_const_key_weak(get_endpoint, 30), be_const_closure(Matter_Plugin_get_endpoint_closure) }, + { be_const_key_weak(write_attribute, 28), be_const_closure(Matter_Plugin_write_attribute_closure) }, + { be_const_key_weak(ARG_HINT, 22), be_nested_str_weak(_Not_X20used_) }, { be_const_key_weak(update_shadow_lazy, -1), be_const_closure(Matter_Plugin_update_shadow_lazy_closure) }, - { be_const_key_weak(invoke_request, 30), be_const_closure(Matter_Plugin_invoke_request_closure) }, + { be_const_key_weak(clusters, -1), be_const_var(3) }, { be_const_key_weak(endpoint, -1), be_const_var(2) }, - { be_const_key_weak(ARG_HINT, -1), be_nested_str_weak(_Not_X20used_) }, + { be_const_key_weak(attribute_updated, 15), be_const_closure(Matter_Plugin_attribute_updated_closure) }, { be_const_key_weak(subscribe_event, -1), be_const_closure(Matter_Plugin_subscribe_event_closure) }, { be_const_key_weak(update_shadow, -1), be_const_closure(Matter_Plugin_update_shadow_closure) }, { be_const_key_weak(consolidate_clusters, -1), be_const_closure(Matter_Plugin_consolidate_clusters_closure) }, diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h index 12725f394..0532fdda0 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Plugin_Root.h @@ -47,7 +47,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ ), }), 1, /* has constants */ - ( &(const bvalue[101]) { /* constants */ + ( &(const bvalue[100]) { /* constants */ /* K0 */ be_nested_str_weak(crypto), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -65,90 +65,89 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ /* K14 */ be_const_int(2), /* K15 */ be_nested_str_weak(XX), /* K16 */ be_const_int(3), - /* K17 */ be_nested_str_weak(send_ack_now), - /* K18 */ be_nested_str_weak(msg), - /* K19 */ be_nested_str_weak(_fabric), - /* K20 */ be_nested_str_weak(fabric_completed), - /* K21 */ be_nested_str_weak(set_no_expiration), - /* K22 */ be_nested_str_weak(save), - /* K23 */ be_nested_str_weak(device), - /* K24 */ be_nested_str_weak(start_commissioning_complete_deferred), - /* K25 */ be_nested_str_weak(context_error), - /* K26 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), - /* K27 */ be_nested_str_weak(status), - /* K28 */ be_nested_str_weak(UNSUPPORTED_COMMAND), - /* K29 */ be_nested_str_weak(B2), - /* K30 */ be_nested_str_weak(DAC_Cert_FFF1_8000), - /* K31 */ be_nested_str_weak(PAI_Cert_FFF1), - /* K32 */ be_nested_str_weak(CD_FFF1_8000), - /* K33 */ be_nested_str_weak(B1), - /* K34 */ be_nested_str_weak(U4), - /* K35 */ be_nested_str_weak(tasmota), - /* K36 */ be_nested_str_weak(rtc_utc), - /* K37 */ be_nested_str_weak(tlv2raw), - /* K38 */ be_nested_str_weak(get_ac), - /* K39 */ be_nested_str_weak(EC_P256), - /* K40 */ be_nested_str_weak(ecdsa_sign_sha256), - /* K41 */ be_nested_str_weak(DAC_Priv_FFF1_8000), - /* K42 */ be_nested_str_weak(gen_CSR), - /* K43 */ be_nested_str_weak(set_temp_ca), - /* K44 */ be_nested_str_weak(SUCCESS), - /* K45 */ be_nested_str_weak(log), - /* K46 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), - /* K47 */ be_nested_str_weak(get_temp_ca), - /* K48 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), - /* K49 */ be_nested_str_weak(sessions), - /* K50 */ be_nested_str_weak(create_fabric), - /* K51 */ be_nested_str_weak(set_ca), - /* K52 */ be_nested_str_weak(set_noc_icac), - /* K53 */ be_nested_str_weak(set_ipk_epoch_key), - /* K54 */ be_nested_str_weak(set_admin_subject_vendor), - /* K55 */ be_nested_str_weak(set_pk), - /* K56 */ be_nested_str_weak(get_pk), - /* K57 */ be_nested_str_weak(parse), - /* K58 */ be_nested_str_weak(findsub), - /* K59 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), - /* K60 */ be_nested_str_weak(int), - /* K61 */ be_nested_str_weak(int64), - /* K62 */ be_nested_str_weak(fromu32), - /* K63 */ be_nested_str_weak(tobytes), - /* K64 */ be_nested_str_weak(get_temp_ca_pub), - /* K65 */ be_const_int(2147483647), - /* K66 */ be_nested_str_weak(fromstring), - /* K67 */ be_nested_str_weak(CompressedFabric), - /* K68 */ be_nested_str_weak(HKDF_SHA256), - /* K69 */ be_nested_str_weak(copy), - /* K70 */ be_nested_str_weak(reverse), - /* K71 */ be_nested_str_weak(derive), - /* K72 */ be_nested_str_weak(commissioning_admin_fabric), - /* K73 */ be_nested_str_weak(set_fabric_device), - /* K74 */ be_nested_str_weak(fabric_candidate), - /* K75 */ be_nested_str_weak(start_operational_discovery_deferred), - /* K76 */ be_nested_str_weak(is_PASE), - /* K77 */ be_nested_str_weak(set_expire_in_seconds), - /* K78 */ be_nested_str_weak(log_new_fabric), - /* K79 */ be_nested_str_weak(set_fabric_label), - /* K80 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), - /* K81 */ be_nested_str_weak(get_fabric_id), - /* K82 */ be_nested_str_weak(tohex), - /* K83 */ be_nested_str_weak(fabric_index_X3A), - /* K84 */ be_nested_str_weak(active_fabrics), - /* K85 */ be_nested_str_weak(get_fabric_index), - /* K86 */ be_nested_str_weak(set_timer), - /* K87 */ be_nested_str_weak(stop_iteration), - /* K88 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), - /* K89 */ be_nested_str_weak(_X29_X20not_X20found), - /* K90 */ be_nested_str_weak(INVALID_ACTION), - /* K91 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), - /* K92 */ be_nested_str_weak(INVALID_DATA_TYPE), - /* K93 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), - /* K94 */ be_nested_str_weak(CONSTRAINT_ERROR), - /* K95 */ be_nested_str_weak(start_basic_commissioning), - /* K96 */ be_nested_str_weak(get_fabric), - /* K97 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), - /* K98 */ be_nested_str_weak(start_root_basic_commissioning), - /* K99 */ be_nested_str_weak(stop_basic_commissioning), - /* K100 */ be_nested_str_weak(invoke_request), + /* K17 */ be_nested_str_weak(ack_request), + /* K18 */ be_nested_str_weak(_fabric), + /* K19 */ be_nested_str_weak(fabric_completed), + /* K20 */ be_nested_str_weak(set_no_expiration), + /* K21 */ be_nested_str_weak(save), + /* K22 */ be_nested_str_weak(device), + /* K23 */ be_nested_str_weak(start_commissioning_complete_deferred), + /* K24 */ be_nested_str_weak(context_error), + /* K25 */ be_nested_str_weak(CommissioningComplete_X3A_X20no_X20fabric_X20attached), + /* K26 */ be_nested_str_weak(status), + /* K27 */ be_nested_str_weak(UNSUPPORTED_COMMAND), + /* K28 */ be_nested_str_weak(B2), + /* K29 */ be_nested_str_weak(DAC_Cert_FFF1_8000), + /* K30 */ be_nested_str_weak(PAI_Cert_FFF1), + /* K31 */ be_nested_str_weak(CD_FFF1_8000), + /* K32 */ be_nested_str_weak(B1), + /* K33 */ be_nested_str_weak(U4), + /* K34 */ be_nested_str_weak(tasmota), + /* K35 */ be_nested_str_weak(rtc_utc), + /* K36 */ be_nested_str_weak(tlv2raw), + /* K37 */ be_nested_str_weak(get_ac), + /* K38 */ be_nested_str_weak(EC_P256), + /* K39 */ be_nested_str_weak(ecdsa_sign_sha256), + /* K40 */ be_nested_str_weak(DAC_Priv_FFF1_8000), + /* K41 */ be_nested_str_weak(gen_CSR), + /* K42 */ be_nested_str_weak(set_temp_ca), + /* K43 */ be_nested_str_weak(SUCCESS), + /* K44 */ be_nested_str_weak(log), + /* K45 */ be_nested_str_weak(MTR_X3A_X20AddNoc_X20Args_X3D), + /* K46 */ be_nested_str_weak(get_temp_ca), + /* K47 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20AdNOC_X20without_X20CA), + /* K48 */ be_nested_str_weak(sessions), + /* K49 */ be_nested_str_weak(create_fabric), + /* K50 */ be_nested_str_weak(set_ca), + /* K51 */ be_nested_str_weak(set_noc_icac), + /* K52 */ be_nested_str_weak(set_ipk_epoch_key), + /* K53 */ be_nested_str_weak(set_admin_subject_vendor), + /* K54 */ be_nested_str_weak(set_pk), + /* K55 */ be_nested_str_weak(get_pk), + /* K56 */ be_nested_str_weak(parse), + /* K57 */ be_nested_str_weak(findsub), + /* K58 */ be_nested_str_weak(MTR_X3A_X20Error_X3A_X20no_X20fabricid_X20nor_X20deviceid_X20in_X20NOC_X20certificate), + /* K59 */ be_nested_str_weak(int), + /* K60 */ be_nested_str_weak(int64), + /* K61 */ be_nested_str_weak(fromu32), + /* K62 */ be_nested_str_weak(tobytes), + /* K63 */ be_nested_str_weak(get_temp_ca_pub), + /* K64 */ be_const_int(2147483647), + /* K65 */ be_nested_str_weak(fromstring), + /* K66 */ be_nested_str_weak(CompressedFabric), + /* K67 */ be_nested_str_weak(HKDF_SHA256), + /* K68 */ be_nested_str_weak(copy), + /* K69 */ be_nested_str_weak(reverse), + /* K70 */ be_nested_str_weak(derive), + /* K71 */ be_nested_str_weak(commissioning_admin_fabric), + /* K72 */ be_nested_str_weak(set_fabric_device), + /* K73 */ be_nested_str_weak(fabric_candidate), + /* K74 */ be_nested_str_weak(start_operational_discovery_deferred), + /* K75 */ be_nested_str_weak(is_PASE), + /* K76 */ be_nested_str_weak(set_expire_in_seconds), + /* K77 */ be_nested_str_weak(log_new_fabric), + /* K78 */ be_nested_str_weak(set_fabric_label), + /* K79 */ be_nested_str_weak(MTR_X3A_X20_X2E_X20_X20_X20_X20_X20_X20_X20_X20_X20_X20Update_X20fabric_X20_X27_X25s_X27_X20label_X3D_X27_X25s_X27), + /* K80 */ be_nested_str_weak(get_fabric_id), + /* K81 */ be_nested_str_weak(tohex), + /* K82 */ be_nested_str_weak(fabric_index_X3A), + /* K83 */ be_nested_str_weak(active_fabrics), + /* K84 */ be_nested_str_weak(get_fabric_index), + /* K85 */ be_nested_str_weak(set_timer), + /* K86 */ be_nested_str_weak(stop_iteration), + /* K87 */ be_nested_str_weak(MTR_X3A_X20RemoveFabric_X20fabric_X28), + /* K88 */ be_nested_str_weak(_X29_X20not_X20found), + /* K89 */ be_nested_str_weak(INVALID_ACTION), + /* K90 */ be_nested_str_weak(MTR_X3A_X20OpenCommissioningWindow_X28timeout_X3D_X25i_X2C_X20passcode_X3D_X25s_X2C_X20discriminator_X3D_X25i_X2C_X20iterations_X3D_X25i_X2C_X20salt_X3D_X25s_X29), + /* K91 */ be_nested_str_weak(INVALID_DATA_TYPE), + /* K92 */ be_nested_str_weak(MTR_X3A_X20wrong_X20size_X20for_X20PAKE_X20parameters), + /* K93 */ be_nested_str_weak(CONSTRAINT_ERROR), + /* K94 */ be_nested_str_weak(start_basic_commissioning), + /* K95 */ be_nested_str_weak(get_fabric), + /* K96 */ be_nested_str_weak(MTR_X3A_X20OpenBasicCommissioningWindow_X20commissioning_timeout_X3D), + /* K97 */ be_nested_str_weak(start_root_basic_commissioning), + /* K98 */ be_nested_str_weak(stop_basic_commissioning), + /* K99 */ be_nested_str_weak(invoke_request), }), be_str_weak(invoke_request), &be_const_str_solidified, @@ -220,17 +219,17 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x1C200E08, // 0040 EQ R8 R7 R8 0x78220021, // 0041 JMPF R8 #0064 0x8C200111, // 0042 GETMET R8 R0 K17 - 0x88280712, // 0043 GETMBR R10 R3 K18 + 0x5C280600, // 0043 MOVE R10 R3 0x7C200400, // 0044 CALL R8 2 - 0x88200313, // 0045 GETMBR R8 R1 K19 + 0x88200312, // 0045 GETMBR R8 R1 K18 0x7822001B, // 0046 JMPF R8 #0063 0x90061105, // 0047 SETMBR R1 K8 K5 - 0x88200313, // 0048 GETMBR R8 R1 K19 - 0x8C201114, // 0049 GETMET R8 R8 K20 + 0x88200312, // 0048 GETMBR R8 R1 K18 + 0x8C201113, // 0049 GETMET R8 R8 K19 0x7C200200, // 004A CALL R8 1 - 0x8C200315, // 004B GETMET R8 R1 K21 + 0x8C200314, // 004B GETMET R8 R1 K20 0x7C200200, // 004C CALL R8 1 - 0x8C200316, // 004D GETMET R8 R1 K22 + 0x8C200315, // 004D GETMET R8 R1 K21 0x7C200200, // 004E CALL R8 1 0x8C200B09, // 004F GETMET R8 R5 K9 0x7C200200, // 0050 CALL R8 1 @@ -246,13 +245,13 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C240800, // 005A CALL R9 4 0x54260004, // 005B LDINT R9 5 0x900E0809, // 005C SETMBR R3 K4 R9 - 0x88240117, // 005D GETMBR R9 R0 K23 - 0x8C241318, // 005E GETMET R9 R9 K24 + 0x88240116, // 005D GETMBR R9 R0 K22 + 0x8C241317, // 005E GETMET R9 R9 K23 0x5C2C0200, // 005F MOVE R11 R1 0x7C240400, // 0060 CALL R9 2 0x80041000, // 0061 RET 1 R8 0x70020000, // 0062 JMP #0064 - 0xB006331A, // 0063 RAISE 1 K25 K26 + 0xB0063119, // 0063 RAISE 1 K24 K25 0x70020261, // 0064 JMP #02C7 0x5422003D, // 0065 LDINT R8 62 0x1C200C08, // 0066 EQ R8 R6 R8 @@ -267,23 +266,23 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x2024110E, // 006F NE R9 R8 K14 0x78260004, // 0070 JMPF R9 #0076 0xB8260200, // 0071 GETNGBL R9 K1 - 0x8824131C, // 0072 GETMBR R9 R9 K28 - 0x900E3609, // 0073 SETMBR R3 K27 R9 + 0x8824131B, // 0072 GETMBR R9 R9 K27 + 0x900E3409, // 0073 SETMBR R3 K26 R9 0x4C240000, // 0074 LDNIL R9 0x80041200, // 0075 RET 1 R9 0x8C240B09, // 0076 GETMET R9 R5 K9 0x7C240200, // 0077 CALL R9 1 0x8C28130A, // 0078 GETMET R10 R9 K10 0x58300005, // 0079 LDCONST R12 K5 - 0x88340B1D, // 007A GETMBR R13 R5 K29 + 0x88340B1C, // 007A GETMBR R13 R5 K28 0x1C381107, // 007B EQ R14 R8 K7 0x783A0003, // 007C JMPF R14 #0081 0xB83A0200, // 007D GETNGBL R14 K1 - 0x8C381D1E, // 007E GETMET R14 R14 K30 + 0x8C381D1D, // 007E GETMET R14 R14 K29 0x7C380200, // 007F CALL R14 1 0x70020002, // 0080 JMP #0084 0xB83A0200, // 0081 GETNGBL R14 K1 - 0x8C381D1F, // 0082 GETMET R14 R14 K31 + 0x8C381D1E, // 0082 GETMET R14 R14 K30 0x7C380200, // 0083 CALL R14 1 0x7C280800, // 0084 CALL R10 4 0x900E0910, // 0085 SETMBR R3 K4 K16 @@ -307,33 +306,33 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C240200, // 0097 CALL R9 1 0x8C28130A, // 0098 GETMET R10 R9 K10 0x58300007, // 0099 LDCONST R12 K7 - 0x88340B1D, // 009A GETMBR R13 R5 K29 + 0x88340B1C, // 009A GETMBR R13 R5 K28 0xB83A0200, // 009B GETNGBL R14 K1 - 0x8C381D20, // 009C GETMET R14 R14 K32 + 0x8C381D1F, // 009C GETMET R14 R14 K31 0x7C380200, // 009D CALL R14 1 0x7C280800, // 009E CALL R10 4 0x8C28130A, // 009F GETMET R10 R9 K10 0x5830000E, // 00A0 LDCONST R12 K14 - 0x88340B21, // 00A1 GETMBR R13 R5 K33 + 0x88340B20, // 00A1 GETMBR R13 R5 K32 0x5C381000, // 00A2 MOVE R14 R8 0x7C280800, // 00A3 CALL R10 4 0x8C28130A, // 00A4 GETMET R10 R9 K10 0x58300010, // 00A5 LDCONST R12 K16 - 0x88340B22, // 00A6 GETMBR R13 R5 K34 - 0xB83A4600, // 00A7 GETNGBL R14 K35 - 0x8C381D24, // 00A8 GETMET R14 R14 K36 + 0x88340B21, // 00A6 GETMBR R13 R5 K33 + 0xB83A4400, // 00A7 GETNGBL R14 K34 + 0x8C381D23, // 00A8 GETMET R14 R14 K35 0x7C380200, // 00A9 CALL R14 1 0x7C280800, // 00AA CALL R10 4 - 0x8C281325, // 00AB GETMET R10 R9 K37 + 0x8C281324, // 00AB GETMET R10 R9 K36 0x7C280200, // 00AC CALL R10 1 - 0x8C2C0326, // 00AD GETMET R11 R1 K38 + 0x8C2C0325, // 00AD GETMET R11 R1 K37 0x7C2C0200, // 00AE CALL R11 1 0x0030140B, // 00AF ADD R12 R10 R11 - 0x8C340927, // 00B0 GETMET R13 R4 K39 + 0x8C340926, // 00B0 GETMET R13 R4 K38 0x7C340200, // 00B1 CALL R13 1 - 0x8C341B28, // 00B2 GETMET R13 R13 K40 + 0x8C341B27, // 00B2 GETMET R13 R13 K39 0xB83E0200, // 00B3 GETNGBL R15 K1 - 0x8C3C1F29, // 00B4 GETMET R15 R15 K41 + 0x8C3C1F28, // 00B4 GETMET R15 R15 K40 0x7C3C0200, // 00B5 CALL R15 1 0x5C401800, // 00B6 MOVE R16 R12 0x7C340600, // 00B7 CALL R13 3 @@ -341,12 +340,12 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C380200, // 00B9 CALL R14 1 0x8C3C1D0A, // 00BA GETMET R15 R14 K10 0x58440005, // 00BB LDCONST R17 K5 - 0x88480B1D, // 00BC GETMBR R18 R5 K29 + 0x88480B1C, // 00BC GETMBR R18 R5 K28 0x5C4C1400, // 00BD MOVE R19 R10 0x7C3C0800, // 00BE CALL R15 4 0x8C3C1D0A, // 00BF GETMET R15 R14 K10 0x58440007, // 00C0 LDCONST R17 K7 - 0x88480B21, // 00C1 GETMBR R18 R5 K33 + 0x88480B20, // 00C1 GETMBR R18 R5 K32 0x5C4C1A00, // 00C2 MOVE R19 R13 0x7C3C0800, // 00C3 CALL R15 4 0x900E0907, // 00C4 SETMBR R3 K4 K7 @@ -356,7 +355,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x1C200E08, // 00C8 EQ R8 R7 R8 0x7822003C, // 00C9 JMPF R8 #0107 0x8C200111, // 00CA GETMET R8 R0 K17 - 0x88280712, // 00CB GETMBR R10 R3 K18 + 0x5C280600, // 00CB MOVE R10 R3 0x7C200400, // 00CC CALL R8 2 0x8C200506, // 00CD GETMET R8 R2 K6 0x58280005, // 00CE LDCONST R10 K5 @@ -373,30 +372,30 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x582C0007, // 00D9 LDCONST R11 K7 0x50300000, // 00DA LDBOOL R12 0 0 0x7C240600, // 00DB CALL R9 3 - 0x8C28032A, // 00DC GETMET R10 R1 K42 + 0x8C280329, // 00DC GETMET R10 R1 K41 0x7C280200, // 00DD CALL R10 1 0x8C2C0B09, // 00DE GETMET R11 R5 K9 0x7C2C0200, // 00DF CALL R11 1 0x8C30170A, // 00E0 GETMET R12 R11 K10 0x58380007, // 00E1 LDCONST R14 K7 - 0x883C0B1D, // 00E2 GETMBR R15 R5 K29 + 0x883C0B1C, // 00E2 GETMBR R15 R5 K28 0x5C401400, // 00E3 MOVE R16 R10 0x7C300800, // 00E4 CALL R12 4 0x8C30170A, // 00E5 GETMET R12 R11 K10 0x5838000E, // 00E6 LDCONST R14 K14 - 0x883C0B21, // 00E7 GETMBR R15 R5 K33 + 0x883C0B20, // 00E7 GETMBR R15 R5 K32 0x5C401000, // 00E8 MOVE R16 R8 0x7C300800, // 00E9 CALL R12 4 - 0x8C301725, // 00EA GETMET R12 R11 K37 + 0x8C301724, // 00EA GETMET R12 R11 K36 0x7C300200, // 00EB CALL R12 1 - 0x8C340326, // 00EC GETMET R13 R1 K38 + 0x8C340325, // 00EC GETMET R13 R1 K37 0x7C340200, // 00ED CALL R13 1 0x0034180D, // 00EE ADD R13 R12 R13 - 0x8C380927, // 00EF GETMET R14 R4 K39 + 0x8C380926, // 00EF GETMET R14 R4 K38 0x7C380200, // 00F0 CALL R14 1 - 0x8C381D28, // 00F1 GETMET R14 R14 K40 + 0x8C381D27, // 00F1 GETMET R14 R14 K39 0xB8420200, // 00F2 GETNGBL R16 K1 - 0x8C402129, // 00F3 GETMET R16 R16 K41 + 0x8C402128, // 00F3 GETMET R16 R16 K40 0x7C400200, // 00F4 CALL R16 1 0x5C441A00, // 00F5 MOVE R17 R13 0x7C380600, // 00F6 CALL R14 3 @@ -404,12 +403,12 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x7C3C0200, // 00F8 CALL R15 1 0x8C401F0A, // 00F9 GETMET R16 R15 K10 0x58480005, // 00FA LDCONST R18 K5 - 0x884C0B1D, // 00FB GETMBR R19 R5 K29 + 0x884C0B1C, // 00FB GETMBR R19 R5 K28 0x5C501800, // 00FC MOVE R20 R12 0x7C400800, // 00FD CALL R16 4 0x8C401F0A, // 00FE GETMET R16 R15 K10 0x58480007, // 00FF LDCONST R18 K7 - 0x884C0B21, // 0100 GETMBR R19 R5 K33 + 0x884C0B20, // 0100 GETMBR R19 R5 K32 0x5C501C00, // 0101 MOVE R20 R14 0x7C400800, // 0102 CALL R16 4 0x54420004, // 0103 LDINT R16 5 @@ -422,24 +421,24 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C200506, // 010A GETMET R8 R2 K6 0x58280005, // 010B LDCONST R10 K5 0x7C200400, // 010C CALL R8 2 - 0x8C24032B, // 010D GETMET R9 R1 K43 + 0x8C24032A, // 010D GETMET R9 R1 K42 0x5C2C1000, // 010E MOVE R11 R8 0x7C240400, // 010F CALL R9 2 0xB8260200, // 0110 GETNGBL R9 K1 - 0x8824132C, // 0111 GETMBR R9 R9 K44 - 0x900E3609, // 0112 SETMBR R3 K27 R9 + 0x8824132B, // 0111 GETMBR R9 R9 K43 + 0x900E3409, // 0112 SETMBR R3 K26 R9 0x4C240000, // 0113 LDNIL R9 0x80041200, // 0114 RET 1 R9 0x70020113, // 0115 JMP #022A 0x54220005, // 0116 LDINT R8 6 0x1C200E08, // 0117 EQ R8 R7 R8 0x782200B9, // 0118 JMPF R8 #01D3 - 0xB8224600, // 0119 GETNGBL R8 K35 - 0x8C20112D, // 011A GETMET R8 R8 K45 + 0xB8224400, // 0119 GETNGBL R8 K34 + 0x8C20112C, // 011A GETMET R8 R8 K44 0x60280008, // 011B GETGBL R10 G8 0x5C2C0400, // 011C MOVE R11 R2 0x7C280200, // 011D CALL R10 1 - 0x002A5C0A, // 011E ADD R10 K46 R10 + 0x002A5A0A, // 011E ADD R10 K45 R10 0x542E0003, // 011F LDINT R11 4 0x7C200600, // 0120 CALL R8 3 0x8C200506, // 0121 GETMET R8 R2 K6 @@ -463,47 +462,47 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C300506, // 0133 GETMET R12 R2 K6 0x543A0003, // 0134 LDINT R14 4 0x7C300400, // 0135 CALL R12 2 - 0x8C34032F, // 0136 GETMET R13 R1 K47 + 0x8C34032E, // 0136 GETMET R13 R1 K46 0x7C340200, // 0137 CALL R13 1 0x4C380000, // 0138 LDNIL R14 0x1C341A0E, // 0139 EQ R13 R13 R14 0x78360006, // 013A JMPF R13 #0142 - 0xB8364600, // 013B GETNGBL R13 K35 - 0x8C341B2D, // 013C GETMET R13 R13 K45 - 0x583C0030, // 013D LDCONST R15 K48 + 0xB8364400, // 013B GETNGBL R13 K34 + 0x8C341B2C, // 013C GETMET R13 R13 K44 + 0x583C002F, // 013D LDCONST R15 K47 0x5840000E, // 013E LDCONST R16 K14 0x7C340600, // 013F CALL R13 3 0x4C340000, // 0140 LDNIL R13 0x80041A00, // 0141 RET 1 R13 - 0x88340117, // 0142 GETMBR R13 R0 K23 - 0x88341B31, // 0143 GETMBR R13 R13 K49 - 0x8C341B32, // 0144 GETMET R13 R13 K50 + 0x88340116, // 0142 GETMBR R13 R0 K22 + 0x88341B30, // 0143 GETMBR R13 R13 K48 + 0x8C341B31, // 0144 GETMET R13 R13 K49 0x7C340200, // 0145 CALL R13 1 - 0x8C381B33, // 0146 GETMET R14 R13 K51 - 0x8C40032F, // 0147 GETMET R16 R1 K47 + 0x8C381B32, // 0146 GETMET R14 R13 K50 + 0x8C40032E, // 0147 GETMET R16 R1 K46 0x7C400200, // 0148 CALL R16 1 0x7C380400, // 0149 CALL R14 2 - 0x8C381B34, // 014A GETMET R14 R13 K52 + 0x8C381B33, // 014A GETMET R14 R13 K51 0x5C401000, // 014B MOVE R16 R8 0x5C441200, // 014C MOVE R17 R9 0x7C380600, // 014D CALL R14 3 - 0x8C381B35, // 014E GETMET R14 R13 K53 + 0x8C381B34, // 014E GETMET R14 R13 K52 0x5C401400, // 014F MOVE R16 R10 0x7C380400, // 0150 CALL R14 2 - 0x8C381B36, // 0151 GETMET R14 R13 K54 + 0x8C381B35, // 0151 GETMET R14 R13 K53 0x5C401600, // 0152 MOVE R16 R11 0x5C441800, // 0153 MOVE R17 R12 0x7C380600, // 0154 CALL R14 3 - 0x8C381B37, // 0155 GETMET R14 R13 K55 - 0x8C400338, // 0156 GETMET R16 R1 K56 + 0x8C381B36, // 0155 GETMET R14 R13 K54 + 0x8C400337, // 0156 GETMET R16 R1 K55 0x7C400200, // 0157 CALL R16 1 0x7C380400, // 0158 CALL R14 2 0xB83A0200, // 0159 GETNGBL R14 K1 0x88381D02, // 015A GETMBR R14 R14 K2 - 0x8C381D39, // 015B GETMET R14 R14 K57 + 0x8C381D38, // 015B GETMET R14 R14 K56 0x5C401000, // 015C MOVE R16 R8 0x7C380400, // 015D CALL R14 2 - 0x8C3C1D3A, // 015E GETMET R15 R14 K58 + 0x8C3C1D39, // 015E GETMET R15 R14 K57 0x54460005, // 015F LDINT R17 6 0x7C3C0400, // 0160 CALL R15 2 0x8C401F06, // 0161 GETMET R16 R15 K6 @@ -516,9 +515,9 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x784A0001, // 0168 JMPF R18 #016B 0x5C482200, // 0169 MOVE R18 R17 0x744A0006, // 016A JMPT R18 #0172 - 0xB84A4600, // 016B GETNGBL R18 K35 - 0x8C48252D, // 016C GETMET R18 R18 K45 - 0x5850003B, // 016D LDCONST R20 K59 + 0xB84A4400, // 016B GETNGBL R18 K34 + 0x8C48252C, // 016C GETMET R18 R18 K44 + 0x5850003A, // 016D LDCONST R20 K58 0x5854000E, // 016E LDCONST R21 K14 0x7C480600, // 016F CALL R18 3 0x50480000, // 0170 LDBOOL R18 0 0 @@ -526,82 +525,82 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x60480004, // 0172 GETGBL R18 G4 0x5C4C2000, // 0173 MOVE R19 R16 0x7C480200, // 0174 CALL R18 1 - 0x1C48253C, // 0175 EQ R18 R18 K60 + 0x1C48253B, // 0175 EQ R18 R18 K59 0x784A0007, // 0176 JMPF R18 #017F - 0xB84A7A00, // 0177 GETNGBL R18 K61 - 0x8C48253E, // 0178 GETMET R18 R18 K62 + 0xB84A7800, // 0177 GETNGBL R18 K60 + 0x8C48253D, // 0178 GETMET R18 R18 K61 0x5C502000, // 0179 MOVE R20 R16 0x7C480400, // 017A CALL R18 2 - 0x8C48253F, // 017B GETMET R18 R18 K63 + 0x8C48253E, // 017B GETMET R18 R18 K62 0x7C480200, // 017C CALL R18 1 0x5C402400, // 017D MOVE R16 R18 0x70020002, // 017E JMP #0182 - 0x8C48213F, // 017F GETMET R18 R16 K63 + 0x8C48213E, // 017F GETMET R18 R16 K62 0x7C480200, // 0180 CALL R18 1 0x5C402400, // 0181 MOVE R16 R18 0x60480004, // 0182 GETGBL R18 G4 0x5C4C2200, // 0183 MOVE R19 R17 0x7C480200, // 0184 CALL R18 1 - 0x1C48253C, // 0185 EQ R18 R18 K60 + 0x1C48253B, // 0185 EQ R18 R18 K59 0x784A0007, // 0186 JMPF R18 #018F - 0xB84A7A00, // 0187 GETNGBL R18 K61 - 0x8C48253E, // 0188 GETMET R18 R18 K62 + 0xB84A7800, // 0187 GETNGBL R18 K60 + 0x8C48253D, // 0188 GETMET R18 R18 K61 0x5C502200, // 0189 MOVE R20 R17 0x7C480400, // 018A CALL R18 2 - 0x8C48253F, // 018B GETMET R18 R18 K63 + 0x8C48253E, // 018B GETMET R18 R18 K62 0x7C480200, // 018C CALL R18 1 0x5C442400, // 018D MOVE R17 R18 0x70020002, // 018E JMP #0192 - 0x8C48233F, // 018F GETMET R18 R17 K63 + 0x8C48233E, // 018F GETMET R18 R17 K62 0x7C480200, // 0190 CALL R18 1 0x5C442400, // 0191 MOVE R17 R18 - 0x8C480340, // 0192 GETMET R18 R1 K64 + 0x8C48033F, // 0192 GETMET R18 R1 K63 0x7C480200, // 0193 CALL R18 1 - 0x404E0F41, // 0194 CONNECT R19 K7 K65 + 0x404E0F40, // 0194 CONNECT R19 K7 K64 0x94482413, // 0195 GETIDX R18 R18 R19 0x60500015, // 0196 GETGBL R20 G21 0x7C500000, // 0197 CALL R20 0 - 0x8C502942, // 0198 GETMET R20 R20 K66 - 0x58580043, // 0199 LDCONST R22 K67 + 0x8C502941, // 0198 GETMET R20 R20 K65 + 0x58580042, // 0199 LDCONST R22 K66 0x7C500400, // 019A CALL R20 2 0x5C4C2800, // 019B MOVE R19 R20 - 0x8C500944, // 019C GETMET R20 R4 K68 + 0x8C500943, // 019C GETMET R20 R4 K67 0x7C500200, // 019D CALL R20 1 - 0x8C542145, // 019E GETMET R21 R16 K69 + 0x8C542144, // 019E GETMET R21 R16 K68 0x7C540200, // 019F CALL R21 1 - 0x8C542B46, // 01A0 GETMET R21 R21 K70 + 0x8C542B45, // 01A0 GETMET R21 R21 K69 0x7C540200, // 01A1 CALL R21 1 - 0x8C582947, // 01A2 GETMET R22 R20 K71 + 0x8C582946, // 01A2 GETMET R22 R20 K70 0x5C602400, // 01A3 MOVE R24 R18 0x5C642A00, // 01A4 MOVE R25 R21 0x5C682600, // 01A5 MOVE R26 R19 0x546E0007, // 01A6 LDINT R27 8 0x7C580A00, // 01A7 CALL R22 5 - 0x885C0313, // 01A8 GETMBR R23 R1 K19 + 0x885C0312, // 01A8 GETMBR R23 R1 K18 0x785E0001, // 01A9 JMPF R23 #01AC - 0x885C0313, // 01AA GETMBR R23 R1 K19 + 0x885C0312, // 01AA GETMBR R23 R1 K18 0x70020001, // 01AB JMP #01AE - 0x885C0117, // 01AC GETMBR R23 R0 K23 - 0x885C2F48, // 01AD GETMBR R23 R23 K72 - 0x8C601B49, // 01AE GETMET R24 R13 K73 + 0x885C0116, // 01AC GETMBR R23 R0 K22 + 0x885C2F47, // 01AD GETMBR R23 R23 K71 + 0x8C601B48, // 01AE GETMET R24 R13 K72 0x5C682000, // 01AF MOVE R26 R16 0x5C6C2200, // 01B0 MOVE R27 R17 0x5C702C00, // 01B1 MOVE R28 R22 0x5C742E00, // 01B2 MOVE R29 R23 0x7C600A00, // 01B3 CALL R24 5 - 0x8C601B4A, // 01B4 GETMET R24 R13 K74 + 0x8C601B49, // 01B4 GETMET R24 R13 K73 0x7C600200, // 01B5 CALL R24 1 - 0x88600117, // 01B6 GETMBR R24 R0 K23 - 0x8C60314B, // 01B7 GETMET R24 R24 K75 + 0x88600116, // 01B6 GETMBR R24 R0 K22 + 0x8C60314A, // 01B7 GETMET R24 R24 K74 0x5C681A00, // 01B8 MOVE R26 R13 0x7C600400, // 01B9 CALL R24 2 - 0x8C60034C, // 01BA GETMET R24 R1 K76 + 0x8C60034B, // 01BA GETMET R24 R1 K75 0x7C600200, // 01BB CALL R24 1 0x78620002, // 01BC JMPF R24 #01C0 - 0x8C60034D, // 01BD GETMET R24 R1 K77 + 0x8C60034C, // 01BD GETMET R24 R1 K76 0x546A003B, // 01BE LDINT R26 60 0x7C600400, // 01BF CALL R24 2 - 0x8C601B4E, // 01C0 GETMET R24 R13 K78 + 0x8C601B4D, // 01C0 GETMET R24 R13 K77 0x7C600200, // 01C1 CALL R24 1 0x8C600B09, // 01C2 GETMET R24 R5 K9 0x7C600200, // 01C3 CALL R24 1 @@ -609,7 +608,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x586C0005, // 01C5 LDCONST R27 K5 0x88700B0B, // 01C6 GETMBR R28 R5 K11 0xB8760200, // 01C7 GETNGBL R29 K1 - 0x88743B2C, // 01C8 GETMBR R29 R29 K44 + 0x88743B2B, // 01C8 GETMBR R29 R29 K43 0x7C640800, // 01C9 CALL R25 4 0x8C64310A, // 01CA GETMET R25 R24 K10 0x586C0007, // 01CB LDCONST R27 K7 @@ -626,21 +625,21 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C200506, // 01D6 GETMET R8 R2 K6 0x58280005, // 01D7 LDCONST R10 K5 0x7C200400, // 01D8 CALL R8 2 - 0x8C24034F, // 01D9 GETMET R9 R1 K79 + 0x8C24034E, // 01D9 GETMET R9 R1 K78 0x5C2C1000, // 01DA MOVE R11 R8 0x7C240400, // 01DB CALL R9 2 - 0xB8264600, // 01DC GETNGBL R9 K35 - 0x8C24132D, // 01DD GETMET R9 R9 K45 + 0xB8264400, // 01DC GETNGBL R9 K34 + 0x8C24132C, // 01DD GETMET R9 R9 K44 0x602C0018, // 01DE GETGBL R11 G24 - 0x58300050, // 01DF LDCONST R12 K80 - 0x88340313, // 01E0 GETMBR R13 R1 K19 - 0x8C341B51, // 01E1 GETMET R13 R13 K81 + 0x5830004F, // 01DF LDCONST R12 K79 + 0x88340312, // 01E0 GETMBR R13 R1 K18 + 0x8C341B50, // 01E1 GETMET R13 R13 K80 0x7C340200, // 01E2 CALL R13 1 - 0x8C341B45, // 01E3 GETMET R13 R13 K69 + 0x8C341B44, // 01E3 GETMET R13 R13 K68 0x7C340200, // 01E4 CALL R13 1 - 0x8C341B46, // 01E5 GETMET R13 R13 K70 + 0x8C341B45, // 01E5 GETMET R13 R13 K69 0x7C340200, // 01E6 CALL R13 1 - 0x8C341B52, // 01E7 GETMET R13 R13 K82 + 0x8C341B51, // 01E7 GETMET R13 R13 K81 0x7C340200, // 01E8 CALL R13 1 0x60380008, // 01E9 GETGBL R14 G8 0x5C3C1000, // 01EA MOVE R15 R8 @@ -649,8 +648,8 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x58300010, // 01ED LDCONST R12 K16 0x7C240600, // 01EE CALL R9 3 0xB8260200, // 01EF GETNGBL R9 K1 - 0x8824132C, // 01F0 GETMBR R9 R9 K44 - 0x900E3609, // 01F1 SETMBR R3 K27 R9 + 0x8824132B, // 01F0 GETMBR R9 R9 K43 + 0x900E3409, // 01F1 SETMBR R3 K26 R9 0x4C240000, // 01F2 LDNIL R9 0x80041200, // 01F3 RET 1 R9 0x70020034, // 01F4 JMP #022A @@ -663,23 +662,23 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x60240008, // 01FB GETGBL R9 G8 0x5C281000, // 01FC MOVE R10 R8 0x7C240200, // 01FD CALL R9 1 - 0x0026A609, // 01FE ADD R9 K83 R9 - 0x900E5A09, // 01FF SETMBR R3 K45 R9 + 0x0026A409, // 01FE ADD R9 K82 R9 + 0x900E5809, // 01FF SETMBR R3 K44 R9 0x60240010, // 0200 GETGBL R9 G16 - 0x88280117, // 0201 GETMBR R10 R0 K23 - 0x88281531, // 0202 GETMBR R10 R10 K49 - 0x8C281554, // 0203 GETMET R10 R10 K84 + 0x88280116, // 0201 GETMBR R10 R0 K22 + 0x88281530, // 0202 GETMBR R10 R10 K48 + 0x8C281553, // 0203 GETMET R10 R10 K83 0x7C280200, // 0204 CALL R10 1 0x7C240200, // 0205 CALL R9 1 0xA8020010, // 0206 EXBLK 0 #0218 0x5C281200, // 0207 MOVE R10 R9 0x7C280000, // 0208 CALL R10 0 - 0x8C2C1555, // 0209 GETMET R11 R10 K85 + 0x8C2C1554, // 0209 GETMET R11 R10 K84 0x7C2C0200, // 020A CALL R11 1 0x1C2C1608, // 020B EQ R11 R11 R8 0x782E0008, // 020C JMPF R11 #0216 - 0xB82E4600, // 020D GETNGBL R11 K35 - 0x8C2C1756, // 020E GETMET R11 R11 K86 + 0xB82E4400, // 020D GETNGBL R11 K34 + 0x8C2C1755, // 020E GETMET R11 R11 K85 0x543607CF, // 020F LDINT R13 2000 0x84380000, // 0210 CLOSURE R14 P0 0x7C2C0600, // 0211 CALL R11 3 @@ -689,21 +688,21 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x80041600, // 0215 RET 1 R11 0xA0240000, // 0216 CLOSE R9 0x7001FFEE, // 0217 JMP #0207 - 0x58240057, // 0218 LDCONST R9 K87 + 0x58240056, // 0218 LDCONST R9 K86 0xAC240200, // 0219 CATCH R9 1 0 0xB0080000, // 021A RAISE 2 R0 R0 - 0xB8264600, // 021B GETNGBL R9 K35 - 0x8C24132D, // 021C GETMET R9 R9 K45 + 0xB8264400, // 021B GETNGBL R9 K34 + 0x8C24132C, // 021C GETMET R9 R9 K44 0x602C0008, // 021D GETGBL R11 G8 0x5C301000, // 021E MOVE R12 R8 0x7C2C0200, // 021F CALL R11 1 - 0x002EB00B, // 0220 ADD R11 K88 R11 - 0x002C1759, // 0221 ADD R11 R11 K89 + 0x002EAE0B, // 0220 ADD R11 K87 R11 + 0x002C1758, // 0221 ADD R11 R11 K88 0x5830000E, // 0222 LDCONST R12 K14 0x7C240600, // 0223 CALL R9 3 0xB8260200, // 0224 GETNGBL R9 K1 - 0x8824135A, // 0225 GETMBR R9 R9 K90 - 0x900E3609, // 0226 SETMBR R3 K27 R9 + 0x88241359, // 0225 GETMBR R9 R9 K89 + 0x900E3409, // 0226 SETMBR R3 K26 R9 0x4C240000, // 0227 LDNIL R9 0xA0000000, // 0228 CLOSE R0 0x80041200, // 0229 RET 1 R9 @@ -728,16 +727,16 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C300506, // 023C GETMET R12 R2 K6 0x543A0003, // 023D LDINT R14 4 0x7C300400, // 023E CALL R12 2 - 0xB8364600, // 023F GETNGBL R13 K35 - 0x8C341B2D, // 0240 GETMET R13 R13 K45 + 0xB8364400, // 023F GETNGBL R13 K34 + 0x8C341B2C, // 0240 GETMET R13 R13 K44 0x603C0018, // 0241 GETGBL R15 G24 - 0x5840005B, // 0242 LDCONST R16 K91 + 0x5840005A, // 0242 LDCONST R16 K90 0x5C441000, // 0243 MOVE R17 R8 - 0x8C481352, // 0244 GETMET R18 R9 K82 + 0x8C481351, // 0244 GETMET R18 R9 K81 0x7C480200, // 0245 CALL R18 1 0x5C4C1400, // 0246 MOVE R19 R10 0x5C501600, // 0247 MOVE R20 R11 - 0x8C541952, // 0248 GETMET R21 R12 K82 + 0x8C541951, // 0248 GETMET R21 R12 K81 0x7C540200, // 0249 CALL R21 1 0x7C3C0C00, // 024A CALL R15 6 0x54420003, // 024B LDINT R16 4 @@ -758,8 +757,8 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x1C34180D, // 025A EQ R13 R12 R13 0x78360005, // 025B JMPF R13 #0262 0xB8360200, // 025C GETNGBL R13 K1 - 0x88341B5C, // 025D GETMBR R13 R13 K92 - 0x900E360D, // 025E SETMBR R3 K27 R13 + 0x88341B5B, // 025D GETMBR R13 R13 K91 + 0x900E340D, // 025E SETMBR R3 K26 R13 0x4C340000, // 025F LDNIL R13 0xA0000000, // 0260 CLOSE R0 0x80041A00, // 0261 RET 1 R13 @@ -783,14 +782,14 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x543A001F, // 0273 LDINT R14 32 0x24341A0E, // 0274 GT R13 R13 R14 0x7836000A, // 0275 JMPF R13 #0281 - 0xB8364600, // 0276 GETNGBL R13 K35 - 0x8C341B2D, // 0277 GETMET R13 R13 K45 - 0x583C005D, // 0278 LDCONST R15 K93 + 0xB8364400, // 0276 GETNGBL R13 K34 + 0x8C341B2C, // 0277 GETMET R13 R13 K44 + 0x583C005C, // 0278 LDCONST R15 K92 0x5840000E, // 0279 LDCONST R16 K14 0x7C340600, // 027A CALL R13 3 0xB8360200, // 027B GETNGBL R13 K1 - 0x88341B5E, // 027C GETMBR R13 R13 K94 - 0x900E360D, // 027D SETMBR R3 K27 R13 + 0x88341B5D, // 027C GETMBR R13 R13 K93 + 0x900E340D, // 027D SETMBR R3 K26 R13 0x4C340000, // 027E LDNIL R13 0xA0000000, // 027F CLOSE R0 0x80041A00, // 0280 RET 1 R13 @@ -798,17 +797,17 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x40360A0D, // 0282 CONNECT R13 K5 R13 0x9434120D, // 0283 GETIDX R13 R9 R13 0x543A001F, // 0284 LDINT R14 32 - 0x40381D41, // 0285 CONNECT R14 R14 K65 + 0x40381D40, // 0285 CONNECT R14 R14 K64 0x9438120E, // 0286 GETIDX R14 R9 R14 - 0x883C0117, // 0287 GETMBR R15 R0 K23 - 0x8C3C1F5F, // 0288 GETMET R15 R15 K95 + 0x883C0116, // 0287 GETMBR R15 R0 K22 + 0x8C3C1F5E, // 0288 GETMET R15 R15 K94 0x5C441000, // 0289 MOVE R17 R8 0x5C481600, // 028A MOVE R18 R11 0x5C4C1400, // 028B MOVE R19 R10 0x5C501800, // 028C MOVE R20 R12 0x5C541A00, // 028D MOVE R21 R13 0x5C581C00, // 028E MOVE R22 R14 - 0x8C5C0360, // 028F GETMET R23 R1 K96 + 0x8C5C035F, // 028F GETMET R23 R1 K95 0x7C5C0200, // 0290 CALL R23 1 0x7C3C1000, // 0291 CALL R15 8 0x503C0200, // 0292 LDBOOL R15 1 0 @@ -820,16 +819,16 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x8C200506, // 0298 GETMET R8 R2 K6 0x58280005, // 0299 LDCONST R10 K5 0x7C200400, // 029A CALL R8 2 - 0xB8264600, // 029B GETNGBL R9 K35 - 0x8C24132D, // 029C GETMET R9 R9 K45 + 0xB8264400, // 029B GETNGBL R9 K34 + 0x8C24132C, // 029C GETMET R9 R9 K44 0x602C0008, // 029D GETGBL R11 G8 0x5C301000, // 029E MOVE R12 R8 0x7C2C0200, // 029F CALL R11 1 - 0x002EC20B, // 02A0 ADD R11 K97 R11 + 0x002EC00B, // 02A0 ADD R11 K96 R11 0x58300010, // 02A1 LDCONST R12 K16 0x7C240600, // 02A2 CALL R9 3 - 0x88240117, // 02A3 GETMBR R9 R0 K23 - 0x8C241362, // 02A4 GETMET R9 R9 K98 + 0x88240116, // 02A3 GETMBR R9 R0 K22 + 0x8C241361, // 02A4 GETMET R9 R9 K97 0x5C2C1000, // 02A5 MOVE R11 R8 0x7C240400, // 02A6 CALL R9 2 0x50240200, // 02A7 LDBOOL R9 1 0 @@ -838,8 +837,8 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x70020007, // 02AA JMP #02B3 0x1C200F0E, // 02AB EQ R8 R7 K14 0x78220005, // 02AC JMPF R8 #02B3 - 0x88200117, // 02AD GETMBR R8 R0 K23 - 0x8C201163, // 02AE GETMET R8 R8 K99 + 0x88200116, // 02AD GETMBR R8 R0 K22 + 0x8C201162, // 02AE GETMET R8 R8 K98 0x7C200200, // 02AF CALL R8 1 0x50200200, // 02B0 LDBOOL R8 1 0 0xA0000000, // 02B1 CLOSE R0 @@ -857,7 +856,7 @@ be_local_closure(Matter_Plugin_Root_invoke_request, /* name */ 0x60200003, // 02BD GETGBL R8 G3 0x5C240000, // 02BE MOVE R9 R0 0x7C200200, // 02BF CALL R8 1 - 0x8C201164, // 02C0 GETMET R8 R8 K100 + 0x8C201163, // 02C0 GETMET R8 R8 K99 0x5C280200, // 02C1 MOVE R10 R1 0x5C2C0400, // 02C2 MOVE R11 R2 0x5C300600, // 02C3 MOVE R12 R3 @@ -885,7 +884,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[93]) { /* constants */ + ( &(const bvalue[92]) { /* constants */ /* K0 */ be_nested_str_weak(string), /* K1 */ be_nested_str_weak(matter), /* K2 */ be_nested_str_weak(TLV), @@ -937,48 +936,47 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ /* K48 */ be_const_int(1000000), /* K49 */ be_nested_str_weak(rtc), /* K50 */ be_nested_str_weak(local), - /* K51 */ be_nested_str_weak(send_ack_now), - /* K52 */ be_nested_str_weak(msg), - /* K53 */ be_nested_str_weak(fabric_filtered), - /* K54 */ be_nested_str_weak(get_fabric), - /* K55 */ be_nested_str_weak(device), - /* K56 */ be_nested_str_weak(sessions), - /* K57 */ be_nested_str_weak(active_fabrics), - /* K58 */ be_nested_str_weak(B2), - /* K59 */ be_nested_str_weak(get_noc), - /* K60 */ be_nested_str_weak(get_icac), - /* K61 */ be_nested_str_weak(get_fabric_index), - /* K62 */ be_nested_str_weak(stop_iteration), - /* K63 */ be_nested_str_weak(parse), - /* K64 */ be_nested_str_weak(get_ca), - /* K65 */ be_nested_str_weak(findsubval), - /* K66 */ be_nested_str_weak(get_admin_vendor), - /* K67 */ be_nested_str_weak(get_fabric_id), - /* K68 */ be_nested_str_weak(get_device_id), - /* K69 */ be_nested_str_weak(get_fabric_label), - /* K70 */ be_nested_str_weak(Fabric), - /* K71 */ be_nested_str_weak(_MAX_CASE), - /* K72 */ be_nested_str_weak(count_active_fabrics), - /* K73 */ be_nested_str_weak(_fabric), - /* K74 */ be_nested_str_weak(is_commissioning_open), - /* K75 */ be_nested_str_weak(is_root_commissioning_open), - /* K76 */ be_nested_str_weak(commissioning_admin_fabric), - /* K77 */ be_nested_str_weak(Tasmota), - /* K78 */ be_nested_str_weak(vendorid), - /* K79 */ be_nested_str_weak(DeviceName), - /* K80 */ be_nested_str_weak(FriendlyName), - /* K81 */ be_nested_str_weak(FriendlyName1), - /* K82 */ be_nested_str_weak(XX), - /* K83 */ be_nested_str_weak(Status_X202), - /* K84 */ be_nested_str_weak(StatusFWR), - /* K85 */ be_nested_str_weak(Hardware), - /* K86 */ be_nested_str_weak(Version), - /* K87 */ be_nested_str_weak(_X28), - /* K88 */ be_nested_str_weak(locale), - /* K89 */ be_nested_str_weak(create_TLV), - /* K90 */ be_nested_str_weak(get_active_endpoints), - /* K91 */ be_nested_str_weak(disable_bridge_mode), - /* K92 */ be_nested_str_weak(read_attribute), + /* K51 */ be_nested_str_weak(ack_request), + /* K52 */ be_nested_str_weak(fabric_filtered), + /* K53 */ be_nested_str_weak(get_fabric), + /* K54 */ be_nested_str_weak(device), + /* K55 */ be_nested_str_weak(sessions), + /* K56 */ be_nested_str_weak(active_fabrics), + /* K57 */ be_nested_str_weak(B2), + /* K58 */ be_nested_str_weak(get_noc), + /* K59 */ be_nested_str_weak(get_icac), + /* K60 */ be_nested_str_weak(get_fabric_index), + /* K61 */ be_nested_str_weak(stop_iteration), + /* K62 */ be_nested_str_weak(parse), + /* K63 */ be_nested_str_weak(get_ca), + /* K64 */ be_nested_str_weak(findsubval), + /* K65 */ be_nested_str_weak(get_admin_vendor), + /* K66 */ be_nested_str_weak(get_fabric_id), + /* K67 */ be_nested_str_weak(get_device_id), + /* K68 */ be_nested_str_weak(get_fabric_label), + /* K69 */ be_nested_str_weak(Fabric), + /* K70 */ be_nested_str_weak(_MAX_CASE), + /* K71 */ be_nested_str_weak(count_active_fabrics), + /* K72 */ be_nested_str_weak(_fabric), + /* K73 */ be_nested_str_weak(is_commissioning_open), + /* K74 */ be_nested_str_weak(is_root_commissioning_open), + /* K75 */ be_nested_str_weak(commissioning_admin_fabric), + /* K76 */ be_nested_str_weak(Tasmota), + /* K77 */ be_nested_str_weak(vendorid), + /* K78 */ be_nested_str_weak(DeviceName), + /* K79 */ be_nested_str_weak(FriendlyName), + /* K80 */ be_nested_str_weak(FriendlyName1), + /* K81 */ be_nested_str_weak(XX), + /* K82 */ be_nested_str_weak(Status_X202), + /* K83 */ be_nested_str_weak(StatusFWR), + /* K84 */ be_nested_str_weak(Hardware), + /* K85 */ be_nested_str_weak(Version), + /* K86 */ be_nested_str_weak(_X28), + /* K87 */ be_nested_str_weak(locale), + /* K88 */ be_nested_str_weak(create_TLV), + /* K89 */ be_nested_str_weak(get_active_endpoints), + /* K90 */ be_nested_str_weak(disable_bridge_mode), + /* K91 */ be_nested_str_weak(read_attribute), }), be_str_weak(read_attribute), &be_const_str_solidified, @@ -1323,23 +1321,23 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x1C200C08, // 0151 EQ R8 R6 R8 0x782200AD, // 0152 JMPF R8 #0201 0x8C200133, // 0153 GETMET R8 R0 K51 - 0x88280534, // 0154 GETMBR R10 R2 K52 + 0x5C280400, // 0154 MOVE R10 R2 0x7C200400, // 0155 CALL R8 2 0x1C200F05, // 0156 EQ R8 R7 K5 0x78220032, // 0157 JMPF R8 #018B 0x8C200B11, // 0158 GETMET R8 R5 K17 0x7C200200, // 0159 CALL R8 1 - 0x88240535, // 015A GETMBR R9 R2 K53 + 0x88240534, // 015A GETMBR R9 R2 K52 0x78260005, // 015B JMPF R9 #0162 0x60240012, // 015C GETGBL R9 G18 0x7C240000, // 015D CALL R9 0 - 0x8C280336, // 015E GETMET R10 R1 K54 + 0x8C280335, // 015E GETMET R10 R1 K53 0x7C280200, // 015F CALL R10 1 0x4028120A, // 0160 CONNECT R10 R9 R10 0x70020003, // 0161 JMP #0166 - 0x88240137, // 0162 GETMBR R9 R0 K55 - 0x88241338, // 0163 GETMBR R9 R9 K56 - 0x8C241339, // 0164 GETMET R9 R9 K57 + 0x88240136, // 0162 GETMBR R9 R0 K54 + 0x88241337, // 0163 GETMBR R9 R9 K55 + 0x8C241338, // 0164 GETMET R9 R9 K56 0x7C240200, // 0165 CALL R9 1 0x60280010, // 0166 GETGBL R10 G16 0x5C2C1200, // 0167 MOVE R11 R9 @@ -1356,24 +1354,24 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7C300400, // 0172 CALL R12 2 0x8C34190B, // 0173 GETMET R13 R12 K11 0x583C0009, // 0174 LDCONST R15 K9 - 0x88400B3A, // 0175 GETMBR R16 R5 K58 - 0x8C44173B, // 0176 GETMET R17 R11 K59 + 0x88400B39, // 0175 GETMBR R16 R5 K57 + 0x8C44173A, // 0176 GETMET R17 R11 K58 0x7C440200, // 0177 CALL R17 1 0x7C340800, // 0178 CALL R13 4 0x8C34190B, // 0179 GETMET R13 R12 K11 0x583C000D, // 017A LDCONST R15 K13 - 0x88400B3A, // 017B GETMBR R16 R5 K58 - 0x8C44173C, // 017C GETMET R17 R11 K60 + 0x88400B39, // 017B GETMBR R16 R5 K57 + 0x8C44173B, // 017C GETMET R17 R11 K59 0x7C440200, // 017D CALL R17 1 0x7C340800, // 017E CALL R13 4 0x8C34190B, // 017F GETMET R13 R12 K11 0x543E00FD, // 0180 LDINT R15 254 0x88400B0C, // 0181 GETMBR R16 R5 K12 - 0x8C44173D, // 0182 GETMET R17 R11 K61 + 0x8C44173C, // 0182 GETMET R17 R11 K60 0x7C440200, // 0183 CALL R17 1 0x7C340800, // 0184 CALL R13 4 0x7001FFE3, // 0185 JMP #016A - 0x5828003E, // 0186 LDCONST R10 K62 + 0x5828003D, // 0186 LDCONST R10 K61 0xAC280200, // 0187 CATCH R10 1 0 0xB0080000, // 0188 RAISE 2 R0 R0 0x80041000, // 0189 RET 1 R8 @@ -1382,17 +1380,17 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x78220049, // 018C JMPF R8 #01D7 0x8C200B11, // 018D GETMET R8 R5 K17 0x7C200200, // 018E CALL R8 1 - 0x88240535, // 018F GETMBR R9 R2 K53 + 0x88240534, // 018F GETMBR R9 R2 K52 0x78260005, // 0190 JMPF R9 #0197 0x60240012, // 0191 GETGBL R9 G18 0x7C240000, // 0192 CALL R9 0 - 0x8C280336, // 0193 GETMET R10 R1 K54 + 0x8C280335, // 0193 GETMET R10 R1 K53 0x7C280200, // 0194 CALL R10 1 0x4028120A, // 0195 CONNECT R10 R9 R10 0x70020003, // 0196 JMP #019B - 0x88240137, // 0197 GETMBR R9 R0 K55 - 0x88241338, // 0198 GETMBR R9 R9 K56 - 0x8C241339, // 0199 GETMET R9 R9 K57 + 0x88240136, // 0197 GETMBR R9 R0 K54 + 0x88241337, // 0198 GETMBR R9 R9 K55 + 0x8C241338, // 0199 GETMET R9 R9 K56 0x7C240200, // 019A CALL R9 1 0x60280010, // 019B GETGBL R10 G16 0x5C2C1200, // 019C MOVE R11 R9 @@ -1404,8 +1402,8 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x1C30160C, // 01A2 EQ R12 R11 R12 0x78320000, // 01A3 JMPF R12 #01A5 0x7001FFF9, // 01A4 JMP #019F - 0x8C300B3F, // 01A5 GETMET R12 R5 K63 - 0x8C381740, // 01A6 GETMET R14 R11 K64 + 0x8C300B3E, // 01A5 GETMET R12 R5 K62 + 0x8C38173F, // 01A6 GETMET R14 R11 K63 0x7C380200, // 01A7 CALL R14 1 0x7C300400, // 01A8 CALL R12 2 0x8C341115, // 01A9 GETMET R13 R8 K21 @@ -1413,43 +1411,43 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7C340400, // 01AB CALL R13 2 0x8C381B0B, // 01AC GETMET R14 R13 K11 0x58400009, // 01AD LDCONST R16 K9 - 0x88440B3A, // 01AE GETMBR R17 R5 K58 - 0x8C481941, // 01AF GETMET R18 R12 K65 + 0x88440B39, // 01AE GETMBR R17 R5 K57 + 0x8C481940, // 01AF GETMET R18 R12 K64 0x54520008, // 01B0 LDINT R20 9 0x7C480400, // 01B1 CALL R18 2 0x7C380800, // 01B2 CALL R14 4 0x8C381B0B, // 01B3 GETMET R14 R13 K11 0x5840000D, // 01B4 LDCONST R16 K13 0x88440B0C, // 01B5 GETMBR R17 R5 K12 - 0x8C481742, // 01B6 GETMET R18 R11 K66 + 0x8C481741, // 01B6 GETMET R18 R11 K65 0x7C480200, // 01B7 CALL R18 1 0x7C380800, // 01B8 CALL R14 4 0x8C381B0B, // 01B9 GETMET R14 R13 K11 0x5840000F, // 01BA LDCONST R16 K15 0x88440B07, // 01BB GETMBR R17 R5 K7 - 0x8C481743, // 01BC GETMET R18 R11 K67 + 0x8C481742, // 01BC GETMET R18 R11 K66 0x7C480200, // 01BD CALL R18 1 0x7C380800, // 01BE CALL R14 4 0x8C381B0B, // 01BF GETMET R14 R13 K11 0x54420003, // 01C0 LDINT R16 4 0x88440B07, // 01C1 GETMBR R17 R5 K7 - 0x8C481744, // 01C2 GETMET R18 R11 K68 + 0x8C481743, // 01C2 GETMET R18 R11 K67 0x7C480200, // 01C3 CALL R18 1 0x7C380800, // 01C4 CALL R14 4 0x8C381B0B, // 01C5 GETMET R14 R13 K11 0x54420004, // 01C6 LDINT R16 5 0x88440B16, // 01C7 GETMBR R17 R5 K22 - 0x8C481745, // 01C8 GETMET R18 R11 K69 + 0x8C481744, // 01C8 GETMET R18 R11 K68 0x7C480200, // 01C9 CALL R18 1 0x7C380800, // 01CA CALL R14 4 0x8C381B0B, // 01CB GETMET R14 R13 K11 0x544200FD, // 01CC LDINT R16 254 0x88440B0C, // 01CD GETMBR R17 R5 K12 - 0x8C48173D, // 01CE GETMET R18 R11 K61 + 0x8C48173C, // 01CE GETMET R18 R11 K60 0x7C480200, // 01CF CALL R18 1 0x7C380800, // 01D0 CALL R14 4 0x7001FFCC, // 01D1 JMP #019F - 0x5828003E, // 01D2 LDCONST R10 K62 + 0x5828003D, // 01D2 LDCONST R10 K61 0xAC280200, // 01D3 CATCH R10 1 0 0xB0080000, // 01D4 RAISE 2 R0 R0 0x80041000, // 01D5 RET 1 R8 @@ -1459,16 +1457,16 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x8C200706, // 01D9 GETMET R8 R3 K6 0x88280B0E, // 01DA GETMBR R10 R5 K14 0xB82E0200, // 01DB GETNGBL R11 K1 - 0x882C1746, // 01DC GETMBR R11 R11 K70 - 0x882C1747, // 01DD GETMBR R11 R11 K71 + 0x882C1745, // 01DC GETMBR R11 R11 K69 + 0x882C1746, // 01DD GETMBR R11 R11 K70 0x7C200600, // 01DE CALL R8 3 0x80041000, // 01DF RET 1 R8 0x7002001E, // 01E0 JMP #0200 0x1C200F0F, // 01E1 EQ R8 R7 K15 0x78220009, // 01E2 JMPF R8 #01ED - 0x88200137, // 01E3 GETMBR R8 R0 K55 - 0x88201138, // 01E4 GETMBR R8 R8 K56 - 0x8C201148, // 01E5 GETMET R8 R8 K72 + 0x88200136, // 01E3 GETMBR R8 R0 K54 + 0x88201137, // 01E4 GETMBR R8 R8 K55 + 0x8C201147, // 01E5 GETMET R8 R8 K71 0x7C200200, // 01E6 CALL R8 1 0x8C240706, // 01E7 GETMET R9 R3 K6 0x882C0B0E, // 01E8 GETMBR R11 R5 K14 @@ -1483,8 +1481,8 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x54220004, // 01F1 LDINT R8 5 0x1C200E08, // 01F2 EQ R8 R7 R8 0x7822000B, // 01F3 JMPF R8 #0200 - 0x88200349, // 01F4 GETMBR R8 R1 K73 - 0x8C20113D, // 01F5 GETMET R8 R8 K61 + 0x88200348, // 01F4 GETMBR R8 R1 K72 + 0x8C20113C, // 01F5 GETMET R8 R8 K60 0x7C200200, // 01F6 CALL R8 1 0x4C240000, // 01F7 LDNIL R9 0x1C241009, // 01F8 EQ R9 R8 R9 @@ -1501,11 +1499,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7822003C, // 0203 JMPF R8 #0241 0x1C200F05, // 0204 EQ R8 R7 K5 0x78220012, // 0205 JMPF R8 #0219 - 0x88200137, // 0206 GETMBR R8 R0 K55 - 0x8C20114A, // 0207 GETMET R8 R8 K74 + 0x88200136, // 0206 GETMBR R8 R0 K54 + 0x8C201149, // 0207 GETMET R8 R8 K73 0x7C200200, // 0208 CALL R8 1 - 0x88240137, // 0209 GETMBR R9 R0 K55 - 0x8C24134B, // 020A GETMET R9 R9 K75 + 0x88240136, // 0209 GETMBR R9 R0 K54 + 0x8C24134A, // 020A GETMET R9 R9 K74 0x7C240200, // 020B CALL R9 1 0x78220004, // 020C JMPF R8 #0212 0x78260001, // 020D JMPF R9 #0210 @@ -1522,14 +1520,14 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x70020026, // 0218 JMP #0240 0x1C200F09, // 0219 EQ R8 R7 K9 0x78220011, // 021A JMPF R8 #022D - 0x88200137, // 021B GETMBR R8 R0 K55 - 0x8820114C, // 021C GETMBR R8 R8 K76 + 0x88200136, // 021B GETMBR R8 R0 K54 + 0x8820114B, // 021C GETMBR R8 R8 K75 0x4C240000, // 021D LDNIL R9 0x20241009, // 021E NE R9 R8 R9 0x78260006, // 021F JMPF R9 #0227 0x8C240706, // 0220 GETMET R9 R3 K6 0x882C0B0C, // 0221 GETMBR R11 R5 K12 - 0x8C30113D, // 0222 GETMET R12 R8 K61 + 0x8C30113C, // 0222 GETMET R12 R8 K60 0x7C300200, // 0223 CALL R12 1 0x7C240600, // 0224 CALL R9 3 0x80041200, // 0225 RET 1 R9 @@ -1542,14 +1540,14 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x70020012, // 022C JMP #0240 0x1C200F0D, // 022D EQ R8 R7 K13 0x78220010, // 022E JMPF R8 #0240 - 0x88200137, // 022F GETMBR R8 R0 K55 - 0x8820114C, // 0230 GETMBR R8 R8 K76 + 0x88200136, // 022F GETMBR R8 R0 K54 + 0x8820114B, // 0230 GETMBR R8 R8 K75 0x4C240000, // 0231 LDNIL R9 0x20241009, // 0232 NE R9 R8 R9 0x78260006, // 0233 JMPF R9 #023B 0x8C240706, // 0234 GETMET R9 R3 K6 0x882C0B0C, // 0235 GETMBR R11 R5 K12 - 0x8C301142, // 0236 GETMET R12 R8 K66 + 0x8C301141, // 0236 GETMET R12 R8 K65 0x7C300200, // 0237 CALL R12 1 0x7C240600, // 0238 CALL R9 3 0x80041200, // 0239 RET 1 R9 @@ -1564,7 +1562,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x1C200C08, // 0242 EQ R8 R6 R8 0x782200BA, // 0243 JMPF R8 #02FF 0x8C200133, // 0244 GETMET R8 R0 K51 - 0x88280534, // 0245 GETMBR R10 R2 K52 + 0x5C280400, // 0245 MOVE R10 R2 0x7C200400, // 0246 CALL R8 2 0x1C200F05, // 0247 EQ R8 R7 K5 0x78220005, // 0248 JMPF R8 #024F @@ -1578,7 +1576,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x78220005, // 0250 JMPF R8 #0257 0x8C200706, // 0251 GETMET R8 R3 K6 0x88280B16, // 0252 GETMBR R10 R5 K22 - 0x582C004D, // 0253 LDCONST R11 K77 + 0x582C004C, // 0253 LDCONST R11 K76 0x7C200600, // 0254 CALL R8 3 0x80041000, // 0255 RET 1 R8 0x700200A6, // 0256 JMP #02FE @@ -1586,8 +1584,8 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x78220006, // 0258 JMPF R8 #0260 0x8C200706, // 0259 GETMET R8 R3 K6 0x88280B0C, // 025A GETMBR R10 R5 K12 - 0x882C0137, // 025B GETMBR R11 R0 K55 - 0x882C174E, // 025C GETMBR R11 R11 K78 + 0x882C0136, // 025B GETMBR R11 R0 K54 + 0x882C174D, // 025C GETMBR R11 R11 K77 0x7C200600, // 025D CALL R8 3 0x80041000, // 025E RET 1 R8 0x7002009D, // 025F JMP #02FE @@ -1597,10 +1595,10 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x88280B16, // 0263 GETMBR R10 R5 K22 0xB82E2400, // 0264 GETNGBL R11 K18 0x8C2C1726, // 0265 GETMET R11 R11 K38 - 0x5834004F, // 0266 LDCONST R13 K79 + 0x5834004E, // 0266 LDCONST R13 K78 0x50380200, // 0267 LDBOOL R14 1 0 0x7C2C0600, // 0268 CALL R11 3 - 0x942C174F, // 0269 GETIDX R11 R11 K79 + 0x942C174E, // 0269 GETIDX R11 R11 K78 0x7C200600, // 026A CALL R8 3 0x80041000, // 026B RET 1 R8 0x70020090, // 026C JMP #02FE @@ -1620,10 +1618,10 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x88280B16, // 027A GETMBR R10 R5 K22 0xB82E2400, // 027B GETNGBL R11 K18 0x8C2C1726, // 027C GETMET R11 R11 K38 - 0x58340050, // 027D LDCONST R13 K80 + 0x5834004F, // 027D LDCONST R13 K79 0x50380200, // 027E LDBOOL R14 1 0 0x7C2C0600, // 027F CALL R11 3 - 0x942C1751, // 0280 GETIDX R11 R11 K81 + 0x942C1750, // 0280 GETIDX R11 R11 K80 0x7C200600, // 0281 CALL R8 3 0x80041000, // 0282 RET 1 R8 0x70020079, // 0283 JMP #02FE @@ -1632,7 +1630,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x78220005, // 0286 JMPF R8 #028D 0x8C200706, // 0287 GETMET R8 R3 K6 0x88280B16, // 0288 GETMBR R10 R5 K22 - 0x582C0052, // 0289 LDCONST R11 K82 + 0x582C0051, // 0289 LDCONST R11 K81 0x7C200600, // 028A CALL R8 3 0x80041000, // 028B RET 1 R8 0x70020070, // 028C JMP #02FE @@ -1652,11 +1650,11 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x88280B16, // 029A GETMBR R10 R5 K22 0xB82E2400, // 029B GETNGBL R11 K18 0x8C2C1726, // 029C GETMET R11 R11 K38 - 0x58340053, // 029D LDCONST R13 K83 + 0x58340052, // 029D LDCONST R13 K82 0x50380200, // 029E LDBOOL R14 1 0 0x7C2C0600, // 029F CALL R11 3 - 0x942C1754, // 02A0 GETIDX R11 R11 K84 - 0x942C1755, // 02A1 GETIDX R11 R11 K85 + 0x942C1753, // 02A0 GETIDX R11 R11 K83 + 0x942C1754, // 02A1 GETIDX R11 R11 K84 0x7C200600, // 02A2 CALL R8 3 0x80041000, // 02A3 RET 1 R8 0x70020058, // 02A4 JMP #02FE @@ -1674,14 +1672,14 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x78220015, // 02B0 JMPF R8 #02C7 0xB8222400, // 02B1 GETNGBL R8 K18 0x8C201126, // 02B2 GETMET R8 R8 K38 - 0x58280053, // 02B3 LDCONST R10 K83 + 0x58280052, // 02B3 LDCONST R10 K82 0x502C0200, // 02B4 LDBOOL R11 1 0 0x7C200600, // 02B5 CALL R8 3 - 0x94201154, // 02B6 GETIDX R8 R8 K84 - 0x94201156, // 02B7 GETIDX R8 R8 K86 + 0x94201153, // 02B6 GETIDX R8 R8 K83 + 0x94201155, // 02B7 GETIDX R8 R8 K85 0x8C24091B, // 02B8 GETMET R9 R4 K27 0x5C2C1000, // 02B9 MOVE R11 R8 - 0x58300057, // 02BA LDCONST R12 K87 + 0x58300056, // 02BA LDCONST R12 K86 0x7C240600, // 02BB CALL R9 3 0x24281305, // 02BC GT R10 R9 K5 0x782A0002, // 02BD JMPF R10 #02C1 @@ -1795,7 +1793,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x8C200706, // 0329 GETMET R8 R3 K6 0x88280B16, // 032A GETMBR R10 R5 K22 0xB82E2400, // 032B GETNGBL R11 K18 - 0x8C2C1758, // 032C GETMET R11 R11 K88 + 0x8C2C1757, // 032C GETMET R11 R11 K87 0x7C2C0200, // 032D CALL R11 1 0x7C200600, // 032E CALL R8 3 0x80041000, // 032F RET 1 R8 @@ -1808,7 +1806,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x4C2C0000, // 0336 LDNIL R11 0x88300B16, // 0337 GETMBR R12 R5 K22 0xB8362400, // 0338 GETNGBL R13 K18 - 0x8C341B58, // 0339 GETMET R13 R13 K88 + 0x8C341B57, // 0339 GETMET R13 R13 K87 0x7C340200, // 033A CALL R13 1 0x7C240800, // 033B CALL R9 4 0x80041000, // 033C RET 1 R8 @@ -1838,7 +1836,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7C200200, // 0354 CALL R8 1 0x8C24110B, // 0355 GETMET R9 R8 K11 0x4C2C0000, // 0356 LDNIL R11 - 0x8C300B59, // 0357 GETMET R12 R5 K89 + 0x8C300B58, // 0357 GETMET R12 R5 K88 0x88380B0E, // 0358 GETMBR R14 R5 K14 0x543E0003, // 0359 LDINT R15 4 0x7C300600, // 035A CALL R12 3 @@ -1872,12 +1870,12 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x7822001D, // 0376 JMPF R8 #0395 0x8C200B11, // 0377 GETMET R8 R5 K17 0x7C200200, // 0378 CALL R8 1 - 0x88240137, // 0379 GETMBR R9 R0 K55 - 0x8C24135A, // 037A GETMET R9 R9 K90 + 0x88240136, // 0379 GETMBR R9 R0 K54 + 0x8C241359, // 037A GETMET R9 R9 K89 0x502C0200, // 037B LDBOOL R11 1 0 0x7C240400, // 037C CALL R9 2 - 0x88280137, // 037D GETMBR R10 R0 K55 - 0x8828155B, // 037E GETMBR R10 R10 K91 + 0x88280136, // 037D GETMBR R10 R0 K54 + 0x8828155A, // 037E GETMBR R10 R10 K90 0x602C0010, // 037F GETGBL R11 G16 0x5C301200, // 0380 MOVE R12 R9 0x7C2C0200, // 0381 CALL R11 1 @@ -1895,7 +1893,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x5C441800, // 038D MOVE R17 R12 0x7C340800, // 038E CALL R13 4 0x7001FFF2, // 038F JMP #0383 - 0x582C003E, // 0390 LDCONST R11 K62 + 0x582C003D, // 0390 LDCONST R11 K61 0xAC2C0200, // 0391 CATCH R11 1 0 0xB0080000, // 0392 RAISE 2 R0 R0 0x80041000, // 0393 RET 1 R8 @@ -1903,7 +1901,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x60200003, // 0395 GETGBL R8 G3 0x5C240000, // 0396 MOVE R9 R0 0x7C200200, // 0397 CALL R8 1 - 0x8C20115C, // 0398 GETMET R8 R8 K92 + 0x8C20115B, // 0398 GETMET R8 R8 K91 0x5C280200, // 0399 MOVE R10 R1 0x5C2C0400, // 039A MOVE R11 R2 0x5C300600, // 039B MOVE R12 R3 @@ -1913,7 +1911,7 @@ be_local_closure(Matter_Plugin_Root_read_attribute, /* name */ 0x60200003, // 039F GETGBL R8 G3 0x5C240000, // 03A0 MOVE R9 R0 0x7C200200, // 03A1 CALL R8 1 - 0x8C20115C, // 03A2 GETMET R8 R8 K92 + 0x8C20115B, // 03A2 GETMET R8 R8 K91 0x5C280200, // 03A3 MOVE R10 R1 0x5C2C0400, // 03A4 MOVE R11 R2 0x5C300600, // 03A5 MOVE R12 R3 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h index b42a7facf..c829d0346 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_TLV.h @@ -6,6 +6,333 @@ extern const bclass be_class_Matter_TLV_item; +/******************************************************************** +** Solidified function: to_TLV +********************************************************************/ +be_local_closure(Matter_TLV_item_to_TLV, /* name */ + be_nested_proto( + 1, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 0, /* has constants */ + NULL, /* no const */ + be_str_weak(to_TLV), + &be_const_str_solidified, + ( &(const binstruction[ 1]) { /* code */ + 0x80040000, // 0000 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_parent +********************************************************************/ +be_local_closure(Matter_TLV_item_set_parent, /* name */ + be_nested_proto( + 2, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parent), + }), + be_str_weak(set_parent), + &be_const_str_solidified, + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_fulltag +********************************************************************/ +be_local_closure(Matter_TLV_item_set_fulltag, /* name */ + be_nested_proto( + 6, /* nstack */ + 4, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 4]) { /* constants */ + /* K0 */ be_nested_str_weak(tag_vendor), + /* K1 */ be_nested_str_weak(tag_profile), + /* K2 */ be_nested_str_weak(tag_number), + /* K3 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(set_fulltag), + &be_const_str_solidified, + ( &(const binstruction[15]) { /* code */ + 0x60100009, // 0000 GETGBL R4 G9 + 0x5C140200, // 0001 MOVE R5 R1 + 0x7C100200, // 0002 CALL R4 1 + 0x90020004, // 0003 SETMBR R0 K0 R4 + 0x60100009, // 0004 GETGBL R4 G9 + 0x5C140400, // 0005 MOVE R5 R2 + 0x7C100200, // 0006 CALL R4 1 + 0x90020204, // 0007 SETMBR R0 K1 R4 + 0x60100009, // 0008 GETGBL R4 G9 + 0x5C140600, // 0009 MOVE R5 R3 + 0x7C100200, // 000A CALL R4 1 + 0x90020404, // 000B SETMBR R0 K2 R4 + 0x4C100000, // 000C LDNIL R4 + 0x90020604, // 000D SETMBR R0 K3 R4 + 0x80000000, // 000E RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: set_contextspecific +********************************************************************/ +be_local_closure(Matter_TLV_item_set_contextspecific, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(set_fulltag), + /* K1 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(set_contextspecific), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x7C080200, // 0001 CALL R2 1 + 0x60080009, // 0002 GETGBL R2 G9 + 0x5C0C0200, // 0003 MOVE R3 R1 + 0x7C080200, // 0004 CALL R2 1 + 0x90020202, // 0005 SETMBR R0 K1 R2 + 0x80000000, // 0006 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: sort +********************************************************************/ +be_local_closure(Matter_TLV_item_sort, /* name */ + be_nested_proto( + 9, /* nstack */ + 1, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 5]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_TLV_item), + /* K1 */ be_const_int(1), + /* K2 */ be_const_int(0), + /* K3 */ be_nested_str_weak(_cmp_gt), + /* K4 */ be_nested_str_weak(stop_iteration), + }), + be_str_weak(sort), + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0x58040000, // 0000 LDCONST R1 K0 + 0x60080010, // 0001 GETGBL R2 G16 + 0x600C000C, // 0002 GETGBL R3 G12 + 0x5C100000, // 0003 MOVE R4 R0 + 0x7C0C0200, // 0004 CALL R3 1 + 0x040C0701, // 0005 SUB R3 R3 K1 + 0x400E0203, // 0006 CONNECT R3 K1 R3 + 0x7C080200, // 0007 CALL R2 1 + 0xA8020013, // 0008 EXBLK 0 #001D + 0x5C0C0400, // 0009 MOVE R3 R2 + 0x7C0C0000, // 000A CALL R3 0 + 0x94100003, // 000B GETIDX R4 R0 R3 + 0x5C140600, // 000C MOVE R5 R3 + 0x24180B02, // 000D GT R6 R5 K2 + 0x781A000B, // 000E JMPF R6 #001B + 0x04180B01, // 000F SUB R6 R5 K1 + 0x94180006, // 0010 GETIDX R6 R0 R6 + 0x8C180D03, // 0011 GETMET R6 R6 K3 + 0x5C200800, // 0012 MOVE R8 R4 + 0x7C180400, // 0013 CALL R6 2 + 0x24180D02, // 0014 GT R6 R6 K2 + 0x781A0004, // 0015 JMPF R6 #001B + 0x04180B01, // 0016 SUB R6 R5 K1 + 0x94180006, // 0017 GETIDX R6 R0 R6 + 0x98000A06, // 0018 SETIDX R0 R5 R6 + 0x04140B01, // 0019 SUB R5 R5 K1 + 0x7001FFF1, // 001A JMP #000D + 0x98000A04, // 001B SETIDX R0 R5 R4 + 0x7001FFEB, // 001C JMP #0009 + 0x58080004, // 001D LDCONST R2 K4 + 0xAC080200, // 001E CATCH R2 1 0 + 0xB0080000, // 001F RAISE 2 R0 R0 + 0x80040000, // 0020 RET 1 R0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: to_str_val +********************************************************************/ +be_local_closure(Matter_TLV_item_to_str_val, /* name */ + be_nested_proto( + 4, /* nstack */ + 1, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[16]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(int), + /* K2 */ be_nested_str_weak(typ), + /* K3 */ be_nested_str_weak(TLV), + /* K4 */ be_nested_str_weak(U1), + /* K5 */ be_nested_str_weak(U8), + /* K6 */ be_nested_str_weak(U), + /* K7 */ be_nested_str_weak(bool), + /* K8 */ be_nested_str_weak(true), + /* K9 */ be_nested_str_weak(false), + /* K10 */ be_nested_str_weak(null), + /* K11 */ be_nested_str_weak(real), + /* K12 */ be_nested_str_weak(string), + /* K13 */ be_nested_str_weak(int64), + /* K14 */ be_nested_str_weak(tostring), + /* K15 */ be_nested_str_weak(instance), + }), + be_str_weak(to_str_val), + &be_const_str_solidified, + ( &(const binstruction[98]) { /* code */ + 0x60040004, // 0000 GETGBL R1 G4 + 0x88080100, // 0001 GETMBR R2 R0 K0 + 0x7C040200, // 0002 CALL R1 1 + 0x1C040301, // 0003 EQ R1 R1 K1 + 0x78060014, // 0004 JMPF R1 #001A + 0x88040102, // 0005 GETMBR R1 R0 K2 + 0x88080103, // 0006 GETMBR R2 R0 K3 + 0x88080504, // 0007 GETMBR R2 R2 K4 + 0x28040202, // 0008 GE R1 R1 R2 + 0x7806000A, // 0009 JMPF R1 #0015 + 0x88040102, // 000A GETMBR R1 R0 K2 + 0x88080103, // 000B GETMBR R2 R0 K3 + 0x88080505, // 000C GETMBR R2 R2 K5 + 0x18040202, // 000D LE R1 R1 R2 + 0x78060005, // 000E JMPF R1 #0015 + 0x60040008, // 000F GETGBL R1 G8 + 0x88080100, // 0010 GETMBR R2 R0 K0 + 0x7C040200, // 0011 CALL R1 1 + 0x00040306, // 0012 ADD R1 R1 K6 + 0x80040200, // 0013 RET 1 R1 + 0x70020003, // 0014 JMP #0019 + 0x60040008, // 0015 GETGBL R1 G8 + 0x88080100, // 0016 GETMBR R2 R0 K0 + 0x7C040200, // 0017 CALL R1 1 + 0x80040200, // 0018 RET 1 R1 + 0x70020046, // 0019 JMP #0061 + 0x60040004, // 001A GETGBL R1 G4 + 0x88080100, // 001B GETMBR R2 R0 K0 + 0x7C040200, // 001C CALL R1 1 + 0x1C040307, // 001D EQ R1 R1 K7 + 0x78060006, // 001E JMPF R1 #0026 + 0x88040100, // 001F GETMBR R1 R0 K0 + 0x78060001, // 0020 JMPF R1 #0023 + 0x58040008, // 0021 LDCONST R1 K8 + 0x70020000, // 0022 JMP #0024 + 0x58040009, // 0023 LDCONST R1 K9 + 0x80040200, // 0024 RET 1 R1 + 0x7002003A, // 0025 JMP #0061 + 0x88040100, // 0026 GETMBR R1 R0 K0 + 0x4C080000, // 0027 LDNIL R2 + 0x1C040202, // 0028 EQ R1 R1 R2 + 0x78060001, // 0029 JMPF R1 #002C + 0x80061400, // 002A RET 1 K10 + 0x70020034, // 002B JMP #0061 + 0x60040004, // 002C GETGBL R1 G4 + 0x88080100, // 002D GETMBR R2 R0 K0 + 0x7C040200, // 002E CALL R1 1 + 0x1C04030B, // 002F EQ R1 R1 K11 + 0x78060004, // 0030 JMPF R1 #0036 + 0x60040008, // 0031 GETGBL R1 G8 + 0x88080100, // 0032 GETMBR R2 R0 K0 + 0x7C040200, // 0033 CALL R1 1 + 0x80040200, // 0034 RET 1 R1 + 0x7002002A, // 0035 JMP #0061 + 0x60040004, // 0036 GETGBL R1 G4 + 0x88080100, // 0037 GETMBR R2 R0 K0 + 0x7C040200, // 0038 CALL R1 1 + 0x1C04030C, // 0039 EQ R1 R1 K12 + 0x78060002, // 003A JMPF R1 #003E + 0x88040100, // 003B GETMBR R1 R0 K0 + 0x80040200, // 003C RET 1 R1 + 0x70020022, // 003D JMP #0061 + 0x6004000F, // 003E GETGBL R1 G15 + 0x88080100, // 003F GETMBR R2 R0 K0 + 0xB80E1A00, // 0040 GETNGBL R3 K13 + 0x7C040400, // 0041 CALL R1 2 + 0x78060014, // 0042 JMPF R1 #0058 + 0x88040102, // 0043 GETMBR R1 R0 K2 + 0x88080103, // 0044 GETMBR R2 R0 K3 + 0x88080504, // 0045 GETMBR R2 R2 K4 + 0x28040202, // 0046 GE R1 R1 R2 + 0x7806000A, // 0047 JMPF R1 #0053 + 0x88040102, // 0048 GETMBR R1 R0 K2 + 0x88080103, // 0049 GETMBR R2 R0 K3 + 0x88080505, // 004A GETMBR R2 R2 K5 + 0x18040202, // 004B LE R1 R1 R2 + 0x78060005, // 004C JMPF R1 #0053 + 0x88040100, // 004D GETMBR R1 R0 K0 + 0x8C04030E, // 004E GETMET R1 R1 K14 + 0x7C040200, // 004F CALL R1 1 + 0x00040306, // 0050 ADD R1 R1 K6 + 0x80040200, // 0051 RET 1 R1 + 0x70020003, // 0052 JMP #0057 + 0x88040100, // 0053 GETMBR R1 R0 K0 + 0x8C04030E, // 0054 GETMET R1 R1 K14 + 0x7C040200, // 0055 CALL R1 1 + 0x80040200, // 0056 RET 1 R1 + 0x70020008, // 0057 JMP #0061 + 0x60040004, // 0058 GETGBL R1 G4 + 0x88080100, // 0059 GETMBR R2 R0 K0 + 0x7C040200, // 005A CALL R1 1 + 0x1C04030F, // 005B EQ R1 R1 K15 + 0x78060003, // 005C JMPF R1 #0061 + 0x8C04010E, // 005D GETMET R1 R0 K14 + 0x500C0200, // 005E LDBOOL R3 1 0 + 0x7C040400, // 005F CALL R1 2 + 0x80040200, // 0060 RET 1 R1 + 0x80000000, // 0061 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: encode_len ********************************************************************/ @@ -321,137 +648,81 @@ be_local_closure(Matter_TLV_item_encode_len, /* name */ /******************************************************************** -** Solidified function: to_str_val +** Solidified function: reset ********************************************************************/ -be_local_closure(Matter_TLV_item_to_str_val, /* name */ +be_local_closure(Matter_TLV_item_reset, /* name */ be_nested_proto( - 4, /* nstack */ - 1, /* argc */ + 3, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[16]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(int), - /* K2 */ be_nested_str_weak(typ), - /* K3 */ be_nested_str_weak(TLV), - /* K4 */ be_nested_str_weak(U1), - /* K5 */ be_nested_str_weak(U8), - /* K6 */ be_nested_str_weak(U), - /* K7 */ be_nested_str_weak(bool), - /* K8 */ be_nested_str_weak(true), - /* K9 */ be_nested_str_weak(false), - /* K10 */ be_nested_str_weak(null), - /* K11 */ be_nested_str_weak(real), - /* K12 */ be_nested_str_weak(string), - /* K13 */ be_nested_str_weak(int64), - /* K14 */ be_nested_str_weak(tostring), - /* K15 */ be_nested_str_weak(instance), + ( &(const bvalue[ 8]) { /* constants */ + /* K0 */ be_nested_str_weak(parent), + /* K1 */ be_nested_str_weak(next_idx), + /* K2 */ be_nested_str_weak(tag_vendor), + /* K3 */ be_nested_str_weak(tag_profile), + /* K4 */ be_nested_str_weak(tag_number), + /* K5 */ be_nested_str_weak(tag_sub), + /* K6 */ be_nested_str_weak(typ), + /* K7 */ be_nested_str_weak(val), }), - be_str_weak(to_str_val), + be_str_weak(reset), &be_const_str_solidified, - ( &(const binstruction[98]) { /* code */ - 0x60040004, // 0000 GETGBL R1 G4 - 0x88080100, // 0001 GETMBR R2 R0 K0 - 0x7C040200, // 0002 CALL R1 1 - 0x1C040301, // 0003 EQ R1 R1 K1 - 0x78060014, // 0004 JMPF R1 #001A - 0x88040102, // 0005 GETMBR R1 R0 K2 - 0x88080103, // 0006 GETMBR R2 R0 K3 - 0x88080504, // 0007 GETMBR R2 R2 K4 - 0x28040202, // 0008 GE R1 R1 R2 - 0x7806000A, // 0009 JMPF R1 #0015 - 0x88040102, // 000A GETMBR R1 R0 K2 - 0x88080103, // 000B GETMBR R2 R0 K3 - 0x88080505, // 000C GETMBR R2 R2 K5 - 0x18040202, // 000D LE R1 R1 R2 - 0x78060005, // 000E JMPF R1 #0015 - 0x60040008, // 000F GETGBL R1 G8 - 0x88080100, // 0010 GETMBR R2 R0 K0 - 0x7C040200, // 0011 CALL R1 1 - 0x00040306, // 0012 ADD R1 R1 K6 - 0x80040200, // 0013 RET 1 R1 - 0x70020003, // 0014 JMP #0019 - 0x60040008, // 0015 GETGBL R1 G8 - 0x88080100, // 0016 GETMBR R2 R0 K0 - 0x7C040200, // 0017 CALL R1 1 - 0x80040200, // 0018 RET 1 R1 - 0x70020046, // 0019 JMP #0061 - 0x60040004, // 001A GETGBL R1 G4 - 0x88080100, // 001B GETMBR R2 R0 K0 - 0x7C040200, // 001C CALL R1 1 - 0x1C040307, // 001D EQ R1 R1 K7 - 0x78060006, // 001E JMPF R1 #0026 - 0x88040100, // 001F GETMBR R1 R0 K0 - 0x78060001, // 0020 JMPF R1 #0023 - 0x58040008, // 0021 LDCONST R1 K8 - 0x70020000, // 0022 JMP #0024 - 0x58040009, // 0023 LDCONST R1 K9 - 0x80040200, // 0024 RET 1 R1 - 0x7002003A, // 0025 JMP #0061 - 0x88040100, // 0026 GETMBR R1 R0 K0 - 0x4C080000, // 0027 LDNIL R2 - 0x1C040202, // 0028 EQ R1 R1 R2 - 0x78060001, // 0029 JMPF R1 #002C - 0x80061400, // 002A RET 1 K10 - 0x70020034, // 002B JMP #0061 - 0x60040004, // 002C GETGBL R1 G4 - 0x88080100, // 002D GETMBR R2 R0 K0 - 0x7C040200, // 002E CALL R1 1 - 0x1C04030B, // 002F EQ R1 R1 K11 - 0x78060004, // 0030 JMPF R1 #0036 - 0x60040008, // 0031 GETGBL R1 G8 - 0x88080100, // 0032 GETMBR R2 R0 K0 - 0x7C040200, // 0033 CALL R1 1 - 0x80040200, // 0034 RET 1 R1 - 0x7002002A, // 0035 JMP #0061 - 0x60040004, // 0036 GETGBL R1 G4 - 0x88080100, // 0037 GETMBR R2 R0 K0 - 0x7C040200, // 0038 CALL R1 1 - 0x1C04030C, // 0039 EQ R1 R1 K12 - 0x78060002, // 003A JMPF R1 #003E - 0x88040100, // 003B GETMBR R1 R0 K0 - 0x80040200, // 003C RET 1 R1 - 0x70020022, // 003D JMP #0061 - 0x6004000F, // 003E GETGBL R1 G15 - 0x88080100, // 003F GETMBR R2 R0 K0 - 0xB80E1A00, // 0040 GETNGBL R3 K13 - 0x7C040400, // 0041 CALL R1 2 - 0x78060014, // 0042 JMPF R1 #0058 - 0x88040102, // 0043 GETMBR R1 R0 K2 - 0x88080103, // 0044 GETMBR R2 R0 K3 - 0x88080504, // 0045 GETMBR R2 R2 K4 - 0x28040202, // 0046 GE R1 R1 R2 - 0x7806000A, // 0047 JMPF R1 #0053 - 0x88040102, // 0048 GETMBR R1 R0 K2 - 0x88080103, // 0049 GETMBR R2 R0 K3 - 0x88080505, // 004A GETMBR R2 R2 K5 - 0x18040202, // 004B LE R1 R1 R2 - 0x78060005, // 004C JMPF R1 #0053 - 0x88040100, // 004D GETMBR R1 R0 K0 - 0x8C04030E, // 004E GETMET R1 R1 K14 - 0x7C040200, // 004F CALL R1 1 - 0x00040306, // 0050 ADD R1 R1 K6 - 0x80040200, // 0051 RET 1 R1 - 0x70020003, // 0052 JMP #0057 - 0x88040100, // 0053 GETMBR R1 R0 K0 - 0x8C04030E, // 0054 GETMET R1 R1 K14 - 0x7C040200, // 0055 CALL R1 1 - 0x80040200, // 0056 RET 1 R1 - 0x70020008, // 0057 JMP #0061 - 0x60040004, // 0058 GETGBL R1 G4 - 0x88080100, // 0059 GETMBR R2 R0 K0 - 0x7C040200, // 005A CALL R1 1 - 0x1C04030F, // 005B EQ R1 R1 K15 - 0x78060003, // 005C JMPF R1 #0061 - 0x8C04010E, // 005D GETMET R1 R0 K14 - 0x500C0200, // 005E LDBOOL R3 1 0 - 0x7C040400, // 005F CALL R1 2 - 0x80040200, // 0060 RET 1 R1 - 0x80000000, // 0061 RET 0 + ( &(const binstruction[10]) { /* code */ + 0x4C080000, // 0000 LDNIL R2 + 0x90020001, // 0001 SETMBR R0 K0 R1 + 0x90020202, // 0002 SETMBR R0 K1 R2 + 0x90020402, // 0003 SETMBR R0 K2 R2 + 0x90020602, // 0004 SETMBR R0 K3 R2 + 0x90020802, // 0005 SETMBR R0 K4 R2 + 0x90020A02, // 0006 SETMBR R0 K5 R2 + 0x90020C02, // 0007 SETMBR R0 K6 R2 + 0x90020E02, // 0008 SETMBR R0 K7 R2 + 0x80000000, // 0009 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: create_TLV +********************************************************************/ +be_local_closure(Matter_TLV_item_create_TLV, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 4, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_const_class(be_class_Matter_TLV_item), + /* K1 */ be_nested_str_weak(typ), + /* K2 */ be_nested_str_weak(val), + }), + be_str_weak(create_TLV), + &be_const_str_solidified, + ( &(const binstruction[13]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x200C0203, // 0002 NE R3 R1 R3 + 0x740E0002, // 0003 JMPT R3 #0007 + 0x540E0013, // 0004 LDINT R3 20 + 0x1C0C0003, // 0005 EQ R3 R0 R3 + 0x780E0004, // 0006 JMPF R3 #000C + 0x5C0C0400, // 0007 MOVE R3 R2 + 0x7C0C0000, // 0008 CALL R3 0 + 0x900E0200, // 0009 SETMBR R3 K1 R0 + 0x900E0401, // 000A SETMBR R3 K2 R1 + 0x80040600, // 000B RET 1 R3 + 0x80000000, // 000C RET 0 }) ) ); @@ -613,406 +884,85 @@ be_local_closure(Matter_TLV_item_parse, /* name */ /******************************************************************** -** Solidified function: _cmp_gt +** Solidified function: _encode_tag_len ********************************************************************/ -be_local_closure(Matter_TLV_item__cmp_gt, /* name */ +be_local_closure(Matter_TLV_item__encode_tag_len, /* name */ be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 6]) { /* constants */ - /* K0 */ be_nested_str_weak(tag_vendor), - /* K1 */ be_const_int(1), - /* K2 */ be_nested_str_weak(tag_profile), - /* K3 */ be_const_int(0), - /* K4 */ be_nested_str_weak(tag_number), - /* K5 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(_cmp_gt), - &be_const_str_solidified, - ( &(const binstruction[72]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0012, // 0003 JMPF R2 #0017 - 0x88080300, // 0004 GETMBR R2 R1 K0 - 0x4C0C0000, // 0005 LDNIL R3 - 0x1C080403, // 0006 EQ R2 R2 R3 - 0x780A0000, // 0007 JMPF R2 #0009 - 0x80060200, // 0008 RET 1 K1 - 0x88080100, // 0009 GETMBR R2 R0 K0 - 0x880C0300, // 000A GETMBR R3 R1 K0 - 0x24080403, // 000B GT R2 R2 R3 - 0x780A0000, // 000C JMPF R2 #000E - 0x80060200, // 000D RET 1 K1 - 0x88080100, // 000E GETMBR R2 R0 K0 - 0x880C0300, // 000F GETMBR R3 R1 K0 - 0x1C080403, // 0010 EQ R2 R2 R3 - 0x780A0004, // 0011 JMPF R2 #0017 - 0x88080102, // 0012 GETMBR R2 R0 K2 - 0x880C0302, // 0013 GETMBR R3 R1 K2 - 0x24080403, // 0014 GT R2 R2 R3 - 0x780A0000, // 0015 JMPF R2 #0017 - 0x80060200, // 0016 RET 1 K1 - 0x88080102, // 0017 GETMBR R2 R0 K2 - 0x540DFFFE, // 0018 LDINT R3 -1 - 0x1C080403, // 0019 EQ R2 R2 R3 - 0x780A0005, // 001A JMPF R2 #0021 - 0x88080302, // 001B GETMBR R2 R1 K2 - 0x4C0C0000, // 001C LDNIL R3 - 0x1C080403, // 001D EQ R2 R2 R3 - 0x780A0000, // 001E JMPF R2 #0020 - 0x80060200, // 001F RET 1 K1 - 0x70020008, // 0020 JMP #002A - 0x88080102, // 0021 GETMBR R2 R0 K2 - 0x4C0C0000, // 0022 LDNIL R3 - 0x1C080403, // 0023 EQ R2 R2 R3 - 0x780A0004, // 0024 JMPF R2 #002A - 0x88080302, // 0025 GETMBR R2 R1 K2 - 0x540DFFFE, // 0026 LDINT R3 -1 - 0x1C080403, // 0027 EQ R2 R2 R3 - 0x780A0000, // 0028 JMPF R2 #002A - 0x80060600, // 0029 RET 1 K3 - 0x88080104, // 002A GETMBR R2 R0 K4 - 0x4C0C0000, // 002B LDNIL R3 - 0x20080403, // 002C NE R2 R2 R3 - 0x780A000A, // 002D JMPF R2 #0039 - 0x88080304, // 002E GETMBR R2 R1 K4 - 0x4C0C0000, // 002F LDNIL R3 - 0x1C080403, // 0030 EQ R2 R2 R3 - 0x780A0000, // 0031 JMPF R2 #0033 - 0x80060200, // 0032 RET 1 K1 - 0x88080104, // 0033 GETMBR R2 R0 K4 - 0x880C0304, // 0034 GETMBR R3 R1 K4 - 0x24080403, // 0035 GT R2 R2 R3 - 0x780A0000, // 0036 JMPF R2 #0038 - 0x80060200, // 0037 RET 1 K1 - 0x80060600, // 0038 RET 1 K3 - 0x88080105, // 0039 GETMBR R2 R0 K5 - 0x4C0C0000, // 003A LDNIL R3 - 0x20080403, // 003B NE R2 R2 R3 - 0x780A0009, // 003C JMPF R2 #0047 - 0x88080305, // 003D GETMBR R2 R1 K5 - 0x4C0C0000, // 003E LDNIL R3 - 0x1C080403, // 003F EQ R2 R2 R3 - 0x780A0000, // 0040 JMPF R2 #0042 - 0x80060200, // 0041 RET 1 K1 - 0x88080105, // 0042 GETMBR R2 R0 K5 - 0x880C0305, // 0043 GETMBR R3 R1 K5 - 0x24080403, // 0044 GT R2 R2 R3 - 0x780A0000, // 0045 JMPF R2 #0047 - 0x80060200, // 0046 RET 1 K1 - 0x80060600, // 0047 RET 1 K3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: create_TLV -********************************************************************/ -be_local_closure(Matter_TLV_item_create_TLV, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_TLV_item), - /* K1 */ be_nested_str_weak(typ), - /* K2 */ be_nested_str_weak(val), - }), - be_str_weak(create_TLV), - &be_const_str_solidified, - ( &(const binstruction[13]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x200C0203, // 0002 NE R3 R1 R3 - 0x740E0002, // 0003 JMPT R3 #0007 - 0x540E0013, // 0004 LDINT R3 20 - 0x1C0C0003, // 0005 EQ R3 R0 R3 - 0x780E0004, // 0006 JMPF R3 #000C - 0x5C0C0400, // 0007 MOVE R3 R2 - 0x7C0C0000, // 0008 CALL R3 0 - 0x900E0200, // 0009 SETMBR R3 K1 R0 - 0x900E0401, // 000A SETMBR R3 K2 R1 - 0x80040600, // 000B RET 1 R3 - 0x80000000, // 000C RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: to_TLV -********************************************************************/ -be_local_closure(Matter_TLV_item_to_TLV, /* name */ - be_nested_proto( - 1, /* nstack */ + 6, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ - 0, /* has constants */ - NULL, /* no const */ - be_str_weak(to_TLV), - &be_const_str_solidified, - ( &(const binstruction[ 1]) { /* code */ - 0x80040000, // 0000 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: _encode_tag -********************************************************************/ -be_local_closure(Matter_TLV_item__encode_tag, /* name */ - be_nested_proto( - 9, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 9]) { /* constants */ - /* K0 */ be_nested_str_weak(tag_number), - /* K1 */ be_const_int(0), - /* K2 */ be_nested_str_weak(tag_vendor), - /* K3 */ be_nested_str_weak(add), - /* K4 */ be_nested_str_weak(typ), - /* K5 */ be_const_int(1), - /* K6 */ be_const_int(2), - /* K7 */ be_nested_str_weak(tag_profile), - /* K8 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(_encode_tag), - &be_const_str_solidified, - ( &(const binstruction[133]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x4C0C0000, // 0001 LDNIL R3 - 0x20080403, // 0002 NE R2 R2 R3 - 0x780A0001, // 0003 JMPF R2 #0006 - 0x88080100, // 0004 GETMBR R2 R0 K0 - 0x70020000, // 0005 JMP #0007 - 0x58080001, // 0006 LDCONST R2 K1 - 0x540EFFFF, // 0007 LDINT R3 65536 - 0x280C0403, // 0008 GE R3 R2 R3 - 0x740E0002, // 0009 JMPT R3 #000D - 0x140C0501, // 000A LT R3 R2 K1 - 0x740E0000, // 000B JMPT R3 #000D - 0x500C0001, // 000C LDBOOL R3 0 1 - 0x500C0200, // 000D LDBOOL R3 1 0 - 0x58100001, // 000E LDCONST R4 K1 - 0x88140102, // 000F GETMBR R5 R0 K2 - 0x4C180000, // 0010 LDNIL R6 - 0x20140A06, // 0011 NE R5 R5 R6 - 0x78160026, // 0012 JMPF R5 #003A - 0x780E0012, // 0013 JMPF R3 #0027 - 0x8C140303, // 0014 GETMET R5 R1 K3 - 0x541E00DF, // 0015 LDINT R7 224 - 0x88200104, // 0016 GETMBR R8 R0 K4 - 0x001C0E08, // 0017 ADD R7 R7 R8 - 0x58200005, // 0018 LDCONST R8 K5 - 0x7C140600, // 0019 CALL R5 3 - 0x8C140303, // 001A GETMET R5 R1 K3 - 0x881C0102, // 001B GETMBR R7 R0 K2 - 0x58200006, // 001C LDCONST R8 K6 - 0x7C140600, // 001D CALL R5 3 - 0x8C140303, // 001E GETMET R5 R1 K3 - 0x881C0107, // 001F GETMBR R7 R0 K7 - 0x58200006, // 0020 LDCONST R8 K6 - 0x7C140600, // 0021 CALL R5 3 - 0x8C140303, // 0022 GETMET R5 R1 K3 - 0x881C0100, // 0023 GETMBR R7 R0 K0 - 0x54220003, // 0024 LDINT R8 4 - 0x7C140600, // 0025 CALL R5 3 - 0x70020011, // 0026 JMP #0039 - 0x8C140303, // 0027 GETMET R5 R1 K3 - 0x541E00BF, // 0028 LDINT R7 192 - 0x88200104, // 0029 GETMBR R8 R0 K4 - 0x001C0E08, // 002A ADD R7 R7 R8 - 0x58200005, // 002B LDCONST R8 K5 - 0x7C140600, // 002C CALL R5 3 - 0x8C140303, // 002D GETMET R5 R1 K3 - 0x881C0102, // 002E GETMBR R7 R0 K2 - 0x58200006, // 002F LDCONST R8 K6 - 0x7C140600, // 0030 CALL R5 3 - 0x8C140303, // 0031 GETMET R5 R1 K3 - 0x881C0107, // 0032 GETMBR R7 R0 K7 - 0x58200006, // 0033 LDCONST R8 K6 - 0x7C140600, // 0034 CALL R5 3 - 0x8C140303, // 0035 GETMET R5 R1 K3 - 0x881C0100, // 0036 GETMBR R7 R0 K0 - 0x58200006, // 0037 LDCONST R8 K6 - 0x7C140600, // 0038 CALL R5 3 - 0x70020049, // 0039 JMP #0084 - 0x88140107, // 003A GETMBR R5 R0 K7 - 0x5419FFFE, // 003B LDINT R6 -1 - 0x1C140A06, // 003C EQ R5 R5 R6 - 0x78160016, // 003D JMPF R5 #0055 - 0x780E000A, // 003E JMPF R3 #004A - 0x8C140303, // 003F GETMET R5 R1 K3 - 0x541E005F, // 0040 LDINT R7 96 - 0x88200104, // 0041 GETMBR R8 R0 K4 - 0x001C0E08, // 0042 ADD R7 R7 R8 - 0x58200005, // 0043 LDCONST R8 K5 - 0x7C140600, // 0044 CALL R5 3 - 0x8C140303, // 0045 GETMET R5 R1 K3 - 0x881C0100, // 0046 GETMBR R7 R0 K0 - 0x54220003, // 0047 LDINT R8 4 - 0x7C140600, // 0048 CALL R5 3 - 0x70020009, // 0049 JMP #0054 - 0x8C140303, // 004A GETMET R5 R1 K3 - 0x541E003F, // 004B LDINT R7 64 - 0x88200104, // 004C GETMBR R8 R0 K4 - 0x001C0E08, // 004D ADD R7 R7 R8 - 0x58200005, // 004E LDCONST R8 K5 - 0x7C140600, // 004F CALL R5 3 - 0x8C140303, // 0050 GETMET R5 R1 K3 - 0x881C0100, // 0051 GETMBR R7 R0 K0 - 0x58200006, // 0052 LDCONST R8 K6 - 0x7C140600, // 0053 CALL R5 3 - 0x7002002E, // 0054 JMP #0084 - 0x88140107, // 0055 GETMBR R5 R0 K7 - 0x4C180000, // 0056 LDNIL R6 - 0x20140A06, // 0057 NE R5 R5 R6 - 0x78160016, // 0058 JMPF R5 #0070 - 0x780E000A, // 0059 JMPF R3 #0065 - 0x8C140303, // 005A GETMET R5 R1 K3 - 0x541E009F, // 005B LDINT R7 160 - 0x88200104, // 005C GETMBR R8 R0 K4 - 0x001C0E08, // 005D ADD R7 R7 R8 - 0x58200005, // 005E LDCONST R8 K5 - 0x7C140600, // 005F CALL R5 3 - 0x8C140303, // 0060 GETMET R5 R1 K3 - 0x881C0100, // 0061 GETMBR R7 R0 K0 - 0x54220003, // 0062 LDINT R8 4 - 0x7C140600, // 0063 CALL R5 3 - 0x70020009, // 0064 JMP #006F - 0x8C140303, // 0065 GETMET R5 R1 K3 - 0x541E007F, // 0066 LDINT R7 128 - 0x88200104, // 0067 GETMBR R8 R0 K4 - 0x001C0E08, // 0068 ADD R7 R7 R8 - 0x58200005, // 0069 LDCONST R8 K5 - 0x7C140600, // 006A CALL R5 3 - 0x8C140303, // 006B GETMET R5 R1 K3 - 0x881C0100, // 006C GETMBR R7 R0 K0 - 0x58200006, // 006D LDCONST R8 K6 - 0x7C140600, // 006E CALL R5 3 - 0x70020013, // 006F JMP #0084 - 0x88140108, // 0070 GETMBR R5 R0 K8 - 0x4C180000, // 0071 LDNIL R6 - 0x20140A06, // 0072 NE R5 R5 R6 - 0x7816000A, // 0073 JMPF R5 #007F - 0x8C140303, // 0074 GETMET R5 R1 K3 - 0x541E001F, // 0075 LDINT R7 32 - 0x88200104, // 0076 GETMBR R8 R0 K4 - 0x001C0E08, // 0077 ADD R7 R7 R8 - 0x58200005, // 0078 LDCONST R8 K5 - 0x7C140600, // 0079 CALL R5 3 - 0x8C140303, // 007A GETMET R5 R1 K3 - 0x881C0108, // 007B GETMBR R7 R0 K8 - 0x58200005, // 007C LDCONST R8 K5 - 0x7C140600, // 007D CALL R5 3 - 0x70020004, // 007E JMP #0084 - 0x8C140303, // 007F GETMET R5 R1 K3 - 0x881C0104, // 0080 GETMBR R7 R0 K4 - 0x001E0207, // 0081 ADD R7 K1 R7 - 0x58200005, // 0082 LDCONST R8 K5 - 0x7C140600, // 0083 CALL R5 3 - 0x80000000, // 0084 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_contextspecific -********************************************************************/ -be_local_closure(Matter_TLV_item_set_contextspecific, /* name */ - be_nested_proto( - 4, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(set_fulltag), - /* K1 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(set_contextspecific), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x7C080200, // 0001 CALL R2 1 - 0x60080009, // 0002 GETGBL R2 G9 - 0x5C0C0200, // 0003 MOVE R3 R1 - 0x7C080200, // 0004 CALL R2 1 - 0x90020202, // 0005 SETMBR R0 K1 R2 - 0x80000000, // 0006 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: reset -********************************************************************/ -be_local_closure(Matter_TLV_item_reset, /* name */ - be_nested_proto( - 3, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ 1, /* has constants */ ( &(const bvalue[ 8]) { /* constants */ - /* K0 */ be_nested_str_weak(parent), - /* K1 */ be_nested_str_weak(next_idx), + /* K0 */ be_nested_str_weak(tag_number), + /* K1 */ be_const_int(0), /* K2 */ be_nested_str_weak(tag_vendor), /* K3 */ be_nested_str_weak(tag_profile), - /* K4 */ be_nested_str_weak(tag_number), + /* K4 */ be_const_int(3), /* K5 */ be_nested_str_weak(tag_sub), - /* K6 */ be_nested_str_weak(typ), - /* K7 */ be_nested_str_weak(val), + /* K6 */ be_const_int(2), + /* K7 */ be_const_int(1), }), - be_str_weak(reset), + be_str_weak(_encode_tag_len), &be_const_str_solidified, - ( &(const binstruction[10]) { /* code */ - 0x4C080000, // 0000 LDNIL R2 - 0x90020001, // 0001 SETMBR R0 K0 R1 - 0x90020202, // 0002 SETMBR R0 K1 R2 - 0x90020402, // 0003 SETMBR R0 K2 R2 - 0x90020602, // 0004 SETMBR R0 K3 R2 - 0x90020802, // 0005 SETMBR R0 K4 R2 - 0x90020A02, // 0006 SETMBR R0 K5 R2 - 0x90020C02, // 0007 SETMBR R0 K6 R2 - 0x90020E02, // 0008 SETMBR R0 K7 R2 - 0x80000000, // 0009 RET 0 + ( &(const binstruction[54]) { /* code */ + 0x88040100, // 0000 GETMBR R1 R0 K0 + 0x4C080000, // 0001 LDNIL R2 + 0x20040202, // 0002 NE R1 R1 R2 + 0x78060001, // 0003 JMPF R1 #0006 + 0x88040100, // 0004 GETMBR R1 R0 K0 + 0x70020000, // 0005 JMP #0007 + 0x58040001, // 0006 LDCONST R1 K1 + 0x540AFFFF, // 0007 LDINT R2 65536 + 0x28080202, // 0008 GE R2 R1 R2 + 0x740A0002, // 0009 JMPT R2 #000D + 0x14080301, // 000A LT R2 R1 K1 + 0x740A0000, // 000B JMPT R2 #000D + 0x50080001, // 000C LDBOOL R2 0 1 + 0x50080200, // 000D LDBOOL R2 1 0 + 0x580C0001, // 000E LDCONST R3 K1 + 0x88100102, // 000F GETMBR R4 R0 K2 + 0x4C140000, // 0010 LDNIL R5 + 0x20100805, // 0011 NE R4 R4 R5 + 0x78120006, // 0012 JMPF R4 #001A + 0x780A0002, // 0013 JMPF R2 #0017 + 0x54120008, // 0014 LDINT R4 9 + 0x80040800, // 0015 RET 1 R4 + 0x70020001, // 0016 JMP #0019 + 0x54120006, // 0017 LDINT R4 7 + 0x80040800, // 0018 RET 1 R4 + 0x7002001A, // 0019 JMP #0035 + 0x88100103, // 001A GETMBR R4 R0 K3 + 0x5415FFFE, // 001B LDINT R5 -1 + 0x1C100805, // 001C EQ R4 R4 R5 + 0x78120005, // 001D JMPF R4 #0024 + 0x780A0002, // 001E JMPF R2 #0022 + 0x54120004, // 001F LDINT R4 5 + 0x80040800, // 0020 RET 1 R4 + 0x70020000, // 0021 JMP #0023 + 0x80060800, // 0022 RET 1 K4 + 0x70020010, // 0023 JMP #0035 + 0x88100103, // 0024 GETMBR R4 R0 K3 + 0x4C140000, // 0025 LDNIL R5 + 0x20100805, // 0026 NE R4 R4 R5 + 0x78120005, // 0027 JMPF R4 #002E + 0x780A0002, // 0028 JMPF R2 #002C + 0x54120004, // 0029 LDINT R4 5 + 0x80040800, // 002A RET 1 R4 + 0x70020000, // 002B JMP #002D + 0x80060800, // 002C RET 1 K4 + 0x70020006, // 002D JMP #0035 + 0x88100105, // 002E GETMBR R4 R0 K5 + 0x4C140000, // 002F LDNIL R5 + 0x20100805, // 0030 NE R4 R4 R5 + 0x78120001, // 0031 JMPF R4 #0034 + 0x80060C00, // 0032 RET 1 K6 + 0x70020000, // 0033 JMP #0035 + 0x80060E00, // 0034 RET 1 K7 + 0x80000000, // 0035 RET 0 }) ) ); @@ -1020,411 +970,38 @@ be_local_closure(Matter_TLV_item_reset, /* name */ /******************************************************************** -** Solidified function: sort +** Solidified function: set ********************************************************************/ -be_local_closure(Matter_TLV_item_sort, /* name */ +be_local_closure(Matter_TLV_item_set, /* name */ be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 4, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_const_class(be_class_Matter_TLV_item), - /* K1 */ be_const_int(1), - /* K2 */ be_const_int(0), - /* K3 */ be_nested_str_weak(_cmp_gt), - /* K4 */ be_nested_str_weak(stop_iteration), - }), - be_str_weak(sort), - &be_const_str_solidified, - ( &(const binstruction[33]) { /* code */ - 0x58040000, // 0000 LDCONST R1 K0 - 0x60080010, // 0001 GETGBL R2 G16 - 0x600C000C, // 0002 GETGBL R3 G12 - 0x5C100000, // 0003 MOVE R4 R0 - 0x7C0C0200, // 0004 CALL R3 1 - 0x040C0701, // 0005 SUB R3 R3 K1 - 0x400E0203, // 0006 CONNECT R3 K1 R3 - 0x7C080200, // 0007 CALL R2 1 - 0xA8020013, // 0008 EXBLK 0 #001D - 0x5C0C0400, // 0009 MOVE R3 R2 - 0x7C0C0000, // 000A CALL R3 0 - 0x94100003, // 000B GETIDX R4 R0 R3 - 0x5C140600, // 000C MOVE R5 R3 - 0x24180B02, // 000D GT R6 R5 K2 - 0x781A000B, // 000E JMPF R6 #001B - 0x04180B01, // 000F SUB R6 R5 K1 - 0x94180006, // 0010 GETIDX R6 R0 R6 - 0x8C180D03, // 0011 GETMET R6 R6 K3 - 0x5C200800, // 0012 MOVE R8 R4 - 0x7C180400, // 0013 CALL R6 2 - 0x24180D02, // 0014 GT R6 R6 K2 - 0x781A0004, // 0015 JMPF R6 #001B - 0x04180B01, // 0016 SUB R6 R5 K1 - 0x94180006, // 0017 GETIDX R6 R0 R6 - 0x98000A06, // 0018 SETIDX R0 R5 R6 - 0x04140B01, // 0019 SUB R5 R5 K1 - 0x7001FFF1, // 001A JMP #000D - 0x98000A04, // 001B SETIDX R0 R5 R4 - 0x7001FFEB, // 001C JMP #0009 - 0x58080004, // 001D LDCONST R2 K4 - 0xAC080200, // 001E CATCH R2 1 0 - 0xB0080000, // 001F RAISE 2 R0 R0 - 0x80040000, // 0020 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_fulltag -********************************************************************/ -be_local_closure(Matter_TLV_item_set_fulltag, /* name */ - be_nested_proto( - 6, /* nstack */ - 4, /* argc */ + 5, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(tag_vendor), - /* K1 */ be_nested_str_weak(tag_profile), - /* K2 */ be_nested_str_weak(tag_number), - /* K3 */ be_nested_str_weak(tag_sub), + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(reset), + /* K1 */ be_nested_str_weak(typ), + /* K2 */ be_nested_str_weak(val), }), - be_str_weak(set_fulltag), + be_str_weak(set), &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x60100009, // 0000 GETGBL R4 G9 - 0x5C140200, // 0001 MOVE R5 R1 - 0x7C100200, // 0002 CALL R4 1 - 0x90020004, // 0003 SETMBR R0 K0 R4 - 0x60100009, // 0004 GETGBL R4 G9 - 0x5C140400, // 0005 MOVE R5 R2 - 0x7C100200, // 0006 CALL R4 1 - 0x90020204, // 0007 SETMBR R0 K1 R4 - 0x60100009, // 0008 GETGBL R4 G9 - 0x5C140600, // 0009 MOVE R5 R3 - 0x7C100200, // 000A CALL R4 1 - 0x90020404, // 000B SETMBR R0 K2 R4 - 0x4C100000, // 000C LDNIL R4 - 0x90020604, // 000D SETMBR R0 K3 R4 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_parent -********************************************************************/ -be_local_closure(Matter_TLV_item_set_parent, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parent), - }), - be_str_weak(set_parent), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Matter_TLV_item_tostring, /* name */ - be_nested_proto( - 7, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[34]) { /* constants */ - /* K0 */ be_nested_str_weak(), - /* K1 */ be_nested_str_weak(tag_profile), - /* K2 */ be_nested_str_weak(Matter_X3A_X3A), - /* K3 */ be_nested_str_weak(tag_number), - /* K4 */ be_nested_str_weak(0x_X2508X_X20), - /* K5 */ be_nested_str_weak(tag_vendor), - /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), - /* K7 */ be_nested_str_weak(0x_X2504X_X3A), - /* K8 */ be_nested_str_weak(tag_sub), - /* K9 */ be_nested_str_weak(_X25i_X20), - /* K10 */ be_const_int(0), - /* K11 */ be_nested_str_weak(_X3D_X20), - /* K12 */ be_nested_str_weak(val), - /* K13 */ be_nested_str_weak(int), - /* K14 */ be_nested_str_weak(_X25i), - /* K15 */ be_nested_str_weak(typ), - /* K16 */ be_nested_str_weak(TLV), - /* K17 */ be_nested_str_weak(U1), - /* K18 */ be_nested_str_weak(U8), - /* K19 */ be_nested_str_weak(U), - /* K20 */ be_nested_str_weak(bool), - /* K21 */ be_nested_str_weak(true), - /* K22 */ be_nested_str_weak(false), - /* K23 */ be_nested_str_weak(null), - /* K24 */ be_nested_str_weak(real), - /* K25 */ be_nested_str_weak(_X25g), - /* K26 */ be_nested_str_weak(string), - /* K27 */ be_nested_str_weak(_X22_X25s_X22), - /* K28 */ be_nested_str_weak(int64), - /* K29 */ be_nested_str_weak(tostring), - /* K30 */ be_nested_str_weak(instance), - /* K31 */ be_nested_str_weak(_X25s), - /* K32 */ be_nested_str_weak(tohex), - /* K33 */ be_nested_str_weak(_X20), - }), - be_str_weak(tostring), - &be_const_str_solidified, - ( &(const binstruction[167]) { /* code */ - 0x58080000, // 0000 LDCONST R2 K0 - 0xA802009C, // 0001 EXBLK 0 #009F - 0x500C0200, // 0002 LDBOOL R3 1 0 - 0x200C0203, // 0003 NE R3 R1 R3 - 0x780E0038, // 0004 JMPF R3 #003E - 0x880C0101, // 0005 GETMBR R3 R0 K1 - 0x5411FFFE, // 0006 LDINT R4 -1 - 0x1C0C0604, // 0007 EQ R3 R3 R4 - 0x780E000A, // 0008 JMPF R3 #0014 - 0x00080502, // 0009 ADD R2 R2 K2 - 0x880C0103, // 000A GETMBR R3 R0 K3 - 0x4C100000, // 000B LDNIL R4 - 0x200C0604, // 000C NE R3 R3 R4 - 0x780E0004, // 000D JMPF R3 #0013 - 0x600C0018, // 000E GETGBL R3 G24 - 0x58100004, // 000F LDCONST R4 K4 - 0x88140103, // 0010 GETMBR R5 R0 K3 - 0x7C0C0400, // 0011 CALL R3 2 - 0x00080403, // 0012 ADD R2 R2 R3 - 0x70020023, // 0013 JMP #0038 - 0x880C0105, // 0014 GETMBR R3 R0 K5 - 0x4C100000, // 0015 LDNIL R4 - 0x200C0604, // 0016 NE R3 R3 R4 - 0x780E0004, // 0017 JMPF R3 #001D - 0x600C0018, // 0018 GETGBL R3 G24 - 0x58100006, // 0019 LDCONST R4 K6 - 0x88140105, // 001A GETMBR R5 R0 K5 - 0x7C0C0400, // 001B CALL R3 2 - 0x00080403, // 001C ADD R2 R2 R3 - 0x880C0101, // 001D GETMBR R3 R0 K1 - 0x4C100000, // 001E LDNIL R4 - 0x200C0604, // 001F NE R3 R3 R4 - 0x780E0004, // 0020 JMPF R3 #0026 - 0x600C0018, // 0021 GETGBL R3 G24 - 0x58100007, // 0022 LDCONST R4 K7 - 0x88140101, // 0023 GETMBR R5 R0 K1 - 0x7C0C0400, // 0024 CALL R3 2 - 0x00080403, // 0025 ADD R2 R2 R3 - 0x880C0103, // 0026 GETMBR R3 R0 K3 - 0x4C100000, // 0027 LDNIL R4 - 0x200C0604, // 0028 NE R3 R3 R4 - 0x780E0004, // 0029 JMPF R3 #002F - 0x600C0018, // 002A GETGBL R3 G24 - 0x58100004, // 002B LDCONST R4 K4 - 0x88140103, // 002C GETMBR R5 R0 K3 - 0x7C0C0400, // 002D CALL R3 2 - 0x00080403, // 002E ADD R2 R2 R3 - 0x880C0108, // 002F GETMBR R3 R0 K8 - 0x4C100000, // 0030 LDNIL R4 - 0x200C0604, // 0031 NE R3 R3 R4 - 0x780E0004, // 0032 JMPF R3 #0038 - 0x600C0018, // 0033 GETGBL R3 G24 - 0x58100009, // 0034 LDCONST R4 K9 - 0x88140108, // 0035 GETMBR R5 R0 K8 - 0x7C0C0400, // 0036 CALL R3 2 - 0x00080403, // 0037 ADD R2 R2 R3 - 0x600C000C, // 0038 GETGBL R3 G12 - 0x5C100400, // 0039 MOVE R4 R2 - 0x7C0C0200, // 003A CALL R3 1 - 0x240C070A, // 003B GT R3 R3 K10 - 0x780E0000, // 003C JMPF R3 #003E - 0x0008050B, // 003D ADD R2 R2 K11 - 0x600C0004, // 003E GETGBL R3 G4 - 0x8810010C, // 003F GETMBR R4 R0 K12 - 0x7C0C0200, // 0040 CALL R3 1 - 0x1C0C070D, // 0041 EQ R3 R3 K13 - 0x780E0010, // 0042 JMPF R3 #0054 - 0x600C0018, // 0043 GETGBL R3 G24 - 0x5810000E, // 0044 LDCONST R4 K14 - 0x8814010C, // 0045 GETMBR R5 R0 K12 - 0x7C0C0400, // 0046 CALL R3 2 - 0x00080403, // 0047 ADD R2 R2 R3 - 0x880C010F, // 0048 GETMBR R3 R0 K15 - 0x88100110, // 0049 GETMBR R4 R0 K16 - 0x88100911, // 004A GETMBR R4 R4 K17 - 0x280C0604, // 004B GE R3 R3 R4 - 0x780E0005, // 004C JMPF R3 #0053 - 0x880C010F, // 004D GETMBR R3 R0 K15 - 0x88100110, // 004E GETMBR R4 R0 K16 - 0x88100912, // 004F GETMBR R4 R4 K18 - 0x180C0604, // 0050 LE R3 R3 R4 - 0x780E0000, // 0051 JMPF R3 #0053 - 0x00080513, // 0052 ADD R2 R2 K19 - 0x70020048, // 0053 JMP #009D - 0x600C0004, // 0054 GETGBL R3 G4 - 0x8810010C, // 0055 GETMBR R4 R0 K12 - 0x7C0C0200, // 0056 CALL R3 1 - 0x1C0C0714, // 0057 EQ R3 R3 K20 - 0x780E0006, // 0058 JMPF R3 #0060 - 0x880C010C, // 0059 GETMBR R3 R0 K12 - 0x780E0001, // 005A JMPF R3 #005D - 0x580C0015, // 005B LDCONST R3 K21 - 0x70020000, // 005C JMP #005E - 0x580C0016, // 005D LDCONST R3 K22 - 0x00080403, // 005E ADD R2 R2 R3 - 0x7002003C, // 005F JMP #009D - 0x880C010C, // 0060 GETMBR R3 R0 K12 - 0x4C100000, // 0061 LDNIL R4 - 0x1C0C0604, // 0062 EQ R3 R3 R4 - 0x780E0001, // 0063 JMPF R3 #0066 - 0x00080517, // 0064 ADD R2 R2 K23 - 0x70020036, // 0065 JMP #009D - 0x600C0004, // 0066 GETGBL R3 G4 - 0x8810010C, // 0067 GETMBR R4 R0 K12 - 0x7C0C0200, // 0068 CALL R3 1 - 0x1C0C0718, // 0069 EQ R3 R3 K24 - 0x780E0005, // 006A JMPF R3 #0071 - 0x600C0018, // 006B GETGBL R3 G24 - 0x58100019, // 006C LDCONST R4 K25 - 0x8814010C, // 006D GETMBR R5 R0 K12 - 0x7C0C0400, // 006E CALL R3 2 - 0x00080403, // 006F ADD R2 R2 R3 - 0x7002002B, // 0070 JMP #009D - 0x600C0004, // 0071 GETGBL R3 G4 - 0x8810010C, // 0072 GETMBR R4 R0 K12 - 0x7C0C0200, // 0073 CALL R3 1 - 0x1C0C071A, // 0074 EQ R3 R3 K26 - 0x780E0005, // 0075 JMPF R3 #007C - 0x600C0018, // 0076 GETGBL R3 G24 - 0x5810001B, // 0077 LDCONST R4 K27 - 0x8814010C, // 0078 GETMBR R5 R0 K12 - 0x7C0C0400, // 0079 CALL R3 2 - 0x00080403, // 007A ADD R2 R2 R3 - 0x70020020, // 007B JMP #009D - 0x600C000F, // 007C GETGBL R3 G15 - 0x8810010C, // 007D GETMBR R4 R0 K12 - 0xB8163800, // 007E GETNGBL R5 K28 - 0x7C0C0400, // 007F CALL R3 2 - 0x780E000F, // 0080 JMPF R3 #0091 - 0x880C010C, // 0081 GETMBR R3 R0 K12 - 0x8C0C071D, // 0082 GETMET R3 R3 K29 - 0x7C0C0200, // 0083 CALL R3 1 - 0x00080403, // 0084 ADD R2 R2 R3 - 0x880C010F, // 0085 GETMBR R3 R0 K15 - 0x88100110, // 0086 GETMBR R4 R0 K16 - 0x88100911, // 0087 GETMBR R4 R4 K17 - 0x280C0604, // 0088 GE R3 R3 R4 - 0x780E0005, // 0089 JMPF R3 #0090 - 0x880C010F, // 008A GETMBR R3 R0 K15 - 0x88100110, // 008B GETMBR R4 R0 K16 - 0x88100912, // 008C GETMBR R4 R4 K18 - 0x180C0604, // 008D LE R3 R3 R4 - 0x780E0000, // 008E JMPF R3 #0090 - 0x00080513, // 008F ADD R2 R2 K19 - 0x7002000B, // 0090 JMP #009D - 0x600C0004, // 0091 GETGBL R3 G4 - 0x8810010C, // 0092 GETMBR R4 R0 K12 - 0x7C0C0200, // 0093 CALL R3 1 - 0x1C0C071E, // 0094 EQ R3 R3 K30 - 0x780E0006, // 0095 JMPF R3 #009D - 0x600C0018, // 0096 GETGBL R3 G24 - 0x5810001F, // 0097 LDCONST R4 K31 - 0x8814010C, // 0098 GETMBR R5 R0 K12 - 0x8C140B20, // 0099 GETMET R5 R5 K32 - 0x7C140200, // 009A CALL R5 1 - 0x7C0C0400, // 009B CALL R3 2 - 0x00080403, // 009C ADD R2 R2 R3 - 0xA8040001, // 009D EXBLK 1 1 - 0x70020006, // 009E JMP #00A6 - 0xAC0C0002, // 009F CATCH R3 0 2 - 0x70020003, // 00A0 JMP #00A5 - 0x00140721, // 00A1 ADD R5 R3 K33 - 0x00140A04, // 00A2 ADD R5 R5 R4 - 0x80040A00, // 00A3 RET 1 R5 - 0x70020000, // 00A4 JMP #00A6 - 0xB0080000, // 00A5 RAISE 2 R0 R0 - 0x80040400, // 00A6 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: set_anonymoustag -********************************************************************/ -be_local_closure(Matter_TLV_item_set_anonymoustag, /* name */ - be_nested_proto( - 3, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(set_fulltag), - }), - be_str_weak(set_anonymoustag), - &be_const_str_solidified, - ( &(const binstruction[ 3]) { /* code */ - 0x8C040100, // 0000 GETMET R1 R0 K0 - 0x7C040200, // 0001 CALL R1 1 - 0x80000000, // 0002 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(Matter_TLV_item_init, /* name */ - be_nested_proto( - 2, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 1]) { /* constants */ - /* K0 */ be_nested_str_weak(parent), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[ 2]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x80000000, // 0001 RET 0 + ( &(const binstruction[12]) { /* code */ + 0x8C0C0100, // 0000 GETMET R3 R0 K0 + 0x7C0C0200, // 0001 CALL R3 1 + 0x4C0C0000, // 0002 LDNIL R3 + 0x200C0403, // 0003 NE R3 R2 R3 + 0x740E0002, // 0004 JMPT R3 #0008 + 0x540E0013, // 0005 LDINT R3 20 + 0x1C0C0203, // 0006 EQ R3 R1 R3 + 0x780E0002, // 0007 JMPF R3 #000B + 0x90020201, // 0008 SETMBR R0 K1 R1 + 0x90020402, // 0009 SETMBR R0 K2 R2 + 0x80040000, // 000A RET 1 R0 + 0x80000000, // 000B RET 0 }) ) ); @@ -1866,11 +1443,11 @@ be_local_closure(Matter_TLV_item_tlv2raw, /* name */ /******************************************************************** -** Solidified function: _encode_tag_len +** Solidified function: set_anonymoustag ********************************************************************/ -be_local_closure(Matter_TLV_item__encode_tag_len, /* name */ +be_local_closure(Matter_TLV_item_set_anonymoustag, /* name */ be_nested_proto( - 6, /* nstack */ + 3, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -1878,73 +1455,508 @@ be_local_closure(Matter_TLV_item__encode_tag_len, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 8]) { /* constants */ + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(set_fulltag), + }), + be_str_weak(set_anonymoustag), + &be_const_str_solidified, + ( &(const binstruction[ 3]) { /* code */ + 0x8C040100, // 0000 GETMET R1 R0 K0 + 0x7C040200, // 0001 CALL R1 1 + 0x80000000, // 0002 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _cmp_gt +********************************************************************/ +be_local_closure(Matter_TLV_item__cmp_gt, /* name */ + be_nested_proto( + 4, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 6]) { /* constants */ + /* K0 */ be_nested_str_weak(tag_vendor), + /* K1 */ be_const_int(1), + /* K2 */ be_nested_str_weak(tag_profile), + /* K3 */ be_const_int(0), + /* K4 */ be_nested_str_weak(tag_number), + /* K5 */ be_nested_str_weak(tag_sub), + }), + be_str_weak(_cmp_gt), + &be_const_str_solidified, + ( &(const binstruction[72]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0012, // 0003 JMPF R2 #0017 + 0x88080300, // 0004 GETMBR R2 R1 K0 + 0x4C0C0000, // 0005 LDNIL R3 + 0x1C080403, // 0006 EQ R2 R2 R3 + 0x780A0000, // 0007 JMPF R2 #0009 + 0x80060200, // 0008 RET 1 K1 + 0x88080100, // 0009 GETMBR R2 R0 K0 + 0x880C0300, // 000A GETMBR R3 R1 K0 + 0x24080403, // 000B GT R2 R2 R3 + 0x780A0000, // 000C JMPF R2 #000E + 0x80060200, // 000D RET 1 K1 + 0x88080100, // 000E GETMBR R2 R0 K0 + 0x880C0300, // 000F GETMBR R3 R1 K0 + 0x1C080403, // 0010 EQ R2 R2 R3 + 0x780A0004, // 0011 JMPF R2 #0017 + 0x88080102, // 0012 GETMBR R2 R0 K2 + 0x880C0302, // 0013 GETMBR R3 R1 K2 + 0x24080403, // 0014 GT R2 R2 R3 + 0x780A0000, // 0015 JMPF R2 #0017 + 0x80060200, // 0016 RET 1 K1 + 0x88080102, // 0017 GETMBR R2 R0 K2 + 0x540DFFFE, // 0018 LDINT R3 -1 + 0x1C080403, // 0019 EQ R2 R2 R3 + 0x780A0005, // 001A JMPF R2 #0021 + 0x88080302, // 001B GETMBR R2 R1 K2 + 0x4C0C0000, // 001C LDNIL R3 + 0x1C080403, // 001D EQ R2 R2 R3 + 0x780A0000, // 001E JMPF R2 #0020 + 0x80060200, // 001F RET 1 K1 + 0x70020008, // 0020 JMP #002A + 0x88080102, // 0021 GETMBR R2 R0 K2 + 0x4C0C0000, // 0022 LDNIL R3 + 0x1C080403, // 0023 EQ R2 R2 R3 + 0x780A0004, // 0024 JMPF R2 #002A + 0x88080302, // 0025 GETMBR R2 R1 K2 + 0x540DFFFE, // 0026 LDINT R3 -1 + 0x1C080403, // 0027 EQ R2 R2 R3 + 0x780A0000, // 0028 JMPF R2 #002A + 0x80060600, // 0029 RET 1 K3 + 0x88080104, // 002A GETMBR R2 R0 K4 + 0x4C0C0000, // 002B LDNIL R3 + 0x20080403, // 002C NE R2 R2 R3 + 0x780A000A, // 002D JMPF R2 #0039 + 0x88080304, // 002E GETMBR R2 R1 K4 + 0x4C0C0000, // 002F LDNIL R3 + 0x1C080403, // 0030 EQ R2 R2 R3 + 0x780A0000, // 0031 JMPF R2 #0033 + 0x80060200, // 0032 RET 1 K1 + 0x88080104, // 0033 GETMBR R2 R0 K4 + 0x880C0304, // 0034 GETMBR R3 R1 K4 + 0x24080403, // 0035 GT R2 R2 R3 + 0x780A0000, // 0036 JMPF R2 #0038 + 0x80060200, // 0037 RET 1 K1 + 0x80060600, // 0038 RET 1 K3 + 0x88080105, // 0039 GETMBR R2 R0 K5 + 0x4C0C0000, // 003A LDNIL R3 + 0x20080403, // 003B NE R2 R2 R3 + 0x780A0009, // 003C JMPF R2 #0047 + 0x88080305, // 003D GETMBR R2 R1 K5 + 0x4C0C0000, // 003E LDNIL R3 + 0x1C080403, // 003F EQ R2 R2 R3 + 0x780A0000, // 0040 JMPF R2 #0042 + 0x80060200, // 0041 RET 1 K1 + 0x88080105, // 0042 GETMBR R2 R0 K5 + 0x880C0305, // 0043 GETMBR R3 R1 K5 + 0x24080403, // 0044 GT R2 R2 R3 + 0x780A0000, // 0045 JMPF R2 #0047 + 0x80060200, // 0046 RET 1 K1 + 0x80060600, // 0047 RET 1 K3 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: _encode_tag +********************************************************************/ +be_local_closure(Matter_TLV_item__encode_tag, /* name */ + be_nested_proto( + 9, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 9]) { /* constants */ /* K0 */ be_nested_str_weak(tag_number), /* K1 */ be_const_int(0), /* K2 */ be_nested_str_weak(tag_vendor), - /* K3 */ be_nested_str_weak(tag_profile), - /* K4 */ be_const_int(3), - /* K5 */ be_nested_str_weak(tag_sub), + /* K3 */ be_nested_str_weak(add), + /* K4 */ be_nested_str_weak(typ), + /* K5 */ be_const_int(1), /* K6 */ be_const_int(2), - /* K7 */ be_const_int(1), + /* K7 */ be_nested_str_weak(tag_profile), + /* K8 */ be_nested_str_weak(tag_sub), }), - be_str_weak(_encode_tag_len), + be_str_weak(_encode_tag), &be_const_str_solidified, - ( &(const binstruction[54]) { /* code */ - 0x88040100, // 0000 GETMBR R1 R0 K0 - 0x4C080000, // 0001 LDNIL R2 - 0x20040202, // 0002 NE R1 R1 R2 - 0x78060001, // 0003 JMPF R1 #0006 - 0x88040100, // 0004 GETMBR R1 R0 K0 + ( &(const binstruction[133]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x4C0C0000, // 0001 LDNIL R3 + 0x20080403, // 0002 NE R2 R2 R3 + 0x780A0001, // 0003 JMPF R2 #0006 + 0x88080100, // 0004 GETMBR R2 R0 K0 0x70020000, // 0005 JMP #0007 - 0x58040001, // 0006 LDCONST R1 K1 - 0x540AFFFF, // 0007 LDINT R2 65536 - 0x28080202, // 0008 GE R2 R1 R2 - 0x740A0002, // 0009 JMPT R2 #000D - 0x14080301, // 000A LT R2 R1 K1 - 0x740A0000, // 000B JMPT R2 #000D - 0x50080001, // 000C LDBOOL R2 0 1 - 0x50080200, // 000D LDBOOL R2 1 0 - 0x580C0001, // 000E LDCONST R3 K1 - 0x88100102, // 000F GETMBR R4 R0 K2 - 0x4C140000, // 0010 LDNIL R5 - 0x20100805, // 0011 NE R4 R4 R5 - 0x78120006, // 0012 JMPF R4 #001A - 0x780A0002, // 0013 JMPF R2 #0017 - 0x54120008, // 0014 LDINT R4 9 - 0x80040800, // 0015 RET 1 R4 - 0x70020001, // 0016 JMP #0019 - 0x54120006, // 0017 LDINT R4 7 - 0x80040800, // 0018 RET 1 R4 - 0x7002001A, // 0019 JMP #0035 - 0x88100103, // 001A GETMBR R4 R0 K3 - 0x5415FFFE, // 001B LDINT R5 -1 - 0x1C100805, // 001C EQ R4 R4 R5 - 0x78120005, // 001D JMPF R4 #0024 - 0x780A0002, // 001E JMPF R2 #0022 - 0x54120004, // 001F LDINT R4 5 - 0x80040800, // 0020 RET 1 R4 - 0x70020000, // 0021 JMP #0023 - 0x80060800, // 0022 RET 1 K4 - 0x70020010, // 0023 JMP #0035 - 0x88100103, // 0024 GETMBR R4 R0 K3 - 0x4C140000, // 0025 LDNIL R5 - 0x20100805, // 0026 NE R4 R4 R5 - 0x78120005, // 0027 JMPF R4 #002E - 0x780A0002, // 0028 JMPF R2 #002C - 0x54120004, // 0029 LDINT R4 5 - 0x80040800, // 002A RET 1 R4 - 0x70020000, // 002B JMP #002D - 0x80060800, // 002C RET 1 K4 - 0x70020006, // 002D JMP #0035 - 0x88100105, // 002E GETMBR R4 R0 K5 - 0x4C140000, // 002F LDNIL R5 - 0x20100805, // 0030 NE R4 R4 R5 - 0x78120001, // 0031 JMPF R4 #0034 - 0x80060C00, // 0032 RET 1 K6 - 0x70020000, // 0033 JMP #0035 - 0x80060E00, // 0034 RET 1 K7 - 0x80000000, // 0035 RET 0 + 0x58080001, // 0006 LDCONST R2 K1 + 0x540EFFFF, // 0007 LDINT R3 65536 + 0x280C0403, // 0008 GE R3 R2 R3 + 0x740E0002, // 0009 JMPT R3 #000D + 0x140C0501, // 000A LT R3 R2 K1 + 0x740E0000, // 000B JMPT R3 #000D + 0x500C0001, // 000C LDBOOL R3 0 1 + 0x500C0200, // 000D LDBOOL R3 1 0 + 0x58100001, // 000E LDCONST R4 K1 + 0x88140102, // 000F GETMBR R5 R0 K2 + 0x4C180000, // 0010 LDNIL R6 + 0x20140A06, // 0011 NE R5 R5 R6 + 0x78160026, // 0012 JMPF R5 #003A + 0x780E0012, // 0013 JMPF R3 #0027 + 0x8C140303, // 0014 GETMET R5 R1 K3 + 0x541E00DF, // 0015 LDINT R7 224 + 0x88200104, // 0016 GETMBR R8 R0 K4 + 0x001C0E08, // 0017 ADD R7 R7 R8 + 0x58200005, // 0018 LDCONST R8 K5 + 0x7C140600, // 0019 CALL R5 3 + 0x8C140303, // 001A GETMET R5 R1 K3 + 0x881C0102, // 001B GETMBR R7 R0 K2 + 0x58200006, // 001C LDCONST R8 K6 + 0x7C140600, // 001D CALL R5 3 + 0x8C140303, // 001E GETMET R5 R1 K3 + 0x881C0107, // 001F GETMBR R7 R0 K7 + 0x58200006, // 0020 LDCONST R8 K6 + 0x7C140600, // 0021 CALL R5 3 + 0x8C140303, // 0022 GETMET R5 R1 K3 + 0x881C0100, // 0023 GETMBR R7 R0 K0 + 0x54220003, // 0024 LDINT R8 4 + 0x7C140600, // 0025 CALL R5 3 + 0x70020011, // 0026 JMP #0039 + 0x8C140303, // 0027 GETMET R5 R1 K3 + 0x541E00BF, // 0028 LDINT R7 192 + 0x88200104, // 0029 GETMBR R8 R0 K4 + 0x001C0E08, // 002A ADD R7 R7 R8 + 0x58200005, // 002B LDCONST R8 K5 + 0x7C140600, // 002C CALL R5 3 + 0x8C140303, // 002D GETMET R5 R1 K3 + 0x881C0102, // 002E GETMBR R7 R0 K2 + 0x58200006, // 002F LDCONST R8 K6 + 0x7C140600, // 0030 CALL R5 3 + 0x8C140303, // 0031 GETMET R5 R1 K3 + 0x881C0107, // 0032 GETMBR R7 R0 K7 + 0x58200006, // 0033 LDCONST R8 K6 + 0x7C140600, // 0034 CALL R5 3 + 0x8C140303, // 0035 GETMET R5 R1 K3 + 0x881C0100, // 0036 GETMBR R7 R0 K0 + 0x58200006, // 0037 LDCONST R8 K6 + 0x7C140600, // 0038 CALL R5 3 + 0x70020049, // 0039 JMP #0084 + 0x88140107, // 003A GETMBR R5 R0 K7 + 0x5419FFFE, // 003B LDINT R6 -1 + 0x1C140A06, // 003C EQ R5 R5 R6 + 0x78160016, // 003D JMPF R5 #0055 + 0x780E000A, // 003E JMPF R3 #004A + 0x8C140303, // 003F GETMET R5 R1 K3 + 0x541E005F, // 0040 LDINT R7 96 + 0x88200104, // 0041 GETMBR R8 R0 K4 + 0x001C0E08, // 0042 ADD R7 R7 R8 + 0x58200005, // 0043 LDCONST R8 K5 + 0x7C140600, // 0044 CALL R5 3 + 0x8C140303, // 0045 GETMET R5 R1 K3 + 0x881C0100, // 0046 GETMBR R7 R0 K0 + 0x54220003, // 0047 LDINT R8 4 + 0x7C140600, // 0048 CALL R5 3 + 0x70020009, // 0049 JMP #0054 + 0x8C140303, // 004A GETMET R5 R1 K3 + 0x541E003F, // 004B LDINT R7 64 + 0x88200104, // 004C GETMBR R8 R0 K4 + 0x001C0E08, // 004D ADD R7 R7 R8 + 0x58200005, // 004E LDCONST R8 K5 + 0x7C140600, // 004F CALL R5 3 + 0x8C140303, // 0050 GETMET R5 R1 K3 + 0x881C0100, // 0051 GETMBR R7 R0 K0 + 0x58200006, // 0052 LDCONST R8 K6 + 0x7C140600, // 0053 CALL R5 3 + 0x7002002E, // 0054 JMP #0084 + 0x88140107, // 0055 GETMBR R5 R0 K7 + 0x4C180000, // 0056 LDNIL R6 + 0x20140A06, // 0057 NE R5 R5 R6 + 0x78160016, // 0058 JMPF R5 #0070 + 0x780E000A, // 0059 JMPF R3 #0065 + 0x8C140303, // 005A GETMET R5 R1 K3 + 0x541E009F, // 005B LDINT R7 160 + 0x88200104, // 005C GETMBR R8 R0 K4 + 0x001C0E08, // 005D ADD R7 R7 R8 + 0x58200005, // 005E LDCONST R8 K5 + 0x7C140600, // 005F CALL R5 3 + 0x8C140303, // 0060 GETMET R5 R1 K3 + 0x881C0100, // 0061 GETMBR R7 R0 K0 + 0x54220003, // 0062 LDINT R8 4 + 0x7C140600, // 0063 CALL R5 3 + 0x70020009, // 0064 JMP #006F + 0x8C140303, // 0065 GETMET R5 R1 K3 + 0x541E007F, // 0066 LDINT R7 128 + 0x88200104, // 0067 GETMBR R8 R0 K4 + 0x001C0E08, // 0068 ADD R7 R7 R8 + 0x58200005, // 0069 LDCONST R8 K5 + 0x7C140600, // 006A CALL R5 3 + 0x8C140303, // 006B GETMET R5 R1 K3 + 0x881C0100, // 006C GETMBR R7 R0 K0 + 0x58200006, // 006D LDCONST R8 K6 + 0x7C140600, // 006E CALL R5 3 + 0x70020013, // 006F JMP #0084 + 0x88140108, // 0070 GETMBR R5 R0 K8 + 0x4C180000, // 0071 LDNIL R6 + 0x20140A06, // 0072 NE R5 R5 R6 + 0x7816000A, // 0073 JMPF R5 #007F + 0x8C140303, // 0074 GETMET R5 R1 K3 + 0x541E001F, // 0075 LDINT R7 32 + 0x88200104, // 0076 GETMBR R8 R0 K4 + 0x001C0E08, // 0077 ADD R7 R7 R8 + 0x58200005, // 0078 LDCONST R8 K5 + 0x7C140600, // 0079 CALL R5 3 + 0x8C140303, // 007A GETMET R5 R1 K3 + 0x881C0108, // 007B GETMBR R7 R0 K8 + 0x58200005, // 007C LDCONST R8 K5 + 0x7C140600, // 007D CALL R5 3 + 0x70020004, // 007E JMP #0084 + 0x8C140303, // 007F GETMET R5 R1 K3 + 0x881C0104, // 0080 GETMBR R7 R0 K4 + 0x001E0207, // 0081 ADD R7 K1 R7 + 0x58200005, // 0082 LDCONST R8 K5 + 0x7C140600, // 0083 CALL R5 3 + 0x80000000, // 0084 RET 0 + }) + ) +); +/*******************************************************************/ + + +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(Matter_TLV_item_tostring, /* name */ + be_nested_proto( + 7, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[34]) { /* constants */ + /* K0 */ be_nested_str_weak(), + /* K1 */ be_nested_str_weak(tag_profile), + /* K2 */ be_nested_str_weak(Matter_X3A_X3A), + /* K3 */ be_nested_str_weak(tag_number), + /* K4 */ be_nested_str_weak(0x_X2508X_X20), + /* K5 */ be_nested_str_weak(tag_vendor), + /* K6 */ be_nested_str_weak(0x_X2504X_X3A_X3A), + /* K7 */ be_nested_str_weak(0x_X2504X_X3A), + /* K8 */ be_nested_str_weak(tag_sub), + /* K9 */ be_nested_str_weak(_X25i_X20), + /* K10 */ be_const_int(0), + /* K11 */ be_nested_str_weak(_X3D_X20), + /* K12 */ be_nested_str_weak(val), + /* K13 */ be_nested_str_weak(int), + /* K14 */ be_nested_str_weak(_X25i), + /* K15 */ be_nested_str_weak(typ), + /* K16 */ be_nested_str_weak(TLV), + /* K17 */ be_nested_str_weak(U1), + /* K18 */ be_nested_str_weak(U8), + /* K19 */ be_nested_str_weak(U), + /* K20 */ be_nested_str_weak(bool), + /* K21 */ be_nested_str_weak(true), + /* K22 */ be_nested_str_weak(false), + /* K23 */ be_nested_str_weak(null), + /* K24 */ be_nested_str_weak(real), + /* K25 */ be_nested_str_weak(_X25g), + /* K26 */ be_nested_str_weak(string), + /* K27 */ be_nested_str_weak(_X22_X25s_X22), + /* K28 */ be_nested_str_weak(int64), + /* K29 */ be_nested_str_weak(tostring), + /* K30 */ be_nested_str_weak(instance), + /* K31 */ be_nested_str_weak(_X25s), + /* K32 */ be_nested_str_weak(tohex), + /* K33 */ be_nested_str_weak(_X20), + }), + be_str_weak(tostring), + &be_const_str_solidified, + ( &(const binstruction[167]) { /* code */ + 0x58080000, // 0000 LDCONST R2 K0 + 0xA802009C, // 0001 EXBLK 0 #009F + 0x500C0200, // 0002 LDBOOL R3 1 0 + 0x200C0203, // 0003 NE R3 R1 R3 + 0x780E0038, // 0004 JMPF R3 #003E + 0x880C0101, // 0005 GETMBR R3 R0 K1 + 0x5411FFFE, // 0006 LDINT R4 -1 + 0x1C0C0604, // 0007 EQ R3 R3 R4 + 0x780E000A, // 0008 JMPF R3 #0014 + 0x00080502, // 0009 ADD R2 R2 K2 + 0x880C0103, // 000A GETMBR R3 R0 K3 + 0x4C100000, // 000B LDNIL R4 + 0x200C0604, // 000C NE R3 R3 R4 + 0x780E0004, // 000D JMPF R3 #0013 + 0x600C0018, // 000E GETGBL R3 G24 + 0x58100004, // 000F LDCONST R4 K4 + 0x88140103, // 0010 GETMBR R5 R0 K3 + 0x7C0C0400, // 0011 CALL R3 2 + 0x00080403, // 0012 ADD R2 R2 R3 + 0x70020023, // 0013 JMP #0038 + 0x880C0105, // 0014 GETMBR R3 R0 K5 + 0x4C100000, // 0015 LDNIL R4 + 0x200C0604, // 0016 NE R3 R3 R4 + 0x780E0004, // 0017 JMPF R3 #001D + 0x600C0018, // 0018 GETGBL R3 G24 + 0x58100006, // 0019 LDCONST R4 K6 + 0x88140105, // 001A GETMBR R5 R0 K5 + 0x7C0C0400, // 001B CALL R3 2 + 0x00080403, // 001C ADD R2 R2 R3 + 0x880C0101, // 001D GETMBR R3 R0 K1 + 0x4C100000, // 001E LDNIL R4 + 0x200C0604, // 001F NE R3 R3 R4 + 0x780E0004, // 0020 JMPF R3 #0026 + 0x600C0018, // 0021 GETGBL R3 G24 + 0x58100007, // 0022 LDCONST R4 K7 + 0x88140101, // 0023 GETMBR R5 R0 K1 + 0x7C0C0400, // 0024 CALL R3 2 + 0x00080403, // 0025 ADD R2 R2 R3 + 0x880C0103, // 0026 GETMBR R3 R0 K3 + 0x4C100000, // 0027 LDNIL R4 + 0x200C0604, // 0028 NE R3 R3 R4 + 0x780E0004, // 0029 JMPF R3 #002F + 0x600C0018, // 002A GETGBL R3 G24 + 0x58100004, // 002B LDCONST R4 K4 + 0x88140103, // 002C GETMBR R5 R0 K3 + 0x7C0C0400, // 002D CALL R3 2 + 0x00080403, // 002E ADD R2 R2 R3 + 0x880C0108, // 002F GETMBR R3 R0 K8 + 0x4C100000, // 0030 LDNIL R4 + 0x200C0604, // 0031 NE R3 R3 R4 + 0x780E0004, // 0032 JMPF R3 #0038 + 0x600C0018, // 0033 GETGBL R3 G24 + 0x58100009, // 0034 LDCONST R4 K9 + 0x88140108, // 0035 GETMBR R5 R0 K8 + 0x7C0C0400, // 0036 CALL R3 2 + 0x00080403, // 0037 ADD R2 R2 R3 + 0x600C000C, // 0038 GETGBL R3 G12 + 0x5C100400, // 0039 MOVE R4 R2 + 0x7C0C0200, // 003A CALL R3 1 + 0x240C070A, // 003B GT R3 R3 K10 + 0x780E0000, // 003C JMPF R3 #003E + 0x0008050B, // 003D ADD R2 R2 K11 + 0x600C0004, // 003E GETGBL R3 G4 + 0x8810010C, // 003F GETMBR R4 R0 K12 + 0x7C0C0200, // 0040 CALL R3 1 + 0x1C0C070D, // 0041 EQ R3 R3 K13 + 0x780E0010, // 0042 JMPF R3 #0054 + 0x600C0018, // 0043 GETGBL R3 G24 + 0x5810000E, // 0044 LDCONST R4 K14 + 0x8814010C, // 0045 GETMBR R5 R0 K12 + 0x7C0C0400, // 0046 CALL R3 2 + 0x00080403, // 0047 ADD R2 R2 R3 + 0x880C010F, // 0048 GETMBR R3 R0 K15 + 0x88100110, // 0049 GETMBR R4 R0 K16 + 0x88100911, // 004A GETMBR R4 R4 K17 + 0x280C0604, // 004B GE R3 R3 R4 + 0x780E0005, // 004C JMPF R3 #0053 + 0x880C010F, // 004D GETMBR R3 R0 K15 + 0x88100110, // 004E GETMBR R4 R0 K16 + 0x88100912, // 004F GETMBR R4 R4 K18 + 0x180C0604, // 0050 LE R3 R3 R4 + 0x780E0000, // 0051 JMPF R3 #0053 + 0x00080513, // 0052 ADD R2 R2 K19 + 0x70020048, // 0053 JMP #009D + 0x600C0004, // 0054 GETGBL R3 G4 + 0x8810010C, // 0055 GETMBR R4 R0 K12 + 0x7C0C0200, // 0056 CALL R3 1 + 0x1C0C0714, // 0057 EQ R3 R3 K20 + 0x780E0006, // 0058 JMPF R3 #0060 + 0x880C010C, // 0059 GETMBR R3 R0 K12 + 0x780E0001, // 005A JMPF R3 #005D + 0x580C0015, // 005B LDCONST R3 K21 + 0x70020000, // 005C JMP #005E + 0x580C0016, // 005D LDCONST R3 K22 + 0x00080403, // 005E ADD R2 R2 R3 + 0x7002003C, // 005F JMP #009D + 0x880C010C, // 0060 GETMBR R3 R0 K12 + 0x4C100000, // 0061 LDNIL R4 + 0x1C0C0604, // 0062 EQ R3 R3 R4 + 0x780E0001, // 0063 JMPF R3 #0066 + 0x00080517, // 0064 ADD R2 R2 K23 + 0x70020036, // 0065 JMP #009D + 0x600C0004, // 0066 GETGBL R3 G4 + 0x8810010C, // 0067 GETMBR R4 R0 K12 + 0x7C0C0200, // 0068 CALL R3 1 + 0x1C0C0718, // 0069 EQ R3 R3 K24 + 0x780E0005, // 006A JMPF R3 #0071 + 0x600C0018, // 006B GETGBL R3 G24 + 0x58100019, // 006C LDCONST R4 K25 + 0x8814010C, // 006D GETMBR R5 R0 K12 + 0x7C0C0400, // 006E CALL R3 2 + 0x00080403, // 006F ADD R2 R2 R3 + 0x7002002B, // 0070 JMP #009D + 0x600C0004, // 0071 GETGBL R3 G4 + 0x8810010C, // 0072 GETMBR R4 R0 K12 + 0x7C0C0200, // 0073 CALL R3 1 + 0x1C0C071A, // 0074 EQ R3 R3 K26 + 0x780E0005, // 0075 JMPF R3 #007C + 0x600C0018, // 0076 GETGBL R3 G24 + 0x5810001B, // 0077 LDCONST R4 K27 + 0x8814010C, // 0078 GETMBR R5 R0 K12 + 0x7C0C0400, // 0079 CALL R3 2 + 0x00080403, // 007A ADD R2 R2 R3 + 0x70020020, // 007B JMP #009D + 0x600C000F, // 007C GETGBL R3 G15 + 0x8810010C, // 007D GETMBR R4 R0 K12 + 0xB8163800, // 007E GETNGBL R5 K28 + 0x7C0C0400, // 007F CALL R3 2 + 0x780E000F, // 0080 JMPF R3 #0091 + 0x880C010C, // 0081 GETMBR R3 R0 K12 + 0x8C0C071D, // 0082 GETMET R3 R3 K29 + 0x7C0C0200, // 0083 CALL R3 1 + 0x00080403, // 0084 ADD R2 R2 R3 + 0x880C010F, // 0085 GETMBR R3 R0 K15 + 0x88100110, // 0086 GETMBR R4 R0 K16 + 0x88100911, // 0087 GETMBR R4 R4 K17 + 0x280C0604, // 0088 GE R3 R3 R4 + 0x780E0005, // 0089 JMPF R3 #0090 + 0x880C010F, // 008A GETMBR R3 R0 K15 + 0x88100110, // 008B GETMBR R4 R0 K16 + 0x88100912, // 008C GETMBR R4 R4 K18 + 0x180C0604, // 008D LE R3 R3 R4 + 0x780E0000, // 008E JMPF R3 #0090 + 0x00080513, // 008F ADD R2 R2 K19 + 0x7002000B, // 0090 JMP #009D + 0x600C0004, // 0091 GETGBL R3 G4 + 0x8810010C, // 0092 GETMBR R4 R0 K12 + 0x7C0C0200, // 0093 CALL R3 1 + 0x1C0C071E, // 0094 EQ R3 R3 K30 + 0x780E0006, // 0095 JMPF R3 #009D + 0x600C0018, // 0096 GETGBL R3 G24 + 0x5810001F, // 0097 LDCONST R4 K31 + 0x8814010C, // 0098 GETMBR R5 R0 K12 + 0x8C140B20, // 0099 GETMET R5 R5 K32 + 0x7C140200, // 009A CALL R5 1 + 0x7C0C0400, // 009B CALL R3 2 + 0x00080403, // 009C ADD R2 R2 R3 + 0xA8040001, // 009D EXBLK 1 1 + 0x70020006, // 009E JMP #00A6 + 0xAC0C0002, // 009F CATCH R3 0 2 + 0x70020003, // 00A0 JMP #00A5 + 0x00140721, // 00A1 ADD R5 R3 K33 + 0x00140A04, // 00A2 ADD R5 R5 R4 + 0x80040A00, // 00A3 RET 1 R5 + 0x70020000, // 00A4 JMP #00A6 + 0xB0080000, // 00A5 RAISE 2 R0 R0 + 0x80040400, // 00A6 RET 1 R2 }) ) ); @@ -1983,38 +1995,26 @@ be_local_closure(Matter_TLV_item_set_commonprofile, /* name */ /******************************************************************** -** Solidified function: set +** Solidified function: init ********************************************************************/ -be_local_closure(Matter_TLV_item_set, /* name */ +be_local_closure(Matter_TLV_item_init, /* name */ be_nested_proto( - 5, /* nstack */ - 3, /* argc */ + 2, /* nstack */ + 2, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(reset), - /* K1 */ be_nested_str_weak(typ), - /* K2 */ be_nested_str_weak(val), + ( &(const bvalue[ 1]) { /* constants */ + /* K0 */ be_nested_str_weak(parent), }), - be_str_weak(set), + be_str_weak(init), &be_const_str_solidified, - ( &(const binstruction[12]) { /* code */ - 0x8C0C0100, // 0000 GETMET R3 R0 K0 - 0x7C0C0200, // 0001 CALL R3 1 - 0x4C0C0000, // 0002 LDNIL R3 - 0x200C0403, // 0003 NE R3 R2 R3 - 0x740E0002, // 0004 JMPT R3 #0008 - 0x540E0013, // 0005 LDINT R3 20 - 0x1C0C0203, // 0006 EQ R3 R1 R3 - 0x780E0002, // 0007 JMPF R3 #000B - 0x90020201, // 0008 SETMBR R0 K1 R1 - 0x90020402, // 0009 SETMBR R0 K2 R2 - 0x80040000, // 000A RET 1 R0 - 0x80000000, // 000B RET 0 + ( &(const binstruction[ 2]) { /* code */ + 0x90020001, // 0000 SETMBR R0 K0 R1 + 0x80000000, // 0001 RET 0 }) ) ); @@ -2027,36 +2027,39 @@ be_local_closure(Matter_TLV_item_set, /* name */ be_local_class(Matter_TLV_item, 8, NULL, - be_nested_map(28, + be_nested_map(31, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(parent, -1), be_const_var(0) }, - { be_const_key_weak(TLV, 0), be_const_class(be_class_Matter_TLV) }, - { be_const_key_weak(tag_sub, -1), be_const_var(5) }, - { be_const_key_weak(encode_len, -1), be_const_closure(Matter_TLV_item_encode_len_closure) }, - { be_const_key_weak(val, 5), be_const_var(7) }, - { be_const_key_weak(_cmp_gt, -1), be_const_closure(Matter_TLV_item__cmp_gt_closure) }, - { be_const_key_weak(create_TLV, -1), be_const_static_closure(Matter_TLV_item_create_TLV_closure) }, - { be_const_key_weak(reset, -1), be_const_closure(Matter_TLV_item_reset_closure) }, - { be_const_key_weak(to_str_val, 6), be_const_closure(Matter_TLV_item_to_str_val_closure) }, - { be_const_key_weak(to_TLV, -1), be_const_closure(Matter_TLV_item_to_TLV_closure) }, - { be_const_key_weak(_encode_tag_len, -1), be_const_closure(Matter_TLV_item__encode_tag_len_closure) }, - { be_const_key_weak(set_contextspecific, -1), be_const_closure(Matter_TLV_item_set_contextspecific_closure) }, - { be_const_key_weak(parse, 7), be_const_closure(Matter_TLV_item_parse_closure) }, - { be_const_key_weak(set_anonymoustag, -1), be_const_closure(Matter_TLV_item_set_anonymoustag_closure) }, - { be_const_key_weak(tlv2raw, -1), be_const_closure(Matter_TLV_item_tlv2raw_closure) }, - { be_const_key_weak(set_fulltag, 10), be_const_closure(Matter_TLV_item_set_fulltag_closure) }, + { be_const_key_weak(is_array, 17), be_const_bool(0) }, + { be_const_key_weak(init, -1), be_const_closure(Matter_TLV_item_init_closure) }, { be_const_key_weak(set_parent, -1), be_const_closure(Matter_TLV_item_set_parent_closure) }, - { be_const_key_weak(tag_profile, 23), be_const_var(3) }, + { be_const_key_weak(set_fulltag, -1), be_const_closure(Matter_TLV_item_set_fulltag_closure) }, { be_const_key_weak(typ, -1), be_const_var(6) }, - { be_const_key_weak(_encode_tag, 20), be_const_closure(Matter_TLV_item__encode_tag_closure) }, - { be_const_key_weak(init, 13), be_const_closure(Matter_TLV_item_init_closure) }, - { be_const_key_weak(sort, 14), be_const_static_closure(Matter_TLV_item_sort_closure) }, + { be_const_key_weak(parse, 30), be_const_closure(Matter_TLV_item_parse_closure) }, + { be_const_key_weak(parent, 22), be_const_var(0) }, + { be_const_key_weak(to_str_val, -1), be_const_closure(Matter_TLV_item_to_str_val_closure) }, + { be_const_key_weak(encode_len, 4), be_const_closure(Matter_TLV_item_encode_len_closure) }, + { be_const_key_weak(TLV, 20), be_const_class(be_class_Matter_TLV) }, + { be_const_key_weak(reset, 0), be_const_closure(Matter_TLV_item_reset_closure) }, + { be_const_key_weak(tag_profile, -1), be_const_var(3) }, + { be_const_key_weak(create_TLV, -1), be_const_static_closure(Matter_TLV_item_create_TLV_closure) }, + { be_const_key_weak(tag_sub, -1), be_const_var(5) }, { be_const_key_weak(tag_vendor, -1), be_const_var(2) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_item_tostring_closure) }, - { be_const_key_weak(next_idx, -1), be_const_var(1) }, - { be_const_key_weak(tag_number, -1), be_const_var(4) }, - { be_const_key_weak(set_commonprofile, -1), be_const_closure(Matter_TLV_item_set_commonprofile_closure) }, + { be_const_key_weak(val, 5), be_const_var(7) }, + { be_const_key_weak(_encode_tag, -1), be_const_closure(Matter_TLV_item__encode_tag_closure) }, + { be_const_key_weak(_cmp_gt, -1), be_const_closure(Matter_TLV_item__cmp_gt_closure) }, + { be_const_key_weak(_encode_tag_len, 25), be_const_closure(Matter_TLV_item__encode_tag_len_closure) }, + { be_const_key_weak(is_struct, -1), be_const_bool(0) }, + { be_const_key_weak(tlv2raw, -1), be_const_closure(Matter_TLV_item_tlv2raw_closure) }, + { be_const_key_weak(sort, -1), be_const_static_closure(Matter_TLV_item_sort_closure) }, + { be_const_key_weak(is_list, -1), be_const_bool(0) }, + { be_const_key_weak(to_TLV, 18), be_const_closure(Matter_TLV_item_to_TLV_closure) }, { be_const_key_weak(set, -1), be_const_closure(Matter_TLV_item_set_closure) }, + { be_const_key_weak(set_anonymoustag, 15), be_const_closure(Matter_TLV_item_set_anonymoustag_closure) }, + { be_const_key_weak(set_commonprofile, -1), be_const_closure(Matter_TLV_item_set_commonprofile_closure) }, + { be_const_key_weak(tag_number, -1), be_const_var(4) }, + { be_const_key_weak(next_idx, 1), be_const_var(1) }, + { be_const_key_weak(set_contextspecific, -1), be_const_closure(Matter_TLV_item_set_contextspecific_closure) }, })), be_str_weak(Matter_TLV_item) ); @@ -2503,55 +2506,6 @@ be_local_closure(Matter_TLV_list_item, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: add_obj -********************************************************************/ -be_local_closure(Matter_TLV_list_add_obj, /* name */ - be_nested_proto( - 7, /* nstack */ - 3, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 4]) { /* constants */ - /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(push), - /* K2 */ be_nested_str_weak(to_TLV), - /* K3 */ be_nested_str_weak(tag_sub), - }), - be_str_weak(add_obj), - &be_const_str_solidified, - ( &(const binstruction[21]) { /* code */ - 0x4C0C0000, // 0000 LDNIL R3 - 0x200C0403, // 0001 NE R3 R2 R3 - 0x780E0010, // 0002 JMPF R3 #0014 - 0x600C000F, // 0003 GETGBL R3 G15 - 0x5C100400, // 0004 MOVE R4 R2 - 0x60140015, // 0005 GETGBL R5 G21 - 0x7C0C0400, // 0006 CALL R3 2 - 0x780E0004, // 0007 JMPF R3 #000D - 0x880C0100, // 0008 GETMBR R3 R0 K0 - 0x8C0C0701, // 0009 GETMET R3 R3 K1 - 0x5C140400, // 000A MOVE R5 R2 - 0x7C0C0400, // 000B CALL R3 2 - 0x70020006, // 000C JMP #0014 - 0x8C0C0502, // 000D GETMET R3 R2 K2 - 0x7C0C0200, // 000E CALL R3 1 - 0x900E0601, // 000F SETMBR R3 K3 R1 - 0x88100100, // 0010 GETMBR R4 R0 K0 - 0x8C100901, // 0011 GETMET R4 R4 K1 - 0x5C180600, // 0012 MOVE R6 R3 - 0x7C100400, // 0013 CALL R4 2 - 0x80040000, // 0014 RET 1 R0 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified function: getsubval ********************************************************************/ @@ -2619,11 +2573,11 @@ be_local_closure(Matter_TLV_list_getsub, /* name */ /******************************************************************** -** Solidified function: findsub +** Solidified function: add_obj ********************************************************************/ -be_local_closure(Matter_TLV_list_findsub, /* name */ +be_local_closure(Matter_TLV_list_add_obj, /* name */ be_nested_proto( - 6, /* nstack */ + 7, /* nstack */ 3, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -2631,30 +2585,36 @@ be_local_closure(Matter_TLV_list_findsub, /* name */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ + ( &(const bvalue[ 4]) { /* constants */ /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(tag_sub), - /* K2 */ be_nested_str_weak(stop_iteration), + /* K1 */ be_nested_str_weak(push), + /* K2 */ be_nested_str_weak(to_TLV), + /* K3 */ be_nested_str_weak(tag_sub), }), - be_str_weak(findsub), + be_str_weak(add_obj), &be_const_str_solidified, - ( &(const binstruction[16]) { /* code */ - 0x600C0010, // 0000 GETGBL R3 G16 - 0x88100100, // 0001 GETMBR R4 R0 K0 - 0x7C0C0200, // 0002 CALL R3 1 - 0xA8020007, // 0003 EXBLK 0 #000C - 0x5C100600, // 0004 MOVE R4 R3 - 0x7C100000, // 0005 CALL R4 0 - 0x88140901, // 0006 GETMBR R5 R4 K1 - 0x1C140A01, // 0007 EQ R5 R5 R1 - 0x78160001, // 0008 JMPF R5 #000B - 0xA8040001, // 0009 EXBLK 1 1 - 0x80040800, // 000A RET 1 R4 - 0x7001FFF7, // 000B JMP #0004 - 0x580C0002, // 000C LDCONST R3 K2 - 0xAC0C0200, // 000D CATCH R3 1 0 - 0xB0080000, // 000E RAISE 2 R0 R0 - 0x80040400, // 000F RET 1 R2 + ( &(const binstruction[21]) { /* code */ + 0x4C0C0000, // 0000 LDNIL R3 + 0x200C0403, // 0001 NE R3 R2 R3 + 0x780E0010, // 0002 JMPF R3 #0014 + 0x600C000F, // 0003 GETGBL R3 G15 + 0x5C100400, // 0004 MOVE R4 R2 + 0x60140015, // 0005 GETGBL R5 G21 + 0x7C0C0400, // 0006 CALL R3 2 + 0x780E0004, // 0007 JMPF R3 #000D + 0x880C0100, // 0008 GETMBR R3 R0 K0 + 0x8C0C0701, // 0009 GETMET R3 R3 K1 + 0x5C140400, // 000A MOVE R5 R2 + 0x7C0C0400, // 000B CALL R3 2 + 0x70020006, // 000C JMP #0014 + 0x8C0C0502, // 000D GETMET R3 R2 K2 + 0x7C0C0200, // 000E CALL R3 1 + 0x900E0601, // 000F SETMBR R3 K3 R1 + 0x88100100, // 0010 GETMBR R4 R0 K0 + 0x8C100901, // 0011 GETMET R4 R4 K1 + 0x5C180600, // 0012 MOVE R6 R3 + 0x7C100400, // 0013 CALL R4 2 + 0x80040000, // 0014 RET 1 R0 }) ) ); @@ -2753,30 +2713,42 @@ be_local_closure(Matter_TLV_list_add_array, /* name */ /******************************************************************** -** Solidified function: push +** Solidified function: findsub ********************************************************************/ -be_local_closure(Matter_TLV_list_push, /* name */ +be_local_closure(Matter_TLV_list_findsub, /* name */ be_nested_proto( - 5, /* nstack */ - 2, /* argc */ + 6, /* nstack */ + 3, /* argc */ 2, /* varg */ 0, /* has upvals */ NULL, /* no upvals */ 0, /* has sup protos */ NULL, /* no sub protos */ 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ + ( &(const bvalue[ 3]) { /* constants */ /* K0 */ be_nested_str_weak(val), - /* K1 */ be_nested_str_weak(push), + /* K1 */ be_nested_str_weak(tag_sub), + /* K2 */ be_nested_str_weak(stop_iteration), }), - be_str_weak(push), + be_str_weak(findsub), &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 + ( &(const binstruction[16]) { /* code */ + 0x600C0010, // 0000 GETGBL R3 G16 + 0x88100100, // 0001 GETMBR R4 R0 K0 + 0x7C0C0200, // 0002 CALL R3 1 + 0xA8020007, // 0003 EXBLK 0 #000C + 0x5C100600, // 0004 MOVE R4 R3 + 0x7C100000, // 0005 CALL R4 0 + 0x88140901, // 0006 GETMBR R5 R4 K1 + 0x1C140A01, // 0007 EQ R5 R5 R1 + 0x78160001, // 0008 JMPF R5 #000B + 0xA8040001, // 0009 EXBLK 1 1 + 0x80040800, // 000A RET 1 R4 + 0x7001FFF7, // 000B JMP #0004 + 0x580C0002, // 000C LDCONST R3 K2 + 0xAC0C0200, // 000D CATCH R3 1 0 + 0xB0080000, // 000E RAISE 2 R0 R0 + 0x80040400, // 000F RET 1 R2 }) ) ); @@ -2910,6 +2882,37 @@ be_local_closure(Matter_TLV_list_tostring_inner, /* name */ /*******************************************************************/ +/******************************************************************** +** Solidified function: push +********************************************************************/ +be_local_closure(Matter_TLV_list_push, /* name */ + be_nested_proto( + 5, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 2]) { /* constants */ + /* K0 */ be_nested_str_weak(val), + /* K1 */ be_nested_str_weak(push), + }), + be_str_weak(push), + &be_const_str_solidified, + ( &(const binstruction[ 5]) { /* code */ + 0x88080100, // 0000 GETMBR R2 R0 K0 + 0x8C080501, // 0001 GETMET R2 R2 K1 + 0x5C100200, // 0002 MOVE R4 R1 + 0x7C080400, // 0003 CALL R2 2 + 0x80000000, // 0004 RET 0 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: findsubtyp ********************************************************************/ @@ -3001,27 +3004,27 @@ be_local_class(Matter_TLV_list, &be_class_Matter_TLV_item, be_nested_map(22, ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(encode_len, 14), be_const_closure(Matter_TLV_list_encode_len_closure) }, + { be_const_key_weak(encode_len, 7), be_const_closure(Matter_TLV_list_encode_len_closure) }, { be_const_key_weak(tlv2raw, -1), be_const_closure(Matter_TLV_list_tlv2raw_closure) }, - { be_const_key_weak(to_str_val, 19), be_const_closure(Matter_TLV_list_to_str_val_closure) }, - { be_const_key_weak(findsubval, 7), be_const_closure(Matter_TLV_list_findsubval_closure) }, + { be_const_key_weak(to_str_val, 14), be_const_closure(Matter_TLV_list_to_str_val_closure) }, + { be_const_key_weak(findsubval, 5), be_const_closure(Matter_TLV_list_findsubval_closure) }, { be_const_key_weak(size, -1), be_const_closure(Matter_TLV_list_size_closure) }, - { be_const_key_weak(is_struct, -1), be_const_bool(0) }, - { be_const_key_weak(add_struct, 20), be_const_closure(Matter_TLV_list_add_struct_closure) }, { be_const_key_weak(findsubtyp, 21), be_const_closure(Matter_TLV_list_findsubtyp_closure) }, + { be_const_key_weak(add_struct, 19), be_const_closure(Matter_TLV_list_add_struct_closure) }, + { be_const_key_weak(push, -1), be_const_closure(Matter_TLV_list_push_closure) }, { be_const_key_weak(parse, -1), be_const_closure(Matter_TLV_list_parse_closure) }, { be_const_key_weak(init, 0), be_const_closure(Matter_TLV_list_init_closure) }, { be_const_key_weak(item, -1), be_const_closure(Matter_TLV_list_item_closure) }, { be_const_key_weak(tostring_inner, -1), be_const_closure(Matter_TLV_list_tostring_inner_closure) }, - { be_const_key_weak(getsubval, -1), be_const_closure(Matter_TLV_list_getsubval_closure) }, - { be_const_key_weak(getsub, 5), be_const_closure(Matter_TLV_list_getsub_closure) }, - { be_const_key_weak(push, -1), be_const_closure(Matter_TLV_list_push_closure) }, + { be_const_key_weak(getsubval, 20), be_const_closure(Matter_TLV_list_getsubval_closure) }, + { be_const_key_weak(getsub, -1), be_const_closure(Matter_TLV_list_getsub_closure) }, + { be_const_key_weak(findsub, -1), be_const_closure(Matter_TLV_list_findsub_closure) }, { be_const_key_weak(add_list, 17), be_const_closure(Matter_TLV_list_add_list_closure) }, { be_const_key_weak(add_array, -1), be_const_closure(Matter_TLV_list_add_array_closure) }, { be_const_key_weak(add_TLV, -1), be_const_closure(Matter_TLV_list_add_TLV_closure) }, { be_const_key_weak(setitem, 11), be_const_closure(Matter_TLV_list_setitem_closure) }, - { be_const_key_weak(findsub, -1), be_const_closure(Matter_TLV_list_findsub_closure) }, { be_const_key_weak(add_obj, -1), be_const_closure(Matter_TLV_list_add_obj_closure) }, + { be_const_key_weak(is_list, -1), be_const_bool(1) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_list_tostring_closure) }, })), be_str_weak(Matter_TLV_list) @@ -3036,6 +3039,40 @@ void be_load_Matter_TLV_list_class(bvm *vm) { extern const bclass be_class_Matter_TLV_struct; +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(Matter_TLV_struct_tostring, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tostring_inner), + /* K1 */ be_nested_str_weak(_X7B), + /* K2 */ be_nested_str_weak(_X7D), + }), + be_str_weak(tostring), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x50100200, // 0001 LDBOOL R4 1 0 + 0x58140001, // 0002 LDCONST R5 K1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x7C080A00, // 0005 CALL R2 5 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -3078,40 +3115,6 @@ be_local_closure(Matter_TLV_struct_init, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Matter_TLV_struct_tostring, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tostring_inner), - /* K1 */ be_nested_str_weak(_X7B), - /* K2 */ be_nested_str_weak(_X7D), - }), - be_str_weak(tostring), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x50100200, // 0001 LDBOOL R4 1 0 - 0x58140001, // 0002 LDCONST R5 K1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x7C080A00, // 0005 CALL R2 5 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_TLV_struct ********************************************************************/ @@ -3119,11 +3122,12 @@ extern const bclass be_class_Matter_TLV_list; be_local_class(Matter_TLV_struct, 0, &be_class_Matter_TLV_list, - be_nested_map(3, + be_nested_map(4, ( (struct bmapnode*) &(const bmapnode[]) { { be_const_key_weak(init, -1), be_const_closure(Matter_TLV_struct_init_closure) }, { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_struct_tostring_closure) }, - { be_const_key_weak(is_struct, -1), be_const_bool(1) }, + { be_const_key_weak(is_list, -1), be_const_bool(0) }, + { be_const_key_weak(is_struct, 0), be_const_bool(1) }, })), be_str_weak(Matter_TLV_struct) ); @@ -3137,6 +3141,40 @@ void be_load_Matter_TLV_struct_class(bvm *vm) { extern const bclass be_class_Matter_TLV_array; +/******************************************************************** +** Solidified function: tostring +********************************************************************/ +be_local_closure(Matter_TLV_array_tostring, /* name */ + be_nested_proto( + 8, /* nstack */ + 2, /* argc */ + 2, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[ 3]) { /* constants */ + /* K0 */ be_nested_str_weak(tostring_inner), + /* K1 */ be_nested_str_weak(_X5B), + /* K2 */ be_nested_str_weak(_X5D), + }), + be_str_weak(tostring), + &be_const_str_solidified, + ( &(const binstruction[ 7]) { /* code */ + 0x8C080100, // 0000 GETMET R2 R0 K0 + 0x50100000, // 0001 LDBOOL R4 0 0 + 0x58140001, // 0002 LDCONST R5 K1 + 0x58180002, // 0003 LDCONST R6 K2 + 0x5C1C0200, // 0004 MOVE R7 R1 + 0x7C080A00, // 0005 CALL R2 5 + 0x80040400, // 0006 RET 1 R2 + }) + ) +); +/*******************************************************************/ + + /******************************************************************** ** Solidified function: init ********************************************************************/ @@ -3242,40 +3280,6 @@ be_local_closure(Matter_TLV_array_parse, /* name */ /*******************************************************************/ -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(Matter_TLV_array_tostring, /* name */ - be_nested_proto( - 8, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 3]) { /* constants */ - /* K0 */ be_nested_str_weak(tostring_inner), - /* K1 */ be_nested_str_weak(_X5B), - /* K2 */ be_nested_str_weak(_X5D), - }), - be_str_weak(tostring), - &be_const_str_solidified, - ( &(const binstruction[ 7]) { /* code */ - 0x8C080100, // 0000 GETMET R2 R0 K0 - 0x50100000, // 0001 LDBOOL R4 0 0 - 0x58140001, // 0002 LDCONST R5 K1 - 0x58180002, // 0003 LDCONST R6 K2 - 0x5C1C0200, // 0004 MOVE R7 R1 - 0x7C080A00, // 0005 CALL R2 5 - 0x80040400, // 0006 RET 1 R2 - }) - ) -); -/*******************************************************************/ - - /******************************************************************** ** Solidified class: Matter_TLV_array ********************************************************************/ @@ -3283,11 +3287,13 @@ extern const bclass be_class_Matter_TLV_list; be_local_class(Matter_TLV_array, 0, &be_class_Matter_TLV_list, - be_nested_map(3, + be_nested_map(5, ( (struct bmapnode*) &(const bmapnode[]) { + { be_const_key_weak(tostring, 1), be_const_closure(Matter_TLV_array_tostring_closure) }, { be_const_key_weak(init, -1), be_const_closure(Matter_TLV_array_init_closure) }, - { be_const_key_weak(parse, 2), be_const_closure(Matter_TLV_array_parse_closure) }, - { be_const_key_weak(tostring, -1), be_const_closure(Matter_TLV_array_tostring_closure) }, + { be_const_key_weak(parse, 3), be_const_closure(Matter_TLV_array_parse_closure) }, + { be_const_key_weak(is_list, -1), be_const_bool(0) }, + { be_const_key_weak(is_array, -1), be_const_bool(1) }, })), be_str_weak(Matter_TLV_array) ); From 1587bf5ba78bb25ccaa6fbab74ca66632ea9c2cd Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Fri, 4 Aug 2023 09:13:20 +0200 Subject: [PATCH 125/150] Matter fix auto-configuration Relay indices (#19255) --- CHANGELOG.md | 1 + .../src/embedded/Matter_Device.be | 12 +- .../src/solidify/solidified_Matter_Device.h | 213 +++++++++--------- 3 files changed, 113 insertions(+), 113 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 286d1a90b..595238950 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ All notable changes to this project will be documented in this file. - Fade would fail when the difference between start and target would be too small (#19248) - Inverted shutter (#19243) - Matter support for large atribute responses +- Matter fix auto-configuration Relay indices ### Removed diff --git a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be index 95ef1a7dd..d272c4061 100644 --- a/lib/libesp32/berry_matter/src/embedded/Matter_Device.be +++ b/lib/libesp32/berry_matter/src/embedded/Matter_Device.be @@ -1152,13 +1152,13 @@ class Matter_Device if !r_st13.contains(k) break end # no more SHTxxx var d = r_st13[k] tasmota.log(format("MTR: '%s' = %s", k, str(d)), 3) - var relay1 = d.find('Relay1', 0) - 1 # relay base 0 or -1 if none - var relay2 = d.find('Relay2', 0) - 1 # relay base 0 or -1 if none + var relay1 = d.find('Relay1', -1) # relay base 1 or -1 if none + var relay2 = d.find('Relay2', -1) # relay base 1 or -1 if none - if relay1 >= 0 relays_reserved.push(relay1) end # mark relay1/2 as non-relays - if relay2 >= 0 relays_reserved.push(relay2) end + if relay1 > 0 relays_reserved.push(relay1 - 1) end # mark relay1/2 as non-relays + if relay2 > 0 relays_reserved.push(relay2 - 1) end - tasmota.log(format("MTR: relay1 = %s, relay2 = %s", relay1, relay2), 3) + tasmota.log(f"MTR: {relay1=} {relay2=}", 3) # is there tilt support var tilt_array = d.find('TiltConfig') var tilt_config = tilt_array && (tilt_array[2] > 0) @@ -1177,7 +1177,7 @@ class Matter_Device while relay_index < relay_count if relays_reserved.find(relay_index) == nil # if relay is actual relay - m[str(endpoint)] = {'type':'relay','relay':relay_index} + m[str(endpoint)] = {'type':'relay','relay':relay_index + 1} # Relay index start with 1 endpoint += 1 end relay_index += 1 diff --git a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h index b7ae567eb..32377c2c9 100644 --- a/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h +++ b/lib/libesp32/berry_matter/src/solidify/solidified_Matter_Device.h @@ -3101,7 +3101,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ /* K23 */ be_nested_str_weak(Relay1), /* K24 */ be_nested_str_weak(Relay2), /* K25 */ be_nested_str_weak(push), - /* K26 */ be_nested_str_weak(MTR_X3A_X20relay1_X20_X3D_X20_X25s_X2C_X20relay2_X20_X3D_X20_X25s), + /* K26 */ be_nested_str_weak(MTR_X3A_X20relay1_X3D_X25s_X20relay2_X3D_X25s), /* K27 */ be_nested_str_weak(TiltConfig), /* K28 */ be_nested_str_weak(shutter_X2Btilt), /* K29 */ be_nested_str_weak(shutter), @@ -3114,7 +3114,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ }), be_str_weak(autoconf_device_map), &be_const_str_solidified, - ( &(const binstruction[199]) { /* code */ + ( &(const binstruction[198]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x60080013, // 0001 GETGBL R2 G19 0x7C080000, // 0002 CALL R2 0 @@ -3180,15 +3180,15 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x7C240600, // 003E CALL R9 3 0x4C240000, // 003F LDNIL R9 0x20240E09, // 0040 NE R9 R7 R9 - 0x78260051, // 0041 JMPF R9 #0094 + 0x7826004F, // 0041 JMPF R9 #0092 0x8C240F13, // 0042 GETMET R9 R7 K19 0x582C0014, // 0043 LDCONST R11 K20 0x7C240400, // 0044 CALL R9 2 - 0x7826004D, // 0045 JMPF R9 #0094 + 0x7826004B, // 0045 JMPF R9 #0092 0x941C0F14, // 0046 GETIDX R7 R7 K20 0x58240007, // 0047 LDCONST R9 K7 0x50280200, // 0048 LDBOOL R10 1 0 - 0x782A0049, // 0049 JMPF R10 #0094 + 0x782A0047, // 0049 JMPF R10 #0092 0x60280008, // 004A GETGBL R10 G8 0x5C2C1200, // 004B MOVE R11 R9 0x7C280200, // 004C CALL R10 1 @@ -3197,7 +3197,7 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x5C341400, // 004F MOVE R13 R10 0x7C2C0400, // 0050 CALL R11 2 0x742E0000, // 0051 JMPT R11 #0053 - 0x70020040, // 0052 JMP #0094 + 0x7002003E, // 0052 JMP #0092 0x942C0E0A, // 0053 GETIDX R11 R7 R10 0xB8321A00, // 0054 GETNGBL R12 K13 0x8C301910, // 0055 GETMET R12 R12 K16 @@ -3212,108 +3212,107 @@ be_local_closure(Matter_Device_autoconf_device_map, /* name */ 0x7C300600, // 005E CALL R12 3 0x8C301704, // 005F GETMET R12 R11 K4 0x58380017, // 0060 LDCONST R14 K23 - 0x583C0007, // 0061 LDCONST R15 K7 + 0x543DFFFE, // 0061 LDINT R15 -1 0x7C300600, // 0062 CALL R12 3 - 0x04301901, // 0063 SUB R12 R12 K1 - 0x8C341704, // 0064 GETMET R13 R11 K4 - 0x583C0018, // 0065 LDCONST R15 K24 - 0x58400007, // 0066 LDCONST R16 K7 - 0x7C340600, // 0067 CALL R13 3 - 0x04341B01, // 0068 SUB R13 R13 K1 - 0x28381907, // 0069 GE R14 R12 K7 - 0x783A0002, // 006A JMPF R14 #006E - 0x8C381119, // 006B GETMET R14 R8 K25 - 0x5C401800, // 006C MOVE R16 R12 - 0x7C380400, // 006D CALL R14 2 - 0x28381B07, // 006E GE R14 R13 K7 - 0x783A0002, // 006F JMPF R14 #0073 - 0x8C381119, // 0070 GETMET R14 R8 K25 - 0x5C401A00, // 0071 MOVE R16 R13 - 0x7C380400, // 0072 CALL R14 2 - 0xB83A1A00, // 0073 GETNGBL R14 K13 - 0x8C381D10, // 0074 GETMET R14 R14 K16 - 0x60400018, // 0075 GETGBL R16 G24 - 0x5844001A, // 0076 LDCONST R17 K26 - 0x5C481800, // 0077 MOVE R18 R12 - 0x5C4C1A00, // 0078 MOVE R19 R13 - 0x7C400600, // 0079 CALL R16 3 - 0x58440012, // 007A LDCONST R17 K18 - 0x7C380600, // 007B CALL R14 3 - 0x8C381704, // 007C GETMET R14 R11 K4 - 0x5840001B, // 007D LDCONST R16 K27 - 0x7C380400, // 007E CALL R14 2 - 0x783A0002, // 007F JMPF R14 #0083 - 0x943C1D0A, // 0080 GETIDX R15 R14 K10 - 0x243C1F07, // 0081 GT R15 R15 K7 - 0x743E0000, // 0082 JMPT R15 #0084 - 0x503C0001, // 0083 LDBOOL R15 0 1 - 0x503C0200, // 0084 LDBOOL R15 1 0 - 0x60400008, // 0085 GETGBL R16 G8 - 0x5C440600, // 0086 MOVE R17 R3 - 0x7C400200, // 0087 CALL R16 1 - 0x60440013, // 0088 GETGBL R17 G19 - 0x7C440000, // 0089 CALL R17 0 - 0x783E0001, // 008A JMPF R15 #008D - 0x5848001C, // 008B LDCONST R18 K28 - 0x70020000, // 008C JMP #008E - 0x5848001D, // 008D LDCONST R18 K29 - 0x98461012, // 008E SETIDX R17 K8 R18 - 0x98463A09, // 008F SETIDX R17 K29 R9 - 0x98082011, // 0090 SETIDX R2 R16 R17 - 0x000C0701, // 0091 ADD R3 R3 K1 - 0x00241301, // 0092 ADD R9 R9 K1 - 0x7001FFB3, // 0093 JMP #0048 - 0x6024000C, // 0094 GETGBL R9 G12 - 0xB82A1A00, // 0095 GETNGBL R10 K13 - 0x8C28151E, // 0096 GETMET R10 R10 K30 - 0x7C280200, // 0097 CALL R10 1 - 0x7C240200, // 0098 CALL R9 1 - 0x58280007, // 0099 LDCONST R10 K7 - 0x78120000, // 009A JMPF R4 #009C - 0x04241301, // 009B SUB R9 R9 K1 - 0x142C1409, // 009C LT R11 R10 R9 - 0x782E0010, // 009D JMPF R11 #00AF - 0x8C2C1104, // 009E GETMET R11 R8 K4 - 0x5C341400, // 009F MOVE R13 R10 - 0x7C2C0400, // 00A0 CALL R11 2 - 0x4C300000, // 00A1 LDNIL R12 - 0x1C2C160C, // 00A2 EQ R11 R11 R12 - 0x782E0008, // 00A3 JMPF R11 #00AD - 0x602C0008, // 00A4 GETGBL R11 G8 - 0x5C300600, // 00A5 MOVE R12 R3 - 0x7C2C0200, // 00A6 CALL R11 1 - 0x60300013, // 00A7 GETGBL R12 G19 - 0x7C300000, // 00A8 CALL R12 0 - 0x9832111F, // 00A9 SETIDX R12 K8 K31 - 0x98323E0A, // 00AA SETIDX R12 K31 R10 - 0x9808160C, // 00AB SETIDX R2 R11 R12 - 0x000C0701, // 00AC ADD R3 R3 K1 - 0x00281501, // 00AD ADD R10 R10 K1 - 0x7001FFEC, // 00AE JMP #009C - 0x8C2C0320, // 00AF GETMET R11 R1 K32 - 0xB8361A00, // 00B0 GETNGBL R13 K13 - 0x8C341B21, // 00B1 GETMET R13 R13 K33 - 0x7C340200, // 00B2 CALL R13 1 - 0x7C2C0400, // 00B3 CALL R11 2 - 0x8C300122, // 00B4 GETMET R12 R0 K34 - 0x5C381600, // 00B5 MOVE R14 R11 - 0x7C300400, // 00B6 CALL R12 2 - 0x60340010, // 00B7 GETGBL R13 G16 - 0x5C381800, // 00B8 MOVE R14 R12 - 0x7C340200, // 00B9 CALL R13 1 - 0xA8020007, // 00BA EXBLK 0 #00C3 - 0x5C381A00, // 00BB MOVE R14 R13 - 0x7C380000, // 00BC CALL R14 0 - 0x603C0008, // 00BD GETGBL R15 G8 - 0x5C400600, // 00BE MOVE R16 R3 - 0x7C3C0200, // 00BF CALL R15 1 - 0x98081E0E, // 00C0 SETIDX R2 R15 R14 - 0x000C0701, // 00C1 ADD R3 R3 K1 - 0x7001FFF7, // 00C2 JMP #00BB - 0x58340023, // 00C3 LDCONST R13 K35 - 0xAC340200, // 00C4 CATCH R13 1 0 - 0xB0080000, // 00C5 RAISE 2 R0 R0 - 0x80040400, // 00C6 RET 1 R2 + 0x8C341704, // 0063 GETMET R13 R11 K4 + 0x583C0018, // 0064 LDCONST R15 K24 + 0x5441FFFE, // 0065 LDINT R16 -1 + 0x7C340600, // 0066 CALL R13 3 + 0x24381907, // 0067 GT R14 R12 K7 + 0x783A0002, // 0068 JMPF R14 #006C + 0x8C381119, // 0069 GETMET R14 R8 K25 + 0x04401901, // 006A SUB R16 R12 K1 + 0x7C380400, // 006B CALL R14 2 + 0x24381B07, // 006C GT R14 R13 K7 + 0x783A0002, // 006D JMPF R14 #0071 + 0x8C381119, // 006E GETMET R14 R8 K25 + 0x04401B01, // 006F SUB R16 R13 K1 + 0x7C380400, // 0070 CALL R14 2 + 0xB83A1A00, // 0071 GETNGBL R14 K13 + 0x8C381D10, // 0072 GETMET R14 R14 K16 + 0x60400018, // 0073 GETGBL R16 G24 + 0x5844001A, // 0074 LDCONST R17 K26 + 0x5C481800, // 0075 MOVE R18 R12 + 0x5C4C1A00, // 0076 MOVE R19 R13 + 0x7C400600, // 0077 CALL R16 3 + 0x58440012, // 0078 LDCONST R17 K18 + 0x7C380600, // 0079 CALL R14 3 + 0x8C381704, // 007A GETMET R14 R11 K4 + 0x5840001B, // 007B LDCONST R16 K27 + 0x7C380400, // 007C CALL R14 2 + 0x783A0002, // 007D JMPF R14 #0081 + 0x943C1D0A, // 007E GETIDX R15 R14 K10 + 0x243C1F07, // 007F GT R15 R15 K7 + 0x743E0000, // 0080 JMPT R15 #0082 + 0x503C0001, // 0081 LDBOOL R15 0 1 + 0x503C0200, // 0082 LDBOOL R15 1 0 + 0x60400008, // 0083 GETGBL R16 G8 + 0x5C440600, // 0084 MOVE R17 R3 + 0x7C400200, // 0085 CALL R16 1 + 0x60440013, // 0086 GETGBL R17 G19 + 0x7C440000, // 0087 CALL R17 0 + 0x783E0001, // 0088 JMPF R15 #008B + 0x5848001C, // 0089 LDCONST R18 K28 + 0x70020000, // 008A JMP #008C + 0x5848001D, // 008B LDCONST R18 K29 + 0x98461012, // 008C SETIDX R17 K8 R18 + 0x98463A09, // 008D SETIDX R17 K29 R9 + 0x98082011, // 008E SETIDX R2 R16 R17 + 0x000C0701, // 008F ADD R3 R3 K1 + 0x00241301, // 0090 ADD R9 R9 K1 + 0x7001FFB5, // 0091 JMP #0048 + 0x6024000C, // 0092 GETGBL R9 G12 + 0xB82A1A00, // 0093 GETNGBL R10 K13 + 0x8C28151E, // 0094 GETMET R10 R10 K30 + 0x7C280200, // 0095 CALL R10 1 + 0x7C240200, // 0096 CALL R9 1 + 0x58280007, // 0097 LDCONST R10 K7 + 0x78120000, // 0098 JMPF R4 #009A + 0x04241301, // 0099 SUB R9 R9 K1 + 0x142C1409, // 009A LT R11 R10 R9 + 0x782E0011, // 009B JMPF R11 #00AE + 0x8C2C1104, // 009C GETMET R11 R8 K4 + 0x5C341400, // 009D MOVE R13 R10 + 0x7C2C0400, // 009E CALL R11 2 + 0x4C300000, // 009F LDNIL R12 + 0x1C2C160C, // 00A0 EQ R11 R11 R12 + 0x782E0009, // 00A1 JMPF R11 #00AC + 0x602C0008, // 00A2 GETGBL R11 G8 + 0x5C300600, // 00A3 MOVE R12 R3 + 0x7C2C0200, // 00A4 CALL R11 1 + 0x60300013, // 00A5 GETGBL R12 G19 + 0x7C300000, // 00A6 CALL R12 0 + 0x9832111F, // 00A7 SETIDX R12 K8 K31 + 0x00341501, // 00A8 ADD R13 R10 K1 + 0x98323E0D, // 00A9 SETIDX R12 K31 R13 + 0x9808160C, // 00AA SETIDX R2 R11 R12 + 0x000C0701, // 00AB ADD R3 R3 K1 + 0x00281501, // 00AC ADD R10 R10 K1 + 0x7001FFEB, // 00AD JMP #009A + 0x8C2C0320, // 00AE GETMET R11 R1 K32 + 0xB8361A00, // 00AF GETNGBL R13 K13 + 0x8C341B21, // 00B0 GETMET R13 R13 K33 + 0x7C340200, // 00B1 CALL R13 1 + 0x7C2C0400, // 00B2 CALL R11 2 + 0x8C300122, // 00B3 GETMET R12 R0 K34 + 0x5C381600, // 00B4 MOVE R14 R11 + 0x7C300400, // 00B5 CALL R12 2 + 0x60340010, // 00B6 GETGBL R13 G16 + 0x5C381800, // 00B7 MOVE R14 R12 + 0x7C340200, // 00B8 CALL R13 1 + 0xA8020007, // 00B9 EXBLK 0 #00C2 + 0x5C381A00, // 00BA MOVE R14 R13 + 0x7C380000, // 00BB CALL R14 0 + 0x603C0008, // 00BC GETGBL R15 G8 + 0x5C400600, // 00BD MOVE R16 R3 + 0x7C3C0200, // 00BE CALL R15 1 + 0x98081E0E, // 00BF SETIDX R2 R15 R14 + 0x000C0701, // 00C0 ADD R3 R3 K1 + 0x7001FFF7, // 00C1 JMP #00BA + 0x58340023, // 00C2 LDCONST R13 K35 + 0xAC340200, // 00C3 CATCH R13 1 0 + 0xB0080000, // 00C4 RAISE 2 R0 R0 + 0x80040400, // 00C5 RET 1 R2 }) ) ); From 290f37abb9222eb960d12730bb6cbfc52f112051 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 4 Aug 2023 09:26:23 +0200 Subject: [PATCH 126/150] Update changelogs --- CHANGELOG.md | 4 ++-- RELEASENOTES.md | 4 +++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 595238950..5032d1690 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,8 +29,8 @@ All notable changes to this project will be documented in this file. - Zero cross dimmer minimum interrupt time (#19211) - Fade would fail when the difference between start and target would be too small (#19248) - Inverted shutter (#19243) -- Matter support for large atribute responses -- Matter fix auto-configuration Relay indices +- Matter support for large atribute responses (#19252) +- Matter auto-configuration Relay indices (#19255) ### Removed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 00df47f48..7013f02c7 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -141,7 +141,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - ESP32 Framework (Core) from v2.0.10 to v2.0.11 - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) -- Configuration backup and restore now backup and restore ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) +- Configuration backup and restore now supports ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - Reduced log level for TeleInfo [#19216](https://github.com/arendst/Tasmota/issues/19216) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 autodetect flashsize and adjust filesystem [#19215](https://github.com/arendst/Tasmota/issues/19215) @@ -162,6 +162,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Fade would fail when the difference between start and target would be too small [#19248](https://github.com/arendst/Tasmota/issues/19248) - Inverted shutter [#19243](https://github.com/arendst/Tasmota/issues/19243) - ESP8266 SPI initialization for scripter, filesystem and MFRC522 [#19209](https://github.com/arendst/Tasmota/issues/19209) +- Matter support for large atribute responses [#19252](https://github.com/arendst/Tasmota/issues/19252) +- Matter auto-configuration Relay indices [#19255](https://github.com/arendst/Tasmota/issues/19255) ### Removed - Support for ESP32-C3 with chip revision below 3 (old development boards) From 7736ba8af1c073bc8447edfa3b134f84d2dd4c87 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 4 Aug 2023 16:11:58 +0200 Subject: [PATCH 127/150] Change console height Change console height from default 318 pixels to viewport (#19241) --- CHANGELOG.md | 1 + RELEASENOTES.md | 1 + .../xdrv_01_9_webserver.ino | 22 +++++++++++++++++++ 3 files changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5032d1690..d403a8130 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ All notable changes to this project will be documented in this file. - ESP32 autodetect flashsize and adjust filesystem (#19215) - Reduced log level for TeleInfo (#19216) - Matter increased polling frequency for local switches/occupancy (#19242) +- Change console height from default 318 pixels to viewport (#19241) ### Fixed - Initial battery level percentage (#19160) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 7013f02c7..2e9a45e3b 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -143,6 +143,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) - Configuration backup and restore now supports ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - Reduced log level for TeleInfo [#19216](https://github.com/arendst/Tasmota/issues/19216) +- Change console height from default 318 pixels to viewport [#19241](https://github.com/arendst/Tasmota/issues/19241) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 autodetect flashsize and adjust filesystem [#19215](https://github.com/arendst/Tasmota/issues/19215) - Berry extend `range(lower, upper, incr)` to arbitrary increment [#19120](https://github.com/arendst/Tasmota/issues/19120) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 0b6db6671..10b2ad5a5 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -30,6 +30,8 @@ // Enable below demo feature only if defines USE_UNISHOX_COMPRESSION and USE_SCRIPT_WEB_DISPLAY are disabled //#define USE_WEB_SSE +#define USE_CONSOLE_CSS_FLEX + #ifndef WIFI_SOFT_AP_CHANNEL #define WIFI_SOFT_AP_CHANNEL 1 // Soft Access Point Channel number between 1 and 11 as used by WifiManager web GUI #endif @@ -371,12 +373,28 @@ const char HTTP_FORM_RST_UPG_FCT[] PROGMEM = "

    " ""; +#ifdef USE_CONSOLE_CSS_FLEX +const char HTTP_CMND_STYLE[] PROGMEM = // Overrule CSS for flex console + "html,body{margin:5;height:99%%;}" + "body{display:flex;flex-direction:column;}" + "textarea{resize:none;flex:auto;}"; + +const char HTTP_FORM_CMND[] PROGMEM = + "" // Close HTTP_HEAD_STYLE3
    + "
    " + "
    " + "
    " + // "
    " + "
    " + "
    "; // Add dummy
    replacing HTTP_HEAD_STYLE3 closed
    +#else const char HTTP_FORM_CMND[] PROGMEM = "


    " "
    " "
    " // "
    " "
    "; +#endif // USE_CONSOLE_CSS_FLEX const char HTTP_TABLE100[] PROGMEM = ""; @@ -3117,7 +3135,11 @@ void HandleConsole(void) WSContentStart_P(PSTR(D_CONSOLE)); WSContentSend_P(HTTP_SCRIPT_CONSOL, Settings->web_refresh); +#ifdef USE_CONSOLE_CSS_FLEX + WSContentSendStyle_P(HTTP_CMND_STYLE); +#else WSContentSendStyle(); +#endif // USE_CONSOLE_CSS_FLEX WSContentSend_P(HTTP_FORM_CMND); WSContentSpaceButton((WebUseManagementSubmenu()) ? BUTTON_MANAGEMENT : BUTTON_MAIN); WSContentStop(); From e2c79b45e4689af88ba2b0c04947e934cdcf2912 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Fri, 4 Aug 2023 17:24:05 +0200 Subject: [PATCH 128/150] Save some more code bytes --- tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 10b2ad5a5..1f46ac348 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -375,8 +375,8 @@ const char HTTP_FORM_RST_UPG_FCT[] PROGMEM = #ifdef USE_CONSOLE_CSS_FLEX const char HTTP_CMND_STYLE[] PROGMEM = // Overrule CSS for flex console - "html,body{margin:5;height:99%%;}" - "body{display:flex;flex-direction:column;}" + "html,body{height:99%%;}" + "body{display:flex;flex-flow:column;}" "textarea{resize:none;flex:auto;}"; const char HTTP_FORM_CMND[] PROGMEM = From 732e4106b83dcd075f9d4e3b18c47faabb3c84e1 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Fri, 4 Aug 2023 20:17:36 +0200 Subject: [PATCH 129/150] add wifitest3 (#19259) --- tasmota/tasmota_support/support_command.ino | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 523376296..40be1cf49 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -200,13 +200,15 @@ void CmndWifiTest(void) if (0 == XdrvMailbox.index) { Wifi.wifi_Test_Restart = true; } // If WifiTest is successful, save data on SSID1 and restart if (2 == XdrvMailbox.index) { Wifi.wifi_Test_Save_SSID2 = true; } // If WifiTest is successful, save data on SSID2 - SettingsUpdateText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1, ssid_test); - SettingsUpdateText(Wifi.wifi_Test_Save_SSID2 ? SET_STAPWD2 : SET_STAPWD1, pswd_test); + if (3 != XdrvMailbox.index) { // WifiTest3 never ever makes anything persistent, thus works without webserver + SettingsUpdateText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1, ssid_test); + SettingsUpdateText(Wifi.wifi_Test_Save_SSID2 ? SET_STAPWD2 : SET_STAPWD1, pswd_test); + } AddLog(LOG_LEVEL_INFO, PSTR(D_LOG_WIFI D_CONNECTING_TO_AP " %s " D_AS " %s ..."), - SettingsText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1), TasmotaGlobal.hostname); + ssid_test, TasmotaGlobal.hostname); - WiFi.begin(SettingsText(Wifi.wifi_Test_Save_SSID2 ? SET_STASSID2 : SET_STASSID1), SettingsText(Wifi.wifi_Test_Save_SSID2 ? SET_STAPWD2 : SET_STAPWD1)); + WiFi.begin(ssid_test,pswd_test); } } else { ResponseCmndChar(D_JSON_BUSY); @@ -2746,4 +2748,4 @@ void CmndTouchThres(void) { } #endif // ESP32 SOC_TOUCH_VERSION_1 or SOC_TOUCH_VERSION_2 -#endif // ESP32 +#endif // ESP32 \ No newline at end of file From 362326f00434193db08dfba62606284ad2b45859 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 5 Aug 2023 09:50:39 +0200 Subject: [PATCH 130/150] Zigbee Berry minor fix and cleaning (#19257) * Zigbee Berry minor fix and cleaning * Fix compilation --- .../src/embedded/zigbee_zcl_attribute.be | 79 +---- .../solidified_zigbee_zcl_attribute.h | 333 ++++-------------- .../xdrv_52_3_berry_zigbee.ino | 7 +- 3 files changed, 76 insertions(+), 343 deletions(-) diff --git a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be index 0d557728d..f960f8e74 100644 --- a/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be +++ b/lib/libesp32/berry_tasmota/src/embedded/zigbee_zcl_attribute.be @@ -202,14 +202,15 @@ class zcl_attribute_list : zcl_attribute_list_ntv var items = [] # {"Device":"0x246D","Name":"Plug","EnergyTotal":"0x000000000000","Endpoint":1,"LinkQuality":229} + var v # shortaddr - if self.shortaddr != nil - items.push(format('"Device":"0x%04X"', self.shortaddr)) + if (v := self.shortaddr) != nil + items.push(f'"Device":"0x{v:04X}"') end # groupaddr - if self.groupaddr != nil - items.push(format('"Group":"0x%04X"', self.groupaddr)) + if (v := self.groupaddr) != nil + items.push(f'"Group":"0x{v:04X}"') end # attributes @@ -222,13 +223,13 @@ class zcl_attribute_list : zcl_attribute_list_ntv end # Endpoint - if self.src_ep != nil - items.push(format('"Endpoint":%i', self.src_ep)) + if (v := self.src_ep) != nil + items.push(f'"Endpoint":{v}') end # LQI - if self.lqi != nil - items.push(format('"LinkQuality":%i', self.lqi)) + if (v := self.lqi) != nil + items.push(f'"LinkQuality":{v}') end var s = "{" + items.concat(",") + "}" @@ -238,68 +239,6 @@ class zcl_attribute_list : zcl_attribute_list_ntv end end -#@ solidify:zcl_attributes,weak -class zcl_attributes - var shortaddr - var groupaddr - var lqi - var src_ep - var attr_list - - def init(shortaddr, groupaddr, lqi, src_ep, attr_list) - self.shortaddr = shortaddr - self.groupaddr = groupaddr - self.lqi = lqi - self.src_ep = src_ep - if isinstance(self.attr_list, list) - self.attr_list = attr_list - else - self.attr_list = [] - end - end - - def push(attr) - self.attr_list.push(attr) - end - - def tostring() - import json - - var items = [] - # {"Device":"0x246D","Name":"Plug","EnergyTotal":"0x000000000000","Endpoint":1,"LinkQuality":229} - - # shortaddr - if self.shortaddr != nil - items.push(format('"Device":"0x%04X"', self.shortaddr)) - end - # groupaddr - if self.shortaddr != nil - items.push(format('"Group":"0x%04X"', self.groupaddr)) - end - - # attributes - for e: self.attr_list - items.push(e.tostring()) - end - - # Endpoint - if self.src_ep != nil - items.push(format('"Endpoint":%i', self.src_ep)) - end - - # Endpoint - if self.lqi != nil - items.push(format('"LinkQuality":%i', self.lqi)) - end - - var s = "{" + items.concat(",") + "}" - return s - - # return format("shortaddr:0x%04X groupaddr:0x%04X %s", self.shortaddr, self.groupaddr, str(self.attr_list)) - end - -end - #- # Unit tests diff --git a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h index 01c75933f..bbf637b6b 100644 --- a/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h +++ b/lib/libesp32/berry_tasmota/src/solidify/solidified_zigbee_zcl_attribute.h @@ -785,7 +785,7 @@ be_local_closure(zcl_attribute_list_deinit, /* name */ ********************************************************************/ be_local_closure(zcl_attribute_list_tostring, /* name */ be_nested_proto( - 10, /* nstack */ + 11, /* nstack */ 1, /* argc */ 2, /* varg */ 0, /* has upvals */ @@ -805,9 +805,9 @@ be_local_closure(zcl_attribute_list_tostring, /* name */ /* K8 */ be_nested_str_weak(tostring), /* K9 */ be_const_int(1), /* K10 */ be_nested_str_weak(src_ep), - /* K11 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), + /* K11 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25s), /* K12 */ be_nested_str_weak(lqi), - /* K13 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), + /* K13 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25s), /* K14 */ be_nested_str_weak(_X7B), /* K15 */ be_nested_str_weak(concat), /* K16 */ be_nested_str_weak(_X2C), @@ -815,68 +815,69 @@ be_local_closure(zcl_attribute_list_tostring, /* name */ }), be_str_weak(tostring), &be_const_str_solidified, - ( &(const binstruction[61]) { /* code */ + ( &(const binstruction[62]) { /* code */ 0xA4060000, // 0000 IMPORT R1 K0 0x60080012, // 0001 GETGBL R2 G18 0x7C080000, // 0002 CALL R2 0 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x4C100000, // 0004 LDNIL R4 - 0x200C0604, // 0005 NE R3 R3 R4 - 0x780E0005, // 0006 JMPF R3 #000D - 0x8C0C0502, // 0007 GETMET R3 R2 K2 - 0x60140018, // 0008 GETGBL R5 G24 - 0x58180003, // 0009 LDCONST R6 K3 - 0x881C0101, // 000A GETMBR R7 R0 K1 - 0x7C140400, // 000B CALL R5 2 - 0x7C0C0400, // 000C CALL R3 2 - 0x880C0104, // 000D GETMBR R3 R0 K4 - 0x4C100000, // 000E LDNIL R4 - 0x200C0604, // 000F NE R3 R3 R4 - 0x780E0005, // 0010 JMPF R3 #0017 - 0x8C0C0502, // 0011 GETMET R3 R2 K2 - 0x60140018, // 0012 GETGBL R5 G24 - 0x58180005, // 0013 LDCONST R6 K5 - 0x881C0104, // 0014 GETMBR R7 R0 K4 - 0x7C140400, // 0015 CALL R5 2 - 0x7C0C0400, // 0016 CALL R3 2 - 0x580C0006, // 0017 LDCONST R3 K6 - 0x8C100107, // 0018 GETMET R4 R0 K7 - 0x7C100200, // 0019 CALL R4 1 - 0x14140604, // 001A LT R5 R3 R4 - 0x78160006, // 001B JMPF R5 #0023 - 0x8C140502, // 001C GETMET R5 R2 K2 - 0x941C0003, // 001D GETIDX R7 R0 R3 - 0x8C1C0F08, // 001E GETMET R7 R7 K8 - 0x7C1C0200, // 001F CALL R7 1 - 0x7C140400, // 0020 CALL R5 2 - 0x000C0709, // 0021 ADD R3 R3 K9 - 0x7001FFF6, // 0022 JMP #001A - 0x8814010A, // 0023 GETMBR R5 R0 K10 - 0x4C180000, // 0024 LDNIL R6 - 0x20140A06, // 0025 NE R5 R5 R6 - 0x78160005, // 0026 JMPF R5 #002D - 0x8C140502, // 0027 GETMET R5 R2 K2 - 0x601C0018, // 0028 GETGBL R7 G24 - 0x5820000B, // 0029 LDCONST R8 K11 - 0x8824010A, // 002A GETMBR R9 R0 K10 - 0x7C1C0400, // 002B CALL R7 2 - 0x7C140400, // 002C CALL R5 2 - 0x8814010C, // 002D GETMBR R5 R0 K12 - 0x4C180000, // 002E LDNIL R6 - 0x20140A06, // 002F NE R5 R5 R6 - 0x78160005, // 0030 JMPF R5 #0037 - 0x8C140502, // 0031 GETMET R5 R2 K2 - 0x601C0018, // 0032 GETGBL R7 G24 - 0x5820000D, // 0033 LDCONST R8 K13 - 0x8824010C, // 0034 GETMBR R9 R0 K12 - 0x7C1C0400, // 0035 CALL R7 2 - 0x7C140400, // 0036 CALL R5 2 - 0x8C14050F, // 0037 GETMET R5 R2 K15 - 0x581C0010, // 0038 LDCONST R7 K16 - 0x7C140400, // 0039 CALL R5 2 - 0x00161C05, // 003A ADD R5 K14 R5 - 0x00140B11, // 003B ADD R5 R5 K17 - 0x80040A00, // 003C RET 1 R5 + 0x4C0C0000, // 0003 LDNIL R3 + 0x880C0101, // 0004 GETMBR R3 R0 K1 + 0x4C100000, // 0005 LDNIL R4 + 0x200C0604, // 0006 NE R3 R3 R4 + 0x780E0005, // 0007 JMPF R3 #000E + 0x8C0C0502, // 0008 GETMET R3 R2 K2 + 0x60140018, // 0009 GETGBL R5 G24 + 0x58180003, // 000A LDCONST R6 K3 + 0x5C1C0600, // 000B MOVE R7 R3 + 0x7C140400, // 000C CALL R5 2 + 0x7C0C0400, // 000D CALL R3 2 + 0x880C0104, // 000E GETMBR R3 R0 K4 + 0x4C100000, // 000F LDNIL R4 + 0x200C0604, // 0010 NE R3 R3 R4 + 0x780E0005, // 0011 JMPF R3 #0018 + 0x8C0C0502, // 0012 GETMET R3 R2 K2 + 0x60140018, // 0013 GETGBL R5 G24 + 0x58180005, // 0014 LDCONST R6 K5 + 0x5C1C0600, // 0015 MOVE R7 R3 + 0x7C140400, // 0016 CALL R5 2 + 0x7C0C0400, // 0017 CALL R3 2 + 0x58100006, // 0018 LDCONST R4 K6 + 0x8C140107, // 0019 GETMET R5 R0 K7 + 0x7C140200, // 001A CALL R5 1 + 0x14180805, // 001B LT R6 R4 R5 + 0x781A0006, // 001C JMPF R6 #0024 + 0x8C180502, // 001D GETMET R6 R2 K2 + 0x94200004, // 001E GETIDX R8 R0 R4 + 0x8C201108, // 001F GETMET R8 R8 K8 + 0x7C200200, // 0020 CALL R8 1 + 0x7C180400, // 0021 CALL R6 2 + 0x00100909, // 0022 ADD R4 R4 K9 + 0x7001FFF6, // 0023 JMP #001B + 0x880C010A, // 0024 GETMBR R3 R0 K10 + 0x4C180000, // 0025 LDNIL R6 + 0x200C0606, // 0026 NE R3 R3 R6 + 0x780E0005, // 0027 JMPF R3 #002E + 0x8C180502, // 0028 GETMET R6 R2 K2 + 0x60200018, // 0029 GETGBL R8 G24 + 0x5824000B, // 002A LDCONST R9 K11 + 0x5C280600, // 002B MOVE R10 R3 + 0x7C200400, // 002C CALL R8 2 + 0x7C180400, // 002D CALL R6 2 + 0x880C010C, // 002E GETMBR R3 R0 K12 + 0x4C180000, // 002F LDNIL R6 + 0x200C0606, // 0030 NE R3 R3 R6 + 0x780E0005, // 0031 JMPF R3 #0038 + 0x8C180502, // 0032 GETMET R6 R2 K2 + 0x60200018, // 0033 GETGBL R8 G24 + 0x5824000D, // 0034 LDCONST R9 K13 + 0x5C280600, // 0035 MOVE R10 R3 + 0x7C200400, // 0036 CALL R8 2 + 0x7C180400, // 0037 CALL R6 2 + 0x8C18050F, // 0038 GETMET R6 R2 K15 + 0x58200010, // 0039 LDCONST R8 K16 + 0x7C180400, // 003A CALL R6 2 + 0x001A1C06, // 003B ADD R6 K14 R6 + 0x00180D11, // 003C ADD R6 R6 K17 + 0x80040C00, // 003D RET 1 R6 }) ) ); @@ -908,213 +909,5 @@ void be_load_zcl_attribute_list_class(bvm *vm) { be_setglobal(vm, "zcl_attribute_list"); be_pop(vm, 1); } - -extern const bclass be_class_zcl_attributes; - -/******************************************************************** -** Solidified function: init -********************************************************************/ -be_local_closure(zcl_attributes_init, /* name */ - be_nested_proto( - 9, /* nstack */ - 6, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 5]) { /* constants */ - /* K0 */ be_nested_str_weak(shortaddr), - /* K1 */ be_nested_str_weak(groupaddr), - /* K2 */ be_nested_str_weak(lqi), - /* K3 */ be_nested_str_weak(src_ep), - /* K4 */ be_nested_str_weak(attr_list), - }), - be_str_weak(init), - &be_const_str_solidified, - ( &(const binstruction[15]) { /* code */ - 0x90020001, // 0000 SETMBR R0 K0 R1 - 0x90020202, // 0001 SETMBR R0 K1 R2 - 0x90020403, // 0002 SETMBR R0 K2 R3 - 0x90020604, // 0003 SETMBR R0 K3 R4 - 0x6018000F, // 0004 GETGBL R6 G15 - 0x881C0104, // 0005 GETMBR R7 R0 K4 - 0x60200012, // 0006 GETGBL R8 G18 - 0x7C180400, // 0007 CALL R6 2 - 0x781A0001, // 0008 JMPF R6 #000B - 0x90020805, // 0009 SETMBR R0 K4 R5 - 0x70020002, // 000A JMP #000E - 0x60180012, // 000B GETGBL R6 G18 - 0x7C180000, // 000C CALL R6 0 - 0x90020806, // 000D SETMBR R0 K4 R6 - 0x80000000, // 000E RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: tostring -********************************************************************/ -be_local_closure(zcl_attributes_tostring, /* name */ - be_nested_proto( - 9, /* nstack */ - 1, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[17]) { /* constants */ - /* K0 */ be_nested_str_weak(json), - /* K1 */ be_nested_str_weak(shortaddr), - /* K2 */ be_nested_str_weak(push), - /* K3 */ be_nested_str_weak(_X22Device_X22_X3A_X220x_X2504X_X22), - /* K4 */ be_nested_str_weak(_X22Group_X22_X3A_X220x_X2504X_X22), - /* K5 */ be_nested_str_weak(groupaddr), - /* K6 */ be_nested_str_weak(attr_list), - /* K7 */ be_nested_str_weak(tostring), - /* K8 */ be_nested_str_weak(stop_iteration), - /* K9 */ be_nested_str_weak(src_ep), - /* K10 */ be_nested_str_weak(_X22Endpoint_X22_X3A_X25i), - /* K11 */ be_nested_str_weak(lqi), - /* K12 */ be_nested_str_weak(_X22LinkQuality_X22_X3A_X25i), - /* K13 */ be_nested_str_weak(_X7B), - /* K14 */ be_nested_str_weak(concat), - /* K15 */ be_nested_str_weak(_X2C), - /* K16 */ be_nested_str_weak(_X7D), - }), - be_str_weak(tostring), - &be_const_str_solidified, - ( &(const binstruction[63]) { /* code */ - 0xA4060000, // 0000 IMPORT R1 K0 - 0x60080012, // 0001 GETGBL R2 G18 - 0x7C080000, // 0002 CALL R2 0 - 0x880C0101, // 0003 GETMBR R3 R0 K1 - 0x4C100000, // 0004 LDNIL R4 - 0x200C0604, // 0005 NE R3 R3 R4 - 0x780E0005, // 0006 JMPF R3 #000D - 0x8C0C0502, // 0007 GETMET R3 R2 K2 - 0x60140018, // 0008 GETGBL R5 G24 - 0x58180003, // 0009 LDCONST R6 K3 - 0x881C0101, // 000A GETMBR R7 R0 K1 - 0x7C140400, // 000B CALL R5 2 - 0x7C0C0400, // 000C CALL R3 2 - 0x880C0101, // 000D GETMBR R3 R0 K1 - 0x4C100000, // 000E LDNIL R4 - 0x200C0604, // 000F NE R3 R3 R4 - 0x780E0005, // 0010 JMPF R3 #0017 - 0x8C0C0502, // 0011 GETMET R3 R2 K2 - 0x60140018, // 0012 GETGBL R5 G24 - 0x58180004, // 0013 LDCONST R6 K4 - 0x881C0105, // 0014 GETMBR R7 R0 K5 - 0x7C140400, // 0015 CALL R5 2 - 0x7C0C0400, // 0016 CALL R3 2 - 0x600C0010, // 0017 GETGBL R3 G16 - 0x88100106, // 0018 GETMBR R4 R0 K6 - 0x7C0C0200, // 0019 CALL R3 1 - 0xA8020006, // 001A EXBLK 0 #0022 - 0x5C100600, // 001B MOVE R4 R3 - 0x7C100000, // 001C CALL R4 0 - 0x8C140502, // 001D GETMET R5 R2 K2 - 0x8C1C0907, // 001E GETMET R7 R4 K7 - 0x7C1C0200, // 001F CALL R7 1 - 0x7C140400, // 0020 CALL R5 2 - 0x7001FFF8, // 0021 JMP #001B - 0x580C0008, // 0022 LDCONST R3 K8 - 0xAC0C0200, // 0023 CATCH R3 1 0 - 0xB0080000, // 0024 RAISE 2 R0 R0 - 0x880C0109, // 0025 GETMBR R3 R0 K9 - 0x4C100000, // 0026 LDNIL R4 - 0x200C0604, // 0027 NE R3 R3 R4 - 0x780E0005, // 0028 JMPF R3 #002F - 0x8C0C0502, // 0029 GETMET R3 R2 K2 - 0x60140018, // 002A GETGBL R5 G24 - 0x5818000A, // 002B LDCONST R6 K10 - 0x881C0109, // 002C GETMBR R7 R0 K9 - 0x7C140400, // 002D CALL R5 2 - 0x7C0C0400, // 002E CALL R3 2 - 0x880C010B, // 002F GETMBR R3 R0 K11 - 0x4C100000, // 0030 LDNIL R4 - 0x200C0604, // 0031 NE R3 R3 R4 - 0x780E0005, // 0032 JMPF R3 #0039 - 0x8C0C0502, // 0033 GETMET R3 R2 K2 - 0x60140018, // 0034 GETGBL R5 G24 - 0x5818000C, // 0035 LDCONST R6 K12 - 0x881C010B, // 0036 GETMBR R7 R0 K11 - 0x7C140400, // 0037 CALL R5 2 - 0x7C0C0400, // 0038 CALL R3 2 - 0x8C0C050E, // 0039 GETMET R3 R2 K14 - 0x5814000F, // 003A LDCONST R5 K15 - 0x7C0C0400, // 003B CALL R3 2 - 0x000E1A03, // 003C ADD R3 K13 R3 - 0x000C0710, // 003D ADD R3 R3 K16 - 0x80040600, // 003E RET 1 R3 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified function: push -********************************************************************/ -be_local_closure(zcl_attributes_push, /* name */ - be_nested_proto( - 5, /* nstack */ - 2, /* argc */ - 2, /* varg */ - 0, /* has upvals */ - NULL, /* no upvals */ - 0, /* has sup protos */ - NULL, /* no sub protos */ - 1, /* has constants */ - ( &(const bvalue[ 2]) { /* constants */ - /* K0 */ be_nested_str_weak(attr_list), - /* K1 */ be_nested_str_weak(push), - }), - be_str_weak(push), - &be_const_str_solidified, - ( &(const binstruction[ 5]) { /* code */ - 0x88080100, // 0000 GETMBR R2 R0 K0 - 0x8C080501, // 0001 GETMET R2 R2 K1 - 0x5C100200, // 0002 MOVE R4 R1 - 0x7C080400, // 0003 CALL R2 2 - 0x80000000, // 0004 RET 0 - }) - ) -); -/*******************************************************************/ - - -/******************************************************************** -** Solidified class: zcl_attributes -********************************************************************/ -be_local_class(zcl_attributes, - 5, - NULL, - be_nested_map(8, - ( (struct bmapnode*) &(const bmapnode[]) { - { be_const_key_weak(groupaddr, 6), be_const_var(1) }, - { be_const_key_weak(push, 4), be_const_closure(zcl_attributes_push_closure) }, - { be_const_key_weak(shortaddr, -1), be_const_var(0) }, - { be_const_key_weak(init, -1), be_const_closure(zcl_attributes_init_closure) }, - { be_const_key_weak(tostring, -1), be_const_closure(zcl_attributes_tostring_closure) }, - { be_const_key_weak(lqi, 1), be_const_var(2) }, - { be_const_key_weak(attr_list, -1), be_const_var(4) }, - { be_const_key_weak(src_ep, 0), be_const_var(3) }, - })), - be_str_weak(zcl_attributes) -); -/*******************************************************************/ - -void be_load_zcl_attributes_class(bvm *vm) { - be_pushntvclass(vm, &be_class_zcl_attributes); - be_setglobal(vm, "zcl_attributes"); - be_pop(vm, 1); -} /********************************************************************/ /* End of solidification */ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino index 1fca11afe..fee50f5f7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_zigbee.ino @@ -257,16 +257,17 @@ extern "C" { sizeof(Z_attribute), /* size in bytes */ 11, /* number of elements */ nullptr, - (const be_ctypes_structure_item_t[11]) { + (const be_ctypes_structure_item_t[12]) { { "_attr_id", offsetof(Z_attribute, attr_id), 0, 0, ctypes_u16, 0 }, { "_cluster", offsetof(Z_attribute, cluster), 0, 0, ctypes_u16, 0 }, { "_cmd", offsetof(Z_attribute, attr_id), 0, 0, ctypes_u8, 0 }, // low 8 bits of attr_id { "_cmd_general", offsetof(Z_attribute, attr_id) + 1, 1, 1, ctypes_u8, 0 }, // bit #1 of byte+1 { "_direction", offsetof(Z_attribute, attr_id) + 1, 0, 1, ctypes_u8, 0 }, // bit #0 of byte+1 { "_iscmd", offsetof(Z_attribute, key_is_cmd), 0, 0, ctypes_u8, 0 }, - { "attr_multiplier", offsetof(Z_attribute, attr_multiplier), 0, 0, ctypes_u32, 0 }, + { "attr_base", offsetof(Z_attribute, attr_base), 0, 0, ctypes_u32, 0 }, { "attr_divider", offsetof(Z_attribute, attr_divider), 0, 0, ctypes_u32, 0 }, - { "attr_type", offsetof(Z_attribute, attr_type), 0, 0, ctypes_i32, 0 }, + { "attr_multiplier", offsetof(Z_attribute, attr_multiplier), 0, 0, ctypes_u32, 0 }, + { "attr_type", offsetof(Z_attribute, attr_type), 0, 0, ctypes_u8, 0 }, // { "key", offsetof(Z_attribute, key), 0, 0, ctypes_ptr32, 0 }, // { "key_is_pmem", offsetof(Z_attribute, key_is_pmem), 0, 0, ctypes_u8, 0 }, // { "key_is_str", offsetof(Z_attribute, key_is_str), 0, 0, ctypes_u8, 0 }, From 70ced65aafe744a18970cda30c228c210ab73551 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 5 Aug 2023 10:17:56 +0200 Subject: [PATCH 131/150] Fix compilation when IPv6 is not supported (#19260) --- lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h index 943b89e9a..94cf3d6c1 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP8266WiFi.h @@ -76,8 +76,8 @@ public: void scrubDNS(void); protected: - ip_addr_t dns_save4[DNS_MAX_SERVERS] = {}; // IPv4 DNS servers #ifdef USE_IPV6 + ip_addr_t dns_save4[DNS_MAX_SERVERS] = {}; // IPv4 DNS servers ip_addr_t dns_save6[DNS_MAX_SERVERS] = {}; // IPv6 DNS servers #endif // USE_IPV6 }; From fc798540b7dd717760e9d0fdf38aa0d4ada43946 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 5 Aug 2023 11:56:06 +0200 Subject: [PATCH 132/150] Fix console min height --- tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 1f46ac348..5a95e15e3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -377,7 +377,7 @@ const char HTTP_FORM_RST_UPG_FCT[] PROGMEM = const char HTTP_CMND_STYLE[] PROGMEM = // Overrule CSS for flex console "html,body{height:99%%;}" "body{display:flex;flex-flow:column;}" - "textarea{resize:none;flex:auto;}"; + "textarea{resize:none;flex:auto;min-height:99px}"; const char HTTP_FORM_CMND[] PROGMEM = "" // Close HTTP_HEAD_STYLE3
    From 7c3c3855c4a30236da538863d38193891a588509 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 5 Aug 2023 12:35:03 +0200 Subject: [PATCH 133/150] Fix console Firefox layout --- tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 5a95e15e3..54c477c7b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -381,9 +381,10 @@ const char HTTP_CMND_STYLE[] PROGMEM = // Overrule CSS for flex console const char HTTP_FORM_CMND[] PROGMEM = "
    " // Close HTTP_HEAD_STYLE3
    - "
    " + "" "
    " - "
    " + "
    " //
    here fixes Firefox layout + "" // "
    " "" "
    "; // Add dummy
    replacing HTTP_HEAD_STYLE3 closed
    From 959d1054133dd1920f1d072a0042712957e0b74e Mon Sep 17 00:00:00 2001 From: stefanbode Date: Sat, 5 Aug 2023 14:51:56 +0200 Subject: [PATCH 134/150] Change shutterbutton hold behavior with grouptopic (#19263) * skip stop on hold if grouptopic If shutterbutton is defined with a grouptopic send on HOLD, there is no stop on releasing the button. All shutters will move to defined position * do not stop on hold release if group submitt If mqtt broadcast is defined on hold then release the hold button will not anymore stop the local shutter. All shutter will move to defined position --- tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino | 3 ++- tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino index 9ff0807c0..538e11fe4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_esp32_shutter.ino @@ -1265,7 +1265,8 @@ bool ShutterButtonHandler(void) // handle on button release: start shutter on shortpress and stop running shutter after longpress. if (NOT_PRESSED == button && Shutter[shutter_index].direction != 0 // only act on shutters activly moving - && Button.hold_timer[button_index] > 0) // kick in on first release of botton. do not check for multipress + && Button.hold_timer[button_index] > 0 // kick in on first release of botton. do not check for multipress + && !ShutterSettings.shutter_button[button_index].position[3].mqtt_broadcast ) // do not stop on hold release if broadcast { XdrvMailbox.index = shutter_index +1; XdrvMailbox.payload = -99; // reset any payload to invalid diff --git a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino index e49c1b633..c5255c563 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_27_shutter.ino @@ -947,7 +947,11 @@ bool ShutterButtonHandler(void) if (NOT_PRESSED == button) { //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Button %d, hold %d, dir %d, index %d, payload %d"), shutter_index+1, button_index+1, Button.hold_timer[button_index],Shutter[shutter_index].direction,XdrvMailbox.index,XdrvMailbox.payload); - if (Shutter[shutter_index].direction && (Button.hold_timer[button_index] > 0 && (!Settings->flag.button_single || Button.hold_timer[button_index] > 20))) { + if (Shutter[shutter_index].direction + && (Button.hold_timer[button_index] > 0 + && (!Settings->flag.button_single + || Button.hold_timer[button_index] > 20)) + && !(Settings->shutter_button[button_index] & (0x01<<29))) { XdrvMailbox.index = shutter_index +1; XdrvMailbox.payload = XdrvMailbox.index; //AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("SHT: Shtr%d, Button %d, hold %d, dir %d, index %d, payload %d"), shutter_index+1, button_index+1, Button.hold_timer[button_index],Shutter[shutter_index].direction,XdrvMailbox.index,XdrvMailbox.payload); From ab9a519d32d3e3a46ade6dbf4a630c968357e6d6 Mon Sep 17 00:00:00 2001 From: usr44 <140394475+usr44@users.noreply.github.com> Date: Sat, 5 Aug 2023 12:52:25 +0000 Subject: [PATCH 135/150] Update ru_RU.h (#19214) --- tasmota/language/ru_RU.h | 507 ++++++++++++++++++++------------------- 1 file changed, 254 insertions(+), 253 deletions(-) diff --git a/tasmota/language/ru_RU.h b/tasmota/language/ru_RU.h index 60d61d492..0b2d556a9 100644 --- a/tasmota/language/ru_RU.h +++ b/tasmota/language/ru_RU.h @@ -2,6 +2,7 @@ ru-RU.h - localization for Russian - Russia for Tasmota Copyright (C) 2021 Roman-vn + Copyright (C) 2023 usr44 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -28,7 +29,7 @@ * Use online command StateText to translate ON, OFF, HOLD and TOGGLE. * Use online command Prefix to translate cmnd, stat and tele. * - * Updated until v9.3.1.1 + * Updated until v13.0.0.3 \*********************************************************************/ //#define LANGUAGE_MODULE_NAME // Enable to display "Module Generic" (ie Spanish), Disable to display "Generic Module" (ie English) @@ -63,7 +64,7 @@ #define D_BLINKOFF "Не Мигать" #define D_BOOT_COUNT "Количество загрузок" #define D_BRIGHTLIGHT "Яркость" -#define D_BSSID "BSSId" +#define D_BSSID "BSSID" #define D_BUTTON "Кнопка" #define D_BY "by" // Written by me #define D_BYTES "Байт" @@ -74,7 +75,7 @@ #define D_COLDLIGHT "Холодный" #define D_COMMAND "Команда" #define D_CONNECTED "Соединен" -#define D_CORS_DOMAIN "CORS Domain" +#define D_CORS_DOMAIN "Домен CORS" #define D_COUNT "Подсчет" #define D_COUNTER "Счетчик" #define D_CT_POWER "CT Power" @@ -88,7 +89,7 @@ #define D_MOVING_DISTANCE "Moving Distance" #define D_STATIC_DISTANCE "Static Distance" #define D_DETECT_DISTANCE "Detect Distance" -#define D_DISTANCE "Distance" +#define D_DISTANCE "Расстояние" #define D_DNS_SERVER "DNS Сервер" #define D_DO "Disolved Oxygen" #define D_DONE "Выполнено" @@ -105,33 +106,33 @@ #define D_FALLBACK_TOPIC "Топик обратной связи" #define D_FALSE "Ложно" #define D_FILE "Файл" -#define D_FILE_SYSTEM_SIZE "File System Size" -#define D_FLOW_RATE "Flow rate" -#define D_FRAGMENTATION "frag." // Lower case abbreviated version of fragmentation used in "memory fragmentation" -#define D_FRAME_RATE "Frame rate" +#define D_FILE_SYSTEM_SIZE "Размер файловой системы" +#define D_FLOW_RATE "Скорость потока" +#define D_FRAGMENTATION "фраг." // Lower case abbreviated version of fragmentation used in "memory fragmentation" +#define D_FRAME_RATE "Частота кадров" #define D_FREE_MEMORY "Свободная память" -#define D_PSR_MAX_MEMORY "PS-RAM Memory" -#define D_PSR_FREE_MEMORY "PS-RAM free Memory" -#define D_FREQUENCY "Frequency" +#define D_PSR_MAX_MEMORY "Память PS-RAM" +#define D_PSR_FREE_MEMORY "Свободная память PS-RAM" +#define D_FREQUENCY "Частота" #define D_GAS "Газ" #define D_GATEWAY "Шлюз" #define D_GROUP "Группа" #define D_HOST "Хост" #define D_HALL_EFFECT "Hall Effect" -#define D_HOSTNAME "Имя Хоста" +#define D_HOSTNAME "Имя хоста" #define D_HUMIDITY "Влажность" #define D_ILLUMINANCE "Освещенность" #define D_IMMEDIATE "немедленно" // Button immediate #define D_INDEX "Индекс" #define D_INFO "Инфо" -#define D_INFRARED "Infrared" +#define D_INFRARED "Инфракрасный" #define D_INITIALIZED "Инициализировано" #define D_IP_ADDRESS "IP Адрес" #define D_LIGHT "Свет" #define D_LWT "LWT" #define D_LQI "LQI" // Zigbee Link Quality Index #define D_MODULE "Модуль" -#define D_MOISTURE "Moisture" +#define D_MOISTURE "Влага" #define D_MQTT "MQTT" #define D_MULTI_PRESS "многократное нажатие" #define D_NOISE "Шум" @@ -139,15 +140,15 @@ #define D_NOX "NOx" #define D_O2 "Oxygen" #define D_OFF "Выкл" -#define D_OFFLINE "Офф-лайн" +#define D_OFFLINE "Офлайн" #define D_OK "Ок" #define D_ON "Вкл" -#define D_ONLINE "Он-лайн" +#define D_ONLINE "Онлайн" #define D_ORP "ORP" #define D_PASSWORD "Пароль" #define D_PH "pH" #define D_MQ "MQ" -#define D_PARTITION "Partition" // As in flash and firmware partition +#define D_PARTITION "Раздел" // As in flash and firmware partition #define D_PORT "Порт" #define D_POWER_FACTOR "Коэффициент мощности" #define D_POWERUSAGE "Мощность" @@ -159,27 +160,27 @@ #define D_PROGRAM_FLASH_SIZE "Размер Flash для программ" #define D_PROGRAM_SIZE "Размер программы " #define D_PROJECT "Проект" -#define D_RAIN "Rain" -#define D_RANGE "Range" +#define D_RAIN "Дождь" +#define D_RANGE "Диапазон" #define D_RECEIVED "Получено" -#define D_RESTART "Перезапуск" -#define D_RESTARTING "Перезапуск" +#define D_RESTART "Перезагрузка" +#define D_RESTARTING "Перезагрузка" #define D_RESTART_REASON "Причина перезагрузки" #define D_RESTORE "восстановление" #define D_RETAINED "нераспред." -#define D_RULE "Rule" +#define D_RULE "Правило" #define D_SAVE "Сохранить" #define D_SENSOR "Датчик" -#define D_SSID "SSId" +#define D_SSID "SSID" #define D_START "Старт" #define D_STD_TIME "STD" #define D_STOP "Стоп" -#define D_SUBNET_MASK "Маска Подсети" +#define D_SUBNET_MASK "Маска подсети" #define D_SUBSCRIBE_TO "Подписаться на" -#define D_UNSUBSCRIBE_FROM "Unsubscribe from" +#define D_UNSUBSCRIBE_FROM "Отписатся от" #define D_SUCCESSFUL "Успешно" -#define D_SUNRISE "Sunrise" -#define D_SUNSET "Sunset" +#define D_SUNRISE "Восход" +#define D_SUNSET "Закат" #define D_TEMPERATURE "Температура" #define D_TO "до" #define D_TOGGLE "Переключить" @@ -190,27 +191,27 @@ #define D_TVOC "TVOC" #define D_UPGRADE "обновление" #define D_UPLOAD "Загрузить" -#define D_UPTIME "Uptime" -#define D_USED "used" +#define D_UPTIME "Аптайм" +#define D_USED "использовано" #define D_USER "Пользователь" #define D_UTC_TIME "UTC" -#define D_UV_INDEX "UV Index" -#define D_UV_INDEX_1 "Low" -#define D_UV_INDEX_2 "Mid" -#define D_UV_INDEX_3 "High" -#define D_UV_INDEX_4 "Danger" +#define D_UV_INDEX "УФ Индекс" +#define D_UV_INDEX_1 "Низ" +#define D_UV_INDEX_2 "Сред" +#define D_UV_INDEX_3 "Выс" +#define D_UV_INDEX_4 "Опасный" #define D_UV_INDEX_5 "BurnL1/2" #define D_UV_INDEX_6 "BurnL3" #define D_UV_INDEX_7 "OoR" -#define D_UV_LEVEL "УФ уровень" -#define D_UV_POWER "UV Power" +#define D_UV_LEVEL "УФ Уровень" +#define D_UV_POWER "УФ Мощность" #define D_VERSION "Версия" #define D_VOC "VOC" #define D_VOLTAGE "Напряжение" -#define D_VOLUME "Volume" -#define D_WEIGHT "Weight" -#define D_WARMLIGHT "Тепло" -#define D_WEB_SERVER "Web сервер" +#define D_VOLUME "Громкость" +#define D_WEIGHT "Вес" +#define D_WARMLIGHT "Тёплый" +#define D_WEB_SERVER "Веб-сервер" #define D_SOC "State of Charge" #define D_SOH "State of Health" @@ -218,17 +219,17 @@ #define D_WARNING_MINIMAL_VERSION "ПРЕДУПРЕЖДЕНИЕ Эта версия не поддерживает персистентные настройки" #define D_LEVEL_10 "уровень 1-0" #define D_LEVEL_01 "уровень 0-1" -#define D_SERIAL_LOGGING_DISABLED "Serial logging отключен" -#define D_SYSLOG_LOGGING_REENABLED "Syslog logging включен" +#define D_SERIAL_LOGGING_DISABLED "Serial логирование выключено" +#define D_SYSLOG_LOGGING_REENABLED "Syslog логирование включено" #define D_SET_BAUDRATE_TO "Установить скорость передачи (Baudrate)" -#define D_RECEIVED_TOPIC "Полученный Топик" +#define D_RECEIVED_TOPIC "Полученный топик" #define D_DATA_SIZE "Размер данных" #define D_ANALOG_INPUT "Аналоговый вход" // support.ino #define D_OSWATCH "osWatch" -#define D_BLOCKED_LOOP "Блокирующий цикл" +#define D_BLOCKED_LOOP "Заблокированный цикл" #define D_WPS_FAILED_WITH_STATUS "WPS конфигурация НЕУДАЧНА со статусом" #define D_ACTIVE_FOR_3_MINUTES "активен в течение 3 минут" #define D_FAILED_TO_START "не удалось запустить" @@ -242,9 +243,9 @@ #define D_ATTEMPTING_CONNECTION "Попытка подключения..." #define D_CHECKING_CONNECTION "Проверка соединения..." #define D_QUERY_DONE "Запрос выполнен. Обнаружены службы MQTT" -#define D_MQTT_SERVICE_FOUND "MQTT сервис service найдено" +#define D_MQTT_SERVICE_FOUND "MQTT сервис найден" #define D_FOUND_AT "найдено в" -#define D_SYSLOG_HOST_NOT_FOUND "System лог хост не найден" +#define D_SYSLOG_HOST_NOT_FOUND "Syslog хост не найден" // settings.ino #define D_SAVED_TO_FLASH_AT "Сохранено во флэш-память" @@ -253,42 +254,42 @@ #define D_ERASED_SECTOR "Стереть сектор" // xdrv_02_webserver.ino -#define D_NOSCRIPT "To use Tasmota, please enable JavaScript" +#define D_NOSCRIPT "Чтобы использовать Tasmota, пожалуйста включите JavaScript" #define D_SAFEBOOT "SAFEBOOT" #define D_MINIMAL_FIRMWARE_PLEASE_UPGRADE "Прошивка MINIMAL
    пожалуйста обновите" #define D_WEBSERVER_ACTIVE_ON "Веб-сервер активен" #define D_WITH_IP_ADDRESS "с IP-адресом" #define D_WEBSERVER_STOPPED "Веб-сервер остановлен" #define D_FILE_NOT_FOUND "Файл не найден" -#define D_REDIRECTED "Перенаправлено на адаптивный портал" -#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wifi менеджер устанавливает Точку Доступа и сохраняет станцию" -#define D_WIFIMANAGER_SET_ACCESSPOINT "Wifi менеджер установил Точку Доступа" +#define D_REDIRECTED "Перенаправлено на captive portal" +#define D_WIFIMANAGER_SET_ACCESSPOINT_AND_STATION "Wi-Fi менеджер устанавливает Точку Доступа и сохраняет станцию" +#define D_WIFIMANAGER_SET_ACCESSPOINT "Wi-Fi менеджер установить Точку Доступа" #define D_TRYING_TO_CONNECT "Попытка подключения устройства к сети" -#define D_RESTART_IN "Перезапуск" +#define D_RESTART_IN "Перезагрзука" #define D_SECONDS "секунд" -#define D_DEVICE_WILL_RESTART "Устройство будет перезапущено через несколько секунд" +#define D_DEVICE_WILL_RESTART "Устройство будет перезагружено через несколько секунд" #define D_BUTTON_TOGGLE "Переключить" -#define D_CONFIGURATION "Конфигурация" +#define D_CONFIGURATION "Настройки" #define D_INFORMATION "Информация" #define D_FIRMWARE_UPGRADE "Обновление прошивки" -#define D_MANAGEMENT "Consoles" +#define D_MANAGEMENT "Управление" #define D_CONSOLE "Консоль" -#define D_CONFIRM_RESTART "Подтвердить перезагрузку" +#define D_CONFIRM_RESTART "Перезагрузить устройство?" -#define D_CONFIGURE_MODULE "Конфигурация Модуля" -#define D_CONFIGURE_WIFI "Конфигурация WiFi" -#define D_CONFIGURE_MQTT "Конфигурация MQTT" -#define D_CONFIGURE_DOMOTICZ "Конфигурация Domoticz" -#define D_CONFIGURE_LOGGING "Конфигурация Logging" -#define D_CONFIGURE_OTHER "Конфигурация прочее" -#define D_CONFIRM_RESET_CONFIGURATION "Подтвердить Сброс Конфигурации" -#define D_RESET_CONFIGURATION "Сброс Конфигурации" -#define D_BACKUP_CONFIGURATION "Резервное копирование Конфигурации" -#define D_RESTORE_CONFIGURATION "Восстановление Конфигурации" -#define D_MAIN_MENU "Главное Меню" +#define D_CONFIGURE_MODULE "Настройки модуля" +#define D_CONFIGURE_WIFI "Настройки Wi-Fi" +#define D_CONFIGURE_MQTT "Настройки MQTT" +#define D_CONFIGURE_DOMOTICZ "Настройки Domoticz" +#define D_CONFIGURE_LOGGING "Настройки логирования" +#define D_CONFIGURE_OTHER "Прочие настрйки" +#define D_CONFIRM_RESET_CONFIGURATION "Выполнить cброс настроек?" +#define D_RESET_CONFIGURATION "Сброс настроек" +#define D_BACKUP_CONFIGURATION "Резервное копирование настроек" +#define D_RESTORE_CONFIGURATION "Восстановление настроек" +#define D_MAIN_MENU "Главное меню" -#define D_MODULE_PARAMETERS "Параметры модуля" +#define D_MODULE_PARAMETERS "Настройки модуля" #define D_MODULE_TYPE "Тип модуля" #define D_PULLUP_ENABLE "No Button/Switch pull-up" #define D_ADC "ADC" @@ -296,8 +297,8 @@ #define D_SERIAL_IN "Serial вход" #define D_SERIAL_OUT "Serial выход" -#define D_WIFI_PARAMETERS "Параметры Wifi" -#define D_SCAN_FOR_WIFI_NETWORKS "Сканирование беспроводных сетей Wifi" +#define D_WIFI_PARAMETERS "Настройки Wi-Fi" +#define D_SCAN_FOR_WIFI_NETWORKS "Сканирование сетей Wi-Fi" #define D_SCAN_DONE "Сканирование завершено" #define D_NO_NETWORKS_FOUND "Не найдено сетей" #define D_REFRESH_TO_SCAN_AGAIN "Обновить для повторного сканирования" @@ -307,62 +308,62 @@ #define D_WEP "WEP" #define D_WPA_PSK "WPA PSK" #define D_WPA2_PSK "WPA2 PSK" -#define D_AP1_SSID "WiFi Network" -#define D_AP1_SSID_HELP "Type or Select your WiFi Network" -#define D_AP2_SSID "WiFi Network 2" -#define D_AP2_SSID_HELP "Type your Alternative WiFi Network" -#define D_AP_PASSWORD "WiFi Пароль" -#define D_AP_PASSWORD_HELP "Enter your WiFi Password" -#define D_SELECT_YOUR_WIFI_NETWORK "Select your WiFi Network" -#define D_SHOW_MORE_WIFI_NETWORKS "Scan for all WiFi Networks" -#define D_SHOW_MORE_OPTIONS "More Options" -#define D_CHECK_CREDENTIALS "Please, check your credentials" -#define D_SUCCESSFUL_WIFI_CONNECTION "Successful WiFi Connection" -#define D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "Now you can close this window" -#define D_REDIRECTING_TO_NEW_IP "Redirecting to new device's IP address" +#define D_AP1_SSID "Wi-Fi Сеть" +#define D_AP1_SSID_HELP "Введите или выберите вашу Wi-Fi сеть" +#define D_AP2_SSID "Wi-Fi Сеть 2" +#define D_AP2_SSID_HELP "Введите дополнительную Wi-Fi сеть" +#define D_AP_PASSWORD "Пароль" +#define D_AP_PASSWORD_HELP "Введите пароль от сети Wi-Fi" +#define D_SELECT_YOUR_WIFI_NETWORK "Выберите вашу Wi-Fi сеть" +#define D_SHOW_MORE_WIFI_NETWORKS "Сканировать все сети Wi-Fi" +#define D_SHOW_MORE_OPTIONS "Больше настроек" +#define D_CHECK_CREDENTIALS "Пожалуйста, проверьте ваши учетные данные" +#define D_SUCCESSFUL_WIFI_CONNECTION "Успешное подключение к Wi-Fi" +#define D_NOW_YOU_CAN_CLOSE_THIS_WINDOW "Теперь вы можете закрыть это окно" +#define D_REDIRECTING_TO_NEW_IP "Переадресация на новый IP адрес устройства" -#define D_MQTT_PARAMETERS "Параметры MQTT" +#define D_MQTT_PARAMETERS "Настройки MQTT" #define D_CLIENT "Клиент" -#define D_FULL_TOPIC "Полный Топик" +#define D_FULL_TOPIC "Полный топик" -#define D_LOGGING_PARAMETERS "Параметры Logging" -#define D_SERIAL_LOG_LEVEL "Serial лог уровень" -#define D_MQTT_LOG_LEVEL "Mqtt log level" -#define D_WEB_LOG_LEVEL "Web лог уровень" -#define D_SYS_LOG_LEVEL "System лог уровень" +#define D_LOGGING_PARAMETERS "Настройки логирования" +#define D_SERIAL_LOG_LEVEL "Уровень логирования Serial" +#define D_MQTT_LOG_LEVEL "Уровень логирования MQTT" +#define D_WEB_LOG_LEVEL "Уровень логирования Web" +#define D_SYS_LOG_LEVEL "Уровень логирования Syslog" #define D_MORE_DEBUG "Дополнительная информация для отладки" -#define D_SYSLOG_HOST "System лог хост" -#define D_SYSLOG_PORT "System лог порт" -#define D_TELEMETRY_PERIOD "Период телеметрии" +#define D_SYSLOG_HOST "Порт Syslog" +#define D_SYSLOG_PORT "Хост Syslog" +#define D_TELEMETRY_PERIOD "Период отправки телеметрии" -#define D_OTHER_PARAMETERS "Параметры Прочие" -#define D_TEMPLATE "Template" -#define D_ACTIVATE "Activate" -#define D_DEVICE_NAME "Device Name" -#define D_WEB_ADMIN_PASSWORD "Пароль Web администратора" -#define D_MQTT_ENABLE "MQTT активен" +#define D_OTHER_PARAMETERS "Настройки Прочие" +#define D_TEMPLATE "Шаблон" +#define D_ACTIVATE "Активировать" +#define D_DEVICE_NAME "Имя устройства" +#define D_WEB_ADMIN_PASSWORD "Пароль веб-интерфейса" +#define D_MQTT_ENABLE "Включить MQTT" #define D_MQTT_TLS_ENABLE "MQTT TLS" #define D_HTTP_API "HTTP API" -#define D_HTTP_API_ENABLE "HTTP API активен" -#define D_FRIENDLY_NAME "Дружественное Имя" +#define D_HTTP_API_ENABLE "Включить HTTP API" +#define D_FRIENDLY_NAME "Понятное имя устройства" #define D_BELKIN_WEMO "Belkin WeMo" #define D_HUE_BRIDGE "Hue Bridge" #define D_SINGLE_DEVICE "одиночное" #define D_MULTI_DEVICE "мульти" -#define D_CONFIGURE_TEMPLATE "Конфигурация Template" -#define D_TEMPLATE_PARAMETERS "Параметры Template" -#define D_TEMPLATE_NAME "Name" -#define D_BASE_TYPE "Based on" -#define D_TEMPLATE_FLAGS "Options" +#define D_CONFIGURE_TEMPLATE "Настройки шаблона" +#define D_TEMPLATE_PARAMETERS "Настройки шаблона" +#define D_TEMPLATE_NAME "Имя" +#define D_BASE_TYPE "На основе" +#define D_TEMPLATE_FLAGS "Настройки" -#define D_SAVE_CONFIGURATION "Сохранить конфигурацию" -#define D_CONFIGURATION_SAVED "Конфигурация сохранена " -#define D_CONFIGURATION_RESET "Конфигурация сброшена" +#define D_SAVE_CONFIGURATION "Сохранить настройки" +#define D_CONFIGURATION_SAVED "Настройки сохранены " +#define D_CONFIGURATION_RESET "Настройки сброшены" #define D_PROGRAM_VERSION "Версия программы" -#define D_BUILD_DATE_AND_TIME "Дата & Время сборки" -#define D_CORE_AND_SDK_VERSION "Версия Core/SDK" +#define D_BUILD_DATE_AND_TIME "Дата и время сборки" +#define D_CORE_AND_SDK_VERSION "Версия ядра/SDK" #define D_FLASH_WRITE_COUNT "Кол-во записей Flash" #define D_MAC_ADDRESS "MAC Адрес" #define D_MQTT_HOST "MQTT Хост" @@ -380,47 +381,47 @@ #define D_FLASH_CHIP_SIZE "Размер Flash памяти" #define D_FREE_PROGRAM_SPACE "Свободное пространство программ" -#define D_UPGRADE_BY_WEBSERVER "Обновление через Веб-сервер" -#define D_OTA_URL "OTA Url" +#define D_UPGRADE_BY_WEBSERVER "Обновление через веб-сервер" +#define D_OTA_URL "Ссылка OTA" #define D_START_UPGRADE "Начать обновление" -#define D_UPGRADE_BY_FILE_UPLOAD "Обновление путем загрузки файлов" -#define D_UPLOAD_FACTORY "Switching to safeboot partition" +#define D_UPGRADE_BY_FILE_UPLOAD "Обновление путем загрузки файлa" +#define D_UPLOAD_FACTORY "Переключение на раздел safeboot" #define D_UPLOAD_STARTED "Загрузка началась" #define D_UPGRADE_STARTED "Обновление началось" #define D_UPLOAD_DONE "Загрузка завершена" #define D_UPLOAD_TRANSFER "Upload transfer" -#define D_TRANSFER_STARTED "Transfer started" +#define D_TRANSFER_STARTED "Передача началась" #define D_UPLOAD_ERR_1 "Файл не выбран" #define D_UPLOAD_ERR_2 "Недостаточно места" -#define D_UPLOAD_ERR_3 "Invalid file signature" +#define D_UPLOAD_ERR_3 "Неверная подпись файла" #define D_UPLOAD_ERR_4 "Размер прошивки больше, чем реальный размер флеш памяти" #define D_UPLOAD_ERR_5 "Ошибка загрузки буфера" #define D_UPLOAD_ERR_6 "Ошибка загрузки. Включено лог уровня 3" #define D_UPLOAD_ERR_7 "Загрузка прервана" #define D_UPLOAD_ERR_8 "Файл неверный" #define D_UPLOAD_ERR_9 "Слишком большой файл" -#define D_UPLOAD_ERR_10 "Failed to init RF chip" -#define D_UPLOAD_ERR_11 "Failed to erase RF chip" -#define D_UPLOAD_ERR_12 "Failed to write to RF chip" -#define D_UPLOAD_ERR_13 "Failed to decode RF firmware" -#define D_UPLOAD_ERR_14 "Not compatible" +#define D_UPLOAD_ERR_10 "Не удалось инициализировать RF чип" +#define D_UPLOAD_ERR_11 "Не удалось стереть RF чип" +#define D_UPLOAD_ERR_12 "Не удалось записать в RF чип" +#define D_UPLOAD_ERR_13 "Не удалось декодировать прошивку RF чипа" +#define D_UPLOAD_ERR_14 "Не совместимо" #define D_UPLOAD_ERROR_CODE "Код ошибки загрузки" #define D_ENTER_COMMAND "Введите команду" -#define D_ENABLE_WEBLOG_FOR_RESPONSE "Включить Веб лог уровня 2 если ожидается ответ" +#define D_ENABLE_WEBLOG_FOR_RESPONSE "Включите веб лог уровня 2 если ожидается ответ" #define D_NEED_USER_AND_PASSWORD "Ожидается user=&password=" // xdrv_01_mqtt.ino -#define D_FINGERPRINT "Проверка TLS Fingerprint..." -#define D_TLS_CONNECT_FAILED_TO "Сбой подключения TLS к" +#define D_FINGERPRINT "Проверка отпечатка TLS..." +#define D_TLS_CONNECT_FAILED_TO "Сбой TLS подключения к" #define D_RETRY_IN "Повторить" -#define D_VERIFIED "Проверено Fingerprint" -#define D_INSECURE "Небезопасное соединение, недействительный Fingerprint" +#define D_VERIFIED "Отпечаток проверен" +#define D_INSECURE "Соединение небезопасно, неверный отпечаток" #define D_CONNECT_FAILED_TO "Ошибка подключения к" // xplg_wemohue.ino #define D_MULTICAST_DISABLED "Multicast отключен" -#define D_MULTICAST_REJOINED "Multicast (ре)соединился" +#define D_MULTICAST_REJOINED "Multicast (пере)подключился" #define D_MULTICAST_JOIN_FAILED "Multicast ошибка соединения" #define D_FAILED_TO_SEND_RESPONSE "Не удалось отправить ответ" @@ -428,18 +429,18 @@ #define D_WEMO_BASIC_EVENT "WeMo основное событие" #define D_WEMO_EVENT_SERVICE "WeMo служба событий" #define D_WEMO_META_SERVICE "WeMo мета-сервис" -#define D_WEMO_SETUP "WeMo настройка" +#define D_WEMO_SETUP "Найстрока WeMo" #define D_RESPONSE_SENT "Ответ отправлен" #define D_HUE "Hue" -#define D_HUE_BRIDGE_SETUP "Hue настройка" +#define D_HUE_BRIDGE_SETUP "Настройки Hue" #define D_HUE_API_NOT_IMPLEMENTED "Hue API не реализовано" #define D_HUE_API "Hue API" -#define D_HUE_POST_ARGS "Hue POST args" +#define D_HUE_POST_ARGS "Hue POST арг." #define D_3_RESPONSE_PACKETS_SENT "3 ответных пакета получено" // xdrv_07_domoticz.ino -#define D_DOMOTICZ_PARAMETERS "Параметры Domoticz" +#define D_DOMOTICZ_PARAMETERS "Настройки Domoticz" #define D_DOMOTICZ_IDX "Idx" #define D_DOMOTICZ_KEY_IDX "Key idx" #define D_DOMOTICZ_SWITCH_IDX "Switch idx" @@ -457,35 +458,35 @@ #define D_DOMOTICZ_UPDATE_TIMER "Update timer" // xdrv_09_timers.ino -#define D_CONFIGURE_TIMER "Конфигурация Timer" -#define D_TIMER_PARAMETERS "Параметры Timer" -#define D_TIMER_ENABLE "Enable Timers" -#define D_TIMER_ARM "Arm" -#define D_TIMER_TIME "Time" -#define D_TIMER_DAYS "Days" -#define D_TIMER_REPEAT "Repeat" -#define D_TIMER_OUTPUT "Output" -#define D_TIMER_ACTION "Action" +#define D_CONFIGURE_TIMER "Настройки таймера" +#define D_TIMER_PARAMETERS "Настройки таймера" +#define D_TIMER_ENABLE "Включить таймеры" +#define D_TIMER_ARM "Включить" +#define D_TIMER_TIME "Время" +#define D_TIMER_DAYS "Дни" +#define D_TIMER_REPEAT "Повторять" +#define D_TIMER_OUTPUT "Выход" +#define D_TIMER_ACTION "Действие" // xdrv_10_knx.ino -#define D_CONFIGURE_KNX "Конфигурация KNX" -#define D_KNX_PARAMETERS "Параметры KNX" +#define D_CONFIGURE_KNX "Настройки KNX" +#define D_KNX_PARAMETERS "Настройки KNX" #define D_KNX_GENERAL_CONFIG "General" -#define D_KNX_PHYSICAL_ADDRESS "Physical Address" -#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Must be unique on the KNX network )" -#define D_KNX_ENABLE "Enable KNX" -#define D_KNX_GROUP_ADDRESS_TO_WRITE "Data to Send to Group Addresses" -#define D_ADD "Add" -#define D_DELETE "Delete" -#define D_REPLY "Reply" -#define D_KNX_GROUP_ADDRESS_TO_READ "Group Addresses to Receive Data from" -#define D_RECEIVED_FROM "Received from" -#define D_KNX_COMMAND_WRITE "Write" -#define D_KNX_COMMAND_READ "Read" -#define D_KNX_COMMAND_OTHER "Other" -#define D_SENT_TO "sent to" -#define D_KNX_WARNING "The group address ( 0 / 0 / 0 ) is reserved and can not be used." -#define D_KNX_ENHANCEMENT "Communication Enhancement" +#define D_KNX_PHYSICAL_ADDRESS "Физический адрес" +#define D_KNX_PHYSICAL_ADDRESS_NOTE "( Должен быть уникальным в сети KNX )" +#define D_KNX_ENABLE "Включить KNX" +#define D_KNX_GROUP_ADDRESS_TO_WRITE "Данные для отправки на групповые адреса" +#define D_ADD "Добавить" +#define D_DELETE "Удалить" +#define D_REPLY "Ответ" +#define D_KNX_GROUP_ADDRESS_TO_READ "Групповые адреса для получения данных" +#define D_RECEIVED_FROM "Получено от" +#define D_KNX_COMMAND_WRITE "Запись" +#define D_KNX_COMMAND_READ "Чтение" +#define D_KNX_COMMAND_OTHER "Другая" +#define D_SENT_TO "отправить" +#define D_KNX_WARNING "Групповой адрес ( 0 / 0 / 0 ) является зарезервированым и не может быть использован." +#define D_KNX_ENHANCEMENT "Улучшение связи" #define D_KNX_TX_SLOT "KNX TX" #define D_KNX_RX_SLOT "KNX RX" #define D_KNX_TX_SCENE "KNX SCENE TX" @@ -522,25 +523,25 @@ // xdrv_89_dali.ino #define D_SENSOR_DALI_RX "Dali RX" #define D_SENSOR_DALI_TX "Dali TX" -#define D_CONFIGURE_DALI "Конфигурация DALI" +#define D_CONFIGURE_DALI "Настройки DALI" // xdrv_03_energy.ino -#define D_ENERGY_TODAY "Энергия Сегодня" -#define D_ENERGY_YESTERDAY "Энергия Вчера" -#define D_ENERGY_TOTAL "Энергия Всего" +#define D_ENERGY_TODAY "Энергия сегодня" +#define D_ENERGY_YESTERDAY "Энергия вчера" +#define D_ENERGY_TOTAL "Энергия всего" // xdrv_27_shutter.ino -#define D_OPEN "Open" -#define D_CLOSE "Close" -#define D_DOMOTICZ_SHUTTER "Shutter" +#define D_OPEN "Отрыть" +#define D_CLOSE "Закрыть" +#define D_DOMOTICZ_SHUTTER "Жалюзи" // xdrv_28_pcf8574.ino -#define D_CONFIGURE_PCF8574 "Configure PCF8574" -#define D_PCF8574_PARAMETERS "PCF8574 parameters" -#define D_INVERT_PORTS "Invert Ports" -#define D_DEVICE "Device" -#define D_DEVICE_INPUT "Input" -#define D_DEVICE_OUTPUT "Output" +#define D_CONFIGURE_PCF8574 "Настройки PCF8574" +#define D_PCF8574_PARAMETERS "Настройки PCF8574" +#define D_INVERT_PORTS "Инвертировать порты" +#define D_DEVICE "Устройство" +#define D_DEVICE_INPUT "Вход" +#define D_DEVICE_OUTPUT "Выход" // xsns_05_ds18b20.ino #define D_SENSOR_BUSY "Датчик DS18x20 занят" @@ -548,7 +549,7 @@ #define D_SENSORS_FOUND "Датчик DS18x20 найден" // xsns_06_dht.ino -#define D_TIMEOUT_WAITING_FOR "Тайм-аут, в ожидании" +#define D_TIMEOUT_WAITING_FOR "Превышено время ожидания" #define D_START_SIGNAL_LOW "сигнал старт низкий" #define D_START_SIGNAL_HIGH "сигнал старт высокий" #define D_PULSE "пульс" @@ -561,10 +562,10 @@ // xsns_18_pms5003.ino #define D_STANDARD_CONCENTRATION "CF-1 PM" // Standard Particle CF-1 Particle Matter #define D_ENVIRONMENTAL_CONCENTRATION "PM" // Environmetal Particle Matter -#define D_PARTICALS_BEYOND "Particals" +#define D_PARTICALS_BEYOND "Частицы" // xsns_27_apds9960.ino -#define D_GESTURE "Gesture" +#define D_GESTURE "Жест" #define D_COLOR_RED "Red" #define D_COLOR_GREEN "Green" #define D_COLOR_BLUE "Blue" @@ -572,12 +573,12 @@ #define D_PROXIMITY "Proximity" // xsns_32_mpu6050.ino -#define D_AX_AXIS "Accel. X-Axis" -#define D_AY_AXIS "Accel. Y-Axis" -#define D_AZ_AXIS "Accel. Z-Axis" -#define D_GX_AXIS "Gyro X-Axis" -#define D_GY_AXIS "Gyro Y-Axis" -#define D_GZ_AXIS "Gyro Z-Axis" +#define D_AX_AXIS "Ускор. ось X" +#define D_AY_AXIS "Ускор. ось Y" +#define D_AZ_AXIS "Ускор. ось Z" +#define D_GX_AXIS "Гироскоп ось X" +#define D_GY_AXIS "Гироскоп ось Y" +#define D_GZ_AXIS "Гироскоп ось Z" // xsns_33_QMC5883L.ino #define D_MX "Induction X-Axis" @@ -588,25 +589,25 @@ // xsns_34_hx711.ino #define D_HX_CAL_REMOVE "Remove weight" #define D_HX_CAL_REFERENCE "Load reference weight" -#define D_HX_CAL_DONE "Calibrated" -#define D_HX_CAL_FAIL "Calibration failed" -#define D_RESET_HX711 "Reset Scale" -#define D_CONFIGURE_HX711 "Configure Scale" -#define D_HX711_PARAMETERS "Scale parameters" -#define D_ITEM_WEIGHT "Item weight" -#define D_REFERENCE_WEIGHT "Reference weight" -#define D_CALIBRATE "Calibrate" -#define D_CALIBRATION "Calibration" +#define D_HX_CAL_DONE "Откалибровано" +#define D_HX_CAL_FAIL "Ошибка калибровки" +#define D_RESET_HX711 "Сбросить весы" +#define D_CONFIGURE_HX711 "Настроить весы" +#define D_HX711_PARAMETERS "Параметры весов" +#define D_ITEM_WEIGHT "Вес предмета" +#define D_REFERENCE_WEIGHT "Калибровочный вес" +#define D_CALIBRATE "Калибровать" +#define D_CALIBRATION "Калибровка" //xsns_35_tx20.ino -#define D_TX20_WIND_DIRECTION "Wind Direction" -#define D_TX20_WIND_SPEED "Wind Speed" -#define D_TX20_WIND_SPEED_MIN "Wind Speed Min" -#define D_TX20_WIND_SPEED_MAX "Wind Speed Max" -#define D_TX20_NORTH "N" -#define D_TX20_EAST "E" -#define D_TX20_SOUTH "S" -#define D_TX20_WEST "W" +#define D_TX20_WIND_DIRECTION "Направление ветра" +#define D_TX20_WIND_SPEED "Скорость ветра" +#define D_TX20_WIND_SPEED_MIN "Мин. скорость ветра" +#define D_TX20_WIND_SPEED_MAX "Макс. скорость ветра" +#define D_TX20_NORTH "С" +#define D_TX20_EAST "В" +#define D_TX20_SOUTH "Ю" +#define D_TX20_WEST "З" // xsns_53_sml.ino #define D_TPWRIN "Energy Total-In" @@ -631,8 +632,8 @@ #define D_SpL1L2L3 "Voltage L1+L2+L3/3" // xsns_86_tfminiplus.ino -#define D_SIGNALSTRENGTH "Signal Strength" -#define D_CHIPTEMPERATURE "Chip Temperature" +#define D_SIGNALSTRENGTH "Сила сигнала" +#define D_CHIPTEMPERATURE "Температура чипа" // tasmota_template.h - keep them as short as possible to be able to fit them in GUI drop down box #define D_SENSOR_NONE "-нет-" @@ -656,15 +657,15 @@ #define D_SENSOR_DFR562 "MP3 Player" #define D_SENSOR_DFR562_BUSY "MP3 Busy" #define D_SENSOR_IRSEND "IRsend" -#define D_SENSOR_SWITCH "Свич" // Suffix "1" +#define D_SENSOR_SWITCH "Переключ." // Suffix "1" #define D_SENSOR_BUTTON "Кнопка" // Suffix "1" #define D_SENSOR_RELAY "Реле" // Suffix "1i" #define D_SENSOR_LED "Led" // Suffix "1i" #define D_SENSOR_LED_LINK "LedLink" // Suffix "i" -#define D_SENSOR_PWM "PWM" // Suffix "1" +#define D_SENSOR_PWM "ШИМ" // Suffix "1" #define D_SENSOR_COUNTER "Счетчик" // Suffix "1" -#define D_SENSOR_INTERRUPT "Interrupt" -#define D_SENSOR_INPUT "Input" +#define D_SENSOR_INTERRUPT "Прерывание" +#define D_SENSOR_INPUT "Вход" #define D_SENSOR_IRRECV "IRrecv" #define D_SENSOR_MHZ_RX "MHZ Rx" #define D_SENSOR_MHZ_TX "MHZ Tx" @@ -685,7 +686,7 @@ #define D_SENSOR_SDIO_D1 "SDIO D1" #define D_SENSOR_SDIO_D2 "SDIO D2" #define D_SENSOR_SDIO_D3 "SDIO D3" -#define D_SENSOR_BACKLIGHT "Backlight" +#define D_SENSOR_BACKLIGHT "Подсветка" #define D_SENSOR_PMS5003_TX "PMS5003 Tx" #define D_SENSOR_PMS5003_RX "PMS5003 Rx" #define D_SENSOR_SDS0X1_RX "SDS0X1 Rx" @@ -784,7 +785,7 @@ #define D_SENSOR_ADE7953_IRQ "ADE7953 IRQ" #define D_SENSOR_ADE7953_RST "ADE7953 RST" #define D_SENSOR_ADE7953_CS "ADE7953 CS" -#define D_SENSOR_BUZZER "Buzzer" +#define D_SENSOR_BUZZER "Зуммер" #define D_SENSOR_DISP_RESET "Display Rst" #define D_SENSOR_ZIGBEE_TXD "Zigbee Tx" #define D_SENSOR_ZIGBEE_RXD "Zigbee Rx" @@ -840,11 +841,11 @@ #define D_SENSOR_TELEINFO_RX "TInfo Rx" #define D_SENSOR_TELEINFO_ENABLE "TInfo EN" #define D_SENSOR_LMT01_PULSE "LMT01 Pulse" -#define D_SENSOR_ADC_INPUT "ADC Input" -#define D_SENSOR_ADC_TEMP "ADC Temp" -#define D_SENSOR_ADC_LIGHT "ADC Light" -#define D_SENSOR_ADC_BUTTON "ADC Button" -#define D_SENSOR_ADC_RANGE "ADC Range" +#define D_SENSOR_ADC_INPUT "ADC Вход" +#define D_SENSOR_ADC_TEMP "ADC Темп." +#define D_SENSOR_ADC_LIGHT "ADC Свет" +#define D_SENSOR_ADC_BUTTON "ADC Кнопка" +#define D_SENSOR_ADC_RANGE "ADC Диапазон" #define D_SENSOR_ADC_CT_POWER "ADC CT Power" #define D_SENSOR_ADC_JOYSTICK "ADC Joystick" #define D_SENSOR_ADC_PH "ADC pH" @@ -912,7 +913,7 @@ #define D_SENSOR_BL6523_TX "BL6523 Tx" #define D_SENSOR_BL6523_RX "BL6523 Rx" #define D_SENSOR_HEARTBEAT "Heartbeat" -#define D_SENSOR_RESET "Reset" +#define D_SENSOR_RESET "Сброс" #define D_GPIO_SHIFT595_SRCLK "74x595 SRCLK" #define D_GPIO_SHIFT595_RCLK "74x595 RCLK" #define D_GPIO_SHIFT595_OE "74x595 OE" @@ -1007,54 +1008,54 @@ #define D_RESETTABLE_TOTAL_ACTIVE "Total Active (RST)" //SOLAXX1 -#define D_PV1_VOLTAGE "PV1 Voltage" -#define D_PV1_CURRENT "PV1 Current" -#define D_PV1_POWER "PV1 Power" -#define D_PV2_VOLTAGE "PV2 Voltage" -#define D_PV2_CURRENT "PV2 Current" -#define D_PV2_POWER "PV2 Power" -#define D_SOLAR_POWER "Solar Power" -#define D_INVERTER_POWER "Inverter Power" -#define D_STATUS "Status" -#define D_SOLAX_MODE_0 "Waiting" -#define D_SOLAX_MODE_1 "Checking" -#define D_SOLAX_MODE_2 "Working" -#define D_SOLAX_MODE_3 "Failure" -#define D_SOLAX_MODE_4 "Permanent Failure" // to be translated -#define D_SOLAX_MODE_5 "Software Update" // to be translated -#define D_SOLAX_MODE_6 "Selftest" // to be translated -#define D_SOLAX_ERROR_0 "No Error Code" -#define D_SOLAX_ERROR_1 "Grid Lost Fault" -#define D_SOLAX_ERROR_2 "Grid Voltage Fault" -#define D_SOLAX_ERROR_3 "Grid Frequency Fault" -#define D_SOLAX_ERROR_4 "Pv Voltage Fault" -#define D_SOLAX_ERROR_5 "Isolation Fault" -#define D_SOLAX_ERROR_6 "Over Temperature Fault" -#define D_SOLAX_ERROR_7 "Fan Fault" -#define D_SOLAX_ERROR_8 "Other Device Fault" +#define D_PV1_VOLTAGE "Напряжение PV1" +#define D_PV1_CURRENT "Ток PV1" +#define D_PV1_POWER "Мощность PV1" +#define D_PV2_VOLTAGE "Напряжение PV2" +#define D_PV2_CURRENT "Напряжение PV2" +#define D_PV2_POWER "Мощность PV2" +#define D_SOLAR_POWER "Мощность солнца" +#define D_INVERTER_POWER "Мощность инвертора" +#define D_STATUS "Статус" +#define D_SOLAX_MODE_0 "Ожидание" +#define D_SOLAX_MODE_1 "Проверка" +#define D_SOLAX_MODE_2 "Работает" +#define D_SOLAX_MODE_3 "Сбой" +#define D_SOLAX_MODE_4 "Постоянный сбой" +#define D_SOLAX_MODE_5 "Обновление ПО" +#define D_SOLAX_MODE_6 "Самопроверка" +#define D_SOLAX_ERROR_0 "Нет кода ошибки" +#define D_SOLAX_ERROR_1 "Ошибка: потеря сети" +#define D_SOLAX_ERROR_2 "Ошибка: напряжение сети" +#define D_SOLAX_ERROR_3 "Ошибка: частота сети" +#define D_SOLAX_ERROR_4 "Ошибка: напряжение Pv" +#define D_SOLAX_ERROR_5 "Ошибка: изоляция" +#define D_SOLAX_ERROR_6 "Ошибка: перегрев" +#define D_SOLAX_ERROR_7 "Сбой ветилятора" +#define D_SOLAX_ERROR_8 "Другой сбой устройства" //xdrv_10_scripter.ino -#define D_CONFIGURE_SCRIPT "Edit script" -#define D_SCRIPT "edit script" -#define D_SDCARD_UPLOAD "file upload" -#define D_UFSDIR "ufs directory" -#define D_UPL_DONE "Done" -#define D_SCRIPT_CHARS_LEFT "chars left" -#define D_SCRIPT_CHARS_NO_MORE "no more chars" -#define D_SCRIPT_DOWNLOAD "Download" -#define D_SCRIPT_ENABLE "script enable" -#define D_SCRIPT_UPLOAD "Upload" -#define D_SCRIPT_UPLOAD_FILES "Upload files" +#define D_CONFIGURE_SCRIPT "Редактировать скрипт" +#define D_SCRIPT "редактировать скрипт" +#define D_SDCARD_UPLOAD "загрузка файлов" +#define D_UFSDIR "директория ufs" +#define D_UPL_DONE "Готово" +#define D_SCRIPT_CHARS_LEFT "символов осталось" +#define D_SCRIPT_CHARS_NO_MORE "больше нет символов" +#define D_SCRIPT_DOWNLOAD "Скачать" +#define D_SCRIPT_ENABLE "скрипт включен" +#define D_SCRIPT_UPLOAD "Загрузить" +#define D_SCRIPT_UPLOAD_FILES "Загрузить файлы" //xdrv_50_filesystem.ino -#define D_MANAGE_FILE_SYSTEM "Manage File system" -#define D_FS_SIZE "Size" -#define D_FS_FREE "Free" +#define D_MANAGE_FILE_SYSTEM "Управление файловой системой" +#define D_FS_SIZE "Размер" +#define D_FS_FREE "Свободно" #define D_NEW_FILE "newfile.txt" -#define D_CREATE_NEW_FILE "Create and edit new file" -#define D_EDIT_FILE "Edit File" -#define D_CONFIRM_FILE_DEL "Confirm file deletion" -#define D_SHOW_HIDDEN_FILES "Show hidden files" +#define D_CREATE_NEW_FILE "Создать и редактировать новый файл" +#define D_EDIT_FILE "Редактировать файл" +#define D_CONFIRM_FILE_DEL "Подтвердите удаление файла" +#define D_SHOW_HIDDEN_FILES "Показывать скрытые файлы" //xsns_67_as3935.ino #define D_AS3935_GAIN "gain:" From 5c8c7cdfca54da8d5a0c0408e72271c9f3f9f881 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 5 Aug 2023 15:11:10 +0200 Subject: [PATCH 136/150] Prepare for Arduino v3 / esp-idf v5 (#19264) --- CHANGELOG.md | 1 + .../ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp | 12 ------------ .../src/esp8266toEsp32.cpp | 7 ++++++- tasmota/tasmota_support/settings.ino | 3 +++ .../tasmota_support/support_crash_recorder.ino | 5 ++++- tasmota/tasmota_support/support_esp.ino | 15 ++++++++++++++- tasmota/tasmota_support/support_tasmota.ino | 2 ++ .../xdrv_52_3_berry_tcpclientasync.ino | 7 ++++++- tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino | 8 ++++---- tasmota/tasmota_xsns_sensor/xsns_02_analog.ino | 2 ++ .../xsns_127_esp32_sensors.ino | 12 ++++++------ 11 files changed, 48 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d403a8130..d5700d487 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file. - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature (#19210) - Berry bytes `get` and `set` work for 3 bytes values (#19225) - Matter support for fabric_filtered request (for Google compatibility) (#19249) +- Prepare for Arduino v3 / esp-idf v5 ### Breaking Changed diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp index d5d8edb3c..ea288d547 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/ESP32Wifi.cpp @@ -111,18 +111,6 @@ void WiFiClass32::scrubDNS(void) { } else { dns_setserver(i, IP4_ADDR_ANY); } -#else // USE_IPV6 - uint32_t ip_dns = ip_addr_get_ip4_u32(dns_getserver(i)); - // Step 1. save valid values from DNS - if (has_v4 && (uint32_t)ip_dns != 0) { - ip_addr_set_ip4_u32_val(dns_save4[i], ip_dns); - } - // Step 2. scrub addresses not supported - if (!has_v4) { - ip_addr_set_ip4_u32_val(dns_save4[i], 0L); - } - // Step 3. restore saved value - dns_setserver(i, &dns_save4[i]); #endif // USE_IPV6 } // AddLog(LOG_LEVEL_DEBUG, "IP>: DNS: from(%s %s) to (%s %s) has4/6:%i-%i", dns_entry0.c_str(), dns_entry1.c_str(), IPAddress(dns_getserver(0)).toString().c_str(), IPAddress(dns_getserver(1)).toString().c_str(), has_v4, has_v6); diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp index dfc8c3dab..c886a666d 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.cpp @@ -16,6 +16,7 @@ #ifdef ESP32 #include "Arduino.h" +#include "esp_idf_version.h" #include "esp8266toEsp32.h" #include "driver/ledc.h" @@ -33,7 +34,11 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D #else #define LEDC_DEFAULT_CLK LEDC_AUTO_CLK #endif -#define LEDC_MAX_BIT_WIDTH SOC_LEDC_TIMER_BIT_WIDE_NUM +#if (ESP_IDF_VERSION_MAJOR >= 5) + #define LEDC_MAX_BIT_WIDTH SOC_LEDC_TIMER_BIT_WIDTH +#else + #define LEDC_MAX_BIT_WIDTH SOC_LEDC_TIMER_BIT_WIDE_NUM +#endif // define our limits to ease any change from esp-idf #define MAX_TIMERS LEDC_TIMER_MAX // 4 timers for all ESP32 variants diff --git a/tasmota/tasmota_support/settings.ino b/tasmota/tasmota_support/settings.ino index 445940865..e6ac6e6b8 100644 --- a/tasmota/tasmota_support/settings.ino +++ b/tasmota/tasmota_support/settings.ino @@ -189,6 +189,9 @@ bool RtcRebootValid(void) { extern "C" { #include "spi_flash.h" +#if ESP_IDF_VERSION_MAJOR >= 5 + #include "spi_flash_mmap.h" +#endif } #ifdef ESP8266 diff --git a/tasmota/tasmota_support/support_crash_recorder.ino b/tasmota/tasmota_support/support_crash_recorder.ino index c3d6f63a9..07bcc8db4 100644 --- a/tasmota/tasmota_support/support_crash_recorder.ino +++ b/tasmota/tasmota_support/support_crash_recorder.ino @@ -160,7 +160,10 @@ void CrashDumpClear(void) // esp_err_t IRAM_ATTR esp_backtrace_print(int depth) #include "freertos/xtensa_api.h" -#if ESP_IDF_VERSION_MAJOR >= 4 +#if ESP_IDF_VERSION_MAJOR >= 5 + #include "esp_debug_helpers.h" + #include "esp_cpu_utils.h" +#elif ESP_IDF_VERSION_MAJOR >= 4 #include "esp_debug_helpers.h" #else // IDF 3.x #include "esp_panic.h" diff --git a/tasmota/tasmota_support/support_esp.ino b/tasmota/tasmota_support/support_esp.ino index 4315ee5d4..4d3373e15 100644 --- a/tasmota/tasmota_support/support_esp.ino +++ b/tasmota/tasmota_support/support_esp.ino @@ -240,6 +240,7 @@ String GetCodeCores(void) { // See libraries\ESP32\examples\ResetReason.ino #if ESP_IDF_VERSION_MAJOR > 3 // IDF 4+ + #include "esp_chip_info.h" #if CONFIG_IDF_TARGET_ESP32 // ESP32/PICO-D4 #include "esp32/rom/rtc.h" #elif CONFIG_IDF_TARGET_ESP32S2 // ESP32-S2 @@ -393,7 +394,12 @@ void NvsInfo(void) { // See Esp.cpp #include "Esp.h" -#include "esp_spi_flash.h" +#if ESP_IDF_VERSION_MAJOR >= 5 + // esp_spi_flash.h is deprecated, please use spi_flash_mmap.h instead + #include "spi_flash_mmap.h" +#else + #include "esp_spi_flash.h" +#endif #include #include #include @@ -423,6 +429,9 @@ extern "C" { #include "rom/spi_flash.h" #define ESP_FLASH_IMAGE_BASE 0x1000 #endif +#if ESP_IDF_VERSION_MAJOR >= 5 + #include "bootloader_common.h" +#endif uint32_t EspProgramSize(const char *label) { const esp_partition_t *part = esp_partition_find_first(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, label); @@ -874,8 +883,12 @@ typedef struct { pkg_version += ((word3 >> 2) & 0x1) << 3 return pkg_version */ +#if (ESP_IDF_VERSION_MAJOR >= 5) + uint32_t pkg_version = bootloader_common_get_chip_ver_pkg(); +#else uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG); uint32_t pkg_version = chip_ver & 0x7; +#endif // AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("HDW: ESP32 Model %d, Revision %d, Core %d, Package %d"), chip_info.model, chip_revision, chip_info.cores, chip_ver); diff --git a/tasmota/tasmota_support/support_tasmota.ino b/tasmota/tasmota_support/support_tasmota.ino index 4daeb4571..feb98c8a0 100644 --- a/tasmota/tasmota_support/support_tasmota.ino +++ b/tasmota/tasmota_support/support_tasmota.ino @@ -1921,6 +1921,8 @@ void TasConsoleInput(void) { // // This patched version of pinMode forces a full GPIO reset before setting new mode // +#include "driver/gpio.h" + extern "C" void ARDUINO_ISR_ATTR __pinMode(uint8_t pin, uint8_t mode); extern "C" void ARDUINO_ISR_ATTR pinMode(uint8_t pin, uint8_t mode) { diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino index 8c6fa9841..ba574920b 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_tcpclientasync.ino @@ -68,6 +68,7 @@ public: state = AsyncTCPState::INPROGRESS; // reset state } +#ifdef USE_IPV6 if (ip.type() == IPv6) { struct sockaddr_in6 *tmpaddr = (struct sockaddr_in6 *)&serveraddr; sockfd = socket(AF_INET6, SOCK_STREAM, 0); @@ -75,12 +76,15 @@ public: memcpy(tmpaddr->sin6_addr.un.u8_addr, &ip[0], 16); tmpaddr->sin6_port = htons(port); } else { +#endif struct sockaddr_in *tmpaddr = (struct sockaddr_in *)&serveraddr; sockfd = socket(AF_INET, SOCK_STREAM, 0); tmpaddr->sin_family = AF_INET; tmpaddr->sin_addr.s_addr = ip; tmpaddr->sin_port = htons(port); +#ifdef USE_IPV6 } +#endif if (sockfd < 0) { AddLog(LOG_LEVEL_DEBUG, "BRY: Error: socket: %d", errno); return 0; @@ -312,7 +316,7 @@ public: local_addr = IPAddress((uint32_t)(s->sin_addr.s_addr)); // return IPAddress((uint32_t)(s->sin_addr.s_addr)); } - +#ifdef USE_IPV6 // IPv6, but it might be IPv4 mapped address if (((struct sockaddr*)&local_address)->sa_family == AF_INET6) { struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *)&local_address; @@ -325,6 +329,7 @@ public: // return IPAddress(IPv6, (uint8_t*)(saddr6->sin6_addr.s6_addr)); } } +#endif // USE_IPV6 } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino index 49255b436..d63e8728c 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_9_berry.ino @@ -64,10 +64,10 @@ void checkBeTop(void) { * Use PSRAM if available \*********************************************************************************************/ extern "C" { - void *berry_malloc(uint32_t size); + void *berry_malloc(size_t size); void *berry_realloc(void *ptr, size_t size); #ifdef USE_BERRY_PSRAM - void *berry_malloc(uint32_t size) { + void *berry_malloc(size_t size) { return special_malloc(size); } void *berry_realloc(void *ptr, size_t size) { @@ -77,7 +77,7 @@ extern "C" { return special_calloc(num, size); } #else - void *berry_malloc(uint32_t size) { + void *berry_malloc(size_t size) { return malloc(size); } void *berry_realloc(void *ptr, size_t size) { @@ -89,7 +89,7 @@ extern "C" { #endif // USE_BERRY_PSRAM - void *berry_malloc32(uint32_t size) { + void *berry_malloc32(size_t size) { #ifdef USE_BERRY_IRAM return special_malloc32(size); #else diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index 59c469d12..c6c352b64 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -297,7 +297,9 @@ void AdcInit(void) { if (Adcs.present) { #ifdef ESP32 +#if ESP_IDF_VERSION_MAJOR < 5 analogSetClockDiv(1); // Default 1 +#endif #if CONFIG_IDF_TARGET_ESP32 analogSetWidth(ANALOG_RESOLUTION); // Default 12 bits (0 - 4095) #endif // CONFIG_IDF_TARGET_ESP32 diff --git a/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino b/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino index c50d9a82d..53b643557 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_127_esp32_sensors.ino @@ -33,7 +33,7 @@ #define XSNS_127 127 -#if CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) // Hall sensor is no more supported in esp-idf 5 #define HALLEFFECT_SAMPLE_COUNT 32 // 32 takes about 12 mS at 80MHz CPU frequency @@ -51,7 +51,7 @@ void Esp32SensorInit(void) { } } -#endif // CONFIG_IDF_TARGET_ESP32 +#endif // CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) void Esp32SensorShow(bool json) { bool json_end = false; @@ -84,7 +84,7 @@ void Esp32SensorShow(bool json) { } } -#if CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) // Hall sensor is no more supported in esp-idf 5 if (HEData.present) { int value = 0; for (uint32_t i = 0; i < HALLEFFECT_SAMPLE_COUNT; i++) { @@ -115,7 +115,7 @@ void Esp32SensorShow(bool json) { #endif // USE_WEBSERVER } } -#endif // CONFIG_IDF_TARGET_ESP32 +#endif // CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) if (json_end) { ResponseJsonEnd(); @@ -138,11 +138,11 @@ bool Xsns127(uint32_t function) { Esp32SensorShow(0); break; #endif // USE_WEBSERVER -#if CONFIG_IDF_TARGET_ESP32 +#if CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) // Hall sensor is no more supported in esp-idf 5 case FUNC_INIT: Esp32SensorInit(); break; -#endif // CONFIG_IDF_TARGET_ESP32 +#endif // CONFIG_IDF_TARGET_ESP32 && (ESP_IDF_VERSION_MAJOR < 5) } return result; } From e52c6105c6e74c7cbcd924195689d1e45748aba8 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 5 Aug 2023 15:41:12 +0200 Subject: [PATCH 137/150] Bump version to v13.0.0.4 --- CHANGELOG.md | 24 ++++++++++++++++-------- RELEASENOTES.md | 9 +++++---- tasmota/include/tasmota_version.h | 2 +- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5700d487..93bafed73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,26 +3,36 @@ All notable changes to this project will be documented in this file. ## [Unreleased] - Development -## [13.0.0.3] +## [13.0.0.4] +### Added +- ESP32 prepare for Arduino Core v3 and esp-idf v5 (#19264) + +### Breaking Changed + +### Changed +- Console height from default 318 pixels to viewport (#19241) +- Shutter button hold behaviour with grouptopic (#19263) + +### Fixed + +### Removed + +## [13.0.0.3] 20230805 ### Added - Support for MAX17043 fuel-gauge systems Lipo batteries (#18788) - Support for multiple PCA9685 with extended functionality (#18805) - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature (#19210) - Berry bytes `get` and `set` work for 3 bytes values (#19225) - Matter support for fabric_filtered request (for Google compatibility) (#19249) -- Prepare for Arduino v3 / esp-idf v5 - -### Breaking Changed ### Changed - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% (#19138) -- ESP32 Framework (Core) from v2.0.10 to v2.0.11 +- ESP32 Framework (Arduino Core) from v2.0.10 to v2.0.11 - Berry `mqtt.publish` now distinguishes between `string` and `bytes` (#19196) - IRremoteESP8266 library from v2.8.5 to v2.8.6 - ESP32 autodetect flashsize and adjust filesystem (#19215) - Reduced log level for TeleInfo (#19216) - Matter increased polling frequency for local switches/occupancy (#19242) -- Change console height from default 318 pixels to viewport (#19241) ### Fixed - Initial battery level percentage (#19160) @@ -34,8 +44,6 @@ All notable changes to this project will be documented in this file. - Matter support for large atribute responses (#19252) - Matter auto-configuration Relay indices (#19255) -### Removed - ## [13.0.0.2] 20230721 ### Added - Partition Wizard is now able to convert to safeboot from Shelly partition layout (#19034) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 2e9a45e3b..427f29da8 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -110,7 +110,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm [Complete list](BUILDS.md) of available feature and sensors. -## Changelog v13.0.0.3 +## Changelog v13.0.0.4 ### Added - Command ``BrRestart`` to restart the Berry VM (experimental) [#19003](https://github.com/arendst/Tasmota/issues/19003) - Command ``Delay -1`` to wait until next second [#18984](https://github.com/arendst/Tasmota/issues/18984) @@ -120,6 +120,7 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Support for SGP41 TVOC/NOx Sensor [#18880](https://github.com/arendst/Tasmota/issues/18880) - Support for DeepSleep battery level percentage [#19134](https://github.com/arendst/Tasmota/issues/19134) - Zigbee decode Aqara 0000/FF01 attribute 03 as Temperature [#19210](https://github.com/arendst/Tasmota/issues/19210) +- ESP32 prepare for Arduino Core v3 and esp-idf v5 [#19264](https://github.com/arendst/Tasmota/issues/19264) - Berry `getgbl` performance counter to `debug.counters()` [#19070](https://github.com/arendst/Tasmota/issues/19070) - Berry `_class` can be used in `static var` initialization code [#19088](https://github.com/arendst/Tasmota/issues/19088) - Berry `energy.update_total()` to call `EnergyUpdateTotal()` from energy driver [#19117](https://github.com/arendst/Tasmota/issues/19117) @@ -138,12 +139,13 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm ### Changed - IRremoteESP8266 library from v2.8.5 to v2.8.6 -- ESP32 Framework (Core) from v2.0.10 to v2.0.11 +- ESP32 Framework (Arduino Core) from v2.0.10 to v2.0.11 - ESP32 LVGL library from v8.3.7 to v8.3.8 (no functional change) - Initial ``DisplayMode`` from 1 to 0 and ``DisplayDimmmer`` from 10% to 50% [#19138](https://github.com/arendst/Tasmota/issues/19138) - Configuration backup and restore now supports ``.xdrvsetXXX`` files too [#18295](https://github.com/arendst/Tasmota/issues/18295) - Reduced log level for TeleInfo [#19216](https://github.com/arendst/Tasmota/issues/19216) -- Change console height from default 318 pixels to viewport [#19241](https://github.com/arendst/Tasmota/issues/19241) +- Console height from default 318 pixels to viewport [#19241](https://github.com/arendst/Tasmota/issues/19241) +- Shutter button hold behaviour with grouptopic [#19263](https://github.com/arendst/Tasmota/issues/19263) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 autodetect flashsize and adjust filesystem [#19215](https://github.com/arendst/Tasmota/issues/19215) - Berry extend `range(lower, upper, incr)` to arbitrary increment [#19120](https://github.com/arendst/Tasmota/issues/19120) @@ -155,7 +157,6 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Matter improve latency for single attribute reads and single commands [#19158](https://github.com/arendst/Tasmota/issues/19158) - Matter increased polling frequency for local switches/occupancy [#19242](https://github.com/arendst/Tasmota/issues/19242) - ### Fixed - Berry Walrus Operator [#18982](https://github.com/arendst/Tasmota/issues/18982) - MiElHVAC power commands regression from v12.4.0.1 [#18923](https://github.com/arendst/Tasmota/issues/18923) diff --git a/tasmota/include/tasmota_version.h b/tasmota/include/tasmota_version.h index acb8a752a..14d021c89 100644 --- a/tasmota/include/tasmota_version.h +++ b/tasmota/include/tasmota_version.h @@ -20,6 +20,6 @@ #ifndef _TASMOTA_VERSION_H_ #define _TASMOTA_VERSION_H_ -const uint32_t VERSION = 0x0D000003; // 13.0.0.3 +const uint32_t VERSION = 0x0D000004; // 13.0.0.4 #endif // _TASMOTA_VERSION_H_ From 0b3d6fd146722eb92c57f5a0855facbac0a98be1 Mon Sep 17 00:00:00 2001 From: s-hadinger <49731213+s-hadinger@users.noreply.github.com> Date: Sat, 5 Aug 2023 20:34:24 +0200 Subject: [PATCH 138/150] Prepare for Arduino v3 / esp-idf v5 2nd batch (#19265) --- .../TasmotaSerial-3.6.0/src/TasmotaSerial.cpp | 4 ++++ .../src/esp8266toEsp32.h | 2 +- lib/libesp32/berry_mapping/src/be_cb_module.c | 20 +++++++++---------- .../berry_matter/src/be_matter_misc.cpp | 6 ++++++ .../berry_matter/src/be_matter_qrcode.c | 2 +- .../berry_tasmota/include/be_ctypes.h | 8 +++++++- tasmota/tasmota.ino | 2 ++ .../support_crash_recorder.ino | 2 +- tasmota/tasmota_support/support_esp.ino | 18 ++++++++++++++--- .../xdrv_52_3_berry_flash.ino | 19 +++++++++++++++++- .../xdrv_52_3_berry_webclient.ino | 4 ++++ .../xdrv_68_zerocrossDimmer.ino | 6 ++++++ .../tasmota_xsns_sensor/xsns_02_analog.ino | 11 ++++++++++ 13 files changed, 86 insertions(+), 18 deletions(-) diff --git a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp index 18cfee1e0..9bdfb9733 100644 --- a/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp +++ b/lib/default/TasmotaSerial-3.6.0/src/TasmotaSerial.cpp @@ -39,6 +39,8 @@ TasmotaSerial *tms_obj_list[16]; #ifdef ESP32 #include "driver/uart.h" +#include "driver/gpio.h" +#include "esp_rom_gpio.h" static uint32_t tasmota_serial_uart_bitmap = 0; // Assigned UARTs @@ -466,6 +468,7 @@ size_t TasmotaSerial::write(uint8_t b) { return size; } +#ifdef ESP8266 void IRAM_ATTR TasmotaSerial::rxRead(void) { if (!m_nwmode) { uint32_t start = ESP.getCycleCount(); @@ -586,3 +589,4 @@ void IRAM_ATTR TasmotaSerial::rxRead(void) { } } } +#endif // ESP8266 diff --git a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h index c544d5d30..07bc9c2d5 100644 --- a/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h +++ b/lib/libesp32/ESP32-to-ESP8266-compat/src/esp8266toEsp32.h @@ -53,7 +53,7 @@ uint8_t ledcReadResolution(uint8_t chan); // was not yet attached. // // Returns: hardware channel number, or -1 if it failed -int analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated +int32_t analogAttach(uint32_t pin, bool output_invert = false); // returns the ledc channel, or -1 if failed. This is implicitly called by analogWrite if the channel was not already allocated // change both freq and range // `0`: set to global value diff --git a/lib/libesp32/berry_mapping/src/be_cb_module.c b/lib/libesp32/berry_mapping/src/be_cb_module.c index 7bf729a0b..111ba95e0 100644 --- a/lib/libesp32/berry_mapping/src/be_cb_module.c +++ b/lib/libesp32/berry_mapping/src/be_cb_module.c @@ -22,10 +22,10 @@ enum LoggingLevels {LOG_LEVEL_NONE, LOG_LEVEL_ERROR, LOG_LEVEL_INFO, LOG_LEVEL_D * We allow 4 parameters, or 3 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -typedef int32_t (*berry_callback_t)(int32_t v0, int32_t v1, int32_t v2, int32_t v3); -static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, int32_t v3); +typedef int (*berry_callback_t)(int v0, int v1, int v2, int v3); +static int call_berry_cb(int num, int v0, int v1, int v2, int v3); -#define BERRY_CB(n) int32_t berry_cb_##n(int32_t v0, int32_t v1, int32_t v2, int32_t v3) { return call_berry_cb(n, v0, v1, v2, v3); } +#define BERRY_CB(n) int berry_cb_##n(int v0, int v1, int v2, int v3) { return call_berry_cb(n, v0, v1, v2, v3); } // list the callbacks BERRY_CB(0); BERRY_CB(1); @@ -85,7 +85,7 @@ typedef struct be_callback_handler_list_t { static be_callback_hook be_cb_hooks[BE_MAX_CB] = {0}; -static int32_t be_cb_gen_cb(bvm *vm); +static int be_cb_gen_cb(bvm *vm); static be_callback_handler_list_t be_callback_default_gen_cb = { NULL, be_const_func(&be_cb_gen_cb), @@ -102,7 +102,7 @@ static be_callback_handler_list_t *be_callback_handler_list_head = &be_callback_ * * arg1: function (or closure) \*********************************************************************************************/ -static int32_t be_cb_add_handler(bvm *vm) { +static int be_cb_add_handler(bvm *vm) { int32_t top = be_top(vm); if (top >= 1 && be_isfunction(vm, 1)) { bvalue *v = be_indexof(vm, 1); @@ -129,7 +129,7 @@ static int32_t be_cb_add_handler(bvm *vm) { * * No args \*********************************************************************************************/ -static int32_t be_cb_list_handlers(bvm *vm) { +static int be_cb_list_handlers(bvm *vm) { be_newobject(vm, "list"); for (be_callback_handler_list_t *elt = be_callback_handler_list_head; elt != NULL; elt = elt->next) { if (elt->vm == vm) { /* on purpose don't show the default handler, just pretend it's not there since it's default */ @@ -153,7 +153,7 @@ static int32_t be_cb_list_handlers(bvm *vm) { * arg2: type name for callback (optional) * argN: any other callback specific arguments (unlimited number, passed as-is) \*********************************************************************************************/ -static int32_t be_cb_make_cb(bvm *vm) { +static int be_cb_make_cb(bvm *vm) { int32_t argc = be_top(vm); if (argc >= 1 && be_isfunction(vm, 1)) { @@ -187,7 +187,7 @@ static int32_t be_cb_make_cb(bvm *vm) { * * arg1: function (or closure) \*********************************************************************************************/ -static int32_t be_cb_gen_cb(bvm *vm) { +static int be_cb_gen_cb(bvm *vm) { int32_t top = be_top(vm); // tasmota_log_C(LOG_LEVEL_DEBUG, "BRY: gen_cb() called"); if (top >= 1 && be_isfunction(vm, 1)) { @@ -217,7 +217,7 @@ static int32_t be_cb_gen_cb(bvm *vm) { * `get_cb_list`: Return the list of callbacks for this vm * \*********************************************************************************************/ -static int32_t be_cb_get_cb_list(bvm *vm) { +static int be_cb_get_cb_list(bvm *vm) { be_newobject(vm, "list"); for (uint32_t i=0; i < BE_MAX_CB; i++) { if (be_cb_hooks[i].vm) { @@ -242,7 +242,7 @@ static int32_t be_cb_get_cb_list(bvm *vm) { * We allow 4 parameters, or 3 if method (first arg is `self`) * This could be extended if needed \*********************************************************************************************/ -static int32_t call_berry_cb(int32_t num, int32_t v0, int32_t v1, int32_t v2, int32_t v3) { +static int call_berry_cb(int num, int v0, int v1, int v2, int v3) { // call berry cb dispatcher int32_t ret = 0; // retrieve vm and function diff --git a/lib/libesp32/berry_matter/src/be_matter_misc.cpp b/lib/libesp32/berry_matter/src/be_matter_misc.cpp index 2ec805183..0e57c2aa5 100644 --- a/lib/libesp32/berry_matter/src/be_matter_misc.cpp +++ b/lib/libesp32/berry_matter/src/be_matter_misc.cpp @@ -31,6 +31,7 @@ static uint8_t ip_bytes[16] = {}; extern "C" const void* matter_get_ip_bytes(const char* ip_str, size_t* ret_len) { IPAddress ip; if (ip.fromString(ip_str)) { +#ifdef USE_IPV6 if (ip.isV4()) { uint32_t ip_32 = ip; memcpy(ip_bytes, &ip_32, 4); @@ -39,6 +40,11 @@ extern "C" const void* matter_get_ip_bytes(const char* ip_str, size_t* ret_len) memcpy(ip_bytes, ip.raw6(), 16); *ret_len = 16; } +#else + uint32_t ip_32 = ip; + memcpy(ip_bytes, &ip_32, 4); + *ret_len = 4; +#endif return ip_bytes; } else { *ret_len = 0; diff --git a/lib/libesp32/berry_matter/src/be_matter_qrcode.c b/lib/libesp32/berry_matter/src/be_matter_qrcode.c index 5bcddef86..9892cda93 100644 --- a/lib/libesp32/berry_matter/src/be_matter_qrcode.c +++ b/lib/libesp32/berry_matter/src/be_matter_qrcode.c @@ -32,7 +32,7 @@ // `matter.QRCode.encode_str(content:string) -> map` // -int32_t qr_encode_str(bvm *vm) { +int qr_encode_str(bvm *vm) { int32_t argc = be_top(vm); if (argc >= 1 && be_isstring(vm, 1)) { const char * data_str = be_tostring(vm, 1); diff --git a/lib/libesp32/berry_tasmota/include/be_ctypes.h b/lib/libesp32/berry_tasmota/include/be_ctypes.h index 5e029100b..abaffa8c3 100644 --- a/lib/libesp32/berry_tasmota/include/be_ctypes.h +++ b/lib/libesp32/berry_tasmota/include/be_ctypes.h @@ -60,7 +60,13 @@ typedef struct be_ctypes_classes_t { const be_ctypes_class_t * classes; } be_ctypes_classes_t; -BE_EXPORT_VARIABLE const bclass be_class_ctypes_bytes; +#ifdef __cplusplus +extern "C" { +#endif + extern const bclass be_class_ctypes_bytes; +#ifdef __cplusplus +} +#endif static void ctypes_register_class(bvm *vm, const bclass * ctypes_class) { be_pushntvclass(vm, ctypes_class); diff --git a/tasmota/tasmota.ino b/tasmota/tasmota.ino index 67a149347..a74efb45f 100644 --- a/tasmota/tasmota.ino +++ b/tasmota/tasmota.ino @@ -406,6 +406,7 @@ void setup(void) { #ifdef CONFIG_IDF_TARGET_ESP32 // restore GPIO16/17 if no PSRAM is found + #if ESP_IDF_VERSION_MAJOR < 5 // TODO for esp-idf 5 if (!FoundPSRAM()) { // test if the CPU is not pico uint32_t chip_ver = REG_GET_FIELD(EFUSE_BLK0_RDATA3_REG, EFUSE_RD_CHIP_VER_PKG); @@ -415,6 +416,7 @@ void setup(void) { gpio_reset_pin(GPIO_NUM_17); } } + #endif #endif // CONFIG_IDF_TARGET_ESP32 #endif // ESP32 diff --git a/tasmota/tasmota_support/support_crash_recorder.ino b/tasmota/tasmota_support/support_crash_recorder.ino index 07bcc8db4..bf55869cd 100644 --- a/tasmota/tasmota_support/support_crash_recorder.ino +++ b/tasmota/tasmota_support/support_crash_recorder.ino @@ -30,7 +30,7 @@ void CmndWDT(void) { volatile uint32_t dummy = 0; while (1) { - dummy++; + dummy = dummy + 1; } } diff --git a/tasmota/tasmota_support/support_esp.ino b/tasmota/tasmota_support/support_esp.ino index 4d3373e15..c7d284ae7 100644 --- a/tasmota/tasmota_support/support_esp.ino +++ b/tasmota/tasmota_support/support_esp.ino @@ -214,7 +214,6 @@ String GetCodeCores(void) { #ifdef ESP32 -#include "bootloader_flash.h" #include "soc/soc.h" #include "soc/spi_reg.h" // ESP32_ARCH contains the name of the architecture (used by autoconf) @@ -256,6 +255,10 @@ String GetCodeCores(void) { #include "rom/rtc.h" #endif +#if ESP_IDF_VERSION_MAJOR >= 5 + #include "esp_chip_info.h" +#endif + // Set the Stacksize for Arduino core. Default is 8192, some builds may need a bigger one size_t getArduinoLoopTaskStackSize(void) { return SET_ESP32_STACK_SIZE; @@ -724,7 +727,12 @@ uint8_t* FlashDirectAccess(void) { } extern "C" { - bool esp_spiram_is_initialized(void); + #if ESP_IDF_VERSION_MAJOR >= 5 + // bool IRAM_ATTR __attribute__((pure)) esp_psram_is_initialized(void) + bool esp_psram_is_initialized(void); + #else + bool esp_spiram_is_initialized(void); + #endif } // this function is a replacement for `psramFound()`. @@ -734,7 +742,11 @@ bool FoundPSRAM(void) { #if CONFIG_IDF_TARGET_ESP32C3 return psramFound(); #else - return psramFound() && esp_spiram_is_initialized(); + #if ESP_IDF_VERSION_MAJOR >= 5 + return psramFound() && esp_psram_is_initialized(); + #else + return psramFound() && esp_spiram_is_initialized(); + #endif #endif } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino index ca0af5319..6609ca082 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino @@ -21,9 +21,17 @@ #ifdef USE_BERRY #include -#include "esp_spi_flash.h" + +#include "esp_idf_version.h" +#if ESP_IDF_VERSION_MAJOR >= 5 + // esp_spi_flash.h is deprecated, please use spi_flash_mmap.h instead + #include "spi_flash_mmap.h" +#else + #include "esp_spi_flash.h" +#endif size_t FlashWriteSubSector(uint32_t address_start, const uint8_t *data, size_t size) { +#if ESP_IDF_VERSION_MAJOR < 5 uint32_t addr = address_start; size_t size_left = size; size_t current_offset = 0; @@ -59,6 +67,9 @@ size_t FlashWriteSubSector(uint32_t address_start, const uint8_t *data, size_t s } return current_offset; +#else + // TODO ESPIDF 5 +#endif } /*********************************************************************************************\ @@ -73,6 +84,7 @@ extern "C" { // If length is not specified, it is full block 4KB int32_t p_flash_read(struct bvm *vm); int32_t p_flash_read(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 1 && be_isint(vm, 1) && (argc < 2 || be_isint(vm, 2)) ) { // optional second argument must be int @@ -91,6 +103,7 @@ extern "C" { be_pushbytes(vm, buf.get(), length); be_return(vm); } +#endif be_raise(vm, kTypeError, nullptr); } @@ -98,6 +111,7 @@ extern "C" { // if `no_erase` is true, just call spi_flash_write int32_t p_flash_write(struct bvm *vm); int32_t p_flash_write(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isinstance(vm, 2)) { be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ @@ -126,6 +140,7 @@ extern "C" { } } } +#endif be_raise(vm, kTypeError, nullptr); } @@ -134,6 +149,7 @@ extern "C" { // Address and length must be 4KB aligned int32_t p_flash_erase(struct bvm *vm); int32_t p_flash_erase(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isint(vm, 2)) { int32_t address = be_toint(vm, 1); @@ -147,6 +163,7 @@ extern "C" { esp_err_t ret = spi_flash_erase_range(address, length); be_return_nil(vm); } +#endif be_raise(vm, kTypeError, nullptr); } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino index 9dcf44ccb..eb5b7feb4 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_webclient.ino @@ -582,6 +582,7 @@ public: size_t write(const uint8_t *buffer, size_t size) override { // AddLog(LOG_LEVEL_INFO, "FLASH: addr=%p hex=%*_H size=%i", addr_start + offset, 32, buffer, size); if (size > 0) { +#if ESP_IDF_VERSION_MAJOR < 5 // TODO later esp_err_t ret = spi_flash_write(addr_start + offset, buffer, size); if (ret != ESP_OK) { return 0; } // error offset += size; @@ -590,6 +591,7 @@ public: if (((offset - size) / STREAM_FLASH_PROGRESS_THRESHOLD) != (offset / STREAM_FLASH_PROGRESS_THRESHOLD)) { AddLog(LOG_LEVEL_DEBUG, D_LOG_UPLOAD "Progress %d kB", offset / 1024); } +#endif } return size; } @@ -611,6 +613,7 @@ protected: extern "C" { int32_t wc_writeflash(struct bvm *vm); int32_t wc_writeflash(struct bvm *vm) { +#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); if (argc >= 2 && be_isint(vm, 2)) { HTTPClientLight * cl = wc_getclient(vm); @@ -650,6 +653,7 @@ extern "C" { be_pushint(vm, written); be_return(vm); /* return code */ } +#endif be_raise(vm, kTypeError, nullptr); } } diff --git a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino index 2f504d673..e1856b5e3 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_68_zerocrossDimmer.ino @@ -24,6 +24,9 @@ #define XDRV_68 68 + +#if !defined(ESP32) || (ESP_IDF_VERSION_MAJOR < 5) // temporarily disable for IDF 5.0 + static const uint8_t TRIGGER_PERIOD = 75; #define ZCDIMMERSET_SHOW 1 @@ -298,4 +301,7 @@ bool Xdrv68(uint32_t function) } return result; } + +#endif // !enabled(ESP32) || (ESP_IDF_VERSION_MAJOR < 5) + #endif // USE_AC_ZERO_CROSS_DIMMER diff --git a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino index c6c352b64..0be99724e 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_02_analog.ino @@ -24,6 +24,12 @@ #define XSNS_02 2 +#ifdef ESP32 + #if ESP_IDF_VERSION_MAJOR >= 5 + #include "esp32-hal-adc.h" + #endif +#endif + #ifdef ESP8266 #define ANALOG_RESOLUTION 10 // 12 = 4095, 11 = 2047, 10 = 1023 #define ANALOG_RANGE 1023 // 4095 = 12, 2047 = 11, 1023 = 10 @@ -176,6 +182,11 @@ bool adcAttachPin(uint8_t pin) { return (ADC0_PIN == pin); } #endif +#if defined(ESP32) && (ESP_IDF_VERSION_MAJOR >= 5) + bool adcAttachPin(uint8_t pin) { + return true; // TODO - no more needed? + } +#endif void AdcSaveSettings(uint32_t idx) { char parameters[32]; From 7488ed03f0753f7608968e49cc9b904a64ece94f Mon Sep 17 00:00:00 2001 From: Jason2866 <24528715+Jason2866@users.noreply.github.com> Date: Sun, 6 Aug 2023 13:44:28 +0200 Subject: [PATCH 139/150] Tasmota based on Arduino 3.0.0 (#19270) --- boards/esp32c6.json | 44 +++++++++++ pio-tools/add_c_flags.py | 3 + platformio_override_sample.ini | 1 + platformio_tasmota32.ini | 2 +- platformio_tasmota_env32.ini | 42 +++++++++++ .../include/tasmota_configurations_ESP32.h | 75 +++++++++++++++++++ 6 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 boards/esp32c6.json diff --git a/boards/esp32c6.json b/boards/esp32c6.json new file mode 100644 index 000000000..919bcfdfe --- /dev/null +++ b/boards/esp32c6.json @@ -0,0 +1,44 @@ +{ + "build": { + "arduino":{ + "ldscript": "esp32c6_out.ld" + }, + "core": "esp32", + "extra_flags": "-DESP32_4M -DESP32C6", + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "dio", + "mcu": "esp32c6", + "variant": "esp32c6", + "partitions": "partitions/esp32_partition_app2880k_fs320k.csv" + }, + "connectivity": [ + "wifi", + "bluetooth" + ], + "debug": { + "openocd_target": "esp32c6.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Espressif Generic ESP32-C6 >= 4M Flash, Tasmota 2880k Code/OTA, 320k FS", + "upload": { + "arduino": { + "flash_extra_images": [ + [ + "0x10000", + "variants/tasmota/tasmota32c6-safeboot.bin" + ] + ] + }, + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://docs.espressif.com/projects/espressif-esp-dev-kits/en/latest/esp32c6/esp32-c6-devkitc-1/index.html", + "vendor": "Espressif" + } diff --git a/pio-tools/add_c_flags.py b/pio-tools/add_c_flags.py index 0c39e777f..020a77f82 100644 --- a/pio-tools/add_c_flags.py +++ b/pio-tools/add_c_flags.py @@ -2,3 +2,6 @@ Import("env") # General options that are passed to the C compiler (C only; not C++). env.Append(CFLAGS=["-Wno-discarded-qualifiers", "-Wno-implicit-function-declaration"]) + +# General options that are passed to the C++ compiler +env.Append(CXXFLAGS=["-Wno-volatile"]) \ No newline at end of file diff --git a/platformio_override_sample.ini b/platformio_override_sample.ini index 7d9b1d9e8..97290c0cd 100644 --- a/platformio_override_sample.ini +++ b/platformio_override_sample.ini @@ -28,6 +28,7 @@ default_envs = ; tasmota-zbbridge ; tasmota-ir ; tasmota32 +; tasmota32-arduino30 ; tasmota32-zbbrdgpro ; tasmota32-bluetooth ; tasmota32-webcam diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 30f42a99a..3aa0503dc 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -15,7 +15,7 @@ build_flags = ${esp_defaults.build_flags} -Wno-switch-unreachable -Wno-stringop-overflow -fno-exceptions - -flto + -flto=auto -DBUFFER_LENGTH=128 -DHTTP_UPLOAD_BUFLEN=2048 -DMQTT_MAX_PACKET_SIZE=1200 diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 337255131..08779ebe5 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -40,6 +40,48 @@ lib_ignore = ; tasmota/berry/modules/Partition_Manager.tapp custom_files_upload = no_files +[env:tasmota32-arduino30] +platform = https://github.com/Jason2866/platform-espressif32.git#Arduino/IDF5 +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/1457/framework-arduinoespressif32-release_v5.1-69cdc81680.zip +extends = env:tasmota32_base +board = esp32 +build_unflags = ${env:tasmota32_base.build_unflags} + -DUSE_IPV6 +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_ARDUINO30 + -DOTA_URL='""' +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + ESP Mail Client + IRremoteESP8266 + NeoPixelBus + OneWire + MFRC522 + universal display Library + ESP8266Audio + ESP8266SAM + +[env:tasmota32c6-safeboot] +platform = https://github.com/Jason2866/platform-espressif32.git#Arduino/IDF5 +platform_packages = framework-arduinoespressif32 @ https://github.com/Jason2866/esp32-arduino-lib-builder/releases/download/1457/framework-arduinoespressif32-release_v5.1-69cdc81680.zip +extends = env:tasmota32_base +board = esp32c6 +build_unflags = ${env:tasmota32_base.build_unflags} + -DUSE_IPV6 +build_flags = ${env:tasmota32_base.build_flags} + -DFIRMWARE_SAFEBOOT + -DOTA_URL='""' +lib_extra_dirs = lib/lib_ssl, lib/libesp32 +lib_ignore = + ESP Mail Client + IRremoteESP8266 + NeoPixelBus + OneWire + MFRC522 + universal display Library + ESP8266Audio + ESP8266SAM + [env:tasmota32-safeboot] extends = env:tasmota32_base build_flags = ${env:tasmota32_base.build_flags} diff --git a/tasmota/include/tasmota_configurations_ESP32.h b/tasmota/include/tasmota_configurations_ESP32.h index 9d438475d..21fc5c0ce 100644 --- a/tasmota/include/tasmota_configurations_ESP32.h +++ b/tasmota/include/tasmota_configurations_ESP32.h @@ -189,6 +189,81 @@ #endif // FIRMWARE_SAFEBOOT +/*********************************************************************************************\ + * FIRMWARE_ARDUINO30 + * Provide an image which compiles with WiP Arduino 3.0.x +\*********************************************************************************************/ + +#ifdef FIRMWARE_ARDUINO30 + +#ifndef CODE_IMAGE_STR + #define CODE_IMAGE_STR "arduino30" +#endif + + +#undef FIRMWARE_LITE // Disable tasmota-lite with no sensors +#undef FIRMWARE_SENSORS // Disable tasmota-sensors with useful sensors enabled +#undef FIRMWARE_KNX_NO_EMULATION // Disable tasmota-knx with KNX but without Emulation +#undef FIRMWARE_DISPLAYS // Disable tasmota-display with display drivers enabled +#undef FIRMWARE_IR // Disable tasmota-ir with IR full protocols activated +#undef FIRMWARE_WEBCAM +#undef FIRMWARE_BLUETOOTH +#undef FIRMWARE_LVGL +#undef FIRMWARE_TASMOTA32 + +#undef USE_EMULATION // Disable Wemo or Hue emulation +#undef USE_EMULATION_HUE // Disable Hue Bridge emulation for Alexa (+14k code, +2k mem common) +#undef USE_EMULATION_WEMO // Disable Belkin WeMo emulation for Alexa (+6k code, +2k mem common) + + +// -- Optional modules ---------------------------- +#undef ROTARY_V1 // Disable support for MI Desk Lamp +#undef USE_SONOFF_RF // Disable support for Sonoff Rf Bridge (+3k2 code) + #undef USE_RF_FLASH // Disable support for flashing the EFM8BB1 chip on the Sonoff RF Bridge. C2CK must be connected to GPIO4, C2D to GPIO5 on the PCB +#undef USE_SONOFF_SC // Disable support for Sonoff Sc (+1k1 code) +#undef USE_TUYA_MCU // Disable support for Tuya Serial MCU +#undef USE_ARMTRONIX_DIMMERS // Disable support for Armtronix Dimmers (+1k4 code) +#undef USE_PS_16_DZ // Disable support for PS-16-DZ Dimmer and Sonoff L1 (+2k code) +#undef USE_SONOFF_IFAN // Disable support for Sonoff iFan02 and iFan03 (+2k code) +#undef USE_BUZZER // Disable support for a buzzer (+0k6 code) +#undef USE_ARILUX_RF // Disable support for Arilux RF remote controller +#undef USE_SHUTTER // Disable Shutter support for up to 4 shutter with different motortypes (+6k code) +#undef USE_DEEPSLEEP // Disable support for deepsleep (+1k code) +#undef USE_EXS_DIMMER // Disable support for EX-Store WiFi Dimmer +#undef USE_HOTPLUG // Disable support for HotPlug +#undef USE_DEVICE_GROUPS // Disable support for device groups (+3k5 code) +#undef USE_PWM_DIMMER // Disable support for MJ-SD01/acenx/NTONPOWER PWM dimmers (+4k5 code) +#undef USE_PWM_DIMMER_REMOTE // Disbale support for remote switches to PWM Dimmer +#undef USE_KEELOQ // Disable support for Jarolift rollers by Keeloq algorithm (+4k5 code) +#undef USE_SONOFF_D1 // Disable support for Sonoff D1 Dimmer (+0k7 code) +#undef USE_SHELLY_DIMMER // Disable support for Shelly Dimmer (+3k code) + +#undef USE_LIGHT // Disable support for lights +#undef USE_WS2812 + +#undef USE_DS18x20 // Disable DS18x20 sensor + +#undef USE_I2C // Disable all I2C sensors and devices + +#undef USE_ENERGY_SENSOR // Disable energy sensors + +#undef USE_IR_REMOTE // Disable IR driver + +#undef USE_TX20_WIND_SENSOR // Disable support for La Crosse TX20 anemometer +#undef USE_TX23_WIND_SENSOR // Disable support for La Crosse TX23 anemometer + +#undef USE_AC_ZERO_CROSS_DIMMER // Disable support for AC_ZERO_CROSS_DIMMER + +#define USE_TLS +#define USE_WEBSERVER +#define USE_WEBCLIENT +#define USE_WEBCLIENT_HTTPS +#define USE_SERIAL_BRIDGE // Add support for software Serial Bridge console Tee (+2k code) +#define USE_ETHERNET + +#endif // FIRMWARE_ARDUINO30 + + /*********************************************************************************************\ * [tasmota32-webcam.bin] * Provide an image with useful supported sensors enabled From 76aa6747a5058a7804e4033bfd13c037a3847353 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Sun, 6 Aug 2023 21:10:36 +0200 Subject: [PATCH 140/150] more idf5.1 preps: Berry SPI (#19273) --- .../xdrv_52_3_berry_flash.ino | 98 +++++++++++-------- 1 file changed, 56 insertions(+), 42 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino index 6609ca082..eb24a63b7 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_52_3_berry_flash.ino @@ -24,52 +24,60 @@ #include "esp_idf_version.h" #if ESP_IDF_VERSION_MAJOR >= 5 - // esp_spi_flash.h is deprecated, please use spi_flash_mmap.h instead - #include "spi_flash_mmap.h" + #include "esp_flash.h" #else #include "esp_spi_flash.h" #endif size_t FlashWriteSubSector(uint32_t address_start, const uint8_t *data, size_t size) { -#if ESP_IDF_VERSION_MAJOR < 5 - uint32_t addr = address_start; - size_t size_left = size; - size_t current_offset = 0; - esp_err_t ret; - // Memory is unaligned, so we need to copy it to an aligned buffer - uint8_t buffer[SPI_FLASH_SEC_SIZE] __attribute__((aligned(4))); + uint32_t addr = address_start; + size_t size_left = size; + size_t current_offset = 0; + esp_err_t ret; + // Memory is unaligned, so we need to copy it to an aligned buffer + uint8_t buffer[SPI_FLASH_SEC_SIZE] __attribute__((aligned(4))); - while (size_left) { - uint32_t page_addr = addr & ~(SPI_FLASH_SEC_SIZE - 1); - uint32_t addr_in_page = addr & (SPI_FLASH_SEC_SIZE - 1); - uint32_t size_in_page = size_left; - if (addr_in_page + size_in_page > SPI_FLASH_SEC_SIZE) { - size_in_page = SPI_FLASH_SEC_SIZE - addr_in_page; - } - - // AddLog(LOG_LEVEL_DEBUG, ">>>: flash_write addr=%p size=%i -- page_addr=%p addr_in_page=%p size_in_page=%i size_left=%i", address_start, size, page_addr, addr_in_page, size_in_page, size_left); - // check if whole page? - if (addr_in_page == 0 && size_in_page == SPI_FLASH_SEC_SIZE) { - memcpy(buffer, data + current_offset, SPI_FLASH_SEC_SIZE); - } else { - ret = spi_flash_read(page_addr, buffer, SPI_FLASH_SEC_SIZE); - if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not read flash %p (0x%X) ret=%i", page_addr, SPI_FLASH_SEC_SIZE, ret); return 0; } - memcpy(buffer + addr_in_page, data + current_offset, size_in_page); - } - ret = spi_flash_erase_sector(page_addr / SPI_FLASH_SEC_SIZE); - if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not erase flash sector 0x%X ret=%i", page_addr / SPI_FLASH_SEC_SIZE, ret); return 0; } - spi_flash_write(page_addr, buffer, SPI_FLASH_SEC_SIZE); - if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not write flash %p (0x%X) ret=%i", page_addr, SPI_FLASH_SEC_SIZE, ret); return 0; } - - addr += size_in_page; - current_offset += size_in_page; - size_left -= size_in_page; + while (size_left) { + uint32_t page_addr = addr & ~(SPI_FLASH_SEC_SIZE - 1); + uint32_t addr_in_page = addr & (SPI_FLASH_SEC_SIZE - 1); + uint32_t size_in_page = size_left; + if (addr_in_page + size_in_page > SPI_FLASH_SEC_SIZE) { + size_in_page = SPI_FLASH_SEC_SIZE - addr_in_page; } - return current_offset; + // AddLog(LOG_LEVEL_DEBUG, ">>>: flash_write addr=%p size=%i -- page_addr=%p addr_in_page=%p size_in_page=%i size_left=%i", address_start, size, page_addr, addr_in_page, size_in_page, size_left); + // check if whole page? + if (addr_in_page == 0 && size_in_page == SPI_FLASH_SEC_SIZE) { + memcpy(buffer, data + current_offset, SPI_FLASH_SEC_SIZE); + } else { +#if ESP_IDF_VERSION_MAJOR < 5 + ret = spi_flash_read(page_addr, buffer, SPI_FLASH_SEC_SIZE); #else - // TODO ESPIDF 5 + ret = esp_flash_read(NULL, buffer, page_addr, SPI_FLASH_SEC_SIZE); #endif + if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not read flash %p (0x%X) ret=%i", page_addr, SPI_FLASH_SEC_SIZE, ret); return 0; } + memcpy(buffer + addr_in_page, data + current_offset, size_in_page); + } +#if ESP_IDF_VERSION_MAJOR < 5 + ret = spi_flash_erase_sector(page_addr / SPI_FLASH_SEC_SIZE); +#else + ret = esp_flash_erase_region(NULL, page_addr, SPI_FLASH_SEC_SIZE); +#endif + if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not erase flash sector 0x%X ret=%i", page_addr / SPI_FLASH_SEC_SIZE, ret); return 0; } +#if ESP_IDF_VERSION_MAJOR < 5 + spi_flash_write(page_addr, buffer, SPI_FLASH_SEC_SIZE); +#else + esp_flash_write(NULL, buffer, page_addr, SPI_FLASH_SEC_SIZE); +#endif + + if (ret) { AddLog(LOG_LEVEL_INFO, "BRY: could not write flash %p (0x%X) ret=%i", page_addr, SPI_FLASH_SEC_SIZE, ret); return 0; } + + addr += size_in_page; + current_offset += size_in_page; + size_left -= size_in_page; + } + + return current_offset; } /*********************************************************************************************\ @@ -84,7 +92,6 @@ extern "C" { // If length is not specified, it is full block 4KB int32_t p_flash_read(struct bvm *vm); int32_t p_flash_read(struct bvm *vm) { -#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 1 && be_isint(vm, 1) && (argc < 2 || be_isint(vm, 2)) ) { // optional second argument must be int @@ -96,14 +103,17 @@ extern "C" { } // allocate a buffer in the heap that will be automatically freed when going out of scope auto buf = std::unique_ptr(new uint8_t[length]); +#if ESP_IDF_VERSION_MAJOR < 5 esp_err_t ret = spi_flash_read(address, buf.get(), length); +#else + esp_err_t ret = esp_flash_read(NULL, buf.get(), address, length); +#endif if (ret) { be_raisef(vm, "internal_error", "Error calling spi_flash_read(0x%X, %i)", address, length); } be_pushbytes(vm, buf.get(), length); be_return(vm); } -#endif be_raise(vm, kTypeError, nullptr); } @@ -111,7 +121,6 @@ extern "C" { // if `no_erase` is true, just call spi_flash_write int32_t p_flash_write(struct bvm *vm); int32_t p_flash_write(struct bvm *vm) { -#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isinstance(vm, 2)) { be_getglobal(vm, "bytes"); /* get the bytes class */ /* TODO eventually replace with be_getbuiltin */ @@ -125,7 +134,11 @@ extern "C" { const void * bytes = be_tobytes(vm, 2, &length); if (bytes && length > 0) { if (no_erase) { +#if ESP_IDF_VERSION_MAJOR < 5 esp_err_t ret = spi_flash_write(address, (const uint8_t*)bytes, length); +#else + esp_err_t ret = esp_flash_write(NULL, (const uint8_t*)bytes, address, length); +#endif if (ret) { be_raisef(vm, "internal_error", "Error calling spi_flash_write() ret=%i", ret); } @@ -140,7 +153,6 @@ extern "C" { } } } -#endif be_raise(vm, kTypeError, nullptr); } @@ -149,7 +161,6 @@ extern "C" { // Address and length must be 4KB aligned int32_t p_flash_erase(struct bvm *vm); int32_t p_flash_erase(struct bvm *vm) { -#if ESP_IDF_VERSION_MAJOR < 5 int32_t argc = be_top(vm); // Get the number of arguments if (argc >= 2 && be_isint(vm, 1) && be_isint(vm, 2)) { int32_t address = be_toint(vm, 1); @@ -160,10 +171,13 @@ extern "C" { if ((length % 0x1000) != 0 || length < 0) { be_raise(vm, "value_error", "Length must be a multiple of 0x1000"); } +#if ESP_IDF_VERSION_MAJOR < 5 esp_err_t ret = spi_flash_erase_range(address, length); +#else + esp_err_t ret = esp_flash_erase_region(NULL, address, length); +#endif be_return_nil(vm); } -#endif be_raise(vm, kTypeError, nullptr); } From c3fadde3e8aa16b0de25b18587c16cece553f7aa Mon Sep 17 00:00:00 2001 From: Paul Blacknell Date: Tue, 8 Aug 2023 09:55:05 +0100 Subject: [PATCH 141/150] Improvements to thermostat debug output (#19279) * add: update DEBUG_THERMOSTAT to only control the virtual switch Also, debug output is still generated but end user can control this debug level 3 * add: debug output of main controller parameters when thermostat enabled Also, add units for debug outputs added to make them more intelligible * Update xdrv_39_thermostat.ino * add: debug message when sensor is detected as not alive fix: display thermostat number in debug messages * add: log message prefix string for thermostat * Update xdrv_39_thermostat.ino fix: typos in comments add: debug messages * add: debug prefix for thermostat * add: debug prefix added to output lines * fix: comment typos and small grammatical changes for clarity * add: debug prefix 'THE' added to debug output --- tasmota/include/i18n.h | 1 + .../xdrv_39_thermostat.ino | 138 +++++++++++------- 2 files changed, 86 insertions(+), 53 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 9daf1e90c..1b2189147 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -824,6 +824,7 @@ #define D_LOG_TCP "TCP: " // TCP bridge #define D_LOG_BERRY "BRY: " // Berry scripting language #define D_LOG_LVGL "LVG: " // LVGL graphics engine +#define D_LOG_THERMOSTAT "THE: " // Thermostat driver /********************************************************************************************/ diff --git a/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino b/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino index f8bed9bd4..3d7353c00 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_39_thermostat.ino @@ -192,7 +192,7 @@ void (* const ThermostatCommand[])(void) PROGMEM = { &CmndEnableOutputSet }; struct THERMOSTAT { - ThermostatStateBitfield status; // Bittfield including states as well as several flags + ThermostatStateBitfield status; // Bitfield including states as well as several flags uint32_t timestamp_temp_measured_update = 0; // Timestamp of latest measurement update uint32_t timestamp_temp_meas_change_update = 0; // Timestamp of latest measurement value change (> or < to previous) uint32_t timestamp_output_off = 0; // Timestamp of latest thermostat output Off state @@ -215,8 +215,8 @@ struct THERMOSTAT { uint32_t time_rampup_deadtime = 0; // Time constant of the thermostat system (step response time) uint32_t time_rampup_nextcycle = 0; // Time where the ramp-up controller shall start the next cycle int16_t temp_measured = 0; // Temperature measurement received from sensor in tenths of degrees celsius - int16_t temp_rampup_output_off = 0; // Temperature to swith off relay output within the ramp-up controller in tenths of degrees celsius - uint8_t time_output_delay = THERMOSTAT_TIME_OUTPUT_DELAY; // Output delay between state change and real actuation event (f.i. valve open/closed) + int16_t temp_rampup_output_off = 0; // Temperature to switch off relay output within the ramp-up controller in tenths of degrees celsius + uint8_t time_output_delay = THERMOSTAT_TIME_OUTPUT_DELAY; // Output delay between state change and real actuation event (eg. valve open/closed) uint8_t counter_rampup_cycles = 0; // Counter of ramp-up cycles uint8_t temp_rampup_pi_acc_error = THERMOSTAT_TEMP_PI_RAMPUP_ACC_E; // Accumulated error when switching from ramp-up controller to PI in hundreths of degrees celsius uint8_t temp_rampup_delta_out = THERMOSTAT_TEMP_RAMPUP_DELTA_OUT; // Minimum delta temperature to target to get out of the rampup mode, in tenths of degrees celsius @@ -227,17 +227,17 @@ struct THERMOSTAT { uint16_t time_rampup_max = THERMOSTAT_TIME_RAMPUP_MAX; // Time maximum ramp-up controller duration in minutes uint16_t time_rampup_cycle = THERMOSTAT_TIME_RAMPUP_CYCLE; // Time ramp-up cycle in minutes uint16_t time_allow_rampup = THERMOSTAT_TIME_ALLOW_RAMPUP; // Time in minutes after last target update to allow ramp-up controller phase - uint16_t time_sens_lost = THERMOSTAT_TIME_SENS_LOST; // Maximum time w/o sensor update to set it as lost in minutes + uint16_t time_sens_lost = THERMOSTAT_TIME_SENS_LOST; // Maximum time without sensor update to set it as lost in minutes uint16_t time_manual_to_auto = THERMOSTAT_TIME_MANUAL_TO_AUTO; // Time without input switch active to change from manual to automatic in minutes uint32_t time_reset = THERMOSTAT_TIME_RESET; // Reset time of the PI controller in seconds uint16_t time_pi_cycle = THERMOSTAT_TIME_PI_CYCLE; // Cycle time for the thermostat controller in minutes uint16_t time_max_action = THERMOSTAT_TIME_MAX_ACTION; // Maximum thermostat time per cycle in minutes uint16_t time_min_action = THERMOSTAT_TIME_MIN_ACTION; // Minimum thermostat time per cycle in minutes - uint16_t time_min_turnoff_action = THERMOSTAT_TIME_MIN_TURNOFF_ACTION; // Minimum turnoff time in minutes, below it the thermostat will stay on + uint16_t time_min_turnoff_action = THERMOSTAT_TIME_MIN_TURNOFF_ACTION; // Minimum turnoff time in minutes, below which the thermostat will stay on int16_t temp_frost_protect = THERMOSTAT_TEMP_FROST_PROTECT; // Minimum temperature for frost protection, in tenths of degrees celsius uint8_t temp_reset_anti_windup = THERMOSTAT_TEMP_RESET_ANTI_WINDUP; // Range where reset antiwindup is disabled, in tenths of degrees celsius int8_t temp_hysteresis = THERMOSTAT_TEMP_HYSTERESIS; // Range hysteresis for temperature PI controller, in tenths of degrees celsius - ThermostatDiagBitfield diag; // Bittfield including diagnostic flags + ThermostatDiagBitfield diag; // Bitfield including diagnostic flags #ifdef USE_PI_AUTOTUNING uint8_t dutycycle_step_autotune = THERMOSTAT_DUTYCYCLE_AUTOTUNE; // Duty cycle for the step response of the autotune PI function in % uint8_t peak_ctr = 0; // Peak counter for the autotuning function @@ -249,8 +249,8 @@ struct THERMOSTAT { uint16_t kP_pi_atune = 0; // kP value calculated by the autotune PI function multiplied by 100 (to avoid floating point operations) uint16_t kI_pi_atune = 0; // kI value calulated by the autotune PI function multiplied by 100 (to avoid floating point operations) int16_t temp_peaks_atune[THERMOSTAT_PEAKNUMBER_AUTOTUNE]; // Array to store temperature peaks to be used by the autotune PI function - int16_t temp_abs_max_atune; // Max temperature reached within autotune - int16_t temp_abs_min_atune; // Min temperature reached within autotune + int16_t temp_abs_max_atune; // Maximum temperature reached within autotune + int16_t temp_abs_min_atune; // Minimum temperature reached within autotune uint16_t time_peak_timestamps_atune[THERMOSTAT_PEAKNUMBER_AUTOTUNE]; // Array to store timestamps in minutes of the temperature peaks to be used by the autotune PI function uint16_t time_std_dev_peak_det_ok = THERMOSTAT_TIME_STD_DEV_PEAK_DET_OK; // Standard deviation in minutes of the oscillation periods within the peak detection is successful #endif // USE_PI_AUTOTUNING @@ -371,6 +371,12 @@ void ThermostatSignalPreProcessingSlow(uint8_t ctr_output) Thermostat[ctr_output].status.sensor_alive = IFACE_OFF; Thermostat[ctr_output].temp_measured_gradient = 0; Thermostat[ctr_output].temp_measured = 0; + + char result_chr[FLOATSZ]; + + dtostrfd((TasmotaGlobal.uptime - Thermostat[ctr_output].timestamp_temp_measured_update), 0, result_chr); + AddLog(LOG_LEVEL_ERROR, PSTR(D_LOG_THERMOSTAT "Thermostat sensor has not been seen for %s seconds"), result_chr); + } } @@ -597,11 +603,9 @@ void ThermostatOutputRelay(uint8_t ctr_output, uint32_t command) // then switch output to ON if ((command == IFACE_ON) && (Thermostat[ctr_output].status.status_output == IFACE_OFF)) { -//#ifndef DEBUG_THERMOSTAT if (Thermostat[ctr_output].status.enable_output == IFACE_ON) { ExecuteCommandPower(Thermostat[ctr_output].status.output_relay_number, POWER_ON, SRC_THERMOSTAT); } -//#endif // DEBUG_THERMOSTAT Thermostat[ctr_output].status.status_output = IFACE_ON; #ifdef DEBUG_THERMOSTAT ThermostatVirtualSwitch(ctr_output); @@ -611,11 +615,9 @@ void ThermostatOutputRelay(uint8_t ctr_output, uint32_t command) // AND current output status is ON // then switch output to OFF else if ((command == IFACE_OFF) && (Thermostat[ctr_output].status.status_output == IFACE_ON)) { -//#ifndef DEBUG_THERMOSTAT if (Thermostat[ctr_output].status.enable_output == IFACE_ON) { ExecuteCommandPower(Thermostat[ctr_output].status.output_relay_number, POWER_OFF, SRC_THERMOSTAT); } -//#endif // DEBUG_THERMOSTAT Thermostat[ctr_output].timestamp_output_off = TasmotaGlobal.uptime; Thermostat[ctr_output].status.status_output = IFACE_OFF; #ifdef DEBUG_THERMOSTAT @@ -682,14 +684,14 @@ void ThermostatCalculatePI(uint8_t ctr_output) Thermostat[ctr_output].temp_pi_accum_error = 0; } // Normal use of integrator - // result will be calculated with the cummulated previous error anterior - // and current error will be cummulated to the previous one + // result will be calculated with the accumulated previous error anterior + // and current error will be accumulated to the previous one else { // Hysteresis limiter // If error is less than or equal than hysteresis, limit output to 0, when temperature - // is rising, never when falling. Limit cummulated error. If this is not done, + // is rising, never when falling. Limit accumulated error. If this is not done, // there will be very strong control actions from the integral part due to a - // very high cummulated error when beingin hysteresis. This triggers high + // very high accumulated error when beingin hysteresis. This triggers high // integral actions // Update accumulated error @@ -739,7 +741,7 @@ void ThermostatCalculatePI(uint8_t ctr_output) // Antiwindup of the integrator // If integral calculation is bigger than cycle time, adjust result - // to the cycle time and error will not be cummulated + // to the cycle time and error will not be accumulated if (Thermostat[ctr_output].time_integral_pi > ((uint32_t)Thermostat[ctr_output].time_pi_cycle * 60)) { Thermostat[ctr_output].time_integral_pi = ((uint32_t)Thermostat[ctr_output].time_pi_cycle * 60); } @@ -750,7 +752,7 @@ void ThermostatCalculatePI(uint8_t ctr_output) // Antiwindup of the output // If result is bigger than cycle time, the result will be adjusted - // to the cylce time minus safety time and error will not be cummulated + // to the cylce time minus safety time and error will not be accumulated if (Thermostat[ctr_output].time_total_pi >= ((int32_t)Thermostat[ctr_output].time_pi_cycle * 60)) { // Limit to cycle time //at least switch down a minimum time Thermostat[ctr_output].time_total_pi = ((int32_t)Thermostat[ctr_output].time_pi_cycle * 60); @@ -1277,64 +1279,93 @@ void ThermostatVirtualSwitchCtrState(uint8_t ctr_output) Response_P(DOMOTICZ_MES, DOMOTICZ_IDX2, (0 == Thermostat[0].status.phase_hybrid_ctr) ? 0 : 1, ""); MqttPublish(domoticz_in_topic); } +#endif // DEBUG_THERMOSTAT void ThermostatDebug(uint8_t ctr_output) { + char ctr_output_chr[FLOATSZ]; char result_chr[FLOATSZ]; - AddLog(LOG_LEVEL_DEBUG, PSTR("")); - AddLog(LOG_LEVEL_DEBUG, PSTR("------ Thermostat Start ------")); + dtostrfd(ctr_output, 0, ctr_output_chr); dtostrfd(Thermostat[ctr_output].status.counter_seconds, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.counter_seconds: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.counter_seconds: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.thermostat_mode, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.thermostat_mode: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.thermostat_mode: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].diag.state_emergency, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].diag.state_emergency: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].diag.state_emergency: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].diag.output_inconsist_ctr, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].diag.output_inconsist_ctr: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].diag.output_inconsist_ctr: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.controller_mode, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.controller_mode: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.controller_mode: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.command_output, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.command_output: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.command_output: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.status_output, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.status_output: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.status_output: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.status_input, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.status_input: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.status_input: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.phase_hybrid_ctr, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.phase_hybrid_ctr: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.phase_hybrid_ctr: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.sensor_alive, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.sensor_alive: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.sensor_alive: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].status.status_cycle_active, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].status.status_cycle_active: %s"), result_chr); - dtostrfd(Thermostat[ctr_output].temp_pi_error, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_pi_error: %s"), result_chr); - dtostrfd(Thermostat[ctr_output].temp_pi_accum_error, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_pi_accum_error: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].status.status_cycle_active: %s"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_pi_error/100, 2, result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].temp_pi_error: %s degrees"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_pi_accum_error/100, 2, result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].temp_pi_accum_error: %s degrees"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_proportional_pi, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_proportional_pi: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_proportional_pi: %s seconds"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_integral_pi, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_integral_pi: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_integral_pi: %s seconds"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_total_pi, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_total_pi: %s"), result_chr); - dtostrfd(Thermostat[ctr_output].temp_measured_gradient, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_measured_gradient: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_total_pi: %s seconds"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_measured_gradient/1000, 3, result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].temp_measured_gradient: %s degrees/hour"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_rampup_deadtime, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_rampup_deadtime: %s"), result_chr); - dtostrfd(Thermostat[ctr_output].temp_rampup_meas_gradient, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_rampup_meas_gradient: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_rampup_deadtime: %s seconds"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_rampup_meas_gradient/1000, 3, result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].temp_rampup_meas_gradient: %s degrees/hour"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_ctr_changepoint, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_ctr_changepoint: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_ctr_changepoint: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].temp_rampup_output_off, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].temp_rampup_output_off: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].temp_rampup_output_off: %s"), ctr_output_chr, result_chr); dtostrfd(Thermostat[ctr_output].time_ctr_checkpoint, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("Thermostat[ctr_output].time_ctr_checkpoint: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].time_ctr_checkpoint: %s"), ctr_output_chr, result_chr); dtostrfd(TasmotaGlobal.uptime, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("uptime: %s"), result_chr); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "uptime: %s"), result_chr); dtostrfd(TasmotaGlobal.power, 0, result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("power: %s"), result_chr); - AddLog(LOG_LEVEL_DEBUG, PSTR("------ Thermostat End ------")); - AddLog(LOG_LEVEL_DEBUG, PSTR("")); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_THERMOSTAT "power: %s"), result_chr); } -#endif // DEBUG_THERMOSTAT + +void DebugControllerParameters(uint8_t ctr_output) +{ + char ctr_output_chr[FLOATSZ]; + char result_chr[FLOATSZ]; + dtostrfd(ctr_output, 0, ctr_output_chr); + dtostrfd(Thermostat[ctr_output].status.controller_mode, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].CONTROLLERMODESET: %s"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_pi_cycle, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMEPICYCLESET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_min_action, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMEMINACTIONSET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_max_action, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMEMAXACTIONSET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_allow_rampup, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMEALLOWRAMPUPSET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_rampup_cycle, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMERAMPUPCYCLESET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_rampup_max, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMERAMPUPMAXSET: %s minutes"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].time_reset, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TIMERESETSET: %s seconds"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].val_prop_band, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].PROPBANDSET: %s"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_reset_anti_windup/10, 1, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TEMPANTIWINDUPRESETSET: %s degrees"), ctr_output_chr, result_chr); + dtostrfd((float)Thermostat[ctr_output].temp_hysteresis/10, 1, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TEMPHYSTSET: %s degrees"), ctr_output_chr, result_chr); + dtostrfd(Thermostat[ctr_output].temp_rampup_delta_in, 0, result_chr); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_THERMOSTAT "Thermostat[%s].TEMPRUPDELTINSET: %s degrees"), ctr_output_chr, result_chr); + } uint8_t ThermostatGetDutyCycle(uint8_t ctr_output) { @@ -1417,6 +1448,9 @@ void CmndThermostatModeSet(void) Thermostat[ctr_output].status.command_output = IFACE_OFF; ThermostatOutputRelay(ctr_output, Thermostat[ctr_output].status.command_output); } + if ((value > THERMOSTAT_OFF) && (value < THERMOSTAT_MODES_MAX)) { + DebugControllerParameters(ctr_output); + } } ResponseCmndIdxNumber((int)Thermostat[ctr_output].status.thermostat_mode); } @@ -2167,9 +2201,7 @@ bool Xdrv39(uint32_t function) ThermostatSignalPreProcessingSlow(ctr_output); ThermostatController(ctr_output); ThermostatSignalPostProcessingSlow(ctr_output); -#ifdef DEBUG_THERMOSTAT ThermostatDebug(ctr_output); -#endif // DEBUG_THERMOSTAT } } break; From bfe0857094211a4c0c7084353be076d908d79bf5 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Wed, 9 Aug 2023 14:02:21 +0200 Subject: [PATCH 142/150] add section safeboot_flags in platform_tasmota32.ini (#19281) This will make it easier to ignore a bunch of libraries in order to speed up builds without polluting the ENV sections too much. Usage: [env:my_safeboot_env] lib_ignore = ${safeboot_flags.lib_ignore} --- platformio_tasmota32.ini | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 3aa0503dc..77ac9a412 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -47,3 +47,23 @@ platform = https://github.com/tasmota/platform-espressif32/re platform_packages = build_unflags = ${esp32_defaults.build_unflags} build_flags = ${esp32_defaults.build_flags} + +[safeboot_flags] +lib_ignore = ESP Mail Client + IRremoteESP8266 + NeoPixelBus + OneWire + MFRC522 + universal display Library + ESP8266Audio + ESP8266SAM + FFat + Berry + Berry mapping to C + Berry Tasmota mapping + Berry int64 implementation for 32 bits architceture + Berry Matter protocol implementation + Micro-RTSP + re1.5 + DHT sensor library + ccronexpr From d85557711d176100b293d6e203a8ccfa3286426f Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Wed, 9 Aug 2023 19:20:19 +0200 Subject: [PATCH 143/150] use common safeboot flags (#19282) --- platformio_tasmota_env32.ini | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 08779ebe5..3a0efcb8b 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -88,10 +88,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32-safeboot.bin"' lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - Micro-RTSP - ESP Mail Client - DHT sensor library +lib_ignore = ${safeboot_flags.lib_ignore} [env:tasmota32] extends = env:tasmota32_base @@ -176,10 +173,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32solo1-safeboot.bin"' lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - Micro-RTSP - ESP Mail Client - DHT sensor library +lib_ignore = ${safeboot_flags.lib_ignore} [env:tasmota32-zbbrdgpro] extends = env:tasmota32_base @@ -214,10 +208,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32c3-safeboot.bin"' -fno-lto lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - Micro-RTSP - ESP Mail Client - DHT sensor library +lib_ignore = ${safeboot_flags.lib_ignore} [env:tasmota32c3] extends = env:tasmota32_base @@ -257,10 +248,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32s2-safeboot.bin"' lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - Micro-RTSP - ESP Mail Client - DHT sensor library +lib_ignore = ${safeboot_flags.lib_ignore} [env:tasmota32s2] extends = env:tasmota32_base @@ -295,10 +283,7 @@ build_flags = ${env:tasmota32_base.build_flags} -DFIRMWARE_SAFEBOOT -DOTA_URL='"http://ota.tasmota.com/tasmota32/release/tasmota32s3-safeboot.bin"' lib_extra_dirs = lib/lib_ssl, lib/libesp32 -lib_ignore = - Micro-RTSP - ESP Mail Client - DHT sensor library +lib_ignore = ${safeboot_flags.lib_ignore} [env:tasmota32s3] extends = env:tasmota32_base From 7544d2f23c52d79a93052efd6c1803974304e375 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Thu, 10 Aug 2023 12:19:18 +0200 Subject: [PATCH 144/150] fix IRAM_ATTR specified both in function declaration and definition (#19286) --- tasmota/tasmota_support/support.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tasmota/tasmota_support/support.ino b/tasmota/tasmota_support/support.ino index 414daddbe..55f8cfe46 100755 --- a/tasmota/tasmota_support/support.ino +++ b/tasmota/tasmota_support/support.ino @@ -1410,8 +1410,7 @@ void ConvertGpios(void) { } #endif // ESP8266 -int IRAM_ATTR Pin(uint32_t gpio, uint32_t index = 0); -int IRAM_ATTR Pin(uint32_t gpio, uint32_t index) { +int IRAM_ATTR Pin(uint32_t gpio, uint32_t index = 0) { uint16_t real_gpio = gpio << 5; uint16_t mask = 0xFFE0; if (index < GPIO_ANY) { From 9eb184c30ee60252d2130a6bd7e636c91d7e8398 Mon Sep 17 00:00:00 2001 From: Paul Blacknell Date: Thu, 10 Aug 2023 15:20:06 +0100 Subject: [PATCH 145/150] Improvements to PID controller driver (#19285) * add: update DEBUG_THERMOSTAT to only control the virtual switch Also, debug output is still generated but end user can control this debug level 3 * add: debug output of main controller parameters when thermostat enabled Also, add units for debug outputs added to make them more intelligible * Update xdrv_39_thermostat.ino * add: debug message when sensor is detected as not alive fix: display thermostat number in debug messages * add: log message prefix string for thermostat * Update xdrv_39_thermostat.ino fix: typos in comments add: debug messages * add: debug prefix for thermostat * add: debug prefix added to output lines * fix: comment typos and small grammatical changes for clarity * add: debug prefix 'THE' added to debug output * add: display PID status and key info on web output * fix: remove extraneous comments that included unused code fragments * add: local sensor handling improvements add: define a local sensor name add: define the local sensor measurement parameter add: limit sensor not seen error message to every 60 seconds to avoid flooding the logs add: include interval since which sensor data was last updated fix: properly update the maximum interval time so missing sensor data is properly alerted * Update xdrv_49_pid.ino --- tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino | 111 ++++++++++++++------ 1 file changed, 81 insertions(+), 30 deletions(-) diff --git a/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino b/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino index 8ef523f35..1826d56c2 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_49_pid.ino @@ -113,6 +113,15 @@ // If not using the sensor then you can supply process values via MQTT using // cmnd PidPv + #define PID_LOCAL_SENSOR_NAME "DS18B20" // local sensor name when PID_USE_LOCAL_SENSOR is defined above + // the JSON payload is parsed for this sensor to find the present value + // eg "ESP32":{"Temperature":31.4},"DS18B20":{"Temperature":12.6} + + #define PID_LOCAL_SENSOR_TYPE D_JSON_TEMPERATURE // Choose one of D_JSON_TEMPERATURE D_JSON_HUMIDITY D_JSON_PRESSURE + // or any string as the sensor type. The JSON payload is parsed for the + // value in this field + // eg "HDC1080":{"Temperature":24.8,"Humidity":79.2} + #define PID_SHUTTER 1 // if using the PID to control a 3-way valve, create Tasmota Shutter and define the // number of the shutter here. Otherwise leave this commented out @@ -159,7 +168,15 @@ #ifndef PID_USE_TIMPROP #define PID_USE_TIMPROP 1 // To disable this feature define as false in user_config_override #endif -//#define PID_USE_LOCAL_SENSOR // [PidPv] If defined then the local sensor will be used for pv. + +// #define PID_USE_LOCAL_SENSOR // If defined then the local sensor will be used for pv. +#ifndef PID_LOCAL_SENSOR_NAME +#define PID_LOCAL_SENSOR_NAME "DS18B20" // local sensor name when PID_USE_LOCAL_SENSOR is defined +#endif +#ifndef PID_LOCAL_SENSOR_TYPE +#define PID_LOCAL_SENSOR_TYPE D_JSON_TEMPERATURE // local sensor type +#endif + //#define PID_SHUTTER 1 // Number of the shutter here. Otherwise leave this commented out #ifndef PID_REPORT_MORE_SETTINGS #define PID_REPORT_MORE_SETTINGS true // Override to false if less details are required in SENSOR JSON @@ -242,31 +259,41 @@ void PIDShowSensor() { // Called each time new sensor data available, data in mqtt data in same format // as published in tele/SENSOR // Update period is specified in TELE_PERIOD - if (!isnan(TasmotaGlobal.temperature_celsius)) { - const float temperature = TasmotaGlobal.temperature_celsius; + + float sensor_reading = NAN; + +#if defined PID_USE_LOCAL_SENSOR + // copy the string into a new buffer that will be modified and + // parsed to find the local sensor reading if it's there + String buf = ResponseData(); + JsonParser parser((char*)buf.c_str()); + JsonParserObject root = parser.getRootObject(); + if (root) { + JsonParserToken value_token = root[PID_LOCAL_SENSOR_NAME].getObject()[PSTR(PID_LOCAL_SENSOR_TYPE)]; + if (value_token.isNum()) { + sensor_reading = value_token.getFloat(); + } + } +#endif // PID_USE_LOCAL_SENSOR + + if (!isnan(sensor_reading)) { // pass the value to the pid alogorithm to use as current pv Pid.last_pv_update_secs = Pid.current_time_secs; - Pid.pid.setPv(temperature, Pid.last_pv_update_secs); + Pid.pid.setPv(sensor_reading, Pid.last_pv_update_secs); // also trigger running the pid algorithm if we have been told to run it each pv sample if (Pid.update_secs == 0) { // this runs it at the next second Pid.run_pid_now = true; } } else { - AddLog(LOG_LEVEL_ERROR, PSTR("PID: No local temperature sensor found")); + // limit sensor not seen message to every 60 seconds to avoid flooding the logs + if ((Pid.current_time_secs - Pid.last_pv_update_secs) > Pid.max_interval && ((Pid.current_time_secs - Pid.last_pv_update_secs)%60)==0) { + AddLog(LOG_LEVEL_ERROR, PSTR("PID: Local temperature sensor missing for longer than PID_MAX_INTERVAL")); + } } } -/* struct XDRVMAILBOX { */ -/* uint16_t valid; */ -/* uint16_t index; */ -/* uint16_t data_len; */ -/* int16_t payload; */ -/* char *topic; */ -/* char *data; */ -/* } XdrvMailbox; */ - void CmndSetPv(void) { Pid.last_pv_update_secs = Pid.current_time_secs; if (XdrvMailbox.data_len > 0) { @@ -339,14 +366,11 @@ void CmndSetManualPower(void) { void CmndSetMaxInterval(void) { if (XdrvMailbox.payload >= 0) { Pid.pid.setMaxInterval(XdrvMailbox.payload); + Pid.max_interval=XdrvMailbox.payload; } ResponseCmndNumber(Pid.pid.getMaxInterval()); } -// case CMND_PID_SETUPDATE_SECS: -// Pid.update_secs = atoi(XdrvMailbox.data) ; -// if (Pid.update_secs < 0) -// Pid.update_secs = 0; void CmndSetUpdateSecs(void) { if (XdrvMailbox.payload >= 0) { Pid.update_secs = (XdrvMailbox.payload); @@ -364,51 +388,43 @@ void PIDShowValues(void) { double d_buf; ResponseAppend_P(PSTR(",\"PID\":{")); -// #define D_CMND_PID_SETPV "Pv" d_buf = Pid.pid.getPv(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidPv\":%s,"), str_buf); -// #define D_CMND_PID_SETSETPOINT "Sp" d_buf = Pid.pid.getSp(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidSp\":%s,"), str_buf); #if PID_REPORT_MORE_SETTINGS -// #define D_CMND_PID_SETPROPBAND "Pb" d_buf = Pid.pid.getPb(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidPb\":%s,"), str_buf); -// #define D_CMND_PID_SETINTEGRAL_TIME "Ti" d_buf = Pid.pid.getTi(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidTi\":%s,"), str_buf); -// #define D_CMND_PID_SETDERIVATIVE_TIME "Td" d_buf = Pid.pid.getTd(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidTd\":%s,"), str_buf); -// #define D_CMND_PID_SETINITIAL_INT "Initint" d_buf = Pid.pid.getInitialInt(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidInitialInt\":%s,"), str_buf); -// #define D_CMND_PID_SETDERIV_SMOOTH_FACTOR "DSmooth" d_buf = Pid.pid.getDSmooth(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidDSmooth\":%s,"), str_buf); -// #define D_CMND_PID_SETAUTO "Auto" chr_buf = Pid.pid.getAuto(); ResponseAppend_P(PSTR("\"PidAuto\":%d,"), chr_buf); -// #define D_CMND_PID_SETMANUAL_POWER "ManualPower" d_buf = Pid.pid.getManualPower(); dtostrfd(d_buf, 2, str_buf); ResponseAppend_P(PSTR("\"PidManualPower\":%s,"), str_buf); -// #define D_CMND_PID_SETMAX_INTERVAL "MaxInterval" i_buf = Pid.pid.getMaxInterval(); ResponseAppend_P(PSTR("\"PidMaxInterval\":%d,"), i_buf); - -// #define D_CMND_PID_SETUPDATE_SECS "UpdateSecs" + i_buf = Pid.current_time_secs - Pid.last_pv_update_secs; + ResponseAppend_P(PSTR("\"PidInterval\":%d,"), i_buf); ResponseAppend_P(PSTR("\"PidUpdateSecs\":%d,"), Pid.update_secs); #endif // PID_REPORT_MORE_SETTINGS + i_buf = (Pid.current_time_secs - Pid.last_pv_update_secs) > Pid.pid.getMaxInterval(); + ResponseAppend_P(PSTR("\"PidSensorLost\":%d,"), i_buf); // The actual power value d_buf = Pid.pid.tick(Pid.current_time_secs); dtostrfd(d_buf, 2, str_buf); @@ -417,6 +433,38 @@ void PIDShowValues(void) { ResponseAppend_P(PSTR("}")); } +void PIDShowValuesWeb(void) { + +#define D_PID_DISPLAY_NAME "PID Controller" +#define D_PID_SET_POINT "Set Point" +#define D_PID_PRESENT_VALUE "Current Value" +#define D_PID_POWER "Power" +#define D_PID_MODE "Controller Mode" +#define D_PID_MODE_AUTO "Auto" +#define D_PID_MODE_MANUAL "Manual" +#define D_PID_MODE_OFF "Off" + + const char HTTP_PID_HL[] PROGMEM = "{s}
    {m}
    {e}"; + const char HTTP_PID_INFO[] PROGMEM = "{s}" D_PID_DISPLAY_NAME "{m}%s{e}"; + const char HTTP_PID_SP_FORMAT[] PROGMEM = "{s}%s " "{m}%*_f "; + const char HTTP_PID_PV_FORMAT[] PROGMEM = "{s}%s " "{m}%*_f "; + const char HTTP_PID_POWER_FORMAT[] PROGMEM = "{s}%s " "{m}%*_f " D_UNIT_PERCENT; + + float f_buf; + + WSContentSend_P(HTTP_PID_HL); + WSContentSend_P(HTTP_PID_INFO, (Pid.pid.getAuto()==1) ? D_PID_MODE_AUTO : Pid.pid.tick(Pid.current_time_secs)>0.0f ? D_PID_MODE_MANUAL : D_PID_MODE_OFF); + + if (Pid.pid.getAuto()==1 || Pid.pid.tick(Pid.current_time_secs)>0.0f) { + f_buf = (float)Pid.pid.getSp(); + WSContentSend_PD(HTTP_PID_SP_FORMAT, D_PID_SET_POINT, 1, &f_buf); + f_buf = (float)Pid.pid.getPv(); + WSContentSend_PD(HTTP_PID_PV_FORMAT, D_PID_PRESENT_VALUE, 1, &f_buf); + f_buf = Pid.pid.tick(Pid.current_time_secs)*100.0f; + WSContentSend_PD(HTTP_PID_POWER_FORMAT, D_PID_POWER, 0, &f_buf); + } +} + void PIDRun(void) { double power = Pid.pid.tick(Pid.current_time_secs); #ifdef PID_DONT_USE_PID_TOPIC @@ -468,6 +516,9 @@ bool Xdrv49(uint32_t function) { case FUNC_JSON_APPEND: PIDShowValues(); break; + case FUNC_WEB_SENSOR: + PIDShowValuesWeb(); + break; } return result; } From f9f5d5d55c6e24e97481769e7fd8a3529cad0302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=B8=D0=BB=D1=8F=D0=BD=20=D0=9F=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=D1=83=D0=B7=D0=BE=D0=B2?= Date: Thu, 10 Aug 2023 16:22:44 +0200 Subject: [PATCH 146/150] =?UTF-8?q?Typo=20architceture=20=E2=86=92=20archi?= =?UTF-8?q?tecture=20(#19288)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/libesp32/berry_int64/library.json | 2 +- platformio_tasmota32.ini | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/libesp32/berry_int64/library.json b/lib/libesp32/berry_int64/library.json index 8fe3f3258..6c72492e1 100644 --- a/lib/libesp32/berry_int64/library.json +++ b/lib/libesp32/berry_int64/library.json @@ -1,5 +1,5 @@ { - "name": "Berry int64 implementation for 32 bits architceture", + "name": "Berry int64 implementation for 32 bits architecture", "version": "1.0", "description": "Berry int64", "license": "MIT", diff --git a/platformio_tasmota32.ini b/platformio_tasmota32.ini index 77ac9a412..b150a58c9 100644 --- a/platformio_tasmota32.ini +++ b/platformio_tasmota32.ini @@ -61,7 +61,7 @@ lib_ignore = ESP Mail Client Berry Berry mapping to C Berry Tasmota mapping - Berry int64 implementation for 32 bits architceture + Berry int64 implementation for 32 bits architecture Berry Matter protocol implementation Micro-RTSP re1.5 From 314af22ae3bd41a55b4d09d5f6831c219809625a Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Thu, 10 Aug 2023 16:23:32 +0200 Subject: [PATCH 147/150] avoid unnecessary compiling of specific libraries in lib32_div for most builds (#19293) --- platformio_tasmota_env32.ini | 1 - 1 file changed, 1 deletion(-) diff --git a/platformio_tasmota_env32.ini b/platformio_tasmota_env32.ini index 3a0efcb8b..2e826f757 100644 --- a/platformio_tasmota_env32.ini +++ b/platformio_tasmota_env32.ini @@ -15,7 +15,6 @@ lib_compat_mode = ${common.lib_compat_mode} lib_extra_dirs = ${common.lib_extra_dirs} lib/libesp32 lib/libesp32_lvgl - lib/libesp32_div lib/libesp32_eink lib/libesp32_audio lib_ignore = From b5cc48dd6443f9607ebc333126dbea3adc8eff47 Mon Sep 17 00:00:00 2001 From: Christian Baars Date: Sat, 12 Aug 2023 11:31:06 +0200 Subject: [PATCH 148/150] ESP32: pass flashmode at build time to macro definition (#19299) * pass flashmode at build time to macro definition * fix 8266 builds --- pio-tools/add_c_flags.py | 2 +- pio-tools/pre_source_dir.py | 5 +++++ tasmota/include/tasmota_globals.h | 18 ++++++++++++++++++ tasmota/tasmota_support/support_command.ino | 4 ++-- tasmota/tasmota_support/support_esp.ino | 19 ------------------- .../xdrv_01_9_webserver.ino | 2 +- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/pio-tools/add_c_flags.py b/pio-tools/add_c_flags.py index 020a77f82..40d8a3937 100644 --- a/pio-tools/add_c_flags.py +++ b/pio-tools/add_c_flags.py @@ -4,4 +4,4 @@ Import("env") env.Append(CFLAGS=["-Wno-discarded-qualifiers", "-Wno-implicit-function-declaration"]) # General options that are passed to the C++ compiler -env.Append(CXXFLAGS=["-Wno-volatile"]) \ No newline at end of file +env.Append(CXXFLAGS=["-Wno-volatile"]) diff --git a/pio-tools/pre_source_dir.py b/pio-tools/pre_source_dir.py index 6027d2ba9..8ff1e8753 100644 --- a/pio-tools/pre_source_dir.py +++ b/pio-tools/pre_source_dir.py @@ -10,3 +10,8 @@ def FindInoNodes(env): ) env.AddMethod(FindInoNodes) + +# Pass flashmode at build time to macro +tasmota_flash_mode = "-DCONFIG_TASMOTA_FLASHMODE_" + (env.BoardConfig().get("build.flash_mode", "dio")).upper() +env.Append(CXXFLAGS=[tasmota_flash_mode]) +print(tasmota_flash_mode) diff --git a/tasmota/include/tasmota_globals.h b/tasmota/include/tasmota_globals.h index ae6ec9a70..a6f964e77 100644 --- a/tasmota/include/tasmota_globals.h +++ b/tasmota/include/tasmota_globals.h @@ -69,6 +69,23 @@ String EthernetMacAddress(void); #include "include/tasmota_configurations.h" // Preconfigured configurations +/*-------------------------------------------------------------------------------------------*\ + * ESP8266 and ESP32 build time definitions +\*-------------------------------------------------------------------------------------------*/ + +// created in pio-tools/pre_source_dir.py +#if defined(CONFIG_TASMOTA_FLASHMODE_QIO) + #define D_TASMOTA_FLASHMODE "QIO" +#elif defined(CONFIG_TASMOTA_FLASHMODE_QOUT) + #define D_TASMOTA_FLASHMODE "QOUT" +#elif defined(CONFIG_TASMOTA_FLASHMODE_DIO) + #define D_TASMOTA_FLASHMODE "DIO" +#elif defined(CONFIG_TASMOTA_FLASHMODE_DOUT) + #define D_TASMOTA_FLASHMODE "DOUT" +#else +#error "Please add missing flashmode definition in the lines above!" // could be upcoming octal modes +#endif // value check of CONFIG_TASMOTA_FLASHMODE + /*********************************************************************************************\ * ESP8266 specific parameters \*********************************************************************************************/ @@ -118,6 +135,7 @@ String EthernetMacAddress(void); /*-------------------------------------------------------------------------------------------*\ * End ESP32 specific parameters \*-------------------------------------------------------------------------------------------*/ + /*-------------------------------------------------------------------------------------------*\ * Start ESP32-C32 specific parameters - disable features not present in ESP32-C3 \*-------------------------------------------------------------------------------------------*/ diff --git a/tasmota/tasmota_support/support_command.ino b/tasmota/tasmota_support/support_command.ino index 40be1cf49..d074df54e 100644 --- a/tasmota/tasmota_support/support_command.ino +++ b/tasmota/tasmota_support/support_command.ino @@ -829,7 +829,7 @@ void CmndStatus(void) #endif // ESP32 D_JSON_PROGRAMFLASHSIZE "\":%d,\"" D_JSON_FLASHSIZE "\":%d" ",\"" D_JSON_FLASHCHIPID "\":\"%06X\"" - ",\"FlashFrequency\":%d,\"" D_JSON_FLASHMODE "\":\"%s\""), + ",\"FlashFrequency\":%d,\"" D_JSON_FLASHMODE "\":\"" D_TASMOTA_FLASHMODE "\""), ESP_getSketchSize()/1024, ESP_getFreeSketchSpace()/1024, ESP_getFreeHeap1024(), #ifdef ESP32 uxTaskGetStackHighWaterMark(nullptr) / 1024, ESP.getPsramSize()/1024, ESP.getFreePsram()/1024, @@ -839,7 +839,7 @@ void CmndStatus(void) ESP_getFlashChipSize()/1024, ESP.getFlashChipRealSize()/1024 #endif // ESP8266 , ESP_getFlashChipId() - , ESP.getFlashChipSpeed()/1000000, ESP_getFlashChipMode().c_str()); + , ESP.getFlashChipSpeed()/1000000); ResponseAppendFeatures(); XsnsDriverState(); ResponseAppend_P(PSTR(",\"Sensors\":")); diff --git a/tasmota/tasmota_support/support_esp.ino b/tasmota/tasmota_support/support_esp.ino index c7d284ae7..fb353bb65 100644 --- a/tasmota/tasmota_support/support_esp.ino +++ b/tasmota/tasmota_support/support_esp.ino @@ -1171,25 +1171,6 @@ float ESP_getFreeHeap1024(void) { } */ -const char kFlashModes[] PROGMEM = "QIO|QOUT|DIO|DOUT|Fast|Slow"; -/* -typedef enum { - FM_QIO = 0x00, - FM_QOUT = 0x01, - FM_DIO = 0x02, - FM_DOUT = 0x03, - FM_FAST_READ = 0x04, - FM_SLOW_READ = 0x05, - FM_UNKNOWN = 0xff -} FlashMode_t; -*/ -String ESP_getFlashChipMode(void) { - uint32_t flash_mode = ESP.getFlashChipMode(); - if (flash_mode > 5) { flash_mode = 3; } - char stemp[6]; - return GetTextIndexed(stemp, sizeof(stemp), flash_mode, kFlashModes); -} - /*********************************************************************************************\ * High entropy hardware random generator * Thanks to DigitalAlchemist diff --git a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino index 54c477c7b..31339e392 100644 --- a/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino +++ b/tasmota/tasmota_xdrv_driver/xdrv_01_9_webserver.ino @@ -2465,7 +2465,7 @@ void HandleInformation(void) WSContentSend_P(PSTR("}1}2 ")); // Empty line WSContentSend_P(PSTR("}1" D_ESP_CHIP_ID "}2%d (%s)"), ESP_getChipId(), GetDeviceHardwareRevision().c_str()); - WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X (%s)"), ESP_getFlashChipId(), ESP_getFlashChipMode().c_str()); + WSContentSend_P(PSTR("}1" D_FLASH_CHIP_ID "}20x%06X (" D_TASMOTA_FLASHMODE ")"), ESP_getFlashChipId()); #ifdef ESP32 WSContentSend_P(PSTR("}1" D_FLASH_CHIP_SIZE "}2%d KB"), ESP.getFlashChipSize() / 1024); WSContentSend_P(PSTR("}1" D_PROGRAM_FLASH_SIZE "}2%d KB"), ESP_getFlashChipMagicSize() / 1024); From df1a526f028e9599d9a5e4399f0bbdc503363f80 Mon Sep 17 00:00:00 2001 From: Paul Blacknell Date: Sat, 12 Aug 2023 10:32:29 +0100 Subject: [PATCH 149/150] fix: properly detect device is offline after maximum misses reached (#19298) --- tasmota/include/i18n.h | 1 + .../tasmota_xsns_sensor/xsns_65_hdc1080.ino | 22 ++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/tasmota/include/i18n.h b/tasmota/include/i18n.h index 1b2189147..b7023774c 100644 --- a/tasmota/include/i18n.h +++ b/tasmota/include/i18n.h @@ -825,6 +825,7 @@ #define D_LOG_BERRY "BRY: " // Berry scripting language #define D_LOG_LVGL "LVG: " // LVGL graphics engine #define D_LOG_THERMOSTAT "THE: " // Thermostat driver +#define D_LOG_SENSOR "SNS: " // Sensor driver /********************************************************************************************/ diff --git a/tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino b/tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino index 3d0f5ef29..159e7ccc9 100644 --- a/tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino +++ b/tasmota/tasmota_xsns_sensor/xsns_65_hdc1080.ino @@ -75,6 +75,7 @@ float hdc_humidity = 0.0f; uint8_t hdc_valid = 0; bool is_reading = false; +bool hdc_online = false; uint32_t hdc_next_read; /** @@ -176,7 +177,11 @@ bool HdcTriggerRead(void) { hdc_next_read = millis() + HDC1080_CONV_TIME; if(status) { - AddLog(LOG_LEVEL_DEBUG, PSTR("HdcTriggerRead: failed to open the transaction for HDC_REG_TEMP. Status = %d"), status); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_SENSOR "HdcTriggerRead: failed to open the transaction for HDC_REG_TEMP. Status = %d"), status); + if (!--hdc_valid) { + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_SENSOR "%s will be marked as offline"), (char*) hdc_type_name); + hdc_online = false; + } return false; } @@ -205,7 +210,11 @@ bool HdcRead(void) { status = HdcTransactionClose(HDC1080_ADDR, sensor_data, 4); if(status) { - AddLog(LOG_LEVEL_DEBUG, PSTR("HdcRead: failed to read HDC_REG_TEMP. Status = %d"), status); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_SENSOR "HdcRead: failed to read HDC_REG_TEMP. Status = %d"), status); + if (!--hdc_valid) { + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_SENSOR "%s will be marked as offline"), (char*) hdc_type_name); + hdc_online = false; + } return false; } @@ -213,7 +222,7 @@ bool HdcRead(void) { temp_data = (uint16_t) ((sensor_data[0] << 8) | sensor_data[1]); rh_data = (uint16_t) ((sensor_data[2] << 8) | sensor_data[3]); - AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("HdcRead: temperature raw data: 0x%04x; humidity raw data: 0x%04x"), temp_data, rh_data); + AddLog(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_SENSOR "HdcRead: temperature raw data: 0x%04x; humidity raw data: 0x%04x"), temp_data, rh_data); // read the temperature from the first 16 bits of the result @@ -241,9 +250,10 @@ void HdcDetect(void) { hdc_manufacturer_id = HdcReadManufacturerId(); hdc_device_id = HdcReadDeviceId(); - AddLog(LOG_LEVEL_DEBUG, PSTR("HdcDetect: detected device with manufacturerId = 0x%04X and deviceId = 0x%04X"), hdc_manufacturer_id, hdc_device_id); + AddLog(LOG_LEVEL_DEBUG, PSTR(D_LOG_SENSOR "HdcDetect: detected device with manufacturerId = 0x%04X and deviceId = 0x%04X"), hdc_manufacturer_id, hdc_device_id); if (hdc_device_id == HDC1080_DEV_ID) { + hdc_online = true; HdcInit(); I2cSetActiveFound(HDC1080_ADDR, hdc_type_name); } @@ -255,7 +265,7 @@ void HdcDetect(void) { * */ void HdcEverySecond(void) { - if (TasmotaGlobal.uptime &1) { // Every 2 seconds + if (hdc_online & TasmotaGlobal.uptime &1) { // Every 2 seconds if (!HdcTriggerRead()) { AddLogMissed((char*) hdc_type_name, hdc_valid); } @@ -293,7 +303,7 @@ bool Xsns65(uint32_t function) else if (hdc_device_id) { switch (function) { case FUNC_EVERY_50_MSECOND: - if(is_reading && TimeReached(hdc_next_read)) { + if(hdc_online && is_reading && TimeReached(hdc_next_read)) { if(!HdcRead()) { AddLogMissed((char*) hdc_type_name, hdc_valid); } From 3417d42669cf5517fb93116f08f0977fc5ec5c46 Mon Sep 17 00:00:00 2001 From: Theo Arends <11044339+arendst@users.noreply.github.com> Date: Sat, 12 Aug 2023 14:18:56 +0200 Subject: [PATCH 150/150] Update changelogs --- CHANGELOG.md | 2 ++ RELEASENOTES.md | 2 ++ TEMPLATES.md | 50 +++++++++++++++++++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93bafed73..cf0a47856 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ All notable changes to this project will be documented in this file. ### Changed - Console height from default 318 pixels to viewport (#19241) - Shutter button hold behaviour with grouptopic (#19263) +- Thermostat improvements (#19279) +- PID controller improvements (#19285) ### Fixed diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 427f29da8..2959193bf 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -146,6 +146,8 @@ The latter links can be used for OTA upgrades too like ``OtaUrl https://ota.tasm - Reduced log level for TeleInfo [#19216](https://github.com/arendst/Tasmota/issues/19216) - Console height from default 318 pixels to viewport [#19241](https://github.com/arendst/Tasmota/issues/19241) - Shutter button hold behaviour with grouptopic [#19263](https://github.com/arendst/Tasmota/issues/19263) +- Thermostat improvements [#19279](https://github.com/arendst/Tasmota/issues/19279) +- PID controller improvements [#19285](https://github.com/arendst/Tasmota/issues/19285) - ESP32 shutter driver support up to 16 shutters [#18295](https://github.com/arendst/Tasmota/issues/18295) - ESP32 autodetect flashsize and adjust filesystem [#19215](https://github.com/arendst/Tasmota/issues/19215) - Berry extend `range(lower, upper, incr)` to arbitrary increment [#19120](https://github.com/arendst/Tasmota/issues/19120) diff --git a/TEMPLATES.md b/TEMPLATES.md index 9160d0206..4cb82b786 100644 --- a/TEMPLATES.md +++ b/TEMPLATES.md @@ -5,7 +5,7 @@ # Templates -Find below the available templates as of June 2023. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) +Find below the available templates as of August 2023. More template information can be found in the [Tasmota Device Templates Repository](http://blakadder.github.io/templates) ## Adapter Board ``` @@ -226,6 +226,7 @@ MS-108 In-Wall {"NAME":"MS-108","GPIO":[0,0,0,0,161,160,0,0,224,0, MS-108WR RF Curtain Module {"NAME":"MS-108WR","GPIO":[1,1,1,544,32,33,1,1,225,32,224,1,1,1],"FLAG":0,"BASE":18} Nous {"NAME":" Smart WiFi Curtain Module L12T","GPIO":[1,160,1,161,225,224,1,1,544,1,32,1,1,1],"FLAG":0,"BASE":18} QS-WIFI-C01-RF {"NAME":"Shutter-QS-WIFI-C01","GPIO":[0,0,1,0,288,0,0,0,32,33,224,225,0,0],"FLAG":0,"BASE":18} +wesmartify Smart Home Aktor Shut It TASMOTA {"NAME":"ITzy","GPIO":[0,0,0,0,225,224,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":54} ``` ## Curtain Switch @@ -257,10 +258,11 @@ Zemismart Backlit {"NAME":"WF-CS01","GPIO":[544,227,289,34,226,161,0, ## DIN Relay ``` -CurrySmarter Power Monitoring 30A {"NAME":"30A Breaker","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18} +CurrySmarter Power Monitoring 30A {"NAME":"30A Breaker on Led","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18} EARU DIN Circuit Breaker 1P 32A/50A {"NAME":"RDCBC-1P","GPIO":[320,0,0,0,0,0,0,0,32,224,0,0,0,0],"FLAG":0,"BASE":18} Hoch Circuit Breaker 1P {"NAME":"HOCH ZJSB9","GPIO":[32,0,0,0,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} Ketotek Single Phase Energy Monitor {"NAME":"Ketotek KTEM06","GPIO":[0,2272,0,2304,0,0,0,0,0,0,320,0,32,0],"FLAG":0,"BASE":54} +Martin Jerry 30A Circuit Breaker {"NAME":"30A Breaker","GPIO":[0,0,0,0,7584,224,0,0,2720,32,2656,2624,320,0],"FLAG":0,"BASE":18} OpenEnergyMonitor WiFi MQTT Thermostat {"NAME":"MQTT-RELAY","GPIO":[32,0,1,0,0,224,0,0,0,0,0,0,320,0],"FLAG":0,"BASE":18} RocketController ASTRA Controller {"NAME":"ASTRA R4A4","GPIO":[1,1,1,1,576,1,1,1,480,1,1,1,3232,3200,1,1,0,640,608,1,0,224,225,1152,0,0,0,0,227,226,160,161,162,0,0,163],"FLAG":0,"BASE":1} Shelly Pro 1 {"NAME":"Shelly Pro 1","GPIO":[0,1,0,1,768,0,0,0,672,704,736,0,0,0,5600,6214,0,0,0,5568,0,0,0,0,0,0,0,0,0,0,0,32,4736,0,160,0],"FLAG":0,"BASE":1,"CMND":"AdcParam1 2,10000,10000,3350"} @@ -295,6 +297,7 @@ Adafruit QT Py ESP32 Pico {"NAME":"QTPy ESP32 Pico","GPIO":[32,3200,0,3232,1, AZ-Envy Environmental Sensor {"NAME":"AZ Envy","GPIO":[32,0,320,0,640,608,0,0,0,0,0,0,0,4704],"FLAG":0,"BASE":18} Coiaca Tasmota {"NAME":"AWR01t","GPIO":[576,1,1,128,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Coiaca Tasmota Development Board AWR12 {"NAME":"AWR12t","GPIO":[320,1,1,1,1,1,0,0,1,1,1,1,1,1],"FLAG":0,"BASE":18} +Dasduino CONNECTPLUS {"NAME":"Dasduino CONNECT","GPIO":[1,1,1376,1,640,608,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":18} Dasduino CONNECTPLUS {"NAME":"Dasduino CONNECTPLUS","GPIO":[32,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,640,608,1,0,1,1,1,0,0,0,0,1376,1,1,1,1,0,0,1],"FLAG":0,"BASE":1} Espoir Rev 1.0.0 PoE+ {"NAME":"Espoir","GPIO":[0,0,1,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,5568,5600,1,7968,1,1,1,1],"FLAG":0,"BASE":1} KinCony 128 Channel Controller {"NAME":"KC868-A128","GPIO":[0,1,0,1,609,640,1,1,1,3232,3200,641,608,1,5600,0,0,1,0,5568,0,1,0,0,0,0,0,0,0,0,4705,4707,4706,0,0,4704],"FLAG":0,"BASE":1} @@ -392,7 +395,7 @@ Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0, Shelly Vintage 7W 750lm 2700k {"NAME":"Shelly Vintage","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} SmartDGM 9W 806lm {"NAME":"L-WB9W1","GPIO":[0,0,0,0,0,416,0,0,160,0,0,0,0,0],"FLAG":0,"BASE":18} Smitch 10W 6500K {"NAME":"Smitch Ambience SB-0110","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} -Smitch 10W 6500K {"NAME":"Smitch Ambience SB-0110","GPIO":[0,0,0,0,416,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +Smitch 10W 6500K {"NAME":"Smitch 10W 6500K Dimmable Bulb (SB0110 - E27)","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":1} TCP Smart 806lm Warm White {"NAME":"TCP Smart Clas","GPIO":[0,0,0,0,0,0,0,0,0,416,0,0,0,0],"FLAG":0,"BASE":1} TCP Smart 810lm Filament {"NAME":"TCP Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,448,0,0,0],"FLAG":0,"BASE":18} TCP Smart 810lm Filament {"NAME":"TCP Filament","GPIO":[0,0,0,0,0,0,0,0,0,0,448,0,0,0],"FLAG":0,"BASE":18} @@ -605,6 +608,7 @@ AI Universal Remote {"NAME":"YTF IR Controller","GPIO":[1,1,1,1,320,108 AI Universal Remote Control {"NAME":"LQ-08","GPIO":[0,0,0,0,0,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} Alfawise KS1 {"NAME":"KS1","GPIO":[1,1792,32,1824,32,1088,0,0,320,0,1056,0,0,4704],"FLAG":0,"BASE":62} Antsig Universal Remote Controller {"NAME":"Antsig Smart Wi-Fi IR","GPIO":[1,1,1,1,320,1088,0,0,0,32,1056,0,0,0],"FLAG":0,"BASE":62} +Athom {"NAME":"Athom_IR_Remote","GPIO":[32,0,0,0,1056,1088,0,0,0,576,0,0,0,0],"FLAG":0,"BASE":18} Automate Things IR Bridge {"NAME":"AT-IRBR-1.0","GPIO":[0,0,0,0,1056,1088,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"Module 0"} Automate Things IR Bridge {"NAME":"AT-IRBR-1.4","GPIO":[1088,0,0,0,1056,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18,"CMND":"Module 0"} auvisio S06 {"NAME":"NX-4519-675","GPIO":[0,0,0,0,288,1088,0,0,0,0,1056,0,0,0],"FLAG":0,"BASE":18} @@ -710,6 +714,7 @@ ZJ-WF-ESP-A v1.1 {"NAME":"RGB2","GPIO":[0,0,0,0,0,0,0,0,417,416,418, ## LED Strip ``` Aldi Casalux RGB {"NAME":"DW-RGB-WI01","GPIO":[1088,0,0,0,416,0,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} +ARLEC 5m Colour Changing "Not available" Arlec Smart 1m CCT LED Strip Light {"NAME":"ALD155HA","GPIO":[0,0,1088,0,0,416,0,0,0,417,0,0,0,0],"FLAG":0,"BASE":18} Arlec Smart 2m LED Colour Changing Strip Light {"NAME":"Arlec_Light_Strip","GPIO":[1,1,1088,1,416,419,1,1,417,420,418,0,1,1],"FLAG":0,"BASE":18} Arlec Smart 5m White & Colour Changing {"NAME":"ALD556HA","GPIO":[0,0,1088,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} @@ -794,7 +799,7 @@ Deta 18W 1900lm T8 Tube {"NAME":"DETA Smart LED","GPIO":[0,0,0,0,0,0,0,0,0, electriQ MOODL Ambiance Lamp {"NAME":"ElectriQ MOODL","GPIO":[0,4640,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} Gosund Table Lamp {"NAME":"Gosund LB3","GPIO":[0,0,0,0,0,418,0,0,417,419,0,416,0,0],"FLAG":0,"BASE":18} Hama Wall Light Square, 10 cm, IP 44 {"NAME":"Hama Wifi Wall Light","GPIO":[0,0,0,0,0,416,0,0,0,417,0,0,0,1],"FLAG":0,"BASE":18} -HiFree Table Lamp {"NAME":"TuyaMCU","GPIO":[108,1,107,1,1,1,1,1,1,1,1,1,1,1],"FLAG":0,"BASE":18} +HiFree Table Lamp {"NAME":"TuyaMCU","GPIO":[2304,1184,2272,1184,1184,1184,1184,1184,1184,1184,1184,1184,1184,0],"FLAG":0,"BASE":18} Hugoai Table Lamp {"NAME":"HG02","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,20 | TuyaMCU 26,21 | TuyaMCU 21,22 | TuyaMCU 23,23 | TuyaMCU 24,24 | DimmerRange 34,1000"} Iwoole Table Lamp {"NAME":"GLOBELAMP","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Lepro Bedroom Lamp {"NAME":"Lepro 902101-US","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,0],"FLAG":0,"BASE":54,"CMND":"TuyaMCU 11,20 | TuyaMCU 26,21 | TuyaMCU 21,22 | TuyaMCU 23,23 | TuyaMCU 24,24 | DimmerRange 34,1000"} @@ -866,6 +871,7 @@ Xystec USB3.0 4 Port Hub {"NAME":"Xystec USB Hub","GPIO":[0,0,0,0,224,0,0,0, DT-Light ESP8285 Lighting {"NAME":"DMP-L1","GPIO":[1,1,0,1,1,1,0,0,1,1,1,1,1,1],"FLAG":0,"BASE":18} ESP-01D {"NAME":"ESP-01D","GPIO":[1,1,0,1,1,0,0,0,1,0,1,0,0,0],"FLAG":0,"BASE":18} ESP-01S {"NAME":"ESP-01","GPIO":[1,1,1,1,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} +ESP-02S TYWE2S Replacement {"NAME":"ESP-02S","GPIO":[1,1,1,1,1,1,0,0,1,1,1,0,0,1],"FLAG":0,"BASE":18} ESP-12 {"NAME":"ESP-12","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,1,1],"FLAG":0,"BASE":18} ESP-15F {"NAME":"ESP-15F","GPIO":[1,1,0,1,1,1,0,0,0,544,0,0,0,0],"FLAG":0,"BASE":18} ESP-M2 {"NAME":"ESP-M2","GPIO":[1,1,1,1,1,1,0,0,1,1,1,1,0,1],"FLAG":0,"BASE":18} @@ -877,7 +883,6 @@ M5Stack M5Stamp Pico {"NAME":"M5Stamp Pico","GPIO":[1,1,0,1,0,0,0,0,0,0, MTools 16 Channel ESP32 Relay Driver 5V DC {"NAME":"16ch Board","GPIO":[1,1,237,1,232,1,1,1,228,231,1,1,233,230,234,235,0,238,239,236,0,224,227,226,0,0,0,0,229,225,1,1,1,0,0,1],"FLAG":0,"BASE":1} Shelly Universal Input/Output {"NAME":"Shelly Uni","GPIO":[320,0,0,0,225,1216,0,0,192,193,194,224,0,4864],"FLAG":0,"BASE":18} Sinilink MODBUS Interface {"NAME":"XY-WFPOW","GPIO":[0,8768,544,8800,32,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":18} -TYWE2S Replacement {"NAME":"ESP-02S","GPIO":[1,1,1,1,1,1,0,0,1,1,1,0,0,1],"FLAG":0,"BASE":18} ``` ## Motion Sensor @@ -946,6 +951,7 @@ Ledvance Smart+ 16A {"NAME":"LEDVANCE Smart Wifi Outdoor Plug","GPIO":[ Ledvance Smart+ Compact {"NAME":"LEDVANCE SMART+ Compact Outdoor Plug ","GPIO":[0,0,0,0,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} LSC Dual Socket {"NAME":"LSC NFL-022","GPIO":[0,0,0,0,320,32,0,0,0,224,225,0,0,0],"FLAG":0,"BASE":18} LSC Dual Socket {"NAME":"LSC Outdoor Dual Socket","GPIO":[320,0,0,32,8673,8672,0,0,0,0,8674,0,8675,0],"FLAG":0,"BASE":18} +Luminea 16A {"NAME":"NX-4655-675","GPIO":[0,0,0,0,320,576,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Luminea 2 Outlet {"NAME":"Luminea","GPIO":[0,0,0,0,225,320,0,0,224,321,32,0,0,1],"FLAG":0,"BASE":18} Luminea NX-4458 {"NAME":"Luminea NX4458","GPIO":[32,0,0,0,2688,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":65} Master {"NAME":"Master_IOT-EXTPLUG","GPIO":[32,1,0,1,1,0,0,0,224,288,0,0,0,0],"FLAG":0,"BASE":1} @@ -968,6 +974,7 @@ Signstek EOP03-EU {"NAME":"Signstek EOP03","GPIO":[0,0,0,0,320,321,0, SK03 {"NAME":"SK03 Outdoor","GPIO":[32,0,0,0,2688,2656,0,0,2624,321,320,224,0,0],"FLAG":0,"BASE":57} STITCH {"NAME":"STITCH 35556","GPIO":[1,1,1,1,225,321,0,0,224,320,32,1,1,0],"FLAG":0,"BASE":18} Suraielec 40A Heavy Duty {"NAME":"Suraielec UBTW01B","GPIO":[0,0,0,0,544,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} +Tate Guard ZUM-26EU-X Dual {"NAME":"Tate Guard","GPIO":[0,0,0,0,224,288,0,0,225,288,32,0,0,0],"FLAG":0,"BASE":18} Teckin SS31 {"NAME":"Teckin SS31","GPIO":[1,1,1,1,320,321,1,1,224,32,225,1,1,1],"FLAG":0,"BASE":18} Teckin SS33 {"NAME":"Teckin SS31","GPIO":[0,0,0,226,320,321,0,0,224,32,225,0,0,1],"FLAG":0,"BASE":18} Teckin SS42 {"NAME":"Teckin SS42","GPIO":[0,0,0,0,320,321,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} @@ -1069,6 +1076,7 @@ Avatto 10A {"NAME":"Avatto NAS-WR01W 10A 2021-12","GPIO":[0,0, Avatto JH-G01E {"NAME":"AVATTO JH-G01E","GPIO":[0,3072,0,3104,0,0,0,0,32,320,224,0,0,0],"FLAG":0,"BASE":41} Avatto OT06 16A {"NAME":"Avatto OT06","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} Avatto OT08 {"NAME":"Avatto OT08","GPIO":[416,0,418,0,417,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} +Avidsen Home {"NAME":"Avidsen HomePlug","GPIO":[0,0,0,0,224,35,0,0,289,288,0,0,0,0],"FLAG":0,"BASE":18} Awow X5P {"NAME":"Awow","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} AWP02L-N {"NAME":"AWP02L-N","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224,0,0],"FLAG":0,"BASE":18} AzpenHome Smart {"NAME":"Socket2Me","GPIO":[288,1,1,1,225,1,0,0,224,1,32,1,1,0],"FLAG":0,"BASE":18} @@ -1137,6 +1145,7 @@ Coosa SP1 {"NAME":"COOSA SP1","GPIO":[321,1,320,1,0,2720,0,0, CooWoo {"NAME":"CooWoo AW01","GPIO":[0,0,0,0,288,160,0,0,256,0,0,0,0,0],"FLAG":0,"BASE":18} CozyLife HomeKit 16A {"NAME":"CozyLife 16A","GPIO":[0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,2720,0,0,2656,576,0,224,2624,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1} CrazyLynX WiFi {"NAME":"CrazyLynX","GPIO":[0,0,0,0,321,320,0,0,224,32,0,0,0,4704],"FLAG":0,"BASE":18} +Crest Single Power Adaptor {"NAME":"SHSPM1","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":52} Crest Smart Home Single Power Adaptor with 2 USB {"NAME":"Medion","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":52} CurrySmarter 16A {"NAME":"CurrySmarter 16A","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} CurrySmarter 16A Power Monitoring {"NAME":"Currysmarter XH-TW2P","GPIO":[0,0,0,2624,32,320,0,0,224,2720,2656,0,0,0],"FLAG":0,"BASE":18} @@ -1189,8 +1198,6 @@ Etekcity 15A {"NAME":"ESW15-US","GPIO":[0,0,0,0,0,224,0,0,2656,2 Etekcity 8A {"NAME":"ESW01-USA","GPIO":[0,0,0,0,224,544,0,0,2656,2688,32,2592,288,0],"FLAG":0,"BASE":55} EU3S {"NAME":"AWOW BSD33","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} Eva Logik {"NAME":"EVA LOGIK Plug","GPIO":[1,32,1,1,1,1,0,0,1,288,224,1,1,0],"FLAG":0,"BASE":18} -EZPlug V1 OpenSource {"NAME":"EZPlug V1","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1} -EZPlug+ V1 {"NAME":"EZPlug+ V1","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":1} Febite {"NAME":"Febite","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,0,0,0],"FLAG":0,"BASE":1} Feit Electric PLUG/WIFI {"NAME":"Feit Wifi Plug","GPIO":[0,0,0,320,0,0,0,0,224,0,32,0,0,0],"FLAG":0,"BASE":18} FK-PW901U {"NAME":"FK-PW901U","GPIO":[320,1,1,1,1,226,0,0,224,32,227,225,1,0],"FLAG":0,"BASE":18} @@ -1311,6 +1318,7 @@ JuoYou 16A {"NAME":"Juoyou ZY-OYD","GPIO":[0,0,0,32,2720,2656, JVMAC-EU01 {"NAME":"JVMAC","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} Kaforto KW-US-801 {"NAME":"Kaforto US-801","GPIO":[32,576,0,227,2720,2656,0,0,2624,225,224,226,0,0],"FLAG":0,"BASE":18} Kauf esphome {"NAME":"KAUF Plug","GPIO":[576,0,320,0,224,2720,0,0,2624,32,2656,0,0,0],"FLAG":0,"BASE":18} +Kauf esphome {"NAME":"Kauf Plug","GPIO":[0,320,0,32,2720,2656,0,0,321,224,2624,0,0,0],"FLAG":0,"BASE":18} Kimire S12 {"NAME":"Kimire S12","GPIO":[1,1,1,32,1,1,0,0,1,320,224,1,1,0],"FLAG":0,"BASE":18} King-Link KL-US-WF002 {"NAME":"Kinglink-plug","GPIO":[0,0,0,0,0,224,0,0,288,32,0,0,0,0],"FLAG":0,"BASE":18} Kisslink SP200 {"NAME":"Kisslink SP200","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,4704],"FLAG":0,"BASE":18} @@ -1408,8 +1416,8 @@ NGS Loop Track 16A {"NAME":"LOOP","GPIO":[0,0,320,0,0,0,0,0,0,32,0,224 Nightlight and AC Outlet {"NAME":"SWN03","GPIO":[32,0,0,0,0,0,1,1,416,0,0,224,0,0],"FLAG":0,"BASE":18} Nishica SM-PW701I {"NAME":"SM-PW701I","GPIO":[1,1,1,1,1,1,1,1,224,288,32,1,1,1],"FLAG":0,"BASE":18} Nivian {"NAME":"Nivian Smart Socket","GPIO":[0,0,320,0,0,2688,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":18} -Nous 16A {"NAME":"NOUS A1T","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} Nous A1 {"NAME":"NOUS A1","GPIO":[320,0,576,0,2656,2720,0,0,2624,32,0,224,0,0],"FLAG":0,"BASE":45} +Nous A1T 16A {"NAME":"NOUS A1T","GPIO":[32,0,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":49} NX-SM112 {"NAME":"NX-SM112v3","GPIO":[0,0,0,0,2720,2656,0,0,576,32,2592,224,0,0],"FLAG":0,"BASE":45} NX-SM200 {"NAME":"NX-SM200","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18} NX-SM210 {"NAME":"NX-SM210","GPIO":[0,32,0,0,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -1417,7 +1425,7 @@ NX-SM223 {"NAME":"Smart Thurmm","GPIO":[0,32,0,0,0,0,0,0,0,3 Oakter Oak Plug Plus 16A {"NAME":"Oakter OakPlug Plus","GPIO":[0,0,0,0,224,0,0,0,544,320,0,0,0,0],"FLAG":0,"BASE":18} Oakter OakPlug Mini 10A {"NAME":"Oakter OakPlug Mini","GPIO":[0,0,0,0,224,0,0,0,544,320,0,0,0,0],"FLAG":0,"BASE":18} Oakter OakPlug Plus (old) {"NAME":"Oakter OakPlug Plus (old)","GPIO":[0,0,0,0,224,0,0,0,0,320,0,0,544,0],"FLAG":0,"BASE":18} -Obi Stecker {"NAME":"OBI Socket","GPIO":[1,1,0,1,288,224,0,0,290,1,32,0,1,4704],"FLAG":0,"BASE":51} +Obi Stecker {"NAME":"Euromate","GPIO":[1,1,1,1,288,224,1,1,289,1,32,1,1,1],"FLAG":0,"BASE":18} Obi Stecker 2 {"NAME":"OBI Socket 2","GPIO":[0,0,0,0,224,32,0,0,320,289,0,0,0,0],"FLAG":0,"BASE":61} OFFONG 16A {"NAME":"OFFONG P1","GPIO":[0,32,0,0,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":18} Oittm Smart {"NAME":"Oittm","GPIO":[0,0,0,0,224,320,0,0,32,0,0,0,0,0],"FLAG":0,"BASE":1} @@ -1437,6 +1445,7 @@ OxaOxe NX-SP202 v2 {"NAME":"oxaoxe-dold","GPIO":[320,0,0,2624,32,2720, OZWI Smart {"NAME":"OZWI Smart Plug","GPIO":[0,0,0,0,288,0,0,0,224,32,544,0,0,0],"FLAG":0,"BASE":18} Panamalar Nightlight {"NAME":"Panamalar EWN0","GPIO":[32,0,0,0,0,0,1,1,416,0,0,224,0,0],"FLAG":0,"BASE":18} Panamalar NX-SM200 {"NAME":"NX-SM200","GPIO":[0,0,0,0,320,2720,0,0,2624,32,2656,224,0,4704],"FLAG":0,"BASE":18} +Polycam Hohm Lanre 16A {"NAME":"SLV1910001","GPIO":[0,0,0,32,2720,2656,0,0,2624,576,224,0,0,0],"FLAG":0,"BASE":18} Positivo PPW1000 {"NAME":"PPW1000","GPIO":[0,0,320,0,0,2720,0,0,2624,32,2656,224,0,0],"FLAG":0,"BASE":45} Positivo Max {"NAME":"PPW1600","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":55} PowerAdd BIE0091 {"NAME":"BIE0091","GPIO":[32,0,0,0,0,0,0,0,416,0,0,224,0,0],"FLAG":0,"BASE":18} @@ -1543,6 +1552,8 @@ Teckin SP27 {"NAME":"Teckin SP27","GPIO":[320,1,1,1,1,1,0,0,1,3 Tellur 16A 2 Ports {"NAME":"Tellur WiFi Smart Socket","GPIO":[0,0,0,2624,96,2688,0,0,224,33,2656,225,0,0],"FLAG":0,"BASE":18} Tellur 1USB 10A {"NAME":"Tellur TTL331021","GPIO":[0,0,544,0,288,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Tflag NX-SM100 {"NAME":"NX-SM100","GPIO":[320,0,0,0,0,2720,0,0,224,32,2656,321,2624,0],"FLAG":0,"BASE":18} +TH3D EZPlug V1 {"NAME":"EZPlug V1","GPIO":[0,0,0,32,0,0,0,0,0,320,224,0,0,0],"FLAG":0,"BASE":1} +TH3D EZPlug+ V1 {"NAME":"EZPlug+ V1","GPIO":[0,0,0,32,2720,2656,0,0,2624,320,224,0,0,0],"FLAG":0,"BASE":1} TikLok TL650 {"NAME":"TikLok Mini","GPIO":[0,0,0,0,321,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Timethinker C338 {"NAME":"C338","GPIO":[32,0,1,0,0,0,0,0,224,288,1,0,0,0],"FLAG":0,"BASE":1} Timethinker TK04 {"NAME":"TimethinkerEU","GPIO":[1,1,1,1,32,1,0,0,1,288,224,1,0,0],"FLAG":0,"BASE":18} @@ -1562,6 +1573,7 @@ Treatlife Dimmable {"NAME":"DP20","GPIO":[0,2272,0,2304,0,0,0,0,0,0,0, Treatlife Smart {"NAME":"Treatlife SK50","GPIO":[1,1,1,1,320,576,1,1,224,1,32,1,1,1],"FLAG":0,"BASE":18} Tuya 16A Nightlight {"NAME":"Nightlight","GPIO":[225,0,320,0,226,227,0,0,34,64,0,224,0,0],"FLAG":0,"BASE":18} U10 Series {"NAME":"WIFI-Socket","GPIO":[1,32,1,1,1,1,1,1,1,320,224,1,1,4704],"FLAG":0,"BASE":18} +Ucomen Night Light {"NAME":"UCOMEN Plug","GPIO":[0,0,0,0,544,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} UltraBrite {"NAME":"UltraBrite Smart Plug","GPIO":[1,1,1,1,288,289,1,1,224,32,1,1,1,1],"FLAG":0,"BASE":18} Ultralink UL-P01W {"NAME":"UL-P01W","GPIO":[0,288,0,32,2720,2656,0,0,2624,544,224,0,0,0],"FLAG":0,"BASE":18} Unlocked Automation 15A {"NAME":"UA 100","GPIO":[0,0,0,0,320,321,0,0,224,32,0,0,0,1],"FLAG":0,"BASE":18} @@ -1613,7 +1625,7 @@ XS-A18 {"NAME":"XS-A18","GPIO":[416,0,417,0,0,418,0,0,0,32 XS-A23 {"NAME":"XS-A23","GPIO":[320,1,0,2624,32,2720,0,0,0,33,2656,224,225,0],"FLAG":0,"BASE":45} XS-SSA01 {"NAME":"XS-SSA01","GPIO":[1,0,0,1,0,0,0,0,320,32,1,224,1,0],"FLAG":0,"BASE":18} XS-SSA01 v2 {"NAME":"XS-SSA01","GPIO":[1,32,1,1,1,1,0,0,320,1,1,224,1,0],"FLAG":0,"BASE":18} -XS-SSA05 {"NAME":"XS-SSA05","GPIO":[257,1,1,2624,1,2688,0,0,224,32,2656,258,1,4704],"FLAG":0,"BASE":18} +XS-SSA05 {"NAME":"XS-SSA05","GPIO":[320,0,0,2624,544,2688,0,0,224,32,2656,0,0,4704],"FLAG":0,"BASE":18} XS-SSA06 {"NAME":"XS-SSA06","GPIO":[416,0,417,0,0,418,0,0,0,64,0,224,0,0],"FLAG":0,"BASE":18} Yagala SWA9 {"NAME":"SWA9","GPIO":[0,0,0,0,288,224,0,0,0,32,0,0,0,0],"FLAG":0,"BASE":18} Yelomin JH-G01E {"NAME":"Yelomin","GPIO":[0,3072,0,3104,0,0,0,0,32,320,224,0,0,0],"FLAG":0,"BASE":18} @@ -1706,12 +1718,13 @@ Konesky Type 1 {"NAME":"Konesky","GPIO":[0,0,0,0,228,225,0,0,227,3 Koogeek KLOE4 {"NAME":"Koogeek KLOE4","GPIO":[0,320,0,32,225,224,0,0,226,227,228,0,0,4704],"FLAG":0,"BASE":18} Larkkey 4AC 4USB {"NAME":"LARKKEY Strip","GPIO":[0,544,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} LeFun SK2 {"NAME":"LeFun SK2","GPIO":[0,0,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} +Lidl Silvercrest Zigbee {"NAME":"Lidl Silvercrest HG06338","GPIO":[0,288,0,0,225,226,0,0,32,224,576,0,0,0],"FLAG":0,"BASE":18} LITEdge Smart Power Strip {"NAME":"LITEEdge Power Strip","GPIO":[227,0,0,0,288,289,0,0,224,32,225,226,228,0],"FLAG":0,"BASE":18} Luminea 3AC+4USB 16A {"NAME":"Luminea-NX4473","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,0],"FLAG":0,"BASE":18} Maxcio ZLD-34EU-W {"NAME":"MAXCIO","GPIO":[0,320,0,32,225,224,0,0,0,226,227,0,0,4704],"FLAG":0,"BASE":18} Merkury Innovations Smart Surge {"NAME":"Merkury Power Strip MIC-SW002-199L","GPIO":[288,0,289,0,228,32,0,0,225,224,226,0,259,0],"FLAG":0,"BASE":18} Merkury Innovations SmartSurge {"NAME":"Merkury MI-SW001","GPIO":[288,0,289,0,228,32,0,0,225,224,226,0,227,0],"FLAG":0,"BASE":18} -Meross 4AC 4USB {"NAME":"HamaStrip","GPIO":[0,544,0,32,225,224,0,0,226,227,228,0,0,0],"FLAG":0,"BASE":18} +Meross 4AC 4USB {"NAME":"MSS425F","GPIO":[0,544,0,32,225,224,0,0,226,227,260,0,0,0],"FLAG":0,"BASE":18} Meross MSS425 {"NAME":"Meross MSS425","GPIO":[260,0,0,0,320,0,0,0,224,32,225,226,259,0],"FLAG":0,"BASE":18} Mirabella Genio 4 Outlet Power Board with 2 USB {"NAME":"Genio i002340","GPIO":[320,0,0,0,224,225,0,0,226,32,227,228,0,0],"FLAG":0,"BASE":18} Mirabella Genio Powerboard {"NAME":"Genio Powerboa","GPIO":[224,288,0,0,226,225,0,0,228,32,229,227,0,0],"FLAG":0,"BASE":18} @@ -1742,6 +1755,7 @@ Tellur 3AC 4USB {"NAME":"Tellur","GPIO":[0,320,0,32,225,224,0,0,0,2 Tessan {"NAME":"TESSAN A4L-BK","GPIO":[0,0,0,227,226,0,0,0,224,0,225,0,0,0],"FLAG":0,"BASE":18} Tonbux SM-SO301-U {"NAME":"Tonbux SM-SO30","GPIO":[320,0,0,0,256,0,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18} Useelink {"NAME":"Useelink","GPIO":[288,0,0,321,256,32,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18} +Useelink 4AC 2USB {"NAME":"306 Power Strip","GPIO":[576,0,576,291,259,32,0,0,257,258,256,0,228,0],"FLAG":0,"BASE":18} Vivitar HA-1007 {"NAME":"Vivitar HA-1007 Power Strip","GPIO":[544,0,0,0,227,228,0,0,225,224,226,0,35,1],"FLAG":0,"BASE":18} Vivitar HA-1007-AU {"NAME":"HA-1007-AU","GPIO":[320,32,0,322,256,321,0,0,258,257,259,0,228,0],"FLAG":0,"BASE":18} wesmartify essentials 3-socket 2 USB {"NAME":"Essentials Smart Home 3-socket USB Power Strip","GPIO":[0,0,0,0,544,226,0,0,224,32,225,0,0,0],"FLAG":0,"BASE":18} @@ -1883,6 +1897,8 @@ iQtech 9W 800lm {"NAME":"iQ-Tech RGBCCT 9W 800LM","GPIO":[0,0,0,0,4 Jeeo TF-QPZ13 800lm {"NAME":"Jeeo","GPIO":[0,0,0,0,2912,416,0,0,417,2976,2944,0,0,0],"FLAG":0,"BASE":18} Julun JL-021 5W Candle {"NAME":"E14 RGBCCT","GPIO":[0,0,0,0,419,420,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Kauf esphome 10W {"NAME":"Kauf Bulb","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Kauf esphome A15 5W {"NAME":"Kauf Bulb","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} +Kauf esphome A19 7W {"NAME":"Kauf Bulb","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} KHSUIN BR30 13W 1300lm {"NAME":"KHSUIN 13W BR30","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18} Kogan 10W 1050lm {"NAME":"Kogan RGB+CCT","GPIO":[1,1,1,0,416,419,1,1,417,452,418,1,1,1],"FLAG":0,"BASE":18} Kohree 600lm {"NAME":"Kohree VHP560","GPIO":[0,0,0,0,416,420,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18} @@ -2133,6 +2149,7 @@ Nedis 6W 470lm {"NAME":"nedis Bulb","GPIO":[0,0,0,0,416,419,0,0,41 Nedis A60 800lm {"NAME":"Nedis RGBW","GPIO":[0,0,0,0,2912,416,0,0,0,2976,2944,0,0,4704],"FLAG":0,"BASE":18} Nedis C10 350lm {"NAME":"Nedis WIFILC10","GPIO":[0,0,0,0,418,416,0,0,419,417,420,0,0,4704],"FLAG":0,"BASE":18} Nedis PAR16 330lm {"NAME":"Nedis GU10","GPIO":[0,0,0,0,418,416,0,0,419,417,420,0,0,0],"FLAG":0,"BASE":18} +NGteco {"NAME":"NGTECO L100","GPIO":[0,0,0,0,0,418,0,0,417,0,416,419,0,0],"FLAG":0,"BASE":18} Novostella UT55506 10W 1050lm {"NAME":"Novostella 10W","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Onforu 7W 700lm {"NAME":"Onforu RGBW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Orbecco 5W 400lm {"NAME":"Orbecco Bulb","GPIO":[0,0,0,0,0,0,0,0,3008,0,3040,0,0,0],"FLAG":0,"BASE":27} @@ -2164,6 +2181,7 @@ Teckin 7.5W 800lm {"NAME":"Teckin SB60","GPIO":[0,0,0,0,416,419,0,0,4 Teckin SB50 800lm {"NAME":"Teckin SB50","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} Teckin SB50 v2 800lm {"NAME":"Teckin SB50","GPIO":[0,0,0,0,416,0,0,0,417,419,418,0,0,0],"FLAG":0,"BASE":18} Teckin SB51 800lm {"NAME":"Teckin SB51","GPIO":[0,0,0,0,419,0,0,0,417,418,416,0,0,0],"FLAG":0,"BASE":18} +TH3D EZBulb V1 {"NAME":"EZBulb V1","GPIO":[0,0,0,0,416,419,0,0,417,0,418,0,0,0],"FLAG":0,"BASE":18} TikLOk TL530 A19 7.5W 800lm {"NAME":"TikLOk WW-CW-L","GPIO":[0,0,0,0,0,416,0,0,417,0,0,0,0,0],"FLAG":0,"BASE":18} TVLive 7.5W 800lm {"NAME":"TVLIVE RGBCW","GPIO":[0,0,0,0,416,419,0,0,417,420,418,0,0,0],"FLAG":0,"BASE":18} Utorch LE7 600lm {"NAME":"Utorch LE7","GPIO":[0,0,0,0,0,417,0,0,418,0,419,416,0,0],"FLAG":0,"BASE":18} @@ -2573,9 +2591,9 @@ Sonoff TX T3 EU 2 Gang {"NAME":"Sonoff T3 TX 2CH","GPIO":[32,1,1,1,0,225,3 Sonoff TX T3 EU 3 Gang {"NAME":"TX T3EU3C","GPIO":[32,1,0,1,226,225,33,34,224,576,0,0,0,0],"FLAG":0,"BASE":30} Sonoff TX T3 US 3 Gang {"NAME":"TX T3US3C","GPIO":[32,1,0,1,226,225,33,34,224,576,0,0,0,0],"FLAG":0,"BASE":30} Sonoff TX T4 EU No Neutral 1 Gang {"NAME":"Sonoff T4 1CH","GPIO":[32,1,1,1,0,0,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":28} -Sonoff TX Ultimate 1 Gang {"NAME":"TX Ultimate 1","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,0,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Pixels 27"} -Sonoff TX Ultimate 2 Gang {"NAME":"TX Ultimate 1","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Pixels 27"} -Sonoff TX Ultimate 3 Gang {"NAME":"TX Ultimate 1","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,226,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Pixels 27"} +Sonoff TX Ultimate 1 Gang {"NAME":"TX Ultimate 1","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,0,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} +Sonoff TX Ultimate 2 Gang {"NAME":"TX Ultimate 2","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,0,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} +Sonoff TX Ultimate 3 Gang {"NAME":"TX Ultimate 3","GPIO":[0,0,7808,0,7840,3872,0,0,0,1376,0,7776,0,225,224,3232,0,480,3200,0,0,0,3840,226,0,0,0,0,0,0,0,0,0,0,0,0],"FLAG":0,"BASE":1,"CMND":"Backlog Pixels 28"} SPC Hera {"NAME":"SPC HERA","GPIO":[544,0,0,32,224,0,0,0,0,0,288,0,0,0],"FLAG":0,"BASE":18} SRL 2 Gang {"NAME":"SRL 4WW Switch","GPIO":[0,0,0,0,0,33,0,0,32,224,0,225,0,0],"FLAG":0,"BASE":18} SRL 4 Gang {"NAME":"SRL 4WW Switch","GPIO":[0,0,0,34,226,33,0,0,32,224,227,225,35,0],"FLAG":0,"BASE":18} @@ -2687,7 +2705,9 @@ Moes {"NAME":"Moes MS-104B","GPIO":[0,0,32,0,480,0,0,0,1 Moes 10A {"NAME":"Moes MS-101","GPIO":[0,0,0,0,0,320,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Moes Mini 3 Gang 1/2 Way {"NAME":"Moes MS-104C","GPIO":[0,0,0,34,32,33,0,0,224,225,226,0,0,0],"FLAG":0,"BASE":18} Nedis 10A {"NAME":"Nedis WIFIPS10WT","GPIO":[0,0,0,0,224,0,0,0,32,321,0,288,0,0],"FLAG":0,"BASE":18} +Nous 1 Channel Touch {"NAME":"NOUS L1T","GPIO":[544,0,1,32,0,0,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Nous 1/2 Channel {"NAME":"NOUS L13T Smart Switch Module","GPIO":[1,161,1,160,225,224,1,1,544,1,32,1,1,1],"FLAG":0,"BASE":18} +Nous 2 Channel Touch {"NAME":"NOUS L2T","GPIO":[544,289,1,32,225,33,0,0,0,224,288,0,0,0],"FLAG":0,"BASE":1} Nova Digital Basic 1 MS101 {"NAME":"NovaDigBasic1","GPIO":[0,1,0,1,320,0,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} PPA Contatto Wi-Fi {"NAME":"PPA Contatto","GPIO":[0,0,32,0,224,162,0,0,288,225,0,0,0,0],"FLAG":0,"BASE":18} PS-1604 16A {"NAME":"PS-1604 16A","GPIO":[32,1,1,1,1,0,0,0,224,320,1,0,0,0],"FLAG":0,"BASE":1} @@ -2786,6 +2806,7 @@ Tuya Gas/Water {"NAME":"Valve FM101","GPIO":[320,0,0,0,224,0,0,0,0 Aigostar P40 {"NAME":"Aigostar 8433325212278","GPIO":[0,0,0,0,544,288,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Aseer THWFS01 {"NAME":"ASEER-THWFS01","GPIO":[320,33,544,323,2720,2656,0,0,2624,225,321,224,32,0],"FLAG":0,"BASE":18} Athom {"NAME":"Athom SK01","GPIO":[0,0,0,3104,0,32,0,0,224,320,0,0,0,0],"FLAG":0,"BASE":18} +Athom 16A UK {"NAME":"Athom SK03-TAS","GPIO":[0,0,0,3104,0,32,0,0,224,576,0,0,0,0],"FLAG":0,"BASE":18} Bestten LO-2-W {"NAME":"BESTTEN LO-2-W","GPIO":[0,0,0,0,576,32,0,0,224,0,0,0,0,0],"FLAG":0,"BASE":18} BingoElec 16A {"NAME":"BingoElecPower","GPIO":[0,0,0,0,288,289,1,1,224,32,0,0,1,1],"FLAG":0,"BASE":18} BlitzWolf SHP8 {"NAME":"SHP8","GPIO":[0,320,0,32,2720,2656,0,0,2624,289,224,0,0,0],"FLAG":0,"BASE":64} @@ -2816,6 +2837,7 @@ Milfra UK Double USB Chager Twin {"NAME":"Milfra TBU02","GPIO":[0,0,0,0,288,33, Moes 16A {"NAME":"WK-EU(FR/UK)16M","GPIO":[0,288,0,32,2720,2656,0,0,2624,224,0,0,0,0],"FLAG":0,"BASE":18} Moes WWK Glass Panel {"NAME":"Smart Socket","GPIO":[0,0,0,0,288,289,0,0,224,32,0,0,0,0],"FLAG":0,"BASE":18} Oittm 120 {"NAME":"Oittm WS01","GPIO":[32,0,0,0,0,2592,0,0,224,2656,2688,288,0,0],"FLAG":0,"BASE":18} +PFS Presa Smart {"NAME":"PFS_PresaSmart","GPIO":[1,1,1,1,288,289,1,1,224,32,0,1,1,1],"FLAG":0,"BASE":18} PS-1607 {"NAME":"PS-1607","GPIO":[32,0,0,0,0,225,33,0,224,0,0,0,0,0],"FLAG":0,"BASE":18} Smanergy KA10 {"NAME":"KA10","GPIO":[0,320,0,32,2720,2656,0,0,2624,289,224,0,0,0],"FLAG":0,"BASE":64} Sonoff IW100 {"NAME":"Sonoff IW100","GPIO":[32,3072,0,3104,0,0,0,0,224,544,0,0,0,0],"FLAG":0,"BASE":41}