diff --git a/lib/libesp32/berry/default/be_lv_tasmota_lib.c b/lib/libesp32/berry/default/be_lv_tasmota_lib.c new file mode 100644 index 000000000..d69affbd9 --- /dev/null +++ b/lib/libesp32/berry/default/be_lv_tasmota_lib.c @@ -0,0 +1,116 @@ +/******************************************************************** + * Tasmota LVGL lv_signal_bars widget + *******************************************************************/ +#include "be_constobj.h" + +#ifdef USE_LVGL + +extern int lv0_start(bvm *vm); + +extern int lv0_register_button_encoder(bvm *vm); // add buttons with encoder logic + +extern int lv0_load_montserrat_font(bvm *vm); +extern int lv0_load_seg7_font(bvm *vm); +extern int lv0_load_robotocondensed_latin1_font(bvm *vm); + +extern int lv0_screenshot(bvm *vm); +extern int lv0_load_freetype_font(bvm *vm); + +/******************************************************************** +** Solidified function: init +********************************************************************/ +be_local_closure(lv_tasmota_init, /* name */ + be_nested_proto( + 3, /* nstack */ + 1, /* argc */ + 0, /* varg */ + 0, /* has upvals */ + NULL, /* no upvals */ + 0, /* has sup protos */ + NULL, /* no sub protos */ + 1, /* has constants */ + ( &(const bvalue[23]) { /* constants */ + /* K0 */ be_nested_str(lv), + /* K1 */ be_nested_str(start), + /* K2 */ be_nested_str(font_montserrat), + /* K3 */ be_nested_str(montserrat_font), + /* K4 */ be_nested_str(font_seg7), + /* K5 */ be_nested_str(seg7_font), + /* K6 */ be_nested_str(load_freetype_font), + /* K7 */ be_nested_str(register_button_encoder), + /* K8 */ be_nested_str(screenshot), + /* K9 */ be_nested_str(clock_icon), + /* K10 */ be_nested_str(lv_clock_icon), + /* K11 */ be_nested_str(signal_arcs), + /* K12 */ be_nested_str(lv_signal_arcs), + /* K13 */ be_nested_str(signal_bars), + /* K14 */ be_nested_str(lv_signal_bars), + /* K15 */ be_nested_str(wifi_arcs_icon), + /* K16 */ be_nested_str(lv_wifi_arcs_icon), + /* K17 */ be_nested_str(wifi_arcs), + /* K18 */ be_nested_str(lv_wifi_arcs), + /* K19 */ be_nested_str(wifi_bars_icon), + /* K20 */ be_nested_str(lv_wifi_bars_icon), + /* K21 */ be_nested_str(wifi_bars), + /* K22 */ be_nested_str(lv_wifi_bars), + }), + &be_const_str_init, + &be_const_str_solidified, + ( &(const binstruction[33]) { /* code */ + 0xA4060000, // 0000 IMPORT R1 K0 + 0x88080101, // 0001 GETMBR R2 R0 K1 + 0x90060202, // 0002 SETMBR R1 K1 R2 + 0x88080102, // 0003 GETMBR R2 R0 K2 + 0x90060402, // 0004 SETMBR R1 K2 R2 + 0x88080102, // 0005 GETMBR R2 R0 K2 + 0x90060602, // 0006 SETMBR R1 K3 R2 + 0x88080104, // 0007 GETMBR R2 R0 K4 + 0x90060802, // 0008 SETMBR R1 K4 R2 + 0x88080104, // 0009 GETMBR R2 R0 K4 + 0x90060A02, // 000A SETMBR R1 K5 R2 + 0x88080106, // 000B GETMBR R2 R0 K6 + 0x90060C02, // 000C SETMBR R1 K6 R2 + 0x88080107, // 000D GETMBR R2 R0 K7 + 0x90060E02, // 000E SETMBR R1 K7 R2 + 0x88080108, // 000F GETMBR R2 R0 K8 + 0x90061002, // 0010 SETMBR R1 K8 R2 + 0xB80A1400, // 0011 GETNGBL R2 K10 + 0x90061202, // 0012 SETMBR R1 K9 R2 + 0xB80A1800, // 0013 GETNGBL R2 K12 + 0x90061602, // 0014 SETMBR R1 K11 R2 + 0xB80A1C00, // 0015 GETNGBL R2 K14 + 0x90061A02, // 0016 SETMBR R1 K13 R2 + 0xB80A2000, // 0017 GETNGBL R2 K16 + 0x90061E02, // 0018 SETMBR R1 K15 R2 + 0xB80A2400, // 0019 GETNGBL R2 K18 + 0x90062202, // 001A SETMBR R1 K17 R2 + 0xB80A2800, // 001B GETNGBL R2 K20 + 0x90062602, // 001C SETMBR R1 K19 R2 + 0xB80A2C00, // 001D GETNGBL R2 K22 + 0x90062A02, // 001E SETMBR R1 K21 R2 + 0x4C080000, // 001F LDNIL R2 + 0x80040400, // 0020 RET 1 R2 + }) + ) +); +/*******************************************************************/ + +/* @const_object_info_begin +module lv_tasmota (scope: global) { + init, closure(lv_tasmota_init_closure) + + start, func(lv0_start) + + font_montserrat, func(lv0_load_montserrat_font) + montserrat_font, func(lv0_load_montserrat_font) + font_seg7, func(lv0_load_seg7_font) + seg7_font, func(lv0_load_seg7_font) + register_button_encoder, func(lv0_register_button_encoder) + screenshot, func(lv0_screenshot) + + load_freetype_font, func(lv0_load_freetype_font) +} +@const_object_info_end */ +#include "../generate/be_fixed_lv_tasmota.h" + +#endif // USE_LVGL \ No newline at end of file diff --git a/lib/libesp32/berry/default/be_modtab.c b/lib/libesp32/berry/default/be_modtab.c index 86ce0244f..9a3aa2daf 100644 --- a/lib/libesp32/berry/default/be_modtab.c +++ b/lib/libesp32/berry/default/be_modtab.c @@ -44,6 +44,7 @@ be_extern_native_module(unishox); be_extern_native_module(animate); #ifdef USE_LVGL be_extern_native_module(lv); +be_extern_native_module(lv_tasmota); #endif // USE_LVGL /* user-defined modules declare start */ @@ -118,6 +119,7 @@ BERRY_LOCAL const bntvmodule* const be_module_table[] = { #ifdef USE_LVGL &be_native_module(lv), + &be_native_module(lv_tasmota), #endif // USE_LVGL #ifdef USE_ENERGY_SENSOR &be_native_module(energy), diff --git a/lib/libesp32/berry/default/embedded/lv_tasmota.be b/lib/libesp32/berry/default/embedded/lv_tasmota.be new file mode 100644 index 000000000..5be5733d3 --- /dev/null +++ b/lib/libesp32/berry/default/embedded/lv_tasmota.be @@ -0,0 +1,36 @@ +#- ------------------------------------------------------------ -# +# Module `lv_tasmota` - piggybacks on `lv` to extend it +#- ------------------------------------------------------------ -# +lv_tasmota = module("lv_tasmota") + +# rename `lv` to `lv_ntv` and replace `lv` with `lv_tasmota` +def init(lv_tasmota) + import lv + lv.start = lv_tasmota.start + + lv.font_montserrat = lv_tasmota.font_montserrat + lv.montserrat_font = lv_tasmota.font_montserrat + + lv.font_seg7 = lv_tasmota.font_seg7 + lv.seg7_font = lv_tasmota.font_seg7 + + lv.load_freetype_font = lv_tasmota.load_freetype_font + + lv.register_button_encoder = lv_tasmota.register_button_encoder + lv.screenshot = lv_tasmota.screenshot + + # add widgets + lv.clock_icon = lv_clock_icon + lv.signal_arcs = lv_signal_arcs + lv.signal_bars = lv_signal_bars + lv.wifi_arcs_icon = lv_wifi_arcs_icon + lv.wifi_arcs = lv_wifi_arcs + lv.wifi_bars_icon = lv_wifi_bars_icon + lv.wifi_bars = lv_wifi_bars + + return nil +end + +lv_tasmota.init = init + +return lv_tasmota diff --git a/lib/libesp32/berry/gen.sh b/lib/libesp32/berry/gen.sh index 0dc462474..e52d74a28 100755 --- a/lib/libesp32/berry/gen.sh +++ b/lib/libesp32/berry/gen.sh @@ -1,2 +1,2 @@ #!/bin/bash -python3 tools/pycoc/main.py -o generate src default ../berry_mapping/src ../../libesp32_lvgl/lv_berry/src -c default/berry_conf.h +python3 tools/pycoc/main.py -o generate src default ../berry_mapping/src ../../libesp32_lvgl/lv_berry/src ../../libesp32_lvgl/lv_berry/generate -c default/berry_conf.h diff --git a/lib/libesp32/berry/generate/be_const_strtab.h b/lib/libesp32/berry/generate/be_const_strtab.h index 04e6b5e29..f7526ea2b 100644 --- a/lib/libesp32/berry/generate/be_const_strtab.h +++ b/lib/libesp32/berry/generate/be_const_strtab.h @@ -264,6 +264,7 @@ extern const bcstring be_const_str_classof; extern const bcstring be_const_str_clear; extern const bcstring be_const_str_clear_first_time; extern const bcstring be_const_str_clear_to; +extern const bcstring be_const_str_clock_icon; extern const bcstring be_const_str_close; extern const bcstring be_const_str_closure; extern const bcstring be_const_str_cmd; @@ -362,6 +363,8 @@ extern const bcstring be_const_str_find_op; extern const bcstring be_const_str_finish; extern const bcstring be_const_str_floor; extern const bcstring be_const_str_flush; +extern const bcstring be_const_str_font_montserrat; +extern const bcstring be_const_str_font_seg7; extern const bcstring be_const_str_for; extern const bcstring be_const_str_format; extern const bcstring be_const_str_from_to; @@ -469,6 +472,7 @@ extern const bcstring be_const_str_list; extern const bcstring be_const_str_list_handlers; extern const bcstring be_const_str_listdir; extern const bcstring be_const_str_load; +extern const bcstring be_const_str_load_freetype_font; extern const bcstring be_const_str_load_templates; extern const bcstring be_const_str_local; extern const bcstring be_const_str_log; @@ -477,10 +481,18 @@ extern const bcstring be_const_str_loop; extern const bcstring be_const_str_lower; extern const bcstring be_const_str_lv; extern const bcstring be_const_str_lv_; +extern const bcstring be_const_str_lv_clock_icon; extern const bcstring be_const_str_lv_event; extern const bcstring be_const_str_lv_event_cb; +extern const bcstring be_const_str_lv_module_init; extern const bcstring be_const_str_lv_obj; extern const bcstring be_const_str_lv_obj_class; +extern const bcstring be_const_str_lv_signal_arcs; +extern const bcstring be_const_str_lv_signal_bars; +extern const bcstring be_const_str_lv_wifi_arcs; +extern const bcstring be_const_str_lv_wifi_arcs_icon; +extern const bcstring be_const_str_lv_wifi_bars; +extern const bcstring be_const_str_lv_wifi_bars_icon; extern const bcstring be_const_str_lvgl_event_dispatch; extern const bcstring be_const_str_make_cb; extern const bcstring be_const_str_map; @@ -494,6 +506,7 @@ extern const bcstring be_const_str_min; extern const bcstring be_const_str_minute; extern const bcstring be_const_str_module; extern const bcstring be_const_str_month; +extern const bcstring be_const_str_montserrat_font; extern const bcstring be_const_str_name; extern const bcstring be_const_str_nan; extern const bcstring be_const_str_nil; @@ -559,6 +572,7 @@ extern const bcstring be_const_str_real; extern const bcstring be_const_str_reapply; extern const bcstring be_const_str_redirect; extern const bcstring be_const_str_refr_size; +extern const bcstring be_const_str_register_button_encoder; extern const bcstring be_const_str_register_obj; extern const bcstring be_const_str_remote_ip; extern const bcstring be_const_str_remote_port; @@ -594,6 +608,7 @@ extern const bcstring be_const_str_save; extern const bcstring be_const_str_save_before_restart; extern const bcstring be_const_str_scale_uint; extern const bcstring be_const_str_scan; +extern const bcstring be_const_str_screenshot; extern const bcstring be_const_str_search; extern const bcstring be_const_str_sec; extern const bcstring be_const_str_seg7_font; @@ -637,6 +652,8 @@ extern const bcstring be_const_str_setrange; extern const bcstring be_const_str_settings; extern const bcstring be_const_str_shared_key; extern const bcstring be_const_str_show; +extern const bcstring be_const_str_signal_arcs; +extern const bcstring be_const_str_signal_bars; extern const bcstring be_const_str_sin; extern const bcstring be_const_str_sinh; extern const bcstring be_const_str_size; @@ -729,6 +746,10 @@ extern const bcstring be_const_str_widget_width_def; extern const bcstring be_const_str_width; extern const bcstring be_const_str_width_def; extern const bcstring be_const_str_wifi; +extern const bcstring be_const_str_wifi_arcs; +extern const bcstring be_const_str_wifi_arcs_icon; +extern const bcstring be_const_str_wifi_bars; +extern const bcstring be_const_str_wifi_bars_icon; extern const bcstring be_const_str_wire; extern const bcstring be_const_str_wire1; extern const bcstring be_const_str_wire2; diff --git a/lib/libesp32/berry/generate/be_const_strtab_def.h b/lib/libesp32/berry/generate/be_const_strtab_def.h index 50a9e80fd..f94c50ff5 100644 --- a/lib/libesp32/berry/generate/be_const_strtab_def.h +++ b/lib/libesp32/berry/generate/be_const_strtab_def.h @@ -1,678 +1,695 @@ -be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_read8); -be_define_const_str(_X0A, "\n", 252472541u, 0, 1, &be_const_str_CFG_X3A_X20could_X20not_X20run_X20_X25s_X20_X28_X25s_X20_X2D_X20_X25s_X29); -be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_AudioFileSource); +be_define_const_str(, "", 2166136261u, 0, 0, &be_const_str_assert); +be_define_const_str(_X0A, "\n", 252472541u, 0, 1, NULL); +be_define_const_str(_X20, " ", 621580159u, 0, 1, &be_const_str_allocated); be_define_const_str(_X21_X3D, "!=", 2428715011u, 0, 2, NULL); -be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, NULL); -be_define_const_str(_X23, "#", 638357778u, 0, 1, NULL); -be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str__X23display_X2Eini); -be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, NULL); -be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, NULL); -be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_get_option); -be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str__write); -be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str__X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X21_X3D_X3D, "!==", 559817114u, 0, 3, &be_const_str_editable); +be_define_const_str(_X23, "#", 638357778u, 0, 1, &be_const_str_has_arg); +be_define_const_str(_X23autoexec_X2Ebat, "#autoexec.bat", 3382890497u, 0, 13, &be_const_str___lower__); +be_define_const_str(_X23autoexec_X2Ebe, "#autoexec.be", 1181757091u, 0, 12, &be_const_str_enabled); +be_define_const_str(_X23display_X2Eini, "#display.ini", 182218220u, 0, 12, &be_const_str_AudioGeneratorMP3); +be_define_const_str(_X23init_X2Ebat, "#init.bat", 3297595077u, 0, 9, &be_const_str_set_text); +be_define_const_str(_X23preinit_X2Ebe, "#preinit.be", 687035716u, 0, 11, &be_const_str_group_def); +be_define_const_str(_X2502d_X25s_X2502d, "%02d%s%02d", 1587999717u, 0, 10, &be_const_str_is_running); be_define_const_str(_X2504d_X2D_X2502d_X2D_X2502dT_X2502d_X3A_X2502d_X3A_X2502d, "%04d-%02d-%02dT%02d:%02d:%02d", 3425528601u, 0, 29, NULL); -be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_number); -be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, &be_const_str_CFG_X3A_X20loading_X20_X27_X25s_X27); -be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_couldn_X27t_X20not_X20initialize_X20noepixelbus); -be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, &be_const_str_AXP192); -be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str__X2Ep2); -be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_k); -be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_i2c_enabled); -be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_CFG_X3A_X20removing_X20first_X20time_X20marker); -be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_arch); -be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_no_X20GPIO_X20specified_X20for_X20neopixelbus); -be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_draw_line); -be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_set_power); -be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_set); -be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, &be_const_str_cb_do_nothing); +be_define_const_str(_X25s_X2Eautoconf, "%s.autoconf", 3560383524u, 0, 11, &be_const_str_strptime); +be_define_const_str(_X26lt_X3BError_X3A_X20apply_X20new_X20or_X20remove_X26gt_X3B, "<Error: apply new or remove>", 2855507949u, 0, 34, NULL); +be_define_const_str(_X26lt_X3BNone_X26gt_X3B, "<None>", 2602165498u, 0, 12, &be_const_str_Restart_X201); +be_define_const_str(_X28_X29, "()", 685372826u, 0, 2, NULL); +be_define_const_str(_X2B, "+", 772578730u, 0, 1, &be_const_str_y1); +be_define_const_str(_X2C, ",", 688690635u, 0, 1, &be_const_str_pc_abs); +be_define_const_str(_X2D_X2D_X3A_X2D_X2D, "--:--", 1370615441u, 0, 5, &be_const_str_toptr); +be_define_const_str(_X2E, ".", 722245873u, 0, 1, &be_const_str_collect); +be_define_const_str(_X2E_X2E, "..", 2748622605u, 0, 2, &be_const_str_SERIAL_7O1); +be_define_const_str(_X2Eautoconf, ".autoconf", 2524679088u, 0, 9, &be_const_str_get_alternate); +be_define_const_str(_X2Ebe, ".be", 1325797348u, 0, 3, &be_const_str_height_def); +be_define_const_str(_X2Ebec, ".bec", 3985273221u, 0, 4, &be_const_str_CFG_X3A_X20multiple_X20autoconf_X20files_X20found_X2C_X20aborting_X20_X28_X27_X25s_X27_X20_X2B_X20_X27_X25s_X27_X29); +be_define_const_str(_X2Elen, ".len", 850842136u, 0, 4, &be_const_str_digital_write); +be_define_const_str(_X2Ep, ".p", 1171526419u, 0, 2, NULL); be_define_const_str(_X2Ep1, ".p1", 249175686u, 0, 3, NULL); -be_define_const_str(_X2Ep2, ".p2", 232398067u, 0, 3, &be_const_str_show); -be_define_const_str(_X2Esize, ".size", 1965188224u, 0, 5, &be_const_str__def); -be_define_const_str(_X2Etapp, ".tapp", 1363391594u, 0, 5, &be_const_str_on); -be_define_const_str(_X2Ew, ".w", 1255414514u, 0, 2, &be_const_str_CFG_X3A_X20loaded_X20_X27_X25s_X27); -be_define_const_str(_X2F, "/", 705468254u, 0, 1, &be_const_str_get_input_power_status); -be_define_const_str(_X2F_X2Eautoconf, "/.autoconf", 2212074393u, 0, 10, NULL); -be_define_const_str(_X2F_X3Frst_X3D, "/?rst=", 580074707u, 0, 6, &be_const_str_global); -be_define_const_str(_X2Fac, "/ac", 3904651978u, 0, 3, &be_const_str_a); -be_define_const_str(_X3A, ":", 1057798253u, 0, 1, &be_const_str_OneWire); -be_define_const_str(_X3C, "<", 957132539u, 0, 1, &be_const_str_pow); -be_define_const_str(_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 3546571739u, 0, 11, &be_const_str_pixels_buffer); -be_define_const_str(_X3C_X2Fselect_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 1863865923u, 0, 16, &be_const_str_get_style_pad_right); -be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str_json); -be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str__X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20); -be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_add_rule); -be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str__X3D); -be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "Choose a device configuration:
", 1336654704u, 0, 49, &be_const_str_SK6812_GRBW); -be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str_get_bri); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_battery_present); -be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str_connect); -be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, &be_const_str_CFG_X3A_X20loading_X20); -be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str__lvgl); -be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_exec_rules); -be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_CFG_X3A_X20no_X20_X27_X2A_X2Eautoconf_X27_X20file_X20found); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E_X26_X23129668_X3B_X20Auto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 452285201u, 0, 120, &be_const_str_AudioOutput); -be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_leds); -be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str__); -be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "

