Berry add id to rules

This commit is contained in:
Stephan Hadinger 2022-02-15 22:30:44 +01:00
parent 4d311d7c86
commit 25acc6d06a
6 changed files with 1161 additions and 1165 deletions

View File

@ -159,7 +159,7 @@ extern void be_load_wirelib(bvm *vm);
extern void be_load_onewirelib(bvm *vm); extern void be_load_onewirelib(bvm *vm);
extern void be_load_serial_lib(bvm *vm); extern void be_load_serial_lib(bvm *vm);
extern void be_load_Driver_class(bvm *vm); extern void be_load_Driver_class(bvm *vm);
extern void be_load_Timer_class(bvm *vm); extern void be_load_Trigger_class(bvm *vm);
extern void be_load_I2C_Driver_class(bvm *vm); extern void be_load_I2C_Driver_class(bvm *vm);
extern void be_load_AXP192_class(bvm *vm); extern void be_load_AXP192_class(bvm *vm);
extern void be_load_md5_lib(bvm *vm); extern void be_load_md5_lib(bvm *vm);
@ -200,7 +200,7 @@ BERRY_API void be_load_custom_libs(bvm *vm)
#if !BE_USE_PRECOMPILED_OBJECT #if !BE_USE_PRECOMPILED_OBJECT
/* be_load_xxxlib(vm); */ /* be_load_xxxlib(vm); */
#endif #endif
be_load_Timer_class(vm); be_load_Trigger_class(vm);
be_load_tasmota_ntvlib(vm); be_load_tasmota_ntvlib(vm);
be_load_tasmota_log_reader_class(vm); be_load_tasmota_log_reader_class(vm);
be_load_Driver_class(vm); be_load_Driver_class(vm);

View File

@ -100,7 +100,7 @@ extern const bcstring be_const_str_STATE_DEFAULT;
extern const bcstring be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27; extern const bcstring be_const_str_TAP_X3A_X20Loaded_X20Tasmota_X20App_X20_X27_X25s_X27;
extern const bcstring be_const_str_Tasmota; extern const bcstring be_const_str_Tasmota;
extern const bcstring be_const_str_Tele; extern const bcstring be_const_str_Tele;
extern const bcstring be_const_str_Timer; extern const bcstring be_const_str_Trigger;
extern const bcstring be_const_str_True; extern const bcstring be_const_str_True;
extern const bcstring be_const_str_Unknown; extern const bcstring be_const_str_Unknown;
extern const bcstring be_const_str_Unknown_X20command; extern const bcstring be_const_str_Unknown_X20command;
@ -790,6 +790,7 @@ extern const bcstring be_const_str_touch_update;
extern const bcstring be_const_str_toupper; extern const bcstring be_const_str_toupper;
extern const bcstring be_const_str_tr; extern const bcstring be_const_str_tr;
extern const bcstring be_const_str_traceback; extern const bcstring be_const_str_traceback;
extern const bcstring be_const_str_trig;
extern const bcstring be_const_str_true; extern const bcstring be_const_str_true;
extern const bcstring be_const_str_try; extern const bcstring be_const_str_try;
extern const bcstring be_const_str_try_rule; extern const bcstring be_const_str_try_rule;

File diff suppressed because it is too large Load Diff

View File

