Moved Berry animate to its own `berry_animate` lib (#20309)

* Moved Berry animate to its own `berry_animate` lib

* Fix solidification

* fix compilation

* Fix compilation
This commit is contained in:
s-hadinger 2023-12-25 11:01:19 +01:00 committed by GitHub
parent bebffa040f
commit 2808653ad9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 3452 additions and 172 deletions

View File

@ -38,14 +38,18 @@ jobs:
run: |
cd lib/libesp32/berry_matter
../berry/berry -s -g solidify_all.be
- name: Berry Animate Code
run: |
cd lib/libesp32/berry_animate
../berry/berry -s -g solidify_all.be
- name: LVGL Berry Code
run: |
cd lib/libesp32_lvgl/lv_binding_berry
../../libesp32/berry/berry -s -g solidify_all.be
- uses: jason2866/upload-artifact@v2.0.2
with:
name: '["berry_tasmota", "berry_matter", "berry_lvgl", "berry_header"]'
path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]'
name: '["berry_tasmota", "berry_matter", "berry_animate", "berry_lvgl", "berry_header"]'
path: '["./lib/libesp32/berry_tasmota/src/solidify", "./lib/libesp32/berry_matter/src/solidify", "./lib/libesp32/berry_animate/src/solidify", "./lib/libesp32_lvgl/lv_binding_berry/src/solidify", "./lib/libesp32/berry/generate"]'
push_solidified:
needs: be_solidify
@ -63,11 +67,13 @@ jobs:
name: |
berry_tasmota
berry_matter
berrt_animate
berry_lvgl
berry_header
path: |
./lib/libesp32/berry_tasmota/src/solidify
./lib/libesp32/berry_matter/src/solidify
./lib/libesp32/berry_animate/src/solidify
./lib/libesp32_lvgl/lv_binding_berry/src/solidify
./lib/libesp32/berry/generate
- uses: stefanzweifel/git-auto-commit-action@v4

View File

@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file.
### Changed
- Support syslog updates every sleep or every second if `#define SYSLOG_UPDATE_SECOND` (#20260)
- Moved Berry animate to its own `berry_animate` lib
### Fixed
- Matter Contact sensor was not triggering any update (#20232)

View File

@ -5,4 +5,4 @@
# Included in the Platformio build process with `pio-tools/gen-berry-structures.py
#
rm -Rf ./generate/be_*.h
python3 tools/coc/coc -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../berry_matter/src/solidify ../berry_matter/src ../../libesp32_lvgl/lv_binding_berry/src/solidify ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h
python3 tools/coc/coc -o generate src default ../berry_tasmota/src ../berry_mapping/src ../berry_int64/src ../../libesp32_lvgl/lv_binding_berry/src ../berry_matter/src/solidify ../berry_matter/src ../berry_animate/src/solidify ../berry_animate/src ../../libesp32_lvgl/lv_binding_berry/src/solidify ../../libesp32_lvgl/lv_binding_berry/generate -c default/berry_conf.h

View File

@ -0,0 +1,17 @@
{
"name": "Berry animation library for WS2812 leds",
"version": "0.1",
"description": "Berry animation library for WS2812 leds",
"license": "MIT",
"homepage": "https://github.com/arendst/Tasmota",
"frameworks": "arduino",
"platforms": "espressif32",
"authors":
{
"name": "Stephan Hadinger",
"maintainer": true
},
"build": {
"flags": [ "-I$PROJECT_DIR/include", "-includetasmota_options.h" ]
}
}

View File

@ -0,0 +1,2 @@
# empty module
# allows stand-alone `import path`

View File

@ -0,0 +1,99 @@
#!/usr/bin/env -S ../berry/berry -s -g
#
# Berry solidify files
import os
import global
import solidify
import string as string2
import re
import sys
sys.path().push('src/embedded') # allow to import from src/embedded
# globals that need to exist to make compilation succeed
var globs = "path,ctypes_bytes_dyn,tasmota,ccronexpr,gpio,light,webclient,load,MD5,lv,light_state,udp,tcpclientasync,"
"lv_clock,lv_clock_icon,lv_signal_arcs,lv_signal_bars,lv_wifi_arcs_icon,lv_wifi_arcs,"
"lv_wifi_bars_icon,lv_wifi_bars,"
"_lvgl,"
"int64"
for g:string2.split(globs, ",")
global.(g) = nil
end
var prefix_dir = "src/embedded/"
var prefix_out = "src/solidify/"
def sort(l)
# insertion sort
for i:1..size(l)-1
var k = l[i]
var j = i
while (j > 0) && (l[j-1] > k)
l[j] = l[j-1]
j -= 1
end
l[j] = k
end
return l
end
def clean_directory(dir)
var file_list = os.listdir(dir)
for f : file_list
if f[0] == '.' continue end # ignore files starting with `.`
os.remove(dir + f)
end
end
var pattern = "#@\\s*solidify:([A-Za-z0-9_.,]+)"
def parse_file(fname, prefix_out)
print("Parsing: ", fname)
var f = open(prefix_dir + fname)
var src = f.read()
f.close()
# try to compile
var compiled = compile(src)
compiled() # run the compile code to instanciate the classes and modules
# output solidified
var fname_h = string2.split(fname, '.be')[0] + '.h' # take whatever is before the first '.be'
var fout = open(prefix_out + "solidified_" + fname_h, "w")
fout.write(f"/* Solidification of {fname_h} */\n")
fout.write("/********************************************************************\\\n")
fout.write("* Generated code, don't edit *\n")
fout.write("\\********************************************************************/\n")
fout.write('#include "be_constobj.h"\n')
var directives = re.searchall(pattern, src)
# print(directives)
for directive : directives
var object_list = string2.split(directive[1], ',')
var object_name = object_list[0]
var weak = (object_list.find('weak') != nil) # do we solidify with weak strings?
var o = global
var cl_name = nil
var obj_name = nil
for subname : string2.split(object_name, '.')
o = o.(subname)
cl_name = obj_name
obj_name = subname
end
solidify.dump(o, weak, fout, cl_name)
end
fout.write("/********************************************************************/\n")
fout.write("/* End of solidification */\n")
fout.close()
end
clean_directory(prefix_out)
var src_file_list = os.listdir(prefix_dir)
src_file_list = sort(src_file_list)
for src_file : src_file_list
if src_file[0] == '.' continue end
parse_file(src_file, prefix_out)
end

View File

@ -21,6 +21,7 @@
* `animate` global module
\*******************************************************************/
#ifdef USE_BERRY
#include "be_constobj.h"
#include "be_mapping.h"
@ -239,3 +240,5 @@ assert(o.animate(7000) == -1000)
*/
#endif // USE_BERRY

View File

@ -0,0 +1,179 @@
/*
xdrv_52_3_berry_leds.ino - Berry scripting language, native fucnctions
Copyright (C) 2021 Stephan Hadinger, Berry language by Guan Wenliang https://github.com/Skiars/berry
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef USE_BERRY
#include <berry.h>
#ifdef USE_WS2812
extern uint16_t changeUIntScale(uint16_t inum, uint16_t ifrom_min, uint16_t ifrom_max,uint16_t ito_min, uint16_t ito_max);
extern uint32_t ApplyBriGamma(uint32_t color_a /* 0xRRGGBB */, uint32_t bri /* 0..255 */, bool gamma);
extern "C" {
// Leds_frame.blend(color1:int, color2:int, alpha:int) -> int
//
int32_t be_leds_blend(bvm *vm);
int32_t be_leds_blend(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 3 && be_isint(vm, 1) && be_isint(vm, 2) && be_isint(vm, 3)) {
uint32_t color_a = be_toint(vm, 1);
uint32_t color_b = be_toint(vm, 2);
uint32_t alpha = be_toint(vm, 3);
uint32_t r = (color_a >> 16) & 0xFF;
uint32_t g = (color_a >> 8) & 0xFF;
uint32_t b = (color_a ) & 0xFF;
uint32_t a = (color_a >> 24) & 0xFF;
uint32_t r2 = (color_b >> 16) & 0xFF;
uint32_t g2 = (color_b >> 8) & 0xFF;
uint32_t b2 = (color_b ) & 0xFF;
uint32_t a2 = (color_b >> 24) & 0xFF;
uint32_t r3 = changeUIntScale(alpha, 0, 255, r2, r);
uint32_t g3 = changeUIntScale(alpha, 0, 255, g2, g);
uint32_t b3 = changeUIntScale(alpha, 0, 255, b2, b);
uint32_t a3 = changeUIntScale(alpha, 0, 255, a2, a);
uint32_t rgb = (a3 << 24) | (r3 << 16) | (g3 << 8) | b3;
be_pushint(vm, rgb);
be_return(vm);
}
be_raise(vm, "type_error", nullptr);
}
// Leds_frame.blend_pixels(dest:bytes(), foreground:bytes) -> nil
// Destination can be the same as foreground or background
//
// All calculation are done in `0xAARRGGBB` format, AA=0 if opaque (i.e. ignored)
// Background has always alpha = 0 (any other value is ignored) - for simplification
// Size is truncated to smallest of all 3 buffers
int32_t be_leds_blend_pixels(bvm *vm);
int32_t be_leds_blend_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isbytes(vm, 2)) {
size_t dest_len = 0;
uint32_t * dest_buf = (uint32_t*) be_tobytes(vm, 1, &dest_len);
// back = dest for now, could be changed in the future
size_t back_len = 0;
const uint32_t * back_buf = (const uint32_t*) be_tobytes(vm, 1, &back_len);
size_t fore_len = 0;
const uint32_t * fore_buf = (const uint32_t*) be_tobytes(vm, 2, &fore_len);
if (fore_len < dest_len) { dest_len = fore_len; }
if (back_len < dest_len) { dest_len = back_len; }
size_t pixels_count = dest_len / 4;
if (pixels_count > 0) {
uint32_t * dest = (uint32_t *)dest_buf;
uint32_t * back = (uint32_t *)back_buf;
uint32_t * fore = (uint32_t *)fore_buf;
for (size_t i = 0; i < pixels_count; i++) {
uint32_t back_argb = back[i];
uint32_t fore_argb = fore[i];
uint32_t fore_alpha = (fore_argb >> 24) & 0xFF;
uint32_t dest_rgb_new = back_argb;
if (fore_alpha == 0) { // opaque layer, copy value from fore
dest_rgb_new = fore_argb;
} else if (fore_alpha == 255) { // fore is transparent, use back
// nothing to do, dest_rgb_new = back_argb above
} else {
uint32_t back_r = (back_argb >> 16) & 0xFF;
uint32_t fore_r = (fore_argb >> 16) & 0xFF;
uint32_t back_g = (back_argb >> 8) & 0xFF;
uint32_t fore_g = (fore_argb >> 8) & 0xFF;
uint32_t back_b = (back_argb ) & 0xFF;
uint32_t fore_b = (fore_argb ) & 0xFF;
uint32_t dest_r_new = changeUIntScale(fore_alpha, 0, 255, fore_r, back_r);
uint32_t dest_g_new = changeUIntScale(fore_alpha, 0, 255, fore_g, back_g);
uint32_t dest_b_new = changeUIntScale(fore_alpha, 0, 255, fore_b, back_b);
dest_rgb_new = (dest_r_new << 16) | (dest_g_new << 8) | dest_b_new;
}
dest[i] = dest_rgb_new;
}
}
be_return_nil(vm);
}
be_raise(vm, "type_error", nullptr);
}
// Leds_frame.fill_pixels(dest:bytes(), color:int) -> nil
//
// Fill buffer with same color
int32_t be_leds_fill_pixels(bvm *vm);
int32_t be_leds_fill_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isint(vm, 2)) {
size_t dest_len = 0;
uint32_t * dest_buf = (uint32_t*) be_tobytes(vm, 1, &dest_len);
uint32_t color = be_toint(vm, 2);
size_t pixels_count = dest_len / 4;
if (pixels_count > 0) {
uint32_t * dest = (uint32_t *)dest_buf;
for (size_t i = 0; i < pixels_count; i++) {
dest[i] = color;
}
}
be_return_nil(vm);
}
be_raise(vm, "type_error", nullptr);
}
// Leds_frame.paste_pixels(neopixel:bytes(), led_buffer:bytes(), bri:int 0..100, gamma:bool)
//
// Copy from ARGB buffer to GRB
int32_t be_leds_paste_pixels(bvm *vm);
int32_t be_leds_paste_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isbytes(vm, 2)) {
size_t src_len = 0;
uint32_t * src_buf = (uint32_t*) be_tobytes(vm, 1, &src_len);
size_t dest_len = 0;
uint8_t * dest_buf = (uint8_t*) be_tobytes(vm, 2, &dest_len);
uint32_t bri255 = 255;
if (top >= 3 && be_isint(vm, 3)) {
bri255 = be_toint(vm, 3);
}
bool gamma = false;
if (top >= 4 && be_isbool(vm, 4)) {
gamma = be_tobool(vm, 4);
}
size_t pixels_count = src_len / 4;
if (pixels_count > dest_len / 3) { pixels_count = dest_len / 3; }
if (pixels_count > 0) {
for (size_t i = 0; i < pixels_count; i++) {
uint32_t src_argb = ApplyBriGamma(src_buf[i], bri255, gamma);
uint32_t src_r = (src_argb >> 16) & 0xFF;
uint32_t src_g = (src_argb >> 8) & 0xFF;
uint32_t src_b = (src_argb ) & 0xFF;
dest_buf[i * 3 + 0] = src_g;
dest_buf[i * 3 + 1] = src_r;
dest_buf[i * 3 + 2] = src_b;
}
}
be_return_nil(vm);
}
be_raise(vm, "type_error", nullptr);
}
}
#endif // USE_WS2812
#endif // USE_BERRY