", 1863865923u, 0, 16, &be_const_str_content_send); +be_define_const_str(_X3C_X3D, "<=", 2499223986u, 0, 2, &be_const_str__X3E); +be_define_const_str(_X3Cbutton_X20name_X3D_X27reapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3ERe_X2Dapply_X20current_X20configuration_X3C_X2Fbutton_X3E, "", 3147934216u, 0, 82, &be_const_str_compile); +be_define_const_str(_X3Cbutton_X20name_X3D_X27zipapply_X27_X20class_X3D_X27button_X20bgrn_X27_X3EApply_X20configuration_X3C_X2Fbutton_X3E, "", 1205771629u, 0, 72, &be_const_str_Timer); +be_define_const_str(_X3Cfieldset_X3E_X3Cstyle_X3E_X2Ebdis_X7Bbackground_X3A_X23888_X3B_X7D_X2Ebdis_X3Ahover_X7Bbackground_X3A_X23888_X3B_X7D_X3C_X2Fstyle_X3E, "
", 842307168u, 0, 77, &be_const_str_pi); +be_define_const_str(_X3Cinstance_X3A_X20_X25s_X28_X25s_X2C_X20_X25s_X2C_X20_X25s_X29, "Choose a device configuration:
", 1336654704u, 0, 49, &be_const_str__X3Cp_X3E_X3Csmall_X3E_X26nbsp_X3B_X28This_X20feature_X20requires_X20an_X20internet_X20connection_X29_X3C_X2Fsmall_X3E_X3C_X2Fp_X3E); +be_define_const_str(_X3Clambda_X3E, "", 607256038u, 0, 8, &be_const_str__read); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27Autoconfiguration_X27_X3E_X26nbsp_X3BCurrent_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Current auto-configuration", 4212500780u, 0, 82, &be_const_str_code); +be_define_const_str(_X3Clegend_X3E_X3Cb_X20title_X3D_X27New_X20autoconf_X27_X3E_X26nbsp_X3BSelect_X20new_X20auto_X2Dconfiguration_X3C_X2Fb_X3E_X3C_X2Flegend_X3E, " Select new auto-configuration", 1926223891u, 0, 80, &be_const_str__end_transmission); +be_define_const_str(_X3Coption_X20value_X3D_X27_X25s_X27_X3E_X25s_X3C_X2Foption_X3E, "", 510303524u, 0, 30, NULL); +be_define_const_str(_X3Coption_X20value_X3D_X27reset_X27_X3E_X26lt_X3BRemove_X20autoconf_X26gt_X3B_X3C_X2Foption_X3E, "", 3994619755u, 0, 54, &be_const_str_event_cb); +be_define_const_str(_X3Cp_X20style_X3D_X27width_X3A340px_X3B_X27_X3E_X3Cb_X3EException_X3A_X3C_X2Fb_X3E_X3Cbr_X3E_X27_X25s_X27_X3Cbr_X3E_X25s_X3C_X2Fp_X3E, "

Exception:
'%s'
%s

", 4252565082u, 0, 59, &be_const_str_width_def); +be_define_const_str(_X3Cp_X3E_X3C_X2Fp_X3E_X3C_X2Ffieldset_X3E_X3Cp_X3E_X3C_X2Fp_X3E, "

", 2052843416u, 0, 25, &be_const_str_Unknown_X20command); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dac_X20action_X3D_X27ac_X27_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20method_X3D_X27get_X27_X3E_X3Cbutton_X3E_X26_X23129668_X3B_X20Auto_X2Dconfiguration_X3C_X2Fbutton_X3E_X3C_X2Fform_X3E_X3C_X2Fp_X3E, "

", 452285201u, 0, 120, &be_const_str__energy); +be_define_const_str(_X3Cp_X3E_X3Cform_X20id_X3Dreapply_X20style_X3D_X27display_X3A_X20block_X3B_X27_X20action_X3D_X27_X2Fac_X27_X20method_X3D_X27post_X27_X20, "

 (This feature requires an internet connection)

", 2719266486u, 0, 74, &be_const_str_color); +be_define_const_str(_X3Cp_X3ECurrent_X20configuration_X3A_X20_X3C_X2Fp_X3E_X3Cp_X3E_X3Cb_X3E_X25s_X3C_X2Fb_X3E_X3C_X2Fp_X3E, "

Current configuration:

%s

", 4115655761u, 0, 46, &be_const_str_static); +be_define_const_str(_X3Cselect_X20name_X3D_X27zip_X27_X3E, "