@ -487,8 +487,8 @@ be_local_closure(Tasmota_exec_tele, /* name */
/* K6 */ be_nested_str(Tele), /* K6 */ be_nested_str(Tele),
/* K7 */ be_const_int(0), /* K7 */ be_const_int(0),
/* K8 */ be_nested_str(try_rule), /* K8 */ be_nested_str(try_rule),
/* K9 */ be_nested_str(k), /* K9 */ be_nested_str(trig),
/* K10 */ be_nested_str(v), /* K10 */ be_nested_str(f),
/* K11 */ be_const_int(1), /* K11 */ be_const_int(1),
}), }),
&be_const_str_exec_tele, &be_const_str_exec_tele,
@ -559,7 +559,7 @@ be_local_closure(Tasmota_run_deferred, /* name */
/* K1 */ be_const_int(0), /* K1 */ be_const_int(0),
/* K2 */ be_nested_str(size), /* K2 */ be_nested_str(size),
/* K3 */ be_nested_str(time_reached), /* K3 */ be_nested_str(time_reached),
/* K4 */ be_nested_str(due), /* K4 */ be_nested_str(trig),
/* K5 */ be_nested_str(f), /* K5 */ be_nested_str(f),
/* K6 */ be_nested_str(remove), /* K6 */ be_nested_str(remove),
/* K7 */ be_const_int(1), /* K7 */ be_const_int(1),
@ -1123,45 +1123,51 @@ be_local_closure(Tasmota_time_str, /* name */
********************************************************************/ ********************************************************************/
be_local_closure(Tasmota_remove_rule, /* name */ be_local_closure(Tasmota_remove_rule, /* name */
be_nested_proto( be_nested_proto(
6, /* nstack */ 7, /* nstack */
2, /* argc */ 3, /* argc */
2, /* varg */ 2, /* varg */
0, /* has upvals */ 0, /* has upvals */
NULL, /* no upvals */ NULL, /* no upvals */
0, /* has sup protos */ 0, /* has sup protos */
NULL, /* no sub protos */ NULL, /* no sub protos */
1, /* has constants */ 1, /* has constants */
( &(const bvalue[ 5]) { /* constants */ ( &(const bvalue[ 6]) { /* constants */
/* K0 */ be_nested_str(_rules), /* K0 */ be_nested_str(_rules),
/* K1 */ be_const_int(0), /* K1 */ be_const_int(0),
/* K2 */ be_nested_str(k), /* K2 */ be_nested_str(trig),
/* K3 */ be_nested_str(remove), /* K3 */ be_nested_str(id),
/* K4 */ be_const_int(1), /* K4 */ be_nested_str(remove),
/* K5 */ be_const_int(1),
}), }),
&be_const_str_remove_rule, &be_const_str_remove_rule,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[21]) { /* code */ ( &(const binstruction[26]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0 0x880C0100, // 0000 GETMBR R3 R0 K0
0x780A0011, // 0001 JMPF R2 #0014 0x780E0016, // 0001 JMPF R3 #0019
0x58080001, // 0002 LDCONST R2 K1 0x580C0001, // 0002 LDCONST R3 K1
0x600C000C, // 0003 GETGBL R3 G12 0x6010000C, // 0003 GETGBL R4 G12
0x88100100, // 0004 GETMBR R4 R0 K0 0x88140100, // 0004 GETMBR R5 R0 K0
0x7C0C0200, // 0005 CALL R3 1 0x7C100200, // 0005 CALL R4 1
0x140C0403, // 0006 LT R3 R2 R3 0x14100604, // 0006 LT R4 R3 R4
0x780E000B, // 0007 JMPF R3 #0014 0x78120010, // 0007 JMPF R4 #0019
0x880C0100, // 0008 GETMBR R3 R0 K0 0x88100100, // 0008 GETMBR R4 R0 K0
0x940C0602, // 0009 GETIDX R3 R3 R2 0x94100803, // 0009 GETIDX R4 R4 R3
0x880C0702, // 000A GETMBR R3 R3 K2 0x88100902, // 000A GETMBR R4 R4 K2
0x1C0C0601, // 000B EQ R3 R3 R1 0x1C100801, // 000B EQ R4 R4 R1
0x780E0004, // 000C JMPF R3 #0012 0x78120009, // 000C JMPF R4 #0017
0x880C0100, // 000D GETMBR R3 R0 K0 0x88100100, // 000D GETMBR R4 R0 K0
0x8C0C0703, // 000E GETMET R3 R3 K3 0x94100803, // 000E GETIDX R4 R4 R3
0x5C140400, // 000F MOVE R5 R2 0x88100903, // 000F GETMBR R4 R4 K3
0x7C0C0400, // 0010 CALL R3 2 0x1C100802, // 0010 EQ R4 R4 R2
0x70020000, // 0011 JMP #0013 0x78120004, // 0011 JMPF R4 #0017
0x00080504, // 0012 ADD R2 R2 K4 0x88100100, // 0012 GETMBR R4 R0 K0
0x7001FFEE, // 0013 JMP #0003 0x8C100904, // 0013 GETMET R4 R4 K4
0x80000000, // 0014 RET 0 0x5C180600, // 0014 MOVE R6 R3
0x7C100400, // 0015 CALL R4 2
0x70020000, // 0016 JMP #0018
0x000C0705, // 0017 ADD R3 R3 K5
0x7001FFE9, // 0018 JMP #0003
0x80000000, // 0019 RET 0
}) })
) )
); );
@ -1550,8 +1556,8 @@ be_local_closure(Tasmota_add_cmd, /* name */
********************************************************************/ ********************************************************************/
be_local_closure(Tasmota_add_rule, /* name */ be_local_closure(Tasmota_add_rule, /* name */
be_nested_proto( be_nested_proto(
9, /* nstack */ 10, /* nstack */
3, /* argc */ 4, /* argc */
2, /* varg */ 2, /* varg */
0, /* has upvals */ 0, /* has upvals */
NULL, /* no upvals */ NULL, /* no upvals */
@ -1563,36 +1569,37 @@ be_local_closure(Tasmota_add_rule, /* name */
/* K1 */ be_nested_str(_rules), /* K1 */ be_nested_str(_rules),
/* K2 */ be_nested_str(function), /* K2 */ be_nested_str(function),
/* K3 */ be_nested_str(push), /* K3 */ be_nested_str(push),
/* K4 */ be_nested_str(kv), /* K4 */ be_nested_str(Trigger),
/* K5 */ be_nested_str(value_error), /* K5 */ be_nested_str(value_error),
/* K6 */ be_nested_str(the_X20second_X20argument_X20is_X20not_X20a_X20function), /* K6 */ be_nested_str(the_X20second_X20argument_X20is_X20not_X20a_X20function),
}), }),
&be_const_str_add_rule, &be_const_str_add_rule,
&be_const_str_solidified, &be_const_str_solidified,
( &(const binstruction[23]) { /* code */ ( &(const binstruction[24]) { /* code */
0x8C0C0100, // 0000 GETMET R3 R0 K0 0x8C100100, // 0000 GETMET R4 R0 K0
0x5C140400, // 0001 MOVE R5 R2 0x5C180400, // 0001 MOVE R6 R2
0x7C0C0400, // 0002 CALL R3 2 0x7C100400, // 0002 CALL R4 2
0x880C0101, // 0003 GETMBR R3 R0 K1 0x88100101, // 0003 GETMBR R4 R0 K1
0x740E0002, // 0004 JMPT R3 #0008 0x74120002, // 0004 JMPT R4 #0008
0x600C0012, // 0005 GETGBL R3 G18 0x60100012, // 0005 GETGBL R4 G18
0x7C0C0000, // 0006 CALL R3 0 0x7C100000, // 0006 CALL R4 0
0x90020203, // 0007 SETMBR R0 K1 R3 0x90020204, // 0007 SETMBR R0 K1 R4
0x600C0004, // 0008 GETGBL R3 G4 0x60100004, // 0008 GETGBL R4 G4
0x5C100400, // 0009 MOVE R4 R2 0x5C140400, // 0009 MOVE R5 R2
0x7C0C0200, // 000A CALL R3 1 0x7C100200, // 000A CALL R4 1
0x1C0C0702, // 000B EQ R3 R3 K2 0x1C100902, // 000B EQ R4 R4 K2
0x780E0007, // 000C JMPF R3 #0015 0x78120008, // 000C JMPF R4 #0016
0x880C0101, // 000D GETMBR R3 R0 K1 0x88100101, // 000D GETMBR R4 R0 K1
0x8C0C0703, // 000E GETMET R3 R3 K3 0x8C100903, // 000E GETMET R4 R4 K3
0x8C140104, // 000F GETMET R5 R0 K4 0xB81A0800, // 000F GETNGBL R6 K4
0x5C1C0200, // 0010 MOVE R7 R1 0x5C1C0200, // 0010 MOVE R7 R1
0x5C200400, // 0011 MOVE R8 R2 0x5C200400, // 0011 MOVE R8 R2
0x7C140600, // 0012 CALL R5 3 0x5C240600, // 0012 MOVE R9 R3
0x7C0C0400, // 0013 CALL R3 2 0x7C180600, // 0013 CALL R6 3
0x70020000, // 0014 JMP #0016 0x7C100400, // 0014 CALL R4 2
0xB0060B06, // 0015 RAISE 1 K5 K6 0x70020000, // 0015 JMP #0017
0x80000000, // 0016 RET 0 0xB0060B06, // 0016 RAISE 1 K5 K6
0x80000000, // 0017 RET 0
}) })
) )
); );
@ -1622,8 +1629,8 @@ be_local_closure(Tasmota_exec_rules, /* name */
/* K6 */ be_const_int(3), /* K6 */ be_const_int(3),
/* K7 */ be_const_int(0), /* K7 */ be_const_int(0),
/* K8 */ be_nested_str(try_rule), /* K8 */ be_nested_str(try_rule),
/* K9 */ be_nested_str(k), /* K9 */ be_nested_str(trig),
/* K10 */ be_nested_str(v), /* K10 */ be_nested_str(f),
/* K11 */ be_const_int(1), /* K11 */ be_const_int(1),
}), }),
&be_const_str_exec_rules, &be_const_str_exec_rules,
@ -1907,7 +1914,7 @@ be_local_closure(Tasmota_set_timer, /* name */
/* K0 */ be_nested_str(check_not_method), /* K0 */ be_nested_str(check_not_method),
/* K1 */ be_nested_str(_timers), /* K1 */ be_nested_str(_timers),
/* K2 */ be_nested_str(push), /* K2 */ be_nested_str(push),
/* K3 */ be_nested_str(Timer), /* K3 */ be_nested_str(Trigger),
/* K4 */ be_nested_str(millis), /* K4 */ be_nested_str(millis),
}), }),
&be_const_str_set_timer, &be_const_str_set_timer,

