mirror of https://github.com/arendst/Tasmota.git
Berry make Leds animate calls reentrant (#22643)
This commit is contained in:
parent
5294b99ba7
commit
67ae7c2fe1
|
@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
|
||||||
### Breaking Changed
|
### Breaking Changed
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
- Berry make Leds animate calls reentrant
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
- ESP32 rules operation priority regression from v13.3.0.4 (#22636)
|
- ESP32 rules operation priority regression from v13.3.0.4 (#22636)
|
||||||
|
|
|
@ -110,6 +110,14 @@ class Animate_core
|
||||||
self.strip.clear()
|
self.strip.clear()
|
||||||
end
|
end
|
||||||
def start()
|
def start()
|
||||||
|
# check if the strip had a different animate object, stop it
|
||||||
|
var prev_animate = self.strip.get_animate()
|
||||||
|
import introspect
|
||||||
|
if (prev_animate != nil) && (type(prev_animate) == 'instance') && (prev_animate != self)
|
||||||
|
prev_animate.stop()
|
||||||
|
end
|
||||||
|
self.strip.set_animate(self)
|
||||||
|
|
||||||
self.running = true
|
self.running = true
|
||||||
var animators = self.animators
|
var animators = self.animators
|
||||||
var idx = 0
|
var idx = 0
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
* Generated code, don't edit *
|
* Generated code, don't edit *
|
||||||
\********************************************************************/
|
\********************************************************************/
|
||||||
#include "be_constobj.h"
|
#include "be_constobj.h"
|
||||||
// compact class 'Animate_core' ktab size: 48, total: 98 (saved 400 bytes)
|
// compact class 'Animate_core' ktab size: 52, total: 104 (saved 416 bytes)
|
||||||
static const bvalue be_ktab_class_Animate_core[48] = {
|
static const bvalue be_ktab_class_Animate_core[52] = {
|
||||||
/* K0 */ be_nested_str_weak(stop),
|
/* K0 */ be_nested_str_weak(stop),
|
||||||
/* K1 */ be_nested_str_weak(strip),
|
/* K1 */ be_nested_str_weak(strip),
|
||||||
/* K2 */ be_nested_str_weak(clear),
|
/* K2 */ be_nested_str_weak(clear),
|
||||||
|
@ -51,8 +51,12 @@ static const bvalue be_ktab_class_Animate_core[48] = {
|
||||||
/* K43 */ be_nested_str_weak(set_cb),
|
/* K43 */ be_nested_str_weak(set_cb),
|
||||||
/* K44 */ be_nested_str_weak(set_back_color),
|
/* K44 */ be_nested_str_weak(set_back_color),
|
||||||
/* K45 */ be_nested_str_weak(add_animator),
|
/* K45 */ be_nested_str_weak(add_animator),
|
||||||
/* K46 */ be_nested_str_weak(start),
|
/* K46 */ be_nested_str_weak(get_animate),
|
||||||
/* K47 */ be_nested_str_weak(add_fast_loop),
|
/* K47 */ be_nested_str_weak(introspect),
|
||||||
|
/* K48 */ be_nested_str_weak(instance),
|
||||||
|
/* K49 */ be_nested_str_weak(set_animate),
|
||||||
|
/* K50 */ be_nested_str_weak(start),
|
||||||
|
/* K51 */ be_nested_str_weak(add_fast_loop),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -716,7 +720,7 @@ be_local_closure(class_Animate_core_remove, /* name */
|
||||||
********************************************************************/
|
********************************************************************/
|
||||||
be_local_closure(class_Animate_core_start, /* name */
|
be_local_closure(class_Animate_core_start, /* name */
|
||||||
be_nested_proto(
|
be_nested_proto(
|
||||||
6, /* nstack */
|
8, /* nstack */
|
||||||
1, /* argc */
|
1, /* argc */
|
||||||
10, /* varg */
|
10, /* varg */
|
||||||
0, /* has upvals */
|
0, /* has upvals */
|
||||||
|
@ -727,27 +731,47 @@ be_local_closure(class_Animate_core_start, /* name */
|
||||||
&be_ktab_class_Animate_core, /* shared constants */
|
&be_ktab_class_Animate_core, /* shared constants */
|
||||||
be_str_weak(start),
|
be_str_weak(start),
|
||||||
&be_const_str_solidified,
|
&be_const_str_solidified,
|
||||||
( &(const binstruction[20]) { /* code */
|
( &(const binstruction[40]) { /* code */
|
||||||
0x50040200, // 0000 LDBOOL R1 1 0
|
0x88040101, // 0000 GETMBR R1 R0 K1
|
||||||
0x90021601, // 0001 SETMBR R0 K11 R1
|
0x8C04032E, // 0001 GETMET R1 R1 K46
|
||||||
0x8804010C, // 0002 GETMBR R1 R0 K12
|
0x7C040200, // 0002 CALL R1 1
|
||||||
0x58080007, // 0003 LDCONST R2 K7
|
0xA40A5E00, // 0003 IMPORT R2 K47
|
||||||
0x600C000C, // 0004 GETGBL R3 G12
|
0x4C0C0000, // 0004 LDNIL R3
|
||||||
0x5C100200, // 0005 MOVE R4 R1
|
0x200C0203, // 0005 NE R3 R1 R3
|
||||||
0x7C0C0200, // 0006 CALL R3 1
|
0x780E0008, // 0006 JMPF R3 #0010
|
||||||
0x140C0403, // 0007 LT R3 R2 R3
|
0x600C0004, // 0007 GETGBL R3 G4
|
||||||
0x780E0004, // 0008 JMPF R3 #000E
|
0x5C100200, // 0008 MOVE R4 R1
|
||||||
0x940C0202, // 0009 GETIDX R3 R1 R2
|
0x7C0C0200, // 0009 CALL R3 1
|
||||||
0x8C0C072E, // 000A GETMET R3 R3 K46
|
0x1C0C0730, // 000A EQ R3 R3 K48
|
||||||
0x7C0C0200, // 000B CALL R3 1
|
0x780E0003, // 000B JMPF R3 #0010
|
||||||
0x0008050D, // 000C ADD R2 R2 K13
|
0x200C0200, // 000C NE R3 R1 R0
|
||||||
0x7001FFF5, // 000D JMP #0004
|
0x780E0001, // 000D JMPF R3 #0010
|
||||||
0x90022707, // 000E SETMBR R0 K19 K7
|
0x8C0C0300, // 000E GETMET R3 R1 K0
|
||||||
0xB80E0800, // 000F GETNGBL R3 K4
|
0x7C0C0200, // 000F CALL R3 1
|
||||||
0x8C0C072F, // 0010 GETMET R3 R3 K47
|
0x880C0101, // 0010 GETMBR R3 R0 K1
|
||||||
0x8814010F, // 0011 GETMBR R5 R0 K15
|
0x8C0C0731, // 0011 GETMET R3 R3 K49
|
||||||
0x7C0C0400, // 0012 CALL R3 2
|
0x5C140000, // 0012 MOVE R5 R0
|
||||||
0x80000000, // 0013 RET 0
|
0x7C0C0400, // 0013 CALL R3 2
|
||||||
|
0x500C0200, // 0014 LDBOOL R3 1 0
|
||||||
|
0x90021603, // 0015 SETMBR R0 K11 R3
|
||||||
|
0x880C010C, // 0016 GETMBR R3 R0 K12
|
||||||
|
0x58100007, // 0017 LDCONST R4 K7
|
||||||
|
0x6014000C, // 0018 GETGBL R5 G12
|
||||||
|
0x5C180600, // 0019 MOVE R6 R3
|
||||||
|
0x7C140200, // 001A CALL R5 1
|
||||||
|
0x14140805, // 001B LT R5 R4 R5
|
||||||
|
0x78160004, // 001C JMPF R5 #0022
|
||||||
|
0x94140604, // 001D GETIDX R5 R3 R4
|
||||||
|
0x8C140B32, // 001E GETMET R5 R5 K50
|
||||||
|
0x7C140200, // 001F CALL R5 1
|
||||||
|
0x0010090D, // 0020 ADD R4 R4 K13
|
||||||
|
0x7001FFF5, // 0021 JMP #0018
|
||||||
|
0x90022707, // 0022 SETMBR R0 K19 K7
|
||||||
|
0xB8160800, // 0023 GETNGBL R5 K4
|
||||||
|
0x8C140B33, // 0024 GETMET R5 R5 K51
|
||||||
|
0x881C010F, // 0025 GETMBR R7 R0 K15
|
||||||
|
0x7C140400, // 0026 CALL R5 2
|
||||||
|
0x80000000, // 0027 RET 0
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -16,7 +16,6 @@ extern int be_leds_apply_bri_gamma(bvm *vm);
|
||||||
/* @const_object_info_begin
|
/* @const_object_info_begin
|
||||||
class be_class_Leds_ntv (scope: global, name: Leds_ntv, strings: weak) {
|
class be_class_Leds_ntv (scope: global, name: Leds_ntv, strings: weak) {
|
||||||
_p, var
|
_p, var
|
||||||
_t, var
|
|
||||||
|
|
||||||
WS2812_GRB, int(ws2812_grb)
|
WS2812_GRB, int(ws2812_grb)
|
||||||
SK6812_GRBW, int(sk6812_grbw)
|
SK6812_GRBW, int(sk6812_grbw)
|
||||||
|
|
|
@ -28,6 +28,7 @@ class Leds : Leds_ntv
|
||||||
var gamma # if true, apply gamma (true is default)
|
var gamma # if true, apply gamma (true is default)
|
||||||
var leds # number of leds
|
var leds # number of leds
|
||||||
var bri # implicit brightness for this led strip (0..255, default is 50% = 127)
|
var bri # implicit brightness for this led strip (0..255, default is 50% = 127)
|
||||||
|
var animate # attached animate object or nil - this allows to stop any existing animation for this strip if we add a new animate
|
||||||
# leds:int = number of leds of the strip
|
# leds:int = number of leds of the strip
|
||||||
# gpio:int (optional) = GPIO for NeoPixel. If not specified, takes the WS2812 gpio
|
# gpio:int (optional) = GPIO for NeoPixel. If not specified, takes the WS2812 gpio
|
||||||
# typ:int (optional) = Type of LED, defaults to WS2812 RGB
|
# typ:int (optional) = Type of LED, defaults to WS2812 RGB
|
||||||
|
@ -35,25 +36,43 @@ class Leds : Leds_ntv
|
||||||
def init(leds, gpio_phy, typ, hardware)
|
def init(leds, gpio_phy, typ, hardware)
|
||||||
import gpio
|
import gpio
|
||||||
self.gamma = true # gamma is enabled by default, it should be disabled explicitly if needed
|
self.gamma = true # gamma is enabled by default, it should be disabled explicitly if needed
|
||||||
if (gpio_phy == nil) || (gpio_phy == gpio.pin(gpio.WS2812, 0))
|
if (leds == nil ) || (gpio_phy == nil) || (gpio_phy == gpio.pin(gpio.WS2812, 0))
|
||||||
# use native driver
|
# use native driver
|
||||||
self.ctor() # no parameters
|
self.ctor() # no parameters
|
||||||
|
# in such case, `self._p` is equal to `0`
|
||||||
self.leds = self.pixel_count()
|
self.leds = self.pixel_count()
|
||||||
import light
|
import light
|
||||||
self.bri = light.get()['bri']
|
self.bri = light.get()['bri']
|
||||||
else
|
else
|
||||||
# use pure Berry driver
|
# use pure Berry driver
|
||||||
self.leds = int(leds)
|
leds = int(leds)
|
||||||
|
self.leds = leds
|
||||||
self.bri = 127 # 50% brightness by default
|
self.bri = 127 # 50% brightness by default
|
||||||
|
|
||||||
# initialize the structure
|
# initialize the structure
|
||||||
self.ctor(self.leds, gpio_phy, typ, hardware)
|
# check if already in global `_lhw`
|
||||||
|
if !global.contains('_lhw')
|
||||||
|
global._lhw = {}
|
||||||
|
end
|
||||||
|
if global._lhw.find(leds) != nil
|
||||||
|
# an object already exists, attach it
|
||||||
|
var prov_led = global._lhw.find(leds) # already provisioned leds instance
|
||||||
|
if self.leds != prov_led.leds
|
||||||
|
raise "value_error", f"number of leds do not match with previous instanciation {self.leds} vs {prov_led.leds}"
|
||||||
|
end
|
||||||
|
self._p = prov_led._p
|
||||||
|
self.animate = prov_led.animate
|
||||||
|
global._lhw[leds] = self # put the most recent as current
|
||||||
|
else
|
||||||
|
self.ctor(leds, gpio_phy, typ, hardware)
|
||||||
|
global._lhw[leds] = self
|
||||||
|
# call begin
|
||||||
|
self.begin()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if self._p == nil raise "internal_error", "couldn't not initialize noepixelbus" end
|
if self._p == nil raise "internal_error", "couldn't not initialize noepixelbus" end
|
||||||
|
|
||||||
# call begin
|
|
||||||
self.begin()
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def clear()
|
def clear()
|
||||||
|
@ -71,6 +90,13 @@ class Leds : Leds_ntv
|
||||||
return self.bri
|
return self.bri
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_animate(animate)
|
||||||
|
self.animate = animate
|
||||||
|
end
|
||||||
|
def get_animate()
|
||||||
|
return self.animate
|
||||||
|
end
|
||||||
|
|
||||||
def ctor(leds, gpio_phy, typ, hardware)
|
def ctor(leds, gpio_phy, typ, hardware)
|
||||||
if gpio_phy == nil
|
if gpio_phy == nil
|
||||||
self.call_native(0) # native driver
|
self.call_native(0) # native driver
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -78,15 +78,6 @@ extern "C" {
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
return strip;
|
return strip;
|
||||||
}
|
}
|
||||||
int32_t be_get_leds_type(bvm *vm) {
|
|
||||||
be_getmember(vm, 1, "_t");
|
|
||||||
int32_t type = be_toint(vm, -1);
|
|
||||||
be_pop(vm, 1);
|
|
||||||
if (type < 0) {
|
|
||||||
be_raise(vm, "internal_error", "invalid leds type");
|
|
||||||
}
|
|
||||||
return type;
|
|
||||||
}
|
|
||||||
|
|
||||||
int be_tasmotaled_call_native(bvm *vm);
|
int be_tasmotaled_call_native(bvm *vm);
|
||||||
int be_tasmotaled_call_native(bvm *vm) {
|
int be_tasmotaled_call_native(bvm *vm) {
|
||||||
|
@ -126,19 +117,12 @@ extern "C" {
|
||||||
strip->SetPusher(pusher);
|
strip->SetPusher(pusher);
|
||||||
}
|
}
|
||||||
|
|
||||||
// AddLog(LOG_LEVEL_DEBUG, "LED: leds %i gpio %i type %i", leds, gpio, led_type);
|
|
||||||
// store type in attribute `_t`
|
|
||||||
be_pushint(vm, led_type);
|
|
||||||
be_setmember(vm, 1, "_t");
|
|
||||||
be_pop(vm, 1);
|
|
||||||
|
|
||||||
be_pushcomptr(vm, (void*) strip); // if native driver, it is NULL
|
be_pushcomptr(vm, (void*) strip); // if native driver, it is NULL
|
||||||
be_setmember(vm, 1, "_p");
|
be_setmember(vm, 1, "_p");
|
||||||
be_pop(vm, 1);
|
be_pop(vm, 1);
|
||||||
be_pushnil(vm);
|
be_pushnil(vm);
|
||||||
} else {
|
} else {
|
||||||
// all other commands need a valid tasmotaled pointer
|
// all other commands need a valid tasmotaled pointer
|
||||||
int32_t leds_type = be_get_leds_type(vm);
|
|
||||||
TasmotaLED * strip = (TasmotaLED*) be_get_tasmotaled(vm); // raises an exception if pointer is invalid
|
TasmotaLED * strip = (TasmotaLED*) be_get_tasmotaled(vm); // raises an exception if pointer is invalid
|
||||||
// detect native driver means strip == nullptr
|
// detect native driver means strip == nullptr
|
||||||
be_pushnil(vm); // push a default `nil` return value
|
be_pushnil(vm); // push a default `nil` return value
|
||||||
|
|
Loading…
Reference in New Issue