From b72754ab0628a8823fec19b14ef2df65f2f181d3 Mon Sep 17 00:00:00 2001 From: Stephan Hadinger Date: Mon, 21 Mar 2022 19:10:07 +0100 Subject: [PATCH] Berry minor changes in ctypes class wrapper --- .../berry_mapping/src/be_class_wrapper.c | 23 +++++++----------- .../lv_binding_berry/src/lv_berry.c | 24 ++++++++++++------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lib/libesp32/berry_mapping/src/be_class_wrapper.c b/lib/libesp32/berry_mapping/src/be_class_wrapper.c index 35195b6e6..63e4ffa14 100644 --- a/lib/libesp32/berry_mapping/src/be_class_wrapper.c +++ b/lib/libesp32/berry_mapping/src/be_class_wrapper.c @@ -309,16 +309,14 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i p_idx++; } - // special case when no parameters are passed but all are optional - if (NULL != arg_type && arg_type[arg_idx] == '[') { - arg_optional = btrue; - arg_idx++; - } - for (uint32_t i = 0; i < argc; i++) { type_short_name[0] = 0; // clear string // extract individual type - if (NULL != arg_type) { + if (arg_type) { + if (arg_type[arg_idx] == '[' || arg_type[arg_idx] == ']') { // '[' is a marker that following parameters are optional and default to NULL + arg_optional = btrue; + arg_idx++; + } switch (arg_type[arg_idx]) { case '-': arg_idx++; @@ -355,10 +353,6 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i arg_type = NULL; // stop iterations break; } - if (arg_type && (arg_type[arg_idx] == '[' || arg_type[arg_idx] == ']')) { // '[' is a marker that following parameters are optional and default to NULL - arg_optional = btrue; - arg_idx++; - } } // berry_log_C(">> be_call_c_func arg %i, type %s", i, arg_type_check ? type_short_name : ""); p[p_idx] = be_convert_single_elt(vm, i + arg_start, arg_type_check ? type_short_name : NULL, &buf_len); @@ -376,7 +370,7 @@ int be_check_arg_type(bvm *vm, int arg_start, int argc, const char * arg_type, i } // check if we are missing arguments - if (!arg_optional && arg_type && arg_type[arg_idx] != 0) { + if (!arg_optional && arg_type && arg_type[arg_idx] != 0 && arg_type[arg_idx] != '[') { be_raisef(vm, "value_error", "Missing arguments, remaining type '%s'", &arg_type[arg_idx]); } return p_idx; @@ -487,9 +481,8 @@ int be_call_c_func(bvm *vm, const void * func, const char * return_type, const c } else { // class name be_find_global_or_module_member(vm, return_type); be_pushcomptr(vm, (void*) ret); // stack = class, ptr - be_pushcomptr(vm, (void*) -1); // stack = class, ptr, -1 - be_call(vm, 2); // instanciate with 2 arguments, stack = instance, ptr, -1 - be_pop(vm, 2); // stack = instance + be_call(vm, 1); // instanciate with 2 arguments, stack = instance, ptr, -1 + be_pop(vm, 1); // stack = instance be_return(vm); } } diff --git a/lib/libesp32_lvgl/lv_binding_berry/src/lv_berry.c b/lib/libesp32_lvgl/lv_binding_berry/src/lv_berry.c index 8235cccb5..96b10355a 100644 --- a/lib/libesp32_lvgl/lv_binding_berry/src/lv_berry.c +++ b/lib/libesp32_lvgl/lv_binding_berry/src/lv_berry.c @@ -168,19 +168,27 @@ int lv_x_member(bvm *vm) { be_raise(vm, "type_error", NULL); } -// lv_color -// First arg is a 24 bits RGB color -// If first arg is `nil` second arg is the native value of color +// lv_color - constructor +// +// Supports either new initialization taking 24 bits RGB +// or an existing color using native enconding +// +// Arg1 - the instance of the new lv_color object created +// Arg2 - 1/ if `int` then color is 24 bits 0xRRGGBB +// 2/ if `comptr` then color is native format (probably 16 bits) +// 3/ if no Arg2, color is 0x000000 (black) int lco_init(bvm *vm) { int argc = be_top(vm); + lv_color_t lv_color = {}; // default value is all zeroes (black) + uint32_t color32 = 0x000000; // default to black if (argc > 1) { - color32 = be_toint(vm, 2); - } - lv_color_t lv_color = lv_color_hex(color32); - if (argc > 2 && be_toint(vm, 3) == -1) { - lv_color.full = be_toint(vm, 2); + if (be_isint(vm, 2)) { // color is RGB 24 bits + lv_color = lv_color_hex(be_toint(vm, 2)); + } else if (be_iscomptr(vm, 2)) { + lv_color.full = (intptr_t) be_tocomptr(vm, 2); + } } be_pushint(vm, lv_color_to_uint32(lv_color)); be_setmember(vm, 1, "_p");