View File

@ -1,18 +1,18 @@
/******************************************************************** /********************************************************************
* Tasmota lib * Tasmota lib
* *
* class Timer * class Trigger
*******************************************************************/ *******************************************************************/
#include "be_constobj.h" #include "be_constobj.h"
/******************************************************************** /********************************************************************
** Solidified function: tostring ** Solidified function: tostring
********************************************************************/ ********************************************************************/
be_local_closure(Timer_tostring, /* name */ be_local_closure(Trigger_tostring, /* name */
be_nested_proto( be_nested_proto(
10, /* nstack */ 10, /* nstack */
1, /* argc */ 1, /* argc */
0, /* varg */ 2, /* varg */
0, /* has upvals */ 0, /* has upvals */
NULL, /* no upvals */ NULL, /* no upvals */
0, /* has sup protos */ 0, /* has sup protos */
@ -22,7 +22,7 @@ be_local_closure(Timer_tostring, /* name */
/* K0 */ be_nested_str(string), /* K0 */ be_nested_str(string),
/* K1 */ be_nested_str(format), /* K1 */ be_nested_str(format),
/* K2 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29), /* K2 */ be_nested_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29),
/* K3 */ be_nested_str(due), /* K3 */ be_nested_str(trig),
/* K4 */ be_nested_str(f), /* K4 */ be_nested_str(f),
/* K5 */ be_nested_str(id), /* K5 */ be_nested_str(id),
}), }),
@ -57,18 +57,18 @@ be_local_closure(Timer_tostring, /* name */
/******************************************************************** /********************************************************************
** Solidified function: init ** Solidified function: init
********************************************************************/ ********************************************************************/
be_local_closure(Timer_init, /* name */ be_local_closure(Trigger_init, /* name */
be_nested_proto( be_nested_proto(
4, /* nstack */ 4, /* nstack */
4, /* argc */ 4, /* argc */
0, /* varg */ 2, /* varg */
0, /* has upvals */ 0, /* has upvals */
NULL, /* no upvals */ NULL, /* no upvals */
0, /* has sup protos */ 0, /* has sup protos */
NULL, /* no sub protos */ NULL, /* no sub protos */
1, /* has constants */ 1, /* has constants */
( &(const bvalue[ 3]) { /* constants */ ( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str(due), /* K0 */ be_nested_str(trig),
/* K1 */ be_nested_str(f), /* K1 */ be_nested_str(f),
/* K2 */ be_nested_str(id), /* K2 */ be_nested_str(id),
}), }),
@ -86,25 +86,25 @@ be_local_closure(Timer_init, /* name */
/******************************************************************** /********************************************************************
** Solidified class: Timer ** Solidified class: Trigger
********************************************************************/ ********************************************************************/
be_local_class(Timer, be_local_class(Trigger,
3, 3,
NULL, NULL,
be_nested_map(5, be_nested_map(5,
( (struct bmapnode*) &(const bmapnode[]) { ( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(tostring, 4), be_const_closure(Timer_tostring_closure) }, { be_const_key(tostring, 3), be_const_closure(Trigger_tostring_closure) },
{ be_const_key(id, 2), be_const_var(2) }, { be_const_key(id, 2), be_const_var(2) },
{ be_const_key(f, -1), be_const_var(1) }, { be_const_key(f, -1), be_const_var(1) },
{ be_const_key(due, -1), be_const_var(0) }, { be_const_key(init, -1), be_const_closure(Trigger_init_closure) },
{ be_const_key(init, -1), be_const_closure(Timer_init_closure) }, { be_const_key(trig, -1), be_const_var(0) },
})), })),
be_str_literal("Timer") be_str_literal("Trigger")
); );
/*******************************************************************/ /*******************************************************************/
void be_load_Timer_class(bvm *vm) { void be_load_Trigger_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Timer); be_pushntvclass(vm, &be_class_Trigger);
be_setglobal(vm, "Timer"); be_setglobal(vm, "Trigger");
be_pop(vm, 1); be_pop(vm, 1);
} }

View File

@ -1,17 +1,17 @@
#- Native code used for testing and code solidification -# #- Native code used for testing and code solidification -#
#- Do not use it -# #- Do not use it -#
class Timer class Trigger
var due, f, id var trig, f, id
def init(due, f, id) def init(trig, f, id)
self.due = due self.trig = trig
self.f = f self.f = f
self.id = id self.id = id
end end
def tostring() def tostring()
import string import string
return string.format("<instance: %s(%s, %s, %s)", str(classof(self)), return string.format("<instance: %s(%s, %s, %s)", str(classof(self)),
str(self.due), str(self.f), str(self.id)) str(self.trig), str(self.f), str(self.id))
end end
end end
@ -58,20 +58,6 @@ class Tasmota
end end
end end
# create a specific sub-class for rules: pattern(string) -> closure
# Classs KV has two members k and v
def kv(k, v)
class KV
var k, v
def init(k,v)
self.k = k
self.v = v
end
end
return KV(k, v)
end
# add `chars_in_string(s:string,c:string) -> int`` # add `chars_in_string(s:string,c:string) -> int``
# looks for any char in c, and return the position of the first char # looks for any char in c, and return the position of the first char
# or -1 if not found # or -1 if not found
@ -130,23 +116,23 @@ class Tasmota
end end
# Rules # Rules
def add_rule(pat,f) def add_rule(pat, f, id)
self.check_not_method(f) self.check_not_method(f)
if !self._rules if !self._rules
self._rules=[] self._rules=[]
end end
if type(f) == 'function' if type(f) == 'function'
self._rules.push(self.kv(pat, f)) self._rules.push(Trigger(pat, f, id))
else else
raise 'value_error', 'the second argument is not a function' raise 'value_error', 'the second argument is not a function'
end end
end end
def remove_rule(pat) def remove_rule(pat, id)
if self._rules if self._rules
var i = 0 var i = 0
while i < size(self._rules) while i < size(self._rules)
if self._rules[i].k == pat if self._rules[i].trig == pat && self._rules[i].id == id
self._rules.remove(i) #- don't increment i since we removed the object -# self._rules.remove(i) #- don't increment i since we removed the object -#
else else
i += 1 i += 1
@ -214,8 +200,8 @@ class Tasmota
if self._rules if self._rules
var i = 0 var i = 0
while i < size(self._rules) while i < size(self._rules)
var kv = self._rules[i] var tr = self._rules[i]
ret = self.try_rule(ev,kv.k,kv.v) || ret #- call should be first to avoid evaluation shortcut if ret is already true -# ret = self.try_rule(ev,tr.trig,tr.f) || ret #- call should be first to avoid evaluation shortcut if ret is already true -#
i += 1 i += 1
end end
end end
@ -239,8 +225,8 @@ class Tasmota
var i = 0 var i = 0
while i < size(self._rules) while i < size(self._rules)
var kv = self._rules[i] var tr = self._rules[i]
ret = self.try_rule(ev,kv.k,kv.v) || ret #- call should be first to avoid evaluation shortcut -# ret = self.try_rule(ev,tr.trig,tr.f) || ret #- call should be first to avoid evaluation shortcut -#
i += 1 i += 1
end end
return ret return ret
@ -251,7 +237,7 @@ class Tasmota
def set_timer(delay,f,id) def set_timer(delay,f,id)
self.check_not_method(f) self.check_not_method(f)
if !self._timers self._timers=[] end if !self._timers self._timers=[] end
self._timers.push(Timer(self.millis(delay),f,id)) self._timers.push(Trigger(self.millis(delay),f,id))
end end
# run every 50ms tick # run every 50ms tick
@ -259,7 +245,7 @@ class Tasmota
if self._timers if self._timers
var i=0 var i=0
while i<self._timers.size() while i<self._timers.size()
if self.time_reached(self._timers[i].due) if self.time_reached(self._timers[i].trig)
var f=self._timers[i].f var f=self._timers[i].f
self._timers.remove(i) self._timers.remove(i)
f() f()