View File

@ -3,6 +3,7 @@
*
*******************************************************************/
#ifdef USE_BERRY
#include "be_constobj.h"
#ifdef USE_WS2812
@ -37,3 +38,4 @@ class be_class_Leds_frame (scope: global, name: Leds_frame, super:be_class_bytes
#include "be_fixed_be_class_Leds_frame.h"
#endif // USE_WS2812
#endif // USE_BERRY

View File

@ -0,0 +1,8 @@
// force include of module by including this file
#ifndef __BERRY_ANIMATE__
#define __BERRY_ANIMATE__
#endif // __BERRY_ANIMATE__

View File

@ -0,0 +1,7 @@
/* Solidification of animate_0.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
/********************************************************************/
/* End of solidification */

View File

@ -0,0 +1,871 @@
/* Solidification of animate_1_core.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
extern const bclass be_class_Animate_core;
/********************************************************************
** Solidified function: clear
********************************************************************/
be_local_closure(Animate_core_clear, /* 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(stop),
/* K1 */ be_nested_str_weak(strip),
/* K2 */ be_nested_str_weak(clear),
}),
be_str_weak(clear),
&be_const_str_solidified,
( &(const binstruction[ 6]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x7C040200, // 0001 CALL R1 1
0x88040101, // 0002 GETMBR R1 R0 K1
0x8C040302, // 0003 GETMET R1 R1 K2
0x7C040200, // 0004 CALL R1 1
0x80000000, // 0005 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_strip_bri
********************************************************************/
be_local_closure(Animate_core_set_strip_bri, /* 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[ 6]) { /* constants */
/* K0 */ be_nested_str_weak(strip),
/* K1 */ be_nested_str_weak(set_bri),
/* K2 */ be_nested_str_weak(tasmota),
/* K3 */ be_nested_str_weak(scale_uint),
/* K4 */ be_nested_str_weak(bri),
/* K5 */ be_const_int(0),
}),
be_str_weak(set_strip_bri),
&be_const_str_solidified,
( &(const binstruction[12]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x8C040301, // 0001 GETMET R1 R1 K1
0xB80E0400, // 0002 GETNGBL R3 K2
0x8C0C0703, // 0003 GETMET R3 R3 K3
0x88140104, // 0004 GETMBR R5 R0 K4
0x58180005, // 0005 LDCONST R6 K5
0x541E0063, // 0006 LDINT R7 100
0x58200005, // 0007 LDCONST R8 K5
0x542600FE, // 0008 LDINT R9 255
0x7C0C0C00, // 0009 CALL R3 6
0x7C040400, // 000A CALL R1 2
0x80000000, // 000B RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: remove_painter
********************************************************************/
be_local_closure(Animate_core_remove_painter, /* 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(painters),
/* K1 */ be_nested_str_weak(remove),
/* K2 */ be_nested_str_weak(find),
/* K3 */ be_nested_str_weak(clear),
}),
be_str_weak(remove_painter),
&be_const_str_solidified,
( &(const binstruction[13]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
0x200C0203, // 0002 NE R3 R1 R3
0x780E0005, // 0003 JMPF R3 #000A
0x8C0C0501, // 0004 GETMET R3 R2 K1
0x8C140502, // 0005 GETMET R5 R2 K2
0x5C1C0200, // 0006 MOVE R7 R1
0x7C140400, // 0007 CALL R5 2
0x7C0C0400, // 0008 CALL R3 2
0x70020001, // 0009 JMP #000C
0x8C0C0503, // 000A GETMET R3 R2 K3
0x7C0C0200, // 000B CALL R3 1
0x80000000, // 000C RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: stop
********************************************************************/
be_local_closure(Animate_core_stop, /* 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_nested_str_weak(running),
/* K1 */ be_nested_str_weak(animators),
/* K2 */ be_const_int(0),
/* K3 */ be_nested_str_weak(stop),
/* K4 */ be_const_int(1),
/* K5 */ be_nested_str_weak(tasmota),
/* K6 */ be_nested_str_weak(remove_fast_loop),
/* K7 */ be_nested_str_weak(fast_loop_cb),
}),
be_str_weak(stop),
&be_const_str_solidified,
( &(const binstruction[19]) { /* code */
0x50040000, // 0000 LDBOOL R1 0 0
0x90020001, // 0001 SETMBR R0 K0 R1
0x88040101, // 0002 GETMBR R1 R0 K1
0x58080002, // 0003 LDCONST R2 K2
0x600C000C, // 0004 GETGBL R3 G12
0x5C100200, // 0005 MOVE R4 R1
0x7C0C0200, // 0006 CALL R3 1
0x140C0403, // 0007 LT R3 R2 R3
0x780E0004, // 0008 JMPF R3 #000E
0x940C0202, // 0009 GETIDX R3 R1 R2
0x8C0C0703, // 000A GETMET R3 R3 K3
0x7C0C0200, // 000B CALL R3 1
0x00080504, // 000C ADD R2 R2 K4
0x7001FFF5, // 000D JMP #0004
0xB80E0A00, // 000E GETNGBL R3 K5
0x8C0C0706, // 000F GETMET R3 R3 K6
0x88140107, // 0010 GETMBR R5 R0 K7
0x7C0C0400, // 0011 CALL R3 2
0x80000000, // 0012 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: get_bri
********************************************************************/
be_local_closure(Animate_core_get_bri, /* 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(bri),
}),
be_str_weak(get_bri),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x80040400, // 0001 RET 1 R2
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_bri
********************************************************************/
be_local_closure(Animate_core_set_bri, /* 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(bri),
/* K1 */ be_nested_str_weak(set_strip_bri),
}),
be_str_weak(set_bri),
&be_const_str_solidified,
( &(const binstruction[ 4]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x8C080101, // 0001 GETMET R2 R0 K1
0x7C080200, // 0002 CALL R2 1
0x80000000, // 0003 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: add_painter
********************************************************************/
be_local_closure(Animate_core_add_painter, /* name */
be_nested_proto(
5, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str_weak(painters),
/* K1 */ be_nested_str_weak(find),
/* K2 */ be_nested_str_weak(push),
}),
be_str_weak(add_painter),
&be_const_str_solidified,
( &(const binstruction[12]) { /* 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
0x780A0003, // 0006 JMPF R2 #000B
0x88080100, // 0007 GETMBR R2 R0 K0
0x8C080502, // 0008 GETMET R2 R2 K2
0x5C100200, // 0009 MOVE R4 R1
0x7C080400, // 000A CALL R2 2
0x80000000, // 000B RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: fast_loop
********************************************************************/
be_local_closure(Animate_core_fast_loop, /* name */
be_nested_proto(
13, /* nstack */
1, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[28]) { /* constants */
/* K0 */ be_nested_str_weak(running),
/* K1 */ be_nested_str_weak(tasmota),
/* K2 */ be_nested_str_weak(time_reached),
/* K3 */ be_nested_str_weak(fast_loop_next),
/* K4 */ be_nested_str_weak(strip),
/* K5 */ be_nested_str_weak(can_show),
/* K6 */ be_nested_str_weak(frame),
/* K7 */ be_nested_str_weak(fill_pixels),
/* K8 */ be_nested_str_weak(back_color),
/* K9 */ be_const_int(0),
/* K10 */ be_nested_str_weak(millis),
/* K11 */ be_nested_str_weak(FAST_LOOP_MIN),
/* K12 */ be_nested_str_weak(animators),
/* K13 */ be_nested_str_weak(animate),
/* K14 */ be_const_int(1),
/* K15 */ be_nested_str_weak(layer),
/* K16 */ be_nested_str_weak(painters),
/* K17 */ be_const_int(-16777216),
/* K18 */ be_nested_str_weak(paint),
/* K19 */ be_nested_str_weak(blend_pixels),
/* K20 */ be_nested_str_weak(obj),
/* K21 */ be_nested_str_weak(mth),
/* K22 */ be_nested_str_weak(paste_pixels),
/* K23 */ be_nested_str_weak(pixels_buffer),
/* K24 */ be_nested_str_weak(get_bri),
/* K25 */ be_nested_str_weak(get_gamma),
/* K26 */ be_nested_str_weak(dirty),
/* K27 */ be_nested_str_weak(show),
}),
be_str_weak(fast_loop),
&be_const_str_solidified,
( &(const binstruction[84]) { /* code */
0x88040100, // 0000 GETMBR R1 R0 K0
0x78060050, // 0001 JMPF R1 #0053
0xB8060200, // 0002 GETNGBL R1 K1
0x8C040302, // 0003 GETMET R1 R1 K2
0x880C0103, // 0004 GETMBR R3 R0 K3
0x7C040400, // 0005 CALL R1 2
0x7806004B, // 0006 JMPF R1 #0053
0x88040104, // 0007 GETMBR R1 R0 K4
0x8C040305, // 0008 GETMET R1 R1 K5
0x7C040200, // 0009 CALL R1 1
0x78060047, // 000A JMPF R1 #0053
0x88040106, // 000B GETMBR R1 R0 K6
0x8C040307, // 000C GETMET R1 R1 K7
0x880C0108, // 000D GETMBR R3 R0 K8
0x7C040400, // 000E CALL R1 2
0x58040009, // 000F LDCONST R1 K9
0xB80A0200, // 0010 GETNGBL R2 K1
0x8C08050A, // 0011 GETMET R2 R2 K10
0x7C080200, // 0012 CALL R2 1
0x880C010B, // 0013 GETMBR R3 R0 K11
0x000C0403, // 0014 ADD R3 R2 R3
0x90020603, // 0015 SETMBR R0 K3 R3
0x600C000C, // 0016 GETGBL R3 G12
0x8810010C, // 0017 GETMBR R4 R0 K12
0x7C0C0200, // 0018 CALL R3 1
0x140C0203, // 0019 LT R3 R1 R3
0x780E0006, // 001A JMPF R3 #0022
0x880C010C, // 001B GETMBR R3 R0 K12
0x940C0601, // 001C GETIDX R3 R3 R1
0x8C0C070D, // 001D GETMET R3 R3 K13
0x5C140400, // 001E MOVE R5 R2
0x7C0C0400, // 001F CALL R3 2
0x0004030E, // 0020 ADD R1 R1 K14
0x7001FFF3, // 0021 JMP #0016
0x58040009, // 0022 LDCONST R1 K9
0x880C0106, // 0023 GETMBR R3 R0 K6
0x8810010F, // 0024 GETMBR R4 R0 K15
0x6014000C, // 0025 GETGBL R5 G12
0x88180110, // 0026 GETMBR R6 R0 K16
0x7C140200, // 0027 CALL R5 1
0x14140205, // 0028 LT R5 R1 R5
0x7816000D, // 0029 JMPF R5 #0038
0x8C140907, // 002A GETMET R5 R4 K7
0x581C0011, // 002B LDCONST R7 K17
0x7C140400, // 002C CALL R5 2
0x88140110, // 002D GETMBR R5 R0 K16
0x94140A01, // 002E GETIDX R5 R5 R1
0x8C140B12, // 002F GETMET R5 R5 K18
0x5C1C0800, // 0030 MOVE R7 R4
0x7C140400, // 0031 CALL R5 2
0x78160002, // 0032 JMPF R5 #0036
0x8C140713, // 0033 GETMET R5 R3 K19
0x5C1C0800, // 0034 MOVE R7 R4
0x7C140400, // 0035 CALL R5 2
0x0004030E, // 0036 ADD R1 R1 K14
0x7001FFEC, // 0037 JMP #0025
0x88140114, // 0038 GETMBR R5 R0 K20
0x88180115, // 0039 GETMBR R6 R0 K21
0x78160003, // 003A JMPF R5 #003F
0x781A0002, // 003B JMPF R6 #003F
0x5C1C0C00, // 003C MOVE R7 R6
0x5C200A00, // 003D MOVE R8 R5
0x7C1C0200, // 003E CALL R7 1
0x8C1C010D, // 003F GETMET R7 R0 K13
0x7C1C0200, // 0040 CALL R7 1
0x881C0106, // 0041 GETMBR R7 R0 K6
0x8C1C0F16, // 0042 GETMET R7 R7 K22
0x88240104, // 0043 GETMBR R9 R0 K4
0x8C241317, // 0044 GETMET R9 R9 K23
0x7C240200, // 0045 CALL R9 1
0x88280104, // 0046 GETMBR R10 R0 K4
0x8C281518, // 0047 GETMET R10 R10 K24
0x7C280200, // 0048 CALL R10 1
0x882C0104, // 0049 GETMBR R11 R0 K4
0x8C2C1719, // 004A GETMET R11 R11 K25
0x7C2C0200, // 004B CALL R11 1
0x7C1C0800, // 004C CALL R7 4
0x881C0104, // 004D GETMBR R7 R0 K4
0x8C1C0F1A, // 004E GETMET R7 R7 K26
0x7C1C0200, // 004F CALL R7 1
0x881C0104, // 0050 GETMBR R7 R0 K4
0x8C1C0F1B, // 0051 GETMET R7 R7 K27
0x7C1C0200, // 0052 CALL R7 1
0x80000000, // 0053 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: remove_animator
********************************************************************/
be_local_closure(Animate_core_remove_animator, /* 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(animators),
/* K1 */ be_nested_str_weak(remove),
/* K2 */ be_nested_str_weak(find),
/* K3 */ be_nested_str_weak(clear),
}),
be_str_weak(remove_animator),
&be_const_str_solidified,
( &(const binstruction[13]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x4C0C0000, // 0001 LDNIL R3
0x200C0203, // 0002 NE R3 R1 R3
0x780E0005, // 0003 JMPF R3 #000A
0x8C0C0501, // 0004 GETMET R3 R2 K1
0x8C140502, // 0005 GETMET R5 R2 K2
0x5C1C0200, // 0006 MOVE R7 R1
0x7C140400, // 0007 CALL R5 2
0x7C0C0400, // 0008 CALL R3 2
0x70020001, // 0009 JMP #000C
0x8C0C0503, // 000A GETMET R3 R2 K3
0x7C0C0200, // 000B CALL R3 1
0x80000000, // 000C RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: animate
********************************************************************/
be_local_closure(Animate_core_animate, /* 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(animate),
&be_const_str_solidified,
( &(const binstruction[ 1]) { /* code */
0x80000000, // 0000 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_current
********************************************************************/
be_local_closure(Animate_core_set_current, /* 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(global),
/* K1 */ be_nested_str_weak(_cur_anim),
}),
be_str_weak(set_current),
&be_const_str_solidified,
( &(const binstruction[ 3]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x90060200, // 0001 SETMBR R1 K1 R0
0x80000000, // 0002 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(Animate_core_init, /* name */
be_nested_proto(
7, /* 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(fast_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[15]) { /* constants */
/* K0 */ be_nested_str_weak(animate),
/* K1 */ be_nested_str_weak(strip),
/* K2 */ be_nested_str_weak(bri),
/* K3 */ be_nested_str_weak(set_strip_bri),
/* K4 */ be_nested_str_weak(running),
/* K5 */ be_nested_str_weak(pixel_count),
/* K6 */ be_nested_str_weak(animators),
/* K7 */ be_nested_str_weak(painters),
/* K8 */ be_nested_str_weak(clear),
/* K9 */ be_nested_str_weak(frame),
/* K10 */ be_nested_str_weak(layer),
/* K11 */ be_nested_str_weak(fast_loop_cb),
/* K12 */ be_nested_str_weak(back_color),
/* K13 */ be_const_int(0),
/* K14 */ be_nested_str_weak(set_current),
}),
be_str_weak(init),
&be_const_str_solidified,
( &(const binstruction[37]) { /* code */
0xA40E0000, // 0000 IMPORT R3 K0
0x90020201, // 0001 SETMBR R0 K1 R1
0x4C100000, // 0002 LDNIL R4
0x1C100404, // 0003 EQ R4 R2 R4
0x78120000, // 0004 JMPF R4 #0006
0x540A0031, // 0005 LDINT R2 50
0x90020402, // 0006 SETMBR R0 K2 R2
0x8C100103, // 0007 GETMET R4 R0 K3
0x7C100200, // 0008 CALL R4 1
0x50100000, // 0009 LDBOOL R4 0 0
0x90020804, // 000A SETMBR R0 K4 R4
0x8C100305, // 000B GETMET R4 R1 K5
0x7C100200, // 000C CALL R4 1
0x90020A04, // 000D SETMBR R0 K5 R4
0x60100012, // 000E GETGBL R4 G18
0x7C100000, // 000F CALL R4 0
0x90020C04, // 0010 SETMBR R0 K6 R4
0x60100012, // 0011 GETGBL R4 G18
0x7C100000, // 0012 CALL R4 0
0x90020E04, // 0013 SETMBR R0 K7 R4
0x8C100108, // 0014 GETMET R4 R0 K8
0x7C100200, // 0015 CALL R4 1
0x8C100709, // 0016 GETMET R4 R3 K9
0x88180105, // 0017 GETMBR R6 R0 K5
0x7C100400, // 0018 CALL R4 2
0x90021204, // 0019 SETMBR R0 K9 R4
0x8C100709, // 001A GETMET R4 R3 K9
0x88180105, // 001B GETMBR R6 R0 K5
0x7C100400, // 001C CALL R4 2
0x90021404, // 001D SETMBR R0 K10 R4
0x84100000, // 001E CLOSURE R4 P0
0x90021604, // 001F SETMBR R0 K11 R4
0x9002190D, // 0020 SETMBR R0 K12 K13
0x8C10010E, // 0021 GETMET R4 R0 K14
0x7C100200, // 0022 CALL R4 1
0xA0000000, // 0023 CLOSE R0
0x80000000, // 0024 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_cb
********************************************************************/
be_local_closure(Animate_core_set_cb, /* name */
be_nested_proto(
3, /* 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(obj),
/* K1 */ be_nested_str_weak(mth),
}),
be_str_weak(set_cb),
&be_const_str_solidified,
( &(const binstruction[ 3]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x90020202, // 0001 SETMBR R0 K1 R2
0x80000000, // 0002 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_back_color
********************************************************************/
be_local_closure(Animate_core_set_back_color, /* name */
be_nested_proto(
2, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 1]) { /* constants */
/* K0 */ be_nested_str_weak(back_color),
}),
be_str_weak(set_back_color),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: add_background_animator
********************************************************************/
be_local_closure(Animate_core_add_background_animator, /* 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(set_cb),
/* K1 */ be_nested_str_weak(set_back_color),
/* K2 */ be_nested_str_weak(add_animator),
}),
be_str_weak(add_background_animator),
&be_const_str_solidified,
( &(const binstruction[ 8]) { /* code */
0x8C080300, // 0000 GETMET R2 R1 K0
0x5C100000, // 0001 MOVE R4 R0
0x88140101, // 0002 GETMBR R5 R0 K1
0x7C080600, // 0003 CALL R2 3
0x8C080102, // 0004 GETMET R2 R0 K2
0x5C100200, // 0005 MOVE R4 R1
0x7C080400, // 0006 CALL R2 2
0x80000000, // 0007 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: add_animator
********************************************************************/
be_local_closure(Animate_core_add_animator, /* name */
be_nested_proto(
5, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str_weak(animators),
/* K1 */ be_nested_str_weak(find),
/* K2 */ be_nested_str_weak(push),
}),
be_str_weak(add_animator),
&be_const_str_solidified,
( &(const binstruction[12]) { /* 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
0x780A0003, // 0006 JMPF R2 #000B
0x88080100, // 0007 GETMBR R2 R0 K0
0x8C080502, // 0008 GETMET R2 R2 K2
0x5C100200, // 0009 MOVE R4 R1
0x7C080400, // 000A CALL R2 2
0x80000000, // 000B RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: remove
********************************************************************/
be_local_closure(Animate_core_remove, /* 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(clear),
/* K1 */ be_nested_str_weak(tasmota),
/* K2 */ be_nested_str_weak(remove_fast_loop),
/* K3 */ be_nested_str_weak(fast_loop_cb),
}),
be_str_weak(remove),
&be_const_str_solidified,
( &(const binstruction[ 7]) { /* code */
0x8C040100, // 0000 GETMET R1 R0 K0
0x7C040200, // 0001 CALL R1 1
0xB8060200, // 0002 GETNGBL R1 K1
0x8C040302, // 0003 GETMET R1 R1 K2
0x880C0103, // 0004 GETMBR R3 R0 K3
0x7C040400, // 0005 CALL R1 2
0x80000000, // 0006 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: start
********************************************************************/
be_local_closure(Animate_core_start, /* 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(running),
/* K1 */ be_nested_str_weak(animators),
/* K2 */ be_const_int(0),
/* K3 */ be_nested_str_weak(start),
/* K4 */ be_const_int(1),
/* K5 */ be_nested_str_weak(fast_loop_next),
/* K6 */ be_nested_str_weak(tasmota),
/* K7 */ be_nested_str_weak(add_fast_loop),
/* K8 */ be_nested_str_weak(fast_loop_cb),
}),
be_str_weak(start),
&be_const_str_solidified,
( &(const binstruction[20]) { /* code */
0x50040200, // 0000 LDBOOL R1 1 0
0x90020001, // 0001 SETMBR R0 K0 R1
0x88040101, // 0002 GETMBR R1 R0 K1
0x58080002, // 0003 LDCONST R2 K2
0x600C000C, // 0004 GETGBL R3 G12
0x5C100200, // 0005 MOVE R4 R1
0x7C0C0200, // 0006 CALL R3 1
0x140C0403, // 0007 LT R3 R2 R3
0x780E0004, // 0008 JMPF R3 #000E
0x940C0202, // 0009 GETIDX R3 R1 R2
0x8C0C0703, // 000A GETMET R3 R3 K3
0x7C0C0200, // 000B CALL R3 1
0x00080504, // 000C ADD R2 R2 K4
0x7001FFF5, // 000D JMP #0004
0x90020B02, // 000E SETMBR R0 K5 K2
0xB80E0C00, // 000F GETNGBL R3 K6
0x8C0C0707, // 0010 GETMET R3 R3 K7
0x88140108, // 0011 GETMBR R5 R0 K8
0x7C0C0400, // 0012 CALL R3 2
0x80000000, // 0013 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Animate_core
********************************************************************/
be_local_class(Animate_core,
13,
NULL,
be_nested_map(32,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(set_strip_bri, -1), be_const_closure(Animate_core_set_strip_bri_closure) },
{ be_const_key_weak(animators, -1), be_const_var(4) },
{ be_const_key_weak(clear, 0), be_const_closure(Animate_core_clear_closure) },
{ be_const_key_weak(remove, -1), be_const_closure(Animate_core_remove_closure) },
{ be_const_key_weak(mth, -1), be_const_var(9) },
{ be_const_key_weak(stop, 1), be_const_closure(Animate_core_stop_closure) },
{ be_const_key_weak(fast_loop_cb, 30), be_const_var(6) },
{ be_const_key_weak(get_bri, -1), be_const_closure(Animate_core_get_bri_closure) },
{ be_const_key_weak(add_animator, -1), be_const_closure(Animate_core_add_animator_closure) },
{ be_const_key_weak(add_background_animator, -1), be_const_closure(Animate_core_add_background_animator_closure) },
{ be_const_key_weak(fast_loop_next, -1), be_const_var(7) },
{ be_const_key_weak(remove_animator, -1), be_const_closure(Animate_core_remove_animator_closure) },
{ be_const_key_weak(add_painter, 28), be_const_closure(Animate_core_add_painter_closure) },
{ be_const_key_weak(FAST_LOOP_MIN, -1), be_const_int(20) },
{ be_const_key_weak(fast_loop, -1), be_const_closure(Animate_core_fast_loop_closure) },
{ be_const_key_weak(set_back_color, 11), be_const_closure(Animate_core_set_back_color_closure) },
{ be_const_key_weak(animate, 8), be_const_closure(Animate_core_animate_closure) },
{ be_const_key_weak(strip, 24), be_const_var(0) },
{ be_const_key_weak(layer, -1), be_const_var(11) },
{ be_const_key_weak(init, -1), be_const_closure(Animate_core_init_closure) },
{ be_const_key_weak(bri, -1), be_const_var(2) },
{ be_const_key_weak(set_cb, 13), be_const_closure(Animate_core_set_cb_closure) },
{ be_const_key_weak(back_color, 18), be_const_var(12) },
{ be_const_key_weak(pixel_count, 15), be_const_var(1) },
{ be_const_key_weak(set_current, -1), be_const_closure(Animate_core_set_current_closure) },
{ be_const_key_weak(painters, -1), be_const_var(5) },
{ be_const_key_weak(obj, 10), be_const_var(8) },
{ be_const_key_weak(set_bri, 9), be_const_closure(Animate_core_set_bri_closure) },
{ be_const_key_weak(running, -1), be_const_var(3) },
{ be_const_key_weak(remove_painter, 3), be_const_closure(Animate_core_remove_painter_closure) },
{ be_const_key_weak(frame, -1), be_const_var(10) },
{ be_const_key_weak(start, -1), be_const_closure(Animate_core_start_closure) },
})),
be_str_weak(Animate_core)
);
/*******************************************************************/
void be_load_Animate_core_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Animate_core);
be_setglobal(vm, "Animate_core");
be_pop(vm, 1);
}
/********************************************************************/
/* End of solidification */

View File

@ -0,0 +1,450 @@
/* Solidification of animate_2_animate_effects.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
extern const bclass be_class_Animate_painter;
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(Animate_painter_init, /* name */
be_nested_proto(
5, /* nstack */
1, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 3]) { /* constants */
/* K0 */ be_nested_str_weak(global),
/* K1 */ be_nested_str_weak(_cur_anim),
/* K2 */ be_nested_str_weak(add_painter),
}),
be_str_weak(init),
&be_const_str_solidified,
( &(const binstruction[ 9]) { /* code */
0xB8060000, // 0000 GETNGBL R1 K0
0x88040301, // 0001 GETMBR R1 R1 K1
0x4C080000, // 0002 LDNIL R2
0x20080202, // 0003 NE R2 R1 R2
0x780A0002, // 0004 JMPF R2 #0008
0x8C080302, // 0005 GETMET R2 R1 K2
0x5C100000, // 0006 MOVE R4 R0
0x7C080400, // 0007 CALL R2 2
0x80000000, // 0008 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: paint
********************************************************************/
be_local_closure(Animate_painter_paint, /* 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(paint),
&be_const_str_solidified,
( &(const binstruction[ 1]) { /* code */
0x80000000, // 0000 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Animate_painter
********************************************************************/
be_local_class(Animate_painter,
0,
NULL,
be_nested_map(2,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(paint, -1), be_const_closure(Animate_painter_paint_closure) },
{ be_const_key_weak(init, 0), be_const_closure(Animate_painter_init_closure) },
})),
be_str_weak(Animate_painter)
);
/*******************************************************************/
void be_load_Animate_painter_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Animate_painter);
be_setglobal(vm, "Animate_painter");
be_pop(vm, 1);
}
extern const bclass be_class_Animate_pulse;
/********************************************************************
** Solidified function: set_pulse_size
********************************************************************/
be_local_closure(Animate_pulse_set_pulse_size, /* name */
be_nested_proto(
2, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 1]) { /* constants */
/* K0 */ be_nested_str_weak(pulse_size),
}),
be_str_weak(set_pulse_size),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_slew_size
********************************************************************/
be_local_closure(Animate_pulse_set_slew_size, /* name */
be_nested_proto(
2, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 1]) { /* constants */
/* K0 */ be_nested_str_weak(slew_size),
}),
be_str_weak(set_slew_size),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_back_color
********************************************************************/
be_local_closure(Animate_pulse_set_back_color, /* name */
be_nested_proto(
2, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 1]) { /* constants */
/* K0 */ be_nested_str_weak(back_color),
}),
be_str_weak(set_back_color),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_pos
********************************************************************/
be_local_closure(Animate_pulse_set_pos, /* 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(pos),
}),
be_str_weak(set_pos),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_color
********************************************************************/
be_local_closure(Animate_pulse_set_color, /* name */
be_nested_proto(
2, /* nstack */
2, /* argc */
2, /* varg */
0, /* has upvals */
NULL, /* no upvals */
0, /* has sup protos */
NULL, /* no sub protos */
1, /* has constants */
( &(const bvalue[ 1]) { /* constants */
/* K0 */ be_nested_str_weak(color),
}),
be_str_weak(set_color),
&be_const_str_solidified,
( &(const binstruction[ 2]) { /* code */
0x90020001, // 0000 SETMBR R0 K0 R1
0x80000000, // 0001 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(Animate_pulse_init, /* 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[10]) { /* constants */
/* K0 */ be_nested_str_weak(init),
/* K1 */ be_const_int(16777215),
/* K2 */ be_const_int(1),
/* K3 */ be_const_int(0),
/* K4 */ be_nested_str_weak(color),
/* K5 */ be_nested_str_weak(back_color),
/* K6 */ be_const_int(-16777216),
/* K7 */ be_nested_str_weak(pulse_size),
/* K8 */ be_nested_str_weak(slew_size),
/* K9 */ be_nested_str_weak(pos),
}),
be_str_weak(init),
&be_const_str_solidified,
( &(const binstruction[29]) { /* code */
0x60100003, // 0000 GETGBL R4 G3
0x5C140000, // 0001 MOVE R5 R0
0x7C100200, // 0002 CALL R4 1
0x8C100900, // 0003 GETMET R4 R4 K0
0x7C100200, // 0004 CALL R4 1
0x4C100000, // 0005 LDNIL R4
0x1C100204, // 0006 EQ R4 R1 R4
0x78120000, // 0007 JMPF R4 #0009
0x58040001, // 0008 LDCONST R1 K1
0x4C100000, // 0009 LDNIL R4
0x1C100404, // 000A EQ R4 R2 R4
0x78120000, // 000B JMPF R4 #000D
0x58080002, // 000C LDCONST R2 K2
0x4C100000, // 000D LDNIL R4
0x1C100604, // 000E EQ R4 R3 R4
0x78120000, // 000F JMPF R4 #0011
0x580C0003, // 0010 LDCONST R3 K3
0x90020801, // 0011 SETMBR R0 K4 R1
0x90020B06, // 0012 SETMBR R0 K5 K6
0x14100503, // 0013 LT R4 R2 K3
0x78120000, // 0014 JMPF R4 #0016
0x58080003, // 0015 LDCONST R2 K3
0x90020E02, // 0016 SETMBR R0 K7 R2
0x14100703, // 0017 LT R4 R3 K3
0x78120000, // 0018 JMPF R4 #001A
0x580C0003, // 0019 LDCONST R3 K3
0x90021003, // 001A SETMBR R0 K8 R3
0x90021303, // 001B SETMBR R0 K9 K3
0x80000000, // 001C RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: paint
********************************************************************/
be_local_closure(Animate_pulse_paint, /* name */
be_nested_proto(
22, /* 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(back_color),
/* K1 */ be_const_int(-16777216),
/* K2 */ be_nested_str_weak(fill_pixels),
/* K3 */ be_nested_str_weak(pos),
/* K4 */ be_nested_str_weak(slew_size),
/* K5 */ be_nested_str_weak(pulse_size),
/* K6 */ be_nested_str_weak(color),
/* K7 */ be_nested_str_weak(pixel_size),
/* K8 */ be_const_int(0),
/* K9 */ be_const_int(1),
/* K10 */ be_nested_str_weak(blend),
/* K11 */ be_nested_str_weak(tasmota),
/* K12 */ be_nested_str_weak(scale_int),
}),
be_str_weak(paint),
&be_const_str_solidified,
( &(const binstruction[91]) { /* code */
0x88080100, // 0000 GETMBR R2 R0 K0
0x200C0501, // 0001 NE R3 R2 K1
0x780E0002, // 0002 JMPF R3 #0006
0x8C0C0302, // 0003 GETMET R3 R1 K2
0x5C140400, // 0004 MOVE R5 R2
0x7C0C0400, // 0005 CALL R3 2
0x880C0103, // 0006 GETMBR R3 R0 K3
0x88100104, // 0007 GETMBR R4 R0 K4
0x88140105, // 0008 GETMBR R5 R0 K5
0x88180106, // 0009 GETMBR R6 R0 K6
0x881C0307, // 000A GETMBR R7 R1 K7
0x4C200000, // 000B LDNIL R8
0x4C240000, // 000C LDNIL R9
0x5C200600, // 000D MOVE R8 R3
0x00280605, // 000E ADD R10 R3 R5
0x5C241400, // 000F MOVE R9 R10
0x14281108, // 0010 LT R10 R8 K8
0x782A0000, // 0011 JMPF R10 #0013
0x58200008, // 0012 LDCONST R8 K8
0x28281207, // 0013 GE R10 R9 R7
0x782A0000, // 0014 JMPF R10 #0016
0x5C240E00, // 0015 MOVE R9 R7
0x5C281000, // 0016 MOVE R10 R8
0x142C1409, // 0017 LT R11 R10 R9
0x782E0002, // 0018 JMPF R11 #001C
0x98041406, // 0019 SETIDX R1 R10 R6
0x00281509, // 001A ADD R10 R10 K9
0x7001FFFA, // 001B JMP #0017
0x242C0908, // 001C GT R11 R4 K8
0x782E003A, // 001D JMPF R11 #0059
0x042C0604, // 001E SUB R11 R3 R4
0x5C201600, // 001F MOVE R8 R11
0x5C240600, // 0020 MOVE R9 R3
0x142C1108, // 0021 LT R11 R8 K8
0x782E0000, // 0022 JMPF R11 #0024
0x58200008, // 0023 LDCONST R8 K8
0x282C1207, // 0024 GE R11 R9 R7
0x782E0000, // 0025 JMPF R11 #0027
0x5C240E00, // 0026 MOVE R9 R7
0x5C281000, // 0027 MOVE R10 R8
0x142C1409, // 0028 LT R11 R10 R9
0x782E000F, // 0029 JMPF R11 #003A
0x8C2C030A, // 002A GETMET R11 R1 K10
0x5C340400, // 002B MOVE R13 R2
0x5C380C00, // 002C MOVE R14 R6
0xB83E1600, // 002D GETNGBL R15 K11
0x8C3C1F0C, // 002E GETMET R15 R15 K12
0x5C441400, // 002F MOVE R17 R10
0x04480604, // 0030 SUB R18 R3 R4
0x04482509, // 0031 SUB R18 R18 K9
0x5C4C0600, // 0032 MOVE R19 R3
0x545200FE, // 0033 LDINT R20 255
0x58540008, // 0034 LDCONST R21 K8
0x7C3C0C00, // 0035 CALL R15 6
0x7C2C0800, // 0036 CALL R11 4
0x9804140B, // 0037 SETIDX R1 R10 R11
0x00281509, // 0038 ADD R10 R10 K9
0x7001FFED, // 0039 JMP #0028
0x002C0605, // 003A ADD R11 R3 R5
0x5C201600, // 003B MOVE R8 R11
0x002C0605, // 003C ADD R11 R3 R5
0x002C1604, // 003D ADD R11 R11 R4
0x5C241600, // 003E MOVE R9 R11
0x142C1108, // 003F LT R11 R8 K8
0x782E0000, // 0040 JMPF R11 #0042
0x58200008, // 0041 LDCONST R8 K8
0x282C1207, // 0042 GE R11 R9 R7
0x782E0000, // 0043 JMPF R11 #0045
0x5C240E00, // 0044 MOVE R9 R7
0x5C281000, // 0045 MOVE R10 R8
0x142C1409, // 0046 LT R11 R10 R9
0x782E0010, // 0047 JMPF R11 #0059
0x8C2C030A, // 0048 GETMET R11 R1 K10
0x5C340400, // 0049 MOVE R13 R2
0x5C380C00, // 004A MOVE R14 R6
0xB83E1600, // 004B GETNGBL R15 K11
0x8C3C1F0C, // 004C GETMET R15 R15 K12
0x5C441400, // 004D MOVE R17 R10
0x00480605, // 004E ADD R18 R3 R5
0x04482509, // 004F SUB R18 R18 K9
0x004C0605, // 0050 ADD R19 R3 R5
0x004C2604, // 0051 ADD R19 R19 R4
0x58500008, // 0052 LDCONST R20 K8
0x545600FE, // 0053 LDINT R21 255
0x7C3C0C00, // 0054 CALL R15 6
0x7C2C0800, // 0055 CALL R11 4
0x9804140B, // 0056 SETIDX R1 R10 R11
0x00281509, // 0057 ADD R10 R10 K9
0x7001FFEC, // 0058 JMP #0046
0x502C0200, // 0059 LDBOOL R11 1 0
0x80041600, // 005A RET 1 R11
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Animate_pulse
********************************************************************/
extern const bclass be_class_Animate_painter;
be_local_class(Animate_pulse,
5,
&be_class_Animate_painter,
be_nested_map(12,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key_weak(paint, -1), be_const_closure(Animate_pulse_paint_closure) },
{ be_const_key_weak(set_slew_size, -1), be_const_closure(Animate_pulse_set_slew_size_closure) },
{ be_const_key_weak(pulse_size, -1), be_const_var(4) },
{ be_const_key_weak(set_back_color, 8), be_const_closure(Animate_pulse_set_back_color_closure) },
{ be_const_key_weak(color, -1), be_const_var(0) },
{ be_const_key_weak(back_color, -1), be_const_var(1) },
{ be_const_key_weak(set_pos, -1), be_const_closure(Animate_pulse_set_pos_closure) },
{ be_const_key_weak(set_color, -1), be_const_closure(Animate_pulse_set_color_closure) },
{ be_const_key_weak(init, 7), be_const_closure(Animate_pulse_init_closure) },
{ be_const_key_weak(pos, -1), be_const_var(2) },
{ be_const_key_weak(slew_size, 5), be_const_var(3) },
{ be_const_key_weak(set_pulse_size, 0), be_const_closure(Animate_pulse_set_pulse_size_closure) },
})),
be_str_weak(Animate_pulse)
);
/*******************************************************************/
void be_load_Animate_pulse_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Animate_pulse);
be_setglobal(vm, "Animate_pulse");
be_pop(vm, 1);
}
/********************************************************************/
/* End of solidification */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,186 @@
/* Solidification of leds_frame_be_methods.h */
/********************************************************************\
* Generated code, don't edit *
\********************************************************************/
#include "be_constobj.h"
extern const bclass be_class_Leds_frame_be;
/********************************************************************
** Solidified function: setitem
********************************************************************/
be_local_closure(Leds_frame_be_setitem, /* name */
be_nested_proto(
8, /* 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(set),
}),
&be_const_str_setitem,
&be_const_str_solidified,
( &(const binstruction[ 7]) { /* code */
0x8C0C0100, // 0000 GETMET R3 R0 K0
0x54160003, // 0001 LDINT R5 4
0x08140205, // 0002 MUL R5 R1 R5
0x5C180400, // 0003 MOVE R6 R2
0x541E0003, // 0004 LDINT R7 4
0x7C0C0800, // 0005 CALL R3 4
0x80000000, // 0006 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: set_pixel
********************************************************************/
be_local_closure(Leds_frame_be_set_pixel, /* name */
be_nested_proto(
11, /* nstack */
6, /* 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_const_int(0),
/* K1 */ be_nested_str(setitem),
}),
&be_const_str_set_pixel,
&be_const_str_solidified,
( &(const binstruction[26]) { /* code */
0x4C180000, // 0000 LDNIL R6
0x1C180A06, // 0001 EQ R6 R5 R6
0x781A0000, // 0002 JMPF R6 #0004
0x58140000, // 0003 LDCONST R5 K0
0x541A00FE, // 0004 LDINT R6 255
0x2C180A06, // 0005 AND R6 R5 R6
0x541E0017, // 0006 LDINT R7 24
0x38180C07, // 0007 SHL R6 R6 R7
0x541E00FE, // 0008 LDINT R7 255
0x2C1C0407, // 0009 AND R7 R2 R7
0x5422000F, // 000A LDINT R8 16
0x381C0E08, // 000B SHL R7 R7 R8
0x30180C07, // 000C OR R6 R6 R7
0x541E00FE, // 000D LDINT R7 255
0x2C1C0607, // 000E AND R7 R3 R7
0x54220007, // 000F LDINT R8 8
0x381C0E08, // 0010 SHL R7 R7 R8
0x30180C07, // 0011 OR R6 R6 R7
0x541E00FE, // 0012 LDINT R7 255
0x2C1C0807, // 0013 AND R7 R4 R7
0x30180C07, // 0014 OR R6 R6 R7
0x8C1C0101, // 0015 GETMET R7 R0 K1
0x5C240200, // 0016 MOVE R9 R1
0x5C280C00, // 0017 MOVE R10 R6
0x7C1C0600, // 0018 CALL R7 3
0x80000000, // 0019 RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: item
********************************************************************/
be_local_closure(Leds_frame_be_item, /* 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[ 1]) { /* constants */
/* K0 */ be_nested_str(get),
}),
&be_const_str_item,
&be_const_str_solidified,
( &(const binstruction[ 6]) { /* code */
0x8C080100, // 0000 GETMET R2 R0 K0
0x54120003, // 0001 LDINT R4 4
0x08100204, // 0002 MUL R4 R1 R4
0x54160003, // 0003 LDINT R5 4
0x7C080600, // 0004 CALL R2 3
0x80040400, // 0005 RET 1 R2
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified function: init
********************************************************************/
be_local_closure(Leds_frame_be_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[ 3]) { /* constants */
/* K0 */ be_const_int(0),
/* K1 */ be_nested_str(pixel_size),
/* K2 */ be_nested_str(init),
}),
&be_const_str_init,
&be_const_str_solidified,
( &(const binstruction[12]) { /* code */
0x14080300, // 0000 LT R2 R1 K0
0x780A0000, // 0001 JMPF R2 #0003
0x44040200, // 0002 NEG R1 R1
0x90020201, // 0003 SETMBR R0 K1 R1
0x60080003, // 0004 GETGBL R2 G3
0x5C0C0000, // 0005 MOVE R3 R0
0x7C080200, // 0006 CALL R2 1
0x8C080502, // 0007 GETMET R2 R2 K2
0x5411FFFB, // 0008 LDINT R4 -4
0x08100204, // 0009 MUL R4 R1 R4
0x7C080400, // 000A CALL R2 2
0x80000000, // 000B RET 0
})
)
);
/*******************************************************************/
/********************************************************************
** Solidified class: Leds_frame_be
********************************************************************/
be_local_class(Leds_frame_be,
0,
NULL,
be_nested_map(4,
( (struct bmapnode*) &(const bmapnode[]) {
{ be_const_key(setitem, 1), be_const_closure(Leds_frame_be_setitem_closure) },
{ be_const_key(set_pixel, -1), be_const_closure(Leds_frame_be_set_pixel_closure) },
{ be_const_key(item, -1), be_const_closure(Leds_frame_be_item_closure) },
{ be_const_key(init, -1), be_const_closure(Leds_frame_be_init_closure) },
})),
(bstring*) &be_const_str_Leds_frame_be
);
/*******************************************************************/
void be_load_Leds_frame_be_class(bvm *vm) {
be_pushntvclass(vm, &be_class_Leds_frame_be);
be_setglobal(vm, "Leds_frame_be");
be_pop(vm, 1);
}
/********************************************************************/
/* End of solidification */

View File

@ -16,6 +16,6 @@ for filePath in fileList:
# print("Deleting file : ", filePath)
except:
print("Error while deleting file : ", filePath)
cmd = (env["PYTHONEXE"],join("tools","coc","coc"),"-o","generate","src","default",join("..","berry_tasmota","src"),join("..","berry_matter","src","solidify"),join("..","berry_matter","src"),join("..","berry_tasmota","src","solidify"),join("..","berry_mapping","src"),join("..","berry_int64","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src","solidify"),join("..","..","libesp32_lvgl","lv_binding_berry","generate"),"-c",join("default","berry_conf.h"))
cmd = (env["PYTHONEXE"],join("tools","coc","coc"),"-o","generate","src","default",join("..","berry_tasmota","src"),join("..","berry_matter","src","solidify"),join("..","berry_matter","src"),join("..","berry_animate","src","solidify"),join("..","berry_animate","src"),join("..","berry_tasmota","src","solidify"),join("..","berry_mapping","src"),join("..","berry_int64","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src"),join("..","..","libesp32_lvgl","lv_binding_berry","src","solidify"),join("..","..","libesp32_lvgl","lv_binding_berry","generate"),"-c",join("default","berry_conf.h"))
returncode = subprocess.call(cmd, shell=False)
os.chdir(CURRENT_DIR)

View File

@ -251,6 +251,27 @@ extern "C" {
}
}
uint32_t ApplyBriGamma(uint32_t color_a /* 0xRRGGBB */, uint32_t bri /* 0..255 */, bool gamma) {
if (bri == 0) { return 0x000000; } // if bri is zero, short-cut
uint32_t r = (color_a >> 16) & 0xFF;
uint32_t g = (color_a >> 8) & 0xFF;
uint32_t b = (color_a ) & 0xFF;
if (bri < 255) { // apply bri
r = changeUIntScale(bri, 0, 255, 0, r);
g = changeUIntScale(bri, 0, 255, 0, g);
b = changeUIntScale(bri, 0, 255, 0, b);
}
if (gamma) { // apply gamma
r = ledGamma(r);
g = ledGamma(g);
b = ledGamma(b);
}
uint32_t rgb = (r << 16) | (g << 8) | b;
return rgb;
}
extern "C" {
// Leds.blend_color(color_a:int, color_b:int [, alpha:int]) -> color:int
//
@ -291,27 +312,6 @@ extern "C" {
be_raise(vm, kTypeError, nullptr);
}
static uint32_t ApplyBriGamma(uint32_t color_a /* 0xRRGGBB */, uint32_t bri /* 0..255 */, bool gamma) {
if (bri == 0) { return 0x000000; } // if bri is zero, short-cut
uint32_t r = (color_a >> 16) & 0xFF;
uint32_t g = (color_a >> 8) & 0xFF;
uint32_t b = (color_a ) & 0xFF;
if (bri < 255) { // apply bri
r = changeUIntScale(bri, 0, 255, 0, r);
g = changeUIntScale(bri, 0, 255, 0, g);
b = changeUIntScale(bri, 0, 255, 0, b);
}
if (gamma) { // apply gamma
r = ledGamma(r);
g = ledGamma(g);
b = ledGamma(b);
}
uint32_t rgb = (r << 16) | (g << 8) | b;
return rgb;
}
// Leds.apply_bri_gamma(color_rgb:int (0xRRGGBB) [bri:int (0..255), gamma:bool]) -> color:int (0xRRGGBB)
//
int32_t be_leds_apply_bri_gamma(bvm *vm);
@ -335,152 +335,6 @@ extern "C" {
}
be_raise(vm, kTypeError, nullptr);
}
// Leds_frame.blend(color1:int, color2:int, alpha:int) -> int
//
int32_t be_leds_blend(bvm *vm);
int32_t be_leds_blend(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 3 && be_isint(vm, 1) && be_isint(vm, 2) && be_isint(vm, 3)) {
uint32_t color_a = be_toint(vm, 1);
uint32_t color_b = be_toint(vm, 2);
uint32_t alpha = be_toint(vm, 3);
uint32_t r = (color_a >> 16) & 0xFF;
uint32_t g = (color_a >> 8) & 0xFF;
uint32_t b = (color_a ) & 0xFF;
uint32_t a = (color_a >> 24) & 0xFF;
uint32_t r2 = (color_b >> 16) & 0xFF;
uint32_t g2 = (color_b >> 8) & 0xFF;
uint32_t b2 = (color_b ) & 0xFF;
uint32_t a2 = (color_b >> 24) & 0xFF;
uint32_t r3 = changeUIntScale(alpha, 0, 255, r2, r);
uint32_t g3 = changeUIntScale(alpha, 0, 255, g2, g);
uint32_t b3 = changeUIntScale(alpha, 0, 255, b2, b);
uint32_t a3 = changeUIntScale(alpha, 0, 255, a2, a);
uint32_t rgb = (a3 << 24) | (r3 << 16) | (g3 << 8) | b3;
be_pushint(vm, rgb);
be_return(vm);
}
be_raise(vm, kTypeError, nullptr);
}
// Leds_frame.blend_pixels(dest:bytes(), foreground:bytes) -> nil
// Destination can be the same as foreground or background
//
// All calculation are done in `0xAARRGGBB` format, AA=0 if opaque (i.e. ignored)
// Background has always alpha = 0 (any other value is ignored) - for simplification
// Size is truncated to smallest of all 3 buffers
int32_t be_leds_blend_pixels(bvm *vm);
int32_t be_leds_blend_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isbytes(vm, 2)) {
size_t dest_len = 0;
uint32_t * dest_buf = (uint32_t*) be_tobytes(vm, 1, &dest_len);
// back = dest for now, could be changed in the future
size_t back_len = 0;
const uint32_t * back_buf = (const uint32_t*) be_tobytes(vm, 1, &back_len);
size_t fore_len = 0;
const uint32_t * fore_buf = (const uint32_t*) be_tobytes(vm, 2, &fore_len);
if (fore_len < dest_len) { dest_len = fore_len; }
if (back_len < dest_len) { dest_len = back_len; }
size_t pixels_count = dest_len / 4;
if (pixels_count > 0) {
uint32_t * dest = (uint32_t *)dest_buf;
uint32_t * back = (uint32_t *)back_buf;
uint32_t * fore = (uint32_t *)fore_buf;
for (size_t i = 0; i < pixels_count; i++) {
uint32_t back_argb = back[i];
uint32_t fore_argb = fore[i];
uint32_t fore_alpha = (fore_argb >> 24) & 0xFF;
uint32_t dest_rgb_new = back_argb;
if (fore_alpha == 0) { // opaque layer, copy value from fore
dest_rgb_new = fore_argb;
} else if (fore_alpha == 255) { // fore is transparent, use back
// nothing to do, dest_rgb_new = back_argb above
} else {
uint32_t back_r = (back_argb >> 16) & 0xFF;
uint32_t fore_r = (fore_argb >> 16) & 0xFF;
uint32_t back_g = (back_argb >> 8) & 0xFF;
uint32_t fore_g = (fore_argb >> 8) & 0xFF;
uint32_t back_b = (back_argb ) & 0xFF;
uint32_t fore_b = (fore_argb ) & 0xFF;
uint32_t dest_r_new = changeUIntScale(fore_alpha, 0, 255, fore_r, back_r);
uint32_t dest_g_new = changeUIntScale(fore_alpha, 0, 255, fore_g, back_g);
uint32_t dest_b_new = changeUIntScale(fore_alpha, 0, 255, fore_b, back_b);
dest_rgb_new = (dest_r_new << 16) | (dest_g_new << 8) | dest_b_new;
}
dest[i] = dest_rgb_new;
}
}
be_return_nil(vm);
}
be_raise(vm, kTypeError, nullptr);
}
// Leds_frame.fill_pixels(dest:bytes(), color:int) -> nil
//
// Fill buffer with same color
int32_t be_leds_fill_pixels(bvm *vm);
int32_t be_leds_fill_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isint(vm, 2)) {
size_t dest_len = 0;
uint32_t * dest_buf = (uint32_t*) be_tobytes(vm, 1, &dest_len);
uint32_t color = be_toint(vm, 2);
size_t pixels_count = dest_len / 4;
if (pixels_count > 0) {
uint32_t * dest = (uint32_t *)dest_buf;
for (size_t i = 0; i < pixels_count; i++) {
dest[i] = color;
}
}
be_return_nil(vm);
}
be_raise(vm, kTypeError, nullptr);
}
// Leds_frame.paste_pixels(neopixel:bytes(), led_buffer:bytes(), bri:int 0..100, gamma:bool)
//
// Copy from ARGB buffer to GRB
int32_t be_leds_paste_pixels(bvm *vm);
int32_t be_leds_paste_pixels(bvm *vm) {
int32_t top = be_top(vm); // Get the number of arguments
if (top >= 2 && be_isbytes(vm, 2)) {
size_t src_len = 0;
uint32_t * src_buf = (uint32_t*) be_tobytes(vm, 1, &src_len);
size_t dest_len = 0;
uint8_t * dest_buf = (uint8_t*) be_tobytes(vm, 2, &dest_len);
uint32_t bri255 = 255;
if (top >= 3 && be_isint(vm, 3)) {
bri255 = be_toint(vm, 3);
}
bool gamma = false;
if (top >= 4 && be_isbool(vm, 4)) {
gamma = be_tobool(vm, 4);
}
size_t pixels_count = src_len / 4;
if (pixels_count > dest_len / 3) { pixels_count = dest_len / 3; }
if (pixels_count > 0) {
for (size_t i = 0; i < pixels_count; i++) {
uint32_t src_argb = ApplyBriGamma(src_buf[i], bri255, gamma);
uint32_t src_r = (src_argb >> 16) & 0xFF;
uint32_t src_g = (src_argb >> 8) & 0xFF;
uint32_t src_b = (src_argb ) & 0xFF;
dest_buf[i * 3 + 0] = src_g;
dest_buf[i * 3 + 1] = src_r;
dest_buf[i * 3 + 2] = src_b;
}
}
be_return_nil(vm);
}
be_raise(vm, kTypeError, nullptr);
}
}
#endif // USE_WS2812

View File

@ -31,6 +31,9 @@ extern "C" {
#ifdef USE_MATTER_DEVICE
#include "berry_matter.h"
#endif
#ifdef USE_WS2812
#include "berry_animate.h"
#endif
#include "be_vm.h"
#include "ZipReadFS.h"
#include "ccronexpr.h"