From 7e53dd87fd4f94a62de72f799b0e824d4023545e Mon Sep 17 00:00:00 2001 From: philmoz Date: Thu, 2 Oct 2025 13:12:03 +1000 Subject: [PATCH] feat(color): start of UI for 3.0 (#5685) --- .../320x240/default_theme/mask_btn_close.png | Bin 0 -> 466 bytes .../320x240/default_theme/mask_btn_next.png | Bin 0 -> 290 bytes .../320x240/default_theme/mask_btn_prev.png | Bin 0 -> 334 bytes .../320x240/default_theme/mask_edgetx.png | Bin 1632 -> 548 bytes .../320x240/default_theme/mask_menu_model.png | Bin 713 -> 560 bytes .../default_theme/mask_menu_model_select.png | Bin 784 -> 412 bytes .../320x240/default_theme/mask_menu_notes.png | Bin 597 -> 378 bytes .../320x240/default_theme/mask_menu_radio.png | Bin 772 -> 519 bytes .../320x240/default_theme/mask_menu_stats.png | Bin 734 -> 494 bytes .../320x240/default_theme/mask_menu_theme.png | Bin 645 -> 405 bytes .../default_theme/mask_model_curves.png | Bin 689 -> 494 bytes .../default_theme/mask_model_flight_modes.png | Bin 748 -> 592 bytes .../default_theme/mask_model_grid_large.png | Bin 1677 -> 382 bytes .../default_theme/mask_model_grid_small.png | Bin 1710 -> 500 bytes .../default_theme/mask_model_gvars.png | Bin 626 -> 457 bytes .../320x240/default_theme/mask_model_heli.png | Bin 670 -> 565 bytes .../default_theme/mask_model_inputs.png | Bin 666 -> 440 bytes .../default_theme/mask_model_list_one.png | Bin 1400 -> 267 bytes .../default_theme/mask_model_list_two.png | Bin 1563 -> 324 bytes .../mask_model_logical_switches.png | Bin 764 -> 609 bytes .../default_theme/mask_model_lua_scripts.png | Bin 729 -> 566 bytes .../default_theme/mask_model_mixer.png | Bin 755 -> 500 bytes .../default_theme/mask_model_outputs.png | Bin 772 -> 530 bytes .../default_theme/mask_model_setup.png | Bin 585 -> 635 bytes .../mask_model_special_functions.png | Bin 660 -> 470 bytes .../default_theme/mask_model_telemetry.png | Bin 1147 -> 568 bytes .../320x240/default_theme/mask_monitor.png | Bin 832 -> 620 bytes .../default_theme/mask_monitor_channels1.png | Bin 722 -> 0 bytes .../default_theme/mask_monitor_channels2.png | Bin 728 -> 0 bytes .../default_theme/mask_monitor_channels3.png | Bin 734 -> 0 bytes .../default_theme/mask_monitor_channels4.png | Bin 735 -> 0 bytes .../default_theme/mask_monitor_gvars.png | Bin 626 -> 0 bytes .../default_theme/mask_monitor_logsw.png | Bin 743 -> 586 bytes .../default_theme/mask_radio_edit_theme.png | Bin 1656 -> 644 bytes .../mask_radio_global_functions.png | Bin 742 -> 577 bytes .../default_theme/mask_radio_hardware.png | Bin 691 -> 486 bytes .../default_theme/mask_radio_sd_browser.png | Bin 735 -> 570 bytes .../default_theme/mask_radio_setup.png | Bin 784 -> 635 bytes .../default_theme/mask_radio_tools.png | Bin 769 -> 501 bytes .../default_theme/mask_radio_trainer.png | Bin 714 -> 576 bytes .../default_theme/mask_radio_version.png | Bin 546 -> 372 bytes .../default_theme/mask_stats_debug.png | Bin 612 -> 411 bytes .../mask_stats_throttle_graph.png | Bin 723 -> 0 bytes .../default_theme/mask_theme_add_view.png | Bin 584 -> 343 bytes .../default_theme/mask_theme_setup.png | Bin 534 -> 299 bytes .../default_theme/mask_theme_view1.png | Bin 615 -> 264 bytes .../default_theme/mask_theme_view10.png | Bin 863 -> 379 bytes .../default_theme/mask_theme_view2.png | Bin 674 -> 346 bytes .../default_theme/mask_theme_view3.png | Bin 704 -> 366 bytes .../default_theme/mask_theme_view4.png | Bin 659 -> 330 bytes .../default_theme/mask_theme_view5.png | Bin 702 -> 352 bytes .../default_theme/mask_theme_view6.png | Bin 727 -> 345 bytes .../default_theme/mask_theme_view7.png | Bin 618 -> 322 bytes .../default_theme/mask_theme_view8.png | Bin 738 -> 370 bytes .../default_theme/mask_theme_view9.png | Bin 506 -> 363 bytes .../320x240/default_theme/mask_tools_apps.png | Bin 0 -> 606 bytes .../default_theme/mask_tools_reset.png | Bin 0 -> 602 bytes .../320x240/default_theme/mask_top_logo.png | Bin 0 -> 948 bytes .../320x240/default_theme/mask_topright.png | Bin 0 -> 1845 bytes .../480x272/default_theme/mask_btn_close.png | Bin 0 -> 422 bytes .../480x272/default_theme/mask_btn_next.png | Bin 0 -> 310 bytes .../480x272/default_theme/mask_btn_prev.png | Bin 0 -> 310 bytes .../480x272/default_theme/mask_edgetx.png | Bin 5000 -> 664 bytes .../480x272/default_theme/mask_menu_model.png | Bin 873 -> 673 bytes .../default_theme/mask_menu_model_select.png | Bin 1287 -> 465 bytes .../480x272/default_theme/mask_menu_notes.png | Bin 474 -> 382 bytes .../480x272/default_theme/mask_menu_radio.png | Bin 1194 -> 634 bytes .../480x272/default_theme/mask_menu_stats.png | Bin 978 -> 629 bytes .../480x272/default_theme/mask_menu_theme.png | Bin 674 -> 445 bytes .../default_theme/mask_model_curves.png | Bin 814 -> 563 bytes .../default_theme/mask_model_flight_modes.png | Bin 1081 -> 688 bytes .../default_theme/mask_model_grid_large.png | Bin 2117 -> 255 bytes .../default_theme/mask_model_grid_small.png | Bin 2070 -> 237 bytes .../default_theme/mask_model_gvars.png | Bin 807 -> 507 bytes .../480x272/default_theme/mask_model_heli.png | Bin 671 -> 677 bytes .../default_theme/mask_model_inputs.png | Bin 796 -> 487 bytes .../default_theme/mask_model_list_one.png | Bin 1839 -> 177 bytes .../default_theme/mask_model_list_two.png | Bin 1986 -> 180 bytes .../mask_model_logical_switches.png | Bin 1222 -> 702 bytes .../default_theme/mask_model_lua_scripts.png | Bin 980 -> 673 bytes .../default_theme/mask_model_mixer.png | Bin 1090 -> 611 bytes .../default_theme/mask_model_outputs.png | Bin 1063 -> 665 bytes .../default_theme/mask_model_setup.png | Bin 604 -> 798 bytes .../mask_model_special_functions.png | Bin 811 -> 522 bytes .../default_theme/mask_model_telemetry.png | Bin 1095 -> 678 bytes .../480x272/default_theme/mask_monitor.png | Bin 1200 -> 781 bytes .../default_theme/mask_monitor_channels1.png | Bin 1083 -> 0 bytes .../default_theme/mask_monitor_channels2.png | Bin 1076 -> 0 bytes .../default_theme/mask_monitor_channels3.png | Bin 1076 -> 0 bytes .../default_theme/mask_monitor_channels4.png | Bin 1079 -> 0 bytes .../default_theme/mask_monitor_gvars.png | Bin 698 -> 0 bytes .../default_theme/mask_monitor_logsw.png | Bin 1078 -> 740 bytes .../default_theme/mask_radio_edit_theme.png | Bin 1176 -> 835 bytes .../mask_radio_global_functions.png | Bin 1049 -> 635 bytes .../default_theme/mask_radio_hardware.png | Bin 686 -> 554 bytes .../default_theme/mask_radio_sd_browser.png | Bin 1091 -> 699 bytes .../default_theme/mask_radio_setup.png | Bin 1326 -> 798 bytes .../default_theme/mask_radio_tools.png | Bin 1195 -> 590 bytes .../default_theme/mask_radio_trainer.png | Bin 1032 -> 614 bytes .../default_theme/mask_radio_version.png | Bin 544 -> 433 bytes .../default_theme/mask_stats_debug.png | Bin 641 -> 487 bytes .../mask_stats_throttle_graph.png | Bin 860 -> 0 bytes .../default_theme/mask_theme_add_view.png | Bin 545 -> 361 bytes .../default_theme/mask_theme_setup.png | Bin 425 -> 319 bytes .../default_theme/mask_theme_view1.png | Bin 400 -> 290 bytes .../default_theme/mask_theme_view10.png | Bin 3345 -> 475 bytes .../default_theme/mask_theme_view2.png | Bin 525 -> 390 bytes .../default_theme/mask_theme_view3.png | Bin 597 -> 410 bytes .../default_theme/mask_theme_view4.png | Bin 506 -> 369 bytes .../default_theme/mask_theme_view5.png | Bin 549 -> 404 bytes .../default_theme/mask_theme_view6.png | Bin 625 -> 415 bytes .../default_theme/mask_theme_view7.png | Bin 486 -> 349 bytes .../default_theme/mask_theme_view8.png | Bin 659 -> 420 bytes .../default_theme/mask_theme_view9.png | Bin 3197 -> 411 bytes .../480x272/default_theme/mask_tools_apps.png | Bin 0 -> 745 bytes .../default_theme/mask_tools_reset.png | Bin 0 -> 767 bytes .../480x272/default_theme/mask_top_logo.png | Bin 0 -> 974 bytes .../480x272/default_theme/mask_topright.png | Bin 0 -> 1599 bytes .../800x480/default_theme/mask_btn_close.png | Bin 0 -> 683 bytes .../800x480/default_theme/mask_btn_next.png | Bin 0 -> 378 bytes .../800x480/default_theme/mask_btn_prev.png | Bin 0 -> 374 bytes .../800x480/default_theme/mask_edgetx.png | Bin 2335 -> 892 bytes .../800x480/default_theme/mask_menu_model.png | Bin 1456 -> 988 bytes .../default_theme/mask_menu_model_select.png | Bin 1680 -> 562 bytes .../800x480/default_theme/mask_menu_notes.png | Bin 930 -> 532 bytes .../800x480/default_theme/mask_menu_radio.png | Bin 1670 -> 862 bytes .../800x480/default_theme/mask_menu_stats.png | Bin 1463 -> 787 bytes .../800x480/default_theme/mask_menu_theme.png | Bin 1000 -> 626 bytes .../default_theme/mask_model_curves.png | Bin 1119 -> 780 bytes .../default_theme/mask_model_flight_modes.png | Bin 1326 -> 1015 bytes .../default_theme/mask_model_grid_large.png | Bin 2148 -> 349 bytes .../default_theme/mask_model_grid_small.png | Bin 2112 -> 606 bytes .../default_theme/mask_model_gvars.png | Bin 1074 -> 688 bytes .../800x480/default_theme/mask_model_heli.png | Bin 1285 -> 919 bytes .../default_theme/mask_model_inputs.png | Bin 1154 -> 729 bytes .../default_theme/mask_model_list_one.png | Bin 1474 -> 234 bytes .../default_theme/mask_model_list_two.png | Bin 1654 -> 250 bytes .../mask_model_logical_switches.png | Bin 1449 -> 1088 bytes .../default_theme/mask_model_lua_scripts.png | Bin 1377 -> 1008 bytes .../default_theme/mask_model_mixer.png | Bin 1560 -> 875 bytes .../default_theme/mask_model_outputs.png | Bin 1473 -> 924 bytes .../default_theme/mask_model_setup.png | Bin 884 -> 1197 bytes .../mask_model_special_functions.png | Bin 1103 -> 722 bytes .../default_theme/mask_model_telemetry.png | Bin 3334 -> 1011 bytes .../800x480/default_theme/mask_monitor.png | Bin 1767 -> 1158 bytes .../default_theme/mask_monitor_channels1.png | Bin 1357 -> 0 bytes .../default_theme/mask_monitor_channels2.png | Bin 1369 -> 0 bytes .../default_theme/mask_monitor_channels3.png | Bin 1379 -> 0 bytes .../default_theme/mask_monitor_channels4.png | Bin 1398 -> 0 bytes .../default_theme/mask_monitor_gvars.png | Bin 1002 -> 0 bytes .../default_theme/mask_monitor_logsw.png | Bin 1295 -> 1043 bytes .../default_theme/mask_radio_edit_theme.png | Bin 4090 -> 1219 bytes .../mask_radio_global_functions.png | Bin 1332 -> 938 bytes .../default_theme/mask_radio_hardware.png | Bin 1291 -> 708 bytes .../default_theme/mask_radio_sd_browser.png | Bin 1369 -> 920 bytes .../default_theme/mask_radio_setup.png | Bin 1697 -> 1197 bytes .../default_theme/mask_radio_tools.png | Bin 1557 -> 880 bytes .../default_theme/mask_radio_trainer.png | Bin 1295 -> 926 bytes .../default_theme/mask_radio_version.png | Bin 830 -> 551 bytes .../default_theme/mask_stats_debug.png | Bin 944 -> 684 bytes .../mask_stats_throttle_graph.png | Bin 1260 -> 0 bytes .../default_theme/mask_theme_add_view.png | Bin 850 -> 486 bytes .../default_theme/mask_theme_setup.png | Bin 719 -> 407 bytes .../default_theme/mask_theme_view1.png | Bin 959 -> 424 bytes .../default_theme/mask_theme_view10.png | Bin 1611 -> 625 bytes .../default_theme/mask_theme_view2.png | Bin 1205 -> 545 bytes .../default_theme/mask_theme_view3.png | Bin 1264 -> 602 bytes .../default_theme/mask_theme_view4.png | Bin 1173 -> 500 bytes .../default_theme/mask_theme_view5.png | Bin 1252 -> 544 bytes .../default_theme/mask_theme_view6.png | Bin 1291 -> 578 bytes .../default_theme/mask_theme_view7.png | Bin 1043 -> 481 bytes .../default_theme/mask_theme_view8.png | Bin 1345 -> 607 bytes .../default_theme/mask_theme_view9.png | Bin 831 -> 569 bytes .../800x480/default_theme/mask_tools_apps.png | Bin 0 -> 1085 bytes .../default_theme/mask_tools_reset.png | Bin 0 -> 1071 bytes .../800x480/default_theme/mask_top_logo.png | Bin 0 -> 1453 bytes .../800x480/default_theme/mask_topright.png | Bin 0 -> 2373 bytes radio/src/gui/128x64/model_flightmodes.cpp | 2 +- radio/src/gui/128x64/model_select.cpp | 4 +- radio/src/gui/212x64/model_select.cpp | 4 +- radio/src/gui/colorlcd/CMakeLists.txt | 7 +- radio/src/gui/colorlcd/bitmaps.cpp | 53 +- radio/src/gui/colorlcd/bitmaps.h | 15 +- radio/src/gui/colorlcd/colors.h | 1 + radio/src/gui/colorlcd/libui/button.cpp | 3 +- radio/src/gui/colorlcd/libui/etx_lv_theme.cpp | 18 + radio/src/gui/colorlcd/libui/etx_lv_theme.h | 4 +- radio/src/gui/colorlcd/libui/form.h | 1 - radio/src/gui/colorlcd/libui/layer.cpp | 11 + radio/src/gui/colorlcd/libui/layer.h | 1 + .../gui/colorlcd/libui/libopenui_defines.h | 2 - .../src/gui/colorlcd/libui/list_line_button.h | 6 +- radio/src/gui/colorlcd/libui/mainwindow.cpp | 5 +- radio/src/gui/colorlcd/libui/page.cpp | 102 +- radio/src/gui/colorlcd/libui/page.h | 15 +- radio/src/gui/colorlcd/libui/tabsgroup.cpp | 370 ------ radio/src/gui/colorlcd/libui/tabsgroup.h | 107 -- radio/src/gui/colorlcd/libui/window.cpp | 50 +- radio/src/gui/colorlcd/libui/window.h | 16 +- .../src/gui/colorlcd/mainview/menu_screen.cpp | 89 -- radio/src/gui/colorlcd/mainview/menu_screen.h | 39 - .../gui/colorlcd/mainview/screen_setup.cpp | 104 +- .../src/gui/colorlcd/mainview/screen_setup.h | 27 +- .../mainview/screen_user_interface.cpp | 116 +- .../colorlcd/mainview/screen_user_interface.h | 8 +- .../colorlcd/mainview/select_fab_carousel.cpp | 144 --- .../colorlcd/mainview/select_fab_carousel.h | 45 - radio/src/gui/colorlcd/mainview/topbar.cpp | 4 +- .../src/gui/colorlcd/mainview/topbar_impl.cpp | 16 +- .../src/gui/colorlcd/mainview/view_about.cpp | 51 - radio/src/gui/colorlcd/mainview/view_about.h | 31 - .../gui/colorlcd/mainview/view_channels.cpp | 53 +- .../src/gui/colorlcd/mainview/view_channels.h | 15 +- .../mainview/view_logical_switches.cpp | 4 +- .../colorlcd/mainview/view_logical_switches.h | 6 +- radio/src/gui/colorlcd/mainview/view_main.cpp | 31 +- radio/src/gui/colorlcd/mainview/view_main.h | 4 +- .../gui/colorlcd/mainview/view_main_menu.cpp | 163 --- .../gui/colorlcd/mainview/view_main_menu.h | 40 - .../gui/colorlcd/mainview/view_statistics.cpp | 33 - .../gui/colorlcd/mainview/view_statistics.h | 21 +- .../gui/colorlcd/mainview/widgets_setup.cpp | 10 +- .../gui/colorlcd/model/function_switches.cpp | 4 +- radio/src/gui/colorlcd/model/menu_model.cpp | 103 -- radio/src/gui/colorlcd/model/menu_model.h | 46 - radio/src/gui/colorlcd/model/model_curves.cpp | 2 +- radio/src/gui/colorlcd/model/model_curves.h | 7 +- .../gui/colorlcd/model/model_flightmodes.cpp | 4 +- .../gui/colorlcd/model/model_flightmodes.h | 6 +- radio/src/gui/colorlcd/model/model_gvars.cpp | 6 +- radio/src/gui/colorlcd/model/model_gvars.h | 6 +- radio/src/gui/colorlcd/model/model_heli.cpp | 18 +- radio/src/gui/colorlcd/model/model_heli.h | 9 +- radio/src/gui/colorlcd/model/model_inputs.cpp | 2 +- radio/src/gui/colorlcd/model/model_inputs.h | 4 +- .../colorlcd/model/model_logical_switches.cpp | 4 +- .../colorlcd/model/model_logical_switches.h | 6 +- .../colorlcd/model/model_mixer_scripts.cpp | 4 +- .../gui/colorlcd/model/model_mixer_scripts.h | 6 +- radio/src/gui/colorlcd/model/model_mixes.cpp | 2 +- radio/src/gui/colorlcd/model/model_mixes.h | 4 +- .../src/gui/colorlcd/model/model_outputs.cpp | 4 +- radio/src/gui/colorlcd/model/model_outputs.h | 7 +- radio/src/gui/colorlcd/model/model_select.cpp | 49 +- radio/src/gui/colorlcd/model/model_select.h | 1 - radio/src/gui/colorlcd/model/model_setup.cpp | 14 +- radio/src/gui/colorlcd/model/model_setup.h | 8 +- .../gui/colorlcd/model/model_telemetry.cpp | 6 +- .../src/gui/colorlcd/model/model_telemetry.h | 6 +- .../gui/colorlcd/model/model_usbjoystick.cpp | 2 +- .../gui/colorlcd/model/model_usbjoystick.h | 2 +- .../gui/colorlcd/model/preflight_checks.cpp | 2 +- .../gui/colorlcd/model/special_functions.cpp | 16 +- .../gui/colorlcd/model/special_functions.h | 12 +- .../gui/colorlcd/model/throttle_params.cpp | 2 +- radio/src/gui/colorlcd/model/timer_setup.cpp | 2 +- .../src/gui/colorlcd/model/trainer_setup.cpp | 2 +- radio/src/gui/colorlcd/model/trims_setup.cpp | 2 +- .../gui/colorlcd/module/afhds2a_settings.h | 1 + .../src/gui/colorlcd/module/bind_menu_d16.cpp | 8 +- .../src/gui/colorlcd/module/module_setup.cpp | 2 +- radio/src/gui/colorlcd/radio/menu_radio.cpp | 79 -- radio/src/gui/colorlcd/radio/menu_radio.h | 43 - .../gui/colorlcd/radio/radio_calibration.h | 1 + radio/src/gui/colorlcd/radio/radio_cfs.cpp | 2 +- .../src/gui/colorlcd/radio/radio_diaganas.cpp | 42 +- radio/src/gui/colorlcd/radio/radio_diaganas.h | 4 +- .../colorlcd/radio/radio_diagcustswitches.cpp | 4 +- .../src/gui/colorlcd/radio/radio_diagkeys.cpp | 2 +- .../src/gui/colorlcd/radio/radio_hardware.cpp | 8 +- radio/src/gui/colorlcd/radio/radio_hardware.h | 6 +- .../gui/colorlcd/radio/radio_sdmanager.cpp | 6 +- .../src/gui/colorlcd/radio/radio_sdmanager.h | 6 +- radio/src/gui/colorlcd/radio/radio_setup.cpp | 20 +- radio/src/gui/colorlcd/radio/radio_setup.h | 7 +- radio/src/gui/colorlcd/radio/radio_theme.cpp | 8 +- radio/src/gui/colorlcd/radio/radio_theme.h | 9 +- radio/src/gui/colorlcd/radio/radio_tools.cpp | 4 +- radio/src/gui/colorlcd/radio/radio_tools.h | 6 +- .../src/gui/colorlcd/radio/radio_trainer.cpp | 7 +- radio/src/gui/colorlcd/radio/radio_trainer.h | 6 +- .../src/gui/colorlcd/radio/radio_version.cpp | 57 +- radio/src/gui/colorlcd/radio/radio_version.h | 13 +- .../gui/colorlcd/setup_menus/menu_model.cpp | 56 + .../gui/colorlcd/setup_menus/menu_radio.cpp | 36 + .../gui/colorlcd/setup_menus/menu_screen.cpp | 72 ++ .../gui/colorlcd/setup_menus/menu_tools.cpp | 53 + .../gui/colorlcd/setup_menus/pagegroup.cpp | 446 +++++++ .../src/gui/colorlcd/setup_menus/pagegroup.h | 228 ++++ .../gui/colorlcd/setup_menus/quick_menu.cpp | 341 +++++ .../src/gui/colorlcd/setup_menus/quick_menu.h | 187 +++ .../colorlcd/setup_menus/quick_menu_group.cpp | 234 ++++ .../colorlcd/setup_menus/quick_menu_group.h | 70 + .../src/gui/colorlcd/themes/theme_manager.cpp | 39 +- radio/src/gui/colorlcd/themes/theme_manager.h | 29 +- .../gui/common/stdlcd/model_setup_pxx1.cpp | 16 +- radio/src/logs.cpp | 4 +- radio/src/lua/lua_lvgl_widget.cpp | 8 +- radio/src/sdcard.h | 1 - radio/src/storage/sdcard_common.h | 5 +- radio/src/storage/sdcard_yaml.cpp | 14 +- radio/src/storage/sdcard_yaml.h | 2 +- radio/src/string_list.h | 1149 +++++++++++++++++ radio/src/translations.cpp | 1112 +--------------- radio/src/translations.h | 1110 +--------------- radio/src/translations/cn.h | 145 ++- radio/src/translations/cz.h | 146 ++- radio/src/translations/da.h | 149 ++- radio/src/translations/de.h | 145 ++- radio/src/translations/en.h | 158 ++- radio/src/translations/es.h | 161 ++- radio/src/translations/fi.h | 172 +-- radio/src/translations/fr.h | 147 ++- radio/src/translations/he.h | 146 ++- radio/src/translations/it.h | 146 ++- radio/src/translations/jp.h | 146 ++- radio/src/translations/ko.h | 146 ++- radio/src/translations/nl.h | 160 ++- radio/src/translations/pl.h | 147 ++- radio/src/translations/pt.h | 136 +- radio/src/translations/ru.h | 146 ++- radio/src/translations/se.h | 146 ++- radio/src/translations/tw.h | 144 ++- radio/src/translations/ua.h | 146 ++- 324 files changed, 5204 insertions(+), 5422 deletions(-) create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_btn_close.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_btn_next.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_btn_prev.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_monitor_channels1.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_monitor_channels2.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_monitor_channels3.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_monitor_channels4.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_monitor_gvars.png delete mode 100644 radio/src/bitmaps/320x240/default_theme/mask_stats_throttle_graph.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_tools_apps.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_tools_reset.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_top_logo.png create mode 100644 radio/src/bitmaps/320x240/default_theme/mask_topright.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_btn_close.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_btn_next.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_btn_prev.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_monitor_channels1.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_monitor_channels2.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_monitor_channels3.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_monitor_channels4.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_monitor_gvars.png delete mode 100644 radio/src/bitmaps/480x272/default_theme/mask_stats_throttle_graph.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_tools_apps.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_tools_reset.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_top_logo.png create mode 100644 radio/src/bitmaps/480x272/default_theme/mask_topright.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_btn_close.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_btn_next.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_btn_prev.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_monitor_channels1.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_monitor_channels2.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_monitor_channels3.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_monitor_channels4.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_monitor_gvars.png delete mode 100644 radio/src/bitmaps/800x480/default_theme/mask_stats_throttle_graph.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_tools_apps.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_tools_reset.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_top_logo.png create mode 100644 radio/src/bitmaps/800x480/default_theme/mask_topright.png delete mode 100644 radio/src/gui/colorlcd/libui/tabsgroup.cpp delete mode 100644 radio/src/gui/colorlcd/libui/tabsgroup.h delete mode 100644 radio/src/gui/colorlcd/mainview/menu_screen.cpp delete mode 100644 radio/src/gui/colorlcd/mainview/menu_screen.h delete mode 100644 radio/src/gui/colorlcd/mainview/select_fab_carousel.cpp delete mode 100644 radio/src/gui/colorlcd/mainview/select_fab_carousel.h delete mode 100644 radio/src/gui/colorlcd/mainview/view_about.cpp delete mode 100644 radio/src/gui/colorlcd/mainview/view_about.h delete mode 100644 radio/src/gui/colorlcd/mainview/view_main_menu.cpp delete mode 100644 radio/src/gui/colorlcd/mainview/view_main_menu.h delete mode 100644 radio/src/gui/colorlcd/model/menu_model.cpp delete mode 100644 radio/src/gui/colorlcd/model/menu_model.h delete mode 100644 radio/src/gui/colorlcd/radio/menu_radio.cpp delete mode 100644 radio/src/gui/colorlcd/radio/menu_radio.h create mode 100644 radio/src/gui/colorlcd/setup_menus/menu_model.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/menu_radio.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/menu_screen.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/menu_tools.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/pagegroup.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/pagegroup.h create mode 100644 radio/src/gui/colorlcd/setup_menus/quick_menu.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/quick_menu.h create mode 100644 radio/src/gui/colorlcd/setup_menus/quick_menu_group.cpp create mode 100644 radio/src/gui/colorlcd/setup_menus/quick_menu_group.h create mode 100644 radio/src/string_list.h diff --git a/radio/src/bitmaps/320x240/default_theme/mask_btn_close.png b/radio/src/bitmaps/320x240/default_theme/mask_btn_close.png new file mode 100644 index 0000000000000000000000000000000000000000..7889eb2b1690f5073917325ee4cba1dca443319f GIT binary patch literal 466 zcmV;@0WJQCP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPK~#7FwN-(! zL@*S5XB2QHTnS2`0#twwr~nmcK?ig|2XsIObl|_uKZY9#_xU@MJCe-4*xe+Li9w9E zZD|}wx(dTE==pr&F(r^ENrD2mwAbr3bzLWDscD+qi09@wjv&|9QdCt%T$%ogD2k{o z%SB#&JqY3}w90rk)t?{#ZKKz#hfC@#tV_EqRR&Oj3*UP03N7tn3gNptQ_a@=dt+> z>bl-`48tIaGNpl#cpcX0X;dHf&LKbK_1m6SavlK=n!07*qo IM6N<$g7ay|VgLXD literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/320x240/default_theme/mask_btn_next.png b/radio/src/bitmaps/320x240/default_theme/mask_btn_next.png new file mode 100644 index 0000000000000000000000000000000000000000..8df693bb80bfeb644e23f24080b3c364605f122e GIT binary patch literal 290 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`jK9|$w{7&5#83NjW4 zxjQkeJ16rJ$YDu$^mSxl*x1kgCy^D%-|p$+7*fHwcFJwu!wNjEo>v)-oHlv7d8#F_ zykO~Jn0>)Ff!S@xTKfr;>?-6>di;?o?0w3af5Sp<`{%RO=c{&dTrW*MUihW6uxVY$ z=}iYDn%SQCC$7o8{a}tWYi6R3rYe`FaM+fGF%sGLzlTV_YMp7eg*#c=F7CG8oad5J zuMPE|%u#M>cz42N`n4z(4dEc0r6OD>xHEnJ9a$}Wi9hYpR8Gx#0!+Ozt-Plncv~$U6pdcvDZx-8~(zA;if zzIv6HXYPd-pF<%spZRuAY!z7bWw(*CDzLY_dV{gIscc#Q-Ec~>!_;*)2?Mq?+;M1&0drDELIAGL9O(c600d`2O+f$vv5yP6ooBY5MRS&7T?vPs@< z=y*ITBC>Wmom3D6jt>^cvAW;yz5dJP;`nyEoze(swOT2dM4G1R@p!1Js>~A~JfBZ9 zF~)hGJMkcc-$U@Dom3PBt=DT~7)Mb==kuAeETbV@uU8WcL7UCSjQ9J!C4(V3 zfI0LTkUnUd;k4-uw%e_4Bn3<RD#b+V^7(Ic8>)L9f@#`gsfd?E9))7Lij{0~t8*GnM95?q7vY!R>bI z^-BpeCX<6eH>y#SP9_HqhlBGUn(u2HACaSJNuYpG<^Lwvt+%&ZhGEzZo~jlU2@R+P zJ^y1V^2Nc1n+e54qB=!em_{zM<}&xMK5h$>$o;I_=G2)~G⪻?^Bphj=sY0wDg>J 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 diff --git a/radio/src/bitmaps/320x240/default_theme/mask_menu_notes.png b/radio/src/bitmaps/320x240/default_theme/mask_menu_notes.png index d052dae4d8d2f3806fc2b0b0f07041d71d5978ee..c45fa85067cb972dafe27acc307de8c4d5f743ac 100644 GIT binary patch literal 378 zcmV-=0fqjFP);M1&0drDELIAGL9O(c600d`2O+f$vv5yP_ZsG*1A)FlnW5E@s;D@T6SB2Eph>sqL{ z&{`>RGL#yUD$iCZMM)J&ChDMV+wV-3i?S@WUC!8D(p}dvGt08~vMjgXLkuwegffvWR?t2#Ai-0Gb@ znN#y^5Klwr^X$FX>=@VuEZ6*7Fuy#dA^#xPT+P&PEACBX{IGb=HQfWrCl@}|$dzQ+ z5K#Qk>(8U!j*gCtpGtGs99B)cbKHK_>(oCNSq=mP!&SA!HKHUXu_V85md_^UI-V$jwj5OsfQGFw!+N(lxLMF*2|+HnB1? vgJ?)R+`1g7K?80>NoH;M1&0drDELIAGL9O(c600d`2O+f$vv5yP2#tsF!|7V zyisSWZNJj;Z;@fB|spsF7}Lc*zP^q0>R$= zhbp5ea7(^S6lT;9P)uGJo3ly|1ZK`(3wl6yiEp@GizwpTYY0d$954Nr+J84G|$~ zL^qZ5`~5EYVHnCeq6XivBqJL2W+l3$pPPJ(*SGb#qdM5Pf&4q@gj+z=jtJg7pU;b$ z)Y5^EPv4<9V9L*HhwHlf4&BKU-oRZL1i|E;I0xidIL7pT@dE=;J?~vX?w$Yu002ov JPDHLkV1hi;;^_bY literal 772 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyP+0(@_MB{wzq>b6ag$%9tWA#)G081C4hH-CGqu+(bFw(;ef9K8`{Tdvihum+ z<=FZnTK{kMc7G-Y&uIVay8SAi=T|K+ovm`BZ=P|?rTF;Rzcxy-%FD|=3epvGSyDdy z$g#7(`{CpP5B)a+CdQ@HmlU%ye6jP~KF?5-|ICj?TnB_19`rJ-=q@Z?P!hf>xZ(OA zDaHnm&)sz*!JpH@x83z(s@VGFpAXA~bF~pwyeeAj)^6F#wBhz2wfRxgIzIURe|wcv zWXrZkE3`K3ojCL6t6l-^Ip58;^*e{kvN8x9d-umfwsK2(aaF;`WDbT2riu(HLHzUN zPN(|Y>{fru$+1v#X?rb0^x^2N@*Va&7PjA4UGRR&l%h+!=1r)(yMM#~lgB^LyfOK* zkXzWMp0iQ+7KJ;TXlZxJ%yl@scJS*M_a$dX4*t#P5X~{~e~-i+%Oq`oI5S{?9*bEXtf~UhA>O z17lpZ#5JNMC9x#cD!C{XNHG{07@6uCnCKdrhZq`KnOayGnra&uSQ!{t8}rMdXvob^ z$xN#RX)w|?G}1M&2r)9SGB&X?GJ|MHJlwh*s6hj6LrG?CYH>+oZULqxrbZAwG1HcD Q0`)L>y85}Sb4q9e01Ia*ZU6uP diff --git a/radio/src/bitmaps/320x240/default_theme/mask_menu_stats.png b/radio/src/bitmaps/320x240/default_theme/mask_menu_stats.png index 0e2d83752935f82e0c98934cf9e098fcde4f697a..c1b1ae9ce2d589cc2652befa650e3d00fbaecd5f 100644 GIT binary patch literal 494 zcmV;M1&0drDELIAGL9O(c600d`2O+f$vv5yPyJ0aO4~0384oKnKtPB|r&K0be%5F~{$W!qc}i=ODQ($z>O) zD2nEGyER0#$vT}*jqm#n!`WMwMOl{7<#M6p@knb?mL-{{NmW(Jf2n*cBuS#WaCWo; zsP23|%Tkpd4u>wjiv08W$T7^}XL8Jnk3i;>rs?FoCdtDv?An}y>$=2>kn11_h!rxs zw>MD7abzHm$76C}kQueIvu%46=PtT|_Q>@_ES6L+G0*cw;#qP&iY^gVt7~)uz-%xG z?!8{GW)35Am84hXd0wvrwTI2tBU7=~m1A0(D8o1dmZZJom%*4L?t>n zL97fw5s=)HGKScx#5j)S#`F0U$3epYACEj3aqJt$m#|ml$^_6iTvyk1w+R(1OvM)~ zU&8%O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uza;pyTSqH(@<(*FFQM2Xh^fyyJ^jUU)c z4$o}qY&Do^VLc0%Q#Bg@8)DJI)hE=<$j`tOx3-vx_| z+G*dF0N%44!{?t!`_dq$1lE8vfqfsq0mo!L%ihcdGO8~Rq0(_=WUjE#@vYE{_;7!7x+))oRQur+d8$BA*JET*T>}>;yB&6 zS!+}paDC@VxPSk4mC-?M-d)?Ke@m=?eXUtC!A^ejcK*6u>B`R++_$>%Gl7v)^+8Mu zCkWnf@!%rA$cAvZrIGp!P&!ARH8NY}t3#K^$P*u=`n45A_N zaO-lQ1`W6kC7HRY#U+Wk1(=qY8bS2LOk2hY)FTPf6P%w`Ql40p%1~Zju9umYU7Va) ZkgAtols@~NjTBH3gQu&X%Q~loCIH^{9vT1u diff --git a/radio/src/bitmaps/320x240/default_theme/mask_menu_theme.png b/radio/src/bitmaps/320x240/default_theme/mask_menu_theme.png index 7fe3db21e25b2a378b94f346853bb605b93e3027..fb6aac004f5dce554a0ffac339b761481c2b413b 100644 GIT binary patch literal 405 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIW12Y$B+ufx1kR&x)=!D{e7(7Y5|L?Mk8N| z1N$Vd7Yw2o7-d1IQD47!=gG5ocFL6he|Ppx&ymxoPv6qvYD!REboYZze)P0dW{G6| zpBx91Q=D8%V%3lOo{4Gxdr|zO@c+*Jih6n-f`K1v?wddA{_QY5bJn)XdF7pbkMDGT ztIa?3T>OsJFTNc|E$d&hWXy82TD7WcLmK}BRZpe){@=wWGFj@o*x!!6WU@3-!XrnI zd7Y?V_x4=xRSF+2PTY3+(Fx5MCyTB{xA)}UetsnIuxsE6lLKq#amk9wHq2vt63zZh z;IV~VG2h2s>*V(x)+|_L(bsRuzCmL4j&<6{J*H*}-dLdH{qsZE-1fvDU)1};7Bxmz x&ikD19@3y}!5pCadY9c3NA=T2rf>c;%3ZlX@%LhO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uy<@9E+gqH%udBtw1YM3J`npTAxfIIEhsXs=?4qq5UV zKC1{Fq2TsB-(T@Z_&1a$n$FlIEXZaU!5O$xLGzNDXyPl|w(5yyDnjX1{_~3W6`z~! zKV|;mPX#};7<`^s>|=45J5{jcc8h88)mup#XQxF;)y=TochgPduNvFWnoyTB(~tcz z`hDNw|Ajn#8gO`f~?pfbTXB2MW*m5}eHdoY4uZnrk zE8{lC>GSaL9r=~)w`tL|&!-FS1YVxAwZQA;+oZULqxrbZAwG1HcD0`*9O^aSUpm6RtIr81P4 im+NKbWfvzW7NqLs7p2dBXCnnv#Ng@b=d#Wzp$PyU?&|0O diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_curves.png b/radio/src/bitmaps/320x240/default_theme/mask_model_curves.png index a643c8c390de2dd22e0ffff1ad1c9f920464f3da..eace940d042f0bf418d6bf63c0ef9549687f19e7 100644 GIT binary patch literal 494 zcmV;M1&0drDELIAGL9O(c600d`2O+f$vv5yPnH0v)MaB z!-t5XXdohv7w}i~MXbp%Y}=;IX2W5Wylq>GmWsy-^!Z73~RI8eNMh+6!b@lvs zJW`(LwBPS}e!X7#`Gc~KKkWOS(ln)_D71>p^iRT~{^F%-pO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uxE?djqeqH(@-(tdBJLXo5AzuP{Q-}J* zUsFn9Y|ojsY`W^)*St6FSaxJB%PsvQH1ZgnRH8j#Sum~|SurfBWGBSf`NIcxS9H>D9ZbM0CZfbE!Vr~JZ ZC8kCYJu%akaRT))c)I$ztaD0e0sxs(_zVC5 diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_flight_modes.png b/radio/src/bitmaps/320x240/default_theme/mask_model_flight_modes.png index da46e37a7c85367cfa15f49545fc7f44789ef16b..8eecc65c1c2330a6e05ef2c6a01908b8b356148d 100644 GIT binary patch literal 592 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 Eg869x^8f$< diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_gvars.png b/radio/src/bitmaps/320x240/default_theme/mask_model_gvars.png index 34c5c906e58a5bc8157f7d48d631bd370e36fded..1d8d466a4dfee785cdcbe9e314c7f6163444c703 100644 GIT binary patch literal 457 zcmV;)0XF`LP);M1&0drDELIAGL9O(c600d`2O+f$vv5yP0gcCjc%^zOI??`|K$o67O4NFR<&nPM^SwK8Szv zLugk%nx<);a~<#AFUul^DvV1fFUyil(-b2~k{z*a+vItkn5$sCfPU5PJkO%?=v{?P z)2#1MBiQTvey8(G8 z{~hp?uJd6S#5lt(a!3+gR7wu&2!h~HCAY~z3DEtK#CaN??}aNF)1;)QHi^LHw=00000NkvXXu0mjf3_!qJ literal 626 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uzq=;`7ZqH#X?&-n(~4F(1^JBvP>cS+1%W+u*j`2Ts` zESU_4#jk(YAN$|_h}W1kpk&Y7n(~E~hyUN4!~TD9W9*#nf5wJ?QlC0+k7#(Q&n(Q$ z%pBHk_^?2inS08=+CRp^lXo#OAO6lA^y!3E-8t`X-!gxk`;cCDTv}xDj#)|n{@<*f zka%>NQnJY68BdhTV(Yg3Is2%_I>cH+qK7&EUsUme)MrIHViHBR412t&CZ79jiO)V}-%q_sQ#MB6)CuZ6* QPM{tJPgg&ebxsLQ0Ak(ijsO4v diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_heli.png b/radio/src/bitmaps/320x240/default_theme/mask_model_heli.png index c9994f145501a2894a65fb4f7da6986e6b2317f8..c2f78fb4781ab5aee75efaa81fdb3ca3bc878dae 100644 GIT binary patch literal 565 zcmV-50?Pe~P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPLu-Rcs=&ueJbS?=$kyw%4!q`4 z6&UuXQL;r*NXDSmYE@=!Xf~VLPp4C zFsHFdv&O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyv>*?YcqH(_Tl3})Rq0F(5@BbECMq99`YWyvhY*}zY zRps{DSZ2Me<`cvNVtz5ru|D!Q&aqIS_03g9y;%aXQCpTc_x%sadKi?Xf5(>3lufa6 znY_*I=RYfxYX3alSg`W2+qPfzAAdX7zmmCj&HDUyh7T+SAD^ww+&-(v{qU!!tJN7i zE_ueho|m@$Qf}F;wMW$_wJhOD^!C5rvycc1O-{o@b)-veb?vx zw{QDB;^W`!4Zn8RavD$fK1-gbc6{p|Tz~HG_i*7$eS;mD)=cNuORNadl5=^x^6-RR zVGJ97{QP^nUq&Hgr-=OXS&RvK@%hI4*DyJ5ejcV`^sx5N>iRIY?BkXT-1i<_@O=l% zr;S^GxRgy{Z`fYipUbZxf0LtmEq`!8AV-K;Q%S^jiB)qyWjwRJQ!D25qvU&|xwV#c z=ron<>CeqCo&9<9YnRL99TU$?>)0&%sOnp<^IcKt<*}c6?k)TNleuH|yP6}1ly(E- zLbb#-q9i4;B-JXpC>2OC7#SFu>Kd5n8kvU}8d{lJSQ(mX8yHv_7+4$g%b{q<%}>cp zs|0B<(ls>FHLwUVGO#i>u`)7)Xh=NVx*VuM18ze}W^QV6Nn&mRrX{9E5Ir%|mT?00 OFnGH9xvX;M1&0drDELIAGL9O(c600d`2O+f$vv5yPB`ARk=)kIg4(LEsKnF^o13K8-CpY;QKR4^{B_havGv3V3k`}7( zdmVA$k>pY&0XIz}1-ikfX?gQ^7n|%ie_2&k?cfOZ7;Xn)P+iyCv#~-u>IDY`zkRd;L2!-Zs2%l!qmLon zktx4NU!xumbcVCoj;nh72@b)IEX#IQVV4REdk^OT0NMefC_1&R6C8`-wLMD^t-pucE%&bHVU6P-s860=W-%FG$z)3= zYkp1hJa6}PU8(Cja+Nk?^fD{ETkM%5vgNm#fi9tkhlS{vI~Mz2;jrvDF(vR1{nIiM i4Z}c1QQUsFAHM-Q=Ot4eT0mj|0000O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyv>FMGaqH(@-(q4V%M3H0jx9`1r+w78ui}**uctM^H zkB$}rSt|p>5Lcy-;vRn)RoDzABqo%+C=oXO!apHlLD_p!6t=sqAP-L&} zyqBJJmFF$r7xyXro0jy+sBG>@%d+c@_PgS9if9%vv|^$-xrKsA>8UA*-Ixe3?7{teu44U#2H_vrJDNOSV7oDK@Co zdZOpv4H~P@)M@;>CMxk+q%C7kj$7U;wd2v=UAyPo7&DF{cwlaYO4*R^ViGz ziTAyBIDSd@`<)dQdMv&NB~Grci(n4lHE(K=S7v}g-TjqJ2G`Q=Uu9EgX%Q&O6EWE* zZjl=GSxdA-|NYGM7lo`mCbWqjDp9?8xP@=hf;YJ$|L2}p|Fn?l$AQ(|TY>SQTH+c} zl9E`GYL#4+3Zxi}42(>54NP>6%tH(ftxPSf3{ABS46Fq3Ho|tLNIDvW?JYD@< J);T3K0RV|P_t*dc diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_list_one.png b/radio/src/bitmaps/320x240/default_theme/mask_model_list_one.png index b4207e4a32c1b70ef580fe7e1577fe18b850d6f3..db89aaf92496515a85b9d506cf85098aaac0a6db 100644 GIT binary patch literal 267 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc1|)ksWqE-VXMsm#F#`jK9|$w{7&5#83NjW4 zxjQkeJ16rJ$YDu$^mSxl*x1kgCy^D%U*PHD7*fG_bxI;Hvm#HcJU7$1gNlrt4_LS@ z9*8VpR8?T)v|wQGIp?%H<@cnvFaE*5;#NPKv->-r-u2RhQNI^l+vR_b@A)0OCE_iC zA!0=~k7Q4Y=d5+qJj(a}Z@JZ#VyguZwsh+HOai??VgaX{fyry8|YRBPgg&e IbxsLQ00zogqyPW_ literal 1400 zcmZXUdo;~IArnhXky;Uw zayy6$F)O54YHT91QNl7rn6!4B&e?PJ>>tnjocDdt=RAMCZ-$eD6?~WSE&u@Bnri7H z^1a)V5*5Hn6xxUkO{cop1CXEzK=L^NgrZUM3;?IF0L%seK)MQmVpP!s=fk3fSfH(y zCD=;Ke%3DPq@$?bF#yOQwgm%)MM%+560)|ZNPgU*B11Atb95~LK)flz%?om&#iFC4 zBZE&e8E7azih+)chys9`(dF6KbPfC6*qp9V`dGcjCQx7roVXB@fiP^I&}Dx^QJHaEmJ zJ}VD?#;PW_`>GhbEAXjpZ`J{YLNb-_;bSyHJa#P*k`mg{O+){TH2bpW3E}3>;@-AB zY4)tirdHLKs*bUYJsX-gD>?D{)_HG-LtQ;i)saKqS~myqO9qsT3torr^%M*ldhpi? zetH>1R2U`1VI)W(ADbTb+ArZ}*OVs_I)yQxt1_dP>I{aSHwE#@@sQJrq`dzm6yi|T04APxX2`HJ}5lOcw z$&R~LSC(d@{7EJ{bXBRE^Z2q9N}(eB*@BL0praJkc?WtRcCkf%O{}9+p}2~s*u`_k zEr*@M$am0X+d&(Tg=n{#)2S(%c{HU|CdiSF?}sb&JLdUJ`F5V6qVoGxBu_u}u1qPW z4;*hOgT1@^${*kJ*+Dy|e6-@yGdpc3OH{+}J+mK<=0`N=%6M1i_p&$bFRC%^%PK;C zbeoeg)cEi>lb@vB#z~-8E}L>W1u*w+caMN!#Mu~$onMPjOLSst=bUR2e!a6FL)M$i zw7K9h#5-}1xzZ#%UftPv-PA65iZ!&eus2TC@&!WJdKM(_?E4 zLX8KRABhZ!4rO84dDL&OFn3sp<%*{FvKa1hMa+c-HhA8Q&?uB4F`guLh29FUMyjS# zn`jT0-nUS0qjqB>F+WkphRh*5tBUi)J)8muW36;;#45nZQJ@P|40r9XWA?X5lIHN2aNa(_Q=O_4dCQGvdnm zw+A8xY|0z)7p=pbq`D1wno2cI#_+;NuRKjGj%JuFAN~ji3^H*}3$D=iBhr8D;V08mA?2Ms;pW zU`=A(wqU9U=QIUT2X;B7VQgiD$WZcLsQ9_s4E;kEGfuJi7NOLe@( z|0if1FTAj8UEoEFK0UqDPF^dcdDq?fZkzg_-%>^{>x*c_W6k!39H-iAnE$Pv^!ePj Shv$HvWbkzLb6Mw<&;$T`>wJCy literal 1563 zcmZXUdpHw%7{`B1a!F*ALq{%2lglg1E9Q01{YRj3ZxV ze~bu!fwX9@9bc3#+B(_;5P1jy>Qw-^e2cmWKsX$LkDdUa?*OomkpJYgG5;axef$^( z@RDu}w(~Dhg6+950K}m`MgZjI%kj;fB&@yl&JRKg;%HRT$ul_sK-iHu7m}k_gc5-m z;ujd~t3;v@e3dTa2>{rp^f=pRl^E}u{3H`5q{>9@PZF9Kikcy&n>it|A~#7-_RXN` zAZs^p8dzVIE3rKF_SNw(70DOy6*2bHk2iac59OY3z5J!qKM%L?p7>a^Qtp6p*nQj) zN+Z22x6upFPMB*;msLm|Lp)bAT7d^7+E+fDsP3B6L=b>HE3(1hq;$($H!3 zK1<`3rm7)&?Q0gFDl14JSWq{;W$g>yxS~*n)cO3ay~WjthuB2sc-j$Wa($Nk6|}SF zOT(Ma1}lP0^Mj=V80#`Wp@^zJXikMmR{~^^eF_LVCSEO5O2<4^7@p745S{mbHNt{geuz`wV|>`5CEw(PcWQyu&7eJ0hH3GFW%S-)O-+GB zSG?ZjuM#D-kxObSn898hDw{CVGDH5PQWqb!AL)A+$tOYDD!r;3?5k$d#hN~ z3g=1@zK3QI&Jch5y13oEiR9912A;S1q>&cU!;O$8_tgT`fJOBtsFYuvM_u>ON(FOR zda$uQV9qbd|ExaQDvpt})ON`={b7lO&DU~H%Df5_QmEXaCPuV50B779P=pc6<$^;_ z*9GV^)7JOv-tvr#O@EajmxpQAvfSFGyi&3UMejoQPRV8#?`9RSvU6%g>XL%q{?gry{90_E24`S)>0-gbz{!#AYDCwYIoaW z1C6t~<~R>-bB1xX@^eIL9;Dy3_58dy#%$=!0#dIT%02Fg;a!*xztY>|^pt;q!v9 zzVIk(Ue#=X2=~lQn)7Lf44M5QTa{;4;^BU`(yj9G?a3F|s4_PWEVJ%}Nl#@?yuCvaIY>32qiaA!x__f}$kpHtzLYyru=&m3`EHUnU~LpEJwbuk z1n~#2B}-1M^$oHDWy@tQQ5a5E4Ks{|H^mBwvUHP)_okm z5rG=X+J)rfMe;>oB>M6NAmKV!Z diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_logical_switches.png b/radio/src/bitmaps/320x240/default_theme/mask_model_logical_switches.png index 1e6a53896326094a3f8d82dde08e341a463efe52..af8ae0295eea9afae4547ab06a77b44f2345755e 100644 GIT binary patch literal 609 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 Aga7~l diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_outputs.png b/radio/src/bitmaps/320x240/default_theme/mask_model_outputs.png index 8b636c77273b262aa12918502c202d9288585f57..817d02339596772494d00d74214aa023b13ca854 100644 GIT binary patch literal 530 zcmV+t0`2{YP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPL_vd#j zB4SHpJRaM{Vqx$1yY0e$zmI1ejPxPb!x-~_rB^ z(MTLo>DWeWPt0bsV)oDH(?74*OmA{Z*5p*2BGvq>ONy$hbsz*3#KB=fYHm5d`_2cpApVi6zl54B!11Z>-UU*C2 zY0APSu^D+vK=-aH-pIL#u$e$O2Z`Ex3BWlmRlHkqKA*Q*k&2LnVA|uU|LgZ6|N3(n zlHeXG^m#6l0J;hnzziUh0zwO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyP+0(@_MB{vEkiW;|LW#P%+xfH4)%)JH@$sD2GVR<4 z1=T6d3!257lkT<{oQ}TbYBW(Vi9^om!h%H~R&aEAWVEyVcL~_EahBCZ|D>+EWjT7^ zRd?CS?u(RrWovi-^FEtB=aoC^`;R=@BFK4u*Zk?h zS?Kg<#=k||ycup@e``76gue01Bj>_$KFnfwc)4MNgMr+|!jCI;TYlSG9%xL`^J4$+ zx1IGU<0Nj=dkVa}{#2MR$=d#gBcItKBJ%Qr{3CH;x4ERB|I(BC)pv65_u{}N72*81 zC$=tl^Rpt@-KJDrMY7pJoX#^`q>ea_m)psMR0jn-rY3yxW$rRu$|^m-M&0As?1J+7Dm(ARv7|rOn!Mzrro!Un*|Ro8DV~d2+wmj) z&rH3Qw|VckmBfAeR&(Re%o{IC4}Po&FLzyf^sP^`;^H4^*O$~UIXA=9X(E>wZ(VHA zwQKc`^K{F3j@~oja0^wNsUi?!6Bo=$5l~}VwbCU7|hxdo2h++^S7AL_f-lT zw|`PkpQms5d}`maBEm)!qc=CSTU z4KT)4OI#yLQW8s2t&)pUffR$0fsv`Mfr+k>d5EE*m8pf5p{cfkft7)QwK2aOiiX_$ zl+3hBkOm`NLnB=Six49ND`OKYBQuDG#KW!2ff_X6Hk4%MrWThZ<`!UDVrm4@6EkfY QCr}TAr>mdKI;Vst0K$1NX#fBK diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_setup.png b/radio/src/bitmaps/320x240/default_theme/mask_model_setup.png index bdf24d92c3dc03dbcf805e0c440828f142e00b97..ad99ad01362f2e10885cc906914de67ba7c0d6d9 100644 GIT binary patch literal 635 zcmV->0)+jEP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPpDD0d6lgXq$GoR0G?Q*%)|9KVPx#yvcxYz3?GlqoCW>bep#2p42a=hcv zbUL*|v)QbUufK#7>_N6zEbLnbGXoFu7`JzXYK5F}uY8bW9jk=lbUG!Mj>lu|DT5bo zx7*|l-g39qbCKlUlZHOFJ{`Rd5|;B0MIc^mLh8wRfk-jzy_E1G^G@&rIO3fmc;&r# zGS-q}7Dh-I0!|V#y)M4&K@JfYJYEUx^W8(41No=QDS8p!fzDsA*UmFWPPwbB19lyg_E@aKTli7dk8Jqzw=@h0gc=BrM*52JKf3DUYwO zMv0ykVoDCk91b!Ay#P{%Vv7a<9n{w|{3Y)aDj#`kZh;B<9iCt~946lqSe5w%O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uxU;pyTSqH(@-(nc?4M-kWaM{cHa3NjU*6k|NNKq9AU zWsZnr&e2mH@(Ic>+;3=zO}iG=G3);Zft;x;y2X-&Sh-WVQ$On%9h)hTUwM8{wfy1W zLj{=?yWe$e(g}Q+!|`d8?9X}mCqFMoO6i&n+`+!N*;+v_(o;{2@#Y46YNnX~3vPC(RK z|0#1;JbE{M=7+uZ7g%l1YxyzyDqiQnC}Q!>*kK^ly74UKdSEJBP7tc*>pjLaY!5)Zd72WrrO+fb63n_66w cm|K8piK!7pPt3GsoIpJcp00i_>zopr09NzTp#T5? diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_special_functions.png b/radio/src/bitmaps/320x240/default_theme/mask_model_special_functions.png index a8589ce85245b032ceb99269e7b00bf8f9a5f8f3..8e51677a8dec6738e7ba5c15c35cf120d9303981 100644 GIT binary patch literal 470 zcmV;{0V)28P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPxtE#$|93c~f=B8<`C+DQOjGU9^-{g6o zua2&Rljh@8tm}Fy8m1zJtQDd0#UGR7K9)JW%6(If1YA>mGWU6M&X6L;GT(EgD2m0n z;EHG*M=IweNtU%R3~3!933l5=+qN`ga9Pdu4k>#D4fP&Hk=TPS32Kj?{~_14)raFa z;s_f_cyi9bUI2BVar_or_#wG&;3$9xk`VbFc7Q>Xc};?p^zpb9)s^%gGh5!Hn M07*qoM6N<$f^>(*H2?qr literal 660 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyv?CIhdqH(@-lCAgbM3J`j&(A8aJh@1FWl$2(O|94>LZhbfPn$9D8frWXGluETsqMExR>|ZH(EcO)a;%aT_FuW%# z)U*Cbwsp)L{&SXYQ;s{8y?wFm>z6VqhFD)y%V%Qq4*Gg-`ZLqN_u5pUGvB`N)YD(^ z=i<%nw`K0e{gbvt zUfr+HoltJ4V$3XGK5zee_AOIhX6mQ>`EBbIy+mn;lBXAc=y|WBLDl*TzIn$@5~-H( z@;Le|_TuuX`SGGnH!|aeBN&)%C$G-0VVJWv`vzn8@smsT3cUN0#`xyg`D=^^F5M82 zUe6eOXX8!Vy6|9&wNLG~hOrWag$8mn7yEU|M2o1kn>SZ5by}4}+(xpUXO@geCw} C=l1dd diff --git a/radio/src/bitmaps/320x240/default_theme/mask_model_telemetry.png b/radio/src/bitmaps/320x240/default_theme/mask_model_telemetry.png index 5c51d29e6c033816630d993f399d7201f650ca71..b003e93c6b2192164fd447a0c0e5d9ede8ef3baf 100644 GIT binary patch literal 568 zcmV-80>}M{P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPkza5;9zVt&F+tdxG4k%~^{N%vc~o^w2)ZYV92i{sP=W8c%SI3|8AjBS|Cv%8`>h;G@&N;kx8@|9%qhzom`;L z4m@LGIk@y5KZewhY4VO&h=8->a=G{`;0$r~Fpk({qWl9DO*>0@Y0!iK0000RD=TZ!qD7A$Jvx5;_?9hOCQX_Y5fP!Fpdce7V_{*@)6?_# z@#8C3t{gsm`26|vH*em2{`~pNmoHbXTIKESEh{Ulr>D1g@#2pkKj!4*0NumS&u?gG zn3k3{d-m+>*ROy0@L|oGHJ+ZHA|fJp@7_Ii>Qqrtk-xvcrluwj50AOIc|$`(O-+r5 zhsVj2C%=CE`sU4>Cr_T-x^;_>k8i_<4WB-J`uX#xhK5FLY;0d&--#0^zI^%e`t|FH z6DOLPnPp~Xe*XM<*|KG!p`nhBj?&W7xw*MVjvV>+?c4kJ@BjSybNlw~YuB#r-MhD< zqQc$X{mz{`lP6CO3kwSm5BKr$$5{Op zFdG}&*|TRg)YKRm7}%JZ!$LyD#Kg94-8yaRRA3}3$;%%#f zG%6~pprD|;tIO8fI?&&L!}|3)Iy&dhoeK&I5)cr0^zh-USFdVoYcE{5aR2`O0|yS+ z+1dU6{rmg(?`zktH8wVOb#<+(s@k?~+w$ehC+7HF0Y(60lDE4HLkFv@2av;A;1O92 zOiz(7*{cqSS z7-m%iQ zwpJHEGU@DTeGYev%?9yXPu$+PV@XKU!ZQ(D_b{m~3|Seq^hiK#aCG?l18PfF&EhPc z+O;anS=l+bcypGwwsZ8ptZI!ArG?I>@tq5I1cz=t-L^0~bSk@8OP=k|RWtA1+FScq zSYnIXDmCAx+j@38v%38APF%_4Irvc~hSTHS)S34JGR>T8o~@CXe6y!`LakkS-1nNx zJ6JvMa0eUO_QmvAUQh^kMk%5t^ zu7QcJk$H%rp_QqHm7%G&fq|8QfweKe9EyhA{FKbJN{|L4T|*;X1B(zN11n<_D;M1&0drDELIAGL9O(c600d`2O+f$vv5yP!s&Dx=ks|s1hN0dUd2e4 z9B(c?OWl*)9EA!g0aAR4l!dy`CDG# z@pz2ifCKHBh8!|MDG3>AsTQC;d5*qZT-gR#|C6g%2+G$od}*n2_Zj3f4LRGrVCog# zYF{Qu%i2H=p!-Qth2KPEuh+{imx~FH$HPjDMx#9Qe{v$vLh_Qt$m`@po)?RSnZh7U zppW{(<;bIGHI$ zTJ)!PS5%410KiCJ=G2Ib{?vUe$ZOyHrC|+Zh@|k<-AfL9^Ox2{pwj0%hDBO?Tw?7F z1;|wDUbX`axX0mx{3lx&Kzh>bdcEdZIh`^n=P~O6T>bzV!C&27m_8u@0000O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uz)%G1R$MB{w!B-;#OMuyh-ck2wxGlQpQtlKz4$Gv1# z*-D`aELI#=GC}nkJ9bFix>Da+a>{%;7-X@4&1EBxA2 zG5o`%pwBW<%ud&jSD*fFE6>PK(7i0OaaHDS=huuLljcqI<>*?a<)oBdq2ejesB^FO z(UQp@^LE5@uRpZ>oU6ImGQH)Wo{ELbJ}=%y&u~SA9rP#_=G#y=&yUvqo?uyxhq%M z1*9@G=*t-_^}2pC_VHouqYP5E@_mfFEDi4hTp5o34d16fxAI@kjh(59X60XFxfxWh zu6?}Oy2QBY-_e_$PmV-K@GmY6pSq>(ZSBEE4uPBB)1LjcNmzd%FQaLh=p0!M^M+^q z|6d+=R!lYcwRu72igfGc@p*4&{z<#fe>{G(nQ?5g-Hf%(ZaRNo-kNsKnZ5bc*U(AQ z9uE5I{b%mK6Sn^KKGbs)??lyDxyT3!=|4Zx_x|U%&U{s5WnZ_*bJJC^t6|c7{i{~o z{=ZVyR(bdKn)WXWpRNKJ7%D}+dm|qS>LvDUbW?CgkgORSGk*?Mnv5A$D8AL(yEr+qAXP8F VD1G)j8!4b722WQ%mvv4FO#s=@J(vIh diff --git a/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels1.png b/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels1.png deleted file mode 100644 index 00d1710be4d64fbfb7229eea121a68b175e70f03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 722 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uz4(9^{+MB{wvByW!?i6U+D^PkOLn8;(~9>jKOg`rMH zDrZwm#mrWxwUd}il_M5Nf8JFfIH|j_VBuA_fQvUZ7iEZ~O%Q05c3t>TT*hTh$({!S zMh~Cb>pqj$e>msu?|H=)_llXLj+xW|rDfA`;x6%{*sr(^#m&9dp2 zTWOJk(Urtqi@ zAOBw88+5$lw-=Mayo}l>FZ@%US17gL=HuR=5`3X@s$5XejI5|awpV6r)_D26;c8g< zEY(`;VB)PDv8%_Y2^{g2>d%gt^KtSzRwspL{rjiesMxNZq;h`2q`l|uyARH3)%R3R z1;(FhiEBhjN@7W>RdP`(kYX@0Ff!FOFwr$K4>2^fGPSTWG}SgRure^PHs+T@(U6;; zl9^Ts(qN=(Xryak5n^OuWo%+)WCqcYc(`>rP=f~ChLX(O)Z&uF+yYEXOpPFVVx}$Q Q1nOb%boFyt=akR{0KbnJjsO4v diff --git a/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels2.png b/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels2.png deleted file mode 100644 index 51376bb08a8ca0e6be3ab62de84562446d14a0a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 728 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&U|7|wYy{+S7I;J!15LgT!i-KDvnzmt z>?NMQuIw*aq`9q3+WmuPGB7YM_jGX#(Kuf^$=4$!QKW7D`+NCpZPraz%96~PS6HO3 z91~*U{FpAr#o8ETu#@vt>+DM>d%HVgI4&+)Y1ZU*&QH*Du|abW#~letp7Ism9{-ac z={$0}W~;j=Sh8x{`O5PTZQlnTI=6J<)un&RR%!LU5AK+}<=^{llln5IsR_qA8ag}j z-^ouE`*Xr)+xzQlcHXoOm}Mc_{QNrGY{sdP&dl3*Z7PZu&$_XbnSs%P`EPscp|v-U z#cf`*@zZ%F&(9$#m-qS|SC6#$=;89jF!SPp^Y3T2-q`qz|Mk?+yX^meHJtsp`s37_ zleJn(S1jS+NqC%h_=U$`+uMmxFMZnIrT_Zt$BMUC&T>B&o}SGxWqrpK{WH(&O8rgm z%5}V9wAsxO^z&R_x3m8FZ(>!?So5oH$ctJ8C#T2viX~nB^|xsDynUa}u_t$*xZZoM z?YzF7Tqf_CC37Bq;$(Q8QN8o^tfk+7@9|LC&KmWNYu7q$FN-rV_h*0EeD3nUwNW-c ztOsK1`J6TDr=&~lTiw1=N8%KV$;AsTEZdc0WzR9?e_p>` zm`!AK8Z_WGlw{_n7MCRE7GPRp XY6Q^}Gi@0sP!EHrtDnm{r-UW|tdAae diff --git a/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels3.png b/radio/src/bitmaps/320x240/default_theme/mask_monitor_channels3.png deleted file mode 100644 index e4217e0d9eb0ff77ca67278cf3804e5835fdbd43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 734 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&U|7|wYy{+S7I;J!15LgT!i-KDvnzmt z>?NMQuIw*aq`9q3+WmuPGB7Z%^>lFz(Kuf^$=4&KP~>R+|L^~dO>9{ADpZV8W zpSy2k-S4El^|*<&-w(kQ*7ZLg{(U<;w1F#k0po49xP5!08}`4nXkfqK5WZ2M-XQQ| zURwB*|Dux^?{%uov3qqbW!a~#9VevOT$uOQw=Mhod{tQTPxsmWe?BvIF5k|?Ej)cH z|7rtcUWo(G9)CKhzV!SX4(_?1{~KRRUfOtI<;CA?bq`9rGH4w=adzgss5^Obdp~S2 z|1R+0R^|fhsQBw;&kt|?_T#JOLD|>-b3euCZaOT_{`eo$-_(DL}$cBl8eLLn~7YD??Ll z0|P4q18ZY`ITQ`K`6-!cl^_j9x`sx&1{NVk23E!O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uz4&eO#)MB{wvByW$9LXl(j|7ZT^;VoyGpThHFfttZV z4lP#!L3!njD_WWocUi7FiMQQa=IWx$k~{IK+lC7_HSI2VoKa9@GVjt`CT%h!WLa`E z^Rd=r?=lUI_g>g+bN}bL*T1I}6lA0%YyQ$-_350rhKi8Mzx8HKf){mqS)=Ye`m!T; z!@g9>56ULjLe|{ec*tMDxZosv{=2&?Swk||d1t77_!Am0xbNCy20aJn*riT?F8YM- zHeRju|GR?ZgRLHicKLr^rW1C)vtv(+gUN>fwp$)phyS*m7JsAc(RtYk6=m1=n-vFE z8u+CxVPxN69bst`VwdC=@jB+;?2V$@-+%k}+V82;Em+OsuvEhGCimy}_1k){+w7ZL zEVALO$pzWHcWNFVJazTkkF%8r=e_XVS`@2kczE^U!uW~*w%l2uUUe<_z-8Bz>h1eJ zy}qrV`gPsOdHgRQE@n9Pa#_ylqBOtn?|&w{v+!P#75;K_TFjofG;6&%D`%|oP^k}1 ze;mSarmQxE%RNi`_QF!5|BI}9Cha>`Cq66Y{E8iuC*^%-yOuAS&NL$&1gh z+3Jkleul{%b55&SytD^KrfP|6L`h0wNvc(HQ7VvPFfuSQ)ip5DH8Kw|G_*3curf5& zHZZUO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uxUri}98|J57s zyjZm}`TgJYM2oFz8nbv^|6IRhdap}|Cx74ZiUltdVt%zXb~ZLPir&=-V`F1elj%F8 zdypyp@4v$bjvPC2;J}AwS=UFOUwNO&nODZclYXwnK*`%+)BD|L3jEz)WNlZyU!P)K zvFJ04#J4x~x0X#l*Opc}LG$qLovoW#=e$@aLr}OvQw!30H=hOeWO|H17I&rc1!GHC~_poc&{ogxpv&)2ouRmB`V{PIx=)BLv z!?R|eO%o4~m$1Fjzo`j7&K@{$;E=+holoqgnVB#D{|{8))5F7azFzOCNa6v>tv&w> zRoL8OPO>w6vJ2IEA;WqK7<8&7t`Q|Ei6yC4$wjF^iowXh$W+(BMAyhX#L&>n)WXWp zRNKJ7%D}+dm|qS>LvDUbW?CgkgORSGk*?Mnv5A$D8AL(yEr+qAXP8FD1G)j8!4b7 N22WQ%mvv4FO#uC2=Dh#_ diff --git a/radio/src/bitmaps/320x240/default_theme/mask_monitor_logsw.png b/radio/src/bitmaps/320x240/default_theme/mask_monitor_logsw.png index 8d252f0e41e6230221b2550e1186aaa0a2092817..7a5a1632afb9e2c8194065486bc037b89f5c8f1f 100644 GIT binary patch literal 586 zcmV-Q0=4~#P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPpaUK3+i&Ns*=#nEyvdo_$?VPU&E9j* z*~sJZP=mohiAW`*)oQ8TZl^S&`f9b3IF3aJr3yTsPgyRP@_xU~Ts50bRTU10gRLT} zkzFSbo`Q-dlZmw3Z5a-Sayp%)3~E^~Hk*w}-05^=y`G?FNaWImru8JH&cr4ggq zE|?Ry10h_m*L+%hTrL+GkH@JdGuNACI-Qy)RYBMJd@g?SZnvwB$D=BO?RJ~kpL=qo z#Aq}cQUtTv?6b#5Dmi5?77Ig52q=hVvkom=rCD9OsJj!m2B^ZVg!uh_|CkNsXgW+{ zO`mycD)W=G*)HNFyWtzx-z)}NMRL1ZDO|0>GuldPBU3X6$a;Wt~sHq>F;x;ZZ*O|n`yH<4- z39W1TOx)LbqMPl6Rsoui()2U_ Y1=>}2+NSYVe*gdg07*qoM6N<$g4^&0EC2ui literal 743 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uxk(bL5-MB{wvBwLT!fg)}5tM|{IA>aF>y=8&Wgjrfm zTx?f@UN5_0wWHH(x5W;wpbZz6`sGdX6BRcs+1T9NvDDjLxur}{=WBO_c1F;`rVQcY z_0920Ud6{g&-p&*dqJPUAA6B!1{3%ByT)z_OnBq@|8Um-CAlJi#&ZdFl1sPbWLr87jH$ z%zaqz_NV>&+ZgfY)<$lJRX5pLo^RNv^X1!J%|1S99ftCEi#FH2_bc4{NP5b#Id$Iu zq+Xqhc2x+DU+%oy+WPoIkN9k>;8>PNJ=Z=*yx4j7YHr}QZC`yX4$Rr9#cVir*8RNi z!V=ZVrwf{U{a`2-gJ;lJ^3hPVFzw*8U*2iNhHAL+lj{(Zexj>oTA zT!(v~U%kC^rW`%I`ZFm1}x0Hl%HP3yd$-64!{5l*E!$tK_0o zAjM#0U}UOmV4`be9%5){Wolt%XsT^sU}a!nZOku+q9HdwB{QuOq`^qn&`8(7BE-nR z%Gkup$PA((@o?*Mpau=N4JDbmsl_FUxdoV(m>NO!#7tYp3DhGA(i5DYR#Ki=l*&+E iUaps!mtCBkSdglhUz9%kosASw5re0zpUXO@geCw7nI{DR diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_edit_theme.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_edit_theme.png index 1202685385fd579d800ba8bdd690bb1d75520f71..173f13c99b7b5213bbf16e6c45a53f3ea2ca53d7 100644 GIT binary patch literal 644 zcmV-~0(;M1&0drDELIAGL9O(c600d`2O+f$vv5yPjYfVxpZn|e+SqqKpY`gj1iV}>BS;EH5XN{s_QT<@ z4#u2<0L&bu8sM-62nU{r!y(R<3_yVKB^ajfD%cC02_1j2SQL-TW&-9x@aHK~4Ozsv zI#QGdM!VfEej^9#5GWb@Sa;67gKI&I^{s(4l7U2)q|&Jy31uN=1dtL6;3pFqVN?N} zX+d(N0RV1GXljyFL@M2#p(QM3fOXxH+>}TL`C%{b;pvQ|DZ`u1rj{equM?b8LsG=5 zTjMM(gfxk5w<0&l;j1f};J9zAEHFl*_#T`sINN{ha=F;;c8hy*`vFwoK{MO$_efQA z&JECT{OBwH=kr+;{08WFJk}d<-fp+HTCJ>$?O-s70}J(0uifwW_zY49VM0aOs~@~| zKoVTC)W_aSKJ72glwE=ZN!~Vbb5#DRr9PGX-R ztY6?NcYxJL(jtPrdb+AngR6)yjV=x3)2^sCfOCm0>$%n{907}51016(%Bd}xBGQqA8So5YYOte9h?hW@S69w`dF$QA#gZ8GFHNx#Atb6+t+hXr};bUMYSDvtu0 eOeUYI`1lJMYz|Tz|I*k100003Rn literal 1656 zcmV-;28a2HP)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z010qNS#tmY9ftq_9ftvr!`KIy8q*Q<(q&1w%;Kg@T15gJczCz-CKTbfQc&%7TP|8MQTbhy-WR7&DVO3|S(HCL7t1 z;cEzEeoQ}ylHBoViEAA0xhL)&_W-|1EuutLrIG|{vXdh=XcLN_nZ?1Ap{@E zY}QXsPH43Tm1<~es-GaHqoZR5g8ZbUI36zv!{|OYuXow$oI_D6ic$c4UpP+4<*j*n z*%%f?A^|QJ+q^k3JzdD*#8asuOeR?(IWCt!a5@PH;rRHdRQhd8ODBX7S)GW*Vy&+J zxuN0ax^)h*_(W>zXR)zt27^T=M_8?t;R?uL(BxJ#@3LbA$db;q%i??tMRaATj01yg=E*IX@ z({D6dL0?}Fh6TxFWdt$j_ZuC>-@KVwi_+i!A|)jq0C4u~1)c8AzI{259(5vGtzmW+ zrlzK%Xh>IAdw>5Z03a=Gl!5VV8j1-ESM#FaR&VBt_uhqU98#5v*)ytR|EH*Z> zw^vhIS~fha0|1D{xqSXM1fhLQ!EwT5nky((dve!$m)q?a8BsDA%(yr%0DvHD1TjUW@(>DT#%eX&Z05atvznXbb~_#) z&shTj)apL9`tPkD{}J zJRa`{l)Ab<*Hzp1az65srtW;XcW+Mv4{me|B z-!(Hc%VG(T+S(pRMREP7`}c1*oAoMH7mJ1D=kGV04G4zO3k$z)Ym+xL{8>EPfn8f~4;_RiyR`Y2>Fx@*@#5{Ys9_U~RVCKi{o*)c0ad+b;- znG7yn`az=^c=F^Qz5XqP(BpwkP4`5iQi$#sP94KA#`^UX6s3lTv!&AGgM%a0)m0G@p zeD%r_n0}uI1`HV)83+O-lH#XNl`}KA&%U&@Xf#gTxpTd~{)SRH*wN8eUVem52U%Hy zfdRcgJZSauHyGYsy!fL+(e8FnA2?8wo&6=3%f_&%`FY#Ig2!O6JbTvF)O5q^#SR_% z>h$TVNTsDrCK*LT5)05UK#H7zhSEiyM$F)=zdI65&kD=;uRFfcna4;}yj03~!qSaf7z zbY(hiZ)9m^c>ppnGBPbOGA%GTR5CC+Gc-CfHY+eNIxsL{!-b~+001a-MObuXVRU6W zbZKp6b97;CZ~!teGBqtQG%YeWR539+H8?soGAl4JIxsL?mZk{+00001r;P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPh3`!iIPN&j2$iQAsvFT|11woL_9UbJX zC#QsVyB&W|r_&Pe&MO|z=X17}2}eLClL?JRBcAvBeVWhbSkQThg+?RIPHAVxrmDjY5g1@J%w zuh(nagd8Qh@H{mlICtS&N?3SDi#Rd?Jp@^S=;ONyk{y!kg37K4Yw7}6LkU~nt+VFa zzZ3ci>cCM_Sno=M!hyCxO8|UI(4&9)Im?5;lm`>wg+Bg^R P00000NkvXXu0mjfCVl;a literal 742 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uz4)zif>MB{wvByW$9M2WWf|L4@7lVRnaJI8glrY6Uv zMJz9k7L_PwUR3JRyTB^m=p-m|OHYX-D{yy#Xy9t0S&dtyvVj@yg?n+P|c`(>Ogh?a?feEt*(( z=%kO*A>Ej&8&8>bz5VJvY1#YKVtMD6wPm-PR7y@uPiV^cw&CdAe^Fh2y49K|4>EiX zcU$%StH~VeIR0fv>lf_My1sjB*4NIDG0&E%WTrX4=0C}J$~bYV`S-8I&*m~*iniO^ z(aYGIw@=V5@aOeKDlY?HIps(k+b6=5JZJme^DH?rb~gR2F45<{FRa-3{`M>potqQo zvo|v=x$ID&JOAcnCV-B#A%-%leG*wUrT>3;Z_SPl1?ka)OtIZ%TJ l+=i0O+|=Td#M}Z*OH7R*dSa$6;{@tq@O1TaS?83{1OT~vAaVcz diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_hardware.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_hardware.png index ebc22b13b017dff9e996bbdad60601f39e12a656..ff5b165cb0d398e4379b3c00bcede0cc065c3a0b 100644 GIT binary patch literal 486 zcmV@P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPQzaSM4QlqaZwfT%Cam6<5yN@G78sqC7wfI=Qk&k++DdI76DI5QZUNGoFDEveSE>2hZnI?k|1cgAg0avgDN{ zj6WWaogOJs?OADI9#a+-Ut{P3+p}6)m_d27t|_pFkqZ1~S+)yXr4eb1;~2IE%G4XgICB39VoWGDLJ$PdbsgXg!Zk*Nr5QyLSYaaVtKU$3iHPmc cAJfwP0y%wlx;Tn!wEzGB07*qoM6N<$f-RZFM*si- literal 691 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uza7{{?xl$id#ZWfe+@mg{Z8@u z^7lXYRi8_3`F}9m@uyNy!~dL9!QK=2CQiD%Fd)j0Q#tY81EYM#>1X$v&UipOfLhKD){Brv=h}ZxK)t*_IT^u;IqN z@A1u_!xW@%?`urC#&`7i`gIEpHi!QU-8-ec@XJm9<-ZyVc0Xgz@PBu!gIQv)iqbEy zRU3QHZ4)undS3CMMsmU-?yhW~OOyKcHJQEq_xHfEXN}6ecJ>||O5P$pjvK>v?p?h0 z>*_~uw-p$CTi$u-YW5AIH=F8I7fpL4#xl4R=a-R z`9ZgBlkhsXMS}KCpXYG2SuQ*Zj3Ct#*NBpo#FA92CkWnf@!%rA$cAvZrIGp!P&!ARH8NY}t3#K^$P*u=`n45A_NaO-lQ1`W6k jC7HRY#U+Wk1(=qY8bS2LOk2hY)WhKE>gTe~DWM4f9z_dL diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_sd_browser.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_sd_browser.png index 1ba6701c4e3228786d72b60c0bc3a7e10743ca70..5fdc085210c3ac7b658c2b92afba2d63da2f6a55 100644 GIT binary patch literal 570 zcmV-A0>%A_P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPoKmkPobeK=e$biwac^cJ)7^c^ zCNH~`7;s%T84L#5==FLD5mk=ma+yR?lvv<)DaCfXrQ`8POeg~wjYd?3FbwH(xrlu} zpNk9B4NOGa1VIpF(dr3pk#{r#U^1D=zvDPGoleQ~JhAutJ*`$Nu@UKTIHdV}E^C>b z;yAXRtV4f@|4ZJredL14Kk^A%)wA2}#MauhA_r;SM$u2F6W#B3aR8aZ+2L@gE@;`L z!uNd|kH?}EkisF91l2qqkMfg1ue?EY&QVx3tsM*7#A30Keb499s&ksnX0l+tUfUKV z+<7veCsx2IM{Xy_Mnql)IIo(=eMCQv{%cBdu4-t5e!nmO+T|u{b&ld;V_DH(ua^X8 zD$GP#&IBkH)@(ML!W`;A>D9|OY9TGPYIWeQm4`$7MF%@{yJ%gs^7VSnWYrW<5Z3{X zNPME~sZ^Dbs-f+`6KA$RQijwa=MH`lIi9sof#~osmt0)l7yCXwGZbl)Qvd(}07*qo IM6N<$g4QbabpQYW literal 735 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uz4&eO#)MB{vEkiUmWp+xQen=@t8?-UB2zUJT^omd{7 z>&rh?Al8Qa-kS@GyE`V$`+8}qv*4j=j&i@4xzfy4#rP+RAI)=?Wl0n~GpRM!q_8kO zt-MAqP1g3t?tSk+-uu1JUqIZMjp6i}onI6dtz2+?f=!j!YJO?Awd<~~$odm|bhg5T z$~%|kLr!b81nDh%>hH-gfnnWC$D@}=f#xf zgop|#cs8k2*iBU^apqjTb(`F@$}`4Hmwqh1asAppCj-gfcbEKZVL8$e_dHxJJ0&=H zyPvI><#dKQ{fDJJZEf$$trRPXiqm(&JQjvU1?Ms zV&t8yXtF-w*w$w|H$1d{dcS1Pj!$-rm`m;*d+lWRYIl17T=}%trVaJ)cI1?ka)OtIZ%TJ+=i0O+|=Td d#M}Z*OH7R*dSa$6;{@tq@O1TaS?83{1OSzJ7HR+h diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_setup.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_setup.png index 7a319fdf46306a8e65e95168c5826988d012e649..ad99ad01362f2e10885cc906914de67ba7c0d6d9 100644 GIT binary patch literal 635 zcmV->0)+jEP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPpDD0d6lgXq$GoR0G?Q*%)|9KVPx#yvcxYz3?GlqoCW>bep#2p42a=hcv zbUL*|v)QbUufK#7>_N6zEbLnbGXoFu7`JzXYK5F}uY8bW9jk=lbUG!Mj>lu|DT5bo zx7*|l-g39qbCKlUlZHOFJ{`Rd5|;B0MIc^mLh8wRfk-jzy_E1G^G@&rIO3fmc;&r# zGS-q}7Dh-I0!|V#y)M4&K@JfYJYEUx^W8(41No=QDS8p!fzDsA*UmFWPPwbB19lyg_E@aKTli7dk8Jqzw=@h0gc=BrM*52JKf3DUYwO zMv0ykVoDCk91b!Ay#P{%Vv7a<9n{w|{3Y)aDj#`kZh;B<9iCt~946lqSe5w%O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uyP-_yl0MB{wvq*#w&Mv>#^?dC2PVSB6OGA+Y!+V&-1 zmwIp}ayp7{s?tufb>qM4?8x7${9^J8RijxO1e7!ijK2%%bQ~#}s`zwU((CS~B7LFT zckk@oFPFBt-OB&@`G<4Cf&rTlGG#3b?eJ*_5|o;q2DUeu9>3#rI1yM7X-B z6qfN_7_rJ3!D(SYrd#$L-BM|2F?8()- zot*}6c1E#7|S^c{lSC#M^6Ux}Vu^7}{kPye25V{C(J@12Il6Du&`4`sPb( z=yy!8+IH*K))c$nsr{S3KT&ad`h51`Qo*G9dw(}x|LwG1sq*fv>8&9im)U|2Ecouj z$kHRc?(+w;+!<{1A5|uuy0%^+!R`81`#rmJe=p|R%)ZB+ZTBpBoe+P+XTf1>GH=aK zKXGlb$r>3mv5n4qjDHy2urdW?kUO0UtF!ohTTq8!AK8Z_WGlw{_n f7MCRE7GPRpY6Q^}Gi@0sP!EHrtDnm{r-UW|w5&bE diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_tools.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_tools.png index abcbbfe91b5921eb8d7f65c558a01f1cd9de7779..61baf035e9667d25237a5032a9ff46f283cf2984 100644 GIT binary patch literal 501 zcmV;M1&0drDELIAGL9O(c600d`2O+f$vv5yPcU@;ehG8)C5P1S)PNZmuv!aYb3bbu|fg>I8b;U67 z%!0G|1QplzBa rs_WWZb*e~5L0?Q)ow@3$d20Fxfp)*kNStTn00000NkvXXu0mjf>m1EQ literal 769 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#=`Bp4pvH+~MJ6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N!t9$=lt9;eUJonf*W>XMsm#G0^1eAk65bF}ngN z$X?><>&pI;MVi~nq}@MwCIbWGYEKu(5Q)p76VG~2W|TR;|9o6VifcQclYZW|g-`B0 zb`!a$WH4)QF5g0qmH(RGOu3SKMRm^f1BZ=X1UPvEq&?fMf|t%Zd|}=FjRymEy*=FKJ?YA% zDsywWZ!cbK+qL-m=67Wrv&AP?-1Dmsx@WjsI{Q|SF4NUJzi&#fb-r&_daOsZac4%h zyZeJGSss;TZBcG}g5I6-`choIVYjDH#LNI4{wMx2`|1y-$2*zKEB_|iaOmZU=59Yp z+en8!ue_!-INAI$x~p>1!jAve4zXG6(}X5wdNJpDx|wu)l-0Ks?Vri$^*nacoN@u- zeGiM?*4>C@Aa{9!Zd%;QX|b^2DN4hVt@qz0ADq;^f4FRK5J7^x5xhq=1STJYD@< J);T3K0RWT#F^>QM diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_trainer.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_trainer.png index 997bb051b64f03803056f35832c603e536c8371e..be8abe6812a129d1883e84c1901b90b8deb97fe4 100644 GIT binary patch literal 576 zcmV-G0>Ax;M1&0drDELIAGL9O(c600d`2O+f$vv5yP@{dQ(o1XHL)Ho>R_D_qcPb z>ee)TfW>0rd%d2o*XtgD?{qqTHkExe)`{3{Odc|Ncz~OMfXf%S5LSBIL`HUn< zKy0^Lv|24xKmw8vheK6aq;NbQdm;9h%f(lK!+O2e62wwxxtw#p3i(&9R&y+asE_73 zpU)v#-0oS<&1Qq$Zl@(|G#U^-+x`I+v1u_dGiGSuf2{EqEM36mzEKiXS(Jf+>TR9I z;EnJ1`%&ezsWqJnL&f*OjN~~-i|N9Czb_=FOGwBUm;quT<#t*`v)UuakeG_OuZ0xH zlp&Y+tNC;~)jGA?ZFNnz+tvHy@rdPesYA6|t#qx~Y@!TAdC-0VOT>W+UBGLq<(_3y zM!7tncMBbnrm0>t1CG0`$qV$Jiuh>=-E)u0WRh1-byO)E|HhoEV-B$p3*IPUHY;*W zg$8O!Z}Q|+B~5*q*m{&@?m*RMvk;ceGm(AZ95|iyd5AJo7*nt0Bnj%IpdFtjwvfyn zGEe4IzeO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uxk)6>NR1G_!aLU;6w2?jk#Qi$5JVu3bDOblViJ8*^nESdjTGURPYgyeo z^EcXNwRuQ-<-X#&bC&-NAKg!6)RIpZFMo6UueipYx`(%~?h1B)bX8%;1pDh^`gUh^ zzTDuLxNi9})suH$)-1Mv__6dyiFU)wd%q(-yu5n5HQ?3fQ;y6IvA?aKy|c%Oe+^)U4`d{yB9K3R5>g0+yt7dW@?9Vy<;jWOwyEMN3Wls|18lJzO{P_OiSt~Pb z_RKqV)N}cz#rxLv9Xhtcv7z^2*|5dF{cmLYP8>u(yR;1Mwt-Pmqj9dRY zqsP+iQ4JG+|ND6DZ1VJ^&J7FKZkJRspYiIylJA@q_XTeKT%e39{3!NwH)zZ?keO2DCF_>0f(*78J5*e?K#H`Nl? zh?11Vl2ohYqEsNoU}Ruqs%v1PYh)f`XlP|>VP$BlZD3$!U|?;`FNdNbH$NpatrDcc zNY~Iv*T5pg$iT|j#LCDFq9O5c>vEt54Y&;@nYpROC5gEOn3k9tLG;8-TgD00!{F)a K=d#Wzp$PzV-XEF( diff --git a/radio/src/bitmaps/320x240/default_theme/mask_radio_version.png b/radio/src/bitmaps/320x240/default_theme/mask_radio_version.png index 43ca453bb0504470c27d5e425631a0f9928da7f3..167287ac646eb9141b1c1bf8207b7f4e0b5ad29c 100644 GIT binary patch literal 372 zcmV-)0gL{LP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPAG3w%v_Ao%uM9(z#5hGY^75K&d2g9IJybHU0#>1gCoQ zKHijrxAt!Qsha0`j-n_I$A4d+|KUFZr#{cJY_mpYL%lE4sYB#A4ouU8=XslTZf$Zn zSzFh2;)XjS8Hi5o@_kiRV&v`yq-mx|C;0000O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF2^9M1>EaloaX$Ia`3Bhy1_pa9KC}4-+=%FEeE9!!PGXu` zh{BYQU+lRL&wM)1P)9@RpI-bsxdVqje2Q)2o)tKUJKoU1(7<5B!ss){4jeepqVy@} z>&g8AYF$T`cS>fOZ}j}Lwxha>KWN-@Gn;ao ztj*Lm`TPG5q*?MyGb<~baXy*g_Eq7ekd6-z&zYVXLif|>B>&i5dpLiG{XYlQ88h$9 zk(B(m+2BuNLPA2KfMCSAQ(T2p7@3(5*FT$FKkZYOfx(~pS*M!w49g!a{@?RoQf_`# zx0+&#+VKM&+CLc>7R5XJn<`C91$th!#5JNMC9x#cD!C{XNHG{07@6uCnCKdrhZq`K znOayGnra&uSQ!{t8}rMdXvob^$xN#RX)w|?G}1M&2r)9SGB&X?GJ|MHJlwh*s6hj6 kLrG?CYH>+oZULqxrbZAwG1HcD0`)L>y85}Sb4q9e0C=Rl%K!iX diff --git a/radio/src/bitmaps/320x240/default_theme/mask_stats_debug.png b/radio/src/bitmaps/320x240/default_theme/mask_stats_debug.png index 731e6215a335f678fbcded10fb078bb1284e8248..2d529bd1e18590f6a869979c828990bfc28a05bc 100644 GIT binary patch literal 411 zcmV;M0c8G(P);M1&0drDELIAGL9O(c600d`2O+f$vv5yPtY;*Q%;$97l?xhOa!`ZTm2|Z)J_#0 z`L=B=^mG&aX`0**N~wPr#BDj;kzanM1l?l0#^NZWzlN^$-`|i50N$U)(eo=jL_cHQ zNvt`uiTI8#BjncRTI%F^&ZYXm1#Nd`SdIvS;LB?xSDz6#rv6DNPO$(0002ovPDHLk FV1kTksN(O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-uzK=jq}YqH#X?&-n(~4F(1_cAxot15UV1Ykc^BuZ3O7 z)tbWZ|27-Q#L9{v>B&)ee803iMl@1l-XDJx_sa+Of8b=k{J-93%?r1UMt^^wKXTwe z!@~{#d3bnyEMmIjn*^sHxqn){K6!G&pIZ|9pNN~uz7f;+N~=9Q<;VGXw@*ZwzEob; z_y5gH*&1Eh^&2gwJNG_+y^=p-&TiZ9edX(4-M_!T{{O$`4*p~NrM=~jo1J)T|E0aL zvGL%6+00r8KP11My+~=I{poaL10bllS!7^jV6ef!=x?f?ztQ8Qgp=EUo;`5jz#`>C zAAZXVD|0vVJYJOWO!&Wqgrv%Uke<35|I1|;^SoP;`lnyn(BP4m9mC#?sDGPpy=MXj zmTHM>L`h0wNvc(HQ7VvPFfuSQ)ip5DH8Kw|G_*3curf5&HZZUO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF$-ux^>*?YcqH(@-lC4Kmp}?{Ezkh#M)qQdJlB%|mMuza5 z=8TR7O%56zU2Pq+nld=Dxqm5?2y#kEwXiAP>ashqP3Q8_wTisG9pxT|K4;e{ZZ=<) zzWevxgLjMFd-kg~F7G(C#M999)>#Ji=V!a(eky*hnWXCUuWtDjlPM+njP>t1ZZs=o zm%Q~Z5RjXeV3hG{adG)sUACl-`J3$Y>oY0m_9O1?Sf*Dv#C#mzJC%uL=-k9(ZOy5+^OcYHd& z!Ea0FF}3fG)elc?SZFc5%-3KC*BM8jlyxW0GCAC5n`_^rH|tpXVRP5Odkzc{FRbR- z7@n&LFY?ZQHGQto0yUfEm-H`gF|3Z)$zqUTi7k77AyH(}qyO7gTkq_?HpkzAp@o4{ zi@kxRknix?Z@*ZV`&O-%>TTTiN=8^^%~rcmt&I{T;tu~1;&kPiEBhjN@7W>RdP`(kYX@0Ff!FOFwr$K4>2^fGPSTWG}SgR zure^PHs+T@(U6;;l9^Ts(qN=(Xryak5n^OuWo%+)WCqcYc(`>rP=f~ChLX(O)Z&uF z+yYEXOpPFVVx}$Q1nQ9l=?TtHD=AMbN@XZ7FW1Y=%Pvk%EJ)SMFG`>N&PEETh{4m< K&t;ucLK6TiXAGJE diff --git a/radio/src/bitmaps/320x240/default_theme/mask_theme_add_view.png b/radio/src/bitmaps/320x240/default_theme/mask_theme_add_view.png index b2d55a9e7c76bb94db6e6e73ae98b99dfe1e4096..0b1472d3957cb3c59dfa8f169b2de4717f936f3f 100644 GIT binary patch literal 343 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{u@sh$B+ufw^JYTx;O~5-jDsWoY^a&Ni3v6 zsAPlgiw3@u1nULNB@3GO&h_m$p|<_G+oN`UNu9^3<>|)!k1bZIc#1Gg>saK$sW`>0 z!ZpyrtJ9)SkcIJI>MXU4kGVN%=Ui`Zd#!au`pl1g`)xOOzpp$ZU#Q?4%yamI>H8@^ zHtDG836>u%_S|%~WM2AZ_pp+~R_bxrO;@eDbxdWKxLQg1)_=c?A20f|?)94cFKpLk z#ZiWh}rI2$H22(xZksK@l2q<89ZJ6T-G@yGywp$c8T}^ literal 584 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF2^9L|>EaloaX$Ia`3Bhy1_m{|KJbK23%t}Yzp?dU?)^>S z8A6LL9(C&ZUw-`c(G80|{zR44E!5^dyg59wF5}tfpSEcUNk9J2=f0by*Y=;s=SIwz z`HhUbS(rst?yae4i+yzUkh(?BuU?rjgAZTTKeykPxBr{?IMHQl#FnXVFMkbNxPMw? zh7jAEHU0B%ulyJI;77k!V&=h$)cMno*1Pe{H#Rc(lb(=p``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{sB)H$B+ufw^I-DwkQa=?w5Xlt8rQaXH@4c z&M8UkWel;X)&8+fEUzsm~q?`cWg@rUPwG4u17InOPb5+Wa4xGB2$bd=pM&sb~d zEBtHU@%O>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF2^2cu>EaloaX$Ia`3Bhy1_m{Ie{h6O3v`=5y|MM-@d%!}DJbZ9xblRatqw9?0@@7i>K%R{54NP>6%tH(ftxPSf z3{ABS46Fq3Ho|tLNIDvX3L3)Do(@M${i&7cN%ggmL^RkPR6AM!H@{7`Ezq647 PDq`?-^>bP0l+XkK@Nu%9 diff --git a/radio/src/bitmaps/320x240/default_theme/mask_theme_view1.png b/radio/src/bitmaps/320x240/default_theme/mask_theme_view1.png index 8c02096d4037b05fef05e94f33bddab66998dfb5..2e2632d609eeca1cc28f07130e944477549dbc85 100644 GIT binary patch literal 264 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{#;KN$B+ufw^I-DGAr`1d=Fxjb>N)hpdQc_ z%xD_G`LaQ1fpAlx+)o$Fxo4gq@p4mG`0@BX*R@-%pIb3ZG&)wI^vapV^Fw(rTS<+a z_LrK3g=RH}-!p`JeQZl!vqxr5qM;j4ywkZzvAnf&rw0A{{e6?=#+MuGX2`z{+#@;1 zJQ zfS+GVN=gz4BqW4{ggReGIsxrwO!9VjVd!9$^#F1>3p^r=f!@6i!i-KDvnzmt>?NMQ zuIw*aq`9q3+WmuP0)=WkT^vI+&L<}v;FXv;<06Bwa>Sh0sl2=!HZ`QoFgVg^{>;9+ zXU&{FYnqhWS|)AkS~Y7|o7%F#HBq;$qISIz;G84aYMfQ5#wNqSFsF+5?Xj#*aiBX? zOI#yLQW8s2t&)pUffR$0fsv`Mfr+k>d5EE*m8pf5p{cfkft7)QwK2aOiiX_$l+3hB zkOm`NLnB=Six49ND`OKYBQuDG#KW!2ff_X6Hk4%MrWThZ<`!UDVrm4@6EkfYCs2``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIRQ@>$B+ufx1qVb%?1K{&oWpraC$JXFJMqn zSQy;E(!_MYQC5LbhJkC>y;NVWDXER0k~#G)gVw#>{mgFR`)a|qg$xYZkACk<=;7pK zGwUp!$adrL=VI14{~ZG6KYjn{KUw!WNwit#b*o%yYNS)3$ZT8L-L_6~B9ASS=0|*) zuXEZX{QA}xyZX*O_$kVMyS7q*MJ4xk-nUC8tmiCMJedMTChDF4e0FE-r)8NhlqSvK z;Xmx~I&+qX&pJzyfS$ureUEP_{ugaOG1a@|%;%hTnP!>ehCkz$Y92e$vR>GA>D+l; zGs-OFL=9AV%O#`iP4!a?daFMf@@(MXVJ+}Vk-gAR_kf)_BvkZ9!}Cgo*iP?%Y(Z6D VY)#bie1T!b;OXk;vd$@?2>?Ewinag% literal 863 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8wLhO>j0k+*Z=?jKY8+G{rdGYXU^6cl7(VPR!uHPqKnjEk$TsECbRNT9FZ*g&P zRaModO`9YoCEJ>tw{6;FY;1hy%ozs<2XAlhqeqYG=;*XJH(OgC-c2 z%&@VsF)=Z*x3`}*ZJL>xnU$55tE=nDlP3)f3?@#T*wWazb;AZtP0d4x4*C20M@L8R z-@jj3Sy@M0J0dJ>J$tsOsHn8G^pYh@CQqKs%*-4T6tsNt z;x)^cuUoZh*`h^7`T4tc?b^I~^R{i)W6xBD_miQN-6T;86ZTwGAnK8 z(5y9cC(Su^PE2viw0VjgQx8Z6S}YbzPddQJ@Qg=sV(W5|w?IFumbgZgq$HN4S|t~y z0x1R~10z#i0~1{%^AJNrD^m+ALsM-711kdqYh!*n6b-rgDVb@NAPvU429~;pCLu<~ zR>me)rp6ErH7A6>0X1mAZ79jiO)V}-%q_sQ#MB6)CuZ6*PM{tJPgg&ebxsLQ03p9D A4*&oF diff --git a/radio/src/bitmaps/320x240/default_theme/mask_theme_view2.png b/radio/src/bitmaps/320x240/default_theme/mask_theme_view2.png index 84c8f6570d2d73fddc60d1b8ac8265c1d6edf0d2..bbefa28b4a79609e7061e8db453bbe0c24310dce 100644 GIT binary patch literal 346 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{(Das$B+ufw^KjzItK_G+ixa&fUPHiMY@CY zMgwn*`azbQ1rT=J{k<1BZY^2wf5|@P)5+aC{v3J!ZozA-hn4df5?uNob0`TJai|^i zKFNL|)vK@Lw4`)jqfw*o~zz7r^o?cStw)zWiP zsch!K*~ts&P+>7XkMfv%wmoGne>XfsS6Biekg1o$%s_MbL zdxeFBHmqLV+|ay|HGymr zJzX3_G|nd{9N?9hIpZROuyVwl)~UR_8#Xnh%rH38XyoI-nP#TbFtbhQ&6+niR4goZ z?x?J|X{h?+2P;c!i>raE%h4M*kEmAM*chd!sjAx?>J;WDx4KwVgmvl$PmR?pHYI&- zpS7z^$gI92Gb{7;iC0Oxy!`JUxNzb?goty~-6L1doVjyINU70yQGuK8xg!n0Xw%pt zAQAELIne10swJ)wB`Jv|saDBFsX&Us$iT={*T6*A$UMZ*(8|=p%FtBXz`)ADz}lE! z4n;$5eoAIqB}jvjuAz~xfklXsft9g|m5~`lL*n7q``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIc856$B+ufx1qVbEe1TbF@6ku4opHD8ki0+ z^4-upz@)*zF2gl}f$zY^mm>2Bwf>&%7Y*Rc|=yKU)#j339?+db*XP(;Ze63XX z^rn#SDxTNsoVaby7tc(+ne+LB@-yjzwOd>QP3~uM9om-5b9lq+)wVxp7<%8{Hc9S= zfqkfMp^SFwx6>JZhRJ~^M0`Br>bb< z<3@WHpK7pP5d4be$MSm17h0w3qArNZ&so1nBf&}L_)M+me;Icz)1SS(CM+KqJPe+$ KelF{r5}E+au8~Rr literal 704 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=%Co0G|-o|Ns9#dGcia`t>ts&P+>7C`S1(+Mj*MhvWMpP$ z=H})W6%}2zY}uR{GkAG;I5|0mg@jCujW@1cTU1cM#Kg2>$&w4FPcL1#P)=6X%+xd^ zEp76I34T64OpJ`{SFaWo5oxHcJ-lyUVP2k(mzRf|TWL|z`BSGF>+0m?+BMWycJ^u$ldU3KOE>&#cJ>bEcXpC-c_FK;Nq-u$4L`h0wNvc(H zQ7VvPFfuSQ)ip5DH8Kw|G_*3curf5&HZZU``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{(Vmu$B+ufw^I-DHXHD`+K0a1z_@`?`GCp> z#w4aYf)b6q5(}jbn0gMdt<2rpp;VO7;C*y*PeX)#pRBq>+rcH7Sqw5sfg+MhMm!Ha z9xnaJ@?@|5xd(-ZJ7XSA|FOTLxV?F{prb%e-+L?fCpkh-YEAuiE3JQhOKRf-oj8%! zWlJ)pR-c#UE8sH85}dc}28NbMJ}%=dK^}nxwKkrg+a}j@tYArU&#+e~!`5@R!@PWLs__OQJ*;zrlI& Y+KqQF^gfp>1A3Lg)78&qol`;+0H82{wg3PC literal 659 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=%CB0G|-o|Ns9#dGcia`t>ts&P+>7qupl%z_~elz+FDvx78YIY?Xog592^|N!onu(t&e~% zV@&dPcVXyYmGuB}I14-?i-Cc09fTR3G-g)-1=&kHeO=jKvPg4VnY8-{&jbo}dAc}; zXq-<@IKV40bH+smVdaQ9ty6hRdP`(kYX@0Ff!FOFwr$K4>2^fGPSTWG}SgRure^PHs+T@(U6;;l9^Ts(qN=( zXryak5n^OuWo%+)WCqcYc(`>rP=f~ChLX(O)Z&uF+yYEXOpPFVVx}$Q1nQ9l=?TtH qD=AMbN@XZ7FW1Y=%Pvk%EJ)SMFG`>N&PEETh{4m<&t;ucLK6Tvbl7qL diff --git a/radio/src/bitmaps/320x240/default_theme/mask_theme_view5.png b/radio/src/bitmaps/320x240/default_theme/mask_theme_view5.png index 5c7c18c2524be04f05ad47932d6733c713098812..1f4f193747e354556b5de22acf8230d00f403a6e 100644 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{#Q>I$B+ufx1qOrn+ndv>BV4vi1@;6)o1b&z=Xv u9$A<%|2o9~J~L3{2J^hts&P+>7=bB6{8H#ao2G&WY0ma3_#iHnPGS-*bQwrveHHR57oo7b<;%E;KVVZ-d{ z(}M#8?d|MDL`1sU+qZ7qc=`PK<%<_;OkH}(RI9&%}MkkHg z6+l7u5>H=O_LnTu+*T&-{=qYWLbE(w978nDCnp@>m6$o>B7?AU#GKZtyu2GWHKfci zIMQh3l#C3ttYr1!bX83i4K*$0UGwk4l}pzSPGE>!y?S|mgJNPvN={N%+POx>#KcV1 zyxipOOv~MK_ck+FpV?`l%$0uSkq?gr14BWhpr3*#&sCr+RZCnWN>UO_QmvAUQh^kM zk%5t^u7QcJk$H%rp_QqHm7%G&fq|8QfweKe9EyhA{FKbJN{|L4T|*;X1B(zN11n<_ zD~}U&Kt&9mu6{1-oD!M``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{yR?>$B+ufx1qVb%?>{;S4`PtWs>-q*S?2KCZFV4 z!C&}Bl{+Qk`qX8ai*~I$eCpEoz4K(=uY3LFwjyu!WasSH=DwdF{Z~0{b6%^P^@-!t z9Us1)>^-K{s_E=`Ib_4xwnPqP?z`r_5e+h;U)=i6?Bnba(F-!&Y&Y|Rbu{C?Ha2JJ oIUf$RZprml6ga+d?eEvTuD*V8zw@Q{0)5Wl>FVdQ&MBb@0G1($;{X5v literal 727 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=%CE0G|-o|Ns9#dGcia`t>ts&P+>7gbde7tfqJwZEsw*2ad3iOJN&Wc%jL3+Bwp%g%17tql$gWMyUL=i{3-ZQArH zQ-lNs+1c0_85wo7wND&AoRX9j6cC`TrDbVhasSq>Jv(-6UcY|FmMzB*9SRE$W@cu# zvb6mF^XJlq3sqHA#KpxY_Vpb*cu+xJ-q_Ia_0y*badF@^!0LZCbZ(a(};uy1J~aET{Ny6QEBR zlf2zs7&=&GJ%Aj}0*}aIVBlQ`VMZs7*%d%R_7YEDSN4}I(%e=i?f$_tfkN{f62F^}gM^_rKRAeb0om7yr+AKfyCl#7gUNqrunc>m?j6 z*X<4k+!cSu%6B<=bx8JCx6N1I zDZKdhtNCGujibTbvy5Wi(v91rm~*ySvn179>^k?d=lPD9{O`wu&369$)N|kKg!9DZ zs`DF9NOL<0GiP}34gPsvQH1ZgnRH8j#Sum~|SurfBWGBSf`NIcxS9H>D9ZbM0CZfbE! zVr~JZC8kCYJu%akaRT*7g7gIErERK(!v L>gTe~DWM4fy6XU& diff --git a/radio/src/bitmaps/320x240/default_theme/mask_theme_view7.png b/radio/src/bitmaps/320x240/default_theme/mask_theme_view7.png index 0ee89f826ee1f372427917e0eab55618dcbb6912..bff022c172362154b9430a87595588f662ab66f1 100644 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^;vmey1|%P7U0DF6I14-?iy0U={6Lto$B^L-P>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{&i0m$B+ufx1kq#n-v6V&F(tiJs>D^khg@z z-9p_k?*UsGv-{UvgKBzg$a>j!PAy93aD<3 z^#fjwpFHOrz8~n^aWel?_XPWgjQeWZpY6?iVd5MAc#+0}t#0$4zkbQrabd-hpIdW( z&t9Bxe&@$V^8*%rvwtc)U9{`{@3k_l6U}{lx(&~)|K00;RT|C&noX(3%pxM_QZ*_ zl$68!_Nl3=^6~L)-MF!*v(v`f`oihcZmzD|Hf`eJ;gOM+K6dC(ZgzHZV&b`zCsmY{ zGt$z^OG?<;*#l+nSA#50@^*J&=wOxg0CG4BJR*yMe!ULDj7}P}D}aLRC7!;n>@QiQ zxvfmv{ex!$g_=BF978nDCnp@>m6$o>B7?AU#GKZtyu2GWHKfciIMQh3oH7f#GEfZ((oiRc@eb zR7+eVN>UO_QmvAUQh^kMk%5t^u7QcJk$H%rp_QqHm7%G&fq|8QfweKe9EyhA{FKbJ zN{|L4T|*;X1B(zN11n<_D~}U&Kt&9mu6{1-oD!M``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBId)GM$B+ufx1oW&%?1Ls(P|9r3XJRz7&sf4 zRYcf57+4=PSSn~Rus>L^dv{L@gZH*&D!(77vhOXbtc_V8&U1LdVS_6SYi2yJjM7}n z$z|4g-Hm(2?c0{jKV{V)DeXV;zvU03^M#XcBCba7e#@ms${qV#v!(X_^Lq<#Z@XF= zd)ngkrrbG3O8Q++9OCn5$6q$FE?T^$=dniqtAkgg_ZM^eS-u2EZaq&u9=nlab=K;ZO)ULdFg?Ep~`gvEJo?Bmhq`;O6C^ponKod z<5QQrr*qGRi{`(KTi3m|W1A5rbG*p${*QyD(V?O_2TEgCsvY{wdbh>G^qACSPGAr* Nc)I$ztaD0e0sx3Jiz5I4 literal 738 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaADI|LY`7$t6sWC7#v@kII0tz*} zU|=XUU|@Kaz`$TNgMmT3V9u^U8=%C)0G|-o|Ns9#dGcia`t>ts&P+>7sCogNpUf;Rm+w&)YgiKh{(&yO`kGlVqc$=gTvk(JGO1wv}gPF zP3zX_>*?|G@D%3dty!_6rLnQQqa!jroQ;i5S4ZdKnKOy;@hmJXm1SiI_w2E=wS92w zma~&nbY$f9OP7=s6;B*KynM+LFAtC4pr9RFwyascTvSw)nVH$%)^_3Cxf|E66%-Uy zQC2>reJv2^CB`IgcNc~ZR#^`qhqJ&VvKSbO*Fl)kNn>^eP>{XE)7O>#C5tq-l}WpQ z@Jyi40#6sm5RLQ62?uy3X3n_CAgmlQr*$eX?}kkcDKiX?G#dFhaHg5*G|ZeP^hPE^ z)nez4%8H)`sy|p+T3cLQjvA;OQB}FQWJzj@p~{mdq9RkLgx)ZG8xR_N{lb+)Tb!fa z!~Ns09}sXpbmB(K*(+yaIGqn2y42Ns_SP{D=R?=d-8*>k}$c zBl8eLLn~7YD??Ll0|P4q18ZY`ITQ`K`6-!cl^_j9x`sx&1{NVk23E!``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eBIR;M`$B+ufx1k4ln+TnB5uz z@9-utB?z5jIl!`kQF+PE6>Fn7f?hXWVOO^-RCz5Eo73Kw7!W9;sdVc|&HeB*YfNTr zQ>inZ+c5WcB7cnE7G=Iq&42t)oL6aim(%t5#*fN*mo56P?N}czt<1dQb=20})yp!2 z90krij&R`%;@NXt@`-Dp&I#99uTOqgbG}~cw#?GyiSOkJ(+;W>#$JDuEpRsH1XDu0 z&V($nbRds=}g>o<+=N^ z{M?>v)s39K8zx2OcutzZf9qhA`^r^a+Zvu%PFbdT=QS^Di*$*|y~Q7aVZ-3*>gTe~ HDWM4fS&EUO literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^5+KY0Bp8m$B&h%?g=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7yk><8CY4;DF2^2c%>EaloaX$Ia`3Bhy1_m~^f4O`E&VRhjQ_-+@6P0V|LeaG&w9ILubR4}2U-s28L32E$eH@%^BZ+B&R(6L^V6U2JvKo= zOML#hIVUds=ZKD_B|JENn@WCmF<8bKw|0@j*R%mZZxKUVNzfWoM z*>s=!ns*UvPj347Po771juQ92e;mKRF*>&wR6mM8dZ5_fu*4>Qa@L{mW$(&)I`^;6 zU$x)+oZULqxrbZAwG1HcD0`)L>y85}Sb4q9e08m`DQ2+n{ diff --git a/radio/src/bitmaps/320x240/default_theme/mask_tools_apps.png b/radio/src/bitmaps/320x240/default_theme/mask_tools_apps.png new file mode 100644 index 0000000000000000000000000000000000000000..305e183d5425fece29796c14a85df218224155a8 GIT binary patch literal 606 zcmV-k0-^nhP);M1&0drDELIAGL9O(c600d`2O+f$vv5yPjK~#7Fl~nX8;@k4nP6m00-az9B{7yPyi@kP{5-A8~_TyLBAV*`Os^7^E;EdPMd6#G|4rb zha_;j-Q;jM$mMd;HPP$!WH1=Wcs!O2zQjdvJRaR}IK-t{>2x}-EK8R_Ss{nAHC`+h zdfD}QRXLx}Zol8V>2&&`hqEj>4O*?1TP~Nb4j{BPxHw8qk7Hh}Rx1^fh3AMaV*4V; zMkYMxAMouRzDP@m`FyTtc&iU`KHg@taWNq0Hoq}E9uGZ(4)m4WdYuEkPB{SJ3_3`i zk|UScz_-rG*R{(5-opuqlEc7+QUM~f;leQI2vh8J%i{TbYCCy?Xq)YJJMB&%s&*#y zePs#lLXhWlI!PfJfD}Z4FE{aCi?0eLUa!|uhXMu`+wE4m-L6W%-+%9qMkC#WJ_MIq zJw{?9Dr^`$gvSu8$h~H>sovW?JJh(IOeP|%;jj`=A+ct$RUttku&mK^S}j(Q-H91t zl%l}w37z7c`R#>QhjOm4b#WoqDbEQIbHGJL$cx;zZe~6wVSB-J@ZVH~0@L%K3y^aX z&t@}w^f}LwYbxUF%Q8s{UHiibh^yp`z#1VM;M1&0drDELIAGL9O(c600d`2O+f$vv5yPzSrw{5z*1@cKvWT^ozy9UoID4fRohhYPC`l5`r9r9Ci)CGeMf

aJ< zxLhuEj%yZ&!$FC;7lN|nh|cTJ=ko>`)_8+d5T1(yyveB;YEx-q8aA8F$GR1UU=4CS z92KX)bqwcRat{I^J?3_QvKS0Bftq&;hO`3lKgZ!757oSl8?t@ zJ=Egamj&AZ|37o@I@jw}27`fwXi`ET)_ra0_xt*-s!BTN^H~p;5ZodVfqghs0!7w! zEgfkAHtqL&3D=e2CJ9#5KwklQ4A*Vs4PM1tu*~TuJ{IQi2Jn3RRyg}SPBU6EQibS~| z{EdrdHk)aopxVM=8I4A-Dt literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/320x240/default_theme/mask_top_logo.png b/radio/src/bitmaps/320x240/default_theme/mask_top_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c27ce1577b54bf3bd75df8c442af5f0b1021014a GIT binary patch literal 948 zcmV;l155mgP)00009a7bBm000P1 z000P10gN#K>;M1&0drDELIAGL9O(c600d`2O+f$vv5yPh-$FWHR1$olZxbPA9S1 zY(xmx>s74RYcZeClQ~>|tJMw@xh7JwJQd-(X_yk@hh&4qX_77N7>`;%dU^JFqf z*34$Jgs=IG1N_t;$K%oK22$C#SWtL+1d@c3f$Srov&Q3b)Oy={hAz_+h|8 z!M)e(33(ZsZr};NGY}yZpms^xc{9@OthfH`ki@k8q)V!K?8||3WA=mPa*)Tw3|Jk8 z3kp!U^dOmtiX$?yR2|@3MosE7)bd zd5gs}tvxkTIQtO@N8{sy?-K@ZYHSUctI6Tb8uq7_-?lHkuBIK^VHP1L9#uHHFOmV- zSmmKJB!00M^%I4o8@4?M=f54Kg4u=h4wjarxV76#Lxh-oKCh~nP>iR#IMfILaBtMc zB!mA^VNfUM+8-S&4}17JhkZi)d_4xZ5NBK1K^;%edDy_7sL)7n<{8#P#JmFj{opg6 zAFzH4l!b5k1(ZsqxBTw$uc20}*``l_0E^DxYX>K5W&i*H4rN$LW=%~1DgXcg2mk;8 W00000(o>TF0000|A#f2X=TpWRmdShdIF*%pn2d(iy}_u9Gz{p#_DuA$olW~ARn`+4`OYHc{3 z^?2^Rtj7ABKJkDc8JZW!MjU#xnu*XJPje`10%-&~SR5u)J&3P-`WcR?auDzJiIixz z!K4})x8T9?&X_blA_ZhT^fcC-6%c_29e`!Elx_>zAYR}V(As@X;#dLVj0Eu(*CEy? zc4KXZ1+jpaCM1etv8I4G;15uMZ&IYa7(+2Wl4429PcW3=qXgQIl|DFfXvvDu6Mm-T z4m}0&q~n+ZNoFz`Z-(_6R)VAhfdEM{B*PF0LD)In0a-$~>&gsaXiJuAI;x>#E+dE= zX(xyyvBfAfvqG!erA(omky&7pw3l+DDgb4vf-}=rs^DCfNSJ~e)EygP=?d0N8jfKn zjSZ+P+iM)4?22N=$GTcHt>VIV+Q(2BrG%`DwqrRHl0DEi(v}3<$B@iAHyTrDvmkH` zD`ps}a;>_{k}<~brLhJPNUH7z(RiB)3spm>6!V>BZ$w7}9&(Ud?@MW|@V zs*V*FaI<$iM-217SGLXMF- zwxB{3g{W>jK$l=N9K=!7UR9L^o>q8@1At&SnkP74JWlXF$PzwY;u)6Zn%F=w3S=KP zq_kVxvb|ier{aE=X9$^tae|XLi2!U|B3Om>aV$+SfQ4oMU6zWD7fAhY9{13>O(8^7 z8r>dhl z^d|gxZ_So>56$Jy1g{;9bRB3sHgjgN@3}{|uSWb29)U^z_KBp*P-X=pMW|FtBu!KYU|yf2c2?Zau8d92uH;`Bcv@ zIcAs>Pioh9?KqK~RR()^zxsS0&Rp8wHT+ZVtI5%!+OG!^{R@-lZ+$cOTSx5)u(PF> z8lJ2BIdr`K?}5+H{eIE7sLraht@O8h{<^eOADy_cJYDw+zH8wh`IGvSJ;%Y;`Q@wJ cpKq^j36J4F=4X~qyMJua_RjFx*5QeN0pyHiyZ`_I literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_btn_close.png b/radio/src/bitmaps/480x272/default_theme/mask_btn_close.png new file mode 100644 index 0000000000000000000000000000000000000000..51df8d83a19679ea5abb39af321e0eab9ccc16d0 GIT binary patch literal 422 zcmV;X0a^ZuP)U@GJ$ctUd5IF7O?3j7k6 z4BQ(TTA-m<0o|eD3VdaxzQ|ERy$E4aKhHCiWeGX8t}9ekW!_`JZ+8+xbAx?)!9ya! zn5Jo(fUCam)f!TJ9hM;yM zJQ!8iH3@g2xW-l#n1WN#B=8ZO15F0|;2dZc@DV%&Jp!LTKdpFamo}q*FSG%$Rk`{vjNJ~2-PO120{~sH7}mtr Q1poj507*qoM6N<$f)K8$fdBvi literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_btn_next.png b/radio/src/bitmaps/480x272/default_theme/mask_btn_next.png new file mode 100644 index 0000000000000000000000000000000000000000..b7dc5e7bfd5dd1fef355022085600501f6ebec16 GIT binary patch literal 310 zcmeAS@N?(olHy`uVBq!ia0vp^QXtI11|(N{`J4k%oCO|{#S9GG!XV7ZFl&wkP>``W z$lZxy-8q?;Kn_c~qpu?a!^VE@KZ&eB{%KDa$B+ufz0)r8wkYtleN-!8mOUC+!sI@I zSAx+jQRGI0VAXYR4?XuQLEQ0|#N+mT;a|%0!LjtgQmep@ZMngQZmN8L8r>tJvL`$V zX)!%-T=Cwq$vbdeX{=%kgTF#&QTaK`2To#txh(I7cJCfaDIFgNyF^GSf zwW4!n)Rmf#i9Qy>lSGtG`4mX(+s0S&`}$tS`}?@$<2EIn0eXwU)78&qol`;+0J%JD AnE(I) literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_btn_prev.png b/radio/src/bitmaps/480x272/default_theme/mask_btn_prev.png new file mode 100644 index 0000000000000000000000000000000000000000..68a396e79456a2d5c86752733769453f78957633 GIT binary patch literal 310 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 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_menu_model.png b/radio/src/bitmaps/480x272/default_theme/mask_menu_model.png index 9832267b750b5d00f2ec0b83ee38d0bb6089c90e..b9abeda01073935d66fd4fef1f40b97fc4f366dc 100644 GIT binary patch delta 649 zcmV;40(SlB2B8IzB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj7Hc3Q5RCockmx0j%F%X60<}W}AO3(ov&;cr-15`i$MaT)qu?+DSv9B9kB!EjMlUv5@v8o#q9DkgDv5AAhfUS6YZ^Ykv4TvK7 zDlB+m^UjTviYny<+>**9#h1%P)s5%#X`f^%lT^wfs}n{ua$@C%Uk2pPcj5ESy#PXx zb(F3`XQsXb zeX&25dZh+2E)6|W%Uql-HVB-X5Tc(j7^eAi9VibW& j9_j7%dR7io?)HBL856A?Rp;6O0000+5UY-GALN48ys~lUr;w8Xt+HD55OO z1dz$6$H&Lw2Rc7L&*XCelx10j+A;vNS}nwJ4AV4GsZ_GWzW9EBf1hh#sZ?N^CgM0o ztJV4$PDyfbU3cd7-rwJ|TCH+zZA~cFG>sP*7kqkpn&~3fbw!dPNp!ni0-z*GsW^Rp ze&*TP8GpC7w&rH7WNdG5^YrwT4-XHiIF}@e0NCwziFUh90JJPCb;??;mYML^Q7jfy z`&pJn0BpD0Tuzd`rfFC-5{@toA&8UQyGSG)VHjd%mZ4=?SY2IB%|AXqqTlZW0QUCw zaCCH(vYA&RR}@7NRpwWeN+py^rPRFd`+|6Xe}5l0H#eCSCmf2RU^yX9Hd-VS4ne&CSh} zpG$UkcTp@BKlS0x&d#UvudlDD*XsZP+qRL*Px#1ZP1_ zK>z@;j|==^1poj6W=TXrRCodHR?&@vFbs81{f80Q07hU0MqmUsfejb|F##|EFac}; zOpwcq4%8-u0vDB&u1~Ur94yE7%S&#IgD${bcI0_ZQ50zde1G4kG)>8P;$ax5?|W^) z*4hz#(M3=ywr!gn#}VI;)xkfT5ikw9t^?^73&W6^#AU7ie~E9LNLm3|Bi9;=qF4xd z1njp4B3@3eaU7{E%U%B(t2mD1#fK4c71UQ81Oa)TM`wVUBYvKJ+qTOZ_<`zmxMx`= zKIRrxRYgtH2!E3U=R~gSipxUY@Kz!Px>m@_#S<$3)OF30BoV5{H>HdKKE6T5Z#%{d zd}{q+$wV+Vv6g6$@h*vYZDJ(&Ipe}WoV5*|HueHs9G+VAw#2VSaMqOjcn@^)2v$Eb zds9Z4L4bg?Q%XPg@%z9G0D^!sFN+F%FsPP{Q>>N&CNQtPw`bopP0HHec~_qS&g<5h hwJb~V-Oz8k0N;pfVf>wXIeq{D002ovPDHLkV1l02y6OM` delta 1267 zcmVHJR zJGi`c@Q`2^Wv3mYx|9kf?4s-ti4g=Hs(X4EL%IZwA=E^g5PvMXh&m-`o5AdDF4N87 z(`j$5&9wiY{{Fu(cn9zEeBbZ$d!Og|z6KEyj)=9jH6oD+i9~`#A_0J+C@6};g$oz3 z*=!scatKnXl=yr;vD@te{Pt(J+r{VeNh*~(EUg$0Qk>0ZdHC=lckkXMolXN_Hk)y| zT(q>b(9qBTz<;MtpIBdCCmarw&1M0xSS)zGUT)pGh1qOAy5e{|E)Iu7SK@R!B@hTm zCX+c(K_-)tKp-Gar&Et}I2;m>$IISdLL7}oMO9S+L{(Ms`~C8#@caEmIik_%?}_8_ zxE|niIwhG*%0ERinbg&*s#>C4C*IxN)ywO2I%Q{PM}Ph;c6N4ja)-kqySuxk#FLYg z`qPzD>hXA_uC7ixIyxj4i~W)ELKP<`CyR+wsgzhO76A@C)0&zZ{iRu2T9U=ZMHwF- zmvA^NU%!4m^vnUVSS)(0AtK`Q`ScQ(!{+9uoIH6_Ctg`uk&72E3Luv*U6PHB4be1B zzI^#2xqn=)Y>q<7eLkOvh!_C^fdBxvZ{G$$(=_~kKi95ZqqVgatJO+2o29$Eo6*tH zqTXz6ZDnO;g)?W)(An8ZCX*@KwuRgUE@H8m0Ae$jFFPR#pliy}i9MK0Yp? zP)O40v_zv(dGzR!3=IuQZEdZbK7CreUawxtQ-7yUNjjYtP19t1d%L91&1SOz5{t#e z7>PsxaJgJmS68#Tx=JpW1K`=SXPh{3g8TRH)6~?&<;$0O^X3h`y}i7C{hClHgsQ4M zdGbV`c2A!^<^B8jY;A3kOeWdh-Ugt$x*C_u1wbSc!BiObEiEl&OLXtvJv2=N;O*PD z%zwQS>cSIEw=I_V)Pv z`Lq5%olbN0>Q#PSXsfHM%+1YFQBi@%<9{h3sjsgu;!qUj2l4v)dP%^~iY*okgM)+A z)zxwH=1rbIf6j*wAL#DxroX?Rxw$#2s;YSK-~mRXv8>7hhoUH@?Q{@+o?Nk5OdlXO zZrqR;FJ9>Fw7I!?;M)ATolG{H4ZGdWyLayh27?R?3=}=3$K&DS$B%sb_6@h&O@Cu! zBSxbUlgUI^R~OCA%@_=ZA7^JWl~o%I2FYf#*zI;~HXBBOD_5=nFf}z*60oqaKqwR< zpU-ps`gK%Q;E7q|{x67B8ndWpl~ zu$()0P5^0WXpn`4g|gnuYPA;mu55Bk!USNoTJd_ljE#*kJUmQKPY-9$o&}((sfm0( z4?tyQWs!=is;aWivbMHXzuwr`V0d^K0I%1J)oLyFT*qbvj?MZUtJ(W6?d|`|&>!n3 d%-{ZK`wrc^6OQP}xH$j-002ovPDHLkV1nP;YLNf{ diff --git a/radio/src/bitmaps/480x272/default_theme/mask_menu_notes.png b/radio/src/bitmaps/480x272/default_theme/mask_menu_notes.png index 939b7f76641399f9fec059c6589ac7a1f63f0522..34509e92fae40a16e0b18fd2de37ae35e78f9fd5 100644 GIT binary patch delta 355 zcmV-p0i6EY1O5V#B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj66G=otRCodHm)#9SKoo_K&AwBD5_CWbI#7ZZbbty_f(p=q4p4y- ztRs=EO?F~$GVEr3$vns;&diGU!w{{yt|1ogx(-r?VSrfJvMfk3 zO;fplS8e*fkE*KhDLgRqf>@Y%o(CPA=GDp@GnE!a0SQdMDj!h_GbExYf&}K{APC;> zf2XPGSQ6)=iCkURg;<#8l7!P9t|GCaEX#9>#5j(S^1DSsS{m1eP9(hN2U7koobEIw ztI*utgOi0$*wB;Z`QkV}e1usV`?bSAYG~s{$pZ;oKFjuKyF~y1002ovPDHLkV1hSx BnB)Ke delta 448 zcmV;x0YCo!0@?$RB!2{RLP=Bz2nYy#2xN!=00EInL_t(YiOrYqk%BM~#UD3UK50J1wcC(v58A;+>-g}(S zXQa?#v49Zb=LJbR=cu(NfTT@pP3Ig*5+tdVN)GM9NiuWJaep?O0RT3e4T_?eB(%3` z+ZI(-0RWtHK+`ngZ$*l=*Dt|i^*>jxlo|~6tMcBXsw$jLr}u%q_n6P; zQKct@m=0{M4bZYILp^)%vE6RNIAaW?l+zsqmdhmpuq?~o<}alT_Kh*2Z}Q~odb(Pz z!h9QJdK*rXtbPVf0*-+K6PFW!yF_}lpMOXx!^81-j5#WY7!5%IAjyHgo4t<|t}s)< qW1u9Nk^M_s%yRcgLI`xHZb)Ap=^2O?OiFqH0000Px#1ZP1_ zK>z@;j|==^1poj74@pEpRCocsmyMYLF%X95RG}?`H`{%yrnMXFsWM(pxFCj?;m&+v?32%aLzZ}o3s^{~$tX3<-OSUIHk5UKeQ8d1Z zn8?-EZ#EmJw|}W4$@BTlye%u}!2^mctg*#nk$k~2*X#Ao+f-3f0#NP4;SfBNc9h+2 zSJKp}_IkZmZF_BrdA;3klPVxuBJ-{N_1lO-dszhJFvfUZ!@4l)P-YCq7K}!ttmFZ0 z`lQ6ol)oI%_Z-Xjb4N8()#O)KW)b7m1iAp@T#Z`a=6?ypFq4q{5z>nxF~da1Jfars zSkZ4?u|Ewidyi+TIzfIxTUZphc!4!-Cd{}xR7|?hW}-aw*yHhd8*}l5*dCJ`+hd{t zq1OmwY-dQ{dP4n8(C;KBG6~Ur6q`hHtW$zMX(7MM<9vcg=!+TEf`c|FI-B#I z1d>Logj(E^pRx}Ftq;(3=@+KVrqK#j>ZgFsR(iJNzo8x&bsz0jM3Ib-Z9XN_=~Pv^ vhM36`%kVqr|0D>Su5Cn90ccZ1H z1z$F*V(E06BuOGs6bV4ZA&MeNl0@lrx|%H2l=E2AH28cztgNgclgR)8EEWsgZZ{kb z2b!9i007U=&wqG)e8kDg2{cUu09dV7EG#TwdU_fbi{y@j4_gBnX=hz zSr4+=EXlG=j4^$k%jKeYJZ?C@1blscO?JDT0Fd2or`_FM`d!=I-7V6%zP_#uj>qHr z0>&66lS%qhOD2=L_jbFz#B&{-%jNX&GR8<%)ePDr zIeL40E19pVst$L#T$Ib@O2MnEtNPcK^E4O?mOasHYingaFGO*5b+s6rPN&IgwGx1e zdpa{SQx-ftJX~?l0g%;d)l@i^W0!C>Dzm0)YSlp#J`T!~JP(Z6%K5sIIP#6h)!F zzCNm{sVRbXcX!k6?JYGlG!Vyewfg(}34Z_u0s-O*m%YQ`C<)Ka%?$hsBbb_+!ut9;K0ZEv?v=>|MNu$5KCWM_cXxNVxw(NTibZ+_Mk0}b4ldlizgjAl z0s!zlkD;LhE-(^_#LvT3&5n+a zz<(Hns;W3WJuNDKHk%F6XcSFNP3YZ@*S67$*EF2COY00vzcPaW^ElHAIm43BoG+F}r>WD_8MOuX_B}r2CB9YJMNq-Q8 z--Zf;K>2*WVv(p?7DJ&B@jU-!D9`g03WchcMZMY6G!1UI8y6QBV2t7T_!vCT0|2hB zuHg6kp(qO8-`@>Stl4aa)9J+I_S|Er<@)?b*v{nPdjWT*a+*$=z_X#fBK07*qoM6N<$f&j!D#{d8T diff --git a/radio/src/bitmaps/480x272/default_theme/mask_menu_stats.png b/radio/src/bitmaps/480x272/default_theme/mask_menu_stats.png index ebd48258863c060588a85ff2af533d1c929dc047..62341166ec8ee6ca6073379ee7ffa030903886c2 100644 GIT binary patch delta 604 zcmV-i0;B!X2lWJyB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj73Q0skRCodHR?(3GK@jb|x&Vj(84v+7AObQ#1c(3;AOb`{28e(R z$Y8Et*R|^1on5|bq_hlZntxtPR9{Zsei56Y`V>614>8h^}2Mz zXoI5xc5%5}s9vwrbULLnF`v)re!mk(SH`jn4M9;t+)dzg#X8Wn*ob%-wFcMB7NR z3KOFzPqy*tJi0;l)TJSj7^%!IWb-$?IiJt3MWVKg#lpRVmv}rL%i=m_DTwi4FnG=J z`AI0ze6|W?Ekpwi8%!m(4P+M9bC9Fycr+TtJj2HHe}7IU*@#(xv4!A)B_mVje8@r^ zk`piF)gPn*iP$WJ-yBBzE54%(fdra791b$yZnve3sXkk+R%j#p{hqGZtJrebGwD|m zlZy=rE{Fwgw$&;^skSet8LQLhcwxz)!d>04*Jz`fC8XT9K4hAWS+c0mcuhiUZKb`z5-BI)6yCs q1bC#aR;$D}a8an$YQ%M4qWS}*4aFTje|>KN0000$8McKfFvUHP;!Ns`1$mG(M|3D@;6BCn8h{V~UiBp|4aes1jVKTXHB*bE*!r%yP zMSQ-&^oAl7zI?BrPtt_mo_l`1mvhfK{X>#iQKQiaLI^mHgI=!(0LW&u$Ye4o6beWt zldHM{xJ2Xen5Jp6QmIf;6atugDT=~Mr9#s*IUbLfxn(5SvMg$v76NFR#&WsLYPHI0 zwaRk2JlDputbczGc3qdcu1iO%svUarHE_S*XR%l$ z0H#tY8iqm7^CI7VTAt_8Fbt+rDFR@zSY*H7j|RK0E1~&(o^#uIu`IuzzJ)a(kDpbZ2Kr{*Q-;hmp2I z2)XUk0SEHy$OMsT7)GR{*Vorj1gF#KNPChr3`0hHaMVDOrfJIPT^2}BPfsCmB9T}M z_B>BUyJ?yv$ru1!U0neHYPA{?iNxyJXGV{Yk2pCwfe<1zo=7B6tJN^g!f-g087b4-G3e9@i+l+ZEcOcUN1Dywr!c=hQlFaLI}973r*9I%jH6E>ia&9kB_mpw}*?1 zi^$d9+}z;f;{yQj{{D{3%gfO7TrLMq)8M);gb;{3jspNtRrQ;*v$HcC9UTDx?(grh zySs~cJU$ofd0yy#I2?YnQB@V~b{mf4AQn`at$(epZ-x&K5Aye9GQsWb?V<&*q=3=u z^$?3PlqCIbEcHkt#FEJ*N~ID2;QIRd$H0N_QmKSwGWiu;`}_LpC<|gKgVrG#YZk>=8?+)7aeHgrX>+u|>9l8jS{Q+lHoT z&~^Q5Fi2_h%3`O};rjZzEaq=-ZzRcsg9Diw&(F_EeswMz8yf_`?d@%uG9$}kpm~je z@B3`ETAWNKq1^lY{LD_L6B-+j$85D)vNiOr)CiEj*!qya)a(WNmG*X8|9e9}t)KdY e`9uEBN83M%mf2quUs|~U0000Px#1ZP1_ zK>z@;j|==^1poj6Qb|NXRCodHmhF*5KoEv|uQmV~kO3hGK?aC`3=o0{5CI|(0vQkj z5x9A$Znm7=y)(>~Ki;Y-?V~+2-K_`3aXb^z=3yAdT$bf51bsrb&2!bbj9LKHh=Soet_lBML{w`@ra5Qn;gVn0u&p|Qr{jU<9T1hs!;#{ N002ovPDHLkV1mA(xW51Z delta 650 zcmV;50(Jep1EK|xB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$SA4x<(R7i>KR==(}K^Q%= zYiCi3w@}>@p`c#TXjD2+fF)5VBqV}LL$j?!>j`)e`b-{nqk`^UB|7K=rU$74r<-|t7gUWcM60D#eG1XWeB+wFeTF~*R|WYFvN zP5~k!UDsc7m`EgIyHh+K|CS?35($EE7hf)y7kAq4_kT}K&l%U%nWlO7zE-QjFbo`z zM+^o72!e3Ocl{r8&XGtY?0!C2&Xfyx- zo6Y8CuLGw=c@0-Cdx1aztyT*Fa5x+=nM@Fi#qJWXR;x>Zh-fyOy|k)7K0fSK9S(AHU*EU-_aa z+RueT0fHbvk|fBojBdC4SbP48WHR|wwH}X$+U>Sofu?EX^Z6d~`~Cj6mEXA2dcAhE kMb7!%*7yzHW{dv-Px#1ZP1_ zK>z@;j|==^1poj6$Vo&&RCoc!R_(2VKoHy*|7!=@ftH{ZXbE1=@inXa{Nq zN(ImX?`D&|3E=FjSEOu0T{6c7Q58 zpU>(IbDayJ>C0l^99y-9IX1gtI>Z!&a$9Aj3eXd(2Y<8{?{R0W*XuGd7gbn&O|ZdG zC-64xek8FWQhbVF}#ZDnqB07G(RVRU6=Aa`kWXdp*PO;A^X z4i^9b0+vZcK~zY`<(EH5a#0w@AH_7{!o3LzK^om0+8P2u9DiJzf}$o@qopwvYH<`C z-5d>xa1?QHaBzqS(#TC{yl`C{GRQy0mFJr}Ul;#>U!M-&3kNReyzl$tJ?A|S=UPY- z3ot7dWIqP}`1pXLC{Ppykw|2szwM{MB=Pq41_0=EI`adMv-|sdEG;d;>-ECvbj}BC z7zR#GPS9*N;eU3!p=sKDnyXYQq1kK#0D{5b&o`H07(>6a*{t|JKR-7$#a~-0mEy+6 z1_6k%zrW9?rzaK)1zN3E`g}f9jAfjF7>0p*y^iPSXVhvnY;SMl@bC~Gk4N}KA`v8$ z$)WL*B%x3!pjxfM?RFy+3Qex~@$r#cTU(|ozQ*qEE`J{$9#}4y#hl;oXEvLqrfH1F z<6K`~Cjf44ZnE3$vfuBU@(%@PG8x+K_My5*GmA5Mxz6X4a1)f%N{2#W^sty&9Q6|9sexHh>5CBzG zomsuw?ePx#1ZP1_ zK>z@;j|==^1poj7MM*?KRCockSAmfMK@gnU5`YZIfDFih49I{KWFP|}AOd7S1Y|%4 zUT=M?zA<~gxbLcScKdFoXJ+U2&h7!`^ZDJ(!ecxh-pX@bZ=4(#sU8R@FD|wYftF!iky;%C zyq+mU`n2Vg^X&+rbU@-t_0H*7$E7)M<1bud>qLrq6II%8gqV-SsBz6&=omkb2SbJA zs%87A6B>hIe;omi_msF)r;7FSb!H|`r_)o2&srUajDMzgijfT+>-E~tUVI%_iMUi} zu3|=DznQ>2YP@cNMWPZT)KmhUPNy>VJOxCK0Bs{YdOepNM-P3fB&X$I>NOJYSThiD z*|C3K!ypy=o>nn5j);6z6k6g^q=-&6GEFOmM)gp z6trv?wQAG0Wv%-QqD{GO)2dy&R(_0%l9WM(ltuW33PD)Ymw%pj@zTX5oTv+zsF1sY;0_d=H}+ud!bMu0JOQeN#C`GId-{R2#3R{R4M>~ zuC6XvEEe!Q|9`W^<#M@DE|+m~a>B65$w@>a5mc*H06;pO#^vQDd*0vQ0RY)-Ru-2? zZMWMA00E$umKJ(>d7*4JO8{tVYl}&=x3@s?>^7(v3M6|xXE{jW~ zcDvndG0)G>I6gi`PfribW;24pAoF=V9spo+yId~OMt?$~kSzW=J&Iac*^VPS!Yh<0{%2mmFMNhZ_s@-mstX7+9}nOK}&uV=W$ zVqthkM+a4_RjJh7-QDQx>yzyGW95NBKvZBiH#f-Ta+2MZN+l$dNeO;`e~1B#Cp9R z0H9K-06^3Plu9LgFBA$81VL2!A9;Ovcwo56WPg$;{(ROxq~duV27>{;y}isA2n0m_ zT5~#`O!C@qP_6WJi8+pg)9C~eAsh~~$pGNu;sV8D@k`=*8xfu3N~J``nF&4D6v_wXuk%)+%o}Q?wsfopnkB<`((d+9gsnu$RkB*MY_v%LZ zZEbCZ&1Pdhzu(XN(P$KJZ*LNrDOqQ`K__f`E8Dj**cOc)eZ#Kq8TlEtLQCULA=5dQ&?IDY^Eb5ch_0Itp)=>Px#1ZP1_K>z@;j|==^1poj5lu1NERCodH zl+g*mAPhuJC(sF9K_^frw?-(mRvY7oA0-Et67oEPdXS6M1|8Q=N=X@G6aYLH*1Y$_ z4W>Dq$T^2oeXbZ|ZpGoMk=B|7u%{J=gZe3>&Zs?34tJGkQgl+NqS3qOL~*FQIDkevQA^#aK~cfqVfO$002ov JPDHLkV1kbVR__1+ literal 2117 zcmb_deQXnD7(W!|HZl_x86TOu+@cQkdf#pDLV>bwu1M!LI^9&nw|8&bllJboyKdb` zR6Y&55F*Lcx#&V7vc)VC`2+dLoSR56Dh8EA11O3@GP1>Gm}mmN*R>6hfrQxf?%sRv z_xzsc_dL)0zT4{S9xo|gP>f+%Nw7B1h@K0atFQpw`&O*{8a;}P+7=7LX5Z&rGqCQS zc^Fo(Qw=xU&7qZ&tS4PS(Ie26P8tY}VT+fh4Irwvnp~70cgplYS^l-;SM8+ z=qcMrplGLLB#k_+W@S@_l18P0K`}1ck(B`|avo=-%tXeyB2zE{lTfoQgk|zrBd*)J z71wV-o&S7|1C-uSDDPw1Sdz)S3(Kxn5HAlpvt4v@3*w9Cyy745)qarDKI4>FHJ%SM76_Mv*&OV^a zDW|qMdj;7?-EPJc;XNcB5fF*M$)uN21Tre{&@0j`6XnF5{gbAO))z?JHjlIFoTiX! zRST7?J-a4W!FAbDLd7$EAOYFwZyzB$g@p={omQvGz^y5mqHT*qM0%5QPr)obYPSIs z`eP_tx6n}3jl#D;>&=5#1TPR2ULX}3C7oy7JP8!qOEQ3^IZ@#Rpzt~I*99*+y-Ew{ zpKHL|3qG4#IS#ZKM4Ki>+`gP!>&EG7G0l4VKjl!)PC3 z;RDqp$;eROj)5mmgjdg@j`uDsJ+g*vOl&>04`1!2>CUm2%ePOwRKD;?Ll*=sKMe6- zoqYC0YW3;VDYdzC-Pn2W-EUsl@o|5DY=m7lPaZzpS9$D{v43io9hrRiQss{a24=e( z*HjL@6?|iKX65!@%bH?8UD|Nrz~#F8H-r79_=kN5w(Z?;dFfHQ)6PaNyQ=QDn$cPNzdiFQ|GcrsIp~Acb%BB9FKql5SQy5B diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_grid_small.png b/radio/src/bitmaps/480x272/default_theme/mask_model_grid_small.png index b07da8fa8bf102597ccdd29cb4969255182a2e57..9de035f3d477de9411ca037924b025b63fc4d9e3 100644 GIT binary patch delta 201 zcmV;)05<=Y5bXhw83+ad005~Z&b5ch_0Itp)=>Px#1ZP1_K>z@;j|==^ z1poj5f=NU{RCodHlZy$!APhvK6X=AlpcAN*TO$-A3JQTxN)7^k4vrI_X2a8bQ7CauGt9_G}M*U#y9fb2e@} zaXd!+d;c#;fdvKj1lkRZ3am_!0t*W43A7s+KLzXqmCkZ&)mAXj00000NkvXXu0mjf D9ur7u literal 2070 zcmb_dTWB0r7@n%oq$R;tks3v(6EBfEJ7;b?GskRdvb%Pdx-q0nyILP|_RQJcAv+gm zCfQApqIs(Z5v^cDLw)I!#NvY}D)=B&`Xb_kC_=0FkOvX1A`Rk$XZA8SWgA0qU}nzD zeCPka@4w7{dTR2>z@DK!48siMbD3#+ABxVt+vxR?k?+saTfdikHei^&cSYweX64)g zhS@!A6-!~M@HE7(oj|5rCW)r)Q8dGh9&UOF&ytWWld9#UxL-f{jAJb`#hp+Kpx~uR z&B`tMSwv-bE=+Nh zZCi%z#b%wL6Dk@sp@}>}On^vM3uxjP=gs-`mU9yeq)u$&gaO5hG1jZOp&QiPTbPbN zZ*oAxTPVandUCPt*hLU#=c$ZNKzgEs;(|wnX%e_|J|@|DN^>|;vQT+^y7Y=(-U zNO3@flClX(3&%tu`cJTlVa4@rL?v4`suIC-svH{!5~kg{>r=;+o!nwkD8RfEgvh}p zpGk34b;7btsEK7w*EO9-x}oz5s%X5SmNgz@Op-DtvZ}}XGcKNsa@*Z+(*2cWQq;r|#Vb{tyRTR+V1)UC=K-JEw zZjD7Uw@Y(Wh}wZ}V%w{>Az^Eets;dvD`K$F@q3KC5Hny~bqNuU`YpxbsL+VXbzWON zGP1phw#_zbgc{wV{MxX z^S}Vfiik|TY^q)HH<34r5`Z8HC8^sGJ0sr-Ev_M_O6X5q;C3!&d)?717d`s>|CG}z z)pnf;H{Vv)x2pH*^30F>xxpU>xo`E?*6_$jOQq7=M}Iq4mG-Ild2Enpruse{~?d-Z=Niy(1UC`tHe@wbhreKd?G*$Jz%! ze|+lVnXjKa1n=v6{m(0S`O<;)=lgb@zdCe$-}1@bkN))LwaXjki_(?L8~vx=5x)HV S!_yB(lRKZC%)B=-v-A%d43zo+ diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_gvars.png b/radio/src/bitmaps/480x272/default_theme/mask_model_gvars.png index 0b5015dac420e9d7e705ac87cfa48a3958f7dd4f..fecb6ab715a1c235412e3ea40e2c830558d080cd 100644 GIT binary patch delta 481 zcmV<70UrLR2Kxh$B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6kV!;ARCodHSK+OKFc7|H9KaED0(ApNfDK>**Z`OSm;ji75eO47 z0&D;q@cK2cq?Vc|NcE3jatXm}zq`-gU7?X7Ns{q+JdQ+U)PKN{=Q$`x%CgKjp=wC< z2T^ogN1o@A@B3s5!!S@$6vRl0aq@ROil%8s)2OOy%6cavIvfu4PVDGI_!57KjbTp< zfo3B^Gy@&bG+;Wv#Tln*N~hClGTXN4QGnO$mHV*%to7lYq;1=$JJ98Fne|>7ecw+* z$FeMK=UPP!Uw_u=rcLlHuLl|ZO(O)c88HyY@m4YmP%ZkqD zv-UcSQ;rgYpFmyLe2t2aTyOV?5F;##B7Uhi384a?&FV>fhw;xQNPq`*#+opkcyIx~ X-(LujO)3^c00000NkvXXu0mjf*#^(* delta 784 zcmV+r1MmF%1E&U%B!32COGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K z00(qQO+^Ra3I`Dq26U)6;{X5xv`IukR7l6=mOo1)Q540`#5HjeaQ=u$nn`69NeTtQ z5CpN66c(vO5e5rmDMA`szk#13O?sOYK?8yT$!Mn#P((ACh<`DL#Ix1T`gT@V%q%Iq z@R~FC@|*iOk9#GO#1JBYVFlkrsZ`?n`Z^UwVJH;xTDN`4N+m2V zE&>2XM@JD3hka@6>FEi*UJn3JtyYmpB*czaR#pgrdwYAdZJU0@{rx?+x3>v^Yinz+ z?t%k>02M`Hr+?F--{Ck8gTWwmU3WFtT(7UMP*oM7P{?;5jgOB*mSyz&{o%X%`+YTAZDo zWh#|oyWMtmMNz0IiuXDF3tTJ~xw*M1fJa6~cyV#z=6}4ryl{DWnelj>jYdPL|1y{) zZQG`%X#zZ(&5|Vh{XVnVEDgh8yjnn5 z+igapQ2`!}Mj44jczk^PZr#9Ok~};-^cbyBD12D+C-_V6cxr0Oqg`HJer+Cqw&QZS z%y2kN!+$V@j#X9taH;o#x!!99ylH z=lkyNuE*g3cyx61A=uryBuPRn7Q@xmm0-TRyMH^>YBeO2NobnpG3VpsBTi3GJ^K9o zJY-oG1_}T)n@!QxLtA|^nG77q!T$dK@4xaP9v&W$&*#zYc9F?sT;09ua=DCDD)nF2 z+w=2t#N%;s16f#DK&4W_*47quUH7fy$;nCV?Cjv|?97D<9enC4Cy*N5Clq~=N O00{s|MNUMnLSTYk+;lYn diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_heli.png b/radio/src/bitmaps/480x272/default_theme/mask_model_heli.png index ecd93d2ff31a96f1a374f88861ba48f6b212557e..f2c59aa0cc873b4473e28c52f1fc44bc3565c8c5 100644 GIT binary patch delta 653 zcmV;80&@MI1*HX$B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj7I!Q!9RCocsm+`RyF%ZV{Ztj0d&;cFL0Ugi*9iReKKnYZU4yXVX zpn`k(W!`3T=W-X^y>BLii|m)(Y`)$5Ni7Qola`E+kdIU;h?V9t9b^R&8F&f zI%agcT{RdCR1lH^-0$~fHk&2dIGYO^tyasdxm+$qrjs9^$E(#!X#>_X(ChV#XYF=d zX#yLK^Z9Hd!4NRd`r&XG?(t+Yu^!;;iQOs_0)L%=>QlJ-9;-J&*~@McLpn*- zJBTsD!rSc@v|zDVyd)u^3n6|!pXL+JNQ}r?*9qYu$s)<-{~(sDYl!>(zI_;)ou7c? z5Mo-S2zE&px{kUawmDi7G=fyFh%Q@ZXH^56o6W|2x2=%qs8kQ1)_w!&M$mlGdfN!- zYhp!QN`F@skgCL>*${YJpDM^*Qkp;)FU_7l1N&z}^l7svT?Yf3Sp>DW{0`Yb-U~q1 zQ-QakCkyBEc`C~h8wOQIt|0R?^azmK&@-v0wof#dOL nJY%@!6j2}&sGuuIMfe4fbw~nY5Q1R<0000-z0Sm2M zunPDRc?H222zh{X5%K`GL6S}(t-{7ig@A>BU~aYH?9r>yD}Oh|9oS|kJ3qec?#yh3 zhzKRv7fP~UML*o{_lV;daU3IxBE)eF05A*#tyT+$VZbm9Xqr|mAU(0&ZbytU0#Il$ z#%QEXN*bnU*GSk=Xp>R1+ME#SMGYf;&eLUbUNXDK7Zd_$;;)E`>)rlr+~@_b=MpO3^3G gryKgpfA@C!4RM8#&%@0Jv;Y7A07*qoM6N<$f=ER(`~Uy| diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_inputs.png b/radio/src/bitmaps/480x272/default_theme/mask_model_inputs.png index 720099c470641dcfce53ac95a3cf6162fdad27ca..c2e6d3c0d535e9e5d3fb42a0c20944c7d5e51a78 100644 GIT binary patch delta 461 zcmV;;0W$ua2Im8iB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6d`Uz>RCoc!mJN-BFc5`jPXQ9Z0TPga1RQ_^Kmj-a2S`8yH~pDMB zv0ho0aaooWh9TW4iXvLq_3g7bjwwx3ve8cjRaNn}ZARG&DBFsT8;PvB?|bbJMOJ^n z%d)VoNO%4SK;2Yr8?=&(v|zd5zYGAccrU+e+m>DQ2G+F-GKK$A2msztU8ZT8S4Z98i;D{sMX4KF6`afEeuU=pdAho~0zs>S`}+DwrBaxtSrxp#zV53i z7K>pR2Ji3hHGi4oIF;bu-d;omUDsJ%UFGBBqXL{vCVk+IjSYgT0$jG9o*oVl4?V}H zrzc;&uIm(w#m0lnHa0fK?d>f9=jZ1P4Gke8OifMk8&!Z4i3AG^3q&Fj53Z^zb8~Z8 zmWAuO?Ck8YySv+1a59+$;O_2@iHQkc@7vni*xcOY^MCV`->NFOEW$QZnkK1K%C~d1w6w6av_w9iuM1q)=@gAdB_5B9 zrfJ?c$8jW=%ZY8<^_?=c_IPh^k9a)p8|vZVVJ*e(HH23%S02~|~u)n|GSnzjC zBodsQoB(ihbHnK9C?dk-6!=Vw$^_41?9Xk!nFa5&8T{5+OrRX7g}4EP$i zwYAk4@c8&R*=)9|^V-^)58T??%JK0rj^j`$6n!Wbi% znnRsXD1@RYsH#dh97fYLFTkif*gHBp3LJBZh_@~Rg|~)b(An7;2wW11P1@Ncc(w_7+y_}g%8mH0000Px#1ZP1_K>z@;j|==^ z1poj5MoC0LRCodHlEDoCAPfS*xc|y(9f3sB81B(8DIC`U24)?ScuD;-V8Rx3t8>is uUv=J%qPIfy?jIDrWukZgpy(}Q(|ZG^h#WL%0E6BD00009UA}it%{7Yu(!8*uLAn zD?mYM=#Z#DNRWR3Au6Ouxt@XwL4l$ahz{jS3L2jGhm}K{a5`bh_IUig@4fH6H#47Z zZQfWpzj|Jhq?KN`vkmXn>VDyQcwSoj?F)Fln04PTBoWkP@;;U$$P$tW$z#8alc1jg00s>oAFx$7zGl|y;Q-;&!R=d#W3zo-O8H-e|7-=B(N>71kXEKtkrcH}^svv3V zgk~ykXqBufFl03@+sj8&=OI)1h$lQP3&7$Un+-)NilKN4b^ZH<14ys$*FKiUk|ec@ zqTJXA8S{iJMHl^pjH}zc5PLb}8~YIE#Y#;^+Bv7C$ooQ!7RB0Hge>b;!;sf}%Hp&V z@x~J-yhBUwDNr{PX&7nEzK)5m6U%%PW1?v@s4v1eIyec%S|7Va!vy0KP-vWxmh?Zt zAtRB<6AF^!gbuixr2|E-6G_@)Byw;J(HYYye4q5vqNFL~y^g1V>P8%gB+?wmvI7SN zCTk+ov|QB0Zh)L9WHvLRP}kjseMhjpsZ+z7-MD~q9n9CnEq;4G8pZOo4+v#de|rk63d=)fJ{>Q~ z!08msXvaeiq|Ye#3|5G!9Mhby4?W Zy1V+*ufKf%!NclE>uqdyzHNQ@$v?hVKnnl> diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_list_two.png b/radio/src/bitmaps/480x272/default_theme/mask_model_list_two.png index c483cd718707117d4fdcf53ebff3b39884f857d8..6594238885bd8d56148af7dc50f27f71bfc81270 100644 GIT binary patch delta 143 zcmX@azlCvvBnKM<1H(!$pK}ux#cLQCi-X*q7}lMWc?lF{Nq6*hWMJ6X&;2Kn70CDW zba4!+V0=5tkc+{9gW31x|NVEatzDeLp|ta$uFIDKImLwM3;}$9szZxsMk+dmv0Uwc vHrFpKWpC!1^8ZS&eUtb87LUxAnt4w=xkE=q*lWRjprH(&u6{1-oD!M_)=V!((c_{QLeoqk4wr|U%#m+udYOcy<*RM zA5$JTNWgv8n8v9T0E3EY|X|uBj!Y*mt!J=}_JC`sxyXFrYOqJ;=tT^MLAX%wm=lxxk_tn~r$F^AUfJ>H7642O_+lSNmAVC5~$s zd9i&cWXuDy5SQl{^+oF8PAZ66AnD^g90w=zZwo((u3SIO#ElvShEXsW9op;015 zy#3S`)*%IRHIX+HKm=fWU?6N5xMjYB5QcCD^>`44N2j3(4v>SP1f7D4!U;%0{udlj z9P%tCLUI(7A=A@jsHt@z@fIKROgI+onk5U*!@VRgNJ3e!<7z^6BZ>lSBFjd^@`3Lo z224f}XooEVLdyJrSuF?+r`q4)^g!me+8@aMO&?l;6$0B2EMQtr2proaz+tRyx1obf z(yI1nO+^U_?`WjlyX>TESLq@V4v zEK=N!B!i>5-#hH1nt@u@B_>q%o2yY-Xe`j?kE2ByIafqyW+x*ijGj?`Gg!{UVnQ;u zF%;Q5M}h0lqo0$*v&mCRO^RR}n9wrhiGnsECJ6mzNCFmw2BekvXUIDP17g_5O;k0+ z#mLV?OGhLbGVu}DwTsI+Uw16Z#e)8Rk#fpXozUK0ObAM_i)1>j_P_|J))vc2t{&Uc&lKlvBi CyKAQa diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_logical_switches.png b/radio/src/bitmaps/480x272/default_theme/mask_model_logical_switches.png index 5cd1e3834f7cbb97eb22182ddc6dda86a2b3ec92..29708b387382af794fe96790ea87d4bf68cff3fd 100644 GIT binary patch delta 678 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 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_model_mixer.png b/radio/src/bitmaps/480x272/default_theme/mask_model_mixer.png index 009b360f1031291cdb1625a55cc4b8da8b5e4ddc..7d9ed8e6524987fea4aa7a3da5de63e9d64c82b7 100644 GIT binary patch delta 586 zcmV-Q0=50Z2;&5hB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6_(?=TRCockmJN}@Fc5|JP5}~-fCG?#1RQ_^Z~zVf1xNq~mC!n9 z9pw5lER&}Dlk4@~OlI1q-EXtI*@hO2Mc8aM;c~fzx~{{2sef(Ta5|kL3ry-2(y`m^ zW_95Cd`4K#A>qL+4q%0c!y#z)$(RVsu z>(#XvnRpo?MQGniAFVnKISPbR0XVL2x7%kP?@FtM?c?znQvgxwEj!>rVSt5e4-T6Q zWKj@=a3LHX)PIAoR;y7eOmHp>YQZhJ;1cK*IF&+?qmq4H3a1h%1TYE)h2rh)5;&DW zSpcRL55rm%JopIA4M5AO)CLiSs;X4DRM{giwh;_zLdc~?gMsanuaG-ju5X&49;`m^ z9iy)62G7#_k8)2C7Cc6tC2{^K>%CIJVfC0t`f`cI#eccU;V2|ZdN1-VU9be718RbiPhMdOJcnA%MFj)MdzJU41(%>)fJL1P9`dOo z9Tr@Jl5=p3U~CB((>f9cZyRo@FvjhZp?HUkvsUT=q0NzVI6I%uqg3EK{3!A{j*2zj z%=wSESVOscywxW5`@PvDJmm*R7p(Q&xgGdINcx!5dcCIp1@+JKS2ayTuh)z2_j|nl Y0r#KXS%OOV07*qoM6N<$g7@17H~;_u delta 1069 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 Eg3a1xg8%>k delta 579 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 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_monitor.png b/radio/src/bitmaps/480x272/default_theme/mask_monitor.png index 68ddd4516cbe5049f0f87997cfca728b1d41f8ed..7fd56fedbf497e2dae1849ba903833cb65bbdbcf 100644 GIT binary patch delta 757 zcmVPx#1ZP1_ zK>z@;j|==^1poj7qDe$SRCocEmkX8hFc5`je+5WD0uI0dH~175FJv0AN)QaHwSTK#@M?0GyMO`?mRoX6Yk)=B|2&&K1imBPbs0XDAJ zs~wNW>KWg#e>$CZ_js{bR36~%a=8rNw*fDAyIt^F`;nDGP4R3tt2UL^W)<>$v)Ke% z&*yW^056CC8-EphPw_H`{eEAI`)D+(8HtRX=aph8>Y@~Ha*36q)hmag55)*mTvD`n zKy6MjETlll^j@r(7l!h-GVrlWtyE6%Orb$nrC8oVcN?IqsfKfqbMl(nt2VZIE9-r^ z_|;^%_nIm&pUJtJi{Xux7wh%9bsw28J*FRJSIWj23x8F!hr=NV;Je%H)`=xSVG6pu z`&i9y2}Mb+Pow->h^b$hRw)L)wAz+3v@1ev|Mq_>PJ9rW00zMV3FKMu`}l_V!3JfQ z3RxvrLZDUfwVFyAFQA;i)$^DsVwu_(bSkNQJM)Q_gOU;<{I5Onf+a!8#rOZpKVdxj zS*jV#On=Qm@BF+@LGJ;l7rZ5)T_z=XDSu|8MhcSvI z^U0;@Cu2T_guM2~NI1-};_1|-f%p>D$TiU`J)IUryQq-a;#f zI|*u1oVozSo;E55@%h+?KpD=0ddiCu@(SB#bmJ8U@5tP)(@F}vTmZ6Hm>9HFt|?qs nSiV)#K54yNZ)k_P_UZ8-YShL$Ekd>_00000NkvXXu0mjf*tBN< delta 1180 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 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_monitor_gvars.png b/radio/src/bitmaps/480x272/default_theme/mask_monitor_gvars.png deleted file mode 100644 index 55b488d1e93bc3778770a1fe7a2822ebab22f870..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 698 zcmV;r0!96aP)nVj)`iGm?M^0mXc`*xTGa{Rclyw#oH7Z8jU4OeTyM2n0xyBwOrav7q^UPO(_* zcCzbs(sljQwy0DpwxJLXhjF=Fn7HY53ZKts4Gdk^ZSC||;QfA&;cy6^=NWjX)3IXK z>op`vLN=SVynhCNNKq6991I3=KA&+o91w{_kW40VKA)WjFPBTW-EIcnXfzOy#}SQ2 zaXcQGc*np1P$(1_FvoF_Wf`if+F~6A?{+)9zP>W>Znt|g_7?czKJN8;WEckHwOXzF z6FgFJzuyPX^T_A(w)PqhhhKBm^GlXJA|gQ$i0ApA6$8&-Z@+D!=K%KY g^sFb04g4&<0sb;)cxw)i(*OVf07*qoM6N<$f`H90A^-pY diff --git a/radio/src/bitmaps/480x272/default_theme/mask_monitor_logsw.png b/radio/src/bitmaps/480x272/default_theme/mask_monitor_logsw.png index dc63551434eeaa96992ac1b060ff5f5a6a7b9e3a..38ce6e423c363bca3b31f4313fa6487f0174cf21 100644 GIT binary patch delta 716 zcmV;-0yF)#2;>EjB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj7c}YY;RCocsm*J5CK@f%euKXthWFP}%AOl2z2oM1xKm>>Y5s(2H zAcDR5rmFY$W@mPn;$GDhwPxn^n||H1Br@1+Hc_L|h(zS01AmUyY6WE^%jNRpgziA- z7g3zgXQ|a{G8hb`QmM!%aKGPWu~^9UdKJTIpV=tp^Lg}Xz@dC4jVMp);c$@kdTk>H zM9m3tQbkcNm*el>d6OY(x7&7Xw_AH;3=_T7>vfqWl&s8O}s?d zPjQM^n?@3DGk}m(y+)_|1cc-|cq2uQ@*B9FIraa+y!t4Iy|R zqnxWv+u}2W7V6f2uHvL}S|U+nl&qQsdLpdT>O}}4CeFG=*eGO>XYhDDeu;?;HRL3V y{2kCzw5LI{mpA=2DLQPfHR=EHrwzj)6#M{95zC2hxxSA80000wZ5YQd zO?(P%up=0UN~ee-g0hB&Xs9W3i0A`as-ZBbMsX2}g2rmeK7XX8noKZku!uz3%7!SK z1Svwr)F4yzc>d4On@{G)o4vg~f4Jd%T=(_6@BiUCT(h<(*Qdb(0N{C^Se7Nf z-%pE+i!?DYk$-K?7sc~DnM@`!7!0IPDCptg;Wak^#A31Zs@~i2QISXlCnqOxxm@5l zE^pjNg+ifp{#Y#b$Ljasa5$VbF&d3Rr_(_o5TxT6hQY|l2m*n?zk)*Btgo-*?(PmAj|VF&E2ycdL3?{U;_)~lkw{(_zJCOspPxr*X(_I+ud@-7@Harr0Zv)W>@fQWE(bd=N5o0}UfFE68~ zrw3B06t%UruvjbrfZ5quG&VMV?HjArY77q#rzZyj0qpJVVRUp9RaI4x%jFmv8p77r z7Q9|>#-dtUTF}?m_cgFwF30NXDgYoJk3%Mtp?|BZ3rkB&aJ${u-`|JN=gaBF_VzXe z0s)*(XK~=?=VuTRY&KguSu&YSU%$M(pt`ymD=5LhzLTV5SN#iIb+ObGo(^!abS+)AdyI5GMTax-rwItB9WxyJ3Bjbf{%}nK}7KR ze1D&>jCF*Y_0B&Ng9oYG#U+cbaYUCeSbXxpj0YF9LG^AmC6_w7Z+qUo2kFQpSrud z^CvH~<2UW>?4Y-|7jn5gXD=lb3Lz4SAQp>JS67FHg@ugr`;^s%S|8x`XOc)Hz;PUS zp8u5fxmq6)(QDtUP$h~{A#sYuG{UpO2`tp-|yLUI?Zz77*}c4>vjLm^?H4gwOlU!v(;+l z|3?+G!7AkUXf*NyPN$O>%-Zkw*=DoJ`u)BaYz>eSpl7@vRg3~F0O3_3&-5 zr6AAN;y#AS7|XxqGK7twjgFI5;)M_igfh%pam1D9O12n6zF!neLHN*yl$Fvi#4ZS;6N`YWv$h29F4i%m2wa^PDaheSn|C=}@f&r9Hr~*NrMsUF5#l~Vu@x?pwM7JHLQET@R3{W zV?P)SJU?Zf3Jw|g%D_8iuySUznZNdWy?-~*ZhyTdYmwjQ)RPN8qRNT!(Pro<--9F=u*%T zQevGzW{67TZOZ!)cx$5(n^axOn{Ys*?8Vsd10Z#(B|l;8nOeqYjN>YO z{xHXDuYml>^b-WN%(5SC)GHHAr_=F$I9Asde*wj7xRuDbKv4hy002ovPDHLkV1m(A Bg^>UN literal 1176 zcmWkuZDXdXHIhF3;ntR(YG&riwrLubL+C`{2ci%xDV0dw z@dK=^{m6uq8w2CGk@h2|7@3&S6c2?ChG5YbWkIdeeSe&L&%Hk$p7T7hWc*{rUMl0OMillgnGm5r6>V5A`22ELmFgOAb}AKArS$Q5e+es0Ev+dDNz80Q4A$f0hLh= zHPHc`(G5K@0E00MBMUoB#x%^V&;%whf+Pe&CN#n%0wN|dq9g$lCNYvE1yUw8(j*6R zCO7h=01BosiYyaTGNn;wWprQx6G%Z2WI+>5ArN9A6G{;fVG$EaQ4nQO6HRdtXK@ox z36Nk3lgOf?BukoPR^$X$FojeEMOHM$R01VdGNn`j6;?5oR0UO5HPuuHbyhd^)Bp|E zFpVtEXtJhhX2l|42XjbAaAZewOeb(+Cv!>{aA6m7Nmp=XS948waA$XOPY>{55A(?4 zwkLagg_3ozzl*Q4zi#Ofe;R{kPL-T4zhj0$J@Qi>6jr5ZIBsZO_1kxzU0%C((zYo>Ki%``(c?cHS@d{y*VVyY2W`vBTh6vl_-Ds`S8jZ9 zdcb=5_!b!IYN&sG^MYJgf9Bk-vCsR);J@md2iH8X=a=D+cZ}4}Zg~-5+h;3hb#{*| z+W*~yUtXT~ZOwsCUYPKH|E5dZeQd_uC!RY$?bJK%>o#ERiMp@5ZD3MQ|Iy}q*Izie z_|k2|oBnvK_0aEsZ~e7S$(B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj75J^NqRCockR{^oYFbvIc2tWc7Z~ziO0XP5@015yFfC4}PI6wk8 zU=I5GdOy3YOSfz{-ra7j>-yT4^revVI2;acFc>%@>hu~8hkx#TK06I`I-NQvjIa0m zT_Wxuk4FNg(NOX?D{*^II*qs!$&o6V;5KFsQRy*ew$`gwKo$!apnzNzue#CV@dz|m-w{0<3*KC9KL(B4bM2eG-`Zl$(V-xL;$MY#Ly zCN;+Kia9TN@*MgV#EuQKss)RyhtSMb>RE`I=_lWd7;T&AeOTu#SDOW-&>$% zcVBAmR|-Q3zwh^Zh%rC=kHX!rK5w&PJRXNTa^d-WhA~>jxD8^tRboG@yknhFU@u$D zCze~?PCkLi6X%ko@cDdby2P2{8hBkiWM{V`+c5( zbzsA3ykhKW5?jhwp4x9-uUElHlEg3*7)e|N@GMDDFf4$)B>X@n#^4+e+?iaqTjR>$ z@8Eh#Vjr(k^#K9476~h@Dv1)Y%t>M?jU@#b)t~OUsRL#K6A%#h*5ei8GppKR!n4Rw3#b!~g&Q07*qoM6N<$f>!SnGynhq delta 1027 zcmV+e1pNE^1epksB!32COGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K z00(qQO+^Ra3JM1dI%P+EqyPW|rb$FWR7l6gS4}8%Z5Y1JaegM#n9Yk=I16PVW#KPL zQg#!{f|w|4Nm5p_k@A3%_Y7$wpbRU?ce}`3sYkX@4^3a2(gW`AmHuXXeCL z?s^vIdG7OE=f0oox}W<9B#B=z>Aw@t&(APT^T!*z-EPRTZ12E-EE0*ZyStl`BoV-m zM{aH|4-O7!XTnFS2L=Yv-`@{W6yfoBeiW@~nux_>`19uv?(XiOD2jc=<>loBz?GF1 zCNs;jcz%9vyMJyN1`7%b2!KmVOJDlLfip8R34jj|4@rSHHZ}-=H#ax7K7l}h0NBvb z@N?jqnHlEi=Ti^_0-!9*EG{nQ?Ck6(-~0P}ilRuD%f)Ck`e|KEbXG4fFE~6rj6d(~ z?cw-Ey>^)e?XCn*uD ztE&ls!GB=TIk`4BHwl2cuJgM#IXOuHtgWqe2CVBk{eC|IaCCIkcH@(ilY}4k`1r__ zloTq8!l$RF6j!>PftHZ z@S$%2%*e>#?d@&C?0nn<%gf8oQoXdaL`jl3H#ZlbJ32a|+wCR*N|MB#ot=cB*Voq+ z1c7e1o3U6dIq=!p85Kn#0H&m*aCLQ+kw}Djd3o_@1A#zNE{u(h5dfQ-nw;ynv$Hb} zqJJm~%gV~)&uwjOj!0NqT1o(1U0rn!{QmyV_V)Hq-9=GRk)xt=d3i|y^msg<{F9Q) zvMe?>HpW5I)6;o&qhGa=B1fSLe9EEG{kr0P5=MpsK2U zU!9+yk8n7QP$&ey-~Xd7Ga8LzdU_fF(A?adxUc@u+y6NOhQPKqL>B-6002ovPDHLkV1k}y>@ENR diff --git a/radio/src/bitmaps/480x272/default_theme/mask_radio_hardware.png b/radio/src/bitmaps/480x272/default_theme/mask_radio_hardware.png index f51a1aee1288e069044aaa27ad48617304c48da2..cba892b296c93a37ff1e96da646ba0d0872248d8 100644 GIT binary patch delta 529 zcmV+s0`C2;1*!y)B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6zez+vRCodHSAmg&Fc8fDqyX(eJFo+_13OSF&=Tyxu>zn1=m0tZ zDu52413sIXFeHRFAdutns1whL4sCTh zon$K^GM6uNj(-ag^_)>jk)7Rc*E&X2Hgc>rdAKQgDlwwW^SmWS3*kj<0Elq_` zv~WOHt?&DqT1EeA^YCTslF55@nx@*@3u5*iaPc;p0Vx|2350~yf^5BB%Uw;S+6DMD zd3X>6n&Ec44La!7|M`5%VPe1E_p$&zm^=Wv#<*c%et!&}=Z)5wQ;#t~wG7nj`W+4k z;Cj8bHgkQi#)@E!{BSt5Hk8M#wIWxfJsw-Cu(7iV2Z5+PsRUgN9*a2ArjS$Xui(6a zK%KY@sB6s_kkT*=NxR?gy!v#3(+80wDvTsaq#dGyT?w))Iwz<#dH<96v&3HrArwS& TC)CgY015yANkvXXu0mjf`A_VT delta 662 zcmV;H0%`rK1g-^;B!32COGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K z00(qQO+^Ra3JM1e5zyeYr2qf|J4r-AR7l6&R=cX|P!L^PuO|vhAdT4M3&f-nE3p+p zg4m}}5o{#2Soj|ivDXi<$uGo0Z0&p?*oY(sWKQMgctw+VE`KO@V2WfpDNH zR;y4|6_O+c24?T-YTt@?Cn}XncMW>3?*Zmdhn~W}0T;REMU_Uatq! zG{G3dZnwi|G~#FRcs#hHu&F*Ck3>W?9*?Qp?cU7mbUF>6YDH1F_WS*Z!0Yw;p)=QY zsa!7K0QdWS?l+&$zh2{FvB;x-1YW6Bd~5s?ffNb_G#U-WVlgC>Nz`gJz7zm}=Xt2t z>zGU?*ne)f&k5u=l-X{#@4ods?{%&Yb4hf&T?!+<_i>nOvD4|GSS)__A`qBBR;v{> zO@m<=002$XplKQaz%UGGnugVC^?L&OTWs4V0Hi3&&G=n8007yx9k|Ayzhy?FQHY|5 wR4N4k5Ji!nrBW$~qKIfT`uSVt+fw}vG;iJhq7S>B#{d8T07*qoM6N<$f<#_3cK`qY diff --git a/radio/src/bitmaps/480x272/default_theme/mask_radio_sd_browser.png b/radio/src/bitmaps/480x272/default_theme/mask_radio_sd_browser.png index 75b6a9296d65f5448d59ca22247ff3dc52e721de..3a16e02351e44bd3fb65b998afc1b9f91262c7f7 100644 GIT binary patch delta 675 zcmV;U0$lyW2)hN4B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj7P)S5VRCoc+m+_SWF%ZV*?%n^W03FZ)70>}4&;cEw0#rZ;bU+7m zfC_T?<&3v4mt=R3yLaDvd7DjUGnvWEH(4(qGcLJ#PH^{Tb$2lX}8;QyY|g3%8#2oLJ>yLEXV} zxpce4l_57>E*Ce>6VO*V?dzO+j+W6W7@JHcF8$~i zh9A|iQyKVa=4Zsqqk6SkNw?dTTCFC{X45?(p!Is~h~u8Bud^7-G;ifj51;ML zDX6trmV$D%(r-|)Djko`Z1_lPOzP=8(+YOh?_4PI0+}s2J^!E0`YPG`W^I>su z5hjxfGcz-ooScNgV1U=_#rXI*lu9L>PA6P07iw#3(bLld06022N^h#$+S&+!%gf8W zxw#<#=H}*-BvmRE0WcDYP_Ne$08dU%q$wuJ-Q8URV1GkHL&~X67_m$yd;g$+H=X|T z;EYsYtyYWm^>t)q{4EOv0uV(J8jS`^OG}8wVlWzwI5;@?b+8}^5?HBJqPe+QdRAXw zFI}6>W^8S3!QpT~p-{kJFrd7=9EF92u-ok@EG$efs@vP!34jX=3rQpL?Cgxy)zt|b zM}B@jJ%1h#zhWQ2;c%EnqmcmU^ZAlO3knJ-2m<^1`na>R!@a#dy4`LX32!V#Tv=I30Ds)x-cBlBSy>?fj*X2a)jU5xQ>|9h zYPF`fb7{5Oq=ESI@&W+J$;nBo$;`}zQmKR}iofq5U@#Z}0Q>vx0?}yn$9ep|#>dCUDc8p9^%4MUYHE0XelE3( zqJKz_$MYet>+0$l3WdHFTt5Pne=kk7?E7Ds)6-K74-ez;@DOirZ)uM>J109E o7K;Ton+^H-`6;!s|J}dSUoMvY>WRTKvH$=807*qoM6N<$g7wGqJ^%m! diff --git a/radio/src/bitmaps/480x272/default_theme/mask_radio_setup.png b/radio/src/bitmaps/480x272/default_theme/mask_radio_setup.png index 0010a06ab3955b74384c2ac02990cee079983023..110b1610e5bfcf716bcb2617f450a5000f2278e8 100644 GIT binary patch delta 774 zcmV+h1Nr=}3Z4d#B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj7vq?ljRCoccmyNM0K@f$fZUi?3A|L}oAObQ#1c(3;kO3JW0z`la z$Y9@oTd(JyZL_Ye_fA!p-I<>L@17O18dxruS)qy;hw^+N~ZgHP;&1N&~cDqoClr^*2EP65= z4hwGyGw!-<+`|(8>2!*Gnsa?lDGyaj2ZKSD zhcYTOV$FjnD1Xmlu_&UXXT9>M7=fzPfB?eR>-FANF6S{Eem$$o^?X!J2sKy#3swWr zcDsF5On8g|<`ggpukapE2rcU5olg($N)Lgg7Ji4e+HwfeQF_(8H|M+o=i`ojj+(8+14v%8}4&rU=M`&Q+_-R4*#Df|bwm z8hmkSHGhUgJ5g*_G*y+YeNGn`bpG3U_KS5G5Jp8~wJFgN=LO&eytK-@0b<_zb?`E| zOvq?7DluZ1A2L3CUN}(;74yHO*aW96RPXTwMG#)UyDs(C(=;XT(`{-tMF@WKx#lrX;QJldQ=O|dfbKp zgkT>Der>-BAOD2`S_7Uist!KBoq%0?3N8^S_dL|WA7VBe+R%8oKmY&$07*qoM6N<$ Ef>h*XTL1t6 delta 1307 zcmV+$1?2jk2CfQ_B!32COGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K z00(qQO+^Ra3JM1eG@ImL;s5{yyGcYrR7l6gS4&76T@?PJ(WHVXj#>Cfr$RTnkoah! zRqzEV+Exs-uH2L^)P(+IUEi{(=_;ezSuW22HD=;W>HZQ z?RGmY77GE0wY9Ysiz{Aw;$SccP1D5l{QNvtR#vdJwS{0Xh`6{o#KryNVs&*@*exzD zA`l4NEYxRbXMd=#uSZc)5tf&i0RVGza{z#zo*rnL23^R7q;W$;{?Ea_wMoG!-t0OKYH|tzkdCS z8tSOPU0q!Sz|_=KHa0dgK0aPJD=jTG*y_4Yhr=QCc7MB_Znv9v@7^TeEs@0zkK-;;beV%op0W}VQ+6QfB*hXlHAzXpxtgK z09I5~Fc1h_4D9#&nVOnP0PN}M;cex^hYtk6?CfkFA0J2kR!%YQOuS*FY7qTB6`u-n_)V_I4o0dQ<=?CMa5LLn9u6c7O4zI`j+@9*!^>2w;% z^Y?N(o!sBw7xpbJEd;=tnwrb=I2;b++qZ8R9UX7MgRoCZN&)~ZEiK{Mvwvr3Yiq;c;9z7rWo2aG60( zcmYt7BznExh_Cm0y_6)007Tdi4i1=`n;Q|C)6-L9s53J&34qU^Kj+7fAGx}^Djd69 zE&`yUC>Ih*Q4|88%jJqFvr|)3Oh`x|0Fhb(_?-IDYOXBH1VB|)F9cRql>jKqa#VeC za(^-bh=L;S*kZ8&08UO${*yMCn3yQIWT@5Wgz|ViI6XZzY$_})1OR;g{P{x1=el!S z00@Obn4O))`}glfv(a_kNUqx2S_83)i;KCrxp`x99UUEs>-&4{?(Q1zcxh>g9UUDk zEG(qiY$gCcdGbU!KhI%FlBg&ORaK>`s((}zMSwb;PGLVVFhBrIOG{%{R~IKHCJY}P zwMh&Q4-){BlaodDinV~Ot*sFNQ&LhQ%4JkwpU+2|%|-wm8XCHB$t210@^S)TYisM( zz^`7tA^=uaR^GZv%*@OX08J(n=jZ1y2G(_*B_$=Iqx|^sL+Czz`oyNDCjR{SGk*dg z7!0zzyPNs>`J!ze9v+H5?Ql5g^Z716vET1!Sy`C?_jo+4uC5k$X|-Cpwzg*2^YZ0O zp^uM`XM1})A3S(K0L;tFe){w&cXoC-GBQE{tgWq$U~g`2E=h8Ed6~t< z#gt_^YR+E?Op<{>fRmGx;`#gc?*zca#6)IiXVYf0(Q3640AIX#VHg(o_Vz9%9%5x` zMn*=|Jbw4?T}*yVvHm;l?(QNK3c+kPBOxIHNl8h#bLWm2?5`^^1OHp{2NdiH)Zj7$itDDc~PDFg0&1UZPdS%B69_WP5$K%lr(fNGt0K29D=D*;P4<}+wFE8YoYx}M(s}ZeY@RcwOZ--^Z88nZ^8b%X&P;9 zkV(7fem_?s1Ri9Af!AwX=riR*>z+6?}u~6Pb7FvSKH=#MW428z3 zi&E_sgUgVVNnP}Ij#{{IqSNU#3QF0VtOoAExw^Wxj;e*Lg;;Ch@-9Kqx1<`l76gn& zOd2MA2rV57wQ$6embaW7#~V_G2mKgm3C?Q7|Ak4FEn}c5IH4X4VTW+Kt*`$Bwea<{9 literal 1195 zcmV;c1XTNpP)(hI=4z~+!amKXtZ(xQKEv;oUI4_wP-s8Owrn&c= z`Q3Z&SvUZo|51v6%ka<)9FNSZ!da!dZ5v0AP53xXJ_LB zpP!$h)oR6)DwRrE=D?v0G4H#osUtb3Rn9XKnWo1e1YHMpHZkw^rcot+>e?Ck6S z0OA(D*=(kjl@)TiTx7LcX=-YU4i670KR;h$S65d@85tS$`T0ptPfuht8mX_Zk2sE_ za5zjvL@6mL(S;vR6B85Qc^-Pb9w#R!3HgLVA(WJqfQS+c>9@wm$HDVF3)US4o}dkeqc55M1!}Ng31-jjC@H~&q%uIN_ z-k3I9TU$`8)lo?k3kCoj5PLki-EL}XY9hT}PwVUJWHOneY__+z$!4=rC={al`g&rF zQCeCWDHIA)tJT!j)<%LL$WM!J4G#~4F%~yL_V@Rp)oP(sD&g^Xu(q~_hK2?>91gs` zzRE@|3YZA&;NSo{oeoN+5=%=<*xK5HN~ID*X|-Ar3M{pd6s;a6e*wxh)a&mIO7{kcONX!F; z!(p_vw8#RJlas}I6yLD8xEO*UU}a@R{L#(L4RUjH!Eqc02M1%qz7;RL?d|Q-8vAo=}%3WY*cSXdaV^ZjGV_R{}Ke*qfvkvN2ZqrLzD002ov JPDHLkV1kEi41E9q diff --git a/radio/src/bitmaps/480x272/default_theme/mask_radio_trainer.png b/radio/src/bitmaps/480x272/default_theme/mask_radio_trainer.png index 7a0b56970779259ac9771f98f58ab7cfcefc5822..806c1e12cc5886c64145039cfeb9b9630aeb77d5 100644 GIT binary patch delta 589 zcmV-T0Px#1ZP1_ zK>z@;j|==^1poj6`$0SQRJ0XP5$fCC(W13&>d00-az z9OUQAu${Do()6)2H-)yz-ed1lb0s_;54T#a+-Nj%X6B9GvwzvlolYm$6)gO-*=*ck zFes2=zh0p1e)XO%ZUd3j~N3+C**gJ{6P6#FLjn77(Dah;wk1HDNqRNwXj^57=facB3YtCw1T#zK03GffQmNtQI1ax>2i^ zIB>aKl1MdxJh7r?O#Yfk64iV@cj4M((}v+V-0gNBgb+wTVgEKE_UA#k`F_7I)Qb#Y zIykuEUS|C<$emfc=O{rs5 zsuguUxvI|An8KTyPN<(B0?I~LrqOJgyD{i6=-Lo(cD-Kt7_b=D>$UZPltq-tw_Iy605BrK1kmc;#!}IxUed6yuA`5jU3x~tO`oe1_*dK#|&|`?z bzANH?OZQf-fiF2400000NkvXXu0mjffPxC{ delta 1010 zcmVQm*&t z+qth@-oah4250ZJ`R%n?>+EMs0D%60G4zLwEj0*$Ha0dW7z|P<6rz`x7iw#3qmGUa znwXfNnwpx*$@qswqfzws_JUy;bar;a;c&p^a$#s_2nvM)4Gj(0-Q7i{Rs>Ealc=w+ zhhDG8@$s=B_tjXn%j7LZJ{n zJUmcqYb#kS7BU)*<%`SVaKLCZir%ru9pu>NT<^zlgWsP==%Da%w{vazrPFOc%G-Fr6sz%yQ4rLAk27ka}z{_=jUfp z8Ta@1!)~_&0J^%m1euodt*tF#am8XWa2yAx)A=p*?CcC2$HC|GArgs*f)Wv|R%_{Y za=YD-N`Iv|Iyx!~eSLj}(P%_VOAE5uEY{c8MT6C9b!l)emqT}VH#m-i$KydJlPS#c zJda>72(4BNxm=F(^K$^e^7681utK3I4bH>eZa1o`s=%@=OePb|W;5h+Ifw`Y0|SV~ zVukq2%S+MVzP`S~I>GJ4vMjk=F1ot9BER2HT7RvUo}QjasZ^3iqalezLJJEEbaHY+ zL`2Qa&D7M?B&rkac6<3tB5!`bA1up)h@jKyFg`vGr_+hCv9UtGYBU-Q4i2Kdz5Uy4 z&1N%ro-cpYJkMi#dKyH8+1Xj#-rfo}wYazlsZ=WZh;25T;J+>akBp3f<2bCWtO$Ua zOn(L@lSwp?h|t*Bh?|?6U*ArLhld~{92^`70#m6JR4UcKg66%ht`5m$vOL&owZdYt zpw#i}_4?m}=H2V{mIg;65ikscot+&4cye;GB51x4KR-W(;F*~j=yW=KeSHajj}nQb zVlWY5dwW~h$MJZa3>DGg@X zVzoOzKmVgzI+x1{b#*qIrFc9}KA*2Jxwf|U--D~Gt0^1~lh^AlOr}yPQmIr0rBSK< g{UIRv-@Tpw0@Ya7cjyPQPyhe`07*qoM6N<$f_q)wN&o-= diff --git a/radio/src/bitmaps/480x272/default_theme/mask_radio_version.png b/radio/src/bitmaps/480x272/default_theme/mask_radio_version.png index 8730f6c1a51b2830ac6d867f3227fdbafb33b039..96ba22ff8d3d56dfc19227621922ee2228e5b202 100644 GIT binary patch delta 407 zcmV;I0cif91hE5Px#1ZP1_ zK>z@;j|==^1poj6MoC0LRCodHm;a4KKorN{UG{%UpaUvE2Rc9nq5@F?Dxd@%P=XHV z02R#5caq&$=gyuvl1+S*2{SQ1Z+^Y^h8S0tWlYmFMns1eFn`Lj1d>rv6o&(s1q1zn z6@A~6VHgz0F{!FbM=6RTYTK4LQ`ChObzQTgRaMnv)Sq;s6h(Qwp9-Gqy}@~&lWCgd zI1V*U^Kw6_%{AXJDEw5gVHj4w1%v);bK!W*HIC!AwlztEEz5eU!w=lg>7iiTw&DH6 z({)|q)Au9fTun5*A zNwN$67a=!;#4PX-cKQ`YT$>P}@p9Is4FiR~0OZ*e%n-_VDh>bu002ovPDHLkV1npG BvE={& delta 518 zcmV+h0{Q*11E2(uB!32COGiWi{{a60|De66lK=n!32;bRa{vGh*8l(w*8xH(n|J^K z00(qQO+^Ra3JM1fHz~kkn*aa-tw}^dR7l6|mOqNZP!PtytN|6l3&cP`w6ag<8PZtU zD(UqA7J@cnrHuwe@8AtQfEGdu!9Pb3MIX_8TkJ;GRTkZ3SAX`;2Z1n|yx*J2WZp<5 zi3jKj50dQN2qDnzcG2l{uv)DGg(MOQ6bc2Hrio}Y`eNj(TCElVeCgF_G&~$7?;B?_ z8BC{B)a!MarU^-s0*koU>!DOCA(>2KHk$zePT)u+0wDx8n+;;ISfHss9*>Y^*~{?t z;tGXAffv%XHGdyg)xN=w03sul|gL5SY*B7>!0Jo2F?ufqfO%U@$2kzFKBBn`Jtk zKAWo)MWL?iTr3v%wak0Q>|8E~!{KoCSv(&9cuj8ysZ@#p*lxG!x-Ns1WmyD3RaGxf zr)IPH<>PIwR=Wgmw_8@LRjR5QI8ad(Rw@;)*Xzr<`p^7M&zE@L(;Kl(6#xJL07*qo IM6N<$g71;+v;Y7A diff --git a/radio/src/bitmaps/480x272/default_theme/mask_stats_debug.png b/radio/src/bitmaps/480x272/default_theme/mask_stats_debug.png index 0dce13d46665b5a1cd2df6f6fe6533dedf3f3474..1de9ec0cdf5a06dc35c3487e97ea91f092cad4ec 100644 GIT binary patch delta 461 zcmV;;0W$u91?K~hB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6d`Uz>RCodHSBtHJKoA^XEI=zzE6@_81L%Mf=m4mIPyuuRCC~wM z03|>LyqinT94L`IIA3CzgviG*yR&n*3wnVp%lg~x)&nqlkbfghQ&RRwlEgUS_+X+t zMp0E2&gV0H--k(rVTh(_AUNfjV|mkYR!evG&% z3bbu21F$R$d7i@*2E?xG!nSRB&Hx<8K^(_0fu|aamIcrA9@ji)S22N?-AS~_K@Sar zpkInn@1JgqYk!l^CML!s5vPYWh$q)E%|&PH%Zd|iHBH>^pTHHLmM=P)|WB@97Yk&z>g7W}K|Cp2husM_HCK zV;x=BVJ=Rm)8w;()RdF5vbOprqJsvzUayO#-t!N9iAH+S9M}HU*}7UgA!*O%pkBy8 zOhK8FWdzMb6X8RjFUqhxx{Wnu7kXE>rJ&j99jf{Ze$TCi?A_iY00000NkvXXu0mjf Df49y7 delta 616 zcmV-u0+;>g1AzsQB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$R{z*hZR7i>Km%WPWP!xq% zLO=z@U>dC?mGb> zNfOTI^I`paNOCrt!7vPHnug70gVX5*Ap{DA0whWL>!JC4es`<$`8*86_%xPGCgFJ= zgb>hm9j|Tn$mh4W*R1YzI#5;h;SK#o68WF~JG}#rZh}Aw1d{Xs0000n*>tGZI@PA^`gd(XO6ap%WP!|`cE{;xqfj}t~ z7e9fEFDT+>!BND)7f4s7u6F3)AXu!>L995`LFphV2(2`=|2t?OZs_f`)m}T?1A*}5 z&{x~|LbM73IFB9UM&mlJEQ>rz!!0-)nKBuNjfY1+3?l8i>91i;D3Nzb~bX&$(% zyLxSH4Yq9q0A^-pKK%w=>3DyCUu>dqILvan{MU{@g^!PqKSj^Z&crtyA0KD2SZvDa z2wq-ZCID`2ZM8&mxf~6{AOHq~LEhZl{4uX>czb(W{B@EfF_B0#6?=Sq1pxYw(XW^TW~U&q@pMUz_GD0rqgK- z4h|9k4a4B|^)+j?8t3Nb1iHDoDS&#t&TKZzY&Og1=jZldRaL3$IstHKXo&fIo+Np3 zaY4V|PXIJclaWY7p!4(dp3W+jigC;bbyNk}Q=}4zaOWkrzcV1l>|eHPx#1ZP1_ zK>z@;j|==^1poj5{z*hZRCodHmw^d`Fc3w*r31Kuj^GH6;0kWw2I>e-pd+|}j^GA5 zf=-a;2P)MTA>b*6dvb*-W(QUF978BNm=seeGIG;rSt_c)7T7!Zab z@;ry6%Cf{XP0&o!UuPk$Pwzf(lN{KA9oT`5m~xp8ZvhuYVKc<-@pXE_Qryp~sx~&B zu~eF-U*GGa5T}5tzVA2vd7gjTk7NyI^)Qa(#-@u1v)aA=NbaxxFR<_Xh~wC1$T{F7 zNziqj)tD9h4o3+|Ez7dLd)h^c@%MHYpHgbu)-2F$i;g{|ZxNSWU&tcUV};L@$22JI g?jQ(|Wts8n3k!)QpE0Q@y8r+H07*qoM6N<$f@ueolK=n! delta 520 zcmV+j0{8vt0-*$uB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$Ro=HSOR7i>Kmc6RtP!xqf zC;p_2w$lhbW2?N!rKb!E`!hJRVc8*D*~qm^how3Lv&^ zOVqmEZURUqlYjBOP;sfM8cEXMl}@KaUTjtU4gLoI+u+q|MXS|%J=nHw4u`|*!Jkq5 zZSfiH_xr&5d_Lp4Zpha(jY6UD_f7t65{~1%`@?r#_rq;)G#ZJBh~qe+Ch>G)MNv2& zj{$GFT(Vd!*zI-!KcCOPxzDGLx?C;?*4yotWHK4@-+$BpSJjb#HBF;dt3CISS7o_e zP5`-FF44_AzjVD`1rSwL!&P0aR#~st3` zYZ!)~*dK2JEX!gxn{hgwB1!A1SS-@*cBxbLfb5k3 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_setup.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_setup.png index 2a39d1e4028f9e4b89da1e026743bf5685b7b41b..d64e6b89b68f6a3e228db3a452a716e1a04a651a 100644 GIT binary patch delta 292 zcmV+<0o(qm1HS^0B!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj5)Ja4^RCodHm%$B#FbqY1s@`D(7=aPkfECyPMu7=n1lWKLU;`K- znZS)xC2D&&JtSYU(6#b@=?C$_24Gz}!Rt}FV!{|4uI9vWLp zS(b%7^>G3xZ~`ZA0!I!u#)Mqebxqs0xmnChJ01=_ZC?!Ex=$pc$LCQbwZ0000KmOYAvKoEq> zVL>xJgr+9mU=n$Og2xc?7RE+`H!v~OKoKJoJ%fqh0la~|$$#o9k7Zf#X9Ei+m&uj{Cmfn@h@MSw210qA0$n`f5Gk2mF8^@B{ukc$r9N zY$D5>+o`vX#nD%PDHLkV1n96qnrQ$ diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view1.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view1.png index 9e67515ece26a02963687415d5f7b4386feadca5..d1fedd0025498be6dea5c9558ea25fdf6ba89238 100644 GIT binary patch delta 262 zcmV+h0r~!r1EKPx#1ZP1_ zK>z@;j|==^1poj5w@E}nRCodH)zJyVAP@%NKcxd?gJgt^kdd-MMhH%zqqvD~pc`C0 zsV}8qAJjs)AC3@EJ{0Z*rD&~b+cpBwwb(GmFiBvvH~3kMV}Ha+zny$~{|wIqe~Q2Y z3oNj}Is3ljx~}TFW-rcpo)ki$lFFVouyZbBMj)T$_)4Hx>;ZncC(oO>34}PLU zthMz;-1KPN%eBfTk2r4nQ7Bt%PCQ|}_fSe9#)zI-mIZ0FVxDKb0E19o%V;i@F#rGn M07*qoM6N<$f}90xy8r+H delta 373 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 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view2.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view2.png index 45cec234d5fe578d996c3129ec5645d3247dab6d..69b8e183392d17986b4e30d92adcc40750cb679e 100644 GIT binary patch delta 363 zcmV-x0hIoY1cn2UB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj68%ab#RCodHmSGKpFc5`r%LL#6Bp?9^NI(J(zyU!4-~b2U014m# z9CUrnN*Du{WmlFZeaZcRw)wcb-W?>QilPv{?+YR_YG9OQ34f#@KurVJ1~{GJ>6Yi0 z$HVEm(vM`p7Hq*5{D0sZF)B$C3?1@3kEUs&s;Wp%qTT&069?lJ8pl!eeJ`})INm$+ zJv0nM1p&};9Q6)B{ch_FOO6rRVHi|s5n`yW>v?TYMuvS9Matu*Y0QOsZPLp*&-j4T zz+KlVXqu)+`(${b`gW@yy5qfk&@9W|<&_^So5xE@83*e+UN(@WVSRmut!1`tySt`q z`$<6%u!Q;(Q%r;cb$1q2*Z2i_LA%TId^;qJa$T2X4<~u~=nf#HJ&ZWtAL;-A002ov JPDHLkV1f^Kmg4{b delta 499 zcmVKma%HWP!xtw zv>*hWfh9dNk0C2&J9Nc0E$70IG{vCgii?}z&QtF3`C?f7-Qg^LkQvF;Db5m z%7Nd5bG{0W!fB9mPntJenx<{jv5n=;a%{u(5B~e$Jry6xWHNM+%aLIiWKXB`G#rxa zy6a!^FZ3_(=6^%4hlLP;lyDsfkPw0vKgQC@J0#f3rP>9ZPkX~(@h-iJERXa{5lXx5qU{5AUrBb1em4iE`2}p_K zVsY(oDFt7gp950jve5{wQ4X$Et9YN!aouXIty2mV-gy83 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view3.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view3.png index e5a776b0697839c4b244031969b5c8ddb55ca3d5..ae2ab782ef701c0d759bc831f7659fbc6f4fd251 100644 GIT binary patch delta 383 zcmV-_0f7G11eyboB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6FG)l}RCodHmTwJ%Fc8IW%LL#6B;WufAOQ#904$&Y91s*B0UUq> zaM1NNyM=7)hlL)?5?*qFHS2zR_a`kWt-7vN7>0_7L<5YbX@7uJ1gJFdH2|k0oPKhC zd3-orSNf4o@CiP_C;0!sH*zG;^C-(QisRV4&+|-O*O5Mntb3fCIKwcQb9Px4HBFOZ z<#}$~vmcryiGcv9-I_J+{JACu4uZgd@Z7Gk#K51TC57!q@gA7*!W zqN%vS%CfZW+Ye@kxTpgPc-yun{nkCGk1O~$Jwf<)wpo)1p7jgrfZ406iq>@{N%_7{ dx)IHM-vK!DW(7oGP(T0x002ovPDHLkV1lRVs1^VK delta 572 zcmV-C0>k~91JwkOB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$R(n&-?R7i>KmN9GFP!xra zjNpL>+y5Z)8zQ@q?opLGU`$Mw3|T@UX-BVtt_II<&Cnl`CVz%{3B@==hh#7br6F1B zkiqF72jORmPnXKXwN=_!vZ3_A9R%m<blS-S89}%V!uDLEhwOah{`+Szq#|NHPo8>a8HDB-UhJs@WSI)Kp0Ik#0P){V`0)SUL zJ4mO~a2*GwViDC^4PUOV!W*Lc)SugJdfhImHBTB1W`8X!-f%sxL?Xc#j>G!lA^V<3 zdwF@j;mX-Ihy6Zl)#`l1)xE#RU@(BpWP)M0000< KMNUMnLSTX{1Pjan diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view4.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view4.png index 9064b940392d72f564dbaed3e33134a5e6d4ee48..cfdefb3205230cea02c032b17984ac2ed6f9f12c 100644 GIT binary patch delta 342 zcmV-c0jd7_1MvcoB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj621!IgRCodHmSGKpFc5{0Wdd*j5|DrdoB#?45>NmVkbndnfCF&Q z@hq9KZq0O4Agl9tW;%5HZD#Wm){x7@%$2_yz8OpCq8NEZO2|n&<%Wy*Q3}EQ*3hJUi>>Y<0_O zlc|#xY4(n;@lTVXmi~Fvbxq?q8h5#J5ngI+(mc3^y>+H4&DM=Els){$_3$K&l!IcufmjD0&07*qoM6N<$g8258CjbBd delta 480 zcmV<60U!SH0{R1xB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$RcS%G+R7i>Kmc44iP!z}i zDGpguG6XE%!Foq2bnz9WNRiM%+edJa792VV1zU8vqAf)Th<}e$q4)^R*f=zc6(Qhs zI&=Sctfzm&m<#NvbaqjuxDnvv`Ks!l50RZ$N&+|wKL7Z~}Ak{eMB!nQ(^L!iy zU?GHb;CB;3`~+_!(^Z-KQvBvp6eUWPx#1ZP1_ zK>z@;j|==^1poj6DM>^@RCodHmJN-BFc5{OmlJ>kkbndv-~e!d1RMYgzyUZw0usOh zIOz2?N0ZxY*-du3n@xDhr0LM+V}4p7snm6yjN@1mkyitw?|*wBB?0Oicx!;uD7x)5S;0yeD;BR75k|dO6ne|yw6jndW7pE*s>5^?dTdIQ~FwqGi{+LZ{ z;3$gpxUTC%>)F6z80ryq9)^LYX`(#OPxr9Yc%Eln&u!b}vMi>)bzQsm@cquH2&JmE znIAfQUchHrNOIHk-!qnTjK;z_-uIoxaWsC+&-8R;NaZ2*655CH)<-^4T~(C*uamPX5#G}HSl6!fhkZ2Tyt&P-tEF?h1*S~U*GFL XK5_rER(Q(V00000NkvXXu0mjf6$hzB delta 524 zcmV+n0`vWp1EmCzB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$RqDe$SR7i>Kma%HWP!xv$ zlx}XODHgQD-L&e`K^MD92Pt+Gq^mC=bP|M4_a%yhLyO?h!G9rxFJJ}hQl~1l4uVoB z#srF|OA~5iq&A6x(jU%{aFUO6?td;vAR>YX+VKJk0H9APib9-oVvG?0M}sj&oO4nX zMaPi==A1hY{2rWhGuVwvS5>Y{(9IpUYW1UcE!5F@wlntb#e^+*z0YS@0hs`0s+KhG5CDG z?Se;x0XnS~-X;^=)$2G6h1TZVzN=5uX^5hThi(^pqKNZs7WrHbFQXBTlS$0y^QC-a z@38CYRZ%XLh%}8Z@_9>FyK;eCS1JI2NH}bn;|e$yjei0Frqii)lHFDxMIuYjk|a@6 zmT94?luRTnTWuTsIv!J})uNkfmE=Z)-W7!ws!CVo^4gorwyV!F8Jwh22nB-xfTw;R zx3wDX+ij~318`uRHkE1hVT`#B{mL-Fg+jq~@DjtTh2A*hZOgOO=K~O7?t(2=YJ&g( O002ovP6b4+LSTY;59w+E diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view6.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view6.png index 2aa43514b9cd21e5473db3f89ddab3af1b3ae442..aa6947cb8b95ab02f0c4255dc98e8f67459f6cdf 100644 GIT binary patch delta 388 zcmV-~0ek-O1fK(tB!3BTNLh0L01FcU01FcV0GgZ_00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj6G)Y83RCodHmT!%NKoG@WFZUfBfCMBU0SDj!aDW9AfCD6e10;Y0 zaIm*;(`i~#?k?#rO%q-+;op*9X66knlvdL;DvBZnz-f@twtp>=3WT}_Zi8?fk?FI{ zFV~C1^@TU-1fSp&e1bm@{0+7+N?pkYqoit6=vMfr}b=`04?LfmY zG%$jTqEI^XzuvI}?)%<=vn>19dMoB)U*kB&x~}j%592tR(7PM+Y)>y|tD(2PveX)S zyJjWes?-9WrhUou8rPnS(VlIutj;mVhau;~Fqm_W)>c-)>@B6Ue7G(_O? i>poiwf&jYw#_d00axJL$c&WJn0000Kmd{HYK@`Wo zn}o2C!;(WRC>ET8f?iCM9;FgQDm_c^=#N7VLjR9B3pwbar+*v-4>{z}lW0ooMYPGK z5{N>nh~m=1x;i%c?WMbz#XIke__0zZCm%+JG~ z_xIyvI*nGVg@2vhU3@=0>>lhsXb$=-eAJ^CUW^$6RvRST{ zN~BWEPfrI^YE9F4X<4LF92p*NyO3p?{JgmtoW|dpO&&BF9scs#8h@Ug1gCMWUdOYZ z9wZWpHvbDDaB7;}H+s$Z?bH;h6z6AWU0*hnA(i5Cu^3#bBasN-udI+tajRNorCjFK z`8k_=dr?fKQeDBmO&~M*JYJ8D!7vPbsnxJlEW)y^+bRqI2!HeuLIe)I$#B7iLLqQ) m8^aO%p$B?bPx#1ZP1_ zK>z@;j|==^1poj5@<~KNRCodHmfa15Fbsr`sspeAjKBsk0wXX2t1tmD0VBXBumNn4 za#49{N#G$)RVgP~;>Xda!!a?`uC{GemSqZnXpqr$9gzxzN`C`CgK+q8dgeTO-+0#p zKT-e(Z~zDJ|AC)ypsK2n=ehBH-}jiN>Fc?ZW6q|sEYH@-9DQk;YUn)ArW_eC2MlU2 zgFi6cuIsAZ^7<@CWLNJsMI6U^LoLf<%yaITPAQXHNPKG6^q5>Pa%J2WMd1&8xV5y9 z40s&Js}^z(<~yuR@GuPb*4(It^UzFNlS>3yWJatBo4jcnY}*D&B}sz1uJzC51*-Kw Ux%Q!WssI2007*qoM6N<$fKmN84iKorN{ zNsQ=vmLzm)GT#IA&7A-gz zL*(z`1vRM_lUzXj!<+8C`|;gLI`lqK}3lL=Nv)^_`a`j z2*5&!#DQN!2oVOS;WWy*5>vy)7>m=fwWVe`v*G#&|9!9#_kwNC$u!N#GtcwrX+DoG z3?B3^-{!+)0)I#u8E38=%2$f*c&}6nIX9}5}i%w^CVO+;iaXTF1ZZwKK3w@bM zL3fKqKuR3dYI?zLtA&@v0-L#*gMB~F{oZ}SodpEMePl-Ma0^nn>;xF3&k(?#$9n48$oMMPxVHl4TIbUhfX zU6cLl!#PhK`jHWU9mh!>{E4BOt$U#ldaPTStv+u9L(9yJg>Q`j0000Px#1ZP1_ zK>z@;j|==^1poj6IY~r8RCodHR#B~lFc92(3UB}tZ~zX#0Z70BNB{-k033h=B!B~O z(AU|#CFJFL$>rL+k7JTeX_IC;I|GH3M%%V33`0dkP754e*MEUh5lCGV{x6WzJCxp2 ze*2re9Y6FTT*MdgMSKx|IdPun)b~Bj^GxG7^8693+&E=f@;$q4n_8Ad35udH?RlNl z^Spy72m)S<y-U6h-7rvG|D~A!z3{bV1gvE7l3-5h|fro>Az6J_I>YEUymK ziKpjO8+^7CF8!rC+Kp!kT3y$sJ$8uUBfe4~74oX8%zMx#TjbAJLpYu3U2{?30_P1r oAbm~K9Eo%V-}gz|!AbuGAud7G*o{rL00000NkvXXt^-0~g6S-%G5`Po delta 634 zcmV-=0)_pg1Cs@iB!2{RLP=Bz2nYy#2xN!=000SaNLh0L01ejw01ejxLMWSf0000P zbVXQnQ*UN;cVTj60C#tHE@^ISb7Ns}WiD@WXPfRk8UO$S5J^NqR7i>KmO*P;K@i9P zPYS{V^&s|=LVT+hQZS_7AT$(0KS1cA1PMI|Jq3h*hedcKP=6@o6o^fw_YjH@3We5l zMN{;UG#5cI3Fyjh8~(l2N3B}g=!;M~u$N)y{g|2m>>GAt)Izv6nH%aK|$x4FqXb9216u)r5vTQr>xAFizU2d-DE ze1CK_;0p$WY&V;Hy|?F&xNO@-GLb;N(HQV+t?}jT42$XX_~1!1Zq#bLY_%APL_FX9 zr6p2p7ISuY{VVmO)m55Khu!mYzS-aB+k*ps?RMF2HYpruEO;s#NHUSY(~S)X$AK{h z)mjZNcXrTjw?|bNz!c{AZ*6Gx5kmM5{h8r`v)Qcg-~mRz**Cq=dp*8so7w8~9fuFf UFuqWAiU0rr07*qoM6N<$f)5QMPyhe` diff --git a/radio/src/bitmaps/480x272/default_theme/mask_theme_view9.png b/radio/src/bitmaps/480x272/default_theme/mask_theme_view9.png index 5fe44287f173e6e9d42e73b7cf6ed1af7bd1f823..b95b3929f0b1bb48c833b6d83a6ab15bd19cb9f5 100644 GIT binary patch delta 385 zcmV-{0e=4d7@Gr-BYyx1a7bBm000XU000XU0RWnu7ytkO0drDELIAGL9O(c600d`2 zO+f$vv5yPq9{6T@8rZOib9>U`@V~1SDF_sWjN{FdDj>CMj#o7sYT~}2~&&?oy zN-RpaFr82=d3ulI6l-zX;UmU)CKwY*$F(d=GZ6SnE}O|UE%ep-GH{Y4%4_fISex9n zOl(=w>sM_*;ZWPQVH`)y^9;Fxm?dQurv<<8#-%AHv+g7g&W$WGAB+b#fV!^Fr^bQ8 fFhri`YLoc_?++}y@DY`+00000NkvXXu0mjflQ*NS delta 3193 zcmV-<42JWY1N|6~BYz4vX+uL$b5ch_AW20-HZeIiHZ3wPF#rH~oSl|;R8!d&htIt? zy-<=6ij>f6Xi@@54ZTQ_E-Enz5K6$103tR-RB%L5k){YTDBysjLy@r}iiH7DvFijG zMAUI`6dRUFWUU$Bym{}n6@-c&M->OB3XhmR+Dq`EL(i`nPm?-^D=}y8Ow9d;$`sU z+$ZCWITF5%k$+$r7v~80xiY>cV}o=_hCs$|GJ-AR zc>v%@$zSl&FIdda6Uz_9&dgda5+tXH875p)hK-XGi{a1DP3Mcn%rFi&jU(bQ*qIqw z9N}^RX3zXt6nSkKvLZX!I5{{lZ7prSDAa#l{F{>Zc7K*$gn#ZCL?8IW_E&zH4FIsF zWwqJ*hiz#U0A1?=P`mwy&0sG8in6|S4t;SRx_n+z#NsSxE34exTuT9;Ybh`2@A{t( ze?wn<&r-hK@8w~5^OHD|bTLC-H*RKnrbNWZ&f;+S4CbGQ_#X%UbsiQG{3O1JFO)?@ z%ce{qOn;WOTgVfL1(`yIK=_}U_z%PWq}jQaiQ4!P(3V&Nr6C$XejWfQDiI(Fdt@un z?|lo#M+5oIi_w{wo%_#%{(V=tO#a9gB!7-$M?^BX5>d|Vn*3Spb<2KHgFhpfn(q_ zI0r6)%U}fD0a7pyo`5Ov3d}$dgoVfu6;g+EAVbI;vV~ZX8{`88LlICMln5n5LP!D? zK>Y--nTj(fs8oB@tL${z&XcGDrdIuvg38ukXun}wpvtUm+2#$mo!O8G4 zIDa25g15kxa07f0?u1Xnm*5dt3O|9T5r7a8I--j(5f;KmLXmhR2@xTykP@TC$XgT!MMW`COq2`C9~Fh-qL!gnp*EwcQ3p_+s6NzH)F^5S^$|@*Yog83 z&gcMiEIJvTi!Mf2pqtPg=(Fe%^f>wz27iO0V~jD57=KJ0CKa;+vl+7+(~dcX8ODrZ zrmGU%CVfuCYJ5?=JPgTC^Ce=38 zE2^*6=BRn7@zqMy+SNwX-l;Rxebm#`x2boj-_t;8m}!J-LZ@rEqJ6vJJH{eOn9jf{@^*$g(bH%l?AF&i?6%^l1I=DW>@EzlND7D9^#iyKT5)03IQY-NsG(k+86 z3oW}WpII4L#anH&>bLr6ZEu}!-DrKshGG+FQ)ts;^Q*0yE!Vcj_J7)3@?77!tLJvl zeQsxN$G6*KchjC~A7a13zSsVPgQJ7Uq0M2^(ZDg$vDWbhi^d9LZDyT!LOXdmt#&%* z^w!zIS?qk+`4<^t z4d)BzcZGt`fY9xs_ri?BmW6#EjtLJ7uL*w`VG~gh(Z7JYV1LPimIbdOy&}sZ??jnI zNuqkA6{8cPo1V8I2F~=-fTgudr?_nHF76Ya2X6;&lJCkd z=T9WLCY2{WN`H1u-kv;};+|5G@>IYUR12P``lr^VzD^5G+n@F+Jtn<91DBDQaa2eV zrV0BpwKMZFhqKJHinFB4oR{rfHYExYHDyEDi?X}LG}+J8fW$Z{}{k_?699m0x|@lC)*8%%N=0R?Jr6*6Z8cw;d=~F3&F?+a9vLa|dHb z$&Qyhmw)WMP+?b5w~Me#vP)VST-jY^P_?z{eRWFpNR3xbd#z^errOuLdAqOd@z~Q= zr&U*4_inFX@6CF@`pyQUhKhZdeL4FcHbyu0f6e;3xk;m`wCTfs;eP3Xhy#7ij?K+2 znk{9maI2(s@?gTj%inl^)7{2wt8b^bmmUI#B!7nEzR6y-RxUoQXYituMT9@NCf8^XGieo$2@NKY8Bu{ILtp7mi+JUF^E#aH(^^exTzA z`+pxg1|0@Fha88xFFRfC8J;(M;)?r~(^tK(p1T%s?b68nk>Tr6*KgiPxFNmCyZPu= z`mN`;b8gSvS#uYCx8$DEy^8yq_ZxmR{jpu@AU!_nJv#7U!Gk+v+_5J=W&iYkyyzkM zVa0^bMDrutN5>|8Coex<_;~zD){~j1#eY95|6Kdbc>FRj6+1QlT=e|YubW?} zzu5oM?q%2sNCXmz&+@(vjS_z;Xoh|;0I?i8K_h$*zI<<07|)BMz7aHr_({Z z-R1+kTrLJ&QA)qx$7C{r-|y!G)3(axax4}L!M)991GCxu>)eN6DxSmP0Dq-YDY!@5 zPmAILQ@Y(QJRT2hHXFv{F&lHc-7p%Be5*Q{OtQin4u|X#i^b6CbnM$Yolbu6cDsei zWI{9=g;uM@YPEvb>qR1wz;3tW2UCv6Bhu;g%@{3aHkHEZg9O`hhDEoHk(B*mt$jt!2mv=50}e@A52N5 zQpo4?tef2L_gJsjf6n=WY0@Ko7ZuoaI=%ZJG6XR7y}a7n?}h-TW}Cvhp%=i^;ZtQ^ f`(EC8S?luw=#Iz*((aR?00000NkvXXu0mjf*XSk1 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_tools_apps.png b/radio/src/bitmaps/480x272/default_theme/mask_tools_apps.png new file mode 100644 index 0000000000000000000000000000000000000000..2d4af9f17041fee0f610b7db1507d8910399e3bb GIT binary patch literal 745 zcmV zAP&45k=kwX*A_HZyfso}=yxng9Y@W?#S!F4} z%h&+OEGmX|?B!;&dD{RZE|*LD%yS0za@1nag)K#BOleNwcs$lM%jHrB<~ZvVAj6d7 zm(RRa%;8CSYOsW3Z*q#w^VB+3jKttbBC}l5z#I&_`)g<<|CL~^8GZa8xScJ@L z!OKsC0DQkah63!h>I^ja7KRe|%y8Ab;3Lv2%a(XxnU7xxLkLUBW#Gs{=eLo4pgyS~ zSlSkc#bTjz6pYj9B)i?NxYvpafIVX8RkND!IeyIxzWX(XV_o0k1UzDI%?q2ui}iZ# z6(>LDz6muJp4RL*%>huIIO{LUVv1C3 zF!c&0*H5q4Yc0B7uWCIKEqv7H5@7jgG}1lhwRvh?i6t#Z0`DbG^B5s~S{Q0X!Ct2l zmDx^pa<;{p31zkz2Gqd9nT%MDvEy5jV6XYThZ?cQIGO8j%Al66n18urfB+AbvT|O} z6w9?hQr4Clflt7V0Ei~p2mo>Glj@bcz+PADW8lz;qfL#0-CcB^(u$MK~ATWJRT4I4`?=<(&=<`b-P^|3gq6W|BvzX0hg;S2rWvy1L zr84*Xy-s!U6Jxwut;8uPnE}0CPx}47vUCPYZ`^J-^#m4y=a3%`hxv>rlS#<{Y^T$y zviH5=11#|_SW_OlLijK|8jVUJ7q6fJD#r5=umP(F*R_T%Q|vs1%jHsu>2kR&Vt|eq z^V0Boy-pehj>lugaEMLJxZR{0hHL1)lp>#T>U{tq;dx=`)G&@eQz4ZG5VVFNn*wB* zl6+qclWm=gE$pe??RHr*BuCb=-|tH$DYk??vAHtVQ#dCLCOwJ+i$V%0jVuzmGAKH* z0ig6YP=jeW7p%wM$XGcg%b@4R%4UEh^4JGc7B(BU%j96Y-RiH4nYg0xQP1mO>w7~o zftNR%jk*cfSWtvt+Z?h%S39L2uEFU;8n|9t$z9tfd5vEbin@?7gH(n}ZLAPScW{FJ zmbnfC*q9%4`Co`aM3~E}n~ecCgs+Heu~-C|gp5m|5|WJCv_&6D?$=@}z(P>p#K5jGbN$}J?ip&KG)9`0&Nhh-ENmn1<&8_HwKDI&Bk+gg0+zZQO6)Opr=;s x10b8R4=_5P&-(F(W!ovb6hCk9@s`tK{{fR&Jl%8S`;`Cy002ovPDHLkV1oEARtW$A literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/480x272/default_theme/mask_top_logo.png b/radio/src/bitmaps/480x272/default_theme/mask_top_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a72bc51ce025fe98a60e90cb0e4fe2524d4e7539 GIT binary patch literal 974 zcmV;<12O!GP)X1^@s6{y91j00009a7bBm000XU z000XU0RWnu7ytkO0drDELIAGL9O(c600d`2O+f$vv5yPCiix2M)dvmNzH%m$2|GR^dT5V(_^n>A-^oS)%lhGJxs5rYt~MTz zvk;y!v;oT6dWPyk^}+WLVj3C^6Rk)-CcBN)L3PB=pRd8SrFmK_rm6x9ie9g$V(ZfH z_tiTvolftrb+l4?V&~uSNo_=*cVXW9F&FFgy7VOsHsyFcs?BCo_#U3|Q4k$NM_-|f zd9Fwfb|I_PN)@r&?Nm%456u_`V=x+xl=kd=g4=pRzvXf%lG|>#|9yd59}Wjm7~nui zk-Y2ExO_xIT`XM?0x1Zip}HgAnuhRegK@Thrzw->YOEPJ9rXkd>tog(xkqE=jTv;k zUe&A7gZOZ7zu)IG_ZzT1okk0cZ&4)Ryc*+0y;%}{0pytQ|6^{#*dgHvg1GPp&@noB zxb?s*3pSi?oL)A*eToTEn>|K!ypU3)<8`-nHsN44n+1jLBDhd0c`jDymdN2kw{M?Z zjjrgWDS@uQ4G6>BHd7)eUv-0Kv#ApAfos8vknI!w>}YT^w8_(n>TwxUx}^d%{LHcDyT)R!2?lt9nar*)xnT*ZkpT*s6uuwYVl3`zBL6>d;J z=ctKh1DRn}Kx@3Ax==Zi)2>%jExqJ znH*owj_J|TKNZk&Ehmr4GO#1>a}1W+do|a@e+bPuN4uzU7 z>Y1#URUVR%WkjK7sW@6TY=RDjy4RL%h(@qSsW`8jNqYXHV>G2}N&3-M3a8k8xS*%T z96UTWkU?W3NYv=HYpCwBL=?bqz*1>O<5XbRUml##MP&|fEPVA(3j*qci7YpJH;3YwnxENKtXkyUOa?+6eK+PQaO40?- zvn7`GeLw08QOn7*Komum<5`|(2!e4(O%IkC(_K+#kg-BFUGHL<2Cfd!6+L#@}u2pgn?%zb*ToI_Tr9KBk&vG)BRjlV~ zuytZs_nvK^&z{+^RNc4Rj_m$zcKqk3-}#l5FEyWf z=JQ{UwtoD6=Y{64yQlf7gI}DLFE2W^=H$WIJI-D1ywd#0@)O^@bl~D<`O3=mQ_GHR ayc&uO4;^k39^4y@_;mk(yubH}=Y9v<$s0%j literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_btn_close.png b/radio/src/bitmaps/800x480/default_theme/mask_btn_close.png new file mode 100644 index 0000000000000000000000000000000000000000..381d509e879c37bd4a2e1564fc70d8837e955738 GIT binary patch literal 683 zcmV;c0#yBpP)U5fjWV2f8@pV4^r-+mL@()6Vp=qNPs(_ z^-7?I(aGO99*=anT6(M9(AJv9N0HJ}EfY0xGAsyG0?$nAEc$z+nbr#(BLUV?C)(l*-E zKz`C3e1exqdb8QkXfzUk81G?_p&khxW_k6Y^?I#-Il9nnwD-*W~qdwHjfi(~%;x59RF~ODw9PuiIMbf}UT;~p;GcDuEf!SfKpAc!<(iP>ysEraKwR`}l1wrMSmYvgpn zOWIXf6G~hxT^2Z!ghv$eT@XpTL^`Z5rMXHOY-vtt_DQmWNlS8xD#TgR(p)06I7=Ek zn0Z_yolP9|vH}lhxdoE-oM@@_X~~89OxTuN?1imf)MEcnl1u0oN0&eg>-spbr2#&) zTrS1A1l~KHP9()EpRSAFw%E7$*r&0^s}tMzm9(jU<~Ous;O&Wd4`&$^$+?Q{(y`-x zx;3BAqZTflZs|xB>#-afG#zaVxL{OR*HKz!J0rOVCa%MLM8_?B>9Xhh-&@1a`(ZgBLDu@_~R2d@z;rG8OZm za^pA}Ypp2?1i&dA%d$WzZsl-vT?fZ;fHqNbehk9^=Xrt_BspKjecwR?vfNctx{Aqi z8c}Dg3wCg>_w_y2@d-oO5u;vs*F3d7goaxLnRt3z;t`OHe;r(9~=;UXxLAR)1|)kH2buyY&H|6fVg?3*IUvlacGk)SD9BhG zm8Mg-JHxkedD^W%iA256-`9ocQ2K;**2fN1E?REVb!P%CqcCjr57V{)bt`<^J~& z5!Rm~n@;;)c1ew_Tk_`UMBlvF@T^(S+`U@w81US0$$Bzj!z!&XFBd+}+uLlXoYFJz zTWr3tzGU~1cQ0-TPWIj# zbx^xKbN(w^?rF>t(pvW|#i#Br^}b$O_0-|bmB6Pu8_j%#EWI;cEh%z%`u)x{?UkEP zHrAW_gjt4vI-}KfBC;=N@)DU3OP}rdKlRPSb8dWwmI=YdHU-9BJL`AHJ!LKH^AK;? Skx>W?CI(MeKbLh*2~7Y(l$I?3 literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_edgetx.png b/radio/src/bitmaps/800x480/default_theme/mask_edgetx.png index 86e5698df8c4fc5aa312824905585b2308f3d697..469da40d580a4ed8e9a4ab01d152ff541cca32fe 100644 GIT binary patch literal 892 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 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_menu_model.png b/radio/src/bitmaps/800x480/default_theme/mask_menu_model.png index 71dfe4de3b28d3d810c5826cb6ff2b28ee8e15c4..d621738658e83aedcc915d613ba76dde8b2925c3 100644 GIT binary patch delta 977 zcmV;?11|iq3)}~g8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP000AVNkl+-r zW~vl?tAZ4;oqtk7P>pmFttz3rwb^WpW8!aRr0yiW-|q{0i{F^^6EKm-_`BUMi6Xt- zZVQr_OeVpS^#PKdPN#*rFux5((pYI#(zRi^To!f}J8eRNG*-?#;lwoym4+wJTfYSiE#>q=Vk`on*4shc{cc2>E7{=?z0&@YY8l@G4-RN%$UnD3h7 zLlqtofKyV;JT|!KU$2*{BQBRq_Kur>gJ*ke*MIx}4VkgZk>-x3PAE7)8GF2Q+pa>V z<(Qf;KA6J4kU>F=nli)|{Cnu-g2&V(08QEy{)LcM0l`ryX)Xvvh8bxY{<$KqZ<3Zb z7wVhc5&4A_(k`ppRgsoCM3Qojw4A)`ExIbwuG@I##^FYhZl!c?8fv8vl4)n%GE>1LhQH;AZDsG*z(e)NCUQ-3y}|%ysMm7*3FlyZUHcB zi^anDjjCHPOH|>a>K4LEJP{MSs#`E?sY;rZyYeLgfE0M%?-LE4ICQt7Dz-#EHscgq z&Lfmo4;!%E*ml&%sn97CKvW-x>OhU&t&RT$W9esE+`3lQ00000NkvXXu0mjfzmUp{ literal 1456 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 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_menu_notes.png b/radio/src/bitmaps/800x480/default_theme/mask_menu_notes.png index b63e587e0a6585bd447c2a20e732c097079c6e43..5daceaace33745dc87ea6b6e71728659fe81238f 100644 GIT binary patch delta 517 zcmV+g0{Z=;2b2Vm8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP00050NkldbwP}%k@ej{gRrP)cRZg=YM#6JY3Vze5`#Dj0DzZn@H24q7vJ}nt zfoKbnr_bjz^lM=gFbKJ>1d(W#j|`fr@t(GY7j27`o2$XT3h#Q^q8JPo%(;1HdP(}OrN%}g-A8KI+xfLE_*(W z>*2u(?beIZ*)1zyK2%=zB$a2M%(t0-CbmBJzSVNbxY4TS_T{zBl-OmG4ac7g z$L4s~9k`&O$YAa(F5$w!vCv$@-FMBmpU;0+xvuzMf6wmIgFe~4Ki?(qG@SGQTM4T4>-xHE7mLhX zm)(}S%_4EFQl?k-Px<;%?z@*t*RP*ywmAIRwmu!<1FV@DMi+1P-21a3eEL(fxjX!# z^IpkiuJ(R)?e4BUx*OY-+Lv+;*l%|JA-7+Y<2nh}*A;X)!FiyDp_A zCOR`R2&CN2`26|KtM^iOus&W;CGApp|mU;2%PnPIkLw(cL@z)qN z?QT7G2si(BlGO$N4UDmxs*Y2xUMP)*x$BqfJV?Uek334j* zWwlBQH)GiG#^mM4+01dmhb@jyy2I1Ae3IkonFUkAiz<(9==N_~EF2iKoH6$1*1MmR z!q0zIemN&iBz@3HKHUXu_Vlzt`7#Ud^7+RTF zXd4(<85p=b`E;OY$jwj5OsfQGFw!+N(lxLMF*2|+HnB1?gJ?)R+`1g7K?80>NoH

NklrRboD$S0Xuh(l3kAxK1?RFFkm&+yC zzKS#q$3&=o73tgUMsovU_h;3hdC(=XH>6BWn7L7(DdN&S-!(;AT z@@@`XE|(_RlYf;%8OWs+DNkddaOKqlzR&p22yR7 zaHZ<^`%yi;*=)R(cfa4Kk1}4QC-}#>#v+W+E0POb>In*~$RHFQBU_@VUIr$UiTFG0 zIf66{G0NU%Px!(qbYR27A+EynZFnPzLnp@sHt`t1(tj5@@hh|GyaS^e?HdAwD3(1m zrT+W+phot_W>f`ItyYMYCjFBL5=`)DwsbG?tOVHCK#ZO7c>HweL_CLPoT7nDfX!_m zvjXjx%M{3~u13)e%6Cw$7!wTIA8T-e!t(n-`n%MsWy>*+-|qY2mW5$3*naywJ*&f zE{n9uAhH-nDwd3C$v$FT71QqSb`w1&;<(3Edw*`UH!-g6X$bagK_(O$zc-k?Te&<2 z3kQhWfNf+UcMi`g%F8HqF++532ytIu+81_Sl?M@%g#-0^J+p(ciH^skY2dt~ugCTW zgMsq3`0Qe?Z&ZXZ3!#8FFCdM!V%~zS~IE+B!;!))k@~**$ zhf7BT5~Z`w#O*3dZn=)#gDy+huFkoCej?cGKprcy cvXb`s0JeE1$x%sfUH||907*qoM6N<$f>sBPUjP6A delta 1664 zcmV-`27me928Iog8Gir(0019xy+!~403c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000fw000fw0YWI7cmMzZ z2XskIMF;5v6&3^m);Jf(000G5Nkli8v^++_fpA~Wv zqc@mp><(v><9|Qsd}=4?f3=a;YFJ7XSu7PSuFKx;dR}*mkW(en;>5GHBcZ5w)$wLc zDU;gW$Z-a1^Nrzl<{xYC`KG4lMSD-9!_FIYjFcBrv1oX4GnxqZ57wTe6)_%o5ELpK zyM{WQ+{psP$n0b&ys*APuGv^}rlb^m{AjIk@y?*fqJQVkc2dlxmwZn*waxeL+BIiu z#~(jg&=219wi(Zrh~uo4RdwTm1r6>wPU*eCqXkRv*ocV&5Hmsn3W&yN)&R!NmMZ!p zRQh0`woFUD2W$G?uX;=r0Fsk0wyu=8xb;*M990UT@<%6lwq9jF6p^4_VKf3^cqM1yN$<6v7EhL}4!T_q=$N3?CQ zQCtf~L9y;XvUhpZ(n+}^fsj*I!66d6559>>U{F`Z>wi8*$ylv z)Ujo#U3e7%n~81|8$0y?P}ua%>MW)coES6H@s6PeEdYII%51jSkft*{O$f z?Sl;!hbnDtRAvINHMg|@IHyCOjz#F|zSd<|y^)z(5&jZ8E~$>=KfI2)?6NPdn!xVT z?tibc@vNqfSF7>%&7qtM8a++2qJS{kl~7zcScy4U0O0Gw**KdLSl$2tIEp1j&KRA( zdZ|iQK+@rvE%R|P@%E?+01P}Uq}W7`n$@e6PfOshxX2$rmH>e8?(31cJt>_B0O-s# zmtcz$(Wo~`5~V9cRg8S$xvv0_{sA4+e1COfUsOxZXoys#9HW$^a>?|4w@tCk$Dgzs ziLPPzCP|oXpE^P+DGbL}>gA03FNJf~CVqHbm#^vDKQ{F;6Hg*;zQUtdosiGS`bw5J zh$-RZ@U%3NloHhj3Th;MIX-9Ip?SF07 z+<~Z`ZECkw=9#diV%1~vIw`^|}DF75>8-Kz_4^#xy3vj#?idnr)pm20Ivti$|42`|DS^+t^asVYnscyAv zATRsEY;(5*6sW(^k$mdU%BULcJwwYM^o~|R&ibDwJ8skiEWi(k*Eh$jZhu+L-ct2S zT#!#ugU$V^*Nn{1q^%K)|YSR9`<``3;{Rk%V}YqQr~p&Y$@7|?e2 zw=?A)yZ8II3zpuo5wnud6r|JsPZ+IPM>0P>e38EN^=ThO?X`QFkY7IZwiylY2tQu- zj|XyHqt|KyfcXXh^bN{>Vt;*2VK`9c3@v8&L*w7iv7XQG)-!5V0W}-$2Zf4%%Z8+( z`-_uoP`f?RI0h8=^!#3A{hi#2u^oN=11GujewlVgzh7Pg|DVO=y>k9<`cZ|P#Gdf! z0000bbVXQnWMOn=I%9HWVRU5xGB7eVEif}JGBH##GCD9ZIy5*dFnKUKFfd0#Oo#vg z03~!qSaf7zbY(hiZ)9m^c>ppnGBPbOGA%GTR5CC+Gc-CfHY+eNIxsL{!-b~+001a- zMObuXVRU6WbZKp6b97;CZ~!teGBqtQGc7VPR5CI;Ff=+aF)J`IIxsMn@l}QZ0000< KMNUMnLSTY?(E@b< diff --git a/radio/src/bitmaps/800x480/default_theme/mask_menu_stats.png b/radio/src/bitmaps/800x480/default_theme/mask_menu_stats.png index 131b64ba68a3da7b2e13781e3b17a252789eb3ae..b071f34021690899d6a5a176c52de8341fa7ff2f 100644 GIT binary patch delta 774 zcmV+h1Nr>73zG(r8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP00080Nkl@K@8=bOph?A~tjOWsS~dw+Yx9y%V6tl#gmN~OYx z$eRWpaGlTR0F@Dbtk-L=Ky3}20va>;2H>E2#v)b}O%!%O#QO z!<|lt`6#}KPd;9}-EMLgjYfm=5ExVrU8?2rT#<4XOkc0psamblcszD`Cs%0r>tHaD ztGrk&#Jwox27i6IT&UaahPs7Kxj+NB-ENEDswR_()4s|D8Y`>=^OK9F)2Y+@nL}f< z>3&iCZq4$aN^G8n+G*MFt%%8s;_u_j*0qf$by+N};&GuqyUP&`ddfD72}WI^ogF=sG4~+y|IV z`XXS0sehp1gSMj$?h-X&w9RJ2!t_>Xm$P^@8ifM89BprdjXQA9bAtX_1Xnzz3g+f6#6s(`t|6J)j^n=byKj^IV zmC#UV823SX7=K#nw4c2`r57$Wtwd>*wD|m#kWi_0tKc=&bv`$dHDWe;67OpZzMBYW zR3FHbeFjD~6x6H*LH-ab4^%4m`<;AIxm*_2j{0x8Ke<Bj&Y5mD(NBA|giH*sE5o7>(765jBDm4a%KSMfJF<)w7ROQL3mD zD|DXS*63A;y;~z@)wp>2Joh|zf4uMadB^Ad{`V$YSs3wgi*f@1_)Lrquq;(L3>Yf` z$(zkrSR&1EGBe(kBL$+PG;~t_09v`fFg=ca(vXfIF@5tsw;}h{q!HbpXq@;> zIS2Fmihc`dJ?#75Q*qAru~IopBHvcJJ`C?%Pw|?mX5duhll-G!teaZfW!S8B%uJ+1 z#*ssap3!XE*OisNk-2T*0k{0UZ!J*K)GPu+xINnR3$u6hta9O^{vPDdB%-s|S6il~ ztb|X+s#B3fb$;Xa;#Q*L@_W~&uVWlI-5VS6G6HK{5*OJ3Fg;&^;Y(sfHnwT}Y5xje|sXeJ&1_9B&N}5z? zk3BZLwl`9+12;4k;H!6#X$_WI=4m$fx{2kBFmeNEm7lMp_hp?fZ4O03<=^UGYaI}I z+tAQWQ58)UmzkFAw*RhZbZXAWhp%@X^$L8e8e!ehE{wwe5Eyz>alVf56 zG5O_$_R97Z3-?Ai6`SZ%3b?wH*nDD-xK=XPLOiM!rS~F80#Q| z(+{F6r!dkwj+*v$H}YY1Ne-QTrZUo3Y=Q^5T;)o9FmSzyAoVm#uE2YBGwvZzN$K&d zDvjHi>G-KyRHOXsmv;(IBZ?n0Wv6;9DR)9SVKTy&nR(igd@BkZ;HK&tXss!xaDh<% z(7pAr`Smw2*zSmCD*8d~QS>C+_Skvr)RQW4>=8J&F|Fy?M>$rMJb!K2QL%XitsDk& zR6MPf?3|D|i@1Gsd%bBEdzEK6ch3tGvV(t4J_D;Fw;riBb3zLf*PuO{jQa4504<^U z7IXwduAbiOB0?1$-WlJ=e)lRmz6hrm(W`x3{oFrcuiKxe^!KMJ#9~c1GRug5_xb9l z=qYf@dKJH;dh)iz6&EO3el3BY=@#s1*Dgr>Fw1*iIwZNqabkZjY=2TwiwWT~JYj@C zGi%@X=;GYgY>|X4PsKyRKHbDHEoJqt+xEj}{I}T|bLwYHx0o%IkuO8m&KB6HN!I^4OEScfJn$q>w0n>zO8^RqQdK}IE1;BYQ7AN039WKT4v9n~ zkw$u$g#Q4<01t0M*dc&YP(mpnFWI7yXk`^NO6>=Le-&540^t8Tki3bW!6ZB}@c$+% zET11t#;V<279(=V*aQ$rWPFe(Ad|@mZ-3ulcYL5HA|S{sdr3o-wFFEIEetC4Tx0$L D?aYsh diff --git a/radio/src/bitmaps/800x480/default_theme/mask_menu_theme.png b/radio/src/bitmaps/800x480/default_theme/mask_menu_theme.png index 51d1758475c2c9b0e8d3cb98e8ff94e3f6e23bc9..d10154858a6b473fa5d8ea2e5b028335fbf4d30c 100644 GIT binary patch delta 612 zcmV-q0-OEl2l51v8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP00069NklYurFsv-t1WVh?}I*~%+RR3x__PPPAAo ztZixFU*Xf3=`?Uy=~qD8UU?R{d7cr6#s-uYt8k3}NE8~j1~9yG8@TO+XcN0nXDJE= z@cn*IGd&y* zDeuQA4P7n{jkxUfdQRY?3sFmh!van9`+aM@slrcrW-&jYnqvQAtGqWh05X|8{bYex yaBhXcyXJ_Hx=6w0Pof?O>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H?oMr;B5V$MLsQWBr94McVEg8&BD`Ww)-b$5fZrE|aR@ zP6w7uCUYqzm-^=Yr={x~I8~0#kWfu>INZt-*u&K#^kjAXhTC4-cRzNGzN5Q!N$2!) zM^&Dm-TXZJ{Fwqj5XlY%X7hRKJT6xdgAIYJ`N5A^W8gg+hd)D4f7L!9&I{& z{ONA~!vY81eJ*$JD`?+yd-d7EN4FDUb3%zf9T<%&D$HcsJP5MoI5$fKgq+z+9LjvhgZk` zveh;^%jWTIzNfiwU8vQKjG6f*W$G>3+eJ;5`Ic|7-9IUIR_O7D2I)=tLx^BM;fL+ z2^P=z;OMmS1=HGtC(56%Xj#1W!x6i;%Jc6tZkRgh@Z8W@O37QEXMFk4!M|^!b690x z&y}$HRyEGY3Ttm}esFL@e{|Ki9YTR!Wk+kh%s0;3ZCcNK(B*ANSy*EeFu|&pxJHzu zB$lLFB^RXvDF!10BU4=iV_hS|5F;Zi14Anl3vB}fD+2>}C!Y=!4Y~O#nQ4_E4Mw_# zM!E(TAw~vP#wJ!qW)KaDhg+8eHE6(XD9OxCEiOsSEkL)#1ZWRL&$N%BZ9qMeAU(nP rX(i=}MX3zs<>h*rdD+Fui3O>8`9(aGeua~Z9Sedy74x-B6$ZoeY*-#&*LPkXEcDwm%wQ_yW=d;O_exK!X zY3{vE^msfj34dh`LLpcR_pjF$je)QjR*k=h!{OI4dRwCe+lHO6^Wqt}HknM^d{Lq? z5SC)wYOR26M?Xo(!k7y#ffl-NEjydd^4skeCmJ1fh^b{Ie;cip&P`Hn^Ew!ev^8eH?yV%)tdw8%nyW?8W$TE|M-aWELD`Fw7~GBC!^U~w=Kz&w=O?145k==Ri_OS!8@`?;lw434`C`zIWya7hJJBrN zvaP8LOBl*a)m5cIXjhzQw$d0Mj3Ktdi*+L>nyvVipy-LovM}Cn=g25yDK}KC{0|U= z_|3$Js>GmZc3@uN&mms&F7I?YDM?J7@F|RFmU!P~4UiH>v`n2Kw!rxW)Y7QrLe*Rf z7}3v`k)MK!PT9&JVO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmLv)6>N<#N+tcsVB3A6D5w#kNlLXc6r(4C7Ew09b2|L zaAH=k_tCBa4}s7GyA`mWX{|Z7GUPn>^8ALe$KyCs%t$Sbdwi^m+TdUIy-d<@B=O?)%Nk%qH`0 z(OG*`BD`6)!RT8~ffC;nvC9{o*{e6rvcCg2mm7 zo~3zfcCGTr?wtNzX~WkawxT^Ic8@Y*I9I-96lC}zo4aU>n9-b!3!gsRR^9PE_Kspv zN!EM8?(eZ~s|zH{w|P0O>&pFx$O?c1wV2pxhg!n_s=b!S?J$^4DH1gc_ zSi3*z7jzi@%sAb&W^rJBScT!gV5We*o8Mn4OW0f1dOg&u`1jne&F{q$R&vj=yXC-@ z8GHTfY`t4WIYIIAH(z`)UGVkS?}{+(ClL<*$5qx|)6V%|Ubr)hVd1)?ac3?%*v&h0 z_^QhW!=g%u>t6ruOeRdfrN=KT zn4M$EIb-d5oAs2Atp8@dgFHEBRE}Dly{MD$^<-K7-}rYL{`^)_-hZ861~_va?w&gP z<=OYDU-{$T-B*%uEau$YRu9Z4k|nMYCC>S|xv6<249-QVi6yBi3gww484B*6z5(Hl zeBwYwsvt!vKq;$aunGnv10z#i17lqy!w@4QD+5C-6ANtv11kdqcPF0?6b-rgDVb@N zAPq*khDN#u79mCkR>me)MrIHViHBR412t&CZ79jiO)V}-%q>8-!~|#$M9;L3p>04t N44$rjF6*2UngAT;;1K`- diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_flight_modes.png b/radio/src/bitmaps/800x480/default_theme/mask_model_flight_modes.png index 1604abe96ddc867307d2c26ae27c7fa56b5b5776..62640736e3f6fa80c5e874be8d55c989a812aea2 100644 GIT binary patch delta 1004 zcmVi*e#W40SvyAn70-BpoCjBppBp z&;dgwPy$o{bO04V2S5d!A9HdZLeh#k%-oyt#b=A%x7w%A!hh4LK^5Tj^|d-24pj*+ zFE7=8zpoyFx@7S2@lj=fg{{}?>JfM@8T|bGRLkYEy@y8`yWOsRzgn%*i~JW9Nx#3p zxA!33>-8?)!^4me@F-8;BoFZ@1D=0-dvo7+fg)*;65<{y>;M3%;OZJh(!kf(*ZD69 zS($_-1YLKH6n|+ZWqDf`1w2C6&(rDDd;y&b872i!iX7M$7iSUyo{h(2bB@7aa1k@G zv*d-bN2Ag2gN6`_%hlBkc49OiG@lFl{eJt|rpUCsP$3p9^>#mIw#3H3x%b7}?gm^^u`RO7Q*t-QMe9^nd1nlq|w5+D>mPfJJ!{iX6kanPsSP<>`{4*a^Ho z#OqVCj(^efFl5X+YY1eTC+<_S9@JxbF($oFOWM<%p4m-6JL zjxH)f9%Y74R2Hed6&=UeHagkE?t-)jFF#vR&VPkRzmJHpr%PN~(%vyi>x;c*1usvi zvp^}g3#^7r07n!(9c{7YXdk0o`U=WuM7pNdsrn(FvNp z;FWZXbT$Yr`FROJxYW^rdU9Tzm2)HMWOfqB>_{CAsH0jR3N&~^y+huYIGS{7NB(}* zYkyuiVKbT!h9`14*~5-8nM~X{7K?>>>epA(8~vWfBWbV%xcHP#*ZO@FGrDkPcBIZm zb(DYQy)3E=J#$TPJ*`s~Cw$A(-U+8vk{NvB*5Cy`V>_%K!t<8bfq6j+(oJks7IX#z z56kw7-zkCZc54R2EkSxuq`oyRHA$Huy=5m-q;F}GqDKF2$ZQ9HvuXj7k@t{N*C>+a zuWCWwf)oV&eFTc~C^bo35FVjtp!ky<=U)Vy{^g()q@AF&72YoeRicmR3QzbaTGape a+xQ;?M3GB+&--%#0000O>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmM)ucwP+h{y4*S5N2Nb`xQHFkj^8LS4;GI_D-#Qte*C zyWMw!g0H?qcx^L-tNel&k4qy>B1LYBW;AYjk$QbuhfCBZ*&>aT({fMBOj6pt;EK{- zhjWW!WO?l6_|ndunOL;vpz?mswoQCRg?8Hilub)BC-=3-+cdH$Ot=3%C+E`A+<%Yx z_BQ|cb5(hN?7an|!RyQI_H_U3R^NC1&XR=}&dqh7uT=SO?fZN8O@tfX&P@}sNC{te zV^7l>V>@AorIU9FeoCFB;yFt>ewpis?RTy?72FCud2oGP%hNY%uItRUzA2ih5I*~s z*L?fp{0XIYnKx7KCuBe6hKEI)xSZB( zWpt>R>}CG;cmR*H<+CRj7$#K2SQ{`Lsn49v)N!}LV(CTGCAo|1gjUE#F|`~&T^+)B zxv*|{3w(D|H&Ln}1zI_(+7}it^9!ZE5J^iwR zZ`b;yO2KoRlFB)9rwYz5TA8g<%O??b=(zVY0R_(ULO_z&f6~=BquC1kpNa2MtdvP$ zZ`s{+lf~hM+c7NxZQop`Cp9Y4y@KpgcW+%0ZClGEvHOwyEk%Yybt&(D*0Dt{?{;+2 z<#l+$xp({5UE8iaYQ4DgQMjaudr|AHRSYwDl5egMJLu)TiACZ3g3!y-6BmaZzAE%n zs3B(3wS&8o)~jnaWCaVFcdha`A@;LOlUtdgbaT&1rUQQ7v6=6>lD-|x=ze>m^qa|cUDu1j;k=2;E}G3F<1Wb_w)(^zESvG85+%7}xHVpf<5zgu!^ zCG)||+db`xYy#bC>WRD7Wu0iKc*(4ByG?>)b6<_z87sFd^{fsXdse(>)`%=AeRjDp z$l2#DoBSy=$4{r?zeQLb)SL88&{zGZ-lV;Yw@%A;XWO*B>XXThO`IK5sXzp3>IPDuaW_)$KW{n9S+`>W!;{wF{G z$J`q5uC!ytf(yX1LAAs+q9i4;B-JXpC>2OC7#SFu>KYj98X1Nd8Ce+^TA5gA8yHv_ z7`Qw6bf9R+%}>cps|0B<(ls>FHLwUVGO#i>u`)7)Xh=NVx*VuM18ze}W^QV6Nn&mR bx+Nw+dmwtIeGF{_>S6G7^>bP0l+XkK^!zzH diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_grid_large.png b/radio/src/bitmaps/800x480/default_theme/mask_model_grid_large.png index 73ecfe089ba5d164d3e9861491e345ecfe494cd5..e07b42276755cef70a52b1f9753c1d43b67c9478 100644 GIT binary patch delta 333 zcmV-T0kZz&5ZwZh8Gi-<004}mQ8fSn010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0002;NklBaoIEK{e!p-xXE%AfrhA82z`PZ)NN+`USLX>dUBqX-U zrA~3UU!vhqG#rWx*S0N{ri9al>$;9mxF&`u;`AqaP7S0}EsP;`z7+nPTF48h6n=@b zatTlH^(Iz&nntFfzVEZIOo;O%+?CLC4n@PEXoG_~wZTE1+Tfs0J?Bs~9EvtLDB9ql fPHk}hvcb6nI%$Jb(=piq00000NkvXXu0mjf;8~W* literal 2148 zcmZ9Nc{J1w7sr1X#-8m7QI^M^WoGQdpb%m#V`8GRjIm@JW-v*GVk%2nlQsLUEQJ_b zW8c$5DO=gMl66Sl={)DW=e+M9_kPd4_k7OxuY10atSwEr*w3&70KjEtYJ{Sz?4M!< z(Ys99^A@^@V@**=00@-G-;1EZ_Ci4kx@ zelpNXpV;uGR|x>X!T+Zifb>iu`VveuLmGounEpBqVi?yF>;?d)x==KRh;j)L#|Qem zd->qRiMQ}Lagr|{08Afs+Fy8+0pa|zCV+@c@L>}pQ(vv!zP@*GwpU8R;OBOe=Q|D_ zY;S&on#|78lFDJk@C*3UYq;vsL~e!9QP<~5HK)}p;pW)vXZ;H`5Nz|!y#!ZOU{Z2M zp<kO45CfSop`z+)yVH&$ZQc!>> zY!|%05-~r=f)%Xq3E{BB4OB|Gg6lDyW(!wY{MwT6&R44SWYVM*^U$kv{RxP$C%ULZ+k+Bi>K%KWOV)PiN^rY~iRmPJypzgiYIK>C zczVS|Qq&-=AxO62v4qu7Y#i$;j#(Nvv$#0Ul+~N7OCha;6T8Z9povBBte3#sKWA!< znlx8`{9;kxFFBzs)TR z1*vz8^Gdk39y1B*ZgeCFGbmr^0%3(LRDpU-B94!y;a zd(BDFHgI!d`S)uY>~PTWpJ8mTkZ|6b!cgQE$L1Xn*YW%t1{ax%ay$RKR#V)Gvu|`P z=Gb#6j*|ym%|7RlZ=R9-IO5imP~+NO z_vEEy1RLM-k}2Y0!li*be5=LL4P-tb%P^$V`9WfC+=xjl6Do@Dwe{sK=&ws>*dAk? z)8_JA0WEIUWin&0;1N`RTijMd_X$lI#rx6loUTV8|87YR(up?R zlyOIed2+nNOg>ChgA#KaNo9!;?yDzO496LY?H`V3?E{;$!9Ut^Z7v}Sze}yDcIG{; zz~$V3i2}wX>UJ&l&(cmJ?-mQ)jPL4uPa8A^*lR#1Ov_;3DwCn--rO=eSzCQkghw7^ z#)i?8%Qx4ueuF>(cdh%Ch}he~5Uw$1)4c$Gc&)ZWz?mP`Oo{?|=Js z>VVgW2DWjl?v0j4Q6t0Kr+EsrI&9o@5!5HbBKk#5#pO-PF%PJ!7Md^IB0$BO6s^Ou z!!MtM%poRmN9|{PSFD*BtvUgjypXYf=K9nwZIR<6DUKd9<*5@JJ4ua0Wmzvnal9-} zTY@CH_{KegLDAV*jlHD+k?c6D%li)#v_77iaP=so~PLi)25jdq$z%$L7oxB zV*L^5!eV3+}z5H%JvVt)T7zzvvi zDe(?z-mCmfz)u{Wv$7d<4DKI`6t*GlEaSUH$BZ-IjqNGDL|ri?1#r7BHs81>x)D=R zem6hZ?t1!8_bi(`rob#6KW=NohD7BbSr1yc`uKn3t{dUwlWKT{{9P&q#MC9F>owUH z{9fEl#!E|?GCq7a9!!uuu9R((KPu83%b5D)cN{=8nEFIX9W0ytFt+Zne_&pFR%~** zkNbtf>D~9UDG?rR>laA-K7W@Ij;vC$3exKh1cs~Qg8R^B zbdF7aW~p9o^=5%dZ834p=iMS#vW2>g29n~(*Cy4p8&?3G7G!xyof`1Vd0+olV*6yn zf;m_gb{ewxti*-j42Uz*;_{gE`|1JK#wbpM=u}pY3@P-H-qo)i1hPvG<*Gov9EbUi zLQ~qwM(tPqD3SOe2RA&F3JQnx_(}93O68pnQ127%IzE=%VN ze}0b^DKFu; W`IkxEx)M!i05fAtqpFL}k^cc<8sQlL diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_grid_small.png b/radio/src/bitmaps/800x480/default_theme/mask_model_grid_small.png index 4e50ab9ef9a3641b979afc66748a965c2868b1ad..97e7ff958b24f993ad18653aaef060cecb0e18b7 100644 GIT binary patch delta 592 zcmV-W0`1Ld zORxjA0<{9Q0_lLqX5;BvXpT#Uhd_GqLP)#lti$yR-s`Mx>i+&(r37URTFcPd>4J(nV z2p0-j$>DHd>!`=TS}^W|l`G>6Ykugzk@uh)y?V8WBhgi2zQwluC*a(%*p zdW@7@S2U7?K-cRvjmKlkvW$OAE?)->bHCryY&PQOp96 zs&)o1i%oG8Gir(0061T4(R{@03c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000XU000XU0RWnu7ytkO z2XskIMF;5v6&3^m);Jf(000B$dQ@0+Qek%>aB^>EX>4U6bbonpWgvKMZ~y>EiN#k- zvYaps-0KuMf|2~e$6*H8r7FuDKix9JFu?q>NFMcoF}BodNo|ndKYz&&{B?auVpp3> zUqbG(lmv)pOm?|jWuF+LM|0GgO*;;^ATSf@LZyBUmKxFW7A zG^9R`DTor>Tztr?PS)uNJOKy1T4`g3Nv76Y#Zh?Z6;IXpZ#r8L%ebf|9XVu!Ax50B zRKxDjB}@gHY(vr*W4?tbON{Ly!|Y4M5o|zMbMZf&3V$Z)OMsykTMTzc!>FqsYl#RE^Y#t! z9qx7cZGW}S@+^qPOB~S(AGwfoZeVacF>WQsRB}tnqj7l=z|J^3wIJ!3Gbi;jV4fB8 zQv}($QOcTW{^=vKQW6Z22TgP`=j)-%HeAUdo${+0FvYHiN-U@#)U2Z0x!M z8%X5fKf;sxh zQx9Tn6xB8f^;2Ek2M8Oq0OuYD&XAPOwGns5OT-&~e zK(7A-(W1)-l{w*O$&_ae$e{^~rZ1Wuxk;8sp+_lHn;rvrj$ghD0QXm&A6?No^l05^ zHki)D^j(;;iF2DdykD$5)ZGrt#oe9;bbmjRf0t11aCY1HyvH`$!}pWj?6qBF+b_p< z`MfmbHMM&LrGT;2us({5e5{9CbJPjk!EDFCL3@#wfmgErnW~G+`g| z`-Z-zUyl6$9sTljSKU(0rR0uI+B@C6Pm%mxj=pY@&vz8rZYfW8l#g5FqrLqfx5yVc zx(n@A;3&0kbn(9M{H_0>+3gc$U3~aHYfnx-5(u00SIJ zL_t(I%k9+LZ`)J=$MN5}IJV=|Zhz}8ZrY~J+J>av*hOonwv3ViV$(ncB>n?lhIruL zKmv)sV&XES0pbB9Koc6M+tigx8)2>J{g%{Sw4_U8$BB8!app(FGv~=)eRM3JWBU;Q zc=g8zyXboH?MxJClzzYc_$b={daj29A>z)R?^gCID3nTX&dOx>tNUBFD}No7_um~P z?yuhqnw!SLb+kt0gM97Dmnl(WUzcisz8}y>i;OSqw4$Nt>BSolomLSwsoeOfAV{mx z&8K1#%C`4(&l6F%kKDaBRSGo1f?yns6A^?{B87;uKtKpcxCjje?bCx$45r7q2x_Q2 z{+zn$g?=%MB~o(YlqRHO*nd>V2LkHN(l<_bi0ktc(UD7iEmDVP24gd40y_H&x303C zLYZjRXwD=UyZ&C?+QfnK%3cMEmF*$`yzR9^N79E=5g<&wvGd?gzJCZK{n|v5p^~4! zzg|_Wso8NI&8sYYgO~~(#=ggj6T2=O-C}iZ;(ze#ZbS$3oCpEXJZ{FC z#IG?1go(r5`YnF|J$*T)0*&(0z4fYMO-*(&Jg1WicW&QW-mO4MJe1|0000ebVXQnWH(`SWjb_eZDn(GVQp{#GB7eV oEif}JGBH##GCD9cIxsOSFfckWFqZLEh5!Hn07*qoM6N<$f}m03XaE2J diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_gvars.png b/radio/src/bitmaps/800x480/default_theme/mask_model_gvars.png index 94b56ca8777381b8de094b8fd67798db9e564ebd..94ce4ae9416a79d33d32940a88b55b1e011d7879 100644 GIT binary patch delta 675 zcmV;U0$lyF2(Sf^8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0006-Nkl&CU;<2l z3D|%QjDQK)025$>zI-_^J!#}>>ojS4PQP>F)oUBSrs=(3ZhtBI*YS9ahQndh>2x9@ z3Z{VvT>JfAp+;#Sadxun5hK%wY0U@WIz|bv`l~jZjn)4O;OO~$rk<}mIW%FB<9*;V`Yi?; zf;YE;&*$^6=UpzB#PPG)EV17y^zC+I*O*-2I0tt_9VZqbAICU_hVo1keAj`ojf?OO z4UNZRD>$Z)uF+_eSdrL(y+NBJs5d-tkXZpZ91d)MUVosOABsoR1lA)(sn8Ij2Bnk) z%t%o>G=ylt0ox))7HH>bT+CHjPq7I#mS5x?8Y!HE(~B^9S&S|I6=8tjSO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmLv(bL5-#N+tft9Sh;hszxJ_}Q<@!`|8c2wr9+~bqA_$-Txo>I7>w}vh9(( z^_~M)E`*3x{JY#b>#=Ry-JAc`9V;+muKIQAn3>!h*%iIz*KS=qBFZ=Wd0dJ@?Z%~F zzs~2p`8)K&!ln%`Phatkkl8IP?X&0CK6MS*(iQ2C^10{kG_#MZeen5&b?4vh)8}nF zFLn38i<9ZQ_tlC|f4yg8a=pL_spF3(PV&?`Jih*Vtg_?XeFo20T&;QZoVUHt z)&A`#X5s1SQzp-|{pqf_uYU3BwdNd8zdQ;k`7_3Yw<;RoG>c|N@Lvh&snt=OL)eY-ZnVZrZre;YS0czl0?*YRD<2@a)i zHW<#V={dZrd+U+yvlL7w%#x7v70cQ0@UU-Nc^>D+MbkgObZ!4Hl=$no>zOmz*6b&U)|jEt-d46RHov<(cb z3=G_zd^%7x{i_0rfC=y85}Sb4q9e00rpYod5s; diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_heli.png b/radio/src/bitmaps/800x480/default_theme/mask_model_heli.png index 873efd0166c539a22fdc2cd119bb12b9002d7f13..656e0b40fd4957217cb5886154f6f4777bc32a91 100644 GIT binary patch delta 908 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 P=oSV~S3j3^P6fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000XU000XU0RWnu7ytkO z2XskIMF;5v6&3^m);Jf(000BFdQ@0+Qek%>aB^>EX>4U6bbonpWgvKMZ~y>EiN#mT zwwo{v-0Lg)2}ZId{5d4RuIF^w&+m+#2Z1Cvw~IEMfMZ+IX!J0V-#>rJ4}1pqLF{a6 zjFEhB^OKjznq0kjc=g3*)nz@MPOB>Bt7p!Xu##s>d5)9~dq=O5$Cv_w#bU}!$&M!! znn6g_R$DaLIe$i*Vsr@lOk+N1;%`6u62>*51)#~k5{FHF;kLaYxvRn4i4yrHp{a~{ zE=iQ&)@V~!b+JKb;7Pb()uPWCHksOJ6<6@mGgj63HC-)2YT8|T zaZ`cDZ7P~`_N$9>@v$$`%`q~rWE0$4qkVJ zi4pF>0M>UX00ALGK-6nvtb!@*2$jA8bSvzEV4~^-Z(~BDk9eE0rH4uy^9yol^%<^= zz>^3b6sK#Q!*psQgQ#lulC@@j-E5y4{)zW~0&eG|V* z>ng9D=zqNA8Kv-%33<*96wXhSTjX5Adq^IY%NqxF%2}y_pkvQkw50*#tk_>N$o5Vt zbEey;jm%6bP(&WI(8%iNLzQi~k_%a>mC1tqO^PCHO{J%2BUI}PGbQK#Y}J1$zKnWf zsq#LSjF|yd$5mEf))Rhn1_k|~b_T*Mux)W;R?@>>t!(tR4&+_s z@Lkn%)ZNNpa&Or_Q(X&o0Kz$QX!suP) z#MmsVeG~Ghw&o5jmRc7qhVFs@&A1aKnhQE*#(c$Sq-(AiA%jS^VY~6>xkacR5HN2n zZhuAG5o`dkD`f#U8EQx;RXJN6Y$(SKfx|9G?A1IDFoMDYM1e2*JlitQwQ@i}l50QL zz{B}}Ai5rc8&o(uTV#MP>hAPFq+)oS<0(?%*u6cld)u|CxBS`E70=$??prFzHW!Ym z@VVRa&hJYgHV7h+zNKS*EFAf`*0<_d1AiDn?Lf!Tqe6N}-?gmII+nDSweDl^RR|zD zwBCB7Uyl5LK|d&96ydgm0^`dEqafb-X9=cWiYz@8DyRlNzM+^g5Y~cGU(x@n)z%yR z$%unl@Roi#^8a`A%gYmEOEpEw9gXz&m31E?`MVf>yF@0~$~B>JtC} z0MAK8K~y-)?UX$V!cY)|cb`kpMkP&xh&F;h2M|P?+|)`ufW06Ay@FV2p+*D|OpKBr zD@&bi1-Bk%=X;M?z8v-h$F54ST7M9KSLM`g%h4ZWKQA&^L_|a;PZg>plakZG`RXd>l)UnYLaZuUa?x?fb~eTDGVIGe*kQkB%Wy$MVbr|NAV&F! zdL6!=Pne@p<}^w0)`HRgn`Amax#{xB-k)oDC0I`IUhnx6J%aP^(FY2BkAK`zrn%3o zy!S6qV_5llTg7Mq001R)MObuXVRU6WV{&C-bY%cCFfuhQFf%POF;p@#IxsOhG&n0T zFgh?WM?y@90000bbVXQnWMOn=I&E)cX=ZrDb5bYX3905UK#H7zhREiy4wGBP?aG&(RbD=;uR VFff+!RfYfn002ovPDHLkV1gcxj=%r_ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_list_two.png b/radio/src/bitmaps/800x480/default_theme/mask_model_list_two.png index 5b32b5cf881f611ba5b85211b734461cc738fc65..800b5a7b32929e6bfbb6109ba0d7b9df04dfd925 100644 GIT binary patch delta 233 zcmeyy^NVqUWIY=L14GZ^KvN*aS>O>_%)lTp2ZR~b&RUrO1sRKj+?^QKos)S9_j|fHhEy=Vz3#}@puod&;OYZGuYI09tneAoZ492SelF{r5}E*(kX|DI delta 1648 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 literal 1449 zcmZ9Mc{CJy6vuxPQOZ(d>51$jhB0QuAY&ex!Pt@#vW=K05i{0j2@%g0Axp@bX7JSD z$$G3QgFz&sWX+VF!?V2Ubj~~Hy>srp-*fLhpZopq##xvd@$!iB004OLI0GxT!hYm2 zb^#K1n=Z3O(iLY#03cW%fQV=ScG;td1pp{;0KPf_fPM^sh)?b-OC9#&h>MAl0XU3J z?rmXr$9-_Ne(cMmKN5mf$O&W*xyg8fA@?GOkT54?L{p?20M0fEhl8YQCh0||YVn!O zao0|NXNz=B6ADdS$a6IoX0++MG(iF*LvZohdi+Z2G>u$Mg* zFF2GCUq&-m)@*qAD7Q*?u<0rt&`8=RAs4+7>B{p|^7LBhZw32T>52oA-Tq2pW$iNR z%_l4GqK&t*4-Ruw8H~E$Mwd2K3>3?+rA{Ejhd$Z=&TS1ebW*woqw1%>8(BOMuL#G0s1+u6d! zD{UN$Mwb-Rld8``FOKy|R}}l27V%=H=i`)JH~qJeMX=YW(%}x3x$MQ7bf+I*>S(GG%m*e>b53g36+d!+`xfUA`(UlCG8|JWfS^(XLrp zVx@7(cwq26rsBM<{tKoXXqR~RxiYm8iMd6twsTe$CK#?6PDUfev}HV{G8$@~<9 z($&$}US*ERCvlQ7s^=oI6B8Uv#Pz~YK4WoFRDCHMK~J)3(6m>jo+ai(6uEqYJJvCe zRBG`OKa;iE^M20XSY1$t7XNm1$9X~EC~MrRf$H~`xsYUdNZ3E+f&ft<;1qFs0sF4k|P^lClj5?ZfI9uH?{x- z9D#zt)nN!VYXkxfS3@H;mEdqR9Bza)eefT^%bQ5L74!o@z|;^hxTZA%j#fva5gI=M r=l1($Y(U{(2Qtaa&5!Kt<@0|NB-`gFld*a=hRp!Hp_xG?)+zEIwd{=F diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_lua_scripts.png b/radio/src/bitmaps/800x480/default_theme/mask_model_lua_scripts.png index 7753911a624c8e965480a997850664cc8280430a..5a2cb3488520f3faaa83cb87af675c930331cf12 100644 GIT binary patch delta 997 zcmVJ z`pTc5pPe$^Ma0O%!-G?{*=$VPz9BJ{etv#RV#sc{E6X(L`}=#R-NnU4IhomPmiL9R zcsQL-^6~K@^ZC5|uNc&+v)}I}gsZEo@_D=6n!W&i+2=lx>6h>CZ+U-zHv<$}E6Elb zGw%?&xw&yVcz=3&lDoS*^Q_AbhlA+J6e|)Wz*wu*O4jSOd8RIXY6bj)R{Q7Yr(*`# zu|*r(#HQ)gCPX7ftXG|-Yoi;;_Up8$!!9E#uC}86uvRdF0QkH}|(;6NEXs}Ad zzP!G^=8dHP0>!?GB5cLi_E^pUHeL!Ai-q%k7SdHNGk>;z5@}o#Zt?N)QLeAAWi%Q& za(jDg%BIt4GO;?~avj9jAR7~JA_;aVHEv6vqA}t-hFa1L*oJHqc}T>z#mo4pBt4l- z%GjX~VQ}sDW0et#S%RcfT~dmm41gOej{VxYoTed2--IE8IS|=ZkRRNI(b^H}+i;{Gz8?xeOGIj7bAEp=! zy%L5rFKx{tc1eNn>M)b0ke4$FjscSl zDJhjh)`heURSO>+RiCSg5SmtuaS+Wl?$O#Gtb73!ONk0O$ibAfB!Cg?-O ztO_$Bayo~$W3v|$T$?~}kclq%YtktRgjFtZ65Bp5W@05KudISYx=V69gjv9c@W5XY z2~`}DIDN;Og-!!?S|(L99D+C+j{SDyCtlmyHA-Ehwh3=YUS3}E6!_!o)oHxyC6?`? zbvAdGZ#a;JgGTf>7aIDRbd})q(b7;KoJNLu0&LoY5HH(UoVc7gniGo*dPw{Op)TM5 TOwPw*00000NkvXXu0mjfrXAVR delta 1369 zcmZ9Mc`zGz6vuy7#1YzR-BP+MI;I+pgj7>XQ%9886-21JXhI#8P;HSYnwHVpQfK2B zjXJ8diaLT_wyM;zjz}GKr7Be2+cIj?*_oZ$eKT*q^S*CB^L>B473pcYG<7Brm-ZE& zwOEc^B#?*zTt5l`D-nQgvBmlbKqLwPkq-d4YyeclA2vFgiWfil+1XfvJ@&nxR`Dbo zPH>|Gpuqp$5_rA5Xt62Huq9eaFGwn@KqN*?R67BHplmJAIukl;hsT^WUEtCypS_sr zx+k%AvbF@-M@dSw-?^VCY_y5X=?oE}lUqEtNHyO2p1rkW=A46`>j_IaSyFO9Ci0i=?)~Xu zat$;Aa?z@3;!SU?w!_W_D17AhjkRyj->? zSvtIsbIk^ls_i;TNl^gqXJm{u6$@GnR}eZzyx4(0M_uIBSK=8RVF}Ef8B!m(+163N z8!s=uqvY7)knjLr=GTPvlpAwXY36^SMBNj7eBuH8P}j>`{0mG(=ClbEWK3|GYxi7V zHCFarVk7vHiWgIz{DFV_s^2lZAVDC=DVVsOc+Qq%^_<)=R$+3^kkK43s1mMpO!eb4 z0C1W9I7+K}Hgev#mTAfHG6SrJ@|mTU>cY*@VHXVZFtbJ zd!e1)HN)1gX_}6X7Ob~~UN+N(n?-gN4?aN{Z%(9I#(BLWeF~q$y7I#eV%Ic2=O??x z@VpYRSr_mhW}Jh7F!82c5bsa}0T-OwLu{hujM8AK@*T;J=22Mhu>19y zu*ruIVESd|U4Ia?P~udzl4G)a#Fel5>xxc(e(IpGDk29B@rmbg)37^#RN|@DUSnh` z=$s5<(sQURsW}$eW&~nfHwv@1J$?`~$nxx2xsGkUUv1qtPApR$n_WZ`^s*(|oG|B@ zM}f-g%a*m<4)ltAHhgb)3j+oevi7yrgsH@a>QF3fmuU>f#vshoAt2xp69M%(Q3hD1 zTPL%i6qcd_7vKdg+W9Yz6(uF1fSM%}3Xae7kk%}z=q#n7<=dQrfj>FU-I5l=Hniew zKDn7%P1ckKF&unN`BP=@M0MLC35%drgI!Xd;_<@MLG!{j_xDt3(4ie$(iAZ+qcNrF zFtjSHE!#=VEky)lF@UbDWYe{N=lRQ7p2}g+e{+^mk?y*<;~x}pa?`Yg*<7__4+#5~ z1J6&d@y=40f{_Wtd4m*?1~XF|hy1J@mAhemE8l*((_^?qXPX}8Rh^CYv+*ERNaOBN>YlJd1; zNjQP1?@M_yH$6@xR@a UVKP@;ZiyLSYvo}16z_BMZ^VgZ6aWAK diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_mixer.png b/radio/src/bitmaps/800x480/default_theme/mask_model_mixer.png index edad0a5d3c4e648b275109f0e8b60d27f5eea475..082fe78033b23dd30cf88b401d7a05242b520b67 100644 GIT binary patch delta 863 zcmV-l1EBnv4C@Av8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP00093Nklhd>nWfwPHcivC`+wExbX>pRC)jW}q`_c7 zze&&Mldjh*9S#To3xgcDZnx_ulZm_CZtj!1TrO@ln>jeO%}9|8FZ%>Mp4W`FOL0-= zPj7hRpN4-t9{xER9#S^)VYA!q+)wCuJo^5%EM#ctZLwImcgo=1a%fnSX~b}W*Dx0l zm#MH)#%|nj^M881Hg$j*joIB6MnT&a*M!UvHSjH$OCS5xetUSS7I;3Ndq<2$qiS%# zV)VF38oJoT&;SFLYdjtofyZEz&_VE64R8rKeh~&KC7~gB9TTq<*a9v+#|$mW0vr@Z zP6F4e2)YC~=pEo@=o;W4K36uIjkC%G-3CU^EL9D-8h<+GVL<0rzLZMARnV!BKrRjc zVKI?%tE3X}EOdLNi>Y1oU||A)*85g)ss)A+CQ@mMvOwc~3%Cf4bff_e;$adqjrVyv zOtllCL*ay>*D4f9xq=IQOF24(TI#tXbSPCVyA?h<8jEcx_WS*-V3PEQ1mQ>lI-k#^ z)ponhwts0nO^v6i2`6g8;oJZB`~B5Ul=L<{Mm1Y3#2{tD0x_FfkP!2vSZ$Np12<~H zrOgB1aiqk7a}z(Cr#0ZQ%#kYMYk*bI8t{;#5dxU?mg>!#TGh}l0gmgMc$I*|jztUX zEYJb44PIIkmjXlPdfGBMCDi~!MLU-o@LFI<1%HiL#S+a!p#+=*Pp8xWuA_f#RhWfF zhdeu!f^%T(%wyN_91Xa-H03Ls6@Uc8$d!2j|9tA?d6z_dIa^TS3WL4KFCIe&OU5ZIBV9YOU&g z+E{u+X>OIo_l9qWPECwjz5Sa@X)$CK`Zsu;k~8-c-w|_PBj{6})xyWZ<_j0GiS6}z p{=4{Z`!)`pPA9*?#xFL$e*t7iC6m!47*YTL002ovPDHLkV1nyge<%O| literal 1560 zcmZ9MdpHw%7{`Az*>bDn+Lr4nory8SVi6W*ZLSe2)aDW*av3WTxmQwi=cJ=_4qYkA zJ-3<6<%qdPl9|g>2)V>rPtS9n=bS&@_xrrx_xZfv|K4Of8={0LQWO9nL9#M;5GeXb z!37N{2iIB(M1^MMU=0A{001%909Y4TG1CBqVE~vp0{}i70QsQ&DtjZrLWoKxnuG1c zw2pegv@^)cHAHZk`=cNPR9=L@goTo>HRsb6`B*AvX-1Vs(kgpgRE-3>YTxNHpX>C zVHqkr668s-lQAo_J0gmD+@1MUZXFU}+odH57pnR;Qp5Y06}`31i|UM2hkRCLZ#1Zw zHlv>%i~s88cwS9`IX$V;(6OuMw(;vBdPCz}n`zp_24%O(J7aw+);l}3m+t*gL_yob z@VD@IAk^ICuANjd=NNx;6lZBP9$3HH%z-i>DzgQVO5*hV(X5&b_qnZQe(0^SY=He2*IWvodOd-g9HoGPLNpU}^eUtA)dVh0vGnv5| z?|Y-xSJ%OiQX+OPvuE5llLv3`uP$oa=K7v5 zRweh$q(~yBkf#V?%3fquTd&AGBJ~)#cfNAk(_hjdPZt$|*CLkIVN&QtCdS-oFVe`| z79#+dHVidz`~0~$CP!=qzo&c>{em?l^+;m^ij6;)m-`WB#7uvmELT$?@s>Et)~!xU zxoQW*8Cg;7g~gS<3*$EurupUgz_qMA+uHs1W{>rCTPKfI^lTmG)D0asbig0Mc`i|| zR}rw1=A0JTWzmAm8pc~im5Zk(0X{fzy3ej_a>6g4_uxPixq1V-EXUwS(%3uVWMU}g zm=8Q!YLQ!kw2mwbX~{q{)@GYi)+Axf3EdPjnMr^r@{A~E;vIo6$LibbNWCP|($Q)J zXl&n<+J(xNIi8-LZt2~af3e`C$Kae4vFT7GXpHMpC@ti`+E@Jy6BhLb%F3iGySt;Q z^YtfakWKpG6Xi={qM{ulVCB;G9^1XoGp0%iTPEqZ)bo^fAJKe_>XQcc^d+~J=lF2N zA!f+~ACs=RY88G30*#d22L-$g-1=-B(hr7w8$Fi$NVCV{E5iTjJg4%wZJ!?wUKXs5 z>9e2p_+~^y%j?kJDpr-8co`z%Eaxrp`XkQy{ZOa1hp#GcRapJkVH>fhLxG#6C`wK_ z%moU>$NcQMa>I|JuHF}(;n+;5a`*Y4I&bNoU~)4347KR@sRIs9J*yj0k)IaLr1uRv zo^rVov3$}4g`3CDa}<>$?m2Vx^vGTE!&)Zp$=1W8FEWe!r~l;khp)P`T!dZRtlBiZ zqneuB<_mIrS>6{aMPk}U@M;jI78t zHX9bNmT0>l8jEo#Xh@>9rJY8?;f-ZQ%ZL28g|vm&wH1GnxW_EHQxt0&)Ap{+AgJ|2 z5v)uNunFKmZnl)kkA=(O4ZvEEbQ^!Rr}lU@&+LhDe|!{RarR;OXlf`2)bBb+BlRfg=`! z*VV&gaX*2xP4N!}0P5d_P~QNrkkGRMLH`fY6Xg74G8dc@1PmZq*qA>doQeGhGbXh; diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_outputs.png b/radio/src/bitmaps/800x480/default_theme/mask_model_outputs.png index b36af8fcc246b74f1fa8ea4442f17622614ac402..f22a2d37e113c0193615f936c2c8a1094922cace 100644 GIT binary patch delta 913 zcmV;C18)4m3!Dd#8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0009qNkl2eAXS z0_{MpKs!(?&<@lJ)C$xJ)C#l%9zSPrHpsHDi#zYk5O);V!++uafg2GKRkgjpzpL-> zZ`JK~)q1^Fsla^pyN<^rpVdj*?c?J^&F6Df6?vrp$P;inokYJ-K0iNYxm-$WJcYCY z*Q>m} zy+y0-!ixzZReu4g!C)Yp%_g@GTdUu9-{R6xiP37cyk;^QjZ{^<@JA8?#R+wMx`27; z1SBEQv0l#S^RMrQ!(n=*0cwgzZA>x*dVvpP!BgUNuh;Y1?P|4>DtHQM2y5HU{oUuR zA&5>c*y?`2m&4(3dxoGZas2%J+-%YX##e$01c?D#<$pvc0f!{|yAC|2g(RBYZg)F1 zW*Z11jpIN{0x};&vyL{K&75N)R2GG#V+i|H*XNI4eX1N?3rWWk&Nf0;R`sj^Rg#RC zG+XN;!!3p1urVF%3m0Y+WDLqbg|v%Ir_*`phk`z*GbR(7R1ETxOD<`b%0m9hW=xWvgevacK@$jXxr`f z{#+G$H*fb$?v^}LeB=U5)zz+{Bq`QV(lv|VMJW~mX~^64Z7$NuD@?%L*t3hst2o7i z(tku!(nfK%*)G-?^2Vg-TLzTWUhu{;Dlo<#$5xu}*xIa}vfWvf@e3+fn(ysd)zR>J zU$`TJketkMRIHFW9*^&RYa?wELkw6X$;l3hwUADE(5i)WYQj$^Z5M0)Ytpvkq{eHC n|26^QGGVRRY)Yy*^Y9NCM#P!sW3E~N015yANkvXXu0mjf{o$&7 delta 1466 zcmV;r1x5Ot2f+)F8Gir(0019xy+!~403c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000fw000fw0YWI7cmMzZ z2XskIMF;5v6&3^m);Jf(000D#Nkln{F zneQI-wSTe=G|ArjXI?fO{^J+Nrk?$>0chgI%0AlDh7*k5R!!vX-l(<_Ajy}em1?qr^xj(R{bE+1*(Ew^ENvkGn? zV1Fu(W5b8Nv+ITA^#$?0kxtqZ$&y3ewp}`(s)F^u%z$UIf9BdBX+8Dh{DmtMy&t^; z-fgLl!^1$0XM=T>cDWp_;ady2?FZ%L%G6L>W4=}SUXe09?V3T=uZFAtpi8N$TKaLE zW*v6MN;{N4GrGL7CYAAG^3Xy!+FDB1^nd))lbx;>%0kVp8N$+U0@6xu8 zF84-`0H{^u`26(mf8Ae|6q^u;3^@}8qRFL6?{1&a?x?fpSz4AQIj@%iJbB#K-hbBK z-qA@#`I~pOR9tE3Z}*WSg@hOv}<&MoUNb|ilzV-&ZDn(GVQp{#GB7eVEif}JGBH##GCD9cIxsOSFfckW UFqZLEh5!Hn07*qoM6N<$f;V!S%m4rY diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_setup.png b/radio/src/bitmaps/800x480/default_theme/mask_model_setup.png index df01cb539b8fdc791c68d6e7831682576b0233f7..c72229c97f70b944ab57b4aae4fb6c422f34d880 100644 GIT binary patch delta 1188 zcmV;V1Y7&`2CWH@8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP000C+Nkl-O0tpg{-fyXaC#S*yz#^NPVAv#_{m(!^6XJd@?YbFUZe-wSF zFG7?xN~F(@-a9qJ2S$4aTS`j1d^wJVlV~hzz&MOxK7Zcvob;UY49|?VLcs)MIdm>C z+(z7DP1E1Y%ZvU~uCA^Iy!=1V^FBcSEi!R|==b;cvlmjWH5txA2oPfO`T4p09I-h# zIFM8l(t_>n?d<)O{Z4o?*wEXZet39TO{b+k3D_kyR>isCf0?oosbNcRo@f9zV2yL_ zLr^?e5r4wTi1$OD*2Z`q6E!J_4jCGwdRAQ{=Q5-56t09pY>C)Ka7rA`^)kX(DAJDa zTLHbkm$jZEv8itXDDt9Q^H?6X<%3Z*c;aExUs6u(tkeeKrG`!8n8v>&UTd~m4F)zN-i=jgv@I2{2hk3)SnV(nwXSxqmS7Do zAh~PiLa;|FlkQ%*2KbaSCOoVKWM^lmn}4HKc~f-d{QP|RH?q$;HG}okUSW;p;Z?xy zCri7TBEG-BXD4AAqEdvW$~dR?=v~(LzEQ}aJz!&r44ZBX=%-gk>ba%81o~RdUK@kb zm7K<4BYIy)Xu~7bstJs}9z%z~$OesVH5m!J*NS;o=BMOMkRe zH#nfbniC}gD1H-A>PwD}j=I{`21F{RJHx)Si>{4Z7_0i7i>+}M)nelrWKnWVXS9`K ze@g{i{y}{R4n%)?dYaK7;?V;dLm2dtiqGtYq(<5+-5Ssw>ogt57Bf-XWcG>ri7}XU zMg&BC%wbh$W-6-X(E`$H&x=+`aUCpe-bvRE7JmR8R`X`@O>TJr0000R literal 884 zcmeAS@N?(olHy`uVBq!ia0vp^x**H}BpBoi_qqWog=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H`0J)5S5w0K%(L=}D`fp`&zxA0ZDc+nGclrC4 zs_@BY^xw}bKexAXQa58450f(^!{N?f7foWdu@Gc>XnFRejDs_ulv<~(Xw6nll_GM<&>lq zZ-1Out5Wi`+%l`eD$%ghtHf+!QHD@#jEMCQ{@WjRuPK`zy6Dvu_uX^%+D`szJ;5(~ zPRW_O;_GwMcw&Cu{2U!szbjgIYW37D=4bxOy&J^2>`->Y&y=ik34M*7iap;^b5&-|^} zUl(9p-gmU=>1^*}K?lY!yT$JQ%j-(8niPG4jqxPwoZ`b7WiBNOLfveg?#v8&E??G% zENQ&=bAIC4ZTgTe~DWM4fKecJ6 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_special_functions.png b/radio/src/bitmaps/800x480/default_theme/mask_model_special_functions.png index fdb25899bc7117488ff711b30bc3071ba88fb789..2be663f91660e240382181598b5845aea8e7c3e9 100644 GIT binary patch delta 709 zcmV;$0y_QA2+{?R8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0007KNklb48C#6ZIeolYn7*>1OU_7wvS zsZAmCd^j93K7ZE|1$mip3x0@7EsoevKqX)p!yJYsU6OVIiWXop_HZ&p?+qUebESh+} z@w7Eq(7wx@?RNX=Q&r-b@>zogjW2cq>AtRIESh*)A#1Rpq4|971jCY5nRr?uYp|h1 z;8i7_seh0)azS&!izc2{%o@3&W8h^HPb+4PLeS87JgzkHOvS8G7}^Fen|N9rYm|b9 zaARLZ;%RZL0kx=vR20%O$}U2S3U#0YOCNs;|GV z;bWuwf33KRi!P3jnP)HvUMvum;5p*$cAHi5`nh+P-d+23KuBWmZz#I?1x5>(Ub4_D*6#u_lON86r)SaHxlf<^xb=K{oiS^1`jw`PayFJ6nAxNF%(u8pC~JYs{M z8XTYYf8phoZzeBY8TRMkvGW&-x^8=?&GXIkdK95H(egfP+lCDqHU*K43=HLy6^y0J znx{>BVV=CQWuGV`gMpQXcT42ADVd><=Fj-T?k;AuG3?ecK7X5Qa_oKQ>^wWkC5xx#imW*A+4|g7oa^^LiyQ3KYknT+>t_$< zW_@+%#8K;sPkc;RpZwkJ=PGthx|Lh+w&U~WulH{E5-sNZHv7T@vqmRn^}j4@>)(mJ$}f+aG9#_BV9Tl!tIPf+eeQD8Lw{Nw zJk8)__8_u%L5GUkri-UTX9zi$T(nsKJ^v2Qh+MTRf8p)TjDKb+Z_cu9 zxR}}eBj(By?JIYe)Xq=%ZlSo`Fx<4EUR?Kv#nTWLj-}Ubzbov{;V@ylcjvj+Wc_%VD2ZR*TcCRCH!u&WmbgZgq$HN4S|t~y0x1R~ z10z#i17lqy!w@4QD+5C-6ANtv11kdqcPF0?6b-rgDVb@NAPq*khDN#u79mCkR>me) zMrIHViHBR4GcedOXuz!~$;?eHE=kNSK)1yNXc0uyw2z@}KwB6*UHx3vIVCg!01v<0 A(EtDd diff --git a/radio/src/bitmaps/800x480/default_theme/mask_model_telemetry.png b/radio/src/bitmaps/800x480/default_theme/mask_model_telemetry.png index fb5ea739566e2f81667ef4168312cc270bc4c517..df4d28c028b26b8b3dd1a90bdbc5fc85bde25e84 100644 GIT binary patch delta 989 zcmV<310wu}8uJH`B!3BTNLh0L01%u201%u3Ce1oD00001b5ch_0Itp)=>Px#1ZP1_ zK>z@;j|==^1poj8h)G02RCoc!nT=5@F%*TP^9ry7?La%w4zvTc13OSFP%F?5v;&|5 zpaP%*pn|-7I}>JE@4ZQO1D=^37|4c`lau?iocI7Y5RZ?K?tkm+%blH_xr>X7-RsrW zmAkyWY+m`S7XG=4*lad#Hk*mxL7eOM_SW6p+zeZUuYiY#2X?FI;-2sCZ{G(eHSB@9 z%jL3BdbL{Z6t|R*z(y}GFYfyKx_O@ke_*WFYd;!|{L|Bu54KR14}^Un?-z?ja?XR3 z?gCPupPxSXTYn`V4z)Q)719uyPN!KawZT2wd4Rk&-$4#yhzyMtumq~57Q^=%c`S1j z(wcIN!`~M9ySuxj>VFdQqHj5*67W1@y7$BdS0T-h<4-0f_OhiYrX9ANh|yIY%T*=fl{e1Z=$)udRsDMm2lzW12@Llz&EyHmV=QcDS=5MFe9c+i*tw zu}F6>7Lf{d0Pn`}7U83iZeQ$xm7=jsj;E_tc~o>%dQ^Gi@p$){1nTM#QSz(0F8l$3 zC9F_~?@JDE#L+^Yl;!YmpGKgUJ)#w`z;?UcvjJ_?`T6;-N9=-L^7Zw#d5=Y;G1ctB zHom{VH-Co-gJ&zl|Sj*o5C{r$Zg z3~wkag)-D5rlyqAG9JE8#o-i0(pr|vtqt1X07`aBrD_YmNaI_l6f=E&h_VuKLS7&2 zk!JO7K=oze?d?sR8w-_UM_N;ui!IiGirmYBiGR7);q)G7^We#jZ!g#@f3^>f%j zBf(kGekZ3Q+#{`}S!?@JtrY4@u)3GrGvhQL$4g4H*u`Ze7Kwya5$4*&St@JWWzS5uI5g* zq~YRfl5l0qGIk+@RA{&q{;zY-`JeOupYMF%`1$M8`oOn_w!M4}pXrA&>=6u<9`cA{UTT zXQK-~h!HGIjUhX`S3v_a6U^)jFmnzD-UoMYAtN~BE|}a)!C7JV&hI%QDJ62*MjeBHdELrxM%6+4es#==f(XH#W>;cVfmv zhV=^^$0?zG@4g9&Y{Pm6?u{%DE$p{{Ds`d2v*rmLW)S@eHnVr5p$j|LdDfIgn4iCw zPY9b7)UgXu>l9QB_gv%uF zD0cVw{_0vw7Amk)?U|?WDHzhNTdYZP?eXl6_>S2k4u}5n;|=KX<2!o%7caCQJa}MM zf|rpHH7}8#4WhfLn<9@AZ{Mcj%i?-`UoQ%JM@B57qV&VoJ{1-g3dJ@XSXp%jI~rEz zjw{QiRK9p&Qt1TCY)iLP!Kq{-)YVreoA*R+2^>F<)tjQB*b@B74N~hmSO5(@I-RtV> zF9b|N#>U2+5VR%*jEqEOMMZRv?;oN2K!hAvSQ#vdMC$fM`}z3=tbe{1xxL}@=FOYO z42IXedvrpjnZLgpm&?t;gd_uRP$*OiyIdZt7q*7*>B_^h9ULzuwh)@9mnQ|G^L%~* zo1MD387dJkOt*aCi*6qsm3MsRcHPhKp(irYsPL~vLD0$!Zv5`FJL7<<^^1pmHiyV zkxxlUk-rcWS8PhH@@hQ*u~UrvXDVSt^u&RLq}J)9sU{$4n$XnW?NqCHhzzqh9?$ui zN7K7+-_Va>8C`QiQX=;U1{^?i0(Io!S?1D7B4Cj(IvHO^{4(C~esJ)YCS4eg;O!l6 zslsh9(P*;n5dwSb934Xs55*Qj#_X)O%9%48D;*k| zjLwG-A0knxl|ci2atVGP?ondvwArIL816MeGp1RomOOS!O8hIoM;SmzFQ2;geSNk4 zY&jB*jvHB0$+gzf)V%M&Dq*uF6S((Hig}TI5YB}K)gpLNKdHwT?Tdy!cTsa;%VwF! z!*G^XR)JHmM9HHs4dF7UGRz9D!ufpuS8;KRM#l-YN^n#W&UEM_wIGCEC8Whlv}WSGGKx^;4`!}S!+XZtd{ z{RIkB0gscC_MxGY4y+?7EiwJ17E;Xz3TFP(r{8L8C+zY!I?ZEd+#yMy55>Mm6hsO-W(7eI~YCu<`U z$Z`8LQcLw}P1DrT0eHGh^9FD%f^QchUPP3xZs-=ldwY9hxKkiT>0NU;W*_htF!%06 zX=$mri127bSoU4rv^HWG;wVq;_X z@83VUeD`THfwg9N56~khiL+Gk!@MM*eoS5`AX?cp4GH4bI$c;= zDi$5Yc?iRea)J|5(@B-^{(1<%POP7^svy-nS*-&806*T{CXPqD3~*PxQk|f`a-UCM~0bkW586*kMXcC zZ4NAZhcde$K(o3SjB5VHJJ#;5u9+4kkN!MjyVIPIZeH>-d;>MtmG1+}KR{={ftQ!E zDOJInLXl~j*m<3n?R_lX$R;&9v_S!I2)+y^BM~TAum@$l`JzB}z}v8X-H~su%@RpibYeKL&-q^3!gTr*PapHplJ_-<)T!+}*Zybgpn=X`AQMLx z5td2Dx+@-QCf64ClfWO^Pvn@Fz_UAk?eL~$XLACl#oWu~7@ccwd@F?pH}&d@ioZU6 zLL5JSoIys@Er*tFix@&Yy}V)pDSw`5@(|sgxJL&hW@-5qDKiYKY(2ag#RFX1*Vjj^ z=FPQx9e$24GiLSUZEaVL<5aUdWKysSRIEhg`s``vk2eoJ#jEd(D}!RVC>pyYiOlKtMYcBTG8+2Sf}fCno{K9<(Lx`#jcQfysR{PwAan1vF-68?5!U zUjJack?!5E(L|JU=jU&sms+WcbKQlP(c0RL>AHE*4y^vWx(ef=i)y{|=!vMEOLWW9 zy618l?yt$U)j%Re3=06UCvXiN9py4JGyh<-dw9II#;xzm8{z%4X)Oe|I!Y2?70|~( zps8Z{U9EI2pP~9YUs8NRucR!^202^9q*r|MBUGB!hHq85muCw(m*CrEQ?QXcTkEr) zNVuGYs58x*s(!8DD%?7Ou4L#P?)pa}ZQ~F*p zu^FoVwo_hy{sjK>^82R1c%%F9fp5()NyvoR zcT!wfB0dJFSBXWoPSmz8Xfet@_9!bW=UfPWFg103l)O$uHTaa4Do}TY46tKJNXU<` z+=HOMLTPDTMng|SQ%~WfFI~EnSd^$F4$o>QX-0&EWZfEkwhS~g2yh2vlzjgC+R}9H zo$>3Qo&_%XBgvQ6&lu3WQS|+wQ&?UOe3yH%6)^nb;^O1Z-FA>Q#ha%T_02oEy0Qie zz|oUTir-fK{p?!3PQ)hqm&Oeh1!}_Z@GyI>S3`J9=SOd^^z`)f-<_R@B;v)zVqZ@O zg2Ke)K6Amg&#le`T>yC~f&*RUae~i)U;}cPUjObPal50N>Z+Rc0kndaSFRkEh<9>! zKAB+#8pyV}RlXqf?;Bb`mqD8E+&LfFq{!;uWKyTyp)NGbnkMN>yMHx|NHg&9@sZx%-ts5y z_xCq_eSIze-`(9!M@L8b^W@|t9UmX(@3Sy;;OFOOxW2v~Mj}kOxg8uF4Cm+P!{_Jc z(1Rw@3^H1)i>TLn$Zuul6JW{j@9)!SUGx9q0<``8{rp|N`~CgB;yxDW`|9c{g)lWM ztiW<=3*j24r+=rz%gal4mne81>n6u-B34gR16Y1LTBM1n1;|7Qzrpfi&k?&>{{W9Y3iyXbWLFju0-fQGdhb-zWXZ9lr-OBi>f$J*3;*Z!H<(mmS~9lQgPSC-H?HmEU>uap zlE$UU->ou<>Uy+({?wo%KRY{f%d7H?tlV2*T7TM`Wpc6$-?h+5$(Eu7u#6>Er6yU| zI7k=JK?k&OA=}iTiI)vQPR?^RZ;y~Zo!^xauV1p{X2ef5De^P#(PWCXnx#pkA+ix= zM$no-??zKrwgzc!mW#^OhQqczqSEIQI!L0&S%-&*sTVstJ8QqetAL>2=4`D1!t#N= zy??!xm!pxsSS(h)lVQeH%h|}vG!oh{udlBwhRl4m4@wu%I$H;o2OYdpbC5Z_K(s1; z>At0!%A}>pp+gxAdH^fKNa#37MsPt~Z(Nr8^NN#9T4xEFGcDET5!c(l9LNIXXTM^Ow+Bo)$AaLmHD4*u?R#CLBJ?16JCy zRG55ju6DMzey^r<&!;U(s)hX~NPG7Q6f=nc delta 1762 zcmZ9MdpOgJAIHBg<3}T%L*{Z)WbQM=%&5@Z)?7A(&19I%k%O5#jbe0ulsjh==j3c9 z6p8wUbV!)R;*Yp1G!<1Q;%U59lqR@zGcM!?R zASZ$g03<^JAUzWR_C%xf6#$5X1HeB40DvwB0Ojb4r+918LOk$-BL+CkzRB+pbu!UT zzOeuxH}>~z_QqM zgY%OkrKLoyf%w%I#AD|z6z+85@^O99rtIXu&o#cFTFk&&Cj%dnUy&~>PaY^~jes!- zy(6|Z7>;HD3H!&Vu?*VY`$s|;&n<6a+pm4OZMIDqTPez$xq+dIl7}>FmRGSVU%oOa zsAx42yCa_AZm9QbQt5)3L+$i42I){f4yM9ZKT!o$PF`+Js3d-yzP9 zt$HfYFPz&l4y(O)(@bEc`2M$D?unxVnB=O#UR5x^1t;6Nb_rTa??Dq8JTrX|@HUo) zEWn~n_p2SPSS53c3GUc;Rmw(p+tJ#`yR+0Zd}U60 zOm?vP-1S|_^;wJaRg7W+&)*i7xbJZHers!s&)8IFJ*giA49iALRWsX)2MzacbMYwmreTBJ5b^J&0QX)V$BeW(re}Z7jT$29@xJz;~ zr@c2e&r2Z`Wr!cMv(-CD%xTmYv*9gKW!bgH9#VvfY5&F~N?Mj8SmuRBfB(DwDE~A< zwIrf(7Zs7hKo_o|`XM}{13?d}j)&vBl@=jp$lD)6+M4iZt#{E-1amH;e@On`#UPSy z;@Lt!XiPzIi=u+UONX)mfGTtF*PPtFKx1Y?bnpeQ+48CQ*!NdDG}{PM&S%ox zhi<2xuMh3k?OUSKEWIb|_x=X`UNaTZYwWr!kYdCsZGjumYIex#)^dsP~S{cWr~gwpyF4H$1e0t{VgOgwGA6%er1<*N1EU(5u<)iQ{_NPL9TFTggn$}>{A z_@;?#^zG$J5NYf;!tqt5hPKm&yPZp_WnI4qjMQy9Eic1fb5Z7#32PkA7yhaE9`%Eb znA3ZodKR{Yl@2tzX*}PSu`LUL9{9138tM43&saT8UH^bY?`rr9lWM-sH3jX}U%$L! z_e-amZ00T7V}+0I^SKsFpYMHi#Fi(U$dL`&%npnj>7ksoYpDB$q2oV4>ub1wsp3$Y zrPwk(6t5t9^?)|r-iIDcp;OU8G^$7d1RP;*1UEH8n0O)(Xt)X53}pa^qv3EzJ6z8H z0FhC_;UP)i0ECeV!U&G?M8MIeW@rTRJ3#5mx+4N~zdMjb7WD8)YAl@+8U6n*W+J2S zQ0Yf6rU+8`26;q<&=V*$Dv*$n01N*mA~uK;O@&3#LfPxqs-h#n+1?d%-!9ix^~vKJoIQGA(SD{MU8Xh zND4(BM>jcABoFH@)O2Qer6cCntJmvZue(3K-_Ps&`M%!Y&wt+(Z!%F+%}@;hph8{0H=@u%+dhBs#JxLx?TsrCMRx3$J1w5TAoWLlHbx%-Y=DJfg(Q%R|^dgZ*cs-{_TVUVh?JKzcP zsZ=xDBJhS`n0EykFdRC%@Pl3suSEI^?U{V&(SuTJuRLIOl6nN2`aqC!11hV z`Fi7O>{)>W&YbfRqmPE~V*bY~acV&4GTh`h)_eEPQMh?9zA dbfvaP7G`=wkw<@3 z3Yl#7G%J=V8}Kuf8gXH7=fi4loY+5aH=*tSJkDtsJHRsb^~gn8xtZ%q*Hm^)#jRE< z%(H4}&(oWu9nb!3k=%7pKVRe-fKM8{p^dI0ym4AiIx|sN@; z%ra4Y6f5HQa;#OMe}9bLI!#@ilFQrWb+_-8rhZGK59pNza9O!VSlTvBMPtP)L+50*OYTZ2V9t9MT4d!G428;*dz9%c0Bv0hm$rNJiXe z0EMtYA&^)<6cUHV;81p7fRN6l3IzcFH-Q_;4Cin|n5_SYU=%rDnA`>GB?SXWu4F=u H3+>`RRFhk_ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_monitor_channels2.png b/radio/src/bitmaps/800x480/default_theme/mask_monitor_channels2.png deleted file mode 100644 index 820e0ae4684fa5dcec65303adc46b7ebea6995f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1369 zcmZ9MeKga19LK*~9%><7n&rBeZrm$OKQppj#};N2W|m<+G0gIGZEPN*YvrK_$}=ma zx_O9eNK{-haZ*YOner6UgNI2s6RYE{(>eE?d;j=+-skiAoY&|5&*ywj(WqoiggycQ zpy^6+rYjZwHP$N=FyytmD8(pQvq02wuEm15I_LT1OR{+0iegd(ClTe z9KZwJ$j$&%o!O32RvWk!W{h&P^lQKzO^f4|O?AGj2TA?ix-Cc**r1(W7XT`zuFku? zDP4^P4?U+Cx?OF{(qZ}X)v~f|$1B?@C&<&9IvqjS0A7f}REWEQjU|8TF+p->EzR6R zQ|ws6AAeikyC_DY9`?#M6f)BF6QPu_g^Sl}#)!=sptPO6ws*~G_`q8o2?z*`@vPjvon5wp`HAg2ESI%+_ANX_ z$DRKGi*TQBi=;<08^!&s{vw<9nM&TDsM9;nAm%cw`?W~6kw^z_*giv=_u$N>IgQ%Y zltz7RS%EaaH0Vde3MpM!`?PV*HcY{ija^NTN>XDCp4V=&m>}2>3fHeDkyc)P%;eOH zZ{mE<(>c6Cm;RRA<0;SU5smJaZx(!{p~#!JsKu0kVvF7QnTaemwMdnwVMNyb?+U%ETxHR zJWh}M4*JEmR3z@txn2H(ZrR6n$zBv!&T$a&KH$Vl6)b5@Psp$wE#8Q6#fpqn z0&)n6$Q0kO?~c5NO$et_TKy8r>}AnEG*gXD1O@g<9baN#v1#&6R1=h2-N`6I?e!Z> z_KoKeu|DHW6I{vc#YN75qSFF~l1x5ziuPrc|E04bF|Lm=Z@pDLEKIR!XXrU9#V2>?(NDCUzxvM6?A zzW_!iC%!p*tf3aa z*`V$k<1Sd&wf;?0SS!_)~*-5U9G2ON}ajT)s0WUP4 z*O1{w(eO2cC>e6v&*btRYu7nzOQFtP_wUv_1rMpeE3UD^HS27MN)uZhY`A_wG)%zB z$8ciKW9l+$3d$z@IU`b1X@e^so$M;|PA$FW_j))MrCrBaJ{Iw6$zS{6_@dzOH1%ZL za*o~JZp{+h5(~`K=bl_C_A^H+XGMOzewO`#h|uSC1O`U;MXvVarGN_SGteLfDFUkW zGlHHMQhcm&jBMg$$z6GdhFhsCyOf10n6)tu}dwt3B=DQ$LyG4Ym1l0)jpWO=FTcM%c?SY3?1yd%~h4_b@BTAkGYGP!_% zJqne>T^dD(1>8~j$&v=R!oVX%kv#c5qgxVwz`lOr;`7Ndyh7#N?~Fp5i@j?un!ms{ z%hQW4-LMbR0Em@bQ*K0cTH=QH!|xmDO=H35+KFH)iZt!xUvh3Z6l-TNH-|6Z3coyi z$Q#emlJ>BjluT>yra`09?chbE z-YcW$dbiCz1&(<4Y8tFHWMrkeYoUBv82l~(p9$6O%qlclU-O7ocfPpmc5!jpV$2EK z29ehRi7lx=3VZu1^~8gRUMBDCH&bG(QiM%$k48GY56t&O8#{U56=w>nq{;MbC6`kn zX;l*O{L_h^uCrH;#|*$#?=R zb}?Y9`;Ee0!V5a!?Fg6XRf6;EZeN(D+&Rsa^XF`>6X=C2rsL{H4dh!^C5jxm(-WrI~+8gbcgR} z+U-jb4Y|x@DvY%7`D|tG=llzdQ&$TgZuS_Ie~hV(k8C3k|NVhB@y2|OD8cR+A zWCu)JzL=~L@8l7I`qkE_uheKUNPrPjrVI_sKEqK&pjdLne2=je#vFdvl%aLuiaW8N%RfY;h3wD?n>MRV@R|{!L&qV(E!Y dT5Q7qLu_R^UzrOFlx!ITJl#mHw+PgXe*ipSSXBT3 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_monitor_channels4.png b/radio/src/bitmaps/800x480/default_theme/mask_monitor_channels4.png deleted file mode 100644 index 12a4d6c3a448159a568029401d6bcc4c77168b5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1398 zcmZ9MeKZq#7{`AbuGvjRWpY*=m-05vyu_xW=4A=vgBJqjvKKP6{aeU;O?aQx6&RhWyqKngm@ z{KMxo2`TKEmA#P#YijP_1*=xqy!|dC?@<-jm-nor-UpX(X0C5fOh^2*?o>_;&H0{r zozjpk=DEI-huc6WkvFBG2T{v+fT^jyG%&C;kEtm5!CC9}gx#8*bnP>Jc%@V~v|aGZ z9GV8rB3w&(yYr1%hNE$HO*YaYwb<%wV!v@2*El#Ls!7w1=)hWBF2NywxZp=03A8ri zNu<&4maz2ReEMENY}C_9U%VMH4Vvo3Uj91fT?kzCy#|Dc*-bewcT&YjuQBtn(#35c zj3sKw6^l;{bwpxcwAlM6NDLX!n|jr?Dh!Cp3HKAsU_HQlVkeI+bFPU$i_pmF-wqAs z{%jDCxWSte!!>}F^OXbcR3=n8q;i^Oqm{eFVp+#wKYK_c+G>4O z1jT!N-rbE*>i^UnINAMio%f*^UlpJdbx75`gk+%BXkx=%IngQsmK!$zot`_X9+i#!Lu7#0a_jCYRQs=N0R=fWNpwFXe*k95g{vN>_nk7jP~ zE$^}4m!3RhEuuYMn#oCm!zdYj(#=I_-kBcKI$zS@KCkArY9Sqq!DfXG5@&a8+s>Eh z3`F`cV=rq_4u-Lc*nGQEzdO?;lc@-T(`GSQlu%C~_D$tpe(_ed7&qU^%3VW-^+$0yoauN0rTymNa|>ejAQTK&oh^4e zc%LwYV__DWXG5Zmce@W;B6RAZ3z3Jka-hW*@6bofscXjTOjSoo_C(B;M6L`Utg#`4 zLHy^2HwatCo>0#TJtVJ_uO&Lk@h~$z}tN0zS1KqWT zxqYTBA5y26-@jZcDH#{z7PDmPoW<&pj;rE+-RSka$raPE&lGMWxwCQYp+)pZPALQ& zoWryVsqHI5jT=BOE9J(jE~jok5R^6OpG^@~sD|YDG^2luWkK+cH*GiiR!%1X296h} zvXR1w#}cZy*p>V2YMIGjy6*m^2C-$p3ob}@g?Rd9QrMziWb9i?UV#Gyp2fFJrW+ku zC$=-oGiI89ZSWA-X;kv{9kgw_7h30AUxzR8l8?awF=(T+pfLa?f7^m2I*jX&@F!Yc z??6GROGRB04)dp4(wyAKQwi4T+GDUqo|PjC(|Wd;lI!b=A7e;!@~52-rBSftIEq35 z292>sp)FAu3ttQdi?+a8*_xu!STx$@_^GV_0MVDuhhMn*4Zxr*FetRGF9waZw8CO+ uz5}6;u5%TD(Z30_@MuarEi{_?{}3xh&UdD0m6V}i0Kv%v-*i0Wmwy1rk#7O>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H?oEr;B5V$MLII?|KIp${hdr{bt>4>%3>mi=P#=Or7(>w|&G{#j45m&wVI?pjaGBi?r>?MN zIpwi=lS(-PjA$LItt4aT#hsV#ovYHcKgZT) zTfDg3p+V@T#jTgyGE=QTxG8hJaPU<$&q&JQHPZaL;qSG^5(llnuHWic9(~7Ks=QHk z;#Kk4JUe@Pzn1LOoZqKgY9cfD~7xxaboXWwUgZryvV6W5pO;aB-vYs$}s6Spyj|C=XqTIQS?x4~B{ zuNN0zysY-?o#!!W zG)1e7Rr~Mn6Mp|+S9^E#mj&yhcApCk3=p4dvy8dGWO_iva;AkQ2lnU(Ml4U8-y+>} zph*72$STls|kZTukL|LvQKtlXC^_cpCvGEL#xM(Zt`5BIyTtrhp*`MUAR zjU%(Boom^nU-~!vw6Aznm*ZbEJ0tn ze!o7l-1Fk~P*#aqyCimR8+y?LnR(fX6Jvlo5({(JWJdP$`^*2xTvn{v(Ud>TJn$E8emY&a@8 z=VJx;nYM_bP0l+XkKa@MjP diff --git a/radio/src/bitmaps/800x480/default_theme/mask_monitor_logsw.png b/radio/src/bitmaps/800x480/default_theme/mask_monitor_logsw.png index 1f206ad0a3cbcb62fa2496eba7296dcf9790ca28..062845917d9e69ad54cf582097c2aafa576ac9e5 100644 GIT binary patch delta 1033 zcmV+k1or!n3X=$s8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP000B1NklIFHO@@wS4DPu%yYCn}09&PinG%Sglss)6-LS zcXyW=V_I{;=l%UXI~)!|H8cDfjYh2^T6DqFk!A+hKv*smaXT0cjK;&mgS*;-^?GfN z$7BA#$``BM0tqDUA z7vuwyy zS5>3pXPGS4W`k<&vl`p&Hfx+T1IaR11u_U}pL?=;F@N3rq;E_jB$V3DO;xl$6v{*HlXGYg5kpHZl{4*A6C~PMqvU-^@fwpy zA!)*@-1kGQXb_TwWAY2FMJ82s4@mY%pZ6jl+4&y0+us)*z-EKGe zdF`QUk=7mfL_(mA)nf2|YWAk(78^54S~|fGmm#KKvbRgawnkJQl4q1{46G7s17T!R z27hhcSdfX5CXz{Ku_blVYAt|PgXe=&ZA+R{D2US2SBe(!Vl*V!78E3 z#0PC-?W71u=_^_z>P)YRgO?&m4Qc{~bFIRb=qJ$%;&!RCCZP%2BICc`E2X9a^hE)R zcF{K*6uIyz0ig_R#*haglN7BpPRMPBkbiW903;DIk;9j|7l~KnM+ksTXwyz!c{nRy z`o=&uFsmp>2`Q*`J}u-0mz;^z!NrH_;HSvuxQ2HwxrR(i z=(6e>F8AJ(CD4cEZN8+yHliKz!EJjtF7I=6as3x=#H#6sj&U{s0000$qWmlyXR?yheXU*9LUb+OoOzm>tuw+Ss^T;^~jh_gk2sU>ZCin-$NdF>9;lctm?wKX#vI-{157+h303oQH~pc(@u~&PsdJY;(Tg2Fvo`Ees+FzwXTa?fG}dtR(k} zE&f{?nCh$E-0JtqaS|mokfJNDDNx@A#8qJ=f%kao3Y=;hFIPErILa zB!s5a?fbdm#2c>%XSErl?hCnowL9O_n;mQCcz#WusGU`Pxbw-2x6xb;Oqr2ZWxqd5Q-~aDhTA%hp{`;9~ylype>{?X}$9CB-H+~ix+}2$a)4w#1)0=ne#)rHnvTIrsmTN}*YTvih zRIOF|RZ`<^{@E&vI1bc5^Ha5D3STY~jl-fp}0YSXGM!5P8Uwzi6u2d})$Wfe zH^Wbf>cfHMR+k<;vA3UgKY#KryW1NX8@_IlX7JWK@i%DhvbT$0*Bcf6Q+@wjjE}Ft zVCqz%`uddW-$$%?d2Z@nT+dc*9ly;u&*8T+6ZJn!rk$AR@V|L!$SD;DMn#ry(;6S1c)0jPcKkNJ)FT?xEEHP=1R5@+ zwQtt)XVh|t|MHvRK%RZ8+r+3ViUAEwi}D?1k8|J4-+EHLo=K#DXYINEyR`>%PPDek zFt9%9@O!-5!tBVuZo!?GPBvWqIzLUy;fLol)t~a}-}iHNHSrlY&#MIHZ`Bglh?11V zl2ohYqEsNoU}Ruqs%v1ZYh)N=WMpMvXk}udZD3$!VBqfL(}AKPH$NpatrDc6-bmNb zNY}t3#K^$P*u=`n45B0PaO-lQ4h^^!C7HRY#U+Wk1?aYz04;*(nf5WX4X8&Fq$fB( qt)x7$D3zhSyj(9cFS|H7u^?41zbJk7I~ysWA_h-aKbLh*2~7Yf0YaMq diff --git a/radio/src/bitmaps/800x480/default_theme/mask_radio_edit_theme.png b/radio/src/bitmaps/800x480/default_theme/mask_radio_edit_theme.png index b899d57d19a5dfdc45642aa2db7470b0e9121b28..a537d448566fde069191d0e0d21b286c294dfdb4 100644 GIT binary patch delta 1210 zcmV;r1V#J$AHxZd8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP000D7NklG$_{{ruqIAYXfXd+GG_G@YEBq~qh`v=zDuST2{{&CN~M6TyT>U;QMytE;Q- z=jW$7*8Tl`_ww?x@!KfU806yOViM8lLVpo?{BG^~uQQIcSvDFN9l~;tkB`|ZpP!$3 zz_+)zeBIsM<$vdB7xjVu6>K2fH+9=0p)o*zm>gWha~p2Q&)7wZq+uoX zTXc*;=YW!DYvLJ?%f<;wKRrDSEOB{x*<@L?!GvL*TCkxlTnGK*9Rp9MSDlS_T+(=1 zU7^*wAjt#bzGb4^zgk(xPTrvG61YcT>7>rj&)vw^0e_<)D*=|}_jQZ`X||F_SXBh= zxee~UplyW)AWNM~S_$cAfzW$$1ybw+P!(;XlaHY50Q@~9tusW>DLk2qKA~x}_1yyH zpussH%`=RG$D&*>jqa(?cwo00NS@9xQVP7N3k@dNYRMY(OCs0}a7`ngNvoAhz>C%% zmY9pMr++$ZJbX=4p`U0I8I`lAUQ|E z&OlQC`uds{i$zZ4kB*LVGCwD7Z*K>`_5QrRe|~;m-)FvX_7rF$W))>)o)m3kX{4__ z7VA2z7UF3amNc-HQ97NSoo$p(2K?szJ_S~y^?$@tPaf`?@3|yXUWsSNi$Q52nN#L$ z6-J-9_xkPKb7Sn3oYlvZAFtgUP}R_s0C4h|p>k+y$`|sAIiW>{*T17Keo}*mYK6H8 zoBr0^ZeVHlT`koC5XI7s=$;$;MWZpeUH&qhOQ6L13s^a3{~=?gq>EExwA*EA$#PPW zr+@eN_cRrdHY_BEhlg2C_xJbH!^1;fta|d{dn~V5;1bWms}cbC6#Mts^2w}Ql2NY2 z73>X}uR6KPjaQYY!2e5#a`9A=QdN%37Y|r=*os~vlPDm@EHEW2+r{~_f!B<6mWMxF z8*;T!v(A{6u|}9lMUyob%A{2mrG*weZb0Me+2TqN6&C==`>YD6^#eENR6W*JHD|iI0=!HcfOV%FuUMW?I z4Rs4mACfmPTeNkP1pvvGfYYz0J5>Btyx^R)msca+daU7Xsp;6BIyLW_j>$_}j(<7e zGE4~l>tv$^EZm>=3IPPin4N#C{jg|&Brf!!0qm^@rLBzONr3mM@k!^(2EAhpj906S zn$BFJiX7y}){3R$JcvL`e><6Z1Nwp7{Rsf+Ez(O=&Da+~`iRR8Lh=9m`#Yz#QTp4< zTCT!#>RCfK0)Ksu7-7Wkcv;Y7A literal 4090 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 BsapU5 delta 1324 zcmV+{1=ISf2eb;18Gir(0019xy+!~403c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000fw000fw0YWI7cmMzZ z2XskIMF;5v6&3^m);Jf(000C7Nkl3ksGVs;kf4wo-QT}xK_gL=8}ofgKyqZ z=#?@V3IN30%MZPMy?h31EId2Cwilc9o4R}7Q~&_!Fn?#)>Ad&_x|kM8V1Irx0uYa{ zo~UgK01&lMy4ZHeOw`f2!?iXWpfZZgMip9AgO!&Fs^iJ_a&tX>c>ngOS?+B6B^pgi^M@!Blg zexoP4Iqet*gH_i31?Ze05UeuI!ndzHRS-MnI!lEjP@1 zCl;QgO|Nq$0}?rwNfzsBzECPF@7(+Im~9^#wQw7WD5KJeYH8-Ee8%w1ZyShw_|vL1 z(0@y5vy-ej<>}hEY0!wXsktAwO3KmqI=D)Q4DHWb>{21ktlj;3L?Rh_gqB(<7w;rm9VN_jNryR(VR?Bd3u z%Y4v~SqhO(v#=UiOzjSj(W(0@vM}g|hJQN*r$2ofZgv`lGyu4W>_o75gfdFUM{fyJ z6$xh4Rzn?4blyaM*((6n^MRcd&r@_hMkC9HW#Ka-x?6Db5bYX3905UK#H6<-DGc7VP iR5CI;Ff=+aF)J`IIxsMn@l}QZ0000 z%E#l8Hk%DyuUCpitJR`juSflU-@cKp7aEVpKRjLRg8pr>5(b!E&g-*Yb4!nSNmeISOhtMP~eOvlZp0S0yCyVdatU$ z_?$K;JM9W=@NhVM-edN5yB&p+h%7?;0`Wlz5G=Bm>~9`nK50Im8{1=iPMgu>tyU{9 z)3x1h**>S!Dcf$nUYjJP?4Fj2Pr@BG7p* zH-uw$^ZU`~Y+!s&TN1KwC3#V}#$Zx3?oIob>yy(K#f_`WUua{$fzy#mg^riIan3ZE zkS0$jyno1zM>&WXoSPM!wu8aIsZBIDzFaP|*%2O;T+z*V;hyGBs1Fz%!t-YVrVRp2 ziL2@zi>$}XVh^<-&$I#Qoe868JKEqDy>M(kf22lSb=RhsGEdHPMfEAFblniCL d^h#IPmoEdJ&c|w+if50vxJ=~=iq;AW zZROgP5ZxkRZMH^xn@+^WmwYU%^8_Ll8W-qt2V_cVicI>znRoXX-=dAO?CCc1-X|wc zzophI5_;$E3t8E@me1=rjx%~$a7e8AI@!8)lLYsZo`n57pS}p3xMlD5DYf4(J(<~h z=I6i9^)p+ICr^KOYwh{mJ9TgGy$!k;bC&hYqf^I1&fbqV7o6$S$ul!x=GNC0oA!%5 z`4JH_J@~d}r2U#>sfqC>S1-Mg;MhOItBpPGmS6T3-}Gp!dwEkclTJ=k@;e&pTq2)0 z@BFk{M!EEs-7SaIA0Dhr%-^zoa%|MOXkWX6o$9uedF&6>n`qwr_3u;G+04Qj9-nSR zpD%xZwD$S0wU_FBSN9!}U&z{EJuTJJu5N$gyTrn`$E<3OZ_;UJ<|#1CX4$mt>9wrt z1!v>$Cp;z57XR&y(4E6C5fZnjMx{HhXOlKkLlU zRl67*dY_)Z{=lw$p*T;yz++X(TC41HFHii5QK?S-$jDHz?0e|LW2y~|8@G3hR4F|% zU20%vzmj+L!~8D22d#cfPCdA&aiHPA4$lP{LBi&uJN$Q@kDR@|j8X5a>?+1CCIf}< z?^g9(Ss6ZCsd%5!Jx}(d4`*(TZJ27edsd_MzkdP}2|7<3-cGsOVPkMB`Ck2>*X`+x z{gp)$89L_1o?ihsQ&2Yj5#U*27i&@%Y}U;n$k5>3Y%E)FJhXxFulx*_F0rE5 z8E>C#)crJh{yU}>9t=AsUO#`0VJUw?!_J^37lco?30;#6@{=#E+ST~NV^aY0#?RkR zKe*^8$#Y}Z9;M_TC2KDJyjG=TWx~Qxe?i@ErhW9GcVE|Ef9NO2dHr`vv!m{A-gk%8 zzof2A^gAy->o<4#>7P1xX7Cy~)Tes6)L7kkk&_%~>~6YYoq>W~>9qKZO_yi1PQSv) z=AwVCI)E?Cl3{&;slB-3rHd~)SlzB>d0E?~GJ2^ySnPPs%p_{}w_xeL2O*qB6HXS3 zFREvF!=Bat{&&Lx4he@NyILkD&$PN_%)?+E_P~W{!Y{^O1z%oP|9_@?*NdMP2CsM-X8vZbCdth<1-)ZcKNWIE$PwYiwt|Z91ka5 zoMb&$*8i&9dKQK~m$uHH`18o|dYOF{|4(0fbCTn>cx?U8kKOyyzvPRj$KT#DZF+j? zoAzgZ5BuUb7B8I>d-H_Y9J9IXx4-$9Ni#VY?=>tvG&>+U_^xxK*(Njgox!&Rt*4${ zCAD63Zo!hbeiQ$HEc(yD9ZbeCEZfbE!Vr~JtEha#VAbO^K3~dAIVeoYIb6Mw<&;$S!*)?zg diff --git a/radio/src/bitmaps/800x480/default_theme/mask_radio_sd_browser.png b/radio/src/bitmaps/800x480/default_theme/mask_radio_sd_browser.png index 73e45639b9e92019f89e85156fe1b1928a333aeb..1e1adfd1962c26977b6835b96005f94c2878736c 100644 GIT binary patch delta 909 zcmV;819JS?3YZ6w8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0009mNklZ#sz(Mx^@VW#k?P0c7 zeR8?kLJMRSYZDnrlEHEdCK%!b-huXixk=aS_2il_piJZ@&BKX5gv_`-e1=!?U?<-1vG@hogJ(>a_FE~M$c-9*>jQc_ow-qsf z?SZZ?8wd%620yk<)=AmMHD11Q#Baag+2D3m(7?e5q(pcfzuO8wvl_3Ou%^r-9$&aA js(f1uTkxdzKKctToNuL&=0wy00000fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000fw000fw0YWI7cmMzZ z2XskIMF;5v6&3^m);Jf(000CiNklMsBs8v;|PsvNaMW6cxs$L%YS~Ve%DvhA1;*!#aTd{D6!ND^8Z+277NGv_~N3BxN4`YJH^qX%tYPU;L`$S`WMiQH-Q&gfi7 z))-@q>1kt{#edV=UCigx-iM=0VMS*Qj4{U2yWxDx{{Grrnn}NZ_nfyEQ7}RPq)k_L z9t1u1!W=q2GZnP<_7)pJD4~QQZB8g{lMGv z$?`y|$u&0a>Gj=5`*o*Pk1Kh*R5f1Um971V8sCDHitdILDF%rM9MdwYovtMz&>7*u zfl^R#;0Xs%u*37orPI~>k2)cYfhCb*st%Qa%%@8_>eo>1z{!6!oM8ORWPIb9W@NlCYRX-qzS% zRhCCn0tTT30B;66*nZ}FDx2(^O+vfF?mk7aIEi|&@WbQngibk|=lzSFoGF)9!uz78 zr@xXXe*X2Kre0LGmnUPIqnhT>;e~))CK?Ytihuv^FNW@`ZxzX_6(6c)<#`k}C-ooki9bMndajgzMlinM@_c(dwQ+L|AIkC}r{gMd4T*xiP{PR`S znYG-#KbB~^d9(P?A#VhP_7?GQ;{2dPnO)7Qd}<@?_`KJWR?pt1Qr%jRers-asZU;H z(SJ-ynd-}rq^87mtMjNU5W9^^2idA3gwW$-A{1)!_~;oU9L=VYDdGYf7kQpMf~EbW z(U3=<6w+Sp+@9Y_PZE!om{G{1Pllno8FSMc8UX04ga7DKFmRkXpG(7jZSAjb<9$vJ z2n>$|;gy588o9G*OZQrI;m2i95eqN=y?>%3?o+srx(d#qg}Q5rLElof1M54iYA>p* zD?i2QxgvTh4Kx>?8<_|#b3%Q4%b$aiu0`*x-@fQPq8VsrA28O5uXVnR6S2}=(_kM8 zF>PzYuy?hX2M-XQ(-k#q^^%gep=&&0@_C~?7D{609`C$l1qG;RR=4)@@}UL-d4G0N zy8VSq0JPcPVgL^qO6}52osA>e7n}fkaM)Y;**n5ruMBBd19-sHST#LmlY|@^1j)eg zY-!hx*Ga)s)zfGKc))sje%k-?4k3BT=*q5I?s0Now#`LbdWrxZ5L`D>)1h^p<=_ll zLG2q?JVumvyW*vl96%TV$^X!|tAFKpP0sGV+-b>>5@7&zWiN3G48j?$mduFcfBbX* z3&?-O#|*}b82|tPC3HntbYx+4WjbSWWnpw>05UK#H7zhREiy4wGBP?aF*-CjD=;uR zFfd0#Oo#vg03~!qSaf7zbY(hiZ)9m^c>ppnGBPbOGA%GTR5CC+Gc-CfHcBfnFgh?W zVZ()|0000ebVXQnWMOn=I&^7mWpi|4ZEyfGFfuhQFf%POF;p@#IxsXkFfl7IFgh?W Tmhn}F00000NkvXXu0mjf7pQR) diff --git a/radio/src/bitmaps/800x480/default_theme/mask_radio_setup.png b/radio/src/bitmaps/800x480/default_theme/mask_radio_setup.png index c65b5048a9bfb9aaeecdaf09d58939a61c1530dc..c72229c97f70b944ab57b4aae4fb6c422f34d880 100644 GIT binary patch delta 1188 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 delta 1286 zcmV+h1^N1(2agJn8Gir(0019xy+!~403c&XQcVB=dL{q>fP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000fw000fw0YWI7cmMzZ z2XskIMF;5v6&3^m);Jf(000BtNkl=YPj1wpAhq>ao|~>2k1##TFL^hIi~9msJg~1Q!FT-Ud#erWZdxs{QIM zr@%oL{Wl-4<}W$*Y5#3+)90643;=)z6F)gnWjE;2ig(ET;q|Iwu9o+apJ+bcbP&!0 z%EnCaYH#)a#oqkP`fN0%6I%&~(B01L`;ND}w-zq}fPcCXNn}iQb}PR}=Rzr4i={L~ zRcm}r1}TZ)-15dt%gNTZW(!}W<#66^Dm&2V^oC?8;lV!wDMjUsrt=?Ma};S(h%2uK z!&9CR`e|q`tvQmZ%oUGDbJeV3QMVG{6I_rTfJLdz;%>^yfxy8s5I>kCYcCx+-gx=g#f;M%gP}b^wrR>k*~?dY`8< z=dzX4H7;S7Hn`rio?3||x1>m_vXPQWvv8`}k}AEXqoZQKFCCX(o0*=M$nFqK^Rd$% zPTo+HDS0Pj+XZt;7iSj-?}|d5yWW_JEZ?bWa>Of2HESB03afw&F^|V z-wwxeL_~obXKTyn4`;hEClL`5ujPCvd-apE)c`R0>)_w7%tn%ZV>Oj~vHd@|znskw z5#{{fm>K-b*sfubh=>J%1+U{mTLl1Ye1G4cK49vq8xt!4zyg$>_rK9806=JXG<@KQ zPL3@VX*sYYU2FvaW%9QT9BAoTzeoTJh!58q&oly1)}|ha2h-}#l27X$Ih1d*0YKu` zNJ?*2sDY;%UC0=%8~{Xre*#^L26NgbDS!h2N^C3obV1SbrUG~#K){>OhoKfo(|<`J zpN&;3n7W%fl!i8|3S!`|dX?_aqz|D0`w<_!_?g`v-~j5zoEoeqZsnL=5X)PzR+z42ww zwik_XZ6fgEj+k>Ru~#OIu!!hYRTZshfmmr>Sm`0Kd|`RTWcmax(vZDguXH>f*>kts z(d+dhS=OWhh<`#{#P@w_)?9KNho+)@q!A8(g*oC*H-%XzqHJs{mp-4*EDXB1-EJg< za%l*Ap7-xPwq}`l23jT}PL4R81wp_<;&eK(cYXiB5L%=GMz(9jWl$!a=Q(RbV8o}Q zOgc#tYSN>@-x(#n*=*W#Fyi>rty@Id>hXL&sVEB8WPg{oKI|z^7gkyqR$3QUS{GJY z7gkyqi(SquTaUB0tY@6$;MF_(a5UO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H@!c)5S5w ze0Po}%s41>$RY5(yO?f>F7GpUm#bnnRI;@9y1OV+Jzjfd z?^J{7a#!x{weOx9m#)$OPQLC8bGld7p^cH^YySr^zSysSVDZwWCajZ+3)hvpoBLhe zUzlopa4BB|o;_Ezm!;(q&VNRzYt+n2i-i=A#hyLfFu;jeZH(D`^m@yP`Yzk-;qQ@1EM>%QyuZRfQSvya{!Zh)O;AbN4!5BPRv} zZ4-HxU82037y=w-{l9nWvS^X9-Ns@krtnaKDfTgL&zcxm7kRxs9ar}xPa7L{@%osTc64Q^Sf%V zGHdx#wojbmz_g-T;u=wsl30>zm0Xkxq!^40j7)V6jCG9+LyU~93=FMIEVK;_tPBj? zoqRe_H00)|WTsVuG#Kd`8tEEXgcuoE8Jk!cnL#up9&TL@)Sv;kp(HamwYVfPw*cJ| Z6QDg1J<~phwgL4pc)I$ztaD0e0sz%)NqqnS diff --git a/radio/src/bitmaps/800x480/default_theme/mask_stats_debug.png b/radio/src/bitmaps/800x480/default_theme/mask_stats_debug.png index 11f9fc461327e1a3d9fe2e8a06c3c63958b01077..734d58461b78ca7b0f03b36e672abb9df8798a68 100644 GIT binary patch delta 671 zcmV;Q0$}~H2do8<8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0006(Nkl}HpaVLf15|(t^5&P}CU>{Ff96eM=AM}tZp?UYZ8pgsiGMfe^H~fA1JP_Y1rd2O z;4>PH#Pxdps0zZ%cDwaT)HL9!q;UtoAp9A~i28E5B%NNbr-m>Uq9|oE;8_iAjgZqn^uFEZHPe8XG3m?D&F$+(sRD(Mn5A4|FIIMNSx#(pB%z zC=Fq3l;U8C=jt}V-XsWuQlsdGENr7nN!41FQDht1lgY%`j+GPi>xMagmjhn<_t;2t zt6Wxvcz-+|^esg;Vu?sg0U`4>Y+`RV8<7Vz<*8(p(Kt5|k2G67P|A?Eh&bNIH%ul_ zO%SazTUTz5n21PoRiY?GZZa>4AV{&u^9=oYoeyAg>W(UH!B*Joi=7X%mt%KQyBM%ZG$UN7>6Mx&v&3mE!ixj*RD{Y!_*Grj--002ovPDHLk FV1hUNF#rGn literal 944 zcmeAS@N?(olHy`uVBq!ia0vp^x**H}BpBoi_qqWog=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H=SE)5S5wG zO-yr})RilGTzw159y=8*ukZffq|g!NQm|-S*+S8Fr>%Zhrt59Vlrq?+`1ym;p4UpA zf~)oQJFL$?(>vGyzV3UBg?wVh;vHoP0Ss$qoSmNP>O1$Mjz9y`njbHJu8!b*;;++u zulPa0b_a*XL$^ECll*QrX-=B(P13RP%a_`V?;cD|(6o-f@~d}&Lsr?vI=vUci`LVo-+LoYT? zJo5a8ujlRT@T&5?$7lRMbM&vy_YbdLFOkZ9BeAqiymPwKs}+;8eJ{^#TKY$?c>NLH zom+G>4~QDwtx&P`UE=oV)ILTAspZ$%rio9#w017T(-*%pM3=?-Ir7TZ6{yEtmX(w) z*}jasxL@5qZ0%`yJcl-E}!8lU!QtyYxX~Fc3J5y;YU-~J^%3{jw`Zj&(D{iYGQ6ZXqmD1?zIc7 z@(cyGH1RMZ>ea^_NX|p07If<~9$*oTpFbEz4({ygFN$AuRiXm2&@*7hDxT zk7b+KrLVhn<(hN_L#83?y%o%?>EBx(2dl~l-e{dTbH}yh=MIdw4|G}BT~v~u)W|69 z!1%hrRp9!9h-Led4~I1{wbku&4qe9BvUT$GC-Q3F`B$AdBkh>k7YIyvswJ)wB`Jv| zsaDBFsX&Us$iT={*T7iU$S}mn$jZRb%EUt3z`)ADz}?BG14Tn_eoAIqB}jvjuAz~x zfklXsft9g|m5~`lL*n7qV`v*tk0eM>aDG}z od16s2LwR|*US?i)adKios$PCk`s{Z$Qb0uvp00i_>zopr02~&Pm;e9( diff --git a/radio/src/bitmaps/800x480/default_theme/mask_stats_throttle_graph.png b/radio/src/bitmaps/800x480/default_theme/mask_stats_throttle_graph.png deleted file mode 100644 index 1631dd30ee34a418a18117fa4246cd38ac1fe488..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1260 zcmeAS@N?(olHy`uVBq!ia0vp^x**H}BpBoi_qqWog=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmLPnx~6nh{y4*SKs?bhf1)2c)xRR`QD{5yBL;EU+0<; z$yR)rZB9-zhlz1UZa3-hvhfim^C$|M>#+ul|wpL zGWE-)uiL&)*N<9oH?MF;#l5>W^XJ%nw|s8He{n;*>s!`lwuUdy(%kNrp08cH^w^wf zhxh-UKJVQ!?>Xvy@=F+{JX+n{omZdAyOl7vw~BwJ1M{I92@RV!yDD5{=;*XwbaLL+ zeKR+i$Ju+7tafJT%_x3so?c@cx_~h;@o?$3)2p&q-q^MDOov;Z(jEl{69ujZv*zx~ zJhA%V&spJj3e1WHj>ND!^8E5#A1^!4{=-ITg9&r1nqNGAvHtqsOuu`AJ2zkX?VNl0 zf3CsN?K{gKm3&lEXTE>mC&K2hZe{u`@v!OhpVW35$N%4SaLeBNA&XXD{=8k?Y}@*7 z87bK~6Z5&Rw?270Vfx9v2N$-br0Z$8ud5eyJ?p;w%#?Z4-u*YQkWJLljoBu1-R+RY zud?NvA9!7kX8-g3#0T3Wc{gW>DKjSRJ3YBg>-|xuJ$t{OT6;Q};o3R@Z`Xt@7mK~2G)iE6A>#edctTHIn+o6H?N zDb_beQus`+_$`I28c=FRelPtX5(lP~x=yLP#S!_JSKyYA=e zURmiHGNz73^WNc)Q5V~?`Pv{$avkO^FvG?`YtzX-aSF`!} zM$z;Y>HmaEuB-C1A1L{;=g-;XS?~9zT;6RJ8GEhnAB(wY)8WvIb2{%P>dkrlzb9+z z);;UiRV?3a^m2FGxy{f1u6_ONO!a!V`dI<9_t;##d}m@-Xw?Jf(%oF$-!onbc%Hu( zIwS0_50A`(Ws^Kk&H7=Xx4~q}6Jb-$m)RN&3mLi;>?+I8KGjg1!g!^a|HI97o{#El zzF+N^z7T)@YlNntVA7}VET@Y{K8@n!h-(awX4^XHLBCxu#R*ggMOo9oM$^TE&9vpSRp;`^30DERgw? zkL?dB;VHRiiv*g)R;R6JIh^w1mDgE^&K1Rn4s<*??PwgNqS27dDD~h~+GAy>iT`*R zTxLu6N59&!#%`y?j)(eY(hLkqP8MZG%dLZQUR>ONMz(*u@@ilAo^9fDGF=YKJyZQD zum0U$FEWDPRLrUmm}yl@Tq8?+%fuWU&g|>l# zm4Sh~lTQbVhTQy=%(P071|wZVBV7ZF5F-OCV-qVQGl+)7!>!AK8Z_WGlw{_n7MCRE z7NA>V0<;IBXWGZmHlQ9!ke=ZDw370~qEv?R@^Zb*yzJuS#DY}4{G#;P?`))iiWody L{an^LB{Ts5%`+v_ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_add_view.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_add_view.png index e8b2ee8709cf436ba1db5d1dbfc84d3c7eef5e66..0ef2a88954b716a07d010e53a37b9eaddfa46ab9 100644 GIT binary patch delta 471 zcmV;|0Vw{`2Id2h8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0004dNkltrMa-uTv+KnvMht=c_@kkM`4q0 z+ZJ_Qt2dFO*njrm!b)>-N$EeFh@MY;GS3<`i)0BQvS$brtM<@$1&oHC_t5q;^!+*$Xi%C)=#Gx#2z)L^OfPwF2n@rp zIuny?UInThTWSf~Pc&JWw&mv5y(#lI^omc5^l6%43XjJFvX58G-hbwkG)KjW2L=ED N002ovPDHLkV1l+z&h!8P literal 850 zcmeAS@N?(olHy`uVBq!ia0vp^x**H}BpBoi_qqWog=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C(G&@^*J&_}|`tWO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmMykEe@ch{y4_SI_zh2Z|i{_i#rORI{z@SYw~|^>Ig@n;zFGiRmTS?J}J5$4d6$4FR^f zPwW3~kFuN>az8&!zw+E()p( z|GR;A>mwRJ#yq}reiL6O6U*+aFaIk9bsp-!bGOfpMP$X~gTLn3-;JLv(fIA#!^L|o z!@u{>SfEg{@yo-^+&iiHW#M93i-i>f3{1W*+p|Zo?6vFWduRN4WuMKf5vbq&xaxh& z@uG4yX9cMnt991YmfkxxD`HuJ-N}jDZXdrl{o;a)m**vKI9bo0J$Iq~hqJL~fJsBO z#5JNMC9x#cD!C{XNHG{07@6uC80#7th8P)H85mlbSZEs+oZUMR_CO~^2dZv90Z3F6& v1nCLRPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsEEPS)z4*}Q$iB}?zU-$ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_setup.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_setup.png index f6d581b747b5e6ab310fa2e046e1f1b1634c153e..64dce8a74771c9266e17dfc9f9e23e1fb53eda66 100644 GIT binary patch delta 392 zcmX@lI-PlfWIY=L1A~>+qggr{n437*fIbc4pw(Rs){4dcSwp9u7=G6B<}#8dy{sm{lGy$TTn) zFlgLZDzmMp{qwC7&;3hI|N53YMK>~0?pUEoW&OO_DxN$HhK_bmOwVr)HC?bUQz~%L z{wACJ%qT~WLuM>!tq79Df+5 znAu*tNvF8@(_aOLkXhXdOaK2#k!btfG4a?Yo%J?{zH4xDtU^T$|EcvaOWkenq=5aGr{%dY%dOz_TL12Or4v`7%zfRRyI=nN b!0(i`>h663ohiVOWbkzLb6MwO>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SOoPmL{($mE;#N+tetKQyBfg;6t}X zzKz>99$(};`_|XqUlMP#Ckn9WE;5Lc5L+qYaWmO4D(L47x8-@D9mG*3VxqeKa~WPRyb4mFKn1a&sNdzY?&S_x9N&ZX=BaX>v>-cl1w> z73=4U6kXsDeDTd?$GoR*%a6QYbZ=F8J#W&P7kq*~D;ykps+>=I*UY`%5WhC(bj{y& zB`>RHeK5Ved&^7b+uwD4Yn9@&*Prc^yE*I0vdOz;moDBb{rS(E&n-+5e|gQk*Z&Fr z=D`2O{=%BIp7FQb7`Ql+*WGHJZJ&I()X;(_;DBX$as3CQb2IP1vHU7FtCUG(g4lYa z3;a`RI%(<(t4jC2i+bPX&*j0~)dO{|Q}AQ}=6w=M^2(16=el9`)YT#}eu zfNqHi&>o1MX&*z|fO;fBdV=%QO3D+9QW?t2%k?tzvWt@w3sUv+i_&MmvylQSV(@hJ Kb6Mw<&;$VSf)hLd diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view1.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view1.png index 7e5f2fd3ac6c2d14aa47212b43367e5facea340f..f72cf313e0fca65e015e2d818bbbe05788880d0b 100644 GIT binary patch delta 409 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 literal 1205 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK3=%mav;s&eBzpw;GB8xBF)%c=FfjZA3N^f7 zU???UV0e|lz+g3lfkC`r&aOZk1_s8v0X`wF|NsC0_U+rtmoM+$y?g!o^($Ad{QC9l z+_`fTCQJwo4K*_})7I8*YHBh!Hy08T0-DCo&Mq!4uB51_tgI|4A;H1H!OF_2tE1!M z>>M8xlb@Sgn4g~z7w7EgsH~*K%gf8m%v@7hxqJKen^&$pxPAN4-Mf$O+_`Z2^ny8a zT%4Q)1qBrq6_+ktc>K_zjceD=oI16uy}hryd-d|=S1w$*ck9-IxpUoIU747eq@|@> z8XIe>s+=4gWTd4z*xC8`_$C=YVT1G}jX(=fl9v&7J7A{UsZ%@xR z&!5koIa5PJqq(8s<&!4{`ufI3MxAYK&mKOUJ$<^0iV7PWTVz<+{$0E3s;jxVxlN3X z@87(+eDPv04-XA>^|L2VM1_Y-h>MpL7GAw@;n=~0WyQq`^71Om%H<^`hxYD0dE`iA zU7ePuCL1fOqJlzBX6C+KyKY>*+*Dtmo|<~*#EDbKjPN!k4(h`rdN6eThk=S+fhNZ>M9UmF>{P@buR-Alev!~|I z4@P-?e(NJ8YJ72ZhZ?3gbFP^+bMl0f370Kr9$XcdkSE63_<*DhYYY;Is;WM*h; ztiIybp-ZQ39lLh!-oc9}Z=P#iushcE&YhpJHa4Yu_SCX;@H!U8+soDmCWW%Iu(7tc z2(7l#i7{20v|zWQf{B)emD;t|89Sal5AWFA)9>%0B6BZ6VEU9flV&}0nv(VXOV61# zZ|20*C531|c`7a<_Ve)1AED1hr%#zSwOep$)EcGzn^vum@no6*Dr@GfTf3?jwte|h zGSQ>hX_fTUS+k;}Zr`%DvfjO`nq#HdtKRpo=NlA0I^sEbxsU3Ks#{+qjnmIDHQn5t zbeUtBFzZ^&;)Mxu8bwx$YkO4J{!v?-r?B>(;#xoDjr*2}GB6ytFv;Nli`Xl`SWzu; zjVMV;EJ?LWE=mPb3`Pb3;a`RI%(<(t4 zjC2i+bPX&*j0~)dO{|Q}AQ}=6w=M^2(16=el9`)YT#}eufNqHi&>o1MX&*z|fO;fB udV=%QO3D+9QW?t2%k?tzvWt@w3sUv+i_&MmvylQSV(@hJb6Mw<&;$UO;^f-^ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view3.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view3.png index 232d62afef713ed3f4f0009f0c8c0cdde4b27c31..a5dc836db2ce86a19defd6f2697cc01cfefdc47c 100644 GIT binary patch delta 588 zcmV-S0<-<_3EBjZ8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0005+Nkl5Qf|H7Ixf#Be(%eJ8r-c z+(2%?4LAZPzzMLk!wImonm7NHP7NX%^;Bn4HGfsBBtv|Y>3`|&G^x9m%cW|!+p1Qp zDI)U5z|-sX)ZuVoR7LohOeS7|zB6zdXw0Apz-;h{^67Mn_WL~*MVgn$Hy_S2@Rsf; zh0+fdPyt#>0a{7{T1o+0N *0a{7{T1th4{-vDMXf%vL+wGPvmkWI&(bpxk12&tD zdKRt?1_Rgo$bSKkMkAG_;c(~=G#Wv+(8It}$MxB47GFP~&n^uk8E9^_K-1~;W!!d| zEH@F`i1Yc}Y&dAOTD^?#b~|b|o937|=sSr)CxP0k*X!{yPcBU=Z|nE_v1>TC>Et2x z@*6l9Hl7WPF>j&&5$;r3e?*jnZnqn)*K3mrE0qd*ihtDUbj&7PEEbu+S9u$|i)+a9 z0vZO_VCnFf`dzV*r=g4sKsp1`@pya~w+p6fwVHY_G3ai$OFCu8=TQ_rjJH~?`1pB3 zNfKFp4fzr&bOtp3JRXl9#!!!tFFu`Al0FNQbGVlrG(T}WQm{U$r%PBK7a#hzP#p2b z#Q(c8m_?$>aXGv(_&*`{JLdb`jnhAIp@O#vpMeokcrTO;`CX`aQOjPhSMo(jH1K0P a#{U61G`$i11NUSA0000F5AN9$6BQ*VCpUfapI^Ovd1QFFyquhdy1KEEQAkiwPiN=;-McTIIU^}4DJUptZ)f-B*)vyX zXI>s2E>2EQclVoDuH@(DiiwIcGc(&-TQ}9$OG!$yva)8Trx)bq@$vDwI6K?f+RDkw z%F4(n$jc`uCaznx>iMHbE0-=+QBhg5V#U;n6Z?C5=FOUQ|K`n8M~`NvrO8N3_jGh@ z-?VAx)~(w%ZrrhX^O@tvQO>_3`|+qL734=V|E2lkiEpy*OmPxv#1yg<24KM<3K$fo-U3d z9>iO}NnXNea#%52=pC63!`ux^MO4Rt` z>JBwbZ{}PxYv$w$ClfAP&OEp(az{tNne*q5GKHNzjvblkYk(ptrx$*W5Dobvix^?W@ zxqAmMp1gVV>e;yyvb@=~%d6|^`2F?s<>RfBoG+ZWSGaJji{t7vN3ny73lkp-P7HKe zA=cB^+1u^!;UlE3rsq02ILP$!CF7QkPVawb*1VZ>XU`ud`@(9a5N$Cr(dkpBO|1^? z5SCP%8hY%irs>urZ3(fp&VI?l8&}Pa{$vt;n`33(w(NEmpY|$0b;r%ScU6~E{r)AZ z?lZ?^=j?WF>l=$#sjcl%UHeCEZJxr~dx~rQlsE2MBFez9&UV_d+52WP z0i#K^#5JNMC9x#cD!C{XNHG{07@6uC80#7th8P)H85mlbSZEs+oZUMR_CO~^2dZv90 zZ3F6&1nCLRPb(=;EJ|f4FE7{2%*!rLPAo{(%P&fw{mw=TsEEPS)z4*}Q$iB}l85Ii diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view4.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view4.png index 8166feb28eea8413f0cbc46fa4e254ebaa25ca3b..0d0ca96716e179d4fe307e72a4735dfa8203c6e6 100644 GIT binary patch delta 485 zcmVQ z9RL*o9nb-E03E=Q8&CmIf!AYU6h$Hk6pgXuCr$o?9_X{N#(%(OilSi8=ab!THwFNw zDfF>zo3(8#RT z15(Qc6Inbg%Ub;|ilXIqo+Jt6c@A}5!zY;PI{iHT4PLaAzVPXV9i8OA#q0F9HPwmi z2SK1b(|d{!S_Z=~FudA22&3n+V~eXU+{!((Fm8d%)!{{$&y-~;=ErH8;4I*69dpd3 bm(TtI0-~9z%6@_-00000NkvXXu0mjfIm^}W literal 1173 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK3=%mav;s&eBzpw;GB8xBF)%c=FfjZA3N^f7 zU???UV0e|lz+g3lfkC`r&aOZk1_s890X`wF|NsC0_U+rtmoM+$y?g!o^($Ad{QC9l z+_`fTCQJwo4K*_})7I8*YHBh!Hy08T0-DCc%*@Hj$<58p&d$!n#KgnRZDe5J?&|95 z;-aCU!Ozdn$i$?lr?+Csk~`O~9Y1`yw5Uj1OG{l%t+=4z;+Zr5fB$~}@?}p)hl#N< zBO_yCT-?@;8}Hw`_2Tj4j@DLVLqjf3PE%v!+0&<=J9#oED{JM_r7s^p?rdw5m6dI2 zY}~wV-K=TT>}+kPOq}@g$rD~)UJrNoBL@yFS+Ky%!$VC~b#i}yS6iE-z5SF46AtXz zlb@3#C?Fs$B{g;8L}q4Y332hds;XlL54JTmnHU*On=~oF&u`6&6^HiibFi~xV`G~- zX;NovtCp75woRMLOG+dpB*etTq9Y@3T)uo{|NgS#Vn1JBXGcd*clXG!uvJT!=4NGC zTUqI7YgboR-noAL?8%dJX3m^7efpdkGp=5^@a@Bg3#U(SUcbJ%p+OZ0R8%rjQ+I6M zeEiU%U0b*A-oE|do;{E6-u?Oc^SoKJbaix?n3)9y1r7A|LxY2p;^R{i6ASb5_U+vH z@y(l-hK8Vk0C90~W+tXrPo5YW7zhgsXQrofadBCin~REw@bK^m3kk8Xu&6A}n*)p| z#w2fd7lsa2Sq~tGv%n*=7??(`gD|6$#_S59AbW|YuPggYW>GN~#%mVh$ANm1JzX3_ zJdP(PEHF$+NlHsR${sOerbJ@b%^Q{$J9m6!)bryjGh1=;jm@5#KR+1d_4%!jl&JB= z)g5Y>-psjX*38KhP9|KooOy6nHXaY|Ps`9YJs3J$(7}?PKpLS@!=M4lGEh`!BF4q`JMW)!n7*hx<&| zZox2FWohZ>hu@3Kr>6NulsY8^6?tVvRkclxN(;a9;~k z0*9Z;e3vy@`%j)q4W80rR=ukC+Lo6`Ry`A+X&9U#)|GYXRK%rI`Ila?U3w*Z>6MAl zYwsvVhC}+Db5CV>tp>(`YKdz^NlIc#s#S7PDv)9@GB7gLH89pSG7K>?vNABVGO^G$ zFt7qme)MrIHViHBR412t&CZ79jiO)V}- z%q>8-!~|#$M9;L3p>04tk{~_7`DrEPiAAXl<>lpinR(g8$%zH2dih1^v)|cB0TnTL My85}Sb4q9e0R7w34*&oF diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view5.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view5.png index 7c922dbaae9e58a2c39d9ca209fd3200e089afdd..55554b0abda2ed345b477d0a73f9f2f82c7f084d 100644 GIT binary patch delta 530 zcmaFDxqxMYWIY=L1A~>+qggx7E|dF{Fa=?aYh0%?1K(`nmTf3mQ4Oo#42saFfNXfj5EKt%0|} z{9XfR1Lul*Ze{hQ4VPXSOsapW5EvT;xkU9SMYt>u-<-z_g$0RE9wnxWL zTk7ec4>5!F^U0 zD=K@jkjWr>-RpDT4szAn&3|eC#kJ?s!qux5sd%cbKfS4E+L3Q+^}SvbClxeq|9$g} z?X7J~%a3yDW{D+7?_`j3vELt-^G?w9;tRP9b6;b*#Wv3^&fVJgV?khhbdUf`n&a!m z-3~4Zi}uL0Jrw@&_@e=P)XWc$<)4R0hF?9^+dOa6>8D0c$!5>inWnv8xctDSQ>xNwtrKz zygcf)e?4k$OH7IXys2pB*4ZnVtqz(^jOMU0{Isd}0Q2El3{$@UN$uXzs+hoe*=VcN z%!~&uPsF2H*uOEVF)LqQp&l OSoL)Eb6Mw<&;$UKTyES^7q)7rJ? zPo27V^XAzTC%QX2fWGD8;xaNcba!)eb#c+w($dn3}R#r-iipt8$=4NIsO-+~2pMUY_QGZX5s;a88 zlG3`BD<}2!P3-Gix@ggv6DM9jd-nX%qgBh6$;im`c6RRAvSrt{ZQC|&I<#-!uB}_8 zrKHSEOk$#)EhU!OH7Qj@&hT^Kr8Wj%l# z&H|6fVqk*04#JF18nY{ag6t)pzOL*qnMK7|7_V7~9|!7b^>lFz@i?BGu)r`OB`GcO zD0{?=nG%UzH*Z*4?A-B@QO}RB%xuNUH#U1}{`_E+*XOrBQliEeS9hpkdNb#mSu-b3 zIGJ$Sa^}HRkvlp9&YVAglqu}&Dc>nsdDjB3ZVA>^&`{xFQ(BbN658$U;pNHP*t2Gi zP2yFqF0WHst5&VbdL=chB{Vzp^@~?8r6nY!B)x^ga+9*s@)9#sQ&V%3y?e5(tJ&+^ z6$FZvytZ!cZqS{mn344A)w6esZ(lxrtL)H|6>o1|Kege&f(HUhP6j4AHcCcXR%&MF zjOQ(Q)pBIXlPOoWl-O?X@v&2PS~XW_(xBhSn ztNYF~DxI~(;^2pQcFE7y+-xjPdVX%gJa-E{;b;00J65EB6nbe^Sa%3$?KHi~`s?EM zC8^r4%DQwa;?k-7ORv~2y^_83%0%e3cN8N7-^VGO)pMR`0^>-v#5JNMC9x#cD!C{X zNHG{07@6uC80#7th8P)H85mlbSZEs+oZUMR_CO~^2dZv90Z3F6&1nCLRPb(=;EJ|f4 jFE7{2%*!rLPAo{(%P&fw{mw=TsEEPS)z4*}Q$iB}zHsqu diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view6.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view6.png index 530cd32c0cf319f3091095cdce1e2981f0f9be11..14f31661efd51b0234b84f3f1503746045fe5642 100644 GIT binary patch delta 564 zcmV-40?Yl23c>`C8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0005kNklIyUasSKGMT8*&{-o*Q)RBOcv;4B?dALZt};iS=fXsGP9YoNPk3PE(*?wQQ=GFE z7dyQnQ!Ew>n$2dk-EMzex7lnOpU2{96pmNkw9k_do_{vE-EOKAnw(Cj`gc=FXA|9& z8SL}kiAGhlv17iek%G(26o>sC^W1v97UupB`H=GHNoPZaL|#VDHo^bih=!qnyuxwQ zidVGuxLpl#>^hzv;Pw2a=D!me*XkST4;t(=_zcyFU0dgi?e}{@crA{Dl+F!00qLHM z0gcasku4(i1Y)3+SD?INAXAnl`ND8GRB^21AAAF$T};_3p&X?E0000(?LLzWwOVokw8HS{fTo zjE$Qc8crTLa{SPtB?}hxbau8iH&5v8UA}m6UUs&Uq9Q*(e`Q(Ott(ef9X(oGRi&e? z&CSKd$H%9yr>Ci*!OYCe%fsX1?7V*U>U%eD=4NNBtEq7S0XsVjGqa?GL|t|Dnd8R~ z?cK}C$+>3v@+;@gEtx;x+{{cxS=q+g+RoNiOjLCLu3Z;SomxD9{>0wi4QtlixO{o% zmM!@?Ia(STx;i@NPM&=I^y!iP`*&>Kyn6ZaB?}iG+_R@BKVLy!o{g2&Kwtmrg$o~E zz1q2TYhhlVxv6PHSlHVaFZOKT9v&JhC?Ih0%$d}rBrZ-)K3-mTSJx}&&p)|$Z`!0u z8X6iW4j=yi>zApC$=a1GUp#uWd)qcORn_gAH@|=NYTwSC)2B>%c;}9Wy1Kl){M=cy zorGI64Uf64YumQN`}SE`TC%XPaC37v*41^kwN+PCgaidih>ME|3(H7LOGrov z2nd*j`AY!fm@&!Q-G!lpRn`N@;VkfoEC!~p>mbbNq%pe!D9B#o>Fdh=l37%Yh4Gq& z_;H|~xt=bLAs)w*6BZaIq$H&!9%YZ1F;gP3>*fthi=8_@GV1y9m6@$L`Nn2X&7U8P z^7{PNM@rQA;_41HOmF5~Gi&DL2`3XSTh2VVDso3hz?t*sk1~awJ>@$kEALw1)h%JV z3K}XpN?ud43=26uH8Uk6Eh_^Ltr8WPIwdsZ>J?Ly)*~FNuU)!!@#eD`&M-=mexOin3x<+hV^-<3(x@G0)Rshrr1)Jd zncJ~*=c>=ogeNEYioFmO)r}EZytjh$;0~6ir3Z~pPg@_cvunp3wOu7!f6UtY+U7@K z$mFnNlfvpIhnY_Zdp{v;`NW9$OTZH2YtZ!TjPJUDMFN9riEBhjN@7W>RdP`(kYX@0 zFf!FOFxE9P3^6jYGBC6rP=f~ChLX(O)Z&uF+yZnmmtT}V`<;yxP!WTttDnm{r-UW|Rp$%x diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view7.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view7.png index 6fb1536e9f608a5e7ddc9fd311bed262f8e24b45..3bae03cf82bef2654edef5cf6a8ae294eb874813 100644 GIT binary patch delta 466 zcmV;@0WJQM2;l>e8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0004YNklfC{_}ijgk~aUzY4$)5Oj0yCK zqKJ>EPHu92m;uPMMt};D!9Uk zT{hM;1fJ(z-G8rN7|U^TdG6|dBl>h4$7j2)>$jfKnq}+?0)-NtUg@$dPw6B{%$Jt4 zye!K*15m%ToMmh)JgY|-3yE@}Tp`Q)q_O`Bnx;{GUXQe#Wt^vtmzJ~q;YkF&w47yy zX-=QCykviI-a{)bzZfY_b7wG|YNlxdD)!$y+v~a>p-Y1A`v7U0l4knb$n%_o;_|6A z#Ig@!K;TiX$-+2*#jL})wBzi$4*I@_ZQH;U9LG8OvDk_s|0>E|>dC^#1^@s607*qo IM6N<$f`qx%asU7T literal 1043 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK3=%mav;s&eBzpw;GB8xBF)%c=FfjZA3N^f7 zU???UV0e|lz+g3lfkC`r&aOZk1_s9L0G|-o|NsAg`}XbS%a?cW-o1YP`jsnJe*OA& z?%cTv6DEX)hMJj~X=`gYH8q)=n+pjE0Zn6KV&dfFBGt;$mZCV`OCH=H|9E zH~04P^7HZW_4c;2wN+D5VP|JoP*7MnckZ=|7w_J<0W|&2_3N9~t;Fnv#HPqEvSXdI{<4+tuTvlAn$IIJLTl?Vl?d_X31^W9N85%x+^r)$>PESWiL`3A& z(WAGnUiIu zaLR-Ua1b_z_Ta&)Wy?H0JZ!A2)~#AqQdp>>qEb>+bnfKI%jeFy zI5}}}a40J&tzNO>&b4c6mM>RVQ=2t?`qG69MTCW;BO`+X12r@>1Ox=E#HQQ_h9F~- zx4R2N2dk_Hki%Kv5m^k3z3U*%=%g{b0w~B{;_2(k{*qZ#jD_) z$q5S#6H=1W5|6S+%$O;W*md)UrNz!29~t%h_{z*yoP1-mr{>QOMtOaH>mwyW?Mnv5A$D z8ALNkl+5QtBQHjdMbLT!QOOB9-h>jHc``9-Vn zMJ+@mErm#03X!xFB55f^(o%?|r4UI=p_Qb6s3GVb2n_}U^L;*_DNWNqJukXl8jVI~ zb6N&A*z@_^w|^Zu!g^%Y<+3oU+kfrW9N+TMhlGM54QX)Qa?68; zxrf(HFk#$8V)lecX(vdYV{?5U1-A{d|MtGMBC_;g>}o-3Cp zo+^lI8bA`l-cZjI)MpwOBaKLsMAZQa>Cu)PX#_^GJi%BCM5lcIPU+zF_-N?U(9&@0 z59r-zy-H!9BlM1hNBcivW=*`7^4d1ku*pnzhQgX4WWw0t*j(rs<~cA^L0eVk-xRvt fuFqiYm literal 1345 zcmeAS@N?(olHy`uVBq!ia0vp^x**KK3=%mav;s&eBzpw;GB8xBF)%c=FfjZA3N^f7 zU???UV0e|lz+g3lfkC`r&aOZk1_ma>0G|-o|NsAg`}XbS%a?cW-o1YP`jsnJe*OA& z?%cTv6DEX)hMJj~X=`gYH8q)=n+pjE0ZrrK;gOb-Qc+e`R8SBV5n*FvV`OCH@^W&srcXb#Z=acoiJyzL*85zvX%!~{S4t91|FI+gV zXV1|C2X0)xeERtDvf^TGEiE%s)AHitlShs`xOMCH)vI@|U%z$rYC>$Rs;Vj{2ZsPZ z|MJC)FP%L*YuYpyCnp~-ukw}+g2 z+}!GFYS|eXNA~aEyJN@UefuW&_sh!48W|eiy>X+XwN*+|^5N~x=Xd-vj*Gh5cL|N8#@+LbG3Or5%G+qMs{ zUd@;?g_VV6_KX?ZH*em(ZCh_=r;D>Q7bj;^eSKG3TV+{USV)MBj0_74%TnEo{lIj< znB?v5!qCAg>jC6&7I;J!1JmGj5N34Jm|X!BWH0gbb!C6aEGovrc+EomI8e`ePZ!4! zkK@S+3k(xdlF|~7vPaCADUsN9^M<9x&K(~a_5AqC%vPLyW3#8`&ksgC;HFNTWlL?nCXC7P?xuYZC%=z<2nZnMV@|}{EcP;ShmQY;<4HX?FuPIrE zg`A$6nUax~m8^$W9Tk~6B{byfm8+&ETRB#XUAPu_{pw|N0}~@NLs8Wwx6a)0xO*rl z@W82C$F7~5HzAAN-Bdl@aKY=?n7emuIaYrA^6A@0)=PE&)-eV(wuG>=v9`CgwYs~w zRk|NPA{4Y%Lr{GFgc(!jOqw-IY@(k>XNLG~hOrWag$8mn7yEpj%=BvgcyqV(DCY@~pS7(8A5T-G@yGywo(A1!eJ diff --git a/radio/src/bitmaps/800x480/default_theme/mask_theme_view9.png b/radio/src/bitmaps/800x480/default_theme/mask_theme_view9.png index 2459f192396667a07205f27f9057ff268f2f6be4..dd94c197f9e0e4293499584db7179bbbed9fdc1c 100644 GIT binary patch delta 555 zcmV+`0@VG#2Dt=~8Gi-<0024~;+g;e010qNS#tmY5S#!25S#%f%{nvy0004VQb$4n zuFf3k00004XF*Lt006O%3;baP0005bNklHDwOt3A+w>&hs$^(*kIOxWC` z%<5y?_x)PO!}jfVYyEDU*r4GON>LO&wZlP_mdhpmr9pgJKLI5Z%VUGqGr3-`pW5g1 zIhly1Bd%7fn!Ozkhgv7qJ0d)rY;X^RTB=n7sBU*kJ%5&-`JiEKm&>K~rh@D$?e}|o zp!HG#nCE%2G_X&w34_*$0if1{lhtIodOL_QRjqHW@yw z8V(wkryd0w9minc{ju_ZJG}e9(pg|ToY4P`O>_3^e&V2s1iq%&q_m zvX^-Jy0X7y78PS*yk;SO9H@!U)5S5wy>9Dwq-83<)*oash3Tv zcVX{ImsQ8ylHYQdJiN91L!!@}9fpC1cQbf2vwW`xEMA$^lBs&(0^dS|hQmBNE?kjl zW#%rQclYdHvFHD~e{;w380JXu@G+c?y1V7KW_$3r9d)n1rD?5|{JTXYMA%U9fkW}< zK%>>);~##$X6Lu_Kx35FPB+~(>m5JtKG0BQWqp8o^GmA(48fP#FYHQV;@Qy4XpnH@ z@Uy@1|1I}?pIUuu{SE7#>*q3>Sj+5{n6&ngTU7RhS)S&3a<@+^+SPxH>$-C3=jzM) z^V3@|7r)BecSCKo87esRf{8CF|&FJk`Cx~5;(>-4MC+Sj@j3Uw*Umlu>M8%yuKc6VMx%&R?d<{G(c z+>foBuc>|f=x=|mlBW2uBihef{1U&uQ=cI9BcRGc^XjRkwx7-4PWZQKc574hlB+fr z-h2&==N7EL9<058gZ>K^35C^y7lZ>-8<^)Ev0HKPqpO&(Tm$nui7AZMzAutG_KEyU zEUstoR@&Dk(BT72a}25_t`Q|Ei6yC4$wjF^iowXh$W+(BSl7rf#K_3Xz|hLXLfgQ= z%D}+g$)^KFLvDUbW?CgkgR!oGrLLh#h>@|Cv5A$bF+@Yn3E^)*4H|G8N-}d(i%Sx7 c3(zew0onu6Gwow&8&D5}r>mdKI;Vst0JsBIZU6uP diff --git a/radio/src/bitmaps/800x480/default_theme/mask_tools_apps.png b/radio/src/bitmaps/800x480/default_theme/mask_tools_apps.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce1e454d21e709118237f4b5c10e6c5efc0f733 GIT binary patch literal 1085 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 Hu0mjf_VlQ( literal 0 HcmV?d00001 diff --git a/radio/src/bitmaps/800x480/default_theme/mask_topright.png b/radio/src/bitmaps/800x480/default_theme/mask_topright.png new file mode 100644 index 0000000000000000000000000000000000000000..1bdc2965502228247d7047964ca148b077076968 GIT binary patch literal 2373 zcmbVO4Nw$y8(+YfB7xp9e0>?5w#}ULV{dnF?{oDa;1DQ}5bhnN-psw-J#OLd_PAZR z1GRu6mCN*%F`!eCtW2FVq`(@4ns}pLz`-VsQ^LDyvvA;b-a(jJZnT&Ys|RW zozB_$tO^g8Uy);BDvB8ci=-sO%Y77Z;N&D4_BkCck@6XlNxu|W%das6o`gunMkG}Z z2(K~c!s&vCgAGaoWpJE?bq1wDYrtu}&c-Z-Rk%un;UtD@Q58;UaEj2v(+2_qdRQBk zXIe2G4m=qVyCk_O4D))uN-wDtJcSrxFc>ggg{f31K%io|OQLpoICrVXF&Ug?FwVg_IhP~? zED^@K?SdqTcHuUz!=G;o0J3W~hhyB5i_;knAxar#K*n@JZiyBx)w=%CJhSBw&S^W_Xt@V$ttRI1?>#Mg-JNjpBL~CoF`D zQV|qMEFo|T$EToXf#q%GVW@ElB5-7^m;3*CP@`) z(5Y>x)kbSH298z{gl5LxBrv6NZD;IRV6P`|tCrNOP*%+Wdq&NmG-+i}(nf03B!R1F zlAE!A+{1(IMLYhsA9>TsO+jVxA}Ck+^q$D)N~Tv19-iz2ie}{gHX@8%SdK-eU-P%f zz?~_Wa_hBo!0DfqdkQ8BHpxqSxYR~{1;y6n%%-&y(oK>l_Oc&FsGH}8fi zGsaH43OO({F+`Sw$)jbeFxVe!Hu>#$V`v5rW}CbW&sFdcp3IyJxb}d#tA!X6f}#}J zrc{f)YPiw-m}=F$7o5>`x#GSZ`ZK+yfkz%)+`N5z^-_D_*ZseyDjl>l;XhdqMEy4x zjpX31RV^MSty!InMxHxavg^t&@1C5&Gar?%PbvI*7diJt>H$mbihVCX9l!sZ%=q~D zQ$^RFJ(T;%({UM_4Os~ z|L)*VtD~UI%*_7zi~oIrE$Hg%`az;X3-3R##IT36Km2@el+gCXlAVw4`}6~Ca}|7d zS;zdL>bRtVtNHo)p+xEY=YxY2&!n_R&wn=<48A|d#`BBrkD-fCR0RS7zX{O>VuzlO zhT!ZxeNxZd<_PGWq0#Q{?vz$tRAohH^0HLni67uIX3H9M+bAG`i-%Y@2^$F$Hlc+6!_(Y^A|5h z4sEWi!jIePhJ$C$KY4CM>bX>M=v1vWz4vnc+u->5=W@qeTjs?@L4aLoZQb6k_tHXKK+0ZAg z$68t{Q9Bg0%}NcOK27vJADws{s#Mg1Zkc!Wa%}W-SA1V2CB)cupN&W_ZQIsZe!;#e zqO!jJpG^asf(QIpo_+7*OQ%C2Jhdk2sjGEa3mWuCMq=i~)HLWXY>3!0WZT#~JXRwA O(aFxpF&$1@SN$8`S$e<# literal 0 HcmV?d00001 diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index e02fc389e..1fb3aabc9 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -151,7 +151,7 @@ void menuModelFlightModeOne(event_t event) #if defined(GVARS) case ITEM_MODEL_FLIGHT_MODE_GVARS_LABEL: - lcdDrawTextAlignedLeft(y, STR_GLOBAL_VARS); + lcdDrawTextAlignedLeft(y, TR_MENU_GLOBAL_VARS); break; default: diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index 42f020e03..d642c4880 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -60,8 +60,8 @@ void onModelSelectMenu(const char * result) else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { const char* ext = nullptr; const char* path = nullptr; - ext = STR_YAML_EXT; - path = STR_BACKUP_PATH; + ext = YAML_EXT; + path = BACKUP_PATH; if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else diff --git a/radio/src/gui/212x64/model_select.cpp b/radio/src/gui/212x64/model_select.cpp index 3dd3aa40b..1812cc8e9 100644 --- a/radio/src/gui/212x64/model_select.cpp +++ b/radio/src/gui/212x64/model_select.cpp @@ -51,8 +51,8 @@ void onModelSelectMenu(const char * result) else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { const char* ext = nullptr; const char* path = nullptr; - ext = STR_YAML_EXT; - path = STR_BACKUP_PATH; + ext = YAML_EXT; + path = BACKUP_PATH; if (sdListFiles(path, ext, MENU_LINE_LENGTH-1, nullptr)) POPUP_MENU_START(onModelSelectMenu); else diff --git a/radio/src/gui/colorlcd/CMakeLists.txt b/radio/src/gui/colorlcd/CMakeLists.txt index 366191717..a5eeea080 100644 --- a/radio/src/gui/colorlcd/CMakeLists.txt +++ b/radio/src/gui/colorlcd/CMakeLists.txt @@ -14,6 +14,7 @@ include_directories( ${RADIO_SRC_DIR}/gui/colorlcd/radio ${RADIO_SRC_DIR}/gui/colorlcd/module ${RADIO_SRC_DIR}/gui/colorlcd/mainview + ${RADIO_SRC_DIR}/gui/colorlcd/setup_menus ${RADIO_SRC_DIR}/gui/colorlcd/themes ${RADIO_SRC_DIR}/gui/colorlcd/controls ) @@ -33,6 +34,9 @@ file(GLOB LIBUI_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd file(GLOB MAINVIEW_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/mainview/*.cpp) +file(GLOB MENUS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd + ${RADIO_SRC_DIR}/gui/colorlcd/setup_menus/*.cpp) + file(GLOB CONTROLS_SRC RELATIVE ${RADIO_SRC_DIR}/gui/colorlcd ${RADIO_SRC_DIR}/gui/colorlcd/controls/*.cpp) @@ -43,6 +47,7 @@ set(GUI_SRC ${LAYOUTS_SRC} ${WIDGETS_SRC} ${MAINVIEW_SRC} + ${MENUS_SRC} ${CONTROLS_SRC} bitmaps.cpp colors.cpp @@ -54,7 +59,6 @@ set(GUI_SRC model/curveedit.cpp model/input_edit_adv.cpp model/input_edit.cpp - model/menu_model.cpp model/mixer_edit_adv.cpp model/mixer_edit.cpp model/model_curves.cpp @@ -85,7 +89,6 @@ set(GUI_SRC radio/hw_inputs.cpp radio/hw_intmodule.cpp radio/hw_serial.cpp - radio/menu_radio.cpp radio/preview_window.cpp radio/radio_calibration.cpp radio/radio_diaganas.cpp diff --git a/radio/src/gui/colorlcd/bitmaps.cpp b/radio/src/gui/colorlcd/bitmaps.cpp index effdfd3c7..22813cb5c 100644 --- a/radio/src/gui/colorlcd/bitmaps.cpp +++ b/radio/src/gui/colorlcd/bitmaps.cpp @@ -129,18 +129,6 @@ static const uint8_t mask_menu_model_select[] = { static const uint8_t mask_monitor[] = { #include "mask_monitor.lbm" }; -static const uint8_t mask_monitor_channels1[] = { -#include "mask_monitor_channels1.lbm" -}; -static const uint8_t mask_monitor_channels2[] = { -#include "mask_monitor_channels2.lbm" -}; -static const uint8_t mask_monitor_channels3[] = { -#include "mask_monitor_channels3.lbm" -}; -static const uint8_t mask_monitor_channels4[] = { -#include "mask_monitor_channels4.lbm" -}; static const uint8_t mask_monitor_logsw[] = { #include "mask_monitor_logsw.lbm" }; @@ -180,9 +168,6 @@ static const uint8_t mask_stats_analogs[] = { static const uint8_t mask_stats_debug[] = { #include "mask_stats_debug.lbm" }; -static const uint8_t mask_stats_throttle_graph[] = { -#include "mask_stats_throttle_graph.lbm" -}; static const uint8_t mask_stats_timers[] = { #include "mask_stats_timers.lbm" }; @@ -250,6 +235,9 @@ static const uint8_t mask_shutdown[] = { const uint8_t mask_topleft_bg[] = { #include "mask_topleft.lbm" }; +const uint8_t mask_topright_bg[] = { +#include "mask_topright.lbm" +}; const uint8_t mask_currentmenu_bg[] = { #include "mask_currentmenu_bg.lbm" @@ -367,6 +355,27 @@ static const uint8_t mask_trim_shadow[] = { #include "mask_trim_shadow.lbm" }; +static const uint8_t mask_tools_apps[] = { +#include "mask_tools_apps.lbm" +}; +static const uint8_t mask_tools_reset[] = { +#include "mask_tools_reset.lbm" +}; + +static const uint8_t mask_btn_close[] = { +#include "mask_btn_close.lbm" +}; +static const uint8_t mask_btn_next[] = { +#include "mask_btn_next.lbm" +}; +static const uint8_t mask_btn_prev[] = { +#include "mask_btn_prev.lbm" +}; + +static const uint8_t mask_top_logo[] = { +#include "mask_top_logo.lbm" +}; + struct _BuiltinIcon { const uint8_t* lz4_compressed_bitmap; }; @@ -419,15 +428,10 @@ static const _BuiltinIcon _builtinIcons[EDGETX_ICONS_COUNT] = { BI(ICON_THEME_VIEW10, mask_theme_view10), BI(ICON_THEME_ADD_VIEW, mask_theme_add_view), BI(ICON_STATS, mask_menu_stats), - BI(ICON_STATS_THROTTLE_GRAPH, mask_stats_throttle_graph), BI(ICON_STATS_TIMERS, mask_stats_timers), BI(ICON_STATS_ANALOGS, mask_stats_analogs), BI(ICON_STATS_DEBUG, mask_stats_debug), BI(ICON_MONITOR, mask_monitor), - BI(ICON_MONITOR_CHANNELS1, mask_monitor_channels1), - BI(ICON_MONITOR_CHANNELS2, mask_monitor_channels2), - BI(ICON_MONITOR_CHANNELS3, mask_monitor_channels3), - BI(ICON_MONITOR_CHANNELS4, mask_monitor_channels4), BI(ICON_MONITOR_LOGICAL_SWITCHES, mask_monitor_logsw), BI(ICON_CHAN_MONITOR_LOCKED, mask_chan_locked), @@ -440,6 +444,7 @@ static const _BuiltinIcon _builtinIcons[EDGETX_ICONS_COUNT] = { BI(ICON_SHUTDOWN, mask_shutdown), BI(ICON_TOPLEFT_BG, mask_topleft_bg), + BI(ICON_TOPRIGHT_BG, mask_topright_bg), BI(ICON_CURRENTMENU_BG, mask_currentmenu_bg), BI(ICON_CURRENTMENU_SHADOW, mask_currentmenu_shadow), BI(ICON_CURRENTMENU_DOT, mask_currentmenu_dot), @@ -488,6 +493,14 @@ static const _BuiltinIcon _builtinIcons[EDGETX_ICONS_COUNT] = { BI(ICON_TRIM, mask_trim), BI(ICON_TRIM_SHADOW, mask_trim_shadow), + + BI(ICON_TOOLS_APPS, mask_tools_apps), + BI(ICON_TOOLS_RESET, mask_tools_reset), + + BI(ICON_BTN_CLOSE, mask_btn_close), + BI(ICON_BTN_NEXT, mask_btn_next), + BI(ICON_BTN_PREV, mask_btn_prev), + BI(ICON_TOP_LOGO, mask_top_logo), }; static MaskBitmap* _builtinIconsDecompressed[EDGETX_ICONS_COUNT] = {0}; diff --git a/radio/src/gui/colorlcd/bitmaps.h b/radio/src/gui/colorlcd/bitmaps.h index 959596669..b4aad8642 100644 --- a/radio/src/gui/colorlcd/bitmaps.h +++ b/radio/src/gui/colorlcd/bitmaps.h @@ -65,15 +65,10 @@ enum EdgeTxIcon { ICON_THEME_VIEW10, ICON_THEME_ADD_VIEW, ICON_STATS, - ICON_STATS_THROTTLE_GRAPH, ICON_STATS_TIMERS, ICON_STATS_ANALOGS, ICON_STATS_DEBUG, ICON_MONITOR, - ICON_MONITOR_CHANNELS1, - ICON_MONITOR_CHANNELS2, - ICON_MONITOR_CHANNELS3, - ICON_MONITOR_CHANNELS4, ICON_MONITOR_LOGICAL_SWITCHES, ICON_CHAN_MONITOR_LOCKED, @@ -86,6 +81,7 @@ enum EdgeTxIcon { ICON_SHUTDOWN, ICON_TOPLEFT_BG, + ICON_TOPRIGHT_BG, ICON_CURRENTMENU_BG, ICON_CURRENTMENU_SHADOW, ICON_CURRENTMENU_DOT, @@ -136,6 +132,15 @@ enum EdgeTxIcon { ICON_TRIM, ICON_TRIM_SHADOW, + ICON_TOOLS_APPS, + ICON_TOOLS_RESET, + + ICON_BTN_CLOSE, + ICON_BTN_NEXT, + ICON_BTN_PREV, + + ICON_TOP_LOGO, + EDGETX_ICONS_COUNT }; diff --git a/radio/src/gui/colorlcd/colors.h b/radio/src/gui/colorlcd/colors.h index f0795b0ab..e5264c213 100644 --- a/radio/src/gui/colorlcd/colors.h +++ b/radio/src/gui/colorlcd/colors.h @@ -24,6 +24,7 @@ #include #include "libopenui_defines.h" +#include "edgetx_types.h" // TODO common code, not in target enum LcdColorIndex { diff --git a/radio/src/gui/colorlcd/libui/button.cpp b/radio/src/gui/colorlcd/libui/button.cpp index 6549c0d56..045d01fa4 100644 --- a/radio/src/gui/colorlcd/libui/button.cpp +++ b/radio/src/gui/colorlcd/libui/button.cpp @@ -86,7 +86,8 @@ bool ButtonBase::onLongPress() { if (longPressHandler) { check(longPressHandler()); - lv_obj_clear_state(lvobj, LV_STATE_PRESSED); + if (!deleted()) + lv_obj_clear_state(lvobj, LV_STATE_PRESSED); lv_indev_wait_release(lv_indev_get_act()); return false; } diff --git a/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp b/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp index 1e3179c3c..55d45d061 100644 --- a/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp +++ b/radio/src/gui/colorlcd/libui/etx_lv_theme.cpp @@ -41,6 +41,7 @@ LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::bg_opacity_20, LV_STYLE_BG_OPA, LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::bg_opacity_50, LV_STYLE_BG_OPA, LV_OPA_50); LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::bg_opacity_75, LV_STYLE_BG_OPA, 187); +LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::bg_opacity_90, LV_STYLE_BG_OPA, 230); LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::bg_opacity_cover, LV_STYLE_BG_OPA, LV_OPA_COVER); LV_STYLE_CONST_SINGLE_INIT(EdgeTxStyles::fg_opacity_transparent, LV_STYLE_OPA, @@ -215,6 +216,23 @@ const lv_style_const_prop_t disabled_props[] = { }; LV_STYLE_CONST_MULTI_INIT(EdgeTxStyles::disabled, disabled_props); +static lv_color_t darkgrey_filter_cb(const lv_color_filter_dsc_t* f, + lv_color_t color, lv_opa_t opa) +{ + LV_UNUSED(f); + return lv_color_mix(lv_palette_darken(LV_PALETTE_GREY, 2), color, opa); +} + +const lv_color_filter_dsc_t darkgrey_filter = {.filter_cb = darkgrey_filter_cb, + .user_data = 0}; + +const lv_style_const_prop_t qm_disabled_props[] = { + LV_STYLE_CONST_COLOR_FILTER_DSC(&darkgrey_filter), + LV_STYLE_CONST_COLOR_FILTER_OPA(LV_OPA_90), + LV_STYLE_PROP_INV, +}; +LV_STYLE_CONST_MULTI_INIT(EdgeTxStyles::qmdisabled, qm_disabled_props); + /********************** * Variable Styles **********************/ diff --git a/radio/src/gui/colorlcd/libui/etx_lv_theme.h b/radio/src/gui/colorlcd/libui/etx_lv_theme.h index 05b3b75f3..f772a2b5a 100644 --- a/radio/src/gui/colorlcd/libui/etx_lv_theme.h +++ b/radio/src/gui/colorlcd/libui/etx_lv_theme.h @@ -49,7 +49,7 @@ #if LANDSCAPE #if LCD_W == 320 - #define LAYOUT_SCALE(x) (((x) * 4 + 3) / 5) + #define LAYOUT_SCALE(x) (((x) * 8 + 5) / 10) #elif LCD_W == 800 #define LAYOUT_SCALE(x) (((x) * 3 + 1) / 2) #endif @@ -243,12 +243,14 @@ class EdgeTxStyles static const lv_style_t bg_opacity_20; static const lv_style_t bg_opacity_50; static const lv_style_t bg_opacity_75; + static const lv_style_t bg_opacity_90; static const lv_style_t bg_opacity_cover; static const lv_style_t fg_opacity_transparent; static const lv_style_t fg_opacity_cover; static const lv_style_t rounded; static const lv_style_t circle; static const lv_style_t disabled; + static const lv_style_t qmdisabled; static const lv_style_t pressed; static const lv_style_t scrollbar; static const lv_style_t border; diff --git a/radio/src/gui/colorlcd/libui/form.h b/radio/src/gui/colorlcd/libui/form.h index ff855756c..d7dc3498c 100644 --- a/radio/src/gui/colorlcd/libui/form.h +++ b/radio/src/gui/colorlcd/libui/form.h @@ -18,7 +18,6 @@ #pragma once -#include "etx_lv_theme.h" #include "window.h" class FlexGridLayout diff --git a/radio/src/gui/colorlcd/libui/layer.cpp b/radio/src/gui/colorlcd/libui/layer.cpp index 7402b7c91..3c3b06625 100644 --- a/radio/src/gui/colorlcd/libui/layer.cpp +++ b/radio/src/gui/colorlcd/libui/layer.cpp @@ -58,6 +58,7 @@ void Layer::pop(Window* w) return; } } + return; } if (!stack.empty()) { @@ -83,3 +84,13 @@ Window* Layer::getFirstOpaque() return nullptr; } + +Window* Layer::walk(std::function check) +{ + for (auto layer = stack.crbegin(); layer != stack.crend(); layer++) { + if (layer->window && check(layer->window)) + return layer->window; + } + + return nullptr; +} diff --git a/radio/src/gui/colorlcd/libui/layer.h b/radio/src/gui/colorlcd/libui/layer.h index b468528da..d9b342fab 100644 --- a/radio/src/gui/colorlcd/libui/layer.h +++ b/radio/src/gui/colorlcd/libui/layer.h @@ -36,4 +36,5 @@ class Layer static Window* back(); static Window* getFirstOpaque(); + static Window* walk(std::function check); }; diff --git a/radio/src/gui/colorlcd/libui/libopenui_defines.h b/radio/src/gui/colorlcd/libui/libopenui_defines.h index 9d38fddb1..320761303 100644 --- a/radio/src/gui/colorlcd/libui/libopenui_defines.h +++ b/radio/src/gui/colorlcd/libui/libopenui_defines.h @@ -19,8 +19,6 @@ #pragma once #include "debug.h" -#include "hal.h" -#include "edgetx_types.h" #include "colors.h" #include "keys.h" diff --git a/radio/src/gui/colorlcd/libui/list_line_button.h b/radio/src/gui/colorlcd/libui/list_line_button.h index 75de76059..6e4847789 100644 --- a/radio/src/gui/colorlcd/libui/list_line_button.h +++ b/radio/src/gui/colorlcd/libui/list_line_button.h @@ -23,7 +23,7 @@ #include "button.h" #include "edgetx_types.h" -#include "tabsgroup.h" +#include "pagegroup.h" class ListLineButton : public ButtonBase { @@ -113,10 +113,10 @@ class InputMixGroupBase : public Window std::list lines; }; -class InputMixPageBase : public PageTab +class InputMixPageBase : public PageGroupItem { public: - InputMixPageBase(const char* title, EdgeTxIcon icon) : PageTab(title, icon) {} + InputMixPageBase(PageDef& pageDef) : PageGroupItem(pageDef) {} protected: std::list lines; diff --git a/radio/src/gui/colorlcd/libui/mainwindow.cpp b/radio/src/gui/colorlcd/libui/mainwindow.cpp index e4103d6a3..32ff835a5 100644 --- a/radio/src/gui/colorlcd/libui/mainwindow.cpp +++ b/radio/src/gui/colorlcd/libui/mainwindow.cpp @@ -85,7 +85,10 @@ void MainWindow::shutdown() LayoutFactory::deleteCustomScreens(); // clear layer stack first - for (Window* w = Layer::back(); w; w = Layer::back()) w->deleteLater(); + for (Window* w = Layer::back(); w; w = Layer::back()) { + Layer::pop(w); + w->deleteLater(); + } children.clear(); clear(); diff --git a/radio/src/gui/colorlcd/libui/page.cpp b/radio/src/gui/colorlcd/libui/page.cpp index c5e51894e..9fa2535dd 100644 --- a/radio/src/gui/colorlcd/libui/page.cpp +++ b/radio/src/gui/colorlcd/libui/page.cpp @@ -25,6 +25,8 @@ #include "etx_lv_theme.h" #include "view_main.h" #include "keyboard_base.h" +#include "quick_menu.h" +#include "pagegroup.h" PageHeader::PageHeader(Window* parent, EdgeTxIcon icon) : Window(parent, {0, 0, LCD_W, EdgeTxStyles::MENU_HEADER_HEIGHT}) @@ -75,6 +77,14 @@ Page::Page(EdgeTxIcon icon, PaddingSize padding, bool pauseRefresh) : lv_obj_enable_style_refresh(false); header = new PageHeader(this, icon); + + new HeaderBackIcon(header); + +#if defined(HARDWARE_TOUCH) + addCustomButton(0, 0, [=]() { openMenu(); }); + addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); }); +#endif + body = new Window(this, {0, EdgeTxStyles::MENU_HEADER_HEIGHT, LCD_W, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT}); body->setWindowFlag(NO_FOCUS); @@ -88,10 +98,6 @@ Page::Page(EdgeTxIcon icon, PaddingSize padding, bool pauseRefresh) : Layer::push(this); body->padAll(padding); - -#if defined(HARDWARE_TOUCH) - addBackButton(); -#endif } void Page::deleteLater(bool detach, bool trash) @@ -102,7 +108,36 @@ void Page::deleteLater(bool detach, bool trash) Window::deleteLater(detach, trash); } -void Page::onCancel() { deleteLater(); } +void Page::openMenu() +{ + PageGroup* p = nullptr; + QuickMenu::SubMenu subMenu = QuickMenu::NONE; + Window* w = Layer::walk([=](Window *w) mutable -> bool { + return w->isPageGroup(); + }); + if (w) { + p = (PageGroup*)w; + subMenu = p->getCurrentTab()->subMenu(); + } + quickMenu = QuickMenu::openQuickMenu([=]() { quickMenu = nullptr; }, + [=](bool close) { + onCancel(); + if (p) { + while (!Layer::back()->isPageGroup()) { + Layer::back()->deleteLater(); + } + if (close) + Layer::back()->onCancel(); + } + }, p, subMenu); +} + +void Page::onCancel() +{ + if (quickMenu) quickMenu->closeMenu(); + quickMenu = nullptr; + deleteLater(); +} void Page::onClicked() { Keyboard::hide(false); } @@ -118,7 +153,64 @@ void Page::enableRefresh() lv_obj_refresh_style(lvobj, LV_PART_ANY, LV_STYLE_PROP_ANY); } +NavWindow* Page::navWindow() +{ + auto p = Layer::back(); + if (p->isNavWindow()) return (NavWindow*)p; + return nullptr; +} + #if defined(HARDWARE_KEYS) +void Page::onPressSYS() +{ + if (!quickMenu) openMenu(); +} + +void Page::onLongPressSYS() +{ + auto p = navWindow(); + if (p) { + onCancel(); + p->onLongPressSYS(); + } +} + +void Page::onPressMDL() +{ + auto p = navWindow(); + if (p) { + onCancel(); + p->onPressMDL(); + } +} + +void Page::onLongPressMDL() +{ + auto p = navWindow(); + if (p) { + onCancel(); + p->onLongPressMDL(); + } +} + +void Page::onPressTELE() +{ + auto p = navWindow(); + if (p) { + onCancel(); + p->onPressTELE(); + } +} + +void Page::onLongPressTELE() +{ + auto p = navWindow(); + if (p) { + onCancel(); + p->onLongPressTELE(); + } +} + void Page::onLongPressRTN() { onCancel(); } #endif diff --git a/radio/src/gui/colorlcd/libui/page.h b/radio/src/gui/colorlcd/libui/page.h index a938942c2..424fb51a5 100644 --- a/radio/src/gui/colorlcd/libui/page.h +++ b/radio/src/gui/colorlcd/libui/page.h @@ -21,11 +21,9 @@ #pragma once -#include "bitmaps.h" -#include "button.h" #include "static.h" -class Page; +class QuickMenu; class PageHeader : public Window { @@ -60,14 +58,25 @@ class Page : public NavWindow void enableRefresh(); + void openMenu(); + protected: PageHeader* header = nullptr; Window* body = nullptr; + QuickMenu* quickMenu = nullptr; void checkEvents() override; bool bubbleEvents() override { return false; } + NavWindow* navWindow(); + #if defined(HARDWARE_KEYS) + void onPressSYS() override; + void onLongPressSYS() override; + void onPressMDL() override; + void onLongPressMDL() override; + void onPressTELE() override; + void onLongPressTELE() override; void onLongPressRTN() override; #endif }; diff --git a/radio/src/gui/colorlcd/libui/tabsgroup.cpp b/radio/src/gui/colorlcd/libui/tabsgroup.cpp deleted file mode 100644 index c2233641d..000000000 --- a/radio/src/gui/colorlcd/libui/tabsgroup.cpp +++ /dev/null @@ -1,370 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "tabsgroup.h" - -#include "theme_manager.h" -#include "etx_lv_theme.h" -#include "view_main.h" -#include "topbar_impl.h" -#include "keyboard_base.h" - -#if defined(DEBUG) -static uint32_t dsms, dems, end_ms, start_ms; -static bool timepg = false; - -static void on_draw_begin(lv_event_t* e) -{ - if (timepg) { - dsms = lv_tick_get(); - } -} -static void on_draw_end(lv_event_t* e) -{ - timepg = false; - dems = lv_tick_get(); - TRACE("tab time: build %ld layout %ld draw %ld total %ld", - end_ms - start_ms, dsms - end_ms, dems - dsms, dems - start_ms); -} -#endif - -class SelectedTabIcon : public StaticIcon -{ - public: - SelectedTabIcon(Window* parent) : - StaticIcon(parent, 0, 0, ICON_CURRENTMENU_SHADOW, COLOR_THEME_PRIMARY1_INDEX) - { - new StaticIcon(this, 0, 0, ICON_CURRENTMENU_BG, COLOR_THEME_FOCUS_INDEX); - new StaticIcon(this, SEL_DOT_X, SEL_DOT_Y, ICON_CURRENTMENU_DOT, COLOR_THEME_PRIMARY2_INDEX); - } - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "SelectedTabIcon"; } -#endif - - static LAYOUT_VAL_SCALED(SEL_DOT_X, 10) - static LAYOUT_VAL_SCALED(SEL_DOT_Y, 39) -}; - -class TabsGroupButton : public ButtonBase -{ - public: - TabsGroupButton(Window* parent, const rect_t& rect, PageTab* page, int idx) : - ButtonBase(parent, rect, nullptr, window_create), pageTab(page), index(idx) - { - lastIcon = pageTab->getIcon(); - icon = new StaticIcon(this, 2, ICON_Y, lastIcon, COLOR_THEME_PRIMARY2_INDEX); - - show(isVisible()); - } - - ~TabsGroupButton() - { - delete pageTab; - } - -#if defined(DEBUG_WINDOWS) - std::string getName() const override - { - return "TabsGroupButton(" + std::to_string(lastIcon) + ")"; - } -#endif - - bool isVisible() const { return pageTab->isVisible(); } - - PageTab* page() const { return pageTab; } - int getIndex() const { return index; } - void setIndex(int idx) - { - index = idx; - pageTab->update(index); - } - - static LAYOUT_VAL_SCALED(ICON_Y, 7) - - protected: - PageTab* pageTab; - EdgeTxIcon lastIcon; - StaticIcon* icon = nullptr; - int index; - - void checkEvents() override - { - show(isVisible()); - if (lastIcon != pageTab->getIcon()) { - lastIcon = pageTab->getIcon(); - icon->setIcon(lastIcon); - } - ButtonBase::checkEvents(); - } -}; - -class TabsGroupHeader : public Window -{ - public: - TabsGroupHeader(TabsGroup* menu, EdgeTxIcon icon) : - Window(menu, {0, 0, LCD_W, TabsGroup::MENU_BODY_TOP}), - menu(menu) - { - setWindowFlag(NO_FOCUS | OPAQUE); - - etx_solid_bg(lvobj, COLOR_THEME_SECONDARY1_INDEX); - - new HeaderIcon(this, icon); - - auto sep = lv_obj_create(lvobj); - etx_solid_bg(sep); - lv_obj_set_pos(sep, 0, EdgeTxStyles::MENU_HEADER_HEIGHT); - lv_obj_set_size(sep, LCD_W, TabsGroup::MENU_TITLE_TOP - EdgeTxStyles::MENU_HEADER_HEIGHT); - - titleLabel = lv_label_create(lvobj); - etx_txt_color(titleLabel, COLOR_THEME_PRIMARY2_INDEX); - lv_obj_set_style_pad_left(titleLabel, PAD_MEDIUM, LV_PART_MAIN); - lv_obj_set_style_pad_top(titleLabel, 1, LV_PART_MAIN); - lv_obj_set_pos(titleLabel, 0, TabsGroup::MENU_TITLE_TOP); - lv_obj_set_size(titleLabel, LCD_W, TabsGroup::MENU_TITLE_HEIGHT); - setTitle(""); - - carousel = new Window(this, - {MENU_HEADER_BUTTONS_LEFT, 0, - LCD_W - HDR_DATE_FULL_WIDTH - MENU_HEADER_BUTTONS_LEFT, EdgeTxStyles::MENU_HEADER_HEIGHT + 10}); - carousel->padAll(PAD_ZERO); - carousel->setWindowFlag(NO_FOCUS); - - selectedIcon = new SelectedTabIcon(carousel); - - new HeaderDateTime(this, LCD_W - DATE_XO, PAD_MEDIUM); - } - - void setTitle(const char* title) { lv_label_set_text(titleLabel, title); } - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "TabsGroupHeader"; } -#endif - - void setCurrentIndex(uint8_t index) - { - if (index < buttons.size()) { - buttons[currentIndex]->check(false); - currentIndex = index; - buttons[currentIndex]->check(true); - coord_t x = getX(currentIndex); - selectedIcon->setPos(x, 0); - coord_t sx = lv_obj_get_scroll_x(carousel->getLvObj()); - if (x + MENU_HEADER_BUTTON_WIDTH - sx > carousel->width()) { - lv_obj_scroll_to(carousel->getLvObj(), x + MENU_HEADER_BUTTON_WIDTH - carousel->width(), 0, LV_ANIM_OFF); - } else if (x < sx) { - lv_obj_scroll_to(carousel->getLvObj(), x, 0, LV_ANIM_OFF); - } - } - } - - void chgTab(int dir) - { - int idx = currentIndex; - do { - idx += dir; - if (idx < 0) idx = buttons.size() - 1; - if (idx >= (int)buttons.size()) idx = 0; - } while (!buttons[idx]->isVisible()); - menu->setCurrentTab(idx); - } - - void nextTab() { chgTab(1); } - void prevTab() { chgTab(-1); } - - void addTab(PageTab* page) - { - uint8_t idx = buttons.size(); - TabsGroupButton* btn = new TabsGroupButton( - carousel, {getX(idx), 0, MENU_HEADER_BUTTON_WIDTH + 3, TabsGroup::MENU_TITLE_TOP + 5}, page, idx); - btn->setPressHandler([=]() { - menu->setCurrentTab(btn->getIndex()); - return true; - }); - btn->show(btn->isVisible()); - buttons.emplace_back(btn); - } - - void removeTab(unsigned index) - { - auto btn = buttons[index]; - buttons.erase(buttons.begin() + index); - btn->deleteLater(); - updateLayout(); - } - - void updateLayout() - { - for (uint8_t i = 0; i < buttons.size(); i += 1) { - buttons[i]->setIndex(i); - buttons[i]->setPos(getX(i), 0); - } - } - - PageTab* pageTab(uint8_t idx) const { return buttons[idx]->page(); } - bool isCurrent(uint8_t idx) const { return currentIndex == idx; } - uint8_t tabCount() const { return buttons.size(); } - - static LAYOUT_VAL_SCALED(DATE_XO, 48) - static LAYOUT_VAL_SCALED(MENU_HEADER_BUTTON_WIDTH, 33) - static LAYOUT_VAL_SCALED(HDR_DATE_FULL_WIDTH, 51) - - protected: - uint8_t currentIndex = 0; - TabsGroup* menu; - lv_obj_t* titleLabel = nullptr; - SelectedTabIcon* selectedIcon = nullptr; - Window* carousel = nullptr; - std::vector buttons; - - coord_t getX(uint8_t idx) - { - coord_t x = 0; - for (uint8_t i = 0; i < idx; i += 1) - if (buttons[i]->isVisible()) - x += MENU_HEADER_BUTTON_WIDTH; - return x; - } - - void checkEvents() override - { - updateLayout(); - Window::checkEvents(); - } -}; - -TabsGroup::TabsGroup(EdgeTxIcon icon) : - NavWindow(MainWindow::instance(), {0, 0, LCD_W, LCD_H}) -{ - etx_solid_bg(lvobj); - - header = new TabsGroupHeader(this, icon); - - body = new Window(this, {0, MENU_BODY_TOP, LCD_W, MENU_BODY_HEIGHT}); - body->setWindowFlag(NO_FOCUS); - lv_obj_set_style_max_height(body->getLvObj(), MENU_BODY_HEIGHT, LV_PART_MAIN); - etx_scrollbar(body->getLvObj()); - - Layer::back()->hide(); - Layer::push(this); - -#if defined(DEBUG) - lv_obj_add_event_cb(lvobj, on_draw_begin, LV_EVENT_COVER_CHECK, nullptr); - lv_obj_add_event_cb(lvobj, on_draw_end, LV_EVENT_DRAW_POST_END, nullptr); -#endif - -#if defined(HARDWARE_TOUCH) - addBackButton(); -#endif -} - -uint8_t TabsGroup::tabCount() const { return header->tabCount(); } - -void TabsGroup::setCurrentTab(unsigned index) -{ - if (deleted()) return; - - header->setCurrentIndex(index); - - PageTab* tab = header->pageTab(index); - - if (tab != currentTab && !deleted()) { - header->setTitle(tab->getTitle().c_str()); - - lv_obj_enable_style_refresh(false); - - body->clear(); - if (currentTab) - currentTab->cleanup(); - currentTab = tab; - -#if defined(DEBUG) - start_ms = lv_tick_get(); - timepg = true; -#endif - - static lv_style_prop_t remStyles[] = { - LV_STYLE_FLEX_FLOW, LV_STYLE_LAYOUT, LV_STYLE_PAD_ROW, - LV_STYLE_PAD_COLUMN, LV_STYLE_PAD_LEFT, LV_STYLE_PAD_RIGHT, - LV_STYLE_PAD_TOP, LV_STYLE_PAD_BOTTOM}; - for (uint8_t i = 0; i < DIM(remStyles); i += 1) - lv_obj_remove_local_style_prop(body->getLvObj(), remStyles[i], - LV_PART_MAIN); - - body->padAll(tab->getPadding()); - - tab->build(body); - - lv_obj_enable_style_refresh(true); - lv_obj_refresh_style(body->getLvObj(), LV_PART_ANY, LV_STYLE_PROP_ANY); - -#if defined(DEBUG) - end_ms = lv_tick_get(); -#endif - } -} - -void TabsGroup::deleteLater(bool detach, bool trash) -{ - if (_deleted) return; - - Layer::pop(this); - Layer::back()->show(); - - Window::deleteLater(detach, trash); -} - -void TabsGroup::addTab(PageTab* page) -{ - header->addTab(page); - if (!currentTab) { - setCurrentTab(0); - } -} - -void TabsGroup::removeTab(unsigned index) -{ - if (header->isCurrent(index)) - setCurrentTab(max(0, index - 1)); - header->removeTab(index); -} - -void TabsGroup::checkEvents() -{ - Window::checkEvents(); - if (currentTab) { - currentTab->checkEvents(); - } - ViewMain::instance()->runBackground(); -} - -#if defined(HARDWARE_KEYS) -void TabsGroup::onPressPGUP() { header->prevTab(); } -void TabsGroup::onPressPGDN() { header->nextTab(); } -void TabsGroup::onLongPressPGUP() { header->prevTab(); } -void TabsGroup::onLongPressPGDN() { header->nextTab(); } -void TabsGroup::onLongPressRTN() { onCancel(); } -#endif - -void TabsGroup::onClicked() { Keyboard::hide(false); } - -void TabsGroup::onCancel() { deleteLater(); } diff --git a/radio/src/gui/colorlcd/libui/tabsgroup.h b/radio/src/gui/colorlcd/libui/tabsgroup.h deleted file mode 100644 index d3108ad96..000000000 --- a/radio/src/gui/colorlcd/libui/tabsgroup.h +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "bitmaps.h" -#include "button.h" - -class TabsGroup; -class TabsGroupHeader; - -class PageTab -{ - public: - PageTab(PaddingSize padding = PAD_SMALL) : padding(padding) {} - - PageTab(std::string title, EdgeTxIcon icon, - PaddingSize padding = PAD_SMALL) : - title(std::move(title)), icon(icon), padding(padding) - { - } - - virtual ~PageTab() = default; - - virtual bool isVisible() const { return true; } - - virtual void build(Window* window) = 0; - - virtual void checkEvents() {} - - void setTitle(std::string value) { title = std::move(value); } - std::string getTitle() const { return title; } - - void setIcon(EdgeTxIcon icon) { this->icon = icon; } - EdgeTxIcon getIcon() const { return icon; } - - PaddingSize getPadding() const { return padding; } - - virtual void update(uint8_t index) {} - virtual void cleanup() {} - - protected: - std::string title; - EdgeTxIcon icon; - PaddingSize padding; -}; - -class TabsGroup : public NavWindow -{ - public: - explicit TabsGroup(EdgeTxIcon icon); - - void deleteLater(bool detach = true, bool trash = true) override; - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "TabsGroup"; } -#endif - - uint8_t tabCount() const; - - void addTab(PageTab* page); - - void removeTab(unsigned index); - - void setCurrentTab(unsigned index); - - void checkEvents() override; - - void onClicked() override; - void onCancel() override; - - static LAYOUT_VAL_SCALED(MENU_TITLE_TOP, 48) - static constexpr coord_t MENU_TITLE_HEIGHT = EdgeTxStyles::STD_FONT_HEIGHT; - static constexpr coord_t MENU_BODY_TOP = MENU_TITLE_TOP + MENU_TITLE_HEIGHT; - static constexpr coord_t MENU_BODY_HEIGHT = LCD_H - MENU_BODY_TOP; - - protected: - TabsGroupHeader* header = nullptr; - Window* body = nullptr; - PageTab* currentTab = nullptr; - -#if defined(HARDWARE_KEYS) - void onPressPGUP() override; - void onPressPGDN() override; - void onLongPressPGUP() override; - void onLongPressPGDN() override; - void onLongPressRTN() override; -#endif -}; diff --git a/radio/src/gui/colorlcd/libui/window.cpp b/radio/src/gui/colorlcd/libui/window.cpp index 21d27280e..0a448f2fa 100644 --- a/radio/src/gui/colorlcd/libui/window.cpp +++ b/radio/src/gui/colorlcd/libui/window.cpp @@ -378,9 +378,10 @@ void Window::setFlexLayout(lv_flex_flow_t flow, lv_coord_t padding, coord_t width, coord_t height) { lv_obj_set_flex_flow(lvobj, flow); - if (_LV_FLEX_COLUMN & flow) { + if ((_LV_FLEX_COLUMN & flow) || (_LV_FLEX_WRAP & flow)) { lv_obj_set_style_pad_row(lvobj, padding, LV_PART_MAIN); - } else { + } + if (!(_LV_FLEX_COLUMN & flow) || (_LV_FLEX_WRAP & flow)) { lv_obj_set_style_pad_column(lvobj, padding, LV_PART_MAIN); } lv_obj_set_width(lvobj, width); @@ -427,6 +428,17 @@ void Window::addBackButton() }, window_create); } + +void Window::addCustomButton(coord_t x, coord_t y, std::function action) +{ + new ButtonBase( + this, {x, y, EdgeTxStyles::MENU_HEADER_HEIGHT, EdgeTxStyles::MENU_HEADER_HEIGHT}, + [=]() -> uint8_t { + action(); + return 0; + }, + window_create); +} #endif void NavWindow::onEvent(event_t event) @@ -490,6 +502,26 @@ NavWindow::NavWindow(Window *parent, const rect_t &rect, setWindowFlag(OPAQUE); } +class SetupTextButton : public TextButton +{ + public: + SetupTextButton(Window* parent, const rect_t& rect, PageButtonDef& entry) : + TextButton(parent, rect, entry.title) + { + setPressHandler([=] { + entry.createPage(); + return 0; + }); + setCheckHandler([=]() { + if (entry.isActive) check(entry.isActive()); + if (entry.enabled) show(entry.enabled()); + }); + setWrap(); + } + + protected: +}; + SetupButtonGroup::SetupButtonGroup(Window* parent, const rect_t& rect, const char* title, int cols, PaddingSize padding, PageDefs pages, coord_t btnHeight) : Window(parent, rect) @@ -523,19 +555,7 @@ SetupButtonGroup::SetupButtonGroup(Window* parent, const rect_t& rect, const cha x = xo + (n % cols) * xw; y = yo + (n / cols) * (btnHeight + PAD_MEDIUM); - // TODO: sort out all caps title strings VS quick menu strings - std::string title(entry.title); - for (std::string::iterator it = title.begin(); it != title.end(); ++it) { - if (*it == '\n') - *it = ' '; - } - - auto btn = new TextButton(this, rect_t{x, y, buttonWidth, btnHeight}, title, [&, entry]() { - entry.createPage(); - return 0; - }); - btn->setWrap(); - if (entry.isActive) btn->setCheckHandler([=]() { btn->check(entry.isActive()); }); + new SetupTextButton(this, {x, y, buttonWidth, btnHeight}, entry); n += 1; remaining -= 1; } diff --git a/radio/src/gui/colorlcd/libui/window.h b/radio/src/gui/colorlcd/libui/window.h index b497d310d..9e20c6c0a 100644 --- a/radio/src/gui/colorlcd/libui/window.h +++ b/radio/src/gui/colorlcd/libui/window.h @@ -166,12 +166,15 @@ class Window #if defined(HARDWARE_TOUCH) void addBackButton(); + void addCustomButton(coord_t x, coord_t y, std::function action); #endif inline lv_obj_t *getLvObj() { return lvobj; } virtual bool isTopBar() { return false; } virtual bool isWidgetsContainer() { return false; } + virtual bool isNavWindow() { return false; } + virtual bool isPageGroup() { return false; } virtual bool isBubblePopup() { return false; } @@ -229,7 +232,8 @@ class NavWindow : public Window NavWindow(Window *parent, const rect_t &rect, LvglCreate objConstruct = nullptr); - protected: + bool isNavWindow() override { return true; } + #if defined(HARDWARE_KEYS) virtual void onPressSYS() {} virtual void onLongPressSYS() {} @@ -243,6 +247,8 @@ class NavWindow : public Window virtual void onLongPressPGDN() {} virtual void onLongPressRTN() {} #endif + + protected: virtual bool bubbleEvents() { return true; } void onEvent(event_t event) override; }; @@ -251,9 +257,13 @@ struct PageButtonDef { const char* title; std::function createPage; std::function isActive; + std::function enabled; - PageButtonDef(const char* title, std::function createPage, std::function isActive = nullptr) : - title(title), createPage(std::move(createPage)), isActive(std::move(isActive)) + PageButtonDef(const char* title, + std::function createPage, + std::function isActive = nullptr, + std::function enabled = nullptr) : + title(title), createPage(std::move(createPage)), isActive(std::move(isActive)), enabled(std::move(enabled)) {} }; diff --git a/radio/src/gui/colorlcd/mainview/menu_screen.cpp b/radio/src/gui/colorlcd/mainview/menu_screen.cpp deleted file mode 100644 index c2315dbc7..000000000 --- a/radio/src/gui/colorlcd/mainview/menu_screen.cpp +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "menu_screen.h" - -#include "menu_model.h" -#include "menu_radio.h" -#include "model_select.h" -#include "edgetx.h" -#include "screen_setup.h" -#include "storage/storage.h" -#include "view_channels.h" -#include "view_main.h" - -ScreenMenu::ScreenMenu(int8_t tabIdx) : TabsGroup(ICON_THEME) -{ - addTab(new ScreenUserInterfacePage(this)); - - for (int index = 0; index < MAX_CUSTOM_SCREENS; index++) { - if (customScreens[index]) { - addTab(new ScreenSetupPage(this, index)); - } else { - addTab(new ScreenAddPage(this, tabCount())); - break; - } - } - - // set the active tab to the currently shown screen on the MainView - auto viewMain = ViewMain::instance(); - auto tab = viewMain->getCurrentMainView() + 1; - - if (tabIdx >= 0) { - tab = tabIdx; - } - - setCurrentTab(tab); - - setCloseHandler([] { - ViewMain::instance()->updateTopbarVisibility(); - storageDirty(EE_MODEL); - }); -} - -#if defined(HARDWARE_KEYS) -void ScreenMenu::onPressSYS() -{ - onCancel(); - new RadioMenu(); -} -void ScreenMenu::onLongPressSYS() -{ - onCancel(); - // Radio setup - (new RadioMenu())->setCurrentTab(2); -} -void ScreenMenu::onPressMDL() -{ - onCancel(); - new ModelMenu(); -} -void ScreenMenu::onLongPressMDL() -{ - onCancel(); - new ModelLabelsWindow(); -} -void ScreenMenu::onLongPressTELE() -{ - onCancel(); - new ChannelsViewMenu(); -} -#endif diff --git a/radio/src/gui/colorlcd/mainview/menu_screen.h b/radio/src/gui/colorlcd/mainview/menu_screen.h deleted file mode 100644 index 5eee67008..000000000 --- a/radio/src/gui/colorlcd/mainview/menu_screen.h +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "tabsgroup.h" - -class ScreenMenu : public TabsGroup -{ - public: - ScreenMenu(int8_t tabIdx = -1); - - protected: -#if defined(HARDWARE_KEYS) - void onPressSYS() override; - void onLongPressSYS() override; - void onPressMDL() override; - void onLongPressMDL() override; - void onLongPressTELE() override; -#endif -}; diff --git a/radio/src/gui/colorlcd/mainview/screen_setup.cpp b/radio/src/gui/colorlcd/mainview/screen_setup.cpp index 7a6e47cd9..b23c2eaf9 100644 --- a/radio/src/gui/colorlcd/mainview/screen_setup.cpp +++ b/radio/src/gui/colorlcd/mainview/screen_setup.cpp @@ -35,6 +35,8 @@ #define BUTTON_HEIGHT 30 #define BUTTON_WIDTH 75 +extern PageDef screensMenuItems[]; + class LayoutChoice : public Button { public: @@ -100,76 +102,6 @@ class LayoutChoice : public Button } }; -ScreenAddPage::ScreenAddPage(ScreenMenu* menu, uint8_t pageIndex) : - PageTab(STR_ADD_MAIN_VIEW, ICON_THEME_ADD_VIEW), - menu(menu), - pageIndex(pageIndex) -{ -} - -void ScreenAddPage::update(uint8_t index) -{ - pageIndex = index; -} - -void ScreenAddPage::build(Window* window) -{ - new TextButton(window, - rect_t{LCD_W / 2 - ADD_TXT_W / 2, window->height() / 2 - EdgeTxStyles::UI_ELEMENT_HEIGHT, ADD_TXT_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, - STR_ADD_MAIN_VIEW, [this]() -> uint8_t { - // First page is "User interface", subtract it - auto newIdx = pageIndex - 1; - TRACE("ScreenAddPage: add screen: newIdx = %d", newIdx); - - auto& screen = customScreens[newIdx]; - auto& screenData = g_model.screenData[newIdx]; - - TRACE("ScreenAddPage: add screen: screen = %p", screen); - - const LayoutFactory* factory = defaultLayout; - if (factory) { - TRACE("ScreenAddPage: add screen: factory = %p", factory); - - auto viewMain = ViewMain::instance(); - screen = factory->create(viewMain, &screenData.layoutData); - viewMain->addMainView(screen, newIdx); - - strncpy(screenData.LayoutId, factory->getId(), - sizeof(screenData.LayoutId)); - TRACE("ScreenAddPage: add screen: LayoutId = %s", - screenData.LayoutId); - - auto tab = new ScreenSetupPage(menu, newIdx); - std::string title(STR_MAIN_VIEW_X); - if (newIdx >= 9) { - title[title.size() - 2] = '1'; - title.back() = (newIdx - 9) + '0'; - } else { - title[title.size() - 2] = newIdx + '1'; - title.back() = ' '; - } - tab->setTitle(title); - tab->setIcon((EdgeTxIcon)(ICON_THEME_VIEW1 + newIdx)); - - // remove current tab first - menu->setCurrentTab(0); - menu->removeTab(pageIndex); - - // add the new one - menu->addTab(tab); - - if (menu->tabCount() <= MAX_CUSTOM_SCREENS) { - menu->addTab(new ScreenAddPage(menu, menu->tabCount())); - } - - menu->setCurrentTab(pageIndex); - } else { - TRACE("Add main view: factory is NULL"); - } - return 0; - }); -} - #if LANDSCAPE static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(2), LV_GRID_FR(1), LV_GRID_FR(2), LV_GRID_TEMPLATE_LAST}; @@ -180,27 +112,15 @@ static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; -ScreenSetupPage::ScreenSetupPage(ScreenMenu* menu, unsigned index) : - PageTab(), - menu(menu) +ScreenSetupPage::ScreenSetupPage(unsigned index, PageDef& pageDef) : + PageGroupItem(pageDef) { - update(index + 1); + update(index + FIRST_SCREEN_OFFSET); } void ScreenSetupPage::update(uint8_t index) { - customScreenIndex = index - 1; - - std::string title(STR_MAIN_VIEW_X); - if (customScreenIndex >= 9) { - title[title.size() - 2] = '1'; - title.back() = (customScreenIndex - 9) + '0'; - } else { - title[title.size() - 2] = customScreenIndex + '1'; - title.back() = ' '; - } - setTitle(title); - setIcon((EdgeTxIcon)(ICON_THEME_VIEW1 + customScreenIndex)); + customScreenIndex = index - FIRST_SCREEN_OFFSET; } void ScreenSetupPage::build(Window* window) @@ -213,8 +133,7 @@ void ScreenSetupPage::build(Window* window) auto line = window->newLine(grid); auto label = new StaticText(line, rect_t{}, STR_LAYOUT); - lv_obj_set_style_grid_cell_y_align(label->getLvObj(), LV_GRID_ALIGN_CENTER, - 0); + lv_obj_set_style_grid_cell_y_align(label->getLvObj(), LV_GRID_ALIGN_CENTER, 0); // Dynamic options window... LayoutChoice::LayoutFactoryGetter getFactory = @@ -267,7 +186,7 @@ void ScreenSetupPage::build(Window* window) #endif btn = new TextButton(line, rect_t{}, STR_SETUP_WIDGETS, [=]() -> uint8_t { - menu->deleteLater(); + window->getParent()->deleteLater(); new SetupWidgetsPage(customScreenIndex); return 0; }); @@ -293,9 +212,10 @@ void ScreenSetupPage::build(Window* window) // ... and reload LayoutFactory::loadCustomScreens(); - // Let's try to stay on the same page - menu->removeTab(customScreenIndex + 1); - menu->setCurrentTab(customScreenIndex); + // Rest to first screen so user knows something has happened + PageGroup* menu = (PageGroup*)window->getParent(); + menu->setCurrentTab(FIRST_SCREEN_OFFSET); + return 0; }); auto obj = btn->getLvObj(); diff --git a/radio/src/gui/colorlcd/mainview/screen_setup.h b/radio/src/gui/colorlcd/mainview/screen_setup.h index 7a6b7f3a3..e1510f2f6 100644 --- a/radio/src/gui/colorlcd/mainview/screen_setup.h +++ b/radio/src/gui/colorlcd/mainview/screen_setup.h @@ -22,36 +22,23 @@ #pragma once #include "datastructs.h" -#include "menu_screen.h" #include "screen_user_interface.h" +#include "radio_theme.h" -class ScreenAddPage : public PageTab +class ScreenSetupPage : public PageGroupItem { public: - ScreenAddPage(ScreenMenu* menu, uint8_t pageIndex); - - void build(Window* window) override; - - void update(uint8_t index) override; - - protected: - ScreenMenu* menu; - uint8_t pageIndex; - - static LAYOUT_VAL_SCALED(ADD_TXT_W, 200) -}; - -class ScreenSetupPage : public PageTab -{ - public: - ScreenSetupPage(ScreenMenu* menu, unsigned customScreenIndex); + ScreenSetupPage(unsigned customScreenIndex, PageDef& pageDef); void build(Window* form) override; void update(uint8_t index) override; + bool isVisible() const override { return customScreens[customScreenIndex] != nullptr; } + + static constexpr int FIRST_SCREEN_OFFSET = 2; + protected: - ScreenMenu* menu; unsigned customScreenIndex; Window* layoutOptions = nullptr; diff --git a/radio/src/gui/colorlcd/mainview/screen_user_interface.cpp b/radio/src/gui/colorlcd/mainview/screen_user_interface.cpp index fb26a57b2..eb3d4b96a 100644 --- a/radio/src/gui/colorlcd/mainview/screen_user_interface.cpp +++ b/radio/src/gui/colorlcd/mainview/screen_user_interface.cpp @@ -22,7 +22,6 @@ #include "screen_user_interface.h" #include "file_preview.h" -#include "menu_screen.h" #include "theme_manager.h" #include "topbar_impl.h" #include "view_main.h" @@ -35,10 +34,6 @@ static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; -// theme details grid -static const lv_coord_t* theme_col_dsc = line_col_dsc; -static const lv_coord_t* theme_row_dsc = line_row_dsc; - #else // form grid @@ -47,93 +42,10 @@ static const lv_coord_t line_col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2), static const lv_coord_t line_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; -// theme details grid -static const lv_coord_t theme_col_dsc[] = {LV_GRID_FR(1), - LV_GRID_TEMPLATE_LAST}; -static const lv_coord_t theme_row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, - LV_GRID_TEMPLATE_LAST}; #endif -constexpr coord_t MAX_PREVIEW_WIDTH = (100 * LV_DPI_DEF) / 57; -constexpr coord_t MAX_PREVIEW_HEIGHT = LV_DPI_DEF; - -class ThemeView : public Window -{ - public: - ThemeView(Window* parent) : Window(parent, rect_t{}) - { - padAll(PAD_ZERO); - setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO); - - auto tp = ThemePersistance::instance(); - auto theme = tp->getCurrentTheme(); - - if (theme) { - FlexGridLayout theme_grid(theme_col_dsc, theme_row_dsc, PAD_TINY); - auto line = newLine(theme_grid); - - details = new Window(line, rect_t{0, 0, 0, LV_SIZE_CONTENT}); - // vertical flow layout - lv_obj_set_flex_flow(details->getLvObj(), LV_FLEX_FLOW_COLUMN); - lv_obj_set_style_pad_row(details->getLvObj(), PAD_TINY, LV_PART_MAIN); - - // make the object fill the grid cell - lv_obj_set_style_grid_cell_x_align(details->getLvObj(), - LV_GRID_ALIGN_STRETCH, 0); - lv_obj_set_style_grid_cell_y_align(details->getLvObj(), - LV_GRID_ALIGN_START, 0); - - new StaticText(details, rect_t{}, STR_AUTHOR, COLOR_THEME_PRIMARY1_INDEX, FONT(BOLD)); - author = new StaticText(details, rect_t{}, ""); - - // labels default to LV_SIZE_CONTENT, - // which could overflow the width avail - lv_obj_set_width(author->getLvObj(), lv_pct(100)); - - new StaticText(details, rect_t{}, STR_DESCRIPTION, COLOR_THEME_PRIMARY1_INDEX, FONT(BOLD)); - description = - new StaticText(details, rect_t{}, ""); - - lv_obj_set_width(description->getLvObj(), lv_pct(100)); - - preview = new FilePreview(line, {0, 0, PREVIEW_W, LV_SIZE_CONTENT}); - - // align within cell - lv_obj_set_style_grid_cell_x_align(preview->getLvObj(), - LV_GRID_ALIGN_START, 0); - - update(); - } - } - - void update() - { - auto tp = ThemePersistance::instance(); - auto theme = tp->getCurrentTheme(); - if (theme) { - author->setText(theme->getAuthor()); - description->setText(theme->getInfo()); - - auto themeImage = theme->getThemeImageFileNames(); - if (themeImage.size() > 0) { - preview->setFile(themeImage[0].c_str()); - } else { - preview->setFile(""); - } - } - } - - static LAYOUT_SIZE(PREVIEW_W, (LCD_W - PAD_MEDIUM * 3) / 2, LCD_W - PAD_LARGE - PAD_SMALL) - - protected: - Window* details = nullptr; - FilePreview* preview = nullptr; - StaticText* author = nullptr; - StaticText* description = nullptr; -}; - -ScreenUserInterfacePage::ScreenUserInterfacePage(ScreenMenu* menu) : - PageTab(STR_USER_INTERFACE, ICON_THEME_SETUP, PAD_TINY), menu(menu) +ScreenUserInterfacePage::ScreenUserInterfacePage(PageDef& pageDef) : + PageGroupItem(pageDef, PAD_TINY) { } @@ -150,7 +62,7 @@ void ScreenUserInterfacePage::build(Window* window) new TextButton(line, rect_t{}, STR_SETUP_WIDGETS, [=]() -> uint8_t { - menu->deleteLater(); + window->getParent()->deleteLater(); new SetupTopBarWidgetsPage(); return 0; }); @@ -206,26 +118,4 @@ void ScreenUserInterfacePage::build(Window* window) if (g_model.topbarWidgetWidth[i] == 0) widths[i]->hide(); } - - // Theme choice - line = window->newLine(grid); - new StaticText(line, rect_t{}, STR_THEME); - - auto tp = ThemePersistance::instance(); - tp->refresh(); - std::vector names = tp->getNames(); - - new Choice( - line, rect_t{}, names, 0, names.size() - 1, - [=]() { return tp->getThemeIndex(); }, - [=](int value) { - tp->setThemeIndex(value); - tp->applyTheme(value); - tp->setDefaultTheme(value); - themeView->update(); - }); - - grid.setColSpan(2); - line = window->newLine(grid); - themeView = new ThemeView(line); } diff --git a/radio/src/gui/colorlcd/mainview/screen_user_interface.h b/radio/src/gui/colorlcd/mainview/screen_user_interface.h index d5723cde0..c26f6cb7d 100644 --- a/radio/src/gui/colorlcd/mainview/screen_user_interface.h +++ b/radio/src/gui/colorlcd/mainview/screen_user_interface.h @@ -21,24 +21,22 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" #include "widgets_container.h" -class ScreenMenu; class ThemeView; class Choice; -class ScreenUserInterfacePage : public PageTab +class ScreenUserInterfacePage : public PageGroupItem { public: - ScreenUserInterfacePage(ScreenMenu* menu); + ScreenUserInterfacePage(PageDef& pageDef); void build(Window* window) override; static LAYOUT_VAL_SCALED(WWBTN_W, 60) protected: - ScreenMenu* menu; Choice* widths[MAX_TOPBAR_ZONES]; ThemeView* themeView = nullptr; }; diff --git a/radio/src/gui/colorlcd/mainview/select_fab_carousel.cpp b/radio/src/gui/colorlcd/mainview/select_fab_carousel.cpp deleted file mode 100644 index d8b8f9178..000000000 --- a/radio/src/gui/colorlcd/mainview/select_fab_carousel.cpp +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "select_fab_carousel.h" - -#include "bitmaps.h" -#include "button.h" -#include "static.h" - -static void etx_quick_button_constructor(const lv_obj_class_t* class_p, - lv_obj_t* obj) -{ - etx_obj_add_style(obj, styles->border_transparent, LV_PART_MAIN); - etx_obj_add_style(obj, styles->rounded, LV_PART_MAIN); - etx_txt_color(obj, COLOR_WHITE_INDEX, LV_PART_MAIN); - etx_obj_add_style(obj, styles->pad_zero, LV_PART_MAIN); - - etx_obj_add_style(obj, styles->border, LV_PART_MAIN | LV_STATE_FOCUSED); - etx_obj_add_style(obj, styles->border_color[COLOR_WHITE_INDEX], - LV_PART_MAIN | LV_STATE_FOCUSED); -} - -static const lv_obj_class_t etx_quick_button_class = { - .base_class = &lv_btn_class, - .constructor_cb = etx_quick_button_constructor, - .destructor_cb = nullptr, - .user_data = nullptr, - .event_cb = nullptr, - .width_def = SelectFabCarousel::FAB_BUTTON_WIDTH, - .height_def = SelectFabCarousel::FAB_BUTTON_HEIGHT, - .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, - .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, - .instance_size = sizeof(lv_btn_t), -}; - -static lv_obj_t* etx_quick_button_create(lv_obj_t* parent) -{ - return etx_create(&etx_quick_button_class, parent); -} - -static void etx_quick_icon_constructor(const lv_obj_class_t* class_p, - lv_obj_t* obj) -{ - etx_obj_add_style(obj, styles->border, LV_PART_MAIN); - etx_obj_add_style(obj, styles->border_color[COLOR_WHITE_INDEX], LV_PART_MAIN); - etx_obj_add_style(obj, styles->outline, LV_PART_MAIN); - lv_obj_set_style_outline_color(obj, lv_color_black(), LV_PART_MAIN); - etx_obj_add_style(obj, styles->circle, LV_PART_MAIN); - etx_solid_bg(obj, COLOR_BLACK_INDEX, LV_PART_MAIN); - etx_obj_add_style(obj, styles->pad_zero, LV_PART_MAIN); -} - -static const lv_obj_class_t etx_quick_icon_class = { - .base_class = &lv_obj_class, - .constructor_cb = etx_quick_icon_constructor, - .destructor_cb = nullptr, - .user_data = nullptr, - .event_cb = nullptr, - .width_def = 0, - .height_def = 0, - .editable = LV_OBJ_CLASS_EDITABLE_FALSE, - .group_def = LV_OBJ_CLASS_GROUP_DEF_FALSE, - .instance_size = sizeof(lv_obj_t), -}; - -static lv_obj_t* etx_quick_icon_create(lv_obj_t* parent) -{ - return etx_create(&etx_quick_icon_class, parent); -} - -class SelectFabButton : public ButtonBase -{ - public: - SelectFabButton(Window* parent, EdgeTxIcon icon, const char* title, - std::function pressHandler) : - ButtonBase(parent, {}, pressHandler, etx_quick_button_create) - { - padAll(PAD_ZERO); - - auto newMask = getBuiltinIcon(icon); - coord_t fabIconSize = newMask->width + PAD_MEDIUM * 2; - - auto iconLayout = - new Window(this, - {(SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - fabIconSize) / 2, - (SelectFabCarousel::FAB_BUTTON_INNER_WIDTH - fabIconSize) / 2 - PAD_TINY, - fabIconSize, fabIconSize}, - etx_quick_icon_create); - iconLayout->setWindowFlag(NO_FOCUS); - - (new StaticIcon(iconLayout, 0, 0, icon, COLOR_WHITE_INDEX)) - ->center(fabIconSize - PAD_BORDER * 2, fabIconSize - PAD_BORDER * 2); - - new StaticText(this, {-PAD_BORDER, SelectFabCarousel::FAB_BUTTON_HEIGHT - SelectFabCarousel::FAB_TXT_YO, - SelectFabCarousel::FAB_BUTTON_WIDTH, 0}, - title, COLOR_WHITE_INDEX, CENTERED); - } - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "SelectFabButton"; } -#endif - - void onEvent(event_t event) override - { -#if defined(HARDWARE_KEYS) - switch (event) { - case EVT_KEY_BREAK(KEY_EXIT): - parent->deleteLater(); - return; - } -#endif - ButtonBase::onEvent(event); - } -}; - -SelectFabCarousel::SelectFabCarousel(Window* parent) : Window(parent, rect_t{}) -{ - padAll(PAD_ZERO); - setFlexLayout(LV_FLEX_FLOW_ROW_WRAP, PAD_ZERO); -} - -void SelectFabCarousel::addButton(EdgeTxIcon icon, const char* title, - std::function pressHandler) -{ - new SelectFabButton(this, icon, title, pressHandler); -} diff --git a/radio/src/gui/colorlcd/mainview/select_fab_carousel.h b/radio/src/gui/colorlcd/mainview/select_fab_carousel.h deleted file mode 100644 index 497744129..000000000 --- a/radio/src/gui/colorlcd/mainview/select_fab_carousel.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "form.h" -#include "bitmaps.h" - -class SelectFabCarousel : public Window -{ - public: - explicit SelectFabCarousel(Window* parent); - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "SelectFabCarousel"; } -#endif - - // Add a new button to the carousel - void addButton(EdgeTxIcon icon, const char* title, - std::function pressHandler); - - static LAYOUT_VAL_SCALED_EVEN(FAB_BUTTON_WIDTH, 76) - static LAYOUT_VAL_SCALED(FAB_BUTTON_HEIGHT, 114) - - static LAYOUT_VAL_SCALED(FAB_TXT_YO, 48) - static constexpr coord_t FAB_BUTTON_INNER_WIDTH = FAB_BUTTON_WIDTH - PAD_BORDER * 2; -}; diff --git a/radio/src/gui/colorlcd/mainview/topbar.cpp b/radio/src/gui/colorlcd/mainview/topbar.cpp index d83e87aaa..c5629574e 100644 --- a/radio/src/gui/colorlcd/mainview/topbar.cpp +++ b/radio/src/gui/colorlcd/mainview/topbar.cpp @@ -22,13 +22,13 @@ #include "topbar.h" #include "layer.h" -#include "menu_screen.h" #include "edgetx.h" #include "storage/storage.h" #include "etx_lv_theme.h" #include "topbar_impl.h" #include "view_main.h" #include "widgets_setup.h" +#include "pagegroup.h" TopBar* TopbarFactory::create(Window* parent) { return new TopBar(parent); } @@ -72,7 +72,7 @@ void SetupTopBarWidgetsPage::deleteLater(bool detach, bool trash) Window::deleteLater(detach, trash); // restore screen setting tab on top - new ScreenMenu(0); + (PageGroup::ScreenMenu())->setCurrentTab(1); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/colorlcd/mainview/topbar_impl.cpp b/radio/src/gui/colorlcd/mainview/topbar_impl.cpp index 3ff0a55f6..52378f87b 100644 --- a/radio/src/gui/colorlcd/mainview/topbar_impl.cpp +++ b/radio/src/gui/colorlcd/mainview/topbar_impl.cpp @@ -26,26 +26,12 @@ constexpr uint32_t TOPBAR_REFRESH = 1000 / 10; // 10 Hz -class TopBarEdgeTx : public HeaderIcon -{ - public: - TopBarEdgeTx(Window* parent) : HeaderIcon(parent, ICON_EDGETX) - { - lv_obj_add_flag(lvobj, LV_OBJ_FLAG_CLICKABLE); - } - - void onClicked() override - { - ViewMain::instance()->openMenu(); - } -}; - TopBar::TopBar(Window * parent) : TopBarBase(parent, {0, 0, LCD_W, EdgeTxStyles::MENU_HEADER_HEIGHT}, &g_model.topbarData) { etx_solid_bg(lvobj, COLOR_THEME_SECONDARY1_INDEX); - headerIcon = new TopBarEdgeTx(parent); + headerIcon = new HeaderIcon(parent, ICON_EDGETX, [=]() { ViewMain::instance()->openMenu(); }); } unsigned int TopBar::getZonesCount() const diff --git a/radio/src/gui/colorlcd/mainview/view_about.cpp b/radio/src/gui/colorlcd/mainview/view_about.cpp deleted file mode 100644 index 12403cc16..000000000 --- a/radio/src/gui/colorlcd/mainview/view_about.cpp +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "view_about.h" - -#include "edgetx.h" -#include "stamp.h" - -#if defined(VERSION_TAG) -const std::string about_str = - "EdgeTX" - " (" VERSION_TAG - ")\n" - "\"" CODENAME "\""; -#else -const std::string about_str = - "EdgeTX" - " (" VERSION_PREFIX VERSION VERSION_SUFFIX ")"; -#endif -const std::string copyright_str = "Copyright (C) " BUILD_YEAR " EdgeTX"; -const std::string edgetx_url = "https://edgetx.org"; - -AboutUs::AboutUs() : - BaseDialog(STR_ABOUT_US, true, VIEW_W, LV_SIZE_CONTENT) -{ - new StaticText(form, {0, 0, LV_PCT(100), LV_SIZE_CONTENT}, - about_str + "\n" + copyright_str, - COLOR_THEME_SECONDARY1_INDEX, CENTERED); - - auto qrBox = new Window(form, {0, 0, LV_PCT(100), QR_SZ}); - auto qr = new QRCode(qrBox, 0, 0, QR_SZ, edgetx_url); - lv_obj_center(qr->getLvObj()); -} diff --git a/radio/src/gui/colorlcd/mainview/view_about.h b/radio/src/gui/colorlcd/mainview/view_about.h deleted file mode 100644 index 63d812cc6..000000000 --- a/radio/src/gui/colorlcd/mainview/view_about.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "dialog.h" - -class AboutUs : public BaseDialog -{ - public: - AboutUs(); - - static LAYOUT_VAL_SCALED(QR_SZ, 150) - static LAYOUT_VAL_SCALED(VIEW_W, 220) -}; diff --git a/radio/src/gui/colorlcd/mainview/view_channels.cpp b/radio/src/gui/colorlcd/mainview/view_channels.cpp index 352e6ee31..a6df91fff 100644 --- a/radio/src/gui/colorlcd/mainview/view_channels.cpp +++ b/radio/src/gui/colorlcd/mainview/view_channels.cpp @@ -22,12 +22,9 @@ #include "view_channels.h" #include "channel_bar.h" -#include "menu_model.h" -#include "menu_radio.h" -#include "menu_screen.h" +#include "libopenui.h" #include "model_select.h" #include "edgetx.h" -#include "view_logical_switches.h" //----------------------------------------------------------------------------- @@ -69,14 +66,14 @@ class ChannelsViewFooter : public Window //----------------------------------------------------------------------------- -class ChannelsViewPage : public PageTab +class ChannelsViewPage : public PageGroupItem { public: explicit ChannelsViewPage(uint8_t pageIndex = 0) : - PageTab(STR_MONITOR_CHANNELS[pageIndex], - (EdgeTxIcon)(ICON_MONITOR_CHANNELS1 + pageIndex)), + PageGroupItem(STR_MONITOR_CHANNELS[pageIndex]), pageIndex(pageIndex) { + icon = ICON_MONITOR; } protected: @@ -111,47 +108,13 @@ class ChannelsViewPage : public PageTab //----------------------------------------------------------------------------- -ChannelsViewMenu::ChannelsViewMenu(ModelMenu* parent) : - TabsGroup(ICON_MONITOR), parentMenu(parent) +ChannelsViewMenu::ChannelsViewMenu() : + TabsGroup(ICON_MONITOR, STR_MAIN_MENU_CHANNEL_MONITOR) { + QuickMenu::setCurrentPage(QuickMenu::TOOLS_CHAN_MON); + addTab(new ChannelsViewPage(0)); addTab(new ChannelsViewPage(1)); addTab(new ChannelsViewPage(2)); addTab(new ChannelsViewPage(3)); - addTab(new LogicalSwitchesViewPage()); } - -#if defined(HARDWARE_KEYS) -void ChannelsViewMenu::onPressSYS() -{ - onCancel(); - if (parentMenu) parentMenu->onCancel(); - new RadioMenu(); -} -void ChannelsViewMenu::onLongPressSYS() -{ - onCancel(); - if (parentMenu) parentMenu->onCancel(); - // Radio setup - (new RadioMenu())->setCurrentTab(2); -} -void ChannelsViewMenu::onPressMDL() -{ - onCancel(); - if (!parentMenu) { - new ModelMenu(); - } -} -void ChannelsViewMenu::onLongPressMDL() -{ - onCancel(); - if (parentMenu) parentMenu->onCancel(); - new ModelLabelsWindow(); -} -void ChannelsViewMenu::onPressTELE() -{ - onCancel(); - if (parentMenu) parentMenu->onCancel(); - new ScreenMenu(); -} -#endif diff --git a/radio/src/gui/colorlcd/mainview/view_channels.h b/radio/src/gui/colorlcd/mainview/view_channels.h index a79c3c6ac..d34d81c6a 100644 --- a/radio/src/gui/colorlcd/mainview/view_channels.h +++ b/radio/src/gui/colorlcd/mainview/view_channels.h @@ -21,22 +21,11 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" class ModelMenu; class ChannelsViewMenu: public TabsGroup { public: - ChannelsViewMenu(ModelMenu* parent = nullptr); - - protected: - ModelMenu* parentMenu = nullptr; - -#if defined(HARDWARE_KEYS) - void onPressSYS() override; - void onLongPressSYS() override; - void onPressMDL() override; - void onLongPressMDL() override; - void onPressTELE() override; -#endif + ChannelsViewMenu(); }; diff --git a/radio/src/gui/colorlcd/mainview/view_logical_switches.cpp b/radio/src/gui/colorlcd/mainview/view_logical_switches.cpp index a977509ca..0147181f3 100644 --- a/radio/src/gui/colorlcd/mainview/view_logical_switches.cpp +++ b/radio/src/gui/colorlcd/mainview/view_logical_switches.cpp @@ -234,8 +234,8 @@ class LogicalSwitchDisplayButton : public TextButton bool value = false; }; -LogicalSwitchesViewPage::LogicalSwitchesViewPage() : - PageTab(STR_MONITOR_SWITCHES, ICON_MONITOR_LOGICAL_SWITCHES) +LogicalSwitchesViewPage::LogicalSwitchesViewPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/mainview/view_logical_switches.h b/radio/src/gui/colorlcd/mainview/view_logical_switches.h index e94559abd..4a6c69b10 100644 --- a/radio/src/gui/colorlcd/mainview/view_logical_switches.h +++ b/radio/src/gui/colorlcd/mainview/view_logical_switches.h @@ -21,14 +21,14 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" class LogicalSwitchDisplayFooter; -class LogicalSwitchesViewPage : public PageTab +class LogicalSwitchesViewPage : public PageGroupItem { public: - LogicalSwitchesViewPage(); + LogicalSwitchesViewPage(PageDef& pageDef); static LAYOUT_ORIENTATION_SCALED(FOOTER_HEIGHT, 20, 40) static LAYOUT_ORIENTATION(BTN_MATRIX_COL, 8, 6) diff --git a/radio/src/gui/colorlcd/mainview/view_main.cpp b/radio/src/gui/colorlcd/mainview/view_main.cpp index 1993bbc42..ebf466924 100644 --- a/radio/src/gui/colorlcd/mainview/view_main.cpp +++ b/radio/src/gui/colorlcd/mainview/view_main.cpp @@ -21,14 +21,12 @@ #include "view_main.h" -#include "menu_model.h" -#include "menu_radio.h" -#include "menu_screen.h" #include "model_select.h" #include "edgetx.h" #include "topbar_impl.h" +#include "quick_menu.h" #include "view_channels.h" -#include "view_main_menu.h" +#include "screen_setup.h" static void tile_view_deleted_cb(lv_event_t* e) { @@ -247,46 +245,45 @@ void ViewMain::updateTopbarVisibility() #if defined(HARDWARE_KEYS) void ViewMain::onPressSYS() { - if (viewMainMenu) viewMainMenu->onCancel(); - new RadioMenu(); + if (!viewMainMenu) openMenu(); } void ViewMain::onLongPressSYS() { - if (viewMainMenu) viewMainMenu->onCancel(); + if (viewMainMenu) viewMainMenu->closeMenu(); // Radio setup - (new RadioMenu())->setCurrentTab(2); + PageGroup::RadioMenu(); } void ViewMain::onPressMDL() { - if (viewMainMenu) viewMainMenu->onCancel(); - new ModelMenu(); + if (viewMainMenu) viewMainMenu->closeMenu(); + PageGroup::ModelMenu(); } void ViewMain::onLongPressMDL() { - if (viewMainMenu) viewMainMenu->onCancel(); + if (viewMainMenu) viewMainMenu->closeMenu(); new ModelLabelsWindow(); } void ViewMain::onPressTELE() { - if (viewMainMenu) viewMainMenu->onCancel(); - new ScreenMenu(); + if (viewMainMenu) viewMainMenu->closeMenu(); + (PageGroup::ScreenMenu())->setCurrentTab(getCurrentMainView() + ScreenSetupPage::FIRST_SCREEN_OFFSET); } void ViewMain::onLongPressTELE() { - if (viewMainMenu) viewMainMenu->onCancel(); + if (viewMainMenu) viewMainMenu->closeMenu(); new ChannelsViewMenu(); } void ViewMain::onPressPGUP() { if (!widget_select) { - if (viewMainMenu) viewMainMenu->onCancel(); + if (viewMainMenu) viewMainMenu->closeMenu(); previousMainView(); } } void ViewMain::onPressPGDN() { if (!widget_select) { - if (viewMainMenu) viewMainMenu->onCancel(); + if (viewMainMenu) viewMainMenu->closeMenu(); nextMainView(); } } @@ -351,7 +348,7 @@ bool ViewMain::enableWidgetSelect(bool enable) void ViewMain::openMenu() { - viewMainMenu = new ViewMainMenu(this, [=]() { viewMainMenu = nullptr; }); + viewMainMenu = QuickMenu::openQuickMenu([=]() { viewMainMenu = nullptr; }); } void ViewMain::ws_timer(lv_timer_t* t) diff --git a/radio/src/gui/colorlcd/mainview/view_main.h b/radio/src/gui/colorlcd/mainview/view_main.h index 1cd88cc93..bef9b4a5d 100644 --- a/radio/src/gui/colorlcd/mainview/view_main.h +++ b/radio/src/gui/colorlcd/mainview/view_main.h @@ -26,7 +26,7 @@ class SetupWidgetsPage; class SetupTopBarWidgetsPage; -class ViewMainMenu; +class QuickMenu; class ViewMain : public NavWindow { @@ -95,7 +95,7 @@ class ViewMain : public NavWindow TopBar* topbar = nullptr; bool widget_select = false; lv_timer_t* widget_select_timer = nullptr; - ViewMainMenu* viewMainMenu = nullptr; + QuickMenu* viewMainMenu = nullptr; void deleteLater(bool detach = true, bool trash = true) override; diff --git a/radio/src/gui/colorlcd/mainview/view_main_menu.cpp b/radio/src/gui/colorlcd/mainview/view_main_menu.cpp deleted file mode 100644 index ff6e012f9..000000000 --- a/radio/src/gui/colorlcd/mainview/view_main_menu.cpp +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "view_main_menu.h" - -#include "menu_model.h" -#include "menu_radio.h" -#include "menu_screen.h" -#include "model_select.h" -#include "edgetx.h" -#include "select_fab_carousel.h" -#include "etx_lv_theme.h" -#include "view_about.h" -#include "view_channels.h" -#include "view_statistics.h" -#include "view_text.h" - -static void modal_dialog_constructor(const lv_obj_class_t* class_p, - lv_obj_t* obj) -{ - etx_obj_add_style(obj, styles->rounded, LV_PART_MAIN); - etx_obj_add_style(obj, styles->bg_opacity_75, LV_PART_MAIN); - etx_bg_color(obj, COLOR_BLACK_INDEX, LV_PART_MAIN); -} - -static const lv_obj_class_t etx_modal_dialog_class = { - .base_class = &window_base_class, - .constructor_cb = modal_dialog_constructor, - .destructor_cb = nullptr, - .user_data = nullptr, - .event_cb = nullptr, - .width_def = 0, - .height_def = 0, - .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, - .group_def = LV_OBJ_CLASS_EDITABLE_INHERIT, - .instance_size = sizeof(lv_obj_t)}; - -static lv_obj_t* etx_modal_dialog_create(lv_obj_t* parent) -{ - return etx_create(&etx_modal_dialog_class, parent); -} - -ViewMainMenu::ViewMainMenu(Window* parent, std::function closeHandler) : - Window(parent, {0, 0, LCD_W, LCD_H}), - closeHandler(std::move(closeHandler)) -{ - // Save focus - Layer::push(this); - - coord_t w = SelectFabCarousel::FAB_BUTTON_WIDTH * QM_COLS + PAD_SMALL * 2; - coord_t h = SelectFabCarousel::FAB_BUTTON_HEIGHT * QM_ROWS + PAD_SMALL * 2; - - bool hasNotes = modelHasNotes(); - -#if LANDSCAPE - if (hasNotes) - w += SelectFabCarousel::FAB_BUTTON_WIDTH; -#endif - - auto box = - new Window(this, {(LCD_W - w) / 2, (LCD_H - h) / 2, w, h}, - etx_modal_dialog_create); - box->padAll(PAD_SMALL); - - auto carousel = new SelectFabCarousel(box); - carousel->addButton(ICON_MODEL_SELECT, STR_MAIN_MENU_MANAGE_MODELS, - [=]() -> uint8_t { - deleteLater(); - new ModelLabelsWindow(); - return 0; - }); - - if (hasNotes) { - carousel->addButton(ICON_MODEL_NOTES, STR_MAIN_MENU_MODEL_NOTES, - [=]() -> uint8_t { - deleteLater(); - readModelNotes(true); - return 0; - }); - } - - carousel->addButton(ICON_MONITOR, STR_MAIN_MENU_CHANNEL_MONITOR, - [=]() -> uint8_t { - deleteLater(); - new ChannelsViewMenu(); - return 0; - }); - - carousel->addButton(ICON_MODEL, STR_MAIN_MENU_MODEL_SETTINGS, - [=]() -> uint8_t { - deleteLater(); - new ModelMenu(); - return 0; - }); - - carousel->addButton(ICON_RADIO, STR_MAIN_MENU_RADIO_SETTINGS, - [=]() -> uint8_t { - deleteLater(); - new RadioMenu(); - return 0; - }); - - carousel->addButton(ICON_THEME, STR_MAIN_MENU_SCREEN_SETTINGS, - [=]() -> uint8_t { - deleteLater(); - new ScreenMenu(); - return 0; - }); - - carousel->addButton( - ICON_MODEL_TELEMETRY, STR_MAIN_MENU_RESET_TELEMETRY, [=]() -> uint8_t { - deleteLater(); - Menu* resetMenu = new Menu(); - resetMenu->addLine(STR_RESET_FLIGHT, []() { flightReset(); }); - resetMenu->addLine(STR_RESET_TIMER1, []() { timerReset(0); }); - resetMenu->addLine(STR_RESET_TIMER2, []() { timerReset(1); }); - resetMenu->addLine(STR_RESET_TIMER3, []() { timerReset(2); }); - resetMenu->addLine(STR_RESET_TELEMETRY, []() { telemetryReset(); }); - return 0; - }); - - carousel->addButton(ICON_STATS, STR_MAIN_MENU_STATISTICS, [=]() -> uint8_t { - deleteLater(); - new StatisticsViewPageGroup(); - return 0; - }); - - carousel->addButton(ICON_EDGETX, STR_MAIN_MENU_ABOUT_EDGETX, - [=]() -> uint8_t { - deleteLater(); - new AboutUs(); - return 0; - }); -} - -void ViewMainMenu::deleteLater(bool detach, bool trash) -{ - if (closeHandler) closeHandler(); - Layer::pop(this); - Window::deleteLater(detach, trash); -} - -void ViewMainMenu::onClicked() { deleteLater(); } - -void ViewMainMenu::onCancel() { deleteLater(); } diff --git a/radio/src/gui/colorlcd/mainview/view_main_menu.h b/radio/src/gui/colorlcd/mainview/view_main_menu.h deleted file mode 100644 index e169f4746..000000000 --- a/radio/src/gui/colorlcd/mainview/view_main_menu.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "window.h" - -class ViewMainMenu : public Window -{ - public: - ViewMainMenu(Window* parent, std::function closeHandler); - - void onCancel() override; - void onClicked() override; - void deleteLater(bool detach = true, bool trash = true) override; - - static LAYOUT_ORIENTATION(QM_COLS, 4, 3) - static LAYOUT_ORIENTATION(QM_ROWS, 2, 3) - - protected: - std::function closeHandler = nullptr; -}; diff --git a/radio/src/gui/colorlcd/mainview/view_statistics.cpp b/radio/src/gui/colorlcd/mainview/view_statistics.cpp index e98cc782c..f396f796e 100644 --- a/radio/src/gui/colorlcd/mainview/view_statistics.cpp +++ b/radio/src/gui/colorlcd/mainview/view_statistics.cpp @@ -28,33 +28,6 @@ #include "mixer_scheduler.h" #include "lua/lua_states.h" -class StatisticsViewPage : public PageTab -{ - public: - StatisticsViewPage() : - PageTab(STR_STATISTICS, ICON_STATS_THROTTLE_GRAPH, PAD_ZERO) - { - } - - protected: - void build(Window* window) override; -}; - -class DebugViewPage : public PageTab -{ - public: - DebugViewPage() : PageTab(STR_DEBUG, ICON_STATS_DEBUG, PAD_ZERO) {} - - protected: - void build(Window* window) override; -}; - -class DebugViewMenu : public TabsGroup -{ - public: - DebugViewMenu(); -}; - static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST}; @@ -100,12 +73,6 @@ class DebugInfoNumber : public Window } }; -StatisticsViewPageGroup::StatisticsViewPageGroup() : TabsGroup(ICON_STATS) -{ - addTab(new StatisticsViewPage()); - addTab(new DebugViewPage()); -} - class ThrottleCurveWindow : public Window { public: diff --git a/radio/src/gui/colorlcd/mainview/view_statistics.h b/radio/src/gui/colorlcd/mainview/view_statistics.h index 87d7ed087..784a1bda9 100644 --- a/radio/src/gui/colorlcd/mainview/view_statistics.h +++ b/radio/src/gui/colorlcd/mainview/view_statistics.h @@ -21,10 +21,25 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class StatisticsViewPageGroup : public TabsGroup +class StatisticsViewPage : public PageGroupItem { public: - StatisticsViewPageGroup(); + StatisticsViewPage(PageDef& pageDef) : + PageGroupItem(pageDef, PAD_ZERO) + { + } + + protected: + void build(Window* window) override; +}; + +class DebugViewPage : public PageGroupItem +{ + public: + DebugViewPage(PageDef& pageDef) : PageGroupItem(pageDef, PAD_ZERO) {} + + protected: + void build(Window* window) override; }; diff --git a/radio/src/gui/colorlcd/mainview/widgets_setup.cpp b/radio/src/gui/colorlcd/mainview/widgets_setup.cpp index c75cfe03b..9c602c12c 100644 --- a/radio/src/gui/colorlcd/mainview/widgets_setup.cpp +++ b/radio/src/gui/colorlcd/mainview/widgets_setup.cpp @@ -23,12 +23,13 @@ #include "layer.h" #include "menu.h" -#include "menu_screen.h" #include "myeeprom.h" #include "storage/storage.h" #include "etx_lv_theme.h" #include "view_main.h" #include "widget_settings.h" +#include "pagegroup.h" +#include "screen_setup.h" SetupWidgetsPageSlot::SetupWidgetsPageSlot(Window* parent, const rect_t& rect, WidgetsContainer* container, @@ -151,7 +152,11 @@ void SetupWidgetsPage::onClicked() // block event forwarding (window is transparent) } -void SetupWidgetsPage::onCancel() { deleteLater(); } +void SetupWidgetsPage::onCancel() +{ + deleteLater(); + (PageGroup::ScreenMenu())->setCurrentTab(customScreenIdx + ScreenSetupPage::FIRST_SCREEN_OFFSET); +} void SetupWidgetsPage::deleteLater(bool detach, bool trash) { @@ -166,7 +171,6 @@ void SetupWidgetsPage::deleteLater(bool detach, bool trash) viewMain->showTopBarEdgeTxButton(); } Window::deleteLater(detach, trash); - new ScreenMenu(customScreenIdx + 1); storageDirty(EE_MODEL); } diff --git a/radio/src/gui/colorlcd/model/function_switches.cpp b/radio/src/gui/colorlcd/model/function_switches.cpp index b3909d50d..5ed3f019a 100644 --- a/radio/src/gui/colorlcd/model/function_switches.cpp +++ b/radio/src/gui/colorlcd/model/function_switches.cpp @@ -343,8 +343,8 @@ class SwitchGroup : public Window ModelFunctionSwitches::ModelFunctionSwitches() : Page(ICON_MODEL_SETUP) { - header->setTitle(STR_MENU_MODEL_SETUP); - header->setTitle2(STR_MENU_FSWITCH); + header->setTitle(STR_MAIN_MENU_MODEL_SETTINGS); + header->setTitle2(STR_FUNCTION_SWITCHES); body->padAll(PAD_TINY); body->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO); diff --git a/radio/src/gui/colorlcd/model/menu_model.cpp b/radio/src/gui/colorlcd/model/menu_model.cpp deleted file mode 100644 index 37af6d1ab..000000000 --- a/radio/src/gui/colorlcd/model/menu_model.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "menu_model.h" - -#include "menu_radio.h" -#include "menu_screen.h" -#include "model_curves.h" -#include "model_flightmodes.h" -#include "model_gvars.h" -#include "model_heli.h" -#include "model_inputs.h" -#include "model_logical_switches.h" -#include "model_mixer_scripts.h" -#include "model_mixes.h" -#include "model_outputs.h" -#include "model_select.h" -#include "model_setup.h" -#include "model_telemetry.h" -#include "edgetx.h" -#include "special_functions.h" -#include "translations.h" -#include "view_channels.h" - -ModelMenu::ModelMenu() : TabsGroup(ICON_MODEL) { build(); } - -void ModelMenu::build() -{ - addTab(new ModelSetupPage()); -#if defined(HELI) - addTab(new ModelHeliPage()); -#endif -#if defined(FLIGHT_MODES) - addTab(new ModelFlightModesPage()); -#endif - addTab(new ModelInputsPage()); - addTab(new ModelMixesPage()); - addTab(new ModelOutputsPage()); - addTab(new ModelCurvesPage()); -#if defined(GVARS) - addTab(new ModelGVarsPage()); -#endif - addTab(new ModelLogicalSwitchesPage()); - addTab(new SpecialFunctionsPage()); -#if defined(LUA_MODEL_SCRIPTS) - addTab(new ModelMixerScriptsPage()); -#endif - addTab(new ModelTelemetryPage()); - -#if defined(PCBPL18) || defined(PCBST16) - new TextButton( - this, - {LCD_W / 2 + 6, MENU_TITLE_TOP, LCD_W / 2 - 8, MENU_TITLE_HEIGHT}, - STR_OPEN_CHANNEL_MONITORS, [=]() { - new ChannelsViewMenu(this); - return 0; - }); -#endif -} - -#if defined(HARDWARE_KEYS) -void ModelMenu::onPressSYS() -{ - onCancel(); - new RadioMenu(); -} -void ModelMenu::onLongPressSYS() -{ - onCancel(); - // Radio setup - (new RadioMenu())->setCurrentTab(2); -} -void ModelMenu::onPressMDL() { new ChannelsViewMenu(this); } -void ModelMenu::onLongPressMDL() -{ - onCancel(); - new ModelLabelsWindow(); -} -void ModelMenu::onPressTELE() -{ - onCancel(); - new ScreenMenu(); -} -void ModelMenu::onLongPressTELE() { new ChannelsViewMenu(this); } -#endif diff --git a/radio/src/gui/colorlcd/model/menu_model.h b/radio/src/gui/colorlcd/model/menu_model.h deleted file mode 100644 index 827ebf3bc..000000000 --- a/radio/src/gui/colorlcd/model/menu_model.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "tabsgroup.h" - -class ModelMenu : public TabsGroup -{ - public: - ModelMenu(); - -#if defined(DEBUG_WINDOWS) - std::string getName() const override { return "ModelMenu"; } -#endif - - protected: - void build(); - -#if defined(HARDWARE_KEYS) - void onPressSYS() override; - void onLongPressSYS() override; - void onPressMDL() override; - void onLongPressMDL() override; - void onPressTELE() override; - void onLongPressTELE() override; -#endif -}; diff --git a/radio/src/gui/colorlcd/model/model_curves.cpp b/radio/src/gui/colorlcd/model/model_curves.cpp index 24993dd38..17f13b716 100644 --- a/radio/src/gui/colorlcd/model/model_curves.cpp +++ b/radio/src/gui/colorlcd/model/model_curves.cpp @@ -108,7 +108,7 @@ void initPoints(const CurveHeader &curve, int8_t *points) } } -ModelCurvesPage::ModelCurvesPage() : PageTab(STR_MENUCURVES, ICON_MODEL_CURVES) +ModelCurvesPage::ModelCurvesPage(PageDef& pageDef) : PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_curves.h b/radio/src/gui/colorlcd/model/model_curves.h index f379fcfea..3b4080f7d 100644 --- a/radio/src/gui/colorlcd/model/model_curves.h +++ b/radio/src/gui/colorlcd/model/model_curves.h @@ -22,12 +22,13 @@ #pragma once #include "edgetx.h" -#include "tabsgroup.h" +#include "pagegroup.h" -class ModelCurvesPage : public PageTab +class ModelCurvesPage : public PageGroupItem { public: - ModelCurvesPage(); + ModelCurvesPage(PageDef& pageDef); + static void pushEditCurve(int index, std::function refreshView, mixsrc_t source); bool isVisible() const override { return modelCurvesEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_flightmodes.cpp b/radio/src/gui/colorlcd/model/model_flightmodes.cpp index b921f0bf9..2325ef70b 100644 --- a/radio/src/gui/colorlcd/model/model_flightmodes.cpp +++ b/radio/src/gui/colorlcd/model/model_flightmodes.cpp @@ -462,8 +462,8 @@ const lv_obj_class_t FlightModeBtn::fm_trim_value_class = { .instance_size = sizeof(lv_label_t), }; -ModelFlightModesPage::ModelFlightModesPage() : - PageTab(STR_MENUFLIGHTMODES, ICON_MODEL_FLIGHT_MODES) +ModelFlightModesPage::ModelFlightModesPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_flightmodes.h b/radio/src/gui/colorlcd/model/model_flightmodes.h index 096e56f28..e0022ee8c 100644 --- a/radio/src/gui/colorlcd/model/model_flightmodes.h +++ b/radio/src/gui/colorlcd/model/model_flightmodes.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class ModelFlightModesPage : public PageTab +class ModelFlightModesPage : public PageGroupItem { public: - ModelFlightModesPage(); + ModelFlightModesPage(PageDef& pageDef); bool isVisible() const override { return modelFMEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_gvars.cpp b/radio/src/gui/colorlcd/model/model_gvars.cpp index c3045481e..9a84c0c15 100644 --- a/radio/src/gui/colorlcd/model/model_gvars.cpp +++ b/radio/src/gui/colorlcd/model/model_gvars.cpp @@ -507,8 +507,8 @@ class GVarEditWindow : public Page } }; -ModelGVarsPage::ModelGVarsPage() : - PageTab(STR_MENU_GLOBAL_VARS, ICON_MODEL_GVARS) +ModelGVarsPage::ModelGVarsPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -534,7 +534,7 @@ void ModelGVarsPage::build(Window* window) if (modelFMEnabled()) { window->padTop(PAD_OUTLINE); hdr = new GVarHeader(window->getParent()); - lv_obj_set_pos(hdr->getLvObj(), 0, TabsGroup::MENU_TITLE_TOP + TabsGroup::MENU_TITLE_HEIGHT); + lv_obj_set_pos(hdr->getLvObj(), 0, PageGroup::PAGE_TOP_BAR_H); yo = GVarHeader::HDR_H; } diff --git a/radio/src/gui/colorlcd/model/model_gvars.h b/radio/src/gui/colorlcd/model/model_gvars.h index 3a67f3aed..fb148c9da 100644 --- a/radio/src/gui/colorlcd/model/model_gvars.h +++ b/radio/src/gui/colorlcd/model/model_gvars.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class ModelGVarsPage : public PageTab +class ModelGVarsPage : public PageGroupItem { public: - ModelGVarsPage(); + ModelGVarsPage(PageDef& pageDef); bool isVisible() const override { return modelGVEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_heli.cpp b/radio/src/gui/colorlcd/model/model_heli.cpp index 16e04440c..1abc81744 100644 --- a/radio/src/gui/colorlcd/model/model_heli.cpp +++ b/radio/src/gui/colorlcd/model/model_heli.cpp @@ -38,28 +38,24 @@ static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_CONTENT, #endif ModelHeliPage::ModelHeliPage(): - PageTab(STR_MENUHELISETUP, ICON_MODEL_HELI) -{ -} - -void ModelHeliPage::build(Window* form) + SubPage(ICON_MODEL_HELI, STR_MAIN_MENU_MODEL_SETTINGS, STR_MENUHELISETUP) { FlexGridLayout grid(col_dsc, row_dsc, PAD_TINY); - form->setFlexLayout(); + body->setFlexLayout(); // Swash type - auto line = form->newLine(grid); + auto line = body->newLine(grid); new StaticText(line, rect_t{}, STR_SWASHTYPE); new Choice(line, rect_t{}, STR_VSWASHTYPE, 0, SWASH_TYPE_MAX, GET_SET_DEFAULT(g_model.swashR.type)); // Swash ring - line = form->newLine(grid); + line = body->newLine(grid); new StaticText(line, rect_t{}, STR_SWASHRING); new NumberEdit(line, rect_t{}, 0, 100, GET_SET_DEFAULT(g_model.swashR.value)); // Elevator source - line = form->newLine(grid); + line = body->newLine(grid); new StaticText(line, rect_t{}, STR_ELEVATOR); new SourceChoice(line, rect_t{}, 0, MIXSRC_LAST_CH, GET_SET_DEFAULT(g_model.swashR.elevatorSource)); @@ -71,7 +67,7 @@ void ModelHeliPage::build(Window* form) GET_SET_DEFAULT(g_model.swashR.elevatorWeight)); // Aileron source - line = form->newLine(grid); + line = body->newLine(grid); new StaticText(line, rect_t{}, STR_AILERON); new SourceChoice(line, rect_t{}, 0, MIXSRC_LAST_CH, GET_SET_DEFAULT(g_model.swashR.aileronSource)); @@ -83,7 +79,7 @@ void ModelHeliPage::build(Window* form) GET_SET_DEFAULT(g_model.swashR.aileronWeight)); // Collective source - line = form->newLine(grid); + line = body->newLine(grid); new StaticText(line, rect_t{}, STR_COLLECTIVE); new SourceChoice(line, rect_t{}, 0, MIXSRC_LAST_CH, GET_SET_DEFAULT(g_model.swashR.collectiveSource)); diff --git a/radio/src/gui/colorlcd/model/model_heli.h b/radio/src/gui/colorlcd/model/model_heli.h index b8852630b..6a52d1bc1 100644 --- a/radio/src/gui/colorlcd/model/model_heli.h +++ b/radio/src/gui/colorlcd/model/model_heli.h @@ -21,15 +21,10 @@ #pragma once -#include "edgetx.h" -#include "tabsgroup.h" +#include "page.h" -class ModelHeliPage : public PageTab +class ModelHeliPage : public SubPage { public: ModelHeliPage(); - - bool isVisible() const override { return modelHeliEnabled(); } - - void build(Window* window) override; }; diff --git a/radio/src/gui/colorlcd/model/model_inputs.cpp b/radio/src/gui/colorlcd/model/model_inputs.cpp index ede4b0b8b..10d77dee5 100644 --- a/radio/src/gui/colorlcd/model/model_inputs.cpp +++ b/radio/src/gui/colorlcd/model/model_inputs.cpp @@ -195,7 +195,7 @@ class InputGroup : public InputMixGroupBase } }; -ModelInputsPage::ModelInputsPage() : InputMixPageBase(STR_MENUINPUTS, ICON_MODEL_INPUTS) +ModelInputsPage::ModelInputsPage(PageDef& pageDef) : InputMixPageBase(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_inputs.h b/radio/src/gui/colorlcd/model/model_inputs.h index a72359046..bff6f3be2 100644 --- a/radio/src/gui/colorlcd/model/model_inputs.h +++ b/radio/src/gui/colorlcd/model/model_inputs.h @@ -22,12 +22,12 @@ #pragma once #include "list_line_button.h" -#include +#include "pagegroup.h" class ModelInputsPage : public InputMixPageBase { public: - ModelInputsPage(); + ModelInputsPage(PageDef& pageDef); void build(Window *window) override; diff --git a/radio/src/gui/colorlcd/model/model_logical_switches.cpp b/radio/src/gui/colorlcd/model/model_logical_switches.cpp index 08bf2f304..922d206e9 100644 --- a/radio/src/gui/colorlcd/model/model_logical_switches.cpp +++ b/radio/src/gui/colorlcd/model/model_logical_switches.cpp @@ -522,8 +522,8 @@ class LogicalSwitchButton : public ListLineButton lv_obj_t* lsDelay = nullptr; }; -ModelLogicalSwitchesPage::ModelLogicalSwitchesPage() : - PageTab(STR_MENULOGICALSWITCHES, ICON_MODEL_LOGICAL_SWITCHES) +ModelLogicalSwitchesPage::ModelLogicalSwitchesPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_logical_switches.h b/radio/src/gui/colorlcd/model/model_logical_switches.h index 99bba16a3..9dee431c1 100644 --- a/radio/src/gui/colorlcd/model/model_logical_switches.h +++ b/radio/src/gui/colorlcd/model/model_logical_switches.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class ModelLogicalSwitchesPage : public PageTab +class ModelLogicalSwitchesPage : public PageGroupItem { public: - ModelLogicalSwitchesPage(); + ModelLogicalSwitchesPage(PageDef& pageDef); bool isVisible() const override { return modelLSEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_mixer_scripts.cpp b/radio/src/gui/colorlcd/model/model_mixer_scripts.cpp index 8a133e298..5ff7ba160 100644 --- a/radio/src/gui/colorlcd/model/model_mixer_scripts.cpp +++ b/radio/src/gui/colorlcd/model/model_mixer_scripts.cpp @@ -252,8 +252,8 @@ class ScriptLineButton : public ListLineButton const ScriptInternalData* runtimeData; }; -ModelMixerScriptsPage::ModelMixerScriptsPage() : - PageTab(STR_MENUCUSTOMSCRIPTS, ICON_MODEL_LUA_SCRIPTS) +ModelMixerScriptsPage::ModelMixerScriptsPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_mixer_scripts.h b/radio/src/gui/colorlcd/model/model_mixer_scripts.h index ccf989e42..07ad1209b 100644 --- a/radio/src/gui/colorlcd/model/model_mixer_scripts.h +++ b/radio/src/gui/colorlcd/model/model_mixer_scripts.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class ModelMixerScriptsPage : public PageTab +class ModelMixerScriptsPage : public PageGroupItem { public: - ModelMixerScriptsPage(); + ModelMixerScriptsPage(PageDef& pageDef); bool isVisible() const override { return modelCustomScriptsEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_mixes.cpp b/radio/src/gui/colorlcd/model/model_mixes.cpp index e6eb292ba..44190853f 100644 --- a/radio/src/gui/colorlcd/model/model_mixes.cpp +++ b/radio/src/gui/colorlcd/model/model_mixes.cpp @@ -226,7 +226,7 @@ class MixGroup : public InputMixGroupBase bool monitorVisible = false; }; -ModelMixesPage::ModelMixesPage() : InputMixPageBase(STR_MIXES, ICON_MODEL_MIXER) +ModelMixesPage::ModelMixesPage(PageDef& pageDef) : InputMixPageBase(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_mixes.h b/radio/src/gui/colorlcd/model/model_mixes.h index 2477d353d..b8ae1f91c 100644 --- a/radio/src/gui/colorlcd/model/model_mixes.h +++ b/radio/src/gui/colorlcd/model/model_mixes.h @@ -22,12 +22,12 @@ #pragma once #include "list_line_button.h" -#include +#include "pagegroup.h" class ModelMixesPage : public InputMixPageBase { public: - ModelMixesPage(); + ModelMixesPage(PageDef& pageDef); void build(Window* window) override; diff --git a/radio/src/gui/colorlcd/model/model_outputs.cpp b/radio/src/gui/colorlcd/model/model_outputs.cpp index 0f7addc5f..4d8a90d69 100644 --- a/radio/src/gui/colorlcd/model/model_outputs.cpp +++ b/radio/src/gui/colorlcd/model/model_outputs.cpp @@ -210,8 +210,8 @@ class OutputLineButton : public ListLineButton } }; -ModelOutputsPage::ModelOutputsPage() : - PageTab(STR_MENULIMITS, ICON_MODEL_OUTPUTS) +ModelOutputsPage::ModelOutputsPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } diff --git a/radio/src/gui/colorlcd/model/model_outputs.h b/radio/src/gui/colorlcd/model/model_outputs.h index 72f0a96b8..89f316845 100644 --- a/radio/src/gui/colorlcd/model/model_outputs.h +++ b/radio/src/gui/colorlcd/model/model_outputs.h @@ -21,14 +21,15 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" class OutputLineButton; -class ModelOutputsPage : public PageTab +class ModelOutputsPage : public PageGroupItem { public: - ModelOutputsPage(); + ModelOutputsPage(PageDef& pageDef); + void build(Window* window) override; static constexpr coord_t ADD_TRIMS_X = PAD_SMALL; diff --git a/radio/src/gui/colorlcd/model/model_select.cpp b/radio/src/gui/colorlcd/model/model_select.cpp index ab16bf893..6b801b94c 100644 --- a/radio/src/gui/colorlcd/model/model_select.cpp +++ b/radio/src/gui/colorlcd/model/model_select.cpp @@ -21,14 +21,13 @@ #include "model_select.h" -#include "menu_model.h" -#include "menu_radio.h" -#include "menu_screen.h" -#include "model_templates.h" #include "edgetx.h" +#include "model_templates.h" #include "standalone_lua.h" #include "etx_lv_theme.h" +#include "view_main.h" #include "view_channels.h" +#include "screen_setup.h" inline tmr10ms_t getTicks() { return g_tmr10ms; } @@ -520,8 +519,10 @@ class ModelLayoutButton : public IconButton //----------------------------------------------------------------------------- -ModelLabelsWindow::ModelLabelsWindow() : Page(ICON_MODEL, PAD_ZERO, true) +ModelLabelsWindow::ModelLabelsWindow() : Page(ICON_MODEL_SELECT, PAD_ZERO, true) { + QuickMenu::setCurrentPage(QuickMenu::MANAGE_MODELS); + buildHead(header); buildBody(body); @@ -546,26 +547,21 @@ ModelLabelsWindow::ModelLabelsWindow() : Page(ICON_MODEL, PAD_ZERO, true) } #if defined(HARDWARE_KEYS) -void ModelLabelsWindow::onPressSYS() -{ - onCancel(); - new RadioMenu(); -} void ModelLabelsWindow::onLongPressSYS() { onCancel(); // Radio setup - (new RadioMenu())->setCurrentTab(2); + PageGroup::RadioMenu(); } void ModelLabelsWindow::onPressMDL() { onCancel(); - new ModelMenu(); + PageGroup::ModelMenu(); } void ModelLabelsWindow::onPressTELE() { onCancel(); - new ScreenMenu(); + (PageGroup::ScreenMenu())->setCurrentTab(ViewMain::instance()->getCurrentMainView() + ScreenSetupPage::FIRST_SCREEN_OFFSET); } void ModelLabelsWindow::onLongPressTELE() { @@ -682,8 +678,9 @@ void ModelLabelsWindow::buildHead(Window *hdr) // page title setTitle(); +#if !PORTRAIT // new model button - new TextButton(hdr, {LCD_W - NEW_BTN_W - PAD_LARGE, PAD_MEDIUM, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() { + new TextButton(hdr, {LCD_W - PageGroup::PAGE_TOP_BAR_H - NEW_BTN_W - PAD_LARGE, PAD_MEDIUM, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() { auto menu = new Menu(); menu->setTitle(STR_CREATE_NEW); menu->addLine(STR_NEW_MODEL, [=]() { newModel(); }); @@ -691,7 +688,7 @@ void ModelLabelsWindow::buildHead(Window *hdr) return 0; }); - mdlLayout = new ModelLayoutButton(this, LCD_W - LAYOUT_BTN_XO, PAD_MEDIUM, g_eeGeneral.modelSelectLayout, [=]() { + mdlLayout = new ModelLayoutButton(this, LCD_W - PageGroup::PAGE_TOP_BAR_H - LAYOUT_BTN_XO, PAD_MEDIUM, g_eeGeneral.modelSelectLayout, [=]() { uint8_t l = mdlLayout->getLayout(); l = (l + 1) & 3; mdlLayout->setLayout(l); @@ -700,6 +697,7 @@ void ModelLabelsWindow::buildHead(Window *hdr) mdlselector->reload(); return 0; }); +#endif } void ModelLabelsWindow::buildBody(Window *window) @@ -731,6 +729,27 @@ void ModelLabelsWindow::buildBody(Window *window) [=](int newValue) { mdlselector->setSortOrder((ModelsSortBy)newValue); }, STR_SORT_MODELS_BY); +#if PORTRAIT + // new model button + new TextButton(window, {LCD_W - NEW_BTN_W - PAD_LARGE, LABELS_Y + LABELS_HEIGHT + PAD_SMALL, NEW_BTN_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, STR_NEW, [=]() { + auto menu = new Menu(); + menu->setTitle(STR_CREATE_NEW); + menu->addLine(STR_NEW_MODEL, [=]() { newModel(); }); + menu->addLine(STR_NEW_LABEL, [=]() { newLabel(); }); + return 0; + }); + + mdlLayout = new ModelLayoutButton(window, LCD_W - LAYOUT_BTN_XO, LABELS_Y + LABELS_HEIGHT + PAD_SMALL, g_eeGeneral.modelSelectLayout, [=]() { + uint8_t l = mdlLayout->getLayout(); + l = (l + 1) & 3; + mdlLayout->setLayout(l); + g_eeGeneral.modelSelectLayout = l; + storageDirty(EE_GENERAL); + mdlselector->reload(); + return 0; + }); +#endif + std::set filteredLabels = modelslabels.filteredLabels(); if (g_eeGeneral.labelSingleSelect == 0) { diff --git a/radio/src/gui/colorlcd/model/model_select.h b/radio/src/gui/colorlcd/model/model_select.h index 0de31f152..29a72e100 100644 --- a/radio/src/gui/colorlcd/model/model_select.h +++ b/radio/src/gui/colorlcd/model/model_select.h @@ -74,7 +74,6 @@ class ModelLabelsWindow : public Page void moveLabel(int selected, int direction); #if defined(HARDWARE_KEYS) - void onPressSYS() override; void onLongPressSYS() override; void onPressMDL() override; void onPressTELE() override; diff --git a/radio/src/gui/colorlcd/model/model_setup.cpp b/radio/src/gui/colorlcd/model/model_setup.cpp index 846573a7c..d98428a80 100644 --- a/radio/src/gui/colorlcd/model/model_setup.cpp +++ b/radio/src/gui/colorlcd/model/model_setup.cpp @@ -43,6 +43,7 @@ #include "edgetx.h" #include "storage/modelslist.h" #include "etx_lv_theme.h" +#include "model_heli.h" #if defined(USBJ_EX) #include "model_usbjoystick.h" @@ -52,8 +53,8 @@ #define SET_DIRTY() storageDirty(EE_MODEL) -ModelSetupPage::ModelSetupPage() : - PageTab(STR_MENU_MODEL_SETUP, ICON_MODEL_SETUP) +ModelSetupPage::ModelSetupPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -76,7 +77,7 @@ static SetupLineDef viewOptionsPageSetupLines[] = { STR_RADIO_MENU_TABS, nullptr, }, { - STR_THEME_EDITOR, + STR_MAIN_MENU_THEMES, [](Window* parent, coord_t x, coord_t y) { viewOption(parent, x, y, GET_SET_DEFAULT(g_model.radioThemesDisabled), @@ -363,13 +364,16 @@ void ModelSetupPage::build(Window * window) {STR_PREFLIGHT, []() { new PreflightChecks(); }}, {STR_TRIMS, []() { new TrimsSetup(); }}, {STR_THROTTLE_LABEL, []() { new ThrottleParams(); }}, - {STR_ENABLED_FEATURES, []() { new SubPage(ICON_MODEL_SETUP, STR_MENU_MODEL_SETUP, STR_ENABLED_FEATURES, viewOptionsPageSetupLines, DIM(viewOptionsPageSetupLines)); }}, + {STR_ENABLED_FEATURES, []() { new SubPage(ICON_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, STR_ENABLED_FEATURES, viewOptionsPageSetupLines, DIM(viewOptionsPageSetupLines)); }}, #if defined(USBJ_EX) {STR_USBJOYSTICK_LABEL, []() { new ModelUSBJoystickPage(); }}, #endif #if defined(FUNCTION_SWITCHES) {STR_FUNCTION_SWITCHES, []() { new ModelFunctionSwitches(); }}, #endif - {STR_MENU_OTHER, []() { new SubPage(ICON_MODEL_SETUP, STR_MENU_MODEL_SETUP, STR_MENU_OTHER, otherPageSetupLines, DIM(otherPageSetupLines)); }}, + {STR_MENU_OTHER, []() { new SubPage(ICON_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, STR_MENU_OTHER, otherPageSetupLines, DIM(otherPageSetupLines)); }}, +#if defined(HELI) + {STR_MENUHELISETUP, []() { return new ModelHeliPage(); }, nullptr, modelHeliEnabled}, +#endif }, BTN_H); } diff --git a/radio/src/gui/colorlcd/model/model_setup.h b/radio/src/gui/colorlcd/model/model_setup.h index 83c8745f9..74d960670 100644 --- a/radio/src/gui/colorlcd/model/model_setup.h +++ b/radio/src/gui/colorlcd/model/model_setup.h @@ -21,11 +21,13 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class ModelSetupPage: public PageTab { +class TextButton; + +class ModelSetupPage: public PageGroupItem { public: - ModelSetupPage(); + ModelSetupPage(PageDef& pageDef); void build(Window * window) override; diff --git a/radio/src/gui/colorlcd/model/model_telemetry.cpp b/radio/src/gui/colorlcd/model/model_telemetry.cpp index d339d356e..424a2bd6c 100644 --- a/radio/src/gui/colorlcd/model/model_telemetry.cpp +++ b/radio/src/gui/colorlcd/model/model_telemetry.cpp @@ -748,8 +748,8 @@ class SensorEditWindow : public SubPage static LAYOUT_SIZE(NUM_EDIT_W, EdgeTxStyles::EDIT_FLD_WIDTH_NARROW, LAYOUT_SCALE(80)) }; -ModelTelemetryPage::ModelTelemetryPage() : - PageTab(STR_MENUTELEMETRY, ICON_MODEL_TELEMETRY) +ModelTelemetryPage::ModelTelemetryPage(PageDef& pageDef) : + PageGroupItem(pageDef) { tsStyle.init(); } @@ -770,7 +770,7 @@ void ModelTelemetryPage::checkEvents() lastKnownIndex = _lastKnownIndex; } - PageTab::checkEvents(); + PageGroupItem::checkEvents(); } void ModelTelemetryPage::editSensor(uint8_t index) diff --git a/radio/src/gui/colorlcd/model/model_telemetry.h b/radio/src/gui/colorlcd/model/model_telemetry.h index beec4dbdf..408774baa 100644 --- a/radio/src/gui/colorlcd/model/model_telemetry.h +++ b/radio/src/gui/colorlcd/model/model_telemetry.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class ModelTelemetryPage : public PageTab +class ModelTelemetryPage : public PageGroupItem { public: - ModelTelemetryPage(); + ModelTelemetryPage(PageDef& pageDef); bool isVisible() const override { return modelTelemetryEnabled(); } diff --git a/radio/src/gui/colorlcd/model/model_usbjoystick.cpp b/radio/src/gui/colorlcd/model/model_usbjoystick.cpp index 6bc60503c..7f818e52f 100644 --- a/radio/src/gui/colorlcd/model/model_usbjoystick.cpp +++ b/radio/src/gui/colorlcd/model/model_usbjoystick.cpp @@ -490,7 +490,7 @@ class USBChannelLineButton : public ListLineButton ModelUSBJoystickPage::ModelUSBJoystickPage() : Page(ICON_MODEL_USB, PAD_BORDER) { - header->setTitle(STR_MENU_MODEL_SETUP); + header->setTitle(STR_MAIN_MENU_MODEL_SETTINGS); header->setTitle2(STR_USBJOYSTICK_LABEL); body->setFlexLayout(); diff --git a/radio/src/gui/colorlcd/model/model_usbjoystick.h b/radio/src/gui/colorlcd/model/model_usbjoystick.h index 76180888a..a99811677 100644 --- a/radio/src/gui/colorlcd/model/model_usbjoystick.h +++ b/radio/src/gui/colorlcd/model/model_usbjoystick.h @@ -23,8 +23,8 @@ #include "page.h" -class Window; class USBChannelLineButton; +class TextButton; class ModelUSBJoystickPage : public Page { diff --git a/radio/src/gui/colorlcd/model/preflight_checks.cpp b/radio/src/gui/colorlcd/model/preflight_checks.cpp index 8d4b82462..eca67c324 100644 --- a/radio/src/gui/colorlcd/model/preflight_checks.cpp +++ b/radio/src/gui/colorlcd/model/preflight_checks.cpp @@ -190,7 +190,7 @@ class PotWarnMatrix : public ButtonMatrix uint8_t pot_idx[MAX_POTS]; }; -PreflightChecks::PreflightChecks() : SubPage(ICON_MODEL_SETUP, STR_MENU_MODEL_SETUP, STR_PREFLIGHT) +PreflightChecks::PreflightChecks() : SubPage(ICON_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, STR_PREFLIGHT) { body->setFlexLayout(); diff --git a/radio/src/gui/colorlcd/model/special_functions.cpp b/radio/src/gui/colorlcd/model/special_functions.cpp index e6a9bc144..775530945 100644 --- a/radio/src/gui/colorlcd/model/special_functions.cpp +++ b/radio/src/gui/colorlcd/model/special_functions.cpp @@ -691,9 +691,9 @@ void FunctionEditPage::buildBody(Window *form) //----------------------------------------------------------------------------- -FunctionsPage::FunctionsPage(CustomFunctionData *functions, const char *title, - const char *prefix, EdgeTxIcon icon) : - PageTab(title, icon), functions(functions), title(title), prefix(prefix) +FunctionsPage::FunctionsPage(CustomFunctionData *functions, PageDef& pageDef, + const char *prefix) : + PageGroupItem(pageDef), functions(functions), prefix(prefix) { } @@ -961,9 +961,8 @@ class SpecialFunctionEditPage : public FunctionEditPage //----------------------------------------------------------------------------- -SpecialFunctionsPage::SpecialFunctionsPage() : - FunctionsPage(g_model.customFn, STR_MENUCUSTOMFUNC, "SF", - ICON_MODEL_SPECIAL_FUNCTIONS) +SpecialFunctionsPage::SpecialFunctionsPage(PageDef& pageDef) : + FunctionsPage(g_model.customFn, pageDef, "SF") { } @@ -1042,9 +1041,8 @@ class GlobalFunctionEditPage : public FunctionEditPage //----------------------------------------------------------------------------- -GlobalFunctionsPage::GlobalFunctionsPage() : - FunctionsPage(g_eeGeneral.customFn, STR_MENUSPECIALFUNCS, "GF", - ICON_RADIO_GLOBAL_FUNCTIONS) +GlobalFunctionsPage::GlobalFunctionsPage(PageDef& pageDef) : + FunctionsPage(g_eeGeneral.customFn, pageDef, "GF") { } diff --git a/radio/src/gui/colorlcd/model/special_functions.h b/radio/src/gui/colorlcd/model/special_functions.h index 5ee147a91..5702c5811 100644 --- a/radio/src/gui/colorlcd/model/special_functions.h +++ b/radio/src/gui/colorlcd/model/special_functions.h @@ -24,7 +24,7 @@ #include "list_line_button.h" #include "edgetx.h" #include "page.h" -#include "tabsgroup.h" +#include "pagegroup.h" struct CustomFunctionData; class FunctionEditPage; @@ -115,11 +115,10 @@ class FunctionEditPage : public Page //----------------------------------------------------------------------------- -class FunctionsPage : public PageTab +class FunctionsPage : public PageGroupItem { public: - FunctionsPage(CustomFunctionData* functions, const char* title, - const char* prefix, EdgeTxIcon icon); + FunctionsPage(CustomFunctionData* functions, PageDef& pageDef, const char* prefix); void build(Window* window) override; @@ -131,7 +130,6 @@ class FunctionsPage : public PageTab bool isRebuilding = false; CustomFunctionData* functions; ButtonBase* addButton = nullptr; - const char* title = nullptr; const char* prefix = nullptr; void rebuild(Window* window); @@ -154,7 +152,7 @@ class FunctionsPage : public PageTab class SpecialFunctionsPage : public FunctionsPage { public: - SpecialFunctionsPage(); + SpecialFunctionsPage(PageDef& pageDef); bool isVisible() const override { return modelSFEnabled(); } @@ -171,7 +169,7 @@ class SpecialFunctionsPage : public FunctionsPage class GlobalFunctionsPage : public FunctionsPage { public: - GlobalFunctionsPage(); + GlobalFunctionsPage(PageDef& pageDef); bool isVisible() const override { return radioGFEnabled(); } diff --git a/radio/src/gui/colorlcd/model/throttle_params.cpp b/radio/src/gui/colorlcd/model/throttle_params.cpp index 9083f8ab9..2262383c2 100644 --- a/radio/src/gui/colorlcd/model/throttle_params.cpp +++ b/radio/src/gui/colorlcd/model/throttle_params.cpp @@ -72,6 +72,6 @@ static SetupLineDef setupLines[] = { }, }; -ThrottleParams::ThrottleParams() : SubPage(ICON_MODEL_SETUP, STR_MENU_MODEL_SETUP, STR_THROTTLE_LABEL, setupLines, DIM(setupLines)) +ThrottleParams::ThrottleParams() : SubPage(ICON_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, STR_THROTTLE_LABEL, setupLines, DIM(setupLines)) { } diff --git a/radio/src/gui/colorlcd/model/timer_setup.cpp b/radio/src/gui/colorlcd/model/timer_setup.cpp index b0b904ffe..7162b343b 100644 --- a/radio/src/gui/colorlcd/model/timer_setup.cpp +++ b/radio/src/gui/colorlcd/model/timer_setup.cpp @@ -28,7 +28,7 @@ #define SET_DIRTY() storageDirty(EE_MODEL) TimerWindow::TimerWindow(uint8_t timer) : - SubPage(ICON_STATS_TIMERS, STR_MENU_MODEL_SETUP, (std::string(STR_TIMER) + std::to_string(timer + 1)).c_str()) + SubPage(ICON_STATS_TIMERS, STR_MAIN_MENU_MODEL_SETTINGS, (std::string(STR_TIMER) + std::to_string(timer + 1)).c_str()) { body->setFlexLayout(); diff --git a/radio/src/gui/colorlcd/model/trainer_setup.cpp b/radio/src/gui/colorlcd/model/trainer_setup.cpp index 067f831bf..1150405eb 100644 --- a/radio/src/gui/colorlcd/model/trainer_setup.cpp +++ b/radio/src/gui/colorlcd/model/trainer_setup.cpp @@ -143,7 +143,7 @@ void TrainerModuleWindow::update() TrainerPage::TrainerPage() : Page(ICON_MODEL_SETUP) { - header->setTitle(STR_MENU_MODEL_SETUP); + header->setTitle(STR_MAIN_MENU_MODEL_SETTINGS); header->setTitle2(STR_TRAINER); body->setFlexLayout(); diff --git a/radio/src/gui/colorlcd/model/trims_setup.cpp b/radio/src/gui/colorlcd/model/trims_setup.cpp index 6f9864e6d..6a1117bd2 100644 --- a/radio/src/gui/colorlcd/model/trims_setup.cpp +++ b/radio/src/gui/colorlcd/model/trims_setup.cpp @@ -79,6 +79,6 @@ static SetupLineDef setupLines[] = { }, }; -TrimsSetup::TrimsSetup() : SubPage(ICON_MODEL_SETUP, STR_MENU_MODEL_SETUP, STR_TRIMS, setupLines, DIM(setupLines)) +TrimsSetup::TrimsSetup() : SubPage(ICON_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, STR_TRIMS, setupLines, DIM(setupLines)) { } diff --git a/radio/src/gui/colorlcd/module/afhds2a_settings.h b/radio/src/gui/colorlcd/module/afhds2a_settings.h index 38b8f46d1..b22b9d2ff 100644 --- a/radio/src/gui/colorlcd/module/afhds2a_settings.h +++ b/radio/src/gui/colorlcd/module/afhds2a_settings.h @@ -23,6 +23,7 @@ #include "window.h" #include "module_setup.h" +#include "form.h" class Choice; struct ModuleData; diff --git a/radio/src/gui/colorlcd/module/bind_menu_d16.cpp b/radio/src/gui/colorlcd/module/bind_menu_d16.cpp index fd1f0e2e3..5202bfc0f 100644 --- a/radio/src/gui/colorlcd/module/bind_menu_d16.cpp +++ b/radio/src/gui/colorlcd/module/bind_menu_d16.cpp @@ -32,16 +32,16 @@ BindChoiceMenu::BindChoiceMenu(uint8_t moduleIdx, Menu(), moduleIdx(moduleIdx), onPressHandler(std::move(onPress)) { if (isTelemAllowedOnBind(moduleIdx)) { - addLine(STR_BINDING_1_8_TELEM_ON, [=]() { onSelect(Bind_1_8_TELEM_ON); }); + addLine(STR_BINDING_CH1_8_TELEM_ON, [=]() { onSelect(Bind_1_8_TELEM_ON); }); } - addLine(STR_BINDING_1_8_TELEM_OFF, [=]() { onSelect(Bind_1_8_TELEM_OFF); }); + addLine(STR_BINDING_CH1_8_TELEM_OFF, [=]() { onSelect(Bind_1_8_TELEM_OFF); }); if (isBindCh9To16Allowed(moduleIdx)) { if (isTelemAllowedOnBind(moduleIdx)) { - addLine(STR_BINDING_9_16_TELEM_ON, + addLine(STR_BINDING_CH9_16_TELEM_ON, [=]() { onSelect(Bind_9_16_TELEM_ON); }); } - addLine(STR_BINDING_9_16_TELEM_OFF, + addLine(STR_BINDING_CH9_16_TELEM_OFF, [=]() { onSelect(Bind_9_16_TELEM_OFF); }); } setTitle(STR_SELECT_MODE); diff --git a/radio/src/gui/colorlcd/module/module_setup.cpp b/radio/src/gui/colorlcd/module/module_setup.cpp index 660afed30..d7889dcf9 100644 --- a/radio/src/gui/colorlcd/module/module_setup.cpp +++ b/radio/src/gui/colorlcd/module/module_setup.cpp @@ -729,7 +729,7 @@ ModulePage::ModulePage(uint8_t moduleIdx) : Page(ICON_MODEL_SETUP) { const char* title2 = moduleIdx == INTERNAL_MODULE ? STR_INTERNALRF : STR_EXTERNALRF; - header->setTitle(STR_MENU_MODEL_SETUP); + header->setTitle(STR_MAIN_MENU_MODEL_SETTINGS); header->setTitle2(title2); body->setFlexLayout(); diff --git a/radio/src/gui/colorlcd/radio/menu_radio.cpp b/radio/src/gui/colorlcd/radio/menu_radio.cpp deleted file mode 100644 index df26edc47..000000000 --- a/radio/src/gui/colorlcd/radio/menu_radio.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#include "menu_radio.h" - -#include "menu_model.h" -#include "menu_screen.h" -#include "model_select.h" -#include "myeeprom.h" -#include "edgetx.h" -#include "radio_calibration.h" -#include "radio_hardware.h" -#include "radio_sdmanager.h" -#include "radio_setup.h" -#include "radio_theme.h" -#include "radio_tools.h" -#include "radio_trainer.h" -#include "radio_version.h" -#include "special_functions.h" -#include "view_channels.h" - -RadioMenu::RadioMenu() : TabsGroup(ICON_RADIO) { build(); } - -RadioMenu::~RadioMenu() { storageCheck(true); } - -void RadioMenu::build() -{ - addTab(new RadioToolsPage()); - addTab(new RadioSdManagerPage()); - addTab(new RadioSetupPage()); - addTab(new ThemeSetupPage(this)); - addTab(new GlobalFunctionsPage()); - addTab(new RadioTrainerPage()); - addTab(new RadioHardwarePage()); - addTab(new RadioVersionPage()); -} - -#if defined(HARDWARE_KEYS) -void RadioMenu::onPressSYS() { setCurrentTab(0); } -void RadioMenu::onLongPressSYS() { setCurrentTab(2); } -void RadioMenu::onPressMDL() -{ - onCancel(); - new ModelMenu(); -} -void RadioMenu::onLongPressMDL() -{ - onCancel(); - new ModelLabelsWindow(); -} -void RadioMenu::onPressTELE() -{ - onCancel(); - new ScreenMenu(); -} -void RadioMenu::onLongPressTELE() -{ - onCancel(); - new ChannelsViewMenu(); -} -#endif diff --git a/radio/src/gui/colorlcd/radio/menu_radio.h b/radio/src/gui/colorlcd/radio/menu_radio.h deleted file mode 100644 index 10495352e..000000000 --- a/radio/src/gui/colorlcd/radio/menu_radio.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) EdgeTX - * - * Based on code named - * opentx - https://github.com/opentx/opentx - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * 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. - */ - -#pragma once - -#include "tabsgroup.h" - -class RadioMenu : public TabsGroup -{ - public: - RadioMenu(); - ~RadioMenu(); - - protected: - void build(); - -#if defined(HARDWARE_KEYS) - void onPressSYS() override; - void onLongPressSYS() override; - void onPressMDL() override; - void onLongPressMDL() override; - void onPressTELE() override; - void onLongPressTELE() override; -#endif -}; diff --git a/radio/src/gui/colorlcd/radio/radio_calibration.h b/radio/src/gui/colorlcd/radio/radio_calibration.h index 89bbc050d..a30c25ae0 100644 --- a/radio/src/gui/colorlcd/radio/radio_calibration.h +++ b/radio/src/gui/colorlcd/radio/radio_calibration.h @@ -24,6 +24,7 @@ #include "page.h" class StaticText; +class TextButton; class RadioCalibrationPage: public Page { public: diff --git a/radio/src/gui/colorlcd/radio/radio_cfs.cpp b/radio/src/gui/colorlcd/radio/radio_cfs.cpp index 83489470c..1cf3862cd 100644 --- a/radio/src/gui/colorlcd/radio/radio_cfs.cpp +++ b/radio/src/gui/colorlcd/radio/radio_cfs.cpp @@ -257,7 +257,7 @@ class RadioFunctionSwitch : public Window RadioFunctionSwitches::RadioFunctionSwitches() : Page(ICON_RADIO_HARDWARE) { header->setTitle(STR_HARDWARE); - header->setTitle2(STR_MENU_FSWITCH); + header->setTitle2(STR_FUNCTION_SWITCHES); body->padAll(PAD_TINY); body->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_ZERO); diff --git a/radio/src/gui/colorlcd/radio/radio_diaganas.cpp b/radio/src/gui/colorlcd/radio/radio_diaganas.cpp index 6694ecee6..49d3c3498 100644 --- a/radio/src/gui/colorlcd/radio/radio_diaganas.cpp +++ b/radio/src/gui/colorlcd/radio/radio_diaganas.cpp @@ -467,10 +467,14 @@ class AnaMinMaxViewWindow : public AnaViewWindow static LAYOUT_SIZE(GRIDCOLS, 10, 5) }; -class AnaCalibratedViewPage : public PageTab +class AnaCalibratedViewPage : public PageGroupItem { public: - AnaCalibratedViewPage() : PageTab(STR_ANADIAGS_CALIB, ICON_STATS_ANALOGS) {} + AnaCalibratedViewPage(QuickMenu::SubMenu subMenu) : + PageGroupItem(STR_ANADIAGS_CALIB, subMenu) + { + icon = ICON_STATS; + } protected: void build(Window* window) override @@ -479,12 +483,13 @@ class AnaCalibratedViewPage : public PageTab } }; -class AnaFilteredDevViewPage : public PageTab +class AnaFilteredDevViewPage : public PageGroupItem { public: - AnaFilteredDevViewPage() : - PageTab(STR_ANADIAGS_FILTRAWDEV, ICON_STATS_THROTTLE_GRAPH) + AnaFilteredDevViewPage(QuickMenu::SubMenu subMenu) : + PageGroupItem(STR_ANADIAGS_FILTRAWDEV, subMenu) { + icon = ICON_STATS; } protected: @@ -494,12 +499,13 @@ class AnaFilteredDevViewPage : public PageTab } }; -class AnaUnfilteredRawViewPage : public PageTab +class AnaUnfilteredRawViewPage : public PageGroupItem { public: - AnaUnfilteredRawViewPage() : - PageTab(STR_ANADIAGS_UNFILTRAW, ICON_RADIO_HARDWARE) + AnaUnfilteredRawViewPage(QuickMenu::SubMenu subMenu) : + PageGroupItem(STR_ANADIAGS_UNFILTRAW, subMenu) { + icon = ICON_STATS; } protected: @@ -509,10 +515,14 @@ class AnaUnfilteredRawViewPage : public PageTab } }; -class AnaMinMaxViewPage : public PageTab +class AnaMinMaxViewPage : public PageGroupItem { public: - AnaMinMaxViewPage() : PageTab(STR_ANADIAGS_MINMAX, ICON_RADIO_CALIBRATION) {} + AnaMinMaxViewPage(QuickMenu::SubMenu subMenu) : + PageGroupItem(STR_ANADIAGS_MINMAX, subMenu) + { + icon = ICON_STATS; + } protected: void build(Window* window) override @@ -521,11 +531,11 @@ class AnaMinMaxViewPage : public PageTab } }; -RadioAnalogsDiagsViewPageGroup::RadioAnalogsDiagsViewPageGroup() : - TabsGroup(ICON_STATS) +RadioAnalogsDiagsViewPageGroup::RadioAnalogsDiagsViewPageGroup(QuickMenu::SubMenu subMenu) : + TabsGroup(ICON_STATS, STR_ANALOGS_BTN) { - addTab(new AnaCalibratedViewPage()); - addTab(new AnaFilteredDevViewPage()); - addTab(new AnaUnfilteredRawViewPage()); - addTab(new AnaMinMaxViewPage()); + addTab(new AnaCalibratedViewPage(subMenu)); + addTab(new AnaFilteredDevViewPage(subMenu)); + addTab(new AnaUnfilteredRawViewPage(subMenu)); + addTab(new AnaMinMaxViewPage(subMenu)); } diff --git a/radio/src/gui/colorlcd/radio/radio_diaganas.h b/radio/src/gui/colorlcd/radio/radio_diaganas.h index d42f52542..70e5d3196 100644 --- a/radio/src/gui/colorlcd/radio/radio_diaganas.h +++ b/radio/src/gui/colorlcd/radio/radio_diaganas.h @@ -21,10 +21,10 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" class RadioAnalogsDiagsViewPageGroup : public TabsGroup { public: - RadioAnalogsDiagsViewPageGroup(); + RadioAnalogsDiagsViewPageGroup(QuickMenu::SubMenu subMenu); }; diff --git a/radio/src/gui/colorlcd/radio/radio_diagcustswitches.cpp b/radio/src/gui/colorlcd/radio/radio_diagcustswitches.cpp index 0c3844eac..4af354f97 100644 --- a/radio/src/gui/colorlcd/radio/radio_diagcustswitches.cpp +++ b/radio/src/gui/colorlcd/radio/radio_diagcustswitches.cpp @@ -105,8 +105,8 @@ class RadioCustSwitchesDiagsWindow : public Window void RadioCustSwitchesDiagsPage::buildHeader(Window *window) { - header->setTitle(STR_RADIO_SETUP); - header->setTitle2(STR_MENU_FSWITCH); + header->setTitle(STR_HARDWARE); + header->setTitle2(STR_FUNCTION_SWITCHES); } void RadioCustSwitchesDiagsPage::buildBody(Window *window) diff --git a/radio/src/gui/colorlcd/radio/radio_diagkeys.cpp b/radio/src/gui/colorlcd/radio/radio_diagkeys.cpp index 682272287..0ac0cccec 100644 --- a/radio/src/gui/colorlcd/radio/radio_diagkeys.cpp +++ b/radio/src/gui/colorlcd/radio/radio_diagkeys.cpp @@ -238,7 +238,7 @@ class RadioKeyDiagsWindow : public Window void RadioKeyDiagsPage::buildHeader(Window *window) { - header->setTitle(STR_RADIO_SETUP); + header->setTitle(STR_HARDWARE); header->setTitle2(STR_MENU_RADIO_SWITCHES); } diff --git a/radio/src/gui/colorlcd/radio/radio_hardware.cpp b/radio/src/gui/colorlcd/radio/radio_hardware.cpp index 0c924f6cc..ce082a281 100644 --- a/radio/src/gui/colorlcd/radio/radio_hardware.cpp +++ b/radio/src/gui/colorlcd/radio/radio_hardware.cpp @@ -53,8 +53,8 @@ static const lv_coord_t col_dsc[] = {LV_GRID_FR(1), LV_GRID_FR(2), static const lv_coord_t row_dsc[] = {LV_GRID_CONTENT, LV_GRID_TEMPLATE_LAST}; -RadioHardwarePage::RadioHardwarePage() : - PageTab(STR_HARDWARE, ICON_RADIO_HARDWARE, PAD_TINY) +RadioHardwarePage::RadioHardwarePage(PageDef& pageDef) : + PageGroupItem(pageDef, PAD_TINY) { enableVBatBridge(); } @@ -187,7 +187,7 @@ void RadioHardwarePage::build(Window* window) // Calibration new SetupButtonGroup(window, {0, 0, LCD_W - padding * 2, 0}, STR_INPUTS, BTN_COLS, PAD_ZERO, { - {STR_CALIBRATION, []() { new RadioCalibrationPage(); }}, + {STR_MENUCALIBRATION, []() { new RadioCalibrationPage(); }}, {STR_STICKS, []() { new HWInputDialog(STR_STICKS); }}, {STR_POTS, []() { new HWInputDialog(STR_POTS, HWPots::POTS_WINDOW_WIDTH); }}, {STR_SWITCHES, []() { new HWInputDialog(STR_SWITCHES, HWSwitches::SW_WINDOW_WIDTH); }}, @@ -198,7 +198,7 @@ void RadioHardwarePage::build(Window* window) // Debugs new SetupButtonGroup(window, {0, 0, LCD_W - padding * 2, 0}, STR_DEBUG, FS_BTN_COLS, PAD_ZERO, { - {STR_ANALOGS_BTN, []() { new RadioAnalogsDiagsViewPageGroup(); }}, + {STR_ANALOGS_BTN, [=]() { new RadioAnalogsDiagsViewPageGroup(quickMenuId); }}, {STR_KEYS_BTN, []() { new RadioKeyDiagsPage(); }}, #if defined(FUNCTION_SWITCHES) {STR_FS_BTN, []() { new RadioCustSwitchesDiagsPage(); }}, diff --git a/radio/src/gui/colorlcd/radio/radio_hardware.h b/radio/src/gui/colorlcd/radio/radio_hardware.h index db1c9985f..092327645 100644 --- a/radio/src/gui/colorlcd/radio/radio_hardware.h +++ b/radio/src/gui/colorlcd/radio/radio_hardware.h @@ -21,14 +21,14 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class RadioHardwarePage : public PageTab +class RadioHardwarePage : public PageGroupItem { void checkEvents() override; public: - RadioHardwarePage(); + RadioHardwarePage(PageDef& pageDef); void build(Window* window) override; diff --git a/radio/src/gui/colorlcd/radio/radio_sdmanager.cpp b/radio/src/gui/colorlcd/radio/radio_sdmanager.cpp index cdd6aba5b..5f7b6d5be 100644 --- a/radio/src/gui/colorlcd/radio/radio_sdmanager.cpp +++ b/radio/src/gui/colorlcd/radio/radio_sdmanager.cpp @@ -41,8 +41,8 @@ constexpr int WARN_FILE_LENGTH = 40 * 1024; #define CELL_CTRL_DIR LV_TABLE_CELL_CTRL_CUSTOM_1 #define CELL_CTRL_FILE LV_TABLE_CELL_CTRL_CUSTOM_2 -RadioSdManagerPage::RadioSdManagerPage() : - PageTab(STR_SD_CARD, ICON_RADIO_SD_MANAGER) +RadioSdManagerPage::RadioSdManagerPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -261,7 +261,7 @@ void RadioSdManagerPage::build(Window * window) void RadioSdManagerPage::checkEvents() { - PageTab::checkEvents(); + PageGroupItem::checkEvents(); if (loadPreview) { loadPreview -= 1; diff --git a/radio/src/gui/colorlcd/radio/radio_sdmanager.h b/radio/src/gui/colorlcd/radio/radio_sdmanager.h index 43cc44dbe..2d7c32974 100644 --- a/radio/src/gui/colorlcd/radio/radio_sdmanager.h +++ b/radio/src/gui/colorlcd/radio/radio_sdmanager.h @@ -22,20 +22,20 @@ #pragma once #include "dataconstants.h" -#include "tabsgroup.h" +#include "pagegroup.h" enum MultiModuleType : short; class FileBrowser; class FilePreview; -class RadioSdManagerPage : public PageTab +class RadioSdManagerPage : public PageGroupItem { FileBrowser* browser = nullptr; FilePreview* preview = nullptr; public: - RadioSdManagerPage(); + RadioSdManagerPage(PageDef& pageDef); void build(Window* window) override; protected: diff --git a/radio/src/gui/colorlcd/radio/radio_setup.cpp b/radio/src/gui/colorlcd/radio/radio_setup.cpp index 7e4bdce41..352bddcba 100644 --- a/radio/src/gui/colorlcd/radio/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio/radio_setup.cpp @@ -407,7 +407,7 @@ static SetupLineDef alarmsPageSetupLines[] = { class BacklightPage : public SubPage { public: - BacklightPage() : SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_BACKLIGHT_LABEL, true) + BacklightPage() : SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_BACKLIGHT_LABEL, true) { body->setFlexLayout(); @@ -584,7 +584,7 @@ static SetupLineDef viewOptionsPageSetupLines[] = { STR_RADIO_MENU_TABS, nullptr, }, { - STR_THEME_EDITOR, + STR_MAIN_MENU_THEMES, [](Window* parent, coord_t x, coord_t y) { viewOption(parent, x, y, GET_SET_INVERTED(g_eeGeneral.radioThemesDisabled), @@ -687,7 +687,7 @@ static SetupLineDef viewOptionsPageSetupLines[] = { class ManageModelsSetupPage : public SubPage { public: - ManageModelsSetupPage() : SubPage(ICON_MODEL, STR_RADIO_SETUP, STR_MANAGE_MODELS, true) + ManageModelsSetupPage() : SubPage(ICON_MODEL, STR_MAIN_MENU_RADIO_SETTINGS, STR_MANAGE_MODELS, true) { body->setFlexLayout(); @@ -926,7 +926,7 @@ static SetupLineDef setupLines[] = { }, }; -RadioSetupPage::RadioSetupPage() : PageTab(STR_RADIO_SETUP, ICON_RADIO_SETUP, PAD_TINY) {} +RadioSetupPage::RadioSetupPage(PageDef& pageDef) : PageGroupItem(pageDef, PAD_TINY) {} void RadioSetupPage::build(Window* window) { @@ -940,18 +940,18 @@ void RadioSetupPage::build(Window* window) // Sub-pages w = new SetupButtonGroup(window, {0, y, LCD_W - padding * 2, 0}, nullptr, BTN_COLS, PAD_TINY, { #if defined(AUDIO) - {STR_SOUND_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_SOUND_LABEL, soundPageSetupLines, DIM(soundPageSetupLines)); }}, + {STR_SOUND_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_SOUND_LABEL, soundPageSetupLines, DIM(soundPageSetupLines)); }}, #endif #if defined(VARIO) - {STR_VARIO, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_VARIO, varioPageSetupLines, DIM(varioPageSetupLines)); }}, + {STR_VARIO, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_VARIO, varioPageSetupLines, DIM(varioPageSetupLines)); }}, #endif #if defined(HAPTIC) - {STR_HAPTIC_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_HAPTIC_LABEL, hapticPageSetupLines, DIM(hapticPageSetupLines)); }}, + {STR_HAPTIC_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_HAPTIC_LABEL, hapticPageSetupLines, DIM(hapticPageSetupLines)); }}, #endif - {STR_ALARMS_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_ALARMS_LABEL, alarmsPageSetupLines, DIM(alarmsPageSetupLines)); }}, + {STR_ALARMS_LABEL, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_ALARMS_LABEL, alarmsPageSetupLines, DIM(alarmsPageSetupLines)); }}, {STR_BACKLIGHT_LABEL, []() { new BacklightPage(); }}, - {STR_GPS, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_GPS, gpsPageSetupLines, DIM(gpsPageSetupLines)); }}, - {STR_ENABLED_FEATURES, []() { new SubPage(ICON_RADIO_SETUP, STR_RADIO_SETUP, STR_ENABLED_FEATURES, viewOptionsPageSetupLines, DIM(viewOptionsPageSetupLines)); }}, + {STR_GPS, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_GPS, gpsPageSetupLines, DIM(gpsPageSetupLines)); }}, + {STR_ENABLED_FEATURES, []() { new SubPage(ICON_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, STR_ENABLED_FEATURES, viewOptionsPageSetupLines, DIM(viewOptionsPageSetupLines)); }}, {STR_MAIN_MENU_MANAGE_MODELS, []() { new ManageModelsSetupPage(); }}, }, BTN_H); y += w->height() + padding; diff --git a/radio/src/gui/colorlcd/radio/radio_setup.h b/radio/src/gui/colorlcd/radio/radio_setup.h index 66ad60667..6f5a786cb 100644 --- a/radio/src/gui/colorlcd/radio/radio_setup.h +++ b/radio/src/gui/colorlcd/radio/radio_setup.h @@ -21,11 +21,12 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class RadioSetupPage: public PageTab { +class RadioSetupPage: public PageGroupItem +{ public: - RadioSetupPage(); + RadioSetupPage(PageDef& pageDef); void build(Window * window) override; diff --git a/radio/src/gui/colorlcd/radio/radio_theme.cpp b/radio/src/gui/colorlcd/radio/radio_theme.cpp index 3628997aa..961398453 100644 --- a/radio/src/gui/colorlcd/radio/radio_theme.cpp +++ b/radio/src/gui/colorlcd/radio/radio_theme.cpp @@ -382,7 +382,7 @@ class ThemeEditPage : public Page #endif // save and cancel - rect_t r = {LCD_W - (ColorEditPage::BUTTON_WIDTH + PAD_SMALL + 1), PAD_MEDIUM, ColorEditPage::BUTTON_WIDTH, 0}; + rect_t r = {LCD_W - (ColorEditPage::BUTTON_WIDTH + PAD_SMALL + 1) - EdgeTxStyles::MENU_HEADER_HEIGHT, PAD_MEDIUM, ColorEditPage::BUTTON_WIDTH, 0}; new TextButton(window, r, STR_DETAILS, [=]() { new ThemeDetailsDialog(_theme, [=](ThemeFile t) { _theme.setAuthor(t.getAuthor()); @@ -432,8 +432,8 @@ class ThemeEditPage : public Page StaticText *_themeName = nullptr; }; -ThemeSetupPage::ThemeSetupPage(TabsGroup *tabsGroup) : - PageTab(STR_THEME_EDITOR, ICON_RADIO_EDIT_THEME), tabsGroup(tabsGroup) +ThemeSetupPage::ThemeSetupPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -466,7 +466,7 @@ bool isTopWindow(Window *window) void ThemeSetupPage::checkEvents() { - PageTab::checkEvents(); + PageGroupItem::checkEvents(); if (fileCarosell) fileCarosell->pause(!isTopWindow(pageWindow)); } diff --git a/radio/src/gui/colorlcd/radio/radio_theme.h b/radio/src/gui/colorlcd/radio/radio_theme.h index 3e4d7d3cd..084e74265 100644 --- a/radio/src/gui/colorlcd/radio/radio_theme.h +++ b/radio/src/gui/colorlcd/radio/radio_theme.h @@ -21,20 +21,20 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" class ListBox; -class TabsGroup; +class PageGroup; class ThemeColorPreview; class ThemePersistance; class ThemeFile; class FileCarosell; -class ThemeSetupPage : public PageTab +class ThemeSetupPage : public PageGroupItem { public: - ThemeSetupPage(TabsGroup *tabsGroup); + ThemeSetupPage(PageDef& pageDef); void build(Window *window) override; void checkEvents() override; @@ -45,7 +45,6 @@ class ThemeSetupPage : public PageTab static LAYOUT_ORIENTATION(LIST_SIZE, (LCD_W - PAD_MEDIUM * 2) / 2 - COLOR_PREVIEW_SIZE, LCD_H / 2 - LAYOUT_SCALE(38)); protected: - TabsGroup *tabsGroup = nullptr; Window *pageWindow = nullptr; Window *previewWindow = nullptr; FileCarosell *fileCarosell = nullptr; diff --git a/radio/src/gui/colorlcd/radio/radio_tools.cpp b/radio/src/gui/colorlcd/radio/radio_tools.cpp index 5621eb3e7..bb5dd6922 100644 --- a/radio/src/gui/colorlcd/radio/radio_tools.cpp +++ b/radio/src/gui/colorlcd/radio/radio_tools.cpp @@ -35,7 +35,7 @@ extern uint8_t g_moduleIdx; -RadioToolsPage::RadioToolsPage() : PageTab(STR_MENUTOOLS, ICON_RADIO_TOOLS) {} +RadioToolsPage::RadioToolsPage(PageDef& pageDef) : PageGroupItem(pageDef) {} void RadioToolsPage::build(Window* window) { @@ -78,7 +78,7 @@ void RadioToolsPage::checkEvents() } #endif - PageTab::checkEvents(); + PageGroupItem::checkEvents(); } typedef void (*ToolExec)(Window* parent, const std::string& path); diff --git a/radio/src/gui/colorlcd/radio/radio_tools.h b/radio/src/gui/colorlcd/radio/radio_tools.h index b8dbb4f35..cd5f32ad7 100644 --- a/radio/src/gui/colorlcd/radio/radio_tools.h +++ b/radio/src/gui/colorlcd/radio/radio_tools.h @@ -21,12 +21,12 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class RadioToolsPage : public PageTab +class RadioToolsPage : public PageGroupItem { public: - RadioToolsPage(); + RadioToolsPage(PageDef& pageDef); void build(Window* window) override; diff --git a/radio/src/gui/colorlcd/radio/radio_trainer.cpp b/radio/src/gui/colorlcd/radio/radio_trainer.cpp index d3ef018aa..e7a33e1ab 100644 --- a/radio/src/gui/colorlcd/radio/radio_trainer.cpp +++ b/radio/src/gui/colorlcd/radio/radio_trainer.cpp @@ -28,8 +28,8 @@ #define SET_DIRTY() storageDirty(EE_GENERAL) -RadioTrainerPage::RadioTrainerPage() : - PageTab(STR_MENUTRAINER, ICON_RADIO_TRAINER) +RadioTrainerPage::RadioTrainerPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -50,7 +50,6 @@ void RadioTrainerPage::build(Window* form) form->padAll(PAD_SMALL); if (SLAVE_MODE()) { - form->setHeight(TabsGroup::MENU_BODY_HEIGHT); auto txt = new StaticText(form, rect_t{}, STR_SLAVE, COLOR_THEME_PRIMARY1_INDEX, FONT(L)); lv_obj_align(txt->getLvObj(), LV_ALIGN_CENTER, 0, 0); } else { @@ -117,7 +116,7 @@ void RadioTrainerPage::build(Window* form) } // Trainer calibration - auto btn = new TextButton(line, rect_t{}, std::string(STR_CALIBRATION), + auto btn = new TextButton(line, rect_t{}, std::string(STR_MENUCALIBRATION), [=]() -> uint8_t { memcpy(g_eeGeneral.trainer.calib, trainerInput, sizeof(g_eeGeneral.trainer.calib)); diff --git a/radio/src/gui/colorlcd/radio/radio_trainer.h b/radio/src/gui/colorlcd/radio/radio_trainer.h index 0b7305251..23257bd51 100644 --- a/radio/src/gui/colorlcd/radio/radio_trainer.h +++ b/radio/src/gui/colorlcd/radio/radio_trainer.h @@ -21,13 +21,13 @@ #pragma once -#include "tabsgroup.h" #include "edgetx.h" +#include "pagegroup.h" -class RadioTrainerPage : public PageTab +class RadioTrainerPage : public PageGroupItem { public: - RadioTrainerPage(); + RadioTrainerPage(PageDef& pageDef); bool isVisible() const override { return radioTrainerEnabled(); } diff --git a/radio/src/gui/colorlcd/radio/radio_version.cpp b/radio/src/gui/colorlcd/radio/radio_version.cpp index 25e026c78..43083da0f 100644 --- a/radio/src/gui/colorlcd/radio/radio_version.cpp +++ b/radio/src/gui/colorlcd/radio/radio_version.cpp @@ -332,8 +332,11 @@ class VersionDialog : public BaseDialog #endif }; -RadioVersionPage::RadioVersionPage() : - PageTab(STR_MENUVERSION, ICON_RADIO_VERSION) +const std::string copyright_str = "Copyright (C) " BUILD_YEAR " EdgeTX"; +const std::string edgetx_url = "https://edgetx.org"; + +RadioVersionPage::RadioVersionPage(PageDef& pageDef) : + PageGroupItem(pageDef) { } @@ -344,7 +347,41 @@ extern const char* boardTouchType; void RadioVersionPage::build(Window* window) { - window->setFlexLayout(LV_FLEX_FLOW_COLUMN, PAD_MEDIUM); + window->padAll(PAD_ZERO); + + coord_t qw, qh, iw, ih, ix, iy; + +#if LANDSCAPE + qw = QR_SZ + PAD_LARGE * 2; + qh = window->height(); + iw = window->width() - qw; + ih = qh; + ix = qw; + iy = 0; +#else + qw = window->width(); + qh = QR_SZ + EdgeTxStyles::STD_FONT_HEIGHT * 2 + PAD_LARGE + PAD_SMALL; + iw = qw; + ih = window->height() - qh; + ix = 0; + iy = qh; +#endif + + auto qrBox = new Window(window, {0, 0, qw, qh}); + qrBox->padAll(PAD_ZERO); + + new StaticText(qrBox, {0, PAD_SMALL, LV_PCT(100), 0}, copyright_str, + COLOR_THEME_SECONDARY1_INDEX, CENTERED); + + new StaticText(qrBox, {0, qh - QR_SZ - PAD_MEDIUM - EdgeTxStyles::STD_FONT_HEIGHT, LV_PCT(100), 0}, + edgetx_url, COLOR_THEME_SECONDARY1_INDEX, CENTERED); + + new QRCode(qrBox, (qw - QR_SZ) / 2, qh - QR_SZ - PAD_MEDIUM, QR_SZ, edgetx_url); + + auto infoBox = new Window(window, {ix, iy, iw, ih}); + infoBox->padAll(PAD_SMALL); + infoBox->padLeft(PAD_LARGE); + infoBox->padRight(PAD_LARGE); std::string nl("\n"); std::string version; @@ -375,14 +412,12 @@ void RadioVersionPage::build(Window* window) version += boardTouchType; #endif - auto txt = new StaticText(window, rect_t{}, version); - lv_obj_set_width(txt->getLvObj(), lv_pct(100)); + new StaticText(infoBox, {0, 0, LV_PCT(100), LV_SIZE_CONTENT}, version); // Module and receivers versions - auto btn = new TextButton(window, rect_t{}, STR_MODULES_RX_VERSION); - btn->setPressHandler([=]() -> uint8_t { - new VersionDialog(); - return 0; - }); - lv_obj_set_width(btn->getLvObj(), lv_pct(100)); + new TextButton(infoBox, {0, ih - EdgeTxStyles::UI_ELEMENT_HEIGHT - PAD_LARGE-PAD_SMALL, LV_PCT(100), 0}, + STR_MODULES_RX_VERSION, [=]() { + new VersionDialog(); + return 0; + }); } diff --git a/radio/src/gui/colorlcd/radio/radio_version.h b/radio/src/gui/colorlcd/radio/radio_version.h index 00e47dcd9..dc5ea558c 100644 --- a/radio/src/gui/colorlcd/radio/radio_version.h +++ b/radio/src/gui/colorlcd/radio/radio_version.h @@ -21,11 +21,14 @@ #pragma once -#include "tabsgroup.h" +#include "pagegroup.h" -class RadioVersionPage: public PageTab { - public: - RadioVersionPage(); +class RadioVersionPage: public PageGroupItem +{ + public: + RadioVersionPage(PageDef& pageDef); - void build(Window * window) override; + void build(Window * window) override; + + static LAYOUT_VAL_SCALED(QR_SZ, 150) }; diff --git a/radio/src/gui/colorlcd/setup_menus/menu_model.cpp b/radio/src/gui/colorlcd/setup_menus/menu_model.cpp new file mode 100644 index 000000000..6535184dc --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/menu_model.cpp @@ -0,0 +1,56 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "edgetx.h" +#include "model_curves.h" +#include "model_flightmodes.h" +#include "model_gvars.h" +#include "model_heli.h" +#include "model_inputs.h" +#include "model_logical_switches.h" +#include "model_mixer_scripts.h" +#include "model_mixes.h" +#include "model_outputs.h" +#include "model_select.h" +#include "model_setup.h" +#include "model_telemetry.h" +#include "special_functions.h" + +PageDef modelMenuItems[] = { + { ICON_MODEL_SETUP, STR_QM_GEN_SETTINGS, STR_MAIN_MENU_SETTINGS, PAGE_CREATE, QuickMenu::MODEL_SETUP, [](PageDef& pageDef) { return new ModelSetupPage(pageDef); }}, +#if defined(FLIGHT_MODES) + { ICON_MODEL_FLIGHT_MODES, STR_QM_FLIGHT_MODES, STR_MENUFLIGHTMODES, PAGE_CREATE, QuickMenu::MODEL_FLIGHTMODES, [](PageDef& pageDef) { return new ModelFlightModesPage(pageDef); }, modelFMEnabled}, +#endif + { ICON_MODEL_INPUTS, STR_QM_INPUTS, STR_MENUINPUTS, PAGE_CREATE, QuickMenu::MODEL_INPUTS, [](PageDef& pageDef) { return new ModelInputsPage(pageDef); }}, + { ICON_MODEL_MIXER, STR_QM_MIXES, STR_MIXES, PAGE_CREATE, QuickMenu::MODEL_MIXES, [](PageDef& pageDef) { return new ModelMixesPage(pageDef); }}, + { ICON_MODEL_OUTPUTS, STR_QM_OUTPUTS, STR_MENULIMITS, PAGE_CREATE, QuickMenu::MODEL_OUTPUTS, [](PageDef& pageDef) { return new ModelOutputsPage(pageDef); }}, + { ICON_MODEL_CURVES, STR_QM_CURVES, STR_MENUCURVES, PAGE_CREATE, QuickMenu::MODEL_CURVES, [](PageDef& pageDef) { return new ModelCurvesPage(pageDef); }, modelCurvesEnabled}, +#if defined(GVARS) + { ICON_MODEL_GVARS, STR_QM_GLOBAL_VARS, STR_MENU_GLOBAL_VARS, PAGE_CREATE, QuickMenu::MODEL_GVARS, [](PageDef& pageDef) { return new ModelGVarsPage(pageDef); }, modelGVEnabled}, +#endif + { ICON_MODEL_LOGICAL_SWITCHES, STR_QM_LOGICAL_SW, STR_MENULOGICALSWITCHES, PAGE_CREATE, QuickMenu::MODEL_LS, [](PageDef& pageDef) { return new ModelLogicalSwitchesPage(pageDef); }, modelSFEnabled}, + { ICON_MODEL_SPECIAL_FUNCTIONS, STR_QM_SPEC_FUNC, STR_MENUCUSTOMFUNC, PAGE_CREATE, QuickMenu::MODEL_SF, [](PageDef& pageDef) { return new SpecialFunctionsPage(pageDef); }, modelSFEnabled}, +#if defined(LUA_MODEL_SCRIPTS) + { ICON_MODEL_LUA_SCRIPTS, STR_QM_CUSTOM_LUA, STR_MENUCUSTOMSCRIPTS, PAGE_CREATE, QuickMenu::MODEL_SCRIPTS, [](PageDef& pageDef) { return new ModelMixerScriptsPage(pageDef); }, modelCustomScriptsEnabled}, +#endif + { ICON_MODEL_TELEMETRY, STR_QM_TELEM, STR_MENUTELEMETRY, PAGE_CREATE, QuickMenu::MODEL_TELEMETRY, [](PageDef& pageDef) { return new ModelTelemetryPage(pageDef); }, modelTelemetryEnabled}, + { EDGETX_ICONS_COUNT } +}; diff --git a/radio/src/gui/colorlcd/setup_menus/menu_radio.cpp b/radio/src/gui/colorlcd/setup_menus/menu_radio.cpp new file mode 100644 index 000000000..473337462 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/menu_radio.cpp @@ -0,0 +1,36 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "edgetx.h" +#include "radio_hardware.h" +#include "radio_setup.h" +#include "radio_trainer.h" +#include "radio_version.h" +#include "special_functions.h" + +PageDef radioMenuItems[] = { + { ICON_RADIO_SETUP, STR_QM_GEN_SETTINGS, STR_MAIN_MENU_SETTINGS, PAGE_CREATE, QuickMenu::RADIO_SETUP, [](PageDef& pageDef) { return new RadioSetupPage(pageDef); }}, + { ICON_RADIO_GLOBAL_FUNCTIONS, STR_QM_GLOB_FUNC, STR_MENUSPECIALFUNCS, PAGE_CREATE, QuickMenu::RADIO_GF, [](PageDef& pageDef) { return new GlobalFunctionsPage(pageDef); }, radioGFEnabled}, + { ICON_RADIO_TRAINER, STR_QM_TRAINER, STR_MENUTRAINER, PAGE_CREATE, QuickMenu::RADIO_TRAINER, [](PageDef& pageDef) { return new RadioTrainerPage(pageDef); }, radioTrainerEnabled}, + { ICON_RADIO_HARDWARE, STR_QM_HARDWARE, STR_HARDWARE, PAGE_CREATE, QuickMenu::RADIO_HARDWARE, [](PageDef& pageDef) { return new RadioHardwarePage(pageDef); }}, + { ICON_RADIO_VERSION, STR_QM_ABOUT, STR_MAIN_MENU_ABOUT_EDGETX, PAGE_CREATE, QuickMenu::RADIO_VERSION, [](PageDef& pageDef) { return new RadioVersionPage(pageDef); }}, + { EDGETX_ICONS_COUNT } +}; diff --git a/radio/src/gui/colorlcd/setup_menus/menu_screen.cpp b/radio/src/gui/colorlcd/setup_menus/menu_screen.cpp new file mode 100644 index 000000000..f1e4b788a --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/menu_screen.cpp @@ -0,0 +1,72 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "edgetx.h" +#include "screen_setup.h" +#include "view_main.h" +#include "quick_menu.h" + +PageDef screensMenuItems[] = { + { ICON_RADIO_EDIT_THEME, STR_QM_THEMES, STR_MAIN_MENU_THEMES, PAGE_CREATE, QuickMenu::UI_THEMES, [](PageDef& pageDef) { return new ThemeSetupPage(pageDef); }, radioThemesEnabled}, + { ICON_THEME_SETUP, STR_QM_TOP_BAR, STR_USER_INTERFACE, PAGE_CREATE, QuickMenu::UI_SETUP, [](PageDef& pageDef) { return new ScreenUserInterfacePage(pageDef); }}, + { ICON_THEME_VIEW1, STR_QM_SCREEN_1, TR_MAIN_VIEW_X "1", PAGE_CREATE, QuickMenu::UI_SCREEN1, [](PageDef& pageDef) { return new ScreenSetupPage(0, pageDef); }}, + { ICON_THEME_VIEW2, STR_QM_SCREEN_2, TR_MAIN_VIEW_X "2", PAGE_CREATE, QuickMenu::UI_SCREEN2, [](PageDef& pageDef) { return new ScreenSetupPage(1, pageDef); }, []() { return customScreens[1] != nullptr; }}, + { ICON_THEME_VIEW3, STR_QM_SCREEN_3, TR_MAIN_VIEW_X "3", PAGE_CREATE, QuickMenu::UI_SCREEN3, [](PageDef& pageDef) { return new ScreenSetupPage(2, pageDef); }, []() { return customScreens[2] != nullptr; }}, + { ICON_THEME_VIEW4, STR_QM_SCREEN_4, TR_MAIN_VIEW_X "4", PAGE_CREATE, QuickMenu::UI_SCREEN4, [](PageDef& pageDef) { return new ScreenSetupPage(3, pageDef); }, []() { return customScreens[3] != nullptr; }}, + { ICON_THEME_VIEW5, STR_QM_SCREEN_5, TR_MAIN_VIEW_X "5", PAGE_CREATE, QuickMenu::UI_SCREEN5, [](PageDef& pageDef) { return new ScreenSetupPage(4, pageDef); }, []() { return customScreens[4] != nullptr; }}, + { ICON_THEME_VIEW6, STR_QM_SCREEN_6, TR_MAIN_VIEW_X "6", PAGE_CREATE, QuickMenu::UI_SCREEN6, [](PageDef& pageDef) { return new ScreenSetupPage(5, pageDef); }, []() { return customScreens[5] != nullptr; }}, + { ICON_THEME_VIEW7, STR_QM_SCREEN_7, TR_MAIN_VIEW_X "7", PAGE_CREATE, QuickMenu::UI_SCREEN7, [](PageDef& pageDef) { return new ScreenSetupPage(6, pageDef); }, []() { return customScreens[6] != nullptr; }}, + { ICON_THEME_VIEW8, STR_QM_SCREEN_8, TR_MAIN_VIEW_X "8", PAGE_CREATE, QuickMenu::UI_SCREEN8, [](PageDef& pageDef) { return new ScreenSetupPage(7, pageDef); }, []() { return customScreens[7] != nullptr; }}, + { ICON_THEME_VIEW9, STR_QM_SCREEN_9, TR_MAIN_VIEW_X "9", PAGE_CREATE, QuickMenu::UI_SCREEN9, [](PageDef& pageDef) { return new ScreenSetupPage(8, pageDef); }, []() { return customScreens[8] != nullptr; }}, + { ICON_THEME_VIEW10, STR_QM_SCREEN_10, TR_MAIN_VIEW_X "10", PAGE_CREATE, QuickMenu::UI_SCREEN10, [](PageDef& pageDef) { return new ScreenSetupPage(9, pageDef); }, []() { return customScreens[9] != nullptr; }}, + { ICON_THEME_ADD_VIEW, STR_QM_ADD_SCREEN, nullptr, PAGE_ACTION, QuickMenu::UI_ADD_PG, nullptr, []() { return customScreens[9] == nullptr; }, + [](QuickSubMenu* subMenu) { + int newIdx = 1; + for (; newIdx < MAX_CUSTOM_SCREENS; newIdx += 1) + if (customScreens[newIdx] == nullptr) + break; + + TRACE("Add screen: add screen: newIdx = %d", newIdx); + + auto& screen = customScreens[newIdx]; + auto& screenData = g_model.screenData[newIdx]; + + const LayoutFactory* factory = defaultLayout; + if (factory) { + TRACE("Add screen: add screen: factory = %p", factory); + + auto viewMain = ViewMain::instance(); + screen = factory->create(viewMain, &screenData.layoutData); + viewMain->addMainView(screen, newIdx); + + strncpy(screenData.LayoutId, factory->getId(), + sizeof(screenData.LayoutId)); + TRACE("Add screen: add screen: LayoutId = %s", + screenData.LayoutId); + + subMenu->onPress(newIdx + ScreenSetupPage::FIRST_SCREEN_OFFSET); + } else { + TRACE("Add screen: factory is NULL"); + } + } + }, + { EDGETX_ICONS_COUNT } +}; diff --git a/radio/src/gui/colorlcd/setup_menus/menu_tools.cpp b/radio/src/gui/colorlcd/setup_menus/menu_tools.cpp new file mode 100644 index 000000000..c035fb9e1 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/menu_tools.cpp @@ -0,0 +1,53 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "edgetx.h" +#include "radio_sdmanager.h" +#include "radio_tools.h" +#include "view_statistics.h" +#include "view_logical_switches.h" +#include "view_channels.h" + +PageDef toolsMenuItems[] = { + { ICON_TOOLS_APPS, STR_QM_APPS, STR_MAIN_MENU_APPS, PAGE_CREATE, QuickMenu::TOOLS_APPS, [](PageDef& pageDef) { return new RadioToolsPage(pageDef); }}, + { ICON_RADIO_SD_MANAGER, STR_QM_STORAGE, STR_SD_CARD, PAGE_CREATE, QuickMenu::TOOLS_STORAGE, [](PageDef& pageDef) { return new RadioSdManagerPage(pageDef); }}, + { ICON_TOOLS_RESET, STR_QM_RESET, nullptr, PAGE_ACTION, QuickMenu::TOOLS_RESET, nullptr, nullptr, + [](QuickSubMenu* subMenu) { + subMenu->onSelect(true); + Menu* resetMenu = new Menu(); + resetMenu->addLine(STR_RESET_FLIGHT, []() { flightReset(); }); + resetMenu->addLine(STR_RESET_TIMER1, []() { timerReset(0); }); + resetMenu->addLine(STR_RESET_TIMER2, []() { timerReset(1); }); + resetMenu->addLine(STR_RESET_TIMER3, []() { timerReset(2); }); + resetMenu->addLine(STR_RESET_TELEMETRY, []() { telemetryReset(); }); + } + }, + { ICON_MONITOR, STR_QM_CHAN_MON, nullptr, PAGE_ACTION, QuickMenu::TOOLS_CHAN_MON, nullptr, nullptr, + [](QuickSubMenu* subMenu) { + subMenu->onSelect(true); + new ChannelsViewMenu(); + } + }, + { ICON_MONITOR_LOGICAL_SWITCHES, STR_QM_LS_MON, STR_MONITOR_SWITCHES, PAGE_CREATE, QuickMenu::TOOLS_LS_MON, [](PageDef& pageDef) { return new LogicalSwitchesViewPage(pageDef); }}, + { ICON_STATS, STR_QM_STATS, STR_MAIN_MENU_STATISTICS, PAGE_CREATE, QuickMenu::TOOLS_STATS, [](PageDef& pageDef) { return new StatisticsViewPage(pageDef); }}, + { ICON_STATS_DEBUG, STR_QM_DEBUG, STR_DEBUG, PAGE_CREATE, QuickMenu::TOOLS_DEBUG, [](PageDef& pageDef) { return new DebugViewPage(pageDef); }}, + { EDGETX_ICONS_COUNT } +}; diff --git a/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp b/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp new file mode 100644 index 000000000..0b20d9997 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/pagegroup.cpp @@ -0,0 +1,446 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "pagegroup.h" + +#include "theme_manager.h" +#include "etx_lv_theme.h" +#include "view_main.h" +#include "topbar_impl.h" +#include "model_select.h" +#include "os/time.h" +#include "view_channels.h" +#include "screen_setup.h" +#include "keyboard_base.h" + +#if defined(DEBUG) +static uint32_t dsms, dems, end_ms, start_ms; +static bool timepg = false; + +static void on_draw_begin(lv_event_t* e) +{ + if (timepg) { + dsms = time_get_ms(); + } +} +static void on_draw_end(lv_event_t* e) +{ + timepg = false; + dems = time_get_ms(); + TRACE("tab time: build %ld layout %ld draw %ld total %ld", + end_ms - start_ms, dsms - end_ms, dems - dsms, dems - start_ms); +} +#endif + +//----------------------------------------------------------------------------- + +PageGroupHeaderBase::PageGroupHeaderBase(Window* parent, coord_t height, EdgeTxIcon icon, const char* parentTitle, PageGroupBase* menu) : + Window(parent, {0, 0, LCD_W, height}), menu(menu) +{ + etx_solid_bg(lvobj, COLOR_THEME_SECONDARY1_INDEX); + + hdrIcon = new HeaderIcon(this, icon); + + new HeaderBackIcon(this); + + parentLabel = lv_label_create(lvobj); + etx_txt_color(parentLabel, COLOR_THEME_PRIMARY2_INDEX); + lv_obj_set_pos(parentLabel, PageGroup::PAGE_TOP_BAR_H + PAD_LARGE, PageHeader::PAGE_TITLE_TOP); + lv_obj_set_size(parentLabel, LCD_W - PageGroup::PAGE_TOP_BAR_H * 4 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT); + lv_label_set_text(parentLabel, parentTitle); + + titleLabel = lv_label_create(lvobj); + etx_txt_color(titleLabel, COLOR_THEME_PRIMARY2_INDEX); + lv_obj_set_pos(titleLabel, PageGroup::PAGE_TOP_BAR_H + PAD_LARGE, PageHeader::PAGE_TITLE_TOP + EdgeTxStyles::STD_FONT_HEIGHT); + lv_obj_set_size(titleLabel, LCD_W - PageGroup::PAGE_TOP_BAR_H * 4 - PAD_LARGE * 2, EdgeTxStyles::STD_FONT_HEIGHT); + setTitle(""); +} + +void PageGroupHeaderBase:: setTitle(const char* title) +{ + if (titleLabel) lv_label_set_text(titleLabel, title); +} + +void PageGroupHeaderBase::setIcon(EdgeTxIcon newIcon) +{ + hdrIcon->setIcon(newIcon); +} + +void PageGroupHeaderBase::addTab(PageGroupItem* page) +{ + pages.emplace_back(page); +} + +bool PageGroupHeaderBase::hasSubMenu(QuickMenu::SubMenu subMenu) +{ + for (uint8_t i = 0; i < pages.size(); i += 1) { + if (pages[i]->subMenu() == subMenu) + return true; + } + return false; +} + +//----------------------------------------------------------------------------- + +class PageGroupHeader : public PageGroupHeaderBase +{ + public: + PageGroupHeader(PageGroup* menu, EdgeTxIcon icon, const char* parentTitle) : + PageGroupHeaderBase(menu, PageGroup::PAGE_TOP_BAR_H, icon, parentTitle, menu) + { + } + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "PageGroupHeader"; } +#endif + + void chgTab(int dir) override + { + int idx = currentIndex; + do { + idx += dir; + if (idx < 0) idx = pages.size() - 1; + if (idx >= (int)pages.size()) idx = 0; + } while (!pages[idx]->isVisible()); + menu->setCurrentTab(idx); + } + + void removeTab(unsigned index) override + { + auto pg = pages[index]; + pages.erase(pages.begin() + index); + delete pg; + updateLayout(); + } + + void updateLayout() + { + for (uint8_t i = 0; i < pages.size(); i += 1) { + pages[i]->update(i); + } + } + + protected: + void checkEvents() override + { + updateLayout(); + Window::checkEvents(); + } +}; + +//----------------------------------------------------------------------------- + +PageGroupBase::PageGroupBase(coord_t bodyY, EdgeTxIcon icon) : + NavWindow(MainWindow::instance(), {0, 0, LCD_W, LCD_H}), icon(icon) +{ + etx_solid_bg(lvobj); + + Layer::back()->hide(); + Layer::push(this); + + body = new Window(this, {0, bodyY, LCD_W, LCD_H - bodyY}); + body->setWindowFlag(NO_FOCUS); + lv_obj_set_style_max_height(body->getLvObj(), LCD_H - bodyY, LV_PART_MAIN); + etx_scrollbar(body->getLvObj()); + +#if defined(DEBUG) + lv_obj_add_event_cb(lvobj, on_draw_begin, LV_EVENT_COVER_CHECK, nullptr); + lv_obj_add_event_cb(lvobj, on_draw_end, LV_EVENT_DRAW_POST_END, nullptr); +#endif +} + +void PageGroupBase::checkEvents() +{ + if (deleted()) return; + + Window::checkEvents(); + if (currentTab) { + currentTab->checkEvents(); + } + ViewMain::instance()->runBackground(); +} + +void PageGroupBase::deleteLater(bool detach, bool trash) +{ + if (_deleted) return; + + Layer::pop(this); + Layer::back()->show(); + + Window::deleteLater(detach, trash); +} + +void PageGroupBase::onClicked() { Keyboard::hide(false); } + +void PageGroupBase::onCancel() +{ + if (quickMenu) quickMenu->closeMenu(); + quickMenu = nullptr; + deleteLater(); +} + +uint8_t PageGroupBase::tabCount() const +{ + return header->tabCount(); +} + +void PageGroupBase::addTab(PageGroupItem* page) +{ + header->addTab(page); + if (!currentTab) { + setCurrentTab(0); + } +} + +void PageGroupBase::setCurrentTab(unsigned index) +{ + if (deleted()) return; + + header->setCurrentIndex(index); + + PageGroupItem* tab = header->pageTab(index); + + if (tab != currentTab && !deleted()) { + header->setTitle(tab->getTitle().c_str()); + header->setIcon(tab->getIcon()); + + lv_obj_enable_style_refresh(false); + + body->clear(); + if (currentTab) + currentTab->cleanup(); + currentTab = tab; + +#if defined(DEBUG) + start_ms = time_get_ms(); + timepg = true; +#endif + + static lv_style_prop_t remStyles[] = { + LV_STYLE_FLEX_FLOW, LV_STYLE_LAYOUT, LV_STYLE_PAD_ROW, + LV_STYLE_PAD_COLUMN, LV_STYLE_PAD_LEFT, LV_STYLE_PAD_RIGHT, + LV_STYLE_PAD_TOP, LV_STYLE_PAD_BOTTOM}; + for (uint8_t i = 0; i < DIM(remStyles); i += 1) + lv_obj_remove_local_style_prop(body->getLvObj(), remStyles[i], + LV_PART_MAIN); + + body->padAll(tab->getPadding()); + + tab->build(body); + + lv_obj_enable_style_refresh(true); + lv_obj_refresh_style(body->getLvObj(), LV_PART_ANY, LV_STYLE_PROP_ANY); + +#if defined(DEBUG) + end_ms = time_get_ms(); +#endif + } +} + +#if defined(HARDWARE_KEYS) +void PageGroupBase::onPressSYS() +{ + if (!quickMenu) openMenu(); +} + +void PageGroupBase::onLongPressSYS() +{ + if (icon == ICON_RADIO) { + setCurrentTab(0); + } else { + onCancel(); + PageGroup::RadioMenu(); + } +} + +void PageGroupBase::onPressMDL() +{ + if (icon == ICON_MODEL) { + setCurrentTab(0); + } else { + onCancel(); + PageGroup::ModelMenu(); + } +} + +void PageGroupBase::onLongPressMDL() +{ + onCancel(); + new ModelLabelsWindow(); +} + +void PageGroupBase::onPressTELE() +{ + if (icon != ICON_THEME) { + onCancel(); + (PageGroup::ScreenMenu())->setCurrentTab(ViewMain::instance()->getCurrentMainView() + ScreenSetupPage::FIRST_SCREEN_OFFSET); + } +} + +void PageGroupBase::onLongPressTELE() +{ + if (icon != ICON_MONITOR) { + onCancel(); + new ChannelsViewMenu(); + } +} + +void PageGroupBase::onPressPGUP() { header->prevTab(); } +void PageGroupBase::onPressPGDN() { header->nextTab(); } +void PageGroupBase::onLongPressPGUP() { header->prevTab(); } +void PageGroupBase::onLongPressPGDN() { header->nextTab(); } +void PageGroupBase::onLongPressRTN() { onCancel(); } +#endif + +bool PageGroupBase::hasSubMenu(QuickMenu::SubMenu subMenu) +{ + return header->hasSubMenu(subMenu); +} + +//----------------------------------------------------------------------------- + +PageGroup::PageGroup(EdgeTxIcon icon, const char* title, PageDef* pages) : + PageGroupBase(PAGE_TOP_BAR_H, icon) +{ + header = new PageGroupHeader(this, icon, title); + + for (int i = 0; pages[i].icon < EDGETX_ICONS_COUNT; i += 1) { + if (pages[i].create) + addTab(pages[i].create(pages[i])); + } + +#if defined(HARDWARE_TOUCH) + addCustomButton(0, 0, [=]() { openMenu(); }); + addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); }); +#endif + + setCloseHandler([]{ + storageCheck(true); + ViewMain::instance()->updateTopbarVisibility(); + }); +} + +void PageGroup::removeTab(unsigned index) +{ + if (header->isCurrent(index)) + setCurrentTab(max(0, index - 1)); + header->removeTab(index); +} + +void PageGroup::openMenu() +{ + quickMenu = QuickMenu::openQuickMenu([=]() { quickMenu = nullptr; }, + [=](bool close) { + if (close) + onCancel(); + }, this, currentTab->subMenu()); +} + +PageGroup* PageGroup::ScreenMenu() { return new PageGroup(ICON_THEME, STR_MAIN_MENU_SCREEN_SETTINGS, screensMenuItems); } +PageGroup* PageGroup::RadioMenu() { return new PageGroup(ICON_RADIO, STR_MAIN_MENU_RADIO_SETTINGS, radioMenuItems); } +PageGroup* PageGroup::ModelMenu() { return new PageGroup(ICON_MODEL, STR_MAIN_MENU_MODEL_SETTINGS, modelMenuItems); } + +//----------------------------------------------------------------------------- + +class TabsGroupHeader : public PageGroupHeaderBase +{ + public: + TabsGroupHeader(TabsGroup* menu, EdgeTxIcon icon, const char* parentTitle) : + PageGroupHeaderBase(menu, TabsGroup::TABS_GROUP_BODY_Y, icon, parentTitle, menu) + { +#if PORTRAIT + lv_obj_set_pos(parentLabel, PageGroup::PAGE_TOP_BAR_H + PAD_LARGE, PAD_MEDIUM * 2); + lv_obj_set_size(parentLabel, LCD_W - PageGroup::PAGE_TOP_BAR_H * 2 - PAD_LARGE * 2, PageGroup::PAGE_TOP_BAR_H - PAD_MEDIUM * 2); + + auto sep = lv_obj_create(lvobj); + etx_solid_bg(sep); + lv_obj_set_pos(sep, 0, EdgeTxStyles::MENU_HEADER_HEIGHT); + lv_obj_set_size(sep, LCD_W, TabsGroup::PAGE_TOP_BAR_H - EdgeTxStyles::MENU_HEADER_HEIGHT); + + lv_obj_set_style_pad_left(titleLabel, PAD_MEDIUM, LV_PART_MAIN); + lv_obj_set_style_pad_top(titleLabel, 1, LV_PART_MAIN); + lv_obj_set_pos(titleLabel, 0, TabsGroup::PAGE_TOP_BAR_H); + lv_obj_set_size(titleLabel, LCD_W, TabsGroup::PAGE_ALT_TITLE_H); +#endif + + new IconButton(this, ICON_BTN_PREV, LCD_W - PageGroup::PAGE_TOP_BAR_H * 3, PAD_MEDIUM, [=]() { + prevTab(); + return 0; + }); + + new IconButton(this, ICON_BTN_NEXT, LCD_W - PageGroup::PAGE_TOP_BAR_H * 2, PAD_MEDIUM, [=]() { + nextTab(); + return 0; + }); + } + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "TabsGroupHeader"; } +#endif + + void chgTab(int dir) override + { + int idx = currentIndex; + idx += dir; + if (idx < 0) idx = pages.size() - 1; + else if (idx >= (int)pages.size()) idx = 0; + menu->setCurrentTab(idx); + } + + protected: +}; + +//----------------------------------------------------------------------------- + +TabsGroup::TabsGroup(EdgeTxIcon icon, const char* parentLabel) : + PageGroupBase(TABS_GROUP_BODY_Y, icon) +{ + header = new TabsGroupHeader(this, icon, parentLabel); + +#if defined(HARDWARE_TOUCH) + addCustomButton(0, 0, [=]() { openMenu(); }); + addCustomButton(LCD_W - EdgeTxStyles::MENU_HEADER_HEIGHT, 0, [=]() { onCancel(); }); +#endif +} + +void TabsGroup::openMenu() +{ + PageGroup* p = nullptr; + QuickMenu::SubMenu subMenu = QuickMenu::NONE; + Window* w = Layer::walk([=](Window *w) mutable -> bool { + return w->isPageGroup(); + }); + if (w) { + p = (PageGroup*)w; + subMenu = p->getCurrentTab()->subMenu(); + } + quickMenu = QuickMenu::openQuickMenu([=]() { quickMenu = nullptr; }, + [=](bool close) { + onCancel(); + if (p) { + while (!Layer::back()->isPageGroup()) { + Layer::back()->deleteLater(); + } + if (close) + Layer::back()->onCancel(); + } + }, p, subMenu); +} diff --git a/radio/src/gui/colorlcd/setup_menus/pagegroup.h b/radio/src/gui/colorlcd/setup_menus/pagegroup.h new file mode 100644 index 000000000..dcad52a08 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/pagegroup.h @@ -0,0 +1,228 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#pragma once + +#include "bitmaps.h" +#include "quick_menu.h" + +class HeaderIcon; +class PageGroupItem; +class PageGroupBase; + +//----------------------------------------------------------------------------- + +enum PageDefAction { + PAGE_CREATE, + PAGE_ACTION +}; + +struct PageDef { + EdgeTxIcon icon; + const char* qmTitle; + const char* title; + PageDefAction pageAction; + QuickMenu::SubMenu subMenu; + std::function create; + std::function enabled; + std::function action; +}; + +extern PageDef modelMenuItems[]; +extern PageDef radioMenuItems[]; +extern PageDef screensMenuItems[]; +extern PageDef toolsMenuItems[]; + +//----------------------------------------------------------------------------- + +class PageGroupItem +{ + public: + PageGroupItem(std::string title, QuickMenu::SubMenu subMenu = QuickMenu::NONE) : + title(std::move(title)), icon(ICON_EDGETX), quickMenuId(subMenu), padding(PAD_SMALL) + {} + + PageGroupItem(PageDef& pageDef, PaddingSize padding = PAD_SMALL) : + title(std::move(pageDef.title)), icon(pageDef.icon), quickMenuId(pageDef.subMenu), + padding(padding) + {} + + virtual ~PageGroupItem() = default; + + virtual bool isVisible() const { return true; } + + virtual void build(Window* window) = 0; + + virtual void checkEvents() {} + + void setTitle(std::string value) { title = std::move(value); } + std::string getTitle() const { return title; } + + void setIcon(EdgeTxIcon icon) { this->icon = icon; } + EdgeTxIcon getIcon() const { return icon; } + + PaddingSize getPadding() const { return padding; } + + virtual void update(uint8_t index) {} + virtual void cleanup() {} + + QuickMenu::SubMenu subMenu() const { return quickMenuId; } + + protected: + std::string title; + EdgeTxIcon icon; + QuickMenu::SubMenu quickMenuId = QuickMenu::NONE; + PaddingSize padding; +}; + +//----------------------------------------------------------------------------- + +class PageGroupHeaderBase : public Window +{ + public: + PageGroupHeaderBase(Window* parent, coord_t height, EdgeTxIcon icon, const char* parentTitle, PageGroupBase* menu); + + void setTitle(const char* title); + void setIcon(EdgeTxIcon newIcon); + + virtual void chgTab(int dir) = 0; + + void nextTab() { chgTab(1); } + void prevTab() { chgTab(-1); } + + virtual void removeTab(unsigned index) {} + void addTab(PageGroupItem* page); + + void setCurrentIndex(uint8_t index) + { + if (index < pages.size()) { + currentIndex = index; + } + } + + bool hasSubMenu(QuickMenu::SubMenu n); + + PageGroupItem* pageTab(uint8_t idx) const { return pages[idx]; } + bool isCurrent(uint8_t idx) const { return currentIndex == idx; } + uint8_t tabCount() const { return pages.size(); } + + protected: + uint8_t currentIndex = 0; + lv_obj_t* titleLabel = nullptr; + lv_obj_t* parentLabel = nullptr; + HeaderIcon* hdrIcon = nullptr; + std::vector pages; + PageGroupBase* menu; +}; + +//----------------------------------------------------------------------------- + +class PageGroupBase : public NavWindow +{ + public: + PageGroupBase(coord_t bodyY, EdgeTxIcon icon); + + void setCurrentTab(unsigned index); + + void onClicked() override; + void onCancel() override; + + uint8_t tabCount() const; + + void addTab(PageGroupItem* page); + + bool hasSubMenu(QuickMenu::SubMenu n); + + protected: + PageGroupHeaderBase* header = nullptr; + Window* body = nullptr; + PageGroupItem* currentTab = nullptr; + QuickMenu* quickMenu = nullptr; + EdgeTxIcon icon; + + virtual void openMenu() = 0; + + void checkEvents() override; + + void deleteLater(bool detach = true, bool trash = true) override; + +#if defined(HARDWARE_KEYS) + void onPressSYS() override; + void onLongPressSYS() override; + void onPressMDL() override; + void onLongPressMDL() override; + void onPressTELE() override; + void onLongPressTELE() override; + void onPressPGUP() override; + void onPressPGDN() override; + void onLongPressPGUP() override; + void onLongPressPGDN() override; + void onLongPressRTN() override; +#endif +}; + +//----------------------------------------------------------------------------- + +class PageGroup : public PageGroupBase +{ + public: + explicit PageGroup(EdgeTxIcon icon, const char* title, PageDef* pages); + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "PageGroup"; } +#endif + + void removeTab(unsigned index); + + PageGroupItem* getCurrentTab() const { return currentTab; } + + bool isPageGroup() override { return true; } + + static PageGroup* ScreenMenu(); + static PageGroup* RadioMenu(); + static PageGroup* ModelMenu(); + + static LAYOUT_VAL_SCALED(PAGE_TOP_BAR_H, 45) + + protected: + + void openMenu() override; +}; + +//----------------------------------------------------------------------------- + +class TabsGroup : public PageGroupBase +{ + public: + explicit TabsGroup(EdgeTxIcon icon, const char* parentTitle); + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "TabsGroup"; } +#endif + + static LAYOUT_ORIENTATION_SCALED(PAGE_TOP_BAR_H, 45, 48) + static LAYOUT_ORIENTATION(PAGE_ALT_TITLE_H, 0, EdgeTxStyles::STD_FONT_HEIGHT) + static constexpr coord_t TABS_GROUP_BODY_Y = PAGE_TOP_BAR_H + PAGE_ALT_TITLE_H; + + protected: + + void openMenu() override; +}; diff --git a/radio/src/gui/colorlcd/setup_menus/quick_menu.cpp b/radio/src/gui/colorlcd/setup_menus/quick_menu.cpp new file mode 100644 index 000000000..e1102a2ab --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/quick_menu.cpp @@ -0,0 +1,341 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "quick_menu.h" + +#include "model_select.h" +#include "edgetx.h" +#include "quick_menu_group.h" +#include "etx_lv_theme.h" +#include "view_text.h" +#include "view_main.h" +#include "screen_setup.h" +#include "theme_manager.h" +#include "view_channels.h" + +//----------------------------------------------------------------------------- + +ButtonBase* QuickSubMenu::addButton() +{ + menuButton = quickMenu->getTopMenu()->addButton(icon, title, + [=]() -> uint8_t { + if (!subMenu) buildSubMenu(); + quickMenu->getTopMenu()->setCurrent(menuButton); + quickMenu->getTopMenu()->setDisabled(false); + quickMenu->getTopMenu()->clearFocus(); + enableSubMenu(); + return 0; + }); + + menuButton->setFocusHandler([=](bool focus) { + if (!quickMenu->deleted()) { + if (focus) { + if (!subMenu) buildSubMenu(); + quickMenu->getTopMenu()->setCurrent(menuButton); + } + if (subMenu) + subMenu->show(focus); + if (!focus && quickMenu->getTopMenu()) + quickMenu->getTopMenu()->setGroup(); + } + }); + + return menuButton; +} + +bool QuickSubMenu::isSubMenu(QuickMenu::SubMenu n) +{ + for (int i = 0; items[i].icon < EDGETX_ICONS_COUNT; i += 1) + if (items[i].subMenu == n) return true; + return false; +} + +int QuickSubMenu::getIndex(QuickMenu::SubMenu n) +{ + for (int i = 0; items[i].icon < EDGETX_ICONS_COUNT; i += 1) + if (items[i].subMenu == n) return i; + return -1; +} + +void QuickSubMenu::enableSubMenu() +{ + subMenu->setGroup(); + subMenu->setFocus(); + subMenu->setEnabled(); + subMenu->show(); + quickMenu->enableSubMenu(); +} + +void QuickSubMenu::setDisabled(bool all) +{ + if (subMenu) + subMenu->setDisabled(all); +} + +void QuickSubMenu::setCurrent(QuickMenu::SubMenu n) +{ + if (!subMenu) buildSubMenu(); + quickMenu->getTopMenu()->setCurrent(menuButton); + quickMenu->getTopMenu()->setDisabled(false); + subMenu->setCurrent(getIndex(n)); + enableSubMenu(); +} + +void QuickSubMenu::doLayout() +{ + if (subMenu) + subMenu->doLayout(QuickMenu::QM_SUB_COLS); +} + +void QuickSubMenu::buildSubMenu() +{ + subMenu = new QuickMenuGroup(parent); + + for (int i = 0; items[i].icon < EDGETX_ICONS_COUNT; i += 1) { + subMenu->addButton(items[i].icon, items[i].qmTitle, + std::bind(&QuickSubMenu::onPress, this, i), + [=]() { return items[i].enabled ? items[i].enabled() : true; }, + [=]() { QuickMenu::setCurrentPage(items[i].subMenu); }); + } + + doLayout(); + subMenu->hide(); + subMenu->setDisabled(true); +} + +int QuickSubMenu::getPageNumber(int iconNumber) +{ + int pageNumber = 0; + for (int i = 0; i < iconNumber; i += 1) + if (items[i].pageAction == PAGE_CREATE) + pageNumber += 1; + return pageNumber; +} + +uint8_t QuickSubMenu::onPress(int n) +{ + if (items[n].pageAction == PAGE_CREATE) { + quickMenu->getTopMenu()->clearFocus(); + int pgIdx = getPageNumber(n); + if (quickMenu->getPageGroup() && quickMenu->getPageGroup()->hasSubMenu(items[n].subMenu)) { + quickMenu->onSelect(false); + quickMenu->getPageGroup()->setCurrentTab(pgIdx); + } else { + quickMenu->onSelect(true); + auto pg = new PageGroup(icon, parentTitle, items); + pg->setCurrentTab(pgIdx); + } + } else { + quickMenu->getTopMenu()->setCurrent(menuButton); + quickMenu->getTopMenu()->setDisabled(false); + quickMenu->getTopMenu()->clearFocus(); + enableSubMenu(); + items[n].action(this); + } + return 0; +} + +void QuickSubMenu::onSelect(bool close) +{ + quickMenu->onSelect(close); +} + +//----------------------------------------------------------------------------- + +QuickMenu* QuickMenu::instance = nullptr; +QuickMenu::SubMenu QuickMenu::curPage = QuickMenu::NONE; + +QuickMenu* QuickMenu::openQuickMenu(std::function cancelHandler, + std::function selectHandler, + PageGroupBase* pageGroup, SubMenu curPage) +{ + if (!instance) { + instance = new QuickMenu(); + } + instance->openQM(cancelHandler, selectHandler, pageGroup, curPage); + return instance; +} + +QuickMenu::QuickMenu() : + NavWindow(MainWindow::instance(), {0, 0, LCD_W, LCD_H}) +{ + setWindowFlag(OPAQUE); + + etx_obj_add_style(lvobj, styles->bg_opacity_90, LV_PART_MAIN); + etx_bg_color(lvobj, COLOR_BLACK_INDEX); + + auto sep = lv_obj_create(lvobj); + etx_solid_bg(sep, COLOR_WHITE_INDEX); + lv_obj_set_size(sep, LCD_W, PAD_THREE); + + auto mask = getBuiltinIcon(ICON_TOP_LOGO); + new StaticIcon(this, (LCD_W - mask->width) / 2, 0, ICON_TOP_LOGO, COLOR_WHITE_INDEX); + + new ButtonBase( + this, {0, 0, LCD_W, EdgeTxStyles::UI_ELEMENT_HEIGHT}, + [=]() -> uint8_t { + inSubMenu = false; + onCancel(); + return 0; + }, + window_create); + + auto box = new Window(this, {QM_MAIN_X, QM_MAIN_Y, QM_MAIN_W, QM_MAIN_H}); + + mainMenu = new QuickMenuGroup(box); + + mainMenu->addButton(ICON_MODEL_SELECT, STR_QM_MANAGE_MODELS, + [=]() -> uint8_t { + onSelect(true); + new ModelLabelsWindow(); + return 0; + }); + + box = new Window(this, {QM_SUB_X, QM_SUB_Y, QM_SUB_W, QM_SUB_H}); + + QuickSubMenu* sub; + + sub = new QuickSubMenu(box, this, ICON_MODEL, STR_QM_MODEL_SETUP, STR_MAIN_MENU_MODEL_SETTINGS, modelMenuItems); + sub->addButton(); + subMenus.emplace_back(sub); + + sub = new QuickSubMenu(box, this, ICON_RADIO, STR_QM_RADIO_SETUP, STR_MAIN_MENU_RADIO_SETTINGS, radioMenuItems); + sub->addButton(); + subMenus.emplace_back(sub); + + sub = new QuickSubMenu(box, this, ICON_THEME, STR_QM_UI_SETUP, STR_MAIN_MENU_SCREEN_SETTINGS, screensMenuItems); + sub->addButton(); + subMenus.emplace_back(sub); + + sub = new QuickSubMenu(box, this, ICON_RADIO_TOOLS, STR_QM_TOOLS, STR_QM_TOOLS, toolsMenuItems); + sub->addButton(); + subMenus.emplace_back(sub); + + mainMenu->addButton(ICON_MODEL_NOTES, STR_MAIN_MENU_MODEL_NOTES, + [=]() -> uint8_t { + onSelect(true); + readModelNotes(true); + return 0; + }, + [=]() -> bool { + return modelHasNotes(); + }); +} + +void QuickMenu::deleteLater(bool detach, bool trash) +{ + if (_deleted) return; + + instance = nullptr; + Window::deleteLater(detach, trash); +} + +void QuickMenu::openQM(std::function cancelHandler, + std::function selectHandler, + PageGroupBase* newPageGroup, SubMenu newCurPage) +{ + Layer::push(this); + + mainMenu->doLayout(QM_MAIN_COLS); + for (size_t i = 0; i < subMenus.size(); i += 1) + subMenus[i]->doLayout(); + + this->cancelHandler = std::move(cancelHandler); + this->selectHandler = std::move(selectHandler); + show(); + lv_obj_move_foreground(lvobj); + if (newPageGroup) { + pageGroup = newPageGroup; + curPage = newCurPage; + mainMenu->setDisabled(false); + mainMenu->clearFocus(); + setFocus(curPage); + } else { + pageGroup = nullptr; + if (curPage > QuickMenu::MANAGE_MODELS) { + mainMenu->setDisabled(false); + mainMenu->clearFocus(); + setFocus(curPage); + } else { + if (curPage == QuickMenu::MANAGE_MODELS) + mainMenu->setCurrent(0); + focusMainMenu(); + } + } +} + +void QuickMenu::focusMainMenu() +{ + inSubMenu = false; + mainMenu->setFocus(); + mainMenu->setEnabled(); + mainMenu->setGroup(); + for(auto sub : subMenus) + sub->setDisabled(true); +} + +void QuickMenu::onSelect(bool close) +{ + closeMenu(); + if (selectHandler) selectHandler(close); +} + +void QuickMenu::closeMenu() +{ + Layer::pop(this); + hide(); + if (cancelHandler) cancelHandler(); +} + +void QuickMenu::onCancel() +{ + if (inSubMenu) { + focusMainMenu(); + curPage = QuickMenu::NONE; + } else { + closeMenu(); + } +} + +void QuickMenu::setFocus(SubMenu selection) +{ + for(auto sub : subMenus) { + if (sub->isSubMenu(selection)) { + sub->setCurrent(selection); + return; + } + } +} + +void QuickMenu::enableSubMenu() +{ + inSubMenu = true; +} + +#if defined(HARDWARE_KEYS) +void QuickMenu::onPressSYS() { closeMenu(); } +// void QuickMenu::onLongPressSYS() { subMenus[1]->onPress(0); } +// void QuickMenu::onPressMDL() { subMenus[0]->onPress(0); } +// void QuickMenu::onLongPressMDL() { onSelect(true); new ModelLabelsWindow(); } +// void QuickMenu::onPressTELE() { subMenus[2]->onPress(ScreenSetupPage::FIRST_SCREEN_OFFSET); } +// void QuickMenu::onLongPressTELE() { onSelect(true); new ChannelsViewMenu(); } +// void QuickMenu::onLongPressRTN() { onCancel(); } +#endif diff --git a/radio/src/gui/colorlcd/setup_menus/quick_menu.h b/radio/src/gui/colorlcd/setup_menus/quick_menu.h new file mode 100644 index 000000000..0f5244a32 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/quick_menu.h @@ -0,0 +1,187 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#pragma once + +#include "window.h" +#include "bitmaps.h" +#include +#include "quick_menu_group.h" + +class PageGroup; +class PageGroupBase; +class ButtonBase; +class QuickSubMenu; +struct PageDef; + +#define GRP_W(n) ((QuickMenuGroup::QM_BUTTON_WIDTH + PAD_MEDIUM) * n - PAD_MEDIUM + PAD_OUTLINE * 2) +#if LANDSCAPE +#define GRP_H(n) ((QuickMenuGroup::QM_BUTTON_HEIGHT + PAD_MEDIUM) * n - PAD_MEDIUM + PAD_OUTLINE * 2) +#else +#define GRP_H(n) ((QuickMenuGroup::QM_BUTTON_HEIGHT + PAD_SMALL) * n - PAD_SMALL + PAD_OUTLINE * 2) +#endif + +class QuickMenu : public NavWindow +{ + public: + enum SubMenu { + NONE = 0, + MANAGE_MODELS, + // Model menu + MODEL_SETUP, + MODEL_HELI, + MODEL_FLIGHTMODES, + MODEL_INPUTS, + MODEL_MIXES, + MODEL_OUTPUTS, + MODEL_CURVES, + MODEL_GVARS, + MODEL_LS, + MODEL_SF, + MODEL_SCRIPTS, + MODEL_TELEMETRY, + // Radio menu + RADIO_SETUP, + RADIO_GF, + RADIO_TRAINER, + RADIO_HARDWARE, + RADIO_VERSION, + // UI menu + UI_THEMES, + UI_SETUP, + UI_SCREEN1, + UI_SCREEN2, + UI_SCREEN3, + UI_SCREEN4, + UI_SCREEN5, + UI_SCREEN6, + UI_SCREEN7, + UI_SCREEN8, + UI_SCREEN9, + UI_SCREEN10, + UI_ADD_PG, + // Tools menu + TOOLS_APPS, + TOOLS_STORAGE, + TOOLS_RESET, + TOOLS_CHAN_MON, + TOOLS_LS_MON, + TOOLS_STATS, + TOOLS_DEBUG, + }; + + QuickMenu(); + + static QuickMenu* openQuickMenu(std::function cancelHandler, + std::function selectHandler = nullptr, + PageGroupBase* pageGroup = nullptr, SubMenu curPage = NONE); + + void onCancel() override; + void onSelect(bool close); + void closeMenu(); + + void setFocus(SubMenu selection); + + void enableSubMenu(); + + SubMenu currentPage() const { return curPage; } + static void setCurrentPage(SubMenu newPage) { curPage = newPage; } + + PageGroupBase* getPageGroup() const { return pageGroup; } + QuickMenuGroup* getTopMenu() const { return mainMenu; } + +#if defined(HARDWARE_KEYS) + void onPressSYS() override; + // void onLongPressSYS() override; + // void onPressMDL() override; + // void onLongPressMDL() override; + // void onPressTELE() override; + // void onLongPressTELE() override; + // void onLongPressRTN() override; +#endif + + static constexpr int QM_MAIN_BTNS = 6; + static constexpr int QM_SUB_BTNS = 12; + static LAYOUT_ORIENTATION(QM_MAIN_COLS, 6, 1) + static LAYOUT_ORIENTATION(QM_MAIN_ROWS, 1, 6) + static LAYOUT_ORIENTATION(QM_SUB_COLS, 6, 3) + static LAYOUT_ORIENTATION(QM_SUB_ROWS, 2, 6) + static constexpr int QM_MAIN_W = GRP_W(QM_MAIN_COLS); + static constexpr int QM_MAIN_H = GRP_H(QM_MAIN_ROWS); + static constexpr int QM_SUB_W = GRP_W(QM_SUB_COLS); + static constexpr int QM_SUB_H = GRP_H(QM_SUB_ROWS); + static LAYOUT_ORIENTATION(QM_MAIN_X, (LCD_W - QM_MAIN_W) / 2, (LCD_W - QM_MAIN_W - QM_SUB_W - PAD_SMALL) / 2) + static constexpr coord_t QM_MAIN_Y = EdgeTxStyles::UI_ELEMENT_HEIGHT + PAD_TINY; + static LAYOUT_ORIENTATION(QM_SUB_X, QM_MAIN_X, QM_MAIN_X + QM_MAIN_W + PAD_SMALL) + static LAYOUT_ORIENTATION(QM_SUB_Y, QM_MAIN_Y + QM_MAIN_H + PAD_LARGE, QM_MAIN_Y) + + protected: + static QuickMenu* instance; + std::function cancelHandler = nullptr; + std::function selectHandler = nullptr; + bool inSubMenu = false; + QuickMenuGroup* mainMenu = nullptr; + std::vector subMenus; + PageGroupBase* pageGroup = nullptr; + static SubMenu curPage; + + void openQM(std::function cancelHandler, + std::function selectHandler, + PageGroupBase* pageGroup, SubMenu curPage); + + void focusMainMenu(); + + void deleteLater(bool detach, bool trash) override; +}; + +class QuickSubMenu +{ + public: + QuickSubMenu(Window* parent, QuickMenu* quickMenu, + EdgeTxIcon icon, const char* title, const char* parentTitle, + PageDef* items): + parent(parent), quickMenu(quickMenu), + icon(icon), title(title), parentTitle(parentTitle), items(items) + {} + + bool isSubMenu(QuickMenu::SubMenu n); + int getIndex(QuickMenu::SubMenu n); + + ButtonBase* addButton(); + void enableSubMenu(); + void setDisabled(bool all); + void setCurrent(QuickMenu::SubMenu n); + void buildSubMenu(); + uint8_t onPress(int n); + void onSelect(bool close); + int getPageNumber(int iconNumber); + void doLayout(); + + protected: + Window* parent; + QuickMenu* quickMenu; + EdgeTxIcon icon; + const char* title; + const char* parentTitle; + PageDef* items; + QuickMenuGroup* subMenu = nullptr; + ButtonBase* menuButton = nullptr; +}; diff --git a/radio/src/gui/colorlcd/setup_menus/quick_menu_group.cpp b/radio/src/gui/colorlcd/setup_menus/quick_menu_group.cpp new file mode 100644 index 000000000..c9d9c645b --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/quick_menu_group.cpp @@ -0,0 +1,234 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#include "quick_menu_group.h" + +#include "bitmaps.h" +#include "button.h" +#include "static.h" + +static void etx_quick_button_constructor(const lv_obj_class_t* class_p, + lv_obj_t* obj) +{ + etx_obj_add_style(obj, styles->rounded, LV_PART_MAIN); + etx_txt_color(obj, COLOR_WHITE_INDEX, LV_PART_MAIN); + etx_obj_add_style(obj, styles->pad_medium, LV_PART_MAIN); + etx_solid_bg(obj, COLOR_BLACK_INDEX, LV_PART_MAIN); + + etx_solid_bg(obj, COLOR_WHITE_INDEX, LV_PART_MAIN | LV_STATE_FOCUSED); +} + +static const lv_obj_class_t etx_quick_button_class = { + .base_class = &lv_btn_class, + .constructor_cb = etx_quick_button_constructor, + .destructor_cb = nullptr, + .user_data = nullptr, + .event_cb = nullptr, + .width_def = QuickMenuGroup::QM_BUTTON_WIDTH, + .height_def = QuickMenuGroup::QM_BUTTON_HEIGHT, + .editable = LV_OBJ_CLASS_EDITABLE_INHERIT, + .group_def = LV_OBJ_CLASS_GROUP_DEF_TRUE, + .instance_size = sizeof(lv_btn_t), +}; + +static lv_obj_t* etx_quick_button_create(lv_obj_t* parent) +{ + return etx_create(&etx_quick_button_class, parent); +} + +class QuickMenuButton : public ButtonBase +{ + public: + QuickMenuButton(Window* parent, EdgeTxIcon icon, const char* title, + std::function pressHandler, + std::function visibleHandler) : + ButtonBase(parent, {}, pressHandler, etx_quick_button_create), + visibleHandler(std::move(visibleHandler)) + { + padAll(PAD_ZERO); + + iconPtr = new StaticIcon(this, (QuickMenuGroup::QM_BUTTON_WIDTH - QuickMenuGroup::QM_ICON_SIZE) / 2, PAD_SMALL, icon, COLOR_WHITE_INDEX); + etx_obj_add_style(iconPtr->getLvObj(), styles->qmdisabled, LV_PART_MAIN | LV_STATE_DISABLED); + etx_img_color(iconPtr->getLvObj(), COLOR_BLACK_INDEX, LV_STATE_USER_1); + + textPtr = new StaticText(this, {0, QuickMenuGroup::QM_ICON_SIZE + PAD_TINY * 2, QuickMenuGroup::QM_BUTTON_WIDTH - 1, 0}, + title, COLOR_WHITE_INDEX, CENTERED | FONT(XS)); + etx_obj_add_style(textPtr->getLvObj(), styles->qmdisabled, LV_PART_MAIN | LV_STATE_DISABLED); + etx_txt_color(textPtr->getLvObj(), COLOR_BLACK_INDEX, LV_STATE_USER_1); + + lv_obj_add_event_cb(lvobj, QuickMenuButton::focused_cb, LV_EVENT_FOCUSED, nullptr); + lv_obj_add_event_cb(lvobj, QuickMenuButton::defocused_cb, LV_EVENT_DEFOCUSED, nullptr); + } + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "QuickMenuButton"; } +#endif + + static void focused_cb(lv_event_t *e) + { + QuickMenuButton *b = (QuickMenuButton *)lv_obj_get_user_data(lv_event_get_target(e)); + if (b) b->setFocused(); + } + + static void defocused_cb(lv_event_t *e) + { + QuickMenuButton *b = (QuickMenuButton *)lv_obj_get_user_data(lv_event_get_target(e)); + if (b) b->setDeFocused(); + } + + void setDisabled() + { + iconPtr->enable(false); + textPtr->enable(false); + } + + void setEnabled() + { + iconPtr->enable(true); + textPtr->enable(true); + } + + void setFocused() + { + lv_obj_add_state(textPtr->getLvObj(), LV_STATE_USER_1); + lv_obj_add_state(iconPtr->getLvObj(), LV_STATE_USER_1); + } + + void setDeFocused() + { + lv_obj_clear_state(textPtr->getLvObj(), LV_STATE_USER_1); + lv_obj_clear_state(iconPtr->getLvObj(), LV_STATE_USER_1); + } + + bool isVisible() { + if (visibleHandler) + return visibleHandler(); + return true; + } + + protected: + StaticIcon* iconPtr = nullptr; + StaticText* textPtr = nullptr; + std::function visibleHandler = nullptr; +}; + +QuickMenuGroup::QuickMenuGroup(Window* parent) : + Window(parent, {0, 0, parent->width(), parent->height()}) +{ + padAll(PAD_OUTLINE); + group = lv_group_create(); +} + +ButtonBase* QuickMenuGroup::addButton(EdgeTxIcon icon, const char* title, + std::function pressHandler, + std::function visibleHandler, + std::function focusHandler) +{ + ButtonBase* b = new QuickMenuButton(this, icon, title, pressHandler, visibleHandler); + b->setLongPressHandler(pressHandler); + btns.push_back(b); + if (group) lv_group_add_obj(group, b->getLvObj()); + b->setFocusHandler([=](bool focus) { + if (focus) { + curBtn = b; + if (focusHandler) focusHandler(); + } + }); + if (btns.size() == 1) { + curBtn = b; + if (focusHandler) focusHandler(); + } + return b; +} + +void QuickMenuGroup::setGroup() +{ + if (group && group != lv_group_get_default()) { + lv_group_set_default(group); + + lv_indev_t* indev = lv_indev_get_next(NULL); + while (indev) { + lv_indev_set_group(indev, group); + indev = lv_indev_get_next(indev); + } + } +} + +void QuickMenuGroup::deleteLater(bool detach, bool trash) +{ + if (group) lv_group_del(group); + Window::deleteLater(detach, trash); +} + +void QuickMenuGroup::setFocus() +{ + if (curBtn) { + lv_event_send(curBtn->getLvObj(), LV_EVENT_FOCUSED, nullptr); + lv_group_focus_obj(curBtn->getLvObj()); + } +} + +void QuickMenuGroup::clearFocus() +{ + if (curBtn) { + ((QuickMenuButton*)curBtn)->setEnabled(); + lv_event_send(curBtn->getLvObj(), LV_EVENT_DEFOCUSED, nullptr); + } +} + +void QuickMenuGroup::setDisabled(bool all) +{ + for (size_t i = 0; i < btns.size(); i += 1) { + if (btns[i] != curBtn || all) { + ((QuickMenuButton*)btns[i])->setDisabled(); + lv_event_send(btns[i]->getLvObj(), LV_EVENT_DEFOCUSED, nullptr); + } + } +} + +void QuickMenuGroup::setEnabled() +{ + for (size_t i = 0; i < btns.size(); i += 1) { + ((QuickMenuButton*)btns[i])->setEnabled(); + } +} + +void QuickMenuGroup::setCurrent(ButtonBase* b) +{ + curBtn = b; + ((QuickMenuButton*)b)->setEnabled(); +} + +void QuickMenuGroup::doLayout(int cols) +{ + int n = 0; + for (size_t i = 0; i < btns.size(); i += 1) { + if (((QuickMenuButton*)btns[i])->isVisible()) { + coord_t x = (n % cols) * (QM_BUTTON_WIDTH + PAD_MEDIUM); + coord_t y = (n / cols) * (QM_BUTTON_HEIGHT + PAD_MEDIUM); + lv_obj_set_pos(btns[i]->getLvObj(), x, y); + btns[i]->show(); + n += 1; + } else { + btns[i]->hide(); + } + } +} diff --git a/radio/src/gui/colorlcd/setup_menus/quick_menu_group.h b/radio/src/gui/colorlcd/setup_menus/quick_menu_group.h new file mode 100644 index 000000000..39d2a7769 --- /dev/null +++ b/radio/src/gui/colorlcd/setup_menus/quick_menu_group.h @@ -0,0 +1,70 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +#pragma once + +#include "form.h" +#include "bitmaps.h" +#include + +class ButtonBase; + +class QuickMenuGroup : public Window +{ + public: + QuickMenuGroup(Window* parent); + +#if defined(DEBUG_WINDOWS) + std::string getName() const override { return "QuickMenuGroup"; } +#endif + + // Add a new button to the carousel + ButtonBase* addButton(EdgeTxIcon icon, const char* title, + std::function pressHandler, + std::function visibleHandler = nullptr, + std::function focusHandler = nullptr); + + void setGroup(); + void setFocus(); + void clearFocus(); + void setDisabled(bool all); + void setEnabled(); + void setCurrent(ButtonBase* b); + void setCurrent(int b) { setCurrent(btns[b]); } + void doLayout(int cols); + +#if PORTRAIT + static LAYOUT_VAL_SCALED(QM_BUTTON_WIDTH, 72) +#else + static LAYOUT_SIZE_SCALED(QM_BUTTON_WIDTH, 72, 60) +#endif + static LAYOUT_VAL_SCALED(QM_BUTTON_HEIGHT, 70) + + static LAYOUT_VAL_SCALED(QM_ICON_SIZE, 30) + static LAYOUT_ORIENTATION(QM_ICON_PAD, PAD_MEDIUM, PAD_SMALL) + + protected: + std::vector btns; + ButtonBase* curBtn = nullptr; + lv_group_t* group = nullptr; + + void deleteLater(bool detach = true, bool trash = true) override; +}; diff --git a/radio/src/gui/colorlcd/themes/theme_manager.cpp b/radio/src/gui/colorlcd/themes/theme_manager.cpp index 02d9ddd6e..9b0fcac13 100644 --- a/radio/src/gui/colorlcd/themes/theme_manager.cpp +++ b/radio/src/gui/colorlcd/themes/theme_manager.cpp @@ -29,6 +29,7 @@ #include "view_main.h" #include "storage/sdcard_yaml.h" #include "lib_file.h" +#include "pagegroup.h" #define SET_DIRTY() storageDirty(EE_GENERAL) @@ -539,16 +540,44 @@ void HeaderDateTime::setColor(LcdFlags color) etx_txt_color_from_flags(time, color); } -HeaderIcon::HeaderIcon(Window* parent, EdgeTxIcon icon) : - StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX) +HeaderIcon::HeaderIcon(Window* parent, EdgeTxIcon icon, std::function action) : + StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX), + action(std::move(action)) { - (new StaticIcon(this, 0, 0, icon, COLOR_THEME_PRIMARY2_INDEX))->center(width(), height()); + this->icon = new StaticIcon(this, 0, 0, icon, COLOR_THEME_PRIMARY2_INDEX); + this->icon->center(width() - PAD_SMALL, height()); +#if defined(HARDWARE_TOUCH) + if (this->action) { + lv_obj_add_flag(lvobj, LV_OBJ_FLAG_CLICKABLE); + addCustomButton(0, 0, [=]() { this->action(); }); + } +#endif } -HeaderIcon::HeaderIcon(Window* parent, const char* iconFile) : - StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX) +HeaderIcon::HeaderIcon(Window* parent, const char* iconFile, std::function action) : + StaticIcon(parent, 0, 0, ICON_TOPLEFT_BG, COLOR_THEME_FOCUS_INDEX), + action(std::move(action)) { (new StaticIcon(this, 0, 0, iconFile, COLOR_THEME_PRIMARY2_INDEX))->center(width(), height()); +#if defined(HARDWARE_TOUCH) + if (this->action) { + lv_obj_add_flag(lvobj, LV_OBJ_FLAG_CLICKABLE); + addCustomButton(0, 0, [=]() { this->action(); }); + } +#endif +} + +HeaderBackIcon::HeaderBackIcon(Window* parent, std::function action) : + StaticIcon(parent, LCD_W - PageGroup::PAGE_TOP_BAR_H, 0, ICON_TOPRIGHT_BG, COLOR_THEME_FOCUS_INDEX), + action(std::move(action)) +{ + (new StaticIcon(this, 0, 0, ICON_BTN_CLOSE, COLOR_THEME_PRIMARY2_INDEX))->center(width() + PAD_MEDIUM, height()); +#if defined(HARDWARE_TOUCH) + if (this->action) { + lv_obj_add_flag(lvobj, LV_OBJ_FLAG_CLICKABLE); + addCustomButton(0, 0, [=]() { this->action(); }); + } +#endif } UsbSDConnected::UsbSDConnected() : diff --git a/radio/src/gui/colorlcd/themes/theme_manager.h b/radio/src/gui/colorlcd/themes/theme_manager.h index a70e76cc3..31991dfb0 100644 --- a/radio/src/gui/colorlcd/themes/theme_manager.h +++ b/radio/src/gui/colorlcd/themes/theme_manager.h @@ -180,8 +180,33 @@ class HeaderDateTime : public Window class HeaderIcon : public StaticIcon { public: - HeaderIcon(Window *parent, EdgeTxIcon icon); - HeaderIcon(Window *parent, const char* iconFile); + HeaderIcon(Window *parent, EdgeTxIcon icon, std::function action = nullptr); + HeaderIcon(Window *parent, const char* iconFile, std::function action = nullptr); + + void setIcon(EdgeTxIcon newIcon) { icon->setIcon(newIcon); } + + protected: + std::function action; + StaticIcon* icon = nullptr; + + void onClicked() override + { + if (action) action(); + } +}; + +class HeaderBackIcon : public StaticIcon +{ + public: + HeaderBackIcon(Window *parent, std::function action = nullptr); + + protected: + std::function action; + + void onClicked() override + { + if (action) action(); + } }; class UsbSDConnected : public Window diff --git a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp index 757357e6e..1ad0b9907 100644 --- a/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp +++ b/radio/src/gui/common/stdlcd/model_setup_pxx1.cpp @@ -25,19 +25,19 @@ void onBindMenu(const char * result) uint8_t moduleIdx = CURRENT_MODULE_EDITED(menuVerticalPosition - HEADER_LINE); uint8_t receiverTelemetryOff, receiverHigherChannels; - if (result == STR_BINDING_1_8_TELEM_ON) { + if (result == STR_BINDING_CH1_8_TELEM_ON) { receiverTelemetryOff = false; receiverHigherChannels = false; } - else if (result == STR_BINDING_1_8_TELEM_OFF) { + else if (result == STR_BINDING_CH1_8_TELEM_OFF) { receiverTelemetryOff = true; receiverHigherChannels = false; } - else if (result == STR_BINDING_9_16_TELEM_ON) { + else if (result == STR_BINDING_CH9_16_TELEM_ON) { receiverTelemetryOff = false; receiverHigherChannels = true; } - else if (result == STR_BINDING_9_16_TELEM_OFF) { + else if (result == STR_BINDING_CH9_16_TELEM_OFF) { receiverTelemetryOff = true; receiverHigherChannels = true; } @@ -62,13 +62,13 @@ void startBindMenu(uint8_t moduleIdx) uint8_t selection = 0; // R9M_LBT should default to 0 as available options are variables if (isTelemAllowedOnBind(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_1_8_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_CH1_8_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_CH1_8_TELEM_OFF); if (isBindCh9To16Allowed(moduleIdx)) { if (isTelemAllowedOnBind(moduleIdx)) - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_ON); - POPUP_MENU_ADD_ITEM(STR_BINDING_9_16_TELEM_OFF); + POPUP_MENU_ADD_ITEM(STR_BINDING_CH9_16_TELEM_ON); + POPUP_MENU_ADD_ITEM(STR_BINDING_CH9_16_TELEM_OFF); } if (isBindCh9To16Allowed(moduleIdx) && g_model.moduleData[moduleIdx].pxx.receiverHigherChannels) { diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 8ed51b7f4..068312740 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -105,7 +105,7 @@ const char * logsOpen() char filename[sizeof(LOGS_PATH) + LEN_MODEL_NAME + 18 + 4 + 1]; // check and create folder here - char* tmp = strAppend(filename, STR_LOGS_PATH); + char* tmp = strAppend(filename, LOGS_PATH); const char * error = sdCheckAndCreateDirectory(filename); if (error) { return error; @@ -125,7 +125,7 @@ const char * logsOpen() tmp = strAppendDate(tmp, true); #endif - strAppend(tmp, STR_LOGS_EXT); + strAppend(tmp, LOGS_EXT); result = f_open(&g_oLogFile, filename, FA_OPEN_ALWAYS | FA_WRITE | FA_OPEN_APPEND); if (result != FR_OK) { diff --git a/radio/src/lua/lua_lvgl_widget.cpp b/radio/src/lua/lua_lvgl_widget.cpp index 34c135059..e87ec9f47 100644 --- a/radio/src/lua/lua_lvgl_widget.cpp +++ b/radio/src/lua/lua_lvgl_widget.cpp @@ -2109,6 +2109,10 @@ class WidgetPage : public NavWindow, public LuaEventHandler else header = new PageHeader(this, iconFile.c_str()); +#if defined(HARDWARE_TOUCH) + addCustomButton(0, 0, [=]() { onCancel(); }); +#endif + body = new Window( this, {0, EdgeTxStyles::MENU_HEADER_HEIGHT, LCD_W, LCD_H - EdgeTxStyles::MENU_HEADER_HEIGHT}); body->setWindowFlag(NO_FOCUS); @@ -2122,10 +2126,6 @@ class WidgetPage : public NavWindow, public LuaEventHandler lv_obj_set_scroll_dir(body->getLvObj(), scrollDir); if (showScrollBar) etx_scrollbar(body->getLvObj()); - -#if defined(HARDWARE_TOUCH) - addBackButton(); -#endif } Window *getBody() { return body; } diff --git a/radio/src/sdcard.h b/radio/src/sdcard.h index a6c380abc..1ce44d142 100644 --- a/radio/src/sdcard.h +++ b/radio/src/sdcard.h @@ -76,7 +76,6 @@ const char YAMLFILE_CHECKSUM_TAG_NAME[] = "checksum"; #define SPLASH_FILE "splash.png" #define SHUTDOWN_SPLASH_FILE "shutdown.png" -#define MODELS_EXT ".bin" #define LOGS_EXT ".csv" #define SOUNDS_EXT ".wav" #define BMP_EXT ".bmp" diff --git a/radio/src/storage/sdcard_common.h b/radio/src/storage/sdcard_common.h index 59e52c322..efcc386af 100644 --- a/radio/src/storage/sdcard_common.h +++ b/radio/src/storage/sdcard_common.h @@ -23,6 +23,7 @@ #include "ff.h" #include "translations.h" +#include "sdcard.h" #define MODEL_FILENAME_PREFIX "model" #define MODEL_FILENAME_SUFFIX ".yml" @@ -33,9 +34,9 @@ struct YamlNode; const char* writeFileYaml(const char* path, const YamlNode* root_node, uint8_t* data, uint16_t checksum); -void getModelPath(char * path, const char * filename, const char* pathName = STR_MODELS_PATH); +void getModelPath(char * path, const char * filename, const char* pathName = MODELS_PATH); -const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, const char* pathName = STR_MODELS_PATH); +const char * readModel(const char * filename, uint8_t * buffer, uint32_t size, const char* pathName = MODELS_PATH); const char * loadModel(char * filename, bool alarms=true); const char * loadModelTemplate(const char* fileName, const char* filePath); const char * createModel(); diff --git a/radio/src/storage/sdcard_yaml.cpp b/radio/src/storage/sdcard_yaml.cpp index 246ca4f7d..dbc8f5031 100644 --- a/radio/src/storage/sdcard_yaml.cpp +++ b/radio/src/storage/sdcard_yaml.cpp @@ -538,7 +538,7 @@ const char * backupModel(uint8_t idx) char * buf = reusableBuffer.modelsel.mainname; // check and create folder here - const char * error = sdCheckAndCreateDirectory(STR_BACKUP_PATH); + const char * error = sdCheckAndCreateDirectory(BACKUP_PATH); if (error) { return error; } @@ -571,7 +571,7 @@ const char * backupModel(uint8_t idx) len = tmp - buf; #endif - strcpy(&buf[len], STR_YAML_EXT); + strcpy(&buf[len], YAML_EXT); #ifdef SIMU TRACE("SD-card backup filename=%s", buf); @@ -579,22 +579,22 @@ const char * backupModel(uint8_t idx) char model_idx[MODELIDX_STRLEN + sizeof(YAML_EXT)]; getModelNumberStr(idx, model_idx); - strcat(model_idx, STR_YAML_EXT); + strcat(model_idx, YAML_EXT); - return sdCopyFile(model_idx, STR_MODELS_PATH, buf, STR_BACKUP_PATH); + return sdCopyFile(model_idx, MODELS_PATH, buf, BACKUP_PATH); } const char * restoreModel(uint8_t idx, char *model_name) { char * buf = reusableBuffer.modelsel.mainname; strcpy(buf, model_name); - strcpy(&buf[strlen(buf)], STR_YAML_EXT); + strcpy(&buf[strlen(buf)], YAML_EXT); char model_idx[MODELIDX_STRLEN + sizeof(YAML_EXT)]; getModelNumberStr(idx, model_idx); - strcat(model_idx, STR_YAML_EXT); + strcat(model_idx, YAML_EXT); - const char* error = sdCopyFile(buf, STR_BACKUP_PATH, model_idx, STR_MODELS_PATH); + const char* error = sdCopyFile(buf, BACKUP_PATH, model_idx, MODELS_PATH); if (!error) { loadModelHeader(idx, &modelHeaders[idx]); } diff --git a/radio/src/storage/sdcard_yaml.h b/radio/src/storage/sdcard_yaml.h index 301bf2c3a..bbfa6165f 100644 --- a/radio/src/storage/sdcard_yaml.h +++ b/radio/src/storage/sdcard_yaml.h @@ -29,7 +29,7 @@ constexpr uint8_t MODELIDX_STRLEN = sizeof(MODEL_FILENAME_PREFIX "00"); const char * loadRadioSettingsYaml(bool checks); const char * writeModelYaml(const char* filename); -const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, const char* pathName = STR_MODELS_PATH); +const char * readModelYaml(const char * filename, uint8_t * buffer, uint32_t size, const char* pathName = MODELS_PATH); bool YamlFileChecksum(const YamlNode* root_node, uint8_t* data, uint16_t* checksum); void getModelNumberStr(uint8_t idx, char* model_idx); diff --git a/radio/src/string_list.h b/radio/src/string_list.h new file mode 100644 index 000000000..9eb233a70 --- /dev/null +++ b/radio/src/string_list.h @@ -0,0 +1,1149 @@ +/* + * Copyright (C) EdgeTX + * + * Based on code named + * opentx - https://github.com/opentx/opentx + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * 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. + */ + +// DO NOT INCLUDE THIS FILE DIRECTLY + +// List of strings and string arrays +// Macros are expanded in translations.h and translations.cpp + +#if defined(COLORLCD) +STRARRAY(FONT_SIZES); +#endif +STRARRAY(OFFON); +STRARRAY(MMMINV); +STRARRAY(VBEEPMODE); +STRARRAY(TRNMODE); +STRARRAY(TRNCHN); +STRARRAY(VTRIMINC); +STRARRAY(VDISPLAYTRIMS); +STRARRAY(VBLMODE); +STRARRAY(VCURVETYPE); +STRARRAY(VCURVEFUNC); +STRARRAY(VMLTPX); +STRARRAY(VMLTPX2); +STRARRAY(VCSWFUNC); +STRARRAY(VFSWRESET); +STRARRAY(FUNCSOUNDS); +STRARRAY(VTELEMUNIT); +STRARRAY(GPSFORMAT); +STRARRAY(VTELEMSCREENTYPE); +STRARRAY(ON_ONE_SWITCHES); +#if defined(IMU) +STRARRAY(IMU_VSRCRAW); +#endif +#if defined(PCBHORUS) +STRARRAY(SM_VSRCRAW); +#endif +STRARRAY(CYC_VSRCRAW); +STRARRAY(ROTARY_ENC_OPT); +STRARRAY(VTMRMODES); +STRARRAY(VPERSISTENT); +STRARRAY(VUNITSSYSTEM); +STRARRAY(VBEEPCOUNTDOWN); +STRARRAY(COUNTDOWNVALUES); +STRARRAY(VVARIOCENTER); +STRARRAY(COUNTRY_CODES); +STRARRAY(USBMODES); +STRARRAY(JACK_MODES); +STRARRAY(VFAILSAFE); +STRARRAY(VTRAINERMODES); +STRARRAY(MODULE_PROTOCOLS); +STRARRAY(R9M_REGION); +STRARRAY(R9M_FCC_POWER_VALUES); +STRARRAY(R9M_LBT_POWER_VALUES); +STRARRAY(R9M_LITE_FCC_POWER_VALUES); +STRARRAY(R9M_LITE_LBT_POWER_VALUES); +STRARRAY(XJT_ACCST_RF_PROTOCOLS); +STRARRAY(ISRM_RF_PROTOCOLS); +STRARRAY(R9M_PXX2_RF_PROTOCOLS); +STRARRAY(PPM_PROTOCOLS); +STRARRAY(SBUS_PROTOCOLS); +STRARRAY(DSM_PROTOCOLS); +STRARRAY(AFHDS3_PROTOCOLS); +STRARRAY(AFHDS3_POWERS); +STRARRAY(FLYSKY_PULSE_PROTO); +STRARRAY(FLYSKY_SERIAL_PROTO); +STRARRAY(CURVE_TYPES); +STRARRAY(CRSF_ARMING_MODES); +STRARRAY(VSENSORTYPES); +STRARRAY(VFORMULAS); +STRARRAY(VPREC); +STRARRAY(VCELLINDEX); +STRARRAY(AUX_SERIAL_MODES); +STRARRAY(SWTYPES); +STRARRAY(POTTYPES); +STRARRAY(ANTENNA_MODES); +STRARRAY(SAMPLE_MODES); +STRARRAY(SPORT_UPDATE_POWER_MODES); +STRARRAY(CRSF_BAUDRATE); +STRARRAY(PPM_POL); +STRARRAY(SBUS_INVERSION_VALUES); +STRARRAY(SPORT_MODES); +STRARRAY(FSGROUPS); +STRARRAY(FSSWITCHES); +STRARRAY(ADCFILTERVALUES); +STRARRAY(TIMER_DIR); +STRARRAY(PREFLIGHT_POTSLIDER_CHECK); +STRARRAY(PPMUNIT); +#if defined(FUNCTION_SWITCHES) +STRARRAY(FUNCTION_SWITCH_GROUPS); +STRARRAY(FS_COLOR_LIST); +#endif + +#if defined(HELI) +STRARRAY(VSWASHTYPE); +#endif + +#if defined(MULTIMODULE) +STRARRAY(MULTI_PROTOCOLS); +STRARRAY(MULTI_POWER); +STRARRAY(MULTI_BAYANG_OPTIONS); +STRARRAY(MULTI_DSM_OPTIONS); +STRARRAY(MULTI_DSM_CLONE); +STRARRAY(MULTI_WBUS_MODE); +#endif + +#if defined(BLUETOOTH) +STRARRAY(BLUETOOTH_MODES); +#endif + +STRARRAY(SUBTRIMMODES); +STRARRAY(PWR_OFF_DELAYS); +#if defined(COLORLCD) +STRARRAY(SPLASHSCREEN_DELAYS); +#endif + +// Main Menu +STR(QM_MANAGE_MODELS); +STR(QM_MODEL_SETUP); +STR(QM_RADIO_SETUP); +STR(QM_UI_SETUP); +STR(QM_TOOLS); +STR(QM_GEN_SETTINGS); +STR(QM_FLIGHT_MODES); +STR(QM_INPUTS); +STR(QM_MIXES); +STR(QM_OUTPUTS); +STR(QM_CURVES); +STR(QM_GLOBAL_VARS); +STR(QM_LOGICAL_SW); +STR(QM_SPEC_FUNC); +STR(QM_CUSTOM_LUA); +STR(QM_TELEM); +STR(QM_GLOB_FUNC); +STR(QM_TRAINER); +STR(QM_HARDWARE); +STR(QM_ABOUT); +STR(QM_THEMES); +STR(QM_TOP_BAR); +STR(QM_SCREEN_1); +STR(QM_SCREEN_2); +STR(QM_SCREEN_3); +STR(QM_SCREEN_4); +STR(QM_SCREEN_5); +STR(QM_SCREEN_6); +STR(QM_SCREEN_7); +STR(QM_SCREEN_8); +STR(QM_SCREEN_9); +STR(QM_SCREEN_10); +STR(QM_ADD_SCREEN); +STR(QM_APPS); +STR(QM_STORAGE); +STR(QM_RESET); +STR(QM_CHAN_MON); +STR(QM_LS_MON); +STR(QM_STATS); +STR(QM_DEBUG); +// Main Menu + +STR(MINUTE_SINGULAR); +STR(MINUTE_PLURAL1); +STR(MINUTE_PLURAL2); + +STR(EMPTY); +STR(POPUPS_ENTER_EXIT); +STR(OK); +STR(FREE); +STR(YES); +STR(NO); +STR(DELETEMODEL); +STR(COPYINGMODEL); +STR(MOVINGMODEL); +STR(LOADINGMODEL); +STR(UNLABELEDMODEL); +STR(NAME); +STR(BITMAP); +STR(NO_PICTURE); +STR(TIMER); +STR(NO_TIMERS); +STR(START); +STR(NEXT); +STR(ELIMITS); +STR(ETRIMS); +STR(TRIMINC); +STR(DISPLAY_TRIMS); +STR(TTRACE); +STR(TTRIM); +STR(TTRIM_SW); +STR(BEEPCTR); +STR(USE_GLOBAL_FUNCS); +STR(PPMFRAME); +STR(REFRESHRATE); +STR(MS); +STR(SWITCH); +#if defined(FUNCTION_SWITCHES) +STR(GROUPS); +STR(LUA_OVERRIDE); +STR(LAST); +STR(MORE_INFO); +STR(SWITCH_TYPE); +STR(SWITCH_GROUP); +STR(SWITCH_STARTUP); +STR(FUNCTION_SWITCHES); +STR(GROUP); +STR(GROUP_ALWAYS_ON); +STR(SF_PUSH_CUST_SWITCH); +#endif +STR(ADJUST_GVAR); +STR(PLAY_TRACK); +STR(PLAY_VALUE); +STR(SOUND); +STR(SF_BACKLIGHT); +STR(SF_BG_MUSIC); +STR(SF_BG_MUSIC_PAUSE); +STR(SF_DISABLE_TOUCH); +STR(SF_DISABLE_AUDIO_AMP); +STR(SF_FAILSAFE); +STR(SF_HAPTIC); +STR(SF_INST_TRIM); +STR(SF_LOGS); +STR(SF_MOD_BIND); +STR(SF_PLAY_SCRIPT); +STR(SF_RANGE_CHECK); +STR(SF_RESET); +STR(SF_SET_TIMER); +STR(SF_SWITCH); +STR(SF_TRAINER); +STR(SF_VARIO); +STR(SF_RGBLEDS); +STR(SF_VOLUME); +STR(SF_RACING_MODE); +STR(SF_SAFETY); +STR(SF_SCREENSHOT); +STR(SF_LCD_TO_VIDEO); +STR(SF_TEST); +STR(TRIMS); +STR(MIRROR); +STR(FADEIN); +STR(FADEOUT); +STR(DEFAULT); +STR(CHECKTRIMS); +STR(MODE); +STR(NOFREEEXPO); +STR(NOFREEMIXER); +STR(SOURCE); +STR(WEIGHT); +STR(SIDE); +STR(OFFSET); +STR(TRIM); +STR(DREX); +STR(CURVE); +STR(FLMODE); +STR(MIXWARNING); +STR(OFF); +STR(ANTENNA); +STR(NO_INFORMATION); +STR(MULTPX); +STR(DELAYDOWN); +STR(DELAYUP); +STR(SLOWDOWN); +STR(SLOWUP); +STR(MIXES); +STR(CV); +STR(GV); +STR(RANGE); +STR(CENTER); +STR(ALARM); +STR(BLADES); +STR(SCREEN); +STR(SOUND_LABEL); +STR(LENGTH); +STR(BEEP_LENGTH); +STR(CONTRAST); +STR(ALARMS_LABEL); +STR(BATTERY_RANGE); +STR(BATTERYCHARGING); +STR(BATTERYFULL); +STR(BATTERYNONE); +STR(BATTERYWARNING); +STR(INACTIVITYALARM); +STR(MEMORYWARNING); +STR(ALARMWARNING); +STR(RSSI_SHUTDOWN_ALARM); +STR(TRAINER_SHUTDOWN_ALARM); +STR(MODEL_STILL_POWERED); +STR(TRAINER_STILL_CONNECTED); +STR(USB_STILL_CONNECTED); +STR(MODEL_SHUTDOWN); +STR(PRESS_ENTER_TO_CONFIRM); +STR(THROTTLEREVERSE); +STR(MINUTEBEEP); +STR(BEEPCOUNTDOWN); +STR(PERSISTENT); +STR(BACKLIGHT_LABEL); +STR(GHOST_MENU_LABEL); +STR(STATUS); +STR(DEF_CHAN_ORD); +STR(STICKS); +STR(POTS); +STR(SWITCHES); +STR(SWITCHES_DELAY); +STR(SLAVE); +STR(MODESRC); +STR(MULTIPLIER); +STR(CAL); +STR(CALIB_DONE); +STR(VTRIM); +#if !defined(COLORLCD) +STR(MENUTOSTART); +#endif +STR(SETMIDPOINT); +STR(MOVESTICKSPOTS); +#if !defined(COLORLCD) +STR(AXISDIR); +STR(MENUAXISDIR); +#endif +STR(NODATA); +STR(US); +STR(HZ); +STR(TMIXMAXMS); +STR(FREE_STACK); +STR(INT_GPS_LABEL); +STR(HEARTBEAT_LABEL); +STR(LUA_SCRIPTS_LABEL); +STR(FREE_MEM_LABEL); +STR(DURATION_MS); +STR(INTERVAL_MS); +STR(MEM_USED_SCRIPT); +STR(MEM_USED_WIDGET); +STR(MEM_USED_EXTRA); +STR(STACK_MIX); +STR(STACK_AUDIO); +STR(GPS_FIX_YES); +STR(GPS_FIX_NO); +STR(GPS_SATS); +STR(GPS_HDOP); +STR(STACK_MENU); +STR(TIMER_LABEL); +STR(THROTTLE_PERCENT_LABEL); +STR(BATT_LABEL); +STR(SESSION); +STR(MENUTORESET); +STR(PPM_TRAINER); +STR(CH); +STR(MODEL); +STR(FM); +STR(PRESS_ANY_KEY_TO_SKIP); +STR(THROTTLE_NOT_IDLE); +STR(ALARMSDISABLED); +STR(PRESSANYKEY); +STR(TRIMS2OFFSETS); +STR(CHANNELS2FAILSAFE); +STR(CHANNEL2FAILSAFE); +STR(RADIO_SETUP); +STR(MENUTRAINER); +STR(MENUSPECIALFUNCS); +STR(MENUVERSION); +STR(MENU_RADIO_SWITCHES); +STR(MENU_RADIO_ANALOGS); +STR(MENU_RADIO_ANALOGS_CALIB); +STR(MENU_RADIO_ANALOGS_RAWLOWFPS); +STR(MENUCALIBRATION); +STR(MENU_FSWITCH); +STR(MENUMODELSEL); +STR(MENU_MODEL_SETUP); +STR(MENUFLIGHTMODE); +STR(MENUFLIGHTMODES); +STR(MENUINPUTS); +STR(MENULIMITS); +STR(MENUCURVES); +STR(MENUCURVE); +STR(MENULOGICALSWITCH); +STR(MENULOGICALSWITCHES); +STR(MENUCUSTOMFUNC); +STR(SPLASHSCREEN); +STR(PLAY_HELLO); +STR(PWR_ON_DELAY); +STR(PWR_OFF_DELAY); +STR(PWR_AUTO_OFF); +STR(THROTTLE_UPPERCASE); +STR(SWITCHWARNING); +STR(POTWARNINGSTATE); +STR(POTWARNING); +STR(MENUSTAT); +STR(MENUDEBUG); +STRARRAY(MONITOR_CHANNELS); +STR(MONITOR_SWITCHES); +STR(MONITOR_OUTPUT_DESC); +STR(MONITOR_MIXER_DESC); +STR(MENU_GLOBAL_VARS); +STR(INTERNALRF); +STR(INTERNAL_MODULE); +STR(EXTERNAL_MODULE); +STR(EDGETX_UPGRADE_REQUIRED); +STR(TELEMETRY_DISABLED); +STR(MORE_OPTIONS_AVAILABLE); +STR(NO_MODULE_INFORMATION); +STR(EXTERNALRF); +STR(MODULE_TELEMETRY); +STR(MODULE_TELEM_ON); +STR(COUNTRY_CODE); +STR(USBMODE); +STR(JACK_MODE); +STR(FAILSAFE); +STR(FAILSAFESET); +STR(REG_ID); +STR(OWNER_ID); +STR(HOLD); +STR(HOLD_UPPERCASE); +STR(NONE); +STR(NONE_UPPERCASE); +STR(MENUSENSOR); +STR(POWERMETER_PEAK); +STR(POWERMETER_POWER); +STR(POWERMETER_ATTN); +STR(POWERMETER_FREQ); +STR(MENUTOOLS); +STR(MAIN_MENU_APPS); +STR(TURN_OFF_RECEIVER); +STR(STOPPING); +STR(MENU_SPECTRUM_ANALYSER); +STR(MENU_POWER_METER); +STR(SENSOR); +STR(DISABLE_INTERNAL); +STR(AND_SWITCH); +STR(SF); +STR(GF); +STR(ANADIAGS_CALIB); +STR(ANADIAGS_FILTRAWDEV); +STR(ANADIAGS_UNFILTRAW); +STR(ANADIAGS_MINMAX); +STR(ANADIAGS_MOVE); +STR(BATT_CALIB); +STR(VOLTAGE); +STR(CURRENT_CALIB); +STR(UNITS_SYSTEM); +STR(UNITS_PPM); +STR(VOICE_LANGUAGE); +STR(MODELIDUSED); +STR(MODELIDUNIQUE); +STR(BEEP_VOLUME); +STR(WAV_VOLUME); +STR(BG_VOLUME); +STR(SELECT_MODEL); +STR(MODELS); +STR(SELECT_MODE); +STR(CREATE_MODEL); +STR(FAVORITE_LABEL); +STR(MODELS_MOVED); +STR(NEW_MODEL); +STR(INVALID_MODEL); +STR(MOVE_UP); +STR(MOVE_DOWN); +STR(DUPLICATE_MODEL); +STR(COPY_MODEL); +STR(MOVE_MODEL); +STR(DELETE_MODEL); +STR(EDIT); +STR(INSERT_BEFORE); +STR(INSERT_AFTER); +STR(COPY); +STR(MOVE); +STR(PASTE); +STR(PASTE_BEFORE); +STR(PASTE_AFTER); +STR(INSERT); +STR(DELETE); +STR(RESET_FLIGHT); +STR(RESET_TIMER1); +STR(RESET_TIMER2); +STR(RESET_TIMER3); +STR(RESET_TELEMETRY); +STR(STATISTICS); +STR(ABOUT_US); +STR(USB_JOYSTICK); +STR(USB_MASS_STORAGE); +STR(USB_SERIAL); +STR(SETUP_SCREENS); +STR(MONITOR_SCREENS); +STR(RESET_BTN); +STR(DEBUG); +STR(KEYS_BTN); +STR(ANALOGS_BTN); +STR(FS_BTN); +STR(TOUCH_NOTFOUND); +STR(TOUCH_EXIT); +STR(CALIBRATION); +STR(NO_TOOLS); +STR(NORMAL); +STR(NOT_INVERTED); +STR(NOT_CONNECTED); +STR(CONNECTED); +STR(FLEX_915); +STR(FLEX_868); +STR(16CH_WITHOUT_TELEMETRY); +STR(16CH_WITH_TELEMETRY); +STR(8CH_WITH_TELEMETRY); +STR(EXT_ANTENNA); +STR(PIN); +STR(UPDATE_RX_OPTIONS); +STR(UPDATE_TX_OPTIONS); +STR(MENU_MODULES_RX_VERSION); +STR(MENU_FIRM_OPTIONS); +STR(IMU); +STR(STICKS_POTS_SLIDERS); +STR(PWM_STICKS_POTS_SLIDERS); +STR(RF_PROTOCOL); +STR(MODULE_OPTIONS); +STR(POWER); +STR(NO_TX_OPTIONS); +STR(RTC_BATT); +STR(POWER_METER_EXT); +STR(POWER_METER_INT); +STR(SPECTRUM_ANALYSER_EXT); +STR(SPECTRUM_ANALYSER_INT); +STR(GHOST_MODULE_CONFIG); +STR(GPS_MODEL_LOCATOR); +STR(REFRESH); +STR(WAITING_FOR_RX); +STR(WAITING_FOR_TX); +STR(WAITING_FOR_MODULE); +STR(WARN_5VOLTS); +STR(WARNING); +STR(THROTTLE_WARNING); +STR(CUSTOM_THROTTLE_WARNING); +STR(CUSTOM_THROTTLE_WARNING_VAL); +STR(ALARMSWARN); +STR(SWITCHWARN); +STR(FAILSAFEWARN); +STR(WRONG_SDCARDVERSION); +STR(WARN_RTC_BATTERY_LOW); +STR(WARN_MULTI_LOWPOWER); +STR(BATTERY); +STR(WRONG_PCBREV); +STR(EMERGENCY_MODE); +STR(NO_FAILSAFE); +STR(KEYSTUCK); +STR(VOLUME); +STR(LCD); +STR(BRIGHTNESS); +STR(CPU_TEMP); +STR(COPROC); +STR(COPROC_TEMP); +STR(TTL_WARNING); +STR(FUNC); +STR(V1); +STR(V2); +STR(DURATION); +STR(DELAY); +STR(SD_CARD); +STR(NO_SOUNDS_ON_SD); +STR(NO_MODELS_ON_SD); +STR(NO_BITMAPS_ON_SD); +STR(NO_SCRIPTS_ON_SD); +STR(SCRIPT_SYNTAX_ERROR); +STR(SCRIPT_PANIC); +STR(SCRIPT_KILLED); +STR(SCRIPT_ERROR); +STR(PLAY_FILE); +STR(ASSIGN_BITMAP); +STR(EXECUTE_FILE); +STR(DELETE_FILE); +STR(COPY_FILE); +STR(RENAME_FILE); +STR(SD_INFO); +STR(REMOVED); +STR(NA); +STR(HARDWARE); +STR(FORMATTING); +STR(TEMP_CALIB); +STR(TIME); +STR(MAXBAUDRATE); +STR(BAUDRATE); +STR(CRSF_ARMING_MODE); +STR(SAMPLE_MODE); +STR(SD_INFO_TITLE); +STR(SD_SPEED); +STR(SD_SECTORS); +STR(SD_SIZE); +STR(TYPE); +STR(GVARS); +STR(GLOBAL_VAR); +STR(OWN); +STR(DATE); +STR(CHANNELS_MONITOR); +STR(ROTARY_ENCODER); +STR(ROTARY_ENC_MODE); + +#if defined(USE_HATS_AS_KEYS) +STR(HATSMODE); +STRARRAY(HATSOPT); +STR(HATSMODE_TRIMS); +STR(HATSMODE_KEYS); +STR(HATSMODE_KEYS_HELP); +#endif + +STR(MIXERS_MONITOR); +STR(PATH_TOO_LONG); +STR(VIEW_TEXT); +STR(FLASH_BOOTLOADER); +STR(CURRENT_VERSION); +STR(FLASH_INTERNAL_MODULE); +STR(FLASH_INTERNAL_MULTI); +STR(FLASH_EXTERNAL_MODULE); +STR(FLASH_EXTERNAL_MULTI); +STR(FLASH_EXTERNAL_ELRS); +STR(FIRMWARE_UPDATE_ERROR); +STR(FIRMWARE_UPDATE_SUCCESS); +STR(WRITING); +STR(FLASH_DEVICE); +STR(FLASH_EXTERNAL_DEVICE); +STR(FLASH_RECEIVER_OTA); +STR(FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA); +STR(FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA); +STR(FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA); +STR(FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA); +STR(FLASH_BLUETOOTH_MODULE); +STR(FLASH_POWER_MANAGEMENT_UNIT); +STR(DEVICE_NO_RESPONSE); +STR(DEVICE_FILE_ERROR); +STR(DEVICE_DATA_REFUSED); +STR(DEVICE_WRONG_REQUEST); +STR(DEVICE_FILE_REJECTED); +STR(DEVICE_FILE_WRONG_SIG); +STR(CONFIRM_FORMAT); +STR(CONFIRMRESET); +STR(TOO_MANY_LUA_SCRIPTS); +STR(BLCOLOR); +STR(MODELNAME); +STR(PHASENAME); +STR(MIXNAME); +STR(INPUTNAME); +STR(EXPONAME); +STR(TRAINER); +STR(CHANS); +STR(MODULE_BIND); +STR(MODULE_UNBIND); +STR(POWERMETER_ATTN_NEEDED); +STR(PXX2_SELECT_RX); +STR(PXX2_DEFAULT); +STR(BT_SELECT_DEVICE); +STR(DISCOVER); +STR(BUTTON_INIT); +STR(WAITING); +STR(RECEIVER_DELETE); +STR(RECEIVER_RESET); +STR(SHARE); +STR(BIND); +STR(REGISTER); +STR(BINDING_CH1_8_TELEM_ON); +STR(BINDING_CH1_8_TELEM_OFF); +STR(BINDING_CH9_16_TELEM_ON); +STR(BINDING_CH9_16_TELEM_OFF); +STR(CHANNELRANGE); +STR(ANTENNACONFIRM1); +STR(ANTENNACONFIRM2); +STR(USE_INTERNAL_ANTENNA); +STR(USE_EXTERNAL_ANTENNA); +STR(MODULE_PROTOCOL_FLEX_WARN_LINE1); +STR(MODULE_PROTOCOL_FCC_WARN_LINE1); +STR(MODULE_PROTOCOL_EU_WARN_LINE1); +STR(MODULE_PROTOCOL_WARN_LINE2); +STR(SET); +STR(PREFLIGHT); +STR(CHECKLIST); +STR(CHECKLIST_INTERACTIVE); +STR(VIEW_NOTES); +STR(MODEL_SELECT); +STR(RESET_SUBMENU); +STR(LOWALARM); +STR(CRITICALALARM); +STR(DISABLE_ALARM); +STR(TELEMETRY_TYPE); +STR(TELEMETRY_SENSORS); +STR(VALUE); +STR(PERIOD); +STR(INTERVAL); +STR(REPEAT); +STR(ENABLE); +STR(DISABLE); +STR(TOPLCDTIMER); +STR(UNIT); +STR(TELEMETRY_NEWSENSOR); +STR(ID); +STR(PRECISION); +STR(RATIO); +STR(FORMULA); +STR(CELLINDEX); +STR(LOGS); +STR(OPTIONS); +STR(FIRMWARE_OPTIONS); +STR(ALTSENSOR); +STR(CELLSENSOR); +STR(GPSSENSOR); +STR(CURRENTSENSOR); +STR(AUTOOFFSET); +STR(ONLYPOSITIVE); +STR(FILTER); +STR(TELEMETRYFULL); +STR(IGNORE_INSTANCE); +STR(SHOW_INSTANCE_ID); +STR(DISCOVER_SENSORS); +STR(STOP_DISCOVER_SENSORS); +STR(DELETE_ALL_SENSORS); +STR(CONFIRMDELETE); +STR(SELECT_WIDGET); +STR(REMOVE_WIDGET); +STR(WIDGET_SETTINGS); +STR(WIDGET_FULLSCREEN); +STR(REMOVE_SCREEN); +STR(SETUP_WIDGETS); +STR(USER_INTERFACE); +STR(THEME); +STR(SETUP); +STR(LAYOUT); +STR(TEXT_COLOR); +STR(RF_POWER); +STR(BYTES); +STR(ANTENNAPROBLEM); +STR(MODULE); +STR(RX_NAME); +STR(POPUP); +STR(MIN); +STR(MAX); +STR(INVERTED); +STR(CURVE_PRESET); +STR(PRESET); +STR(CLEAR); +STR(RESET); +STR(ADD_ALL_TRIMS_TO_SUBTRIMS); +STR(OPEN_CHANNEL_MONITORS); +STR(COUNT); +STR(PT); +STR(PTS); +STR(SMOOTH); +STR(COPY_STICKS_TO_OFS); +STR(COPY_MIN_MAX_TO_OUTPUTS); +STR(COPY_TRIMS_TO_OFS); +STR(INCDEC); +STR(GLOBALVAR); +STR(MIXSOURCE); +STR(MIXSOURCERAW); +STR(CONSTANT); +STR(TOP_BAR); +STR(FLASH_ERASE); +STR(FLASH_WRITE); +STR(OTA_UPDATE); +STR(MODULE_RESET); +STR(UNKNOWN_RX); +STR(UNSUPPORTED_RX); +STR(OTA_UPDATE_ERROR); +STR(DEVICE_RESET); +STR(ALTITUDE); +STR(SCALE); +STR(VIEW_CHANNELS); +STR(AUX_SERIAL_MODE); +STR(AUX2_SERIAL_MODE); +STR(AUX_SERIAL_PORT_POWER); +STR(THROTTLE_LABEL); +STR(SCRIPT); +STR(INPUTS); +STR(OUTPUTS); +STR(MENU_INPUTS); +STR(MENU_LUA); +STR(MENU_STICKS); +STR(MENU_POTS); +STR(MENU_MIN); +STR(MENU_MAX); +STR(MENU_HELI); +STR(MENU_TRIMS); +STR(MENU_SWITCHES); +STR(MENU_LOGICAL_SWITCHES); +STR(MENU_TRAINER); +STR(MENU_CHANNELS); +STR(MENU_GVARS); +STR(MENU_TELEMETRY); +STR(MENU_DISPLAY); +STR(MENU_OTHER); +STR(MENU_INVERT); +STR(AUDIO_MUTE); +STR(JITTER_FILTER); +STR(DEAD_ZONE); +STR(RTC_CHECK); +STR(EXIT); +STR(MODULE_RANGE); +STR(RANGE_TEST); +STR(RECEIVER_OPTIONS); +STR(SPORT_UPDATE_POWER_MODE); +STR(TOUCH_PANEL); +STR(FILE_SIZE); +STR(FILE_OPEN); +STRARRAY(TIMER_MODES); +STRARRAY(MONTHS); +STR(LIMITS_HEADERS_DIRECTION); +STR(SRC_BATT); +STR(SRC_TIME); +STR(SRC_GPS); +STR(SRC_TIMER); +STR(FUNC_SW); + +#if defined(COLORLCD) +STR(ASSIGN_SPLASH); +STR(FIRST_CHANNEL); +STR(FILL_BACKGROUND); +STR(BG_COLOR); +STR(SLIDERS_TRIMS); +STR(SLIDERS); +STR(FLIGHT_MODE); +STR(INVALID_FILE); +STR(TIMER_SOURCE); +STR(SIZE); +STR(SHADOW); +STR(ALIGNMENT); +STR(ALIGN_LABEL); +STR(ALIGN_VALUE); +STRARRAY(ALIGN_OPTS); +STR(TEXT); +STR(COLOR); +STR(MAIN_VIEW_X); +STR(PANEL1_BACKGROUND); +STR(PANEL2_BACKGROUND); +STR(WIDGET_GAUGE); +STR(WIDGET_MODELBMP); +STR(WIDGET_OUTPUTS); +STR(WIDGET_TEXT); +STR(WIDGET_TIMER); +STR(WIDGET_VALUE); +STR(MODULES_RX_VERSION); +STR(LEFT_STICK); +STR(SHOW_MIXER_MONITORS); +STR(MODEL_QUICK_SELECT); +STR(LOADING); +STR(DELETE_THEME); +STR(SAVE_THEME); +STR(EDIT_COLOR); +STR(NO_THEME_IMAGE); +STR(BACKLIGHT_TIMER); +STR(LABELS_SELECT); +STR(LABELS_MATCH); +STR(FAV_MATCH); +STRARRAY(LABELS_SELECT_MODE); +STRARRAY(LABELS_MATCH_MODE); +STRARRAY(FAV_MATCH_MODE); +#endif + +#if !defined(COLORLCD) +STR(MENUWHENDONE); +STR(NO_TELEMETRY_SCREENS); +#endif + +#if defined(HELI) +STR(MENUHELISETUP); +STR(SWASHTYPE); +STR(COLLECTIVE); +STR(AILERON); +STR(ELEVATOR); +STR(SWASHRING); +#endif + +#if defined(AUDIO) +STR(BEEP_PITCH); +#endif + +#if defined(HAPTIC) +STR(PWR_ON_OFF_HAPTIC); +STR(HAPTIC_LABEL); +STR(STRENGTH); +#endif + +#if defined(IMU) +STR(IMU_LABEL); +STR(IMU_OFFSET); +STR(IMU_MAX); +#endif + +#if defined(COLORLCD) +STR(BLONBRIGHTNESS); +STR(BLOFFBRIGHTNESS); +STR(KEYS_BACKLIGHT); +#endif + +STR(TIMEZONE); +STR(ADJUST_RTC); +STR(GPS); +STR(GPS_COORDS_FORMAT); +STR(VARIO); +STR(FLYSKY_TELEMETRY); +STR(PITCH_AT_ZERO); +STR(PITCH_AT_MAX); +STR(REPEAT_AT_ZERO); + +STR(BAD_RADIO_DATA); +STR(STORAGE_WARNING); +STR(STORAGE_FORMAT); +STR(RADIO_DATA_UNRECOVERABLE); +STR(RADIO_DATA_RECOVERED); +STR(EEPROMOVERFLOW); + +#if defined(LUA) +STR(MENUCUSTOMSCRIPTS); +#endif + +STR(MENUTELEMETRY); + +#if defined(DSM2) || defined(PXX) +STR(RECEIVER_NUM); +STR(RECEIVER); +STR(REBIND); +STR(REG_OK); +STR(BIND_OK); +#endif + +STR(MULTI_CUSTOM); +STR(MULTI_RFTUNE); +STR(MULTI_RFPOWER); +STR(MULTI_WBUS); +STR(MULTI_TELEMETRY); +STR(MULTI_VIDFREQ); +STR(MULTI_OPTION); +STR(MULTI_FIXEDID); +STR(MULTI_AUTOBIND); +STR(DISABLE_CH_MAP); +STR(DISABLE_TELEM); +STR(MULTI_LOWPOWER); +STR(MULTI_LNA_DISABLE); +STR(MODULE_NO_SERIAL_MODE); +STR(MODULE_NO_INPUT); +STR(MODULE_WAITFORBIND); +STR(MODULE_NO_TELEMETRY); +STR(MODULE_BINDING); +STR(MODULE_UPGRADE_ALERT); +STR(MODULE_UPGRADE); +STR(PROTOCOL_INVALID); +STR(MODULE_STATUS); +STR(MODULE_SYNC); +STR(MULTI_SERVOFREQ); +STR(MULTI_MAX_THROW); +STR(MULTI_RFCHAN); +STR(NEEDS_FILE); +STR(EXT_MULTI_SPEC); +STR(INT_MULTI_SPEC); + +#if defined(AFHDS3) +STR(AFHDS3_RX_FREQ); +STR(AFHDS3_ACTUAL_POWER); +STR(AFHDS3_POWER_SOURCE); +STR(AFHDS3_ONE_TO_ONE_TELEMETRY); +STR(AFHDS3_ONE_TO_MANY); +#endif + +STR(SUBTYPE); + +STR(BACKUP_MODEL); +STR(RESTORE_MODEL); +STR(DELETE_ERROR); +STR(SDCARD_ERROR); +STR(SDCARD); +STR(NO_FILES_ON_SD); +STR(NO_SDCARD); +STR(SDCARD_FULL); +STR(SDCARD_FULL_EXT); +STR(INCOMPATIBLE); + +STR(TEST_WARNING); +STR(TEST_NOTSAFE); + +#if LCD_W >= 212 +STRARRAY(PHASES_HEADERS); +STRARRAY(LIMITS_HEADERS); +STRARRAY(LSW_HEADERS); +STRARRAY(LSW_DESCRIPTIONS); +#endif + +#if defined(BLUETOOTH) +STR(BLUETOOTH); +STR(BLUETOOTH_DISC); +STR(BLUETOOTH_INIT); +STR(BLUETOOTH_DIST_ADDR); +STR(BLUETOOTH_LOCAL_ADDR); +STR(BLUETOOTH_PIN_CODE); +STR(BLUETOOTH_NODEVICES); +STR(BLUETOOTH_SCANNING); +STR(BLUETOOTH_BAUDRATE); +#endif + +STR(ABOUTUS); + +STR(AUTH_FAILURE); +STR(PROTOCOL); +STR(RACING_MODE); + +#if defined(RADIO_NV14_FAMILY) +STRARRAY(RFPOWER_AFHDS2); +#endif + +#if defined(COLORLCD) +STR(SELECT_TEMPLATE); +STR(SELECT_TEMPLATE_FOLDER); +STR(NO_TEMPLATES); +STR(SAVE_TEMPLATE); +STR(BLANK_MODEL); +STR(BLANK_MODEL_INFO); +STR(FILE_EXISTS); +STR(ASK_OVERWRITE); + +STR(USE_THEME_COLOR); + +STR(DUPLICATE); +STR(ACTIVATE); +STR(RED); +STR(GREEN); +STR(BLUE); +STR(COLOR_PICKER); +STR(FIXED); +STR(EDIT_THEME_DETAILS); +STR(THEME_COLOR_DEFAULT); +STR(THEME_COLOR_PRIMARY1); +STR(THEME_COLOR_PRIMARY2); +STR(THEME_COLOR_PRIMARY3); +STR(THEME_COLOR_SECONDARY1); +STR(THEME_COLOR_SECONDARY2); +STR(THEME_COLOR_SECONDARY3); +STR(THEME_COLOR_FOCUS); +STR(THEME_COLOR_EDIT); +STR(THEME_COLOR_ACTIVE); +STR(THEME_COLOR_WARNING); +STR(THEME_COLOR_DISABLED); +STR(THEME_COLOR_CUSTOM); +STR(THEME_CHECKBOX); +STR(THEME_ACTIVE); +STR(THEME_REGULAR); +STR(THEME_WARNING); +STR(THEME_DISABLED); +STR(THEME_EDIT); +STR(THEME_FOCUS); +STR(AUTHOR); +STR(DESCRIPTION); +STR(SAVE); +STR(CANCEL); +STR(EDIT_THEME); +STR(DETAILS); + +STR(EDIT_LABELS); +STR(LABEL_MODEL); +STR(ENTER_LABEL); +STR(LABEL); +STR(LABELS); +STR(ACTIVE); +STR(NEW); +STR(NEW_LABEL); +STR(RENAME_LABEL); +STR(DELETE_LABEL); +STR(MAIN_MENU_MANAGE_MODELS); +STR(MAIN_MENU_MODEL_NOTES); +STR(MAIN_MENU_CHANNEL_MONITOR); +STR(MAIN_MENU_MODEL_SETTINGS); +STR(MAIN_MENU_RADIO_SETTINGS); +STR(MAIN_MENU_SETTINGS); +STR(MAIN_MENU_SCREEN_SETTINGS); +STR(MAIN_MENU_STATISTICS); +STR(MAIN_MENU_ABOUT_EDGETX); +STR(MAIN_MENU_THEMES); +STR(MANAGE_MODELS); +#endif + +#if defined(USBJ_EX) +STR(USBJOYSTICK_LABEL); +STR(USBJOYSTICK_EXTMODE); +STRARRAY(VUSBJOYSTICK_EXTMODE); +STR(USBJOYSTICK_SETTINGS); +STR(USBJOYSTICK_IF_MODE); +STRARRAY(VUSBJOYSTICK_IF_MODE); +STR(USBJOYSTICK_CH_MODE); +STRARRAY(VUSBJOYSTICK_CH_MODE); +STRARRAY(VUSBJOYSTICK_CH_MODE_S); +STR(USBJOYSTICK_CH_BTNMODE); +STRARRAY(VUSBJOYSTICK_CH_BTNMODE); +STRARRAY(VUSBJOYSTICK_CH_BTNMODE_S); +STR(USBJOYSTICK_CH_SWPOS); +STRARRAY(VUSBJOYSTICK_CH_SWPOS); +STR(USBJOYSTICK_CH_AXIS); +STRARRAY(VUSBJOYSTICK_CH_AXIS); +STR(USBJOYSTICK_CH_SIM); +STRARRAY(VUSBJOYSTICK_CH_SIM); +STR(USBJOYSTICK_CH_INVERSION); +STR(USBJOYSTICK_CH_BTNNUM); +STR(USBJOYSTICK_BTN_COLLISION); +STR(USBJOYSTICK_AXIS_COLLISION); +STR(USBJOYSTICK_CIRC_COUTOUT); +STRARRAY(VUSBJOYSTICK_CIRC_COUTOUT); +STR(USBJOYSTICK_APPLY_CHANGES); +#endif + +STR(DIGITAL_SERVO); +STR(ANALOG_SERVO); +STR(SIGNAL_OUTPUT); +STR(SERIAL_BUS); +STR(SYNC); + +STR(ENABLED_FEATURES); +STR(RADIO_MENU_TABS); +STR(MODEL_MENU_TABS); + +STR(STICK_NAMES0); +STR(STICK_NAMES1); +STR(STICK_NAMES2); +STR(STICK_NAMES3); +STR(SURFACE_NAMES0); +STR(SURFACE_NAMES1); + +STR(SELECT_MENU_ALL); +STR(SELECT_MENU_CLR); +STR(SELECT_MENU_INV); + +#if defined(COLORLCD) +STRARRAY(SORT_ORDERS); +STR(SORT_MODELS_BY); +STR(CREATE_NEW); +STR(THEME_EXISTS); + +STR(DATE_TIME_WIDGET); +STR(RADIO_INFO_WIDGET); +STR(LOW_BATT_COLOR); +STR(MID_BATT_COLOR); +STR(HIGH_BATT_COLOR); +STR(WIDGET_SIZE); +#endif + +STR(MIX_SLOW_PREC); +STR(MIX_DELAY_PREC); + +STR(DEL_DIR_NOT_EMPTY); diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 12bf4d68e..f59a2fc1e 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -21,1109 +21,31 @@ #include "edgetx.h" -#define ISTR(x) const char* const STR_##x[] = { TR_##x } - -#if defined(COLORLCD) -ISTR(FONT_SIZES); -#endif -ISTR(OFFON); -ISTR(MMMINV); -ISTR(VBEEPMODE); -ISTR(TRNMODE); -ISTR(TRNCHN); -ISTR(VTRIMINC); -ISTR(VDISPLAYTRIMS); -ISTR(VBLMODE); -ISTR(VCURVETYPE); -ISTR(VCURVEFUNC); -ISTR(VMLTPX); -ISTR(VMLTPX2); -ISTR(VCSWFUNC); -ISTR(VFSWRESET); -ISTR(FUNCSOUNDS); -ISTR(VTELEMUNIT); -ISTR(GPSFORMAT); -ISTR(VTELEMSCREENTYPE); -ISTR(ON_ONE_SWITCHES); -#if defined(IMU) -ISTR(IMU_VSRCRAW); -#endif -#if defined(PCBHORUS) -ISTR(SM_VSRCRAW); -#endif -ISTR(CYC_VSRCRAW); -ISTR(ROTARY_ENC_OPT); -ISTR(VTMRMODES); -ISTR(VPERSISTENT); -ISTR(VUNITSSYSTEM); -ISTR(VBEEPCOUNTDOWN); -ISTR(COUNTDOWNVALUES); -ISTR(VVARIOCENTER); -ISTR(COUNTRY_CODES); -ISTR(USBMODES); -ISTR(JACK_MODES); -ISTR(VFAILSAFE); -ISTR(VTRAINERMODES); -ISTR(MODULE_PROTOCOLS); -ISTR(R9M_REGION); -ISTR(R9M_FCC_POWER_VALUES); -ISTR(R9M_LBT_POWER_VALUES); -ISTR(R9M_LITE_FCC_POWER_VALUES); -ISTR(R9M_LITE_LBT_POWER_VALUES); -ISTR(XJT_ACCST_RF_PROTOCOLS); -ISTR(ISRM_RF_PROTOCOLS); -ISTR(R9M_PXX2_RF_PROTOCOLS); -ISTR(PPM_PROTOCOLS); -ISTR(SBUS_PROTOCOLS); -ISTR(DSM_PROTOCOLS); -ISTR(AFHDS3_PROTOCOLS); -ISTR(AFHDS3_POWERS); -ISTR(FLYSKY_PULSE_PROTO); -ISTR(FLYSKY_SERIAL_PROTO); -ISTR(CURVE_TYPES); -ISTR(CRSF_ARMING_MODES); -ISTR(VSENSORTYPES); -ISTR(VFORMULAS); -ISTR(VPREC); -ISTR(VCELLINDEX); -ISTR(AUX_SERIAL_MODES); -ISTR(SWTYPES); -ISTR(POTTYPES); -ISTR(ANTENNA_MODES); -ISTR(SAMPLE_MODES); -ISTR(SPORT_UPDATE_POWER_MODES); -ISTR(CRSF_BAUDRATE); -ISTR(PPM_POL); -ISTR(SBUS_INVERSION_VALUES); -ISTR(SPORT_MODES); -ISTR(FSGROUPS); -ISTR(FSSWITCHES); -ISTR(ADCFILTERVALUES); -ISTR(TIMER_DIR); -ISTR(PREFLIGHT_POTSLIDER_CHECK); -ISTR(PPMUNIT); -#if defined(FUNCTION_SWITCHES) -ISTR(FUNCTION_SWITCH_GROUPS); -ISTR(FS_COLOR_LIST); -#endif - -#if defined(HELI) -ISTR(VSWASHTYPE); -#endif - -#if defined(MULTIMODULE) -ISTR(MULTI_PROTOCOLS); -ISTR(MULTI_POWER); -ISTR(MULTI_BAYANG_OPTIONS); -ISTR(MULTI_DSM_OPTIONS); -ISTR(MULTI_DSM_CLONE); -ISTR(MULTI_WBUS_MODE); -#endif - -#if defined(BLUETOOTH) -ISTR(BLUETOOTH_MODES); -#endif - -ISTR(SUBTRIMMODES); -ISTR(PWR_OFF_DELAYS); -#if defined(COLORLCD) -ISTR(SPLASHSCREEN_DELAYS); -#endif - -const char STR_MINUTE_SINGULAR[] = TR_MINUTE_SINGULAR; -const char STR_MINUTE_PLURAL1[] = TR_MINUTE_PLURAL1; -const char STR_MINUTE_PLURAL2[] = TR_MINUTE_PLURAL2; - const char CHR_HOUR = TR_CHR_HOUR; const char CHR_INPUT = TR_CHR_INPUT; -const char STR_EMPTY[] = TR_EMPTY; -const char STR_POPUPS_ENTER_EXIT[] = TR_POPUPS_ENTER_EXIT; -const char STR_OK[] = TR_OK; -const char STR_FREE[] = TR_FREE; -const char STR_YES[] = TR_YES; -const char STR_NO[] = TR_NO; -const char STR_DELETEMODEL[] = TR_DELETEMODEL; -const char STR_COPYINGMODEL[] = TR_COPYINGMODEL; -const char STR_MOVINGMODEL[] = TR_MOVINGMODEL; -const char STR_LOADINGMODEL[] = TR_LOADINGMODEL; -const char STR_UNLABELEDMODEL[] = TR_UNLABELEDMODEL; -const char STR_NAME[] = TR_NAME; -const char STR_BITMAP[] = TR_BITMAP; -const char STR_NO_PICTURE[] = TR_NO_PICTURE; -const char STR_TIMER[] = TR_TIMER; -const char STR_NO_TIMERS[] = TR_NO_TIMERS; -const char STR_START[] = TR_START; -const char STR_NEXT[] = TR_NEXT; -const char STR_ELIMITS[] = TR_ELIMITS; -const char STR_ETRIMS[] = TR_ETRIMS; -const char STR_TRIMINC[] = TR_TRIMINC; -const char STR_DISPLAY_TRIMS[] = TR_DISPLAY_TRIMS; -const char STR_TTRACE[] = TR_TTRACE; -const char STR_TTRIM[] = TR_TTRIM; -const char STR_TTRIM_SW[] = TR_TTRIM_SW; -const char STR_BEEPCTR[] = TR_BEEPCTR; -const char STR_USE_GLOBAL_FUNCS[] = TR_USE_GLOBAL_FUNCS; -const char STR_PPMFRAME[] = TR_PPMFRAME; -const char STR_REFRESHRATE[] = TR_REFRESHRATE; -const char STR_MS[] = TR_MS; -const char STR_SWITCH[] = TR_SWITCH; -#if defined(FUNCTION_SWITCHES) -const char STR_GROUPS[] = TR_GROUPS; -const char STR_LUA_OVERRIDE[] = TR_LUA_OVERRIDE; -const char STR_LAST[] = TR_LAST; -const char STR_MORE_INFO[] = TR_MORE_INFO; -const char STR_SWITCH_TYPE[] = TR_SWITCH_TYPE; -const char STR_SWITCH_GROUP[] = TR_SWITCH_GROUP; -const char STR_SWITCH_STARTUP[] = TR_SWITCH_STARTUP; -const char STR_FUNCTION_SWITCHES[] = TR_FUNCTION_SWITCHES; -const char STR_GROUP[] = TR_GROUP; -const char STR_GROUP_ALWAYS_ON[] = TR_GROUP_ALWAYS_ON; -const char STR_SF_PUSH_CUST_SWITCH[] = TR_SF_PUSH_CUST_SWITCH; -#endif -const char STR_ADJUST_GVAR[] = TR_ADJUST_GVAR; -const char STR_PLAY_TRACK[] = TR_PLAY_TRACK; -const char STR_PLAY_VALUE[] = TR_PLAY_VALUE; -const char STR_SOUND[] = TR_SOUND; -const char STR_SF_BACKLIGHT[] = TR_SF_BACKLIGHT; -const char STR_SF_BG_MUSIC[] = TR_SF_BG_MUSIC; -const char STR_SF_BG_MUSIC_PAUSE[] = TR_SF_BG_MUSIC_PAUSE; -const char STR_SF_DISABLE_TOUCH[] = TR_SF_DISABLE_TOUCH; -const char STR_SF_DISABLE_AUDIO_AMP[] = TR_SF_DISABLE_AUDIO_AMP; -const char STR_SF_FAILSAFE[] = TR_SF_FAILSAFE; -const char STR_SF_HAPTIC[] = TR_SF_HAPTIC; -const char STR_SF_INST_TRIM[] = TR_SF_INST_TRIM; -const char STR_SF_LOGS[] = TR_SF_LOGS; -const char STR_SF_MOD_BIND[] = TR_SF_MOD_BIND; -const char STR_SF_PLAY_SCRIPT[] = TR_SF_PLAY_SCRIPT; -const char STR_SF_RANGE_CHECK[] = TR_SF_RANGE_CHECK; -const char STR_SF_RESET[] = TR_SF_RESET; -const char STR_SF_SET_TIMER[] = TR_SF_SET_TIMER; -const char STR_SF_SWITCH[] = TR_SF_SWITCH; -const char STR_SF_TRAINER[] = TR_SF_TRAINER; -const char STR_SF_VARIO[] = TR_SF_VARIO; -const char STR_SF_RGBLEDS[] = TR_SF_RGBLEDS; -const char STR_SF_VOLUME[] = TR_SF_VOLUME; -const char STR_SF_RACING_MODE[] = TR_SF_RACING_MODE; -const char STR_SF_SAFETY[] = TR_SF_SAFETY; +#define TR_MONITOR_CHANNELS TR_MONITOR_CHANNELS1, TR_MONITOR_CHANNELS2, TR_MONITOR_CHANNELS3, TR_MONITOR_CHANNELS4 +#define TR_TIMER_MODES TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START +#define TR_PHASES_HEADERS TR_PHASES_HEADERS_NAME, TR_PHASES_HEADERS_SW, TR_PHASES_HEADERS_RUD_TRIM, TR_PHASES_HEADERS_ELE_TRIM, TR_PHASES_HEADERS_THT_TRIM, TR_PHASES_HEADERS_AIL_TRIM, TR_PHASES_HEADERS_FAD_IN, TR_PHASES_HEADERS_FAD_OUT +#define TR_LIMITS_HEADERS TR_LIMITS_HEADERS_NAME, TR_LIMITS_HEADERS_SUBTRIM, TR_LIMITS_HEADERS_MIN, TR_LIMITS_HEADERS_MAX, TR_LIMITS_HEADERS_DIRECTION, TR_LIMITS_HEADERS_CURVE, TR_LIMITS_HEADERS_PPMCENTER, TR_LIMITS_HEADERS_SUBTRIMMODE +#define TR_LSW_HEADERS TR_FUNC, TR_V1, TR_V2, TR_V2, TR_AND_SWITCH, TR_DURATION, TR_DELAY, TR_PERSISTENT + +// Static string +#define STR(x) const char STR_##x[] = TR_##x +// Static string array +#define STRARRAY(x) const char* const STR_##x[] = { TR_##x } + +#include "string_list.h" + #if defined(COLORLCD) -const char STR_SF_SET_SCREEN[] = TR_SF_SET_SCREEN; +STR(SF_SET_SCREEN); #else const char STR_SF_SET_SCREEN[] = TR_SF_SET_TELEMSCREEN; #endif -const char STR_SF_SCREENSHOT[] = TR_SF_SCREENSHOT; -const char STR_SF_LCD_TO_VIDEO[] = TR_SF_LCD_TO_VIDEO; -const char STR_SF_TEST[] = TR_SF_TEST; -const char STR_TRIMS[] = TR_TRIMS; -const char STR_MIRROR[] = TR_MIRROR; -const char STR_FADEIN[] = TR_FADEIN; -const char STR_FADEOUT[] = TR_FADEOUT; -const char STR_DEFAULT[] = TR_DEFAULT; -const char STR_CHECKTRIMS[] = TR_CHECKTRIMS; -const char STR_MODE[] = TR_MODE; -const char STR_NOFREEEXPO[] = TR_NOFREEEXPO; -const char STR_NOFREEMIXER[] = TR_NOFREEMIXER; -const char STR_SOURCE[] = TR_SOURCE; -const char STR_WEIGHT[] = TR_WEIGHT; -const char STR_SIDE[] = TR_SIDE; -const char STR_OFFSET[] = TR_OFFSET; -const char STR_TRIM[] = TR_TRIM; -const char STR_DREX[] = TR_DREX; -const char STR_CURVE[] = TR_CURVE; -const char STR_FLMODE[] = TR_FLMODE; -const char STR_MIXWARNING[] = TR_MIXWARNING; -const char STR_OFF[] = TR_OFF; -const char STR_ANTENNA[] = TR_ANTENNA; -const char STR_NO_INFORMATION[] = TR_NO_INFORMATION; -const char STR_MULTPX[] = TR_MULTPX; -const char STR_DELAYDOWN[] = TR_DELAYDOWN; -const char STR_DELAYUP[] = TR_DELAYUP; -const char STR_SLOWDOWN[] = TR_SLOWDOWN; -const char STR_SLOWUP[] = TR_SLOWUP; -const char STR_MIXES[] = TR_MIXES; -const char STR_CV[] = TR_CV; -const char STR_GV[] = TR_GV; -const char STR_RANGE[] = TR_RANGE; -const char STR_CENTER[] = TR_CENTER; -const char STR_ALARM[] = TR_ALARM; -const char STR_BLADES[] = TR_BLADES; -const char STR_SCREEN[] = TR_SCREEN; -const char STR_SOUND_LABEL[] = TR_SOUND_LABEL; -const char STR_LENGTH[] = TR_LENGTH; -const char STR_BEEP_LENGTH[] = TR_BEEP_LENGTH; -const char STR_CONTRAST[] = TR_CONTRAST; -const char STR_ALARMS_LABEL[] = TR_ALARMS_LABEL; -const char STR_BATTERY_RANGE[] = TR_BATTERY_RANGE; -const char STR_BATTERYCHARGING[] = TR_BATTERYCHARGING; -const char STR_BATTERYFULL[] = TR_BATTERYFULL; -const char STR_BATTERYNONE[] = TR_BATTERYNONE; -const char STR_BATTERYWARNING[] = TR_BATTERYWARNING; -const char STR_INACTIVITYALARM[] = TR_INACTIVITYALARM; -const char STR_MEMORYWARNING[] = TR_MEMORYWARNING; -const char STR_ALARMWARNING[] = TR_ALARMWARNING; -const char STR_RSSI_SHUTDOWN_ALARM[] = TR_RSSI_SHUTDOWN_ALARM; -const char STR_TRAINER_SHUTDOWN_ALARM[] = TR_TRAINER_SHUTDOWN_ALARM; -const char STR_MODEL_STILL_POWERED[] = TR_MODEL_STILL_POWERED; -const char STR_TRAINER_STILL_CONNECTED[] = TR_TRAINER_STILL_CONNECTED; -const char STR_USB_STILL_CONNECTED[] = TR_USB_STILL_CONNECTED; -const char STR_MODEL_SHUTDOWN[] = TR_MODEL_SHUTDOWN; -const char STR_PRESS_ENTER_TO_CONFIRM[] = TR_PRESS_ENTER_TO_CONFIRM; -const char STR_THROTTLEREVERSE[] = TR_THROTTLEREVERSE; -const char STR_MINUTEBEEP[] = TR_MINUTEBEEP; -const char STR_BEEPCOUNTDOWN[] = TR_BEEPCOUNTDOWN; -const char STR_PERSISTENT[] = TR_PERSISTENT; -const char STR_BACKLIGHT_LABEL[] = TR_BACKLIGHT_LABEL; -const char STR_GHOST_MENU_LABEL[] = TR_GHOST_MENU_LABEL; -const char STR_STATUS[] = TR_STATUS; -const char STR_DEF_CHAN_ORD[] = TR_DEF_CHAN_ORD; -const char STR_STICKS[] = TR_STICKS; -const char STR_POTS[] = TR_POTS; -const char STR_SWITCHES[] = TR_SWITCHES; -const char STR_SWITCHES_DELAY[] = TR_SWITCHES_DELAY; -const char STR_SLAVE[] = TR_SLAVE; -const char STR_MODESRC[] = TR_MODESRC; -const char STR_MULTIPLIER[] = TR_MULTIPLIER; -const char STR_CAL[] = TR_CAL; -const char STR_CALIB_DONE[] = TR_CALIB_DONE; -const char STR_VTRIM[] = TR_VTRIM; -#if !defined(COLORLCD) -const char STR_MENUTOSTART[] = TR_MENUTOSTART; -#endif -const char STR_SETMIDPOINT[] = TR_SETMIDPOINT; -const char STR_MOVESTICKSPOTS[] = TR_MOVESTICKSPOTS; -#if !defined(COLORLCD) -const char STR_AXISDIR[] = TR_AXISDIR; -const char STR_MENUAXISDIR[] = TR_MENUAXISDIR; -#endif -const char STR_TX[] = TR_TXnRX; -const char STR_NODATA[] = TR_NODATA; -const char STR_US[] = TR_US; -const char STR_HZ[] = TR_HZ; -const char STR_TMIXMAXMS[] = TR_TMIXMAXMS; -const char STR_FREE_STACK[] = TR_FREE_STACK; -const char STR_INT_GPS_LABEL[] = TR_INT_GPS_LABEL; -const char STR_HEARTBEAT_LABEL[] = TR_HEARTBEAT_LABEL; -const char STR_LUA_SCRIPTS_LABEL[] = TR_LUA_SCRIPTS_LABEL; -const char STR_FREE_MEM_LABEL[] = TR_FREE_MEM_LABEL; -const char STR_DURATION_MS[] = TR_DURATION_MS; -const char STR_INTERVAL_MS[] = TR_INTERVAL_MS; -const char STR_MEM_USED_SCRIPT[] = TR_MEM_USED_SCRIPT; -const char STR_MEM_USED_WIDGET[] = TR_MEM_USED_WIDGET; -const char STR_MEM_USED_EXTRA[] = TR_MEM_USED_EXTRA; -const char STR_STACK_MIX[] = TR_STACK_MIX; -const char STR_STACK_AUDIO[] = TR_STACK_AUDIO; -const char STR_GPS_FIX_YES[] = TR_GPS_FIX_YES; -const char STR_GPS_FIX_NO[] = TR_GPS_FIX_NO; -const char STR_GPS_SATS[] = TR_GPS_SATS; -const char STR_GPS_HDOP[] = TR_GPS_HDOP; -const char STR_STACK_MENU[] = TR_STACK_MENU; -const char STR_TIMER_LABEL[] = TR_TIMER_LABEL; -const char STR_THROTTLE_PERCENT_LABEL[] = TR_THROTTLE_PERCENT_LABEL; -const char STR_BATT_LABEL[] = TR_BATT_LABEL; -const char STR_SESSION[] = TR_SESSION; -const char STR_MENUTORESET[] = TR_MENUTORESET; -const char STR_PPM_TRAINER[] = TR_PPM_TRAINER; -const char STR_CH[] = TR_CH; -const char STR_MODEL[] = TR_MODEL; -const char STR_FM[] = TR_FM; -const char STR_PRESS_ANY_KEY_TO_SKIP[] = TR_PRESS_ANY_KEY_TO_SKIP; -const char STR_THROTTLE_NOT_IDLE[] = TR_THROTTLE_NOT_IDLE; -const char STR_ALARMSDISABLED[] = TR_ALARMSDISABLED; -const char STR_PRESSANYKEY[] = TR_PRESSANYKEY; -const char STR_TRIMS2OFFSETS[] = TR_TRIMS2OFFSETS; -const char STR_CHANNELS2FAILSAFE[] = TR_CHANNELS2FAILSAFE; -const char STR_CHANNEL2FAILSAFE[] = TR_CHANNEL2FAILSAFE; -const char STR_RADIO_SETUP[] = TR_RADIO_SETUP; -const char STR_MENUTRAINER[] = TR_MENUTRAINER; -const char STR_MENUSPECIALFUNCS[] = TR_MENUSPECIALFUNCS; -const char STR_MENUVERSION[] = TR_MENUVERSION; -const char STR_MENU_RADIO_SWITCHES[] = TR_MENU_RADIO_SWITCHES; -const char STR_MENU_RADIO_ANALOGS[] = TR_MENU_RADIO_ANALOGS; -const char STR_MENU_RADIO_ANALOGS_CALIB[] = TR_MENU_RADIO_ANALOGS_CALIB; -const char STR_MENU_RADIO_ANALOGS_RAWLOWFPS[] = TR_MENU_RADIO_ANALOGS_RAWLOWFPS; -const char STR_MENUCALIBRATION[] = TR_MENUCALIBRATION; -const char STR_MENU_FSWITCH[] = TR_MENU_FSWITCH; -const char STR_MENUMODELSEL[] = TR_MENUMODELSEL; -const char STR_MENU_MODEL_SETUP[] = TR_MENU_MODEL_SETUP; -const char STR_MENUFLIGHTMODE[] = TR_MENUFLIGHTMODE; -const char STR_MENUFLIGHTMODES[] = TR_MENUFLIGHTMODES; -const char STR_MENUINPUTS[] = TR_MENUINPUTS; -const char STR_MENULIMITS[] = TR_MENULIMITS; -const char STR_MENUCURVES[] = TR_MENUCURVES; -const char STR_MENUCURVE[] = TR_MENUCURVE; -const char STR_MENULOGICALSWITCH[] = TR_MENULOGICALSWITCH; -const char STR_MENULOGICALSWITCHES[] = TR_MENULOGICALSWITCHES; -const char STR_MENUCUSTOMFUNC[] = TR_MENUCUSTOMFUNC; -const char STR_SPLASHSCREEN[] = TR_SPLASHSCREEN; -const char STR_PLAY_HELLO[] = TR_PLAY_HELLO; -const char STR_PWR_ON_DELAY[] = TR_PWR_ON_DELAY; -const char STR_PWR_OFF_DELAY[] = TR_PWR_OFF_DELAY; -const char STR_PWR_AUTO_OFF[] = TR_PWR_AUTO_OFF; -const char STR_THROTTLE_UPPERCASE[] = TR_THROTTLE_UPPERCASE; -const char STR_SWITCHWARNING[] = TR_SWITCHWARNING; -const char STR_POTWARNINGSTATE[] = TR_POTWARNINGSTATE; -const char STR_POTWARNING[] = TR_POTWARNING; -const char STR_MENUSTAT[] = TR_MENUSTAT; -const char STR_MENUDEBUG[] = TR_MENUDEBUG; -const char *const STR_MONITOR_CHANNELS[] = {TR_MONITOR_CHANNELS1, TR_MONITOR_CHANNELS2, TR_MONITOR_CHANNELS3, TR_MONITOR_CHANNELS4}; -const char STR_MONITOR_SWITCHES[] = TR_MONITOR_SWITCHES; -const char STR_MONITOR_OUTPUT_DESC[] = TR_MONITOR_OUTPUT_DESC; -const char STR_MONITOR_MIXER_DESC[] = TR_MONITOR_MIXER_DESC; -const char STR_MENU_GLOBAL_VARS[] = TR_MENU_GLOBAL_VARS; -const char STR_INTERNALRF[] = TR_INTERNALRF; -const char STR_INTERNAL_MODULE[] = TR_INTERNAL_MODULE; -const char STR_EXTERNAL_MODULE[] = TR_EXTERNAL_MODULE; -const char STR_EDGETX_UPGRADE_REQUIRED[] = TR_EDGETX_UPGRADE_REQUIRED; -const char STR_TELEMETRY_DISABLED[] = TR_TELEMETRY_DISABLED; -const char STR_MORE_OPTIONS_AVAILABLE[] = TR_MORE_OPTIONS_AVAILABLE; -const char STR_NO_MODULE_INFORMATION[] = TR_NO_MODULE_INFORMATION; -const char STR_EXTERNALRF[] = TR_EXTERNALRF; -const char STR_MODULE_TELEMETRY[] = TR_MODULE_TELEMETRY; -const char STR_MODULE_TELEM_ON[] = TR_MODULE_TELEM_ON; -const char STR_COUNTRY_CODE[] = TR_COUNTRY_CODE; -const char STR_USBMODE[] = TR_USBMODE; -const char STR_JACK_MODE[] = TR_JACK_MODE; -const char STR_FAILSAFE[] = TR_FAILSAFE; -const char STR_FAILSAFESET[] = TR_FAILSAFESET; -const char STR_REG_ID[] = TR_REG_ID; -const char STR_OWNER_ID[] = TR_OWNER_ID; -const char STR_HOLD[] = TR_HOLD; -const char STR_HOLD_UPPERCASE[] = TR_HOLD_UPPERCASE; -const char STR_NONE[] = TR_NONE; -const char STR_NONE_UPPERCASE[] = TR_NONE_UPPERCASE; -const char STR_MENUSENSOR[] = TR_MENUSENSOR; -const char STR_POWERMETER_PEAK[] = TR_POWERMETER_PEAK; -const char STR_POWERMETER_POWER[] = TR_POWERMETER_POWER; -const char STR_POWERMETER_ATTN[] = TR_POWERMETER_ATTN; -const char STR_POWERMETER_FREQ[] = TR_POWERMETER_FREQ; -const char STR_MENUTOOLS[] = TR_MENUTOOLS; -const char STR_TURN_OFF_RECEIVER[] = TR_TURN_OFF_RECEIVER; -const char STR_STOPPING[] = TR_STOPPING; -const char STR_MENU_SPECTRUM_ANALYSER[] = TR_MENU_SPECTRUM_ANALYSER; -const char STR_MENU_POWER_METER[] = TR_MENU_POWER_METER; -const char STR_SENSOR[] = TR_SENSOR; -const char STR_DISABLE_INTERNAL[] = TR_DISABLE_INTERNAL; -const char STR_AND_SWITCH[] = TR_AND_SWITCH; -const char STR_SF[] = TR_SF; -const char STR_GF[] = TR_GF; -const char STR_ANADIAGS_CALIB[] = TR_ANADIAGS_CALIB; -const char STR_ANADIAGS_FILTRAWDEV[] = TR_ANADIAGS_FILTRAWDEV; -const char STR_ANADIAGS_UNFILTRAW[] = TR_ANADIAGS_UNFILTRAW; -const char STR_ANADIAGS_MINMAX[] = TR_ANADIAGS_MINMAX; -const char STR_ANADIAGS_MOVE[] = TR_ANADIAGS_MOVE; -const char STR_BATT_CALIB[] = TR_BATT_CALIB; -const char STR_VOLTAGE[] = TR_VOLTAGE; -const char STR_CURRENT_CALIB[] = TR_CURRENT_CALIB; -const char STR_UNITS_SYSTEM[] = TR_UNITS_SYSTEM; -const char STR_UNITS_PPM[] = TR_UNITS_PPM; -const char STR_VOICE_LANGUAGE[] = TR_VOICE_LANGUAGE; -const char STR_MODELIDUSED[] = TR_MODELIDUSED; -const char STR_MODELIDUNIQUE[] = TR_MODELIDUNIQUE; -const char STR_BEEP_VOLUME[] = TR_BEEP_VOLUME; -const char STR_WAV_VOLUME[] = TR_WAV_VOLUME; -const char STR_BG_VOLUME[] = TR_BG_VOLUME; -const char STR_SELECT_MODEL[] = TR_SELECT_MODEL; -const char STR_MODELS[] = TR_MODELS; -const char STR_SELECT_MODE[] = TR_SELECT_MODE; -const char STR_CREATE_MODEL[] = TR_CREATE_MODEL; -const char STR_FAVORITE_LABEL[] = TR_FAVORITE_LABEL; -const char STR_MODELS_MOVED[] = TR_MODELS_MOVED; -const char STR_NEW_MODEL[] = TR_NEW_MODEL; -const char STR_INVALID_MODEL[] = TR_INVALID_MODEL; -const char STR_MOVE_UP[] = TR_MOVE_UP; -const char STR_MOVE_DOWN[] = TR_MOVE_DOWN; -const char STR_DUPLICATE_MODEL[] = TR_DUPLICATE_MODEL; -const char STR_COPY_MODEL[] = TR_COPY_MODEL; -const char STR_MOVE_MODEL[] = TR_MOVE_MODEL; -const char STR_DELETE_MODEL[] = TR_DELETE_MODEL; -const char STR_EDIT[] = TR_EDIT; -const char STR_INSERT_BEFORE[] = TR_INSERT_BEFORE; -const char STR_INSERT_AFTER[] = TR_INSERT_AFTER; -const char STR_COPY[] = TR_COPY; -const char STR_MOVE[] = TR_MOVE; -const char STR_PASTE[] = TR_PASTE; -const char STR_PASTE_BEFORE[] = TR_PASTE_BEFORE; -const char STR_PASTE_AFTER[] = TR_PASTE_AFTER; -const char STR_INSERT[] = TR_INSERT; -const char STR_DELETE[] = TR_DELETE; -const char STR_RESET_FLIGHT[] = TR_RESET_FLIGHT; -const char STR_RESET_TIMER1[] = TR_RESET_TIMER1; -const char STR_RESET_TIMER2[] = TR_RESET_TIMER2; -const char STR_RESET_TIMER3[] = TR_RESET_TIMER3; -const char STR_RESET_TELEMETRY[] = TR_RESET_TELEMETRY; -const char STR_STATISTICS[] = TR_STATISTICS; -const char STR_ABOUT_US[] = TR_ABOUT_US; -const char STR_USB_JOYSTICK[] = TR_USB_JOYSTICK; -const char STR_USB_MASS_STORAGE[] = TR_USB_MASS_STORAGE; -const char STR_USB_SERIAL[] = TR_USB_SERIAL; -const char STR_SETUP_SCREENS[] = TR_SETUP_SCREENS; -const char STR_MONITOR_SCREENS[] = TR_MONITOR_SCREENS; -const char STR_RESET_BTN[] = TR_RESET_BTN; -const char STR_DEBUG[] = TR_DEBUG; -const char STR_KEYS_BTN[] = TR_KEYS_BTN; -const char STR_ANALOGS_BTN[] = TR_ANALOGS_BTN; -const char STR_FS_BTN[] = TR_FS_BTN; -const char STR_TOUCH_NOTFOUND[] = TR_TOUCH_NOTFOUND; -const char STR_TOUCH_EXIT[] = TR_TOUCH_EXIT; -const char STR_CALIBRATION[] = TR_CALIBRATION; -const char STR_NO_TOOLS[] = TR_NO_TOOLS; -const char STR_NORMAL[] = TR_NORMAL; -const char STR_NOT_INVERTED[] = TR_NOT_INVERTED; -const char STR_NOT_CONNECTED[] = TR_NOT_CONNECTED; -const char STR_CONNECTED[] = TR_CONNECTED; -const char STR_FLEX_915[] = TR_FLEX_915; -const char STR_FLEX_868[] = TR_FLEX_868; -const char STR_16CH_WITHOUT_TELEMETRY[] = TR_16CH_WITHOUT_TELEMETRY; -const char STR_16CH_WITH_TELEMETRY[] = TR_16CH_WITH_TELEMETRY; -const char STR_8CH_WITH_TELEMETRY[] = TR_8CH_WITH_TELEMETRY; -const char STR_EXT_ANTENNA[] = TR_EXT_ANTENNA; -const char STR_PIN[] = TR_PIN; -const char STR_UPDATE_RX_OPTIONS[] = TR_UPDATE_RX_OPTIONS; -const char STR_UPDATE_TX_OPTIONS[] = TR_UPDATE_TX_OPTIONS; -const char STR_MENU_MODULES_RX_VERSION[] = TR_MENU_MODULES_RX_VERSION; -const char STR_MENU_FIRM_OPTIONS[] = TR_MENU_FIRM_OPTIONS; -const char STR_IMU[] = TR_IMU; -const char STR_STICKS_POTS_SLIDERS[] = TR_STICKS_POTS_SLIDERS; -const char STR_PWM_STICKS_POTS_SLIDERS[] = TR_PWM_STICKS_POTS_SLIDERS; -const char STR_RF_PROTOCOL[] = TR_RF_PROTOCOL; -const char STR_MODULE_OPTIONS[] = TR_MODULE_OPTIONS; -const char STR_POWER[] = TR_POWER; -const char STR_NO_TX_OPTIONS[] = TR_NO_TX_OPTIONS; -const char STR_RTC_BATT[] = TR_RTC_BATT; -const char STR_POWER_METER_EXT[] = TR_POWER_METER_EXT; -const char STR_POWER_METER_INT[] = TR_POWER_METER_INT; -const char STR_SPECTRUM_ANALYSER_EXT[] = TR_SPECTRUM_ANALYSER_EXT; -const char STR_SPECTRUM_ANALYSER_INT[] = TR_SPECTRUM_ANALYSER_INT; -const char STR_GHOST_MODULE_CONFIG[] = TR_GHOST_MODULE_CONFIG; -const char STR_GPS_MODEL_LOCATOR[] = TR_GPS_MODEL_LOCATOR; -const char STR_REFRESH[] = TR_REFRESH; -const char STR_WAITING_FOR_RX[] = TR_WAITING_FOR_RX; -const char STR_WAITING_FOR_TX[] = TR_WAITING_FOR_TX; -const char STR_WAITING_FOR_MODULE[] = TR_WAITING_FOR_MODULE; -const char STR_WARN_5VOLTS[] = TR_WARN_5VOLTS; -const char STR_WARNING[] = TR_WARNING; -const char STR_THROTTLE_WARNING[] = TR_THROTTLE_WARNING; -const char STR_CUSTOM_THROTTLE_WARNING[] = TR_CUSTOM_THROTTLE_WARNING; -const char STR_CUSTOM_THROTTLE_WARNING_VAL[] = TR_CUSTOM_THROTTLE_WARNING_VAL; -const char STR_ALARMSWARN[] = TR_ALARMSWARN; -const char STR_SWITCHWARN[] = TR_SWITCHWARN; -const char STR_FAILSAFEWARN[] = TR_FAILSAFEWARN; -const char STR_WRONG_SDCARDVERSION[] = TR_WRONG_SDCARDVERSION; -const char STR_WARN_RTC_BATTERY_LOW[] = TR_WARN_RTC_BATTERY_LOW; -const char STR_WARN_MULTI_LOWPOWER[] = TR_WARN_MULTI_LOWPOWER; -const char STR_BATTERY[] = TR_BATTERY; -const char STR_WRONG_PCBREV[] = TR_WRONG_PCBREV; -const char STR_EMERGENCY_MODE[] = TR_EMERGENCY_MODE; -const char STR_NO_FAILSAFE[] = TR_NO_FAILSAFE; -const char STR_KEYSTUCK[] = TR_KEYSTUCK; -const char STR_VOLUME[] = TR_VOLUME; -const char STR_LCD[] = TR_LCD; -const char STR_BRIGHTNESS[] = TR_BRIGHTNESS; -const char STR_CPU_TEMP[] = TR_CPU_TEMP; -const char STR_COPROC[] = TR_COPROC; -const char STR_COPROC_TEMP[] = TR_COPROC_TEMP; -const char STR_TTL_WARNING[] = TR_TTL_WARNING; -const char STR_FUNC[] = TR_FUNC; -const char STR_V1[] = TR_V1; -const char STR_V2[] = TR_V2; -const char STR_DURATION[] = TR_DURATION; -const char STR_DELAY[] = TR_DELAY; -const char STR_SD_CARD[] = TR_SD_CARD; -const char STR_SDHC_CARD[] = TR_SDHC_CARD; -const char STR_NO_SOUNDS_ON_SD[] = TR_NO_SOUNDS_ON_SD; -const char STR_NO_MODELS_ON_SD[] = TR_NO_MODELS_ON_SD; -const char STR_NO_BITMAPS_ON_SD[] = TR_NO_BITMAPS_ON_SD; -const char STR_NO_SCRIPTS_ON_SD[] = TR_NO_SCRIPTS_ON_SD; -const char STR_SCRIPT_SYNTAX_ERROR[] = TR_SCRIPT_SYNTAX_ERROR; -const char STR_SCRIPT_PANIC[] = TR_SCRIPT_PANIC; -const char STR_SCRIPT_KILLED[] = TR_SCRIPT_KILLED; -const char STR_SCRIPT_ERROR[] = TR_SCRIPT_ERROR; -const char STR_PLAY_FILE[] = TR_PLAY_FILE; -const char STR_ASSIGN_BITMAP[] = TR_ASSIGN_BITMAP; -const char STR_EXECUTE_FILE[] = TR_EXECUTE_FILE; -const char STR_DELETE_FILE[] = TR_DELETE_FILE; -const char STR_COPY_FILE[] = TR_COPY_FILE; -const char STR_RENAME_FILE[] = TR_RENAME_FILE; -const char STR_SD_INFO[] = TR_SD_INFO; -const char STR_REMOVED[] = TR_REMOVED; -const char STR_NA[] = TR_NA; -const char STR_HARDWARE[] = TR_HARDWARE; -const char STR_FORMATTING[] = TR_FORMATTING; -const char STR_TEMP_CALIB[] = TR_TEMP_CALIB; -const char STR_TIME[] = TR_TIME; -const char STR_MAXBAUDRATE[] = TR_MAXBAUDRATE; -const char STR_BAUDRATE[] = TR_BAUDRATE; -const char STR_CRSF_ARMING_MODE[] = TR_CRSF_ARMING_MODE; -const char STR_SAMPLE_MODE[] = TR_SAMPLE_MODE; -const char STR_SD_INFO_TITLE[] = TR_SD_INFO_TITLE; -const char STR_SD_SPEED[] = TR_SD_SPEED; -const char STR_SD_SECTORS[] = TR_SD_SECTORS; -const char STR_SD_SIZE[] = TR_SD_SIZE; -const char STR_TYPE[] = TR_TYPE; -const char STR_GLOBAL_VARS[] = TR_GLOBAL_VARS; -const char STR_GVARS[] = TR_GVARS; -const char STR_GLOBAL_VAR[] = TR_GLOBAL_VAR; -const char STR_OWN[] = TR_OWN; -const char STR_DATE[] = TR_DATE; -const char STR_CHANNELS_MONITOR[] = TR_CHANNELS_MONITOR; -const char STR_ROTARY_ENCODER[] = TR_ROTARY_ENCODER; -const char STR_ROTARY_ENC_MODE[] = TR_ROTARY_ENC_MODE; - -#if defined(USE_HATS_AS_KEYS) -const char STR_HATSMODE[] = TR_HATSMODE; -ISTR(HATSOPT); -const char STR_HATSMODE_TRIMS[] = TR_HATSMODE_TRIMS; -const char STR_HATSMODE_KEYS[] = TR_HATSMODE_KEYS; -const char STR_HATSMODE_KEYS_HELP[] = TR_HATSMODE_KEYS_HELP; -#endif - -const char STR_MIXERS_MONITOR[] = TR_MIXERS_MONITOR; -const char STR_PATH_TOO_LONG[] = TR_PATH_TOO_LONG; -const char STR_VIEW_TEXT[] = TR_VIEW_TEXT; -const char STR_FLASH_BOOTLOADER[] = TR_FLASH_BOOTLOADER; -const char STR_CURRENT_VERSION[] = TR_CURRENT_VERSION; -const char STR_FLASH_INTERNAL_MODULE[] = TR_FLASH_INTERNAL_MODULE; -const char STR_FLASH_INTERNAL_MULTI[] = TR_FLASH_INTERNAL_MULTI; -const char STR_FLASH_EXTERNAL_MODULE[] = TR_FLASH_EXTERNAL_MODULE; -const char STR_FLASH_EXTERNAL_MULTI[] = TR_FLASH_EXTERNAL_MULTI; -const char STR_FLASH_EXTERNAL_ELRS[] = TR_FLASH_EXTERNAL_ELRS; -const char STR_FIRMWARE_UPDATE_ERROR[] = TR_FIRMWARE_UPDATE_ERROR; -const char STR_FIRMWARE_UPDATE_SUCCESS[] = TR_FIRMWARE_UPDATE_SUCCESS; -const char STR_WRITING[] = TR_WRITING; -const char STR_FLASH_DEVICE[] = TR_FLASH_DEVICE; -const char STR_FLASH_EXTERNAL_DEVICE[] = TR_FLASH_EXTERNAL_DEVICE; -const char STR_FLASH_RECEIVER_OTA[] = TR_FLASH_RECEIVER_OTA; -const char STR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA[] = TR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA; -const char STR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA[] = TR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA; -const char STR_FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA[] = TR_FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA; -const char STR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA[] = TR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA; -const char STR_FLASH_BLUETOOTH_MODULE[] = TR_FLASH_BLUETOOTH_MODULE; -const char STR_FLASH_POWER_MANAGEMENT_UNIT[] = TR_FLASH_POWER_MANAGEMENT_UNIT; -const char STR_DEVICE_NO_RESPONSE[] = TR_DEVICE_NO_RESPONSE; -const char STR_DEVICE_FILE_ERROR[] = TR_DEVICE_FILE_ERROR; -const char STR_DEVICE_DATA_REFUSED[] = TR_DEVICE_DATA_REFUSED; -const char STR_DEVICE_WRONG_REQUEST[] = TR_DEVICE_WRONG_REQUEST; -const char STR_DEVICE_FILE_REJECTED[] = TR_DEVICE_FILE_REJECTED; -const char STR_DEVICE_FILE_WRONG_SIG[] = TR_DEVICE_FILE_WRONG_SIG; -const char STR_CONFIRM_FORMAT[] = TR_CONFIRM_FORMAT; -const char STR_CONFIRMRESET[] = TR_CONFIRMRESET; -const char STR_TOO_MANY_LUA_SCRIPTS[] = TR_TOO_MANY_LUA_SCRIPTS; -const char STR_BLCOLOR[] = TR_BLCOLOR; -const char STR_MODELNAME[] = TR_MODELNAME; -const char STR_PHASENAME[] = TR_PHASENAME; -const char STR_MIXNAME[] = TR_MIXNAME; -const char STR_INPUTNAME[] = TR_INPUTNAME; -const char STR_EXPONAME[] = TR_EXPONAME; -const char STR_TRAINER[] = TR_TRAINER; -const char STR_CHANS[] = TR_CHANS; -const char STR_MODULE_BIND[] = TR_MODULE_BIND; -const char STR_MODULE_UNBIND[] = TR_MODULE_UNBIND; -const char STR_POWERMETER_ATTN_NEEDED[] = TR_POWERMETER_ATTN_NEEDED; -const char STR_PXX2_SELECT_RX[] = TR_PXX2_SELECT_RX; -const char STR_PXX2_DEFAULT[] = TR_PXX2_DEFAULT; -const char STR_BT_SELECT_DEVICE[] = TR_BT_SELECT_DEVICE; -const char STR_DISCOVER[] = TR_DISCOVER; -const char STR_BUTTON_INIT[] = TR_BUTTON_INIT; -const char STR_WAITING[] = TR_WAITING; -const char STR_RECEIVER_DELETE[] = TR_RECEIVER_DELETE; -const char STR_RECEIVER_RESET[] = TR_RECEIVER_RESET; -const char STR_SHARE[] = TR_SHARE; -const char STR_BIND[] = TR_BIND; -const char STR_REGISTER[] = TR_REGISTER; -const char STR_BINDING_1_8_TELEM_ON[] = TR_BINDING_CH1_8_TELEM_ON; -const char STR_BINDING_1_8_TELEM_OFF[] = TR_BINDING_CH1_8_TELEM_OFF; -const char STR_BINDING_9_16_TELEM_ON[] = TR_BINDING_CH9_16_TELEM_ON; -const char STR_BINDING_9_16_TELEM_OFF[] = TR_BINDING_CH9_16_TELEM_OFF; -const char STR_CHANNELRANGE[] = TR_CHANNELRANGE; -const char STR_ANTENNACONFIRM1[] = TR_ANTENNACONFIRM1; -const char STR_ANTENNACONFIRM2[] = TR_ANTENNACONFIRM2; -const char STR_USE_INTERNAL_ANTENNA[] = TR_USE_INTERNAL_ANTENNA; -const char STR_USE_EXTERNAL_ANTENNA[] = TR_USE_EXTERNAL_ANTENNA; -const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[] = TR_MODULE_PROTOCOL_FLEX_WARN_LINE1; -const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[] = TR_MODULE_PROTOCOL_FCC_WARN_LINE1; -const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[] = TR_MODULE_PROTOCOL_EU_WARN_LINE1; -const char STR_MODULE_PROTOCOL_WARN_LINE2[] = TR_MODULE_PROTOCOL_WARN_LINE2; -const char STR_SET[] = TR_SET; -const char STR_PREFLIGHT[] = TR_PREFLIGHT; -const char STR_CHECKLIST[] = TR_CHECKLIST; -const char STR_CHECKLIST_INTERACTIVE[] = TR_CHECKLIST_INTERACTIVE; -const char STR_VIEW_NOTES[] = TR_VIEW_NOTES; -const char STR_MODEL_SELECT[] = TR_MODEL_SELECT; -const char STR_RESET_SUBMENU[] = TR_RESET_SUBMENU; -const char STR_LOWALARM[] = TR_LOWALARM; -const char STR_CRITICALALARM[] = TR_CRITICALALARM; -const char STR_DISABLE_ALARM[] = TR_DISABLE_ALARM; -const char STR_TELEMETRY_TYPE[] = TR_TELEMETRY_TYPE; -const char STR_TELEMETRY_SENSORS[] = TR_TELEMETRY_SENSORS; -const char STR_VALUE[] = TR_VALUE; -const char STR_PERIOD[] = TR_PERIOD; -const char STR_INTERVAL[] = TR_INTERVAL; -const char STR_REPEAT[] = TR_REPEAT; -const char STR_ENABLE[] = TR_ENABLE; -const char STR_DISABLE[] = TR_DISABLE; -const char STR_TOPLCDTIMER[] = TR_TOPLCDTIMER; -const char STR_UNIT[] = TR_UNIT; -const char STR_TELEMETRY_NEWSENSOR[] = TR_TELEMETRY_NEWSENSOR; -const char STR_ID[] = TR_ID; -const char STR_PRECISION[] = TR_PRECISION; -const char STR_RATIO[] = TR_RATIO; -const char STR_FORMULA[] = TR_FORMULA; -const char STR_CELLINDEX[] = TR_CELLINDEX; -const char STR_LOGS[] = TR_LOGS; -const char STR_OPTIONS[] = TR_OPTIONS; -const char STR_FIRMWARE_OPTIONS[] = TR_FIRMWARE_OPTIONS; -const char STR_ALTSENSOR[] = TR_ALTSENSOR; -const char STR_CELLSENSOR[] = TR_CELLSENSOR; -const char STR_GPSSENSOR[] = TR_GPSSENSOR; -const char STR_CURRENTSENSOR[] = TR_CURRENTSENSOR; -const char STR_AUTOOFFSET[] = TR_AUTOOFFSET; -const char STR_ONLYPOSITIVE[] = TR_ONLYPOSITIVE; -const char STR_FILTER[] = TR_FILTER; -const char STR_TELEMETRYFULL[] = TR_TELEMETRYFULL; -const char STR_IGNORE_INSTANCE[] = TR_IGNORE_INSTANCE; -const char STR_SHOW_INSTANCE_ID[] = TR_SHOW_INSTANCE_ID; -const char STR_DISCOVER_SENSORS[] = TR_DISCOVER_SENSORS; -const char STR_STOP_DISCOVER_SENSORS[] = TR_STOP_DISCOVER_SENSORS; -const char STR_DELETE_ALL_SENSORS[] = TR_DELETE_ALL_SENSORS; -const char STR_CONFIRMDELETE[] = TR_CONFIRMDELETE; -const char STR_SELECT_WIDGET[] = TR_SELECT_WIDGET; -const char STR_REMOVE_WIDGET[] = TR_REMOVE_WIDGET; -const char STR_WIDGET_SETTINGS[] = TR_WIDGET_SETTINGS; -const char STR_WIDGET_FULLSCREEN[] = TR_WIDGET_FULLSCREEN; -const char STR_REMOVE_SCREEN[] = TR_REMOVE_SCREEN; -const char STR_SETUP_WIDGETS[] = TR_SETUP_WIDGETS; -const char STR_USER_INTERFACE[] = TR_USER_INTERFACE; -const char STR_THEME[] = TR_THEME; -const char STR_SETUP[] = TR_SETUP; -const char STR_LAYOUT[] = TR_LAYOUT; -const char STR_ADD_MAIN_VIEW[] = TR_ADD_MAIN_VIEW; -const char STR_TEXT_COLOR[] = TR_TEXT_COLOR; -const char STR_RF_POWER[] = TR_RF_POWER; -const char STR_BYTES[] = TR_BYTES; -const char STR_ANTENNAPROBLEM[] = TR_ANTENNAPROBLEM; -const char STR_MODULE[] = TR_MODULE; -const char STR_RX_NAME[] = TR_RX_NAME; -const char STR_POPUP[] = TR_POPUP; -const char STR_MIN[] = TR_MIN; -const char STR_MAX[] = TR_MAX; -const char STR_INVERTED[] = TR_INVERTED; -const char STR_CURVE_PRESET[] = TR_CURVE_PRESET; -const char STR_PRESET[] = TR_PRESET; -const char STR_CLEAR[] = TR_CLEAR; -const char STR_RESET[] = TR_RESET; -const char STR_ADD_ALL_TRIMS_TO_SUBTRIMS[] = TR_ADD_ALL_TRIMS_TO_SUBTRIMS; -const char STR_OPEN_CHANNEL_MONITORS[] = TR_OPEN_CHANNEL_MONITORS; -const char STR_COUNT[] = TR_COUNT; -const char STR_PT[] = TR_PT; -const char STR_PTS[] = TR_PTS; -const char STR_SMOOTH[] = TR_SMOOTH; -const char STR_COPY_STICKS_TO_OFS[] = TR_COPY_STICKS_TO_OFS; -const char STR_COPY_MIN_MAX_TO_OUTPUTS[] = TR_COPY_MIN_MAX_TO_OUTPUTS; -const char STR_COPY_TRIMS_TO_OFS[] = TR_COPY_TRIMS_TO_OFS; -const char STR_INCDEC[] = TR_INCDEC; -const char STR_GLOBALVAR[] = TR_GLOBALVAR; -const char STR_MIXSOURCE[] = TR_MIXSOURCE; -const char STR_MIXSOURCERAW[] = TR_MIXSOURCERAW; -const char STR_CONSTANT[] = TR_CONSTANT; -const char STR_TOP_BAR[] = TR_TOP_BAR; -const char STR_FLASH_ERASE[] = TR_FLASH_ERASE; -const char STR_FLASH_WRITE[] = TR_FLASH_WRITE; -const char STR_OTA_UPDATE[] = TR_OTA_UPDATE; -const char STR_MODULE_RESET[] = TR_MODULE_RESET; -const char STR_UNKNOWN_RX[] = TR_UNKNOWN_RX; -const char STR_UNSUPPORTED_RX[] = TR_UNSUPPORTED_RX; -const char STR_OTA_UPDATE_ERROR[] = TR_OTA_UPDATE_ERROR; -const char STR_DEVICE_RESET[] = TR_DEVICE_RESET; -const char STR_ALTITUDE[] = TR_ALTITUDE; -const char STR_SCALE[] = TR_SCALE; -const char STR_VIEW_CHANNELS[] = TR_VIEW_CHANNELS; -const char STR_AUX_SERIAL_MODE[] = TR_AUX_SERIAL_MODE; -const char STR_AUX2_SERIAL_MODE[] = TR_AUX2_SERIAL_MODE; -const char STR_AUX_SERIAL_PORT_POWER[] = TR_AUX_SERIAL_PORT_POWER; -const char STR_THROTTLE_LABEL[] = TR_THROTTLE_LABEL; -const char STR_SCRIPT[] = TR_SCRIPT; -const char STR_INPUTS[] = TR_INPUTS; -const char STR_OUTPUTS[] = TR_OUTPUTS; -const char STR_MENU_INPUTS[] = TR_MENU_INPUTS; -const char STR_MENU_LUA[] = TR_MENU_LUA; -const char STR_MENU_STICKS[] = TR_MENU_STICKS; -const char STR_MENU_POTS[] = TR_MENU_POTS; -const char STR_MENU_MIN[] = TR_MENU_MIN; -const char STR_MENU_MAX[] = TR_MENU_MAX; -const char STR_MENU_HELI[] = TR_MENU_HELI; -const char STR_MENU_TRIMS[] = TR_MENU_TRIMS; -const char STR_MENU_SWITCHES[] = TR_MENU_SWITCHES; -const char STR_MENU_LOGICAL_SWITCHES[] = TR_MENU_LOGICAL_SWITCHES; -const char STR_MENU_TRAINER[] = TR_MENU_TRAINER; -const char STR_MENU_CHANNELS[] = TR_MENU_CHANNELS; -const char STR_MENU_GVARS[] = TR_MENU_GVARS; -const char STR_MENU_TELEMETRY[] = TR_MENU_TELEMETRY; -const char STR_MENU_DISPLAY[] = TR_MENU_DISPLAY; -const char STR_MENU_OTHER[] = TR_MENU_OTHER; -const char STR_MENU_INVERT[] = TR_MENU_INVERT; -const char STR_AUDIO_MUTE[] = TR_AUDIO_MUTE; -const char STR_JITTER_FILTER[] = TR_JITTER_FILTER; -const char STR_DEAD_ZONE[] = TR_DEAD_ZONE; -const char STR_RTC_CHECK[] = TR_RTC_CHECK; -const char STR_EXIT[] = TR_EXIT; -const char STR_MODULE_RANGE[] = TR_MODULE_RANGE; -const char STR_RANGE_TEST[] = TR_RANGE_TEST; -const char STR_RECEIVER_OPTIONS[] = TR_RECEIVER_OPTIONS; -const char STR_SPORT_UPDATE_POWER_MODE[] = TR_SPORT_UPDATE_POWER_MODE; -const char STR_TOUCH_PANEL[] = TR_TOUCH_PANEL; -const char STR_FILE_SIZE[] = TR_FILE_SIZE; -const char STR_FILE_OPEN[] = TR_FILE_OPEN; -const char* const STR_TIMER_MODES[] = TR_TIMER_MODES; -const char* const STR_MONTHS[] = TR_MONTHS; -const char STR_LIMITS_HEADERS_DIRECTION[] = TR_LIMITS_HEADERS_DIRECTION; -const char STR_SRC_BATT[] = TR_SRC_BATT; -const char STR_SRC_TIME[] = TR_SRC_TIME; -const char STR_SRC_GPS[] = TR_SRC_GPS; -const char STR_SRC_TIMER[] = TR_SRC_TIMER; -const char STR_FUNC_SW[] = TR_FUNC_SW; - -#if defined(COLORLCD) -const char STR_ASSIGN_SPLASH[] = TR_ASSIGN_SPLASH; -const char STR_FIRST_CHANNEL[] = TR_FIRST_CHANNEL; -const char STR_FILL_BACKGROUND[] = TR_FILL_BACKGROUND; -const char STR_BG_COLOR[] = TR_BG_COLOR; -const char STR_SLIDERS_TRIMS[] = TR_SLIDERS_TRIMS; -const char STR_SLIDERS[] = TR_SLIDERS; -const char STR_FLIGHT_MODE[] = TR_FLIGHT_MODE; -const char STR_INVALID_FILE[] = TR_INVALID_FILE; -const char STR_TIMER_SOURCE[] = TR_TIMER_SOURCE; -const char STR_SIZE[] = TR_SIZE; -const char STR_SHADOW[] = TR_SHADOW; -const char STR_ALIGNMENT[] = TR_ALIGNMENT; -const char STR_ALIGN_LABEL[] = TR_ALIGN_LABEL; -const char STR_ALIGN_VALUE[] = TR_ALIGN_VALUE; -const char* const STR_ALIGN_OPTS[] = TR_ALIGN_OPTS; -const char STR_TEXT[] = TR_TEXT; -const char STR_COLOR[] = TR_COLOR; -const char STR_MAIN_VIEW_X[] = TR_MAIN_VIEW_X; -const char STR_PANEL1_BACKGROUND[] = TR_PANEL1_BACKGROUND; -const char STR_PANEL2_BACKGROUND[] = TR_PANEL2_BACKGROUND; -const char STR_WIDGET_GAUGE[] = TR_WIDGET_GAUGE; -const char STR_WIDGET_MODELBMP[] = TR_WIDGET_MODELBMP; -const char STR_WIDGET_OUTPUTS[] = TR_WIDGET_OUTPUTS; -const char STR_WIDGET_TEXT[] = TR_WIDGET_TEXT; -const char STR_WIDGET_TIMER[] = TR_WIDGET_TIMER; -const char STR_WIDGET_VALUE[] = TR_WIDGET_VALUE; -const char STR_MODULES_RX_VERSION[] = TR_MODULES_RX_VERSION; -const char STR_LEFT_STICK[] = TR_LEFT_STICK; -const char STR_SHOW_MIXER_MONITORS[] = TR_SHOW_MIXER_MONITORS; -const char STR_MODEL_QUICK_SELECT[] = TR_MODEL_QUICK_SELECT; -const char STR_LOADING[] = TR_LOADING; -const char STR_DELETE_THEME[] = TR_DELETE_THEME; -const char STR_SAVE_THEME[] = TR_SAVE_THEME; -const char STR_EDIT_COLOR[] = TR_EDIT_COLOR; -const char STR_NO_THEME_IMAGE[] = TR_NO_THEME_IMAGE; -const char STR_BACKLIGHT_TIMER[] = TR_BACKLIGHT_TIMER; -const char STR_LABELS_SELECT[] = TR_LABELS_SELECT; -const char STR_LABELS_MATCH[] = TR_LABELS_MATCH; -const char STR_FAV_MATCH[] = TR_FAV_MATCH; -ISTR(LABELS_SELECT_MODE); -ISTR(LABELS_MATCH_MODE); -ISTR(FAV_MATCH_MODE); -#endif - -#if !defined(COLORLCD) -const char STR_MENUWHENDONE[] = TR_MENUWHENDONE; -const char STR_NO_TELEMETRY_SCREENS[] = TR_NO_TELEMETRY_SCREENS; -#endif - - -#if defined(HELI) -const char STR_MENUHELISETUP[] = TR_MENUHELISETUP; -const char STR_SWASHTYPE[] = TR_SWASHTYPE; -const char STR_COLLECTIVE[] = TR_COLLECTIVE; -const char STR_AILERON[] = TR_AILERON; -const char STR_ELEVATOR[] = TR_ELEVATOR; -const char STR_SWASHRING[] = TR_SWASHRING; -#endif #if defined(AUDIO) && defined(BUZZER) -const char STR_SPEAKER[] = TR_SPEAKER; -const char STR_BUZZER[] = TR_BUZZER; +STR(SPEAKER); +STR(BUZZER); #endif -#if defined(AUDIO) -const char STR_BEEP_PITCH[] = TR_BEEP_PITCH; -#endif - -#if defined(HAPTIC) -const char STR_PWR_ON_OFF_HAPTIC[] = TR_PWR_ON_OFF_HAPTIC; -const char STR_HAPTIC_LABEL[] = TR_HAPTIC_LABEL; -const char STR_STRENGTH[] = TR_STRENGTH; -#endif - -#if defined(IMU) -const char STR_IMU_LABEL[] = TR_IMU_LABEL; -const char STR_IMU_OFFSET[] = TR_IMU_OFFSET; -const char STR_IMU_MAX[] = TR_IMU_MAX; -#endif - -#if defined(COLORLCD) -const char STR_BLONBRIGHTNESS[] = TR_BLONBRIGHTNESS; -const char STR_BLOFFBRIGHTNESS[] = TR_BLOFFBRIGHTNESS; -const char STR_KEYS_BACKLIGHT[] = TR_KEYS_BACKLIGHT; -#endif - -const char STR_TIMEZONE[] = TR_TIMEZONE; -const char STR_ADJUST_RTC[] = TR_ADJUST_RTC; -const char STR_GPS[] = TR_GPS; -const char STR_GPS_COORDS_FORMAT[] = TR_GPS_COORDS_FORMAT; -const char STR_VARIO[] = TR_VARIO; -const char STR_FLYSKY_TELEMETRY[] = TR_FLYSKY_TELEMETRY; -const char STR_PITCH_AT_ZERO[] = TR_PITCH_AT_ZERO; -const char STR_PITCH_AT_MAX[] = TR_PITCH_AT_MAX; -const char STR_REPEAT_AT_ZERO[] = TR_REPEAT_AT_ZERO; - -const char STR_BAD_RADIO_DATA[] = TR_BAD_RADIO_DATA; -const char STR_STORAGE_WARNING[] = TR_STORAGE_WARNING; -const char STR_STORAGE_FORMAT[] = TR_STORAGE_FORMAT; -const char STR_RADIO_DATA_UNRECOVERABLE[] = TR_RADIO_DATA_UNRECOVERABLE; -const char STR_RADIO_DATA_RECOVERED[] = TR_RADIO_DATA_RECOVERED; -const char STR_EEPROMOVERFLOW[] = TR_EEPROMOVERFLOW; - -#if defined(LUA) -const char STR_MENUCUSTOMSCRIPTS[] = TR_MENUCUSTOMSCRIPTS; -#endif - -const char STR_MENUTELEMETRY[] = TR_MENUTELEMETRY; - -#if defined(DSM2) || defined(PXX) -const char STR_RECEIVER_NUM[] = TR_RECEIVER_NUM; -const char STR_RECEIVER[] = TR_RECEIVER; -const char STR_REBIND[] = TR_REBIND; -const char STR_REG_OK[] = TR_REG_OK; -const char STR_BIND_OK[] = TR_BIND_OK; -#endif - -const char STR_MULTI_CUSTOM[] = TR_MULTI_CUSTOM; -const char STR_MULTI_RFTUNE[] = TR_MULTI_RFTUNE; -const char STR_MULTI_RFPOWER[] = TR_MULTI_RFPOWER; -const char STR_MULTI_WBUS[] = TR_MULTI_WBUS; -const char STR_MULTI_TELEMETRY[] = TR_MULTI_TELEMETRY; -const char STR_MULTI_VIDFREQ[] = TR_MULTI_VIDFREQ; -const char STR_MULTI_OPTION[] = TR_MULTI_OPTION; -const char STR_MULTI_FIXEDID[] = TR_MULTI_FIXEDID; -const char STR_MULTI_AUTOBIND[] = TR_MULTI_AUTOBIND; -const char STR_DISABLE_CH_MAP[] = TR_DISABLE_CH_MAP; -const char STR_DISABLE_TELEM[] = TR_DISABLE_TELEM; -const char STR_MULTI_LOWPOWER[] = TR_MULTI_LOWPOWER; -const char STR_MULTI_LNA_DISABLE[] = TR_MULTI_LNA_DISABLE; -const char STR_MODULE_NO_SERIAL_MODE[] = TR_MODULE_NO_SERIAL_MODE; -const char STR_MODULE_NO_INPUT[] = TR_MODULE_NO_INPUT; -const char STR_MODULE_WAITFORBIND[] = TR_MODULE_WAITFORBIND; -const char STR_MODULE_NO_TELEMETRY[] = TR_MODULE_NO_TELEMETRY; -const char STR_MODULE_BINDING[] = TR_MODULE_BINDING; -const char STR_MODULE_UPGRADE_ALERT[] = TR_MODULE_UPGRADE_ALERT; -const char STR_MODULE_UPGRADE[] = TR_MODULE_UPGRADE; -const char STR_PROTOCOL_INVALID[] = TR_PROTOCOL_INVALID; -const char STR_MODULE_STATUS[] = TR_MODULE_STATUS; -const char STR_MODULE_SYNC[] = TR_MODULE_SYNC; -const char STR_MULTI_SERVOFREQ[] = TR_MULTI_SERVOFREQ; -const char STR_MULTI_MAX_THROW[] = TR_MULTI_MAX_THROW; -const char STR_MULTI_RFCHAN[] = TR_MULTI_RFCHAN; -const char STR_NEEDS_FILE[] = TR_NEEDS_FILE; -const char STR_EXT_MULTI_SPEC[] = TR_EXT_MULTI_SPEC; -const char STR_INT_MULTI_SPEC[] = TR_INT_MULTI_SPEC; - -#if defined(AFHDS3) -const char STR_AFHDS3_RX_FREQ[] = TR_AFHDS3_RX_FREQ; -const char STR_AFHDS3_ACTUAL_POWER[] = TR_AFHDS3_ACTUAL_POWER; -const char STR_AFHDS3_POWER_SOURCE[] = TR_AFHDS3_POWER_SOURCE; -const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[] =TR_AFHDS3_ONE_TO_ONE_TELEMETRY; -const char STR_AFHDS3_ONE_TO_MANY[] = TR_AFHDS3_ONE_TO_MANY; -#endif - -const char STR_SUBTYPE[] = TR_SUBTYPE; - -const char STR_BACKUP_MODEL[] = TR_BACKUP_MODEL; -const char STR_RESTORE_MODEL[] = TR_RESTORE_MODEL; -const char STR_DELETE_ERROR[] = TR_DELETE_ERROR; -const char STR_SDCARD_ERROR[] = TR_SDCARD_ERROR; -const char STR_SDCARD[] = TR_SDCARD; -const char STR_NO_FILES_ON_SD[] = TR_NO_FILES_ON_SD; -const char STR_NO_SDCARD[] = TR_NO_SDCARD; -const char STR_SDCARD_FULL[] = TR_SDCARD_FULL; -const char STR_SDCARD_FULL_EXT[] = TR_SDCARD_FULL_EXT; -const char STR_INCOMPATIBLE[] = TR_INCOMPATIBLE; -const char STR_LOGS_PATH[] = LOGS_PATH; -const char STR_LOGS_EXT[] = LOGS_EXT; -const char STR_MODELS_PATH[] = MODELS_PATH; -const char STR_MODELS_EXT[] = MODELS_EXT; -const char STR_BACKUP_PATH[] = BACKUP_PATH; -const char STR_YAML_EXT[] = YAML_EXT; - -const char STR_TEST_WARNING[] = TR_TEST_WARNING; -const char STR_TEST_NOTSAFE[] = TR_TEST_NOTSAFE; - -#if LCD_W >= 212 -const char * const STR_PHASES_HEADERS[] = TR_PHASES_HEADERS; -const char * const STR_LIMITS_HEADERS[] = TR_LIMITS_HEADERS; -const char * const STR_LSW_HEADERS[] = TR_LSW_HEADERS; -const char * const STR_LSW_DESCRIPTIONS[] = TR_LSW_DESCRIPTIONS; -#endif - -#if defined(BLUETOOTH) -const char STR_BLUETOOTH[] = TR_BLUETOOTH; -const char STR_BLUETOOTH_DISC[] = TR_BLUETOOTH_DISC; -const char STR_BLUETOOTH_INIT[] = TR_BLUETOOTH_INIT; -const char STR_BLUETOOTH_DIST_ADDR[] = TR_BLUETOOTH_DIST_ADDR; -const char STR_BLUETOOTH_LOCAL_ADDR[] = TR_BLUETOOTH_LOCAL_ADDR; -const char STR_BLUETOOTH_PIN_CODE[] = TR_BLUETOOTH_PIN_CODE; -const char STR_BLUETOOTH_NODEVICES[] = TR_BLUETOOTH_NODEVICES; -const char STR_BLUETOOTH_SCANNING[] = TR_BLUETOOTH_SCANNING; -const char STR_BLUETOOTH_BAUDRATE[] = TR_BLUETOOTH_BAUDRATE; -#endif - -const char STR_ABOUTUS[] = TR_ABOUTUS; - -const char STR_AUTH_FAILURE[] = TR_AUTH_FAILURE; -const char STR_PROTOCOL[] = TR_PROTOCOL; -const char STR_RACING_MODE[] = TR_RACING_MODE; - -#if defined(RADIO_NV14_FAMILY) -ISTR(RFPOWER_AFHDS2); -#endif - -#if defined(COLORLCD) -const char STR_SELECT_TEMPLATE[] = TR_SELECT_TEMPLATE; -const char STR_SELECT_TEMPLATE_FOLDER[] = TR_SELECT_TEMPLATE_FOLDER; -const char STR_NO_TEMPLATES[] = TR_NO_TEMPLATES; -const char STR_SAVE_TEMPLATE[] = TR_SAVE_TEMPLATE; -const char STR_BLANK_MODEL[] = TR_BLANK_MODEL; -const char STR_BLANK_MODEL_INFO[] = TR_BLANK_MODEL_INFO; -const char STR_FILE_EXISTS[] = TR_FILE_EXISTS; -const char STR_ASK_OVERWRITE[] = TR_ASK_OVERWRITE; - -const char STR_USE_THEME_COLOR[] = TR_USE_THEME_COLOR; - -const char STR_DUPLICATE[] = TR_DUPLICATE; -const char STR_ACTIVATE[] = TR_ACTIVATE; -const char STR_RED[] = TR_RED; -const char STR_GREEN[] = TR_GREEN; -const char STR_BLUE[] = TR_BLUE; -const char STR_COLOR_PICKER[] = TR_COLOR_PICKER; -const char STR_FIXED[] = TR_FIXED; -const char STR_EDIT_THEME_DETAILS[] = TR_EDIT_THEME_DETAILS; -const char STR_THEME_COLOR_DEFAULT[] = TR_THEME_COLOR_DEFAULT; -const char STR_THEME_COLOR_PRIMARY1[] = TR_THEME_COLOR_PRIMARY1; -const char STR_THEME_COLOR_PRIMARY2[] = TR_THEME_COLOR_PRIMARY2; -const char STR_THEME_COLOR_PRIMARY3[] = TR_THEME_COLOR_PRIMARY3; -const char STR_THEME_COLOR_SECONDARY1[] = TR_THEME_COLOR_SECONDARY1; -const char STR_THEME_COLOR_SECONDARY2[] = TR_THEME_COLOR_SECONDARY2; -const char STR_THEME_COLOR_SECONDARY3[] = TR_THEME_COLOR_SECONDARY3; -const char STR_THEME_COLOR_FOCUS[] = TR_THEME_COLOR_FOCUS; -const char STR_THEME_COLOR_EDIT[] = TR_THEME_COLOR_EDIT; -const char STR_THEME_COLOR_ACTIVE[] = TR_THEME_COLOR_ACTIVE; -const char STR_THEME_COLOR_WARNING[] = TR_THEME_COLOR_WARNING; -const char STR_THEME_COLOR_DISABLED[] = TR_THEME_COLOR_DISABLED; -const char STR_THEME_COLOR_CUSTOM[] = TR_THEME_COLOR_CUSTOM; -const char STR_THEME_CHECKBOX[] = TR_THEME_CHECKBOX; -const char STR_THEME_ACTIVE[] = TR_THEME_ACTIVE; -const char STR_THEME_REGULAR[] = TR_THEME_REGULAR; -const char STR_THEME_WARNING[] = TR_THEME_WARNING; -const char STR_THEME_DISABLED[] = TR_THEME_DISABLED; -const char STR_THEME_EDIT[] = TR_THEME_EDIT; -const char STR_THEME_FOCUS[] = TR_THEME_FOCUS; -const char STR_AUTHOR[] = TR_AUTHOR; -const char STR_DESCRIPTION[] = TR_DESCRIPTION; -const char STR_SAVE[] = TR_SAVE; -const char STR_CANCEL[] = TR_CANCEL; -const char STR_EDIT_THEME[] = TR_EDIT_THEME; -const char STR_DETAILS[] = TR_DETAILS; -const char STR_THEME_EDITOR[] = TR_THEME_EDITOR; - -const char STR_EDIT_LABELS[] = TR_EDIT_LABELS; -const char STR_LABEL_MODEL[] = TR_LABEL_MODEL; -const char STR_ENTER_LABEL[] = TR_ENTER_LABEL; -const char STR_LABEL[] = TR_LABEL; -const char STR_LABELS[] = TR_LABELS; -const char STR_ACTIVE[] = TR_ACTIVE; -const char STR_NEW[] = TR_NEW; -const char STR_NEW_LABEL[] = TR_NEW_LABEL; -const char STR_RENAME_LABEL[] = TR_RENAME_LABEL; -const char STR_DELETE_LABEL[] = TR_DELETE_LABEL; -const char STR_MAIN_MENU_SELECT_MODEL[] = TR_MAIN_MENU_SELECT_MODEL; -const char STR_MAIN_MENU_MANAGE_MODELS[] = TR_MAIN_MENU_MANAGE_MODELS; -const char STR_MAIN_MENU_MODEL_NOTES[] = TR_MAIN_MENU_MODEL_NOTES; -const char STR_MAIN_MENU_CHANNEL_MONITOR[] = TR_MAIN_MENU_CHANNEL_MONITOR; -const char STR_MAIN_MENU_MODEL_SETTINGS[] = TR_MAIN_MENU_MODEL_SETTINGS; -const char STR_MAIN_MENU_RADIO_SETTINGS[] = TR_MAIN_MENU_RADIO_SETTINGS; -const char STR_MAIN_MENU_SCREEN_SETTINGS[] = TR_MAIN_MENU_SCREEN_SETTINGS; -const char STR_MAIN_MENU_RESET_TELEMETRY[] = TR_MAIN_MENU_RESET_TELEMETRY; -const char STR_MAIN_MENU_STATISTICS[] = TR_MAIN_MENU_STATISTICS; -const char STR_MAIN_MENU_ABOUT_EDGETX[] = TR_MAIN_MENU_ABOUT_EDGETX; -const char STR_MANAGE_MODELS[] = TR_MANAGE_MODELS; -#endif - -#if defined(USBJ_EX) -const char STR_USBJOYSTICK_LABEL[] = TR_USBJOYSTICK_LABEL; -const char STR_USBJOYSTICK_EXTMODE[] = TR_USBJOYSTICK_EXTMODE; -ISTR(VUSBJOYSTICK_EXTMODE); -const char STR_USBJOYSTICK_SETTINGS[] = TR_USBJOYSTICK_SETTINGS; -const char STR_USBJOYSTICK_IF_MODE[] = TR_USBJOYSTICK_IF_MODE; -ISTR(VUSBJOYSTICK_IF_MODE); -const char STR_USBJOYSTICK_CH_MODE[] = TR_USBJOYSTICK_CH_MODE; -ISTR(VUSBJOYSTICK_CH_MODE); -ISTR(VUSBJOYSTICK_CH_MODE_S); -const char STR_USBJOYSTICK_CH_BTNMODE[] = TR_USBJOYSTICK_CH_BTNMODE; -ISTR(VUSBJOYSTICK_CH_BTNMODE); -ISTR(VUSBJOYSTICK_CH_BTNMODE_S); -const char STR_USBJOYSTICK_CH_SWPOS[] = TR_USBJOYSTICK_CH_SWPOS; -ISTR(VUSBJOYSTICK_CH_SWPOS); -const char STR_USBJOYSTICK_CH_AXIS[] = TR_USBJOYSTICK_CH_AXIS; -ISTR(VUSBJOYSTICK_CH_AXIS); -const char STR_USBJOYSTICK_CH_SIM[] = TR_USBJOYSTICK_CH_SIM; -ISTR(VUSBJOYSTICK_CH_SIM); -const char STR_USBJOYSTICK_CH_INVERSION[] = TR_USBJOYSTICK_CH_INVERSION; -const char STR_USBJOYSTICK_CH_BTNNUM[] = TR_USBJOYSTICK_CH_BTNNUM; -const char STR_USBJOYSTICK_BTN_COLLISION[] = TR_USBJOYSTICK_BTN_COLLISION; -const char STR_USBJOYSTICK_AXIS_COLLISION[] = TR_USBJOYSTICK_AXIS_COLLISION; -const char STR_USBJOYSTICK_CIRC_COUTOUT[] = TR_USBJOYSTICK_CIRC_COUTOUT; -ISTR(VUSBJOYSTICK_CIRC_COUTOUT); -const char STR_USBJOYSTICK_APPLY_CHANGES[] = TR_USBJOYSTICK_APPLY_CHANGES; -#endif - -const char STR_DIGITAL_SERVO[] = TR_DIGITAL_SERVO; -const char STR_ANALOG_SERVO[] = TR_ANALOG_SERVO; -const char STR_SIGNAL_OUTPUT[] = TR_SIGNAL_OUTPUT; -const char STR_SERIAL_BUS[] = TR_SERIAL_BUS; -const char STR_SYNC[] = TR_SYNC; - -const char STR_ENABLED_FEATURES[] = TR_ENABLED_FEATURES; -const char STR_RADIO_MENU_TABS[] = TR_RADIO_MENU_TABS; -const char STR_MODEL_MENU_TABS[] = TR_MODEL_MENU_TABS; - -const char STR_STICK_NAMES0[] = TR_STICK_NAMES0; -const char STR_STICK_NAMES1[] = TR_STICK_NAMES1; -const char STR_STICK_NAMES2[] = TR_STICK_NAMES2; -const char STR_STICK_NAMES3[] = TR_STICK_NAMES3; -const char STR_SURFACE_NAMES0[] = TR_SURFACE_NAMES0; -const char STR_SURFACE_NAMES1[] = TR_SURFACE_NAMES1; - -const char STR_SELECT_MENU_ALL[] = TR_SELECT_MENU_ALL; -const char STR_SELECT_MENU_CLR[] = TR_SELECT_MENU_CLR; -const char STR_SELECT_MENU_INV[] = TR_SELECT_MENU_INV; - -#if defined(COLORLCD) -ISTR(SORT_ORDERS); -const char STR_SORT_MODELS_BY[] = TR_SORT_MODELS_BY; -const char STR_CREATE_NEW[] = TR_CREATE_NEW; -const char STR_THEME_EXISTS[] = TR_THEME_EXISTS; - -const char STR_DATE_TIME_WIDGET[] = TR_DATE_TIME_WIDGET; -const char STR_RADIO_INFO_WIDGET[] = TR_RADIO_INFO_WIDGET; -const char STR_LOW_BATT_COLOR[] = TR_LOW_BATT_COLOR; -const char STR_MID_BATT_COLOR[] = TR_MID_BATT_COLOR; -const char STR_HIGH_BATT_COLOR[] = TR_HIGH_BATT_COLOR; -const char STR_WIDGET_SIZE[] = TR_WIDGET_SIZE; -#endif - -const char STR_MIX_SLOW_PREC[] = TR_MIX_SLOW_PREC; -const char STR_MIX_DELAY_PREC[] = TR_MIX_DELAY_PREC; - -const char STR_DEL_DIR_NOT_EMPTY[] = TR_DEL_DIR_NOT_EMPTY; +const char STR_RX[] = "Rx"; diff --git a/radio/src/translations.h b/radio/src/translations.h index 80db8c291..14072aba9 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -103,8 +103,16 @@ #if defined(COLORLCD) #define BUTTON(x) x + #define TRC(x, y) y #else #define BUTTON(x) "[" x "]" + #define TRC(x, y) x +#endif + +#if defined(SURFACE_RADIO) + #define TRSA(x, y) x +#else + #define TRSA(x, y) y #endif #if (LCD_W == 212) || defined(COLORLCD) @@ -119,787 +127,12 @@ constexpr int g_use_singular_in_plural = TR_USE_SINGULAR_IN_PLURAL; constexpr int g_use_plural2_special_case = TR_USE_PLURAL2_SPECIAL_CASE; constexpr int g_use_plural2 = TR_USE_PLURAL2; -extern const char STR_MINUTE_SINGULAR[]; -extern const char STR_MINUTE_PLURAL1[]; -extern const char STR_MINUTE_PLURAL2[]; - extern const char CHR_HOUR; extern const char CHR_INPUT; -extern const char* const STR_OFFON[]; -extern const char* const STR_MMMINV[]; -extern const char* const STR_VBEEPMODE[]; -extern const char* const STR_TRNMODE[]; -extern const char* const STR_TRNCHN[]; -extern const char* const STR_AUX_SERIAL_MODES[]; -extern const char* const STR_SWTYPES[]; -extern const char* const STR_POTTYPES[]; -extern const char* const STR_VTRIMINC[]; -extern const char* const STR_VDISPLAYTRIMS[]; - -extern const char* const STR_TIMER_DIR[]; - -extern const char* const STR_VBLMODE[]; -extern const char* const STR_VCURVETYPE[]; -extern const char* const STR_VCURVEFUNC[]; -extern const char* const STR_VMLTPX[]; -extern const char* const STR_VMLTPX2[]; -extern const char* const STR_VCSWFUNC[]; -extern const char* const STR_VFSWRESET[]; -extern const char* const STR_FUNCSOUNDS[]; -extern const char* const STR_VTELEMUNIT[]; -extern const char* const STR_GPSFORMAT[]; -extern const char* const STR_VTELEMSCREENTYPE[]; -extern const char* const STR_VSWASHTYPE[]; - -extern const char* const STR_ON_ONE_SWITCHES[]; -#if defined(IMU) -extern const char* const STR_IMU_VSRCRAW[]; -#endif -#if defined(PCBHORUS) -extern const char* const STR_SM_VSRCRAW[]; -#endif -extern const char* const STR_CYC_VSRCRAW[]; - -extern const char* const STR_ROTARY_ENC_OPT[]; - -#if defined(USE_HATS_AS_KEYS) -extern const char STR_HATSMODE[]; -extern const char* const STR_HATSOPT[]; -extern const char STR_HATSMODE_TRIMS[]; -extern const char STR_HATSMODE_KEYS[]; -extern const char STR_HATSMODE_KEYS_HELP[]; -#endif - -extern const char* const STR_VTMRMODES[]; -extern const char* const STR_VPERSISTENT[]; - -extern const char* const STR_VUNITSSYSTEM[]; -extern const char* const STR_VBEEPCOUNTDOWN[]; -extern const char* const STR_COUNTDOWNVALUES[]; -extern const char* const STR_VVARIOCENTER[]; - -extern const char* const STR_COUNTRY_CODES[]; -extern const char* const STR_USBMODES[]; -extern const char* const STR_JACK_MODES[]; -extern const char* const STR_VFAILSAFE[]; - -extern const char* const STR_FONT_SIZES[]; -extern const char* const STR_VTRAINERMODES[]; -extern const char* const STR_MODULE_PROTOCOLS[]; -extern const char* const STR_R9M_REGION[]; -extern const char* const STR_R9M_FCC_POWER_VALUES[]; -extern const char* const STR_R9M_LBT_POWER_VALUES[]; -extern const char* const STR_R9M_LITE_FCC_POWER_VALUES[]; -extern const char* const STR_R9M_LITE_LBT_POWER_VALUES[]; -extern const char* const STR_XJT_ACCST_RF_PROTOCOLS[]; -extern const char* const STR_ISRM_RF_PROTOCOLS[]; -extern const char* const STR_R9M_PXX2_RF_PROTOCOLS[]; -extern const char* const STR_PPM_PROTOCOLS[]; -extern const char* const STR_SBUS_PROTOCOLS[]; -extern const char* const STR_DSM_PROTOCOLS[]; -extern const char* const STR_CRSF_BAUDRATE[]; -extern const char* const STR_PPM_POL[]; -extern const char* const STR_SBUS_INVERSION_VALUES[]; - -extern const char* const STR_MULTI_PROTOCOLS[]; -extern const char* const STR_MULTI_POWER[]; -extern const char* const STR_MULTI_BAYANG_OPTIONS[]; -extern const char* const STR_MULTI_DSM_OPTIONS[]; -extern const char* const STR_MULTI_DSM_CLONE[]; -extern const char* const STR_MULTI_WBUS_MODE[]; -extern const char* const STR_SPORT_MODES[]; -extern const char* const STR_FSGROUPS[]; -extern const char* const STR_FSSWITCHES[]; - -extern const char STR_AFHDS3_ONE_TO_ONE_TELEMETRY[]; -extern const char STR_AFHDS3_ONE_TO_MANY[]; -extern const char* const STR_AFHDS3_PROTOCOLS[]; -extern const char* const STR_AFHDS3_POWERS[]; -extern const char STR_AFHDS3_RX_FREQ[]; -extern const char STR_AFHDS3_ACTUAL_POWER[]; -extern const char STR_AFHDS3_POWER_SOURCE[]; - -extern const char* const STR_FLYSKY_PULSE_PROTO[]; -extern const char* const STR_FLYSKY_SERIAL_PROTO[]; - -extern const char* const STR_CURVE_TYPES[]; -extern const char* const STR_VSENSORTYPES[]; -extern const char* const STR_VFORMULAS[]; -extern const char* const STR_VPREC[]; -extern const char* const STR_VCELLINDEX[]; -extern const char STR_TOUCH_PANEL[]; -extern const char* const STR_ADCFILTERVALUES[]; -extern const char STR_FILE_SIZE[]; -extern const char STR_FILE_OPEN[]; -extern const char* const STR_TIMER_MODES[]; -extern const char* const STR_MONTHS[]; -extern const char* const STR_PPMUNIT[]; - -extern const char STR_BLUETOOTH[]; -extern const char STR_BLUETOOTH_DISC[]; -extern const char STR_BLUETOOTH_INIT[]; -extern const char STR_BLUETOOTH_DIST_ADDR[]; -extern const char STR_BLUETOOTH_LOCAL_ADDR[]; -extern const char STR_BLUETOOTH_PIN_CODE[]; -extern const char STR_BLUETOOTH_NODEVICES[]; -extern const char STR_BLUETOOTH_SCANNING[]; -extern const char* const STR_BLUETOOTH_MODES[]; - -extern const char STR_STICK_NAMES0[]; -extern const char STR_STICK_NAMES1[]; -extern const char STR_STICK_NAMES2[]; -extern const char STR_STICK_NAMES3[]; -extern const char STR_SURFACE_NAMES0[]; -extern const char STR_SURFACE_NAMES1[]; - -extern const char STR_EMPTY[]; -extern const char STR_POPUPS_ENTER_EXIT[]; -extern const char STR_OK[]; -extern const char STR_EXIT[]; - -#if !defined(PCBHORUS) -extern const char STR_MENUWHENDONE[]; -extern const char STR_NO_TELEMETRY_SCREENS[]; -#endif - -extern const char STR_FREE[]; -extern const char STR_YES[]; -extern const char STR_NO[]; -#define LEN_FREE PSIZE(TR_FREE) -extern const char STR_DELETEMODEL[]; -extern const char STR_COPYINGMODEL[]; -extern const char STR_MOVINGMODEL[]; -extern const char STR_LOADINGMODEL[]; -extern const char STR_UNLABELEDMODEL[]; -extern const char STR_NAME[]; -extern const char STR_BITMAP[]; -extern const char STR_NO_PICTURE[]; -extern const char STR_TIMER[]; -extern const char STR_NO_TIMERS[]; -extern const char STR_START[]; -extern const char STR_NEXT[]; -extern const char STR_ELIMITS[]; -extern const char STR_ETRIMS[]; -extern const char STR_TRIMINC[]; -extern const char STR_DISPLAY_TRIMS[]; -extern const char STR_TTRACE[]; -extern const char STR_TTRIM[]; -extern const char STR_TTRIM_SW[]; -extern const char STR_BEEPCTR[]; -extern const char STR_USE_GLOBAL_FUNCS[]; - -extern const char STR_PPMFRAME[]; -extern const char STR_REFRESHRATE[]; -extern const char STR_MS[]; -extern const char STR_SWITCH[]; -extern const char STR_FUNCTION_SWITCHES[]; -extern const char STR_GROUP[]; -extern const char STR_LUA_OVERRIDE[]; -extern const char* const STR_FS_COLOR_LIST[]; -extern const char STR_GROUP_ALWAYS_ON[]; -extern const char STR_GROUPS[]; -extern const char STR_LAST[]; -extern const char STR_MORE_INFO[]; -extern const char STR_SWITCH_TYPE[]; -extern const char STR_SWITCH_GROUP[]; -extern const char STR_SWITCH_STARTUP[]; -extern const char* const STR_FUNCTION_SWITCH_GROUPS[]; -extern const char STR_ADJUST_GVAR[]; -extern const char STR_PLAY_TRACK[]; -extern const char STR_PLAY_VALUE[]; -extern const char STR_SOUND[]; -extern const char STR_SF_BACKLIGHT[]; -extern const char STR_SF_BG_MUSIC[]; -extern const char STR_SF_BG_MUSIC_PAUSE[]; -extern const char STR_SF_DISABLE_TOUCH[]; -extern const char STR_SF_DISABLE_AUDIO_AMP[]; -extern const char STR_SF_FAILSAFE[]; -extern const char STR_SF_HAPTIC[]; -extern const char STR_SF_INST_TRIM[]; -extern const char STR_SF_LOGS[]; -extern const char STR_SF_MOD_BIND[]; -extern const char STR_SF_PLAY_SCRIPT[]; -extern const char STR_SF_RANGE_CHECK[]; -extern const char STR_SF_RESET[]; -extern const char STR_SF_SET_TIMER[]; -extern const char STR_SF_SAFETY[]; -extern const char STR_SF_SET_SCREEN[]; -extern const char STR_SF_SWITCH[]; -extern const char STR_SF_TRAINER[]; -extern const char STR_SF_VARIO[]; -extern const char STR_SF_RGBLEDS[]; -extern const char STR_SF_VOLUME[]; -extern const char STR_SF_RACING_MODE[]; -extern const char STR_SF_SCREENSHOT[]; -extern const char STR_SF_LCD_TO_VIDEO[]; -extern const char STR_SF_PUSH_CUST_SWITCH[]; -extern const char STR_SF_TEST[]; -extern const char STR_TRIMS[]; -extern const char STR_MIRROR[]; -extern const char STR_FADEIN[]; -extern const char STR_FADEOUT[]; -extern const char STR_DEFAULT[]; -extern const char STR_CHECKTRIMS[]; -extern const char STR_SWASHTYPE[]; -extern const char STR_COLLECTIVE[]; -extern const char STR_AILERON[]; -extern const char STR_ELEVATOR[]; -extern const char STR_SWASHRING[]; -extern const char STR_MODE[]; - -#if defined(AUDIO) && defined(BUZZER) -extern const char STR_SPEAKER[]; -extern const char STR_BUZZER[]; -#else -#define STR_SPEAKER STR_MODE -#define STR_BUZZER STR_MODE -#endif - -extern const char STR_NOFREEEXPO[]; -extern const char STR_NOFREEMIXER[]; -extern const char STR_SOURCE[]; -extern const char STR_WEIGHT[]; -extern const char STR_SIDE[]; -extern const char STR_OFFSET[]; -extern const char STR_TRIM[]; -extern const char STR_DREX[]; -extern const char STR_CURVE[]; -extern const char STR_FLMODE[]; -extern const char STR_MIXWARNING[]; -extern const char STR_OFF[]; -extern const char STR_ANTENNA[]; -extern const char STR_NO_INFORMATION[]; -extern const char STR_MULTPX[]; -extern const char STR_DELAYDOWN[]; -extern const char STR_DELAYUP[]; -extern const char STR_SLOWDOWN[]; -extern const char STR_SLOWUP[]; -extern const char STR_MIXES[]; -extern const char STR_CV[]; -extern const char STR_GV[]; -extern const char STR_RANGE[]; -extern const char STR_CENTER[]; -extern const char STR_ALARM[]; -extern const char STR_BLADES[]; -extern const char STR_SCREEN[]; -extern const char STR_SOUND_LABEL[]; -extern const char STR_LENGTH[]; -extern const char STR_BEEP_LENGTH[]; -extern const char STR_BEEP_PITCH[]; -extern const char STR_CONTRAST[]; -extern const char STR_ALARMS_LABEL[]; -extern const char STR_BATTERY_RANGE[]; -extern const char STR_BATTERYCHARGING[]; -extern const char STR_BATTERYFULL[]; -extern const char STR_BATTERYNONE[]; -extern const char STR_BATTERYWARNING[]; -extern const char STR_INACTIVITYALARM[]; -extern const char STR_MEMORYWARNING[]; -extern const char STR_ALARMWARNING[]; -extern const char STR_RSSI_SHUTDOWN_ALARM[]; -extern const char STR_TRAINER_SHUTDOWN_ALARM[]; -extern const char STR_MODEL_STILL_POWERED[]; -extern const char STR_USB_STILL_CONNECTED[]; -extern const char STR_TRAINER_STILL_CONNECTED[]; -extern const char STR_MODEL_SHUTDOWN[]; -extern const char STR_PRESS_ENTER_TO_CONFIRM[]; -extern const char STR_THROTTLEREVERSE[]; -extern const char STR_MINUTEBEEP[]; -extern const char STR_BEEPCOUNTDOWN[]; -extern const char STR_PERSISTENT[]; -extern const char STR_BACKLIGHT_LABEL[]; -extern const char STR_GHOST_MENU_LABEL[]; -extern const char STR_STATUS[]; - -#if defined(COLORLCD) -extern const char STR_BLONBRIGHTNESS[]; -extern const char STR_BLOFFBRIGHTNESS[]; -extern const char STR_KEYS_BACKLIGHT[]; -#endif - -extern const char STR_SPLASHSCREEN[]; -extern const char STR_PLAY_HELLO[]; -#if defined(COLORLCD) -extern const char* const STR_SPLASHSCREEN_DELAYS[]; -#endif -#if defined(PWR_BUTTON_PRESS) -extern const char STR_PWR_ON_DELAY[]; -extern const char STR_PWR_OFF_DELAY[]; -extern const char STR_PWR_AUTO_OFF[]; -extern const char* const STR_PWR_OFF_DELAYS[]; -#endif -#if defined(HAPTIC) -extern const char STR_PWR_ON_OFF_HAPTIC[]; -extern const char STR_HAPTIC_LABEL[]; -extern const char STR_STRENGTH[]; -#endif -#if defined(IMU) -extern const char STR_IMU_LABEL[]; -extern const char STR_IMU_OFFSET[]; -extern const char STR_IMU_MAX[]; -#endif -extern const char STR_THROTTLE_WARNING[]; -extern const char STR_CUSTOM_THROTTLE_WARNING[]; -extern const char STR_CUSTOM_THROTTLE_WARNING_VAL[]; -extern const char STR_SWITCHWARNING[]; -extern const char STR_POTWARNINGSTATE[]; -extern const char STR_POTWARNING[]; -extern const char STR_TIMEZONE[]; -extern const char STR_ADJUST_RTC[]; -extern const char STR_GPS[]; -extern const char STR_GPS_COORDS_FORMAT[]; -extern const char STR_VARIO[]; -extern const char STR_FLYSKY_TELEMETRY[]; -extern const char STR_PITCH_AT_ZERO[]; -extern const char STR_PITCH_AT_MAX[]; -extern const char STR_REPEAT_AT_ZERO[]; -extern const char STR_DEF_CHAN_ORD[]; -extern const char STR_STICKS[]; -extern const char STR_POTS[]; -extern const char STR_SWITCHES[]; -extern const char STR_SWITCHES_DELAY[]; -extern const char STR_SLAVE[]; -extern const char STR_MODESRC[]; -extern const char STR_MULTIPLIER[]; #define LEN_MULTIPLIER PSIZE(TR_MULTIPLIER) -extern const char STR_CAL[]; -extern const char STR_CALIB_DONE[]; -extern const char STR_CALIBRATION[]; -extern const char STR_VTRIM[]; -extern const char STR_MENUTOSTART[]; -extern const char STR_SETMIDPOINT[]; -extern const char STR_MOVESTICKSPOTS[]; -extern const char STR_TX[]; -extern const char STR_AXISDIR[]; -extern const char STR_MENUAXISDIR[]; -#define STR_RX (STR_TX+OFS_RX) -extern const char STR_NODATA[]; -extern const char STR_US[]; -extern const char STR_HZ[]; -extern const char STR_TMIXMAXMS[]; -extern const char STR_FREE_STACK[]; -extern const char STR_INT_GPS_LABEL[]; -extern const char STR_HEARTBEAT_LABEL[]; -extern const char STR_LUA_SCRIPTS_LABEL[]; -extern const char STR_FREE_MEM_LABEL[]; -extern const char STR_DURATION_MS[]; -extern const char STR_INTERVAL_MS[]; -extern const char STR_MEM_USED_SCRIPT[]; -extern const char STR_MEM_USED_WIDGET[]; -extern const char STR_MEM_USED_EXTRA[]; -extern const char STR_STACK_MIX[]; -extern const char STR_STACK_AUDIO[]; -extern const char STR_GPS_FIX_YES[]; -extern const char STR_GPS_FIX_NO[]; -extern const char STR_GPS_SATS[]; -extern const char STR_GPS_HDOP[]; -extern const char STR_STACK_MENU[]; -extern const char STR_TIMER_LABEL[]; -extern const char STR_THROTTLE_PERCENT_LABEL[]; -extern const char STR_BATT_LABEL[]; -extern const char STR_SESSION[]; -extern const char STR_MENUTORESET[]; -extern const char STR_PPM_TRAINER[]; -extern const char STR_CH[]; -extern const char STR_MODEL[]; -extern const char STR_FM[]; -extern const char STR_EEPROMLOWMEM[]; -extern const char STR_PRESS_ANY_KEY_TO_SKIP[]; -extern const char STR_THROTTLE_NOT_IDLE[]; -extern const char STR_ALARMSDISABLED[]; -extern const char STR_PRESSANYKEY[]; -extern const char STR_BAD_RADIO_DATA[]; -extern const char STR_RADIO_DATA_UNRECOVERABLE[]; -extern const char STR_RADIO_DATA_RECOVERED[]; -extern const char STR_STORAGE_FORMAT[]; -extern const char STR_EEPROMOVERFLOW[]; -extern const char STR_TRIMS2OFFSETS[]; -extern const char STR_CHANNELS2FAILSAFE[]; -extern const char STR_CHANNEL2FAILSAFE[]; -extern const char STR_RADIO_SETUP[]; -extern const char STR_MENUTRAINER[]; -extern const char STR_MENUSPECIALFUNCS[]; -extern const char STR_MENUVERSION[]; -extern const char STR_MENU_RADIO_SWITCHES[]; -extern const char STR_MENU_RADIO_ANALOGS[]; -extern const char STR_MENU_RADIO_ANALOGS_CALIB[]; -extern const char STR_MENU_RADIO_ANALOGS_RAWLOWFPS[]; -extern const char STR_MENUCALIBRATION[]; -extern const char STR_MENUMODELSEL[]; -extern const char STR_MENU_MODEL_SETUP[]; -extern const char STR_MENUFLIGHTMODE[]; -extern const char STR_MENUFLIGHTMODES[]; -extern const char STR_MENU_FSWITCH[]; -extern const char STR_MENUHELISETUP[]; -extern const char STR_MENUINPUTS[]; -extern const char STR_MENULIMITS[]; -extern const char STR_MENUCURVES[]; -extern const char STR_MENUCURVE[]; -extern const char STR_MENULOGICALSWITCH[]; -extern const char STR_MENULOGICALSWITCHES[]; -extern const char STR_MENUCUSTOMFUNC[]; -extern const char STR_MENUCUSTOMSCRIPTS[]; -extern const char STR_MENUTELEMETRY[]; -extern const char STR_MENUSTAT[]; -extern const char STR_MENUDEBUG[]; -extern const char * const STR_MONITOR_CHANNELS[]; -extern const char STR_MONITOR_SWITCHES[]; -extern const char STR_MONITOR_OUTPUT_DESC[]; -extern const char STR_MONITOR_MIXER_DESC[]; -extern const char STR_MENU_GLOBAL_VARS[]; -extern const char STR_AND_SWITCH[]; -extern const char STR_SF[]; -extern const char STR_GF[]; -extern const char STR_ANADIAGS_CALIB[]; -extern const char STR_ANADIAGS_FILTRAWDEV[]; -extern const char STR_ANADIAGS_UNFILTRAW[]; -extern const char STR_ANADIAGS_MINMAX[]; -extern const char STR_ANADIAGS_MOVE[]; -extern const char STR_MULTI_CUSTOM[]; -extern const char STR_MULTI_FIXEDID[]; -extern const char STR_MULTI_OPTION[]; -extern const char STR_MULTI_VIDFREQ[]; -extern const char STR_MULTI_RFTUNE[]; -extern const char STR_MULTI_RFPOWER[]; -extern const char STR_MULTI_WBUS[]; -extern const char STR_MULTI_TELEMETRY[]; -extern const char STR_MULTI_AUTOBIND[]; -extern const char STR_DISABLE_CH_MAP[]; -extern const char STR_DISABLE_TELEM[]; -extern const char STR_MULTI_LOWPOWER[]; -extern const char STR_MULTI_LNA_DISABLE[]; -extern const char STR_MODULE_NO_SERIAL_MODE[]; -extern const char STR_MODULE_NO_INPUT[]; -extern const char STR_MODULE_WAITFORBIND[]; -extern const char STR_MODULE_NO_TELEMETRY[]; -extern const char STR_MODULE_BINDING[]; -extern const char STR_MODULE_UPGRADE_ALERT[]; -extern const char STR_MODULE_UPGRADE[]; -extern const char STR_PROTOCOL_INVALID[]; -extern const char STR_MODULE_STATUS[]; -extern const char STR_MODULE_SYNC[]; -extern const char STR_MULTI_SERVOFREQ[]; -extern const char STR_MULTI_MAX_THROW[]; -extern const char STR_MULTI_RFCHAN[]; -extern const char STR_SUBTYPE[]; - -#if defined(DSM2) || defined(PXX) -extern const char STR_RECEIVER_NUM[]; -extern const char STR_RECEIVER[]; -extern const char STR_REBIND[]; -extern const char STR_REG_OK[]; -extern const char STR_BIND_OK[]; -#endif - -extern const char STR_INTERNALRF[]; -extern const char STR_INTERNAL_MODULE[]; -extern const char STR_EXTERNAL_MODULE[]; -extern const char STR_EDGETX_UPGRADE_REQUIRED[]; -extern const char STR_TELEMETRY_DISABLED[]; -extern const char STR_MORE_OPTIONS_AVAILABLE[]; -extern const char STR_NO_MODULE_INFORMATION[]; -extern const char STR_EXTERNALRF[]; -extern const char STR_MODULE_TELEMETRY[]; -extern const char STR_MODULE_TELEM_ON[]; -extern const char STR_FAILSAFE[]; -extern const char STR_FAILSAFESET[]; -extern const char STR_RECEIVER[]; -extern const char STR_REG_ID[]; -extern const char STR_OWNER_ID[]; -extern const char STR_HOLD[]; -extern const char STR_HOLD_UPPERCASE[]; -extern const char STR_NONE[]; -extern const char STR_NONE_UPPERCASE[]; -extern const char STR_MENUSENSOR[]; -extern const char STR_POWERMETER_PEAK[]; -extern const char STR_POWERMETER_POWER[]; -extern const char STR_POWERMETER_ATTN[]; -extern const char STR_POWERMETER_FREQ[]; -extern const char STR_MENUTOOLS[]; -extern const char STR_TURN_OFF_RECEIVER []; -extern const char STR_STOPPING []; -extern const char STR_MENU_SPECTRUM_ANALYSER[]; -extern const char STR_MENU_POWER_METER[]; -extern const char STR_SENSOR[]; -extern const char STR_COUNTRY_CODE[]; -extern const char STR_USBMODE[]; -extern const char STR_JACK_MODE[]; -extern const char STR_DISABLE_INTERNAL[]; -extern const char STR_BATT_CALIB[]; -extern const char STR_VOLTAGE[]; -extern const char STR_CURRENT_CALIB[]; -extern const char STR_UNITS_SYSTEM[]; -extern const char STR_UNITS_PPM[]; -extern const char STR_VOICE_LANGUAGE[]; -extern const char STR_MODELIDUSED[]; -extern const char STR_MODELIDUNIQUE[]; -extern const char STR_BEEP_VOLUME[]; -extern const char STR_WAV_VOLUME[]; -extern const char STR_BG_VOLUME[]; -extern const char STR_SELECT_MODEL[]; -extern const char STR_MODELS[]; -extern const char STR_SELECT_MODE[]; -extern const char STR_CREATE_MODEL[]; -extern const char STR_FAVORITE_LABEL[]; -extern const char STR_MODELS_MOVED[]; -extern const char STR_NEW_MODEL[]; -extern const char STR_INVALID_MODEL[]; -extern const char STR_MOVE_UP[]; -extern const char STR_MOVE_DOWN[]; -extern const char STR_DUPLICATE_MODEL[]; -extern const char STR_COPY_MODEL[]; -extern const char STR_MOVE_MODEL[]; -extern const char STR_DELETE_MODEL[]; -extern const char STR_EDIT[]; -extern const char STR_INSERT_BEFORE[]; -extern const char STR_INSERT_AFTER[]; -extern const char STR_COPY[]; -extern const char STR_MOVE[]; -extern const char STR_PASTE[]; -extern const char STR_PASTE_AFTER[]; -extern const char STR_PASTE_BEFORE[]; -extern const char STR_INSERT[]; -extern const char STR_DELETE[]; -extern const char STR_RESET_FLIGHT[]; -extern const char STR_RESET_TIMER1[]; -extern const char STR_RESET_TIMER2[]; -extern const char STR_RESET_TIMER3[]; -extern const char STR_RESET_TELEMETRY[]; -extern const char STR_STATISTICS[]; -extern const char STR_ABOUT_US[]; -extern const char STR_USB_JOYSTICK[]; -extern const char STR_USB_MASS_STORAGE[]; -extern const char STR_USB_SERIAL[]; -extern const char STR_SETUP_SCREENS[]; -extern const char STR_MONITOR_SCREENS[]; -extern const char STR_RESET_BTN[]; -extern const char STR_DEBUG[]; -extern const char STR_KEYS_BTN[]; -extern const char STR_ANALOGS_BTN[]; -extern const char STR_FS_BTN[]; -extern const char STR_TOUCH_NOTFOUND[]; -extern const char STR_TOUCH_EXIT[]; -extern const char STR_CALIBRATION[]; -extern const char STR_NO_TOOLS[]; -extern const char STR_NORMAL[]; -extern const char STR_NOT_INVERTED[]; -extern const char STR_NOT_CONNECTED[]; -extern const char STR_CONNECTED[]; -extern const char STR_FLEX_915[]; -extern const char STR_FLEX_868[]; -extern const char STR_16CH_WITHOUT_TELEMETRY[]; -extern const char STR_16CH_WITH_TELEMETRY[]; -extern const char STR_8CH_WITH_TELEMETRY[]; -extern const char STR_EXT_ANTENNA[]; -extern const char STR_PIN[]; -extern const char STR_UPDATE_RX_OPTIONS[]; -extern const char STR_UPDATE_TX_OPTIONS[]; -extern const char STR_MENU_MODULES_RX_VERSION[]; -extern const char STR_MENU_FIRM_OPTIONS[]; -extern const char STR_IMU[]; -extern const char STR_STICKS_POTS_SLIDERS[]; -extern const char STR_PWM_STICKS_POTS_SLIDERS[]; -extern const char STR_RF_PROTOCOL[]; -extern const char STR_MODULE_OPTIONS[]; -extern const char STR_POWER[]; -extern const char STR_NO_TX_OPTIONS[]; -extern const char STR_RTC_BATT[]; -extern const char STR_POWER_METER_EXT[]; -extern const char STR_POWER_METER_INT[]; -extern const char STR_SPECTRUM_ANALYSER_EXT[]; -extern const char STR_SPECTRUM_ANALYSER_INT[]; -extern const char STR_GHOST_MODULE_CONFIG[]; -extern const char STR_GPS_MODEL_LOCATOR[]; -extern const char STR_REFRESH[]; -extern const char STR_WAITING_FOR_RX[]; -extern const char STR_WAITING_FOR_TX[]; -extern const char STR_WAITING_FOR_MODULE[]; -extern const char STR_WARN_5VOLTS[]; - -extern const char STR_BACKUP_MODEL[]; -extern const char STR_RESTORE_MODEL[]; -extern const char STR_DELETE_ERROR[]; -extern const char STR_SDCARD_ERROR[]; -extern const char STR_SDCARD[]; -extern const char STR_NO_FILES_ON_SD[]; -extern const char STR_NO_SDCARD[]; -extern const char STR_SDCARD_FULL[]; -extern const char STR_SDCARD_FULL_EXT[]; -extern const char STR_INCOMPATIBLE[]; -extern const char STR_LOGS_PATH[]; -extern const char STR_LOGS_EXT[]; -extern const char STR_MODELS_PATH[]; -extern const char STR_MODELS_EXT[]; -extern const char STR_BACKUP_PATH[]; -extern const char STR_YAML_EXT[]; #define STR_UPDATE_LIST STR_DELAYDOWN -extern const char STR_NEEDS_FILE[]; -extern const char STR_EXT_MULTI_SPEC[]; -extern const char STR_INT_MULTI_SPEC[]; -extern const char STR_WARNING[]; -extern const char STR_STORAGE_WARNING[]; -extern const char STR_THROTTLE_UPPERCASE[]; -extern const char STR_ALARMSWARN[]; -extern const char STR_SWITCHWARN[]; -extern const char STR_FAILSAFEWARN[]; -extern const char STR_TEST_WARNING[]; -extern const char STR_TEST_NOTSAFE[]; -extern const char STR_WRONG_SDCARDVERSION[]; -extern const char STR_WARN_RTC_BATTERY_LOW[]; -extern const char STR_WARN_MULTI_LOWPOWER[]; -extern const char STR_BATTERY[]; -extern const char STR_WRONG_PCBREV[]; -extern const char STR_EMERGENCY_MODE[]; -extern const char STR_NO_FAILSAFE[]; -extern const char STR_KEYSTUCK[]; - -extern const char STR_VOLUME[]; -extern const char STR_LCD[]; -extern const char STR_BRIGHTNESS[]; -extern const char STR_CPU_TEMP[]; -extern const char STR_COPROC[]; -extern const char STR_COPROC_TEMP[]; -extern const char STR_TTL_WARNING[]; -extern const char STR_FUNC[]; -extern const char STR_V1[]; -extern const char STR_V2[]; -extern const char STR_DURATION[]; -extern const char STR_DELAY[]; -extern const char STR_SD_CARD[]; -extern const char STR_SDHC_CARD[]; -extern const char STR_NO_SOUNDS_ON_SD[]; -extern const char STR_NO_MODELS_ON_SD[]; -extern const char STR_NO_BITMAPS_ON_SD[]; -extern const char STR_NO_SCRIPTS_ON_SD[]; -extern const char STR_SCRIPT_SYNTAX_ERROR[]; -extern const char STR_SCRIPT_PANIC[]; -extern const char STR_SCRIPT_KILLED[]; -extern const char STR_SCRIPT_ERROR[]; -extern const char STR_PLAY_FILE[]; -extern const char STR_ASSIGN_BITMAP[]; -extern const char STR_LIMITS_HEADERS_DIRECTION[]; -#if defined(COLORLCD) -extern const char STR_ASSIGN_SPLASH[]; -extern const char STR_FIRST_CHANNEL[]; -extern const char STR_FILL_BACKGROUND[]; -extern const char STR_BG_COLOR[]; -extern const char STR_SLIDERS_TRIMS[]; -extern const char STR_SLIDERS[]; -extern const char STR_FLIGHT_MODE[]; -extern const char STR_INVALID_FILE[]; -extern const char STR_TIMER_SOURCE[]; -extern const char* const STR_SUBTRIMMODES[]; -extern const char STR_SIZE[]; -extern const char STR_SHADOW[]; -extern const char STR_ALIGNMENT[]; -extern const char STR_ALIGN_LABEL[]; -extern const char STR_ALIGN_VALUE[]; -extern const char* const STR_ALIGN_OPTS[]; -extern const char STR_TEXT[]; -extern const char STR_COLOR[]; -extern const char STR_MAIN_VIEW_X[]; -extern const char STR_PANEL1_BACKGROUND[]; -extern const char STR_PANEL2_BACKGROUND[]; -extern const char STR_WIDGET_GAUGE[]; -extern const char STR_WIDGET_MODELBMP[]; -extern const char STR_WIDGET_OUTPUTS[]; -extern const char STR_WIDGET_TEXT[]; -extern const char STR_WIDGET_TIMER[]; -extern const char STR_WIDGET_VALUE[]; -extern const char STR_MODULES_RX_VERSION[]; -extern const char STR_LEFT_STICK[]; -extern const char STR_SHOW_MIXER_MONITORS[]; -extern const char STR_MODEL_QUICK_SELECT[]; -extern const char STR_LOADING[]; -extern const char STR_DELETE_THEME[]; -extern const char STR_SAVE_THEME[]; -extern const char STR_EDIT_COLOR[]; -extern const char STR_NO_THEME_IMAGE[]; -extern const char STR_BACKLIGHT_TIMER[]; -extern const char STR_LABELS_SELECT[]; -extern const char STR_LABELS_MATCH[]; -extern const char STR_FAV_MATCH[]; -extern const char* const STR_LABELS_SELECT_MODE[]; -extern const char* const STR_LABELS_MATCH_MODE[]; -extern const char* const STR_FAV_MATCH_MODE[]; -#endif -extern const char STR_EXECUTE_FILE[]; -extern const char STR_DELETE_FILE[]; -extern const char STR_COPY_FILE[]; -extern const char STR_RENAME_FILE[]; -extern const char STR_REMOVED[]; -extern const char STR_SD_INFO[]; -extern const char STR_NA[]; -extern const char STR_HARDWARE[]; -extern const char STR_FORMATTING[]; -extern const char STR_TEMP_CALIB[]; -extern const char STR_TIME[]; -extern const char STR_MAXBAUDRATE[]; -extern const char STR_BAUDRATE[]; -extern const char STR_CRSF_ARMING_MODE[]; -extern const char* const STR_CRSF_ARMING_MODES[]; -extern const char STR_SAMPLE_MODE[]; -extern const char* const STR_SAMPLE_MODES[]; -extern const char STR_BLUETOOTH_BAUDRATE[]; -extern const char STR_SD_INFO_TITLE[]; -extern const char STR_SD_SPEED[]; -extern const char STR_SD_SECTORS[]; -extern const char STR_SD_SIZE[]; -extern const char STR_TYPE[]; -extern const char STR_GLOBAL_VARS[]; -extern const char STR_GVARS[]; -extern const char STR_GLOBAL_VAR[]; -extern const char STR_OWN[]; -extern const char STR_DATE[]; -extern const char STR_ROTARY_ENCODER[]; -extern const char STR_ROTARY_ENC_MODE[]; -extern const char STR_CHANNELS_MONITOR[]; -extern const char STR_MIXERS_MONITOR[]; -extern const char STR_PATH_TOO_LONG[]; -extern const char STR_VIEW_TEXT[]; -extern const char STR_FLASH_BOOTLOADER[]; -extern const char STR_FLASH_DEVICE[]; -extern const char STR_FLASH_EXTERNAL_DEVICE[]; -extern const char STR_FLASH_RECEIVER_OTA[]; -extern const char STR_FLASH_RECEIVER_BY_EXTERNAL_MODULE_OTA[]; -extern const char STR_FLASH_RECEIVER_BY_INTERNAL_MODULE_OTA[]; -extern const char STR_FLASH_FLIGHT_CONTROLLER_BY_EXTERNAL_MODULE_OTA[]; -extern const char STR_FLASH_FLIGHT_CONTROLLER_BY_INTERNAL_MODULE_OTA[]; -extern const char STR_FLASH_BLUETOOTH_MODULE[]; -extern const char STR_FLASH_POWER_MANAGEMENT_UNIT[]; -extern const char STR_DEVICE_NO_RESPONSE[]; -extern const char STR_DEVICE_FILE_ERROR[]; -extern const char STR_DEVICE_DATA_REFUSED[]; -extern const char STR_DEVICE_WRONG_REQUEST[]; -extern const char STR_DEVICE_FILE_REJECTED[]; -extern const char STR_DEVICE_FILE_WRONG_SIG[]; -extern const char STR_CURRENT_VERSION[]; -extern const char STR_FLASH_INTERNAL_MODULE[]; -extern const char STR_FLASH_INTERNAL_MULTI[]; -extern const char STR_FLASH_EXTERNAL_MODULE[]; -extern const char STR_FLASH_EXTERNAL_MULTI[]; -extern const char STR_FLASH_EXTERNAL_ELRS[]; -extern const char STR_FIRMWARE_UPDATE_ERROR[]; -extern const char STR_FIRMWARE_UPDATE_SUCCESS[]; -extern const char STR_WRITING[]; -extern const char STR_CONFIRM_FORMAT[]; -extern const char STR_CONFIRMRESET[]; -extern const char STR_TOO_MANY_LUA_SCRIPTS[]; -extern const char STR_BLCOLOR[]; - -extern const char STR_DIGITAL_SERVO[]; -extern const char STR_ANALOG_SERVO[]; -extern const char STR_SIGNAL_OUTPUT[]; -extern const char STR_SERIAL_BUS[]; -extern const char STR_SYNC[]; - -extern const char STR_ENABLED_FEATURES[]; -extern const char STR_RADIO_MENU_TABS[]; -extern const char STR_MODEL_MENU_TABS[]; - - struct LanguagePack { const char * id; const char * name; @@ -983,316 +216,23 @@ inline PLAY_FUNCTION(playDuration, int seconds, uint8_t flags) { currentLanguagePack->playDuration(seconds, flags, id, fragmentVolume); } -extern const char STR_MODELNAME[]; -extern const char STR_PHASENAME[]; -extern const char STR_MIXNAME[]; -extern const char STR_INPUTNAME[]; -extern const char STR_EXPONAME[]; +// Static string +#define STR(x) extern const char STR_##x[]; +// Static string array +#define STRARRAY(x) extern const char* const STR_##x[]; -#if LCD_W >= 212 -#define TR_PHASES_HEADERS { TR_PHASES_HEADERS_NAME, TR_PHASES_HEADERS_SW, TR_PHASES_HEADERS_RUD_TRIM, TR_PHASES_HEADERS_ELE_TRIM, TR_PHASES_HEADERS_THT_TRIM, TR_PHASES_HEADERS_AIL_TRIM, TR_PHASES_HEADERS_FAD_IN, TR_PHASES_HEADERS_FAD_OUT } -#define TR_LIMITS_HEADERS { TR_LIMITS_HEADERS_NAME, TR_LIMITS_HEADERS_SUBTRIM, TR_LIMITS_HEADERS_MIN, TR_LIMITS_HEADERS_MAX, TR_LIMITS_HEADERS_DIRECTION, TR_LIMITS_HEADERS_CURVE, TR_LIMITS_HEADERS_PPMCENTER, TR_LIMITS_HEADERS_SUBTRIMMODE } -#define TR_LSW_HEADERS { TR_FUNC, TR_V1, TR_V2, TR_V2, TR_AND_SWITCH, TR_DURATION, TR_DELAY, TR_PERSISTENT } - extern const char * const STR_PHASES_HEADERS[]; - extern const char * const STR_LIMITS_HEADERS[]; - extern const char * const STR_LSW_HEADERS[]; - extern const char * const STR_LSW_DESCRIPTIONS[]; +#include "string_list.h" + +STR(SF_SET_SCREEN); +STR(RX); + +#if defined(AUDIO) && defined(BUZZER) +STR(SPEAKER); +STR(BUZZER); +#else +#define STR_SPEAKER STR_MODE +#define STR_BUZZER STR_MODE #endif -extern const char STR_TRAINER[]; -extern const char STR_CHANS[]; -extern const char STR_MODULE_BIND[]; -extern const char STR_MODULE_UNBIND[]; -extern const char STR_POWERMETER_ATTN_NEEDED[]; -extern const char STR_PXX2_SELECT_RX[]; -extern const char STR_PXX2_DEFAULT[]; -extern const char STR_BT_SELECT_DEVICE[]; -extern const char STR_DISCOVER[]; -extern const char STR_BUTTON_INIT[]; -extern const char STR_WAITING[]; -extern const char STR_RECEIVER_DELETE[]; -extern const char STR_RECEIVER_RESET[]; -extern const char STR_SHARE[]; -extern const char STR_BIND[]; -extern const char STR_REGISTER[]; -extern const char STR_BINDING_1_8_TELEM_ON[]; -extern const char STR_BINDING_1_8_TELEM_OFF[]; -extern const char STR_BINDING_9_16_TELEM_ON[]; -extern const char STR_BINDING_9_16_TELEM_OFF[]; -extern const char STR_CHANNELRANGE[]; -extern const char STR_ANTENNACONFIRM1[]; -extern const char STR_ANTENNACONFIRM2[]; -extern const char* const STR_ANTENNA_MODES[]; -extern const char STR_USE_INTERNAL_ANTENNA[]; -extern const char STR_USE_EXTERNAL_ANTENNA[]; -extern const char STR_MODULE_PROTOCOL_FLEX_WARN_LINE1[]; -extern const char STR_MODULE_PROTOCOL_FCC_WARN_LINE1[]; -extern const char STR_MODULE_PROTOCOL_EU_WARN_LINE1[]; -extern const char STR_MODULE_PROTOCOL_WARN_LINE2[]; -extern const char STR_SET[]; -extern const char* const STR_PREFLIGHT_POTSLIDER_CHECK[]; -extern const char STR_PREFLIGHT[]; -extern const char STR_CHECKLIST[]; -extern const char STR_CHECKLIST_INTERACTIVE[]; -extern const char STR_VIEW_NOTES[]; -extern const char STR_MODEL_SELECT[]; -extern const char STR_RESET_SUBMENU[]; -extern const char STR_LOWALARM[]; -extern const char STR_CRITICALALARM[]; -extern const char STR_DISABLE_ALARM[]; -extern const char STR_TELEMETRY_TYPE[]; -extern const char STR_TELEMETRY_SENSORS[]; -extern const char STR_VALUE[]; -extern const char STR_PERIOD[]; -extern const char STR_INTERVAL[]; -extern const char STR_REPEAT[]; -extern const char STR_ENABLE[]; -extern const char STR_DISABLE[]; -extern const char STR_TOPLCDTIMER[]; -extern const char STR_UNIT[]; ; -extern const char STR_TELEMETRY_NEWSENSOR[]; -extern const char STR_ID[]; -extern const char STR_PRECISION[]; -extern const char STR_RATIO[]; -extern const char STR_FORMULA[]; -extern const char STR_CELLINDEX[]; -extern const char STR_LOGS[]; -extern const char STR_OPTIONS[]; -extern const char STR_FIRMWARE_OPTIONS[]; -extern const char STR_ALTSENSOR[]; -extern const char STR_CELLSENSOR[]; -extern const char STR_GPSSENSOR[]; -extern const char STR_CURRENTSENSOR[]; -extern const char STR_AUTOOFFSET[]; -extern const char STR_ONLYPOSITIVE[]; -extern const char STR_FILTER[]; -extern const char STR_TELEMETRYFULL[]; -extern const char STR_IGNORE_INSTANCE[]; -extern const char STR_SHOW_INSTANCE_ID[]; -extern const char STR_DISCOVER_SENSORS[]; -extern const char STR_STOP_DISCOVER_SENSORS[]; -extern const char STR_DELETE_ALL_SENSORS[]; -extern const char STR_CONFIRMDELETE[]; -extern const char STR_SELECT_WIDGET[]; -extern const char STR_REMOVE_WIDGET[]; -extern const char STR_WIDGET_SETTINGS[]; -extern const char STR_WIDGET_FULLSCREEN[]; -extern const char STR_REMOVE_SCREEN[]; -extern const char STR_SETUP_WIDGETS[]; -extern const char STR_USER_INTERFACE[]; -extern const char STR_THEME[]; -extern const char STR_SETUP[]; -extern const char STR_LAYOUT[]; -extern const char STR_ADD_MAIN_VIEW[]; -extern const char STR_TEXT_COLOR[]; -extern const char STR_RF_POWER[]; - -extern const char STR_BYTES[]; -extern const char STR_ANTENNAPROBLEM[]; -extern const char STR_MODULE[]; -extern const char STR_RX_NAME[]; -extern const char STR_POPUP[]; -extern const char STR_MIN[]; -extern const char STR_MAX[]; -extern const char STR_INVERTED[]; -extern const char STR_CURVE_PRESET[]; -extern const char STR_PRESET[]; -extern const char STR_CLEAR[]; -extern const char STR_RESET[]; -extern const char STR_ADD_ALL_TRIMS_TO_SUBTRIMS[]; -extern const char STR_OPEN_CHANNEL_MONITORS[]; -extern const char STR_COUNT[]; -extern const char STR_PT[]; -extern const char STR_PTS[]; -extern const char STR_SMOOTH[]; -extern const char STR_COPY_STICKS_TO_OFS[]; -extern const char STR_COPY_MIN_MAX_TO_OUTPUTS[]; -extern const char STR_COPY_TRIMS_TO_OFS[]; -extern const char STR_INCDEC[]; -extern const char STR_GLOBALVAR[]; -extern const char STR_MIXSOURCE[]; -extern const char STR_MIXSOURCERAW[]; -extern const char STR_CONSTANT[]; -extern const char STR_TOP_BAR[]; -extern const char STR_FLASH_ERASE[]; -extern const char STR_FLASH_WRITE[]; -extern const char STR_OTA_UPDATE[]; -extern const char STR_MODULE_RESET[]; -extern const char STR_UNKNOWN_RX[]; -extern const char STR_UNSUPPORTED_RX[]; -extern const char STR_OTA_UPDATE_ERROR[]; -extern const char STR_DEVICE_RESET[]; -extern const char STR_ALTITUDE[]; -extern const char STR_SCALE[]; -extern const char STR_VIEW_CHANNELS[]; -extern const char STR_POTWARNING[]; -extern const char STR_AUX_SERIAL_MODE[]; -extern const char STR_AUX2_SERIAL_MODE[]; -extern const char STR_AUX_SERIAL_PORT_POWER[]; -extern const char STR_THROTTLE_LABEL[]; -extern const char STR_SCRIPT[]; -extern const char STR_INPUTS[]; -extern const char STR_OUTPUTS[]; -extern const char STR_MENU_INPUTS[]; -extern const char STR_MENU_LUA[]; -extern const char STR_MENU_STICKS[]; -extern const char STR_MENU_POTS[]; -extern const char STR_MENU_MIN[]; -extern const char STR_MENU_MAX[]; -extern const char STR_MENU_HELI[]; -extern const char STR_MENU_TRIMS[]; -extern const char STR_MENU_SWITCHES[]; -extern const char STR_MENU_LOGICAL_SWITCHES[]; -extern const char STR_MENU_TRAINER[]; -extern const char STR_MENU_CHANNELS[]; -extern const char STR_MENU_GVARS[]; -extern const char STR_MENU_TELEMETRY[]; -extern const char STR_MENU_DISPLAY[]; -extern const char STR_MENU_OTHER[]; -extern const char STR_MENU_INVERT[]; -extern const char STR_AUDIO_MUTE[]; -extern const char STR_JITTER_FILTER[]; -extern const char STR_DEAD_ZONE[]; -extern const char STR_RTC_CHECK[]; -extern const char STR_SPORT_UPDATE_POWER_MODE[]; -extern const char* const STR_SPORT_UPDATE_POWER_MODES[]; - -extern const char STR_MODULE_RANGE[]; -extern const char STR_RANGE_TEST[]; -extern const char STR_RECEIVER_OPTIONS[]; - -extern const char STR_ABOUTUS[]; - -extern const char STR_AUTH_FAILURE[]; -extern const char STR_PROTOCOL[]; -extern const char STR_RACING_MODE[]; - -extern const char STR_SRC_BATT[]; -extern const char STR_SRC_TIME[]; -extern const char STR_SRC_GPS[]; -extern const char STR_SRC_TIMER[]; -extern const char STR_FUNC_SW[]; - -#if defined(COLORLCD) -extern const char STR_SELECT_TEMPLATE[]; -extern const char STR_SELECT_TEMPLATE_FOLDER[]; -extern const char STR_NO_TEMPLATES[]; -extern const char STR_SAVE_TEMPLATE[]; -extern const char STR_BLANK_MODEL[]; -extern const char STR_BLANK_MODEL_INFO[]; -extern const char STR_FILE_EXISTS[]; -extern const char STR_ASK_OVERWRITE[]; - -extern const char STR_USE_THEME_COLOR[]; - -extern const char STR_DUPLICATE[]; -extern const char STR_ACTIVATE[]; -extern const char STR_RED[]; -extern const char STR_BLUE[]; -extern const char STR_GREEN[]; -extern const char STR_COLOR_PICKER[]; -extern const char STR_FIXED[]; -extern const char STR_EDIT_THEME_DETAILS[]; -extern const char STR_THEME_COLOR_DEFAULT[]; -extern const char STR_THEME_COLOR_PRIMARY1[]; -extern const char STR_THEME_COLOR_PRIMARY2[]; -extern const char STR_THEME_COLOR_PRIMARY3[]; -extern const char STR_THEME_COLOR_SECONDARY1[]; -extern const char STR_THEME_COLOR_SECONDARY2[]; -extern const char STR_THEME_COLOR_SECONDARY3[]; -extern const char STR_THEME_COLOR_FOCUS[]; -extern const char STR_THEME_COLOR_EDIT[]; -extern const char STR_THEME_COLOR_ACTIVE[]; -extern const char STR_THEME_COLOR_WARNING[]; -extern const char STR_THEME_COLOR_DISABLED[]; -extern const char STR_THEME_COLOR_CUSTOM[]; -extern const char STR_THEME_CHECKBOX[]; -extern const char STR_THEME_ACTIVE[]; -extern const char STR_THEME_REGULAR[]; -extern const char STR_THEME_WARNING[]; -extern const char STR_THEME_DISABLED[]; -extern const char STR_THEME_EDIT[]; -extern const char STR_THEME_FOCUS[]; -extern const char STR_AUTHOR[]; -extern const char STR_DESCRIPTION[]; -extern const char STR_SAVE[]; -extern const char STR_CANCEL[]; -extern const char STR_EDIT_THEME[]; -extern const char STR_DETAILS[]; -extern const char STR_THEME_EDITOR[]; - -extern const char STR_EDIT_LABELS[]; -extern const char STR_LABEL_MODEL[]; -extern const char STR_ENTER_LABEL[]; -extern const char STR_LABEL[]; -extern const char STR_LABELS[]; -extern const char STR_SELECT_MODEL[]; -extern const char STR_NONE[]; -extern const char STR_ACTIVE[]; -extern const char STR_NEW[]; -extern const char STR_NEW_LABEL[]; -extern const char STR_RENAME_LABEL[]; -extern const char STR_DELETE_LABEL[]; -extern const char STR_MAIN_MENU_SELECT_MODEL[]; -extern const char STR_MAIN_MENU_MANAGE_MODELS[]; -extern const char STR_MAIN_MENU_MODEL_NOTES[]; -extern const char STR_MAIN_MENU_CHANNEL_MONITOR[]; -extern const char STR_MAIN_MENU_MODEL_SETTINGS[]; -extern const char STR_MAIN_MENU_RADIO_SETTINGS[]; -extern const char STR_MAIN_MENU_SCREEN_SETTINGS[]; -extern const char STR_MAIN_MENU_RESET_TELEMETRY[]; -extern const char STR_MAIN_MENU_STATISTICS[]; -extern const char STR_MAIN_MENU_ABOUT_EDGETX[]; -extern const char STR_MANAGE_MODELS[]; -#endif - -#if defined(USBJ_EX) -extern const char STR_USBJOYSTICK_LABEL[]; -extern const char STR_USBJOYSTICK_EXTMODE[]; -extern const char* const STR_VUSBJOYSTICK_EXTMODE[]; -extern const char STR_USBJOYSTICK_SETTINGS[]; -extern const char STR_USBJOYSTICK_IF_MODE[]; -extern const char* const STR_VUSBJOYSTICK_IF_MODE[]; -extern const char STR_USBJOYSTICK_CH_MODE[]; -extern const char* const STR_VUSBJOYSTICK_CH_MODE[]; -extern const char* const STR_VUSBJOYSTICK_CH_MODE_S[]; -extern const char STR_USBJOYSTICK_CH_BTNMODE[]; -extern const char* const STR_VUSBJOYSTICK_CH_BTNMODE[]; -extern const char* const STR_VUSBJOYSTICK_CH_BTNMODE_S[]; -extern const char STR_USBJOYSTICK_CH_SWPOS[]; -extern const char* const STR_VUSBJOYSTICK_CH_SWPOS[]; -extern const char STR_USBJOYSTICK_CH_AXIS[]; -extern const char* const STR_VUSBJOYSTICK_CH_AXIS[]; -extern const char STR_USBJOYSTICK_CH_SIM[]; -extern const char* const STR_VUSBJOYSTICK_CH_SIM[]; -extern const char STR_USBJOYSTICK_CH_INVERSION[]; -extern const char STR_USBJOYSTICK_CH_BTNNUM[]; -extern const char STR_USBJOYSTICK_BTN_COLLISION[]; -extern const char STR_USBJOYSTICK_AXIS_COLLISION[]; -extern const char STR_USBJOYSTICK_CIRC_COUTOUT[]; -extern const char* const STR_VUSBJOYSTICK_CIRC_COUTOUT[]; -extern const char STR_USBJOYSTICK_APPLY_CHANGES[]; -#endif - -extern const char STR_SELECT_MENU_ALL[]; -extern const char STR_SELECT_MENU_CLR[]; -extern const char STR_SELECT_MENU_INV[]; - -#if defined(COLORLCD) -extern const char* const STR_SORT_ORDERS[]; -extern const char STR_SORT_MODELS_BY[]; -extern const char STR_CREATE_NEW[]; -extern const char STR_THEME_EXISTS[]; - -extern const char STR_DATE_TIME_WIDGET[]; -extern const char STR_RADIO_INFO_WIDGET[]; -extern const char STR_LOW_BATT_COLOR[]; -extern const char STR_MID_BATT_COLOR[]; -extern const char STR_HIGH_BATT_COLOR[]; -extern const char STR_WIDGET_SIZE[]; -#endif - -extern const char STR_MIX_SLOW_PREC[]; -extern const char STR_MIX_DELAY_PREC[]; - -extern const char STR_DEL_DIR_NOT_EMPTY[]; +#undef STR +#undef STRARRAY diff --git a/radio/src/translations/cn.h b/radio/src/translations/cn.h index ee6f503b9..d5af2b4a9 100644 --- a/radio/src/translations/cn.h +++ b/radio/src/translations/cn.h @@ -38,6 +38,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "模型管理" +#define TR_MAIN_MENU_MODEL_NOTES "模型说明" +#define TR_MAIN_MENU_CHANNEL_MONITOR "通道查看" +#define TR_MONITOR_SWITCHES "逻辑开关查看" +#define TR_MAIN_MENU_MODEL_SETTINGS "模型设置" +#define TR_MAIN_MENU_RADIO_SETTINGS "系统设置" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "统计信息" +#define TR_MAIN_MENU_ABOUT_EDGETX "关于" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "主题" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "直升机设置" +#define TR_MENUFLIGHTMODES TRSA("驾驶模式", "飞行模式设置") +#define TR_MENUFLIGHTMODE TRSA("驾驶模式", "飞行模式") +#define TR_MENUINPUTS "输入设置" +#define TR_MENULIMITS "输出设置" +#define TR_MENUCURVES "曲线设置" +#define TR_MIXES "混控设置" +#define TR_MENU_GLOBAL_VARS "全局变量功能" +#define TR_MENULOGICALSWITCHES "逻辑开关设置" +#define TR_MENUCUSTOMFUNC "特殊功能设置" +#define TR_MENUCUSTOMSCRIPTS "自定义脚本设置" +#define TR_MENUTELEMETRY "回传" +#define TR_MENUSPECIALFUNCS "全局功能" +#define TR_MENUTRAINER "教练" +#define TR_HARDWARE "硬件" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD卡" +#define TR_DEBUG "调试" +#define TR_MENU_RADIO_SWITCHES TR("开关", "开关及按键测试") +#define TR_MENUCALIBRATION "校准" +#define TR_FUNCTION_SWITCHES "可自定义开关" +// End Main menu + #define TR_MINUTE_SINGULAR "分钟" #define TR_MINUTE_PLURAL1 "分钟" #define TR_MINUTE_PLURAL2 "分钟" @@ -289,7 +366,6 @@ #define TR_WARN_5VOLTS "注意输出电平为5V" #define TR_MS "ms" #define TR_SWITCH "开关" -#define TR_FUNCTION_SWITCHES "可自定义开关" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -343,7 +419,6 @@ #define TR_DELAYUP "上行延时" #define TR_SLOWDOWN TR("下慢放", "下行慢动作") #define TR_SLOWUP "上行慢动作" -#define TR_MIXES "混控设置" #define TR_CV "曲线" #if defined(PCBPL18) #define TR_GV "GV" @@ -426,19 +501,12 @@ #define TR_MOVESTICKSPOTS "校准边界,按[Enter]保存并完成" #else #define TR_MENUTOSTART "按" TR_ENTER " 开始" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "校准中点" - #define TR_MOVESTICKSPOTS "校准边界" -#else - #define TR_SETMIDPOINT TR("校准中点", "校准中点") - #define TR_MOVESTICKSPOTS "校准边界" -#endif + #define TR_SETMIDPOINT TRSA("校准中点", TR("校准中点", "校准中点")) + #define TR_MOVESTICKSPOTS TRSA("校准边界", "校准边界") #define TR_MENUWHENDONE TR_ENTER " 完成" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -468,10 +536,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "模型" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "按任意键跳过" @@ -486,14 +551,10 @@ #define TR_STORAGE_FORMAT "存储准备" #define TR_EEPROMOVERFLOW "存储超限" #define TR_RADIO_SETUP "系统设置" -#define TR_MENUTRAINER "教练" -#define TR_MENUSPECIALFUNCS "全局功能" #define TR_MENUVERSION "版本" -#define TR_MENU_RADIO_SWITCHES TR("开关", "开关及按键测试") #define TR_MENU_RADIO_ANALOGS TR("模拟", "模拟输入测试") #define TR_MENU_RADIO_ANALOGS_CALIB "已校准的模拟值" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "原始模拟值 (5 Hz)" -#define TR_MENUCALIBRATION "校准" #define TR_MENU_FSWITCH "可自定义开关" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "将当前微调量保存至中点" @@ -504,31 +565,15 @@ #define TR_CHANNEL2FAILSAFE "导入当前通道值" #define TR_MENUMODELSEL TR("模型选择", "模型选择") #define TR_MENU_MODEL_SETUP TR("模型设置", "模型设置") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "驾驶模式" - #define TR_MENUFLIGHTMODE "驾驶模式" -#else - #define TR_MENUFLIGHTMODES "飞行模式设置" - #define TR_MENUFLIGHTMODE "飞行模式" -#endif -#define TR_MENUHELISETUP "直升机设置" -#define TR_MENUINPUTS "输入设置" -#define TR_MENULIMITS "输出设置" -#define TR_MENUCURVES "曲线设置" #define TR_MENUCURVE "曲线" #define TR_MENULOGICALSWITCH "逻辑开关" -#define TR_MENULOGICALSWITCHES "逻辑开关设置" -#define TR_MENUCUSTOMFUNC "特殊功能设置" -#define TR_MENUCUSTOMSCRIPTS "自定义脚本设置" -#define TR_MENUTELEMETRY "回传" #define TR_MENUSTAT "统计" #define TR_MENUDEBUG "调试" #define TR_MONITOR_CHANNELS1 "1-8通道查看" #define TR_MONITOR_CHANNELS2 "9-16通道查看" #define TR_MONITOR_CHANNELS3 "17-24通道查看" #define TR_MONITOR_CHANNELS4 "25-32通道查看" -#define TR_MONITOR_SWITCHES "逻辑开关查看" #define TR_MONITOR_OUTPUT_DESC "输出查看" #define TR_MONITOR_MIXER_DESC "混控查看" #define TR_RECEIVER_NUM TR("RxNum", "接收机编号") @@ -690,8 +735,6 @@ #define TR_V2 "V2" #define TR_DURATION "持续时间" #define TR_DELAY "延时" -#define TR_SD_CARD "SD卡" -#define TR_SDHC_CARD "SD-HC卡" #define TR_NO_SOUNDS_ON_SD "存储卡中无音频" #define TR_NO_MODELS_ON_SD "存储卡中无模型" #define TR_NO_BITMAPS_ON_SD "存储卡中无图片" @@ -710,7 +753,6 @@ #define TR_REMOVED "已删除" #define TR_SD_INFO "信息" #define TR_NA "N/A" -#define TR_HARDWARE "硬件" #define TR_FORMATTING "正在格式化..." #define TR_TEMP_CALIB "温度校准" #define TR_TIME "时间" @@ -766,13 +808,11 @@ #define TR_SD_SECTORS "扇区:" #define TR_SD_SIZE "容量:" #define TR_TYPE "类型" -#define TR_GLOBAL_VARS "全局变量" #define TR_GVARS "全局变量" #define TR_GLOBAL_VAR "全局变量" -#define TR_MENU_GLOBAL_VARS "全局变量功能" #define TR_OWN "Own" #define TR_DATE "日期" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" #define TR_ROTARY_ENCODER "滚轮" #define TR_ROTARY_ENC_MODE TR("滚轮模式","滚轮模式") #define TR_CHANNELS_MONITOR "通道查看器" @@ -889,7 +929,6 @@ #define TR_RANGE_TEST "距离测试(低功率)" #define TR_RECEIVER_OPTIONS TR("选项", "接收机选项") #define TR_RESET_BTN BUTTON("复位") -#define TR_DEBUG "调试" #define TR_KEYS_BTN BUTTON("按键") #define TR_ANALOGS_BTN BUTTON(TR("模拟", "模拟量")) #define TR_FS_BTN BUTTON(TR("自定义开关", TR_FUNCTION_SWITCHES)) @@ -972,7 +1011,6 @@ #define TR_TOUCH_PANEL "触摸屏:" #define TR_FILE_SIZE "文件大小" #define TR_FILE_OPEN "强制打开?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "名称" @@ -997,7 +1035,7 @@ #define TR_INVERTED "反向" -#define TR_LSW_DESCRIPTIONS { "比较类型或功能", "第一个变量", "第二个变量或常量", "第二个变量或常量", "启用本行的附加条件", "逻辑开关持续时间", "逻辑开关延时开启" } +#define TR_LSW_DESCRIPTIONS "比较类型或功能", "第一个变量", "第二个变量或常量", "第二个变量或常量", "启用本行的附加条件", "逻辑开关持续时间", "逻辑开关延时开启" #if defined(COLORLCD) // Horus layouts and widgets @@ -1014,10 +1052,9 @@ #define TR_ALIGNMENT "对齐" #define TR_ALIGN_LABEL "对齐名称" #define TR_ALIGN_VALUE "对齐值" - #define TR_ALIGN_OPTS { "左", "中", "右" } + #define TR_ALIGN_OPTS "左", "中", "右" #define TR_TEXT "文本" #define TR_COLOR "颜色" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "面板1背景" #define TR_PANEL2_BACKGROUND "面板2背景" #define TR_WIDGET_GAUGE "行程" @@ -1081,11 +1118,9 @@ #define TR_WIDGET_SETTINGS "小部件设置" #define TR_REMOVE_SCREEN "移除页面" #define TR_SETUP_WIDGETS "设置小部件" -#define TR_USER_INTERFACE "显示设置" #define TR_THEME "主题" #define TR_SETUP "设置" #define TR_LAYOUT "布局" -#define TR_ADD_MAIN_VIEW "添加主视图" #define TR_TEXT_COLOR "文本颜色" #define TR_MENU_INPUTS STR_CHAR_INPUT "输入" #define TR_MENU_LUA STR_CHAR_LUA "LUA脚本" @@ -1153,20 +1188,6 @@ #define TR_CANCEL "取消" #define TR_EDIT_THEME "编辑主题" #define TR_DETAILS "详细信息" -#define TR_THEME_EDITOR "主题" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "模型选择" -#define TR_MAIN_MENU_MANAGE_MODELS "模型管理" -#define TR_MAIN_MENU_MODEL_NOTES "模型说明" -#define TR_MAIN_MENU_CHANNEL_MONITOR "通道查看" -#define TR_MAIN_MENU_MODEL_SETTINGS "模型设置" -#define TR_MAIN_MENU_RADIO_SETTINGS "系统设置" -#define TR_MAIN_MENU_SCREEN_SETTINGS "显示设置" -#define TR_MAIN_MENU_RESET_TELEMETRY "复位功能" -#define TR_MAIN_MENU_STATISTICS "统计信息" -#define TR_MAIN_MENU_ABOUT_EDGETX "关于" -// End Main menu #define TR_PROTOCOL "协议" diff --git a/radio/src/translations/cz.h b/radio/src/translations/cz.h index 52a2797eb..85b89a544 100644 --- a/radio/src/translations/cz.h +++ b/radio/src/translations/cz.h @@ -40,6 +40,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 20 +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Správa modelů" +#define TR_MAIN_MENU_MODEL_NOTES "Poznámky modelu" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor kanálů" +#define TR_MONITOR_SWITCHES "MONITOR LOGICKÝCH SPÍNAČŮ" +#define TR_MAIN_MENU_MODEL_SETTINGS "Nastavení modelu" +#define TR_MAIN_MENU_RADIO_SETTINGS "Nastavení rádia" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistiky" +#define TR_MAIN_MENU_ABOUT_EDGETX "O EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "Motivy" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "HELI" +#define TR_MENUFLIGHTMODES TRSA("REŽIM JÍZDA", "LETOVÉ REŽIMY") +#define TR_MENUFLIGHTMODE TRSA("REŽIM JÍZDA", "LETOVÝ REŽIM") +#define TR_MENUINPUTS "VSTUPY" +#define TR_MENULIMITS "SERVA" +#define TR_MENUCURVES "KŘIVKY" +#define TR_MIXES "MIXER" +#define TR_MENU_GLOBAL_VARS "Globální Proměnné" +#define TR_MENULOGICALSWITCHES "LOGICKÉ SPÍNAČE" +#define TR_MENUCUSTOMFUNC "SPECIÁLNÍ FUNKCE" +#define TR_MENUCUSTOMSCRIPTS "SKRIPTY LUA" +#define TR_MENUTELEMETRY "TELEMETRIE" +#define TR_MENUSPECIALFUNCS "GLOBÁLNÍ FUNKCE" +#define TR_MENUTRAINER "TRENÉR" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES "DIAG" +#define TR_MENUCALIBRATION "KALIBRACE" +#define TR_FUNCTION_SWITCHES "Nastavitelné přepínače" +// End Main menu + #define TR_MINUTE_SINGULAR "minuta" #define TR_MINUTE_PLURAL1 "minuty" #define TR_MINUTE_PLURAL2 "minut" @@ -302,7 +379,6 @@ #define TR_WARN_5VOLTS "Varování: výstupní úroveň je 5 voltů" #define TR_MS "ms" #define TR_SWITCH "Spínač" -#define TR_FUNCTION_SWITCHES "Nastavitelné přepínače" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -356,7 +432,6 @@ #define TR_DELAYUP TR3("Zpoždění Zap", "Zdržet(\43)", "Zpoždění Zap") #define TR_SLOWDOWN TR3("Zpomalení(-)", "Zpomal(\177)", "Zpomalení(\177)") #define TR_SLOWUP TR3("Zpomalení(+)", "Zpomal(\176)", "Zpomalení(\176)") -#define TR_MIXES "MIXER" #define TR_CV "K" #if defined(PCBPL18) #define TR_GV "GP" @@ -440,19 +515,12 @@ #define TR_MOVESTICKSPOTS "HÝBAT OSY/POTY" #else #define TR_MENUTOSTART TR_ENTER " = START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "NASTAVIT STŘED POTU" - #define TR_MOVESTICKSPOTS "HÝBAT TOČIT/PLYN/POTY/OSY" -#else - #define TR_SETMIDPOINT TR("NASTAVIT STŘED OSY", "STŘED OSY/SLIDERU") - #define TR_MOVESTICKSPOTS "HÝBAT OSY/POTY" -#endif + #define TR_SETMIDPOINT TRSA("NASTAVIT STŘED POTU", TR("NASTAVIT STŘED OSY", "STŘED OSY/SLIDERU")) + #define TR_MOVESTICKSPOTS TRSA("HÝBAT TOČIT/PLYN/POTY/OSY", "HÝBAT OSY/POTY") #define TR_MENUWHENDONE TR_ENTER " > DALŠÍ" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "ŽÁDNÁ DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -484,10 +552,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "LR" +#define TR_FM TRSA("DM", "LR") #endif #define TR_EEPROMLOWMEM "Dochází EEPROM" #define TR_PRESS_ANY_KEY_TO_SKIP TR("\003Klávesa >>> přeskočit", "Klávesa >>> přeskočit") @@ -502,14 +567,10 @@ #define TR_STORAGE_FORMAT "Příprava úložiště" #define TR_EEPROMOVERFLOW "Přetekla EEPROM" #define TR_RADIO_SETUP "NASTAVENÍ RÁDIA" -#define TR_MENUTRAINER "TRENÉR" -#define TR_MENUSPECIALFUNCS "GLOBÁLNÍ FUNKCE" #define TR_MENUVERSION "VERZE" -#define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANALOGY" #define TR_MENU_RADIO_ANALOGS_CALIB "KALIBROVAT ANALOGY" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGY (5 Hz)" -#define TR_MENUCALIBRATION "KALIBRACE" #define TR_MENU_FSWITCH "NASTAVITELNÉ PŘEPÍNAČE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trimy => Subtrimy" @@ -520,32 +581,15 @@ #define TR_CHANNEL2FAILSAFE "Kanál=>Failsafe" #define TR_MENUMODELSEL "MODEL" #define TR_MENU_MODEL_SETUP "NASTAVENÍ" -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "REŽIM JÍZDA" -#define TR_MENUFLIGHTMODE "REŽIM JÍZDA" -#else -#define TR_MENUFLIGHTMODE "LETOVÝ REŽIM" -#define TR_MENUFLIGHTMODES "LETOVÉ REŽIMY" -#endif -#define TR_MENUHELISETUP "HELI" -#define TR_MENULIMITS "SERVA" -#define TR_MENUINPUTS "VSTUPY" - -#define TR_MENUCURVES "KŘIVKY" #define TR_MENUCURVE "\002K" #define TR_MENULOGICALSWITCH "LOG. SPÍNAČ" -#define TR_MENULOGICALSWITCHES "LOGICKÉ SPÍNAČE" -#define TR_MENUCUSTOMFUNC "SPECIÁLNÍ FUNKCE" -#define TR_MENUCUSTOMSCRIPTS "SKRIPTY LUA" -#define TR_MENUTELEMETRY "TELEMETRIE" #define TR_MENUSTAT "STATISTIKA" #define TR_MENUDEBUG "DIAG" #define TR_MONITOR_CHANNELS1 "MONITOR KANÁLŮ 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR KANÁLŮ 9/16" #define TR_MONITOR_CHANNELS3 "MONITOR KANÁLŮ 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR KANÁLŮ 25/32" -#define TR_MONITOR_SWITCHES "MONITOR LOGICKÝCH SPÍNAČŮ" #define TR_MONITOR_OUTPUT_DESC "Výstupy" #define TR_MONITOR_MIXER_DESC "Mixy" #define TR_RECEIVER_NUM TR("RX číslo", "Číslo přijímače") @@ -701,8 +745,6 @@ #define TR_V2 "V2" #define TR_DURATION "Trvání" #define TR_DELAY "Zdržet" -#define TR_SD_CARD "SD" -#define TR_SDHC_CARD "SD-HC" #define TR_NO_SOUNDS_ON_SD "žádný zvuk na SD" #define TR_NO_MODELS_ON_SD "žádný model na SD" #define TR_NO_BITMAPS_ON_SD "žádné obrázky na SD" @@ -721,7 +763,6 @@ #define TR_REMOVED "odstraněn" #define TR_SD_INFO "Informace" #define TR_NA "[X]" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formátovaní..." #define TR_TEMP_CALIB "+=\006Teplota" #define TR_TIME "Čas" @@ -776,13 +817,11 @@ #define TR_SD_SECTORS "Sektorů :" #define TR_SD_SIZE "Velikost:" #define TR_TYPE "Typ" -#define TR_GLOBAL_VARS "Globální proměnné" #define TR_GVARS "GLOB.PROM." #define TR_GLOBAL_VAR "Globální proměnná" -#define TR_MENU_GLOBAL_VARS "GLOBÁLNÍ PROMĚNNÉ" #define TR_OWN "\043" #define TR_DATE "Datum" -#define TR_MONTHS { "Led", "Úno", "Bře", "Dub", "Kvě", "Čvn", "Čvc", "Srp", "Zář", "Říj", "Lis", "Pro" } +#define TR_MONTHS "Led", "Úno", "Bře", "Dub", "Kvě", "Čvn", "Čvc", "Srp", "Zář", "Říj", "Lis", "Pro" #define TR_ROTARY_ENCODER "R.Enko" #define TR_ROTARY_ENC_MODE TR("R.Enko mód","Režim otočného tlačítka") #define TR_CHANNELS_MONITOR "MONITOR KANÁLU" @@ -899,7 +938,6 @@ #define TR_RANGE_TEST "Test dosahu" #define TR_RECEIVER_OPTIONS TR("MOŽNOSTI RX", "MOŽNOSTI PŘIJÍMAČE") #define TR_RESET_BTN BUTTON("Reset") -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Přepínače")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogy")) #define TR_FS_BTN BUTTON(TR("Vlastní Sw", TR_FUNCTION_SWITCHES)) @@ -987,7 +1025,6 @@ #define TR_TOUCH_PANEL "Dotyková obrazovka:" #define TR_FILE_SIZE "Velikost souboru" #define TR_FILE_OPEN "Otevřít?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Název" @@ -1012,7 +1049,7 @@ #define TR_INVERTED "Invertováno" -#define TR_LSW_DESCRIPTIONS { "Typ porovnávací funkce", "První proměnná", "Druhá proměnná nebo konstanta", "Druhá proměnná nebo konstanta", "Další stav povolující tenko spínač", "Minimální doba trvání sepnutého stavu", "Minimální doba platné podmínky pro aktivaci" } +#define TR_LSW_DESCRIPTIONS "Typ porovnávací funkce", "První proměnná", "Druhá proměnná nebo konstanta", "Druhá proměnná nebo konstanta", "Další stav povolující tenko spínač", "Minimální doba trvání sepnutého stavu", "Minimální doba platné podmínky pro aktivaci" #if defined(COLORLCD) // Horus layouts and widgets @@ -1029,10 +1066,9 @@ #define TR_ALIGNMENT "Zarovnání" #define TR_ALIGN_LABEL "Zarovnat název" #define TR_ALIGN_VALUE "Zarovnat hodnotu" - #define TR_ALIGN_OPTS { "Vlevo", "Uprostřed", "Vpravo" } + #define TR_ALIGN_OPTS "Vlevo", "Uprostřed", "Vpravo" #define TR_TEXT "Text" #define TR_COLOR "Barva" - #define TR_MAIN_VIEW_X "Hlavní pohled XX" #define TR_PANEL1_BACKGROUND "Panel1 pozadí" #define TR_PANEL2_BACKGROUND "Panel2 pozadí" #define TR_WIDGET_GAUGE "Měřidlo" @@ -1096,11 +1132,9 @@ #define TR_WIDGET_SETTINGS "Nastavení widgetu" #define TR_REMOVE_SCREEN "Odstranit panel" #define TR_SETUP_WIDGETS "Nastavit widgety" -#define TR_USER_INTERFACE "Uživatelské rozhraní" #define TR_THEME "Motiv" #define TR_SETUP "Nastavení" #define TR_LAYOUT "Rozložení" -#define TR_ADD_MAIN_VIEW "Přidat hlavní panel" #define TR_TEXT_COLOR "Barva textu" #define TR_MENU_INPUTS STR_CHAR_INPUT "Vstupy" @@ -1169,20 +1203,6 @@ #define TR_CANCEL "Zrušit" #define TR_EDIT_THEME "EDITOVAT MOTIV" #define TR_DETAILS "Detaily" -#define TR_THEME_EDITOR "Motivy" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Vybrat\nmodel" -#define TR_MAIN_MENU_MANAGE_MODELS "Správa\nmodelů" -#define TR_MAIN_MENU_MODEL_NOTES "Poznámky\nmodelu" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor\nkanálů" -#define TR_MAIN_MENU_MODEL_SETTINGS "Nastavení\nmodelu" -#define TR_MAIN_MENU_RADIO_SETTINGS "Nastavení\nrádia" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Nastavení\nobrazovky" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\ntelemetrie" -#define TR_MAIN_MENU_STATISTICS "Statistiky" -#define TR_MAIN_MENU_ABOUT_EDGETX "O\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Angličtina" diff --git a/radio/src/translations/da.h b/radio/src/translations/da.h index 46f058d71..3a6d711a6 100644 --- a/radio/src/translations/da.h +++ b/radio/src/translations/da.h @@ -39,6 +39,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Vælg Model" +#define TR_MAIN_MENU_MODEL_NOTES "Model Noter" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal Monitor" +#define TR_MONITOR_SWITCHES "LOGISK FUNKTION MONITOR" +#define TR_MAIN_MENU_MODEL_SETTINGS "Model Indstilling" +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio Indstilling" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistik" +#define TR_MAIN_MENU_ABOUT_EDGETX "Om EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "TEMAER" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "HELI SETUP" +#define TR_MENUFLIGHTMODES TRSA("FLYVE TILSTANDE", "FLYVE TILSTANDE") +#define TR_MENUFLIGHTMODE TRSA("FLYVE TILSTAND", "FLYVE TILSTAND") +#define TR_MENUINPUTS "INDGANGE" +#define TR_MENULIMITS "UDGANGE" +#define TR_MENUCURVES "KURVER" +#define TR_MIXES "MIX" +#define TR_MENU_GLOBAL_VARS "Globale Variable" +#define TR_MENULOGICALSWITCHES "LOGISKE FUNKTIONER" +#define TR_MENUCUSTOMFUNC "SPECIALFUNKTIONER" +#define TR_MENUCUSTOMSCRIPTS "TILPASSET SCRIPT" +#define TR_MENUTELEMETRY "TELEMETRI" +#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONER" +#define TR_MENUTRAINER "TRÆNER" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD KORT" +#define TR_DEBUG "Fejlfind" +#define TR_MENU_RADIO_SWITCHES TR("KONTAKTER", "KONTAKTER TEST") +#define TR_MENUCALIBRATION "KALIBRIERING" +#define TR_FUNCTION_SWITCHES "Kontakter der kan tilpasses" +// End Main menu + #define TR_MINUTE_SINGULAR "minut" #define TR_MINUTE_PLURAL1 "minutter" #define TR_MINUTE_PLURAL2 "minutter" @@ -292,7 +369,6 @@ #define TR_WARN_5VOLTS "Advarsel: udgang niveau er 5 volts" #define TR_MS "ms" #define TR_SWITCH "Kontakt" -#define TR_FUNCTION_SWITCHES "Kontakter der kan tilpasses" #define TR_FS_COLOR_LIST "Bruger","Fra","Hvid","Rød","Grøn","Gul","Orange","Blå","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Altid til" @@ -346,7 +422,6 @@ #define TR_DELAYUP TR("Forsink op", "Forsinkelse op") #define TR_SLOWDOWN TR("Langsom ned", "Langsom ned") #define TR_SLOWUP TR("Langsom op", "Langsom op") -#define TR_MIXES "MIX" #define TR_CV "KU" #if defined(PCBPL18) #define TR_GV "GV" @@ -431,19 +506,12 @@ #define TR_MOVESTICKSPOTS "FLYT PINDE/DREJEKONTAKT" #else #define TR_MENUTOSTART TR_ENTER " FOR START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SÆT PINDE I MIDT", "CENTRER PINDE/SKYDERE") - #define TR_MOVESTICKSPOTS "FLYT PINDE/DREJEKONTAKTER" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("SÆT PINDE I MIDT", "CENTRER PINDE/SKYDERE")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "FLYT PINDE/DREJEKONTAKTER") #define TR_MENUWHENDONE TR_ENTER " NÅR FÆRDIG" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "INGEN DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -473,10 +541,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "KA" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) - #define TR_FM "DM" -#else - #define TR_FM "FT" +#define TR_FM TRSA("DM", "FT") #endif #define TR_EEPROMLOWMEM "EEPROM lav mem" #define TR_PRESS_ANY_KEY_TO_SKIP "Tryk en tast ..." @@ -491,14 +556,10 @@ #define TR_STORAGE_FORMAT "Lager klargøres" #define TR_EEPROMOVERFLOW "EEPROM overflow" #define TR_RADIO_SETUP "RADIO SETUP" -#define TR_MENUTRAINER "TRÆNER" -#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONER" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("KONTAKTER", "KONTAKTER TEST") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST") #define TR_MENU_RADIO_ANALOGS_CALIB "KALIBRERET ANALOGE" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RÅ ANALOGE (5 Hz)" -#define TR_MENUCALIBRATION "KALIBRIERING" #define TR_MENU_FSWITCH "KONTAKTER DER KAN TILPASSES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trim => Subtrim" @@ -509,31 +570,15 @@ #define TR_CHANNEL2FAILSAFE "Kanal=>Fejlsikring" #define TR_MENUMODELSEL TR("MODELLER", "MODEL VALG") #define TR_MENU_MODEL_SETUP TR("SETUP", "MODEL SETUP") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "FLYVE TILSTANDE" - #define TR_MENUFLIGHTMODE "FLYVE TILSTAND" -#else - #define TR_MENUFLIGHTMODES "FLYVE TILSTANDE" - #define TR_MENUFLIGHTMODE "FLYVE TILSTAND" -#endif -#define TR_MENUHELISETUP "HELI SETUP" -#define TR_MENUINPUTS "INDGANGE" -#define TR_MENULIMITS "UDGANGE" -#define TR_MENUCURVES "KURVER" #define TR_MENUCURVE "KURVE" #define TR_MENULOGICALSWITCH "LOGISK FUNKTION" -#define TR_MENULOGICALSWITCHES "LOGISKE FUNKTIONER" -#define TR_MENUCUSTOMFUNC "SPECIALFUNKTIONER" -#define TR_MENUCUSTOMSCRIPTS "TILPASSET SCRIPT" -#define TR_MENUTELEMETRY "TELEMETRI" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "KANAL MONITOR 1-8" #define TR_MONITOR_CHANNELS2 "KANAL MONITOR 9-16" #define TR_MONITOR_CHANNELS3 "KANAL MONITOR 17-24" #define TR_MONITOR_CHANNELS4 "KANAL MONITOR 25-32" -#define TR_MONITOR_SWITCHES "LOGISK FUNKTION MONITOR" #define TR_MONITOR_OUTPUT_DESC "Udgange" #define TR_MONITOR_MIXER_DESC "Mix" #define TR_RECEIVER_NUM TR("RxNr", "Rx modtager Nr.") @@ -695,8 +740,6 @@ #define TR_V2 TR("V2", "Værdi 2") #define TR_DURATION "Varighed" #define TR_DELAY "Forsinkelse" -#define TR_SD_CARD "SD KORT" -#define TR_SDHC_CARD "SD-HC KORT" #define TR_NO_SOUNDS_ON_SD "Ingen lyde på SD" #define TR_NO_MODELS_ON_SD "Ingen modeller på SD" #define TR_NO_BITMAPS_ON_SD "Ingen bitmapper på SD" @@ -715,7 +758,6 @@ #define TR_REMOVED " slettet" #define TR_SD_INFO "Information" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formattering..." #define TR_TEMP_CALIB "Temp. kalib" #define TR_TIME "Tid" @@ -771,13 +813,11 @@ #define TR_SD_SECTORS "Sektorer:" #define TR_SD_SIZE "Størrelse:" #define TR_TYPE "Type" -#define TR_GLOBAL_VARS "Globale variable" #define TR_GVARS "GV" #define TR_GLOBAL_VAR "Globale variable" -#define TR_MENU_GLOBAL_VARS "GLOBALE VARIABLE" #define TR_OWN "Egen" #define TR_DATE "Dato" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("DrejeK. tilst.","Drejekontakt tilstand") #define TR_CHANNELS_MONITOR "KANAL MONITOR" @@ -894,7 +934,6 @@ #define TR_RANGE_TEST "Test af rækkevidde" #define TR_RECEIVER_OPTIONS TR("MODT. VALG", "MODTAGER VALG") #define TR_RESET_BTN BUTTON("Nulstil") -#define TR_DEBUG "Fejlfind" #define TR_KEYS_BTN BUTTON("Taster") #define TR_ANALOGS_BTN BUTTON(TR("Analo", "Analoge")) #define TR_FS_BTN BUTTON(TR("Tilpasset sw", TR_FUNCTION_SWITCHES)) @@ -977,7 +1016,6 @@ #define TR_TOUCH_PANEL "Tryk panel:" #define TR_FILE_SIZE "Fil størrelse" #define TR_FILE_OPEN "Åbn alligevel?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Navn" @@ -1001,7 +1039,7 @@ #define TR_LIMITS_HEADERS_SUBTRIMMODE TR("Undertrim tils.", "Undertrim tilstand") #define TR_INVERTED "Invers" -#define TR_LSW_DESCRIPTIONS { "Sammenlign type eller funktion", "Første variabel", "Anden variabel eller konstant", "Anden variabel eller konstant", "Endnu en betingelse for linje", "Minimum TIL varighed for logisk funktion", "Minimum SAND varighed for betingelse bliver sand" } +#define TR_LSW_DESCRIPTIONS "Sammenlign type eller funktion", "Første variabel", "Anden variabel eller konstant", "Anden variabel eller konstant", "Endnu en betingelse for linje", "Minimum TIL varighed for logisk funktion", "Minimum SAND varighed for betingelse bliver sand" #if defined(COLORLCD) // Horus layouts and widgets @@ -1018,10 +1056,9 @@ #define TR_ALIGNMENT "Justering" #define TR_ALIGN_LABEL "Justere navn" #define TR_ALIGN_VALUE "Justere værdi" - #define TR_ALIGN_OPTS { "Venstre", "Center", "Højre" } + #define TR_ALIGN_OPTS "Venstre", "Center", "Højre" #define TR_TEXT "Tekst" #define TR_COLOR "Farve" - #define TR_MAIN_VIEW_X "Hoved visning XX" #define TR_PANEL1_BACKGROUND "Panel1 baggrund" #define TR_PANEL2_BACKGROUND "Panel2 baggrund" #define TR_WIDGET_GAUGE "Måling" @@ -1091,11 +1128,9 @@ #define TR_SETUP_WIDGETS "Widget" #endif -#define TR_USER_INTERFACE "Bruger interface" #define TR_THEME "Tema" #define TR_SETUP "Opsætning" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Tilføj hoved billede" #define TR_TEXT_COLOR "Tekst farve" #define TR_MENU_INPUTS STR_CHAR_INPUT "Indgange" #define TR_MENU_LUA STR_CHAR_LUA "Lua script" @@ -1170,20 +1205,6 @@ #define TR_CANCEL "Fortryd" #define TR_EDIT_THEME "RET TEMA" #define TR_DETAILS "Detajler" -#define TR_THEME_EDITOR "TEMAER" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Vælg\nModel" -#define TR_MAIN_MENU_MANAGE_MODELS "Vælg\nModel" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNoter" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nIndstilling" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nIndstilling" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Skærm\nIndstilling" -#define TR_MAIN_MENU_RESET_TELEMETRY "Nulstil\nTelemetri" -#define TR_MAIN_MENU_STATISTICS "Statistik" -#define TR_MAIN_MENU_ABOUT_EDGETX "Om\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Engelsk" @@ -1240,8 +1261,8 @@ #define TR_SYNC "Synk" #define TR_ENABLED_FEATURES "Aktiverede funktioner" -#define TR_RADIO_MENU_TABS "Radio menu tab" -#define TR_MODEL_MENU_TABS "Model menu tab" +#define TR_RADIO_MENU_TABS "Radio menu" +#define TR_MODEL_MENU_TABS "Model menu" #define TR_SELECT_MENU_ALL "Alle" #define TR_SELECT_MENU_CLR "Slet" diff --git a/radio/src/translations/de.h b/radio/src/translations/de.h index 4437b70e5..a3a55414a 100644 --- a/radio/src/translations/de.h +++ b/radio/src/translations/de.h @@ -41,6 +41,82 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Modell Manager" +#define TR_MAIN_MENU_MODEL_NOTES "Modell Notizen" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal Monitor" +#define TR_MONITOR_SWITCHES "LOGIK SCHALTER MONITOR" +#define TR_MAIN_MENU_MODEL_SETTINGS "Modell Konfig." +#define TR_MAIN_MENU_RADIO_SETTINGS "Sender Konfig." +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistiken" +#define TR_MAIN_MENU_ABOUT_EDGETX "Über EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "THEMES" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") +#define TR_MENUFLIGHTMODES TRSA("FAHRMODI", "FLUGPHASEN") +#define TR_MENUFLIGHTMODE TRSA("FAHRMODUS", "FLUGPHASE") +#define TR_MENUINPUTS "INPUTS" //"Inputs=Geber" +#define TR_MENULIMITS "SERVOS" //"AUSGABEN" oder "Servos" +#define TR_MENUCURVES "KURVEN" +#define TR_MIXES "MISCHER" +#define TR_MENU_GLOBAL_VARS "Globale Variablen" +#define TR_MENULOGICALSWITCHES "LOGIKSCHALTER" +#define TR_MENUCUSTOMFUNC TR("SPEZ.-FUNKTIONEN", "SPEZIAL-FUNKTIONEN") +#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTE" +#define TR_MENUTELEMETRY "TELEMETRIE" +#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONEN" +#define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") +#define TR_HARDWARE TR("Hardware einst. ", "Namen und Hardware einst.") +#define TR_SD_CARD "SD-Karte" +#define TR_DEBUG "Testen" +#define TR_MENU_RADIO_SWITCHES TR("Schalter-Test", "Schalter-Test") +#define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog") +#define TR_FUNCTION_SWITCHES "Anpassbare Schalter" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minuten" #define TR_MINUTE_PLURAL2 "minuten" @@ -294,7 +370,6 @@ #define TR_WARN_5VOLTS "Warnung: Ausgangspegel ist 5 Volt" #define TR_MS "ms" #define TR_SWITCH TR("Schalt.", "Schalter") -#define TR_FUNCTION_SWITCHES "Anpassbare Schalter" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -348,7 +423,6 @@ #define TR_DELAYUP "Verz. Up" #define TR_SLOWDOWN "Langs.Dn" #define TR_SLOWUP "Langs.Up" -#define TR_MIXES "MISCHER" #define TR_CV "KV" #if defined(PCBPL18) #define TR_GV "GV" @@ -431,19 +505,12 @@ #define TR_MOVESTICKSPOTS "Knüppel/Schieber bewegen" #else #define TR_MENUTOSTART TR_ENTER " Zum START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SCHIEBER AUF MITTE" - #define TR_MOVESTICKSPOTS "BEWEGE LENK/GAS/POTI/KNÜPPEL" -#else - #define TR_SETMIDPOINT TR("KNÜPPEL AUF MITTE", "ZENTRIERE KNÜPPEL/SCHIEBER") - #define TR_MOVESTICKSPOTS "BEWEGE KNÜPPEL/SCHIEBER" -#endif + #define TR_SETMIDPOINT TRSA("SCHIEBER AUF MITTE", TR("KNÜPPEL AUF MITTE", "ZENTRIERE KNÜPPEL/SCHIEBER")) + #define TR_MOVESTICKSPOTS TRSA("BEWEGE LENK/GAS/POTI/KNÜPPEL", "BEWEGE KNÜPPEL/SCHIEBER") #define TR_MENUWHENDONE TR_ENTER " wenn fertig" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "Keine Daten" #define TR_US "us" #define TR_HZ "Hz" @@ -473,10 +540,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELL" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FP" +#define TR_FM TRSA("DM", "FP") #endif #define TR_EEPROMLOWMEM "EEPROM voll" #define TR_THROTTLE_NOT_IDLE "Gas nicht Null!" @@ -491,14 +555,10 @@ #define TR_STORAGE_FORMAT "Speicher Vorbereiten" #define TR_EEPROMOVERFLOW "EEPROM Überlauf" #define TR_RADIO_SETUP TR("SENDER-EINSTELLEN", "SENDER-GRUNDEINSTELLUNGEN") -#define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") -#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONEN" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("Schalter-Test", "Schalter-Test") #define TR_MENU_RADIO_ANALOGS "Geber-Test" #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog") #define TR_MENU_FSWITCH "ANPASSBARE SCHALTER" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -509,30 +569,14 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELLE", "MODELL WÄHLEN") #define TR_MENU_MODEL_SETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "FAHRMODI" - #define TR_MENUFLIGHTMODE "FAHRMODUS" -#else - #define TR_MENUFLIGHTMODE "FLUGPHASE" - #define TR_MENUFLIGHTMODES "FLUGPHASEN" -#endif -#define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") -#define TR_MENUINPUTS "INPUTS" //"Inputs=Geber" -#define TR_MENULIMITS "SERVOS" //"AUSGABEN" oder "Servos" -#define TR_MENUCURVES "KURVEN" #define TR_MENUCURVE "KURVE" #define TR_MENULOGICALSWITCH "LOGIKSCHALTER" -#define TR_MENULOGICALSWITCHES "LOGIKSCHALTER" -#define TR_MENUCUSTOMFUNC TR("SPEZ.-FUNKTIONEN", "SPEZIAL-FUNKTIONEN") -#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTE" -#define TR_MENUTELEMETRY "TELEMETRIE" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "KANAL+MISCHER MONITOR 1-8" #define TR_MONITOR_CHANNELS2 "KANAL+MISCHER MONITOR 9-16" #define TR_MONITOR_CHANNELS3 "KANAL+MISCHER MONITOR 17-24" #define TR_MONITOR_CHANNELS4 "KANAL+MISCHER MONITOR 25-32" -#define TR_MONITOR_SWITCHES "LOGIK SCHALTER MONITOR" #define TR_MONITOR_OUTPUT_DESC "Kanäle" #define TR_MONITOR_MIXER_DESC "Mischer" #define TR_RECEIVER_NUM TR("Empf Nr.", "Empfänger Nummer") @@ -688,8 +732,6 @@ #define TR_V2 "V2" #define TR_DURATION "Dauer" #define TR_DELAY "Verzögerung" -#define TR_SD_CARD "SD-Karte" -#define TR_SDHC_CARD "SDHC-Karte" #define TR_NO_SOUNDS_ON_SD "Keine Töne auf SD" #define TR_NO_MODELS_ON_SD "Kein Modelle auf SD" #define TR_NO_BITMAPS_ON_SD "Keine Bitmaps auf SD" @@ -708,7 +750,6 @@ #define TR_REMOVED " gelöscht" #define TR_SD_INFO "Information" #define TR_NA "N/V" //NV=Nicht Verfügbar Kurz-Meldung -#define TR_HARDWARE TR("Hardware einst. ", "Namen und Hardware einst.") #define TR_FORMATTING "Formatierung..." #define TR_TEMP_CALIB "Temp. abgl." #define TR_TIME "Uhrzeit:" @@ -763,13 +804,11 @@ #define TR_SD_SECTORS "Sektoren:" #define TR_SD_SIZE "Größe:" #define TR_TYPE "Typ" -#define TR_GLOBAL_VARS "Globale Variablen" #define TR_GVARS "GLOBALE V." #define TR_GLOBAL_VAR "Globale Variable" -#define TR_MENU_GLOBAL_VARS "GLOBALE VARIABLEN" #define TR_OWN "Eigen" #define TR_DATE "Datum:" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez" #define TR_ROTARY_ENCODER "Drehg." #define TR_ROTARY_ENC_MODE TR("Drehg. Modus","Drehgeber Modus") #define TR_CHANNELS_MONITOR "Kanal-Monitor==>" @@ -886,7 +925,6 @@ #define TR_RANGE_TEST "Reichweitentest" #define TR_RECEIVER_OPTIONS TR("RX OPTIONEN", "RX OPTIONEN") #define TR_RESET_BTN BUTTON("Reset") -#define TR_DEBUG "Testen" #define TR_KEYS_BTN BUTTON(TR("SW","Schalter")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analoge")) #define TR_FS_BTN BUTTON(TR("AnpSchalt", TR_FUNCTION_SWITCHES)) @@ -975,7 +1013,6 @@ #define TR_TOUCH_PANEL "Touch panel:" #define TR_FILE_SIZE "Dateigröße" #define TR_FILE_OPEN "trotzdem öffnen?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis specific column headers #define TR_PHASES_HEADERS_NAME "Name " @@ -1004,10 +1041,9 @@ #define TR_ALIGNMENT "Ausrichtung" #define TR_ALIGN_LABEL "Name ausrichten" #define TR_ALIGN_VALUE "Wert ausrichten" - #define TR_ALIGN_OPTS { "Links", "Mitte", "Rechts" } + #define TR_ALIGN_OPTS "Links", "Mitte", "Rechts" #define TR_TEXT "Text" #define TR_COLOR "Farbe" - #define TR_MAIN_VIEW_X "Hauptansicht XX" #define TR_PANEL1_BACKGROUND "Panel1 Hintergrund" #define TR_PANEL2_BACKGROUND "Panel2 Hintergrund" #define TR_WIDGET_GAUGE "Pegel" @@ -1031,7 +1067,7 @@ // Horus footer descriptions -#define TR_LSW_DESCRIPTIONS { "Vergleich oder Funktion", "Erste Variable", "Zweite Variable/Konstante", "Zweite Variable/Konstante", "Weitere UND Bedingung für Freigabe des Log Schalters", "ON-Zeit des Log Schalters wenn Bedingung ok", "Mindestdauer der Bedingung damit Log Schalter ON geht" } +#define TR_LSW_DESCRIPTIONS "Vergleich oder Funktion", "Erste Variable", "Zweite Variable/Konstante", "Zweite Variable/Konstante", "Weitere UND Bedingung für Freigabe des Log Schalters", "ON-Zeit des Log Schalters wenn Bedingung ok", "Mindestdauer der Bedingung damit Log Schalter ON geht" //Taranis About screen #define TR_ABOUTUS TR(" Info ", "Info") @@ -1086,11 +1122,10 @@ #define TR_WIDGET_SETTINGS "Widget einstellen" #define TR_REMOVE_SCREEN "Seite löschen" #define TR_SETUP_WIDGETS "Widget einrichten" -#define TR_USER_INTERFACE "Benutzerschnittstelle" +#define TR_USER_INTERFACE "Top Bar" #define TR_THEME "Theme" #define TR_SETUP "Einrichten" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Ansicht hinzufügen" #define TR_TEXT_COLOR "Textfarbe" // ----------------------------- Symbole für Auswahlliste---------- #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" @@ -1159,20 +1194,6 @@ #define TR_CANCEL "Abbruch" #define TR_EDIT_THEME "THEME Editieren" #define TR_DETAILS "Details" -#define TR_THEME_EDITOR "THEMES" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Wähle\nModell" -#define TR_MAIN_MENU_MANAGE_MODELS "Modell\nManager" -#define TR_MAIN_MENU_MODEL_NOTES "Modell\nNotizen" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Modell\nKonfig." -#define TR_MAIN_MENU_RADIO_SETTINGS "Sender\nKonfig." -#define TR_MAIN_MENU_SCREEN_SETTINGS "Seiten\nKonfig." -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetrie" -#define TR_MAIN_MENU_STATISTICS "Statistiken" -#define TR_MAIN_MENU_ABOUT_EDGETX "Über\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Englisch" diff --git a/radio/src/translations/en.h b/radio/src/translations/en.h index 06a936313..8307fe92c 100644 --- a/radio/src/translations/en.h +++ b/radio/src/translations/en.h @@ -37,6 +37,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Mixer\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Manage Models" +#define TR_MAIN_MENU_MODEL_NOTES "Model Notes" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel Monitor" +#define TR_MONITOR_SWITCHES "Logical Switch Monitor" +#define TR_MAIN_MENU_MODEL_SETTINGS "Model Setup" +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio Setup" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistics" +#define TR_MAIN_MENU_ABOUT_EDGETX "About EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "Themes" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP TRC("HELI SETUP", "Heli Settings") +#define TR_MENUFLIGHTMODES TRSA(TRC("DRIVE MODES", "Drive Modes"), TRC("FLIGHT MODES", "Flight Modes")) +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "FLIGHT MODE") +#define TR_MENUINPUTS TRC("INPUTS", "Inputs") +#define TR_MENULIMITS TRC("OUTPUTS", "Outputs") +#define TR_MENUCURVES TRC("CURVES", "Curves") +#define TR_MIXES TRC("MIXES", "Mixes") +#define TR_MENU_GLOBAL_VARS "Global Variables" +#define TR_MENULOGICALSWITCHES TRC("LOGICAL SWITCHES", "Logical Switches") +#define TR_MENUCUSTOMFUNC TRC("SPECIAL FUNCTIONS", "Special Functions") +#define TR_MENUCUSTOMSCRIPTS TRC("MIXER SCRIPTS", "Mixer Scripts") +#define TR_MENUTELEMETRY TRC("TELEMETRY", "Telemetry") +#define TR_MENUSPECIALFUNCS TRC("GLOBAL FUNCTIONS", "Global Functions") +#define TR_MENUTRAINER TRC("TRAINER", "Trainer") +#define TR_HARDWARE TRC("HARDWARE", "Hardware") +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD TRC("SD CARD", "Storage") +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TRC("SWITCHES", "Switches Test") +#define TR_MENUCALIBRATION TRC("CALIBRATION", "Calibration") +#define TR_FUNCTION_SWITCHES "Customizable Switches" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minutes" #define TR_MINUTE_PLURAL2 "minutes" @@ -293,7 +370,6 @@ #define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_SWITCH "Switch" -#define TR_FUNCTION_SWITCHES "Customizable Switches" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -347,7 +423,6 @@ #define TR_DELAYUP "Delay up" #define TR_SLOWDOWN TR("Slow dn", "Slow down") #define TR_SLOWUP "Slow up" -#define TR_MIXES "MIXES" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -430,19 +505,12 @@ #define TR_MOVESTICKSPOTS "MOVE AXIS/POTS" #else #define TR_MENUTOSTART TR_ENTER " TO START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SET AXIS MIDPOINT", "CENTER AXIS/SLIDERS") - #define TR_MOVESTICKSPOTS "MOVE AXIS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("SET AXIS MIDPOINT", "CENTER AXIS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "MOVE AXIS/POTS") #define TR_MENUWHENDONE TR_ENTER " WHEN DONE" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -472,11 +540,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" -#endif +#define TR_FM TRSA("DM", "FM") #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "Press any key to skip" #define TR_THROTTLE_NOT_IDLE "Throttle not idle" @@ -490,14 +554,10 @@ #define TR_STORAGE_FORMAT "Storage preparation" #define TR_EEPROMOVERFLOW "EEPROM overflow" #define TR_RADIO_SETUP "RADIO SETUP" -#define TR_MENUTRAINER "TRAINER" -#define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "SWITCHES TEST") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST") #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "CALIBRATION" #define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -508,31 +568,15 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELSEL", "MODEL SELECTION") #define TR_MENU_MODEL_SETUP TR("SETUP", "MODEL SETUP") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODES "FLIGHT MODES" -#define TR_MENUFLIGHTMODE "FLIGHT MODE" -#endif -#define TR_MENUHELISETUP "HELI SETUP" - #define TR_MENUINPUTS "INPUTS" - #define TR_MENULIMITS "OUTPUTS" -#define TR_MENUCURVES "CURVES" #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "LOGICAL SWITCH" -#define TR_MENULOGICALSWITCHES "LOGICAL SWITCHES" -#define TR_MENUCUSTOMFUNC "SPECIAL FUNCTIONS" -#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" -#define TR_MONITOR_CHANNELS1 "CHANNELS MONITOR 1-8" -#define TR_MONITOR_CHANNELS2 "CHANNELS MONITOR 9-16" -#define TR_MONITOR_CHANNELS3 "CHANNELS MONITOR 17-24" -#define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25-32" -#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MONITOR_CHANNELS1 "CHANNELS 1-8" +#define TR_MONITOR_CHANNELS2 "CHANNELS 9-16" +#define TR_MONITOR_CHANNELS3 "CHANNELS 17-24" +#define TR_MONITOR_CHANNELS4 "CHANNELS 25-32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") @@ -694,8 +738,6 @@ #define TR_V2 "V2" #define TR_DURATION "Duration" #define TR_DELAY "Delay" -#define TR_SD_CARD "SD CARD" -#define TR_SDHC_CARD "SD-HC CARD" #define TR_NO_SOUNDS_ON_SD "No sounds on SD" #define TR_NO_MODELS_ON_SD "No models on SD" #define TR_NO_BITMAPS_ON_SD "No bitmaps on SD" @@ -714,7 +756,6 @@ #define TR_REMOVED " removed" #define TR_SD_INFO "Information" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formatting..." #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "Time" @@ -770,13 +811,11 @@ #define TR_SD_SECTORS "Sectors:" #define TR_SD_SIZE "Size:" #define TR_TYPE "Type" -#define TR_GLOBAL_VARS "Global variables" #define TR_GVARS "GVARS" #define TR_GLOBAL_VAR "Global variable" -#define TR_MENU_GLOBAL_VARS "GLOBAL VARIABLES" #define TR_OWN "Own" #define TR_DATE "Date" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "CHANNELS MONITOR" @@ -893,7 +932,6 @@ #define TR_RANGE_TEST "Range Test" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_RESET_BTN BUTTON("Reset") -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON("Keys") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES)) @@ -976,7 +1014,6 @@ #define TR_TOUCH_PANEL "Touch panel:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" @@ -1001,7 +1038,7 @@ #define TR_INVERTED "Inverted" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1018,10 +1055,9 @@ #define TR_ALIGNMENT "Alignment" #define TR_ALIGN_LABEL "Align label" #define TR_ALIGN_VALUE "Align value" - #define TR_ALIGN_OPTS { "Left", "Center", "Right" } + #define TR_ALIGN_OPTS "Left", "Center", "Right" #define TR_TEXT "Text" #define TR_COLOR "Color" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "Panel1 background" #define TR_PANEL2_BACKGROUND "Panel2 background" #define TR_WIDGET_GAUGE "Gauge" @@ -1085,11 +1121,9 @@ #define TR_WIDGET_SETTINGS "Widget settings" #define TR_REMOVE_SCREEN "Remove screen" #define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" #define TR_THEME "Theme" #define TR_SETUP "Setup" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Add main view" #define TR_TEXT_COLOR "Text color" #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" #define TR_MENU_LUA STR_CHAR_LUA "Lua scripts" @@ -1157,20 +1191,6 @@ #define TR_CANCEL "Cancel" #define TR_EDIT_THEME "EDIT THEME" #define TR_DETAILS "Details" -#define TR_THEME_EDITOR "THEMES" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModel" -#define TR_MAIN_MENU_MANAGE_MODELS "Manage\nModels" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nSettings" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nSettings" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Screens\nSettings" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "Statistics" -#define TR_MAIN_MENU_ABOUT_EDGETX "About\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" @@ -1227,8 +1247,8 @@ #define TR_SYNC "Sync" #define TR_ENABLED_FEATURES "Enabled Features" -#define TR_RADIO_MENU_TABS "Radio Menu Tabs" -#define TR_MODEL_MENU_TABS "Model Menu Tabs" +#define TR_RADIO_MENU_TABS "Radio Menu" +#define TR_MODEL_MENU_TABS "Model Menu" #define TR_SELECT_MENU_ALL "All" #define TR_SELECT_MENU_CLR "Clear" diff --git a/radio/src/translations/es.h b/radio/src/translations/es.h index 10eb865c2..1bed78ef0 100644 --- a/radio/src/translations/es.h +++ b/radio/src/translations/es.h @@ -39,6 +39,88 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Model Manager" +#define TR_MAIN_MENU_MODEL_NOTES "Model Notes" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel Monitor" +#define TR_MONITOR_SWITCHES "MONITOR INTERRP LÓGICOS" +#define TR_MAIN_MENU_MODEL_SETTINGS "Model Settings" +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio Settings" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistics" +#define TR_MAIN_MENU_ABOUT_EDGETX "About EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "THEMES" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "CONFIGURACIÓN HELI" +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "MODOS DE VUELO") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "MODO DE VUELO") +#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ... + #define TR_MENUINPUTS "STICKS" + #define TR_MENULIMITS "SERVOS" +#else + #define TR_MENUINPUTS "DR/EXPO" + #define TR_MENULIMITS "LÍMITES" +#endif +#define TR_MENUCURVES "CURVAS" +#define TR_MIXES "MIXES" +#define TR_MENU_GLOBAL_VARS "Variables Globales" +#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LÓGICOS", "INTERRUP. LÓGICOS", "INTERRUPTORES LÓGICOS") +#define TR_MENUCUSTOMFUNC TR("FUNCIONES", "FUNCIONES ESPECIALES") +#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" +#define TR_MENUTELEMETRY "TELEMETRÍA" +#define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES" +#define TR_MENUTRAINER "ENTRENADOR" +#define TR_HARDWARE "COMPONENTES" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD CARD" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES") +#define TR_MENUCALIBRATION "CALIBRACIÓN" +#define TR_FUNCTION_SWITCHES "Customizable switches" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minutes" #define TR_MINUTE_PLURAL2 "minutes" @@ -290,7 +372,6 @@ #define TR_WARN_5VOLTS "Aviso: nivel de salida 5 voltios" #define TR_MS "ms" #define TR_SWITCH TR("Interr.", "Interruptor") -#define TR_FUNCTION_SWITCHES "Customizable switches" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -344,7 +425,6 @@ #define TR_DELAYUP "Atraso subir" #define TR_SLOWDOWN "Bajar lento " #define TR_SLOWUP "Subir lento" -#define TR_MIXES "MIXES" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -426,19 +506,12 @@ #define TR_MOVESTICKSPOTS "Mueve sticks, pots and sliders" #else #define TR_MENUTOSTART TR_ENTER " EMPEZAR" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("STICKS AL CENTRO", "STICKS AL CENTRO") - #define TR_MOVESTICKSPOTS "MOVER STICKS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("STICKS AL CENTRO", "STICKS AL CENTRO")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "MOVER STICKS/POTS") #define TR_MENUWHENDONE TR_ENTER " AL ACABAR " #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "SIN DATOS" #define TR_US "us" #define TR_HZ "Hz" @@ -468,10 +541,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELO" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM mem.baja" #define TR_PRESS_ANY_KEY_TO_SKIP "Pulsar tecla para omitir" @@ -486,14 +556,10 @@ #define TR_STORAGE_FORMAT "Preparación alamacenamiento" #define TR_EEPROMOVERFLOW "Desborde EEPROM" #define TR_RADIO_SETUP "CONFIGURACIÓN" -#define TR_MENUTRAINER "ENTRENADOR" -#define TR_MENUSPECIALFUNCS "FUNCIONES GLOBALES" #define TR_MENUVERSION "VERSIÓN" -#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERRUPTORES") #define TR_MENU_RADIO_ANALOGS TR("ANALÓGICOS", "TEST ANALÓGICOS") #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "CALIBRACIÓN" #define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Offsets" @@ -504,38 +570,15 @@ #define TR_CHANNEL2FAILSAFE "Canal=>Failsafe" #define TR_MENUMODELSEL TR("MODELOS", "SELECCIÓN MODELO") #define TR_MENU_MODEL_SETUP TR("SETUP", "MODEL SETUP") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODE "MODO DE VUELO" -#define TR_MENUFLIGHTMODES "MODOS DE VUELO" -#endif -#define TR_MENUHELISETUP "CONFIGURACIÓN HELI" - // Alignment -#if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) // The right menu titles for the gurus ... - #define TR_MENUINPUTS "STICKS" - #define TR_MENULIMITS "SERVOS" -#else - #define TR_MENUINPUTS "DR/EXPO" - #define TR_MENULIMITS "LÍMITES" -#endif - -#define TR_MENUCURVES "CURVAS" #define TR_MENUCURVE "CURVA" #define TR_MENULOGICALSWITCH "INTERRUP.LÓGICO" -#define TR_MENULOGICALSWITCHES TR3("INTERRUP. LÓGICOS", "INTERRUP. LÓGICOS", "INTERRUPTORES LÓGICOS") -#define TR_MENUCUSTOMFUNC TR("FUNCIONES", "FUNCIONES ESPECIALES") -#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRÍA" #define TR_MENUSTAT TR("ESTAD.", "ESTADÍSTICAS") #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR CANALES 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR CANALES 9/16" -#define TR_MONITOR_SWITCHES "MONITOR INTERRP LÓGICOS" #define TR_MONITOR_CHANNELS3 "MONITOR CANALES 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR CANALES 25/32" #define TR_MONITOR_OUTPUT_DESC "SALIDAS" @@ -694,8 +737,6 @@ #define TR_V2 "V2" #define TR_DURATION "Duración" #define TR_DELAY "Atraso" -#define TR_SD_CARD "SD CARD" -#define TR_SDHC_CARD "SD-HC CARD" #define TR_NO_SOUNDS_ON_SD "Sin sonidos en SD" #define TR_NO_MODELS_ON_SD "Sin modelos en SD" #define TR_NO_BITMAPS_ON_SD "Sin imágenes en SD" @@ -714,7 +755,6 @@ #define TR_REMOVED "Borrado" #define TR_SD_INFO "Información" #define TR_NA "N/A" -#define TR_HARDWARE "COMPONENTES" #define TR_FORMATTING "Formateando.." #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "Hora" @@ -769,13 +809,11 @@ #define TR_SD_SECTORS "Sectores:" #define TR_SD_SIZE "Tamaño:" #define TR_TYPE "Tipo" -#define TR_GLOBAL_VARS "Variables globales" #define TR_GVARS "V. GLOBAL" #define TR_GLOBAL_VAR "Variable global" -#define TR_MENU_GLOBAL_VARS "VARIABLES GLOBALES" #define TR_OWN "Propio" #define TR_DATE "Fecha" -#define TR_MONTHS { "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" } +#define TR_MONTHS "Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "MONITOR CANALES" @@ -892,7 +930,6 @@ #define TR_RANGE_TEST "Range test" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "OPCIONES RECEPTOR") #define TR_RESET_BTN "[Reset]" -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches")) @@ -982,7 +1019,6 @@ #define TR_TOUCH_PANEL "Pantalla táctil:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nombre" @@ -1007,7 +1043,7 @@ #define TR_INVERTED "Inverted" -#define TR_LSW_DESCRIPTIONS { "Tipo de comparación o función", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condición adicional para activar línea", "Duración mínima de switch lógico", "Duración mínima TRUE para activar switch lógico" } +#define TR_LSW_DESCRIPTIONS "Tipo de comparación o función", "Primera variable", "Segunda variable o constante", "Segunda variable o constante", "Condición adicional para activar línea", "Duración mínima de switch lógico", "Duración mínima TRUE para activar switch lógico" #if defined(COLORLCD) // Horus layouts and widgets @@ -1024,10 +1060,9 @@ #define TR_ALIGNMENT "Alinear" #define TR_ALIGN_LABEL "Alinear marbete" #define TR_ALIGN_VALUE "Alinear valor" - #define TR_ALIGN_OPTS { "Lzquierdo", "Centro", "Derecho" } + #define TR_ALIGN_OPTS "Lzquierdo", "Centro", "Derecho" #define TR_TEXT "Texto" #define TR_COLOR "Color" - #define TR_MAIN_VIEW_X "Vista principal XX" #define TR_PANEL1_BACKGROUND "Fondo panel1" #define TR_PANEL2_BACKGROUND "Fondo panel2" #define TR_WIDGET_GAUGE "Gauge" @@ -1091,11 +1126,9 @@ #define TR_WIDGET_SETTINGS "Config. widget" #define TR_REMOVE_SCREEN "Borrar pantalla" #define TR_SETUP_WIDGETS "Config. widgets" -#define TR_USER_INTERFACE "Interfaz" #define TR_THEME "Tema" #define TR_SETUP "Configuración" #define TR_LAYOUT "Diseño" -#define TR_ADD_MAIN_VIEW "Añadir vista pral." #define TR_TEXT_COLOR "Color texto" #define TR_MENU_INPUTS STR_CHAR_INPUT "Entradas" @@ -1166,20 +1199,6 @@ #define TR_CANCEL "Cancel" #define TR_EDIT_THEME "EDIT THEME" #define TR_DETAILS "Details" -#define TR_THEME_EDITOR "THEMES" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModel" -#define TR_MAIN_MENU_MANAGE_MODELS "Model\nManager" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nSettings" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nSettings" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Screens\nSettings" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "Statistics" -#define TR_MAIN_MENU_ABOUT_EDGETX "About\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" @@ -1236,8 +1255,8 @@ #define TR_SYNC "Sync" #define TR_ENABLED_FEATURES "Enabled Features" -#define TR_RADIO_MENU_TABS "Radio Menu Tabs" -#define TR_MODEL_MENU_TABS "Model Menu Tabs" +#define TR_RADIO_MENU_TABS "Radio Menu" +#define TR_MODEL_MENU_TABS "Model Menu" #define TR_SELECT_MENU_ALL "All" #define TR_SELECT_MENU_CLR "Clear" diff --git a/radio/src/translations/fi.h b/radio/src/translations/fi.h index 43ceab3e4..2ed9200d3 100644 --- a/radio/src/translations/fi.h +++ b/radio/src/translations/fi.h @@ -40,6 +40,89 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Model Manager" +#define TR_MAIN_MENU_MODEL_NOTES "Model Notes" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel Monitor" +#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" +#define TR_MAIN_MENU_MODEL_SETTINGS "Model Settings" +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio Settings" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Tilastot" +#define TR_MAIN_MENU_ABOUT_EDGETX "About EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "TEEMAT" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "HELI SETUP" +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "FLIGHT MODES") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "FLIGHT MODE") +#if defined(PCBTARANIS) + #define TR_MENUINPUTS "INPUTS" + #define TR_MENULIMITS "SERVOS" +#elif defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) + #define TR_MENUINPUTS "STICKS" + #define TR_MENULIMITS "SERVOS" +#else + #define TR_MENUINPUTS "DR/EXPO" + #define TR_MENULIMITS "LIMITS" +#endif +#define TR_MENUCURVES "CURVES" +#define TR_MIXES "MIXER" +#define TR_MENU_GLOBAL_VARS "Globaalit Muuttujat" +#define TR_MENULOGICALSWITCHES "CUSTOM SWITCHES" +#define TR_MENUCUSTOMFUNC "CUSTOM FUNCTIONS" +#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" +#define TR_MENUTELEMETRY "TELEMETRY" +#define TR_MENUSPECIALFUNCS "GLOBAALIT TOIMINNOT" +#define TR_MENUTRAINER "TRAINER" +#define TR_HARDWARE "HARDWARE" +#define TR_SD_CARD "SD kortti" +#define TR_MENU_RADIO_SWITCHES TR("SWITCHES","SWITCH TEST") +#define TR_MENUCALIBRATION "KALIBROINTI" +#define TR_FUNCTION_SWITCHES "Customizable switches" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minutes" #define TR_MINUTE_PLURAL2 "minutes" @@ -303,7 +386,6 @@ #define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_SWITCH "Switch" -#define TR_FUNCTION_SWITCHES "Customizable switches" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -357,7 +439,6 @@ #define TR_DELAYUP "Delay Up" #define TR_SLOWDOWN "Slow Dn" #define TR_SLOWUP "Slow Up" -#define TR_MIXES "MIXER" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -440,19 +521,12 @@ #define TR_MOVESTICKSPOTS "MOVE AXIS/POTS" #else #define TR_MENUTOSTART TR_ENTER " TO START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SET STICKS MIDPOINT", "CENTER STICKS/SLIDERS") - #define TR_MOVESTICKSPOTS "MOVE STICKS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("SET STICKS MIDPOINT", "CENTER STICKS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "MOVE STICKS/POTS") #define TR_MENUWHENDONE TR_ENTER " WHEN DONE" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -482,10 +556,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "Press any key to skip" @@ -500,14 +571,10 @@ #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "EEPROM overflow" #define TR_RADIO_SETUP "RADIO SETUP" -#define TR_MENUTRAINER "TRAINER" -#define TR_MENUSPECIALFUNCS "GLOBAALIT TOIMINNOT" #define TR_MENUVERSION "VERSIO" -#define TR_MENU_RADIO_SWITCHES TR("SWITCHES","SWITCH TEST") #define TR_MENU_RADIO_ANALOGS TR("ANAS","ANALOG INPUTS") #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "KALIBROINTI" #define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -518,40 +585,15 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELSEL","MODEL SELECTION") #define TR_MENU_MODEL_SETUP TR("SETUP","MODEL SETUP") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODE "FLIGHT MODE" -#define TR_MENUFLIGHTMODES "FLIGHT MODES" -#endif -#define TR_MENUHELISETUP "HELI SETUP" -#if defined(PCBTARANIS) - #define TR_MENUINPUTS "INPUTS" - #define TR_MENULIMITS "SERVOS" -#elif defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_LIMITS_SYMETRICAL) - #define TR_MENUINPUTS "STICKS" - #define TR_MENULIMITS "SERVOS" -#else - #define TR_MENUINPUTS "DR/EXPO" - #define TR_MENULIMITS "LIMITS" -#endif - -#define TR_MENUCURVES "CURVES" #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "CUSTOM SWITCH" -#define TR_MENULOGICALSWITCHES "CUSTOM SWITCHES" -#define TR_MENUCUSTOMFUNC "CUSTOM FUNCTIONS" -#define TR_MENUCUSTOMSCRIPTS "CUSTOM SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRY" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" -#define TR_MONITOR_CHANNELS1 "CHANNELS MONITOR 1/8" -#define TR_MONITOR_CHANNELS2 "CHANNELS MONITOR 9/16" -#define TR_MONITOR_SWITCHES "LOGICAL SWITCHES MONITOR" -#define TR_MONITOR_CHANNELS3 "CHANNELS MONITOR 17/24" -#define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25/32" +#define TR_MONITOR_CHANNELS1 "CHANNELS 1/8" +#define TR_MONITOR_CHANNELS2 "CHANNELS 9/16" +#define TR_MONITOR_CHANNELS3 "CHANNELS 17/24" +#define TR_MONITOR_CHANNELS4 "CHANNELS 25/32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") @@ -708,8 +750,6 @@ #define TR_V2 "V2" #define TR_DURATION "Kesto" #define TR_DELAY "Viive" -#define TR_SD_CARD "SD kortti" -#define TR_SDHC_CARD "SD-HC kortti" #define TR_NO_SOUNDS_ON_SD "Ei ääniä SD:llä" #define TR_NO_MODELS_ON_SD "No Models on SD" #define TR_NO_BITMAPS_ON_SD "Ei bittikarttoja SD:llä" @@ -728,7 +768,6 @@ #define TR_REMOVED "poistettu" #define TR_SD_INFO "Tiedot" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formatting..." #define TR_TEMP_CALIB "Lämpötilan kalibrointi" #define TR_TIME "Aika" @@ -783,13 +822,11 @@ #define TR_SD_SECTORS "Sectors:" #define TR_SD_SIZE "Koko:" #define TR_TYPE "Tyyppi" -#define TR_GLOBAL_VARS "Globaalit muuttujat" #define TR_GVARS "GLOBAALIT M." #define TR_GLOBAL_VAR "Globaali muuttuja" -#define TR_MENU_GLOBAL_VARS "GLOBAALIT MUUTUJAT" #define TR_OWN "Oma" #define TR_DATE "Päivämäärä" -#define TR_MONTHS { "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou" } +#define TR_MONTHS "tam", "hel", "maa", "huh", "tou", "kes", "hei", "elo", "syy", "lok", "mar", "jou" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "CHANNELS MONITOR" @@ -994,7 +1031,6 @@ #define TR_TOUCH_PANEL "Kosketusnäyttö:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" @@ -1019,7 +1055,7 @@ #define TR_INVERTED "Inverted" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1036,10 +1072,9 @@ #define TR_ALIGNMENT "Kohdistus" #define TR_ALIGN_LABEL "Kohdista merkki" #define TR_ALIGN_VALUE "Kohdista arvo" - #define TR_ALIGN_OPTS { "Vasen", "Keski", "Oikea" } + #define TR_ALIGN_OPTS "Vasen", "Keski", "Oikea" #define TR_TEXT "Text" #define TR_COLOR "Color" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "Panel1 background" #define TR_PANEL2_BACKGROUND "Panel2 background" #define TR_WIDGET_GAUGE "Gauge" @@ -1103,11 +1138,10 @@ #define TR_WIDGET_SETTINGS "Widget settings" #define TR_REMOVE_SCREEN "Remove screen" #define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" +#define TR_USER_INTERFACE "Top Bar" #define TR_THEME "Theme" #define TR_SETUP "Setup" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Add main view" #define TR_TEXT_COLOR "Text color" #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" @@ -1180,20 +1214,6 @@ #define TR_CANCEL "Peruuttaa" #define TR_EDIT_THEME "MUOKKAA TEEMAA" #define TR_DETAILS "Yksityiskohdat" -#define TR_THEME_EDITOR "TEEMAT" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModel" -#define TR_MAIN_MENU_MANAGE_MODELS "Model\nManager" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nSettings" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nSettings" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Screens\nSettings" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "Tilastot" -#define TR_MAIN_MENU_ABOUT_EDGETX "About\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" @@ -1251,8 +1271,8 @@ #define TR_SYNC "Sync" #define TR_ENABLED_FEATURES "Enabled Features" -#define TR_RADIO_MENU_TABS "Radio Menu Tabs" -#define TR_MODEL_MENU_TABS "Model Menu Tabs" +#define TR_RADIO_MENU_TABS "Radio Menu" +#define TR_MODEL_MENU_TABS "Model Menu" #define TR_SELECT_MENU_ALL "All" #define TR_SELECT_MENU_CLR "Clear" diff --git a/radio/src/translations/fr.h b/radio/src/translations/fr.h index 78ae15d31..d995e4099 100644 --- a/radio/src/translations/fr.h +++ b/radio/src/translations/fr.h @@ -39,6 +39,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Gestion Modèles" +#define TR_MAIN_MENU_MODEL_NOTES "Notes Modèles" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Moniteur Voies" +#define TR_MONITOR_SWITCHES "INTERS LOGIQUES" +#define TR_MAIN_MENU_MODEL_SETTINGS "Éditer Modèle" +#define TR_MAIN_MENU_RADIO_SETTINGS "Param. Radio" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Stats" +#define TR_MAIN_MENU_ABOUT_EDGETX "A Propos EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "THÈMES" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP TR("CONF.HÉLI", "CONFIGURATION HÉLICO") +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "PHASES DE VOL") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "PHASE DE VOL") +#define TR_MENUINPUTS "ENTRÉES" +#define TR_MENULIMITS "SORTIES" +#define TR_MENUCURVES "COURBES" +#define TR_MIXES "MIXEUR" +#define TR_MENU_GLOBAL_VARS "Variables Globales" +#define TR_MENULOGICALSWITCHES TR("INTERS LOG.", "INTERS LOGIQUES") +#define TR_MENUCUSTOMFUNC TR("FONCTIONS SPEC.", "FONCTIONS SPÉCIALES") +#define TR_MENUCUSTOMSCRIPTS "SCRIPTS PERSOS" +#define TR_MENUTELEMETRY "TELÉMÉTRIE" +#define TR_MENUSPECIALFUNCS "FONCTIONS GLOBALES" +#define TR_MENUTRAINER "ÉCOLAGE" +#define TR_HARDWARE "MATÉRIEL" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "Carte SD" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS") +#define TR_MENUCALIBRATION "CALIBRATION" +#define TR_FUNCTION_SWITCHES "Inters paramétrables" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minutes" #define TR_MINUTE_PLURAL2 "minutes" @@ -298,7 +375,6 @@ #define TR_WARN_5VOLTS "Attention: niveau de sortie 5 volts" #define TR_MS "ms" #define TR_SWITCH TR("Inter", "Interrupteur") -#define TR_FUNCTION_SWITCHES "Inters paramétrables" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -352,7 +428,6 @@ #define TR_DELAYUP "Retard haut" #define TR_SLOWDOWN "Ralenti bas" #define TR_SLOWUP "Ralenti haut" -#define TR_MIXES "MIXEUR" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "VG" @@ -436,19 +511,12 @@ #define TR_MOVESTICKSPOTS "BOUGER STICKS/POTS" #else #define TR_MENUTOSTART TR_ENTER " POUR DÉBUT" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT "REGLER NEUTRES" - #define TR_MOVESTICKSPOTS "BOUGER STICKS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", "REGLER NEUTRES") + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "BOUGER STICKS/POTS") #define TR_MENUWHENDONE TR_ENTER " QUAND PRÊT" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -480,10 +548,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODÈLE" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "PV" +#define TR_FM TRSA("DM", "PV") #endif #define TR_EEPROMLOWMEM "EEPROM pleine!" #define TR_PRESS_ANY_KEY_TO_SKIP "Touche pour ignorer" @@ -498,14 +563,10 @@ #define TR_STORAGE_FORMAT "Préparation stockage" #define TR_EEPROMOVERFLOW "Dépassement EEPROM" #define TR_RADIO_SETUP "CONFIG RADIO" -#define TR_MENUTRAINER "ÉCOLAGE" -#define TR_MENUSPECIALFUNCS "FONCTIONS GLOBALES" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ENTRÉES ANALOGIQUES") #define TR_MENU_RADIO_ANALOGS_CALIB "ANALOG. CALIBRÉS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "CALIBRATION" #define TR_MENU_FSWITCH "INTERS PARAMETRABLES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -516,32 +577,14 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL "MODÈLES" #define TR_MENU_MODEL_SETUP TR("CONF. MODÈLE", "CONFIGURATION") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODE "PHASE DE VOL" -#define TR_MENUFLIGHTMODES "PHASES DE VOL" -#endif -#define TR_MENUHELISETUP TR("CONF.HÉLI", "CONFIGURATION HÉLICO") - - #define TR_MENUINPUTS "ENTRÉES" - #define TR_MENULIMITS "SORTIES" - -#define TR_MENUCURVES "COURBES" #define TR_MENUCURVE "COURBE" #define TR_MENULOGICALSWITCH "INTER LOG." -#define TR_MENULOGICALSWITCHES TR("INTERS LOG.", "INTERS LOGIQUES") -#define TR_MENUCUSTOMFUNC TR("FONCTIONS SPEC.", "FONCTIONS SPÉCIALES") -#define TR_MENUCUSTOMSCRIPTS "SCRIPTS PERSOS" -#define TR_MENUTELEMETRY "TELÉMÉTRIE" #define TR_MENUSTAT TR("STATS", "STATISTIQUES") #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "VOIES 1-8" #define TR_MONITOR_CHANNELS2 "VOIES 9-16" #define TR_MONITOR_CHANNELS3 "VOIES 17-24" #define TR_MONITOR_CHANNELS4 "VOIES 25-32" -#define TR_MONITOR_SWITCHES "INTERS LOGIQUES" #define TR_MONITOR_OUTPUT_DESC "Sorties" #define TR_MONITOR_MIXER_DESC "Mixeurs" #define TR_RECEIVER_NUM TR("NumRx", "No. Récepteur") @@ -697,8 +740,6 @@ #define TR_V2 "V2" #define TR_DURATION "Durée" #define TR_DELAY "Délai" -#define TR_SD_CARD "Carte SD" -#define TR_SDHC_CARD "Carte SD-HC" #define TR_NO_SOUNDS_ON_SD "Aucun son sur SD" #define TR_NO_MODELS_ON_SD "Aucun modèle SD" #define TR_NO_BITMAPS_ON_SD "Aucun Bitmap SD" @@ -717,7 +758,6 @@ #define TR_REMOVED " supprimé" #define TR_SD_INFO "Information" #define TR_NA "N/D" -#define TR_HARDWARE "MATÉRIEL" #define TR_FORMATTING "Formatage..." #define TR_TEMP_CALIB "Calib. temp" #define TR_TIME "Heure" @@ -772,13 +812,11 @@ #define TR_SD_SECTORS "Secteurs:" #define TR_SD_SIZE "Taille:" #define TR_TYPE "Type" -#define TR_GLOBAL_VARS "Variables Globales" #define TR_GVARS "V. GLOBALES" #define TR_GLOBAL_VAR "Variable globale" -#define TR_MENU_GLOBAL_VARS "VARIABLES GLOBALES" #define TR_OWN "Perso" #define TR_DATE "Date" -#define TR_MONTHS { "Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Fév", "Mar", "Avr", "Mai", "Jun", "Jul", "Aou", "Sep", "Oct", "Nov", "Dec" #define TR_ROTARY_ENCODER "Enc.Rot." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Mode Encod. Rotatif") #define TR_CHANNELS_MONITOR "MONITEUR CANAUX" @@ -895,7 +933,6 @@ #define TR_RANGE_TEST "Test de portée" #define TR_RECEIVER_OPTIONS TR("OPTIONS REC.", "OPTIONS RÉCEPTEUR") #define TR_RESET_BTN BUTTON("RAZ") -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Btns","Inters")) #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES)) @@ -991,7 +1028,6 @@ #define TR_TOUCH_PANEL "Écran Tactile:" #define TR_FILE_SIZE "Taille fichier" #define TR_FILE_OPEN "Ouvrir quand même?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nom" @@ -1016,7 +1052,7 @@ #define TR_INVERTED "Inversé" -#define TR_LSW_DESCRIPTIONS { "Type de comparaison ou fonction", "Première variable", "Seconde variable ou constante", "Seconde variable ou constante", "Condition supplémentaire pour activer la ligne", "Durée minimale d'activation de l'inter logique", "Durée min de la condition avant l'activation de l'inter" } +#define TR_LSW_DESCRIPTIONS "Type de comparaison ou fonction", "Première variable", "Seconde variable ou constante", "Seconde variable ou constante", "Condition supplémentaire pour activer la ligne", "Durée minimale d'activation de l'inter logique", "Durée min de la condition avant l'activation de l'inter" #if defined(COLORLCD) // Horus layouts and widgets @@ -1033,10 +1069,9 @@ #define TR_ALIGNMENT "Alignement" #define TR_ALIGN_LABEL "Aligner Catégorie" #define TR_ALIGN_VALUE "Aligner Valeur" - #define TR_ALIGN_OPTS { "Gauche", "Centre", "Droite" } + #define TR_ALIGN_OPTS "Gauche", "Centre", "Droite" #define TR_TEXT "Texte" #define TR_COLOR "Couleur" - #define TR_MAIN_VIEW_X "Vue Principale XX" #define TR_PANEL1_BACKGROUND "Arrière-plan Ecran1" #define TR_PANEL2_BACKGROUND "Arrière-plan Ecran2" #define TR_WIDGET_GAUGE "Jauge" @@ -1100,11 +1135,9 @@ #define TR_WIDGET_SETTINGS "Réglages widget" #define TR_REMOVE_SCREEN "Supprimer écran" #define TR_SETUP_WIDGETS "Configurer widgets" -#define TR_USER_INTERFACE "Interface utilisateur" #define TR_THEME "Thème" #define TR_SETUP "Configuration" #define TR_LAYOUT "Disposition" -#define TR_ADD_MAIN_VIEW "Ajout. vue principale" #define TR_TEXT_COLOR "Couleur Texte" #define TR_MENU_INPUTS STR_CHAR_INPUT "Entrées" @@ -1178,20 +1211,6 @@ #define TR_CANCEL "Annuler" #define TR_EDIT_THEME "ÉDITER THÈME" #define TR_DETAILS "Détails" -#define TR_THEME_EDITOR "THÈMES" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModèle" -#define TR_MAIN_MENU_MANAGE_MODELS "Gestion\nModèles" -#define TR_MAIN_MENU_MODEL_NOTES "Notes\nModèles" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Moniteur\nVoies" -#define TR_MAIN_MENU_MODEL_SETTINGS "Éditer\nModèle" -#define TR_MAIN_MENU_RADIO_SETTINGS "Param.\nRadio" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Gestion\nÉcrans" -#define TR_MAIN_MENU_RESET_TELEMETRY "RAZ\nTélémetrie" -#define TR_MAIN_MENU_STATISTICS "Stats" -#define TR_MAIN_MENU_ABOUT_EDGETX "A Propos\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" diff --git a/radio/src/translations/he.h b/radio/src/translations/he.h index 01ae116e8..5b3d83366 100644 --- a/radio/src/translations/he.h +++ b/radio/src/translations/he.h @@ -40,6 +40,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "ניהול מודלים" +#define TR_MAIN_MENU_MODEL_NOTES "Model Notes" +#define TR_MAIN_MENU_CHANNEL_MONITOR "מצגי ערוצים" +#define TR_MONITOR_SWITCHES "מסך מתגים לוגים" +#define TR_MAIN_MENU_MODEL_SETTINGS "הגדרות מודל" +#define TR_MAIN_MENU_RADIO_SETTINGS "הגדרות שלט" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "סטטיסטיקות" +#define TR_MAIN_MENU_ABOUT_EDGETX "מידע על EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "ערכות נושא" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "הגדרות מסוק" +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "מצבי טיסה") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "מצב טיסה") +#define TR_MENUINPUTS "כניסות" +#define TR_MENULIMITS "יציאות" +#define TR_MENUCURVES "עקומות" +#define TR_MIXES "מיקסים" +#define TR_MENU_GLOBAL_VARS "משתנים גלובלים" +#define TR_MENULOGICALSWITCHES "מתגים לוגים" +#define TR_MENUCUSTOMFUNC "אופציות מיוחדות למודל" +#define TR_MENUCUSTOMSCRIPTS "סקריפטים מיוחדים" +#define TR_MENUTELEMETRY "טלמטריה" +#define TR_MENUSPECIALFUNCS "פונקציות לכל המודלים והשלט" +#define TR_MENUTRAINER "טריינר" +#define TR_HARDWARE "הגדרות חומרה" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD כרטיס" +#define TR_DEBUG "איבחון" +#define TR_MENU_RADIO_SWITCHES TR("בדיקת מתגים וכפתורים", "SWITCHES") +#define TR_MENUCALIBRATION "כיול" +#define TR_FUNCTION_SWITCHES "מפסקים בהתאמה אישית" +// End Main menu + #define TR_MINUTE_SINGULAR "דקה" #define TR_MINUTE_PLURAL1 "דקות" #define TR_MINUTE_PLURAL2 "דקות" @@ -297,7 +374,6 @@ #define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_SWITCH "מתג" -#define TR_FUNCTION_SWITCHES "מפסקים בהתאמה אישית" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -351,7 +427,6 @@ #define TR_DELAYUP "עיקוב בעלייה" #define TR_SLOWDOWN TR("Slow dn", "האט ירידה") #define TR_SLOWUP "האט עלייה" -#define TR_MIXES "מיקסים" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -434,19 +509,12 @@ #define TR_MOVESTICKSPOTS "MOVE STICKS/POTS" #else #define TR_MENUTOSTART TR_ENTER " TO START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SET STICKS MIDPOINT", "CENTER STICKS/SLIDERS") - #define TR_MOVESTICKSPOTS "MOVE STICKS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("SET STICKS MIDPOINT", "CENTER STICKS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "MOVE STICKS/POTS") #define TR_MENUWHENDONE TR_ENTER " WHEN DONE" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -476,10 +544,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "ערוץ " #define TR_MODEL "מודל" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "לחץ על המסך או על כפתור" @@ -494,14 +559,10 @@ #define TR_STORAGE_FORMAT "Storage preparation" #define TR_EEPROMOVERFLOW "EEPROM overflow" #define TR_RADIO_SETUP "הגדרות שלט ותצוגה" -#define TR_MENUTRAINER "טריינר" -#define TR_MENUSPECIALFUNCS "פונקציות לכל המודלים והשלט" #define TR_MENUVERSION "גירסא" -#define TR_MENU_RADIO_SWITCHES TR("בדיקת מתגים וכפתורים", "SWITCHES") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "בדיקת אנלוגיות") #define TR_MENU_RADIO_ANALOGS_CALIB "בדיקת אנלוגיות סטיקים ומגע" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "כיול" #define TR_MENU_FSWITCH "מפסקים בהתאמה אישית" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -512,31 +573,14 @@ #define TR_CHANNEL2FAILSAFE "הגדר מצב נוכחי כקבוע" #define TR_MENUMODELSEL TR("MODELSEL", "MODEL SELECTION") #define TR_MENU_MODEL_SETUP TR("הגדרות מודל", "הגדרות מודל") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODES "מצבי טיסה" -#define TR_MENUFLIGHTMODE "מצב טיסה" -#endif -#define TR_MENUHELISETUP "הגדרות מסוק" - - #define TR_MENUINPUTS "כניסות" - #define TR_MENULIMITS "יציאות" -#define TR_MENUCURVES "עקומות" #define TR_MENUCURVE "עקומה" #define TR_MENULOGICALSWITCH "מתג לוגי" -#define TR_MENULOGICALSWITCHES "מתגים לוגים" -#define TR_MENUCUSTOMFUNC "אופציות מיוחדות למודל" -#define TR_MENUCUSTOMSCRIPTS "סקריפטים מיוחדים" -#define TR_MENUTELEMETRY "טלמטריה" #define TR_MENUSTAT "סטטוס" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "מצגי ערוצים 8-1" #define TR_MONITOR_CHANNELS2 "מצגי ערוצים 16-9" #define TR_MONITOR_CHANNELS3 "מצגי ערוצים 24-17" #define TR_MONITOR_CHANNELS4 "מצגי ערוצים 32-25" -#define TR_MONITOR_SWITCHES "מסך מתגים לוגים" #define TR_MONITOR_OUTPUT_DESC "יציאות" #define TR_MONITOR_MIXER_DESC "מיקסרים" #define TR_RECEIVER_NUM TR("RxNum", "Receiver No.") @@ -698,8 +742,6 @@ #define TR_V2 "V2" #define TR_DURATION "Duration" #define TR_DELAY "דיליי" -#define TR_SD_CARD "SD כרטיס" -#define TR_SDHC_CARD "SD תיקיות כרטיס" #define TR_NO_SOUNDS_ON_SD "SD אין צלילים על" #define TR_NO_MODELS_ON_SD "SD אין מודלים על" #define TR_NO_BITMAPS_ON_SD "No bitmaps on SD" @@ -718,7 +760,6 @@ #define TR_REMOVED " הוסר" #define TR_SD_INFO "מידע" #define TR_NA "N/A" -#define TR_HARDWARE "הגדרות חומרה" #define TR_FORMATTING "...מפרמט" #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "זמן" @@ -774,13 +815,11 @@ #define TR_SD_SECTORS ":סקטורים" #define TR_SD_SIZE ":גודל" #define TR_TYPE "סוג" -#define TR_GLOBAL_VARS "משתנים גלובלים" #define TR_GVARS "GVARS" #define TR_GLOBAL_VAR "משתנה גלובלי" -#define TR_MENU_GLOBAL_VARS "משתנים גלובלים" #define TR_OWN "בעלים" #define TR_DATE "תאריך" -#define TR_MONTHS { "ינו", "פבו", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ" } +#define TR_MONTHS "ינו", "פבו", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "מצגי ערוצים" @@ -897,7 +936,6 @@ #define TR_RANGE_TEST "בדיקת טווח" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_RESET_BTN BUTTON("איפוס") -#define TR_DEBUG "איבחון" #define TR_KEYS_BTN BUTTON("בדיקת מתגים") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "בדיקת אנלוגיות")) #define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES)) @@ -980,7 +1018,6 @@ #define TR_TOUCH_PANEL "מסך מגע:" #define TR_FILE_SIZE "גודל קובץ" #define TR_FILE_OPEN "? לפתוח בכל זאת" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "שם" @@ -1005,7 +1042,7 @@ #define TR_INVERTED "היפוך" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1022,10 +1059,9 @@ #define TR_ALIGNMENT "יישור" #define TR_ALIGN_LABEL "Align label" #define TR_ALIGN_VALUE "Align value" - #define TR_ALIGN_OPTS { "שמאל", "מרכז", "ימין" } + #define TR_ALIGN_OPTS "שמאל", "מרכז", "ימין" #define TR_TEXT "טקסט" #define TR_COLOR "צבע" - #define TR_MAIN_VIEW_X "מסך תצוגה XX" #define TR_PANEL1_BACKGROUND "Panel1 background" #define TR_PANEL2_BACKGROUND "Panel2 background" #define TR_WIDGET_GAUGE "מקור" @@ -1089,11 +1125,9 @@ #define TR_WIDGET_SETTINGS "הגדרות וידג'ט" #define TR_REMOVE_SCREEN "הסרת מסך" #define TR_SETUP_WIDGETS "הגדרות וידג'טים" -#define TR_USER_INTERFACE "ממשק משתמש" #define TR_THEME "ערכת נושא" #define TR_SETUP "להגדיר" #define TR_LAYOUT "תצוגת מסך" -#define TR_ADD_MAIN_VIEW "הוסף מסך תצוגה נוסף" #define TR_TEXT_COLOR "צבע טקסט" #define TR_MENU_INPUTS STR_CHAR_INPUT "כניסות" #define TR_MENU_LUA STR_CHAR_LUA "Lua סקריפטים" @@ -1161,20 +1195,6 @@ #define TR_CANCEL "ביטול" #define TR_EDIT_THEME "עריכת ערכת נושא" #define TR_DETAILS "פרטים" -#define TR_THEME_EDITOR "ערכות נושא" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "מודל\nבחירת" -#define TR_MAIN_MENU_MANAGE_MODELS "ניהול\nמודלים" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "מצגי\nערוצים" -#define TR_MAIN_MENU_MODEL_SETTINGS "הגדרות\nמודל" -#define TR_MAIN_MENU_RADIO_SETTINGS "הגדרות\nשלט" -#define TR_MAIN_MENU_SCREEN_SETTINGS "הגדרות\nמסכים" -#define TR_MAIN_MENU_RESET_TELEMETRY "איפוס\nשעונים" -#define TR_MAIN_MENU_STATISTICS "סטטיסטיקות" -#define TR_MAIN_MENU_ABOUT_EDGETX "מידע על\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" diff --git a/radio/src/translations/it.h b/radio/src/translations/it.h index e545d110e..c4fc640e1 100644 --- a/radio/src/translations/it.h +++ b/radio/src/translations/it.h @@ -37,6 +37,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Gestione Modelli" +#define TR_MAIN_MENU_MODEL_NOTES "Note Modello" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor Canali" +#define TR_MONITOR_SWITCHES "MONITOR INTERRUTTORI LOGICI" +#define TR_MAIN_MENU_MODEL_SETTINGS "Settaggi Modello" +#define TR_MAIN_MENU_RADIO_SETTINGS "Settaggi Radio" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistiche" +#define TR_MAIN_MENU_ABOUT_EDGETX "Riguardo EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "TEMI" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "CONFIGURA ELI" +#define TR_MENUFLIGHTMODES TRSA("MODI DI PILOTAGGIO", "FASI DI VOLO") +#define TR_MENUFLIGHTMODE TRSA("MODO DI PILOTAGGIO", "FASE DI VOLO") +#define TR_MENUINPUTS "INGRESSI" +#define TR_MENULIMITS "USCITE" +#define TR_MENUCURVES "CURVE" +#define TR_MIXES "MIXES" +#define TR_MENU_GLOBAL_VARS "Variabili Globali" +#define TR_MENULOGICALSWITCHES TR("INTER. LOGICI", "INTERRUTTORI LOGICI") +#define TR_MENUCUSTOMFUNC TR("FUNZ. SPECIALI", "FUNZIONI SPECIALI") +#define TR_MENUCUSTOMSCRIPTS "SCRIPTS UTENTE" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUSPECIALFUNCS "FUNZIONI GLOBALI" +#define TR_MENUTRAINER "MAESTRO/ALLIEVO" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD Card" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES "DIAG" +#define TR_MENUCALIBRATION "CALIBRAZIONE" +#define TR_FUNCTION_SWITCHES "Interruttori personalizzabili" +// End Main menu + #define TR_MINUTE_SINGULAR "minuto" #define TR_MINUTE_PLURAL1 "minuti" #define TR_MINUTE_PLURAL2 "minuti" @@ -293,7 +370,6 @@ #define TR_WARN_5VOLTS "Attenzione: il livello d'uscita è 5 Volts" #define TR_MS "ms" #define TR_SWITCH "Inter." -#define TR_FUNCTION_SWITCHES "Interruttori personalizzabili" #define TR_FS_COLOR_LIST "Custom","Off","Bianco","Rosso","Verde","Giallo","Arancio","Blue","Rosa" #define TR_GROUP "Gruppo" #define TR_GROUP_ALWAYS_ON "Sempre on" @@ -347,7 +423,6 @@ #define TR_DELAYUP "Post.Su" #define TR_SLOWDOWN "Rall.Giù " #define TR_SLOWUP "Rall.Su" -#define TR_MIXES "MIXES" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -430,19 +505,12 @@ #define TR_MOVESTICKSPOTS "MUOVI STICKS/POTS" #else #define TR_MENUTOSTART TR_ENTER "PER START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT TR("CENTRA STICKS A META'", "CENTRA STICKS/SLIDERS") - #define TR_MOVESTICKSPOTS "MUOVI STICK/POT" -#else - #define TR_SETMIDPOINT TR("SETTA ASSI AL CENTRO", "CENTRA ASSI/SLIDERS") - #define TR_MOVESTICKSPOTS "MUOVI ASSI/POTS" -#endif + #define TR_SETMIDPOINT TRSA(TR("CENTRA STICKS A META'", "CENTRA STICKS/SLIDERS"), TR("SETTA ASSI AL CENTRO", "CENTRA ASSI/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MUOVI STICK/POT", "MUOVI ASSI/POTS") #define TR_MENUWHENDONE TR_ENTER " PER FINIRE" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "DATI ASSENTI" #define TR_US "us" #define TR_HZ "Hz" @@ -472,10 +540,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODELLO" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FV" +#define TR_FM TRSA("DM", "FV") #endif #define TR_EEPROMLOWMEM "EEPROM quasi piena!" #define TR_PRESS_ANY_KEY_TO_SKIP "\010Premi un tasto" @@ -490,14 +555,10 @@ #define TR_STORAGE_FORMAT "Preparazione storage" #define TR_EEPROMOVERFLOW "EEPROM Piena" #define TR_RADIO_SETUP "CONFIGURA TX" -#define TR_MENUTRAINER "MAESTRO/ALLIEVO" -#define TR_MENUSPECIALFUNCS "FUNZIONI GLOBALI" #define TR_MENUVERSION "VERSIONE" -#define TR_MENU_RADIO_SWITCHES "DIAG" #define TR_MENU_RADIO_ANALOGS "ANAS" #define TR_MENU_RADIO_ANALOGS_CALIB "ANALOGICI CALIBRATI" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "ANALOGICI RAW (5 Hz)" -#define TR_MENUCALIBRATION "CALIBRAZIONE" #define TR_MENU_FSWITCH "INTERRUTTORI PERSONALIZZABILI" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -508,29 +569,12 @@ #define TR_CHANNEL2FAILSAFE "Canale => Failsafe" #define TR_MENUMODELSEL TR("MODELSEL", "SELEEZIONE MODELLO") #define TR_MENU_MODEL_SETUP TR("SETTA", "SETTA MODELLO") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "MODI DI PILOTAGGIO" -#define TR_MENUFLIGHTMODE "MODO DI PILOTAGGIO" -#else -#define TR_MENUFLIGHTMODES "FASI DI VOLO" -#define TR_MENUFLIGHTMODE "FASE DI VOLO" -#endif -#define TR_MENUHELISETUP "CONFIGURA ELI" - -#define TR_MENUINPUTS "INGRESSI" -#define TR_MENULIMITS "USCITE" -#define TR_MENUCURVES "CURVE" #define TR_MENUCURVE "CURVA" #define TR_MENULOGICALSWITCH "INTER. PERSON." -#define TR_MENULOGICALSWITCHES TR("INTER. LOGICI", "INTERRUTTORI LOGICI") -#define TR_MENUCUSTOMFUNC TR("FUNZ. SPECIALI", "FUNZIONI SPECIALI") -#define TR_MENUCUSTOMSCRIPTS "SCRIPTS UTENTE" -#define TR_MENUTELEMETRY "TELEMETRIA" #define TR_MENUSTAT "STATO" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR CANALI 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR CANALI 9/16" -#define TR_MONITOR_SWITCHES "MONITOR INTERRUTTORI LOGICI" #define TR_MONITOR_CHANNELS3 "MONITOR CANALI 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR CANALI 25/32" #define TR_MONITOR_OUTPUT_DESC "Uscite" @@ -694,8 +738,6 @@ #define TR_V2 "V2" #define TR_DURATION "Durata" #define TR_DELAY "Ritardo" -#define TR_SD_CARD "SD Card" -#define TR_SDHC_CARD "SD-HC Card" #define TR_NO_SOUNDS_ON_SD "No Suoni su SD" #define TR_NO_MODELS_ON_SD "No Model. su SD" #define TR_NO_BITMAPS_ON_SD "No Immag. su SD" @@ -714,7 +756,6 @@ #define TR_REMOVED " rimosso" #define TR_SD_INFO "Informazioni" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formattazione" #define TR_TEMP_CALIB "Temp. Calib." #define TR_TIME "Ora" @@ -770,13 +811,11 @@ #define TR_SD_SECTORS "Settori:" #define TR_SD_SIZE "Dimens:" #define TR_TYPE "Tipo" -#define TR_GLOBAL_VARS "Variabili Globali" #define TR_GVARS "V.GLOBALI" #define TR_GLOBAL_VAR "Variabile globale" -#define TR_MENU_GLOBAL_VARS "VARIABILI GLOBALI" #define TR_OWN "Fase" #define TR_DATE "Data" -#define TR_MONTHS { "Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic" } +#define TR_MONTHS "Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("Modo RotEnc","Modo Rotary Encoder") #define TR_CHANNELS_MONITOR "MONITOR CANALI" @@ -893,7 +932,6 @@ #define TR_RANGE_TEST "Test del link radio a bassa potenza" #define TR_RECEIVER_OPTIONS TR("OPZIONI RX", "OPZIONI RICEVENTE") #define TR_RESET_BTN "[Reset]" -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW", "Tasti")) #define TR_ANALOGS_BTN BUTTON("Analogici") #define TR_FS_BTN BUTTON(TR("Int. pers.", TR_FUNCTION_SWITCHES)) @@ -976,7 +1014,6 @@ #define TR_TOUCH_PANEL "Schermo touch:" #define TR_FILE_SIZE "Dimensione file" #define TR_FILE_OPEN "Apro comunque?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nome" @@ -1001,7 +1038,7 @@ #define TR_INVERTED "Invertito" -#define TR_LSW_DESCRIPTIONS { "Confronta tipo o funzione", "Prima variabile", "Seconda variabile o costante", "Seconda variabile o costante", "Condizione aggiuntiva per abilitare linea", "Durata minima ON dell'interruttore logico", "Durata minima REALE per abilitare l'interruttore" } +#define TR_LSW_DESCRIPTIONS "Confronta tipo o funzione", "Prima variabile", "Seconda variabile o costante", "Seconda variabile o costante", "Condizione aggiuntiva per abilitare linea", "Durata minima ON dell'interruttore logico", "Durata minima REALE per abilitare l'interruttore" #if defined(COLORLCD) // Horus layouts and widgets @@ -1018,10 +1055,9 @@ #define TR_ALIGNMENT "Allineamento" #define TR_ALIGN_LABEL "Allinea etichetta" #define TR_ALIGN_VALUE "Allinea il valore" - #define TR_ALIGN_OPTS { "Sinistra", "Centro", "Destra" } + #define TR_ALIGN_OPTS "Sinistra", "Centro", "Destra" #define TR_TEXT "Testo" #define TR_COLOR "Colore" - #define TR_MAIN_VIEW_X "Vista principale XX" #define TR_PANEL1_BACKGROUND "Sfondo Panello 1" #define TR_PANEL2_BACKGROUND "Sfondo Panello 2" #define TR_WIDGET_GAUGE "Indicatore" @@ -1085,11 +1121,9 @@ #define TR_WIDGET_SETTINGS "Settaggio widget" #define TR_REMOVE_SCREEN "Rimuovi schermo" #define TR_SETUP_WIDGETS "Setta widgets" -#define TR_USER_INTERFACE "Interfaccia utente" #define TR_THEME "Tema" #define TR_SETUP "Imposta" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Aggiungi vista princ." #define TR_TEXT_COLOR "Colore testo" #define TR_MENU_INPUTS STR_CHAR_INPUT "Ingressi" #define TR_MENU_LUA STR_CHAR_LUA "Lua scripts" @@ -1157,20 +1191,6 @@ #define TR_CANCEL "Elimina" #define TR_EDIT_THEME "EDITA TEMA" #define TR_DETAILS "Dettagli" -#define TR_THEME_EDITOR "TEMI" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Seleziona\nModello" -#define TR_MAIN_MENU_MANAGE_MODELS "Gestione\nModelli" -#define TR_MAIN_MENU_MODEL_NOTES "Note\nModello" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor\nCanali" -#define TR_MAIN_MENU_MODEL_SETTINGS "Settaggi\nModello" -#define TR_MAIN_MENU_RADIO_SETTINGS "Settaggi\nRadio" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Settaggi\nSchermo" -#define TR_MAIN_MENU_RESET_TELEMETRY "Resetta\nTelemetria" -#define TR_MAIN_MENU_STATISTICS "Statistiche" -#define TR_MAIN_MENU_ABOUT_EDGETX "Riguardo\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Inglese" diff --git a/radio/src/translations/jp.h b/radio/src/translations/jp.h index 4ac9aa360..0479d1a41 100644 --- a/radio/src/translations/jp.h +++ b/radio/src/translations/jp.h @@ -37,6 +37,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "モデル 管理" +#define TR_MAIN_MENU_MODEL_NOTES "モデル ノート" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel モニター" +#define TR_MONITOR_SWITCHES "論理スイッチモニター" +#define TR_MAIN_MENU_MODEL_SETTINGS "モデル 設定" +#define TR_MAIN_MENU_RADIO_SETTINGS "送信機 設定" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "統計情報" +#define TR_MAIN_MENU_ABOUT_EDGETX "EdgeTX について" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "テーマ" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "ヘリ セットアップ" +#define TR_MENUFLIGHTMODES TRSA("ドライブモード", "飛行モード") +#define TR_MENUFLIGHTMODE TRSA("ドライブモード", "飛行モード") +#define TR_MENUINPUTS "入力" +#define TR_MENULIMITS "出力" +#define TR_MENUCURVES "カーブ" +#define TR_MIXES "ミキサー" +#define TR_MENU_GLOBAL_VARS "グローバル変数" +#define TR_MENULOGICALSWITCHES "論理スイッチ" +#define TR_MENUCUSTOMFUNC "スペシャルファンクション" +#define TR_MENUCUSTOMSCRIPTS "カスタムスクリプト" +#define TR_MENUTELEMETRY "テレメトリー" +#define TR_MENUSPECIALFUNCS "グローバルファンクション" +#define TR_MENUTRAINER "トレーナー" +#define TR_HARDWARE "ハードウェア" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SDカード" +#define TR_DEBUG "デバッグ" +#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "スイッチテスト") +#define TR_MENUCALIBRATION "キャリブレーション" +#define TR_FUNCTION_SWITCHES "カスタマイズ スイッチ" +// End Main menu + #define TR_MINUTE_SINGULAR "分" #define TR_MINUTE_PLURAL1 "分間" #define TR_MINUTE_PLURAL2 "分間" @@ -292,7 +369,6 @@ #define TR_WARN_5VOLTS "警告: 出力レベル 5V" #define TR_MS "ms" #define TR_SWITCH "スイッチ" -#define TR_FUNCTION_SWITCHES "カスタマイズ スイッチ" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -346,7 +422,6 @@ #define TR_DELAYUP "遅延アップ" #define TR_SLOWDOWN TR("Slow dn", "スローダウン") #define TR_SLOWUP "スローアップ" -#define TR_MIXES "ミキサー" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -429,19 +504,12 @@ #define TR_MOVESTICKSPOTS "スティック/スライダーを動かします" #else #define TR_MENUTOSTART TR_ENTER " TO START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SET AXIS MIDPOINT", "CENTER AXIS/SLIDERS") - #define TR_MOVESTICKSPOTS "MOVE AXIS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("SET AXIS MIDPOINT", "CENTER AXIS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "MOVE AXIS/POTS") #define TR_MENUWHENDONE TR_ENTER " WHEN DONE" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -471,10 +539,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "モデル名" -#if defined(SURFACE_RADIO) - #define TR_FM "DM" -#else - #define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROMメモリ低" #define TR_PRESS_ANY_KEY_TO_SKIP "任意のキーを押してスキップします" @@ -489,14 +554,10 @@ #define TR_STORAGE_FORMAT "ストレージをフォーマットします" #define TR_EEPROMOVERFLOW "EEPROMがオーバーフローしています" #define TR_RADIO_SETUP "送信機セットアップ" -#define TR_MENUTRAINER "トレーナー" -#define TR_MENUSPECIALFUNCS "グローバルファンクション" #define TR_MENUVERSION "バージョン" -#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "スイッチテスト") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "アナログ入力テスト") #define TR_MENU_RADIO_ANALOGS_CALIB "アナログ キャリブレーション" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW アナログ (5 Hz)" -#define TR_MENUCALIBRATION "キャリブレーション" #define TR_MENU_FSWITCH "カスタマイズ スイッチ" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "トリム => サブトリム" @@ -507,31 +568,14 @@ #define TR_CHANNEL2FAILSAFE "チャンネル=>Failsafe" #define TR_MENUMODELSEL TR("MODELSEL", "モデル選択") #define TR_MENU_MODEL_SETUP TR("SETUP", "モデル設定") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "ドライブモード" - #define TR_MENUFLIGHTMODE "ドライブモード" -#else - #define TR_MENUFLIGHTMODES "飛行モード" - #define TR_MENUFLIGHTMODE "飛行モード" -#endif -#define TR_MENUHELISETUP "ヘリ セットアップ" - -#define TR_MENUINPUTS "入力" -#define TR_MENULIMITS "出力" -#define TR_MENUCURVES "カーブ" #define TR_MENUCURVE "カーブ" #define TR_MENULOGICALSWITCH "論理スイッチ" -#define TR_MENULOGICALSWITCHES "論理スイッチ" -#define TR_MENUCUSTOMFUNC "スペシャルファンクション" -#define TR_MENUCUSTOMSCRIPTS "カスタムスクリプト" -#define TR_MENUTELEMETRY "テレメトリー" #define TR_MENUSTAT "統計" #define TR_MENUDEBUG "デバッグ" #define TR_MONITOR_CHANNELS1 "チャンネルモニター 1-8" #define TR_MONITOR_CHANNELS2 "チャンネルモニター 9-16" #define TR_MONITOR_CHANNELS3 "チャンネルモニター 17-24" #define TR_MONITOR_CHANNELS4 "チャンネルモニター 25-32" -#define TR_MONITOR_SWITCHES "論理スイッチモニター" #define TR_MONITOR_OUTPUT_DESC "出力" #define TR_MONITOR_MIXER_DESC "ミキサー" #define TR_RECEIVER_NUM TR("RxNum", "受信機 No.") @@ -693,8 +737,6 @@ #define TR_V2 "V2" #define TR_DURATION "持続時間" #define TR_DELAY "遅延" -#define TR_SD_CARD "SDカード" -#define TR_SDHC_CARD "SD-HCカード" #define TR_NO_SOUNDS_ON_SD "SDカード内に音声データがありません" #define TR_NO_MODELS_ON_SD "SDカード内にモデル情報がありません" #define TR_NO_BITMAPS_ON_SD "SDカード内に画像データがありません" @@ -713,7 +755,6 @@ #define TR_REMOVED "移動" #define TR_SD_INFO "インフォメーション" #define TR_NA "該当なし" -#define TR_HARDWARE "ハードウェア" #define TR_FORMATTING "フォーマット中..." #define TR_TEMP_CALIB "Temp.キャリブ" #define TR_TIME "時間" @@ -769,13 +810,11 @@ #define TR_SD_SECTORS "セクタ:" #define TR_SD_SIZE "サイズ:" #define TR_TYPE "タイプ" -#define TR_GLOBAL_VARS "グローバル変数" #define TR_GVARS "G変数" #define TR_GLOBAL_VAR "グローバル変数" -#define TR_MENU_GLOBAL_VARS "グローバル変数" #define TR_OWN "Own" #define TR_DATE "日付" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE "選択操作リバース" #define TR_CHANNELS_MONITOR "チャンネルモニター" @@ -892,7 +931,6 @@ #define TR_RANGE_TEST "受信強度テスト" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "受信機オプション") #define TR_RESET_BTN BUTTON("リセット") -#define TR_DEBUG "デバッグ" #define TR_KEYS_BTN BUTTON("キー") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "アナログ")) #define TR_FS_BTN BUTTON(TR("Custom sw", "カスタマイズ スイッチ")) @@ -975,7 +1013,6 @@ #define TR_TOUCH_PANEL "タッチパネル:" #define TR_FILE_SIZE "ファイルサイズ" #define TR_FILE_OPEN "ファイルを開きますか?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "名称" @@ -1000,7 +1037,7 @@ #define TR_INVERTED "リバース" -#define TR_LSW_DESCRIPTIONS { "比較タイプまたは機能", "第1変数", "第2変数または定数", "第2変数または定数", "回線が有効となる追加条件", "論理スイッチの最小ON時間", "スイッチONになるまでの最小TRUE時間" } +#define TR_LSW_DESCRIPTIONS "比較タイプまたは機能", "第1変数", "第2変数または定数", "第2変数または定数", "回線が有効となる追加条件", "論理スイッチの最小ON時間", "スイッチONになるまでの最小TRUE時間" #if defined(COLORLCD) // Horus layouts and widgets @@ -1017,10 +1054,9 @@ #define TR_ALIGNMENT "アライメント" #define TR_ALIGN_LABEL "ラベルを揃える" #define TR_ALIGN_VALUE "値を揃える" - #define TR_ALIGN_OPTS { "左", "中央", "右" } + #define TR_ALIGN_OPTS "左", "中央", "右" #define TR_TEXT "テキスト" #define TR_COLOR "カラー" - #define TR_MAIN_VIEW_X "メインビュー XX" #define TR_PANEL1_BACKGROUND "パネル1 背景" #define TR_PANEL2_BACKGROUND "パネル2 背景" #define TR_WIDGET_GAUGE "ゲージ" @@ -1084,11 +1120,9 @@ #define TR_WIDGET_SETTINGS "ウィジェット設定" #define TR_REMOVE_SCREEN "ビュー画面削除" #define TR_SETUP_WIDGETS "ウィジェット設定" -#define TR_USER_INTERFACE "ユーザインターフェイス" #define TR_THEME "テーマ" #define TR_SETUP "設定" #define TR_LAYOUT "レイアウト" -#define TR_ADD_MAIN_VIEW "メインビュー追加" #define TR_TEXT_COLOR "テキスト色" #define TR_MENU_INPUTS STR_CHAR_INPUT "入力" #define TR_MENU_LUA STR_CHAR_LUA "LUAスクリプト" @@ -1156,20 +1190,6 @@ #define TR_CANCEL "キャンセル" #define TR_EDIT_THEME "テーマ編集" #define TR_DETAILS "詳細情報" -#define TR_THEME_EDITOR "テーマ" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "モデル\n選択" -#define TR_MAIN_MENU_MANAGE_MODELS "モデル\n管理" -#define TR_MAIN_MENU_MODEL_NOTES "モデル\nノート" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nモニター" -#define TR_MAIN_MENU_MODEL_SETTINGS "モデル\n設定" -#define TR_MAIN_MENU_RADIO_SETTINGS "送信機\n設定" -#define TR_MAIN_MENU_SCREEN_SETTINGS "画面設定" -#define TR_MAIN_MENU_RESET_TELEMETRY "リセット\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "統計情報" -#define TR_MAIN_MENU_ABOUT_EDGETX "EdgeTX\nについて" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "アメリカ-EN" diff --git a/radio/src/translations/ko.h b/radio/src/translations/ko.h index ef997a568..802bbcc06 100644 --- a/radio/src/translations/ko.h +++ b/radio/src/translations/ko.h @@ -38,6 +38,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "모델\n관리" +#define TR_MAIN_MENU_MODEL_NOTES "모델\n노트" +#define TR_MAIN_MENU_CHANNEL_MONITOR "채널\n모니터" +#define TR_MONITOR_SWITCHES "로직 스위치 모니터" +#define TR_MAIN_MENU_MODEL_SETTINGS "모델\n설정" +#define TR_MAIN_MENU_RADIO_SETTINGS "조종기\n설정" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "비행\n기록" +#define TR_MAIN_MENU_ABOUT_EDGETX "EdgeTX\n정보" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "테마" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "헬리 설정" +#define TR_MENUFLIGHTMODES TRSA("주행 모드", "비행 모드") +#define TR_MENUFLIGHTMODE TRSA("주행 모드", "비행 모드") +#define TR_MENUINPUTS "입력" +#define TR_MENULIMITS "출력" +#define TR_MENUCURVES "커브" +#define TR_MIXES "믹스" +#define TR_MENU_GLOBAL_VARS "전역 변수 설정" +#define TR_MENULOGICALSWITCHES "로직 스위치 목록" +#define TR_MENUCUSTOMFUNC "특수 기능" +#define TR_MENUCUSTOMSCRIPTS "사용자 스크립트" +#define TR_MENUTELEMETRY "테레메트리" +#define TR_MENUSPECIALFUNCS "전역 기능" +#define TR_MENUTRAINER "트레이너" +#define TR_HARDWARE "하드웨어" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD 카드" +#define TR_DEBUG "디버그" +#define TR_MENU_RADIO_SWITCHES TR("스위치", "스위치 테스트") +#define TR_MENUCALIBRATION "입력 보정" +#define TR_FUNCTION_SWITCHES "사용자 설정 스위치" +// End Main menu + #define TR_MINUTE_SINGULAR "분" #define TR_MINUTE_PLURAL1 "분" #define TR_MINUTE_PLURAL2 "분" @@ -294,7 +371,6 @@ #define TR_MS "ms" #define TR_SWITCH "스위치" -#define TR_FUNCTION_SWITCHES "사용자 설정 스위치" #define TR_FS_COLOR_LIST "사용자 정의", "끄기", "흰색", "빨강", "초록", "노랑", "주황", "파랑", "분홍" #define TR_GROUP "그룹" #define TR_GROUP_ALWAYS_ON "항상 켜짐" @@ -351,7 +427,6 @@ #define TR_DELAYUP "상승 지연" #define TR_SLOWDOWN TR("느리게 내림", "하강 속도 조절") #define TR_SLOWUP "느리게 올림" -#define TR_MIXES "믹스" #define TR_CV "CV" #if defined(PCBPL18) @@ -445,19 +520,12 @@ #define TR_MOVESTICKSPOTS "스틱/포트 이동" #else #define TR_MENUTOSTART TR_ENTER " -> 시작" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "포트 중앙 정렬" - #define TR_MOVESTICKSPOTS "스티어링/스로틀/포트/슬라이더 이동" -#else - #define TR_SETMIDPOINT TR("스틱 중앙 정렬", "스틱/슬라이더 중앙 정렬") - #define TR_MOVESTICKSPOTS "스틱/포트 이동" -#endif + #define TR_SETMIDPOINT TRSA("포트 중앙 정렬", TR("스틱 중앙 정렬", "스틱/슬라이더 중앙 정렬")) + #define TR_MOVESTICKSPOTS TRSA("스티어링/스로틀/포트/슬라이더 이동", "스틱/포트 이동") #define TR_MENUWHENDONE TR_ENTER " -> 완료" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "데이터 없음" #define TR_US "us" #define TR_HZ "Hz" @@ -489,10 +557,7 @@ #define TR_CH "채널" #define TR_MODEL "모델" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM 메모리 부족" @@ -509,14 +574,10 @@ #define TR_STORAGE_FORMAT "스토리지 준비 중" #define TR_EEPROMOVERFLOW "EEPROM 메모리 초과" #define TR_RADIO_SETUP "조종기 설정" -#define TR_MENUTRAINER "트레이너" -#define TR_MENUSPECIALFUNCS "전역 기능" #define TR_MENUVERSION "버전 정보" -#define TR_MENU_RADIO_SWITCHES TR("스위치", "스위치 테스트") #define TR_MENU_RADIO_ANALOGS TR("아날로그", "아날로그 테스트") #define TR_MENU_RADIO_ANALOGS_CALIB "보정된 아날로그" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW 아날로그 (5 Hz)" -#define TR_MENUCALIBRATION "입력 보정" #define TR_MENU_FSWITCH "사용자 스위치 설정" #if defined(COLORLCD) @@ -531,25 +592,8 @@ #define TR_MENUMODELSEL TR("모델 선택", "모델 선택 메뉴") #define TR_MENU_MODEL_SETUP TR("설정", "모델 설정") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "주행 모드" -#define TR_MENUFLIGHTMODE "주행 모드" -#else -#define TR_MENUFLIGHTMODES "비행 모드" -#define TR_MENUFLIGHTMODE "비행 모드" -#endif -#define TR_MENUHELISETUP "헬리 설정" -#define TR_MENUINPUTS "입력" -#define TR_MENULIMITS "출력" - -#define TR_MENUCURVES "커브" #define TR_MENUCURVE "커브 설정" #define TR_MENULOGICALSWITCH "로직 스위치" -#define TR_MENULOGICALSWITCHES "로직 스위치 목록" -#define TR_MENUCUSTOMFUNC "특수 기능" -#define TR_MENUCUSTOMSCRIPTS "사용자 스크립트" - -#define TR_MENUTELEMETRY "테레메트리" #define TR_MENUSTAT "통계" #define TR_MENUDEBUG "디버그" @@ -557,7 +601,6 @@ #define TR_MONITOR_CHANNELS2 "채널 모니터 9-16" #define TR_MONITOR_CHANNELS3 "채널 모니터 17-24" #define TR_MONITOR_CHANNELS4 "채널 모니터 25-32" -#define TR_MONITOR_SWITCHES "로직 스위치 모니터" #define TR_MONITOR_OUTPUT_DESC "출력 상태" #define TR_MONITOR_MIXER_DESC "믹서 상태" @@ -733,8 +776,6 @@ #define TR_V2 "V2" #define TR_DURATION "지속 시간" #define TR_DELAY "지연" -#define TR_SD_CARD "SD 카드" -#define TR_SDHC_CARD "SD-HC 카드" #define TR_NO_SOUNDS_ON_SD "SD 카드에 사운드 없음" #define TR_NO_MODELS_ON_SD "SD 카드에 모델 없음" @@ -755,7 +796,6 @@ #define TR_SD_INFO "SD 카드 정보" #define TR_NA "N/A" -#define TR_HARDWARE "하드웨어" #define TR_FORMATTING "포맷 중..." #define TR_TEMP_CALIB "온도 보정" #define TR_TIME "시간" @@ -814,13 +854,11 @@ #define TR_SD_SECTORS "섹터 수:" #define TR_SD_SIZE "용량:" #define TR_TYPE "유형" -#define TR_GLOBAL_VARS "전역 변수" #define TR_GVARS "전역값" #define TR_GLOBAL_VAR "전역 변수" -#define TR_MENU_GLOBAL_VARS "전역 변수 설정" #define TR_OWN "사용자 설정" #define TR_DATE "날짜" -#define TR_MONTHS { "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" } +#define TR_MONTHS "1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월" #define TR_ROTARY_ENCODER "로터리 인코더" #define TR_ROTARY_ENC_MODE TR("인코더 모드", "로터리 인코더 모드") @@ -943,7 +981,6 @@ #define TR_RANGE_TEST "범위 테스트" #define TR_RECEIVER_OPTIONS TR("수신기 옵션", "RECEIVER OPTIONS") #define TR_RESET_BTN BUTTON("초기화") -#define TR_DEBUG "디버그" #define TR_KEYS_BTN BUTTON("버튼") #define TR_ANALOGS_BTN BUTTON(TR("아날로그", "아날로그 입력")) #define TR_FS_BTN BUTTON(TR("사용자 스위치", TR_FUNCTION_SWITCHES)) @@ -1031,7 +1068,6 @@ #define TR_TOUCH_PANEL "터치 패널:" #define TR_FILE_SIZE "파일 크기" #define TR_FILE_OPEN "강제로 열까요?" -#define TR_TIMER_MODES {TR_OFFON, TR_START, TR_THROTTLE_LABEL, TR_THROTTLE_PERCENT_LABEL, TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "이름" @@ -1055,7 +1091,7 @@ #define TR_LIMITS_HEADERS_SUBTRIMMODE "서브트림 모드" #define TR_INVERTED "반전됨" -#define TR_LSW_DESCRIPTIONS { "비교 방식 또는 기능", "첫 번째 변수", "두 번째 변수 또는 상수", "두 번째 변수 또는 상수", "라인이 활성화되기 위한 추가 조건", "스위치 ON 유지 최소 시간", "ON 되기 위한 조건 지속 시간" } +#define TR_LSW_DESCRIPTIONS "비교 방식 또는 기능", "첫 번째 변수", "두 번째 변수 또는 상수", "두 번째 변수 또는 상수", "라인이 활성화되기 위한 추가 조건", "스위치 ON 유지 최소 시간", "ON 되기 위한 조건 지속 시간" #if defined(COLORLCD) // Horus layouts and widgets @@ -1072,10 +1108,9 @@ #define TR_ALIGNMENT "정렬" #define TR_ALIGN_LABEL "레이블 정렬" #define TR_ALIGN_VALUE "값 정렬" - #define TR_ALIGN_OPTS { "왼쪽", "가운데", "오른쪽" } + #define TR_ALIGN_OPTS "왼쪽", "가운데", "오른쪽" #define TR_TEXT "텍스트" #define TR_COLOR "색상" - #define TR_MAIN_VIEW_X "메인 뷰 X축" #define TR_PANEL1_BACKGROUND "패널1 배경" #define TR_PANEL2_BACKGROUND "패널2 배경" #define TR_WIDGET_GAUGE "게이지" @@ -1135,11 +1170,9 @@ #define TR_WIDGET_SETTINGS "위젯 설정" #define TR_REMOVE_SCREEN "화면 제거" #define TR_SETUP_WIDGETS "위젯 구성" -#define TR_USER_INTERFACE "사용자 인터페이스" #define TR_THEME "테마" #define TR_SETUP "설정" #define TR_LAYOUT "레이아웃" -#define TR_ADD_MAIN_VIEW "메인 화면 추가" #define TR_TEXT_COLOR "텍스트 색상" #define TR_MENU_INPUTS STR_CHAR_INPUT "입력" #define TR_MENU_LUA STR_CHAR_LUA "Lua 스크립트" @@ -1205,18 +1238,7 @@ #define TR_CANCEL "취소" #define TR_EDIT_THEME "테마 편집" #define TR_DETAILS "세부 설정" -#define TR_THEME_EDITOR "테마" -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "모델\n선택" -#define TR_MAIN_MENU_MANAGE_MODELS "모델\n관리" -#define TR_MAIN_MENU_MODEL_NOTES "모델\n노트" -#define TR_MAIN_MENU_CHANNEL_MONITOR "채널\n모니터" -#define TR_MAIN_MENU_MODEL_SETTINGS "모델\n설정" -#define TR_MAIN_MENU_RADIO_SETTINGS "조종기\n설정" -#define TR_MAIN_MENU_SCREEN_SETTINGS "화면\n설정" -#define TR_MAIN_MENU_RESET_TELEMETRY "텔레메트리\n초기화" -#define TR_MAIN_MENU_STATISTICS "비행\n기록" -#define TR_MAIN_MENU_ABOUT_EDGETX "EdgeTX\n정보" + // Voice in native language #define TR_VOICE_ENGLISH "영어" #define TR_VOICE_CHINESE "중국어" diff --git a/radio/src/translations/nl.h b/radio/src/translations/nl.h index ef2f1fd77..0c6305b38 100644 --- a/radio/src/translations/nl.h +++ b/radio/src/translations/nl.h @@ -40,6 +40,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Model Manager" +#define TR_MAIN_MENU_MODEL_NOTES "Model Notes" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel Monitor" +#define TR_MONITOR_SWITCHES "LOGISCHE SCHAKELAARS MONITOR" +#define TR_MAIN_MENU_MODEL_SETTINGS "Model Settings" +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio Settings" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistics" +#define TR_MAIN_MENU_ABOUT_EDGETX "About EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "THEMES" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "HELI TS-Mixer" +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "VLIEGFASES") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "VLIEGFASE") +#define TR_MENUINPUTS "INPUTS" +#define TR_MENULIMITS "OUTPUTS" +#define TR_MENUCURVES "CURVEN" +#define TR_MIXES "MIXER" +#define TR_MENU_GLOBAL_VARS "Globale Variabelen" +#define TR_MENULOGICALSWITCHES "LOGISCHE SCHAKELRS" +#define TR_MENUCUSTOMFUNC TR("SPEC.-FUNKTIES", "SPECIALE-FUNKTIES") +#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTS" +#define TR_MENUTELEMETRY "TELEMETRIE" +#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIES" +#define TR_MENUTRAINER "LERAAR/LEERLING" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD-Card" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("Schak.", "Schakelaar-Test") +#define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") +#define TR_FUNCTION_SWITCHES "Customizable switches" +// End Main menu + #define TR_MINUTE_SINGULAR "minute" #define TR_MINUTE_PLURAL1 "minutes" #define TR_MINUTE_PLURAL2 "minutes" @@ -290,7 +367,6 @@ #define TR_WARN_5VOLTS "Warning: output level is 5 volts" #define TR_MS "ms" #define TR_SWITCH TR("Schak.", "Schakelaar") -#define TR_FUNCTION_SWITCHES "Customizable switches" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -344,7 +420,6 @@ #define TR_DELAYUP "Vertr.Up" #define TR_SLOWDOWN "Langz.Dn" #define TR_SLOWUP "Langz.Up" -#define TR_MIXES "MIXER" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -428,19 +503,12 @@ #define TR_MOVESTICKSPOTS "BEWEEG STICKS/POTS" #else #define TR_MENUTOSTART TR_ENTER " VOOR START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET POTS MIDPOINT" - #define TR_MOVESTICKSPOTS "MOVE ST/TH/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("ZET STICKS NAAR HET MIDDEN", "CENTREER STICKS/SLIDERS") - #define TR_MOVESTICKSPOTS "BEWEEG STICKS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET POTS MIDPOINT", TR("ZET STICKS NAAR HET MIDDEN", "CENTREER STICKS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVE ST/TH/POTS/AXIS", "BEWEEG STICKS/POTS") #define TR_MENUWHENDONE TR_ENTER " BIJ GEREED" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "Geen Data" #define TR_US "us" #define TR_HZ "Hz" @@ -470,10 +538,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM weinig geheugen" #define TR_PRESS_ANY_KEY_TO_SKIP "Druk een toets.." @@ -489,15 +554,10 @@ #define TR_EEPROMOVERFLOW "EEPROM Overflow" #define TR_RADIO_SETUP TR("ZENDER-INSTELLEN", "ZENDER-BASISINSTELLINGEN") - -#define TR_MENUTRAINER "LERAAR/LEERLING" -#define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIES" #define TR_MENUVERSION "VERSIE" -#define TR_MENU_RADIO_SWITCHES TR("Schak.", "Schakelaar-Test") #define TR_MENU_RADIO_ANALOGS "Analoog-Test" #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") #define TR_MENU_FSWITCH "CUSTOMIZABLE SWITCHES" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -508,32 +568,14 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("MODELLEN", "MODEL KIEZEN") #define TR_MENU_MODEL_SETUP TR("MODEL-INSTELLING", "MODEL-INSTELLINGEN") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "DRIVE MODES" -#define TR_MENUFLIGHTMODE "DRIVE MODE" -#else -#define TR_MENUFLIGHTMODES "VLIEGFASES" -#define TR_MENUFLIGHTMODE "VLIEGFASE" -#endif -#define TR_MENUHELISETUP "HELI TS-Mixer" - - #define TR_MENUINPUTS "INPUTS" - #define TR_MENULIMITS "OUTPUTS" - -#define TR_MENUCURVES "CURVEN" #define TR_MENUCURVE "CURVE" #define TR_MENULOGICALSWITCH "LOGISCHE SCHAK." -#define TR_MENULOGICALSWITCHES "LOGISCHE SCHAKELRS" -#define TR_MENUCUSTOMFUNC TR("SPEC.-FUNKTIES", "SPECIALE-FUNKTIES") -#define TR_MENUCUSTOMSCRIPTS "LUA-SCRIPTS" -#define TR_MENUTELEMETRY "TELEMETRIE" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" -#define TR_MONITOR_CHANNELS1 "CHANNELS MONITOR 1-8" -#define TR_MONITOR_CHANNELS2 "CHANNELS MONITOR 9-16" -#define TR_MONITOR_CHANNELS3 "CHANNELS MONITOR 17-24" -#define TR_MONITOR_CHANNELS4 "CHANNELS MONITOR 25-32" -#define TR_MONITOR_SWITCHES "LOGISCHE SCHAKELAARS MONITOR" +#define TR_MONITOR_CHANNELS1 "CHANNELS 1-8" +#define TR_MONITOR_CHANNELS2 "CHANNELS 9-16" +#define TR_MONITOR_CHANNELS3 "CHANNELS 17-24" +#define TR_MONITOR_CHANNELS4 "CHANNELS 25-32" #define TR_MONITOR_OUTPUT_DESC "Outputs" #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("RxNum", "Receiver Nr.") @@ -690,8 +732,6 @@ #define TR_V2 "V2" #define TR_DURATION "Duur" #define TR_DELAY "Vertrag." -#define TR_SD_CARD "SD-Card" -#define TR_SDHC_CARD "SD-HC CARD" #define TR_NO_SOUNDS_ON_SD "Geen Geluiden op SD" #define TR_NO_MODELS_ON_SD "Geen Modellen op SD" #define TR_NO_BITMAPS_ON_SD "Geen Bitmaps op SD" @@ -710,7 +750,6 @@ #define TR_REMOVED " verwijderd" #define TR_SD_INFO "Informatie" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formatteren..." #define TR_TEMP_CALIB "Temp. Calib." #define TR_TIME "Tijd:" @@ -765,13 +804,11 @@ #define TR_SD_SECTORS "Sectoren:" #define TR_SD_SIZE "Grootte:" #define TR_TYPE "Type" -#define TR_GLOBAL_VARS "Globale Variabelen" #define TR_GVARS "GLOBALE V." #define TR_GLOBAL_VAR "Globale Variabele" -#define TR_MENU_GLOBAL_VARS "GLOBALE VARIABELEN" #define TR_OWN "Eigen" #define TR_DATE "Datum:" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" #define TR_ROTARY_ENCODER "Draaischakelaar" #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "Kanaal-Monitor==>" @@ -888,7 +925,6 @@ #define TR_RANGE_TEST "Range test" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_RESET_BTN "[Reset]" -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogs")) #define TR_FS_BTN BUTTON(TR("Custom sw", "Customizable switches")) @@ -982,7 +1018,6 @@ #define TR_TOUCH_PANEL "Touch panel:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Name" @@ -1007,7 +1042,7 @@ #define TR_INVERTED "Inverted" -#define TR_LSW_DESCRIPTIONS { "Vergelijking of Functie", "1e variabele", "2e variabele of constante", "2e variabele of constante", "Additionele conditie", "Minimale AAN duur van de logische schakelaar", "Minimale WAAR duur om AAN te gaan" } +#define TR_LSW_DESCRIPTIONS "Vergelijking of Functie", "1e variabele", "2e variabele of constante", "2e variabele of constante", "Additionele conditie", "Minimale AAN duur van de logische schakelaar", "Minimale WAAR duur om AAN te gaan" #if defined(COLORLCD) // Horus layouts and widgets @@ -1024,10 +1059,9 @@ #define TR_ALIGNMENT "Uitlijnen" #define TR_ALIGN_LABEL "Label uitlijnen" #define TR_ALIGN_VALUE "Waarde uitlijnen" - #define TR_ALIGN_OPTS { "Links", "Midden", "Rechts" } + #define TR_ALIGN_OPTS "Links", "Midden", "Rechts" #define TR_TEXT "Text" #define TR_COLOR "Color" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "Panel1 background" #define TR_PANEL2_BACKGROUND "Panel2 background" #define TR_WIDGET_GAUGE "Gauge" @@ -1092,11 +1126,9 @@ #define TR_WIDGET_SETTINGS "Widget instellen" #define TR_REMOVE_SCREEN "Scherm wissen" #define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" #define TR_THEME "Theme" #define TR_SETUP "Setup" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Add main view" #define TR_TEXT_COLOR "Text color" #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" @@ -1167,20 +1199,6 @@ #define TR_CANCEL "Cancel" #define TR_EDIT_THEME "EDIT THEME" #define TR_DETAILS "Details" -#define TR_THEME_EDITOR "THEMES" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Select\nModel" -#define TR_MAIN_MENU_MANAGE_MODELS "Model\nManager" -#define TR_MAIN_MENU_MODEL_NOTES "Model\nNotes" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Channel\nMonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Model\nSettings" -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio\nSettings" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Screens\nSettings" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelemetry" -#define TR_MAIN_MENU_STATISTICS "Statistics" -#define TR_MAIN_MENU_ABOUT_EDGETX "About\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "English" @@ -1237,8 +1255,8 @@ #define TR_SYNC "Sync" #define TR_ENABLED_FEATURES "Enabled Features" -#define TR_RADIO_MENU_TABS "Radio Menu Tabs" -#define TR_MODEL_MENU_TABS "Model Menu Tabs" +#define TR_RADIO_MENU_TABS "Radio Menu" +#define TR_MODEL_MENU_TABS "Model Menu" #define TR_SELECT_MENU_ALL "All" #define TR_SELECT_MENU_CLR "Clear" diff --git a/radio/src/translations/pl.h b/radio/src/translations/pl.h index d760f8df7..498ef9220 100644 --- a/radio/src/translations/pl.h +++ b/radio/src/translations/pl.h @@ -40,6 +40,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Menadżer modeli" +#define TR_MAIN_MENU_MODEL_NOTES "Notatki modelu" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor kanałów" +#define TR_MONITOR_SWITCHES "MONITOR PRZEŁ. LOGICZNYCH" +#define TR_MAIN_MENU_MODEL_SETTINGS "Ustawienia modelu" +#define TR_MAIN_MENU_RADIO_SETTINGS "Ustawienia radia" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statystyki" +#define TR_MAIN_MENU_ABOUT_EDGETX "O EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "Szablony" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "USTAW HELI" +#define TR_MENUFLIGHTMODES TRSA("DRIVE MODES", "FAZY LOTU") +#define TR_MENUFLIGHTMODE TRSA("DRIVE MODE", "FAZA LOTU") +#define TR_MENUINPUTS "WEJŚCIA" +#define TR_MENULIMITS "WYJŚCIA" +#define TR_MENUCURVES "KRZYWE" +#define TR_MIXES "MIKSERY" +#define TR_MENU_GLOBAL_VARS "Zmienne Globalne" +#define TR_MENULOGICALSWITCHES TR("PRZEŁ. LOG.", "PRZEŁ. LOGICZNE") +#define TR_MENUCUSTOMFUNC "FUNKCJE SPECJALNE" +#define TR_MENUCUSTOMSCRIPTS "WŁASNE SKRYPTY" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUSPECIALFUNCS "FUNKCJE GLOBALNE" +#define TR_MENUTRAINER "TRENER" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("PRZEŁ","TEST PRZEŁ") +#define TR_MENUCALIBRATION "KALIBRACJA" +#define TR_FUNCTION_SWITCHES "Ustawiane przełączniki" +// End Main menu + #define TR_MINUTE_SINGULAR "minuta" #define TR_MINUTE_PLURAL1 "minuty" #define TR_MINUTE_PLURAL2 "minut" @@ -289,7 +366,6 @@ #define TR_WARN_5VOLTS "Uwaga: output level is 5 volts" #define TR_MS "ms" #define TR_SWITCH "Przełą" -#define TR_FUNCTION_SWITCHES "Ustawiane przełączniki" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -343,7 +419,6 @@ #define TR_DELAYUP "Opózn.(+)" #define TR_SLOWDOWN "Spowoln.(-)" #define TR_SLOWUP "Spowoln.(+)" -#define TR_MIXES "MIKSERY" #define TR_CV "Kr" #if defined(PCBPL18) #define TR_GV "ZG" @@ -426,19 +501,12 @@ #define TR_MOVESTICKSPOTS "RUSZAJ DRĄŻKI/SUWAKI" #else #define TR_MENUTOSTART TR_ENTER " = START" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "USTAW ŚRODEK POT." - #define TR_MOVESTICKSPOTS "RUSZAJ DR/TH/POT./OSIE" -#else - #define TR_SETMIDPOINT TR("USTAW ŚRODEK OSI", "CENTRUJ DRĄŻKI/SUWAKI") - #define TR_MOVESTICKSPOTS "RUSZAJ DRĄŻKI/POT." -#endif + #define TR_SETMIDPOINT TRSA("USTAW ŚRODEK POT.", TR("USTAW ŚRODEK OSI", "CENTRUJ DRĄŻKI/SUWAKI")) + #define TR_MOVESTICKSPOTS TRSA("RUSZAJ DR/TH/POT./OSIE", "RUSZAJ DRĄŻKI/POT.") #define TR_MENUWHENDONE TR_ENTER " = KONIEC" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "Brak Danych" #define TR_US "us" #define TR_HZ "Hz" @@ -468,10 +536,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "KN" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) - #define TR_FM "DM" -#else - #define TR_FM "FL" +#define TR_FM TRSA("DM", "FL") #endif #define TR_EEPROMLOWMEM "Mało pamięci EEPROM" #define TR_PRESS_ANY_KEY_TO_SKIP "Wciśnij guzik->ignoruj" @@ -486,14 +551,10 @@ #define TR_STORAGE_FORMAT "Storage Preparation" #define TR_EEPROMOVERFLOW "Przeładowany EEPROM" #define TR_RADIO_SETUP "USTAWIENIA RADIA" -#define TR_MENUTRAINER "TRENER" -#define TR_MENUSPECIALFUNCS "FUNKCJE GLOBALNE" #define TR_MENUVERSION "WERSJA" -#define TR_MENU_RADIO_SWITCHES TR("PRZEŁ","TEST PRZEŁ") #define TR_MENU_RADIO_ANALOGS TR("WE-ANA","WEJŚCIA ANALOG.") #define TR_MENU_RADIO_ANALOGS_CALIB "CALIBRATED ANALOGS" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW ANALOGS (5 Hz)" -#define TR_MENUCALIBRATION "KALIBRACJA" #define TR_MENU_FSWITCH "USTAWIANE PRZEŁĄCZNIKI" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trymery => Subtrimy" @@ -504,30 +565,12 @@ #define TR_CHANNEL2FAILSAFE "Channel=>Failsafe" #define TR_MENUMODELSEL TR("WYB.MODEL","WYBÓR MODELU") #define TR_MENU_MODEL_SETUP TR("USTAW","USTAW MODELU") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "DRIVE MODES" - #define TR_MENUFLIGHTMODE "DRIVE MODE" -#else - #define TR_MENUFLIGHTMODE "FAZA LOTU" - #define TR_MENUFLIGHTMODES "FAZY LOTU" -#endif -#define TR_MENUHELISETUP "USTAW HELI" - - #define TR_MENUINPUTS "WEJŚCIA" - #define TR_MENULIMITS "WYJŚCIA" - -#define TR_MENUCURVES "KRZYWE" #define TR_MENUCURVE "KRZYWA" #define TR_MENULOGICALSWITCH "PRZEŁ. LOGICZNY" -#define TR_MENULOGICALSWITCHES TR("PRZEŁ. LOG.", "PRZEŁ. LOGICZNE") -#define TR_MENUCUSTOMFUNC "FUNKCJE SPECJALNE" -#define TR_MENUCUSTOMSCRIPTS "WŁASNE SKRYPTY" -#define TR_MENUTELEMETRY "TELEMETRIA" #define TR_MENUSTAT "STAT" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR KANAŁÓW 1/8" #define TR_MONITOR_CHANNELS2 "MONITOR KANAŁÓW 9/16" -#define TR_MONITOR_SWITCHES "MONITOR PRZEŁ. LOGICZNYCH" #define TR_MONITOR_CHANNELS3 "MONITOR KANAŁÓW 17/24" #define TR_MONITOR_CHANNELS4 "MONITOR KANAŁÓW 25/32" #define TR_MONITOR_OUTPUT_DESC "Wyjścia" @@ -686,8 +729,6 @@ #define TR_V2 "V2" #define TR_DURATION "Czas trwania" #define TR_DELAY "Opóźnienie" -#define TR_SD_CARD "SD" -#define TR_SDHC_CARD "SD-HC" #define TR_NO_SOUNDS_ON_SD "Brak dźwięków na SD" #define TR_NO_MODELS_ON_SD "Brak modelu na SD" #define TR_NO_BITMAPS_ON_SD "Brak obrazków na SD" @@ -706,7 +747,6 @@ #define TR_REMOVED " skasowane" #define TR_SD_INFO "Informacje" #define TR_NA "[X]" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formatowanie.." #define TR_TEMP_CALIB "Temp. kalibracji" #define TR_TIME "Czas" @@ -761,13 +801,11 @@ #define TR_SD_SECTORS "Sektory :" #define TR_SD_SIZE "Wielkość:" #define TR_TYPE "Typ:" -#define TR_GLOBAL_VARS "Zmienne Globalne" #define TR_GVARS "Zmien.Glob." #define TR_GLOBAL_VAR "Zmienna Globalna" -#define TR_MENU_GLOBAL_VARS "ZMIENNE GLOBALNE" #define TR_OWN "Własność" #define TR_DATE "Data" -#define TR_MONTHS { "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru" } +#define TR_MONTHS "Sty", "Lut", "Mar", "Kwi", "Maj", "Cze", "Lip", "Sie", "Wrz", "Paź", "Lis", "Gru" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("RotEnc Mode","Rotary Encoder Mode") #define TR_CHANNELS_MONITOR "MONITOR KANAŁÓW" @@ -884,7 +922,6 @@ #define TR_RANGE_TEST "Test zasięgu" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_RESET_BTN "[Reset]" -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("SW","Switches")) #define TR_ANALOGS_BTN BUTTON(TR("Analog","Analogi")) #define TR_FS_BTN BUTTON(TR("Ust. łącz.", TR_FUNCTION_SWITCHES )) @@ -972,7 +1009,6 @@ #define TR_TOUCH_PANEL "Touch panel:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nazwa" @@ -997,7 +1033,7 @@ #define TR_INVERTED "Inverted" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1014,10 +1050,9 @@ #define TR_ALIGNMENT "Wyrównaj" #define TR_ALIGN_LABEL "Wyrównaj przywieszka" #define TR_ALIGN_VALUE "Wyrównać wartość" - #define TR_ALIGN_OPTS { "Lewy", "Centrum", "Prawe" } + #define TR_ALIGN_OPTS "Lewy", "Centrum", "Prawe" #define TR_TEXT "Tekst" #define TR_COLOR "Kolor" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "Panel1 tło" #define TR_PANEL2_BACKGROUND "Panel2 tło" #define TR_WIDGET_GAUGE "Wskaźnik" @@ -1082,11 +1117,9 @@ #define TR_WIDGET_SETTINGS "Ustawienia widżetu" #define TR_REMOVE_SCREEN "Usuń ekran" #define TR_SETUP_WIDGETS "Ustaw widżety" -#define TR_USER_INTERFACE "Interfejs użytkownika" #define TR_THEME "Szablon" #define TR_SETUP "Ustawienia" #define TR_LAYOUT "Układ" -#define TR_ADD_MAIN_VIEW "Dodaj główny widok" #define TR_TEXT_COLOR "Kolor tekstu" #define TR_MENU_INPUTS STR_CHAR_INPUT "Wejścia" @@ -1155,20 +1188,6 @@ #define TR_CANCEL "Anuluj" #define TR_EDIT_THEME "Edytuj szablon" #define TR_DETAILS "Detale" -#define TR_THEME_EDITOR "Szablony" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Wybierz\nmodel" -#define TR_MAIN_MENU_MANAGE_MODELS "Menadżer\nmodeli" -#define TR_MAIN_MENU_MODEL_NOTES "Notatki\nmodelu" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor\nkanałów" -#define TR_MAIN_MENU_MODEL_SETTINGS "Ustawienia\nmodelu" -#define TR_MAIN_MENU_RADIO_SETTINGS "Ustawienia\nradia" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Ustawienia\nekranów" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\ntelemetrii" -#define TR_MAIN_MENU_STATISTICS "Statystyki" -#define TR_MAIN_MENU_ABOUT_EDGETX "O\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Angielski" diff --git a/radio/src/translations/pt.h b/radio/src/translations/pt.h index 12347f2ac..7e9aee1aa 100644 --- a/radio/src/translations/pt.h +++ b/radio/src/translations/pt.h @@ -296,7 +296,6 @@ #define TR_WARN_5VOLTS "AVISO: Tensão de saída em 5 volts" #define TR_MS "ms" #define TR_SWITCH "Chave" -#define TR_FUNCTION_SWITCHES "Chaves customizáveis" #define TR_FS_COLOR_LIST "Custom","Desl","Branco","Verm","Verd","Amarl","Larj","Azul","Pink" #define TR_GROUP "Grupo" #define TR_GROUP_ALWAYS_ON "Sempre lig" @@ -350,7 +349,6 @@ #define TR_DELAYUP "Delay up" #define TR_SLOWDOWN TR("Lento dn", "Lento down") #define TR_SLOWUP "Lento up" -#define TR_MIXES "MIXES" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -433,19 +431,12 @@ #define TR_MOVESTICKSPOTS "MOVA EIXO/POTS" #else #define TR_MENUTOSTART TR_ENTER " P/ INICIAR" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "SET MEIO DOS POTS" - #define TR_MOVESTICKSPOTS "MOVA DIR/MOT/POTS/AXIS" -#else - #define TR_SETMIDPOINT TR("SET EIXO MEIO", "CENTRE AXIS/SLIDERS") - #define TR_MOVESTICKSPOTS "MOVA AXIS/POTS" -#endif + #define TR_SETMIDPOINT TRSA("SET MEIO DOS POTS", TR("SET EIXO MEIO", "CENTRE AXIS/SLIDERS")) + #define TR_MOVESTICKSPOTS TRSA("MOVA DIR/MOT/POTS/AXIS", "MOVA AXIS/POTS") #define TR_MENUWHENDONE TR_ENTER " QUANDO TERM." #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "SEM DADOS" #define TR_US "us" #define TR_HZ "Hz" @@ -475,10 +466,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "MODEL" -#if defined(SURFACE_RADIO) -#define TR_FM "MD" -#else -#define TR_FM "FM" +#define TR_FM TRSA("MD", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "Press tecla p/ sair" @@ -493,14 +481,10 @@ #define TR_STORAGE_FORMAT "Preparando armazenamento" #define TR_EEPROMOVERFLOW "EEPROM overflow" #define TR_RADIO_SETUP "CONF. RÁDIO" -#define TR_MENUTRAINER "TRAINER" -#define TR_MENUSPECIALFUNCS "FUNÇÕES GLOBAIS" #define TR_MENUVERSION "VERSÃO" -#define TR_MENU_RADIO_SWITCHES TR("CHAVES", "TEST CHAVES") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "TEST ANALOG") #define TR_MENU_RADIO_ANALOGS_CALIB "ANALOGS CALIBR." #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "ANALOGS BRUTOS(5 Hz)" -#define TR_MENUCALIBRATION "CALIBRAÇÃO" #define TR_MENU_FSWITCH "BOTÃO CUSTOMIZAVEL" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -511,31 +495,14 @@ #define TR_CHANNEL2FAILSAFE "Chanal=>Failsafe" #define TR_MENUMODELSEL TR("SEL. MODELO", "SELEÇÃO MODELO") #define TR_MENU_MODEL_SETUP TR("EDITAR", "EDITAR MODELO") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "MODOS DIR" -#define TR_MENUFLIGHTMODE "MODO DIR" -#else -#define TR_MENUFLIGHTMODES "MODOS VOO" -#define TR_MENUFLIGHTMODE "MODO DE VOO" -#endif -#define TR_MENUHELISETUP "EDITAR HELI" - - #define TR_MENUINPUTS "ENTRADAS" - #define TR_MENULIMITS "SAÍDAS" -#define TR_MENUCURVES "CURVAS" #define TR_MENUCURVE "CURVA" #define TR_MENULOGICALSWITCH "CHAVE LÓGICA" -#define TR_MENULOGICALSWITCHES "CHAVES LÓGICAS" -#define TR_MENUCUSTOMFUNC "FUNÇÃO ESPECIAL" -#define TR_MENUCUSTOMSCRIPTS "SCRIPTS CUSTOM" -#define TR_MENUTELEMETRY "TELEMETRIA" #define TR_MENUSTAT "STATS" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "MONITOR CANAIS 1-8" #define TR_MONITOR_CHANNELS2 "MONITOR CANAIS 9-16" #define TR_MONITOR_CHANNELS3 "MONITOR CANAIS 17-24" #define TR_MONITOR_CHANNELS4 "MONITOR CANAIS 25-32" -#define TR_MONITOR_SWITCHES "MONITOR CHAV. LÓGICAS" #define TR_MONITOR_OUTPUT_DESC "Saídas" #define TR_MONITOR_MIXER_DESC "Mixers" #define TR_RECEIVER_NUM TR("# Rx", "# Recept") @@ -698,7 +665,6 @@ #define TR_DURATION "Duração" #define TR_DELAY "Atraso" #define TR_SD_CARD "CARTÃO SD" -#define TR_SDHC_CARD "CARTÃO SD-HC" #define TR_NO_SOUNDS_ON_SD "Sem Som no SD" #define TR_NO_MODELS_ON_SD "Sem Modelo no SD" #define TR_NO_BITMAPS_ON_SD "No bitmaps on SD" @@ -717,7 +683,6 @@ #define TR_REMOVED " removido" #define TR_SD_INFO "Informação" #define TR_NA "N/A" -#define TR_HARDWARE "HARDWARE" #define TR_FORMATTING "Formatando..." #define TR_TEMP_CALIB "Temp. Calib" #define TR_TIME "Hora" @@ -773,13 +738,11 @@ #define TR_SD_SECTORS "Sectores:" #define TR_SD_SIZE "Tam:" #define TR_TYPE "Tipo" -#define TR_GLOBAL_VARS "Variáveis Global" #define TR_GVARS "GVARS" #define TR_GLOBAL_VAR "Variável Global" -#define TR_MENU_GLOBAL_VARS "VARIÁVEIS GLOBAIS" #define TR_OWN "Own" #define TR_DATE "Data" -#define TR_MONTHS { "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez" } +#define TR_MONTHS "Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("Modo RotEnc","Modo Rotary Encoder") #define TR_CHANNELS_MONITOR "MONITOR CANAIS" @@ -896,7 +859,6 @@ #define TR_RANGE_TEST "Range Test" #define TR_RECEIVER_OPTIONS TR("REC. OPTIONS", "RECEIVER OPTIONS") #define TR_RESET_BTN BUTTON("Reset") -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON("Keys") #define TR_ANALOGS_BTN BUTTON(TR("Anas", "Analogs")) #define TR_FS_BTN BUTTON(TR("Custom sw", TR_FUNCTION_SWITCHES)) @@ -979,7 +941,6 @@ #define TR_TOUCH_PANEL "Touch panel:" #define TR_FILE_SIZE "File size" #define TR_FILE_OPEN "Open anyway?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Nome" @@ -1004,7 +965,7 @@ #define TR_INVERTED "Invertido" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1021,10 +982,9 @@ #define TR_ALIGNMENT "Alinhar" #define TR_ALIGN_LABEL "Alinhar etiqueta" #define TR_ALIGN_VALUE "Alinhar valor" - #define TR_ALIGN_OPTS { "Esquerda", "Centro", "Direita" } + #define TR_ALIGN_OPTS "Esquerda", "Centro", "Direita" #define TR_TEXT "Text" #define TR_COLOR "Color" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "Panel1 background" #define TR_PANEL2_BACKGROUND "Panel2 background" #define TR_WIDGET_GAUGE "Gauge" @@ -1088,11 +1048,9 @@ #define TR_WIDGET_SETTINGS "Widget settings" #define TR_REMOVE_SCREEN "Remove screen" #define TR_SETUP_WIDGETS "Setup widgets" -#define TR_USER_INTERFACE "User interface" #define TR_THEME "Tema" #define TR_SETUP "Setup" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Add main view" #define TR_TEXT_COLOR "Text color" #define TR_MENU_INPUTS STR_CHAR_INPUT "Inputs" #define TR_MENU_LUA STR_CHAR_LUA "Lua scripts" @@ -1160,19 +1118,81 @@ #define TR_CANCEL "Cancel" #define TR_EDIT_THEME "EDIT THEME" #define TR_DETAILS "Details" -#define TR_THEME_EDITOR "TEMAS" +#define TR_MAIN_MENU_THEMES "TEMAS" // Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Selecionar\nModelo" -#define TR_MAIN_MENU_MANAGE_MODELS "Gerenciar\nModelos" -#define TR_MAIN_MENU_MODEL_NOTES "Notas\nModelo" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor\nCanais" -#define TR_MAIN_MENU_MODEL_SETTINGS "Editar\nModelo" -#define TR_MAIN_MENU_RADIO_SETTINGS "Editar\nRádio" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Editar\nTela" -#define TR_MAIN_MENU_RESET_TELEMETRY "Reset\nTelem." +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Gerenciar Modelos" +#define TR_MAIN_MENU_MODEL_NOTES "Notas Modelo" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Monitor Canais" +#define TR_MONITOR_SWITCHES "MONITOR CHAV. LÓGICAS" +#define TR_MAIN_MENU_MODEL_SETTINGS "Editar Modelo" +#define TR_MAIN_MENU_RADIO_SETTINGS "Editar Rádio" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" #define TR_MAIN_MENU_STATISTICS "Estatist." -#define TR_MAIN_MENU_ABOUT_EDGETX "Sobre\nEdgeTX" +#define TR_MAIN_MENU_ABOUT_EDGETX "Sobre EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "EDITAR HELI" +#define TR_MENUFLIGHTMODES TRSA("MODOS DIR", "MODOS VOO") +#define TR_MENUFLIGHTMODE TRSA("MODO DIR", "MODO DE VOO") +#define TR_MENUINPUTS "ENTRADAS" +#define TR_MENULIMITS "SAÍDAS" +#define TR_MENUCURVES "CURVAS" +#define TR_MIXES "MIXES" +#define TR_MENU_GLOBAL_VARS "Variáveis Global" +#define TR_MENULOGICALSWITCHES "CHAVES LÓGICAS" +#define TR_MENUCUSTOMFUNC "FUNÇÃO ESPECIAL" +#define TR_MENUCUSTOMSCRIPTS "SCRIPTS CUSTOM" +#define TR_MENUTELEMETRY "TELEMETRIA" +#define TR_MENUSPECIALFUNCS "FUNÇÕES GLOBAIS" +#define TR_MENUTRAINER "TRAINER" +#define TR_HARDWARE "HARDWARE" +#define TR_USER_INTERFACE "Top Bar" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("CHAVES", "TEST CHAVES") +#define TR_MENUCALIBRATION "CALIBRAÇÃO" +#define TR_FUNCTION_SWITCHES "Chaves customizáveis" // End Main menu // Voice in native language diff --git a/radio/src/translations/ru.h b/radio/src/translations/ru.h index 65c6fd10d..29520fb06 100644 --- a/radio/src/translations/ru.h +++ b/radio/src/translations/ru.h @@ -39,6 +39,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Меню Моделей" +#define TR_MAIN_MENU_MODEL_NOTES "Заметки Модели" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Монитор Каналов" +#define TR_MONITOR_SWITCHES "МОНИТОР ЛОГИЧ ТУМБЛЕРОВ" +#define TR_MAIN_MENU_MODEL_SETTINGS "Меню Модели" +#define TR_MAIN_MENU_RADIO_SETTINGS "Меню Пульта" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Стат-ка Пульта" +#define TR_MAIN_MENU_ABOUT_EDGETX "Инфо EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "ТЕМЫ" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "НАСТРОЙКА ВЕРТ" +#define TR_MENUFLIGHTMODES TRSA("РЕЖИМЫ ВОЖДЕНИЯ", "РЕЖИМЫ ПОЛЕТА") +#define TR_MENUFLIGHTMODE TRSA("РЕЖИМ ВОЖДЕНИЯ", "РЕЖИМ ПОЛЕТА") +#define TR_MENUINPUTS "ВХОДЫ" +#define TR_MENULIMITS "ВЫХОДЫ" +#define TR_MENUCURVES "КРИВЫЕ" +#define TR_MIXES "МИКСЫ" +#define TR_MENU_GLOBAL_VARS "Глоб переменные" +#define TR_MENULOGICALSWITCHES "ЛОГИЧ ТУМБЛ." +#define TR_MENUCUSTOMFUNC "СПЕЦ ФУНКЦИИ" +#define TR_MENUCUSTOMSCRIPTS "ПОЛЬЗ СЦЕНАРИИ" +#define TR_MENUTELEMETRY "ТЕЛЕМЕТРИЯ" +#define TR_MENUSPECIALFUNCS "ГЛОБ ФУНКЦИИ" +#define TR_MENUTRAINER "ТРЕНЕР" +#define TR_HARDWARE "АППАРАТУРА" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD КАРТА" +#define TR_DEBUG "Отладка" +#define TR_MENU_RADIO_SWITCHES TR("ТУМБЛЕРЫ", "ТЕСТ ТУМБЛЕРОВ") +#define TR_MENUCALIBRATION "КАЛИБРОВКА" +#define TR_FUNCTION_SWITCHES "Настр тумблеры" +// End Main menu + #define TR_MINUTE_SINGULAR "МИНУТА" #define TR_MINUTE_PLURAL1 "Мин" #define TR_MINUTE_PLURAL2 "Мин" @@ -295,7 +372,6 @@ #define TR_WARN_5VOLTS "Предупреждение: уровень выхода - 5 вольт" #define TR_MS "ms" #define TR_SWITCH "Тумблер" -#define TR_FUNCTION_SWITCHES "Настр тумблеры" #define TR_FS_COLOR_LIST "Свой","Выкл","Белый","Красн","Зелен","Желт","Оранж","Синий","Розов" #define TR_GROUP "Группа" #define TR_GROUP_ALWAYS_ON "Включить все" @@ -349,7 +425,6 @@ #define TR_DELAYUP "Задер вверх" #define TR_SLOWDOWN TR("Замедл вниз", "Замедл вниз") #define TR_SLOWUP "Замед вверх" -#define TR_MIXES "МИКСЫ" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -432,19 +507,12 @@ #define TR_MOVESTICKSPOTS "Перемещ СТИКИ/ПОТЕНЦ" #else #define TR_MENUTOSTART TR_ENTER " СТАРТ" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "ВЫБ СЕРЕД ПОТЕНЦ" - #define TR_MOVESTICKSPOTS "ДВИГ ПОТЕНЦ/СТИКИ/СЛАЙДЕРЫ" -#else - #define TR_SETMIDPOINT TR("ВЫБ СТИКИ СЕРЕД", "ЦЕНТР СТИК/СЛАЙДЕР") - #define TR_MOVESTICKSPOTS "ДВИГ СТИКИ/ПОТЕНЦ" -#endif + #define TR_SETMIDPOINT TRSA("ВЫБ СЕРЕД ПОТЕНЦ", TR("ВЫБ СТИКИ СЕРЕД", "ЦЕНТР СТИК/СЛАЙДЕР")) + #define TR_MOVESTICKSPOTS TRSA("ДВИГ ПОТЕНЦ/СТИКИ/СЛАЙДЕРЫ", "ДВИГ СТИКИ/ПОТЕНЦ") #define TR_MENUWHENDONE TR_ENTER " ПО ОКОНЧАНИЮ" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "НЕТ ДАННЫХ" #define TR_US "US" #define TR_HZ "Hz" @@ -474,10 +542,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "Модель" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM Нехват памяти" #define TR_PRESS_ANY_KEY_TO_SKIP "Нажмите любую кнопку" @@ -492,14 +557,10 @@ #define TR_STORAGE_FORMAT "Формат памяти" #define TR_EEPROMOVERFLOW "EEPROM заполнен" #define TR_RADIO_SETUP "НАСТРОЙКА ПУЛЬТА" -#define TR_MENUTRAINER "ТРЕНЕР" -#define TR_MENUSPECIALFUNCS "ГЛОБ ФУНКЦИИ" #define TR_MENUVERSION "ВЕРСИЯ" -#define TR_MENU_RADIO_SWITCHES TR("ТУМБЛЕРЫ", "ТЕСТ ТУМБЛЕРОВ") #define TR_MENU_RADIO_ANALOGS TR("АНАЛОГИ", "ТЕСТ АНАЛОГОВ") #define TR_MENU_RADIO_ANALOGS_CALIB "КАЛИБРОВКА АНАЛОГОВ" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RAW АНАЛОГИ (5 Hz)" -#define TR_MENUCALIBRATION "КАЛИБРОВКА" #define TR_MENU_FSWITCH "НАСТРАИВАЕМЫЕ ТУМБЛЕРЫ" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Тримы => Субтримы" @@ -510,31 +571,14 @@ #define TR_CHANNEL2FAILSAFE "Канал=>Авар режим" #define TR_MENUMODELSEL TR("ВЫБОР МОДЕЛИ", "УПРАВЛЕНИЕ МОДЕЛЬЮ") #define TR_MENU_MODEL_SETUP TR("НАСТРОЙКА", "НАСТРОЙКА МОДЕЛИ") -#if defined(SURFACE_RADIO) -#define TR_MENUFLIGHTMODES "РЕЖИМЫ ВОЖДЕНИЯ" -#define TR_MENUFLIGHTMODE "РЕЖИМ ВОЖДЕНИЯ" -#else -#define TR_MENUFLIGHTMODES "РЕЖИМЫ ПОЛЕТА" -#define TR_MENUFLIGHTMODE "РЕЖИМ ПОЛЕТА" -#endif -#define TR_MENUHELISETUP "НАСТРОЙКА ВЕРТ" - - #define TR_MENUINPUTS "ВХОДЫ" - #define TR_MENULIMITS "ВЫХОДЫ" -#define TR_MENUCURVES "КРИВЫЕ" #define TR_MENUCURVE "КРИВАЯ" #define TR_MENULOGICALSWITCH "ЛОГИЧ ТУМБЛ." -#define TR_MENULOGICALSWITCHES "ЛОГИЧ ТУМБЛ." -#define TR_MENUCUSTOMFUNC "СПЕЦ ФУНКЦИИ" -#define TR_MENUCUSTOMSCRIPTS "ПОЛЬЗ СЦЕНАРИИ" -#define TR_MENUTELEMETRY "ТЕЛЕМЕТРИЯ" #define TR_MENUSTAT "СТАТИСТИКА" #define TR_MENUDEBUG "ОТЛАДКА" #define TR_MONITOR_CHANNELS1 "МОНИТОР КАН 1-8" #define TR_MONITOR_CHANNELS2 "МОНИТОР КАН 9-16" #define TR_MONITOR_CHANNELS3 "МОНИТОР КАН 17-24" #define TR_MONITOR_CHANNELS4 "МОНИТОР КАН 25-32" -#define TR_MONITOR_SWITCHES "МОНИТОР ЛОГИЧ ТУМБЛЕРОВ" #define TR_MONITOR_OUTPUT_DESC "Выходы" #define TR_MONITOR_MIXER_DESC "Микшеры" #define TR_RECEIVER_NUM TR("Rx Ном", "Номер") @@ -696,8 +740,6 @@ #define TR_V2 "V2" #define TR_DURATION "Продолж" #define TR_DELAY "Задержка" -#define TR_SD_CARD "SD КАРТА" -#define TR_SDHC_CARD "SD-HC КАРТА" #define TR_NO_SOUNDS_ON_SD "Нет звуков на SD карте" #define TR_NO_MODELS_ON_SD "Нет модели на SD карте" #define TR_NO_BITMAPS_ON_SD "Нет изобр на SD карте" @@ -716,7 +758,6 @@ #define TR_REMOVED "Удалено" #define TR_SD_INFO "Инфо" #define TR_NA "Н/Д" -#define TR_HARDWARE "АППАРАТУРА" #define TR_FORMATTING "Формат..." #define TR_TEMP_CALIB "Калиб темп" #define TR_TIME "Время" @@ -772,13 +813,11 @@ #define TR_SD_SECTORS "Сектора:" #define TR_SD_SIZE "Размер:" #define TR_TYPE "Тип" -#define TR_GLOBAL_VARS "Глоб переменные" #define TR_GVARS "ГЛОБ ПЕРЕМ" #define TR_GLOBAL_VAR "Глоб переменная" -#define TR_MENU_GLOBAL_VARS "ГЛОБ ПЕРЕМЕННЫЕ" #define TR_OWN "Свой" #define TR_DATE "Дата" -#define TR_MONTHS { "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" } +#define TR_MONTHS "Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("Режим энкод","Режим энкод") #define TR_CHANNELS_MONITOR "МОНИТОР КАНАЛОВ" @@ -895,7 +934,6 @@ #define TR_RANGE_TEST "Тест диапазона" #define TR_RECEIVER_OPTIONS TR("ОПЦИИ ПРИЕМНИКА", "ОПЦИИ ПРИЕМНИКА") #define TR_RESET_BTN BUTTON("Сброс") -#define TR_DEBUG "Отладка" #define TR_KEYS_BTN BUTTON("Кноп") #define TR_ANALOGS_BTN BUTTON(TR("Анлг", "Аналоги")) #define TR_FS_BTN BUTTON(TR("Пользов тумблер", TR_FUNCTION_SWITCHES)) @@ -978,7 +1016,6 @@ #define TR_TOUCH_PANEL "Сенсорная панель:" #define TR_FILE_SIZE "Размер файла" #define TR_FILE_OPEN "Все равно откр?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Имя" @@ -1003,7 +1040,7 @@ #define TR_INVERTED "Перевернутый" -#define TR_LSW_DESCRIPTIONS { "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" } +#define TR_LSW_DESCRIPTIONS "Comparison type or function", "First variable", "Second variable or constant", "Second variable or constant", "Additional condition for line to be enabled", "Minimum ON duration of the logical switch", "Minimum TRUE duration for the switch to become ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1020,10 +1057,9 @@ #define TR_ALIGNMENT "Вырав" #define TR_ALIGN_LABEL "Вырав метки" #define TR_ALIGN_VALUE "Вырав значения" - #define TR_ALIGN_OPTS { "Слева", "По центру", "Справа" } + #define TR_ALIGN_OPTS "Слева", "По центру", "Справа" #define TR_TEXT "Текст" #define TR_COLOR "Цвет" - #define TR_MAIN_VIEW_X "Основное экран X" #define TR_PANEL1_BACKGROUND "Фон панели 1" #define TR_PANEL2_BACKGROUND "Фон панели 2" #define TR_WIDGET_GAUGE "Шкала" @@ -1087,11 +1123,9 @@ #define TR_WIDGET_SETTINGS "Настройки виджета" #define TR_REMOVE_SCREEN "Удалить экран" #define TR_SETUP_WIDGETS "Настройка виджетов" -#define TR_USER_INTERFACE "Пользов интерфейс" #define TR_THEME "Тема" #define TR_SETUP "Настройка" #define TR_LAYOUT "Макет" -#define TR_ADD_MAIN_VIEW "Добавить экран" #define TR_TEXT_COLOR "Цвет текста" #define TR_MENU_INPUTS STR_CHAR_INPUT "Входы" #define TR_MENU_LUA STR_CHAR_LUA "Скрипты Lua" @@ -1159,20 +1193,6 @@ #define TR_CANCEL "Отменить" #define TR_EDIT_THEME "РЕДАК ТЕМУ" #define TR_DETAILS "Детали" -#define TR_THEME_EDITOR "ТЕМЫ" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Выбор\nМодели" -#define TR_MAIN_MENU_MANAGE_MODELS "Меню\nМоделей" -#define TR_MAIN_MENU_MODEL_NOTES "Заметки\nМодели" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Монитор\nКаналов" -#define TR_MAIN_MENU_MODEL_SETTINGS "Меню\nМодели" -#define TR_MAIN_MENU_RADIO_SETTINGS "Меню\nПульта" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Меню\nЭкрана" -#define TR_MAIN_MENU_RESET_TELEMETRY "Сброс\nТел-рии" -#define TR_MAIN_MENU_STATISTICS "Стат-ка\nПульта" -#define TR_MAIN_MENU_ABOUT_EDGETX "Инфо\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH TR("Англ","Английский") diff --git a/radio/src/translations/se.h b/radio/src/translations/se.h index 13e600424..c462779db 100644 --- a/radio/src/translations/se.h +++ b/radio/src/translations/se.h @@ -41,6 +41,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Hantera modell" +#define TR_MAIN_MENU_MODEL_NOTES "Modell- anteckn." +#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal- monitor" +#define TR_MONITOR_SWITCHES "ÖVERSIKT - LOGISKA BRYTARE" +#define TR_MAIN_MENU_MODEL_SETTINGS "Modell- inställn." +#define TR_MAIN_MENU_RADIO_SETTINGS "Radio- inställn." +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Statistik" +#define TR_MAIN_MENU_ABOUT_EDGETX "Om EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "TEMAN" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "HELIKOPTER" +#define TR_MENUFLIGHTMODES TRSA("KÖRLÄGEN", "FLYGLÄGEN") +#define TR_MENUFLIGHTMODE TRSA("KÖRLÄGE", "FLYGLÄGE") +#define TR_MENUINPUTS "INPUT" +#define TR_MENULIMITS "OUTPUT" +#define TR_MENUCURVES "KURVOR" +#define TR_MIXES "MIXAR" +#define TR_MENU_GLOBAL_VARS "Globala Variabler" +#define TR_MENULOGICALSWITCHES "LOGISKA BRYTARE" +#define TR_MENUCUSTOMFUNC "SPECIALFUNKTIONER" +#define TR_MENUCUSTOMSCRIPTS "SKRIPT" +#define TR_MENUTELEMETRY "TELEMETRI" +#define TR_MENUSPECIALFUNCS "GLOBALA FUNKTIONER" +#define TR_MENUTRAINER "LÄRARE" +#define TR_HARDWARE "HÅRDVARA" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD-KORT" +#define TR_DEBUG "Debug" +#define TR_MENU_RADIO_SWITCHES TR("BRYTARE","TEST AV BRYTARE") +#define TR_MENUCALIBRATION "KALIBRERING" +#define TR_FUNCTION_SWITCHES "Anpassningsbara brytare" +// End Main menu + #define TR_MINUTE_SINGULAR "minut" #define TR_MINUTE_PLURAL1 "minuter" #define TR_MINUTE_PLURAL2 "minuter" @@ -303,7 +380,6 @@ #define TR_WARN_5VOLTS "VARNING: Spänning ut är 5 volt" #define TR_MS "ms" #define TR_SWITCH "Brytare" -#define TR_FUNCTION_SWITCHES "Anpassningsbara brytare" #define TR_FS_COLOR_LIST "Anpassad","Av","Vit","Röd","Grön","Gul","Orange","Blå","Rosa" #define TR_GROUP "Grupp" #define TR_GROUP_ALWAYS_ON "Alltid på" @@ -357,7 +433,6 @@ #define TR_DELAYUP TR("Dröj upp","Fördröj upp") #define TR_SLOWDOWN TR("Trög ner","Långsam ner") #define TR_SLOWUP TR("Trög upp","Långsam upp") -#define TR_MIXES "MIXAR" #define TR_CV "KU" #if defined(PCBPL18) @@ -443,19 +518,12 @@ #define TR_MOVESTICKSPOTS "RÖR AXLAR/VRED" #else #define TR_MENUTOSTART TR_ENTER " FÖR ATT STARTA" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "CENTRERA VRED" - #define TR_MOVESTICKSPOTS "RÖR ST/GA/VRED/AXLAR" -#else - #define TR_SETMIDPOINT TR("CENTRERA AXLAR", "CENTRERA AXLAR/REGLAGE") - #define TR_MOVESTICKSPOTS "RÖR AXLAR/VRED" -#endif + #define TR_SETMIDPOINT TRSA("CENTRERA VRED", TR("CENTRERA AXLAR", "CENTRERA AXLAR/REGLAGE")) + #define TR_MOVESTICKSPOTS TRSA("RÖR ST/GA/VRED/AXLAR", "RÖR AXLAR/VRED") #define TR_MENUWHENDONE TR_ENTER " AVSLUTAR" #define TR_AXISDIR "AXELRIKTNING" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "DATA SAKNAS" #define TR_US "us" #define TR_HZ "Hz" @@ -486,10 +554,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "KA" #define TR_MODEL "MODELL" -#if defined(SURFACE_RADIO) -#define TR_FM "KL" -#else -#define TR_FM "FL" +#define TR_FM TRSA("KL", "FL") #endif #define TR_EEPROMLOWMEM "Minnesbrist" #define TR_PRESS_ANY_KEY_TO_SKIP "Avbryt med valfri knapp" @@ -504,14 +569,10 @@ #define TR_STORAGE_FORMAT "SD-Lagring förbereds" #define TR_EEPROMOVERFLOW "Minnesfel" #define TR_RADIO_SETUP "INSTÄLLNINGAR" -#define TR_MENUTRAINER "LÄRARE" -#define TR_MENUSPECIALFUNCS "GLOBALA FUNKTIONER" #define TR_MENUVERSION "VERSION" -#define TR_MENU_RADIO_SWITCHES TR("BRYTARE","TEST AV BRYTARE") #define TR_MENU_RADIO_ANALOGS TR("ANALOGA", "TEST AV ANALOGA") #define TR_MENU_RADIO_ANALOGS_CALIB "KALIBRERADE ANALOGA" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "RÅA ANALOGA (5Hz)" -#define TR_MENUCALIBRATION "KALIBRERING" #define TR_MENU_FSWITCH "ANPASSNINGSBARA BRYTARE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "[Spara trimvärden]" @@ -522,31 +583,14 @@ #define TR_CHANNEL2FAILSAFE "Kanal=>Failsafe" #define TR_MENUMODELSEL TR("MODELL","VÄLJ MODELL") #define TR_MENU_MODEL_SETUP TR("MODELLINSTÄLLNING","MODELLINSTÄLLNINGAR") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "KÖRLÄGEN" - #define TR_MENUFLIGHTMODE "KÖRLÄGE" -#else - #define TR_MENUFLIGHTMODE "FLYGLÄGE" - #define TR_MENUFLIGHTMODES "FLYGLÄGEN" -#endif -#define TR_MENUHELISETUP "HELIKOPTER" - -#define TR_MENUINPUTS "INPUT" -#define TR_MENULIMITS "OUTPUT" -#define TR_MENUCURVES "KURVOR" #define TR_MENUCURVE "KURVA" #define TR_MENULOGICALSWITCH "LOGISK BRYTARE" -#define TR_MENULOGICALSWITCHES "LOGISKA BRYTARE" -#define TR_MENUCUSTOMFUNC "SPECIALFUNKTIONER" -#define TR_MENUCUSTOMSCRIPTS "SKRIPT" -#define TR_MENUTELEMETRY "TELEMETRI" #define TR_MENUSTAT "STATISTIK" #define TR_MENUDEBUG "DEBUG" #define TR_MONITOR_CHANNELS1 "KANALÖVERSIKT - KA 1-8" #define TR_MONITOR_CHANNELS2 "KANALÖVERSIKT - KA 9-16" #define TR_MONITOR_CHANNELS3 "KANALÖVERSIKT - KA 17-24" #define TR_MONITOR_CHANNELS4 "KANALÖVERSIKT - KA 25-32" -#define TR_MONITOR_SWITCHES "ÖVERSIKT - LOGISKA BRYTARE" #define TR_MONITOR_OUTPUT_DESC "Utdata" #define TR_MONITOR_MIXER_DESC "Mixar" #define TR_RECEIVER_NUM TR("RxNum","Mottagare nr.") @@ -703,8 +747,6 @@ #define TR_V2 "Värde 2" #define TR_DURATION "Varaktighet" #define TR_DELAY "Fördröjning" -#define TR_SD_CARD "SD-KORT" -#define TR_SDHC_CARD "SD/HC-kort" #define TR_NO_SOUNDS_ON_SD "Inga ljud på SD" #define TR_NO_MODELS_ON_SD "Inga modeller på SD" #define TR_NO_BITMAPS_ON_SD "Inga ikoner på SD" @@ -723,7 +765,6 @@ #define TR_REMOVED " borttagen" #define TR_SD_INFO "Information" #define TR_NA "N/A" -#define TR_HARDWARE "HÅRDVARA" #define TR_FORMATTING "Formaterar..." #define TR_TEMP_CALIB "Temp. kalib." #define TR_TIME "Tid" @@ -778,13 +819,11 @@ #define TR_SD_SECTORS "Sektorer:" #define TR_SD_SIZE "Strl:" #define TR_TYPE "Typ" -#define TR_GLOBAL_VARS "Globala variabler" #define TR_GVARS "GLOBAL V." #define TR_GLOBAL_VAR "Global variabel" -#define TR_MENU_GLOBAL_VARS "GLOBALA VARIABLER" #define TR_OWN "Egen" #define TR_DATE "Datum" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" #define TR_ROTARY_ENCODER "R.H." #define TR_ROTARY_ENC_MODE TR("Rullhjulsinst.","Rullhjulsinställning") #define TR_CHANNELS_MONITOR "Kanalöversikt" @@ -903,7 +942,6 @@ #define TR_RANGE_TEST "Test av radiolänkkvalitet (begränsad signalstyrka)" #define TR_RECEIVER_OPTIONS TR("RX ALTERNATIV", "MOTTAGARALTERNATIV") #define TR_RESET_BTN TR(BUTTON("Nolla"), BUTTON("Återställ")) -#define TR_DEBUG "Debug" #define TR_KEYS_BTN BUTTON(TR("Bryt.","Brytare")) #define TR_ANALOGS_BTN BUTTON(TR("Ana.","Analoga")) #define TR_FS_BTN BUTTON(TR("Anp. bryt.", TR_FUNCTION_SWITCHES)) @@ -998,7 +1036,6 @@ #define TR_TOUCH_PANEL "Pekskärm:" #define TR_FILE_SIZE "Filstorlek" #define TR_FILE_OPEN "Öppna ändå?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Namn" @@ -1023,7 +1060,7 @@ #define TR_INVERTED "Inverterad" // Horus footer descriptions -#define TR_LSW_DESCRIPTIONS { "Jämförelsetyp eller funktion", "Första variabeln", "Andra variabeln eller konstant", "Andra variabeln eller konstant", "Ytterligare villkor för att raden ska aktiveras", "Minsta tid PÅ för den logiska brytaren", "Minsta varaktighet för SANT för att brytaren ska slås PÅ" } +#define TR_LSW_DESCRIPTIONS "Jämförelsetyp eller funktion", "Första variabeln", "Andra variabeln eller konstant", "Andra variabeln eller konstant", "Ytterligare villkor för att raden ska aktiveras", "Minsta tid PÅ för den logiska brytaren", "Minsta varaktighet för SANT för att brytaren ska slås PÅ" #if defined(COLORLCD) // Horus layouts and widgets @@ -1040,10 +1077,9 @@ #define TR_ALIGNMENT "Justering" #define TR_ALIGN_LABEL "Justera etikett" #define TR_ALIGN_VALUE "Justera värde" - #define TR_ALIGN_OPTS { "Vänster", "Mitten", "Höger" } + #define TR_ALIGN_OPTS "Vänster", "Mitten", "Höger" #define TR_TEXT "Text" #define TR_COLOR "Färg" - #define TR_MAIN_VIEW_X "Huvudvy XX" #define TR_PANEL1_BACKGROUND "Panel 1 bakgrund" #define TR_PANEL2_BACKGROUND "Panel 2 bakgrund" #define TR_WIDGET_GAUGE "Mätare" @@ -1114,11 +1150,9 @@ #define TR_SETUP_WIDGETS "Konfig. widgets" #endif -#define TR_USER_INTERFACE "Användargränssnitt" #define TR_THEME "Tema" #define TR_SETUP "Konfigurera" #define TR_LAYOUT "Layout" -#define TR_ADD_MAIN_VIEW "Lägg till huvudvy" #define TR_TEXT_COLOR "Textfärg" #define TR_MENU_INPUTS STR_CHAR_INPUT "Input" @@ -1189,20 +1223,6 @@ #define TR_CANCEL "Avbryt" #define TR_EDIT_THEME "REDIGERA TEMA" #define TR_DETAILS "Temainformation" -#define TR_THEME_EDITOR "TEMAN" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Välj\nmodell" -#define TR_MAIN_MENU_MANAGE_MODELS "Hantera\nmodell" -#define TR_MAIN_MENU_MODEL_NOTES "Modell-\nanteckn." -#define TR_MAIN_MENU_CHANNEL_MONITOR "Kanal-\nmonitor" -#define TR_MAIN_MENU_MODEL_SETTINGS "Modell-\ninställn." -#define TR_MAIN_MENU_RADIO_SETTINGS "Radio-\ninställn." -#define TR_MAIN_MENU_SCREEN_SETTINGS "Skärm-\ninställn." -#define TR_MAIN_MENU_RESET_TELEMETRY "Återställ\ntelemetri" -#define TR_MAIN_MENU_STATISTICS "Statistik" -#define TR_MAIN_MENU_ABOUT_EDGETX "Om\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Engelska" diff --git a/radio/src/translations/tw.h b/radio/src/translations/tw.h index c9cadad09..fdd3ccb60 100644 --- a/radio/src/translations/tw.h +++ b/radio/src/translations/tw.h @@ -38,6 +38,82 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "模型管理" +#define TR_MAIN_MENU_MODEL_NOTES "模型說明" +#define TR_MAIN_MENU_CHANNEL_MONITOR "通道查看" +#define TR_MONITOR_SWITCHES "邏輯開關查看" +#define TR_MAIN_MENU_MODEL_SETTINGS "模型設置" +#define TR_MAIN_MENU_RADIO_SETTINGS "系統設置" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "統計信息" +#define TR_MAIN_MENU_ABOUT_EDGETX "關於" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "主題" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "直升機設置" +#define TR_MENUFLIGHTMODES TRSA("駕駛模式", "飛行模式設置") +#define TR_MENUFLIGHTMODE TRSA("駕駛模式", "飛行模式") +#define TR_MENUINPUTS "輸入設置" +#define TR_MENULIMITS "輸出設置" +#define TR_MENUCURVES "曲線設置" +#define TR_MIXES "混控設置" +#define TR_MENU_GLOBAL_VARS "全局變量功能" +#define TR_MENULOGICALSWITCHES "邏輯開關設置" +#define TR_MENUCUSTOMFUNC "特殊功能設置" +#define TR_MENUCUSTOMSCRIPTS "自定義腳本設置" +#define TR_MENUTELEMETRY "回傳" +#define TR_MENUSPECIALFUNCS "全局功能" +#define TR_MENUTRAINER "教練" +#define TR_HARDWARE "硬件" +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD卡" +#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "開關及按鍵測試") +#define TR_MENUCALIBRATION "校準" +#define TR_FUNCTION_SWITCHES "可自定義開關" +// End Main menu + #define TR_MINUTE_SINGULAR "分鐘" #define TR_MINUTE_PLURAL1 "分鐘" #define TR_MINUTE_PLURAL2 "分鐘" @@ -294,7 +370,6 @@ #define TR_WARN_5VOLTS "注意輸出電平是5V" #define TR_MS "ms" #define TR_SWITCH "開關" -#define TR_FUNCTION_SWITCHES "可自定義開關" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -348,7 +423,6 @@ #define TR_DELAYUP "上行延時" #define TR_SLOWDOWN TR("下慢放", "下行慢動作") #define TR_SLOWUP "上行慢動作" -#define TR_MIXES "混控設置" #define TR_CV "曲線" #if defined(PCBPL18) #define TR_GV "GV" @@ -431,19 +505,12 @@ #define TR_MOVESTICKSPOTS "校準邊界,按[Enter]保存並完成" #else #define TR_MENUTOSTART "按" TR_ENTER " 開始" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "校準中點" - #define TR_MOVESTICKSPOTS "校準邊界" -#else - #define TR_SETMIDPOINT TR("校準中點", "校準中點") - #define TR_MOVESTICKSPOTS "校準邊界" -#endif + #define TR_SETMIDPOINT TRSA("校準中點", TR("校準中點", "校準中點")) + #define TR_MOVESTICKSPOTS TRSA("校準邊界", "校準邊界") #define TR_MENUWHENDONE TR_ENTER " 完成" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "NO DATA" #define TR_US "us" #define TR_HZ "Hz" @@ -473,10 +540,7 @@ #define TR_PPM_TRAINER "TR" #define TR_CH "CH" #define TR_MODEL "模型" -#if defined(SURFACE_RADIO) -#define TR_FM "DM" -#else -#define TR_FM "FM" +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "EEPROM low mem" #define TR_PRESS_ANY_KEY_TO_SKIP "按任意鍵跳過" @@ -491,14 +555,10 @@ #define TR_STORAGE_FORMAT "存儲準備" #define TR_EEPROMOVERFLOW "存儲超限" #define TR_RADIO_SETUP "系統設置" -#define TR_MENUTRAINER "教練" -#define TR_MENUSPECIALFUNCS "全局功能" #define TR_MENUVERSION "版本" -#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "開關及按鍵測試") #define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "類比輸入測試") #define TR_MENU_RADIO_ANALOGS_CALIB "已校準的類比值" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "原始類比值 (5 Hz)" -#define TR_MENUCALIBRATION "校準" #define TR_MENU_FSWITCH "可自定義開關" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "將當前微調量保存至中點" @@ -509,31 +569,14 @@ #define TR_CHANNEL2FAILSAFE "導入當前通道值" #define TR_MENUMODELSEL TR("模型選擇", "模型選擇") #define TR_MENU_MODEL_SETUP TR("模型設置", "模型設置") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "駕駛模式" - #define TR_MENUFLIGHTMODE "駕駛模式" -#else - #define TR_MENUFLIGHTMODES "飛行模式設置" - #define TR_MENUFLIGHTMODE "飛行模式" -#endif -#define TR_MENUHELISETUP "直升機設置" - -#define TR_MENUINPUTS "輸入設置" -#define TR_MENULIMITS "輸出設置" -#define TR_MENUCURVES "曲線設置" #define TR_MENUCURVE "曲線" #define TR_MENULOGICALSWITCH "邏輯開關" -#define TR_MENULOGICALSWITCHES "邏輯開關設置" -#define TR_MENUCUSTOMFUNC "特殊功能設置" -#define TR_MENUCUSTOMSCRIPTS "自定義腳本設置" -#define TR_MENUTELEMETRY "回傳" #define TR_MENUSTAT "統計" #define TR_MENUDEBUG "調試" #define TR_MONITOR_CHANNELS1 "1-8通道查看" #define TR_MONITOR_CHANNELS2 "9-16通道查看" #define TR_MONITOR_CHANNELS3 "17-24通道查看" #define TR_MONITOR_CHANNELS4 "25-32通道查看" -#define TR_MONITOR_SWITCHES "邏輯開關查看" #define TR_MONITOR_OUTPUT_DESC "輸出查看" #define TR_MONITOR_MIXER_DESC "混控查看" #define TR_RECEIVER_NUM TR("RxNum", "接收機ID.") @@ -695,8 +738,6 @@ #define TR_V2 "V2" #define TR_DURATION "持續時間" #define TR_DELAY "延時" -#define TR_SD_CARD "SD卡" -#define TR_SDHC_CARD "SD-HC卡" #define TR_NO_SOUNDS_ON_SD "存儲卡中無音頻" #define TR_NO_MODELS_ON_SD "存儲卡中無模型" #define TR_NO_BITMAPS_ON_SD "存儲卡中無圖片" @@ -715,7 +756,6 @@ #define TR_REMOVED "已刪除" #define TR_SD_INFO "信息" #define TR_NA "N/A" -#define TR_HARDWARE "硬件" #define TR_FORMATTING "正在格式化..." #define TR_TEMP_CALIB "溫度校準" #define TR_TIME "時間" @@ -771,13 +811,11 @@ #define TR_SD_SECTORS "扇區:" #define TR_SD_SIZE "容量:" #define TR_TYPE "類型" -#define TR_GLOBAL_VARS "全局變量" #define TR_GVARS "全局變量" #define TR_GLOBAL_VAR "全局變量" -#define TR_MENU_GLOBAL_VARS "全局變量功能" #define TR_OWN "Own" #define TR_DATE "日期" -#define TR_MONTHS { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec " } +#define TR_MONTHS "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec " #define TR_ROTARY_ENCODER "滾輪" #define TR_ROTARY_ENC_MODE TR("滾輪模式","滾輪模式") #define TR_CHANNELS_MONITOR "通道查看器" @@ -977,7 +1015,6 @@ #define TR_TOUCH_PANEL "觸摸屏:" #define TR_FILE_SIZE "文件大小" #define TR_FILE_OPEN "強制打開?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_LABEL " " TR_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "名稱" @@ -1002,7 +1039,7 @@ #define TR_INVERTED "反向" -#define TR_LSW_DESCRIPTIONS { "比較類型或功能", "第一個變量", "第二個變量或常量", "第二個變量或常量", "啟用本行的附加條件", "邏輯開關持續時間", "邏輯開關延時開啟" } +#define TR_LSW_DESCRIPTIONS "比較類型或功能", "第一個變量", "第二個變量或常量", "第二個變量或常量", "啟用本行的附加條件", "邏輯開關持續時間", "邏輯開關延時開啟" #if defined(COLORLCD) // Horus layouts and widgets @@ -1019,10 +1056,9 @@ #define TR_ALIGNMENT "對齊" #define TR_ALIGN_LABEL "对齐名称" #define TR_ALIGN_VALUE "对齐值" - #define TR_ALIGN_OPTS { "左", "中", "右" } + #define TR_ALIGN_OPTS "左", "中", "右" #define TR_TEXT "文本" #define TR_COLOR "顏色" - #define TR_MAIN_VIEW_X "Main view XX" #define TR_PANEL1_BACKGROUND "面板1背景" #define TR_PANEL2_BACKGROUND "面板2背景" #define TR_WIDGET_GAUGE "行程" @@ -1086,11 +1122,9 @@ #define TR_WIDGET_SETTINGS "小部件設置" #define TR_REMOVE_SCREEN "移除頁面" #define TR_SETUP_WIDGETS "設置小部件" -#define TR_USER_INTERFACE "用戶界面" #define TR_THEME "主題" #define TR_SETUP "設置" #define TR_LAYOUT "佈局" -#define TR_ADD_MAIN_VIEW "添加主視圖" #define TR_TEXT_COLOR "文本顏色" #define TR_MENU_INPUTS STR_CHAR_INPUT "輸入" #define TR_MENU_LUA STR_CHAR_LUA "LUA腳本" @@ -1158,20 +1192,6 @@ #define TR_CANCEL "取消" #define TR_EDIT_THEME "編輯主題" #define TR_DETAILS "詳細信息" -#define TR_THEME_EDITOR "主題" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "模型選擇" -#define TR_MAIN_MENU_MANAGE_MODELS "模型管理" -#define TR_MAIN_MENU_MODEL_NOTES "模型說明" -#define TR_MAIN_MENU_CHANNEL_MONITOR "通道查看" -#define TR_MAIN_MENU_MODEL_SETTINGS "模型設置" -#define TR_MAIN_MENU_RADIO_SETTINGS "系統設置" -#define TR_MAIN_MENU_SCREEN_SETTINGS "顯示設置" -#define TR_MAIN_MENU_RESET_TELEMETRY "復位功能" -#define TR_MAIN_MENU_STATISTICS "統計信息" -#define TR_MAIN_MENU_ABOUT_EDGETX "關於" -// End Main menu #define TR_PROTOCOL "協議" diff --git a/radio/src/translations/ua.h b/radio/src/translations/ua.h index 7be0393f6..b4eb89550 100644 --- a/radio/src/translations/ua.h +++ b/radio/src/translations/ua.h @@ -39,6 +39,83 @@ // If the number of minutes is above this value PLURAL2 is used #define TR_USE_PLURAL2 INT_MAX +// Main menu +#define TR_QM_MANAGE_MODELS "Manage\nModels" +#define TR_QM_MODEL_SETUP "Model\nSetup" +#define TR_QM_RADIO_SETUP "Radio\nSetup" +#define TR_QM_UI_SETUP "UI\nSetup" +#define TR_QM_TOOLS "Tools" +#define TR_QM_GEN_SETTINGS "General\nSettings" +#define TR_QM_FLIGHT_MODES TRSA("Drive\nModes", "Flight\nModes") +#define TR_QM_INPUTS "Inputs" +#define TR_QM_MIXES "Mixes" +#define TR_QM_OUTPUTS "Outputs" +#define TR_QM_CURVES "Curves" +#define TR_QM_GLOBAL_VARS "Global\nVariables" +#define TR_QM_LOGICAL_SW "Logical\nSwitches" +#define TR_QM_SPEC_FUNC "Special\nFunctions" +#define TR_QM_CUSTOM_LUA "Custom\nScripts" +#define TR_QM_TELEM "Telemetry" +#define TR_QM_GLOB_FUNC "Global\nFunctions" +#define TR_QM_TRAINER "Trainer" +#define TR_QM_HARDWARE "Hardware" +#define TR_QM_ABOUT "About\nEdgeTX" +#define TR_QM_THEMES "Themes" +#define TR_QM_TOP_BAR "Top Bar" +#define TR_QM_SCREEN_1 "Screen 1" +#define TR_QM_SCREEN_2 "Screen 2" +#define TR_QM_SCREEN_3 "Screen 3" +#define TR_QM_SCREEN_4 "Screen 4" +#define TR_QM_SCREEN_5 "Screen 5" +#define TR_QM_SCREEN_6 "Screen 6" +#define TR_QM_SCREEN_7 "Screen 7" +#define TR_QM_SCREEN_8 "Screen 8" +#define TR_QM_SCREEN_9 "Screen 9" +#define TR_QM_SCREEN_10 "Screen 10" +#define TR_QM_ADD_SCREEN "Add\nScreen" +#define TR_QM_APPS "Apps" +#define TR_QM_STORAGE "Storage" +#define TR_QM_RESET TRSA("Drive\nReset", "Flight\nReset") +#define TR_QM_CHAN_MON "Channel\nMonitor" +#define TR_QM_LS_MON "LS\nMonitor" +#define TR_QM_STATS "Statistics" +#define TR_QM_DEBUG "Debug" +#define TR_MAIN_MENU_SETTINGS "General Settings" +#define TR_MAIN_MENU_MANAGE_MODELS "Керувати Моделями" +#define TR_MAIN_MENU_MODEL_NOTES "Моделі Нотатки" +#define TR_MAIN_MENU_CHANNEL_MONITOR "Канал Монітор" +#define TR_MONITOR_SWITCHES "МОНІТОР ЛОГІЧНИХ ПЕРЕМИКАЧІВ" +#define TR_MAIN_MENU_MODEL_SETTINGS "Модель Налаштування" +#define TR_MAIN_MENU_RADIO_SETTINGS "Радіо Налаштування" +#define TR_MAIN_MENU_SCREEN_SETTINGS "UI Setup" +#define TR_MAIN_MENU_STATISTICS "Статистика" +#define TR_MAIN_MENU_ABOUT_EDGETX "Про... EdgeTX" +#define TR_MAIN_VIEW_X "Screen " +#define TR_MAIN_MENU_THEMES "ТЕМИ" +#define TR_MAIN_MENU_APPS "Apps" +#define TR_MENUHELISETUP "ГЕЛІКОПТЕР" +#define TR_MENUFLIGHTMODES TRSA("РЕЖИМИ ВОДІННЯ", "РЕЖИМИ ПОЛЬОТУ") +#define TR_MENUFLIGHTMODE TRSA("РЕЖИМ ВОДІННЯ", "РЕЖИМ ПОЛЬОТУ") +#define TR_MENUINPUTS "ВХОДИ" +#define TR_MENULIMITS "ВИХОДИ" +#define TR_MENUCURVES "КРИВІ" +#define TR_MIXES "MIXES" +#define TR_MENU_GLOBAL_VARS "Глобальні змінні" +#define TR_MENULOGICALSWITCHES "ЛОГІЧНІ ПЕРЕМ." +#define TR_MENUCUSTOMFUNC "СПЕЦІАЛ. ФУНКЦІЇ" +#define TR_MENUCUSTOMSCRIPTS "КОРИСТ. СКРИПТИ" +#define TR_MENUTELEMETRY "ТЕЛЕМЕТРІЯ" +#define TR_MENUSPECIALFUNCS "ГЛОБАЛЬНІ ФУНКЦІЇ" +#define TR_MENUTRAINER "ТРЕНЕР" +#define TR_HARDWARE "АПАРАТНЕ ЗАБЕЗПЕЧ." +#define TR_USER_INTERFACE "Top Bar" +#define TR_SD_CARD "SD карта" +#define TR_DEBUG "Відлагод." +#define TR_MENU_RADIO_SWITCHES TR("ПЕРЕМИКАЧІ", "ТЕСТ ПЕРЕМИКАЧІВ") +#define TR_MENUCALIBRATION "КАЛІБРУВАННЯ" +#define TR_FUNCTION_SWITCHES "Користувацькі перемикачі" +// End Main menu + #define TR_MINUTE_SINGULAR "хвилина" #define TR_MINUTE_PLURAL1 "хв." #define TR_MINUTE_PLURAL2 "хв." @@ -295,7 +372,6 @@ #define TR_WARN_5VOLTS "Warning: вихідний рівень 5 вольт" #define TR_MS "ms" #define TR_SWITCH "Перемикач" -#define TR_FUNCTION_SWITCHES "Користувацькі перемикачі" #define TR_FS_COLOR_LIST "Custom","Off","White","Red","Green","Yellow","Orange","Blue","Pink" #define TR_GROUP "Group" #define TR_GROUP_ALWAYS_ON "Always on" @@ -349,7 +425,6 @@ #define TR_DELAYUP "Затримка більше" #define TR_SLOWDOWN TR("Пов.", "Повільно") /*need to be clarified by context*/ #define TR_SLOWUP "Повільно" -#define TR_MIXES "MIXES" #define TR_CV "CV" #if defined(PCBPL18) #define TR_GV "GV" @@ -432,19 +507,12 @@ #define TR_MOVESTICKSPOTS "РУХАЙТЕ ВІСІ/ПОТЕНЦ." #else #define TR_MENUTOSTART TR_ENTER " ДЛЯ СТАРТУ" -#if defined(SURFACE_RADIO) - #define TR_SETMIDPOINT "ВІДЦЕНТР. ПОТЕНЦ." - #define TR_MOVESTICKSPOTS "РУХАЙТЕ ST/TH/ПОТЕНЦ./ВІСІ" -#else - #define TR_SETMIDPOINT TR("ВІДЦЕНТР. ВІСІ", "ВІДЦЕНТР. ВІСІ/ПОВЗУНКИ") - #define TR_MOVESTICKSPOTS "РУХАЙТЕ ВІСІ/ПОТЕНЦ." -#endif + #define TR_SETMIDPOINT TRSA("ВІДЦЕНТР. ПОТЕНЦ.", TR("ВІДЦЕНТР. ВІСІ", "ВІДЦЕНТР. ВІСІ/ПОВЗУНКИ")) + #define TR_MOVESTICKSPOTS TRSA("РУХАЙТЕ ST/TH/ПОТЕНЦ./ВІСІ", "РУХАЙТЕ ВІСІ/ПОТЕНЦ.") #define TR_MENUWHENDONE TR_ENTER " КОЛИ ЗАКІНЧЕНО" #define TR_AXISDIR "AXIS DIR" #define TR_MENUAXISDIR TR_ENTER_LONG " " TR_AXISDIR #endif -#define TR_TXnRX "Tx:\0Rx:" -#define OFS_RX 4 #define TR_NODATA "НЕМАЄ ДАНИХ" #define TR_US "us" #define TR_HZ "Hz" @@ -474,10 +542,7 @@ #define TR_PPM_TRAINER "TR" /* use english */ #define TR_CH "CH" /* use english */ #define TR_MODEL "МОДЕЛЬ" -#if defined(SURFACE_RADIO) - #define TR_FM "DM" /* use english */ -#else - #define TR_FM "FM" /* use english */ +#define TR_FM TRSA("DM", "FM") #endif #define TR_EEPROMLOWMEM "мало пам'яті EEPROM" #define TR_PRESS_ANY_KEY_TO_SKIP "Натисн. кнопку щоб пропустити" @@ -492,14 +557,10 @@ #define TR_STORAGE_FORMAT "Підготовка сховища" #define TR_EEPROMOVERFLOW "Переповнення EEPROM" #define TR_RADIO_SETUP "НАЛАШТ. АПАРАТУРИ" -#define TR_MENUTRAINER "ТРЕНЕР" -#define TR_MENUSPECIALFUNCS "ГЛОБАЛЬНІ ФУНКЦІЇ" #define TR_MENUVERSION "ВЕРСІЯ" -#define TR_MENU_RADIO_SWITCHES TR("ПЕРЕМИКАЧІ", "ТЕСТ ПЕРЕМИКАЧІВ") #define TR_MENU_RADIO_ANALOGS TR("АНАЛОГ", "ТЕСТ АНАЛОГУ") #define TR_MENU_RADIO_ANALOGS_CALIB "АНАЛОГИ ВІДКАЛІБРОВАНІ" #define TR_MENU_RADIO_ANALOGS_RAWLOWFPS "НЕОБРОБЛЕНІ АНАЛОГИ (5 Hz)" -#define TR_MENUCALIBRATION "КАЛІБРУВАННЯ" #define TR_MENU_FSWITCH "КОРИСТУВАЦЬКІ ПЕРЕМИКАЧІ" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Трим => Субтрим" @@ -510,31 +571,14 @@ #define TR_CHANNEL2FAILSAFE "Канал=>АварРежим" #define TR_MENUMODELSEL "ВИБІР МОДЕЛІ" #define TR_MENU_MODEL_SETUP TR("НАЛАШТУВАННЯ", "НАЛАШТУВАННЯ МОДЕЛІ") -#if defined(SURFACE_RADIO) - #define TR_MENUFLIGHTMODES "РЕЖИМИ ВОДІННЯ" - #define TR_MENUFLIGHTMODE "РЕЖИМ ВОДІННЯ" -#else - #define TR_MENUFLIGHTMODES "РЕЖИМИ ПОЛЬОТУ" - #define TR_MENUFLIGHTMODE "РЕЖИМ ПОЛЬОТУ" -#endif -#define TR_MENUHELISETUP "ГЕЛІКОПТЕР" - -#define TR_MENUINPUTS "ВХОДИ" -#define TR_MENULIMITS "ВИХОДИ" -#define TR_MENUCURVES "КРИВІ" #define TR_MENUCURVE "КРИВА" #define TR_MENULOGICALSWITCH "ЛОГІЧНИЙ ПЕРЕМИКАЧ" -#define TR_MENULOGICALSWITCHES "ЛОГІЧНІ ПЕРЕМ." -#define TR_MENUCUSTOMFUNC "СПЕЦІАЛ. ФУНКЦІЇ" -#define TR_MENUCUSTOMSCRIPTS "КОРИСТ. СКРИПТИ" -#define TR_MENUTELEMETRY "ТЕЛЕМЕТРІЯ" #define TR_MENUSTAT "СТАТ." #define TR_MENUDEBUG "ВІДЛАГОДЖЕННЯ" #define TR_MONITOR_CHANNELS1 "МОНІТОР КАН 1-8" #define TR_MONITOR_CHANNELS2 "МОНІТОР КАН 9-16" #define TR_MONITOR_CHANNELS3 "МОНІТОР КАН 17-24" #define TR_MONITOR_CHANNELS4 "МОНІТОР КАН 25-32" -#define TR_MONITOR_SWITCHES "МОНІТОР ЛОГІЧНИХ ПЕРЕМИКАЧІВ" #define TR_MONITOR_OUTPUT_DESC "Виходи" #define TR_MONITOR_MIXER_DESC "Мікшери" #define TR_RECEIVER_NUM TR("RxNum", "No. приймача") @@ -696,8 +740,6 @@ #define TR_V2 "V2" #define TR_DURATION "Тривалість" #define TR_DELAY "Затримка" -#define TR_SD_CARD "SD карта" -#define TR_SDHC_CARD "SD-HC карта" #define TR_NO_SOUNDS_ON_SD "Немає звуків на SD" #define TR_NO_MODELS_ON_SD "Немає моделей на SD" #define TR_NO_BITMAPS_ON_SD "Немає бітмапів на SD" @@ -716,7 +758,6 @@ #define TR_REMOVED " видалено" #define TR_SD_INFO "Інформація" #define TR_NA "Н/Д" -#define TR_HARDWARE "АПАРАТНЕ ЗАБЕЗПЕЧ." #define TR_FORMATTING "Форматую..." #define TR_TEMP_CALIB "Калібр. темп." #define TR_TIME "Час" @@ -772,13 +813,11 @@ #define TR_SD_SECTORS "Сектори:" #define TR_SD_SIZE "Розмір:" #define TR_TYPE "Тип" -#define TR_GLOBAL_VARS "Глобальні змінні" #define TR_GVARS "Г.ЗМ." #define TR_GLOBAL_VAR "Глобальні змінні" -#define TR_MENU_GLOBAL_VARS "ГЛОБАЛЬНІ ЗМІННІ" #define TR_OWN "Свій" #define TR_DATE "Дата" -#define TR_MONTHS { "Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру" } +#define TR_MONTHS "Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру" #define TR_ROTARY_ENCODER "R.E." #define TR_ROTARY_ENC_MODE TR("Режим енкодера","Режим обертального енкодера") #define TR_CHANNELS_MONITOR "МОНІТОР КАНАЛІВ" @@ -895,7 +934,6 @@ #define TR_RANGE_TEST "Тест діапазону" #define TR_RECEIVER_OPTIONS TR("ОПЦІЇ ПРМ.", "ОПЦІЇ ПРИЙМАЧА") #define TR_RESET_BTN BUTTON("Скин.") -#define TR_DEBUG "Відлагод." #define TR_KEYS_BTN BUTTON("Кнопк") #define TR_ANALOGS_BTN BUTTON(TR("Анл.", "Аналоги")) #define TR_FS_BTN BUTTON(TR("Користув.перемик.", TR_FUNCTION_SWITCHES)) @@ -978,7 +1016,6 @@ #define TR_TOUCH_PANEL "Сенсорна панель:" #define TR_FILE_SIZE "Розмір файлу" #define TR_FILE_OPEN "Відкрити попри все?" -#define TR_TIMER_MODES {TR_OFFON,TR_START,TR_THROTTLE_LABEL,TR_THROTTLE_PERCENT_LABEL,TR_THROTTLE_START} // Horus and Taranis column headers #define TR_PHASES_HEADERS_NAME "Ім'я" @@ -1003,7 +1040,7 @@ #define TR_INVERTED "Інверс." -#define TR_LSW_DESCRIPTIONS { "Порівняння типу функції", "Перша змінна", "Друга змінна або постійна", "Друга змінна або постійна", "Додаткова умова для активації лінії", "Мінімальна тривалість ON для логічного перемикача", "Мінімальна тривалість TRUE для перемикача, що стає ON" } +#define TR_LSW_DESCRIPTIONS "Порівняння типу функції", "Перша змінна", "Друга змінна або постійна", "Друга змінна або постійна", "Додаткова умова для активації лінії", "Мінімальна тривалість ON для логічного перемикача", "Мінімальна тривалість TRUE для перемикача, що стає ON" #if defined(COLORLCD) // Horus layouts and widgets @@ -1020,10 +1057,9 @@ #define TR_ALIGNMENT "Вирівнювання" #define TR_ALIGN_LABEL "Вирівняти мітку" #define TR_ALIGN_VALUE "Вирівняти значення" - #define TR_ALIGN_OPTS { "Ліво", "Центр", "Право" } + #define TR_ALIGN_OPTS "Ліво", "Центр", "Право" #define TR_TEXT "Текст" #define TR_COLOR "Колір" - #define TR_MAIN_VIEW_X "Головний вид XX" #define TR_PANEL1_BACKGROUND "Панель1 фон" #define TR_PANEL2_BACKGROUND "Панель2 фон" #define TR_WIDGET_GAUGE "Шкала" @@ -1087,11 +1123,9 @@ #define TR_WIDGET_SETTINGS "Опції віджету" #define TR_REMOVE_SCREEN "Видалити екран" #define TR_SETUP_WIDGETS "Налаштування віджетів" -#define TR_USER_INTERFACE "Інтерфейс користувача" #define TR_THEME "Тема" #define TR_SETUP "Встановлення" #define TR_LAYOUT "Шар" -#define TR_ADD_MAIN_VIEW "Додати головний вид" #define TR_TEXT_COLOR "Колір тексту" #define TR_MENU_INPUTS STR_CHAR_INPUT "Входи" #define TR_MENU_LUA STR_CHAR_LUA "Lua скрипти" @@ -1159,20 +1193,6 @@ #define TR_CANCEL "Відміна" #define TR_EDIT_THEME "РЕДАГУВАТИ ТЕМУ" #define TR_DETAILS "Деталі" -#define TR_THEME_EDITOR "ТЕМИ" - -// Main menu -#define TR_MAIN_MENU_SELECT_MODEL "Обрати\nМодель" -#define TR_MAIN_MENU_MANAGE_MODELS "Керувати\nМоделями" -#define TR_MAIN_MENU_MODEL_NOTES "Моделі\nНотатки" -#define TR_MAIN_MENU_CHANNEL_MONITOR "Канал\nМонітор" -#define TR_MAIN_MENU_MODEL_SETTINGS "Модель\nНалаштування" -#define TR_MAIN_MENU_RADIO_SETTINGS "Радіо\nНалаштування" -#define TR_MAIN_MENU_SCREEN_SETTINGS "Екрани\nНалаштування" -#define TR_MAIN_MENU_RESET_TELEMETRY "Скидання\nТелеметрії" -#define TR_MAIN_MENU_STATISTICS "Статистика" -#define TR_MAIN_MENU_ABOUT_EDGETX "Про...\nEdgeTX" -// End Main menu // Voice in native language #define TR_VOICE_ENGLISH "Англійська"